From 52a1b4e05b93854700598f6e643f544b7e9f80aa Mon Sep 17 00:00:00 2001 From: VDm Date: Wed, 18 Jun 2025 00:15:50 +0400 Subject: [PATCH] feat(model): implement CM2Model::SetGeometryVisible --- src/model/CM2Model.cpp | 60 +++++++++++++++++++++++++++++++++++++++++- src/model/CM2Model.hpp | 3 +++ src/model/CM2Scene.cpp | 2 +- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/model/CM2Model.cpp b/src/model/CM2Model.cpp index 098bc1a..501a35b 100644 --- a/src/model/CM2Model.cpp +++ b/src/model/CM2Model.cpp @@ -1007,6 +1007,22 @@ int32_t CM2Model::InitializeLoaded() { } } + if (this->m_shared->skinProfile->skinSections.Count()) { + this->m_skinSections = reinterpret_cast(&data[0]); + data += (sizeof(uint32_t) * this->m_shared->skinProfile->skinSections.Count()); + + if (this->model30) { + memcpy( + this->m_skinSections, + this->model30->m_skinSections, + sizeof(uint32_t) * this->m_shared->skinProfile->skinSections.Count()); + } else { + for (uint32_t i = 0; i < this->m_shared->skinProfile->skinSections.Count(); ++i) { + this->m_skinSections[i] = 1; + } + } + } + // TODO if (this->m_shared->m_data->colors.Count()) { @@ -1104,7 +1120,10 @@ int32_t CM2Model::InitializeLoaded() { } case 1: { - // TODO + this->SetGeometryVisible( + modelCall->args[0], + modelCall->args[1], + modelCall->args[2]); break; } @@ -1729,3 +1748,42 @@ void CM2Model::WaitForLoad(const char* a2) { this->InitializeLoaded(); } } + +void CM2Model::UnoptimizeVisibleGeometry() { + // TODO +} + +void CM2Model::SetGeometryVisible(uint32_t start, uint32_t end, int32_t visible) { + if (this->m_loaded) { + bool needUpdate = false; + + const auto& skinSections = this->m_shared->skinProfile->skinSections; + + for (uint32_t i = 0; i < skinSections.Count(); ++i) { + uint32_t id = skinSections[i].skinSectionId; + if (start <= id && id <= end) { + if (this->m_skinSections[i] != static_cast(visible)) { + this->m_skinSections[i] = static_cast(visible); + needUpdate = true; + } + } + } + + if (needUpdate) { + this->UnoptimizeVisibleGeometry(); + } + + } else { + auto modelCall = NEW(CM2ModelCall); + + modelCall->type = 1; + modelCall->modelCallNext = nullptr; + modelCall->time = this->m_scene->m_time; + modelCall->args[0] = start; + modelCall->args[1] = end; + modelCall->args[2] = static_cast(visible); + + *this->m_modelCallTail = modelCall; + this->m_modelCallTail = &modelCall->modelCallNext; + } +} diff --git a/src/model/CM2Model.hpp b/src/model/CM2Model.hpp index 990a935..2e4a224 100644 --- a/src/model/CM2Model.hpp +++ b/src/model/CM2Model.hpp @@ -101,6 +101,7 @@ class CM2Model { uint32_t uint90 = 0; M2ModelBone* m_bones = nullptr; C44Matrix* m_boneMatrices = nullptr; + uint32_t* m_skinSections = nullptr; M2ModelColor* m_colors = nullptr; HTEXTURE* m_textures = nullptr; M2ModelTextureWeight* m_textureWeights = nullptr; @@ -192,6 +193,8 @@ class CM2Model { void UnsetBoneSequence(uint32_t boneId, int32_t a3, int32_t a4); void UpdateLoaded(); void WaitForLoad(const char* a2); + void UnoptimizeVisibleGeometry(); + void SetGeometryVisible(uint32_t start, uint32_t end, int32_t visible); }; #endif diff --git a/src/model/CM2Scene.cpp b/src/model/CM2Scene.cpp index 3545ce0..483ca2a 100644 --- a/src/model/CM2Scene.cpp +++ b/src/model/CM2Scene.cpp @@ -522,7 +522,7 @@ void CM2Scene::Animate(const C3Vector& cameraPos) { batch = &skinProfile->batches[batchIndex]; skinSection = &model->m_shared->m_skinSections[batch->skinSectionIndex]; - if (!skinSection) { + if (!model->m_skinSections[batch->skinSectionIndex]) { continue; } }