Browse Source

*Breaking Change* Refactored Cesium Outline extension to its own library

vpenades 2 years ago
parent
commit
2617a3632d

+ 16 - 2
SharpGLTF.sln

@@ -52,9 +52,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.ThirdParty.Tests"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Trimmed.App", "tests\SharpGLTF.Trimmed.App\SharpGLTF.Trimmed.App.csproj", "{A09437F7-403C-44A2-B1FE-15CC535B64CA}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGLTF.Runtime", "src\SharpGLTF.Runtime\SharpGLTF.Runtime.csproj", "{E06015B0-8DBC-4DC9-81A2-605DAFE36821}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Runtime", "src\SharpGLTF.Runtime\SharpGLTF.Runtime.csproj", "{E06015B0-8DBC-4DC9-81A2-605DAFE36821}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGLTF.Runtime.Tests", "tests\SharpGLTF.Runtime.Tests\SharpGLTF.Runtime.Tests.csproj", "{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Runtime.Tests", "tests\SharpGLTF.Runtime.Tests\SharpGLTF.Runtime.Tests.csproj", "{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpGLTF.Cesium", "src\SharpGLTF.Cesium\SharpGLTF.Cesium.csproj", "{9FA2AFB3-B150-428D-9D6C-48F60010FFF3}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpGLTF.Cesium.Tests", "tests\SharpGLTF.Cesium.Tests\SharpGLTF.Cesium.Tests.csproj", "{94011062-791E-4D34-ACA8-09AAAD49B299}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -126,6 +130,14 @@ Global
 		{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9FA2AFB3-B150-428D-9D6C-48F60010FFF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FA2AFB3-B150-428D-9D6C-48F60010FFF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9FA2AFB3-B150-428D-9D6C-48F60010FFF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9FA2AFB3-B150-428D-9D6C-48F60010FFF3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{94011062-791E-4D34-ACA8-09AAAD49B299}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{94011062-791E-4D34-ACA8-09AAAD49B299}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{94011062-791E-4D34-ACA8-09AAAD49B299}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{94011062-791E-4D34-ACA8-09AAAD49B299}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -147,6 +159,8 @@ Global
 		{A09437F7-403C-44A2-B1FE-15CC535B64CA} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 		{E06015B0-8DBC-4DC9-81A2-605DAFE36821} = {072B725F-773F-4751-9616-E9778897C1D2}
 		{3925E45C-E7AA-4396-9567-4D8B1D1EF1C6} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
+		{9FA2AFB3-B150-428D-9D6C-48F60010FFF3} = {072B725F-773F-4751-9616-E9778897C1D2}
+		{94011062-791E-4D34-ACA8-09AAAD49B299} = {0CBF510D-D836-40BA-95EC-E93FDBB90632}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {1D7BBAD9-834C-4981-AC96-0AA5226FC43F}

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

@@ -60,6 +60,8 @@ namespace SharpGLTF
         /// </summary>
         public static string TargetProjectDirectory => "src\\SharpGLTF.Core\\Schema2\\Generated";
 
+        public static string CesiumProjectDirectory => "src\\SharpGLTF.Cesium\\Schema2\\Generated";
+
         /// <summary>
         /// namespace of the emitted generated code
         /// </summary>

+ 3 - 1
build/SharpGLTF.CodeGen/Ext.CESIUM_primitive_outline.cs

@@ -6,12 +6,14 @@ namespace SharpGLTF
 {
     class CesiumPrimitiveOutlineExtension : SchemaProcessor
     {
+        public override string GetTargetProject() { return Constants.CesiumProjectDirectory; }
+
         private static string RootSchemaUri => Constants.VendorExtensionPath("CESIUM_primitive_outline", "primitive.CESIUM_primitive_outline.schema.json");
 
         public override void PrepareTypes(CSharpEmitter newEmitter, SchemaType.Context ctx)
         {
             newEmitter.SetRuntimeName("CESIUM_primitive_outline glTF primitive extension", "CesiumPrimitiveOutline");
-        }
+        }        
 
         public override IEnumerable<(string TargetFileName, SchemaType.Context Schema)> Process()
         {

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

@@ -5,15 +5,8 @@ using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 
-using NJsonSchema.References;
-
-using JSONSCHEMA = NJsonSchema.JsonSchema;
-
 namespace SharpGLTF
 {
-    using CodeGen;
-    using SchemaReflection;    
-
     partial class Program
     {
         #region MAIN
@@ -62,14 +55,15 @@ namespace SharpGLTF
 
             // ----------------------------------------------  process all files
 
-            var processes = processors.SelectMany(item => item.Process());
-
-            foreach (var (targetFileName, schema) in processes)
+            foreach(var processor in processors)
             {
-                System.Console.WriteLine($"Emitting {targetFileName}...");
+                foreach(var (targetFileName, schema) in processor.Process())
+                {
+                    System.Console.WriteLine($"Emitting {targetFileName}...");
 
-                SchemaProcessing.EmitCodeFromSchema(targetFileName, schema, processors);
-            }
+                    SchemaProcessing.EmitCodeFromSchema(processor.GetTargetProject(), targetFileName, schema, processors);
+                }
+            }            
         }
 
         #endregion     

+ 2 - 2
build/SharpGLTF.CodeGen/SchemaProcessing.cs

@@ -75,7 +75,7 @@ namespace SharpGLTF
 
         #endregion
 
-        public static void EmitCodeFromSchema(string dstFile, SchemaType.Context ctx, IReadOnlyList<SchemaProcessor> extensions)
+        public static void EmitCodeFromSchema(string projectPath, string dstFile, SchemaType.Context ctx, IReadOnlyList<SchemaProcessor> extensions)
         {
             var newEmitter = new CSharpEmitter();
             newEmitter.DeclareContext(ctx);           
@@ -87,7 +87,7 @@ namespace SharpGLTF
 
             var textOut = newEmitter.EmitContext(ctx);
 
-            var dstDir = _FindTargetDirectory(Constants.TargetProjectDirectory);
+            var dstDir = _FindTargetDirectory(projectPath);
             var dstPath = System.IO.Path.Combine(dstDir, $"{dstFile}.cs");
 
             System.IO.File.WriteAllText(dstPath, textOut);

+ 2 - 0
build/SharpGLTF.CodeGen/SchemaProcessor.cs

@@ -6,6 +6,8 @@ namespace SharpGLTF
 {
     abstract class SchemaProcessor
     {
+        public virtual string GetTargetProject() { return Constants.TargetProjectDirectory; }
+
         public abstract IEnumerable<(string TargetFileName, SchemaReflection.SchemaType.Context Schema)> Process();
 
         public abstract void PrepareTypes(CodeGen.CSharpEmitter newEmitter, SchemaReflection.SchemaType.Context ctx);

+ 1 - 0
src/Directory.Build.props

@@ -26,6 +26,7 @@
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
     <InternalsVisibleTo Include="SharpGLTF.Core.Tests"/>
     <InternalsVisibleTo Include="SharpGLTF.Toolkit.Tests"/>
+    <InternalsVisibleTo Include="SharpGLTF.Cesium.Tests"/>
   </ItemGroup>
 
   <PropertyGroup>

+ 26 - 0
src/SharpGLTF.Cesium/Schema2/CesiumExtensions.cs

@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace SharpGLTF.Schema2
+{
+    /// <summary>
+    /// Extension methods for Cesium glTF Extensions
+    /// </summary>
+    public static partial class CesiumExtensions
+    {
+        private static bool _CesiumRegistered;
+
+        /// <summary>
+        /// This method most be called once at application's startup to register the extensions.
+        /// </summary>
+        public static void RegisterExtensions()
+        {
+            if (_CesiumRegistered) return;
+
+            _CesiumRegistered = true;
+
+            ExtensionsFactory.RegisterExtension<MeshPrimitive, CesiumPrimitiveOutline>("CESIUM_primitive_outline");
+        }
+    }
+}

+ 129 - 124
src/SharpGLTF.Core/Schema2/gltf.MeshPrimitive.CESIUM_primitive_outline.cs → src/SharpGLTF.Cesium/Schema2/Ext.CESIUM_primitive_outline.cs

@@ -1,124 +1,129 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-using SharpGLTF.Validation;
-
-namespace SharpGLTF.Schema2
-{
-    partial class CesiumPrimitiveOutline
-    {
-        private MeshPrimitive meshPrimitive;
-        internal CesiumPrimitiveOutline(MeshPrimitive meshPrimitive)
-        {
-            this.meshPrimitive = meshPrimitive;
-        }        
-
-        public Accessor Indices
-        {
-            get
-            {
-                return _indices.HasValue
-                    ? meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[_indices.Value]
-                    : null;
-            }
-            set
-            {
-                if (value == null) { _indices = null; return; }
-
-                _ValidateAccessor(meshPrimitive.LogicalParent.LogicalParent, value);
-
-                _indices = value.LogicalIndex;
-            }
-        }
-
-        protected override void OnValidateReferences(ValidationContext validate)
-        {
-            validate.IsNullOrIndex(nameof(Indices), this._indices, meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors);
-
-            base.OnValidateReferences(validate);
-        }
-
-        protected override void OnValidateContent(Validation.ValidationContext validate)
-        {
-            var outlineAccessor = meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[(int)_indices];
-            var isValid = _ValidateCesiumOutlineIndices(outlineAccessor, meshPrimitive);
-            validate.IsTrue(nameof(_indices), isValid, "Mismatch between accesor indices and MeshPrimitive indices");
-
-            base.OnValidateContent(validate);
-        }
-
-        internal static void _ValidateAccessor(ModelRoot model, Accessor accessor)
-        {
-            Guard.NotNull(accessor, nameof(accessor));
-            Guard.MustShareLogicalParent(model, "this", accessor, nameof(accessor));
-            Guard.IsTrue(accessor.Encoding == EncodingType.UNSIGNED_INT, nameof(accessor));
-            Guard.IsTrue(accessor.Dimensions == DimensionType.SCALAR, nameof(accessor));
-            Guard.IsFalse(accessor.Normalized, nameof(accessor));
-        }
-
-        /// <summary>
-        /// Checks if all the indices of the Cesium outline accessor are within the range of in the MeshPrimitive indices
-        /// </summary>
-        /// <param name="accessor">Cesium outline accessor</param>
-        /// <param name="meshPrimitive">MeshPrimitive with the CESIUM_primitive_outline extension</param>
-        /// <returns>true all indices are available, false indices are missing </returns>
-        private static bool _ValidateCesiumOutlineIndices(Accessor accessor, MeshPrimitive meshPrimitive)
-        {
-            var cesiumOutlineExtension = meshPrimitive.GetExtension<CesiumPrimitiveOutline>();
-            if (cesiumOutlineExtension != null)
-            {
-                var accessorIndices = accessor.AsIndicesArray();
-                var meshPrimitiveIndices = meshPrimitive.GetIndices();
-                var maxIndex = meshPrimitiveIndices.Max();
-
-                foreach (var _ in from accessorIndice in accessorIndices
-                                  let contains = accessorIndice <= maxIndex
-                                  where !contains
-                                  select new { })
-                {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-
-    partial class MeshPrimitive
-    {
-        /// <summary>
-        /// Sets Cesium outline vertex indices
-        /// </summary>
-        /// <param name="outlines">the list of vertex indices.</param>
-        /// <param name="accessorName">the name of the accessor to be created.</param>
-        public void SetCesiumOutline(IReadOnlyList<uint> outlines, string accessorName = "Cesium outlines")
-        {
-            Guard.NotNull(outlines, nameof(outlines));
-
-            // create and fill data
-
-            var dstData = new Byte[outlines.Count * 4];
-            var dstArray = new Memory.IntegerArray(dstData, IndexEncodingType.UNSIGNED_INT);
-            for (int i = 0; i < outlines.Count; ++i) { dstArray[i] = outlines[i]; }
-
-            var model = this.LogicalParent.LogicalParent;
-
-            var bview = model.UseBufferView(dstData);
-            var accessor = model.CreateAccessor(accessorName);
-
-            accessor.SetData(bview, 0, dstArray.Count, DimensionType.SCALAR, EncodingType.UNSIGNED_INT, false);
-
-            SetCesiumOutline(accessor);
-        }
-
-        public void SetCesiumOutline(Accessor accessor)
-        {
-            if (accessor == null) { RemoveExtensions<CesiumPrimitiveOutline>(); return; }
-
-            CesiumPrimitiveOutline._ValidateAccessor(this.LogicalParent.LogicalParent, accessor);
-
-            var ext = UseExtension<CesiumPrimitiveOutline>();
-            ext.Indices = accessor;
-        }
-    }
-}
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+using SharpGLTF.Validation;
+
+namespace SharpGLTF.Schema2
+{
+    partial class CesiumPrimitiveOutline
+    {
+        internal CesiumPrimitiveOutline(MeshPrimitive meshPrimitive)
+        {
+            this.meshPrimitive = meshPrimitive;
+        }
+
+        private MeshPrimitive meshPrimitive;
+
+        public Accessor Indices
+        {
+            get
+            {
+                return _indices.HasValue
+                    ? meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[_indices.Value]
+                    : null;
+            }
+            set
+            {
+                if (value == null) { _indices = null; return; }
+
+                _ValidateAccessor(meshPrimitive.LogicalParent.LogicalParent, value);
+
+                _indices = value.LogicalIndex;
+            }
+        }
+
+        #region validation
+
+        protected override void OnValidateReferences(ValidationContext validate)
+        {
+            validate.IsNullOrIndex(nameof(Indices), this._indices, meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors);
+
+            base.OnValidateReferences(validate);
+        }
+
+        protected override void OnValidateContent(ValidationContext validate)
+        {
+            var outlineAccessor = meshPrimitive.LogicalParent.LogicalParent.LogicalAccessors[(int)_indices];
+            var isValid = _ValidateCesiumOutlineIndices(outlineAccessor, meshPrimitive);
+            validate.IsTrue(nameof(_indices), isValid, "Mismatch between accesor indices and MeshPrimitive indices");
+
+            base.OnValidateContent(validate);
+        }
+
+        internal static void _ValidateAccessor(ModelRoot model, Accessor accessor)
+        {
+            Guard.NotNull(accessor, nameof(accessor));
+            Guard.MustShareLogicalParent(model, "this", accessor, nameof(accessor));
+            Guard.IsTrue(accessor.Encoding == EncodingType.UNSIGNED_INT, nameof(accessor));
+            Guard.IsTrue(accessor.Dimensions == DimensionType.SCALAR, nameof(accessor));
+            Guard.IsFalse(accessor.Normalized, nameof(accessor));
+        }
+
+        /// <summary>
+        /// Checks if all the indices of the Cesium outline accessor are within the range of in the MeshPrimitive indices
+        /// </summary>
+        /// <param name="accessor">Cesium outline accessor</param>
+        /// <param name="meshPrimitive">MeshPrimitive with the CESIUM_primitive_outline extension</param>
+        /// <returns>true all indices are available, false indices are missing </returns>
+        private static bool _ValidateCesiumOutlineIndices(Accessor accessor, MeshPrimitive meshPrimitive)
+        {
+            var cesiumOutlineExtension = meshPrimitive.GetExtension<CesiumPrimitiveOutline>();
+            if (cesiumOutlineExtension != null)
+            {
+                var accessorIndices = accessor.AsIndicesArray();
+                var meshPrimitiveIndices = meshPrimitive.GetIndices();
+                var maxIndex = meshPrimitiveIndices.Max();
+
+                foreach (var _ in from accessorIndice in accessorIndices
+                                  let contains = accessorIndice <= maxIndex
+                                  where !contains
+                                  select new { })
+                {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        #endregion
+    }
+
+    partial class CesiumExtensions
+    {
+        /// <summary>
+        /// Sets Cesium outline vertex indices
+        /// </summary>
+        /// <param name="outlines">the list of vertex indices.</param>
+        /// <param name="accessorName">the name of the accessor to be created.</param>
+        public static void SetCesiumOutline(this MeshPrimitive primitive, IReadOnlyList<uint> outlines, string accessorName = "Cesium outlines")
+        {
+            Guard.NotNull(outlines, nameof(outlines));
+
+            // create and fill data
+
+            var dstData = new Byte[outlines.Count * 4];
+            var dstArray = new Memory.IntegerArray(dstData, IndexEncodingType.UNSIGNED_INT);
+            for (int i = 0; i < outlines.Count; ++i) { dstArray[i] = outlines[i]; }
+
+            var model = primitive.LogicalParent.LogicalParent;
+
+            var bview = model.UseBufferView(dstData);
+            var accessor = model.CreateAccessor(accessorName);
+
+            accessor.SetData(bview, 0, dstArray.Count, DimensionType.SCALAR, EncodingType.UNSIGNED_INT, false);
+
+            primitive.SetCesiumOutline(accessor);
+        }
+
+        public static void SetCesiumOutline(this MeshPrimitive primitive, Accessor accessor)
+        {
+            if (accessor == null) { primitive.RemoveExtensions<CesiumPrimitiveOutline>(); return; }
+
+            CesiumPrimitiveOutline._ValidateAccessor(primitive.LogicalParent.LogicalParent, accessor);
+
+            var ext = primitive.UseExtension<CesiumPrimitiveOutline>();
+            ext.Indices = accessor;
+        }
+    }
+}

+ 56 - 56
src/SharpGLTF.Core/Schema2/Generated/Ext.CESIUM_primitive_outline.g.cs → src/SharpGLTF.Cesium/Schema2/Generated/Ext.CESIUM_primitive_outline.g.cs

@@ -1,56 +1,56 @@
-// <auto-generated/>
-
-//------------------------------------------------------------------------------------------------
-//      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 System.Text.Json;
-
-namespace SharpGLTF.Schema2
-{
-	using Collections;
-
-	/// <summary>
-	/// glTF extension for indicating that some edges of a primitive's triangles should be outlined.
-	/// </summary>
-	partial class CesiumPrimitiveOutline : ExtraProperties
-	{
-	
-		private Int32? _indices;
-		
-	
-		protected override void SerializeProperties(Utf8JsonWriter writer)
-		{
-			base.SerializeProperties(writer);
-			SerializeProperty(writer, "indices", _indices);
-		}
-	
-		protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
-		{
-			switch (jsonPropertyName)
-			{
-				case "indices": _indices = DeserializePropertyValue<Int32?>(ref reader); break;
-				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
-			}
-		}
-	
-	}
-
-}
+// <auto-generated/>
+
+//------------------------------------------------------------------------------------------------
+//      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 System.Text.Json;
+
+namespace SharpGLTF.Schema2
+{
+	using Collections;
+
+	/// <summary>
+	/// glTF extension for indicating that some edges of a primitive's triangles should be outlined.
+	/// </summary>
+	partial class CesiumPrimitiveOutline : ExtraProperties
+	{
+	
+		private Int32? _indices;
+		
+	
+		protected override void SerializeProperties(Utf8JsonWriter writer)
+		{
+			base.SerializeProperties(writer);
+			SerializeProperty(writer, "indices", _indices);
+		}
+	
+		protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
+		{
+			switch (jsonPropertyName)
+			{
+				case "indices": _indices = DeserializePropertyValue<Int32?>(ref reader); break;
+				default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
+			}
+		}
+	
+	}
+
+}

+ 23 - 0
src/SharpGLTF.Cesium/SharpGLTF.Cesium.csproj

@@ -0,0 +1,23 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>netstandard2.0;netstandard2.1;net6.0</TargetFrameworks>
+    <AssemblyName>SharpGLTF.Cesium</AssemblyName>
+    <RootNamespace>SharpGLTF</RootNamespace>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="..\Shared\Guard.cs" Link="Diagnostics\Guard.cs" />
+    <Compile Include="..\Shared\_Extensions.cs" Link="_Extensions.cs" />    
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\SharpGLTF.Core\SharpGLTF.Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Folder Include="Schema2\Generated\" />
+  </ItemGroup>
+
+</Project>

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

@@ -49,8 +49,6 @@ namespace SharpGLTF.Schema2
             RegisterExtension<ModelRoot, AgiRootStkMetadata>("AGI_stk_metadata");
             RegisterExtension<Node, AgiNodeArticulations>("AGI_articulations");
             RegisterExtension<Node, AgiNodeStkMetadata>("AGI_stk_metadata");
-
-            RegisterExtension<MeshPrimitive, CesiumPrimitiveOutline>("CESIUM_primitive_outline");
         }
 
         #endregion

+ 1 - 0
src/build-alpha.cmd

@@ -4,6 +4,7 @@ set VERSIONSUFFIX=alpha0031
 echo Building %VERSIONSUFFIX%
 
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% SharpGLTF.Core\SharpGLTF.Core.csproj
+dotnet build -c:Release --version-suffix %VERSIONSUFFIX% SharpGLTF.Cesium\SharpGLTF.Cesium.csproj
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% SharpGLTF.Runtime\SharpGLTF.Runtime.csproj
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% SharpGLTF.Toolkit\SharpGLTF.Toolkit.csproj
 

+ 2 - 0
src/build-preview.cmd

@@ -8,12 +8,14 @@ set VERSIONSUFFIX=Preview-%TIMEKEY%
 echo Building 1.0.0-%VERSIONSUFFIX%
 
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% /p:Authors=vpenades SharpGLTF.Core\SharpGLTF.Core.csproj
+dotnet build -c:Release --version-suffix %VERSIONSUFFIX% /p:Authors=vpenades SharpGLTF.Cesium\SharpGLTF.Cesium.csproj
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% /p:Authors=vpenades SharpGLTF.Runtime\SharpGLTF.Runtime.csproj
 dotnet build -c:Release --version-suffix %VERSIONSUFFIX% /p:Authors=vpenades SharpGLTF.Toolkit\SharpGLTF.Toolkit.csproj
 
 set /p DUMMY=Hit ENTER to publish nuget packages on Github...
 
 dotnet nuget push "SharpGLTF.Core/bin/Release/SharpGLTF.Core.1.0.0-%VERSIONSUFFIX%.nupkg" -s "github" --force-english-output
+dotnet nuget push "SharpGLTF.Cesium/bin/Release/SharpGLTF.Cesium.1.0.0-%VERSIONSUFFIX%.nupkg" -s "github" --force-english-output
 dotnet nuget push "SharpGLTF.Runtime/bin/Release/SharpGLTF.Runtime.1.0.0-%VERSIONSUFFIX%.nupkg" -s "github" --force-english-output
 dotnet nuget push "SharpGLTF.Toolkit/bin/Release/SharpGLTF.Toolkit.1.0.0-%VERSIONSUFFIX%.nupkg" -s "github" --force-english-output
 

+ 60 - 0
tests/SharpGLTF.Cesium.Tests/CesiumTests.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Linq;
+using System.Numerics;
+using System.Collections.Generic;
+
+using NUnit.Framework;
+
+using SharpGLTF.Schema2;
+using SharpGLTF.Geometry;
+using SharpGLTF.Geometry.VertexTypes;
+using SharpGLTF.Materials;
+using SharpGLTF.Validation;
+using SharpGLTF.Scenes;
+
+namespace SharpGLTF
+{
+
+    [Category("Cesium")]
+    public partial class CesiumTests
+    {
+        [SetUp]
+        public void SetUp()
+        {
+            CesiumExtensions.RegisterExtensions();
+        }
+
+        [Test(Description = "Creates a simple triangle with Cesium outlining")]
+        public void CreateCesiumOutlineTriangleScene()
+        {
+            TestContext.CurrentContext.AttachGltfValidatorLinks();
+
+            var material = MaterialBuilder.CreateDefault();
+
+            var mesh = new MeshBuilder<VertexPosition>("mesh");
+
+            var prim = mesh.UsePrimitive(material);
+            prim.AddTriangle(new VertexPosition(-10, 0, 0), new VertexPosition(10, 0, 0), new VertexPosition(0, 10, 0));
+
+            var scene = new SceneBuilder();
+
+            scene.AddRigidMesh(mesh, Matrix4x4.Identity);
+
+            var model = scene.ToGltf2();
+
+            var outlines = new uint[] { 0, 1, 1, 2, 2, 0};            
+            model.LogicalMeshes[0].Primitives[0].SetCesiumOutline(outlines);
+
+            var cesiumOutlineExtension = (CesiumPrimitiveOutline)model.LogicalMeshes[0].Primitives[0].Extensions.FirstOrDefault();
+            Assert.NotNull(cesiumOutlineExtension.Indices);
+            CollectionAssert.AreEqual(outlines, cesiumOutlineExtension.Indices.AsIndicesArray());
+
+            var ctx = new ValidationResult(model, ValidationMode.Strict, true);
+            model.ValidateContent(ctx.GetContext());
+
+            scene.AttachToCurrentTest("cesium_outline_triangle.glb");
+            scene.AttachToCurrentTest("cesium_outline_triangle.gltf");
+            scene.AttachToCurrentTest("cesium_outline_triangle.plotly");
+        }
+    }
+}

+ 23 - 0
tests/SharpGLTF.Cesium.Tests/SharpGLTF.Cesium.Tests.csproj

@@ -0,0 +1,23 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFrameworks>net471;net6.0-windows</TargetFrameworks>
+    <IsPackable>false</IsPackable>
+    <RootNamespace>SharpGLTF</RootNamespace>
+    <LangVersion>latest</LangVersion>
+  </PropertyGroup>  
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\src\SharpGLTF.Cesium\SharpGLTF.Cesium.csproj" />
+    <ProjectReference Include="..\SharpGLTF.NUnit\SharpGLTF.NUnit.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="NUnit3TestAdapter" Version="4.5.0">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
+  </ItemGroup>
+
+</Project>

+ 0 - 35
tests/SharpGLTF.Toolkit.Tests/Scenes/SceneBuilderTests.cs

@@ -10,8 +10,6 @@ using SharpGLTF.Geometry;
 using SharpGLTF.Geometry.VertexTypes;
 using SharpGLTF.Geometry.Parametric;
 using SharpGLTF.Materials;
-using System.Diagnostics;
-using System.Collections.ObjectModel;
 using SharpGLTF.Validation;
 
 namespace SharpGLTF.Scenes
@@ -25,39 +23,6 @@ namespace SharpGLTF.Scenes
     [Category("Toolkit.Scenes")]
     public partial class SceneBuilderTests
     {
-        [Test(Description = "Creates a simple triangle with Cesium outlining")]
-        public void CreateCesiumOutlineTriangleScene()
-        {
-            TestContext.CurrentContext.AttachGltfValidatorLinks();
-
-            var material = MaterialBuilder.CreateDefault();
-
-            var mesh = new MeshBuilder<VertexPosition>("mesh");
-
-            var prim = mesh.UsePrimitive(material);
-            prim.AddTriangle(new VertexPosition(-10, 0, 0), new VertexPosition(10, 0, 0), new VertexPosition(0, 10, 0));
-
-            var scene = new SceneBuilder();
-
-            scene.AddRigidMesh(mesh, Matrix4x4.Identity);
-
-            var model = scene.ToGltf2();
-
-            var outlines = new uint[] { 0, 1, 1, 2, 2, 0};            
-            model.LogicalMeshes[0].Primitives[0].SetCesiumOutline(outlines);
-
-            var cesiumOutlineExtension = (CesiumPrimitiveOutline)model.LogicalMeshes[0].Primitives[0].Extensions.FirstOrDefault();
-            Assert.NotNull(cesiumOutlineExtension.Indices);
-            CollectionAssert.AreEqual(outlines, cesiumOutlineExtension.Indices.AsIndicesArray());
-
-            var ctx = new ValidationResult(model, ValidationMode.Strict, true);
-            model.ValidateContent(ctx.GetContext());
-
-            scene.AttachToCurrentTest("cesium_outline_triangle.glb");
-            scene.AttachToCurrentTest("cesium_outline_triangle.gltf");
-            scene.AttachToCurrentTest("cesium_outline_triangle.plotly");
-        }
-
         [Test(Description ="Creates a simple cube.")]
         public void CreateCubeScene()
         {