diff --git a/.gitignore b/.gitignore index cfc20d1..d5f060e 100644 --- a/.gitignore +++ b/.gitignore @@ -36,8 +36,6 @@ *.user *.pdb *.idb -*.manifest -*.htm *.res *.ilk *.dep diff --git a/Blocks3D-2003.sln b/Blocks3D-2003.sln deleted file mode 100644 index d652459..0000000 --- a/Blocks3D-2003.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Blocks3D", "Blocks3D-2003.vcproj", "{6C4D6EEF-B1D1-456A-B850-92CAB17124BE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug|Win32.ActiveCfg = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug|Win32.Build.0 = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release|Win32.ActiveCfg = Release|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Blocks3D-2003.sln.old b/Blocks3D-2003.sln.old deleted file mode 100644 index f494330..0000000 --- a/Blocks3D-2003.sln.old +++ /dev/null @@ -1,35 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Blocks3D", "Blocks3D-2003.vcproj", "{6C4D6EEF-B1D1-456A-B850-92CAB17124BE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug.ActiveCfg = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug.Build.0 = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release.ActiveCfg = Release|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug|Win32.ActiveCfg = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Debug|Win32.Build.0 = Debug|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release|Win32.ActiveCfg = Release|Win32 - {6C4D6EEF-B1D1-456A-B850-92CAB17124BE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Blocks3D-2003.vcproj b/Blocks3D-2003.vcproj deleted file mode 100644 index 172c8ce..0000000 --- a/Blocks3D-2003.vcproj +++ /dev/null @@ -1,893 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Blocks3D.exe.manifest b/Blocks3D.exe.manifest new file mode 100644 index 0000000..f8f4c28 --- /dev/null +++ b/Blocks3D.exe.manifest @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/Blocks3D.vcproj b/Blocks3D.vcproj index b3c98d5..cabeb95 100644 --- a/Blocks3D.vcproj +++ b/Blocks3D.vcproj @@ -1,247 +1,937 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dialogs.rc b/Dialogs.rc index 81fbf6c..204859d 100644 --- a/Dialogs.rc +++ b/Dialogs.rc @@ -5,7 +5,18 @@ #include #include #include -#include "resource.h" //Should not have to do this... +#include "src/include/resource.h" + +#define APP_GENER 0 +#define APP_MAJOR 0 +#define APP_MINOR 106 +#define APP_PATCH 2 +#define APP_VER_STRING APP_GENER.APP_MAJOR.APP_MINOR.APP_PATCH + +#define VER_PREFIX( N ) v##N +#define HSTR( N ) #N +#define STR( N ) HSTR( N ) +#define VER_STR( N ) STR( VER_PREFIX( N ) ) @@ -16,7 +27,39 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN IDB_BITMAP1 BITMAP "Parts.bmp" - +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +1 VERSIONINFO + FILEVERSION APP_GENER,APP_MAJOR,APP_MINOR,APP_PATCH + PRODUCTVERSION APP_GENER,APP_MAJOR,APP_MINOR,APP_PATCH + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0 + FILEFLAGS 0 +{ + BLOCK "StringFileInfo" + { + BLOCK "100901B5" + { + VALUE "Comments", "" + VALUE "CompanyName", "Blocks3D Team" + VALUE "FileDescription", "Blocks 3D" + VALUE "FileVersion", VER_STR(APP_VER_STRING) + VALUE "InternalName", "Blocks3D" + VALUE "LegalCopyright", "Blocks3D Team - 2022" + VALUE "LegalTrademarks", "" + VALUE "OriginalFilename", "Blocks3D.exe" + VALUE "PrivateBuild", "" + VALUE "ProductName", "Blocks3D" + VALUE "ProductVersion", VER_STR(APP_VER_STRING) + VALUE "SpecialBuild", "" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x1009, 0x01B5 + } +} // // Dialog resources @@ -40,4 +83,14 @@ FONT 8, "Ms Shell Dlg" // Icon resources // LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN -IDI_ICON1 ICON "FatB3dIcon.ico" \ No newline at end of file +IDI_ICON1 ICON "FatB3dIcon.ico" + + + +// +// Manifest resources +// +#ifndef _DEBUG +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +1 MANIFEST ".\\Blocks3D.exe.manifest" +#endif \ No newline at end of file diff --git a/Installer/install_script.iss b/Installer/install_script.iss index 2cd262f..e033253 100644 --- a/Installer/install_script.iss +++ b/Installer/install_script.iss @@ -1,14 +1,15 @@ ;InnoSetupVersion=5.4.3 +#define AppVer GetFileVersion('..\Blocks3D.exe') [Setup] -AppName=Blocks3D +AppName=Blocks3D +AppVersion=v{#AppVer} AppId={{4C5DF268-0208-4CDE-A7F0-65F7E2CB5067} -AppVersion=v0_0_104_5 AppPublisherURL=http://blocks3d.com/ AppSupportURL=http://blocks3d.com/ AppUpdatesURL=http://blocks3d.com/ DefaultDirName={%localappdata}\Blocks3D -OutputBaseFilename=Blocks3D_Setup_{#SetupSetting("AppVersion")} +OutputBaseFilename=Blocks3D_Setup_v{#AppVer} Compression=lzma2 PrivilegesRequired=lowest WizardImageFile=setup.bmp diff --git a/Manifest.xml b/Manifest.xml deleted file mode 100644 index e69de29..0000000 diff --git a/ODE Copyright.txt b/ODE Copyright.txt new file mode 100644 index 0000000..2863cf7 --- /dev/null +++ b/ODE Copyright.txt @@ -0,0 +1,6 @@ +Open Dynamics Engine + +Copyright (c) 2001-2004, +Russell L. Smith. + +All rights reserved. \ No newline at end of file diff --git a/ode-0.5.7z b/ode-0.5.7z new file mode 100644 index 0000000..49bfa18 Binary files /dev/null and b/ode-0.5.7z differ diff --git a/resource.h b/resource.h deleted file mode 100644 index c126a1e..0000000 --- a/resource.h +++ /dev/null @@ -1,10 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by dialogs.rc -// -#define IDI_ICON1 101 -#define IDB_BITMAP1 102 -#define IDD_DIALOG1 103 -#define IDC_EDIT1 1001 -#define IDC_PROPERTYGRID 2000 - diff --git a/src/include/Application.h b/src/include/Application.h index 50a4598..b2a45b1 100644 --- a/src/include/Application.h +++ b/src/include/Application.h @@ -32,7 +32,6 @@ class Application { // : public GApp { PartInstance* makePart(); void drawButtons(RenderDevice* rd); void drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos, CoordinateFrame c); - std::vector getSelection(); void deleteInstance(); void run(); void QuitApp(); @@ -60,6 +59,7 @@ class Application { // : public GApp { Tool * tool; void changeTool(Tool *); Mouse mouse; + bool viewportHasFocus(); private: bool mouseMoveState; RenderDevice* renderDevice; diff --git a/src/include/CameraController.h b/src/include/CameraController.h index 55db426..ea2373b 100644 --- a/src/include/CameraController.h +++ b/src/include/CameraController.h @@ -26,6 +26,7 @@ class CameraController { void panRight(); void tiltUp(); void tiltDown(); + void zoomExtents(); void Zoom(short delta); bool onMouseWheel(int x, int y, short delta); GCamera* getCamera(); diff --git a/src/include/DataModelV2/DataModelInstance.h b/src/include/DataModelV2/DataModelInstance.h index fb0d19a..8dab766 100644 --- a/src/include/DataModelV2/DataModelInstance.h +++ b/src/include/DataModelV2/DataModelInstance.h @@ -2,8 +2,10 @@ #include "WorkspaceInstance.h" #include "LevelInstance.h" #include "PartInstance.h" +#include "SelectionService.h" #include "rapidxml/rapidxml.hpp" #include "GuiRootInstance.h" +#include "XplicitNgine/XplicitNgine.h" class GuiRootInstance; @@ -23,21 +25,18 @@ public: void drawMessage(RenderDevice*); WorkspaceInstance* getWorkspace(); LevelInstance * getLevel(); + XplicitNgine * getEngine(); std::string message; std::string _loadedFileName; bool showMessage; G3D::GFontRef font; GuiRootInstance* getGuiRoot(); - //float mousex; - //float mousey; - //Vector2 getMousePos(); - //void setMousePos(int x,int y); - //void setMousePos(Vector2 pos); - //bool mouseButton1Down; + SelectionService* getSelectionService(); PartInstance* makePart(); void clearLevel(); void toggleRun(); bool isRunning(); + void resetEngine(); #if _DEBUG void modXMLLevel(float modY); #endif @@ -53,5 +52,7 @@ private: WorkspaceInstance* workspace; LevelInstance * level; GuiRootInstance* guiRoot; + SelectionService* selectionService; bool running; + XplicitNgine * xplicitNgine; }; diff --git a/src/include/DataModelV2/Instance.h b/src/include/DataModelV2/Instance.h index 4610a8f..b8009bd 100644 --- a/src/include/DataModelV2/Instance.h +++ b/src/include/DataModelV2/Instance.h @@ -2,10 +2,6 @@ #include #include "propertyGrid.h" #include "map" - -#ifdef NO_SPRINTF -#define sprintf_s sprintf -#endif //#include "Properties/BoolProperty.h" class Instance diff --git a/src/include/DataModelV2/PVInstance.h b/src/include/DataModelV2/PVInstance.h index 67aa4b1..79ac705 100644 --- a/src/include/DataModelV2/PVInstance.h +++ b/src/include/DataModelV2/PVInstance.h @@ -1,6 +1,7 @@ #pragma once #include "instance.h" #include "enum.h" +#include class PVInstance : public Instance diff --git a/src/include/DataModelV2/PartInstance.h b/src/include/DataModelV2/PartInstance.h index 40a345f..c9a21fe 100644 --- a/src/include/DataModelV2/PartInstance.h +++ b/src/include/DataModelV2/PartInstance.h @@ -29,7 +29,8 @@ public: //Variables Color3 color; bool canCollide; - bool anchored; + dBodyID physBody; + dGeomID physGeom[3]; //Getters Vector3 getPosition(); @@ -47,10 +48,14 @@ public: void setVelocity(Vector3); void setRotVelocity(Vector3); void setCFrame(CoordinateFrame); + void setCFrameNoSync(CoordinateFrame); void setSize(Vector3); void setShape(Enum::Shape::Value shape); void setChanged(); void setSurface(int face, Enum::SurfaceType::Value surface); + void setAnchored(bool anchored); + bool isAnchored(); + float getMass(); //Collision bool collides(PartInstance * part); @@ -60,6 +65,7 @@ public: virtual std::vector getProperties(); virtual void PropUpdate(LPPROPGRIDITEM &pItem); private: + bool anchored; Vector3 position; Vector3 size; Vector3 velocity; @@ -67,4 +73,4 @@ private: bool changed; Box itemBox; GLuint glList; -}; +}; \ No newline at end of file diff --git a/src/include/DataModelV2/SelectionService.h b/src/include/DataModelV2/SelectionService.h new file mode 100644 index 0000000..963be02 --- /dev/null +++ b/src/include/DataModelV2/SelectionService.h @@ -0,0 +1,21 @@ +#pragma once +#include "Instance.h" +#include "PropertyWindow.h" + +class SelectionService : public Instance +{ +public: + SelectionService(void); + ~SelectionService(void); + SelectionService(const SelectionService &oinst); + std::vector getSelection(); + void clearSelection(); + bool isSelected(Instance * instance); + void addSelected(Instance * instance); + void removeSelected(Instance * instance); + void addSelected(const std::vector &instances); + void setPropertyWindow(PropertyWindow * propertyWindow); +private: + std::vector selection; + PropertyWindow * propertyWindow; +}; diff --git a/src/include/DataModelV2/WorkspaceInstance.h b/src/include/DataModelV2/WorkspaceInstance.h index 9a62304..459f144 100644 --- a/src/include/DataModelV2/WorkspaceInstance.h +++ b/src/include/DataModelV2/WorkspaceInstance.h @@ -9,5 +9,6 @@ public: WorkspaceInstance(void); ~WorkspaceInstance(void); void clearChildren(); + void zoomToExtents(); std::vector partObjects; }; diff --git a/src/include/Globals.h b/src/include/Globals.h index 76f10d9..d01fb67 100644 --- a/src/include/Globals.h +++ b/src/include/Globals.h @@ -1,6 +1,6 @@ #pragma once #include "DataModelV2/DataModelInstance.h" - +#include "XplicitNgine/XplicitNgine.h" class Application; @@ -25,9 +25,9 @@ public: }; extern std::vector postRenderStack; -extern std::vector g_selectedInstances; extern bool running; extern DataModelInstance* g_dataModel; +extern XplicitNgine* g_xplicitNgine; extern Application* g_usableApp; extern GFontRef g_fntdominant; diff --git a/src/include/PropertyWindow.h b/src/include/PropertyWindow.h index a4285aa..f402b02 100644 --- a/src/include/PropertyWindow.h +++ b/src/include/PropertyWindow.h @@ -5,13 +5,14 @@ class PropertyWindow { public: PropertyWindow(int x, int y, int sx, int sy, HMODULE hThisInstance); bool onCreate(int x, int y, int sx, int sy, HMODULE hThisInstance); - void UpdateSelected(Instance *); + void UpdateSelected(std::vector selection); void ClearProperties(); void onResize(); - void refreshExplorer(Instance* selectedInstance); + void refreshExplorer(std::vector selection); HWND _hwndProp; private: HWND _propGrid; HWND _explorerComboBox; void _resize(); + void clearExplorer(); }; \ No newline at end of file diff --git a/src/include/XplicitNgine/XplicitNgine.h b/src/include/XplicitNgine/XplicitNgine.h new file mode 100644 index 0000000..0c33a3b --- /dev/null +++ b/src/include/XplicitNgine/XplicitNgine.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include "DatamodelV2/Instance.h" +#include "DatamodelV2/PartInstance.h" + +class XplicitNgine : public Instance +{ +public: + XplicitNgine(); + ~XplicitNgine(); + dWorldID physWorld; + dSpaceID physSpace; + dJointGroupID contactgroup; + + void step(float stepSize); + void createBody(PartInstance* partInstance); + void deleteBody(PartInstance* partInstance); + void updateBody(PartInstance* partInstance, CoordinateFrame * cFrame); +}; \ No newline at end of file diff --git a/src/include/resource.h b/src/include/resource.h new file mode 100644 index 0000000..8f6e7c3 --- /dev/null +++ b/src/include/resource.h @@ -0,0 +1,7 @@ +#define IDC_PROPERTYGRID 2000 +#define IDC_STATIC 2 + +#define IDC_EDIT1 105 +#define IDI_ICON1 102 +#define IDB_BITMAP1 103 +#define IDD_DIALOG1 104 diff --git a/src/include/winver.h b/src/include/winver.h deleted file mode 100644 index e72f685..0000000 --- a/src/include/winver.h +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef WINVER -#define _WIN32_WINNT 0x0400 -#define _WIN32_WINDOWS 0x0400 -#define WINVER 0x0400 -#endif \ No newline at end of file diff --git a/src/source/Application.cpp b/src/source/Application.cpp index ce7b671..247dabb 100644 --- a/src/source/Application.cpp +++ b/src/source/Application.cpp @@ -1,13 +1,14 @@ #include #include #include -#include "../../resource.h" +#include "resource.h" #include "DataModelV2/Instance.h" #include "DataModelV2/PartInstance.h" #include "DataModelV2/TextButtonInstance.h" #include "DataModelV2/ImageButtonInstance.h" #include "DataModelV2/DataModelInstance.h" #include "DataModelV2/GuiRootInstance.h" +#include "XplicitNgine/XplicitNgine.h" #include "CameraController.h" #include "AudioPlayer.h" #include "Globals.h" @@ -143,6 +144,11 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti } +bool Application::viewportHasFocus() +{ + return GetActiveWindow() == this->_hWndMain; +} + void Application::navigateToolbox(std::string path) { int len = path.size() + 1; @@ -154,28 +160,29 @@ void Application::navigateToolbox(std::string path) void Application::deleteInstance() { - if(g_selectedInstances.size() > 0) + if(_dataModel->getSelectionService()->getSelection().size() > 0) { - size_t undeletable = 0; - while(g_selectedInstances.size() > undeletable) + std::vector selection = _dataModel->getSelectionService()->getSelection(); + std::vector toDelete; + for(size_t i = 0; i < selection.size(); i++) { + if(selection[i]->canDelete) { + toDelete.push_back(selection[i]); + } + } + if(toDelete.size() > 0) { - if(g_selectedInstances.at(0)->canDelete) - { - AudioPlayer::playSound(GetFileInPath("/content/sounds/pageturn.wav")); - Instance* selectedInstance = g_selectedInstances.at(0); + AudioPlayer::playSound(GetFileInPath("/content/sounds/pageturn.wav")); + for(size_t i = 0; i < toDelete.size(); i++) { + Instance* selectedInstance = toDelete[i]; + _dataModel->getSelectionService()->removeSelected(selectedInstance); selectedInstance->setParent(NULL); delete selectedInstance; selectedInstance = NULL; - g_selectedInstances.erase(g_selectedInstances.begin()); - } - else - { - undeletable++; } } } - if(g_selectedInstances.size() == 0) - g_usableApp->_propWindow->ClearProperties(); + if(_dataModel->getSelectionService()->getSelection().size() == 0) + _dataModel->getSelectionService()->addSelected(_dataModel); } @@ -188,10 +195,9 @@ void Application::onInit() { _dataModel->setName("undefined"); _dataModel->font = g_fntdominant; g_dataModel = _dataModel; - - //initGUI(); #ifdef LEGACY_LOAD_G3DFUN_LEVEL + // Anchored this baseplate for XplicitNgine tests PartInstance* test = makePart(); test->setParent(_dataModel->getWorkspace()); test->color = Color3(0.2F,0.3F,1); @@ -199,7 +205,8 @@ void Application::onInit() { test->setPosition(Vector3(0,0,0)); test->setCFrame(test->getCFrame() * Matrix3::fromEulerAnglesXYZ(0,toRadians(0),toRadians(0))); test->setSurface(TOP, Enum::SurfaceType::Bumps); - + test->setAnchored(true); + test = makePart(); test->setParent(_dataModel->getWorkspace()); test->color = Color3(.5F,1,.5F); @@ -263,9 +270,6 @@ void Application::onInit() { test->setPosition(Vector3(-2,5,0)); test->setSurface(TOP, Enum::SurfaceType::Bumps); - - - test = makePart(); test->setParent(_dataModel->getWorkspace()); test->color = Color3::gray(); @@ -285,6 +289,9 @@ void Application::onInit() { LevelInstance * level = g_dataModel->getLevel(); std::string GetCurrentSplash = level->SplashHTML; SplashHTMLLoad(GetCurrentSplash); + + _dataModel->getSelectionService()->clearSelection(); + _dataModel->getSelectionService()->addSelected(_dataModel); @@ -297,86 +304,15 @@ void Application::onInit() { } - - - - - void Application::onCleanup() { clearInstances(); sky->~Sky(); } - - -/* - -Class HyperSnapSolver - -function getCollisionDepth(Part colliding, part collider); -function getFaceCollision(Part colliding, part collider); - -function eject(Part colliding, Part collider) -{ - if(!colliding.canCollide || !collider.canCollide) - return; - if(getCollisionDepth(colliding, collider) != 0) { - int ejectMultiplier, ejectMultipliery = 1-(collider.Friction+colliding.Friction), ejectMultiplierz = 1-(collider.Friction/2+colliding.Friction/2); - if(colliding.Anchored) - ejectMultiplier = collider.elasticity; - int faceCollided = getFaceCollision(colliding, collider); - if(faceCollided % 3 == 1) - { - ejectMultipliery = ejectMultiplier; - ejectMultiplier = 1-(collider.Friction+colliding.Friction/2); - } - else if(faceCollided % 3 == 2) - { - ejectMultiplierz = ejectMultiplier; - ejectMultiplier = 1-(collider.Friction+colliding.Friction/2); - } - - collider.Velocity *= Vector3.new(colliding.Velocity.x*ejectMultiplier,colliding.Velocity.y*ejectMultipliery,colliding.Velocity.z) - } +void Application::onLogic() { + } -*/ - -double grav = 0.32666666666666666666666666666667; -void simGrav(PartInstance * collider) -{ - if(!collider->anchored) - { - collider->setPosition(collider->getPosition()+collider->getVelocity()); - collider->setVelocity(collider->getVelocity()-Vector3(0,grav,0)); - } -} - -void eject(PartInstance * colliding, PartInstance * collider) -{ - if(colliding == collider || !colliding->canCollide || !collider->canCollide) - return; - if(G3D::CollisionDetection::fixedSolidBoxIntersectsFixedSolidBox(collider->getBox(), colliding->getBox())) - collider->setVelocity(collider->getVelocity().reflectionDirection(colliding->getCFrame().upVector())/1.3F); - -} - - - -void Application::onLogic() { - //PhysicsStart - for_each (_dataModel->getWorkspace()->partObjects.begin(), _dataModel->getWorkspace()->partObjects.end(), simGrav); - for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++) - { - for(size_t j = 0; j < _dataModel->getWorkspace()->partObjects.size(); j++) - { - eject(_dataModel->getWorkspace()->partObjects[i], _dataModel->getWorkspace()->partObjects[j]); - } - } -} - - - void Application::onNetwork() { // Poll net messages here } @@ -387,15 +323,38 @@ void Application::onNetwork() { // return pow(pow((double)vector1.x - (double)vector2.x, 2) + pow((double)vector1.y - (double)vector2.y, 2) + pow((double)vector1.z - (double)vector2.z, 2), 0.5); //} -std::vector Application::getSelection() -{ - return g_selectedInstances; -} void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { if(_dataModel->isRunning()) + { + // XplicitNgine Start + std::vector toDelete; + for(size_t i = 0; i < _dataModel->getWorkspace()->partObjects.size(); i++) + { + PartInstance* partInstance = _dataModel->getWorkspace()->partObjects[i]; + if(partInstance->getPosition().y < -255) + { + toDelete.push_back(partInstance); + } + else + _dataModel->getEngine()->createBody(partInstance); + } + while(toDelete.size() > 0) + { + PartInstance * p = toDelete.back(); + toDelete.pop_back(); + g_dataModel->getSelectionService()->removeSelected(p); + p->setParent(NULL); + delete p; + } + for(int i = 0; i < 6; i++) + { + _dataModel->getEngine()->step(0.1F); + } onLogic(); + } + _dataModel->getGuiRoot()->update(); if(_dataModel->name != _title) @@ -410,95 +369,29 @@ void Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { } -/*double getOSVersion() { - OSVERSIONINFO osvi; - - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - GetVersionEx(&osvi); - std::string version = Convert(osvi.dwMajorVersion) + "." + Convert(osvi.dwMinorVersion); - return ::atof(version.c_str()); -}*/ -/* -bool IsHolding(int button) -{ - return (GetKeyState(button) >> 1)>0; -} - -*/ - void Application::onUserInput(UserInput* ui) { if(mouseMoveState) { mouseMoveState = false; tool->onMouseMoved(mouse); } - /* - if(GetHoldKeyState(VK_LCONTROL)) - { - if(GetHoldKeyState('D')) - { - _messageTime = System::time(); - if(debugMode()) - _message = "Debug Mode Disabled"; - else - _message = "Debug Mode Enabled"; - setDebugMode(!debugMode()); - } - } - */ + if(GetHoldKeyState(VK_F8)) { _dataModel->getGuiRoot()->setDebugMessage("FOV Set to 10", System::time()); } - //} - //_dataModel->mousex = ui->getMouseX(); - //_dataModel->mousey = ui->getMouseY(); mouse.setMouseDown((GetKeyState(VK_LBUTTON) & 0x100) != 0); - if (GetHoldKeyState(VK_LBUTTON)) { - /* if (_dragging) { - PartInstance* part = NULL; - if(g_selectedInstances.size() > 0) - part = (PartInstance*) g_selectedInstances.at(0); - Ray dragRay = cameraController.getCamera()->worldRay(mouse.x, mouse.y, renderDevice->getViewport()); - std::vector instances = _dataModel->getWorkspace()->getAllChildren(); - for(size_t i = 0; i < instances.size(); i++) - { - if(PartInstance* moveTo = dynamic_cast(instances.at(i))) - { - float __time = testRay.intersectionTime(moveTo->getBox()); - float __nearest=std::numeric_limits::infinity(); - if (__time != inf()) - { - if (__nearest>__time) - { - // BROKEN - //Vector3 closest = (dragRay.closestPoint(moveTo->getPosition()) * 2); - //part->setPosition(closest); - //part->setPosition(Vector3(floor(closest.x),part->getPosition().y,floor(closest.z))); - } - } - } - } - Sleep(10); - }*/ - } - // Camera KB Handling { - if (GetKPBool(VK_OEM_COMMA)) //Left - g_usableApp->cameraController.panLeft(); - else if (GetKPBool(VK_OEM_PERIOD)) // Right - g_usableApp->cameraController.panRight(); - else if (GetKPBool(0x49)) // Zoom In (I) - g_usableApp->cameraController.Zoom(1); - else if (GetKPBool(0x4F)) // Zoom Out (O) - g_usableApp->cameraController.Zoom(-1); - // } - - //readMouseGUIInput(); - // Add other key handling here + // Camera KB Handling + if (GetKPBool(VK_OEM_COMMA)) //Left + g_usableApp->cameraController.panLeft(); + else if (GetKPBool(VK_OEM_PERIOD)) // Right + g_usableApp->cameraController.panRight(); + else if (GetKPBool(0x49)) // Zoom In (I) + g_usableApp->cameraController.Zoom(1); + else if (GetKPBool(0x4F)) // Zoom Out (O) + g_usableApp->cameraController.Zoom(-1); } void Application::changeTool(Tool * newTool) @@ -706,17 +599,15 @@ void Application::onGraphics(RenderDevice* rd) { //Draw::box(G3D::Box(mouse.getPosition()-Vector3(2,0.5F,1),mouse.getPosition()+Vector3(2,0.5F,1)), rd, Color3::cyan(), Color4::clear()); - if(g_selectedInstances.size() > 0) + + for(size_t i = 0; i < _dataModel->getSelectionService()->getSelection().size(); i++) { - for(size_t i = 0; i < g_selectedInstances.size(); i++) + if(PartInstance* part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { - if(PartInstance* part = dynamic_cast(g_selectedInstances.at(i))) - { - Vector3 size = part->getSize(); - Vector3 pos = part->getPosition(); - drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame()); - } - } + Vector3 size = part->getSize(); + Vector3 pos = part->getPosition(); + drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame()); + } } @@ -796,11 +687,6 @@ void Application::onKeyPressed(int key) { _dataModel->getOpen(); } - if ((GetHoldKeyState(VK_LCONTROL) || GetHoldKeyState(VK_RCONTROL)) && key=='A') - { - std::vector vec = _dataModel->getWorkspace()->getAllChildren(); - g_selectedInstances.insert(g_selectedInstances.end(), vec.begin(), vec.end()); - } tool->onKeyDown(key); } void Application::onKeyUp(int key) @@ -810,12 +696,6 @@ void Application::onKeyUp(int key) void Application::onMouseLeftPressed(HWND hwnd,int x,int y) { - //Removed set focus - - - //std::cout << "Click: " << x << "," << y << std::endl; - - bool onGUI = _dataModel->getGuiRoot()->mouseInGUI(renderDevice, x, y); @@ -825,19 +705,6 @@ void Application::onMouseLeftPressed(HWND hwnd,int x,int y) } } -void Application::selectInstance(Instance* selectedInstance, PropertyWindow* propWindow) -{ - if(!GetHoldKeyState(VK_RCONTROL) && !GetHoldKeyState(VK_LCONTROL)) - { - printf("No control key hold \n"); - g_selectedInstances.clear(); - } - else printf("Control held\n"); - if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(),selectedInstance)==g_selectedInstances.end()) - g_selectedInstances.push_back(selectedInstance); - propWindow->UpdateSelected(selectedInstance); - -} G3D::RenderDevice* Application::getRenderDevice() { return renderDevice; @@ -845,13 +712,9 @@ G3D::RenderDevice* Application::getRenderDevice() void Application::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x, int y) { - //std::cout << "Release: " << x << "," << y << std::endl; _dataModel->getGuiRoot()->onMouseLeftUp(renderDevice, x, y); _dragging = false; tool->onButton1MouseUp(mouse); - //_message = "Dragging = false."; - //_messageTime = System::time(); - } void Application::onMouseRightPressed(int x,int y) @@ -871,8 +734,6 @@ void Application::onMouseMoved(int x,int y) mouse.y = y; //tool->onMouseMoved(mouse); mouseMoveState = true; - //_dataModel->mousex = x; - //_dataModel->mousey = y; } void Application::onMouseWheel(int x,int y,short delta) @@ -951,6 +812,8 @@ void Application::run() { RealTime rdt = timeStep; SimTime sdt = timeStep * rate; SimTime idt = desiredFrameDuration * rate; + + onSimulation(rdt,sdt,idt); m_simulationWatch.tock(); diff --git a/src/source/CameraController.cpp b/src/source/CameraController.cpp index dc47011..7338b24 100644 --- a/src/source/CameraController.cpp +++ b/src/source/CameraController.cpp @@ -159,6 +159,11 @@ void CameraController::tiltDown() setFrame(frame); } +void CameraController::zoomExtents() +{ + // do some weird jank math +} + void CameraController::centerCamera(Instance* selection) { CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().translation); @@ -188,6 +193,8 @@ void CameraController::update(Application* app) Vector3 cameraPos = g3dCamera.getCoordinateFrame().translation; CoordinateFrame frame = g3dCamera.getCoordinateFrame(); bool moving=false; + if(!app->viewportHasFocus()) + return; if(GetHoldKeyState('U')) { forwards = true; moving=true; diff --git a/src/source/DataModel/SelectionService.cpp b/src/source/DataModel/SelectionService.cpp new file mode 100644 index 0000000..d62a1d8 --- /dev/null +++ b/src/source/DataModel/SelectionService.cpp @@ -0,0 +1,58 @@ +#include "DataModelV2/SelectionService.h" + +SelectionService::SelectionService(void){ + Instance::Instance(); + propertyWindow = NULL; +} + +SelectionService::~SelectionService(void){ +} + +SelectionService::SelectionService(const SelectionService &oinst){ + Instance::Instance(oinst); + propertyWindow = NULL; +} + + +std::vector SelectionService::getSelection(){ + return this->selection; +} +void SelectionService::clearSelection(){ + this->selection.clear(); + if(propertyWindow != NULL) + propertyWindow->ClearProperties(); + printf("selectionSize: %d\n", selection.size()); +} +bool SelectionService::isSelected(Instance * instance){ + return std::find(selection.begin(), selection.end(), instance) != selection.end(); +} +void SelectionService::addSelected(Instance * instance){ + if(!isSelected(instance)) + this->selection.push_back(instance); + if(propertyWindow != NULL) + propertyWindow->UpdateSelected(selection); + printf("selectionSize: %d\n", selection.size()); +} +void SelectionService::removeSelected(Instance * instance){ + selection.erase(std::remove(selection.begin(), selection.end(), instance), selection.end()); + if(propertyWindow != NULL) + propertyWindow->UpdateSelected(selection); + printf("selectionSize: %d\n", selection.size()); +} +void SelectionService::addSelected(const std::vector &instances){ + for(size_t i = 0; i < instances.size(); i++) + { + if(!isSelected(instances[i])) + this->selection.push_back(instances[i]); + } + if(propertyWindow != NULL) + propertyWindow->UpdateSelected(selection); + printf("selectionSize: %d\n", selection.size()); +} +void SelectionService::setPropertyWindow(PropertyWindow * propertyWindow) +{ + this->propertyWindow = propertyWindow; + if(propertyWindow != NULL) + propertyWindow->ClearProperties(); + printf("selectionSize: %d\n", selection.size()); +} diff --git a/src/source/DataModelV2/DataModelInstance.cpp b/src/source/DataModelV2/DataModelInstance.cpp index 07e4db5..162e16a 100644 --- a/src/source/DataModelV2/DataModelInstance.cpp +++ b/src/source/DataModelV2/DataModelInstance.cpp @@ -1,5 +1,6 @@ #include #include "DataModelV2/GuiRootInstance.h" +#include "DataModelV2/ToggleImageButtonInstance.h" #include "DataModelV2/DataModelInstance.h" #include #include @@ -13,13 +14,14 @@ using namespace std; using namespace rapidxml; - DataModelInstance::DataModelInstance(void) { Instance::Instance(); workspace = new WorkspaceInstance(); guiRoot = new GuiRootInstance(); level = new LevelInstance(); + selectionService = new SelectionService(); + selectionService->setPropertyWindow(g_usableApp->_propWindow); //children.push_back(workspace); //children.push_back(level); className = "dataModel"; @@ -34,13 +36,35 @@ DataModelInstance::DataModelInstance(void) _loadedFileName="..//skooter.rbxm"; listicon = 5; running = false; + xplicitNgine = NULL; + resetEngine(); +} +void DataModelInstance::resetEngine() +{ + if(xplicitNgine != NULL) + delete xplicitNgine; + xplicitNgine = new XplicitNgine(); + g_xplicitNgine = xplicitNgine; + for(size_t i = 0; i < getWorkspace()->partObjects.size(); i++) + { + PartInstance* partInstance = getWorkspace()->partObjects[i]; + partInstance->physBody = NULL; + } +} + +XplicitNgine * DataModelInstance::getEngine() +{ + return xplicitNgine; } void DataModelInstance::toggleRun() { running = !running; + //if(!running) + //resetEngine(); } + bool DataModelInstance::isRunning() { return running; @@ -48,6 +72,7 @@ bool DataModelInstance::isRunning() DataModelInstance::~DataModelInstance(void) { + delete xplicitNgine; } #ifdef _DEBUG @@ -62,8 +87,17 @@ void DataModelInstance::modXMLLevel(float modY) void DataModelInstance::clearLevel() { + running = false; + Instance * goButton = this->getGuiRoot()->findFirstChild("go"); + if(goButton != NULL){ + if(ToggleImageButtonInstance* goButtonReal = dynamic_cast(goButton)) + { + goButtonReal->checked = false; + } + } + selectionService->clearSelection(); + selectionService->addSelected(this); workspace->clearChildren(); - g_usableApp->_propWindow->UpdateSelected(this); } PartInstance* DataModelInstance::makePart() { @@ -271,6 +305,7 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) xml_node<> *propNode = node->first_node(); xml_node<> *cFrameNode=0; xml_node<> *sizeNode=0; + xml_node<> *anchoredNode=0; xml_node<> *shapeNode=0; xml_node<> *colorNode=0; xml_node<> *brickColorNode=0; @@ -286,6 +321,10 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) if (xmlValue=="CFrame" | xmlValue=="CoordinateFrame") { cFrameNode = partPropNode; + } + if (xmlValue=="Anchored") + { + anchoredNode = partPropNode; } if (xmlValue=="Name") { @@ -397,6 +436,10 @@ bool DataModelInstance::scanXMLObject(xml_node<> * scanNode) { test->color = bcToRGB(atoi(brickColorNode->value())); } + if(anchoredNode) + { + test->setAnchored(stricmp(anchoredNode->value(), "true") == 0); + } test->setSize(Vector3(sizeX,sizeY+_modY,sizeZ)); test->setName(newName); CoordinateFrame cf; @@ -449,6 +492,9 @@ bool DataModelInstance::load(const char* filename, bool clearObjects) std::string hname = sfilename.substr(begin); std::string tname = hname.substr(0, hname.length() - 5); name = tname; + resetEngine(); + selectionService->clearSelection(); + selectionService->addSelected(this); return true; } else @@ -519,6 +565,7 @@ bool DataModelInstance::getOpen() of.lpstrFile[0]='\0'; of.nMaxFile=500; of.lpstrTitle="Hello"; + of.Flags = OFN_FILEMUSTEXIST; ShowCursor(TRUE); BOOL file = GetOpenFileName(&of); if (file) @@ -526,7 +573,6 @@ bool DataModelInstance::getOpen() _loadedFileName = of.lpstrFile; load(of.lpstrFile,true); } - //else MessageBox(NULL, "Failed to open dialog", "Failure", MB_ICONHAND | MB_OK); return true; } void DataModelInstance::setMessage(std::string msg) @@ -591,25 +637,16 @@ WorkspaceInstance* DataModelInstance::getWorkspace() { return workspace; } -/*Vector2 DataModelInstance::getMousePos() -{ - return Vector2(mousex,mousey); -} -void DataModelInstance::setMousePos(int x,int y) -{ - mousex=x; - mousey=y; -} -void DataModelInstance::setMousePos(Vector2 pos) -{ - mousex=pos.x; - mousey=pos.y; -}*/ + GuiRootInstance* DataModelInstance::getGuiRoot() { return guiRoot; } +SelectionService* DataModelInstance::getSelectionService() +{ + return selectionService; +} LevelInstance* DataModelInstance::getLevel() { diff --git a/src/source/DataModelV2/GroupInstance.cpp b/src/source/DataModelV2/GroupInstance.cpp index c392f07..45492b9 100644 --- a/src/source/DataModelV2/GroupInstance.cpp +++ b/src/source/DataModelV2/GroupInstance.cpp @@ -34,13 +34,11 @@ void GroupInstance::PropUpdate(LPPROPGRIDITEM &pItem) std::vector GroupInstance::unGroup() { - std::vector child; while(children.size() > 0) { - child.push_back(children[0]); children[0]->setParent(parent); } - return child; + return std::vector(); } void GroupInstance::render(RenderDevice * rd) diff --git a/src/source/DataModelV2/GuiRootInstance.cpp b/src/source/DataModelV2/GuiRootInstance.cpp index 7efdbd9..45c1762 100644 --- a/src/source/DataModelV2/GuiRootInstance.cpp +++ b/src/source/DataModelV2/GuiRootInstance.cpp @@ -507,8 +507,8 @@ void GuiRootInstance::update() button4->disabled = true; button5->disabled = true; button6->disabled = true; - for(size_t i = 0; i < g_selectedInstances.size(); i++) - if(g_selectedInstances.at(i)->canDelete) + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) + if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete) { button->disabled = false; button2->disabled = false; diff --git a/src/source/DataModelV2/Instance.cpp b/src/source/DataModelV2/Instance.cpp index 1f51b50..4cb1279 100644 --- a/src/source/DataModelV2/Instance.cpp +++ b/src/source/DataModelV2/Instance.cpp @@ -1,3 +1,4 @@ +#define WINVER 0x0400 #include #include "DataModelV2/Instance.h" diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 9a04254..f9a8210 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -8,6 +8,7 @@ PartInstance::PartInstance(void) { PVInstance::PVInstance(); + physBody = NULL; glList = glGenLists(1); name = "Unnamed PVItem"; className = "Part"; @@ -27,6 +28,13 @@ PartInstance::PartInstance(void) shape = Enum::Shape::Block; } +float PartInstance::getMass() +{ + if(shape == Enum::Shape::Block) + return size.x*size.y*size.z*0.7F; + else + return 1.3333333333333333333333333333333F*(size.x/2)*(size.y/2)*(size.z/2)*0.7F; +} Vector3 PartInstance::getVelocity() { @@ -109,32 +117,34 @@ void PartInstance::setSurface(int face, Enum::SurfaceType::Value surface) void PartInstance::setParent(Instance* prnt) { + g_dataModel->getEngine()->deleteBody(this); Instance * cparent = getParent(); while(cparent != NULL) { if(WorkspaceInstance* workspace = dynamic_cast(cparent)) { - std::cout << "Removed from partarray " << std::endl; workspace->partObjects.erase(std::remove(workspace->partObjects.begin(), workspace->partObjects.end(), this), workspace->partObjects.end()); - break; } cparent = cparent->getParent(); } Instance::setParent(prnt); - while(parent != NULL) + cparent = getParent(); + while(cparent != NULL) { - if(WorkspaceInstance* workspace = dynamic_cast(parent)) + if(WorkspaceInstance* workspace = dynamic_cast(cparent)) { workspace->partObjects.push_back(this); break; } - parent = parent->getParent(); + cparent = cparent->getParent(); } + } PartInstance::PartInstance(const PartInstance &oinst) { PVInstance::PVInstance(oinst); + physBody = NULL; glList = glGenLists(1); //name = oinst.name; //className = "Part"; @@ -143,7 +153,7 @@ PartInstance::PartInstance(const PartInstance &oinst) setParent(oinst.parent); anchored = oinst.anchored; size = oinst.size; - setCFrame(oinst.cFrame); + setCFrameNoSync(oinst.cFrame); color = oinst.color; velocity = oinst.velocity; rotVelocity = oinst.rotVelocity; @@ -220,15 +230,32 @@ void PartInstance::setShape(Enum::Shape::Value shape) void PartInstance::setPosition(Vector3 pos) { position = pos; - cFrame = CoordinateFrame(cFrame.rotation, pos); - changed = true; + setCFrame(CoordinateFrame(cFrame.rotation, pos)); } +void PartInstance::setAnchored(bool anchored) +{ + this->anchored = anchored; + g_dataModel->getEngine()->deleteBody(this); +} + +bool PartInstance::isAnchored() +{ + return this->anchored; +} + + CoordinateFrame PartInstance::getCFrame() { return cFrame; } void PartInstance::setCFrame(CoordinateFrame coordinateFrame) +{ + g_dataModel->getEngine()->updateBody(this, &coordinateFrame); + setCFrameNoSync(coordinateFrame); +} + +void PartInstance::setCFrameNoSync(CoordinateFrame coordinateFrame) { cFrame = coordinateFrame; position = coordinateFrame.translation; @@ -279,7 +306,6 @@ void PartInstance::render(RenderDevice* rd) { changed=false; Vector3 renderSize = size/2; glNewList(glList, GL_COMPILE); - //glScalef(0.5f,0.5f,0.5f); renderShape(this->shape, renderSize, color); renderSurface(TOP, this->top, renderSize, this->controller, color); renderSurface(FRONT, this->front, renderSize, this->controller, color); @@ -297,6 +323,16 @@ void PartInstance::render(RenderDevice* rd) { PartInstance::~PartInstance(void) { glDeleteLists(glList, 1); + /* + // Causes some weird ODE error + // Someone, please look into this + + dBodyDestroy(physBody); + for (int i = 0; i < 3; i++) { + if (physGeom[i] != NULL) + dGeomDestroy(physGeom[i]); + } + */ } char pto[512]; @@ -335,7 +371,7 @@ void PartInstance::PropUpdate(LPPROPGRIDITEM &item) } else if(strcmp(item->lpszPropName, "Anchored") == 0) { - anchored= item->lpCurValue == TRUE; + setAnchored(item->lpCurValue == TRUE); } else if(strcmp(item->lpszPropName, "Offset") == 0) { diff --git a/src/source/DataModelV2/WorkspaceInstance.cpp b/src/source/DataModelV2/WorkspaceInstance.cpp index cf36ffb..ff64068 100644 --- a/src/source/DataModelV2/WorkspaceInstance.cpp +++ b/src/source/DataModelV2/WorkspaceInstance.cpp @@ -1,5 +1,6 @@ #include "DataModelV2/WorkspaceInstance.h" - +#include "Globals.h" +#include "Application.h" WorkspaceInstance::WorkspaceInstance(void) { @@ -15,6 +16,11 @@ void WorkspaceInstance::clearChildren() Instance::clearChildren(); } +void WorkspaceInstance::zoomToExtents() +{ + g_usableApp->cameraController.zoomExtents(); +} + WorkspaceInstance::~WorkspaceInstance(void) { } diff --git a/src/source/Globals.cpp b/src/source/Globals.cpp index fc67cba..f120eb4 100644 --- a/src/source/Globals.cpp +++ b/src/source/Globals.cpp @@ -1,17 +1,13 @@ #include "Globals.h" #include "Application.h" -int const Globals::gen = 0; -int const Globals::major = 100; -int const Globals::minor = 4; -int const Globals::patch = 3; int Globals::surfaceId = 2; //bool Globals::showMouse = true; bool Globals::useMousePoint = false; std::vector postRenderStack = std::vector(); -std::vector g_selectedInstances = std::vector(); DataModelInstance* g_dataModel = NULL; +XplicitNgine* g_xplicitNgine = NULL; bool running = false; G3D::TextureRef Globals::surface; diff --git a/src/source/IEBrowser.cpp b/src/source/IEBrowser.cpp index 848c50b..6d72313 100644 --- a/src/source/IEBrowser.cpp +++ b/src/source/IEBrowser.cpp @@ -43,9 +43,9 @@ HRESULT IEBrowser::doExternal(std::wstring funcName, if(pDispParams->rgvarg->intVal < 0 || pDispParams->rgvarg->intVal > 7) return S_OK; Enum::Controller::Value cont = (Enum::Controller::Value)pDispParams->rgvarg->intVal; - for(size_t i = 0; i < g_selectedInstances.size(); i++) + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) { - if(PVInstance* part = dynamic_cast(g_selectedInstances.at(i))) + if(PVInstance* part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { ding = true; part->controller = cont; diff --git a/src/source/Listener/CameraButtonListener.cpp b/src/source/Listener/CameraButtonListener.cpp index 08c3dd7..6007ef6 100644 --- a/src/source/Listener/CameraButtonListener.cpp +++ b/src/source/Listener/CameraButtonListener.cpp @@ -7,8 +7,8 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button) { AudioPlayer::playSound(cameraSound); CoordinateFrame frame = g_usableApp->cameraController.getCamera()->getCoordinateFrame(); - if(button->name == "CenterCam" && g_selectedInstances.size() > 0) - g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0)); + if(button->name == "CenterCam" && g_dataModel->getSelectionService()->getSelection().size() > 0) + g_usableApp->cameraController.centerCamera(g_dataModel->getSelectionService()->getSelection()[0]); else if(button->name == "ZoomIn") g_usableApp->cameraController.Zoom(1); else if(button->name == "ZoomOut") diff --git a/src/source/Listener/GUDButtonListener.cpp b/src/source/Listener/GUDButtonListener.cpp index 4e00f43..b0b3413 100644 --- a/src/source/Listener/GUDButtonListener.cpp +++ b/src/source/Listener/GUDButtonListener.cpp @@ -2,13 +2,14 @@ #include "Application.h" #include "Globals.h" #include "AudioPlayer.h" +#include "DataModelV2/SelectionService.h" #include "Listener/GUDButtonListener.h" void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) { bool cont = false; - for(size_t i = 0; i < g_selectedInstances.size(); i++) - if(g_selectedInstances.at(i)->canDelete) + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) + if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete) { cont = true; break; @@ -19,53 +20,46 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) if(button->name == "Duplicate") { std::vector newinst; - for(size_t i = 0; i < g_selectedInstances.size(); i++) + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) { - if(g_selectedInstances.at(i)->canDelete) + if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete) { - Instance* tempinst = g_selectedInstances.at(i); + Instance* tempinst = g_dataModel->getSelectionService()->getSelection()[i]; - Instance* clonedInstance = g_selectedInstances.at(i)->clone(); + Instance* clonedInstance = g_dataModel->getSelectionService()->getSelection()[i]->clone(); newinst.push_back(tempinst); } - /*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z)); - g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/ } - g_selectedInstances = newinst; - if(g_selectedInstances.size() > 0) - g_usableApp->_propWindow->UpdateSelected(newinst.at(0)); + g_dataModel->getSelectionService()->clearSelection(); + g_dataModel->getSelectionService()->addSelected(newinst); } else if(button->name == "Group") { GroupInstance * inst = new GroupInstance(); - for(size_t i = 0; i < g_selectedInstances.size(); i++) + inst->setParent(g_dataModel->getWorkspace()); + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) { - if(g_selectedInstances.at(i)->canDelete) + if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete) { - g_selectedInstances.at(i)->setParent(inst); - if(PartInstance* part = dynamic_cast(g_selectedInstances.at(i))) + g_dataModel->getSelectionService()->getSelection()[i]->setParent(inst); + if(PartInstance* part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { inst->primaryPart = part; } } - /*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z)); - g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/ } - inst->setParent(g_dataModel->getWorkspace()); - g_selectedInstances.clear(); - g_selectedInstances.push_back(inst); - if(g_selectedInstances.size() > 0) - g_usableApp->_propWindow->UpdateSelected(g_selectedInstances.at(0)); + g_dataModel->getSelectionService()->clearSelection(); + g_dataModel->getSelectionService()->addSelected(inst); } else if(button->name == "UnGroup") { std::vector newinst; - for(size_t i = 0; i < g_selectedInstances.size(); i++) + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) { - if(g_selectedInstances.at(i)->canDelete) + if(g_dataModel->getSelectionService()->getSelection()[i]->canDelete) { - if(GroupInstance* model = dynamic_cast(g_selectedInstances.at(i))) + if(GroupInstance* model = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { newinst = model->unGroup(); model->setParent(NULL); @@ -73,13 +67,9 @@ void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) model = NULL; } } - /*tempinst->setPosition(Vector3(tempPos.x, tempPos.y + tempSize.y, tempPos.z)); - g_usableApp->cameraController.centerCamera(g_selectedInstances.at(0));*/ } - g_selectedInstances.clear(); - g_selectedInstances = newinst; - if(g_selectedInstances.size() > 0) - g_usableApp->_propWindow->UpdateSelected(newinst.at(0)); + g_dataModel->getSelectionService()->clearSelection(); + g_dataModel->getSelectionService()->addSelected(newinst); } } } \ No newline at end of file diff --git a/src/source/Listener/MenuButtonListener.cpp b/src/source/Listener/MenuButtonListener.cpp index ab644c8..c595a4e 100644 --- a/src/source/Listener/MenuButtonListener.cpp +++ b/src/source/Listener/MenuButtonListener.cpp @@ -14,10 +14,23 @@ void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button) HMENU mainmenu = CreatePopupMenu(); AppendMenu(mainmenu, MF_STRING, 100, "New"); AppendMenu(mainmenu, MF_STRING, 101, "Open..."); - AppendMenu(mainmenu, MF_STRING, 101, "Close"); + AppendMenu(mainmenu, MF_STRING, 102, "Close"); AppendMenu(mainmenu, MF_SEPARATOR, 0, NULL); POINT p; GetCursorPos(&p); - TrackPopupMenu(mainmenu, TPM_LEFTBUTTON, p.x, p.y, 0, Globals::mainHwnd, 0); + int menuClick = TrackPopupMenu(mainmenu, TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, Globals::mainHwnd, 0); + switch (menuClick) + { + case 100: + g_usableApp->clearInstances(); + g_usableApp->onInit(); + break; + case 101: + g_dataModel->getOpen(); + break; + case 102: + g_usableApp->QuitApp(); + break; + } } } \ No newline at end of file diff --git a/src/source/Listener/RotateButtonListener.cpp b/src/source/Listener/RotateButtonListener.cpp index d2d1b6b..2c143bd 100644 --- a/src/source/Listener/RotateButtonListener.cpp +++ b/src/source/Listener/RotateButtonListener.cpp @@ -5,9 +5,9 @@ void RotateButtonListener::onButton1MouseClick(BaseButtonInstance* button) { - if(g_selectedInstances.size() > 0) + if(g_dataModel->getSelectionService()->getSelection().size() > 0) { - Instance* selectedInstance = g_selectedInstances.at(0); + Instance* selectedInstance = g_dataModel->getSelectionService()->getSelection()[0]; AudioPlayer::playSound(clickSound); if(PartInstance* part = dynamic_cast(selectedInstance)) { diff --git a/src/source/Mouse.cpp b/src/source/Mouse.cpp index 61bd19e..de551ed 100644 --- a/src/source/Mouse.cpp +++ b/src/source/Mouse.cpp @@ -112,31 +112,3 @@ void Mouse::setMouseDown(bool bval) { mouseDown = bval; } - - - - //bool found = false; - /*for(size_t i = 0; i < g_selectedInstances.size(); i++) - { - if(g_selectedInstances.at(i) == test) - { - found = true; - //ShowWindow(_propWindow->_hwndProp, SW_SHOW); - //SetActiveWindow(_propWindow->_hwndProp); - //SetForegroundWindow(_propWindow->_hwndProp); - break; - } - } - if(!found) - { - selectedInstance = test; - //if(!GetHoldKeyState(VK_RCONTROL) && !GetHoldKeyState(VK_LCONTROL)) - //g_selectedInstances.clear(); - //if(std::find(g_selectedInstances.begin(), g_selectedInstances.end(),test)==g_selectedInstances.end()) - //g_selectedInstances.push_back(test); - } - //selectInstance(test, _propWindow); - //_message = "Dragging = true."; - //_messageTime = System::time(); - //_dragging = true;*/ - diff --git a/src/source/PropertyWindow.cpp b/src/source/PropertyWindow.cpp index 1be5656..855cadd 100644 --- a/src/source/PropertyWindow.cpp +++ b/src/source/PropertyWindow.cpp @@ -1,17 +1,11 @@ #define _WINSOCKAPI_ #include #include "WindowFunctions.h" -#include "../../resource.h" +#include "resource.h" #include "PropertyWindow.h" -#include "Globals.h" #include "strsafe.h" #include "Application.h" -/*typedef struct typPRGP { - Instance* instance; // Declare member types - Property ∝ -} PRGP;*/ - std::vector prop; std::vector children; Instance * selectedInstance; @@ -177,8 +171,8 @@ LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); CHAR ListItem[256]; SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT, (WPARAM) ItemIndex, (LPARAM) ListItem); - propWind->ClearProperties(); - g_usableApp->selectInstance(children.at(ItemIndex),propWind); + g_dataModel->getSelectionService()->clearSelection(); + g_dataModel->getSelectionService()->addSelected(children.at(ItemIndex)); } } break; @@ -208,13 +202,18 @@ LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } -void PropertyWindow::refreshExplorer(Instance* selectedInstance) +void PropertyWindow::clearExplorer() { + SendMessage(_explorerComboBox,CB_RESETCONTENT,0,0); + SendMessage(_explorerComboBox,CB_SETCURSEL,0,(LPARAM)0); +} + +void PropertyWindow::refreshExplorer(std::vector selectedInstances) +{ + Instance * instance = selectedInstances[0]; SendMessage(_explorerComboBox,CB_RESETCONTENT,0,0); parent = NULL; children.clear(); - //g_selectedInstances.clear(); - //for (unsigned int i=0;iname.c_str()); if(selectedInstance->getParent() != NULL) @@ -226,7 +225,6 @@ void PropertyWindow::refreshExplorer(Instance* selectedInstance) parent = selectedInstance->getParent(); children.push_back(selectedInstance->getParent()); } - //children = g_selectedInstances[i]->getChildren(); std::vector selectedChildren = selectedInstance->getChildren(); for(size_t z = 0; z < selectedChildren.size(); z++) @@ -343,11 +341,17 @@ void PropertyWindow::_resize() SetWindowPos(_explorerComboBox, NULL, 0, 0, rect.right, 400, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); } -void PropertyWindow::UpdateSelected(Instance * instance) +void PropertyWindow::UpdateSelected(std::vector instances) { + if(instances.size() <= 0) + { + ClearProperties(); + return; + } + Instance * instance = instances[0]; PropGrid_ResetContent(_propGrid); prop = instance->getProperties(); - if (selectedInstance != instance) + //if (selectedInstance != instance) { selectedInstance = instance; for(size_t i = 0; i < prop.size(); i++) @@ -361,12 +365,13 @@ void PropertyWindow::UpdateSelected(Instance * instance) PropGrid_ExpandAllCatalogs(_propGrid); //SetWindowLongPtr(_propGrid,GWL_USERDATA,(LONG)this); - refreshExplorer(instance); + refreshExplorer(instances); _resize(); } } void PropertyWindow::ClearProperties() { + clearExplorer(); PropGrid_ResetContent(_propGrid); } \ No newline at end of file diff --git a/src/source/Renderer.cpp b/src/source/Renderer.cpp index 4273a7a..38e286e 100644 --- a/src/source/Renderer.cpp +++ b/src/source/Renderer.cpp @@ -224,8 +224,9 @@ void renderShape(const Enum::Shape::Value& shape, const Vector3& size, const Col glPopMatrix(); /*Plusses, can possibly integrate into cylinder code later on*/ glVertexPointer(2, GL_FLOAT,0, square_arr); - glColor3f(127,127,127); glPushMatrix(); + glDisable(GL_COLOR_ARRAY); + glColor3f(127,127,127); glRotatef(90,0,1,0); glTranslatef(0,0,-(size.z+0.001F)); glScalef(0.75,0.75,0.75); @@ -233,9 +234,11 @@ void renderShape(const Enum::Shape::Value& shape, const Vector3& size, const Col glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glScalef(1/(size.x*8),size.x*8,1); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glEnable(GL_COLOR_ARRAY); glPopMatrix(); glPushMatrix(); + glDisable(GL_COLOR_ARRAY); glRotatef(-90,0,1,0); glTranslatef(0,0,-(size.z+0.001F)); glScalef(0.75,0.75,0.75); @@ -243,6 +246,7 @@ void renderShape(const Enum::Shape::Value& shape, const Vector3& size, const Col glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glScalef(1/(size.x*8),size.x*8,1); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glEnable(GL_COLOR_ARRAY); glPopMatrix(); } diff --git a/src/source/Tool/ArrowTool.cpp b/src/source/Tool/ArrowTool.cpp index f6f9c7a..a446bf8 100644 --- a/src/source/Tool/ArrowTool.cpp +++ b/src/source/Tool/ArrowTool.cpp @@ -1,5 +1,6 @@ #include "Tool/ArrowTool.h" #include "Application.h" +#include "DataModelV2/SelectionService.h" ArrowTool::ArrowTool(void) { @@ -21,13 +22,12 @@ void ArrowTool::onButton1MouseDown(Mouse mouse) mouseDownStarty = mouse.y; mouseDown = true; if(!lctrlDown && !rctrlDown) - g_selectedInstances.clear(); + g_dataModel->getSelectionService()->clearSelection(); PartInstance * target = mouse.getTarget(); - if(target != NULL && std::find(g_selectedInstances.begin(), g_selectedInstances.end(), target) == g_selectedInstances.end()) - g_selectedInstances.push_back(target); - if(g_selectedInstances.size() == 0) - g_selectedInstances.push_back(g_dataModel); - g_usableApp->_propWindow->UpdateSelected(g_selectedInstances[0]); + if(target != NULL) + g_dataModel->getSelectionService()->addSelected(target); + if(g_dataModel->getSelectionService()->getSelection().size() == 0) + g_dataModel->getSelectionService()->addSelected(g_dataModel); } void ArrowTool::onButton1MouseUp(Mouse mouse) { @@ -47,11 +47,11 @@ void ArrowTool::onMouseMoved(Mouse mouse) } else return; } - for(size_t i = 0; i < g_selectedInstances.size(); i++) //This will later decide primary and move all parts according to primary + for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++) //This will later decide primary and move all parts according to primary { - if(PartInstance * part = dynamic_cast(g_selectedInstances[i])) + if(PartInstance * part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { - part->setPosition(mouse.getPosition(g_selectedInstances)); + part->setPosition(mouse.getPosition(g_dataModel->getSelectionService()->getSelection())); } } return; @@ -69,30 +69,6 @@ void ArrowTool::onKeyDown(int key) { lctrlDown = true; } - else if(key == 'R') - { - if(g_selectedInstances.size() > 0) - { - Instance* selectedInstance = g_selectedInstances.at(0); - AudioPlayer::playSound(clickSound); - if(PartInstance* part = dynamic_cast(selectedInstance)) - { - part->setCFrame(part->getCFrame()*Matrix3::fromEulerAnglesXYZ(0,toRadians(90),0)); - } - } - } - else if(key == 'T') - { - if(g_selectedInstances.size() > 0) - { - Instance* selectedInstance = g_selectedInstances.at(0); - AudioPlayer::playSound(clickSound); - if(PartInstance* part = dynamic_cast(selectedInstance)) - { - part->setCFrame(part->getCFrame()*Matrix3::fromEulerAnglesXYZ(0,0,toRadians(90))); - } - } - } } void ArrowTool::onKeyUp(int key) diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp new file mode 100644 index 0000000..b5e8fa2 --- /dev/null +++ b/src/source/XplicitNgine/XplicitNgine.cpp @@ -0,0 +1,194 @@ +#include "XplicitNgine/XplicitNgine.h" +#include "Globals.h" + +#define SIDE (0.5f) +#define MASS (1.0) + +// constraints +#define MAX_BODIES 65535 +#define OBJ_DENSITY (5.0) +#define MAX_CONTACT_PER_BODY 4 + +XplicitNgine::XplicitNgine() +{ + physWorld = dWorldCreate(); + physSpace = dHashSpaceCreate(0); + contactgroup = dJointGroupCreate(0); + + dWorldSetGravity(physWorld, 0, -0.5, 0); + + this->name = "PhysicsService"; + //dGeomID ground_geom = dCreatePlane(physSpace, 0, 1, 0, 0); +} + +XplicitNgine::~XplicitNgine() +{ + dJointGroupDestroy (contactgroup); + dSpaceDestroy (physSpace); + dWorldDestroy (physWorld); + dCloseODE(); +} + +void collisionCallback(void *data, dGeomID o1, dGeomID o2) +{ + int i,n; + + dBodyID b1 = dGeomGetBody(o1); + dBodyID b2 = dGeomGetBody(o2); + if (b1 && b2 && dAreConnected(b1, b2)) + return; + + const int N = 4; + dContact contact[N]; + n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact)); + if (n > 0) { + for (i=0; iphysWorld, + g_xplicitNgine->contactgroup, + contact+i + ); + + dJointAttach (c,b1,b2); + } + } +} + +void XplicitNgine::deleteBody(PartInstance* partInstance) +{ + if(partInstance->physBody != NULL) + { + while(dBodyGetNumJoints(partInstance->physBody) > 0) { + dJointDestroy(dBodyGetJoint(partInstance->physBody, 0)); + } + dBodyDestroy(partInstance->physBody); + dGeomDestroy(partInstance->physGeom[0]); + partInstance->physBody = NULL; + } +} + +void XplicitNgine::createBody(PartInstance* partInstance) +{ + // calculate collisions + //dSpaceCollide (physSpace,0,&collisionCallback); + + if(partInstance->physBody == NULL) + { + // init body + partInstance->physBody = dBodyCreate(physWorld); + + // Create geom + if(partInstance->shape == Enum::Shape::Block) + { + partInstance->physGeom[0] = dCreateBox(physSpace, + partInstance->getSize()[0], + partInstance->getSize()[1], + partInstance->getSize()[2] + ); + + dVector3 result; + dGeomBoxGetLengths(partInstance->physGeom[0], result); + //printf("[XplicitNgine] Part Geom Size: %.1f, %.1f, %.1f\n", + // result[0], + // result[1], + // result[2] + //); + } + else + { + partInstance->physGeom[0] = dCreateSphere(physSpace, partInstance->getSize()[0]/2); + } + + dMass mass; + mass.setBox(partInstance->getSize().x, partInstance->getSize().y, partInstance->getSize().z, 0.7F); + dBodySetMass(partInstance->physBody, &mass); + + // Debug output + + + // Create rigid body + //printf("[XplicitNgine] Created Geom for PartInstance\n"); + dBodySetPosition(partInstance->physBody, + partInstance->getPosition()[0], + partInstance->getPosition()[1], + partInstance->getPosition()[2] + ); + + dGeomSetPosition(partInstance->physGeom[0], + partInstance->getPosition()[0], + partInstance->getPosition()[1], + partInstance->getPosition()[2]); + + Matrix3 g3dRot = partInstance->getCFrame().rotation; + float rotation [12] = { g3dRot[0][0], g3dRot[0][1], g3dRot[0][2], 0, + g3dRot[1][0], g3dRot[1][1], g3dRot[1][2], 0, + g3dRot[2][0], g3dRot[2][1], g3dRot[2][2], 0}; + + dGeomSetRotation(partInstance->physGeom[0], rotation); + dBodySetRotation(partInstance->physBody, rotation); + + //printf("[XplicitNgine] Created Body for PartInstance\n"); + + if(!partInstance->isAnchored()) + dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); + + } else { + if(!partInstance->isAnchored()) + { + const dReal* physPosition = dBodyGetPosition(partInstance->physBody); + + // TODO: Rotation code + // Probably should be done AFTER we get physics KINDA working!!! + const dReal* physRotation = dGeomGetRotation(partInstance->physGeom[0]); + //partInstance->setPosition(Vector3(physPosition[0], physPosition[1], physPosition[2])); + partInstance->setCFrameNoSync(CoordinateFrame( + Matrix3(physRotation[0],physRotation[1],physRotation[2], + physRotation[4],physRotation[5],physRotation[6], + physRotation[8],physRotation[9],physRotation[10]), + Vector3(physPosition[0], physPosition[1], physPosition[2]))); + } + } +//STEP SHOULD NOT BE HERE! + //dWorldQuickStep(physWorld, stepSize); + //dJointGroupEmpty(contactgroup); +} + +void XplicitNgine::step(float stepSize) +{ + dSpaceCollide (physSpace,0,&collisionCallback); + dWorldQuickStep(physWorld, stepSize); + dJointGroupEmpty(contactgroup); +} + +void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFrame) +{ + if(partInstance->physBody != NULL) + { + Vector3 position = cFrame->translation; + + dBodySetPosition(partInstance->physBody, + position[0], + position[1], + position[2] + ); + + Matrix3 g3dRot = cFrame->rotation; + float rotation [12] = { g3dRot[0][0], g3dRot[0][1], g3dRot[0][2], 0, + g3dRot[1][0], g3dRot[1][1], g3dRot[1][2], 0, + g3dRot[2][0], g3dRot[2][1], g3dRot[2][2], 0}; + + dBodySetRotation(partInstance->physBody, rotation); + } +} \ No newline at end of file diff --git a/src/source/main.cpp b/src/source/main.cpp index fba0d8d..4866b20 100644 --- a/src/source/main.cpp +++ b/src/source/main.cpp @@ -1,6 +1,10 @@ // TODO: Move toolbar buttons with resized window. -#include "winver.h" -#include "../../resource.h" +#define _WIN32_WINNT 0x0400 +#define _WIN32_WINDOWS 0x0400 +#define WINVER 0x0400 +#define _CRTBLD + +#include "resource.h" #include "Application.h" #include "WindowFunctions.h" #include "ax.h" @@ -149,10 +153,7 @@ LRESULT CALLBACK G3DProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) int main(int argc, char** argv) { - - long double a = 1; - -#ifndef IGNORE_CATCH +#ifndef _DEBUG try{ #endif hresult = OleInitialize(NULL); @@ -179,7 +180,7 @@ int main(int argc, char** argv) { icc.dwSize = sizeof(icc); icc.dwICC = ICC_WIN95_CLASSES/*|ICC_COOL_CLASSES|ICC_DATE_CLASSES| - // ICC_PAGESCROLLER_CLASS|ICC_USEREX_CLASSES*/; + ICC_PAGESCROLLER_CLASS|ICC_USEREX_CLASSES*/; InitCommonControlsEx(&icc); AudioPlayer::init(); @@ -222,12 +223,12 @@ int main(int argc, char** argv) { Globals::mainHwnd = hwndMain; Application app = Application(hwndMain); app.run(); - #ifndef IGNORE_CATCH +#ifndef _DEBUG } catch(...) { OnError(-1); } - #endif +#endif return 0; } diff --git a/src/source/propertyGrid.cpp b/src/source/propertyGrid.cpp index 8f27aab..2de3fae 100644 --- a/src/source/propertyGrid.cpp +++ b/src/source/propertyGrid.cpp @@ -31,12 +31,13 @@ //DWM 1.9: Suppress POCC Warning "Argument x to 'sscanf' does not match the format string; // expected 'unsigned char *' but found 'unsigned long'" -#include "winver.h" - #ifdef __POCC__ #pragma warn(disable:2234) #endif +#ifndef _WIN32_WINNT // Necessary for WM_MOUSEWHEEL support +#define _WIN32_WINNT 0x0400 +#endif // MSVC++ Support #ifndef _CRT_SECURE_NO_WARNINGS