@needle-tools/engine 2.35.5-pre → 2.37.0-pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/needle-engine.d.ts +312 -232
  3. package/dist/needle-engine.js +456 -437
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +81 -76
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/api.d.ts +1 -0
  8. package/lib/engine/api.js +1 -0
  9. package/lib/engine/api.js.map +1 -1
  10. package/lib/engine/debug/debug.d.ts +1 -0
  11. package/lib/engine/debug/debug.js +3 -0
  12. package/lib/engine/debug/debug.js.map +1 -1
  13. package/lib/engine/debug/debug_overlay.js +12 -1
  14. package/lib/engine/debug/debug_overlay.js.map +1 -1
  15. package/lib/engine/engine_element_loading.js +1 -1
  16. package/lib/engine/engine_element_loading.js.map +1 -1
  17. package/lib/engine/engine_gameobject.d.ts +1 -0
  18. package/lib/engine/engine_gameobject.js +15 -2
  19. package/lib/engine/engine_gameobject.js.map +1 -1
  20. package/lib/engine/engine_gltf_builtin_components.js +4 -0
  21. package/lib/engine/engine_gltf_builtin_components.js.map +1 -1
  22. package/lib/engine/engine_mainloop_utils.d.ts +1 -1
  23. package/lib/engine/engine_mainloop_utils.js +7 -3
  24. package/lib/engine/engine_mainloop_utils.js.map +1 -1
  25. package/lib/engine/engine_physics.d.ts +49 -57
  26. package/lib/engine/engine_physics.js +464 -417
  27. package/lib/engine/engine_physics.js.map +1 -1
  28. package/lib/engine/engine_physics.types.d.ts +16 -0
  29. package/lib/engine/engine_physics.types.js +19 -0
  30. package/lib/engine/engine_physics.types.js.map +1 -0
  31. package/lib/engine/engine_serialization_core.d.ts +3 -0
  32. package/lib/engine/engine_serialization_core.js +19 -6
  33. package/lib/engine/engine_serialization_core.js.map +1 -1
  34. package/lib/engine/engine_setup.js +4 -2
  35. package/lib/engine/engine_setup.js.map +1 -1
  36. package/lib/engine/engine_time.d.ts +1 -0
  37. package/lib/engine/engine_time.js +1 -0
  38. package/lib/engine/engine_time.js.map +1 -1
  39. package/lib/engine/engine_types.d.ts +46 -26
  40. package/lib/engine/engine_types.js +24 -37
  41. package/lib/engine/engine_types.js.map +1 -1
  42. package/lib/engine/engine_typestore.d.ts +1 -0
  43. package/lib/engine/engine_typestore.js +1 -0
  44. package/lib/engine/engine_typestore.js.map +1 -1
  45. package/lib/engine/engine_util_decorator.d.ts +6 -0
  46. package/lib/engine/engine_util_decorator.js +54 -0
  47. package/lib/engine/engine_util_decorator.js.map +1 -0
  48. package/lib/engine/engine_utils.d.ts +1 -1
  49. package/lib/engine/engine_utils.js +2 -2
  50. package/lib/engine/engine_utils.js.map +1 -1
  51. package/lib/engine/extensions/NEEDLE_animator_controller_model.js.map +1 -1
  52. package/lib/engine/extensions/NEEDLE_gameobject_data.js +2 -0
  53. package/lib/engine/extensions/NEEDLE_gameobject_data.js.map +1 -1
  54. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +5 -0
  55. package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
  56. package/lib/engine-components/Animation.d.ts +5 -0
  57. package/lib/engine-components/Animation.js +14 -0
  58. package/lib/engine-components/Animation.js.map +1 -1
  59. package/lib/engine-components/AnimatorController.d.ts +1 -0
  60. package/lib/engine-components/AnimatorController.js +14 -7
  61. package/lib/engine-components/AnimatorController.js.map +1 -1
  62. package/lib/engine-components/BoxHelperComponent.d.ts +2 -2
  63. package/lib/engine-components/BoxHelperComponent.js +28 -9
  64. package/lib/engine-components/BoxHelperComponent.js.map +1 -1
  65. package/lib/engine-components/Collider.d.ts +7 -2
  66. package/lib/engine-components/Collider.js +27 -15
  67. package/lib/engine-components/Collider.js.map +1 -1
  68. package/lib/engine-components/Component.d.ts +8 -16
  69. package/lib/engine-components/Component.js +18 -117
  70. package/lib/engine-components/Component.js.map +1 -1
  71. package/lib/engine-components/DragControls.js +9 -6
  72. package/lib/engine-components/DragControls.js.map +1 -1
  73. package/lib/engine-components/GroundProjection.d.ts +2 -0
  74. package/lib/engine-components/GroundProjection.js +18 -6
  75. package/lib/engine-components/GroundProjection.js.map +1 -1
  76. package/lib/engine-components/NavMesh.d.ts +0 -5
  77. package/lib/engine-components/NavMesh.js +100 -10
  78. package/lib/engine-components/NavMesh.js.map +1 -1
  79. package/lib/engine-components/NestedGltf.js +2 -0
  80. package/lib/engine-components/NestedGltf.js.map +1 -1
  81. package/lib/engine-components/ReflectionProbe.d.ts +22 -0
  82. package/lib/engine-components/ReflectionProbe.js +134 -0
  83. package/lib/engine-components/ReflectionProbe.js.map +1 -0
  84. package/lib/engine-components/Renderer.d.ts +13 -2
  85. package/lib/engine-components/Renderer.js +96 -45
  86. package/lib/engine-components/Renderer.js.map +1 -1
  87. package/lib/engine-components/RigidBody.d.ts +40 -25
  88. package/lib/engine-components/RigidBody.js +253 -142
  89. package/lib/engine-components/RigidBody.js.map +1 -1
  90. package/lib/engine-components/SpatialTrigger.js +1 -1
  91. package/lib/engine-components/SpatialTrigger.js.map +1 -1
  92. package/lib/engine-components/SpectatorCamera.d.ts +1 -0
  93. package/lib/engine-components/SpectatorCamera.js +9 -2
  94. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  95. package/lib/engine-components/SpringJoint.d.ts +0 -13
  96. package/lib/engine-components/SpringJoint.js +42 -41
  97. package/lib/engine-components/SpringJoint.js.map +1 -1
  98. package/lib/engine-components/VideoPlayer.js.map +1 -1
  99. package/lib/engine-components/WebARSessionRoot.d.ts +7 -7
  100. package/lib/engine-components/WebARSessionRoot.js +7 -7
  101. package/lib/engine-components/WebARSessionRoot.js.map +1 -1
  102. package/lib/engine-components/WebXR.d.ts +10 -8
  103. package/lib/engine-components/WebXR.js +50 -26
  104. package/lib/engine-components/WebXR.js.map +1 -1
  105. package/lib/engine-components/WebXRAvatar.d.ts +4 -5
  106. package/lib/engine-components/WebXRAvatar.js +9 -8
  107. package/lib/engine-components/WebXRAvatar.js.map +1 -1
  108. package/lib/engine-components/WebXRController.d.ts +21 -21
  109. package/lib/engine-components/WebXRController.js +90 -68
  110. package/lib/engine-components/WebXRController.js.map +1 -1
  111. package/lib/engine-components/WebXRGrabRendering.d.ts +3 -3
  112. package/lib/engine-components/WebXRGrabRendering.js +2 -2
  113. package/lib/engine-components/WebXRGrabRendering.js.map +1 -1
  114. package/lib/engine-components/WebXRSync.d.ts +8 -8
  115. package/lib/engine-components/WebXRSync.js +15 -15
  116. package/lib/engine-components/WebXRSync.js.map +1 -1
  117. package/lib/engine-components/codegen/components.d.ts +2 -3
  118. package/lib/engine-components/codegen/components.js +2 -3
  119. package/lib/engine-components/codegen/components.js.map +1 -1
  120. package/lib/engine-components/ui/EventSystem.d.ts +1 -0
  121. package/lib/engine-components/ui/EventSystem.js +21 -1
  122. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  123. package/package.json +3 -4
  124. package/src/engine/api.ts +2 -1
  125. package/src/engine/codegen/register_types.js +291 -6
  126. package/src/engine/debug/debug.ts +4 -0
  127. package/src/engine/debug/debug_overlay.ts +9 -2
  128. package/src/engine/engine_element_loading.ts +1 -1
  129. package/src/engine/engine_gameobject.ts +19 -6
  130. package/src/engine/engine_gltf_builtin_components.ts +5 -1
  131. package/src/engine/engine_mainloop_utils.ts +7 -3
  132. package/src/engine/engine_physics.ts +508 -469
  133. package/src/engine/engine_physics.types.ts +19 -0
  134. package/src/engine/engine_serialization_core.ts +22 -8
  135. package/src/engine/engine_setup.ts +6 -2
  136. package/src/engine/engine_time.ts +2 -0
  137. package/src/engine/engine_types.ts +82 -55
  138. package/src/engine/engine_typestore.ts +2 -0
  139. package/src/engine/engine_util_decorator.ts +69 -0
  140. package/src/engine/engine_utils.ts +6 -5
  141. package/src/engine/extensions/EXT_texture_exr.js +1 -1
  142. package/src/engine/extensions/NEEDLE_animator_controller_model.ts +2 -1
  143. package/src/engine/extensions/NEEDLE_gameobject_data.ts +2 -0
  144. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +7 -0
  145. package/src/engine-components/Animation.ts +14 -1
  146. package/src/engine-components/AnimatorController.ts +19 -9
  147. package/src/engine-components/BoxHelperComponent.ts +30 -9
  148. package/src/engine-components/Collider.ts +29 -29
  149. package/src/engine-components/Component.ts +26 -135
  150. package/src/engine-components/DragControls.ts +9 -5
  151. package/src/engine-components/GroundProjection.ts +22 -7
  152. package/src/engine-components/NavMesh.ts +114 -115
  153. package/src/engine-components/NestedGltf.ts +2 -0
  154. package/src/engine-components/ReflectionProbe.ts +141 -0
  155. package/src/engine-components/Renderer.ts +796 -737
  156. package/src/engine-components/RigidBody.ts +258 -149
  157. package/src/engine-components/SpatialTrigger.ts +1 -1
  158. package/src/engine-components/SpectatorCamera.ts +10 -2
  159. package/src/engine-components/SpringJoint.ts +41 -41
  160. package/src/engine-components/VideoPlayer.ts +1 -2
  161. package/src/engine-components/WebARSessionRoot.ts +16 -16
  162. package/src/engine-components/WebXR.ts +65 -50
  163. package/src/engine-components/WebXRAvatar.ts +16 -16
  164. package/src/engine-components/WebXRController.ts +143 -112
  165. package/src/engine-components/WebXRGrabRendering.ts +6 -6
  166. package/src/engine-components/WebXRSync.ts +20 -20
  167. package/src/engine-components/codegen/components.ts +2 -3
  168. package/src/engine-components/ui/EventSystem.ts +26 -3
@@ -1,17 +1,17 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
- import * as THREE from 'three'
2
+ import { XRSession } from 'three'
3
3
  import { Matrix4, Object3D, XRPose } from "three";
4
4
  import { WebAR, WebXR } from "./WebXR";
5
5
  import { InstancingUtil } from "../engine/engine_instancing";
6
6
  import { serializeable } from "../engine/engine_serialization_decorator";
7
7
 
8
- // https://github.com/takahirox/takahirox.github.io/blob/master/three.js.mmdeditor/examples/js/controls/DeviceOrientationControls.js
8
+ // https://github.com/takahirox/takahirox.github.io/blob/master/js.mmdeditor/examples/js/controls/DeviceOrientationControls.js
9
9
 
10
10
  export class WebARSessionRoot extends Behaviour {
11
11
 
12
12
  webAR: WebAR | null = null;
13
13
 
14
- get rig(): THREE.Object3D | undefined {
14
+ get rig(): Object3D | undefined {
15
15
  return this.webAR?.webxr.Rig;
16
16
  }
17
17
 
@@ -28,7 +28,7 @@ export class WebARSessionRoot extends Behaviour {
28
28
  this.setScale(val);
29
29
  }
30
30
 
31
- private readonly _initalMatrix = new THREE.Matrix4();
31
+ private readonly _initalMatrix = new Matrix4();
32
32
  private readonly _selectStartFn = this.onSelectStart.bind(this);
33
33
  private readonly _selectEndFn = this.onSelectEnd.bind(this);
34
34
 
@@ -41,13 +41,13 @@ export class WebARSessionRoot extends Behaviour {
41
41
  }
42
42
 
43
43
  private _arScale: number = 5;
44
- private _rig: THREE.Object3D | null = null;
45
- private _startPose: THREE.Matrix4 | null = null;
46
- private _placementPose: THREE.Matrix4 | null = null;
44
+ private _rig: Object3D | null = null;
45
+ private _startPose: Matrix4 | null = null;
46
+ private _placementPose: Matrix4 | null = null;
47
47
  private _isTouching: boolean = false;
48
- private _rigStartPose: THREE.Matrix4 | undefined | null = null;
48
+ private _rigStartPose: Matrix4 | undefined | null = null;
49
49
 
50
- onBegin(session: THREE.XRSession) {
50
+ onBegin(session: XRSession) {
51
51
  this._placementPose = null;
52
52
  this.gameObject.visible = false;
53
53
  this.gameObject.matrixAutoUpdate = false;
@@ -69,12 +69,12 @@ export class WebARSessionRoot extends Behaviour {
69
69
  }
70
70
  }
71
71
 
72
- onUpdate(rig: THREE.Object3D | null, _session: THREE.XRSession, pose: XRPose | null | undefined): boolean {
72
+ onUpdate(rig: Object3D | null, _session: XRSession, pose: XRPose | null | undefined): boolean {
73
73
 
74
74
  if (pose && !this._placementPose) {
75
75
  if (this._isTouching) {
76
76
  if (this.webAR) this.webAR.setReticleActive(false);
77
- this.placeAt(rig, new THREE.Matrix4().fromArray(pose.transform.matrix).invert());
77
+ this.placeAt(rig, new Matrix4().fromArray(pose.transform.matrix).invert());
78
78
  return true;
79
79
  }
80
80
  }
@@ -90,13 +90,13 @@ export class WebARSessionRoot extends Behaviour {
90
90
  // }
91
91
  }
92
92
 
93
- placeAt(rig: THREE.Object3D | null, mat: Matrix4) {
94
- if (!this._placementPose) this._placementPose = new THREE.Matrix4();
93
+ placeAt(rig: Object3D | null, mat: Matrix4) {
94
+ if (!this._placementPose) this._placementPose = new Matrix4();
95
95
  this._placementPose.copy(mat);
96
96
  if (rig) {
97
97
 
98
98
  if (this.invertForward) {
99
- const rot = new THREE.Matrix4().makeRotationY(Math.PI);
99
+ const rot = new Matrix4().makeRotationY(Math.PI);
100
100
  this._placementPose.premultiply(rot);
101
101
  }
102
102
  this._rig = rig;
@@ -111,7 +111,7 @@ export class WebARSessionRoot extends Behaviour {
111
111
  this.gameObject.visible = true;
112
112
  }
113
113
 
114
- onEnd(rig: THREE.Object3D | null, _session: THREE.XRSession) {
114
+ onEnd(rig: Object3D | null, _session: XRSession) {
115
115
  this._placementPose = null;
116
116
  this.gameObject.visible = false;
117
117
  this.gameObject.matrixAutoUpdate = false;
@@ -151,7 +151,7 @@ export class WebARSessionRoot extends Behaviour {
151
151
  this._rigStartPose = rig.matrix.clone();
152
152
  }
153
153
  rig.matrixAutoUpdate = false;
154
- rig.matrix.multiplyMatrices(new THREE.Matrix4().makeScale(scale, scale, scale), this._placementPose);
154
+ rig.matrix.multiplyMatrices(new Matrix4().makeScale(scale, scale, scale), this._placementPose);
155
155
  rig.matrix.decompose(rig.position, rig.quaternion, rig.scale);
156
156
  rig.updateMatrixWorld();
157
157
  console.log("Place", rig.position);
@@ -1,23 +1,21 @@
1
- import { Behaviour, GameObject } from "./Component";
2
-
1
+ import { ArrayCamera, Color, Euler, EventDispatcher, Group, Matrix4, Mesh, MeshBasicMaterial, Object3D, Quaternion, RingGeometry, Texture, Vector3, XRFrame, XRHitTestSource, XRRigidTransform, XRSession, XRViewerPose } from 'three';
3
2
  import { ARButton } from '../include/three/ARButton.js';
4
3
  import { VRButton } from '../include/three/VRButton.js';
5
4
 
6
- import * as THREE from 'three'
7
- import { ArrayCamera, Matrix4, Vector3, XRHitTestSource } from 'three';
5
+ import { AssetReference } from "../engine/engine_addressables";
6
+ import { serializeable } from "../engine/engine_serialization_decorator";
7
+ import { XRSessionMode } from "../engine/engine_setup";
8
+ import { getWorldPosition, getWorldQuaternion, setWorldPosition, setWorldQuaternion } from "../engine/engine_three_utils";
9
+ import { INeedleEngineComponent } from "../engine/engine_types";
10
+ import { getParam, setOrAddParamsToUrl } from "../engine/engine_utils";
8
11
 
9
- import * as utils from "../engine/engine_utils";
12
+ import { Behaviour, GameObject } from "./Component";
10
13
  import { noVoip } from "./Voip";
11
- import { XRFlag, XRState, XRStateFlag } from "./XRFlag";
12
- import { ControllerType, WebXRController } from "./WebXRController";
13
14
  import { WebARSessionRoot } from "./WebARSessionRoot";
14
- import { getWorldPosition, getWorldQuaternion, setWorldPosition, setWorldQuaternion } from "../engine/engine_three_utils";
15
+ import { ControllerType, WebXRController } from "./WebXRController";
15
16
  import { XRRig } from "./WebXRRig";
16
- import { AssetReference } from "../engine/engine_addressables";
17
- import { serializeable } from "../engine/engine_serialization_decorator";
18
17
  import { WebXRSync } from "./WebXRSync";
19
- import { XRSessionMode } from "../engine/engine_setup";
20
- import { INeedleEngineComponent } from "../engine/engine_types";
18
+ import { XRFlag, XRState, XRStateFlag } from "./XRFlag";
21
19
 
22
20
 
23
21
  export async function detectARSupport() {
@@ -38,7 +36,6 @@ let vrSupported = false;
38
36
  detectARSupport().then(res => arSupported = res);
39
37
  detectVRSupport().then(res => vrSupported = res);
40
38
 
41
-
42
39
  // import TeleportVR from "teleportvr";
43
40
 
44
41
  export enum WebXREvent {
@@ -54,16 +51,23 @@ export declare type CreateButtonOptions = {
54
51
 
55
52
  export class WebXR extends Behaviour {
56
53
 
54
+ @serializeable()
57
55
  enableVR = true;
56
+ @serializeable()
58
57
  enableAR = true;
58
+
59
59
  @serializeable(AssetReference)
60
60
  defaultAvatar?: AssetReference;
61
+ @serializeable()
62
+ handModelPath: string = "";
61
63
 
64
+ @serializeable()
62
65
  createVRButton: boolean = true;
66
+ @serializeable()
63
67
  createARButton: boolean = true;
64
68
 
65
69
  private static _isInXr: boolean = false;
66
- private static events: THREE.EventDispatcher = new THREE.EventDispatcher();
70
+ private static events: EventDispatcher = new EventDispatcher();
67
71
 
68
72
  public static get IsInWebXR(): boolean { return this._isInXr; }
69
73
  public static get XRSupported(): boolean { return 'xr' in navigator && (arSupported || vrSupported); }
@@ -121,7 +125,7 @@ export class WebXR extends Behaviour {
121
125
  if (session) session.end();
122
126
  }
123
127
 
124
- public get Rig(): THREE.Object3D {
128
+ public get Rig(): Object3D {
125
129
  if(!this.rig) this.ensureRig();
126
130
  return this.rig;
127
131
  }
@@ -154,7 +158,7 @@ export class WebXR extends Behaviour {
154
158
  public get IsInVR() { return this._isInVR; }
155
159
  public get IsInAR() { return this._isInAR; }
156
160
 
157
- private rig!: THREE.Object3D;
161
+ private rig!: Object3D;
158
162
  private isInit: boolean = false;
159
163
 
160
164
  private _requestedAR: boolean = false;
@@ -221,11 +225,11 @@ export class WebXR extends Behaviour {
221
225
  }, 1000);
222
226
  }
223
227
 
224
- private _transformOrientation: THREE.Quaternion = new THREE.Quaternion();
225
- public get TransformOrientation(): THREE.Quaternion { return this._transformOrientation; }
228
+ private _transformOrientation: Quaternion = new Quaternion();
229
+ public get TransformOrientation(): Quaternion { return this._transformOrientation; }
226
230
 
227
- private _currentHeadPose: THREE.XRViewerPose | null = null;
228
- public get HeadPose(): THREE.XRViewerPose | null { return this._currentHeadPose; }
231
+ private _currentHeadPose: XRViewerPose | null = null;
232
+ public get HeadPose(): XRViewerPose | null { return this._currentHeadPose; }
229
233
 
230
234
  onBeforeRender(frame) {
231
235
  if (!frame) return;
@@ -237,7 +241,7 @@ export class WebXR extends Behaviour {
237
241
  const pose = frame.getViewerPose(this.context.renderer.xr.getReferenceSpace());
238
242
  this._currentHeadPose = pose;
239
243
  if (!pose) return; // e.g. if user is not wearing headset
240
- const transform: THREE.XRRigidTransform = pose?.transform;
244
+ const transform: XRRigidTransform = pose?.transform;
241
245
 
242
246
  if (transform) {
243
247
  this._transformOrientation.set(transform.orientation.x, transform.orientation.y, transform.orientation.z, transform.orientation.w);
@@ -312,7 +316,7 @@ export class WebXR extends Behaviour {
312
316
  // this.rig.quaternion.premultiply(existing.worldQuaternion);
313
317
  }
314
318
  else {
315
- this.rig = new THREE.Group();
319
+ this.rig = new Group();
316
320
  this.rig.rotateY(Math.PI);
317
321
  this.rig.name = "XRRig";
318
322
  this.context.scene.add(this.rig);
@@ -321,11 +325,11 @@ export class WebXR extends Behaviour {
321
325
  }
322
326
 
323
327
 
324
- private _originalCameraParent: THREE.Object3D | null = null;
325
- private _originalCameraPosition: THREE.Vector3 = new THREE.Vector3();
326
- private _originalCameraRotation: THREE.Quaternion = new THREE.Quaternion();
328
+ private _originalCameraParent: Object3D | null = null;
329
+ private _originalCameraPosition: Vector3 = new Vector3();
330
+ private _originalCameraRotation: Quaternion = new Quaternion();
327
331
 
328
- private onEnterXR(session: THREE.XRSession, frame: THREE.XRFrame) {
332
+ private onEnterXR(session: XRSession, frame: XRFrame) {
329
333
  console.log("[XR] session begin", session);
330
334
  WebXR._isInXr = true;
331
335
 
@@ -336,8 +340,8 @@ export class WebXR extends Behaviour {
336
340
  const pose = frame.getViewerPose(space);
337
341
  const rot = pose?.transform.orientation;
338
342
  if (rot) {
339
- const quat = new THREE.Quaternion(rot.x, rot.y, rot.z, rot.w);
340
- const eu = new THREE.Euler().setFromQuaternion(quat);
343
+ const quat = new Quaternion(rot.x, rot.y, rot.z, rot.w);
344
+ const eu = new Euler().setFromQuaternion(quat);
341
345
  this.rig.rotateY(eu.y);
342
346
  // this.rig.quaternion.multiply(quat);
343
347
  }
@@ -383,7 +387,7 @@ export class WebXR extends Behaviour {
383
387
  WebXR.events.dispatchEvent({ type: WebXREvent.XRStarted, session: session });
384
388
  }
385
389
 
386
- private onExitXR(session: THREE.XRSession | null) {
390
+ private onExitXR(session: XRSession | null) {
387
391
 
388
392
  if (this._isInAR && session) {
389
393
  this.webAR?.onEnd(session);
@@ -413,7 +417,7 @@ export class WebXR extends Behaviour {
413
417
  WebXR.events.dispatchEvent({ type: WebXREvent.XRStopped, session: session });
414
418
  }
415
419
 
416
- private onEnterVR(_session: THREE.XRSession) {
420
+ private onEnterVR(_session: XRSession) {
417
421
  }
418
422
 
419
423
  private destroyControllers() {
@@ -425,13 +429,13 @@ export class WebXR extends Behaviour {
425
429
 
426
430
  private xrMirrorWindow: Window | null = null;
427
431
 
428
- private onEnterXR_HandleMirrorWindow(session: THREE.XRSession) {
429
- if (!utils.getParam("mirror")) return;
432
+ private onEnterXR_HandleMirrorWindow(session: XRSession) {
433
+ if (!getParam("mirror")) return;
430
434
  setTimeout(() => {
431
435
  if (!WebXR.IsInWebXR) return;
432
436
  const url = new URL(window.location.href);
433
- utils.setOrAddParamsToUrl(url.searchParams, noVoip, 1);
434
- utils.setOrAddParamsToUrl(url.searchParams, "isMirror", 1);
437
+ setOrAddParamsToUrl(url.searchParams, noVoip, 1);
438
+ setOrAddParamsToUrl(url.searchParams, "isMirror", 1);
435
439
  const str = url.toString();
436
440
  this.xrMirrorWindow = window.open(str, "webxr sync", "popup=yes");
437
441
  if (this.xrMirrorWindow) {
@@ -456,20 +460,21 @@ export class WebAR {
456
460
 
457
461
  private _webxr: WebXR;
458
462
 
459
- private reticle: THREE.Object3D | null = null;
463
+ private reticle: Object3D | null = null;
464
+ private reticleParent: Object3D | null = null;
460
465
  private hitTestSource: XRHitTestSource | null = null;
461
466
  private reticleActive: boolean = true;
462
467
 
463
468
  // scene.background before entering AR
464
- private previousBackground: THREE.Color | null | THREE.Texture = null;
465
- private previousEnvironment: THREE.Texture | null = null;
469
+ private previousBackground: Color | null | Texture = null;
470
+ private previousEnvironment: Texture | null = null;
466
471
 
467
472
  private sessionRoot: WebARSessionRoot | null = null;
468
- private _previousParent: THREE.Object3D | null = null;
473
+ private _previousParent: Object3D | null = null;
469
474
  // we need this in case the session root is on the same object as the webxr component
470
475
  // so if we disable the session root we attach the webxr component to this temporary object
471
476
  // to still receive updates
472
- private static tempWebXRObject: THREE.Object3D;
477
+ private static tempWebXRObject: Object3D;
473
478
 
474
479
  private get context() { return this.webxr.context; }
475
480
 
@@ -496,13 +501,14 @@ export class WebAR {
496
501
  this.reticleActive = active;
497
502
  }
498
503
 
499
- async onBegin(session: THREE.XRSession) {
504
+ async onBegin(session: XRSession) {
500
505
  const context = this.webxr.context;
501
506
  this.reticleActive = true;
502
507
  this.didPlaceARSessionRoot = false;
503
508
 
504
509
  const deviceType = navigator.userAgent?.includes("OculusBrowser") ? ControllerType.PhysicalDevice : ControllerType.Touch;
505
- for (let i = 0; i < 4; i++) {
510
+ const controllerCount = deviceType === ControllerType.Touch ? 4 : 2;
511
+ for (let i = 0; i < controllerCount; i++) {
506
512
  WebXRController.Create(this.webxr, i, this.webxr.gameObject as GameObject, deviceType)
507
513
  }
508
514
 
@@ -523,22 +529,31 @@ export class WebAR {
523
529
  });
524
530
 
525
531
  if (!this.reticle && this.sessionRoot) {
526
- this.reticle = new THREE.Mesh(
527
- new THREE.RingGeometry(0.07, 0.09, 32).rotateX(- Math.PI / 2),
528
- new THREE.MeshBasicMaterial()
532
+ this.reticle = new Mesh(
533
+ new RingGeometry(0.07, 0.09, 32).rotateX(- Math.PI / 2),
534
+ new MeshBasicMaterial()
529
535
  );
530
536
  this.reticle.name = "AR Placement reticle";
531
537
  this.reticle.matrixAutoUpdate = false;
532
538
  this.reticle.visible = false;
539
+
540
+ // create AR reticle parent to allow WebXRSessionRoot to be translated, rotated or scaled
541
+ this.reticleParent = new Object3D();
542
+ this.reticleParent.name = "AR Reticle Parent";
543
+ this.reticleParent.matrixAutoUpdate = false;
544
+ this.reticleParent.add(this.reticle);
545
+ this.reticleParent.matrix.copy(this.sessionRoot.gameObject.matrixWorld);
546
+
533
547
  if (this.webxr.scene) {
534
- this.webxr.scene.add(this.reticle);
535
- this.webxr.scene.visible = true;
548
+ this.context.scene.add(this.reticleParent);
549
+ // this.context.scene.add(this.reticle);
550
+ this.context.scene.visible = true;
536
551
  }
537
552
  else console.warn("Could not found WebXR Rig");
538
553
  }
539
554
 
540
555
  this._previousParent = this.webxr.gameObject;
541
- if (!WebAR.tempWebXRObject) WebAR.tempWebXRObject = new THREE.Object3D();
556
+ if (!WebAR.tempWebXRObject) WebAR.tempWebXRObject = new Object3D();
542
557
  this.context.scene.add(WebAR.tempWebXRObject);
543
558
  GameObject.addComponent(WebAR.tempWebXRObject as GameObject, this.webxr);
544
559
 
@@ -556,7 +571,7 @@ export class WebAR {
556
571
  this.context.mainCameraComponent?.applyClearFlagsIfIsActiveCamera();
557
572
  }
558
573
 
559
- onEnd(session: THREE.XRSession) {
574
+ onEnd(session: XRSession) {
560
575
  if (this._previousParent) {
561
576
  console.log("ADD", this._previousParent);
562
577
  GameObject.addComponent(this._previousParent as GameObject, this.webxr);
@@ -578,7 +593,7 @@ export class WebAR {
578
593
  this.context.mainCameraComponent?.applyClearFlagsIfIsActiveCamera();
579
594
  }
580
595
 
581
- onUpdate(session: THREE.XRSession, frame: THREE.XRFrame) {
596
+ onUpdate(session: XRSession, frame: XRFrame) {
582
597
 
583
598
  if (this.noHitTestAvailable === true) {
584
599
  if (this.reticle)
@@ -631,4 +646,4 @@ export class WebAR {
631
646
  }
632
647
  }
633
648
 
634
- const arPlacementWithoutHitTestMatrix = new THREE.Matrix4().identity().makeTranslation(0, -0.5, 0);
649
+ const arPlacementWithoutHitTestMatrix = new Matrix4().identity().makeTranslation(0, -0.5, 0);
@@ -1,6 +1,6 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
2
  import { WebXR } from "./WebXR";
3
- import * as THREE from "three";
3
+ import { Quaternion, Vector3 } from "three";
4
4
  import { AvatarLoader } from "./AvatarLoader";
5
5
  import { XRFlag, XRStateFlag } from "./XRFlag";
6
6
  import { Avatar_POI } from "./avatar/Avatar_Brain_LookAt";
@@ -45,7 +45,7 @@ export class AvatarMarker extends Behaviour {
45
45
 
46
46
 
47
47
  public connectionId!: string;
48
- public avatar?: WebXRAvatar | THREE.Object3D;
48
+ public avatar?: WebXRAvatar | Object3D;
49
49
 
50
50
  awake() {
51
51
  AvatarMarker.instances.push(this);
@@ -94,16 +94,16 @@ export class WebXRAvatar {
94
94
  /** the user id */
95
95
  public guid: string;
96
96
 
97
- private root: THREE.Object3D | null = null;
98
- public head: THREE.Object3D | null = null;
99
- public handLeft: THREE.Object3D | null = null;
100
- public handRight: THREE.Object3D | null = null;
97
+ private root: Object3D | null = null;
98
+ public head: Object3D | null = null;
99
+ public handLeft: Object3D | null = null;
100
+ public handRight: Object3D | null = null;
101
101
  public lastUpdate: number = -1;
102
102
  public isLocalAvatar: boolean = false;
103
103
  public flags: XRFlag[] | null = null;
104
- private headScale: THREE.Vector3 = new THREE.Vector3(1, 1, 1);
105
- private handLeftScale: THREE.Vector3 = new THREE.Vector3(1, 1, 1);
106
- private handRightScale: THREE.Vector3 = new THREE.Vector3(1, 1, 1);
104
+ private headScale: Vector3 = new Vector3(1, 1, 1);
105
+ private handLeftScale: Vector3 = new Vector3(1, 1, 1);
106
+ private handRightScale: Vector3 = new Vector3(1, 1, 1);
107
107
 
108
108
  private readonly webxr: WebXR;
109
109
 
@@ -142,12 +142,12 @@ export class WebXRAvatar {
142
142
  return null;
143
143
  }
144
144
 
145
- private _headTarget: THREE.Object3D = new THREE.Object3D();
146
- private _handLeftTarget: THREE.Object3D = new THREE.Object3D();
147
- private _handRightTarget: THREE.Object3D = new THREE.Object3D();
145
+ private _headTarget: Object3D = new Object3D();
146
+ private _handLeftTarget: Object3D = new Object3D();
147
+ private _handRightTarget: Object3D = new Object3D();
148
148
  private _canInterpolate: boolean = false;
149
149
 
150
- private static invertRotation: THREE.Quaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
150
+ private static invertRotation: Quaternion = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
151
151
 
152
152
  public tryUpdate(state: VRUserState, _timeDiff: number) {
153
153
  if (state.guid === this.guid) {
@@ -247,7 +247,7 @@ export class WebXRAvatar {
247
247
  }
248
248
  }
249
249
 
250
- private async setupCustomAvatar(avatarId: string | THREE.Object3D | AssetReference): Promise<boolean> {
250
+ private async setupCustomAvatar(avatarId: string | Object3D | AssetReference): Promise<boolean> {
251
251
  if (debug)
252
252
  console.log("LOAD", avatarId, this);
253
253
 
@@ -263,14 +263,14 @@ export class WebXRAvatar {
263
263
  await reference.loadAssetAsync();
264
264
  const prefab = reference.asset as Object3D;
265
265
  GameObject.setActive(prefab, false);
266
- avatarId = GameObject.instantiate(prefab as Object3D) as THREE.Object3D;
266
+ avatarId = GameObject.instantiate(prefab as Object3D) as Object3D;
267
267
  GameObject.setActive(avatarId, true);
268
268
  // console.log("Avatar", avatarId);
269
269
  }
270
270
  if (debug)
271
271
  console.log(avatarId);
272
272
 
273
- const model = await WebXRAvatar.loader.getOrCreateNewAvatarInstance(this.context, avatarId as (THREE.Object3D | string));
273
+ const model = await WebXRAvatar.loader.getOrCreateNewAvatarInstance(this.context, avatarId as (Object3D | string));
274
274
  if (debug)
275
275
  console.log(model, model?.isValid, this.lastAvatarId, avatarId);
276
276
  // if (this.lastAvatarId !== avatarId) {