fix fatal CKStateChunk error

This commit is contained in:
yyc12345 2023-09-01 14:55:31 +08:00
parent eea15c2028
commit 5c1af5be24
11 changed files with 153 additions and 6 deletions

View File

@ -57,7 +57,7 @@ namespace LibCmo::CK2 {
}
// create one
ObjImpls::CKObject* obj = desc->CreationFct(this, decided_id, name);
ObjImpls::CKObject* obj = desc->CreationFct(this, decided_id + c_ObjectIdOffset, name);
// put into slot
m_ObjectsList[decided_id] = obj;
@ -67,6 +67,7 @@ namespace LibCmo::CK2 {
}
ObjImpls::CKObject* CKContext::GetObject(CK_ID id) {
id -= c_ObjectIdOffset;
if (id >= m_ObjectsList.size()) return nullptr;
return m_ObjectsList[id];
}
@ -89,6 +90,7 @@ namespace LibCmo::CK2 {
desc->ReleaseFct(ctx, obj);
}
void CKContext::DestroyObject(CK_ID id) {
id -= c_ObjectIdOffset;
if (id >= m_ObjectsList.size()) return;
// get object and free it

View File

@ -97,6 +97,13 @@ namespace LibCmo::CK2 {
protected:
// ========== Objects Management ==========
/**
* The global offset of created CK_ID.
* The value close to zero may cause some issue.
* So we add a static offset to every created CK_ID.
*/
const CK_ID c_ObjectIdOffset = 61u;
XContainer::XArray<ObjImpls::CKObject*> m_ObjectsList;
std::deque<CK_ID> m_ReturnedObjectIds;

View File

@ -14,6 +14,9 @@
#include "ObjImpls/CKSceneObject.hpp"
#include "ObjImpls/CKBeObject.hpp"
#include "ObjImpls/CKGroup.hpp"
#include "ObjImpls/CKRenderObject.hpp"
#include "ObjImpls/CK3dEntity.hpp"
#include "ObjImpls/CK3dObject.hpp"
namespace LibCmo::CK2 {
@ -222,11 +225,9 @@ CKClassRegister(cid, parentCid, \
EasyClassReg(ObjImpls::CKSceneObject, CK_CLASSID::CKCID_SCENEOBJECT, CK_CLASSID::CKCID_OBJECT, "Scene Object");
EasyClassReg(ObjImpls::CKBeObject, CK_CLASSID::CKCID_BEOBJECT, CK_CLASSID::CKCID_SCENEOBJECT, "Behavioral Object");
EasyClassReg(ObjImpls::CKGroup, CK_CLASSID::CKCID_GROUP, CK_CLASSID::CKCID_BEOBJECT, "Group");
//CKClassRegister(CK_CLASSID::CKCID_OBJECT, CK_CLASSID::CKCID_OBJECT,
// [](CKContext* ctx, CK_ID id, CKSTRING name) -> ObjImpls::CKObject* { return new ObjImpls::CKObject(ctx, id, name); },
// [](CKContext* ctx, ObjImpls::CKObject* obj) -> void { delete obj; },
// []() -> CKSTRING { return "Basic Object"; });
EasyClassReg(ObjImpls::CKRenderObject, CK_CLASSID::CKCID_RENDEROBJECT, CK_CLASSID::CKCID_BEOBJECT, "Render Object");
EasyClassReg(ObjImpls::CK3dEntity, CK_CLASSID::CKCID_3DENTITY, CK_CLASSID::CKCID_RENDEROBJECT, "3D Entity");
EasyClassReg(ObjImpls::CK3dObject, CK_CLASSID::CKCID_3DOBJECT, CK_CLASSID::CKCID_3DENTITY, "3D Object");
#undef EasyClassReg

View File

@ -565,6 +565,7 @@ namespace LibCmo::CK2 {
CKDWORD size_in_dword = this->GetCeilDwordSize(size_in_byte);
if (this->EnsureReadSpace(size_in_dword)) {
std::memcpy(data_ptr, this->m_pData + this->m_Parser.m_CurrentPos, size_in_byte);
this->m_Parser.m_CurrentPos += size_in_dword;
return true;
} else {
// failed, report to context

View File

@ -0,0 +1,20 @@
#include "CK3dEntity.hpp"
#include "../CKStateChunk.hpp"
namespace LibCmo::CK2::ObjImpls {
bool CK3dEntity::Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) {
bool suc = CKRenderObject::Save(chunk, file, flags);
if (!suc) return false;
return true;
}
bool CK3dEntity::Load(CKStateChunk* chunk, CKFileVisitor* file) {
bool suc = CKRenderObject::Load(chunk, file);
if (!suc) return false;
return true;
}
}

View File

@ -0,0 +1,32 @@
#pragma once
#include "../../VTAll.hpp"
#include "CKRenderObject.hpp"
namespace LibCmo::CK2::ObjImpls {
class CK3dEntity : public CKRenderObject {
public:
CK3dEntity(CKContext* ctx, CK_ID ckid, CKSTRING name) :
CKRenderObject(ctx, ckid, name),
m_Meshes(), m_CurrentMesh(nullptr), m_WorldMatrix()
{}
virtual ~CK3dEntity() {}
LIBCMO_DISABLE_COPY_MOVE(CK3dEntity);
virtual CK_CLASSID GetClassID(void) override {
return CK_CLASSID::CKCID_3DENTITY;
}
//virtual void PreSave(CKFileVisitor* file, CKDWORD flags) override;
virtual bool Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) override;
virtual bool Load(CKStateChunk* chunk, CKFileVisitor* file) override;
//virtual void PostLoad() override;
protected:
XContainer::XObjectPointerArray m_Meshes;
CKMesh* m_CurrentMesh;
VxMath::VxMatrix m_WorldMatrix;
};
}

View File

@ -0,0 +1,28 @@
#pragma once
#include "../../VTAll.hpp"
#include "CK3dEntity.hpp"
namespace LibCmo::CK2::ObjImpls {
class CK3dObject : public CK3dEntity {
public:
CK3dObject(CKContext* ctx, CK_ID ckid, CKSTRING name) :
CK3dEntity(ctx, ckid, name)
{}
virtual ~CK3dObject() {}
LIBCMO_DISABLE_COPY_MOVE(CK3dObject);
virtual CK_CLASSID GetClassID(void) override {
return CK_CLASSID::CKCID_3DOBJECT;
}
// CK3dObject do not implement any load/save functions
//virtual void PreSave(CKFileVisitor* file, CKDWORD flags) override;
//virtual bool Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) override;
//virtual bool Load(CKStateChunk* chunk, CKFileVisitor* file) override;
//virtual void PostLoad() override;
protected:
};
}

View File

@ -0,0 +1,8 @@
#include "CKRenderObject.hpp"
#include "../CKStateChunk.hpp"
namespace LibCmo::CK2::ObjImpls {
// nothing to compile now
}

View File

@ -0,0 +1,28 @@
#pragma once
#include "../../VTAll.hpp"
#include "CKBeObject.hpp"
namespace LibCmo::CK2::ObjImpls {
class CKRenderObject : public CKBeObject {
public:
CKRenderObject(CKContext* ctx, CK_ID ckid, CKSTRING name) :
CKBeObject(ctx, ckid, name)
{}
virtual ~CKRenderObject() {}
LIBCMO_DISABLE_COPY_MOVE(CKRenderObject);
virtual CK_CLASSID GetClassID(void) override {
return CK_CLASSID::CKCID_RENDEROBJECT;
}
// CKRenderObject do not implement any load/save functions
//virtual void PreSave(CKFileVisitor* file, CKDWORD flags) override;
//virtual bool Save(CKStateChunk* chunk, CKFileVisitor* file, CKDWORD flags) override;
//virtual bool Load(CKStateChunk* chunk, CKFileVisitor* file) override;
//virtual void PostLoad() override;
protected:
};
}

View File

@ -180,9 +180,11 @@
<ClCompile Include="CK2\CKGlobals.cpp" />
<ClCompile Include="CK2\MgrImpls\CKBaseManager.cpp" />
<ClCompile Include="CK2\CKContext.cpp" />
<ClCompile Include="CK2\ObjImpls\CK3dEntity.cpp" />
<ClCompile Include="CK2\ObjImpls\CKBeObject.cpp" />
<ClCompile Include="CK2\ObjImpls\CKGroup.cpp" />
<ClCompile Include="CK2\ObjImpls\CKObject.cpp" />
<ClCompile Include="CK2\ObjImpls\CKRenderObject.cpp" />
<ClCompile Include="CK2\ObjImpls\CKSceneObject.cpp" />
<ClCompile Include="VTEncoding.cpp" />
<ClCompile Include="CK2\CKFileReader.cpp" />
@ -201,8 +203,11 @@
<ClInclude Include="CK2\CKContext.hpp" />
<ClInclude Include="CK2\CKStateChunk.hpp" />
<ClInclude Include="CK2\CKTypes.hpp" />
<ClInclude Include="CK2\ObjImpls\CK3dEntity.hpp" />
<ClInclude Include="CK2\ObjImpls\CK3dObject.hpp" />
<ClInclude Include="CK2\ObjImpls\CKBeObject.hpp" />
<ClInclude Include="CK2\ObjImpls\CKGroup.hpp" />
<ClInclude Include="CK2\ObjImpls\CKRenderObject.hpp" />
<ClInclude Include="CK2\ObjImpls\CKSceneObject.hpp" />
<ClInclude Include="VTAll.hpp" />
<ClInclude Include="VTEncoding.hpp" />

View File

@ -90,6 +90,12 @@
<ClCompile Include="XContainer\XBitArray.cpp">
<Filter>Sources\XContainer</Filter>
</ClCompile>
<ClCompile Include="CK2\ObjImpls\CKRenderObject.cpp">
<Filter>Sources\CK2\ObjImpls</Filter>
</ClCompile>
<ClCompile Include="CK2\ObjImpls\CK3dEntity.cpp">
<Filter>Sources\CK2\ObjImpls</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="VTUtils.hpp">
@ -152,5 +158,14 @@
<ClInclude Include="XContainer\XBitArray.hpp">
<Filter>Headers\XContainer</Filter>
</ClInclude>
<ClInclude Include="CK2\ObjImpls\CKRenderObject.hpp">
<Filter>Headers\CK2\ObjImpls</Filter>
</ClInclude>
<ClInclude Include="CK2\ObjImpls\CK3dEntity.hpp">
<Filter>Headers\CK2\ObjImpls</Filter>
</ClInclude>
<ClInclude Include="CK2\ObjImpls\CK3dObject.hpp">
<Filter>Headers\CK2\ObjImpls</Filter>
</ClInclude>
</ItemGroup>
</Project>