Browse Source

Nodes: Fix texture reference (#25259)

sunag 2 years ago
parent
commit
00d426a280

+ 2 - 2
examples/jsm/nodes/accessors/ExtendedMaterialNode.js

@@ -2,7 +2,7 @@ import MaterialNode from './MaterialNode.js';
 import NormalMapNode from '../display/NormalMapNode.js';
 import NormalMapNode from '../display/NormalMapNode.js';
 
 
 import {
 import {
-	texture, normalView, materialReference
+	normalView, materialReference
 } from '../shadernode/ShaderNodeElements.js';
 } from '../shadernode/ShaderNodeElements.js';
 
 
 class ExtendedMaterialNode extends MaterialNode {
 class ExtendedMaterialNode extends MaterialNode {
@@ -37,7 +37,7 @@ class ExtendedMaterialNode extends MaterialNode {
 
 
 		if ( scope === ExtendedMaterialNode.NORMAL ) {
 		if ( scope === ExtendedMaterialNode.NORMAL ) {
 
 
-			node = material.normalMap ? new NormalMapNode( texture( material.normalMap ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
+			node = material.normalMap ? new NormalMapNode( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
 
 
 		}
 		}
 
 

+ 43 - 20
examples/jsm/nodes/accessors/MaterialNode.js

@@ -5,7 +5,6 @@ import ConstNode from '../core/ConstNode.js';
 import OperatorNode from '../math/OperatorNode.js';
 import OperatorNode from '../math/OperatorNode.js';
 import JoinNode from '../utils/JoinNode.js';
 import JoinNode from '../utils/JoinNode.js';
 import MaterialReferenceNode from './MaterialReferenceNode.js';
 import MaterialReferenceNode from './MaterialReferenceNode.js';
-import TextureNode from './TextureNode.js';
 import SplitNode from '../utils/SplitNode.js';
 import SplitNode from '../utils/SplitNode.js';
 
 
 class MaterialNode extends Node {
 class MaterialNode extends Node {
@@ -47,6 +46,33 @@ class MaterialNode extends Node {
 
 
 	}
 	}
 
 
+	getFloat( property ) {
+
+		//@TODO: Check if it can be cached by property name.
+
+		return new MaterialReferenceNode( property, 'float' );
+
+	}
+
+	getColor( property ) {
+
+		//@TODO: Check if it can be cached by property name.
+
+		return new MaterialReferenceNode( property, 'color' );
+
+	}
+
+	getTexture( property ) {
+
+		//@TODO: Check if it can be cached by property name.
+
+		const textureRefNode = new MaterialReferenceNode( property, 'texture' );
+		textureRefNode.node.uvNode = new MaterialNode( MaterialNode.UV );
+
+		return textureRefNode;
+
+	}
+
 	construct( builder ) {
 	construct( builder ) {
 
 
 		const material = builder.context.material;
 		const material = builder.context.material;
@@ -56,18 +82,15 @@ class MaterialNode extends Node {
 
 
 		if ( scope === MaterialNode.ALPHA_TEST ) {
 		if ( scope === MaterialNode.ALPHA_TEST ) {
 
 
-			node = new MaterialReferenceNode( 'alphaTest', 'float' );
+			node = this.getFloat( 'alphaTest' );
 
 
 		} else if ( scope === MaterialNode.COLOR ) {
 		} else if ( scope === MaterialNode.COLOR ) {
 
 
-			const colorNode = new MaterialReferenceNode( 'color', 'color' );
+			const colorNode = this.getColor( 'color' );
 
 
 			if ( material.map && material.map.isTexture === true ) {
 			if ( material.map && material.map.isTexture === true ) {
 
 
-				//const map = new MaterialReferenceNode( 'map', 'texture' );
-				const map = new TextureNode( material.map, new MaterialNode( MaterialNode.UV ) );
-
-				node = new OperatorNode( '*', colorNode, map );
+				node = new OperatorNode( '*', colorNode, this.getTexture( 'map' ) );
 
 
 			} else {
 			} else {
 
 
@@ -77,11 +100,11 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.OPACITY ) {
 		} else if ( scope === MaterialNode.OPACITY ) {
 
 
-			const opacityNode = new MaterialReferenceNode( 'opacity', 'float' );
+			const opacityNode = this.getFloat( 'opacity' );
 
 
 			if ( material.alphaMap && material.alphaMap.isTexture === true ) {
 			if ( material.alphaMap && material.alphaMap.isTexture === true ) {
 
 
-				node = new OperatorNode( '*', opacityNode, new MaterialReferenceNode( 'alphaMap', 'texture' ) );
+				node = new OperatorNode( '*', opacityNode, this.getTexture( 'alphaMap' ) );
 
 
 			} else {
 			} else {
 
 
@@ -91,19 +114,19 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.SHININESS ) {
 		} else if ( scope === MaterialNode.SHININESS ) {
 
 
-			return new MaterialReferenceNode( 'shininess', 'float' );
+			node = this.getFloat( 'shininess' );
 
 
 		} else if ( scope === MaterialNode.SPECULAR_COLOR ) {
 		} else if ( scope === MaterialNode.SPECULAR_COLOR ) {
 
 
-			node = new MaterialReferenceNode( 'specular', 'color' );
+			node = this.getColor( 'specular' );
 
 
 		} else if ( scope === MaterialNode.REFLECTIVITY ) {
 		} else if ( scope === MaterialNode.REFLECTIVITY ) {
 
 
-			const reflectivityNode = new MaterialReferenceNode( 'reflectivity', 'float' );
+			const reflectivityNode = this.getFloat( 'reflectivity' );
 
 
 			if ( material.specularMap && material.specularMap.isTexture === true ) {
 			if ( material.specularMap && material.specularMap.isTexture === true ) {
 
 
-				node = new OperatorNode( '*', reflectivityNode, new SplitNode( new TextureNode( material.specularMap ), 'r' ) );
+				node = new OperatorNode( '*', reflectivityNode, new SplitNode( this.getTexture( 'specularMap' ), 'r' ) );
 
 
 			} else {
 			} else {
 
 
@@ -113,11 +136,11 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.ROUGHNESS ) {
 		} else if ( scope === MaterialNode.ROUGHNESS ) {
 
 
-			const roughnessNode = new MaterialReferenceNode( 'roughness', 'float' );
+			const roughnessNode = this.getFloat( 'roughness' );
 
 
 			if ( material.roughnessMap && material.roughnessMap.isTexture === true ) {
 			if ( material.roughnessMap && material.roughnessMap.isTexture === true ) {
 
 
-				node = new OperatorNode( '*', roughnessNode, new SplitNode( new TextureNode( material.roughnessMap ), 'g' ) );
+				node = new OperatorNode( '*', roughnessNode, new SplitNode( this.getTexture( 'roughnessMap' ), 'g' ) );
 
 
 			} else {
 			} else {
 
 
@@ -127,11 +150,11 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.METALNESS ) {
 		} else if ( scope === MaterialNode.METALNESS ) {
 
 
-			const metalnessNode = new MaterialReferenceNode( 'metalness', 'float' );
+			const metalnessNode = this.getFloat( 'metalness' );
 
 
 			if ( material.metalnessMap && material.metalnessMap.isTexture === true ) {
 			if ( material.metalnessMap && material.metalnessMap.isTexture === true ) {
 
 
-				node = new OperatorNode( '*', metalnessNode, new SplitNode( new TextureNode( material.metalnessMap ), 'b' ) );
+				node = new OperatorNode( '*', metalnessNode, new SplitNode( this.getTexture( 'metalnessMap' ), 'b' ) );
 
 
 			} else {
 			} else {
 
 
@@ -141,11 +164,11 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.EMISSIVE ) {
 		} else if ( scope === MaterialNode.EMISSIVE ) {
 
 
-			const emissiveNode = new MaterialReferenceNode( 'emissive', 'color' );
+			const emissiveNode = this.getColor( 'emissive' );
 
 
 			if ( material.emissiveMap && material.emissiveMap.isTexture === true ) {
 			if ( material.emissiveMap && material.emissiveMap.isTexture === true ) {
 
 
-				node = new OperatorNode( '*', emissiveNode, new TextureNode( material.emissiveMap ) );
+				node = new OperatorNode( '*', emissiveNode, this.getTexture( 'emissiveMap' ) );
 
 
 			} else {
 			} else {
 
 
@@ -155,7 +178,7 @@ class MaterialNode extends Node {
 
 
 		} else if ( scope === MaterialNode.ROTATION ) {
 		} else if ( scope === MaterialNode.ROTATION ) {
 
 
-			node = new MaterialReferenceNode( 'rotation', 'float' );
+			node = this.getFloat( 'rotation' );
 
 
 		} else if ( scope === MaterialNode.UV ) {
 		} else if ( scope === MaterialNode.UV ) {
 
 

+ 10 - 0
examples/jsm/nodes/accessors/MaterialReferenceNode.js

@@ -10,6 +10,16 @@ class MaterialReferenceNode extends ReferenceNode {
 
 
 	}
 	}
 
 
+	construct( builder ) {
+
+		const material = this.material !== null ? this.material : builder.material;
+
+		this.node.value = material[ this.property ];
+
+		return super.construct( builder );
+
+	}
+
 	update( frame ) {
 	update( frame ) {
 
 
 		this.object = this.material !== null ? this.material : frame.material;
 		this.object = this.material !== null ? this.material : frame.material;

+ 14 - 12
examples/jsm/nodes/accessors/ReferenceNode.js

@@ -1,5 +1,6 @@
 import Node from '../core/Node.js';
 import Node from '../core/Node.js';
 import UniformNode from '../core/UniformNode.js';
 import UniformNode from '../core/UniformNode.js';
+import TextureNode from '../accessors/TextureNode.js';
 import { NodeUpdateType } from '../core/constants.js';
 import { NodeUpdateType } from '../core/constants.js';
 
 
 class ReferenceNode extends Node {
 class ReferenceNode extends Node {
@@ -24,39 +25,40 @@ class ReferenceNode extends Node {
 
 
 	setNodeType( uniformType ) {
 	setNodeType( uniformType ) {
 
 
-		this.node = new UniformNode( null, uniformType );
-		this.nodeType = uniformType;
+		let node = null;
 
 
-		if ( uniformType === 'color' ) {
+		if ( uniformType === 'texture' ) {
 
 
-			this.nodeType = 'vec3';
+			node = new TextureNode( null );
 
 
-		} else if ( uniformType === 'texture' ) {
+		} else {
 
 
-			this.nodeType = 'vec4';
+			node = new UniformNode( null, uniformType );
 
 
 		}
 		}
 
 
+		this.node = node;
+
 	}
 	}
 
 
-	getNodeType() {
+	getNodeType( builder ) {
 
 
-		return this.uniformType;
+		return this.node.getNodeType( builder );
 
 
 	}
 	}
 
 
 	update( frame ) {
 	update( frame ) {
 
 
 		const object = this.object !== null ? this.object : frame.object;
 		const object = this.object !== null ? this.object : frame.object;
-		const value = object[ this.property ];
+		const property = this.property;
 
 
-		this.node.value = value;
+		this.node.value = object[ property ];
 
 
 	}
 	}
 
 
-	generate( builder ) {
+	construct( /*builder*/ ) {
 
 
-		return this.node.build( builder, this.getNodeType( builder ) );
+		return this.node;
 
 
 	}
 	}