Bläddra i källkod

more validation improvements...

Vicente Penades 6 år sedan
förälder
incheckning
8d35fadcbe

+ 20 - 8
src/SharpGLTF.Core/Schema2/gltf.Accessors.cs

@@ -409,7 +409,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            SourceBufferView.ValidateBufferUsage(result, BufferMode.ELEMENT_ARRAY_BUFFER);
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ELEMENT_ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.UNSIGNED_INT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.UNSIGNED_INT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.SCALAR);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.SCALAR);
@@ -430,7 +430,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            SourceBufferView.ValidateBufferUsage(result, BufferMode.ARRAY_BUFFER);
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
@@ -447,7 +447,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            SourceBufferView.ValidateBufferUsage(result, BufferMode.ARRAY_BUFFER);
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3);
@@ -464,7 +464,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            SourceBufferView.ValidateBufferUsage(result, BufferMode.ARRAY_BUFFER);
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3, DimensionType.VEC4);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC3, DimensionType.VEC4);
@@ -481,7 +481,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            SourceBufferView.ValidateBufferUsage(result, BufferMode.ARRAY_BUFFER);
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC4);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC4);
@@ -497,6 +497,8 @@ namespace SharpGLTF.Schema2
         internal void ValidateWeights(Validation.ValidationContext result, int jwset)
         internal void ValidateWeights(Validation.ValidationContext result, int jwset)
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
+
+            SourceBufferView.ValidateBufferUsageGPU(result, BufferMode.ARRAY_BUFFER);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.FLOAT);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC4);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.VEC4);
 
 
@@ -515,9 +517,7 @@ namespace SharpGLTF.Schema2
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
-            // SourceBufferView.ValidateBufferUsage(result, null);
-            // result.CheckLinkMustBeAnyOf(nameof(Normalized), Normalized, false);
-            // result.CheckLinkMustBeAnyOf(nameof(Encoding), Encoding, EncodingType.UNSIGNED_BYTE, EncodingType.UNSIGNED_SHORT, EncodingType.FLOAT);
+            SourceBufferView.ValidateBufferUsageData(result);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.MAT4);
             result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.MAT4);
 
 
             var matrices = this.AsMatrix4x4Array();
             var matrices = this.AsMatrix4x4Array();
@@ -528,6 +528,18 @@ namespace SharpGLTF.Schema2
             }
             }
         }
         }
 
 
+        internal void ValidateAnimationInput(Validation.ValidationContext result)
+        {
+            SourceBufferView.ValidateBufferUsageData(result);
+            result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.SCALAR);
+        }
+
+        internal void ValidateAnimationOutput(Validation.ValidationContext result)
+        {
+            SourceBufferView.ValidateBufferUsageData(result);
+            result.CheckLinkMustBeAnyOf(nameof(Dimensions), Dimensions, DimensionType.SCALAR, DimensionType.VEC3, DimensionType.VEC4);
+        }
+
         #endregion
         #endregion
     }
     }
 
 

+ 17 - 2
src/SharpGLTF.Core/Schema2/gltf.Animations.cs

@@ -230,6 +230,14 @@ namespace SharpGLTF.Schema2
             foreach (var c in _channels) c.ValidateReferences(result);
             foreach (var c in _channels) c.ValidateReferences(result);
         }
         }
 
 
+        protected override void OnValidate(ValidationContext result)
+        {
+            base.OnValidate(result);
+
+            foreach (var s in _samplers) s.Validate(result);
+            foreach (var c in _channels) c.Validate(result);
+        }
+
         #endregion
         #endregion
     }
     }
 
 
@@ -741,8 +749,15 @@ namespace SharpGLTF.Schema2
         {
         {
             base.OnValidate(result);
             base.OnValidate(result);
 
 
-            // Input.ValidateAnimationInput();
-            // Output.ValidateAnimationOutput();
+            if (Output.Dimensions != DimensionType.SCALAR)
+            {
+                var outMult = InterpolationMode == AnimationInterpolationMode.CUBICSPLINE ? 3 : 1;
+
+                if (Input.Count * outMult != Output.Count) result.AddLinkError("Output", $"Input and Output count mismatch; Input: {Input.Count * outMult} Output:{Output.Count}");
+            }
+
+            Input.ValidateAnimationInput(result);
+            Output.ValidateAnimationOutput(result);
         }
         }
 
 
         #endregion
         #endregion

+ 12 - 1
src/SharpGLTF.Core/Schema2/gltf.BufferView.cs

@@ -254,7 +254,7 @@ namespace SharpGLTF.Schema2
             // if (this.DeviceBufferTarget.HasValue && this.FindAccessors().Any(item => item.IsSparse)) result.AddError()
             // if (this.DeviceBufferTarget.HasValue && this.FindAccessors().Any(item => item.IsSparse)) result.AddError()
         }
         }
 
 
-        internal void ValidateBufferUsage(Validation.ValidationContext result, BufferMode usingMode)
+        internal void ValidateBufferUsageGPU(Validation.ValidationContext result, BufferMode usingMode)
         {
         {
             result = result.GetContext(this);
             result = result.GetContext(this);
 
 
@@ -264,6 +264,17 @@ namespace SharpGLTF.Schema2
             result.AddLinkError("Device Buffer Target", $"is set as {this._target.Value}. But an accessor wants to use it as '{usingMode}'.");
             result.AddLinkError("Device Buffer Target", $"is set as {this._target.Value}. But an accessor wants to use it as '{usingMode}'.");
         }
         }
 
 
+        internal void ValidateBufferUsageData(Validation.ValidationContext result)
+        {
+            if (this.ByteStride != 0) result.AddLinkError("BufferView", "Unexpected ByteStride found. Expected 0");
+
+            result = result.GetContext(this);
+
+            if (!this._target.HasValue) return;
+
+            result.AddLinkError("Device Buffer Target", $"is set as {this._target.Value}. But an accessor wants to use it as a plain data buffer.");
+        }
+
         #endregion
         #endregion
 
 
     }
     }

+ 1 - 1
tests/SharpGLTF.Tests/TestFiles.cs

@@ -66,7 +66,7 @@ namespace SharpGLTF
         private static readonly string _BabylonJsMeshesDir;
         private static readonly string _BabylonJsMeshesDir;
         private static readonly string _BabylonJsPlaygroundDir;
         private static readonly string _BabylonJsPlaygroundDir;
 
 
-        private static readonly string[] _BabylonJsInvalidFiles = {"seagulf.glb" };
+        private static readonly string[] _BabylonJsInvalidFiles = { };
 
 
         private static string _GeneratedModelsDir;        
         private static string _GeneratedModelsDir;