diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIControlMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIControlMod.cpp index 0f539c32..6742891f 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIControlMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIControlMod.cpp @@ -56,6 +56,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "../pnMessage/plRefMsg.h" #include "../pnMessage/plEnableMsg.h" #include "../pfMessage/pfGameGUIMsg.h" +#include "../plMessage/plDeviceRecreateMsg.h" #include "../pnSceneObject/plDrawInterface.h" #include "../pnSceneObject/plCoordinateInterface.h" #include "../pnSceneObject/plAudioInterface.h" @@ -584,14 +585,16 @@ plProfile_CreateTimer("Gui", "RenderSetup", GUITime); hsBool pfGUIControlMod::MsgReceive( plMessage *msg ) { plRenderMsg* rend = plRenderMsg::ConvertNoRef( msg ); + plDeviceRecreateMsg* device = plDeviceRecreateMsg::ConvertNoRef(msg); + if (rend || device) { + plPipeline* pipe = rend ? rend->Pipeline() : device->Pipeline(); - if( rend ) - { plProfile_BeginLap(GUITime, this->GetKey()->GetUoid().GetObjectName()); - // Only need it once - if( ISetUpDynTextMap( rend->Pipeline() ) ) - plgDispatch::Dispatch()->UnRegisterForExactType( plRenderMsg::Index(), GetKey() ); + ISetUpDynTextMap(pipe); plProfile_EndLap(GUITime, this->GetKey()->GetUoid().GetObjectName()); + + if (rend) + plgDispatch::Dispatch()->UnRegisterForExactType(plRenderMsg::Index(), GetKey()); return true; } @@ -603,12 +606,16 @@ hsBool pfGUIControlMod::MsgReceive( plMessage *msg ) if( refMsg->GetContext() & ( plRefMsg::kOnCreate | plRefMsg::kOnRequest | plRefMsg::kOnReplace ) ) { fDynTextMap = plDynamicTextMap::ConvertNoRef( refMsg->GetRef() ); - // Register for a render msg so we can leech the material when we finally - // have a pipeline to work with + + // These tell us when we need to (re-)initialize the DTM plgDispatch::Dispatch()->RegisterForExactType( plRenderMsg::Index(), GetKey() ); + plgDispatch::Dispatch()->RegisterForExactType( plDeviceRecreateMsg::Index(), GetKey() ); } else + { fDynTextMap = nil; + plgDispatch::Dispatch()->UnRegisterForExactType( plDeviceRecreateMsg::Index(), GetKey() ); + } return true; } else if( refMsg->fType == kRefDynTextLayer ) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plMessage/plDeviceRecreateMsg.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plMessage/plDeviceRecreateMsg.h index a83c0263..a97fa530 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plMessage/plDeviceRecreateMsg.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plMessage/plDeviceRecreateMsg.h @@ -51,15 +51,26 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "../pnMessage/plMessage.h" +class plPipeline; + class plDeviceRecreateMsg : public plMessage { + plPipeline* fPipe; + public: - plDeviceRecreateMsg() : plMessage( nil, nil, nil ) { SetBCastFlag( kBCastByExactType ); } + plDeviceRecreateMsg(plPipeline* pipe=nil) + : plMessage(nil, nil, nil), fPipe(pipe) + { + SetBCastFlag(kBCastByExactType); + } + ~plDeviceRecreateMsg() {} CLASSNAME_REGISTER( plDeviceRecreateMsg ); GETINTERFACE_ANY( plDeviceRecreateMsg, plMessage ); + plPipeline* Pipeline() const { return fPipe; } + // IO void Read(hsStream* stream, hsResMgr* mgr) { plMessage::IMsgRead( stream, mgr ); } void Write(hsStream* stream, hsResMgr* mgr) { plMessage::IMsgWrite( stream, mgr ); } diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plDXPipeline.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plDXPipeline.cpp index d7ed9043..684bea34 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plDXPipeline.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPipeline/plDXPipeline.cpp @@ -2278,7 +2278,7 @@ hsBool plDXPipeline::IResetDevice() /// Broadcast a message letting everyone know that we were recreated and that /// all device-specific stuff needs to be recreated - plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(); + plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(this); plgDispatch::MsgSend(clean); } fDevWasLost = true; @@ -2552,7 +2552,7 @@ void plDXPipeline::Resize( UInt32 width, UInt32 height ) /// Broadcast a message letting everyone know that we were recreated and that /// all device-specific stuff needs to be recreated - plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(); + plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(this); plgDispatch::MsgSend(clean); } @@ -3834,7 +3834,7 @@ hsBool plDXPipeline::BeginRender() { /// Broadcast a message letting everyone know that we were recreated and that /// all device-specific stuff needs to be recreated -// plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(); +// plDeviceRecreateMsg* clean = TRACKED_NEW plDeviceRecreateMsg(this); // plgDispatch::MsgSend(clean); fDevWasLost = false;