From 3f3f096fcaac404b8649ba6c9a2f67813fd0cb13 Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Mon, 17 Feb 2025 22:52:26 +0900 Subject: [PATCH 1/5] WebGPURenderer: Fix matN() and matN(x) behaviors --- src/nodes/core/NodeBuilder.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index afa5e758377150..b36e84b46f4e48 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -1160,11 +1160,34 @@ class NodeBuilder { return `${ this.getType( type ) }( ${ generateConst( value.x ) }, ${ generateConst( value.y ) }, ${ generateConst( value.z ) } )`; - } else if ( typeLength === 4 ) { + } else if ( typeLength === 4 && type !== 'mat2' ) { return `${ this.getType( type ) }( ${ generateConst( value.x ) }, ${ generateConst( value.y ) }, ${ generateConst( value.z ) }, ${ generateConst( value.w ) } )`; - } else if ( typeLength > 4 && value && ( value.isMatrix3 || value.isMatrix4 ) ) { + } else if ( typeLength >= 4 && value && ( value.isMatrix2 || value.isMatrix3 || value.isMatrix4 ) ) { + + // in WGSL matN() -> zero matrix and matN( 1.0 ) -> identity matrix + // in GLSL matN() -> identity matrix and matN( 0.0 ) -> zero matrix + const argumentsLength = value.elements.filter( e => e !== undefined ).length; + + // aligns GLSL with WGSL to matN() -> zero matri + if ( argumentsLength === 0 && this.isFlipY() ) { + + value.elements.fill( 0 ); + + } else if ( argumentsLength === 1 ) { + + if ( value.elements[ 0 ] === 0 ) { + + value.elements.fill( 0 ); + + } else if ( value.elements[ 0 ] === 1 ) { + + value.identity(); + + } + + } return `${ this.getType( type ) }( ${ value.elements.map( generateConst ).join( ', ' ) } )`; From 4e23e64ac3f9f51dbf5309fb13ed7aec6a85ae94 Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Mon, 17 Feb 2025 22:59:30 +0900 Subject: [PATCH 2/5] simplify the code since luckily the nodebuilder fallback all values to zero if no arguments --- src/nodes/core/NodeBuilder.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index b36e84b46f4e48..cd900b067db26c 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -1168,14 +1168,9 @@ class NodeBuilder { // in WGSL matN() -> zero matrix and matN( 1.0 ) -> identity matrix // in GLSL matN() -> identity matrix and matN( 0.0 ) -> zero matrix - const argumentsLength = value.elements.filter( e => e !== undefined ).length; + // undefined values fallback to 0 in the NodeBuilder setting both backends matN() to zero matrix - // aligns GLSL with WGSL to matN() -> zero matri - if ( argumentsLength === 0 && this.isFlipY() ) { - - value.elements.fill( 0 ); - - } else if ( argumentsLength === 1 ) { + if ( value.elements.filter( e => e !== undefined ).length === 1 ) { if ( value.elements[ 0 ] === 0 ) { From a4bb2eb8c8cb072294f412fe808069e9a98f4024 Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Mon, 17 Feb 2025 23:07:41 +0900 Subject: [PATCH 3/5] from specs scalar x spread on diagonal --- src/math/Matrix2.js | 11 +++++++++++ src/nodes/core/NodeBuilder.js | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/math/Matrix2.js b/src/math/Matrix2.js index a3975672be4cae..cdf11af86a65a6 100644 --- a/src/math/Matrix2.js +++ b/src/math/Matrix2.js @@ -28,6 +28,17 @@ export class Matrix2 { } + multiplyScalar( scalar ) { + + const te = this.elements; + + te[ 0 ] *= scalar; te[ 2 ] *= scalar; + te[ 1 ] *= scalar; te[ 3 ] *= scalar; + + return this; + + } + fromArray( array, offset = 0 ) { for ( let i = 0; i < 4; i ++ ) { diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index cd900b067db26c..b2a0b486f25e68 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -1176,9 +1176,9 @@ class NodeBuilder { value.elements.fill( 0 ); - } else if ( value.elements[ 0 ] === 1 ) { + } else { - value.identity(); + value.identity().multiplyScalar( value.elements[ 0 ] ); } From 853f636f179a25baf1e3b17660f0ddc5d23c24f4 Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Mon, 17 Feb 2025 23:12:12 +0900 Subject: [PATCH 4/5] even more simple --- src/nodes/core/NodeBuilder.js | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index b2a0b486f25e68..4faa3622064e19 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -1166,21 +1166,9 @@ class NodeBuilder { } else if ( typeLength >= 4 && value && ( value.isMatrix2 || value.isMatrix3 || value.isMatrix4 ) ) { - // in WGSL matN() -> zero matrix and matN( 1.0 ) -> identity matrix - // in GLSL matN() -> identity matrix and matN( 0.0 ) -> zero matrix - // undefined values fallback to 0 in the NodeBuilder setting both backends matN() to zero matrix - if ( value.elements.filter( e => e !== undefined ).length === 1 ) { - if ( value.elements[ 0 ] === 0 ) { - - value.elements.fill( 0 ); - - } else { - - value.identity().multiplyScalar( value.elements[ 0 ] ); - - } + value.identity().multiplyScalar( value.elements[ 0 ] ); } From 4db0a8175297bf903495a68597a3ec612d9adb0e Mon Sep 17 00:00:00 2001 From: Renaud Rohlinger Date: Mon, 17 Feb 2025 23:29:08 +0900 Subject: [PATCH 5/5] partial revert --- src/math/Matrix2.js | 11 ----------- src/nodes/core/NodeBuilder.js | 6 ------ 2 files changed, 17 deletions(-) diff --git a/src/math/Matrix2.js b/src/math/Matrix2.js index cdf11af86a65a6..a3975672be4cae 100644 --- a/src/math/Matrix2.js +++ b/src/math/Matrix2.js @@ -28,17 +28,6 @@ export class Matrix2 { } - multiplyScalar( scalar ) { - - const te = this.elements; - - te[ 0 ] *= scalar; te[ 2 ] *= scalar; - te[ 1 ] *= scalar; te[ 3 ] *= scalar; - - return this; - - } - fromArray( array, offset = 0 ) { for ( let i = 0; i < 4; i ++ ) { diff --git a/src/nodes/core/NodeBuilder.js b/src/nodes/core/NodeBuilder.js index 4faa3622064e19..faf309d3db6bfc 100644 --- a/src/nodes/core/NodeBuilder.js +++ b/src/nodes/core/NodeBuilder.js @@ -1166,12 +1166,6 @@ class NodeBuilder { } else if ( typeLength >= 4 && value && ( value.isMatrix2 || value.isMatrix3 || value.isMatrix4 ) ) { - if ( value.elements.filter( e => e !== undefined ).length === 1 ) { - - value.identity().multiplyScalar( value.elements[ 0 ] ); - - } - return `${ this.getType( type ) }( ${ value.elements.map( generateConst ).join( ', ' ) } )`; } else if ( typeLength > 4 ) {