@@ -196,42 +196,86 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
196
196
197
197
} ;
198
198
199
- class ShaderNodeInternal extends Node {
199
+ class ShaderCallNodeInternal extends Node {
200
200
201
- constructor ( jsFunc ) {
201
+ constructor ( shaderNode , inputNodes ) {
202
202
203
203
super ( ) ;
204
204
205
- this . _jsFunc = jsFunc ;
205
+ this . shaderNode = shaderNode ;
206
+ this . inputNodes = inputNodes ;
206
207
207
208
}
208
209
209
- call ( inputs , stack , builder ) {
210
+ getNodeType ( builder ) {
210
211
211
- inputs = nodeObjects ( inputs ) ;
212
+ const { outputNode } = builder . getNodeProperties ( this ) ;
212
213
213
- return nodeObject ( this . _jsFunc ( inputs , stack , builder ) ) ;
214
+ return outputNode ? outputNode . getNodeType ( builder ) : super . getNodeType ( builder ) ;
214
215
215
216
}
216
217
217
- getNodeType ( builder ) {
218
+ call ( builder ) {
218
219
219
- const { outputNode } = builder . getNodeProperties ( this ) ;
220
+ const { shaderNode , inputNodes } = this ;
220
221
221
- return outputNode ? outputNode . getNodeType ( builder ) : super . getNodeType ( builder ) ;
222
+ const jsFunc = shaderNode . jsFunc ;
223
+ const outputNode = inputNodes !== null ? jsFunc ( nodeObjects ( inputNodes ) , builder . stack , builder ) : jsFunc ( builder . stack , builder ) ;
224
+
225
+ return nodeObject ( outputNode ) ;
222
226
223
227
}
224
228
225
229
construct ( builder ) {
226
230
227
231
builder . addStack ( ) ;
228
232
229
- builder . stack . outputNode = nodeObject ( this . _jsFunc ( builder . stack , builder ) ) ;
233
+ builder . stack . outputNode = this . call ( builder ) ;
230
234
231
235
return builder . removeStack ( ) ;
232
236
233
237
}
234
238
239
+ generate ( builder , output ) {
240
+
241
+ const { outputNode } = builder . getNodeProperties ( this ) ;
242
+
243
+ if ( outputNode === null ) {
244
+
245
+ // TSL: It's recommended to use `tslFn` in construct() pass.
246
+
247
+ return this . call ( builder ) . build ( builder , output ) ;
248
+
249
+ }
250
+
251
+ return super . generate ( builder , output ) ;
252
+
253
+ }
254
+
255
+ }
256
+
257
+ class ShaderNodeInternal extends Node {
258
+
259
+ constructor ( jsFunc ) {
260
+
261
+ super ( ) ;
262
+
263
+ this . jsFunc = jsFunc ;
264
+
265
+ }
266
+
267
+ call ( inputs = null ) {
268
+
269
+ return nodeObject ( new ShaderCallNodeInternal ( this , inputs ) ) ;
270
+
271
+ }
272
+
273
+ construct ( ) {
274
+
275
+ return this . call ( ) ;
276
+
277
+ }
278
+
235
279
}
236
280
237
281
const bools = [ false , true ] ;
@@ -349,15 +393,9 @@ export const shader = ( jsFunc ) => { // @deprecated, r154
349
393
350
394
export const tslFn = ( jsFunc ) => {
351
395
352
- let shaderNode = null ;
396
+ const shaderNode = new ShaderNode ( jsFunc ) ;
353
397
354
- return ( ...params ) => {
355
-
356
- if ( shaderNode === null ) shaderNode = new ShaderNode ( jsFunc ) ;
357
-
358
- return shaderNode . call ( ...params ) ;
359
-
360
- } ;
398
+ return ( inputs ) => shaderNode . call ( inputs ) ;
361
399
362
400
} ;
363
401
0 commit comments