summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2025-07-02 18:01:00 +0300
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2025-07-02 18:50:29 +0300
commitb79feb60f55efe93ce08609e9c2916d1938dad9e (patch)
tree196019a6c1d0300403e9cd1d61edadec37ab6b26 /indra
parent900516a449c618c87517d295db7f76662e555d00 (diff)
#4242 Clarify some operations
and make scale application a bit more valid
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/gltf/llgltfloader.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp
index dd9e0d9b3a..be3b9f0c4d 100644
--- a/indra/newview/gltf/llgltfloader.cpp
+++ b/indra/newview/gltf/llgltfloader.cpp
@@ -1373,15 +1373,14 @@ void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map
glm::quat rotation;
glm::decompose(translated_joint, scale, rotation, translation_override, skew, perspective);
+ // Viewer allows overrides, which are base joint with applied translation override.
+ // fortunately normal bones use only translation, without rotation or scale
node.mOverrideMatrix = glm::recompose(glm::vec3(1, 1, 1), glm::identity<glm::quat>(), translation_override, glm::vec3(0, 0, 0), glm::vec4(0, 0, 0, 1));
glm::mat4 overriden_joint = node.mOverrideMatrix;
- // This is incomplete or even wrong.
- // Viewer allows overrides, which are base joint with applied translation override.
- // So we should be taking viewer joint matrix and replacing translation part with an override.
- // Or should rebuild the matrix from viewer_data.scale, viewer_data.rotation, translation_override parts.
- overriden_joint = glm::scale(overriden_joint, viewer_data.mScale);
+ // todo: if gltf bone had rotation or scale, they probably should be saved here
+ // then applied to bind matrix
rest = parent_rest * overriden_joint;
if (viewer_data.mIsJoint)
{
@@ -1389,6 +1388,12 @@ void LLGLTFLoader::buildOverrideMatrix(LLJointData& viewer_data, joints_data_map
}
else
{
+ // This is likely incomplete or even wrong.
+ // Viewer Collision bones specify rotation and scale.
+ // Importer should apply rotation and scale to this matrix and save as needed
+ // then subsctruct them from bind matrix
+
+ overriden_joint = glm::scale(overriden_joint, viewer_data.mScale);
node.mOverrideRestMatrix = parent_support_rest * overriden_joint;
}
}