Skip to content

Commit

Permalink
Merge pull request #55 from B3zaleel/implement-gltf-extensions-writing
Browse files Browse the repository at this point in the history
Implement glTF extensions writing
  • Loading branch information
B3zaleel authored Oct 12, 2024
2 parents 49fb1b3 + b8aff2a commit 93ad30a
Show file tree
Hide file tree
Showing 44 changed files with 2,848 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ThreeDModels.Format.Gltf.Elements;
using ThreeDModels.Format.Gltf.IO;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonReaderHelpers;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonWriterHelpers;

namespace ThreeDModels.Format.Gltf.Extensions;

Expand Down Expand Up @@ -88,6 +89,41 @@ public class AdobeMaterialsClearcoatTintExtension : IGltfExtension

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (parentType != typeof(Material))
{
throw new InvalidDataException("ADOBE_materials_clearcoat_tint must be used in a Material.");
}
var adobeMaterialsClearcoatTint = (ADOBE_materials_clearcoat_tint?)element;
if (adobeMaterialsClearcoatTint == null)
{
jsonWriter.WriteNullValue();
return;
}
if (adobeMaterialsClearcoatTint.ClearcoatTintFactor != null && adobeMaterialsClearcoatTint.ClearcoatTintFactor.Length != 3)
{
throw new InvalidDataException("ADOBE_materials_clearcoat_tint.clearcoatTintFactor must have 3 items.");
}
jsonWriter.WriteStartObject();
if (adobeMaterialsClearcoatTint.ClearcoatTintFactor != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.ADOBE_materials_clearcoat_tint.ClearcoatTintFactor);
WriteFloatList(ref jsonWriter, context, adobeMaterialsClearcoatTint.ClearcoatTintFactor.ToList());
}
if (adobeMaterialsClearcoatTint.ClearcoatTintTexture != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.ADOBE_materials_clearcoat_tint.ClearcoatTintTexture);
TextureInfoSerialization.Write(ref jsonWriter, context, adobeMaterialsClearcoatTint.ClearcoatTintTexture);
}
if (adobeMaterialsClearcoatTint.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<ADOBE_materials_clearcoat_tint>(ref jsonWriter, context, adobeMaterialsClearcoatTint.Extensions);
}
if (adobeMaterialsClearcoatTint.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, adobeMaterialsClearcoatTint.Extras);
}
jsonWriter.WriteEndObject();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,36 @@ public class AdobeMaterialsThinTransparencyExtension : IGltfExtension

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (parentType != typeof(Gltf))
{
throw new InvalidDataException("ADOBE_materials_thin_transparency must be used in a Gltf root.");
}
var adobeMaterialsThinTransparency = (ADOBE_materials_thin_transparency?)element;
if (adobeMaterialsThinTransparency == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName(ElementName.Extensions.ADOBE_materials_thin_transparency.TransmissionFactor);
jsonWriter.WriteNumberValue(adobeMaterialsThinTransparency.TransmissionFactor);
if (adobeMaterialsThinTransparency.TransmissionTexture != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.ADOBE_materials_thin_transparency.TransmissionTexture);
TextureInfoSerialization.Write(ref jsonWriter, context, adobeMaterialsThinTransparency.TransmissionTexture);
}
jsonWriter.WritePropertyName(ElementName.Extensions.ADOBE_materials_thin_transparency.Ior);
jsonWriter.WriteNumberValue(adobeMaterialsThinTransparency.Ior);
if (adobeMaterialsThinTransparency.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<ADOBE_materials_thin_transparency>(ref jsonWriter, context, adobeMaterialsThinTransparency.Extensions);
}
if (adobeMaterialsThinTransparency.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, adobeMaterialsThinTransparency.Extras);
}
jsonWriter.WriteEndObject();
}
}
126 changes: 121 additions & 5 deletions src/ThreeDModels/Format/Gltf/Extensions/AGI_articulations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ThreeDModels.Format.Gltf.Elements;
using ThreeDModels.Format.Gltf.IO;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonReaderHelpers;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonWriterHelpers;

namespace ThreeDModels.Format.Gltf.Extensions;

Expand Down Expand Up @@ -197,7 +198,71 @@ public class AgiArticulationsExtension : IGltfExtension

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (parentType == typeof(Gltf))
{
var agiArticulations = (AGI_articulations?)element;
if (agiArticulations == null)
{
jsonWriter.WriteNullValue();
return;
}
if (agiArticulations.Articulations != null && agiArticulations.Articulations.Count == 0)
{
throw new InvalidDataException("AGI_articulations.articulations must contain at least one articulation.");
}
jsonWriter.WriteStartObject();
if (agiArticulations.Articulations != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.Articulations);
WriteList(ref jsonWriter, context, agiArticulations.Articulations, AgiArticulationSerialization.Write);
}
if (agiArticulations.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AGI_articulations>(ref jsonWriter, context, agiArticulations.Extensions);
}
if (agiArticulations.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiArticulations.Extras);
}
jsonWriter.WriteEndObject();
}
else if (parentType == typeof(Node))
{
var agiArticulationNode = (AgiArticulationNode?)element;
if (agiArticulationNode == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
if (agiArticulationNode.IsAttachPoint != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.IsAttachPoint);
jsonWriter.WriteBooleanValue((bool)agiArticulationNode.IsAttachPoint);
}
if (agiArticulationNode.ArticulationName != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.ArticulationName);
jsonWriter.WriteStringValue(agiArticulationNode.ArticulationName);
}
if (agiArticulationNode.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AgiArticulationNode>(ref jsonWriter, context, agiArticulationNode.Extensions);
}
if (agiArticulationNode.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiArticulationNode.Extras);
}
jsonWriter.WriteEndObject();
}
else
{
throw new InvalidDataException("AGI_articulations must be used in either a Gltf root or a Node.");
}
}
}

Expand Down Expand Up @@ -267,9 +332,34 @@ public class AgiArticulationSerialization
};
}

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
public static void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, AgiArticulation? agiArticulation)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (agiArticulation == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName(ElementName.Accessor.Name);
jsonWriter.WriteStringValue(agiArticulation.Name);
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.AgiArticulation.Stages);
WriteList(ref jsonWriter, context, agiArticulation.Stages, AgiArticulationStageSerialization.Write);
if (agiArticulation.PointingVector != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.AgiArticulation.PointingVector);
WriteFloatList(ref jsonWriter, context, agiArticulation.PointingVector.ToList());
}
if (agiArticulation.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AgiArticulation>(ref jsonWriter, context, agiArticulation.Extensions);
}
if (agiArticulation.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiArticulation.Extras);
}
jsonWriter.WriteEndObject();
}
}

Expand Down Expand Up @@ -351,8 +441,34 @@ public class AgiArticulationStageSerialization
};
}

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
public static void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, AgiArticulationStage? agiArticulationStage)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (agiArticulationStage == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName(ElementName.Accessor.Name);
jsonWriter.WriteStringValue(agiArticulationStage.Name);
jsonWriter.WritePropertyName(ElementName.Accessor.Type);
jsonWriter.WriteStringValue(agiArticulationStage.Type);
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.AgiArticulationStage.MinimumValue);
jsonWriter.WriteNumberValue(agiArticulationStage.MinimumValue);
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.AgiArticulationStage.MaximumValue);
jsonWriter.WriteNumberValue(agiArticulationStage.MaximumValue);
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_articulations.AgiArticulationStage.InitialValue);
jsonWriter.WriteNumberValue(agiArticulationStage.InitialValue);
if (agiArticulationStage.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AgiArticulationStage>(ref jsonWriter, context, agiArticulationStage.Extensions);
}
if (agiArticulationStage.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiArticulationStage.Extras);
}
jsonWriter.WriteEndObject();
}
}
91 changes: 88 additions & 3 deletions src/ThreeDModels/Format/Gltf/Extensions/AGI_stk_metadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using ThreeDModels.Format.Gltf.Elements;
using ThreeDModels.Format.Gltf.IO;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonReaderHelpers;
using static ThreeDModels.Format.Gltf.IO.Utf8JsonWriterHelpers;

namespace ThreeDModels.Format.Gltf.Extensions;

Expand Down Expand Up @@ -164,7 +165,71 @@ public class AgiStkMetadataExtension : IGltfExtension

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (parentType == typeof(Gltf))
{
var agiStkMetadata = (AGI_stk_metadata?)element;
if (agiStkMetadata == null)
{
jsonWriter.WriteNullValue();
return;
}
if (agiStkMetadata.SolarPanelGroups != null && agiStkMetadata.SolarPanelGroups.Count == 0)
{
throw new InvalidDataException("AGI_stk_metadata.solarPanelGroups must contain at least one solar panel group.");
}
jsonWriter.WriteStartObject();
if (agiStkMetadata.SolarPanelGroups != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_stk_metadata.SolarPanelGroups);
WriteList(ref jsonWriter, context, agiStkMetadata.SolarPanelGroups, AgiStkSolarPanelGroupSerialization.Write);
}
if (agiStkMetadata.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AGI_stk_metadata>(ref jsonWriter, context, agiStkMetadata.Extensions);
}
if (agiStkMetadata.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiStkMetadata.Extras);
}
jsonWriter.WriteEndObject();
}
else if (parentType == typeof(Node))
{
var agiStkMetadataNode = (AgiStkMetadataNode?)element;
if (agiStkMetadataNode == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
if (agiStkMetadataNode.SolarPanelGroupName != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_stk_metadata.SolarPanelGroupName);
jsonWriter.WriteStringValue(agiStkMetadataNode.SolarPanelGroupName);
}
if (agiStkMetadataNode.NoObscuration != null)
{
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_stk_metadata.NoObscuration);
jsonWriter.WriteBooleanValue((bool)agiStkMetadataNode.NoObscuration);
}
if (agiStkMetadataNode.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AgiStkMetadataNode>(ref jsonWriter, context, agiStkMetadataNode.Extensions);
}
if (agiStkMetadataNode.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiStkMetadataNode.Extras);
}
jsonWriter.WriteEndObject();
}
else
{
throw new InvalidDataException("AGI_stk_metadata must be used in either a Gltf root or a Node.");
}
}
}

Expand Down Expand Up @@ -228,8 +293,28 @@ public class AgiStkSolarPanelGroupSerialization
};
}

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
public static void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, AgiStkSolarPanelGroup? agiStkSolarPanelGroup)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (agiStkSolarPanelGroup == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName(ElementName.Accessor.Name);
jsonWriter.WriteStringValue(agiStkSolarPanelGroup.Name);
jsonWriter.WritePropertyName(ElementName.Extensions.AGI_stk_metadata.AgiStkSolarPanelGroup.Efficiency);
jsonWriter.WriteNumberValue(agiStkSolarPanelGroup.Efficiency);
if (agiStkSolarPanelGroup.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<AgiStkSolarPanelGroup>(ref jsonWriter, context, agiStkSolarPanelGroup.Extensions);
}
if (agiStkSolarPanelGroup.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, agiStkSolarPanelGroup.Extras);
}
jsonWriter.WriteEndObject();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,32 @@ public class CesiumPrimitiveOutlineExtension : IGltfExtension

public void Write(ref Utf8JsonWriter jsonWriter, GltfWriterContext context, Type parentType, object? element)
{
throw new NotImplementedException(/* TODO: Implement this*/);
if (parentType != typeof(MeshPrimitive))
{
throw new InvalidDataException("CESIUM_primitive_outline must be used in a MeshPrimitive.");
}
var cesiumPrimitiveOutline = (CESIUM_primitive_outline?)element;
if (cesiumPrimitiveOutline == null)
{
jsonWriter.WriteNullValue();
return;
}
jsonWriter.WriteStartObject();
if (cesiumPrimitiveOutline.Indices != null)
{
jsonWriter.WritePropertyName(ElementName.AccessorSparse.Indices);
jsonWriter.WriteNumberValue((int)cesiumPrimitiveOutline.Indices);
}
if (cesiumPrimitiveOutline.Extensions != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extensions);
ExtensionsSerialization.Write<CESIUM_primitive_outline>(ref jsonWriter, context, cesiumPrimitiveOutline.Extensions);
}
if (cesiumPrimitiveOutline.Extras != null)
{
jsonWriter.WritePropertyName(ElementName.Gltf.Extras);
JsonSerialization.Write(ref jsonWriter, context, cesiumPrimitiveOutline.Extras);
}
jsonWriter.WriteEndObject();
}
}
Loading

0 comments on commit 93ad30a

Please sign in to comment.