@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.
- package/CHANGELOG.md +26 -0
- package/dist/needle-engine.d.ts +74 -36
- package/dist/needle-engine.js +588 -3662
- package/dist/needle-engine.js.map +4 -4
- package/dist/needle-engine.min.js +24 -25
- package/dist/needle-engine.min.js.map +4 -4
- package/lib/engine/engine_addressables.d.ts +1 -1
- package/lib/engine/engine_create_objects.d.ts +1 -1
- package/lib/engine/engine_element.d.ts +5 -4
- package/lib/engine/engine_element.js.map +1 -1
- package/lib/engine/engine_element_overlay.d.ts +3 -2
- package/lib/engine/engine_element_overlay.js.map +1 -1
- package/lib/engine/engine_input.js +15 -9
- package/lib/engine/engine_input.js.map +1 -1
- package/lib/engine/engine_physics.d.ts +1 -1
- package/lib/engine/engine_physics.js +1 -1
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine/engine_scenetools.d.ts +1 -1
- package/lib/engine/engine_serialization_core.d.ts +1 -1
- package/lib/engine/engine_setup.d.ts +2 -1
- package/lib/engine/engine_setup.js +28 -5
- package/lib/engine/engine_setup.js.map +1 -1
- package/lib/engine/engine_three_utils.d.ts +1 -0
- package/lib/engine/engine_three_utils.js +6 -0
- package/lib/engine/engine_three_utils.js.map +1 -1
- package/lib/engine/engine_types.d.ts +10 -9
- package/lib/engine/engine_utils.d.ts +3 -1
- package/lib/engine/engine_utils.js +9 -0
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_components.js +15 -11
- package/lib/engine/extensions/NEEDLE_components.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_deferred_texture.js +4 -3
- package/lib/engine/extensions/NEEDLE_deferred_texture.js.map +1 -1
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +1 -1
- package/lib/engine-components/Camera.d.ts +8 -2
- package/lib/engine-components/Camera.js +39 -2
- package/lib/engine-components/Camera.js.map +1 -1
- package/lib/engine-components/Component.d.ts +2 -1
- package/lib/engine-components/DragControls.js +10 -4
- package/lib/engine-components/DragControls.js.map +1 -1
- package/lib/engine-components/EventTrigger.d.ts +10 -1
- package/lib/engine-components/EventTrigger.js +47 -0
- package/lib/engine-components/EventTrigger.js.map +1 -1
- package/lib/engine-components/Light.js +20 -20
- package/lib/engine-components/Light.js.map +1 -1
- package/lib/engine-components/OrbitControls.js +19 -14
- package/lib/engine-components/OrbitControls.js.map +1 -1
- package/lib/engine-components/ParticleSystemModules.js +0 -1
- package/lib/engine-components/ParticleSystemModules.js.map +1 -1
- package/lib/engine-components/Renderer.d.ts +1 -0
- package/lib/engine-components/Renderer.js +10 -3
- package/lib/engine-components/Renderer.js.map +1 -1
- package/lib/engine-components/RigidBody.js +13 -1
- package/lib/engine-components/RigidBody.js.map +1 -1
- package/lib/engine-components/ScreenCapture.js +2 -0
- package/lib/engine-components/ScreenCapture.js.map +1 -1
- package/lib/engine-components/ShadowCatcher.js +5 -6
- package/lib/engine-components/ShadowCatcher.js.map +1 -1
- package/lib/engine-components/Skybox.d.ts +1 -0
- package/lib/engine-components/Skybox.js +5 -0
- package/lib/engine-components/Skybox.js.map +1 -1
- package/lib/engine-components/SpriteRenderer.d.ts +19 -3
- package/lib/engine-components/SpriteRenderer.js +154 -41
- package/lib/engine-components/SpriteRenderer.js.map +1 -1
- package/lib/engine-components/VideoPlayer.js +2 -1
- package/lib/engine-components/VideoPlayer.js.map +1 -1
- package/lib/engine-components/WebARSessionRoot.d.ts +2 -2
- package/lib/engine-components/WebARSessionRoot.js.map +1 -1
- package/lib/engine-components/WebXR.d.ts +2 -1
- package/lib/engine-components/WebXR.js +5 -2
- package/lib/engine-components/WebXR.js.map +1 -1
- package/lib/engine-components/WebXRAvatar.d.ts +1 -1
- package/lib/engine-components/WebXRAvatar.js +6 -1
- package/lib/engine-components/WebXRAvatar.js.map +1 -1
- package/lib/engine-components/WebXRController.d.ts +2 -1
- package/lib/engine-components/WebXRController.js +3 -2
- package/lib/engine-components/WebXRController.js.map +1 -1
- package/lib/engine-components/WebXRRig.js +12 -0
- package/lib/engine-components/WebXRRig.js.map +1 -1
- package/lib/engine-components/WebXRSync.js +5 -0
- package/lib/engine-components/WebXRSync.js.map +1 -1
- package/lib/engine-components/XRFlag.js +6 -6
- package/lib/engine-components/XRFlag.js.map +1 -1
- package/lib/engine-components/codegen/components.d.ts +1 -0
- package/lib/engine-components/codegen/components.js +1 -0
- package/lib/engine-components/codegen/components.js.map +1 -1
- package/lib/engine-components/js-extensions/Vector.js +2 -5
- package/lib/engine-components/js-extensions/Vector.js.map +1 -1
- package/lib/engine-components/timeline/PlayableDirector.d.ts +1 -1
- package/lib/engine-components/timeline/PlayableDirector.js +7 -5
- package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
- package/lib/engine-components/ui/EventSystem.d.ts +2 -1
- package/lib/engine-components/ui/EventSystem.js +9 -1
- package/lib/engine-components/ui/EventSystem.js.map +1 -1
- package/lib/engine-components/ui/Utils.d.ts +1 -1
- package/package.json +2 -4
- package/src/engine/codegen/register_types.js +2 -0
- package/src/engine/engine_element.ts +5 -5
- package/src/engine/engine_element_overlay.ts +2 -2
- package/src/engine/engine_input.ts +12 -8
- package/src/engine/engine_physics.ts +1 -1
- package/src/engine/engine_setup.ts +25 -6
- package/src/engine/engine_three_utils.ts +7 -0
- package/src/engine/engine_types.ts +3 -3
- package/src/engine/engine_utils.ts +13 -2
- package/src/engine/extensions/NEEDLE_components.ts +13 -9
- package/src/engine/extensions/NEEDLE_deferred_texture.ts +9 -6
- package/src/engine-components/Camera.ts +36 -2
- package/src/engine-components/Component.ts +1 -1
- package/src/engine-components/DragControls.ts +8 -4
- package/src/engine-components/EventTrigger.ts +39 -19
- package/src/engine-components/Light.ts +18 -16
- package/src/engine-components/OrbitControls.ts +19 -14
- package/src/engine-components/ParticleSystemModules.ts +0 -3
- package/src/engine-components/Renderer.ts +10 -4
- package/src/engine-components/RigidBody.ts +13 -1
- package/src/engine-components/ScreenCapture.ts +1 -0
- package/src/engine-components/ShadowCatcher.ts +5 -6
- package/src/engine-components/Skybox.ts +4 -0
- package/src/engine-components/SpriteRenderer.ts +140 -44
- package/src/engine-components/VideoPlayer.ts +2 -1
- package/src/engine-components/WebARSessionRoot.ts +1 -2
- package/src/engine-components/WebXR.ts +5 -3
- package/src/engine-components/WebXRAvatar.ts +6 -1
- package/src/engine-components/WebXRController.ts +4 -3
- package/src/engine-components/WebXRRig.ts +14 -1
- package/src/engine-components/WebXRSync.ts +6 -1
- package/src/engine-components/XRFlag.ts +7 -6
- package/src/engine-components/codegen/components.ts +1 -0
- package/src/engine-components/js-extensions/Vector.ts +2 -5
- package/src/engine-components/timeline/PlayableDirector.ts +6 -4
- 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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
87
|
+
class Slice {
|
|
88
|
+
@serializable()
|
|
89
|
+
name!: string;
|
|
90
|
+
@serializable(Vector2)
|
|
91
|
+
offset!: Vector2;
|
|
92
|
+
@serializable(Vector2)
|
|
93
|
+
size!: Vector2;
|
|
94
|
+
}
|
|
53
95
|
|
|
54
|
-
|
|
55
|
-
vertices[i * 3 + 1] = sprite.vertices[index].y;
|
|
96
|
+
const $spriteTexOwner = Symbol("spriteOwner");
|
|
56
97
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
83
|
-
|
|
138
|
+
@serializable(SpriteSheet)
|
|
139
|
+
get sprite(): SpriteSheet | undefined {
|
|
140
|
+
return this._spriteSheet;
|
|
84
141
|
}
|
|
85
|
-
set sprite(value:
|
|
86
|
-
if(value === this.
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
124
|
-
|
|
125
|
-
//
|
|
126
|
-
|
|
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(
|
|
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(
|
|
133
|
-
this._currentSprite.material["map"] =
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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 })
|
|
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
|
-
|
|
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
|
|
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 &&
|
|
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 =
|
|
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 {
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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) {
|