void NpConstraint::setConstraintFunctions(PxConstraintConnector& n, const PxConstraintShaderTable& shaders) { mConstraint.getScConstraint().setConstraintFunctions(n, shaders); //update mConnectorArray, since mActor0 or mActor1 should be in external reference bool bNeedUpdate = false; if(mActor0) { NpActor& npActor = NpActor::getFromPxActor(*mActor0); if(npActor.findConnector(NpConnectorType::eConstraint, this) == 0xffffffff) { bNeedUpdate = true; npActor.addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 0: Constraint already added"); } } if(mActor1) { NpActor& npActor = NpActor::getFromPxActor(*mActor1); if(npActor.findConnector(NpConnectorType::eConstraint, this) == 0xffffffff) { bNeedUpdate = true; npActor.addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 1: Constraint already added"); } } if(bNeedUpdate) { NpScene* newScene = getSceneFromActors(mActor0, mActor1); NpScene* oldScene = getNpScene(); if (oldScene != newScene) { if (oldScene) { oldScene->removeFromConstraintList(*this); oldScene->getScene().removeConstraint(getScbConstraint()); } if (newScene) { newScene->addToConstraintList(*this); newScene->getScene().addConstraint(getScbConstraint()); } } } }
void NpConstraint::setActors(PxRigidActor* actor0, PxRigidActor* actor1) { NP_WRITE_CHECK(getNpScene()); PX_CHECK_AND_RETURN((actor0 && !actor0->is<PxRigidStatic>()) || (actor1 && !actor1->is<PxRigidStatic>()), "PxConstraint: at least one actor must be non-static"); PX_SIMD_GUARD; if(mActor0) NpActor::getFromPxActor(*mActor0).removeConnector(*mActor0, NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 0: Constraint already added"); if(mActor1) NpActor::getFromPxActor(*mActor1).removeConnector(*mActor1, NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 1: Constraint already added"); if(actor0) NpActor::getFromPxActor(*actor0).addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 0: Constraint already added"); if(actor1) NpActor::getFromPxActor(*actor1).addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 1: Constraint already added"); mActor0 = actor0; mActor1 = actor1; NpScene* newScene = getSceneFromActors(actor0, actor1); NpScene* oldScene = getNpScene(); if (oldScene != newScene) { if (oldScene) { oldScene->removeFromConstraintList(*this); oldScene->getScene().removeConstraint(getScbConstraint()); } getScbConstraint().setBodies(getScbRigidObject(actor0), getScbRigidObject(actor1)); if (newScene) { newScene->addToConstraintList(*this); newScene->getScene().addConstraint(getScbConstraint()); } } else getScbConstraint().setBodies(getScbRigidObject(actor0), getScbRigidObject(actor1)); }
NpConstraint::NpConstraint(PxRigidActor* actor0, PxRigidActor* actor1, PxConstraintConnector& connector, const PxConstraintShaderTable& shaders, PxU32 dataSize) : PxConstraint(PxConcreteType::eCONSTRAINT, PxBaseFlag::eOWNS_MEMORY) , mActor0 (actor0) , mActor1 (actor1) , mConstraint (connector, shaders, dataSize) , mIsDirty (true) { mConstraint.setFlags(shaders.flag); if(actor0) NpActor::getFromPxActor(*actor0).addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 0: Constraint already added"); if(actor1) NpActor::getFromPxActor(*actor1).addConnector(NpConnectorType::eConstraint, this, "PxConstraint: Add to rigid actor 1: Constraint already added"); NpScene* s = getSceneFromActors(actor0, actor1); if (s) { s->addToConstraintList(*this); s->getScene().addConstraint(mConstraint); } }