Vicente Penades 7 лет назад
Родитель
Сommit
47789d39f7

+ 4 - 4
src/glTF2Sharp.DOM/Schema2/gltf.AccessorSparse.cs

@@ -38,7 +38,7 @@ namespace glTF2Sharp.Schema2
 
         public Memory.SparseAccessor<Single> GetScalarAccesor(Accessor baseAccessor)
         {
-            var bot = baseAccessor.CastToScalarAccessor();
+            var bot = baseAccessor.CastToScalarAccessor(false);
             var top = this._values.CastToScalarAccessor(baseAccessor.LogicalParent, baseAccessor.Encoding, baseAccessor.Normalized);
             var idx = this._indices.CastToIndicesAccessor(baseAccessor.LogicalParent);
 
@@ -47,7 +47,7 @@ namespace glTF2Sharp.Schema2
 
         public Memory.SparseAccessor<Vector2> GetVector2Accesor(Accessor baseAccessor)
         {
-            var bot = baseAccessor.CastToVector2Accessor();
+            var bot = baseAccessor.CastToVector2Accessor(false);
             var top = this._values.CastToVector2Accessor(baseAccessor.LogicalParent, baseAccessor.Encoding, baseAccessor.Normalized);
             var idx = this._indices.CastToIndicesAccessor(baseAccessor.LogicalParent);
 
@@ -56,7 +56,7 @@ namespace glTF2Sharp.Schema2
 
         public Memory.SparseAccessor<Vector3> GetVector3Accesor(Accessor baseAccessor)
         {
-            var bot = baseAccessor.CastToVector3Accessor();
+            var bot = baseAccessor.CastToVector3Accessor(false);
             var top = this._values.CastToVector3Accessor(baseAccessor.LogicalParent, baseAccessor.Encoding, baseAccessor.Normalized);
             var idx = this._indices.CastToIndicesAccessor(baseAccessor.LogicalParent);
 
@@ -65,7 +65,7 @@ namespace glTF2Sharp.Schema2
 
         public Memory.SparseAccessor<Vector4> GetVector4Accesor(Accessor baseAccessor)
         {
-            var bot = baseAccessor.CastToVector4Accessor();
+            var bot = baseAccessor.CastToVector4Accessor(false);
             var top = this._values.CastToVector4Accessor(baseAccessor.LogicalParent, baseAccessor.Encoding, baseAccessor.Normalized);
             var idx = this._indices.CastToIndicesAccessor(baseAccessor.LogicalParent);
 

+ 17 - 5
src/glTF2Sharp.DOM/Schema2/gltf.Accessors.cs

@@ -151,27 +151,39 @@ namespace glTF2Sharp.Schema2
             _UpdateBounds();
         }
 
-        public Memory.ScalarAccessor CastToScalarAccessor()
+        public Memory.IAccessor<Single> CastToScalarAccessor(bool useSparse=true)
         {
             Guard.IsTrue(this.Dimensions == ElementType.SCALAR, nameof(Dimensions));
-            return SourceBufferView.CreateScalarAccessor(this.ByteOffset, this.Encoding, this.Normalized);
+
+            if (this._sparse != null && useSparse) return this._sparse.GetScalarAccesor(this);
+
+            return SourceBufferView.CreateScalarAccessor(this.ByteOffset, this.Encoding, this.Normalized);            
         }
 
-        public Memory.Vector2Accessor CastToVector2Accessor()
+        public Memory.IAccessor<Vector2> CastToVector2Accessor(bool useSparse = true)
         {
             Guard.IsTrue(this.Dimensions == ElementType.VEC2, nameof(Dimensions));
+
+            if (this._sparse != null && useSparse) return this._sparse.GetVector2Accesor(this);
+
             return SourceBufferView.CreateVector2Accessor(this.ByteOffset, this.Encoding, this.Normalized);
         }
 
-        public Memory.Vector3Accessor CastToVector3Accessor()
+        public Memory.IAccessor<Vector3> CastToVector3Accessor(bool useSparse = true)
         {
             Guard.IsTrue(this.Dimensions == ElementType.VEC3, nameof(Dimensions));
+
+            if (this._sparse != null && useSparse) return this._sparse.GetVector3Accesor(this);
+
             return SourceBufferView.CreateVector3Accessor(this.ByteOffset, this.Encoding, this.Normalized);
         }
 
-        public Memory.Vector4Accessor CastToVector4Accessor()
+        public Memory.IAccessor<Vector4> CastToVector4Accessor(bool useSparse = true)
         {
             Guard.IsTrue(this.Dimensions == ElementType.VEC4, nameof(Dimensions));
+
+            if (this._sparse != null && useSparse) return this._sparse.GetVector4Accesor(this);
+
             return SourceBufferView.CreateVector4Accessor(this.ByteOffset, this.Encoding, this.Normalized);
         }
 

+ 49 - 0
src/glTF2Sharp.Tests/Schema2/AccessorSparseTests.cs

@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using NUnit.Framework;
+
+namespace glTF2Sharp.Schema2
+{
+    [TestFixture]
+    public class AccessorSparseTests
+    {
+        [Test]
+        public void LoadMorphCubeModel()
+        {
+            foreach (var path in TestFiles.GetGeneratedFilePaths())
+            {
+                var model = ModelRoot.Load(path);
+                Assert.NotNull(model);
+
+                var primitives = model.LogicalMeshes
+                    .SelectMany(item => item.Primitives)
+                    .Where(item => item.MorpthTargets > 0);
+                
+                foreach (var primitive in primitives)
+                {
+                    var basePositions = primitive.GetVertexAccessor("POSITION").CastToVector3Accessor();
+
+                    for (int i = 0; i < primitive.MorpthTargets; ++i)
+                    {
+                        var morphs = primitive.GetMorphTargetAccessors(i);
+                        Assert.NotNull(morphs);
+
+                        var morphPositions = morphs["POSITION"].CastToVector3Accessor();
+
+                        // Assert.AreEqual(basePositions.Count, morphPositions.Count);
+
+                        if (morphs["POSITION"].IsSparse)
+                        {
+                            TestContext.WriteLine($"{path}");
+                        }
+                    }
+                }                
+            }
+
+            
+        }
+    }
+}

+ 1 - 1
src/glTF2Sharp.Tests/Schema2/LoadModelTests.cs

@@ -134,7 +134,7 @@ namespace glTF2Sharp.Schema2
 
         #region model loading
 
-        static ModelRoot _LoadModel(string filePath)
+        public static ModelRoot _LoadModel(string filePath)
         {
             try
             {