From 18b18eed082398bc1faf61b18e60a061cee1addd Mon Sep 17 00:00:00 2001 From: Wls50 <167411000+wls50@users.noreply.github.com> Date: Sat, 6 Jul 2024 19:59:36 +0200 Subject: [PATCH] fix e3d serialization issues: failure to check for user data in submodel hierarchy after creating gfx bank; failure to increase chunk size when user data is present --- Model3d.cpp | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/Model3d.cpp b/Model3d.cpp index 081577a0..13ad449d 100644 --- a/Model3d.cpp +++ b/Model3d.cpp @@ -1735,24 +1735,39 @@ void TModel3d::SaveToBinFile(std::string const &FileName) if (!(Global.iConvertModels & 8)) { int modeltype = 1; - if(has_any_userdata) modeltype |= 4; - sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); - sn_utils::ls_uint32( s, 8 + m_vertexcount * 20 ); + int vertexsize = 20; + if(has_any_userdata) + { + modeltype |= 4; + vertexsize += 8; + } + sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); + sn_utils::ls_uint32( s, 8 + m_vertexcount * vertexsize ); Root->serialize_geometry( s, true, true, has_any_userdata ); } else { int modeltype = 2; - if(has_any_userdata) modeltype |= 4; - sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); - sn_utils::ls_uint32( s, 8 + m_vertexcount * 48 ); + int vertexsize = 48; + if(has_any_userdata) + { + modeltype |= 4; + vertexsize += 16; + } + sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); + sn_utils::ls_uint32( s, 8 + m_vertexcount * vertexsize ); Root->serialize_geometry( s, false, true, has_any_userdata ); } } else { int modeltype = 0; - if(has_any_userdata) modeltype |= 4; - sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); - sn_utils::ls_uint32( s, 8 + m_vertexcount * 32 ); + int vertexsize = 32; + if(has_any_userdata) + { + modeltype |= 4; + vertexsize += 16; + } + sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); + sn_utils::ls_uint32( s, 8 + m_vertexcount * vertexsize ); Root->serialize_geometry( s, false, false, has_any_userdata ); } @@ -2202,8 +2217,20 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, std::vector *t, bool TSubModel::HasAnyVertexUserData() const { - for(const TSubModel* sm = this; sm; sm = sm->Next){ - if(!sm->Userdata.empty() || (sm->Child && sm->Child->HasAnyVertexUserData())) return true; + for (const TSubModel *sm = this; sm; sm = sm->Next) + { + if (m_geometry.handle) + { + if (!GfxRenderer->UserData(m_geometry.handle).empty()) + return true; + } + else + { + if (!sm->Userdata.empty()) + return true; + } + if (sm->Child && sm->Child->HasAnyVertexUserData()) + return true; } return false; };