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
107class 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';
255253MaterialNode . UV = 'uv' ;
256254
257255export 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