diff --git a/Source/Contents/Models/ModelNode.cpp b/Source/Contents/Models/ModelNode.cpp index 539542b..77c572d 100644 --- a/Source/Contents/Models/ModelNode.cpp +++ b/Source/Contents/Models/ModelNode.cpp @@ -42,7 +42,8 @@ void C3dNode::Animate(double) { // OFFSET: 0x00AB7050 // FUNCTION: fn_17482 -void C3dNodeV1::Initialize(const ModelNode& resource) { +void C3dNodeV1::Initialize(const ModelNode& base) { + const auto& resource = static_cast(base); this->name = resource.name; this->mesh = resource.mesh.get(); this->textures = resource.textures; @@ -80,7 +81,8 @@ void C3dNodeV1::Initialize(const ModelNode& resource) { // OFFSET: 0x00AB73F0 // FUNCTION: fn_17484 -void C3dNodeV2::Initialize(const ModelNode& resource) { +void C3dNodeV2::Initialize(const ModelNode& base) { + const auto& resource = static_cast(base); this->name = resource.name; this->mesh = resource.mesh.get(); std::memcpy(this->resourceTransform.values, resource.transform, sizeof(resource.transform)); diff --git a/Source/Resource/Models/ModelResource.cpp b/Source/Resource/Models/ModelResource.cpp index 6dcc91a..d784e97 100644 --- a/Source/Resource/Models/ModelResource.cpp +++ b/Source/Resource/Models/ModelResource.cpp @@ -9,32 +9,47 @@ #include // OFFSET: 0x00755630 -// OFFSET: 0x00750B10 // FUNCTION: fn_07985 -ModelNode::ModelNode(TextureCache& textures) : model(nullptr), parent(nullptr), alpha(255), m_textures(textures) { +ModelNode::ModelNode() : model(nullptr), parent(nullptr), alpha(255) { } -// OFFSET: 0x007570F0 +// OFFSET: 0x007568E0 // FUNCTION: fn_07996 ModelNode::~ModelNode() { for (CTexture* texture : this->textures) { if (texture) { texture->Release(); - this->m_textures.Remove(texture); + this->model->m_context->textures.Remove(texture); } } + + this->textures.clear(); + this->mesh.reset(); + this->children.clear(); } +// INLINED +ModelNodeV1::ModelNodeV1() = default; + +// INLINED +ModelNodeV1::~ModelNodeV1() = default; + +// INLINED +ModelNodeV2::ModelNodeV2() = default; + +// INLINED +ModelNodeV2::~ModelNodeV2() = default; + // OFFSET: 0x007553E0 // FUNCTION: fn_07982 C3dModelRes::C3dModelRes(ModelResourceContext& context) : major(0), shade(0), alpha(255), m_context(&context) { } -// OFFSET: 0x00757090 +// OFFSET: 0x007567B0 // FUNCTION: fn_07995 C3dModelRes::~C3dModelRes() = default; -// OFFSET: 0x00750A70 +// OFFSET: 0x00755560 // FUNCTION: fn_07983 C3dModelResV1::C3dModelResV1(ModelResourceContext& context) : C3dModelRes(context), animationLength(0) { } @@ -81,7 +96,7 @@ void C3dModelRes::Unload() { // INLINED inline void C3dModelResV1::ReadNode(ResourceByteReader& input, unsigned minor, const std::vector& textureNames) { - auto node = std::make_unique(this->m_context->textures); + auto node = std::make_unique(); node->model = this; node->alpha = this->alpha; char field[40]{}; diff --git a/Source/Resource/Models/ModelResource.h b/Source/Resource/Models/ModelResource.h index 3529029..7903a42 100644 --- a/Source/Resource/Models/ModelResource.h +++ b/Source/Resource/Models/ModelResource.h @@ -50,33 +50,44 @@ struct ModelVolume { class ModelNode { public: - explicit ModelNode(TextureCache& textures); - ~ModelNode(); + ModelNode(); + virtual ~ModelNode(); ModelNode(const ModelNode&) = delete; ModelNode& operator=(const ModelNode&) = delete; - std::string name; - std::string parentName; - C3dModelRes* model; - ModelNode* parent; - std::list children; - std::vector textures; - std::unique_ptr mesh; - unsigned char alpha; - unsigned char unknown_0055[3]; - float position[3]; - float scale[3]; - float angle; - float axis[3]; - float transform[12]; - std::vector legacyPositionKeys; - std::vector rotationKeys; - std::vector scaleKeys; - std::vector positionKeys; - std::map textureKeys; + /* 0004 */ std::string name; + /* 001C */ std::string parentName; + /* 0034 */ C3dModelRes* model; + /* 0038 */ ModelNode* parent; + /* 003C */ std::list children; + /* 0044 */ std::vector textures; + /* 0050 */ std::unique_ptr mesh; + /* 0054 */ unsigned char alpha; +}; -private: - TextureCache& m_textures; +class ModelNodeV1 : public ModelNode { +public: + ModelNodeV1(); + ~ModelNodeV1() override; + + /* 0058 */ float position[3]; + /* 0064 */ float axis[3]; + /* 0070 */ float angle; + /* 0074 */ float scale[3]; + /* 0080 */ std::vector legacyPositionKeys; + /* 008C */ std::vector rotationKeys; +}; + +class ModelNodeV2 : public ModelNode { +public: + ModelNodeV2(); + ~ModelNodeV2() override; + + /* 0058 */ float transform[12]; + /* 0088 */ std::vector scaleKeys; + /* 0094 */ std::vector rotationKeys; + /* 00A0 */ std::vector positionKeys; + /* 00AC */ std::map textureKeys; }; struct ModelResourceContext { @@ -86,6 +97,7 @@ struct ModelResourceContext { }; class C3dModelRes : public CRes { + friend class ModelNode; public: explicit C3dModelRes(ModelResourceContext& context); ~C3dModelRes() override; @@ -93,15 +105,15 @@ public: ModelNode* FindNode(const char* name) const; void RegisterMovies(class BinkMovies& movies, const float* position) const; - int major; - std::list nodes; - std::list rootNames; - std::map meshes; - std::list volumes; - std::string sourceName; - int shade; - unsigned char alpha; - std::list movieNames; + /* 0110 */ int major; + /* 0114 */ std::list nodes; + /* 011C */ std::list rootNames; + /* 0124 */ std::map meshes; + /* 012C */ std::list volumes; + /* 0134 */ std::string sourceName; + /* 014C */ int shade; + /* 0150 */ unsigned char alpha; + /* 0154 */ std::list movieNames; protected: ModelResourceContext* m_context; @@ -139,4 +151,10 @@ static_assert(sizeof(ModelScaleKey) == 32); static_assert(sizeof(ModelRotationKey) == 20); static_assert(sizeof(ModelVolume) == 232); +#if defined(_WIN32) && !defined(_WIN64) +static_assert(sizeof(ModelNode) == 0x58); +static_assert(sizeof(ModelNodeV1) == 0x98); +static_assert(sizeof(ModelNodeV2) == 0xB4); +#endif + #endif diff --git a/Source/Resource/Models/ModelResourceV2.cpp b/Source/Resource/Models/ModelResourceV2.cpp index 29b39b6..e3f4ed0 100644 --- a/Source/Resource/Models/ModelResourceV2.cpp +++ b/Source/Resource/Models/ModelResourceV2.cpp @@ -36,7 +36,7 @@ namespace { } } -// OFFSET: 0x00751ED0 +// OFFSET: 0x007555C0 // FUNCTION: fn_07984 C3dModelResV2::C3dModelResV2(ModelResourceContext& context) : C3dModelRes(context), framesPerSecond(0.0f), animationLength(0) { } @@ -92,7 +92,7 @@ bool C3dModelResV2::Load(const char* name) { // INLINED inline void C3dModelResV2::ReadNode(ResourceByteReader& input, unsigned minor, const std::vector& textureNames) { - auto node = std::make_unique(this->m_context->textures); + auto node = std::make_unique(); node->model = this; node->mesh = std::make_unique(); node->name = ReadName(input);