summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2021-09-05 21:49:49 +0200
committerraysan5 <[email protected]>2021-09-05 21:49:49 +0200
commitb15715ca80bc6fbc3f220725dcd0f21a3e98c484 (patch)
tree190a438d8fcce65e0dc74a15ac5ddd56fe6fd8b2
parent8d3ff3fda87d8b1cff1125f4c9c40c7378bfb80a (diff)
parent24a38dbd3fc7777b8be2ac288a626dbf00e2b28f (diff)
downloadraylib-b15715ca80bc6fbc3f220725dcd0f21a3e98c484.tar.gz
raylib-b15715ca80bc6fbc3f220725dcd0f21a3e98c484.zip
Merge branch 'master' of https://github.com/raysan5/raylib
-rw-r--r--src/models.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/src/models.c b/src/models.c
index 98c25c7b..045cd16a 100644
--- a/src/models.c
+++ b/src/models.c
@@ -5461,18 +5461,52 @@ void LoadGLTFMesh(cgltf_data *data, cgltf_mesh *mesh, Model *outModel, Matrix cu
}
}
-void LoadGLTFNode(cgltf_data *data, cgltf_node *node, Model *outModel, Matrix currentTransform, int *primitiveIndex, const char *fileName)
+static Matrix GetNodeTransformationMatrix(cgltf_node *node, Matrix current)
{
- Matrix nodeTransform = {
+ if (node->has_matrix)
+ {
+ Matrix nodeTransform = {
node->matrix[0], node->matrix[4], node->matrix[8], node->matrix[12],
node->matrix[1], node->matrix[5], node->matrix[9], node->matrix[13],
node->matrix[2], node->matrix[6], node->matrix[10], node->matrix[14],
node->matrix[3], node->matrix[7], node->matrix[11], node->matrix[15] };
+ current= MatrixMultiply(nodeTransform, current);
+ }
+ if (node->has_translation)
+ {
+ Matrix tl = MatrixTranslate(node->translation[0],node->translation[1],node->translation[2]);
+ current = MatrixMultiply(tl, current);
+ }
+ if (node->has_rotation)
+ {
+ Matrix rot = QuaternionToMatrix((Quaternion){node->rotation[0],node->rotation[1],node->rotation[2],node->rotation[3]});
+ current = MatrixMultiply(rot, current);
+ }
+ if (node->has_scale)
+ {
+ Matrix scale = MatrixScale(node->scale[0],node->scale[1],node->scale[2]);
+ current = MatrixMultiply(scale, current);
+ }
+ return current;
+}
- currentTransform = MatrixMultiply(nodeTransform, currentTransform);
-
- if (node->mesh != NULL) LoadGLTFMesh(data, node->mesh, outModel, currentTransform, primitiveIndex, fileName);
-
+void LoadGLTFNode(cgltf_data *data, cgltf_node *node, Model *outModel, Matrix currentTransform, int *primitiveIndex, const char *fileName)
+{
+ // Apply the transforms if they exist (Will still be applied even if no mesh is present to support emptys and bone structures)
+ Matrix localTransform = GetNodeTransformationMatrix(node, MatrixIdentity());
+ currentTransform = MatrixMultiply(localTransform, currentTransform);
+ // Load mesh if it exists
+ if (node->mesh != NULL)
+ {
+ // Check if skinning is enabled and load Mesh accordingly
+ Matrix vertexTransform = currentTransform;
+ if((node->skin != NULL) && (node->parent != NULL))
+ {
+ vertexTransform = localTransform;
+ TRACELOG(LOG_WARNING,"MODEL: GLTF Node %s is skinned but not root node! Parent transformations will be ignored (NODE_SKINNED_MESH_NON_ROOT)",node->name);
+ }
+ LoadGLTFMesh(data, node->mesh, outModel, vertexTransform, primitiveIndex, fileName);
+ }
for (unsigned int i = 0; i < node->children_count; i++) LoadGLTFNode(data, node->children[i], outModel, currentTransform, primitiveIndex, fileName);
}