Skip to content

⬅️ Back to Table of Contents

📄 FunctionOverloadingNode.js

📊 Analysis Summary

Metric Count
🔧 Functions 3
🧱 Classes 1
📦 Imports 2
📊 Variables & Constants 10

📚 Table of Contents

🛠️ File Location:

📂 src/nodes/utils/FunctionOverloadingNode.js

📦 Imports

Name Source
Node ../core/Node.js
nodeProxy ../tsl/TSLCore.js

Variables & Constants

Name Type Kind Value Exported
params Node[] let/var this.parametersNodes
candidateFnCall ShaderCallNodeInternal let/var this._candidateFnCall
candidateFn any let/var null
candidateScore number let/var - 1
shaderNode any let/var functionNode.shaderNode
layout any let/var shaderNode.layout
inputs any let/var layout.inputs
score number let/var 0
param Node let/var params[ i ]
input any let/var inputs[ i ]

Functions

FunctionOverloadingNode.getNodeType(): string

JSDoc:

/**
     * This method is overwritten since the node type is inferred from
     * the function's return type.
     *
     * @param {NodeBuilder} builder - The current node builder.
     * @return {string} The node type.
     */

Returns: string

Code
getNodeType() {

        return this.functionNodes[ 0 ].shaderNode.layout.type;

    }

FunctionOverloadingNode.setup(builder: any): ShaderCallNodeInternal

Parameters:

  • builder any

Returns: ShaderCallNodeInternal

Calls:

  • param.getNodeType
  • candidateFn
Code
setup( builder ) {

        const params = this.parametersNodes;

        let candidateFnCall = this._candidateFnCall;

        if ( candidateFnCall === null ) {

            let candidateFn = null;
            let candidateScore = - 1;

            for ( const functionNode of this.functionNodes ) {

                const shaderNode = functionNode.shaderNode;
                const layout = shaderNode.layout;

                if ( layout === null ) {

                    throw new Error( 'FunctionOverloadingNode: FunctionNode must be a layout.' );

                }

                const inputs = layout.inputs;

                if ( params.length === inputs.length ) {

                    let score = 0;

                    for ( let i = 0; i < params.length; i ++ ) {

                        const param = params[ i ];
                        const input = inputs[ i ];

                        if ( param.getNodeType( builder ) === input.type ) {

                            score ++;

                        } else {

                            score = 0;

                        }

                    }

                    if ( score > candidateScore ) {

                        candidateFn = functionNode;
                        candidateScore = score;

                    }

                }

            }

            this._candidateFnCall = candidateFnCall = candidateFn( ...params );

        }

        return candidateFnCall;

    }

overloadingFn(functionNodes: Function[]): FunctionOverloadingNode

Parameters:

  • functionNodes Function[]

Returns: FunctionOverloadingNode

Code
( functionNodes ) => ( ...params ) => overloadingBaseFn( functionNodes, ...params )

Classes

FunctionOverloadingNode

Class Code
class FunctionOverloadingNode extends Node {

    static get type() {

        return 'FunctionOverloadingNode';

    }

    /**
     * Constructs a new function overloading node.
     *
     * @param {Array<Function>} functionNodes - Array of `Fn` function definitions.
     * @param {...Node} parametersNodes - A list of parameter nodes.
     */
    constructor( functionNodes = [], ...parametersNodes ) {

        super();

        /**
         * Array of `Fn` function definitions.
         *
         * @type {Array<Function>}
         */
        this.functionNodes = functionNodes;

        /**
         * A list of parameter nodes.
         *
         * @type {Array<Node>}
         */
        this.parametersNodes = parametersNodes;

        /**
         * The selected overloaded function call.
         *
         * @private
         * @type {ShaderCallNodeInternal}
         */
        this._candidateFnCall = null;

        /**
         * This node is marked as global.
         *
         * @type {boolean}
         * @default true
         */
        this.global = true;

    }

    /**
     * This method is overwritten since the node type is inferred from
     * the function's return type.
     *
     * @param {NodeBuilder} builder - The current node builder.
     * @return {string} The node type.
     */
    getNodeType() {

        return this.functionNodes[ 0 ].shaderNode.layout.type;

    }

    setup( builder ) {

        const params = this.parametersNodes;

        let candidateFnCall = this._candidateFnCall;

        if ( candidateFnCall === null ) {

            let candidateFn = null;
            let candidateScore = - 1;

            for ( const functionNode of this.functionNodes ) {

                const shaderNode = functionNode.shaderNode;
                const layout = shaderNode.layout;

                if ( layout === null ) {

                    throw new Error( 'FunctionOverloadingNode: FunctionNode must be a layout.' );

                }

                const inputs = layout.inputs;

                if ( params.length === inputs.length ) {

                    let score = 0;

                    for ( let i = 0; i < params.length; i ++ ) {

                        const param = params[ i ];
                        const input = inputs[ i ];

                        if ( param.getNodeType( builder ) === input.type ) {

                            score ++;

                        } else {

                            score = 0;

                        }

                    }

                    if ( score > candidateScore ) {

                        candidateFn = functionNode;
                        candidateScore = score;

                    }

                }

            }

            this._candidateFnCall = candidateFnCall = candidateFn( ...params );

        }

        return candidateFnCall;

    }

}

Methods

getNodeType(): string
Code
getNodeType() {

        return this.functionNodes[ 0 ].shaderNode.layout.type;

    }
setup(builder: any): ShaderCallNodeInternal
Code
setup( builder ) {

        const params = this.parametersNodes;

        let candidateFnCall = this._candidateFnCall;

        if ( candidateFnCall === null ) {

            let candidateFn = null;
            let candidateScore = - 1;

            for ( const functionNode of this.functionNodes ) {

                const shaderNode = functionNode.shaderNode;
                const layout = shaderNode.layout;

                if ( layout === null ) {

                    throw new Error( 'FunctionOverloadingNode: FunctionNode must be a layout.' );

                }

                const inputs = layout.inputs;

                if ( params.length === inputs.length ) {

                    let score = 0;

                    for ( let i = 0; i < params.length; i ++ ) {

                        const param = params[ i ];
                        const input = inputs[ i ];

                        if ( param.getNodeType( builder ) === input.type ) {

                            score ++;

                        } else {

                            score = 0;

                        }

                    }

                    if ( score > candidateScore ) {

                        candidateFn = functionNode;
                        candidateScore = score;

                    }

                }

            }

            this._candidateFnCall = candidateFnCall = candidateFn( ...params );

        }

        return candidateFnCall;

    }