Bläddra i källkod

Fix issue with sub meshes with multiple primitives

Gary Hsu 8 år sedan
förälder
incheckning
d2f629d710
1 ändrade filer med 17 tillägg och 2 borttagningar
  1. 17 2
      loaders/src/glTF/2.0/babylon.glTFLoader.ts

+ 17 - 2
loaders/src/glTF/2.0/babylon.glTFLoader.ts

@@ -281,10 +281,12 @@ module BABYLON.GLTF2 {
             vertexData.positions = [];
             vertexData.indices = [];
 
+            var subMeshInfos: { materialIndex: number, verticesStart: number, verticesCount: number, indicesStart: number, indicesCount: number }[] = [];
+
             var primitivesLoaded = 0;
             var numPrimitives = mesh.primitives.length;
             for (var i = 0; i < numPrimitives; i++) {
-                var primitive = mesh.primitives[i];
+                let primitive = mesh.primitives[i];
                 if (primitive.mode && primitive.mode !== EMeshPrimitiveMode.TRIANGLES) {
                     // TODO: handle other primitive modes
                     throw new Error("Not implemented");
@@ -295,13 +297,26 @@ module BABYLON.GLTF2 {
                 this._loadVertexDataAsync(primitive, subVertexData => {
                     this._loadMorphTargetsData(mesh, primitive, subVertexData, babylonMesh);
 
-                    var subMesh = new SubMesh(multiMaterial.subMaterials.length, vertexData.positions.length, subVertexData.positions.length, vertexData.indices.length, subVertexData.indices.length, babylonMesh);
+                    subMeshInfos.push({
+                        materialIndex: multiMaterial.subMaterials.length,
+                        verticesStart: vertexData.positions.length,
+                        verticesCount: subVertexData.positions.length,
+                        indicesStart: vertexData.indices.length,
+                        indicesCount: subVertexData.indices.length
+                    });
+
                     var subMaterial = primitive.material === undefined ? this._getDefaultMaterial() : GLTFLoaderExtension.LoadMaterial(primitive.material);
                     multiMaterial.subMaterials.push(subMaterial);
                     vertexData.merge(subVertexData);
 
                     if (++primitivesLoaded === numPrimitives) {
                         geometry.setAllVerticesData(vertexData, false);
+
+                        // Sub meshes must be created after setting vertex data because of mesh._createGlobalSubMesh.
+                        for (var i = 0; i < subMeshInfos.length; i++) {
+                            var info = subMeshInfos[i];
+                            new SubMesh(info.materialIndex, info.verticesStart, info.verticesCount, info.indicesStart, info.indicesCount, babylonMesh);
+                        }
                     }
                 });
             }