@openhps/core
Version:
Open Hybrid Positioning System - Core component
58 lines • 2.08 kB
JavaScript
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);
});
}
}