Просмотр исходного кода

TSL: Improves compilation performance by 3.0x (#33120)

sunag 1 месяц назад
Родитель
Сommit
0faeeaf943
54 измененных файлов с 224 добавлено и 199 удалено
  1. 2 0
      examples/webgpu_loader_materialx.html
  2. 0 1
      src/nodes/Nodes.js
  3. 1 1
      src/nodes/TSL.js
  4. 9 3
      src/nodes/accessors/BufferAttributeNode.js
  5. 1 1
      src/nodes/accessors/Object3DNode.js
  6. 2 2
      src/nodes/accessors/ReferenceBaseNode.js
  7. 4 4
      src/nodes/accessors/ReferenceNode.js
  8. 10 4
      src/nodes/accessors/StorageBufferNode.js
  9. 1 1
      src/nodes/accessors/TextureNode.js
  10. 2 2
      src/nodes/accessors/UniformArrayNode.js
  11. 1 1
      src/nodes/code/FunctionCallNode.js
  12. 1 1
      src/nodes/code/FunctionNode.js
  13. 1 1
      src/nodes/core/ArrayNode.js
  14. 1 1
      src/nodes/core/AssignNode.js
  15. 1 1
      src/nodes/core/AttributeNode.js
  16. 1 1
      src/nodes/core/BypassNode.js
  17. 1 1
      src/nodes/core/ContextNode.js
  18. 1 1
      src/nodes/core/InputNode.js
  19. 1 1
      src/nodes/core/InspectorNode.js
  20. 1 1
      src/nodes/core/IsolateNode.js
  21. 83 12
      src/nodes/core/Node.js
  22. 1 1
      src/nodes/core/OutputStructNode.js
  23. 1 1
      src/nodes/core/ParameterNode.js
  24. 1 1
      src/nodes/core/StackNode.js
  25. 1 1
      src/nodes/core/StructNode.js
  26. 1 1
      src/nodes/core/StructTypeNode.js
  27. 1 1
      src/nodes/core/SubBuildNode.js
  28. 1 1
      src/nodes/core/VarNode.js
  29. 1 1
      src/nodes/core/VaryingNode.js
  30. 1 1
      src/nodes/display/ScreenNode.js
  31. 1 1
      src/nodes/geometry/RangeNode.js
  32. 1 1
      src/nodes/gpgpu/AtomicFunctionNode.js
  33. 1 1
      src/nodes/gpgpu/ComputeBuiltinNode.js
  34. 1 1
      src/nodes/gpgpu/SubgroupFunctionNode.js
  35. 1 1
      src/nodes/math/BitcastNode.js
  36. 1 1
      src/nodes/math/ConditionalNode.js
  37. 1 1
      src/nodes/math/MathNode.js
  38. 1 1
      src/nodes/math/OperatorNode.js
  39. 1 1
      src/nodes/math/PackFloatNode.js
  40. 1 1
      src/nodes/math/UnpackFloatNode.js
  41. 1 1
      src/nodes/tsl/TSLBase.js
  42. 21 3
      src/nodes/tsl/TSLCore.js
  43. 1 1
      src/nodes/utils/ArrayElementNode.js
  44. 1 1
      src/nodes/utils/ConvertNode.js
  45. 1 1
      src/nodes/utils/DebugNode.js
  46. 1 1
      src/nodes/utils/FlipNode.js
  47. 1 1
      src/nodes/utils/FunctionOverloadingNode.js
  48. 1 1
      src/nodes/utils/JoinNode.js
  49. 1 1
      src/nodes/utils/MemberNode.js
  50. 48 0
      src/nodes/utils/Remap.js
  51. 0 125
      src/nodes/utils/RemapNode.js
  52. 1 1
      src/nodes/utils/RotateNode.js
  53. 1 1
      src/nodes/utils/SetNode.js
  54. 1 1
      src/nodes/utils/SplitNode.js

+ 2 - 0
examples/webgpu_loader_materialx.html

@@ -260,6 +260,8 @@
 
 				}
 
+				await renderer.compileAsync( model, camera, scene );
+
 			}
 
 			function addGUI() {

+ 0 - 1
src/nodes/Nodes.js

@@ -154,7 +154,6 @@ export { default as LoopNode } from './utils/LoopNode.js';
 export { default as MaxMipLevelNode } from './utils/MaxMipLevelNode.js';
 export { default as MemberNode } from './utils/MemberNode.js';
 export { default as ReflectorNode } from './utils/ReflectorNode.js';
-export { default as RemapNode } from './utils/RemapNode.js';
 export { default as RotateNode } from './utils/RotateNode.js';
 export { default as RTTNode } from './utils/RTTNode.js';
 export { default as SampleNode } from './utils/SampleNode.js';

+ 1 - 1
src/nodes/TSL.js

@@ -35,7 +35,7 @@ export * from './utils/MatcapUV.js';
 export * from './utils/MaxMipLevelNode.js';
 export * from './utils/Oscillators.js';
 export * from './utils/Packing.js';
-export * from './utils/RemapNode.js';
+export * from './utils/Remap.js';
 export * from './utils/UVUtils.js';
 export * from './utils/SpriteUtils.js';
 export * from './utils/ViewportUtils.js';

+ 9 - 3
src/nodes/accessors/BufferAttributeNode.js

@@ -165,6 +165,8 @@ class BufferAttributeNode extends InputNode {
 	 */
 	getHash( builder ) {
 
+		let id;
+
 		if ( this.bufferStride === 0 && this.bufferOffset === 0 ) {
 
 			let bufferData = builder.globalCache.getData( this.value );
@@ -179,11 +181,15 @@ class BufferAttributeNode extends InputNode {
 
 			}
 
-			return bufferData.node.uuid;
+			id = bufferData.node.id;
+
+		} else {
+
+			id = this.id;
 
 		}
 
-		return this.uuid;
+		return String( id );
 
 	}
 
@@ -194,7 +200,7 @@ class BufferAttributeNode extends InputNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.bufferType === null ) {
 

+ 1 - 1
src/nodes/accessors/Object3DNode.js

@@ -75,7 +75,7 @@ class Object3DNode extends Node {
 	 *
 	 * @return {('mat4'|'vec3'|'float')} The node type.
 	 */
-	getNodeType() {
+	generateNodeType() {
 
 		const scope = this.scope;
 

+ 2 - 2
src/nodes/accessors/ReferenceBaseNode.js

@@ -57,7 +57,7 @@ class ReferenceElementNode extends ArrayElementNode {
 	 *
 	 * @return {string} The node type.
 	 */
-	getNodeType() {
+	generateNodeType() {
 
 		return this.referenceNode.uniformType;
 
@@ -230,7 +230,7 @@ class ReferenceBaseNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.node === null ) {
 

+ 4 - 4
src/nodes/accessors/ReferenceNode.js

@@ -62,7 +62,7 @@ class ReferenceElementNode extends ArrayElementNode {
 	 *
 	 * @return {string} The node type.
 	 */
-	getNodeType() {
+	generateNodeType() {
 
 		return this.referenceNode.uniformType;
 
@@ -71,8 +71,8 @@ class ReferenceElementNode extends ArrayElementNode {
 	generate( builder ) {
 
 		const snippet = super.generate( builder );
-		const arrayType = this.referenceNode.getNodeType();
-		const elementType = this.getNodeType();
+		const arrayType = this.referenceNode.getNodeType( builder );
+		const elementType = this.getNodeType( builder );
 
 		return builder.format( snippet, arrayType, elementType );
 
@@ -296,7 +296,7 @@ class ReferenceNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.node === null ) {
 

+ 10 - 4
src/nodes/accessors/StorageBufferNode.js

@@ -168,6 +168,8 @@ class StorageBufferNode extends BufferNode {
 	 */
 	getHash( builder ) {
 
+		let id;
+
 		if ( this.bufferCount === 0 ) {
 
 			let bufferData = builder.globalCache.getData( this.value );
@@ -182,11 +184,15 @@ class StorageBufferNode extends BufferNode {
 
 			}
 
-			return bufferData.node.uuid;
+			id = bufferData.node.id;
+
+		} else {
+
+			id = this.id;
 
 		}
 
-		return this.uuid;
+		return String( id );
 
 	}
 
@@ -317,7 +323,7 @@ class StorageBufferNode extends BufferNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.structTypeNode !== null ) {
 
@@ -327,7 +333,7 @@ class StorageBufferNode extends BufferNode {
 
 		if ( builder.isAvailable( 'storageBuffer' ) || builder.isAvailable( 'indirectStorageBuffer' ) ) {
 
-			return super.getNodeType( builder );
+			return super.generateNodeType( builder );
 
 		}
 

+ 1 - 1
src/nodes/accessors/TextureNode.js

@@ -217,7 +217,7 @@ class TextureNode extends UniformNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( /*builder*/ ) {
+	generateNodeType( /*builder*/ ) {
 
 		if ( this.value.isDepthTexture === true ) return 'float';
 

+ 2 - 2
src/nodes/accessors/UniformArrayNode.js

@@ -41,7 +41,7 @@ class UniformArrayElementNode extends ArrayElementNode {
 	generate( builder ) {
 
 		const snippet = super.generate( builder );
-		const type = this.getNodeType();
+		const type = this.getNodeType( builder );
 		const paddedType = this.node.getPaddedType();
 
 		return builder.format( snippet, paddedType, type );
@@ -135,7 +135,7 @@ class UniformArrayNode extends BufferNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( /*builder*/ ) {
+	generateNodeType( /*builder*/ ) {
 
 		return this.paddedType;
 

+ 1 - 1
src/nodes/code/FunctionCallNode.js

@@ -76,7 +76,7 @@ class FunctionCallNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @returns {string} The type of this node.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.functionNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/code/FunctionNode.js

@@ -53,7 +53,7 @@ class FunctionNode extends CodeNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.getNodeFunction( builder ).type;
 

+ 1 - 1
src/nodes/core/ArrayNode.js

@@ -77,7 +77,7 @@ class ArrayNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The type of the node.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.nodeType === null ) {
 

+ 1 - 1
src/nodes/core/AssignNode.js

@@ -63,7 +63,7 @@ class AssignNode extends TempNode {
 
 	}
 
-	getNodeType( builder, output ) {
+	generateNodeType( builder, output ) {
 
 		return output !== 'void' ? this.targetNode.getNodeType( builder ) : 'void';
 

+ 1 - 1
src/nodes/core/AttributeNode.js

@@ -43,7 +43,7 @@ class AttributeNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		let nodeType = this.nodeType;
 

+ 1 - 1
src/nodes/core/BypassNode.js

@@ -55,7 +55,7 @@ class BypassNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.outputNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/core/ContextNode.js

@@ -79,7 +79,7 @@ class ContextNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.node.getNodeType( builder );
 

+ 1 - 1
src/nodes/core/InputNode.js

@@ -51,7 +51,7 @@ class InputNode extends Node {
 
 	}
 
-	getNodeType( /*builder*/ ) {
+	generateNodeType( /*builder*/ ) {
 
 		if ( this.nodeType === null ) {
 

+ 1 - 1
src/nodes/core/InspectorNode.js

@@ -72,7 +72,7 @@ class InspectorNode extends Node {
 	 * @param {NodeBuilder} builder - The node builder.
 	 * @returns {string}
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.node.getNodeType( builder );
 

+ 1 - 1
src/nodes/core/IsolateNode.js

@@ -53,7 +53,7 @@ class IsolateNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const previousCache = builder.getCache();
 		const cache = builder.getCacheFromNode( this, this.parent );

+ 83 - 12
src/nodes/core/Node.js

@@ -68,14 +68,6 @@ class Node extends EventDispatcher {
 		 */
 		this.updateAfterType = NodeUpdateType.NONE;
 
-		/**
-		 * The UUID of the node.
-		 *
-		 * @type {string}
-		 * @readonly
-		 */
-		this.uuid = MathUtils.generateUUID();
-
 		/**
 		 * The version of the node. The version automatically is increased when {@link Node#needsUpdate} is set to `true`.
 		 *
@@ -133,6 +125,15 @@ class Node extends EventDispatcher {
 		 */
 		this._cacheKey = null;
 
+		/**
+		 * The UUID of the node.
+		 *
+		 * @type {string}
+		 * @default null
+		 * @private
+		 */
+		this._uuid = null;
+
 		/**
 		 * The cache key's version.
 		 *
@@ -142,7 +143,13 @@ class Node extends EventDispatcher {
 		 */
 		this._cacheKeyVersion = 0;
 
-		Object.defineProperty( this, 'id', { value: _nodeId ++ } );
+		/**
+		 * The unique ID of the node.
+		 *
+		 * @type {number}
+		 * @readonly
+		 */
+		this.id = _nodeId ++;
 
 		/**
 		 * The stack trace of the node for debugging purposes.
@@ -177,6 +184,24 @@ class Node extends EventDispatcher {
 
 	}
 
+	/**
+	 * The UUID of the node.
+	 *
+	 * @type {string}
+	 * @readonly
+	 */
+	get uuid() {
+
+		if ( this._uuid === null ) {
+
+			this._uuid = MathUtils.generateUUID();
+
+		}
+
+		return this._uuid;
+
+	}
+
 	/**
 	 * The type of the class. The value is usually the constructor name.
 	 *
@@ -469,7 +494,7 @@ class Node extends EventDispatcher {
 	 */
 	getHash( /*builder*/ ) {
 
-		return this.uuid;
+		return String( this.id );
 
 	}
 
@@ -540,15 +565,61 @@ class Node extends EventDispatcher {
 	 * Returns the node's type.
 	 *
 	 * @param {NodeBuilder} builder - The current node builder.
+	 * @param {string} [output=null] - The output of the node.
+	 * @return {string} The type of the node.
+	 */
+	getNodeType( builder, output = null ) {
+
+		const nodeData = builder.getDataFromNode( this );
+
+		let type;
+
+		if ( output !== null ) {
+
+			nodeData.typeFromOutput = nodeData.typeFromOutput || {};
+
+			type = nodeData.typeFromOutput[ output ];
+
+			if ( type === undefined ) {
+
+				type = this.generateNodeType( builder, output );
+
+				nodeData.typeFromOutput[ output ] = type;
+
+			}
+
+		} else {
+
+			type = nodeData.type;
+
+			if ( type === undefined ) {
+
+				type = this.generateNodeType( builder );
+
+				nodeData.type = type;
+
+			}
+
+		}
+
+		return type;
+
+	}
+
+	/**
+	 * Returns the node's type.
+	 *
+	 * @param {NodeBuilder} builder - The current node builder.
+	 * @param {string} [output=null] - The output of the node.
 	 * @return {string} The type of the node.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder, output = null ) {
 
 		const nodeProperties = builder.getNodeProperties( this );
 
 		if ( nodeProperties.outputNode ) {
 
-			return nodeProperties.outputNode.getNodeType( builder );
+			return nodeProperties.outputNode.getNodeType( builder, output );
 
 		}
 

+ 1 - 1
src/nodes/core/OutputStructNode.js

@@ -42,7 +42,7 @@ class OutputStructNode extends Node {
 
 	}
 
-	getNodeType( /*builder*/ ) {
+	generateNodeType( /*builder*/ ) {
 
 		return 'OutputType';
 

+ 1 - 1
src/nodes/core/ParameterNode.js

@@ -68,7 +68,7 @@ class ParameterNode extends PropertyNode {
 
 	getHash() {
 
-		return this.uuid;
+		return String( this.id );
 
 	}
 

+ 1 - 1
src/nodes/core/StackNode.js

@@ -95,7 +95,7 @@ class StackNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.hasOutput( builder ) ? this.outputNode.getNodeType( builder ) : 'void';
 

+ 1 - 1
src/nodes/core/StructNode.js

@@ -40,7 +40,7 @@ class StructNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.structTypeNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/core/StructTypeNode.js

@@ -122,7 +122,7 @@ class StructTypeNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const structType = builder.getStructTypeFromNode( this, this.membersLayout, this.name );
 

+ 1 - 1
src/nodes/core/SubBuildNode.js

@@ -46,7 +46,7 @@ class SubBuildNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.nodeType !== null ) return this.nodeType;
 

+ 1 - 1
src/nodes/core/VarNode.js

@@ -151,7 +151,7 @@ class VarNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.node.getNodeType( builder );
 

+ 1 - 1
src/nodes/core/VaryingNode.js

@@ -104,7 +104,7 @@ class VaryingNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		// VaryingNode is auto type
 

+ 1 - 1
src/nodes/display/ScreenNode.js

@@ -72,7 +72,7 @@ class ScreenNode extends Node {
 	 *
 	 * @return {('float'|'vec2'|'vec4')} The node type.
 	 */
-	getNodeType() {
+	generateNodeType() {
 
 		if ( this.scope === ScreenNode.DPR ) return 'float';
 		if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';

+ 1 - 1
src/nodes/geometry/RangeNode.js

@@ -84,7 +84,7 @@ class RangeNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return builder.object.count > 1 ? builder.getTypeFromLength( this.getVectorLength( builder ) ) : 'float';
 

+ 1 - 1
src/nodes/gpgpu/AtomicFunctionNode.js

@@ -82,7 +82,7 @@ class AtomicFunctionNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.getInputType( builder );
 

+ 1 - 1
src/nodes/gpgpu/ComputeBuiltinNode.js

@@ -55,7 +55,7 @@ class ComputeBuiltinNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( /*builder*/ ) {
+	generateNodeType( /*builder*/ ) {
 
 		return this.nodeType;
 

+ 1 - 1
src/nodes/gpgpu/SubgroupFunctionNode.js

@@ -75,7 +75,7 @@ class SubgroupFunctionNode extends TempNode {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const method = this.method;
 

+ 1 - 1
src/nodes/math/BitcastNode.js

@@ -60,7 +60,7 @@ class BitcastNode extends TempNode {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		// GLSL aliasing
 		if ( this.inputType !== null ) {

+ 1 - 1
src/nodes/math/ConditionalNode.js

@@ -66,7 +66,7 @@ class ConditionalNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const { ifNode, elseNode } = builder.getNodeProperties( this );
 

+ 1 - 1
src/nodes/math/MathNode.js

@@ -133,7 +133,7 @@ class MathNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const method = this.method;
 

+ 1 - 1
src/nodes/math/OperatorNode.js

@@ -108,7 +108,7 @@ class OperatorNode extends TempNode {
 	 * @param {?string} [output=null] - The output type.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder, output = null ) {
+	generateNodeType( builder, output = null ) {
 
 		const op = this.op;
 

+ 1 - 1
src/nodes/math/PackFloatNode.js

@@ -48,7 +48,7 @@ class PackFloatNode extends TempNode {
 
 	}
 
-	getNodeType() {
+	generateNodeType() {
 
 		return 'uint';
 

+ 1 - 1
src/nodes/math/UnpackFloatNode.js

@@ -48,7 +48,7 @@ class UnpackFloatNode extends TempNode {
 
 	}
 
-	getNodeType() {
+	generateNodeType() {
 
 		return 'vec2';
 

+ 1 - 1
src/nodes/tsl/TSLBase.js

@@ -21,7 +21,7 @@ export * from '../accessors/BufferAttributeNode.js'; // .toAttribute()
 export * from '../gpgpu/ComputeNode.js'; // .compute()
 export * from '../core/IsolateNode.js'; // .isolate()
 export * from '../core/BypassNode.js'; // .bypass()
-export * from '../utils/RemapNode.js'; // .remap(), .remapClamp()
+export * from '../utils/Remap.js'; // .remap(), .remapClamp()
 export * from '../code/ExpressionNode.js'; // expression()
 export * from '../utils/Discard.js'; // Discard(), Return()
 export * from '../display/RenderOutputNode.js'; // .renderOutput()

+ 21 - 3
src/nodes/tsl/TSLCore.js

@@ -461,7 +461,7 @@ class ShaderCallNodeInternal extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.shaderNode.nodeType || this.getOutputNode( builder ).getNodeType( builder );
 
@@ -917,7 +917,25 @@ const ConvertType = function ( type, cacheMap = null ) {
 
 // exports
 
-export const defined = ( v ) => typeof v === 'object' && v !== null ? v.value : v; // TODO: remove boolean conversion and defined function
+export function defined( value ) {
+
+	if ( value && value.isNode ) {
+
+		value.traverse( ( node ) => {
+
+			if ( node.isConstNode ) {
+
+				value = node.value;
+
+			}
+
+		} );
+
+	}
+
+	return Boolean( value );
+
+}
 
 // utils
 
@@ -1018,7 +1036,7 @@ class FnNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.shaderNode.getNodeType( builder ) || 'float';
 

+ 1 - 1
src/nodes/utils/ArrayElementNode.js

@@ -55,7 +55,7 @@ class ArrayElementNode extends Node { // @TODO: If extending from TempNode it br
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.node.getElementType( builder );
 

+ 1 - 1
src/nodes/utils/ConvertNode.js

@@ -48,7 +48,7 @@ class ConvertNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const requestType = this.node.getNodeType( builder );
 

+ 1 - 1
src/nodes/utils/DebugNode.js

@@ -19,7 +19,7 @@ class DebugNode extends TempNode {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.node.getNodeType( builder );
 

+ 1 - 1
src/nodes/utils/FlipNode.js

@@ -56,7 +56,7 @@ class FlipNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.sourceNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/utils/FunctionOverloadingNode.js

@@ -65,7 +65,7 @@ class FunctionOverloadingNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		const candidateFn = this.getCandidateFn( builder );
 

+ 1 - 1
src/nodes/utils/JoinNode.js

@@ -42,7 +42,7 @@ class JoinNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.nodeType !== null ) {
 

+ 1 - 1
src/nodes/utils/MemberNode.js

@@ -66,7 +66,7 @@ class MemberNode extends Node {
 
 	}
 
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		if ( this.hasMember( builder ) === false ) {
 

+ 48 - 0
src/nodes/utils/Remap.js

@@ -0,0 +1,48 @@
+import { float, addMethodChaining, Fn, bool, defined } from '../tsl/TSLCore.js';
+
+/**
+ * This node allows to remap a node value from one range into another. E.g a value of
+ * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.
+ * `remap` takes care of that and converts the original value of `0.4` to `0.5`.
+ *
+ * @tsl
+ * @function
+ * @param {Node} node - The node that should be remapped.
+ * @param {Node} inLowNode - The source or current lower bound of the range.
+ * @param {Node} inHighNode - The source or current upper bound of the range.
+ * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
+ * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
+ * @returns {Node}
+ */
+export const remap = /*@__PURE__*/ Fn( ( [ node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ), doClamp = bool( false ) ] ) => {
+
+	let t = node.sub( inLowNode ).div( inHighNode.sub( inLowNode ) );
+
+	if ( defined( doClamp ) ) t = t.clamp();
+
+	return t.mul( outHighNode.sub( outLowNode ) ).add( outLowNode );
+
+} );
+
+/**
+ * This node allows to remap a node value from one range into another but with enabled clamping. E.g a value of
+ * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.
+ * `remapClamp` takes care of that and converts the original value of `0.4` to `0.5`.
+ *
+ * @tsl
+ * @function
+ * @param {Node} node - The node that should be remapped.
+ * @param {Node} inLowNode - The source or current lower bound of the range.
+ * @param {Node} inHighNode - The source or current upper bound of the range.
+ * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
+ * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
+ * @returns {Node}
+ */
+function remapClamp( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) {
+
+	return remap( node, inLowNode, inHighNode, outLowNode, outHighNode, true );
+
+}
+
+addMethodChaining( 'remap', remap );
+addMethodChaining( 'remapClamp', remapClamp );

+ 0 - 125
src/nodes/utils/RemapNode.js

@@ -1,125 +0,0 @@
-import Node from '../core/Node.js';
-import { float, addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
-
-/**
- * This node allows to remap a node value from one range into another. E.g a value of
- * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.
- * `RemapNode` takes care of that and converts the original value of `0.4` to `0.5`.
- *
- * @augments Node
- */
-class RemapNode extends Node {
-
-	static get type() {
-
-		return 'RemapNode';
-
-	}
-
-	/**
-	 * Constructs a new remap node.
-	 *
-	 * @param {Node} node - The node that should be remapped.
-	 * @param {Node} inLowNode - The source or current lower bound of the range.
-	 * @param {Node} inHighNode - The source or current upper bound of the range.
-	 * @param {Node} [outLowNode=float(0)] - The target lower bound of the range.
-	 * @param {Node} [outHighNode=float(1)] - The target upper bound of the range.
-	 */
-	constructor( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) {
-
-		super();
-
-		/**
-		 * The node that should be remapped.
-		 *
-		 * @type {Node}
-		 */
-		this.node = node;
-
-		/**
-		 * The source or current lower bound of the range.
-		 *
-		 * @type {Node}
-		 */
-		this.inLowNode = inLowNode;
-
-		/**
-		 * The source or current upper bound of the range.
-		 *
-		 * @type {Node}
-		 */
-		this.inHighNode = inHighNode;
-
-		/**
-		 * The target lower bound of the range.
-		 *
-		 * @type {Node}
-		 * @default float(0)
-		 */
-		this.outLowNode = outLowNode;
-
-		/**
-		 * The target upper bound of the range.
-		 *
-		 * @type {Node}
-		 * @default float(1)
-		 */
-		this.outHighNode = outHighNode;
-
-		/**
-		 * Whether the node value should be clamped before
-		 * remapping it to the target range.
-		 *
-		 * @type {boolean}
-		 * @default true
-		 */
-		this.doClamp = true;
-
-	}
-
-	setup() {
-
-		const { node, inLowNode, inHighNode, outLowNode, outHighNode, doClamp } = this;
-
-		let t = node.sub( inLowNode ).div( inHighNode.sub( inLowNode ) );
-
-		if ( doClamp === true ) t = t.clamp();
-
-		return t.mul( outHighNode.sub( outLowNode ) ).add( outLowNode );
-
-	}
-
-}
-
-export default RemapNode;
-
-/**
- * TSL function for creating a remap node.
- *
- * @tsl
- * @function
- * @param {Node} node - The node that should be remapped.
- * @param {Node} inLowNode - The source or current lower bound of the range.
- * @param {Node} inHighNode - The source or current upper bound of the range.
- * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
- * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
- * @returns {RemapNode}
- */
-export const remap = /*@__PURE__*/ nodeProxy( RemapNode, null, null, { doClamp: false } ).setParameterLength( 3, 5 );
-
-/**
- * TSL function for creating a remap node, but with enabled clamping.
- *
- * @tsl
- * @function
- * @param {Node} node - The node that should be remapped.
- * @param {Node} inLowNode - The source or current lower bound of the range.
- * @param {Node} inHighNode - The source or current upper bound of the range.
- * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.
- * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.
- * @returns {RemapNode}
- */
-export const remapClamp = /*@__PURE__*/ nodeProxy( RemapNode ).setParameterLength( 3, 5 );
-
-addMethodChaining( 'remap', remap );
-addMethodChaining( 'remapClamp', remapClamp );

+ 1 - 1
src/nodes/utils/RotateNode.js

@@ -49,7 +49,7 @@ class RotateNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node's type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.positionNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/utils/SetNode.js

@@ -60,7 +60,7 @@ class SetNode extends TempNode {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return this.sourceNode.getNodeType( builder );
 

+ 1 - 1
src/nodes/utils/SplitNode.js

@@ -94,7 +94,7 @@ class SplitNode extends Node {
 	 * @param {NodeBuilder} builder - The current node builder.
 	 * @return {string} The node type.
 	 */
-	getNodeType( builder ) {
+	generateNodeType( builder ) {
 
 		return builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) );
 

粤ICP备19079148号