From 6f4b4e144ef7f63ff91ec377b454289d92c2955e Mon Sep 17 00:00:00 2001 From: Shota Matsuda Date: Sat, 6 Jun 2026 00:42:16 +0900 Subject: [PATCH 1/3] E2E: Print elapsed seconds (#33726) --- test/e2e/puppeteer.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/e2e/puppeteer.js b/test/e2e/puppeteer.js index 877130fa9b02ec..882e279f05d2ee 100644 --- a/test/e2e/puppeteer.js +++ b/test/e2e/puppeteer.js @@ -422,6 +422,7 @@ async function preparePage( page, injection, builds, errorMessages ) { async function checkFile( ctx, failedScreenshots, cleanPage, isMakeScreenshot, file ) { const page = ctx.page; + const pageStart = performance.now(); try { @@ -503,6 +504,8 @@ async function checkFile( ctx, failedScreenshots, cleanPage, isMakeScreenshot, f } + const pageElapsed = ( performance.now() - pageStart ) / 1000; + const screenshot = ( await Image.read( await page.screenshot() ) ).scale( 1 / viewScale ); if ( page.error !== undefined ) throw new Error( page.error ); @@ -555,14 +558,14 @@ async function checkFile( ctx, failedScreenshots, cleanPage, isMakeScreenshot, f if ( differentPixels < maxDifferentPixels ) { - console.green( `Diff ${ differentPixels.toFixed( 1 ) }% in file: ${ file }` ); + console.green( `Diff ${ differentPixels.toFixed( 1 ) }% in file: ${ file } (${ pageElapsed.toFixed( 1 ) }s)` ); } else { await screenshot.write( `test/e2e/output-screenshots/${ file }-actual.jpg`, jpgQuality ); await expected.write( `test/e2e/output-screenshots/${ file }-expected.jpg`, jpgQuality ); await diff.write( `test/e2e/output-screenshots/${ file }-diff.jpg`, jpgQuality ); - throw new Error( `Diff wrong in ${ differentPixels.toFixed( 1 ) }% of pixels in file: ${ file }` ); + throw new Error( `Diff wrong in ${ differentPixels.toFixed( 1 ) }% of pixels in file: ${ file } (${ pageElapsed.toFixed( 1 ) }s)` ); } From 5d8e4b87350f798a1c2538d0d8ce75190407b4af Mon Sep 17 00:00:00 2001 From: sunag Date: Fri, 5 Jun 2026 13:53:07 -0300 Subject: [PATCH 2/3] WebGPURenderer: add `lighting.enabled` (#33721) --- src/materials/nodes/NodeMaterial.js | 6 ++++++ src/renderers/common/Lighting.js | 15 ++++++++++++++ src/renderers/common/RenderList.js | 11 +++++++++- src/renderers/common/nodes/NodeManager.js | 25 +++++++++++++++-------- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/materials/nodes/NodeMaterial.js b/src/materials/nodes/NodeMaterial.js index db5bd80218e741..b2278a3bd3df99 100644 --- a/src/materials/nodes/NodeMaterial.js +++ b/src/materials/nodes/NodeMaterial.js @@ -991,6 +991,12 @@ class NodeMaterial extends Material { const materialLightsNode = []; + if ( builder.renderer.lighting.enabled === false ) { + + return materialLightsNode; + + } + // const envNode = this.setupEnvironment( builder ); diff --git a/src/renderers/common/Lighting.js b/src/renderers/common/Lighting.js index 6387832885059f..f2b6b9f2f654bd 100644 --- a/src/renderers/common/Lighting.js +++ b/src/renderers/common/Lighting.js @@ -14,6 +14,21 @@ const _weakMap = /*@__PURE__*/ new WeakMap(); */ class Lighting { + /** + * Constructs a new lighting manager. + */ + constructor() { + + /** + * Whether this lighting manager is enabled or not. + * + * @type {boolean} + * @default true + */ + this.enabled = true; + + } + /** * Creates a new lights node for the given array of lights. * diff --git a/src/renderers/common/RenderList.js b/src/renderers/common/RenderList.js index 8dc1dd7f7f847e..272d6b1092e25b 100644 --- a/src/renderers/common/RenderList.js +++ b/src/renderers/common/RenderList.js @@ -1,5 +1,7 @@ import { DoubleSide } from '../../constants.js'; +const _emptyArray = /*@__PURE__*/ Object.freeze( [] ); + /** * Default sorting function for opaque render items. * @@ -144,6 +146,13 @@ class RenderList { */ this.bundles = []; + /** + * The lighting management component. + * + * @type {Lighting} + */ + this.lighting = lighting; + /** * The render list's lights node. This node is later * relevant for the actual analytical light nodes which @@ -384,7 +393,7 @@ class RenderList { // update lights - this.lightsNode.setLights( this.lightsArray ); + this.lightsNode.setLights( this.lighting.enabled ? this.lightsArray : _emptyArray ); // Clear references from inactive renderItems in the list diff --git a/src/renderers/common/nodes/NodeManager.js b/src/renderers/common/nodes/NodeManager.js index 8c6ddde8f664ca..64322c444d7e45 100644 --- a/src/renderers/common/nodes/NodeManager.js +++ b/src/renderers/common/nodes/NodeManager.js @@ -498,6 +498,8 @@ class NodeManager extends DataMap { */ getEnvironmentNode( scene ) { + if ( this.renderer.lighting.enabled === false ) return null; + this.updateEnvironment( scene ); let environmentNode = null; @@ -590,16 +592,23 @@ class NodeManager extends DataMap { if ( cacheKeyData.callId !== callId ) { - const environmentNode = this.getEnvironmentNode( scene ); - const fogNode = this.getFogNode( scene ); + _cacheKeyValues.push( this.renderer.getOutputRenderTarget() && this.renderer.getOutputRenderTarget().multiview ? 1 : 0 ); + _cacheKeyValues.push( this.renderer.lighting.enabled ? 1 : 0 ); - if ( lightsNode ) _cacheKeyValues.push( lightsNode.getCacheKey( true ) ); - if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() ); - if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() ); + if ( this.renderer.lighting.enabled ) { - _cacheKeyValues.push( this.renderer.getOutputRenderTarget() && this.renderer.getOutputRenderTarget().multiview ? 1 : 0 ); - _cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 ); - _cacheKeyValues.push( this.renderer.shadowMap.type ); + _cacheKeyValues.push( lightsNode.getCacheKey( true ) ); + + _cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 ); + _cacheKeyValues.push( this.renderer.shadowMap.type ); + + const environmentNode = this.getEnvironmentNode( scene ); + if ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() ); + + } + + const fogNode = this.getFogNode( scene ); + if ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() ); cacheKeyData.callId = callId; cacheKeyData.cacheKey = hashArray( _cacheKeyValues ); From 2a2f9b5d034eeb9f3f074adc8ad75512668efdd8 Mon Sep 17 00:00:00 2001 From: WestLangley Date: Fri, 5 Jun 2026 13:14:50 -0400 Subject: [PATCH 3/3] Shaders: Update nomenclature (#33727) --- src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js b/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js index 760fd264fbb1c8..dfa74b3531db35 100644 --- a/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js @@ -197,7 +197,7 @@ IncidentLight directLight; #ifdef USE_LIGHT_PROBES_GRID vec3 probeWorldPos = ( ( vec4( geometryPosition, 1.0 ) - viewMatrix[ 3 ] ) * viewMatrix ).xyz; - vec3 probeWorldNormal = inverseTransformDirection( geometryNormal, viewMatrix ); + vec3 probeWorldNormal = transformNormalByInverseViewMatrix( geometryNormal, viewMatrix ); irradiance += getLightProbeGridIrradiance( probeWorldPos, probeWorldNormal ); #endif