Browse Source

Fixed mesh packing when the mesh has multiple primitives, and only some of the primitives have morph targets

Vicente Penades 3 years ago
parent
commit
8cd017764e
1 changed files with 11 additions and 7 deletions
  1. 11 7
      src/SharpGLTF.Toolkit/Geometry/Packed/PackedMeshBuilder.cs

+ 11 - 7
src/SharpGLTF.Toolkit/Geometry/Packed/PackedMeshBuilder.cs

@@ -42,16 +42,17 @@ namespace SharpGLTF.Geometry
 
             foreach (var srcMesh in meshBuilders)
             {
-                var dstMesh = new PackedMeshBuilder<TMaterial>(srcMesh.Name, srcMesh.Extras);
-
-                foreach (var srcPrim in srcMesh.Primitives)
-                {
-                    if (srcPrim.Vertices.Count == 0) continue;
+                var srcPrims = srcMesh
+                    .Primitives
+                    .Where(item => item.Vertices.Count > 0);
 
-                    vertexEncodings.ColorEncoding = null;
+                var dstMesh = new PackedMeshBuilder<TMaterial>(srcMesh.Name, srcMesh.Extras);
 
-                    bool useStrided = settings.UseStridedBuffers;
+                bool useStrided = settings.UseStridedBuffers;
+                vertexEncodings.ColorEncoding = null;
 
+                foreach (var srcPrim in srcPrims)
+                {
                     if (srcPrim.MorphTargets.Count > 0)
                     {
                         // if the primitive has morphing, it is better not to use strided vertex buffers.
@@ -64,7 +65,10 @@ namespace SharpGLTF.Geometry
                             vertexEncodings.ColorEncoding = EncodingType.FLOAT;
                         }
                     }
+                }
 
+                foreach (var srcPrim in srcPrims)
+                {
                     var dstPrim = dstMesh.AddPrimitive(srcPrim.Material, srcPrim.VerticesPerPrimitive);
 
                     if (useStrided) dstPrim.SetStridedVertices(srcPrim, vertexEncodings);