From 72357e960041569d4eb817607a322ecb4586846a Mon Sep 17 00:00:00 2001 From: Ed Mackey Date: Mon, 15 Jul 2024 07:58:17 -0400 Subject: [PATCH] Diffuse transmission (again) (#544) * Define channel target as its own type so it can have extensions * Add `pointer` as an interpolation path enum case * WIP: Use dicts to store the original value when animating properties * Inline some functions * Update node-sass to 7.0 * Implement `AnimatableProperty` * Animate weights using `AnimatableProperty` * Clean up code * Unified animation for all channel targets * Animatable texture transforms * Move animatable property definitions to `gltfTextureInfo` * Implement `makeAnimatable` * Animatable node weights * Fix node weights * Define animatable properties for `KHR_materials_clearcoat` * Define animatable properties for `KHR_materials_iridescence` * Define animatable properties for `KHR_materials_specular` * Define animatable properties for `KHR_materials_transmission` * Define animatable properties for `KHR_materials_emissive_strength` * Define animatable properties for `KHR_materials_sheen` * Define animatable properties for `KHR_materials_volume` * Fix typo in camera export * Make camera properties animatable and break circular dependencies * Fix animation of normal scale and occlusion strength * Light conforms to glTF schema * Define animatable properties for punctual lights * Redirect pointer in case of punctual lights * Compute disjoint animations including animation pointer extension * Make camera properties animatable * Fix node and mesh weights * Correctly switch between node and mesh weights * Fix animated camera near/far plane issues * Fix a few bugs * Convert single-element array interpolants to scalars * Fix `json-ptr` import * Load `KHR_materials_diffuse_transmission` extension * Compute diffuse transmission for punctual lights # Conflicts: # source/Renderer/shaders/pbr.frag * Compute diffuse transmission based on IBL * Scale diffuse transmission by color factor * Add debug channels for diffuse transmission * Fix diffuse transmission texture * Fix diffuse transmission color texture * Use alpha channel for diffuse transmission texture * Fix diffuse transmission sampler name * Fix punctual light diffuse transmission * Add UI toggle for disabling diffuse transmission * Fix some merge issues * Revert a bunch of files that aren't part of diffuse_transmission Well except for material.js, which has a mixture of relevance. * Recover needed changes from material.js after revert. * Revert renderer.js except for diffuse transmission. * Revert 2 more files. * Hopefully the last few bad merge artifacts fixed here. * Fix issue with u_DiffuseTransmissionColorFactor * Fix enable switch * Allow diffuse transmission and volume to be active concurrently in UI * Apply volume attenuation, if applicable, to diffuse transmission * Fix some issues with diffuse transmission * Fix volume switch state in ui --------- Co-authored-by: Jim Eckerlein Co-authored-by: Mathias Kanzler Co-authored-by: David Labode --- app_web/index.html | 7 ++- app_web/src/logic/uimodel.js | 1 + app_web/src/main.js | 7 +++ app_web/src/ui/ui.js | 25 +++++--- source/GltfState/gltf_state.js | 11 ++++ source/Renderer/renderer.js | 4 ++ source/Renderer/shaders/material_info.glsl | 26 +++++++++ source/Renderer/shaders/pbr.frag | 66 +++++++++++++++++++--- source/Renderer/shaders/textures.glsl | 33 +++++++++++ source/gltf/material.js | 57 +++++++++++++++++++ 10 files changed, 218 insertions(+), 19 deletions(-) diff --git a/app_web/index.html b/app_web/index.html index 796c4c1c..a1de7704 100644 --- a/app_web/index.html +++ b/app_web/index.html @@ -397,10 +397,13 @@

Advanced Controls

KHR_materials_sheen + v-on:input="transmissionChanged.next($event.target.checked)" @input="transmissionTriggered($event.target.checked)"> KHR_materials_transmission + + KHR_materials_diffuse_transmission KHR_materials_volume KHR_materials_ior KHR_materials_specular diff --git a/app_web/src/logic/uimodel.js b/app_web/src/logic/uimodel.js index 100f8598..3dc98a1f 100644 --- a/app_web/src/logic/uimodel.js +++ b/app_web/src/logic/uimodel.js @@ -45,6 +45,7 @@ class UIModel this.clearcoatEnabled = app.clearcoatChanged.pipe(); this.sheenEnabled = app.sheenChanged.pipe(); this.transmissionEnabled = app.transmissionChanged.pipe(); + this.diffuseTransmissionEnabled = app.diffuseTransmissionChanged.pipe(); this.volumeEnabled = app.volumeChanged.pipe(); this.iorEnabled = app.iorChanged.pipe(); this.iridescenceEnabled = app.iridescenceChanged.pipe(); diff --git a/app_web/src/main.js b/app_web/src/main.js index e2202a8e..2a8ac70c 100644 --- a/app_web/src/main.js +++ b/app_web/src/main.js @@ -221,6 +221,13 @@ export default async () => { ); listenForRedraw(uiModel.transmissionEnabled); + uiModel.diffuseTransmissionEnabled.subscribe( + (diffuseTransmissionEnabled) => + (state.renderingParameters.enabledExtensions.KHR_materials_diffuse_transmission = + diffuseTransmissionEnabled) + ); + listenForRedraw(uiModel.diffuseTransmissionEnabled); + uiModel.volumeEnabled.subscribe( (volumeEnabled) => (state.renderingParameters.enabledExtensions.KHR_materials_volume = diff --git a/app_web/src/ui/ui.js b/app_web/src/ui/ui.js index 55869e45..1423f775 100644 --- a/app_web/src/ui/ui.js +++ b/app_web/src/ui/ui.js @@ -29,6 +29,7 @@ const appCreated = createApp({ clearcoatChanged: new Subject(), sheenChanged: new Subject(), transmissionChanged: new Subject(), + diffuseTransmissionChanged: new Subject(), cameraExport: new Subject(), captureCanvas: new Subject(), @@ -92,6 +93,7 @@ const appCreated = createApp({ volumeEnabled: true, iorEnabled: true, iridescenceEnabled: true, + diffuseTransmissionEnabled: true, anisotropyEnabled: true, dispersionEnabled: true, specularEnabled: true, @@ -105,7 +107,7 @@ const appCreated = createApp({ uiVisible: true, - // these are handls for certain ui change related things + // these are handles for certain ui change related things environmentVisiblePrefState: true, volumeEnabledPrefState: true, }; @@ -170,20 +172,26 @@ const appCreated = createApp({ this.renderEnvChanged.next(this.renderEnv); } }, - transmissionTriggered: function() + transmissionTriggered: function(value) { - if(this.transmissionEnabled == false) - { + if (value == false && this.diffuseTransmissionEnabled == false) { this.volumeEnabledPrefState = this.volumeEnabled; this.volumeEnabled = false; + } else if (value == true && this.diffuseTransmissionEnabled == false) { + this.volumeEnabled = this.volumeEnabledPrefState; } - else{ + }, + diffuseTransmissionTriggered: function(value) + { + if (value == false && this.transmissionEnabled == false) { + this.volumeEnabledPrefState = this.volumeEnabled; + this.volumeEnabled = false; + } else if (value == true && this.transmissionEnabled == false) { this.volumeEnabled = this.volumeEnabledPrefState; } }, collapseActiveTab : function(event, item) { - if (item === this.activeTab) - { + if (item === this.activeTab) { this.tabsHidden = !this.tabsHidden; if(this.tabsHidden) { @@ -200,8 +208,7 @@ const appCreated = createApp({ activeNavElement.classList.add('is-active'); } return; - } - else { + } else { // reset tab visibility this.tabsHidden = false; } diff --git a/source/GltfState/gltf_state.js b/source/GltfState/gltf_state.js index 24692001..ecea059c 100644 --- a/source/GltfState/gltf_state.js +++ b/source/GltfState/gltf_state.js @@ -55,6 +55,7 @@ class GltfState KHR_materials_specular: true, /** KHR_materials_iridescence adds a thin-film iridescence effect */ KHR_materials_iridescence: true, + KHR_materials_diffuse_transmission: true, /** KHR_materials_anisotropy defines microfacet grooves in the surface, stretching the specular reflection on the surface */ KHR_materials_anisotropy: true, /** KHR_materials_dispersion defines configuring the strength of the angular separation of colors (chromatic abberation)*/ @@ -202,6 +203,16 @@ GltfState.DebugOutput = { VOLUME_THICKNESS: "Volume Thickness", }, + /** output diffuse tranmission lighting */ + diffuseTransmission: { + /** output the combined diffuse tranmission */ + DIFFUSE_TRANSMISSION: "Diffuse Transmission", + /** output the diffuse tranmission factor */ + DIFFUSE_TRANSMISSION_FACTOR: "Diffuse Transmission Factor", + /** output the diffuse tranmission color factor */ + DIFFUSE_TRANSMISSION_COLOR_FACTOR: "Diffuse Transmission Color Factor", + }, + /** output iridescence */ iridescence: { /** output the combined iridescence */ diff --git a/source/Renderer/renderer.js b/source/Renderer/renderer.js index b72bbff3..109566ca 100644 --- a/source/Renderer/renderer.js +++ b/source/Renderer/renderer.js @@ -682,6 +682,10 @@ class gltfRenderer {debugOutput: GltfState.DebugOutput.transmission.TRANSMISSION_FACTOR, shaderDefine: "DEBUG_TRANSMISSION_FACTOR"}, {debugOutput: GltfState.DebugOutput.transmission.VOLUME_THICKNESS, shaderDefine: "DEBUG_VOLUME_THICKNESS"}, + {debugOutput: GltfState.DebugOutput.diffuseTransmission.DIFFUSE_TRANSMISSION, shaderDefine: "DEBUG_DIFFUSE_TRANSMISSION"}, + {debugOutput: GltfState.DebugOutput.diffuseTransmission.DIFFUSE_TRANSMISSION_FACTOR, shaderDefine: "DEBUG_DIFFUSE_TRANSMISSION_FACTOR"}, + {debugOutput: GltfState.DebugOutput.diffuseTransmission.DIFFUSE_TRANSMISSION_COLOR_FACTOR, shaderDefine: "DEBUG_DIFFUSE_TRANSMISSION_COLOR_FACTOR"}, + {debugOutput: GltfState.DebugOutput.iridescence.IRIDESCENCE, shaderDefine: "DEBUG_IRIDESCENCE"}, {debugOutput: GltfState.DebugOutput.iridescence.IRIDESCENCE_FACTOR, shaderDefine: "DEBUG_IRIDESCENCE_FACTOR"}, {debugOutput: GltfState.DebugOutput.iridescence.IRIDESCENCE_THICKNESS, shaderDefine: "DEBUG_IRIDESCENCE_THICKNESS"}, diff --git a/source/Renderer/shaders/material_info.glsl b/source/Renderer/shaders/material_info.glsl index d0f761a0..d5b0a003 100644 --- a/source/Renderer/shaders/material_info.glsl +++ b/source/Renderer/shaders/material_info.glsl @@ -34,6 +34,10 @@ uniform float u_IridescenceIor; uniform float u_IridescenceThicknessMinimum; uniform float u_IridescenceThicknessMaximum; +// Diffuse Transmission +uniform float u_DiffuseTransmissionFactor; +uniform vec3 u_DiffuseTransmissionColorFactor; + // Emissive Strength uniform float u_EmissiveStrength; @@ -97,6 +101,9 @@ struct MaterialInfo float iridescenceIor; float iridescenceThickness; + float diffuseTransmissionFactor; + vec3 diffuseTransmissionColorFactor; + // KHR_materials_anisotropy vec3 anisotropicT; vec3 anisotropicB; @@ -346,6 +353,25 @@ MaterialInfo getIridescenceInfo(MaterialInfo info) #endif +#ifdef MATERIAL_DIFFUSE_TRANSMISSION +MaterialInfo getDiffuseTransmissionInfo(MaterialInfo info) +{ + info.diffuseTransmissionFactor = u_DiffuseTransmissionFactor; + info.diffuseTransmissionColorFactor = u_DiffuseTransmissionColorFactor; + + #ifdef HAS_DIFFUSE_TRANSMISSION_MAP + info.diffuseTransmissionFactor *= texture(u_DiffuseTransmissionSampler, getDiffuseTransmissionUV()).a; + #endif + + #ifdef HAS_DIFFUSE_TRANSMISSION_COLOR_MAP + info.diffuseTransmissionColorFactor *= texture(u_DiffuseTransmissionColorSampler, getDiffuseTransmissionColorUV()).rgb; + #endif + + return info; +} +#endif + + #ifdef MATERIAL_CLEARCOAT MaterialInfo getClearCoatInfo(MaterialInfo info, NormalInfo normalInfo) { diff --git a/source/Renderer/shaders/pbr.frag b/source/Renderer/shaders/pbr.frag index f229a428..ae6a1c1e 100644 --- a/source/Renderer/shaders/pbr.frag +++ b/source/Renderer/shaders/pbr.frag @@ -100,6 +100,10 @@ void main() materialInfo = getIridescenceInfo(materialInfo); #endif +#ifdef MATERIAL_DIFFUSE_TRANSMISSION + materialInfo = getDiffuseTransmissionInfo(materialInfo); +#endif + #ifdef MATERIAL_ANISOTROPY materialInfo = getAnisotropyInfo(materialInfo, normalInfo); #endif @@ -123,9 +127,11 @@ void main() vec3 f_emissive = vec3(0.0); vec3 f_clearcoat = vec3(0.0); vec3 f_sheen = vec3(0.0); - vec3 f_transmission = vec3(0.0); + vec3 f_specular_transmission = vec3(0.0); + vec3 f_diffuse_transmission = vec3(0.0); float albedoSheenScaling = 1.0; + float diffuseTransmissionThickness = 1.0; #ifdef MATERIAL_IRIDESCENCE vec3 iridescenceFresnel = evalIridescence(1.0, materialInfo.iridescenceIor, NdotV, materialInfo.iridescenceThickness, materialInfo.f0); @@ -136,6 +142,13 @@ void main() } #endif +#ifdef MATERIAL_DIFFUSE_TRANSMISSION +#ifdef MATERIAL_VOLUME + diffuseTransmissionThickness = materialInfo.thickness * + (length(vec3(u_ModelMatrix[0].xyz)) + length(vec3(u_ModelMatrix[1].xyz)) + length(vec3(u_ModelMatrix[2].xyz))) / 3.0; +#endif +#endif + // Calculate lighting contribution from image based lighting source (IBL) #ifdef USE_IBL #ifdef MATERIAL_IRIDESCENCE @@ -149,6 +162,14 @@ void main() f_diffuse += getIBLRadianceLambertian(n, v, materialInfo.perceptualRoughness, materialInfo.c_diff, materialInfo.f0, materialInfo.specularWeight); #endif +#ifdef MATERIAL_DIFFUSE_TRANSMISSION + vec3 diffuseTransmissionIBL = getIBLRadianceLambertian(-n, -v, materialInfo.perceptualRoughness, materialInfo.diffuseTransmissionColorFactor, materialInfo.f0, materialInfo.specularWeight); +#ifdef MATERIAL_VOLUME + diffuseTransmissionIBL = applyVolumeAttenuation(diffuseTransmissionIBL, diffuseTransmissionThickness, materialInfo.attenuationColor, materialInfo.attenuationDistance); +#endif + f_diffuse_transmission += diffuseTransmissionIBL; +#endif + #ifdef MATERIAL_CLEARCOAT f_clearcoat += getIBLRadianceGGX(materialInfo.clearcoatNormal, v, materialInfo.clearcoatRoughness, materialInfo.clearcoatF0, 1.0); #endif @@ -160,7 +181,7 @@ void main() #endif #if defined(MATERIAL_TRANSMISSION) && defined(USE_IBL) - f_transmission += getIBLVolumeRefraction( + f_specular_transmission += getIBLVolumeRefraction( n, v, materialInfo.perceptualRoughness, materialInfo.c_diff, materialInfo.f0, materialInfo.f90, @@ -234,6 +255,8 @@ void main() #endif } + vec3 lightIntensity = getLighIntensity(light, pointToLight); + // BTDF (Bidirectional Transmittance Distribution Function) #ifdef MATERIAL_TRANSMISSION // If the light ray travels through the geometry, use the point it exits the geometry again. @@ -242,17 +265,28 @@ void main() pointToLight -= transmissionRay; l = normalize(pointToLight); - vec3 intensity = getLighIntensity(light, pointToLight); - vec3 transmittedLight = intensity * getPunctualRadianceTransmission(n, v, l, materialInfo.alphaRoughness, materialInfo.f0, materialInfo.f90, materialInfo.c_diff, materialInfo.ior); + vec3 transmittedLight = lightIntensity * getPunctualRadianceTransmission(n, v, l, materialInfo.alphaRoughness, materialInfo.f0, materialInfo.f90, materialInfo.c_diff, materialInfo.ior); #ifdef MATERIAL_VOLUME transmittedLight = applyVolumeAttenuation(transmittedLight, length(transmissionRay), materialInfo.attenuationColor, materialInfo.attenuationDistance); #endif - f_transmission += transmittedLight; + f_specular_transmission += transmittedLight; +#endif // MATERIAL_TRANSMISSION + +#ifdef MATERIAL_DIFFUSE_TRANSMISSION + vec3 lambertian = BRDF_lambertian(materialInfo.f0, materialInfo.f90, materialInfo.diffuseTransmissionColorFactor, materialInfo.specularWeight, clampedDot(v, normalize(-l + v))); + vec3 transmittedDiffuseLight = lightIntensity * clampedDot(-n, l) * lambertian; + +#ifdef MATERIAL_VOLUME + transmittedDiffuseLight = applyVolumeAttenuation(transmittedDiffuseLight, diffuseTransmissionThickness, materialInfo.attenuationColor, materialInfo.attenuationDistance); #endif + + f_diffuse_transmission += transmittedDiffuseLight; +#endif // MATERIAL_DIFFUSE_TRANSMISSION + } -#endif +#endif // USE_PUNCTUAL f_emissive = u_EmissiveFactor; #ifdef MATERIAL_EMISSIVE_STRENGTH @@ -293,8 +327,11 @@ void main() clearcoat *= clearcoatFactor; #endif +#ifdef MATERIAL_DIFFUSE_TRANSMISSION + diffuse = mix(diffuse, f_diffuse_transmission, materialInfo.diffuseTransmissionFactor); +#endif #ifdef MATERIAL_TRANSMISSION - diffuse = mix(diffuse, f_transmission, materialInfo.transmissionFactor); + diffuse = mix(diffuse, f_specular_transmission, materialInfo.transmissionFactor); #endif vec3 color = vec3(0); @@ -436,7 +473,7 @@ vec3 specularTexture = vec3(1.0); // Transmission, Volume: #ifdef MATERIAL_TRANSMISSION #if DEBUG == DEBUG_TRANSMISSION_VOLUME - g_finalColor.rgb = linearTosRGB(f_transmission * materialInfo.transmissionFactor); + g_finalColor.rgb = linearTosRGB(f_specular_transmission * materialInfo.transmissionFactor); #endif #if DEBUG == DEBUG_TRANSMISSION_FACTOR g_finalColor.rgb = vec3(materialInfo.transmissionFactor); @@ -478,5 +515,18 @@ vec3 specularTexture = vec3(1.0); g_finalColor.rgb = vec3(direction, 0.0); #endif +#endif + + // Diffuse Transmission: +#ifdef MATERIAL_DIFFUSE_TRANSMISSION +#if DEBUG == DEBUG_DIFFUSE_TRANSMISSION + g_finalColor.rgb = linearTosRGB(f_diffuse_transmission * vec3(materialInfo.diffuseTransmissionFactor)); +#endif +#if DEBUG == DEBUG_DIFFUSE_TRANSMISSION_FACTOR + g_finalColor.rgb = linearTosRGB(vec3(materialInfo.diffuseTransmissionFactor)); +#endif +#if DEBUG == DEBUG_DIFFUSE_TRANSMISSION_COLOR_FACTOR + g_finalColor.rgb = linearTosRGB(materialInfo.diffuseTransmissionColorFactor); +#endif #endif } diff --git a/source/Renderer/shaders/textures.glsl b/source/Renderer/shaders/textures.glsl index 3a20c1a5..95c37542 100644 --- a/source/Renderer/shaders/textures.glsl +++ b/source/Renderer/shaders/textures.glsl @@ -345,6 +345,39 @@ vec2 getIridescenceThicknessUV() #endif +// Diffuse Transmission + +#ifdef MATERIAL_DIFFUSE_TRANSMISSION + +uniform sampler2D u_DiffuseTransmissionSampler; +uniform int u_DiffuseTransmissionUVSet; +uniform mat3 u_DiffuseTransmissionUVTransform; + +uniform sampler2D u_DiffuseTransmissionColorSampler; +uniform int u_DiffuseTransmissionColorUVSet; +uniform mat3 u_DiffuseTransmissionColorUVTransform; + + +vec2 getDiffuseTransmissionUV() +{ + vec3 uv = vec3(u_DiffuseTransmissionUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); +#ifdef HAS_DIFFUSE_TRANSMISSION_UV_TRANSFORM + uv = u_DiffuseTransmissionUVTransform * uv; +#endif + return uv.xy; +} + +vec2 getDiffuseTransmissionColorUV() +{ + vec3 uv = vec3(u_DiffuseTransmissionColorUVSet < 1 ? v_texcoord_0 : v_texcoord_1, 1.0); +#ifdef HAS_DIFFUSE_TRANSMISSION_COLOR_UV_TRANSFORM + uv = u_DiffuseTransmissionColorUVTransform * uv; +#endif + return uv.xy; +} + +#endif + // Anisotropy #ifdef MATERIAL_ANISOTROPY diff --git a/source/gltf/material.js b/source/gltf/material.js index 756f2fe4..efa44ee9 100644 --- a/source/gltf/material.js +++ b/source/gltf/material.js @@ -22,6 +22,7 @@ class gltfMaterial extends GltfObject this.hasClearcoat = false; this.hasSheen = false; this.hasTransmission = false; + this.hasDiffuseTransmission = false; this.hasIOR = false; this.hasEmissiveStrength = false; this.hasVolume = false; @@ -79,6 +80,10 @@ class gltfMaterial extends GltfObject { defines.push("MATERIAL_TRANSMISSION 1"); } + if(this.hasDiffuseTransmission && renderingParameters.enabledExtensions.KHR_materials_diffuse_transmission) + { + defines.push("MATERIAL_DIFFUSE_TRANSMISSION 1"); + } if (this.hasVolume && renderingParameters.enabledExtensions.KHR_materials_volume) { defines.push("MATERIAL_VOLUME 1"); @@ -481,6 +486,36 @@ class gltfMaterial extends GltfObject this.properties.set("u_TransmissionFactor", transmissionFactor); } + // KHR Extension: Diffuse Transmission + if(this.extensions.KHR_materials_diffuse_transmission !== undefined) + { + const extension = this.extensions.KHR_materials_diffuse_transmission; + + this.hasDiffuseTransmission = true; + + let diffuseTransmissionColorFactor = jsToGl(extension.diffuseTransmissionColorFactor ?? [1.0, 1.0, 1.0]); + this.properties.set("u_DiffuseTransmissionFactor", extension.diffuseTransmissionFactor); + this.properties.set("u_DiffuseTransmissionColorFactor", diffuseTransmissionColorFactor); + + if (this.diffuseTransmissionTexture !== undefined) + { + this.diffuseTransmissionTexture.samplerName = "u_DiffuseTransmissionSampler"; + this.parseTextureInfoExtensions(this.diffuseTransmissionTexture, "DiffuseTransmission"); + this.textures.push(this.diffuseTransmissionTexture); + this.defines.push("HAS_DIFFUSE_TRANSMISSION_MAP 1"); + this.properties.set("u_DiffuseTransmissionUVSet", this.diffuseTransmissionTexture.texCoord); + } + + if (this.diffuseTransmissionColorTexture !== undefined) + { + this.diffuseTransmissionColorTexture.samplerName = "u_DiffuseTransmissionColorSampler"; + this.parseTextureInfoExtensions(this.diffuseTransmissionColorTexture, "DiffuseTransmissionColor"); + this.textures.push(this.diffuseTransmissionColorTexture); + this.defines.push("HAS_DIFFUSE_TRANSMISSION_COLOR_MAP 1"); + this.properties.set("u_DiffuseTransmissionColorUVSet", this.diffuseTransmissionColorTexture.texCoord); + } + } + // KHR Extension: IOR //https://github.com/DassaultSystemes-Technology/glTF/tree/KHR_materials_ior/extensions/2.0/Khronos/KHR_materials_ior if (this.extensions.KHR_materials_ior !== undefined) @@ -697,6 +732,11 @@ class gltfMaterial extends GltfObject this.fromJsonTransmission(jsonExtensions.KHR_materials_transmission); } + if(jsonExtensions.KHR_materials_diffuse_transmission !== undefined) + { + this.fromJsonDiffuseTransmission(jsonExtensions.KHR_materials_diffuse_transmission); + } + if(jsonExtensions.KHR_materials_specular !== undefined) { this.fromJsonSpecular(jsonExtensions.KHR_materials_specular); @@ -802,6 +842,23 @@ class gltfMaterial extends GltfObject } } + fromJsonDiffuseTransmission(json) + { + if(json.diffuseTransmissionTexture !== undefined) + { + const texture = new gltfTextureInfo(); + texture.fromJson(json.diffuseTransmissionTexture); + this.diffuseTransmissionTexture = texture; + } + + if(json.diffuseTransmissionColorTexture !== undefined) + { + const texture = new gltfTextureInfo(); + texture.fromJson(json.diffuseTransmissionColorTexture); + this.diffuseTransmissionColorTexture = texture; + } + } + fromJsonSpecular(jsonSpecular) { if(jsonSpecular.specularTexture !== undefined)