@needle-tools/engine 2.26.0-pre → 2.27.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 (46) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/needle-engine.d.ts +2 -8
  3. package/dist/needle-engine.js +37 -37
  4. package/dist/needle-engine.js.map +3 -3
  5. package/dist/needle-engine.min.js +9 -9
  6. package/dist/needle-engine.min.js.map +3 -3
  7. package/lib/engine/engine_serialization_builtin_serializer.js +15 -4
  8. package/lib/engine/engine_serialization_builtin_serializer.js.map +1 -1
  9. package/lib/engine/extensions/NEEDLE_techniques_webgl.js +1 -1
  10. package/lib/engine/extensions/NEEDLE_techniques_webgl.js.map +1 -1
  11. package/lib/engine/extensions/extension_utils.js +6 -6
  12. package/lib/engine/extensions/extension_utils.js.map +1 -1
  13. package/lib/engine-components/AvatarLoader.d.ts +0 -3
  14. package/lib/engine-components/AvatarLoader.js +24 -53
  15. package/lib/engine-components/AvatarLoader.js.map +1 -1
  16. package/lib/engine-components/Component.js +10 -0
  17. package/lib/engine-components/Component.js.map +1 -1
  18. package/lib/engine-components/Renderer.d.ts +0 -2
  19. package/lib/engine-components/Renderer.js +0 -9
  20. package/lib/engine-components/Renderer.js.map +1 -1
  21. package/lib/engine-components/SmoothFollow.js +1 -1
  22. package/lib/engine-components/SmoothFollow.js.map +1 -1
  23. package/lib/engine-components/SpectatorCamera.d.ts +2 -3
  24. package/lib/engine-components/SpectatorCamera.js +50 -43
  25. package/lib/engine-components/SpectatorCamera.js.map +1 -1
  26. package/lib/engine-components/WebXRController.js +1 -0
  27. package/lib/engine-components/WebXRController.js.map +1 -1
  28. package/lib/engine-components/ui/BaseUIComponent.js +8 -5
  29. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  30. package/lib/engine-components/ui/Image.js +4 -0
  31. package/lib/engine-components/ui/Image.js.map +1 -1
  32. package/lib/engine-components/ui/RectTransform.js +1 -1
  33. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/engine/engine_serialization_builtin_serializer.ts +15 -3
  36. package/src/engine/extensions/NEEDLE_techniques_webgl.ts +1 -1
  37. package/src/engine/extensions/extension_utils.ts +6 -6
  38. package/src/engine-components/AvatarLoader.ts +24 -59
  39. package/src/engine-components/Component.ts +14 -3
  40. package/src/engine-components/Renderer.ts +0 -11
  41. package/src/engine-components/SmoothFollow.ts +1 -1
  42. package/src/engine-components/SpectatorCamera.ts +62 -48
  43. package/src/engine-components/WebXRController.ts +1 -0
  44. package/src/engine-components/ui/BaseUIComponent.ts +12 -5
  45. package/src/engine-components/ui/Image.ts +4 -0
  46. package/src/engine-components/ui/RectTransform.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","sourceRoot":"","sources":["../../../../engine-components/ui/Image.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,MAAM;IAER,OAAO,CAAiB;IAExB,IAAI,CAAqC;CAC5C;AAHG;IADC,aAAa,CAAC,OAAO,CAAC;uCACC;AAK5B,MAAM,OAAO,KAAM,SAAQ,eAAe;IAGtC,MAAM,CAAU;IAER,eAAe;QACnB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAChC,KAAK,sBAAsB,CAAC;YAC5B,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACb,OAAO,IAAI,CAAC;SACnB;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,cAAc,CAAC,IAAS;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACzB;IACL,CAAC;IAES,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AA1BG;IADC,aAAa,CAAC,MAAM,CAAC;qCACN;AA4BpB,MAAM,OAAO,QAAS,SAAQ,eAAe;IAEzC,WAAW,CAAW;IAEZ,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,qBAAqB;QACrB,0BAA0B;QAC1B,qCAAqC;QACrC,2CAA2C;QAC3C,IAAI;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;CACJ;AAXG;IADC,aAAa,CAAC,OAAO,CAAC;6CACD"}
1
+ {"version":3,"file":"Image.js","sourceRoot":"","sources":["../../../../engine-components/ui/Image.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,MAAM;IAER,OAAO,CAAiB;IAExB,IAAI,CAAqC;CAC5C;AAHG;IADC,aAAa,CAAC,OAAO,CAAC;uCACC;AAK5B,MAAM,OAAO,KAAM,SAAQ,eAAe;IAGtC,MAAM,CAAU;IAER,eAAe;QACnB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAChC,KAAK,sBAAsB,CAAC;YAC5B,KAAK,UAAU,CAAC;YAChB,KAAK,YAAY;gBACb,OAAO,IAAI,CAAC;SACnB;QACD,0FAA0F;QAC1F,0BAA0B;QAC1B,IAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE;YACtF,OAAO,IAAI,CAAC;QAChB,OAAO,KAAK,CAAC;IACjB,CAAC;IAES,cAAc,CAAC,IAAS;QAC9B,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;SACzB;IACL,CAAC;IAES,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AA9BG;IADC,aAAa,CAAC,MAAM,CAAC;qCACN;AAgCpB,MAAM,OAAO,QAAS,SAAQ,eAAe;IAEzC,WAAW,CAAW;IAEZ,cAAc;QACpB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,qBAAqB;QACrB,0BAA0B;QAC1B,qCAAqC;QACrC,2CAA2C;QAC3C,IAAI;QACJ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;CACJ;AAXG;IADC,aAAa,CAAC,OAAO,CAAC;6CACD"}
@@ -57,7 +57,7 @@ export class RectTransform extends BaseUIComponent {
57
57
  onEnable() {
58
58
  super.onEnable();
59
59
  this.addShadowComponent(this.rectBlock);
60
- this.applyTransform();
60
+ this._transformNeedsUpdate = true;
61
61
  }
62
62
  onDisable() {
63
63
  super.onDisable();
@@ -1 +1 @@
1
- {"version":3,"file":"RectTransform.js","sourceRoot":"","sources":["../../../../engine-components/ui/RectTransform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RectTransform.js","sourceRoot":"","sources":["../../../../engine-components/ui/RectTransform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "2.26.0-pre",
3
+ "version": "2.27.0-pre",
4
4
  "description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development, and can be deployed anywhere. It is flexible, extensible, and collaboration and XR come naturally.",
5
5
  "main": "dist/needle-engine.js",
6
6
  "module": "lib/needle-engine.js",
@@ -146,11 +146,23 @@ class ComponentSerializer extends TypeSerializer {
146
146
  }
147
147
 
148
148
  findObjectForGuid(guid: string, root: THREE.Object3D): any {
149
- return GameObject.foreachComponent(root, (c) => {
150
- if (guid === c.gameObject.guid) return c.gameObject;
149
+ // recursively search root
150
+ // need to check the root object too
151
+ if (root["guid"] === guid) return root;
152
+
153
+ const res = GameObject.foreachComponent(root, (c) => {
151
154
  if (c.guid === guid) return c;
152
155
  return undefined;
153
- });
156
+ }, false);
157
+ if (res !== undefined)
158
+ return res;
159
+
160
+ // if not found, search in children
161
+ for (let i = 0; i < root.children.length; i++) {
162
+ const child = root.children[i];
163
+ const res = this.findObjectForGuid(guid, child);
164
+ if (res) return res;
165
+ }
154
166
  }
155
167
  }
156
168
  export const componentSerializer = new ComponentSerializer();
@@ -392,7 +392,7 @@ export class NEEDLE_techniques_webgl implements GLTFLoaderPlugin {
392
392
  for (const key in materialExtension.values) {
393
393
  const val = materialExtension.values[key];
394
394
  if (typeof val === "string") {
395
- if (val.startsWith("textures/")) {
395
+ if (val.startsWith("/textures/")) {
396
396
  const indexString = val.substring(9);
397
397
  const texIndex = Number.parseInt(indexString);
398
398
  if (texIndex >= 0) {
@@ -10,12 +10,13 @@ declare type DependencyInfo = {
10
10
  dependencyName: string,
11
11
  }
12
12
 
13
+ const rootExtensionPrefix = "/extensions/";
13
14
  const defaultDependencies = [
14
- { prefix: "nodes/", dependencyName: "node" },
15
- { prefix: "meshes/", dependencyName: "mesh" },
16
- { prefix: "materials/", dependencyName: "material" },
17
- { prefix: "textures/", dependencyName: "texture" },
18
- { prefix: "animations/", dependencyName: "animation" }
15
+ { prefix: "/nodes/", dependencyName: "node" },
16
+ { prefix: "/meshes/", dependencyName: "mesh" },
17
+ { prefix: "/materials/", dependencyName: "material" },
18
+ { prefix: "/textures/", dependencyName: "texture" },
19
+ { prefix: "/animations/", dependencyName: "animation" }
19
20
  ]
20
21
 
21
22
  export async function resolveReferences(parser: GLTFParser, obj) {
@@ -93,7 +94,6 @@ function internalResolve(paths: DependencyInfo[], parser: GLTFParser, obj, promi
93
94
  }
94
95
 
95
96
 
96
- const rootExtensionPrefix = "extensions/";
97
97
  function resolveExtension(parser: GLTFParser, str): Promise<void> | null {
98
98
  if (parser && parser.plugins && typeof str === "string" && str.startsWith(rootExtensionPrefix)) {
99
99
  let name = str.substring(rootExtensionPrefix.length);
@@ -31,26 +31,13 @@ export class AvatarModel {
31
31
  // this.leftHand?.traverse(h => h.layers.set(2));
32
32
  // this.rigthHand?.traverse(h => h.layers.set(2));
33
33
  }
34
-
35
- // createNewInstance(): AvatarModel {
36
- // const head = GameObject.instantiate(this.head);
37
- // const lh = GameObject.instantiate(this.leftHand);
38
- // const rh = GameObject.instantiate(this.rigthHand);
39
- // const model = new AvatarModel(this.root, head, lh, rh);
40
- // this.assignRandomColors();
41
- // return model;
42
- // }
43
-
44
- assignRandomColors() {
45
- AvatarLoader.assignRandomPlayerColors(this);
46
- }
47
34
  }
48
35
 
49
36
  export class AvatarLoader {
50
37
 
51
- private readonly avatarRegistryUrl: string | null = null;// = "https://needle-storage-castle-demo.glitch.me";//"https://smol-worlds.glitch.me/files/";
38
+ private readonly avatarRegistryUrl: string | null = null;
52
39
  // private loader: GLTFLoader | null;
53
- private avatarModelCache: Map<string, AvatarModel | null> = new Map<string, AvatarModel | null>();
40
+ // private avatarModelCache: Map<string, AvatarModel | null> = new Map<string, AvatarModel | null>();
54
41
 
55
42
  public async getOrCreateNewAvatarInstance(context: Context, avatarId: string | THREE.Object3D): Promise<AvatarModel | null> {
56
43
 
@@ -74,8 +61,7 @@ export class AvatarLoader {
74
61
  return null;
75
62
  }
76
63
  const model = this.findAvatar(root);
77
- // console.log(model);
78
- model.assignRandomColors();
64
+ // model.assignRandomColors();
79
65
  // this.cacheModel(avatarId, model);
80
66
 
81
67
  if (model.isValid) {
@@ -166,19 +152,19 @@ export class AvatarLoader {
166
152
  // some GLTFs have a "scene" root it seems, others don't, we skip the root here if there's only one child
167
153
  if (searchIn.children.length == 1)
168
154
  searchIn = obj.children[0];
169
- let head = this.findAvatarPart(searchIn, "head");
155
+ let head = this.findAvatarPart(searchIn, ["head"]);
170
156
 
171
- const leftHand = this.findAvatarPart(searchIn, "left");
172
- const rightHand = this.findAvatarPart(searchIn, "right");
157
+ const leftHand = this.findAvatarPart(searchIn, ["left", "hand"]);
158
+ const rightHand = this.findAvatarPart(searchIn, ["right", "hand"]);
173
159
 
174
160
  if (!head) {
175
161
  // very last fallback, entire root is used as head
176
162
  head = root;
177
163
 
178
164
  // normalize size, if the object isn't properly setup the scale might be totally off
179
- let boundsSize = new THREE.Vector3();
165
+ const boundsSize = new THREE.Vector3();
180
166
  new THREE.Box3().setFromObject(head).getSize(boundsSize);
181
- let maxAxis = Math.max(boundsSize.x, boundsSize.y, boundsSize.z);
167
+ const maxAxis = Math.max(boundsSize.x, boundsSize.y, boundsSize.z);
182
168
  console.warn("[Custom Avatar] " + "Normalizing head scale, it's too big: " + maxAxis + " meters! Should be < 0.3m");
183
169
  if (maxAxis > 0.3) {
184
170
  head.scale.multiplyScalar(1.0 / maxAxis * 0.3);
@@ -190,10 +176,22 @@ export class AvatarLoader {
190
176
  }
191
177
 
192
178
 
193
- private findAvatarPart(obj: THREE.Object3D, searchString: string): THREE.Object3D | null {
194
- for (let child of obj.children) {
195
- if (child.name.toLowerCase().indexOf(searchString) > -1)
196
- return child;
179
+ private findAvatarPart(obj: THREE.Object3D, searchString: string[]): THREE.Object3D | null {
180
+
181
+ const name = obj.name.toLowerCase();
182
+ let matchesAll = true;
183
+ for (const str of searchString) {
184
+ if (!matchesAll) break;
185
+ if (name.indexOf(str) === -1)
186
+ matchesAll = false;
187
+ }
188
+ if (matchesAll) return obj;
189
+
190
+ if (obj.children) {
191
+ for (const child of obj.children) {
192
+ const found = this.findAvatarPart(child, searchString);
193
+ if (found) return found;
194
+ }
197
195
  }
198
196
  return null;
199
197
  }
@@ -204,37 +202,4 @@ export class AvatarLoader {
204
202
  }
205
203
  return response;
206
204
  }
207
-
208
- public static assignRandomPlayerColors(model: AvatarModel) {
209
-
210
- const foundMaterials: Map<string, THREE.Material> = new Map<string, THREE.Material>();
211
-
212
- function findPlayerColorMeshesAndAssignColors(o) {
213
- // console.log(o);
214
- if (o.type === "Mesh") {
215
- const mesh = o as THREE.Mesh;
216
- const mat: THREE.Material = mesh.material as THREE.Material;
217
- if (mat && mat.name) {
218
- if (foundMaterials.has(mat.uuid)) {
219
- const found = foundMaterials.get(mat.uuid);
220
- if (found)
221
- mesh.material = found;
222
- return;
223
- }
224
- if (mat.name.endsWith("_playercolor") || mat.name.endsWith("_player_color2")) {
225
- const uuid = mat.uuid;
226
- mesh.material = mat.clone();
227
- mesh.material["color"] = new THREE.Color(Math.random(), Math.random(), Math.random());
228
- foundMaterials.set(uuid, mesh.material);
229
- }
230
- }
231
- }
232
- }
233
- if (model.head)
234
- model.head.traverse(findPlayerColorMeshesAndAssignColors);
235
- if (model.leftHand)
236
- model.leftHand.traverse(findPlayerColorMeshesAndAssignColors);
237
- if (model.rigthHand)
238
- model.rigthHand.traverse(findPlayerColorMeshesAndAssignColors);
239
- }
240
205
  }
@@ -680,6 +680,17 @@ abstract class GameObject extends THREE.Object3D implements THREE.Object3D {
680
680
  }
681
681
 
682
682
 
683
+ // this is a fix to allow gameObject active animation be applied to a three object
684
+ Object.defineProperty(THREE.Object3D.prototype, "activeSelf", {
685
+ get: function () {
686
+ return this.visible;
687
+ },
688
+ set: function (val: boolean | number) {
689
+ const state = typeof val === "number" ? val > 0.5 : val;
690
+ this.visible = state;
691
+ }
692
+ });
693
+
683
694
 
684
695
  THREE.Object3D.prototype["addNewComponent"] = function <T extends Behaviour>(type: ConstructorConcrete<T>) {
685
696
  return GameObject.addNewComponent(this, type);
@@ -981,7 +992,7 @@ class Component implements EventTarget {
981
992
  }
982
993
 
983
994
 
984
-
995
+
985
996
  // EventTarget implementation:
986
997
 
987
998
  private _eventListeners = new Map<string, EventListener[]>();
@@ -1021,12 +1032,12 @@ class Behaviour extends Component {
1021
1032
  // when called from animationclip we receive numbers
1022
1033
  // due to interpolation they can be anything between 0 and 1
1023
1034
  if (typeof val === "number") {
1024
- if(val >= 0.5) val = true;
1035
+ if (val >= 0.5) val = true;
1025
1036
  else val = false;
1026
1037
  }
1027
1038
 
1028
1039
  if (val === this.__isEnabled) return;
1029
-
1040
+
1030
1041
  this.__isEnabled = val;
1031
1042
  // console.log(val);
1032
1043
  // need to check here because codegen is calling this before everything is setup
@@ -171,17 +171,6 @@ export class Renderer extends Behaviour {
171
171
  return lm !== null && lm !== undefined;
172
172
  }
173
173
 
174
-
175
- get activeSelf(): boolean {
176
- return this.enabled;
177
- }
178
-
179
- set activeSelf(val: boolean | number) {
180
- const target = typeof val === "number" ? val > 0.5 : val;
181
- this.enabled = target;
182
- if (target) this.gameObject.visible = true;
183
- }
184
-
185
174
  awake() {
186
175
  const type = this.gameObject.type;
187
176
  if (type === "Group") {
@@ -45,7 +45,7 @@ export class SmoothFollow extends Behaviour {
45
45
  if (this.rotateFactor > 0) {
46
46
  const wr = utils.getWorldQuaternion(this.target);
47
47
  if(this.flipForward){
48
- wr.multiply(SmoothFollow._invertForward);
48
+ wr.premultiply(SmoothFollow._invertForward);
49
49
  }
50
50
  const frot = this._firstUpdate || hard ? 1 : Mathf.clamp01(this.context.time.deltaTime * this.rotateFactor);
51
51
  this.worldQuaternion = this.worldQuaternion.slerp(wr, frot);
@@ -4,21 +4,22 @@ import * as THREE from "three";
4
4
  import { OrbitControls } from "./OrbitControls";
5
5
  import { WebXR, WebXREvent } from "./WebXR";
6
6
  import { AvatarMarker } from "./WebXRAvatar";
7
- import { XRFlag, XRStateFlag } from "./XRFlag";
7
+ import { XRStateFlag } from "./XRFlag";
8
8
  import { SmoothFollow } from "./SmoothFollow";
9
- import { setWorldPosition, setWorldQuaternion, getWorldPosition, getWorldQuaternion } from "../engine/engine_three_utils";
9
+ import { setWorldPosition, setWorldQuaternion, getWorldPosition, getWorldQuaternion, lookAtInverse } from "../engine/engine_three_utils";
10
+ import { ArrayCamera } from "three";
11
+ import { KeyCode } from "../engine/engine_input";
10
12
 
11
13
  export class SpectatorCamera extends Behaviour {
12
14
 
13
15
  cam: Camera | null = null;
14
16
 
15
- private _firstPersonMode: boolean | undefined = false;
17
+ private _firstPersonMode: boolean | undefined = true;
16
18
  get firstPersonMode(): boolean {
17
- return true;
18
19
  return this._firstPersonMode ?? false;
19
20
  }
20
- set firstPersonMode(_val: boolean) {
21
- // this._firstPersonMode = val;
21
+ set firstPersonMode(val: boolean) {
22
+ this._firstPersonMode = val;
22
23
  // if (this._firstPersonMode) this.enableFirstPersonMode();
23
24
  // else this.enableThirdPersonMode();
24
25
  }
@@ -62,7 +63,6 @@ export class SpectatorCamera extends Behaviour {
62
63
  private orbit: OrbitControls | null = null;
63
64
  private firstPersonFollow: SmoothFollow | null = null;
64
65
  private spectatorUIDomElement: HTMLElement | null = null;
65
- private _avatar: AvatarMarker | null = null;
66
66
 
67
67
  private eventSub_WebXRRequestStartEvent: Function | null = null;
68
68
  private eventSub_WebXRStartEvent: Function | null = null;
@@ -72,14 +72,6 @@ export class SpectatorCamera extends Behaviour {
72
72
 
73
73
  GameObject.setActive(this.gameObject, false);
74
74
 
75
- const uiQuery = "#spectator-camera-ui";
76
- this.spectatorUIDomElement = this.context.domElement.querySelector(uiQuery);
77
- if (!this.spectatorUIDomElement) {
78
- console.warn("Could not find spectator camera UI element", uiQuery);
79
- }
80
- this.spectatorUIDomElement?.classList.add("hidden");
81
-
82
-
83
75
  if (!this.isSupportedPlatform()) {
84
76
  console.log("Disable spectator cam", window.navigator.userAgent, this);
85
77
  return;
@@ -93,6 +85,22 @@ export class SpectatorCamera extends Behaviour {
93
85
  // this.cam = GameObject.addNewComponent(this.gameObject, Camera) as Camera;
94
86
  }
95
87
 
88
+ const uiQuery = "#spectator-camera-ui";
89
+ this.spectatorUIDomElement = this.context.domElement.querySelector(uiQuery);
90
+ if (!this.spectatorUIDomElement) {
91
+ console.warn("Could not find spectator camera UI element", uiQuery);
92
+ // this.spectatorUIDomElement = document.createElement("div");
93
+ // this.spectatorUIDomElement.id = "spectator-camera-ui";
94
+ // this.spectatorUIDomElement.classList.add("desktop");
95
+ // this.context.domElement.appendChild(this.spectatorUIDomElement);
96
+
97
+ // const toggle = document.createElement("button");
98
+ // toggle.id = "toggle-spectator-view";
99
+ // this.spectatorUIDomElement.appendChild(toggle);
100
+ }
101
+ this.spectatorUIDomElement?.classList.add("hidden");
102
+
103
+
96
104
  if (this.cam) {
97
105
  this.cam.enabled = true;
98
106
  this._orbitStartPos.copy(getWorldPosition(this.cam.cam));
@@ -189,53 +197,37 @@ export class SpectatorCamera extends Behaviour {
189
197
  private onXRSessionStart(_evt) {
190
198
  this._sessionHasStarted = true;
191
199
  this.updateUI();
200
+
201
+ if (this.context.mainCamera) {
202
+ const cam = this.context.renderer.xr.getCamera(this.context.mainCamera) as ArrayCamera;
203
+ this.setupFollowMode(cam);
204
+ }
192
205
  }
193
206
 
194
207
  private onXRSessionEnded(_evt) {
195
208
  this._sessionHasStarted = false;
209
+ this._firstPersonIsSetup = false;
196
210
  this.spectatorUIDomElement?.classList.add("hidden");
197
211
  GameObject.setActive(this.gameObject, false);
198
212
  }
199
213
 
200
214
  private _sessionHasStarted: boolean = false;
201
- private _isFirstStart = true;
202
215
  private _firstPersonIsSetup: boolean = false;
203
216
  private _orbitStartPos: THREE.Vector3 = new THREE.Vector3();
204
217
  private _orbitStartRot: THREE.Quaternion = new THREE.Quaternion();
205
218
  private _orbitStartPos2: THREE.Vector3 = new THREE.Vector3();
206
219
  private _orbitStartRot2: THREE.Quaternion = new THREE.Quaternion();
207
220
 
208
-
209
221
  // TODO: only show Spectator cam for DesktopVR;
210
222
  // don't show for AR, don't show on Quest
211
223
  // TODO: properly align cameras on enter/exit VR, seems currently spectator cam breaks alignment
212
224
  onAfterRender(): void {
213
225
  if (!this.cam) return;
214
226
 
215
- // if (this.context.time.frameCount % 120 === 0) {
216
- // this.firstPersonMode = !this.firstPersonMode;
217
- // }
218
-
219
- if (this.firstPersonMode) {
220
- if (!this._firstPersonIsSetup) {
221
- if (!this._avatar || this._avatar?.destroyed) {
222
- for (const av of AvatarMarker.instances) {
223
- if (av.avatar && "isLocalAvatar" in av.avatar && av.avatar?.isLocalAvatar) {
224
- this._avatar = av;
225
- const head = av.avatar.head;
226
- if (!head) continue;
227
- this.setupFollowMode(head);
228
- }
229
- }
230
- }
231
- // else {
232
- // if (this.context.mainCamera) {
233
- // this.setupFollowMode(this.context.mainCamera, true);
234
- // }
235
- // }
236
- }
237
- }
238
-
227
+ if(this.context.input.isKeyDown(KeyCode.KEY_S))
228
+ this.firstPersonMode = !this.firstPersonMode;
229
+
230
+ this.updateFollowSettings();
239
231
 
240
232
  const renderer = this.context.renderer;
241
233
  const xrWasEnabled = renderer.xr.enabled;
@@ -295,20 +287,22 @@ export class SpectatorCamera extends Behaviour {
295
287
  this.resetAvatarFlags();
296
288
  }
297
289
 
298
- private setupFollowMode(object: THREE.Object3D, flipForward: boolean = true) {
290
+ private setupFollowMode(object: THREE.Object3D) {
299
291
  if (!object) return;
300
292
  if (!this.cam) return;
301
293
  if (this._firstPersonIsSetup) return;
302
294
  this._firstPersonIsSetup = true;
303
295
 
304
- const target = object.add(new THREE.Object3D());
305
- target.add(new THREE.AxesHelper());
296
+
306
297
  this.firstPersonFollow = GameObject.addNewComponent(this.cam.gameObject, SmoothFollow);
298
+
299
+ const target = new THREE.Object3D();
300
+ object.add(target);
301
+ target.add(new THREE.AxesHelper(.2))
307
302
  this.firstPersonFollow.target = target;
308
- this.firstPersonFollow.followFactor = 12;
309
- this.firstPersonFollow.rotateFactor = 5;
310
- // TODO: figure out why this needs flipping when we use the spectator cam without an Avatar
311
- if (flipForward) this.firstPersonFollow.flipForward = true;
303
+
304
+ this.updateFollowSettings();
305
+
312
306
  const perspectiveCamera = this.context.mainCamera as THREE.PerspectiveCamera;
313
307
  if (perspectiveCamera) {
314
308
  this.cam.cam.near = perspectiveCamera.near;
@@ -318,6 +312,26 @@ export class SpectatorCamera extends Behaviour {
318
312
  if (this.orbit) this.orbit.enabled = false;
319
313
  }
320
314
 
315
+ private updateFollowSettings() {
316
+ const target = this.firstPersonFollow?.target;
317
+ if (!target || !this.firstPersonFollow) return;
318
+ if (this.firstPersonMode === false) {
319
+ this.firstPersonFollow.followFactor = 3;
320
+ this.firstPersonFollow.rotateFactor = 2;
321
+ this.firstPersonFollow.flipForward = false;
322
+ target.position.set(0, .5, 1.5);
323
+ target.quaternion.identity();
324
+ // lookAtInverse(target, new THREE.Vector3(0, 0, 0));
325
+ }
326
+ else {
327
+ target.position.set(0, 0, 0);
328
+ target.quaternion.identity();
329
+ this.firstPersonFollow.followFactor = 12;
330
+ this.firstPersonFollow.rotateFactor = 5;
331
+ this.firstPersonFollow.flipForward = false;
332
+ }
333
+ }
334
+
321
335
  private setAvatarFlagsBeforeRender() {
322
336
  for (const av of AvatarMarker.instances) {
323
337
  if (av.avatar && "isLocalAvatar" in av.avatar) {
@@ -249,6 +249,7 @@ export class WebXRController extends Behaviour {
249
249
  this.webXR.Rig?.add(this.controller);
250
250
  this.webXR.Rig?.add(this.raycastLine);
251
251
  this.raycastLine?.add(this._raycastHitPoint);
252
+ this._raycastHitPoint.visible = false;
252
253
  this.hand.add(this.handPointerModel);
253
254
  console.log("ADDED TO RIG", this.webXR.Rig);
254
255
 
@@ -67,19 +67,26 @@ export class BaseUIComponent extends Behaviour {
67
67
  return;
68
68
  }
69
69
 
70
- // console.trace(container);
71
70
  container.name = this.name + " (" + (this.constructor.name ?? "UI") + ")";
72
71
  container.autoLayout = this._parentComponent.controlsChildLayout;
73
72
  container.shadowComponentOwner = this;
74
- const raycastTarget = (this as unknown as IGraphic).raycastTarget;
73
+
74
+ // TODO: raycastTarget doesnt work anymore -> i think we need to set the gameObject layer and then check in the raycaster if the shadowComponentOwner is on the correct layer?!
75
+ // const raycastTarget = (this as unknown as IGraphic).raycastTarget;
76
+ // this.gameObject.layers.set(2)
77
+
78
+
75
79
  // TODO: only traverse our own hierarchy, we can stop if we find another owner
76
80
  container.traverse(c => {
77
- if (c.shadowComponentOwner === undefined)
81
+ if (c.shadowComponentOwner === undefined) {
78
82
  c.shadowComponentOwner = this;
79
- if (raycastTarget === false) {
80
- c.layers.set(2);
81
83
  }
84
+ // // this makes text not render anymore when enabled again
85
+ // if (raycastTarget === false) {
86
+ // c.layers.set(2);
87
+ // }
82
88
  })
89
+
83
90
  if (this.Root?.gameObject === this.gameObject) {
84
91
  this.gameObject.add(container);
85
92
  }
@@ -22,6 +22,10 @@ export class Image extends MaskableGraphic {
22
22
  case "Background":
23
23
  return true;
24
24
  }
25
+ // this is a hack/workaround for production builds where the name of the sprite is missing
26
+ // need to remove this!!!!
27
+ if(this.sprite?.texture?.image?.width === 32 && this.sprite?.texture?.image?.height === 32)
28
+ return true;
25
29
  return false;
26
30
  }
27
31
 
@@ -66,7 +66,7 @@ export class RectTransform extends BaseUIComponent {
66
66
  onEnable() {
67
67
  super.onEnable();
68
68
  this.addShadowComponent(this.rectBlock);
69
- this.applyTransform();
69
+ this._transformNeedsUpdate = true;
70
70
  }
71
71
 
72
72
  onDisable() {