From 27683793a6d9276bda2f36dc386d696ded889c33 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 8 Jan 2026 22:07:36 +0300 Subject: [PATCH] add anonymous bones --- src/coders/vcm.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/coders/vcm.cpp b/src/coders/vcm.cpp index 73da37401..507512715 100644 --- a/src/coders/vcm.cpp +++ b/src/coders/vcm.cpp @@ -292,6 +292,34 @@ static void perform_box(const xmlelement& root, ModelBuilder& builder) { builder.pop(); } +static void perform_bone(const xmlelement& root, ModelBuilder& builder) { + glm::mat4 tsf(1.0f); + if (root.has("move")) { + tsf = glm::translate(tsf, root.attr("move").asVec3()); + } + if (root.has("rotate")) { + auto text = root.attr("rotate").getText(); + if (std::count(text.begin(), text.end(), ',') == 3) { + auto quat = root.attr("rotate").asVec4(); + tsf *= glm::mat4_cast(glm::quat(quat.w, quat.x, quat.y, quat.z)); + } else { + auto rot = root.attr("rotate").asVec3(); + tsf = glm::rotate(tsf, glm::radians(rot.x), glm::vec3(1, 0, 0)); + tsf = glm::rotate(tsf, glm::radians(rot.y), glm::vec3(0, 1, 0)); + tsf = glm::rotate(tsf, glm::radians(rot.z), glm::vec3(0, 0, 1)); + } + } + if (root.has("scale")) { + tsf = glm::scale(tsf, root.attr("scale").asVec3()); + } + + builder.push(std::move(tsf)); + for (const auto& elem : root.getElements()) { + perform_element(*elem, builder); + } + builder.pop(); +} + static void perform_element(const xmlelement& root, ModelBuilder& builder) { auto tag = root.getTag(); @@ -301,6 +329,8 @@ static void perform_element(const xmlelement& root, ModelBuilder& builder) { perform_box(root, builder); } else if (tag == "tri") { perform_triangle(root, builder); + } else if (tag == "bone") { + perform_bone(root, builder); } }