void PhysXRigidbody::setFlags(Flag flags) { bool ccdEnabledOld = mInternal->getRigidBodyFlags() & PxRigidBodyFlag::eENABLE_CCD; bool ccdEnabledNew = ((UINT32)flags & (UINT32)Flag::CCD) != 0; if(ccdEnabledOld != ccdEnabledNew) { if(ccdEnabledNew) { if (!gPhysics().hasFlag(PhysicsFlag::CCD_Enable)) LOGWRN("Enabling CCD on a Rigidbody but CCD is not enabled globally."); } mInternal->setRigidBodyFlag(PxRigidBodyFlag::eENABLE_CCD, ccdEnabledNew); // Enable/disable CCD on shapes so the filter can handle them properly UINT32 numShapes = mInternal->getNbShapes(); PxShape** shapes = (PxShape**)bs_stack_alloc(sizeof(PxShape*) * numShapes); mInternal->getShapes(shapes, sizeof(PxShape*) * numShapes); for (UINT32 i = 0; i < numShapes; i++) { Collider* collider = (Collider*)shapes[i]->userData; collider->_getInternal()->_setCCD(ccdEnabledNew); } } Rigidbody::setFlags(flags); }
bool PhysXCharacterController::filter(const PxController& a, const PxController& b) { CharacterController* controllerA = (CharacterController*)a.getUserData(); CharacterController* controllerB = (CharacterController*)b.getUserData(); bool canCollide = gPhysics().isCollisionEnabled(controllerA->getLayer(), controllerB->getLayer()); return canCollide; }
PxQueryHitType::Enum PhysXCharacterController::preFilter(const PxFilterData& filterData, const PxShape* shape, const PxRigidActor* actor, PxHitFlags& queryFlags) { PxFilterData colliderFilterData = shape->getSimulationFilterData(); UINT64 colliderLayer = *(UINT64*)&colliderFilterData.word0; bool canCollide = gPhysics().isCollisionEnabled(colliderLayer, getLayer()); if(canCollide) return PxSceneQueryHitType::eBLOCK; return PxSceneQueryHitType::eNONE; }
void CCollider::onTransformChanged(TransformChangedFlags flags) { if (!SO()->getActive()) return; if ((flags & TCF_Parent) != 0) updateParentRigidbody(); // Don't update the transform if it's due to Physics update since then we can guarantee it will remain at the same // relative transform to its parent if (gPhysics()._isUpdateInProgress()) return; if ((flags & (TCF_Parent | TCF_Transform)) != 0) updateTransform(); }
SPtr<CharacterController> CharacterController::create(const CHAR_CONTROLLER_DESC& desc) { return gPhysics().createCharacterController(desc); }
SPtr<D6Joint> D6Joint::create(const D6_JOINT_DESC& desc) { return gPhysics().createD6Joint(desc); }
bool Collider::rayCast(const Vector3& origin, const Vector3& unitDir, PhysicsQueryHit& hit, float maxDist) const { return gPhysics()._rayCast(origin, unitDir, *this, hit, maxDist); }
bool Collider::rayCast(const Ray& ray, PhysicsQueryHit& hit, float maxDist) const { return gPhysics()._rayCast(ray.getOrigin(), ray.getDirection(), *this, hit, maxDist); }
SPtr<SliderJoint> SliderJoint::create(const SLIDER_JOINT_DESC& desc) { return gPhysics().createSliderJoint(desc); }
SPtr<HingeJoint> HingeJoint::create(const HINGE_JOINT_DESC& desc) { return gPhysics().createHingeJoint(desc); }
SPtr<Rigidbody> Rigidbody::create(const HSceneObject& linkedSO) { return gPhysics().createRigidbody(linkedSO); }
SPtr<FixedJoint> FixedJoint::create(const FIXED_JOINT_DESC& desc) { return gPhysics().createFixedJoint(desc); }