| 365 | } |
| 366 | |
| 367 | void Sc::BodyCore::setFlags(Ps::Pool<SimStateData>* simStateDataPool, PxRigidBodyFlags f) |
| 368 | { |
| 369 | const PxRigidBodyFlags old = mCore.mFlags; |
| 370 | if(f != old) |
| 371 | { |
| 372 | const PxU32 wasKinematic = old & PxRigidBodyFlag::eKINEMATIC; |
| 373 | const PxU32 isKinematic = f & PxRigidBodyFlag::eKINEMATIC; |
| 374 | const bool switchToKinematic = ((!wasKinematic) && isKinematic); |
| 375 | const bool switchToDynamic = (wasKinematic && (!isKinematic)); |
| 376 | |
| 377 | mCore.mFlags = f; |
| 378 | BodySim* sim = getSim(); |
| 379 | if (sim) |
| 380 | { |
| 381 | PX_ASSERT(simStateDataPool); |
| 382 | |
| 383 | const PxU32 posePreviewFlag = f & PxRigidBodyFlag::eENABLE_POSE_INTEGRATION_PREVIEW; |
| 384 | if(PxU32(old & PxRigidBodyFlag::eENABLE_POSE_INTEGRATION_PREVIEW) != posePreviewFlag) |
| 385 | sim->postPosePreviewChange(posePreviewFlag); |
| 386 | |
| 387 | // for those who might wonder about the complexity here: |
| 388 | // our current behavior is that you are not allowed to set a kinematic target unless the object is in a scene. |
| 389 | // Thus, the kinematic data should only be created/destroyed when we know for sure that we are in a scene. |
| 390 | |
| 391 | if(switchToKinematic) |
| 392 | { |
| 393 | setupSimStateData(simStateDataPool, true, false); |
| 394 | sim->postSwitchToKinematic(); |
| 395 | } |
| 396 | else if(switchToDynamic) |
| 397 | { |
| 398 | tearDownSimStateData(simStateDataPool, true); |
| 399 | sim->postSwitchToDynamic(); |
| 400 | } |
| 401 | |
| 402 | const PxU32 wasSpeculativeCCD = old & PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD; |
| 403 | const PxU32 isSpeculativeCCD = f & PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD; |
| 404 | |
| 405 | if(wasSpeculativeCCD ^ isSpeculativeCCD) |
| 406 | { |
| 407 | if(wasSpeculativeCCD) |
| 408 | { |
| 409 | if(sim->isArticulationLink()) |
| 410 | sim->getScene().resetSpeculativeCCDArticulationLink(sim->getNodeIndex().index()); |
| 411 | else |
| 412 | sim->getScene().resetSpeculativeCCDRigidBody(sim->getNodeIndex().index()); |
| 413 | |
| 414 | sim->getLowLevelBody().mInternalFlags &= (~PxcRigidBody::eSPECULATIVE_CCD); |
| 415 | } |
| 416 | else |
| 417 | { |
| 418 | if(sim->isArticulationLink()) |
| 419 | sim->getScene().setSpeculativeCCDArticulationLink(sim->getNodeIndex().index()); |
| 420 | else |
| 421 | sim->getScene().setSpeculativeCCDRigidBody(sim->getNodeIndex().index()); |
| 422 | |
| 423 | sim->getLowLevelBody().mInternalFlags |= (PxcRigidBody::eSPECULATIVE_CCD); |
| 424 | } |
nothing calls this directly
no test coverage detected