Fixed removing anchored parts when sleeping

This commit is contained in:
Vulpovile
2022-10-05 20:51:01 -07:00
parent 530bcf2a74
commit b01f5765b1
3 changed files with 15 additions and 11 deletions

View File

@@ -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);
};

View File

@@ -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)

View File

@@ -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};