From c9db28a3a3e0b5b18fc19cc22f316191b46a7a5b Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Thu, 6 Oct 2022 16:37:18 -0400 Subject: [PATCH 1/5] Disable physics of dragged selected parts --- src/include/DataModelV2/PartInstance.h | 5 +++- src/include/XplicitNgine/XplicitNgine.h | 1 + src/source/DataModelV2/PartInstance.cpp | 36 +++++++++++++----------- src/source/Tool/ArrowTool.cpp | 9 ++++++ src/source/XplicitNgine/XplicitNgine.cpp | 12 ++++++-- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/include/DataModelV2/PartInstance.h b/src/include/DataModelV2/PartInstance.h index c9a21fe..90f9f58 100644 --- a/src/include/DataModelV2/PartInstance.h +++ b/src/include/DataModelV2/PartInstance.h @@ -56,11 +56,13 @@ public: void setAnchored(bool anchored); bool isAnchored(); float getMass(); + bool isDragging(); + void setDragging(bool value); //Collision bool collides(PartInstance * part); bool collides(Box); - + //Properties virtual std::vector getProperties(); virtual void PropUpdate(LPPROPGRIDITEM &pItem); @@ -71,6 +73,7 @@ private: Vector3 velocity; Vector3 rotVelocity; bool changed; + bool dragging; Box itemBox; GLuint glList; }; \ No newline at end of file diff --git a/src/include/XplicitNgine/XplicitNgine.h b/src/include/XplicitNgine/XplicitNgine.h index f6ae1c4..8dfef4b 100644 --- a/src/include/XplicitNgine/XplicitNgine.h +++ b/src/include/XplicitNgine/XplicitNgine.h @@ -16,4 +16,5 @@ public: void createBody(PartInstance* partInstance); void deleteBody(PartInstance* partInstance); void updateBody(PartInstance* partInstance); + void resetBody(PartInstance* partInstance); }; \ No newline at end of file diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 7521618..87bf613 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -14,6 +14,7 @@ PartInstance::PartInstance(void) className = "Part"; canCollide = true; anchored = false; + dragging = false; size = Vector3(2,1,4); setCFrame(CoordinateFrame(Vector3(0,0,0))); color = Color3::gray(); @@ -28,6 +29,20 @@ PartInstance::PartInstance(void) shape = Enum::Shape::Block; } +bool PartInstance::isDragging() +{ + return dragging; +} + +void PartInstance::setDragging(bool value) +{ + if (dragging != value) + { + dragging = value; + g_dataModel->getEngine()->resetBody(this); + } +} + float PartInstance::getMass() { if(shape == Enum::Shape::Block) @@ -206,10 +221,7 @@ void PartInstance::setSize(Vector3 newSize) size = Vector3(sizex, sizey, sizez); if(this->physBody != NULL) - { - g_dataModel->getEngine()->deleteBody(this); - g_dataModel->getEngine()->createBody(this); - } + g_dataModel->getEngine()->resetBody(this); } Vector3 PartInstance::getSize() { @@ -231,10 +243,8 @@ void PartInstance::setShape(Enum::Shape::Value shape) this->setSize(this->getSize()); } if(this->physBody != NULL) - { - g_dataModel->getEngine()->deleteBody(this); - g_dataModel->getEngine()->createBody(this); - } + g_dataModel->getEngine()->resetBody(this); + changed = true; } @@ -244,20 +254,14 @@ void PartInstance::setPosition(Vector3 pos) setCFrame(CoordinateFrame(cFrame.rotation, pos)); if (anchored) - { - g_dataModel->getEngine()->deleteBody(this); - g_dataModel->getEngine()->createBody(this); - } + g_dataModel->getEngine()->resetBody(this); } void PartInstance::setAnchored(bool anchored) { this->anchored = anchored; if(this->physBody != NULL) - { - g_dataModel->getEngine()->deleteBody(this); - g_dataModel->getEngine()->createBody(this); - } + g_dataModel->getEngine()->resetBody(this); } bool PartInstance::isAnchored() diff --git a/src/source/Tool/ArrowTool.cpp b/src/source/Tool/ArrowTool.cpp index e83d5e3..8b98d8c 100644 --- a/src/source/Tool/ArrowTool.cpp +++ b/src/source/Tool/ArrowTool.cpp @@ -39,6 +39,14 @@ void ArrowTool::onButton1MouseUp(Mouse mouse) { mouseDown = false; dragging = false; + + 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_dataModel->getSelectionService()->getSelection()[i])) + { + part->setDragging(false); + } + } } void ArrowTool::onMouseMoved(Mouse mouse) @@ -90,6 +98,7 @@ void ArrowTool::onMouseMoved(Mouse mouse) rot = rot.fromEulerAnglesXYZ( rotEulerAngles.x * (M_PI / 180), rotEulerAngles.y * (M_PI / 180), rotEulerAngles.z * (M_PI / 180) ); part->setPosition(vec); + part->setDragging(true); part->setCFrame(CoordinateFrame(rot, vec)); } } diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp index 4831180..8a434ff 100644 --- a/src/source/XplicitNgine/XplicitNgine.cpp +++ b/src/source/XplicitNgine/XplicitNgine.cpp @@ -34,6 +34,12 @@ XplicitNgine::~XplicitNgine() dCloseODE(); } +void XplicitNgine::resetBody(PartInstance* partInstance) +{ + deleteBody(partInstance); + createBody(partInstance); +} + void collisionCallback(void *data, dGeomID o1, dGeomID o2) { int i,n; @@ -78,7 +84,7 @@ void XplicitNgine::deleteBody(PartInstance* partInstance) { dBodyEnable(partInstance->physBody); dGeomEnable(partInstance->physGeom[0]); - if(partInstance->isAnchored()) + if(partInstance->isAnchored() || partInstance->isDragging()) { dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); dGeomEnable(partInstance->physGeom[0]); @@ -183,11 +189,11 @@ void XplicitNgine::createBody(PartInstance* partInstance) //printf("[XplicitNgine] Created Body for PartInstance\n"); - if(!partInstance->isAnchored()) + if(!partInstance->isAnchored() && !partInstance->isDragging()) dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); } else { - if(!partInstance->isAnchored()) + if(!partInstance->isAnchored() && !partInstance->isDragging()) { const dReal* velocity = dBodyGetLinearVel(partInstance->physBody); const dReal* rotVelocity = dBodyGetAngularVel(partInstance->physBody); From 083d94f81116795cb36dfd47d2b23e023fe3a755 Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Thu, 6 Oct 2022 16:48:54 -0400 Subject: [PATCH 2/5] Bugfix: Dragging physics happens for one frame. --- src/source/Tool/ArrowTool.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/source/Tool/ArrowTool.cpp b/src/source/Tool/ArrowTool.cpp index 8b98d8c..106482c 100644 --- a/src/source/Tool/ArrowTool.cpp +++ b/src/source/Tool/ArrowTool.cpp @@ -96,9 +96,9 @@ void ArrowTool::onMouseMoved(Mouse mouse) roundDeg(rotEulerAngles.z); rot = rot.fromEulerAnglesXYZ( rotEulerAngles.x * (M_PI / 180), rotEulerAngles.y * (M_PI / 180), rotEulerAngles.z * (M_PI / 180) ); - - part->setPosition(vec); + part->setDragging(true); + part->setPosition(vec); part->setCFrame(CoordinateFrame(rot, vec)); } } From 1a0949f2e8f85f5318a30cb9881c2d401106b804 Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Thu, 6 Oct 2022 21:36:12 -0400 Subject: [PATCH 3/5] Fix: PropertyGrid crash when you resize it after it resets --- src/source/propertyGrid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/source/propertyGrid.cpp b/src/source/propertyGrid.cpp index 2de3fae..9a0c83a 100644 --- a/src/source/propertyGrid.cpp +++ b/src/source/propertyGrid.cpp @@ -3917,7 +3917,7 @@ static BOOL Grid_OnGetSel(INT iItem) static VOID Grid_OnResetContent(VOID) { ListBox_ResetContent(g_lpInst->hwndListMap); - + g_lpInst->lpCurrent = NULL; if (NULL != g_lpInst->hwndCtl1) { DestroyWindow(g_lpInst->hwndCtl1); From 17f08a59cefadd956d7e3ed790c938d5d64ea4ef Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Thu, 6 Oct 2022 22:04:57 -0400 Subject: [PATCH 4/5] Increment Versioning --- src/include/versioning.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/versioning.h b/src/include/versioning.h index 443cf65..cc0cc7f 100644 --- a/src/include/versioning.h +++ b/src/include/versioning.h @@ -4,7 +4,7 @@ #define APP_GENER 0 #define APP_MAJOR 0 -#define APP_MINOR 107 +#define APP_MINOR 108 #define APP_PATCH 0 #define APP_VER_STRING APP_GENER.APP_MAJOR.APP_MINOR.APP_PATCH From b6dfd62b4c91f2c7752ea84b0010afa5e4d2ce6d Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Thu, 6 Oct 2022 22:10:25 -0400 Subject: [PATCH 5/5] Increment APP_PATCH instead --- src/include/versioning.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/versioning.h b/src/include/versioning.h index cc0cc7f..249ec95 100644 --- a/src/include/versioning.h +++ b/src/include/versioning.h @@ -4,8 +4,8 @@ #define APP_GENER 0 #define APP_MAJOR 0 -#define APP_MINOR 108 -#define APP_PATCH 0 +#define APP_MINOR 107 +#define APP_PATCH 1 #define APP_VER_STRING APP_GENER.APP_MAJOR.APP_MINOR.APP_PATCH