23#ifndef VCL_IO_MESH_GLTF_DETAIL_INFO_H
24#define VCL_IO_MESH_GLTF_DETAIL_INFO_H
26#include <vclib/space/core.h>
30namespace vcl::detail {
44inline uint gltfNodeNumberMeshes(
const tinygltf::Model& model, uint node)
47 if (model.nodes[node].mesh >= 0) {
50 for (
int c : model.nodes[node].children) {
52 nMeshes += gltfNodeNumberMeshes(model, c);
71inline uint gltfNumberMeshes(
const tinygltf::Model& model)
74 for (uint s = 0; s < model.scenes.size(); ++s) {
75 const tinygltf::Scene& scene = model.scenes[s];
76 for (uint n = 0; n < scene.nodes.size(); ++n) {
77 nMeshes += gltfNodeNumberMeshes(model, scene.nodes[n]);
91template<Matrix44Concept MatrixType>
92MatrixType gltfCurrentNodeMatrix(
const tinygltf::Model& model, uint currentNode)
94 using QuatType = Quaternion<typename MatrixType::Scalar>;
96 MatrixType currentMatrix = MatrixType::Identity();
98 if (model.nodes[currentNode].matrix.size() == 16) {
99 for (uint i = 0; i < 4; ++i) {
100 for (uint j = 0; j < 4; ++j) {
102 currentMatrix(i, j) =
103 model.nodes[currentNode].matrix[j * 4 + i];
115 MatrixType rot = MatrixType::Identity();
116 MatrixType scale = MatrixType::Identity();
117 MatrixType trans = MatrixType::Identity();
120 if (model.nodes[currentNode].rotation.size() == 4) {
122 model.nodes[currentNode].rotation[3],
123 model.nodes[currentNode].rotation[0],
124 model.nodes[currentNode].rotation[1],
125 model.nodes[currentNode].rotation[2]);
128 rot.template block<3, 3>(0, 0) = qr.normalized().toRotationMatrix();
131 if (model.nodes[currentNode].scale.size() == 3) {
133 scale(0, 0) = model.nodes[currentNode].scale[0];
134 scale(1, 1) = model.nodes[currentNode].scale[1];
135 scale(2, 2) = model.nodes[currentNode].scale[2];
138 if (model.nodes[currentNode].translation.size() == 3) {
140 trans(0, 3) = model.nodes[currentNode].translation[0];
141 trans(1, 3) = model.nodes[currentNode].translation[1];
142 trans(2, 3) = model.nodes[currentNode].translation[2];
146 currentMatrix = trans * rot * scale;
148 return currentMatrix;