void FPhysSubstepTask::SubstepInterpolation(float InAlpha, float DeltaTime) { #if WITH_PHYSX #if WITH_APEX SCOPED_APEX_SCENE_WRITE_LOCK(PAScene); PxScene * PScene = PAScene->getPhysXScene(); #else PxScene * PScene = PAScene; SCOPED_SCENE_WRITE_LOCK(PScene); #endif /** Note: We lock the entire scene before iterating. The assumption is that removing an FBodyInstance from the map will also be wrapped by this lock */ PhysTargetMap& Targets = PhysTargetBuffers[!External]; for (PhysTargetMap::TIterator Itr = Targets.CreateIterator(); Itr; ++Itr) { FPhysTarget & PhysTarget = Itr.Value(); FBodyInstance * BodyInstance = Itr.Key(); PxRigidBody* PRigidBody = BodyInstance->GetPxRigidBody_AssumesLocked(); if (PRigidBody == NULL) { continue; } //We should only be iterating over actors that belong to this scene check(PRigidBody->getScene() == PScene); if (!IsKinematicHelper(PRigidBody)) { ApplyCustomPhysics(PhysTarget, BodyInstance, DeltaTime); ApplyForces_AssumesLocked(PhysTarget, BodyInstance); ApplyTorques_AssumesLocked(PhysTarget, BodyInstance); ApplyRadialForces_AssumesLocked(PhysTarget, BodyInstance); }else { InterpolateKinematicActor_AssumesLocked(PhysTarget, BodyInstance, InAlpha); } } /** Final substep */ if (InAlpha >= 1.f) { Targets.Empty(Targets.Num()); } #endif }
void FPhysSubstepTask::SubstepInterpolation(float InAlpha) { #if WITH_PHYSX #if WITH_APEX PxScene * PScene = PAScene->getPhysXScene(); #else PxScene * PScene = PAScene; #endif PhysTargetMap & Targets = PhysTargetBuffers[!External]; /** Note: We lock the entire scene before iterating. The assumption is that removing an FBodyInstance from the map will also be wrapped by this lock */ SCENE_LOCK_WRITE(PScene); for (PhysTargetMap::TIterator Itr = Targets.CreateIterator(); Itr; ++Itr) { FPhysTarget & PhysTarget = Itr.Value(); FBodyInstance* BodyInstance = Itr.Key(); PxRigidDynamic * PRigidDynamic = BodyInstance->GetPxRigidDynamic(); if (PRigidDynamic == NULL) { continue; } //We should only be iterating over actors that belong to this scene check(PRigidDynamic->getScene() == PScene); ApplyForces(PhysTarget, BodyInstance); ApplyTorques(PhysTarget, BodyInstance); InterpolateKinematicActor(PhysTarget, BodyInstance, InAlpha); } /** Final substep */ if (InAlpha >= 1.f) { Targets.Empty(Targets.Num()); } SCENE_UNLOCK_WRITE(PScene); #endif }