Browse Source

WIP with DDS extension

Vicente Penades 6 years ago
parent
commit
aee0c53155

+ 4 - 0
build/SharpGLTF.CodeGen/Constants.cs

@@ -25,12 +25,16 @@ namespace SharpGLTF
 
 
 
 
         public static string KhronosSchemaDir => System.IO.Path.Combine(Constants.LocalRepoDirectory, "extensions", "2.0", "Khronos");
         public static string KhronosSchemaDir => System.IO.Path.Combine(Constants.LocalRepoDirectory, "extensions", "2.0", "Khronos");
+        public static string VendorSchemaDir => System.IO.Path.Combine(Constants.LocalRepoDirectory, "extensions", "2.0", "Vendor");
+
         public static string KhronosDracoSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_draco_mesh_compression", "schema");
         public static string KhronosDracoSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_draco_mesh_compression", "schema");
         public static string KhronosPbrSpecGlossSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_materials_pbrSpecularGlossiness", "schema", "glTF.KHR_materials_pbrSpecularGlossiness.schema.json");
         public static string KhronosPbrSpecGlossSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_materials_pbrSpecularGlossiness", "schema", "glTF.KHR_materials_pbrSpecularGlossiness.schema.json");
         public static string KhronosUnlitSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_materials_unlit", "schema", "glTF.KHR_materials_unlit.schema.json");
         public static string KhronosUnlitSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_materials_unlit", "schema", "glTF.KHR_materials_unlit.schema.json");
         public static string KhronosModelLightsPunctualSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_lights_punctual", "schema", "glTF.KHR_lights_punctual.schema.json");
         public static string KhronosModelLightsPunctualSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_lights_punctual", "schema", "glTF.KHR_lights_punctual.schema.json");
         public static string KhronosNodeLightsPunctualSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_lights_punctual", "schema", "node.KHR_lights_punctual.schema.json");
         public static string KhronosNodeLightsPunctualSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_lights_punctual", "schema", "node.KHR_lights_punctual.schema.json");
         public static string KhronosTextureTransformSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_texture_transform", "schema", "KHR_texture_transform.textureInfo.schema.json");
         public static string KhronosTextureTransformSchemaFile => System.IO.Path.Combine(KhronosSchemaDir, "KHR_texture_transform", "schema", "KHR_texture_transform.textureInfo.schema.json");
+        
+        public static string MicrosoftTextureDDSSchemaFile => System.IO.Path.Combine(VendorSchemaDir, "MSFT_texture_dds", "schema", "glTF.MSFT_texture_dds.schema.json");
 
 
 
 
         /// <summary>
         /// <summary>

+ 13 - 0
build/SharpGLTF.CodeGen/Program.cs

@@ -26,6 +26,7 @@ namespace SharpGLTF
             _ProcessKhronosModelLightsPunctualExtension();
             _ProcessKhronosModelLightsPunctualExtension();
             _ProcessKhronosNodeLightsPunctualExtension();
             _ProcessKhronosNodeLightsPunctualExtension();
             _ProcessKhronosTextureTransformExtension();
             _ProcessKhronosTextureTransformExtension();
+            _ProcessMicrosoftTextureDDSExtension();
 
 
             // these extansions are not fully supported and temporarily removed:
             // these extansions are not fully supported and temporarily removed:
             // _ProcessDracoExtension();
             // _ProcessDracoExtension();
@@ -162,6 +163,14 @@ namespace SharpGLTF
             ProcessSchema("ext.TextureTransform.g", ctx);
             ProcessSchema("ext.TextureTransform.g", ctx);
         }
         }
 
 
+        private static void _ProcessMicrosoftTextureDDSExtension()
+        {
+            var ctx = LoadSchemaContext(Constants.MicrosoftTextureDDSSchemaFile);
+            ctx.IgnoredByCodeEmitter("glTF Property");
+
+            ProcessSchema("ext.MSFT.textureDDS.g", ctx);
+        }
+
         #endregion
         #endregion
 
 
         #region code generation
         #region code generation
@@ -211,11 +220,15 @@ namespace SharpGLTF
             newEmitter.SetRuntimeName("KHR_materials_pbrSpecularGlossiness glTF extension", "MaterialPBRSpecularGlossiness");
             newEmitter.SetRuntimeName("KHR_materials_pbrSpecularGlossiness glTF extension", "MaterialPBRSpecularGlossiness");
             newEmitter.SetRuntimeName("KHR_materials_unlit glTF extension", "MaterialUnlit");
             newEmitter.SetRuntimeName("KHR_materials_unlit glTF extension", "MaterialUnlit");
 
 
+            
+
             newEmitter.SetRuntimeName("light", "PunctualLight");
             newEmitter.SetRuntimeName("light", "PunctualLight");
             newEmitter.SetRuntimeName("light/spot", "PunctualLightSpot");
             newEmitter.SetRuntimeName("light/spot", "PunctualLightSpot");
 
 
             newEmitter.SetRuntimeName("KHR_texture_transform textureInfo extension", "TextureTransform");
             newEmitter.SetRuntimeName("KHR_texture_transform textureInfo extension", "TextureTransform");
 
 
+            newEmitter.SetRuntimeName("MSFT_texture_dds extension", "MSFTTextureDDS");
+
             var classes = ctx.Classes.ToArray();
             var classes = ctx.Classes.ToArray();
             var fields = classes.SelectMany(item => item.Fields).ToArray();
             var fields = classes.SelectMany(item => item.Fields).ToArray();
 
 

+ 56 - 0
src/SharpGLTF.Core/Schema2/Generated/ext.MSFT.textureDDS.g.cs

@@ -0,0 +1,56 @@
+//------------------------------------------------------------------------------------------------
+//      This file has been programatically generated; DON´T EDIT!
+//------------------------------------------------------------------------------------------------
+
+#pragma warning disable SA1001
+#pragma warning disable SA1027
+#pragma warning disable SA1028
+#pragma warning disable SA1121
+#pragma warning disable SA1205
+#pragma warning disable SA1309
+#pragma warning disable SA1402
+#pragma warning disable SA1505
+#pragma warning disable SA1507
+#pragma warning disable SA1508
+#pragma warning disable SA1652
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Numerics;
+using Newtonsoft.Json;
+
+namespace SharpGLTF.Schema2
+{
+	using Collections;
+
+	/// <summary>
+	/// glTF extension to specify textures using the DirectDraw Surface file format (DDS).
+	/// </summary>
+	partial class MSFTTextureDDS : ExtraProperties
+	{
+	
+		private Int32? _source;
+		
+	
+		/// <inheritdoc />
+		protected override void SerializeProperties(JsonWriter writer)
+		{
+			base.SerializeProperties(writer);
+			SerializeProperty(writer, "source", _source);
+		}
+	
+		/// <inheritdoc />
+		protected override void DeserializeProperty(string property, JsonReader reader)
+		{
+			switch (property)
+			{
+				case "source": _source = DeserializePropertyValue<Int32?>(reader); break;
+				default: base.DeserializeProperty(property, reader); break;
+			}
+		}
+	
+	}
+
+}

+ 34 - 0
src/SharpGLTF.Core/Schema2/glb.Images.cs

@@ -16,9 +16,11 @@ namespace SharpGLTF.Schema2
         const string EMBEDDEDGLTFBUFFER = "data:application/gltf-buffer;base64,";
         const string EMBEDDEDGLTFBUFFER = "data:application/gltf-buffer;base64,";
         const string EMBEDDEDJPEGBUFFER = "data:image/jpeg;base64,";
         const string EMBEDDEDJPEGBUFFER = "data:image/jpeg;base64,";
         const string EMBEDDEDPNGBUFFER = "data:image/png;base64,";
         const string EMBEDDEDPNGBUFFER = "data:image/png;base64,";
+        const string EMBEDDEDDDSBUFFER = "data:image/vnd-ms.dds;base64,";
 
 
         const string MIMEPNG = "image/png";
         const string MIMEPNG = "image/png";
         const string MIMEJPEG = "image/jpeg";
         const string MIMEJPEG = "image/jpeg";
+        const string MIMEDDS = "image/vnd-ms.dds";
 
 
         #endregion
         #endregion
 
 
@@ -66,6 +68,11 @@ namespace SharpGLTF.Schema2
         /// </summary>
         /// </summary>
         public bool IsJpeg => _IsJpeg(GetImageContent());
         public bool IsJpeg => _IsJpeg(GetImageContent());
 
 
+        /// <summary>
+        /// Gets a value indicating whether the contained image is a DDS image.
+        /// </summary>
+        public bool IsDds => _IsDDS(GetImageContent());
+
         #endregion
         #endregion
 
 
         #region API
         #region API
@@ -88,6 +95,15 @@ namespace SharpGLTF.Schema2
             return true;
             return true;
         }
         }
 
 
+        private static bool _IsDDS(IReadOnlyList<Byte> data)
+        {
+            if (data[0] != 0x44) return false;
+            if (data[1] != 0x44) return false;
+            if (data[2] != 0x53) return false;
+            if (data[3] != 0x20) return false;
+            return true;
+        }
+
         /// <summary>
         /// <summary>
         /// Retrieves the image file as a block of bytes.
         /// Retrieves the image file as a block of bytes.
         /// </summary>
         /// </summary>
@@ -134,6 +150,7 @@ namespace SharpGLTF.Schema2
 
 
             if (_IsPng(content)) imageType = MIMEPNG; // these strings might be wrong
             if (_IsPng(content)) imageType = MIMEPNG; // these strings might be wrong
             if (_IsJpeg(content)) imageType = MIMEJPEG; // these strings might be wrong
             if (_IsJpeg(content)) imageType = MIMEJPEG; // these strings might be wrong
+            if (_IsDDS(content)) imageType = MIMEDDS; // these strings might be wrong
 
 
             if (imageType == null) throw new ArgumentException($"{nameof(content)} must be a PNG or JPG image", nameof(content));
             if (imageType == null) throw new ArgumentException($"{nameof(content)} must be a PNG or JPG image", nameof(content));
 
 
@@ -181,6 +198,7 @@ namespace SharpGLTF.Schema2
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDOCTETSTREAM)
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDOCTETSTREAM)
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDJPEGBUFFER)
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDJPEGBUFFER)
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDPNGBUFFER)
                 ?? uri._TryParseBase64Unchecked(EMBEDDEDPNGBUFFER)
+                ?? uri._TryParseBase64Unchecked(EMBEDDEDDDSBUFFER)
                 ?? externalReferenceSolver.Invoke(uri).ToArray();
                 ?? externalReferenceSolver.Invoke(uri).ToArray();
         }
         }
 
 
@@ -211,6 +229,13 @@ namespace SharpGLTF.Schema2
                 return;
                 return;
             }
             }
 
 
+            if (_IsDDS(_SatelliteImageContent))
+            {
+                _mimeType = MIMEDDS;
+                _uri = EMBEDDEDDDSBUFFER + mimeContent;
+                return;
+            }
+
             throw new NotImplementedException();
             throw new NotImplementedException();
         }
         }
 
 
@@ -239,6 +264,14 @@ namespace SharpGLTF.Schema2
                 return;
                 return;
             }
             }
 
 
+            if (_IsDDS(_SatelliteImageContent))
+            {
+                _mimeType = null;
+                _uri = satelliteUri += ".dds";
+                writer(_uri, new ArraySegment<byte>(_SatelliteImageContent));
+                return;
+            }
+
             throw new NotImplementedException();
             throw new NotImplementedException();
         }
         }
 
 
@@ -248,6 +281,7 @@ namespace SharpGLTF.Schema2
 
 
             if (_IsPng(GetImageContent())) { _mimeType = MIMEPNG; return; }
             if (_IsPng(GetImageContent())) { _mimeType = MIMEPNG; return; }
             if (_IsJpeg(GetImageContent())) { _mimeType = MIMEJPEG; return; }
             if (_IsJpeg(GetImageContent())) { _mimeType = MIMEJPEG; return; }
+            if (_IsDDS(GetImageContent())) { _mimeType = MIMEDDS; return; }
 
 
             throw new NotImplementedException();
             throw new NotImplementedException();
         }
         }

+ 2 - 0
src/SharpGLTF.Core/Schema2/gltf.ExtensionsFactory.cs

@@ -24,6 +24,8 @@ namespace SharpGLTF.Schema2
             RegisterExtension<Node, KHR_lights_punctualnodeextension>("KHR_lights_punctual");
             RegisterExtension<Node, KHR_lights_punctualnodeextension>("KHR_lights_punctual");
 
 
             RegisterExtension<TextureInfo, TextureTransform>("KHR_texture_transform");
             RegisterExtension<TextureInfo, TextureTransform>("KHR_texture_transform");
+
+            RegisterExtension<Texture, MSFTTextureDDS>("MSFT_texture_dds");
         }
         }
 
 
         #endregion
         #endregion