From 87b8dfae0944044ba71fc220e5a13c15e33ea124 Mon Sep 17 00:00:00 2001 From: Skoader Date: Mon, 22 Oct 2012 12:57:16 +1100 Subject: [PATCH] Fix subworld transition bug Use the actual global location, not the interpolated location when moving between subworlds. Rebuild the controller cache. --- .../plPhysX/plPXPhysicalControllerCore.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp index 1ccab366..f6b79f69 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysX/plPXPhysicalControllerCore.cpp @@ -236,6 +236,25 @@ void plPXPhysicalControllerCore::SetSubworld(plKey world) IInformDetectors(false); IDeleteController(); + // We need our real global location here, not the interpolated location + fLocalRotation.MakeMatrix(&fLastGlobalLoc); + fLastGlobalLoc.SetTranslate(&fLocalPosition); + if (fWorldKey) + { + hsMatrix44 prevSubL2W; + fPrevSubworldW2L.GetInverse(&prevSubL2W); + fLastGlobalLoc = prevSubL2W * fLastGlobalLoc; + } + // Update our scene object so the change isn't wiped out + plSceneObject* so = plSceneObject::ConvertNoRef(fOwner->ObjectIsLoaded()); + if (so) + { + hsMatrix44 globalLocInv; + fLastGlobalLoc.GetInverse(&globalLocInv); + so->SetTransform(fLastGlobalLoc, globalLocInv); + so->FlushTransform(); + } + // Update Local Position and rotation fWorldKey = world; const plCoordinateInterface* subworldCI = GetSubworldCI(); @@ -257,6 +276,7 @@ void plPXPhysicalControllerCore::SetSubworld(plKey world) // Create new controller ICreateController(fLocalPosition); + RebuildCache(); } }