Add Extension parent context
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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:
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace ReFuel.Gltf
|
||||
Name = name;
|
||||
}
|
||||
|
||||
public object ParseExtensionObject(JsonElement element)
|
||||
public object ParseExtensionObject(GltfObjectKind parent, JsonElement element)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<T>(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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user