16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 17:29:18 +02:00

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
This commit is contained in:
Wls50
2024-07-06 19:59:36 +02:00
parent 561b84a329
commit 18b18eed08

View File

@@ -1735,24 +1735,39 @@ void TModel3d::SaveToBinFile(std::string const &FileName)
if (!(Global.iConvertModels & 8)) { if (!(Global.iConvertModels & 8)) {
int modeltype = 1; int modeltype = 1;
if(has_any_userdata) modeltype |= 4; int vertexsize = 20;
sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); if(has_any_userdata)
sn_utils::ls_uint32( s, 8 + m_vertexcount * 20 ); {
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 ); Root->serialize_geometry( s, true, true, has_any_userdata );
} }
else { else {
int modeltype = 2; int modeltype = 2;
if(has_any_userdata) modeltype |= 4; int vertexsize = 48;
sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); if(has_any_userdata)
sn_utils::ls_uint32( s, 8 + m_vertexcount * 48 ); {
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 ); Root->serialize_geometry( s, false, true, has_any_userdata );
} }
} }
else { else {
int modeltype = 0; int modeltype = 0;
if(has_any_userdata) modeltype |= 4; int vertexsize = 32;
sn_utils::ls_uint32( s, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) ); if(has_any_userdata)
sn_utils::ls_uint32( s, 8 + m_vertexcount * 32 ); {
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 ); Root->serialize_geometry( s, false, false, has_any_userdata );
} }
@@ -2202,8 +2217,20 @@ void TSubModel::BinInit(TSubModel *s, float4x4 *m, std::vector<std::string> *t,
bool TSubModel::HasAnyVertexUserData() const bool TSubModel::HasAnyVertexUserData() const
{ {
for(const TSubModel* sm = this; sm; sm = sm->Next){ for (const TSubModel *sm = this; sm; sm = sm->Next)
if(!sm->Userdata.empty() || (sm->Child && sm->Child->HasAnyVertexUserData())) return true; {
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; return false;
}; };