loadMesh method
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;
}