UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

188 lines (175 loc) 5.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.scriptableValue = exports.default = void 0; var _Node = _interopRequireDefault(require("../core/Node.js")); var _NodeUtils = require("../core/NodeUtils.js"); var _TSLBase = require("../tsl/TSLBase.js"); var _EventDispatcher = require("../../core/EventDispatcher.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * `ScriptableNode` uses this class to manage script inputs and outputs. * * @augments Node */ class ScriptableValueNode extends _Node.default { static get type() { return 'ScriptableValueNode'; } /** * Constructs a new scriptable node. * * @param {any} [value=null] - The value. */ constructor(value = null) { super(); /** * A reference to the value. * * @private * @default null */ this._value = value; /** * Depending on the type of `_value`, this property might cache parsed data. * * @private * @default null */ this._cache = null; /** * If this node represents an input, this property represents the input type. * * @type {?string} * @default null */ this.inputType = null; /** * If this node represents an output, this property represents the output type. * * @type {?string} * @default null */ this.outputType = null; /** * An event dispatcher for managing events. * * @type {EventDispatcher} */ this.events = new _EventDispatcher.EventDispatcher(); /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isScriptableValueNode = true; } /** * Whether this node represents an output or not. * * @type {boolean} * @readonly * @default true */ get isScriptableOutputNode() { return this.outputType !== null; } set value(val) { if (this._value === val) return; if (this._cache && this.inputType === 'URL' && this.value.value instanceof ArrayBuffer) { URL.revokeObjectURL(this._cache); this._cache = null; } this._value = val; this.events.dispatchEvent({ type: 'change' }); this.refresh(); } /** * The node's value. * * @type {any} */ get value() { return this._value; } /** * Dispatches the `refresh` event. */ refresh() { this.events.dispatchEvent({ type: 'refresh' }); } /** * The `value` property usually represents a node or even binary data in form of array buffers. * In this case, this method tries to return the actual value behind the complex type. * * @return {any} The value. */ getValue() { const value = this.value; if (value && this._cache === null && this.inputType === 'URL' && value.value instanceof ArrayBuffer) { this._cache = URL.createObjectURL(new Blob([value.value])); } else if (value && value.value !== null && value.value !== undefined && ((this.inputType === 'URL' || this.inputType === 'String') && typeof value.value === 'string' || this.inputType === 'Number' && typeof value.value === 'number' || this.inputType === 'Vector2' && value.value.isVector2 || this.inputType === 'Vector3' && value.value.isVector3 || this.inputType === 'Vector4' && value.value.isVector4 || this.inputType === 'Color' && value.value.isColor || this.inputType === 'Matrix3' && value.value.isMatrix3 || this.inputType === 'Matrix4' && value.value.isMatrix4)) { return value.value; } return this._cache || value; } /** * Overwritten since the node type is inferred from the value. * * @param {NodeBuilder} builder - The current node builder. * @return {string} The node type. */ getNodeType(builder) { return this.value && this.value.isNode ? this.value.getNodeType(builder) : 'float'; } setup() { return this.value && this.value.isNode ? this.value : (0, _TSLBase.float)(); } serialize(data) { super.serialize(data); if (this.value !== null) { if (this.inputType === 'ArrayBuffer') { data.value = (0, _NodeUtils.arrayBufferToBase64)(this.value); } else { data.value = this.value ? this.value.toJSON(data.meta).uuid : null; } } else { data.value = null; } data.inputType = this.inputType; data.outputType = this.outputType; } deserialize(data) { super.deserialize(data); let value = null; if (data.value !== null) { if (data.inputType === 'ArrayBuffer') { value = (0, _NodeUtils.base64ToArrayBuffer)(data.value); } else if (data.inputType === 'Texture') { value = data.meta.textures[data.value]; } else { value = data.meta.nodes[data.value] || null; } } this.value = value; this.inputType = data.inputType; this.outputType = data.outputType; } } var _default = exports.default = ScriptableValueNode; /** * TSL function for creating a scriptable value node. * * @tsl * @function * @param {any} [value] - The value. * @returns {ScriptableValueNode} */ const scriptableValue = exports.scriptableValue = /*@__PURE__*/(0, _TSLBase.nodeProxy)(ScriptableValueNode).setParameterLength(1);