buildNodeHierarchy method

Future<void> buildNodeHierarchy(
  1. int nodeId,
  2. Object3D? parentObject,
  3. Map<String, dynamic> json
)

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);
    }
  }
}