Quellcode durchsuchen

WebGPURenderer: Support Instance and Skinning without normals (#29134)

Renaud Rohlinger vor 1 Jahr
Ursprung
Commit
3ce950f535
2 geänderte Dateien mit 22 neuen und 11 gelöschten Zeilen
  1. 11 7
      src/nodes/accessors/InstanceNode.js
  2. 11 4
      src/nodes/accessors/SkinningNode.js

+ 11 - 7
src/nodes/accessors/InstanceNode.js

@@ -31,7 +31,7 @@ class InstanceNode extends Node {
 
 
 	}
 	}
 
 
-	setup( /*builder*/ ) {
+	setup( builder ) {
 
 
 		let instanceMatrixNode = this.instanceMatrixNode;
 		let instanceMatrixNode = this.instanceMatrixNode;
 		let instanceColorNode = this.instanceColorNode;
 		let instanceColorNode = this.instanceColorNode;
@@ -91,19 +91,23 @@ class InstanceNode extends Node {
 		// POSITION
 		// POSITION
 
 
 		const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
 		const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
+		positionLocal.assign( instancePosition );
 
 
 		// NORMAL
 		// NORMAL
 
 
-		const m = mat3( instanceMatrixNode );
+		if ( builder.hasGeometryAttribute( 'normal' ) ) {
 
 
-		const transformedNormal = normalLocal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) );
+			const m = mat3( instanceMatrixNode );
 
 
-		const instanceNormal = m.mul( transformedNormal ).xyz;
+			const transformedNormal = normalLocal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) );
 
 
-		// ASSIGNS
+			const instanceNormal = m.mul( transformedNormal ).xyz;
 
 
-		positionLocal.assign( instancePosition );
-		normalLocal.assign( instanceNormal );
+			// ASSIGNS
+
+			normalLocal.assign( instanceNormal );
+
+		}
 
 
 		// COLOR
 		// COLOR
 
 

+ 11 - 4
src/nodes/accessors/SkinningNode.js

@@ -132,14 +132,21 @@ class SkinningNode extends Node {
 		}
 		}
 
 
 		const skinPosition = this.getSkinnedPosition();
 		const skinPosition = this.getSkinnedPosition();
-		const skinNormal = this.getSkinnedNormal();
+
 
 
 		positionLocal.assign( skinPosition );
 		positionLocal.assign( skinPosition );
-		normalLocal.assign( skinNormal );
 
 
-		if ( builder.hasGeometryAttribute( 'tangent' ) ) {
+		if ( builder.hasGeometryAttribute( 'normal' ) ) {
+
+			const skinNormal = this.getSkinnedNormal();
+
+			normalLocal.assign( skinNormal );
+
+			if ( builder.hasGeometryAttribute( 'tangent' ) ) {
+
+				tangentLocal.assign( skinNormal );
 
 
-			tangentLocal.assign( skinNormal );
+			}
 
 
 		}
 		}
 
 

粤ICP备19079148号