UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

58 lines 2.08 kB
import { ObjectProcessingNode } from '../ObjectProcessingNode'; import { ReferenceSpace } from '../../data'; /** * This node converts the positions of data objects inside the frame * to another reference space. * @category Processing node */ export class ReferenceSpaceConversionNode extends ObjectProcessingNode { constructor(referenceSpace, options) { super(options); if (referenceSpace instanceof ReferenceSpace) { this._referenceSpace = referenceSpace; this._referenceSpaceUID = referenceSpace.uid; } else { this._referenceSpaceUID = referenceSpace; } this.once('build', this._onRegisterService.bind(this)); } _onRegisterService() { return new Promise(resolve => { const service = this.graph.findDataService(ReferenceSpace); // Update reference space when modified service.on('insert', (uid, space) => { if (uid === this._referenceSpaceUID) { this._referenceSpace = space; } }); // Update to the latest version service.findByUID(this._referenceSpaceUID).then(space => { this._referenceSpace = space; resolve(); }).catch(() => { // Ignore, most likely not calibrated or stored yet resolve(); }); }); } processObject(object, frame) { return new Promise(resolve => { // First check if a reference space is provided inside // the data frame. If not, use the stored reference space let referenceSpace = frame.getObjectByUID(this._referenceSpaceUID); if (referenceSpace === null || referenceSpace === undefined) { referenceSpace = this._referenceSpace; } if (object.getPosition() && object.uid !== referenceSpace.uid) { if (this.options.inverse) { // Convert from reference space to global object.setPosition(object.getPosition(), referenceSpace); } else { // Convert global space to reference space object.setPosition(object.getPosition(referenceSpace)); } } resolve(object); }); } }