Browse Source

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.
Skoader 12 years ago committed by Adam Johnson
parent
commit
47efb94aa8
  1. 17
      Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp

17
Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp

@ -334,6 +334,7 @@ void plPXPhysicalControllerCore::SetGlobalLoc(const hsMatrix44& l2w)
fLastGlobalLoc = l2w; fLastGlobalLoc = l2w;
// Update our local position and rotation // Update our local position and rotation
hsPoint3 prevPosition = fLocalPosition;
const plCoordinateInterface* subworldCI = GetSubworldCI(); const plCoordinateInterface* subworldCI = GetSubworldCI();
if (subworldCI) if (subworldCI)
{ {
@ -360,8 +361,20 @@ void plPXPhysicalControllerCore::SetGlobalLoc(const hsMatrix44& l2w)
// Update the physical position // Update the physical position
if (fKinematicCCT) if (fKinematicCCT)
{ {
NxExtendedVec3 pos(fLocalPosition.fX, fLocalPosition.fY, fLocalPosition.fZ + kCCTZOffset); hsVector3 disp(&fLocalPosition, &prevPosition);
fController->setPosition(pos); 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 else
{ {

Loading…
Cancel
Save