Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add Cesium ext_instance_features #201

Merged
merged 17 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion build/SharpGLTF.CodeGen/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ static class Constants
/// </summary>
public static string LocalRepoDirectory => System.IO.Path.Combine(ProgramDirectory, "glTF");


#endregion

#region main schema paths
Expand Down
33 changes: 33 additions & 0 deletions build/SharpGLTF.CodeGen/Ext.EXT_InstanceFeatures.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using SharpGLTF.CodeGen;
using SharpGLTF.SchemaReflection;
using System.Collections.Generic;

namespace SharpGLTF
{
class ExtInstanceFeaturesExtension : SchemaProcessor
{
public override string GetTargetProject() { return Constants.CesiumProjectDirectory; }

private static string NodeSchemaUri => Constants.CustomExtensionsPath("EXT_instance_features", "node.EXT_instance_features.schema.json");

public override void PrepareTypes(CSharpEmitter newEmitter, SchemaType.Context ctx)
{
newEmitter.SetRuntimeName("EXT_instance_features glTF Node extension", "MeshExtInstanceFeatures");
newEmitter.SetRuntimeName("Feature ID in EXT_instance_features", "MeshExtInstanceFeatureID");
}

public override IEnumerable<(string TargetFileName, SchemaType.Context Schema)> Process()
{
yield return ("Ext.CESIUM_ext_instance_features.g", ProcessNode());
}

private static SchemaType.Context ProcessNode()
{
var ctx = SchemaProcessing.LoadSchemaContext(NodeSchemaUri);
ctx.IgnoredByCodeEmitter("glTF Property");
ctx.IgnoredByCodeEmitter("glTF Child of Root Property");
ctx.IgnoredByCodeEmitter("Texture Info");
return ctx;
}
}
}
2 changes: 2 additions & 0 deletions build/SharpGLTF.CodeGen/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ static void Main(string[] args)

processors.Add(new ExtMeshFeaturesExtension());

processors.Add(new ExtInstanceFeaturesExtension());

// ---------------------------------------------- process all files

foreach (var processor in processors)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# EXT_instance_features

This directory contains schema's for Cesium extension
EXT_instance_features

Specs: https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_instance_features

Schema's are copied from https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_instance_features/schema
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "featureId.schema.json",
"title": "Feature ID in EXT_instance_features",
"type": "object",
"description": "Feature IDs stored in a GPU mesh instancing attribute",
"allOf": [
{
"$ref": "glTFProperty.schema.json"
}
],
"properties": {
"featureCount": {
"type": "integer",
"minimum": 1,
"description": "The number of unique features in the attribute."
},
"nullFeatureId": {
"type": "integer",
"minimum": 0,
"description": "A value that indicates that no feature is associated with this instance."
},
"label": {
"type": "string",
"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$",
"description": "A label assigned to this feature ID set. Labels must be alphanumeric identifiers matching the regular expression `^[a-zA-Z_][a-zA-Z0-9_]*$`."
},
"attribute": {
"description": "An attribute containing feature IDs. When this is omitted, then the feature IDs are assigned to the GPU instances by their index.",
"$ref": "featureIdAttribute.schema.json"
},
"propertyTable": {
"type": "integer",
"minimum": 0,
"description": "The index of the property table containing per-feature property values. Only applicable when using the `EXT_structural_metadata` extension."
},
"extensions": {},
"extras": {}
},
"required": [
"featureCount"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "featureIdAttribute.schema.json",
"title": "Feature ID Attribute in EXT_instance_features",
"type": "integer",
"minimum": 0,
"description": "An integer value used to construct a string in the format `_FEATURE_ID_<set index>` which is a reference to a key in `EXT_mesh_gpu_instancing.attributes` dictionary (e.g. a value of `0` corresponds to `_FEATURE_ID_0`)."
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "node.EXT_instance_features.schema.json",
"title": "EXT_instance_features glTF Node extension",
"type": "object",
"description": "An object describing per-instance feature IDs.",
"allOf": [
{
"$ref": "glTFProperty.schema.json"
}
],
"properties": {
"featureIds": {
"type": "array",
"description": "An array of feature ID sets.",
"minItems": 1,
"items": {
"$ref": "featureId.schema.json"
}
},
"extensions": {},
"extras": {}
},
"required": [
"featureIds"
]
}
12 changes: 12 additions & 0 deletions build/SharpGLTF.CodeGen/SharpGLTF.CodeGen.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,16 @@
</None>
</ItemGroup>

<ItemGroup>
<None Update="Schemas\EXT_instance_features\schema\featureId.schema.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Schemas\EXT_instance_features\schema\featureIdAttribute.schema.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Schemas\EXT_instance_features\schema\node.EXT_instance_features.schema.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions src/SharpGLTF.Cesium/Schema2/CesiumExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public static void RegisterExtensions()
_CesiumRegistered = true;

ExtensionsFactory.RegisterExtension<MeshPrimitive, CesiumPrimitiveOutline>("CESIUM_primitive_outline");
ExtensionsFactory.RegisterExtension<Node, MeshExtInstanceFeatures>("EXT_instance_features");
ExtensionsFactory.RegisterExtension<MeshPrimitive, MeshExtMeshFeatures>("EXT_mesh_features");

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
// <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>
/// Feature IDs stored in a GPU mesh instancing attribute
/// </summary>
#if NET6_0_OR_GREATER
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
#endif
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
partial class MeshExtInstanceFeatureID : ExtraProperties
{

private Int32? _attribute;

private const Int32 _featureCountMinimum = 1;
private Int32 _featureCount;

private String _label;

private const Int32 _nullFeatureIdMinimum = 0;
private Int32? _nullFeatureId;

private const Int32 _propertyTableMinimum = 0;
private Int32? _propertyTable;


protected override void SerializeProperties(Utf8JsonWriter writer)
{
base.SerializeProperties(writer);
SerializeProperty(writer, "attribute", _attribute);
SerializeProperty(writer, "featureCount", _featureCount);
SerializeProperty(writer, "label", _label);
SerializeProperty(writer, "nullFeatureId", _nullFeatureId);
SerializeProperty(writer, "propertyTable", _propertyTable);
}

protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
{
switch (jsonPropertyName)
{
case "attribute": _attribute = DeserializePropertyValue<Int32?>(ref reader); break;
case "featureCount": _featureCount = DeserializePropertyValue<Int32>(ref reader); break;
case "label": _label = DeserializePropertyValue<String>(ref reader); break;
case "nullFeatureId": _nullFeatureId = DeserializePropertyValue<Int32?>(ref reader); break;
case "propertyTable": _propertyTable = DeserializePropertyValue<Int32?>(ref reader); break;
default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
}
}

}

/// <summary>
/// An object describing per-instance feature IDs.
/// </summary>
#if NET6_0_OR_GREATER
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
#endif
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("SharpGLTF.CodeGen", "1.0.0.0")]
partial class MeshExtInstanceFeatures : ExtraProperties
{

private const int _featureIdsMinItems = 1;
private List<MeshExtInstanceFeatureID> _featureIds;


protected override void SerializeProperties(Utf8JsonWriter writer)
{
base.SerializeProperties(writer);
SerializeProperty(writer, "featureIds", _featureIds, _featureIdsMinItems);
}

protected override void DeserializeProperty(string jsonPropertyName, ref Utf8JsonReader reader)
{
switch (jsonPropertyName)
{
case "featureIds": DeserializePropertyList<MeshExtInstanceFeatureID>(ref reader, _featureIds); break;
default: base.DeserializeProperty(jsonPropertyName,ref reader); break;
}
}

}

}
Loading
Loading