loadNodeShallow method

Future<Object3D> loadNodeShallow(
  1. int nodeIndex
)

Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy @param {number} nodeIndex @return {Promise

Implementation

Future<Object3D> loadNodeShallow(int nodeIndex) async {
  final json = this.json;
  final extensions = this.extensions;

  Map<String, dynamic> nodeDef = json["nodes"][nodeIndex];

  // reserve node's name before its dependencies, so the root has the intended name.
  final nodeName = nodeDef["name"] != null ? createUniqueName(nodeDef["name"]) : '';

  final pending = [];

  final meshPromise = await _invokeOne((ext) {
    return ext?.createNodeMesh != null ? ext!.createNodeMesh(nodeIndex) : null;
  });

  if (meshPromise != null) {
    pending.add(meshPromise);
  }

  if (nodeDef["camera"] != null) {
    final camera = await getDependency('camera', nodeDef["camera"]);

    pending.add(await getNodeRef(cameraCache, nodeDef["camera"], camera));
  }

  List results = await _invokeAll((ext) async {
    return ext?.createNodeAttachment != null
        ? await ext?.createNodeAttachment?.call(nodeIndex)
        : null;
  });

  final objects = [];

  //pending.forEach((element) {
  for(final element in pending){
    objects.add(element);
  }

  //results.forEach((element) {
  for(final element in results){
    objects.add(element);
  }

  late final Object3D node;
  // .isBone isn't in glTF spec. See ._markDefs
  if (nodeDef["isBone"] == true) {
    node = Bone();
  }
  else if (objects.length > 1) {
    node = Group();
  }
  else if (objects.length == 1) {
    node = objects[0];
  }
  else {
    node = Object3D();
  }

  if (objects.isEmpty || node != objects[0]) {
    for (int i = 0; i < objects.length; i++) {
      node.add(objects[i]);
    }
  }

  if (nodeDef["name"] != null) {
    node.userData["name"] = nodeDef["name"];
    node.name = nodeName;
  }

  assignExtrasToUserData(node, nodeDef);

  if (nodeDef["extensions"] != null){
    addUnknownExtensionsToUserData(extensions, node, nodeDef);
  }

  if (nodeDef["matrix"] != null) {
    final matrix = Matrix4();
    matrix.copyFromUnknown(List<num>.from(nodeDef["matrix"]));
    node.applyMatrix4(matrix);
  } else {
    if (nodeDef["translation"] != null) {
      node.position.copyFromUnknown(List<num>.from(nodeDef["translation"]));
    }

    if (nodeDef["rotation"] != null) {
      node.quaternion.fromNumArray(List<num>.from(nodeDef["rotation"]));
    }

    if (nodeDef["scale"] != null) {
      node.scale.copyFromUnknown(List<num>.from(nodeDef["scale"]));
    }
  }

  associations[node] = {"type": 'nodes', "index": nodeIndex};
  return node;
}