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:
43
Model3d.cpp
43
Model3d.cpp
@@ -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;
|
||||||
|
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, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) );
|
||||||
sn_utils::ls_uint32( s, 8 + m_vertexcount * 20 );
|
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;
|
||||||
|
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, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) );
|
||||||
sn_utils::ls_uint32( s, 8 + m_vertexcount * 48 );
|
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;
|
||||||
|
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, MAKE_ID4( 'V', 'N', 'T', '0' + modeltype ) );
|
||||||
sn_utils::ls_uint32( s, 8 + m_vertexcount * 32 );
|
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;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user