From b01f5765b1b86ad333af3da3f72487efde69cfd4 Mon Sep 17 00:00:00 2001 From: Vulpovile Date: Wed, 5 Oct 2022 20:51:01 -0700 Subject: [PATCH] Fixed removing anchored parts when sleeping --- src/include/XplicitNgine/XplicitNgine.h | 2 +- src/source/DataModelV2/PartInstance.cpp | 2 +- src/source/XplicitNgine/XplicitNgine.cpp | 22 +++++++++++++--------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/include/XplicitNgine/XplicitNgine.h b/src/include/XplicitNgine/XplicitNgine.h index 0c33a3b..f6ae1c4 100644 --- a/src/include/XplicitNgine/XplicitNgine.h +++ b/src/include/XplicitNgine/XplicitNgine.h @@ -15,5 +15,5 @@ public: void step(float stepSize); void createBody(PartInstance* partInstance); void deleteBody(PartInstance* partInstance); - void updateBody(PartInstance* partInstance, CoordinateFrame * cFrame); + void updateBody(PartInstance* partInstance); }; \ No newline at end of file diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 7afab53..1a73873 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -254,8 +254,8 @@ CoordinateFrame PartInstance::getCFrame() } void PartInstance::setCFrame(CoordinateFrame coordinateFrame) { - g_dataModel->getEngine()->updateBody(this, &coordinateFrame); setCFrameNoSync(coordinateFrame); + g_dataModel->getEngine()->updateBody(this); } void PartInstance::setCFrameNoSync(CoordinateFrame coordinateFrame) diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp index 0e3a3f1..36850d6 100644 --- a/src/source/XplicitNgine/XplicitNgine.cpp +++ b/src/source/XplicitNgine/XplicitNgine.cpp @@ -17,8 +17,8 @@ XplicitNgine::XplicitNgine() dWorldSetGravity(physWorld, 0, -9.8F, 0); dWorldSetAutoDisableFlag(physWorld, 1); - dWorldSetAutoDisableLinearThreshold(physWorld, 0.05F); - dWorldSetAutoDisableAngularThreshold(physWorld, 0.05F); + dWorldSetAutoDisableLinearThreshold(physWorld, 0.5F); + dWorldSetAutoDisableAngularThreshold(physWorld, 0.5F); dWorldSetAutoDisableSteps(physWorld, 40); this->name = "PhysicsService"; @@ -75,11 +75,15 @@ void XplicitNgine::deleteBody(PartInstance* partInstance) if(partInstance->physBody != NULL) { dBodyEnable(partInstance->physBody); - if(partInstance->isAnchored()) - dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); dGeomEnable(partInstance->physGeom[0]); - //createBody(partInstance); - //step(0.5F); + if(partInstance->isAnchored()) + { + dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); + dGeomEnable(partInstance->physGeom[0]); + updateBody(partInstance); + step(0.03F); + } + for(int i = 0; i < dBodyGetNumJoints(partInstance->physBody); i++) { dBodyID b1 = dJointGetBody(dBodyGetJoint(partInstance->physBody, i), 0); dBodyID b2 = dJointGetBody(dBodyGetJoint(partInstance->physBody, i), 1); @@ -205,11 +209,11 @@ void XplicitNgine::step(float stepSize) //dWorldStep(physWorld, stepSize); } -void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFrame) +void XplicitNgine::updateBody(PartInstance *partInstance) { if(partInstance->physBody != NULL) { - Vector3 position = cFrame->translation; + Vector3 position = partInstance->getCFrame().translation; dBodySetPosition(partInstance->physBody, position[0], @@ -219,7 +223,7 @@ void XplicitNgine::updateBody(PartInstance *partInstance, CoordinateFrame * cFra dBodyEnable(partInstance->physBody); dGeomEnable(partInstance->physGeom[0]); - Matrix3 g3dRot = cFrame->rotation; + 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};