buildNodeHierarchy method
Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes @param {number} sceneIndex @return {Promise
Implementation
Future<void> buildNodeHierarchy(int nodeId, Object3D? parentObject, Map<String,dynamic> json) async {
Map<String, dynamic> nodeDef = json["nodes"][nodeId];
final Object3D? node = await getDependency('node', nodeId);
if (nodeDef["skin"] != null) {
dynamic skinEntry;
final skin = await getDependency('skin', nodeDef["skin"]);
skinEntry = skin;
final jointNodes = [];
for (int i = 0; i < skinEntry["joints"].length; i++) {
final node1 = await getDependency('node', skinEntry["joints"][i]);
jointNodes.add(node1);
}
node?.traverse((mesh) {
if(mesh is SkinnedMesh) {
List<Bone> bones = [];
List<Matrix4> boneInverses = [];
mesh.frustumCulled = false;
for (int j = 0, jl = jointNodes.length; j < jl; j++) {
final jointNode = jointNodes[j];
if (jointNode != null) {
bones.add(jointNode);
final mat = Matrix4();
if (skinEntry["inverseBindMatrices"] != null) {
mat.copyFromUnknown(skinEntry["inverseBindMatrices"].array, j * 16);
}
boneInverses.add(mat);
} else {
console.warning('GLTFLoader: Joint "%s" could not be found. ${skinEntry["joints"][j]}');
}
}
mesh.bind(Skeleton(bones, boneInverses),mesh.matrixWorld);
}
});
}
// build node hierachy
parentObject?.add(node);
if (nodeDef["children"] != null) {
final List children = nodeDef["children"];
for (int i = 0; i < children.length; i++) {
final child = children[i];
await buildNodeHierarchy(child, node, json);
}
}
}