Skip to content

Commit 71c70a8

Browse files
LeviPesinsunag
andauthored
Nodes: Rework ShaderNodeElements and make some other refactorings (#25498)
* Nodes: Rework ShaderNodeElements and make some other refactorings * Fixes * fix add assign * Fix circular dependency and clean up * Rename addNode -> addNodeElement and LightsNode.setReference -> addLightNode, add addNodeClass and addNodeMaterial --------- Co-authored-by: sunag <[email protected]>
1 parent 202bbb7 commit 71c70a8

File tree

133 files changed

+1801
-1700
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

133 files changed

+1801
-1700
lines changed

examples/jsm/nodes/Nodes.js

Lines changed: 133 additions & 368 deletions
Large diffs are not rendered by default.

examples/jsm/nodes/accessors/BitangentNode.js

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import Node from '../core/Node.js';
2-
import VaryingNode from '../core/VaryingNode.js';
3-
import OperatorNode from '../math/OperatorNode.js';
4-
import MathNode from '../math/MathNode.js';
5-
import SplitNode from '../utils/SplitNode.js';
6-
import NormalNode from './NormalNode.js';
7-
import TangentNode from './TangentNode.js';
1+
import Node, { addNodeClass } from '../core/Node.js';
2+
import { varying } from '../core/VaryingNode.js';
3+
import { normalize } from '../math/MathNode.js';
4+
import { cameraViewMatrix } from './CameraNode.js';
5+
import { normalGeometry, normalLocal, normalView, normalWorld, transformedNormalView } from './NormalNode.js';
6+
import { tangentGeometry, tangentLocal, tangentView, tangentWorld, transformedTangentView } from './TangentNode.js';
7+
import { nodeImmutable } from '../shadernode/ShaderNode.js';
88

99
class BitangentNode extends Node {
1010

@@ -26,11 +26,29 @@ class BitangentNode extends Node {
2626

2727
const scope = this.scope;
2828

29-
const crossNormalTangent = new MathNode( MathNode.CROSS, new NormalNode( scope ), new TangentNode( scope ) );
30-
const tangentW = new SplitNode( new TangentNode( TangentNode.GEOMETRY ), 'w' );
31-
const vertexNode = new SplitNode( new OperatorNode( '*', crossNormalTangent, tangentW ), 'xyz' );
29+
let crossNormalTangent;
3230

33-
const outputNode = new MathNode( MathNode.NORMALIZE, new VaryingNode( vertexNode ) );
31+
if ( scope === BitangentNode.GEOMETRY ) {
32+
33+
crossNormalTangent = normalGeometry.cross( tangentGeometry );
34+
35+
} else if ( scope === BitangentNode.LOCAL ) {
36+
37+
crossNormalTangent = normalLocal.cross( tangentLocal );
38+
39+
} else if ( scope === BitangentNode.VIEW ) {
40+
41+
crossNormalTangent = normalView.cross( tangentView );
42+
43+
} else if ( scope === BitangentNode.WORLD ) {
44+
45+
crossNormalTangent = normalWorld.cross( tangentWorld );
46+
47+
}
48+
49+
const vertexNode = crossNormalTangent.mul( tangentGeometry.w ).xyz;
50+
51+
const outputNode = normalize( varying( vertexNode ) );
3452

3553
return outputNode.build( builder, this.getNodeType( builder ) );
3654

@@ -60,3 +78,12 @@ BitangentNode.VIEW = 'view';
6078
BitangentNode.WORLD = 'world';
6179

6280
export default BitangentNode;
81+
82+
export const bitangentGeometry = nodeImmutable( BitangentNode, BitangentNode.GEOMETRY );
83+
export const bitangentLocal = nodeImmutable( BitangentNode, BitangentNode.LOCAL );
84+
export const bitangentView = nodeImmutable( BitangentNode, BitangentNode.VIEW );
85+
export const bitangentWorld = nodeImmutable( BitangentNode, BitangentNode.WORLD );
86+
export const transformedBitangentView = normalize( transformedNormalView.cross( transformedTangentView ).mul( tangentGeometry.w ) );
87+
export const transformedBitangentWorld = normalize( transformedBitangentView.transformDirection( cameraViewMatrix ) );
88+
89+
addNodeClass( BitangentNode );

examples/jsm/nodes/accessors/BufferNode.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import UniformNode from '../core/UniformNode.js';
2+
import { addNodeClass } from '../core/Node.js';
3+
import { nodeObject, getConstNodeType } from '../shadernode/ShaderNode.js';
24

35
class BufferNode extends UniformNode {
46

@@ -22,3 +24,7 @@ class BufferNode extends UniformNode {
2224
}
2325

2426
export default BufferNode;
27+
28+
export const buffer = ( value, nodeOrType, count ) => nodeObject( new BufferNode( value, getConstNodeType( nodeOrType ), count ) );
29+
30+
addNodeClass( BufferNode );

examples/jsm/nodes/accessors/CameraNode.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import Object3DNode from './Object3DNode.js';
2+
import { addNodeClass } from '../core/Node.js';
3+
import { nodeImmutable } from '../shadernode/ShaderNode.js';
24

35
class CameraNode extends Object3DNode {
46

@@ -65,3 +67,11 @@ class CameraNode extends Object3DNode {
6567
CameraNode.PROJECTION_MATRIX = 'projectionMatrix';
6668

6769
export default CameraNode;
70+
71+
export const cameraProjectionMatrix = nodeImmutable( CameraNode, CameraNode.PROJECTION_MATRIX );
72+
export const cameraViewMatrix = nodeImmutable( CameraNode, CameraNode.VIEW_MATRIX );
73+
export const cameraNormalMatrix = nodeImmutable( CameraNode, CameraNode.NORMAL_MATRIX );
74+
export const cameraWorldMatrix = nodeImmutable( CameraNode, CameraNode.WORLD_MATRIX );
75+
export const cameraPosition = nodeImmutable( CameraNode, CameraNode.POSITION );
76+
77+
addNodeClass( CameraNode );

examples/jsm/nodes/accessors/CubeTextureNode.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import TextureNode from './TextureNode.js';
22
import UniformNode from '../core/UniformNode.js';
3-
import ReflectVectorNode from './ReflectVectorNode.js';
4-
5-
import { vec3, nodeObject } from '../shadernode/ShaderNodeBaseElements.js';
6-
7-
let defaultUV;
3+
import { reflectVector } from './ReflectVectorNode.js';
4+
import { addNodeClass } from '../core/Node.js';
5+
import { addNodeElement, nodeProxy, vec3 } from '../shadernode/ShaderNode.js';
86

97
class CubeTextureNode extends TextureNode {
108

@@ -24,7 +22,7 @@ class CubeTextureNode extends TextureNode {
2422

2523
getDefaultUV() {
2624

27-
return defaultUV || ( defaultUV = new ReflectVectorNode() );
25+
return reflectVector;
2826

2927
}
3028

@@ -58,8 +56,7 @@ class CubeTextureNode extends TextureNode {
5856

5957
if ( propertyName === undefined ) {
6058

61-
const uvNodeObject = nodeObject( uvNode );
62-
const cubeUV = vec3( uvNodeObject.x.negate(), uvNodeObject.yz );
59+
const cubeUV = vec3( uvNode.x.negate(), uvNode.yz );
6360
const uvSnippet = cubeUV.build( builder, 'vec3' );
6461

6562
const nodeVar = builder.getVarFromNode( this, 'vec4' );
@@ -96,3 +93,9 @@ class CubeTextureNode extends TextureNode {
9693
}
9794

9895
export default CubeTextureNode;
96+
97+
export const cubeTexture = nodeProxy( CubeTextureNode );
98+
99+
addNodeElement( 'cubeTexture', cubeTexture );
100+
101+
addNodeClass( CubeTextureNode );

examples/jsm/nodes/accessors/ExtendedMaterialNode.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import MaterialNode from './MaterialNode.js';
2-
import NormalMapNode from '../display/NormalMapNode.js';
1+
// @TODO: Is this needed? Can it be moved in MaterialNode?
32

4-
import {
5-
normalView, materialReference
6-
} from '../shadernode/ShaderNodeElements.js';
3+
import MaterialNode from './MaterialNode.js';
4+
import { materialReference } from './MaterialReferenceNode.js';
5+
import { normalView } from './NormalNode.js';
6+
import { normalMap } from '../display/NormalMapNode.js';
7+
import { addNodeClass } from '../core/Node.js';
8+
import { nodeImmutable } from '../shadernode/ShaderNode.js';
79

810
class ExtendedMaterialNode extends MaterialNode {
911

@@ -37,7 +39,7 @@ class ExtendedMaterialNode extends MaterialNode {
3739

3840
if ( scope === ExtendedMaterialNode.NORMAL ) {
3941

40-
node = material.normalMap ? new NormalMapNode( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
42+
node = material.normalMap ? normalMap( this.getTexture( 'normalMap' ), materialReference( 'normalScale', 'vec2' ) ) : normalView;
4143

4244
}
4345

@@ -50,3 +52,7 @@ class ExtendedMaterialNode extends MaterialNode {
5052
ExtendedMaterialNode.NORMAL = 'normal';
5153

5254
export default ExtendedMaterialNode;
55+
56+
export const materialNormal = nodeImmutable( ExtendedMaterialNode, ExtendedMaterialNode.NORMAL );
57+
58+
addNodeClass( ExtendedMaterialNode );
Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
import Node from '../core/Node.js';
2-
import {
3-
vec3,
4-
mat3,
5-
mul,
6-
assign,
7-
buffer,
8-
element,
9-
dot,
10-
div,
11-
temp,
12-
instanceIndex,
13-
positionLocal,
14-
normalLocal
15-
} from '../shadernode/ShaderNodeBaseElements.js';
1+
import Node, { addNodeClass } from '../core/Node.js';
2+
import { instanceIndex } from '../core/InstanceIndexNode.js';
3+
import { temp } from '../core/VarNode.js';
4+
import { buffer } from './BufferNode.js';
5+
import { normalLocal } from './NormalNode.js';
6+
import { positionLocal } from './PositionNode.js';
7+
import { nodeProxy, vec3, mat3 } from '../shadernode/ShaderNode.js';
168

179
class InstanceNode extends Node {
1810

@@ -26,7 +18,7 @@ class InstanceNode extends Node {
2618

2719
const instanceBufferNode = buffer( instanceMesh.instanceMatrix.array, 'mat4', instanceMesh.count );
2820

29-
this.instanceMatrixNode = temp( element( instanceBufferNode, instanceIndex ) ); // @TODO: a possible caching issue here?
21+
this.instanceMatrixNode = temp( instanceBufferNode.element( instanceIndex ) ); // @TODO: a possible caching issue here?
3022

3123
}
3224

@@ -36,23 +28,27 @@ class InstanceNode extends Node {
3628

3729
// POSITION
3830

39-
const instancePosition = mul( instanceMatrixNode, positionLocal ).xyz;
31+
const instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;
4032

4133
// NORMAL
4234

4335
const m = mat3( instanceMatrixNode[ 0 ].xyz, instanceMatrixNode[ 1 ].xyz, instanceMatrixNode[ 2 ].xyz );
4436

45-
const transformedNormal = div( normalLocal, vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) ) );
37+
const transformedNormal = normalLocal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) );
4638

47-
const instanceNormal = mul( m, transformedNormal ).xyz;
39+
const instanceNormal = m.mul( transformedNormal ).xyz;
4840

4941
// ASSIGNS
5042

51-
assign( positionLocal, instancePosition ).build( builder );
52-
assign( normalLocal, instanceNormal ).build( builder );
43+
positionLocal.assign( instancePosition ).build( builder );
44+
normalLocal.assign( instanceNormal ).build( builder );
5345

5446
}
5547

5648
}
5749

5850
export default InstanceNode;
51+
52+
export const instance = nodeProxy( InstanceNode );
53+
54+
addNodeClass( InstanceNode );

examples/jsm/nodes/accessors/MaterialNode.js

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import Node from '../core/Node.js';
2-
import UniformNode from '../core/UniformNode.js';
3-
import UVNode from '../accessors/UVNode.js';
4-
import ConstNode from '../core/ConstNode.js';
5-
import OperatorNode from '../math/OperatorNode.js';
6-
import JoinNode from '../utils/JoinNode.js';
7-
import MaterialReferenceNode from './MaterialReferenceNode.js';
8-
import SplitNode from '../utils/SplitNode.js';
1+
import Node, { addNodeClass } from '../core/Node.js';
2+
import { uniform } from '../core/UniformNode.js';
3+
import { materialReference } from './MaterialReferenceNode.js';
4+
import { uv } from './UVNode.js';
5+
import { nodeImmutable, vec3 } from '../shadernode/ShaderNode.js';
96

107
class MaterialNode extends Node {
118

@@ -50,24 +47,24 @@ class MaterialNode extends Node {
5047

5148
//@TODO: Check if it can be cached by property name.
5249

53-
return new MaterialReferenceNode( property, 'float' );
50+
return materialReference( property, 'float' );
5451

5552
}
5653

5754
getColor( property ) {
5855

5956
//@TODO: Check if it can be cached by property name.
6057

61-
return new MaterialReferenceNode( property, 'color' );
58+
return materialReference( property, 'color' );
6259

6360
}
6461

6562
getTexture( property ) {
6663

6764
//@TODO: Check if it can be cached by property name.
6865

69-
const textureRefNode = new MaterialReferenceNode( property, 'texture' );
70-
textureRefNode.node.uvNode = new MaterialNode( MaterialNode.UV );
66+
const textureRefNode = materialReference( property, 'texture' );
67+
textureRefNode.node.uvNode = materialUV;
7168

7269
return textureRefNode;
7370

@@ -90,7 +87,7 @@ class MaterialNode extends Node {
9087

9188
if ( material.map && material.map.isTexture === true ) {
9289

93-
node = new OperatorNode( '*', colorNode, this.getTexture( 'map' ) );
90+
node = colorNode.mul( this.getTexture( 'map' ) );
9491

9592
} else {
9693

@@ -104,7 +101,7 @@ class MaterialNode extends Node {
104101

105102
if ( material.alphaMap && material.alphaMap.isTexture === true ) {
106103

107-
node = new OperatorNode( '*', opacityNode, this.getTexture( 'alphaMap' ) );
104+
node = opacityNode.mul( this.getTexture( 'alphaMap' ) );
108105

109106
} else {
110107

@@ -126,7 +123,7 @@ class MaterialNode extends Node {
126123

127124
if ( material.specularMap && material.specularMap.isTexture === true ) {
128125

129-
node = new OperatorNode( '*', reflectivityNode, new SplitNode( this.getTexture( 'specularMap' ), 'r' ) );
126+
node = reflectivityNode.mul( this.getTexture( 'specularMap' ).r );
130127

131128
} else {
132129

@@ -140,7 +137,7 @@ class MaterialNode extends Node {
140137

141138
if ( material.roughnessMap && material.roughnessMap.isTexture === true ) {
142139

143-
node = new OperatorNode( '*', roughnessNode, new SplitNode( this.getTexture( 'roughnessMap' ), 'g' ) );
140+
node = roughnessNode.mul( this.getTexture( 'roughnessMap' ).g );
144141

145142
} else {
146143

@@ -154,7 +151,7 @@ class MaterialNode extends Node {
154151

155152
if ( material.metalnessMap && material.metalnessMap.isTexture === true ) {
156153

157-
node = new OperatorNode( '*', metalnessNode, new SplitNode( this.getTexture( 'metalnessMap' ), 'b' ) );
154+
node = metalnessNode.mul( this.getTexture( 'metalnessMap' ).b );
158155

159156
} else {
160157

@@ -168,7 +165,7 @@ class MaterialNode extends Node {
168165

169166
if ( material.emissiveMap && material.emissiveMap.isTexture === true ) {
170167

171-
node = new OperatorNode( '*', emissiveNode, this.getTexture( 'emissiveMap' ) );
168+
node = emissiveNode.mul( this.getTexture( 'emissiveMap' ) );
172169

173170
} else {
174171

@@ -184,7 +181,6 @@ class MaterialNode extends Node {
184181

185182
// uv repeat and offset setting priorities
186183

187-
let uvNode;
188184
let uvScaleMap =
189185
material.map ||
190186
material.specularMap ||
@@ -222,17 +218,19 @@ class MaterialNode extends Node {
222218

223219
}
224220

225-
uvNode = new OperatorNode( '*', new UniformNode( uvScaleMap.matrix ), new JoinNode( [ new UVNode(), new ConstNode( 1 ) ] ) );
221+
node = uniform( uvScaleMap.matrix ).mul( vec3( uv(), 1 ) );
226222

227-
}
223+
} else {
228224

229-
return uvNode || new UVNode();
225+
node = uv();
226+
227+
}
230228

231229
} else {
232230

233231
const outputType = this.getNodeType( builder );
234232

235-
node = new MaterialReferenceNode( scope, outputType );
233+
node = materialReference( scope, outputType );
236234

237235
}
238236

@@ -255,3 +253,17 @@ MaterialNode.ROTATION = 'rotation';
255253
MaterialNode.UV = 'uv';
256254

257255
export default MaterialNode;
256+
257+
export const materialUV = nodeImmutable( MaterialNode, MaterialNode.UV );
258+
export const materialAlphaTest = nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST );
259+
export const materialColor = nodeImmutable( MaterialNode, MaterialNode.COLOR );
260+
export const materialShininess = nodeImmutable( MaterialNode, MaterialNode.SHININESS );
261+
export const materialEmissive = nodeImmutable( MaterialNode, MaterialNode.EMISSIVE );
262+
export const materialOpacity = nodeImmutable( MaterialNode, MaterialNode.OPACITY );
263+
export const materialSpecularColor = nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR );
264+
export const materialReflectivity = nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY );
265+
export const materialRoughness = nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );
266+
export const materialMetalness = nodeImmutable( MaterialNode, MaterialNode.METALNESS );
267+
export const materialRotation = nodeImmutable( MaterialNode, MaterialNode.ROTATION );
268+
269+
addNodeClass( MaterialNode );

0 commit comments

Comments
 (0)