loadMesh method

Future<Object3D> loadMesh(
  1. int meshIndex
)

Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes @param {number} meshIndex @return {Promise<Group|Mesh|SkinnedMesh>}

Implementation

Future<Object3D> loadMesh(int meshIndex) async {
  final parser = this;
  final json = this.json;
  final extensions = this.extensions;

  Map<String, dynamic> meshDef = json["meshes"][meshIndex];
  final primitives = meshDef["primitives"];

  List<Future> pending = [];

  for (int i = 0, il = primitives.length; i < il; i++) {
    final material = primitives[i]["material"] == null
        ? createDefaultMaterial(cache)
        : await getDependency('material', primitives[i]["material"]);

    pending.add(Future.sync(() => material));
  }

  pending.add(parser.loadGeometries(primitives));

  final results = await Future.wait(pending);

  final materials = results.sublist(0, results.length - 1);
  final geometries = results[results.length - 1];

  final meshes = [];

  for (int i = 0, il = geometries.length; i < il; i++) {
    final geometry = geometries[i];
    Map<String, dynamic> primitive = primitives[i];

    // 1. create Mesh

    late Object3D mesh;
    final material = materials[i];

    if (
      primitive["mode"] == webglConstants["TRIANGLES"] ||
      primitive["mode"] == webglConstants["TRIANGLE_STRIP"] ||
      primitive["mode"] == webglConstants["TRIANGLE_FAN"] ||
      primitive["mode"] == null
    ) {
      // .isSkinnedMesh isn't in glTF spec. See ._markDefs()
      mesh = meshDef["isSkinnedMesh"] == true? SkinnedMesh(geometry, material): Mesh(geometry, material);

      if (mesh is SkinnedMesh ) {//&& !mesh.geometry!.attributes["skinWeight"].normalized
        // we normalize floating point skin weight array to fix malformed assets (see #15319)
        // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs
        mesh.normalizeSkinWeights();
      }

      if (primitive["mode"] == webglConstants["TRIANGLE_STRIP"]) {
        mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleStripDrawMode);
      }
      else if (primitive["mode"] == webglConstants["TRIANGLE_FAN"]) {
        mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleFanDrawMode);
      }
    }
    else if (primitive["mode"] == webglConstants["LINES"]) {
      mesh = LineSegments(geometry, material);
    }
    else if (primitive["mode"] == webglConstants["LINE_STRIP"]) {
      mesh = Line(geometry, material);
    }
    else if (primitive["mode"] == webglConstants["LINE_LOOP"]) {
      mesh = LineLoop(geometry, material);
    }
    else if (primitive["mode"] == webglConstants["POINTS"]) {
      mesh = Points(geometry, material);
    }
    else {
      throw ('THREE.GLTFLoader: Primitive mode unsupported: ${primitive["mode"]}');
    }

    if (mesh.geometry!.morphAttributes.keys.isNotEmpty) {
      updateMorphTargets(mesh, meshDef);
    }

    mesh.name = parser.createUniqueName(meshDef["name"] ?? ('mesh_$meshIndex'));
    assignExtrasToUserData(mesh, meshDef);

    if (primitive["extensions"] != null){
      addUnknownExtensionsToUserData(extensions, mesh, primitive);
    }

    parser.assignFinalMaterial(mesh);
    meshes.add(mesh);
  }

			for (int i = 0, il = meshes.length; i < il; i ++ ) {
				parser.associations[meshes[ i ]] = {
					'meshes': meshIndex,
					'primitives': i
				};
			}

  if (meshes.length == 1) {
    return meshes[0];
  }

  final group = Group();
  for (int i = 0; i < meshes.length; i++) {
    group.add(meshes[i]);
  }

  return group;
}