@@ -158,7 +158,15 @@ bool CClientTXD::LoadFromFile(SString filePath)
158158 if (!GetFilenameToUse (strUseFilename))
159159 return false ;
160160
161- return g_pGame->GetRenderWare ()->ModelInfoTXDLoadTextures (&m_ReplacementTextures, strUseFilename, SString (), m_bFilteringEnabled);
161+ // engineLoadTXD only needs to validate the TXD and create an element.
162+ // Keep decoded textures out of memory until engineImportTXD applies them.
163+ if (!g_pGame->GetRenderWare ()->ModelInfoTXDLoadTextures (&m_ReplacementTextures, strUseFilename, SString (), m_bFilteringEnabled))
164+ return false ;
165+
166+ g_pGame->GetRenderWare ()->ModelInfoTXDRemoveTextures (&m_ReplacementTextures);
167+ m_ReplacementTextures = SReplacementTextures ();
168+
169+ return true ;
162170}
163171
164172bool CClientTXD::LoadFromBuffer (SString buffer)
@@ -168,7 +176,15 @@ bool CClientTXD::LoadFromBuffer(SString buffer)
168176
169177 m_FileData = std::move (buffer);
170178
171- return g_pGame->GetRenderWare ()->ModelInfoTXDLoadTextures (&m_ReplacementTextures, NULL , m_FileData, m_bFilteringEnabled);
179+ // Raw-data TXDs may still need the original bytes for clothes streaming, so keep m_FileData.
180+ // Keep decoded textures out of memory until engineImportTXD applies them.
181+ if (!g_pGame->GetRenderWare ()->ModelInfoTXDLoadTextures (&m_ReplacementTextures, NULL , m_FileData, m_bFilteringEnabled))
182+ return false ;
183+
184+ g_pGame->GetRenderWare ()->ModelInfoTXDRemoveTextures (&m_ReplacementTextures);
185+ m_ReplacementTextures = SReplacementTextures ();
186+
187+ return true ;
172188}
173189
174190void CClientTXD::Restream (unsigned short usModelID)
0 commit comments