diff --git a/ReFuel.Gltf/Extensions/KhrMaterialsEmissiveStrength.cs b/ReFuel.Gltf/Extensions/KhrMaterialsEmissiveStrength.cs new file mode 100644 index 0000000..2e49d53 --- /dev/null +++ b/ReFuel.Gltf/Extensions/KhrMaterialsEmissiveStrength.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.Json; + +namespace ReFuel.Gltf.Extensions; + +struct KhrMaterialsEmissiveStrengthExtension +{ + public double EmissiveStrenght; + + public KhrMaterialsEmissiveStrengthExtension(double emissiveStrenght) + { + EmissiveStrenght = emissiveStrenght; + } +} + +public sealed class KhrMaterialsEmissiveStrengthExtensionProvider : IGltfExtensionProvider +{ + public string Name => "KHR_materials_emissive_strength"; + + public object ParseExtensionObject(GltfObjectKind parent, JsonElement element) + { + ArgumentOutOfRangeException.ThrowIfNotEqual(parent, GltfObjectKind.Material); + if (!element.TryGetProperty("emissiveStrength", out var property) || !property.TryGetDouble(out double d)) + { + d = 1.0; + } + + return new KhrMaterialsEmissiveStrengthExtension(d); + } + + public void WriteExtensionObject(object obj, Utf8JsonWriter writer) + { + throw new NotImplementedException(); + } +} diff --git a/ReFuel.Gltf/GltfCollection.cs b/ReFuel.Gltf/GltfCollection.cs index 4bf252d..8469f07 100755 --- a/ReFuel.Gltf/GltfCollection.cs +++ b/ReFuel.Gltf/GltfCollection.cs @@ -16,7 +16,7 @@ namespace ReFuel.Gltf this.extensionMode = extensionMode; } - public void Parse(JsonElement collection) + public void Parse(GltfObjectKind parent, JsonElement collection) { if (collection.ValueKind != JsonValueKind.Object) throw new Exception("Expected a JSON object."); @@ -25,7 +25,7 @@ namespace ReFuel.Gltf { if (extensionMode && GltfDocument.TryGetExtensionProvider(property.Name, out IGltfExtensionProvider? provider)) { - Add(property.Name, provider.ParseExtensionObject(property.Value)); + Add(property.Name, provider.ParseExtensionObject(parent, property.Value)); continue; } @@ -33,7 +33,7 @@ namespace ReFuel.Gltf { case JsonValueKind.Array: GltfList list = new GltfList(); - list.Parse(property.Value); + list.Parse(parent, property.Value); Add(property.Name, list); break; case JsonValueKind.False: @@ -58,7 +58,7 @@ namespace ReFuel.Gltf break; case JsonValueKind.Object: GltfCollection child = new GltfCollection(extensionMode); - child.Parse(property.Value); + child.Parse(parent, property.Value); Add(property.Name, child); break; case JsonValueKind.True: @@ -79,7 +79,7 @@ namespace ReFuel.Gltf { } - public void Parse(JsonElement collection) + public void Parse(GltfObjectKind parent, JsonElement collection) { if (collection.ValueKind != JsonValueKind.Array) throw new Exception("Expected a JSON array."); @@ -90,7 +90,7 @@ namespace ReFuel.Gltf { case JsonValueKind.Array: GltfList list = new GltfList(); - list.Parse(element); + list.Parse(parent, element); Add(list); break; case JsonValueKind.False: @@ -115,7 +115,7 @@ namespace ReFuel.Gltf break; case JsonValueKind.Object: GltfCollection child = new GltfCollection(false); - child.Parse(element); + child.Parse(parent, element); Add(child); break; case JsonValueKind.True: diff --git a/ReFuel.Gltf/GltfDocument.cs b/ReFuel.Gltf/GltfDocument.cs index 16b39b4..1be3147 100755 --- a/ReFuel.Gltf/GltfDocument.cs +++ b/ReFuel.Gltf/GltfDocument.cs @@ -293,8 +293,8 @@ namespace ReFuel.Gltf { switch (name) { - case "extension": Extension.Parse(element); break; - case "extra": Extras.Parse(element); break; + case "extension": Extension.Parse(Kind, element); break; + case "extra": Extras.Parse(Kind, element); break; case "scenes": AssertArray(element, "scenes"); foreach (JsonElement child in element.EnumerateArray()) diff --git a/ReFuel.Gltf/GltfEmptyExtensionProvider.cs b/ReFuel.Gltf/GltfEmptyExtensionProvider.cs index 37e9d24..4412314 100755 --- a/ReFuel.Gltf/GltfEmptyExtensionProvider.cs +++ b/ReFuel.Gltf/GltfEmptyExtensionProvider.cs @@ -14,7 +14,7 @@ namespace ReFuel.Gltf Name = name; } - public object ParseExtensionObject(JsonElement element) + public object ParseExtensionObject(GltfObjectKind parent, JsonElement element) { throw new NotSupportedException(); } diff --git a/ReFuel.Gltf/GltfObject.cs b/ReFuel.Gltf/GltfObject.cs index 5964218..5af5733 100755 --- a/ReFuel.Gltf/GltfObject.cs +++ b/ReFuel.Gltf/GltfObject.cs @@ -47,11 +47,11 @@ namespace ReFuel.Gltf { if (element.TryGetProperty("extras", out JsonElement extras)) { - Extras.Parse(extras); + Extras.Parse(Kind, extras); } if (element.TryGetProperty("extensions", out JsonElement extension)) { - Extension.Parse(extension); + Extension.Parse(Kind, extension); } } diff --git a/ReFuel.Gltf/GltfSerializedExtensionProvider.cs b/ReFuel.Gltf/GltfSerializedExtensionProvider.cs index d7e8cee..acaba27 100755 --- a/ReFuel.Gltf/GltfSerializedExtensionProvider.cs +++ b/ReFuel.Gltf/GltfSerializedExtensionProvider.cs @@ -16,14 +16,14 @@ namespace ReFuel.Gltf throw new Exception("This type is not JSON serializable."); } - public T ParseExtension(JsonElement element) + public T ParseExtension(GltfObjectKind parent, JsonElement element) { return JsonSerializer.Deserialize(element) ?? throw new Exception("Could not deserialize extension object."); } - public object ParseExtensionObject(JsonElement element) + public object ParseExtensionObject(GltfObjectKind parent, JsonElement element) { - return ParseExtension(element)!; + return ParseExtension(parent, element)!; } public void WriteExtension(T value, Utf8JsonWriter writer) diff --git a/ReFuel.Gltf/IGltfExtensionProvider.cs b/ReFuel.Gltf/IGltfExtensionProvider.cs index 2d8ad55..08ba209 100755 --- a/ReFuel.Gltf/IGltfExtensionProvider.cs +++ b/ReFuel.Gltf/IGltfExtensionProvider.cs @@ -7,7 +7,7 @@ namespace ReFuel.Gltf { string Name { get; } - object ParseExtensionObject(JsonElement element); + object ParseExtensionObject(GltfObjectKind parent, JsonElement element); void WriteExtensionObject(object obj, Utf8JsonWriter writer); } } \ No newline at end of file