MCPcopy Create free account
hub / github.com/NVIDIAGameWorks/PhysX / setFlags

Method setFlags

physx/source/simulationcontroller/src/ScBodyCore.cpp:367–442  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

365}
366
367void 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 }

Callers

nothing calls this directly

Calls 8

postPosePreviewChangeMethod · 0.80
postSwitchToKinematicMethod · 0.80
postSwitchToDynamicMethod · 0.80
isArticulationLinkMethod · 0.80
indexMethod · 0.80
getSceneMethod · 0.45
destroySqBoundsMethod · 0.45
createSqBoundsMethod · 0.45

Tested by

no test coverage detected