void FPhysScene::SetKinematicTarget(FBodyInstance * BodyInstance, const FTransform & TargetTransform) { TargetTransform.DiagnosticCheckNaN_All(); #if WITH_PHYSX if (PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic()) { #if WITH_SUBSTEPPING if (IsSubstepping()) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->SetKinematicTarget(BodyInstance, TargetTransform); } else #endif { const PxTransform PNewPose = U2PTransform(TargetTransform); check(PNewPose.isValid()); SCOPED_SCENE_WRITE_LOCK(PRigidDynamic->getScene()); PRigidDynamic->setKinematicTarget(PNewPose); } } #endif }
bool FPhysScene::GetKinematicTarget(const FBodyInstance* BodyInstance, FTransform& OutTM) const { #if WITH_PHYSX if (PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic()) { #if WITH_SUBSTEPPING uint32 BodySceneType = SceneType(BodyInstance); if (IsSubstepping(BodySceneType)) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[BodySceneType]; return PhysSubStepper->GetKinematicTarget(BodyInstance, OutTM); } else #endif { SCOPED_SCENE_READ_LOCK(PRigidDynamic->getScene()); PxTransform POutTM; bool validTM = PRigidDynamic->getKinematicTarget(POutTM); if (validTM) { OutTM = P2UTransform(POutTM); return true; } } } #endif return false; }
void FPhysScene::AddCustomPhysics(FBodyInstance* BodyInstance, FCalculateCustomPhysics& CalculateCustomPhysics) { #if WITH_PHYSX #if WITH_SUBSTEPPING uint32 BodySceneType = SceneType(BodyInstance); if (IsSubstepping(BodySceneType)) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->AddCustomPhysics(BodyInstance, CalculateCustomPhysics); } else #endif { // Since physics frame is set up before "pre-physics" tick group is called, can just fetch delta time from there CalculateCustomPhysics.ExecuteIfBound(this->DeltaSeconds, BodyInstance); } #endif }
void FPhysScene::TermBody(FBodyInstance * BodyInstance) { #if WITH_SUBSTEPPING if (PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic()) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->RemoveBodyInstance(BodyInstance); } #endif }
void FPhysScene::TermBody(FBodyInstance* BodyInstance) { #if WITH_SUBSTEPPING if (PxRigidBody * PRigidBody = BodyInstance->GetPxRigidBody()) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->RemoveBodyInstance(BodyInstance); } #endif #if WITH_PHYSX RemoveActiveBody(BodyInstance, PST_Sync); RemoveActiveBody(BodyInstance, PST_Async); #endif }
void FPhysScene::AddTorque(FBodyInstance * BodyInstance, const FVector & Torque) { #if WITH_PHYSX if (PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic()) { #if WITH_SUBSTEPPING if (IsSubstepping()) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->AddTorque(BodyInstance, Torque); } else #endif { SCOPED_SCENE_WRITE_LOCK(PRigidDynamic->getScene()); PRigidDynamic->addTorque(U2PVector(Torque), PxForceMode::eFORCE, true); } } #endif }
void FPhysScene::AddForceAtPosition(FBodyInstance * BodyInstance, const FVector & Force, const FVector & Position) { #if WITH_PHYSX if (PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic()) { #if WITH_SUBSTEPPING if (IsSubstepping()) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[SceneType(BodyInstance)]; PhysSubStepper->AddForceAtPosition(BodyInstance, Force, Position); } else #endif { SCOPED_SCENE_WRITE_LOCK(PRigidDynamic->getScene()); PxRigidBodyExt::addForceAtPos(*PRigidDynamic, U2PVector(Force), U2PVector(Position), PxForceMode::eFORCE, true); } } #endif }
void FPhysScene::AddTorque(FBodyInstance* BodyInstance, const FVector& Torque, bool bAllowSubstepping) { #if WITH_PHYSX if (PxRigidBody * PRigidBody = BodyInstance->GetPxRigidBody()) { #if WITH_SUBSTEPPING uint32 BodySceneType = SceneType(BodyInstance); if (bAllowSubstepping && IsSubstepping(BodySceneType)) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[BodySceneType]; PhysSubStepper->AddTorque(BodyInstance, Torque); } else #endif { SCOPED_SCENE_WRITE_LOCK(PRigidBody->getScene()); PRigidBody->addTorque(U2PVector(Torque), PxForceMode::eFORCE, true); } } #endif }
void FPhysScene::AddForceAtPosition(FBodyInstance* BodyInstance, const FVector& Force, const FVector& Position, bool bAllowSubstepping) { #if WITH_PHYSX if (PxRigidBody * PRigidBody = BodyInstance->GetPxRigidBody()) { #if WITH_SUBSTEPPING uint32 BodySceneType = SceneType(BodyInstance); if (bAllowSubstepping && IsSubstepping(BodySceneType)) { FPhysSubstepTask * PhysSubStepper = PhysSubSteppers[BodySceneType]; PhysSubStepper->AddForceAtPosition(BodyInstance, Force, Position); } else #endif { SCOPED_SCENE_WRITE_LOCK(PRigidBody->getScene()); PxRigidBodyExt::addForceAtPos(*PRigidBody, U2PVector(Force), U2PVector(Position), PxForceMode::eFORCE, true); } } #endif }