|
@@ -3,38 +3,82 @@ import { WebXRSessionManager } from '../webXRSessionManager';
|
|
|
import { Observable, Observer } from '../../../Misc/observable';
|
|
|
import { Matrix } from '../../../Maths/math.vector';
|
|
|
import { TransformNode } from '../../../Meshes/transformNode';
|
|
|
-import { Space } from '../../../Maths/math.axis';
|
|
|
import { WebXRPlaneDetector } from './WebXRPlaneDetector';
|
|
|
import { Nullable } from '../../../types';
|
|
|
import { WebXRHitTestLegacy } from './WebXRHitTestLegacy';
|
|
|
|
|
|
const Name = "xr-anchor-system";
|
|
|
-//register the plugin
|
|
|
-WebXRFeaturesManager.AddWebXRFeature(Name, (xrSessionManager, options) => {
|
|
|
- return () => new WebXRAnchorSystem(xrSessionManager, options);
|
|
|
-});
|
|
|
|
|
|
+/**
|
|
|
+ * Configuration options of the anchor system
|
|
|
+ */
|
|
|
export interface WebXRAnchorSystemOptions {
|
|
|
+ /**
|
|
|
+ * a node that will be used to convert local to world coordinates
|
|
|
+ */
|
|
|
worldParentNode?: TransformNode;
|
|
|
- coordinatesSpace?: Space;
|
|
|
+ /**
|
|
|
+ * should the anchor system use plane detection.
|
|
|
+ * If set to true, the plane-detection feature should be set using setPlaneDetector
|
|
|
+ */
|
|
|
usePlaneDetection?: boolean;
|
|
|
+ /**
|
|
|
+ * Should a new anchor be added every time a select event is triggered
|
|
|
+ */
|
|
|
addAnchorOnSelect?: boolean;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * A babylon container for an XR Anchor
|
|
|
+ */
|
|
|
export interface WebXRAnchor {
|
|
|
+ /**
|
|
|
+ * A babylon-assigned ID for this anchor
|
|
|
+ */
|
|
|
id: number;
|
|
|
+ /**
|
|
|
+ * The native anchor object
|
|
|
+ */
|
|
|
xrAnchor: XRAnchor;
|
|
|
+ /**
|
|
|
+ * Transformation matrix to apply to an object attached to this anchor
|
|
|
+ */
|
|
|
transformationMatrix: Matrix;
|
|
|
}
|
|
|
|
|
|
let anchorIdProvider = 0;
|
|
|
|
|
|
+/**
|
|
|
+ * An implementation of the anchor system of WebXR.
|
|
|
+ * Note that the current documented implementation is not available in any browser. Future implementations
|
|
|
+ * will use the frame to create an anchor and not the session or a detected plane
|
|
|
+ * For further information see https://github.com/immersive-web/anchors/
|
|
|
+ */
|
|
|
export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
|
|
|
- public static Name = Name;
|
|
|
+ /**
|
|
|
+ * The module's name
|
|
|
+ */
|
|
|
+ public static readonly Name = Name;
|
|
|
+ /**
|
|
|
+ * The (Babylon) version of this module.
|
|
|
+ * This is an integer representing the implementation version.
|
|
|
+ * This number does not correspond to the webxr specs version
|
|
|
+ */
|
|
|
+ public static readonly Version = 1;
|
|
|
|
|
|
+ /**
|
|
|
+ * Observers registered here will be executed when a new anchor was added to the session
|
|
|
+ */
|
|
|
public onAnchorAddedObservable: Observable<WebXRAnchor> = new Observable();
|
|
|
+ /**
|
|
|
+ * Observers registered here will be executed when an existing anchor updates
|
|
|
+ * This can execute N times every frame
|
|
|
+ */
|
|
|
public onAnchorUpdatedObservable: Observable<WebXRAnchor> = new Observable();
|
|
|
+ /**
|
|
|
+ * Observers registered here will be executed when an anchor was removed from the session
|
|
|
+ */
|
|
|
public onAnchorRemovedObservable: Observable<WebXRAnchor> = new Observable();
|
|
|
|
|
|
private _planeDetector: WebXRPlaneDetector;
|
|
@@ -46,18 +90,36 @@ export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
private _lastFrameDetected: XRAnchorSet = new Set();
|
|
|
private _observerTracked: Nullable<Observer<XRFrame>>;
|
|
|
|
|
|
+ /**
|
|
|
+ * constructs a new anchor system
|
|
|
+ * @param xrSessionManager an instance of WebXRSessionManager
|
|
|
+ * @param options configuration object for this feature
|
|
|
+ */
|
|
|
constructor(private xrSessionManager: WebXRSessionManager, private options: WebXRAnchorSystemOptions = {}) {
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * set the plane detector to use in order to create anchors from frames
|
|
|
+ * @param planeDetector the plane-detector module to use
|
|
|
+ * @param enable enable plane-anchors. default is true
|
|
|
+ */
|
|
|
public setPlaneDetector(planeDetector: WebXRPlaneDetector, enable: boolean = true) {
|
|
|
this._planeDetector = planeDetector;
|
|
|
this.options.usePlaneDetection = enable;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * If set, it will improve performance by using the current hit-test results instead of executing a new hit-test
|
|
|
+ * @param hitTestModule the hit-test module to use.
|
|
|
+ */
|
|
|
public setHitTestModule(hitTestModule: WebXRHitTestLegacy) {
|
|
|
this._hitTestModule = hitTestModule;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * attach this feature
|
|
|
+ * Will usually be called by the features manager
|
|
|
+ */
|
|
|
attach(): boolean {
|
|
|
this._observerTracked = this.xrSessionManager.onXRFrameObservable.add(() => {
|
|
|
const frame = this.xrSessionManager.currentFrame;
|
|
@@ -103,6 +165,10 @@ export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * detach this feature.
|
|
|
+ * Will usually be called by the features manager
|
|
|
+ */
|
|
|
detach(): boolean {
|
|
|
this._attached = false;
|
|
|
|
|
@@ -115,6 +181,9 @@ export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Dispose this feature and all of the resources attached
|
|
|
+ */
|
|
|
dispose(): void {
|
|
|
this.detach();
|
|
|
this.onAnchorAddedObservable.clear();
|
|
@@ -145,6 +214,11 @@ export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
this._planeDetector;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param xrRigidTransformation xr-coordinates where a new anchor should be added
|
|
|
+ * @param anchorCreator the object o use to create an anchor with. either a session or a plane
|
|
|
+ */
|
|
|
public addAnchorAtRigidTransformation(xrRigidTransformation: XRRigidTransform, anchorCreator?: XRAnchorCreator) {
|
|
|
const creator = anchorCreator || this.xrSessionManager.session;
|
|
|
return creator.createAnchor(xrRigidTransformation, this.xrSessionManager.referenceSpace);
|
|
@@ -183,4 +257,9 @@ export class WebXRAnchorSystem implements WebXRFeature {
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+}
|
|
|
+
|
|
|
+//register the plugin
|
|
|
+WebXRFeaturesManager.AddWebXRFeature(WebXRAnchorSystem.Name, (xrSessionManager, options) => {
|
|
|
+ return () => new WebXRAnchorSystem(xrSessionManager, options);
|
|
|
+}, WebXRAnchorSystem.Version);
|