From c1a7ded1e4660e49d150b73b909c26ecb21bca54 Mon Sep 17 00:00:00 2001 From: aap Date: Sun, 24 Jan 2021 00:07:45 +0100 Subject: [PATCH] CBaseModelInfo --- src/modelinfo/BaseModelInfo.cpp | 56 +++++++++++++++++++++++++++++---- src/modelinfo/BaseModelInfo.h | 19 +++++++++-- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/modelinfo/BaseModelInfo.cpp b/src/modelinfo/BaseModelInfo.cpp index fd13dfb5..7cb72009 100644 --- a/src/modelinfo/BaseModelInfo.cpp +++ b/src/modelinfo/BaseModelInfo.cpp @@ -7,6 +7,10 @@ #include "BaseModelInfo.h" #include "ModelInfo.h" #include "KeyGen.h" +#include "Streaming.h" +#include "smallHeap.h" + +// LCS: file done except for TODO CBaseModelInfo::CBaseModelInfo(ModelInfoType type) { @@ -18,7 +22,11 @@ CBaseModelInfo::CBaseModelInfo(ModelInfoType type) m_type = type; m_num2dEffects = 0; m_bOwnsColModel = false; + m_nameKey = 0; + m_unk1 = 0; + m_unk2 = 0; m_name = new char[MAX_MODEL_NAME]; + *(int32*)m_name = 0; } void @@ -26,6 +34,7 @@ CBaseModelInfo::Shutdown(void) { DeleteCollisionModel(); DeleteRwObject(); + DeleteChunk(); m_2dEffectsID = -1; m_num2dEffects = 0; m_txdSlot = -1; @@ -34,11 +43,11 @@ CBaseModelInfo::Shutdown(void) void CBaseModelInfo::DeleteCollisionModel(void) { - if(m_colModel && m_bOwnsColModel){ + if(!gUseChunkFiles && m_colModel && m_bOwnsColModel){ if(m_colModel) delete m_colModel; - m_colModel = nil; } + m_colModel = nil; } void @@ -51,15 +60,17 @@ CBaseModelInfo::AddRef(void) void CBaseModelInfo::RemoveRef(void) { - m_refCount--; - RemoveTexDictionaryRef(); + if(m_refCount > 0){ + m_refCount--; + RemoveTexDictionaryRef(); + } } void CBaseModelInfo::SetTexDictionary(const char *name) { int slot = CTxdStore::FindTxdSlot(name); - if(slot < 0) + if(slot == -1) slot = CTxdStore::AddTxdSlot(name); m_txdSlot = slot; } @@ -70,12 +81,24 @@ CBaseModelInfo::AddTexDictionaryRef(void) CTxdStore::AddRef(m_txdSlot); } +void +CBaseModelInfo::AddTexDictionaryRefGu(void) +{ + CTxdStore::AddRefGu(m_txdSlot); +} + void CBaseModelInfo::RemoveTexDictionaryRef(void) { CTxdStore::RemoveRef(m_txdSlot); } +void +CBaseModelInfo::RemoveTexDictionaryRefGu(void) +{ + CTxdStore::RemoveRefGu(m_txdSlot); +} + void CBaseModelInfo::Init2dEffects(void) { @@ -110,4 +133,25 @@ CBaseModelInfo::SetModelName(const char *name) m_nameKey = CKeyGen::GetUppercaseKey(name); if (!gUseChunkFiles) strcpy(m_name, name); -} \ No newline at end of file +} + +void +CBaseModelInfo::DeleteChunk(void) +{ + // BUG? what if we're not using chunks? + if(m_chunk){ + CStreaming::UnregisterPointer(&m_chunk, 2); + cSmallHeap::msInstance.Free(m_chunk); + m_chunk = nil; + } +} + +void +CBaseModelInfo::Write(base::cRelocatableChunkWriter &writer) +{ + m_chunk = nil; + RcWriteThis(writer); + if(m_colModel){ + assert(0 && "TODO"); + } +} diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h index f3fddf20..496fdeaf 100644 --- a/src/modelinfo/BaseModelInfo.h +++ b/src/modelinfo/BaseModelInfo.h @@ -2,7 +2,7 @@ struct CColModel; -#define MAX_MODEL_NAME (21) +#define MAX_MODEL_NAME (24) enum ModelInfoType { @@ -23,9 +23,13 @@ class C2dEffect; class CBaseModelInfo { protected: - char *m_name; + uint32 m_unk1; + uint32 m_unk2; uint32 m_nameKey; - RwObject *m_object; + union { + char *m_name; // if not using chunks + void *m_chunk; // else + }; uint8 m_type; uint8 m_num2dEffects; bool m_bOwnsColModel; @@ -53,6 +57,13 @@ public: virtual void ConvertAnimFileIndex(void) {} virtual int GetAnimFileIndex(void) { return -1; } + virtual void LoadModel(void *,void const*) {}; // = 0; + virtual void DeleteChunk(void); + virtual void Write(base::cRelocatableChunkWriter &writer); + virtual void WriteModel(base::cRelocatableChunkWriter &writer) {} // = 0; + virtual void RcWriteThis(base::cRelocatableChunkWriter &writer) {} // = 0; + virtual void RcWriteEmpty(base::cRelocatableChunkWriter &writer) {} // = 0; + // one day it becomes virtual uint8 GetModelType() const { return m_type; } bool IsBuilding(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; } @@ -74,7 +85,9 @@ public: void RemoveRef(void); void SetTexDictionary(const char *name); void AddTexDictionaryRef(void); + void AddTexDictionaryRefGu(void); void RemoveTexDictionaryRef(void); + void RemoveTexDictionaryRefGu(void); void Init2dEffects(void); void Add2dEffect(C2dEffect *fx); C2dEffect *Get2dEffect(int n);