UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

86 lines (85 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.struct = exports.default = void 0; var _Node = _interopRequireDefault(require("./Node.js")); var _StructTypeNode = _interopRequireDefault(require("./StructTypeNode.js")); var _TSLCore = require("../tsl/TSLCore.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * StructNode allows to create custom structures with multiple members. * This can also be used to define structures in attribute and uniform data. * * ```js * // Define a custom struct * const BoundingBox = struct( { min: 'vec3', max: 'vec3' } ); * * // Create a new instance of the struct * const bb = BoundingBox( vec3( 0 ), vec3( 1 ) ); // style 1 * const bb = BoundingBox( { min: vec3( 0 ), max: vec3( 1 ) } ); // style 2 * * // Access the struct members * const min = bb.get( 'min' ); * * // Assign a new value to a member * min.assign( vec3() ); * ``` * @augments Node */ class StructNode extends _Node.default { static get type() { return 'StructNode'; } constructor(structLayoutNode, values) { super('vec3'); this.structLayoutNode = structLayoutNode; this.values = values; this.isStructNode = true; } getNodeType(builder) { return this.structLayoutNode.getNodeType(builder); } getMemberType(builder, name) { return this.structLayoutNode.getMemberType(builder, name); } generate(builder) { const nodeVar = builder.getVarFromNode(this); const structType = nodeVar.type; const propertyName = builder.getPropertyName(nodeVar); builder.addLineFlowCode(`${propertyName} = ${builder.generateStruct(structType, this.structLayoutNode.membersLayout, this.values)}`, this); return nodeVar.name; } } var _default = exports.default = StructNode; /** * TSL function for creating a struct node. * * @tsl * @function * @param {Object} membersLayout - The layout of the struct members. * @param {?string} [name=null] - The name of the struct. * @returns {Function} The struct function. */ const struct = (membersLayout, name = null) => { const structLayout = new _StructTypeNode.default(membersLayout, name); const struct = (...params) => { let values = null; if (params.length > 0) { if (params[0].isNode) { values = {}; const names = Object.keys(membersLayout); for (let i = 0; i < params.length; i++) { values[names[i]] = params[i]; } } else { values = params[0]; } } return (0, _TSLCore.nodeObject)(new StructNode(structLayout, values)); }; struct.layout = structLayout; struct.isStruct = true; return struct; }; exports.struct = struct;