UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

121 lines (116 loc) 3.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.attribute = void 0; var _Node = _interopRequireDefault(require("./Node.js")); var _TSLBase = require("../tsl/TSLBase.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Base class for representing shader attributes as nodes. * * @augments Node */ class AttributeNode extends _Node.default { 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 = (0, _TSLBase.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; } } var _default = exports.default = AttributeNode; /** * TSL function for creating an attribute node. * * @tsl * @function * @param {string} name - The name of the attribute. * @param {string} [nodeType] - The node type. * @returns {AttributeNode} */ const attribute = (name, nodeType) => (0, _TSLBase.nodeObject)(new AttributeNode(name, nodeType)); exports.attribute = attribute;