@needle-tools/engine 2.50.0-pre → 2.52.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 (132) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/needle-engine.d.ts +74 -36
  3. package/dist/needle-engine.js +588 -3662
  4. package/dist/needle-engine.js.map +4 -4
  5. package/dist/needle-engine.min.js +24 -25
  6. package/dist/needle-engine.min.js.map +4 -4
  7. package/lib/engine/engine_addressables.d.ts +1 -1
  8. package/lib/engine/engine_create_objects.d.ts +1 -1
  9. package/lib/engine/engine_element.d.ts +5 -4
  10. package/lib/engine/engine_element.js.map +1 -1
  11. package/lib/engine/engine_element_overlay.d.ts +3 -2
  12. package/lib/engine/engine_element_overlay.js.map +1 -1
  13. package/lib/engine/engine_input.js +15 -9
  14. package/lib/engine/engine_input.js.map +1 -1
  15. package/lib/engine/engine_physics.d.ts +1 -1
  16. package/lib/engine/engine_physics.js +1 -1
  17. package/lib/engine/engine_physics.js.map +1 -1
  18. package/lib/engine/engine_scenetools.d.ts +1 -1
  19. package/lib/engine/engine_serialization_core.d.ts +1 -1
  20. package/lib/engine/engine_setup.d.ts +2 -1
  21. package/lib/engine/engine_setup.js +28 -5
  22. package/lib/engine/engine_setup.js.map +1 -1
  23. package/lib/engine/engine_three_utils.d.ts +1 -0
  24. package/lib/engine/engine_three_utils.js +6 -0
  25. package/lib/engine/engine_three_utils.js.map +1 -1
  26. package/lib/engine/engine_types.d.ts +10 -9
  27. package/lib/engine/engine_utils.d.ts +3 -1
  28. package/lib/engine/engine_utils.js +9 -0
  29. package/lib/engine/engine_utils.js.map +1 -1
  30. package/lib/engine/extensions/NEEDLE_components.js +15 -11
  31. package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
  32. package/lib/engine/extensions/NEEDLE_deferred_texture.js +4 -3
  33. package/lib/engine/extensions/NEEDLE_deferred_texture.js.map +1 -1
  34. package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +1 -1
  35. package/lib/engine-components/Camera.d.ts +8 -2
  36. package/lib/engine-components/Camera.js +39 -2
  37. package/lib/engine-components/Camera.js.map +1 -1
  38. package/lib/engine-components/Component.d.ts +2 -1
  39. package/lib/engine-components/DragControls.js +10 -4
  40. package/lib/engine-components/DragControls.js.map +1 -1
  41. package/lib/engine-components/EventTrigger.d.ts +10 -1
  42. package/lib/engine-components/EventTrigger.js +47 -0
  43. package/lib/engine-components/EventTrigger.js.map +1 -1
  44. package/lib/engine-components/Light.js +20 -20
  45. package/lib/engine-components/Light.js.map +1 -1
  46. package/lib/engine-components/OrbitControls.js +19 -14
  47. package/lib/engine-components/OrbitControls.js.map +1 -1
  48. package/lib/engine-components/ParticleSystemModules.js +0 -1
  49. package/lib/engine-components/ParticleSystemModules.js.map +1 -1
  50. package/lib/engine-components/Renderer.d.ts +1 -0
  51. package/lib/engine-components/Renderer.js +10 -3
  52. package/lib/engine-components/Renderer.js.map +1 -1
  53. package/lib/engine-components/RigidBody.js +13 -1
  54. package/lib/engine-components/RigidBody.js.map +1 -1
  55. package/lib/engine-components/ScreenCapture.js +2 -0
  56. package/lib/engine-components/ScreenCapture.js.map +1 -1
  57. package/lib/engine-components/ShadowCatcher.js +5 -6
  58. package/lib/engine-components/ShadowCatcher.js.map +1 -1
  59. package/lib/engine-components/Skybox.d.ts +1 -0
  60. package/lib/engine-components/Skybox.js +5 -0
  61. package/lib/engine-components/Skybox.js.map +1 -1
  62. package/lib/engine-components/SpriteRenderer.d.ts +19 -3
  63. package/lib/engine-components/SpriteRenderer.js +154 -41
  64. package/lib/engine-components/SpriteRenderer.js.map +1 -1
  65. package/lib/engine-components/VideoPlayer.js +2 -1
  66. package/lib/engine-components/VideoPlayer.js.map +1 -1
  67. package/lib/engine-components/WebARSessionRoot.d.ts +2 -2
  68. package/lib/engine-components/WebARSessionRoot.js.map +1 -1
  69. package/lib/engine-components/WebXR.d.ts +2 -1
  70. package/lib/engine-components/WebXR.js +5 -2
  71. package/lib/engine-components/WebXR.js.map +1 -1
  72. package/lib/engine-components/WebXRAvatar.d.ts +1 -1
  73. package/lib/engine-components/WebXRAvatar.js +6 -1
  74. package/lib/engine-components/WebXRAvatar.js.map +1 -1
  75. package/lib/engine-components/WebXRController.d.ts +2 -1
  76. package/lib/engine-components/WebXRController.js +3 -2
  77. package/lib/engine-components/WebXRController.js.map +1 -1
  78. package/lib/engine-components/WebXRRig.js +12 -0
  79. package/lib/engine-components/WebXRRig.js.map +1 -1
  80. package/lib/engine-components/WebXRSync.js +5 -0
  81. package/lib/engine-components/WebXRSync.js.map +1 -1
  82. package/lib/engine-components/XRFlag.js +6 -6
  83. package/lib/engine-components/XRFlag.js.map +1 -1
  84. package/lib/engine-components/codegen/components.d.ts +1 -0
  85. package/lib/engine-components/codegen/components.js +1 -0
  86. package/lib/engine-components/codegen/components.js.map +1 -1
  87. package/lib/engine-components/js-extensions/Vector.js +2 -5
  88. package/lib/engine-components/js-extensions/Vector.js.map +1 -1
  89. package/lib/engine-components/timeline/PlayableDirector.d.ts +1 -1
  90. package/lib/engine-components/timeline/PlayableDirector.js +7 -5
  91. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  92. package/lib/engine-components/ui/EventSystem.d.ts +2 -1
  93. package/lib/engine-components/ui/EventSystem.js +9 -1
  94. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  95. package/lib/engine-components/ui/Utils.d.ts +1 -1
  96. package/package.json +2 -4
  97. package/src/engine/codegen/register_types.js +2 -0
  98. package/src/engine/engine_element.ts +5 -5
  99. package/src/engine/engine_element_overlay.ts +2 -2
  100. package/src/engine/engine_input.ts +12 -8
  101. package/src/engine/engine_physics.ts +1 -1
  102. package/src/engine/engine_setup.ts +25 -6
  103. package/src/engine/engine_three_utils.ts +7 -0
  104. package/src/engine/engine_types.ts +3 -3
  105. package/src/engine/engine_utils.ts +13 -2
  106. package/src/engine/extensions/NEEDLE_components.ts +13 -9
  107. package/src/engine/extensions/NEEDLE_deferred_texture.ts +9 -6
  108. package/src/engine-components/Camera.ts +36 -2
  109. package/src/engine-components/Component.ts +1 -1
  110. package/src/engine-components/DragControls.ts +8 -4
  111. package/src/engine-components/EventTrigger.ts +39 -19
  112. package/src/engine-components/Light.ts +18 -16
  113. package/src/engine-components/OrbitControls.ts +19 -14
  114. package/src/engine-components/ParticleSystemModules.ts +0 -3
  115. package/src/engine-components/Renderer.ts +10 -4
  116. package/src/engine-components/RigidBody.ts +13 -1
  117. package/src/engine-components/ScreenCapture.ts +1 -0
  118. package/src/engine-components/ShadowCatcher.ts +5 -6
  119. package/src/engine-components/Skybox.ts +4 -0
  120. package/src/engine-components/SpriteRenderer.ts +140 -44
  121. package/src/engine-components/VideoPlayer.ts +2 -1
  122. package/src/engine-components/WebARSessionRoot.ts +1 -2
  123. package/src/engine-components/WebXR.ts +5 -3
  124. package/src/engine-components/WebXRAvatar.ts +6 -1
  125. package/src/engine-components/WebXRController.ts +4 -3
  126. package/src/engine-components/WebXRRig.ts +14 -1
  127. package/src/engine-components/WebXRSync.ts +6 -1
  128. package/src/engine-components/XRFlag.ts +7 -6
  129. package/src/engine-components/codegen/components.ts +1 -0
  130. package/src/engine-components/js-extensions/Vector.ts +2 -5
  131. package/src/engine-components/timeline/PlayableDirector.ts +6 -4
  132. package/src/engine-components/ui/EventSystem.ts +12 -1
@@ -1,9 +1,48 @@
1
1
  import { Behaviour } from "./Component";
2
2
  import * as THREE from "three";
3
- import { serializable } from "../engine/engine_serialization_decorator";
4
- import { Color, Material, Texture } from "three";
3
+ import { serializable, serializeable } from "../engine/engine_serialization_decorator";
4
+ import { Color, Material, NearestFilter, Texture, Vector2, TextureFilter } from "three";
5
5
  import { RGBAColor } from "./js-extensions/RGBAColor";
6
+ import { getParam } from "../engine/engine_utils";
6
7
 
8
+ const debug = getParam("debugspriterenderer")
9
+
10
+ class SpriteUtils {
11
+
12
+ static cache: { [key: string]: THREE.BufferGeometry } = {};
13
+
14
+ static getOrCreateGeometry(sprite: Sprite): THREE.BufferGeometry {
15
+ if (sprite._geometry) return sprite._geometry;
16
+ if (sprite.guid) {
17
+ if (SpriteUtils.cache[sprite.guid]) {
18
+ if (debug) console.log("Take cached geometry for sprite", sprite.guid);
19
+ return SpriteUtils.cache[sprite.guid];
20
+ }
21
+ }
22
+ const geo = new THREE.BufferGeometry();
23
+ sprite._geometry = geo;
24
+ const vertices = new Float32Array(sprite.triangles.length * 3);
25
+ const uvs = new Float32Array(sprite.triangles.length * 2);
26
+ for (let i = 0; i < sprite.triangles.length; i += 1) {
27
+ const index = sprite.triangles[i];
28
+
29
+ vertices[i * 3] = -sprite.vertices[index].x;
30
+ vertices[i * 3 + 1] = sprite.vertices[index].y;
31
+
32
+ vertices[i * 3 + 2] = 0;
33
+ const uv = sprite.uv[index];
34
+ uvs[i * 2] = uv.x;
35
+ uvs[i * 2 + 1] = 1 - uv.y;
36
+ }
37
+ geo.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
38
+ geo.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
39
+ if (sprite.guid)
40
+ this.cache[sprite.guid] = geo;
41
+ if (debug)
42
+ console.log("Built sprite geometry", sprite, geo);
43
+ return geo;
44
+ }
45
+ }
7
46
 
8
47
  /// <summary>
9
48
  /// <para>SpriteRenderer draw mode.</para>
@@ -30,42 +69,59 @@ class Vec2 {
30
69
 
31
70
  export class Sprite {
32
71
 
72
+ @serializable()
73
+ guid?: string;
33
74
  @serializable(Texture)
34
75
  texture?: THREE.Texture;
35
-
76
+ @serializeable()
36
77
  triangles!: Array<number>;
78
+ @serializeable()
37
79
  uv!: Array<Vec2>;
80
+ @serializeable()
38
81
  vertices!: Array<Vec2>;
39
82
 
40
83
  _geometry?: THREE.BufferGeometry;
41
84
  }
42
85
 
43
- class SpriteUtils {
44
86
 
45
- static getOrCreateGeometry(sprite: Sprite): THREE.BufferGeometry {
46
- if (sprite._geometry) return sprite._geometry;
47
- const geo = new THREE.BufferGeometry();
48
- sprite._geometry = geo;
49
- const vertices = new Float32Array(sprite.triangles.length * 3);
50
- const uvs = new Float32Array(sprite.triangles.length * 2);
51
- for (let i = 0; i < sprite.triangles.length; i += 1) {
52
- const index = sprite.triangles[i];
87
+ class Slice {
88
+ @serializable()
89
+ name!: string;
90
+ @serializable(Vector2)
91
+ offset!: Vector2;
92
+ @serializable(Vector2)
93
+ size!: Vector2;
94
+ }
53
95
 
54
- vertices[i * 3] = -sprite.vertices[index].x;
55
- vertices[i * 3 + 1] = sprite.vertices[index].y;
96
+ const $spriteTexOwner = Symbol("spriteOwner");
56
97
 
57
- vertices[i * 3 + 2] = 0;
58
- const uv = sprite.uv[index];
59
- uvs[i * 2] = uv.x;
60
- uvs[i * 2 + 1] = 1 - uv.y;
61
- }
62
- // console.log(vertices);
63
- geo.setAttribute("position", new THREE.BufferAttribute(vertices, 3));
64
- geo.setAttribute("uv", new THREE.BufferAttribute(uvs, 2));
65
- return geo;
98
+ export class SpriteSheet {
99
+
100
+ @serializable(Sprite)
101
+ sprite?: Sprite;
102
+ @serializable()
103
+ index: number = 0;
104
+ @serializable(Slice)
105
+ slices!: Slice[];
106
+
107
+ update() {
108
+ const index = this.index;
109
+ if (index < 0 || index >= this.slices.length)
110
+ return;
111
+ const slice = this.slices[index];
112
+ let tex = this.sprite?.texture;
113
+ if (!tex) return;
114
+ tex.encoding = THREE.sRGBEncoding;
115
+ tex.offset.set(slice.offset.x, slice.offset.y);
116
+ // aniso > 1 makes the texture blurry
117
+ if (tex.minFilter == NearestFilter && tex.magFilter == NearestFilter)
118
+ tex.anisotropy = 1;
119
+ // tex.repeat.set(slice.size.x, -slice.size.y);
120
+ tex.needsUpdate = true;
66
121
  }
67
122
  }
68
123
 
124
+
69
125
  export class SpriteRenderer extends Behaviour {
70
126
 
71
127
  @serializable()
@@ -79,37 +135,69 @@ export class SpriteRenderer extends Behaviour {
79
135
  @serializable(Material)
80
136
  sharedMaterial?: THREE.Material;
81
137
 
82
- get sprite(): Sprite | undefined {
83
- return this._sprite;
138
+ @serializable(SpriteSheet)
139
+ get sprite(): SpriteSheet | undefined {
140
+ return this._spriteSheet;
84
141
  }
85
- set sprite(value: Sprite | undefined) {
86
- if(value === this._sprite) return;
87
- this._sprite = value;
88
- this.updateSprite();
142
+ set sprite(value: SpriteSheet | undefined | number) {
143
+ if (value === this._spriteSheet) return;
144
+ if (typeof value === "number") {
145
+ const index = Math.floor(value);;
146
+ if (index === value)
147
+ this.spriteIndex = index;
148
+ return;
149
+ }
150
+ else {
151
+ this._spriteSheet = value;
152
+ this.updateSprite();
153
+ }
89
154
  }
90
155
 
91
- private _sprite?: Sprite;
156
+ set spriteIndex(value: number) {
157
+ if (!this._spriteSheet) return;
158
+ this._spriteSheet.index = value;
159
+ this._spriteSheet.update();
160
+ }
161
+ get spriteIndex(): number {
162
+ return this._spriteSheet?.index ?? 0;
163
+ }
164
+ get spriteFrames(): number {
165
+ return this._spriteSheet?.slices.length ?? 0;
166
+ }
167
+
168
+ private _spriteSheet?: SpriteSheet;
92
169
  private _currentSprite?: THREE.Mesh;
93
170
 
94
171
  awake(): void {
95
172
  this._currentSprite = undefined;
173
+ if(debug) {
174
+ console.log("Awake", this.name, this, this.sprite?.sprite?.texture);
175
+ if(this.sprite?.sprite?.texture)
176
+ console.log(this.sprite.sprite.texture.minFilter.toString(), this.sprite.sprite.texture.magFilter.toString());
177
+ }
96
178
  }
97
179
 
98
180
  start() {
99
- if (this.drawMode === SpriteDrawMode.Tiled) {
100
- console.warn("Tiled draw mode is not supported yet", this);
101
- }
102
181
  if (!this._currentSprite)
103
182
  this.updateSprite();
104
183
  else if (this.gameObject)
105
184
  this.gameObject.add(this._currentSprite);
106
185
  }
107
186
 
187
+ // frame : number = 0;
188
+ // update(){
189
+ // // const frameRate = 12;
190
+ // // this.frame += frameRate * this.context.time.deltaTime;
191
+ // // if(this.frame >= this.spriteFrames)
192
+ // // this.frame = 0;
193
+ // // this.spriteIndex = Math.floor(this.frame);
194
+ // // console.log(this.spriteIndex);
195
+ // }
196
+
108
197
  private updateSprite() {
109
198
  if (!this.__didAwake) return;
110
- if (!this.sprite) return;
111
- if (!this.sharedMaterial) return;
112
-
199
+ if (!this.sprite?.sprite) return;
200
+ const sprite = this.sprite.sprite;
113
201
  if (!this._currentSprite) {
114
202
  const mat = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide });
115
203
  if (!mat) return;
@@ -120,17 +208,23 @@ export class SpriteRenderer extends Behaviour {
120
208
  }
121
209
  mat.alphaTest = 0.5;
122
210
 
123
- if (this.sprite.texture && !mat.wireframe) {
124
- const t = this.sprite.texture;
125
- // t.wrapS = THREE.RepeatWrapping;
126
- mat["map"] = t;
211
+ if (sprite.texture && !mat.wireframe) {
212
+ let tex = sprite.texture;
213
+ // the sprite renderer modifies the textue offset
214
+ // so we need to clone the texture
215
+ // if the same texture is used multiple times
216
+ if (tex[$spriteTexOwner] !== undefined && tex[$spriteTexOwner] !== this && this.spriteFrames > 1) {
217
+ tex = sprite!.texture = tex.clone();
218
+ }
219
+ tex[$spriteTexOwner] = this;
220
+ mat["map"] = tex;
127
221
  }
128
-
129
- this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(this.sprite), mat);
222
+ this.sharedMaterial = mat;
223
+ this._currentSprite = new THREE.Mesh(SpriteUtils.getOrCreateGeometry(sprite), mat);
130
224
  }
131
225
  else {
132
- this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(this.sprite);
133
- this._currentSprite.material["map"] = this.sprite.texture;
226
+ this._currentSprite.geometry = SpriteUtils.getOrCreateGeometry(sprite);
227
+ this._currentSprite.material["map"] = sprite.texture;
134
228
  }
135
229
 
136
230
  if (this._currentSprite.parent !== this.gameObject) {
@@ -139,5 +233,7 @@ export class SpriteRenderer extends Behaviour {
139
233
  if (this.gameObject)
140
234
  this.gameObject.add(this._currentSprite);
141
235
  }
236
+
237
+ this._spriteSheet?.update();
142
238
  }
143
239
  }
@@ -290,7 +290,8 @@ export class VideoPlayer extends Behaviour {
290
290
  this._videoTexture.flipY = false;
291
291
  this._videoTexture.encoding = THREE.sRGBEncoding;
292
292
  this.handleBeginPlaying(playAutomatically);
293
- console.log(this);
293
+ if(debug)
294
+ console.log(this);
294
295
  }
295
296
 
296
297
  updateAspect() {
@@ -1,6 +1,5 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
- import { XRSession } from 'three'
3
- import { Matrix4, Object3D, XRPose } from "three";
2
+ import { Matrix4, Object3D } from "three";
4
3
  import { WebAR, WebXR } from "./WebXR";
5
4
  import { InstancingUtil } from "../engine/engine_instancing";
6
5
  import { serializable } from "../engine/engine_serialization_decorator";
@@ -1,4 +1,4 @@
1
- import { ArrayCamera, Color, Euler, EventDispatcher, Group, Matrix4, Mesh, MeshBasicMaterial, Object3D, Quaternion, RingGeometry, Texture, Vector3, XRFrame, XRHitTestSource, XRRigidTransform, XRSession, XRViewerPose } from 'three';
1
+ import { ArrayCamera, Color, Euler, EventDispatcher, Group, Matrix4, Mesh, MeshBasicMaterial, Object3D, Quaternion, RingGeometry, Texture, Vector3 } from 'three';
2
2
  import { ARButton } from '../include/three/ARButton.js';
3
3
  import { VRButton } from '../include/three/VRButton.js';
4
4
 
@@ -7,7 +7,7 @@ import { serializable } from "../engine/engine_serialization_decorator";
7
7
  import { XRSessionMode } from "../engine/engine_setup";
8
8
  import { getWorldPosition, getWorldQuaternion, setWorldPosition, setWorldQuaternion } from "../engine/engine_three_utils";
9
9
  import { INeedleEngineComponent } from "../engine/engine_types";
10
- import { getParam, setOrAddParamsToUrl } from "../engine/engine_utils";
10
+ import { getParam, isMozillaXR, setOrAddParamsToUrl } from "../engine/engine_utils";
11
11
 
12
12
  import { Behaviour, GameObject } from "./Component";
13
13
  import { noVoip } from "./Voip";
@@ -19,6 +19,7 @@ import { XRFlag, XRState, XRStateFlag } from "./XRFlag";
19
19
 
20
20
 
21
21
  export async function detectARSupport() {
22
+ if(isMozillaXR()) return true;
22
23
  if ("xr" in navigator) {
23
24
  //@ts-ignore
24
25
  return (await navigator["xr"].isSessionSupported('immersive-ar')) === true;
@@ -372,6 +373,7 @@ export class WebXR extends Behaviour {
372
373
  // we set layers to sync raycasting and have a similar behaviour to unity
373
374
  const xr = this.context.renderer.xr;
374
375
  if (this.context.mainCamera) {
376
+ //@ts-ignore
375
377
  const cam = xr.getCamera(this.context.mainCamera) as ArrayCamera;
376
378
  for (const c of cam.cameras) {
377
379
  c.layers.enableAll();
@@ -553,7 +555,7 @@ export class WebAR {
553
555
  context.scene.background = null;
554
556
 
555
557
  session.requestReferenceSpace('viewer').then((referenceSpace) => {
556
- session.requestHitTestSource({ space: referenceSpace }).then((source) => {
558
+ session.requestHitTestSource?.call(session, { space: referenceSpace })?.then((source) => {
557
559
  this.hitTestSource = source;
558
560
  }).catch((err) => {
559
561
  this.noHitTestAvailable = true;
@@ -125,7 +125,12 @@ export class WebXRAvatar {
125
125
  if (!this.flags)
126
126
  return;
127
127
  let mask = this.isLocalAvatar ? XRStateFlag.FirstPerson : XRStateFlag.ThirdPerson;
128
- // mask |= XRStateFlag.VR;
128
+ if (this.context.isInVR)
129
+ mask |= XRStateFlag.VR;
130
+ else if (this.context.isInAR)
131
+ mask |= XRStateFlag.AR;
132
+ else
133
+ mask |= XRStateFlag.Browser;
129
134
  for (const f of this.flags) {
130
135
  f.gameObject.visible = true;
131
136
  f.UpdateVisible(mask);
@@ -1,4 +1,4 @@
1
- import { BoxHelper, BufferGeometry, Color, Euler, Group, Intersection, Layers, Line, LineBasicMaterial, Material, Mesh, MeshBasicMaterial, Object3D, PerspectiveCamera, Quaternion, Ray, SphereGeometry, Vector2, Vector3, XRInputSource, XRSession } from "three";
1
+ import { BoxHelper, BufferGeometry, Color, Euler, Group, Intersection, Layers, Line, LineBasicMaterial, Material, Mesh, MeshBasicMaterial, Object3D, PerspectiveCamera, Quaternion, Ray, SphereGeometry, Vector2, Vector3 } from "three";
2
2
  import { OculusHandModel } from 'three/examples/jsm/webxr/OculusHandModel.js';
3
3
  import { OculusHandPointerModel } from 'three/examples/jsm/webxr/OculusHandPointerModel.js';
4
4
  import { XRControllerModel, XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerModelFactory.js';
@@ -381,11 +381,12 @@ export class WebXRController extends Behaviour {
381
381
  }
382
382
 
383
383
  if (this.raycastLine) {
384
+ const allowRaycastLineVisible = this.showRaycastLine && this.context.isInVR;
384
385
  if (this.type === ControllerType.Touch) {
385
386
  this.raycastLine.visible = false;
386
387
  }
387
388
  else if (this.isUsingHands) {
388
- this.raycastLine.visible = !this.grabbed && this.showRaycastLine;
389
+ this.raycastLine.visible = !this.grabbed && allowRaycastLineVisible;
389
390
  setWorldPosition(this.raycastLine, wp);
390
391
  const jnts = this.hand!['joints'];
391
392
  if (jnts) {
@@ -400,7 +401,7 @@ export class WebXRController extends Behaviour {
400
401
  setWorldQuaternion(this.raycastLine, this.rayRotation);
401
402
  }
402
403
  else {
403
- this.raycastLine.visible = this.showRaycastLine;
404
+ this.raycastLine.visible = allowRaycastLineVisible;
404
405
  setWorldQuaternion(this.raycastLine, this.rayRotation);
405
406
  setWorldPosition(this.raycastLine, wp);
406
407
  }
@@ -1,9 +1,22 @@
1
- import { Behaviour } from "./Component";
1
+ import { Object3D } from "three";
2
+ import { IGameObject } from "../engine/engine_types";
3
+ import { getParam } from "../engine/engine_utils";
4
+ import { Behaviour, GameObject } from "./Component";
5
+ import { BoxGizmo } from "./Gizmos";
2
6
 
7
+ const debug = getParam("debugrig");
3
8
 
4
9
  export class XRRig extends Behaviour {
5
10
  awake(): void {
6
11
  // const helper = new AxesHelper(.1);
7
12
  // this.gameObject.add(helper);
13
+ if (debug) {
14
+ const gizmoObj = new Object3D() as IGameObject;
15
+ gizmoObj.position.y += .5;
16
+ this.gameObject.add(gizmoObj);
17
+ const gizmo = gizmoObj.addNewComponent(BoxGizmo);
18
+ if (gizmo)
19
+ gizmo.isGizmo = false;
20
+ }
8
21
  }
9
22
  }
@@ -1,7 +1,7 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
2
  import { RoomEvents, OwnershipModel, NetworkConnection } from "../engine/engine_networking";
3
3
  import { WebXR, WebXREvent } from "./WebXR";
4
- import { Group, Quaternion, Vector3, Vector4, WebXRManager, XRFrame, XRInputSource, XRRigidTransform, XRSession } from "three";
4
+ import { Group, Quaternion, Vector3, Vector4, WebXRManager } from "three";
5
5
  import { getParam } from "../engine/engine_utils";
6
6
  import { Voip } from "./Voip";
7
7
  import { Builder, Long } from "flatbuffers";
@@ -402,6 +402,11 @@ export class WebXRSync extends Behaviour {
402
402
  private onXRSessionEnded(_evt: { session: XRSession }) {
403
403
  console.log("XR session ended");
404
404
  this.context.connection.send(WebXRSyncEvent.WebXR_UserLeft, { id: this.context.connection.connectionId, mode: XRMode.VR });
405
+ if(this.localAvatar){
406
+ this.localAvatar?.destroy();
407
+ this.avatars[this.localAvatar.guid] = undefined;
408
+ this.localAvatar = null;
409
+ }
405
410
  }
406
411
 
407
412
  private ownership: OwnershipModel | null = null;
@@ -1,5 +1,7 @@
1
1
  import { Behaviour, GameObject } from "./Component";
2
2
  import * as utils from "../engine/engine_utils";
3
+
4
+
3
5
  const debug = utils.getParam("debugflags");
4
6
 
5
7
  export enum XRStateFlag {
@@ -21,13 +23,12 @@ export class XRState {
21
23
  public Mask: XRStateFlag = XRStateFlag.Browser | XRStateFlag.ThirdPerson;
22
24
 
23
25
  public Has(state: XRStateFlag) {
24
-
25
26
  const res = (this.Mask & state);
26
- if (debug) console.log("HAS", state, this.Mask, "Result=" + res);
27
27
  return res !== 0;
28
28
  }
29
29
 
30
30
  public Set(state: number) {
31
+ if(debug) console.warn("Set XR flag state to", state)
31
32
  this.Mask = state as number;
32
33
  XRFlag.Apply();
33
34
  }
@@ -108,23 +109,23 @@ export class XRFlag extends Behaviour {
108
109
  const st = state as XRState;
109
110
  if (st) {
110
111
  if (debug)
111
- console.log("use passed in mask")
112
+ console.warn(this.name, "use passed in mask", st.Mask, this.visibleIn)
112
113
  res = st.Has(this.visibleIn);
113
114
  }
114
115
  else {
115
116
  if (debug)
116
- console.log("use global mask")
117
+ console.log(this.name, "use global mask")
117
118
  XRState.Global.Has(this.visibleIn);
118
119
  }
119
120
  if (res === undefined) return;
120
121
  if (res) {
121
122
  if (debug)
122
- console.trace("is visible", this.name, this.gameObject.uuid)
123
+ console.log(this.name, "is visible", this.gameObject.uuid)
123
124
  // this.gameObject.visible = true;
124
125
  GameObject.setActive(this.gameObject, true);
125
126
  } else {
126
127
  if (debug)
127
- console.trace("is not visible", this.name, this.gameObject.uuid);
128
+ console.log(this.name, "is not visible", this.gameObject.uuid);
128
129
  const isVisible = this.gameObject.visible;
129
130
  if(!isVisible) return;
130
131
  this.gameObject.visible = false;
@@ -85,6 +85,7 @@ export { SpatialTriggerReceiver } from "../SpatialTrigger";
85
85
  export { SpatialTrigger } from "../SpatialTrigger";
86
86
  export { SpectatorCamera } from "../SpectatorCamera";
87
87
  export { Sprite } from "../SpriteRenderer";
88
+ export { SpriteSheet } from "../SpriteRenderer";
88
89
  export { SpriteRenderer } from "../SpriteRenderer";
89
90
  export { SyncedCamera } from "../SyncedCamera";
90
91
  export { SyncedRoom } from "../SyncedRoom";
@@ -1,6 +1,6 @@
1
1
  import { applyPrototypeExtensions, registerPrototypeExtensions } from "./ExtensionUtils";
2
- import { Mathf } from "../../engine/engine_math";
3
2
  import { Vector3 } from "three";
3
+ import { slerp } from "../../engine/engine_three_utils";
4
4
 
5
5
  export function apply(object: Vector3) {
6
6
  if (object && object.isVector3 === true) {
@@ -10,10 +10,7 @@ export function apply(object: Vector3) {
10
10
 
11
11
 
12
12
  Vector3.prototype["slerp"] = function (end: Vector3, t: number) {
13
- const len1 = this.length();
14
- const len2 = end.length();
15
- const targetLen = Mathf.lerp(len1, len2, t);
16
- return this.lerp(end, t).normalize().multiplyScalar(targetLen);
13
+ return slerp(this, end, t);
17
14
  }
18
15
 
19
16
  registerPrototypeExtensions(Vector3);
@@ -85,9 +85,6 @@ export class PlayableDirector extends Behaviour {
85
85
  console.log(this, this.playableAsset?.tracks);
86
86
 
87
87
  this.rebuildGraph();
88
- if (this.playOnAwake)
89
- this.play();
90
- else this.evaluate();
91
88
 
92
89
  if (!this.isValid()) console.warn("PlayableDirector is not valid", this.playableAsset, this.playableAsset?.tracks, Array.isArray(this.playableAsset?.tracks), this);
93
90
  }
@@ -230,7 +227,7 @@ export class PlayableDirector extends Behaviour {
230
227
  ];
231
228
 
232
229
  private *internalUpdate() {
233
- while (this._isPlaying) {
230
+ while (this._isPlaying && this.activeAndEnabled) {
234
231
  if (!this._isPaused && this._isPlaying) {
235
232
  this._time += this.context.time.deltaTime;
236
233
  this.evaluate();
@@ -312,6 +309,11 @@ export class PlayableDirector extends Behaviour {
312
309
  if (debug)
313
310
  console.log("Resolved binding", binding, "to", obj);
314
311
  track.outputs[i] = obj;
312
+ if(obj instanceof Animator) {
313
+ // TODO: should disable? animator but this is not the animator that is currently on the object? needs investigation
314
+ // console.log("DISABLE ANIMATOR", obj, obj.name, binding, this._guidsMap);
315
+ // obj.enabled = false;
316
+ }
315
317
  }
316
318
  }
317
319
  else if (binding === null) {
@@ -18,6 +18,9 @@ const debug = getParam("debugeventsystem");
18
18
 
19
19
  export class EventSystem extends Behaviour {
20
20
 
21
+
22
+ private static _eventSystemMap = new Map<Context, EventSystem[]>();
23
+
21
24
  static didSearchEventSystem: boolean = false;
22
25
  static createIfNoneExists(context: Context) {
23
26
  if (!this.didSearchEventSystem) {
@@ -33,7 +36,15 @@ export class EventSystem extends Behaviour {
33
36
  GameObject.addNewComponent(go, EventSystem);
34
37
  context.scene.add(go);
35
38
  }
36
- static systems: EventSystem[] = [];
39
+
40
+ static get systems(): EventSystem[]
41
+ {
42
+ const context = Context.Current;
43
+ if (!this._eventSystemMap.has(context)) {
44
+ this._eventSystemMap.set(context, []);
45
+ }
46
+ return this._eventSystemMap.get(context)!;
47
+ }
37
48
 
38
49
  //@ts-ignore
39
50
  static ensureUpdateMeshUI(instance, context: Context) {