diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs new file mode 100644 index 000000000..dba1d4b00 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs @@ -0,0 +1,53 @@ +using System; +using UniJSON; + +namespace UniGLTF +{ + /// + /// https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_emissive_strength + /// + [Serializable] + public class glTF_KHR_materials_emissive_strength + { + public const string ExtensionName = "KHR_materials_emissive_strength"; + public static readonly Utf8String ExtensionNameUtf8 = Utf8String.From(ExtensionName); + public float emissiveStrength = 1.0f; + + static glTF_KHR_materials_emissive_strength Deserialize(JsonNode json) + { + var extension = new glTF_KHR_materials_emissive_strength(); + if (json.TryGet(nameof(emissiveStrength), out JsonNode found)) + { + extension.emissiveStrength = found.GetSingle(); + } + return extension; + } + + public static bool TryGet(glTFExtension src, out glTF_KHR_materials_emissive_strength extension) + { + if (src is UniGLTF.glTFExtensionImport extensions) + { + foreach (var kv in extensions.ObjectItems()) + { + if (kv.Key.GetUtf8String() == ExtensionNameUtf8) + { + extension = Deserialize(kv.Value); + return true; + } + } + } + extension = default; + return false; + } + + public static void Serialize(ref glTFExtension materialExtensions, float value) + { + var f = new JsonFormatter(); + f.BeginMap(); + f.Key(nameof(emissiveStrength)); + f.Value(value); + f.EndMap(); + glTFExtensionExport.GetOrCreate(ref materialExtensions).Add(ExtensionName, f.GetStore().Bytes); + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs.meta new file mode 100644 index 000000000..71528af32 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/Format/ExtensionsAndExtras/KHR_materials_emissive_strength.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d6a65b35aabda73408a522a2ef8e6a13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfExportSettings.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfExportSettings.cs index b35cfe965..1407cebfd 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfExportSettings.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfExportSettings.cs @@ -37,11 +37,6 @@ namespace UniGLTF #endif ; - /// - /// VRMC_materials_hdr_emissiveMultiplier - /// - public bool UseEmissiveMultiplier; - /// /// Keep VertexColor /// diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPbrMaterialImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPbrMaterialImporter.cs index c3500eeb3..526a7faed 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPbrMaterialImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/GltfPbrMaterialImporter.cs @@ -136,7 +136,11 @@ namespace UniGLTF if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) { var emissiveFactor = src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear); - if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, + if (UniGLTF.glTF_KHR_materials_emissive_strength.TryGet(src.extensions, out UniGLTF.glTF_KHR_materials_emissive_strength emissiveStrength)) + { + emissiveFactor *= emissiveStrength.emissiveStrength; + } + else if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, out UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier. VRMC_materials_hdr_emissiveMultiplier ex)) { diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialExporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialExporter.cs index 1fab2d3b1..92a95ff26 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialExporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/MaterialExporter.cs @@ -23,7 +23,7 @@ namespace UniGLTF // common params material.name = m.name; Export_Color(m, textureExporter, material); - Export_Emission(m, textureExporter, material, settings.UseEmissiveMultiplier); + Export_Emission(m, textureExporter, material); Export_Normal(m, textureExporter, material); Export_OcclusionMetallicRoughness(m, textureExporter, material); @@ -154,7 +154,7 @@ namespace UniGLTF } } - static void Export_Emission(Material m, ITextureExporter textureExporter, glTFMaterial material, bool useEmissiveMultiplier) + static void Export_Emission(Material m, ITextureExporter textureExporter, glTFMaterial material) { if (m.IsKeywordEnabled("_EMISSION") == false) { @@ -168,14 +168,7 @@ namespace UniGLTF { var maxColorComponent = color.maxColorComponent; color /= maxColorComponent; - if (useEmissiveMultiplier) - { - UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfSerializer.SerializeTo(ref material.extensions, - new Extensions.VRMC_materials_hdr_emissiveMultiplier.VRMC_materials_hdr_emissiveMultiplier - { - EmissiveMultiplier = maxColorComponent, - }); - } + UniGLTF.glTF_KHR_materials_emissive_strength.Serialize(ref material.extensions, maxColorComponent); } material.emissiveFactor = color.ToFloat3(ColorSpace.Linear, ColorSpace.Linear); } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs index ab61c3053..e9996cfac 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MaterialIO/URP/GltfPbrURPMaterialImporter.cs @@ -110,7 +110,12 @@ namespace UniGLTF if (src.emissiveFactor != null && src.emissiveFactor.Length == 3) { var emissiveFactor = src.emissiveFactor.ToColor3(ColorSpace.Linear, ColorSpace.Linear); - if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, + if (UniGLTF.glTF_KHR_materials_emissive_strength.TryGet(src.extensions, + out UniGLTF.glTF_KHR_materials_emissive_strength emissiveStrength)) + { + emissiveFactor *= emissiveStrength.emissiveStrength; + } + else if (UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.GltfDeserializer.TryGet(src.extensions, out UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.VRMC_materials_hdr_emissiveMultiplier ex)) { emissiveFactor *= ex.EmissiveMultiplier.Value; @@ -175,7 +180,7 @@ namespace UniGLTF matDesc = new MaterialDescriptor( GltfMaterialDescriptorGenerator.GetMaterialName(i, src), - ShaderName, + ShaderName, null, textureSlots, floatValues,