From 47efb94aa88c859736e432938e452d8e427121cd Mon Sep 17 00:00:00 2001 From: Skoader Date: Sat, 1 Dec 2012 22:09:53 -0500 Subject: [PATCH] Fix warping an avatar triggers all detectors along the path When explicitly moving an avatar over the given threshold, teleport the underlying actor most of the way before moving the controller. --- .../plPhysX/plPXPhysicalControllerCore.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp b/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp index 80866eed..127df59c 100644 --- a/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp +++ b/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp @@ -334,6 +334,7 @@ void plPXPhysicalControllerCore::SetGlobalLoc(const hsMatrix44& l2w) fLastGlobalLoc = l2w; // Update our local position and rotation + hsPoint3 prevPosition = fLocalPosition; const plCoordinateInterface* subworldCI = GetSubworldCI(); if (subworldCI) { @@ -360,8 +361,20 @@ void plPXPhysicalControllerCore::SetGlobalLoc(const hsMatrix44& l2w) // Update the physical position if (fKinematicCCT) { - NxExtendedVec3 pos(fLocalPosition.fX, fLocalPosition.fY, fLocalPosition.fZ + kCCTZOffset); - fController->setPosition(pos); + hsVector3 disp(&fLocalPosition, &prevPosition); + if (disp.Magnitude() > 2.f) + { + // Teleport the underlying actor most of the way + disp.Normalize(); + disp *= 0.001f; + + hsPoint3 teleportPos = fLocalPosition - disp; + NxVec3 pos(teleportPos.fX, teleportPos.fY, teleportPos.fZ + kPhysZOffset); + fActor->setGlobalPosition(pos); + } + + NxExtendedVec3 extPos(fLocalPosition.fX, fLocalPosition.fY, fLocalPosition.fZ + kCCTZOffset); + fController->setPosition(extPos); } else {