finish CKObject and CK3dEntity writer

This commit is contained in:
yyc12345 2023-10-02 11:04:00 +08:00
parent 9aa8b2b961
commit 05c48c21f9
2 changed files with 58 additions and 0 deletions

View File

@ -35,6 +35,56 @@ namespace LibCmo::CK2::ObjImpls {
bool suc = CKRenderObject::Save(chunk, file, flags); bool suc = CKRenderObject::Save(chunk, file, flags);
if (!suc) return false; if (!suc) return false;
// write associated mesh data
if (m_CurrentMesh != nullptr || m_PotentialMeshes.size() != 0) {
chunk->WriteIdentifier(CK_STATESAVEFLAGS_3DENTITY::CK_STATESAVE_MESHS);
// write current mesh
chunk->WriteObjectPointer(m_CurrentMesh);
// write potential meshes
chunk->WriteXObjectPointerArray(m_PotentialMeshes);
}
// write core entity data
{
chunk->WriteIdentifier(CK_STATESAVEFLAGS_3DENTITY::CK_STATESAVE_3DENTITYNDATA);
// regulate self flag again
// MARK: originally we should check parent here.
// but we do not support parent and hierarchy feature, so we simply remove flag
EnumsHelper::Rm(m_3dEntityFlags, CK_3DENTITY_FLAGS::CK_3DENTITY_PARENTVALID);
// MARK: originally we should check grouped into CKPlace here.
// but we do not support CKPlace, so we simply remove this flag
EnumsHelper::Rm(m_3dEntityFlags, CK_3DENTITY_FLAGS::CK_3DENTITY_PLACEVALID);
// check z-order, if not zero, save it
if (m_ZOrder != 0) {
EnumsHelper::Add(m_3dEntityFlags, CK_3DENTITY_FLAGS::CK_3DENTITY_ZORDERVALID);
} else {
EnumsHelper::Rm(m_3dEntityFlags, CK_3DENTITY_FLAGS::CK_3DENTITY_ZORDERVALID);
}
// write 2 flags
chunk->WriteStruct(m_3dEntityFlags);
chunk->WriteStruct(m_MoveableFlags);
// write world matrix
chunk->WriteStruct(reinterpret_cast<const VxMath::VxVector3*>(&m_WorldMatrix[0]));
chunk->WriteStruct(reinterpret_cast<const VxMath::VxVector3*>(&m_WorldMatrix[1]));
chunk->WriteStruct(reinterpret_cast<const VxMath::VxVector3*>(&m_WorldMatrix[2]));
chunk->WriteStruct(reinterpret_cast<const VxMath::VxVector3*>(&m_WorldMatrix[3]));
// MARK: because we do not support Parent and CKPlace,
// and the IDA code also instruct that no need to write any data if no Parent or CKPlace.
// so we skip the Parent and CKPlace writing
// write z-order
if (m_ZOrder != 0) {
chunk->WriteStruct(m_ZOrder);
}
}
return true; return true;
} }

View File

@ -48,6 +48,14 @@ namespace LibCmo::CK2::ObjImpls {
void CKObject::PreSave(CKFileVisitor* file, CKDWORD flags) {} void CKObject::PreSave(CKFileVisitor* file, CKDWORD flags) {}
bool CKObject::Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) { bool CKObject::Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) {
if (EnumsHelper::Has(m_ObjectFlags, CK_OBJECT_FLAGS::CK_OBJECT_HIERACHICALHIDE)) {
// if hierarchy hidden
chunk->WriteIdentifier(CK_STATESAVEFLAGS_OBJECT::CK_STATESAVE_OBJECTHIERAHIDDEN);
} else if (!EnumsHelper::Has(m_ObjectFlags, CK_OBJECT_FLAGS::CK_OBJECT_VISIBLE)) {
// if really hidden
chunk->WriteIdentifier(CK_STATESAVEFLAGS_OBJECT::CK_STATESAVE_OBJECTHIDDEN);
}
return true; return true;
} }