@@ -196,42 +196,86 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
196196
197197} ;
198198
199- class ShaderNodeInternal extends Node {
199+ class ShaderCallNodeInternal extends Node {
200200
201- constructor ( jsFunc ) {
201+ constructor ( shaderNode , inputNodes ) {
202202
203203 super ( ) ;
204204
205- this . _jsFunc = jsFunc ;
205+ this . shaderNode = shaderNode ;
206+ this . inputNodes = inputNodes ;
206207
207208 }
208209
209- call ( inputs , stack , builder ) {
210+ getNodeType ( builder ) {
210211
211- inputs = nodeObjects ( inputs ) ;
212+ const { outputNode } = builder . getNodeProperties ( this ) ;
212213
213- return nodeObject ( this . _jsFunc ( inputs , stack , builder ) ) ;
214+ return outputNode ? outputNode . getNodeType ( builder ) : super . getNodeType ( builder ) ;
214215
215216 }
216217
217- getNodeType ( builder ) {
218+ call ( builder ) {
218219
219- const { outputNode } = builder . getNodeProperties ( this ) ;
220+ const { shaderNode , inputNodes } = this ;
220221
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 ) ;
222226
223227 }
224228
225229 construct ( builder ) {
226230
227231 builder . addStack ( ) ;
228232
229- builder . stack . outputNode = nodeObject ( this . _jsFunc ( builder . stack , builder ) ) ;
233+ builder . stack . outputNode = this . call ( builder ) ;
230234
231235 return builder . removeStack ( ) ;
232236
233237 }
234238
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+
235279}
236280
237281const bools = [ false , true ] ;
@@ -349,15 +393,9 @@ export const shader = ( jsFunc ) => { // @deprecated, r154
349393
350394export const tslFn = ( jsFunc ) => {
351395
352- let shaderNode = null ;
396+ const shaderNode = new ShaderNode ( jsFunc ) ;
353397
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 ) ;
361399
362400} ;
363401
0 commit comments