Browse Source

fixed morphing behavior

Vicente Penades 6 years ago
parent
commit
baf9d281b8

+ 40 - 9
src/SharpGLTF.Core/Transforms/MeshTransforms.cs

@@ -58,6 +58,12 @@ namespace SharpGLTF.Transforms
         /// </summary>
         /// </summary>
         private readonly SparseWeight8 _Weights;
         private readonly SparseWeight8 _Weights;
 
 
+        /// <summary>
+        /// True if morph targets represent absolute values.
+        /// False if morph targets represent values relative to master value.
+        /// </summary>
+        private readonly bool _AbsoluteMorphs;
+
         #endregion
         #endregion
 
 
         #region API
         #region API
@@ -65,8 +71,8 @@ namespace SharpGLTF.Transforms
         /// <summary>
         /// <summary>
         /// Increments all indices and adds a new Index[0] with a weight that makes the sum of all weights equal to 1
         /// Increments all indices and adds a new Index[0] with a weight that makes the sum of all weights equal to 1
         /// </summary>
         /// </summary>
-        /// <param name="r"></param>
-        /// <returns></returns>
+        /// <param name="r">A <see cref="SparseWeight8"/> object representing the weights of the morph targets.</param>
+        /// <returns>A <see cref="SparseWeight8"/> representing the morph target weights, compensated with the weight of the master values.</returns>
         internal static SparseWeight8 Normalize(SparseWeight8 r)
         internal static SparseWeight8 Normalize(SparseWeight8 r)
         {
         {
             int i = -1;
             int i = -1;
@@ -117,10 +123,21 @@ namespace SharpGLTF.Transforms
 
 
             var p = V3.Zero;
             var p = V3.Zero;
 
 
-            foreach (var pair in _Weights.GetPairs())
+            if (_AbsoluteMorphs)
+            {
+                foreach (var pair in _Weights.GetPairs())
+                {
+                    var val = pair.Item1 == 0 ? value : morphTargets[pair.Item1 - 1];
+                    p += val * pair.Item2;
+                }
+            }
+            else
             {
             {
-                var val = pair.Item1 == 0 ? value : morphTargets[pair.Item1 - 1];
-                p += val * pair.Item2;
+                foreach (var pair in _Weights.GetPairs())
+                {
+                    var val = pair.Item1 == 0 ? value : value + morphTargets[pair.Item1 - 1];
+                    p += val * pair.Item2;
+                }
             }
             }
 
 
             return p;
             return p;
@@ -134,16 +151,30 @@ namespace SharpGLTF.Transforms
 
 
             var p = V4.Zero;
             var p = V4.Zero;
 
 
-            foreach (var pair in _Weights.GetPairs())
+            if (_AbsoluteMorphs)
             {
             {
-                var val = pair.Item1 == 0 ? value : morphTargets[pair.Item1 - 1];
-                p += val * pair.Item2;
+                foreach (var pair in _Weights.GetPairs())
+                {
+                    var val = pair.Item1 == 0 ? value : morphTargets[pair.Item1 - 1];
+                    p += val * pair.Item2;
+                }
+            }
+            else
+            {
+                foreach (var pair in _Weights.GetPairs())
+                {
+                    var val = pair.Item1 == 0 ? value : value + morphTargets[pair.Item1 - 1];
+                    p += val * pair.Item2;
+                }
             }
             }
 
 
             return p;
             return p;
         }
         }
 
 
-        public V4 MorphColors(V4 color, V4[] morphTargets) { return MorphVectors(color, morphTargets); }
+        public V4 MorphColors(V4 color, V4[] morphTargets)
+        {
+            return MorphVectors(color, morphTargets);
+        }
 
 
         #endregion
         #endregion
     }
     }

+ 3 - 1
tests/SharpGLTF.Tests/Schema2/LoadAndSave/LoadSampleTests.cs

@@ -273,7 +273,9 @@ namespace SharpGLTF.Schema2.LoadAndSave
             var acc_morph0 = node.Mesh.Primitives[0].GetMorphTargetAccessors(0)["POSITION"];
             var acc_morph0 = node.Mesh.Primitives[0].GetMorphTargetAccessors(0)["POSITION"];
             var acc_morph1 = node.Mesh.Primitives[0].GetMorphTargetAccessors(1)["POSITION"];
             var acc_morph1 = node.Mesh.Primitives[0].GetMorphTargetAccessors(1)["POSITION"];
 
 
-            acc_morph0.AsVector3Array();
+            var pos_master = acc_master.AsVector3Array();
+            var pos_morph0 = acc_morph0.AsVector3Array();
+            var pos_morph1 = acc_morph1.AsVector3Array();
 
 
             // pos_master
             // pos_master