Skip to content

⬅️ Back to Table of Contents

📄 AttributeNode.js

📊 Analysis Summary

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

📚 Table of Contents

🛠️ File Location:

📂 src/nodes/core/AttributeNode.js

📦 Imports

Name Source
Node ./Node.js
nodeObject ../tsl/TSLBase.js
varying ../tsl/TSLBase.js

Variables & Constants

Name Type Kind Value Exported
nodeType string let/var this.nodeType

Functions

AttributeNode.getHash(builder: any): string

Parameters:

  • builder any

Returns: string

Calls:

  • this.getAttributeName
Code
getHash( builder ) {

        return this.getAttributeName( builder );

    }

AttributeNode.getNodeType(builder: any): string

Parameters:

  • builder any

Returns: string

Calls:

  • this.getAttributeName
  • builder.hasGeometryAttribute
  • builder.geometry.getAttribute
  • builder.getTypeFromAttribute
Code
getNodeType( builder ) {

        let nodeType = this.nodeType;

        if ( nodeType === null ) {

            const attributeName = this.getAttributeName( builder );

            if ( builder.hasGeometryAttribute( attributeName ) ) {

                const attribute = builder.geometry.getAttribute( attributeName );

                nodeType = builder.getTypeFromAttribute( attribute );

            } else {

                nodeType = 'float';

            }

        }

        return nodeType;

    }

AttributeNode.setAttributeName(attributeName: string): AttributeNode

JSDoc:

/**
     * Sets the attribute name to the given value. The method can be
     * overwritten in derived classes if the final name must be computed
     * analytically.
     *
     * @param {string} attributeName - The name of the attribute.
     * @return {AttributeNode} A reference to this node.
     */

Parameters:

  • attributeName string

Returns: AttributeNode

Code
setAttributeName( attributeName ) {

        this._attributeName = attributeName;

        return this;

    }

AttributeNode.getAttributeName(): string

JSDoc:

/**
     * Returns the attribute name of this node. The method can be
     * overwritten in derived classes if the final name must be computed
     * analytically.
     *
     * @param {NodeBuilder} builder - The current node builder.
     * @return {string} The attribute name.
     */

Returns: string

Code
getAttributeName( /*builder*/ ) {

        return this._attributeName;

    }

AttributeNode.generate(builder: any): any

Parameters:

  • builder any

Returns: any

Calls:

  • this.getAttributeName
  • this.getNodeType
  • builder.hasGeometryAttribute
  • builder.geometry.getAttribute
  • builder.getTypeFromAttribute
  • builder.getAttribute
  • builder.format
  • varying (from ../tsl/TSLBase.js)
  • nodeVarying.build
  • console.warn
  • builder.generateConst
Code
generate( builder ) {

        const attributeName = this.getAttributeName( builder );
        const nodeType = this.getNodeType( builder );
        const geometryAttribute = builder.hasGeometryAttribute( attributeName );

        if ( geometryAttribute === true ) {

            const attribute = builder.geometry.getAttribute( attributeName );
            const attributeType = builder.getTypeFromAttribute( attribute );

            const nodeAttribute = builder.getAttribute( attributeName, attributeType );

            if ( builder.shaderStage === 'vertex' ) {

                return builder.format( nodeAttribute.name, attributeType, nodeType );

            } else {

                const nodeVarying = varying( this );

                return nodeVarying.build( builder, nodeType );

            }

        } else {

            console.warn( `AttributeNode: Vertex attribute "${ attributeName }" not found on geometry.` );

            return builder.generateConst( nodeType );

        }

    }

AttributeNode.serialize(data: any): void

Parameters:

  • data any

Returns: void

Calls:

  • super.serialize
Code
serialize( data ) {

        super.serialize( data );

        data.global = this.global;
        data._attributeName = this._attributeName;

    }

AttributeNode.deserialize(data: any): void

Parameters:

  • data any

Returns: void

Calls:

  • super.deserialize
Code
deserialize( data ) {

        super.deserialize( data );

        this.global = data.global;
        this._attributeName = data._attributeName;

    }

attribute(name: string, nodeType: string): AttributeNode

Parameters:

  • name string
  • nodeType string

Returns: AttributeNode

Calls:

  • nodeObject (from ../tsl/TSLBase.js)
Code
( name, nodeType = null ) => nodeObject( new AttributeNode( name, nodeType ) )

Classes

AttributeNode

Class Code
class AttributeNode extends Node {

    static get type() {

        return 'AttributeNode';

    }

    /**
     * Constructs a new attribute node.
     *
     * @param {string} attributeName - The name of the attribute.
     * @param {?string} nodeType - The node type.
     */
    constructor( attributeName, nodeType = null ) {

        super( nodeType );

        /**
         * `AttributeNode` sets this property to `true` by default.
         *
         * @type {boolean}
         * @default true
         */
        this.global = true;

        this._attributeName = attributeName;

    }

    getHash( builder ) {

        return this.getAttributeName( builder );

    }

    getNodeType( builder ) {

        let nodeType = this.nodeType;

        if ( nodeType === null ) {

            const attributeName = this.getAttributeName( builder );

            if ( builder.hasGeometryAttribute( attributeName ) ) {

                const attribute = builder.geometry.getAttribute( attributeName );

                nodeType = builder.getTypeFromAttribute( attribute );

            } else {

                nodeType = 'float';

            }

        }

        return nodeType;

    }

    /**
     * Sets the attribute name to the given value. The method can be
     * overwritten in derived classes if the final name must be computed
     * analytically.
     *
     * @param {string} attributeName - The name of the attribute.
     * @return {AttributeNode} A reference to this node.
     */
    setAttributeName( attributeName ) {

        this._attributeName = attributeName;

        return this;

    }

    /**
     * Returns the attribute name of this node. The method can be
     * overwritten in derived classes if the final name must be computed
     * analytically.
     *
     * @param {NodeBuilder} builder - The current node builder.
     * @return {string} The attribute name.
     */
    getAttributeName( /*builder*/ ) {

        return this._attributeName;

    }

    generate( builder ) {

        const attributeName = this.getAttributeName( builder );
        const nodeType = this.getNodeType( builder );
        const geometryAttribute = builder.hasGeometryAttribute( attributeName );

        if ( geometryAttribute === true ) {

            const attribute = builder.geometry.getAttribute( attributeName );
            const attributeType = builder.getTypeFromAttribute( attribute );

            const nodeAttribute = builder.getAttribute( attributeName, attributeType );

            if ( builder.shaderStage === 'vertex' ) {

                return builder.format( nodeAttribute.name, attributeType, nodeType );

            } else {

                const nodeVarying = varying( this );

                return nodeVarying.build( builder, nodeType );

            }

        } else {

            console.warn( `AttributeNode: Vertex attribute "${ attributeName }" not found on geometry.` );

            return builder.generateConst( nodeType );

        }

    }

    serialize( data ) {

        super.serialize( data );

        data.global = this.global;
        data._attributeName = this._attributeName;

    }

    deserialize( data ) {

        super.deserialize( data );

        this.global = data.global;
        this._attributeName = data._attributeName;

    }

}

Methods

getHash(builder: any): string
Code
getHash( builder ) {

        return this.getAttributeName( builder );

    }
getNodeType(builder: any): string
Code
getNodeType( builder ) {

        let nodeType = this.nodeType;

        if ( nodeType === null ) {

            const attributeName = this.getAttributeName( builder );

            if ( builder.hasGeometryAttribute( attributeName ) ) {

                const attribute = builder.geometry.getAttribute( attributeName );

                nodeType = builder.getTypeFromAttribute( attribute );

            } else {

                nodeType = 'float';

            }

        }

        return nodeType;

    }
setAttributeName(attributeName: string): AttributeNode
Code
setAttributeName( attributeName ) {

        this._attributeName = attributeName;

        return this;

    }
getAttributeName(): string
Code
getAttributeName( /*builder*/ ) {

        return this._attributeName;

    }
generate(builder: any): any
Code
generate( builder ) {

        const attributeName = this.getAttributeName( builder );
        const nodeType = this.getNodeType( builder );
        const geometryAttribute = builder.hasGeometryAttribute( attributeName );

        if ( geometryAttribute === true ) {

            const attribute = builder.geometry.getAttribute( attributeName );
            const attributeType = builder.getTypeFromAttribute( attribute );

            const nodeAttribute = builder.getAttribute( attributeName, attributeType );

            if ( builder.shaderStage === 'vertex' ) {

                return builder.format( nodeAttribute.name, attributeType, nodeType );

            } else {

                const nodeVarying = varying( this );

                return nodeVarying.build( builder, nodeType );

            }

        } else {

            console.warn( `AttributeNode: Vertex attribute "${ attributeName }" not found on geometry.` );

            return builder.generateConst( nodeType );

        }

    }
serialize(data: any): void
Code
serialize( data ) {

        super.serialize( data );

        data.global = this.global;
        data._attributeName = this._attributeName;

    }
deserialize(data: any): void
Code
deserialize( data ) {

        super.deserialize( data );

        this.global = data.global;
        this._attributeName = data._attributeName;

    }