void plPhysicalControllerCore::IApply(float delSecs) { fSimLength = delSecs; // Match controller to owner if transform has changed since the last frame plSceneObject* so = plSceneObject::ConvertNoRef(fOwner->ObjectIsLoaded()); const hsMatrix44& l2w = so->GetCoordinateInterface()->GetLocalToWorld(); if (!CompareMatrices(fLastGlobalLoc, l2w, 0.0001f)) SetGlobalLoc(l2w); if (fEnabled) { // Convert velocity from avatar to world space if (!fLinearVelocity.IsEmpty()) { fLinearVelocity = l2w * fLinearVelocity; const plCoordinateInterface* subworldCI = GetSubworldCI(); if (subworldCI) fLinearVelocity = subworldCI->GetWorldToLocal() * fLinearVelocity; } fMovementStrategy->Apply(delSecs); } }
void plPhysicalControllerCore::UpdateSubstepNonPhysical() { // When we're in non-phys or a behavior we can't go through the rest of the function // so we need to get out early, but we need to update the current position if we're // in a subworld. plSceneObject* so = plSceneObject::ConvertNoRef(fOwner->ObjectIsLoaded()); const plCoordinateInterface* ci = GetSubworldCI(); if (ci && so) { const hsMatrix44& soL2W = so->GetCoordinateInterface()->GetLocalToWorld(); const hsMatrix44& ciL2W = ci->GetLocalToWorld(); hsMatrix44 l2w =GetPrevSubworldW2L()* soL2W; l2w = ciL2W * l2w; hsMatrix44 w2l; l2w.GetInverse(&w2l); ((plCoordinateInterface*)so->GetCoordinateInterface())->SetTransform(l2w, w2l); ((plCoordinateInterface*)so->GetCoordinateInterface())->FlushTransform(); SetGlobalLoc(l2w); } }