@needle-tools/engine 4.10.0-beta.3 → 4.10.0-beta.5

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 (51) hide show
  1. package/components.needle.json +1 -1
  2. package/dist/{needle-engine.bundle-CLzMgxkO.min.js → needle-engine.bundle-BGVvfSfQ.min.js} +132 -130
  3. package/dist/{needle-engine.bundle-Ddybtee9.js → needle-engine.bundle-DcvMQ1Nq.js} +6115 -6083
  4. package/dist/{needle-engine.bundle-Ckr5KE6m.umd.cjs → needle-engine.bundle-DzVytSSo.umd.cjs} +133 -131
  5. package/dist/needle-engine.js +332 -331
  6. package/dist/needle-engine.min.js +1 -1
  7. package/dist/needle-engine.umd.cjs +1 -1
  8. package/lib/engine/codegen/register_types.js +1 -1
  9. package/lib/engine/codegen/register_types.js.map +1 -1
  10. package/lib/engine/engine_camera.js +5 -5
  11. package/lib/engine/engine_camera.js.map +1 -1
  12. package/lib/engine/engine_gizmos.d.ts +11 -10
  13. package/lib/engine/engine_gizmos.js +24 -10
  14. package/lib/engine/engine_gizmos.js.map +1 -1
  15. package/lib/engine/extensions/extension_utils.js +1 -1
  16. package/lib/engine/extensions/extension_utils.js.map +1 -1
  17. package/lib/engine/xr/NeedleXRController.d.ts +3 -3
  18. package/lib/engine/xr/NeedleXRController.js +28 -0
  19. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  20. package/lib/engine-components/codegen/components.d.ts +1 -1
  21. package/lib/engine-components/codegen/components.js +1 -1
  22. package/lib/engine-components/codegen/components.js.map +1 -1
  23. package/lib/engine-components/debug/LogStats.d.ts +1 -0
  24. package/lib/engine-components/debug/LogStats.js +1 -0
  25. package/lib/engine-components/debug/LogStats.js.map +1 -1
  26. package/lib/engine-components/timeline/PlayableDirector.js +1 -1
  27. package/lib/engine-components/timeline/PlayableDirector.js.map +1 -1
  28. package/lib/engine-components/timeline/TimelineTracks.d.ts +2 -1
  29. package/lib/engine-components/timeline/TimelineTracks.js +24 -19
  30. package/lib/engine-components/timeline/TimelineTracks.js.map +1 -1
  31. package/lib/engine-components/web/ScrollFollow.js +36 -34
  32. package/lib/engine-components/web/ScrollFollow.js.map +1 -1
  33. package/lib/engine-components/web/ViewBox.d.ts +14 -2
  34. package/lib/engine-components/web/ViewBox.js +39 -23
  35. package/lib/engine-components/web/ViewBox.js.map +1 -1
  36. package/lib/engine-components-experimental/Presentation.d.ts +1 -0
  37. package/lib/engine-components-experimental/Presentation.js +1 -0
  38. package/lib/engine-components-experimental/Presentation.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/engine/codegen/register_types.ts +1 -1
  41. package/src/engine/engine_camera.ts +5 -7
  42. package/src/engine/engine_gizmos.ts +37 -23
  43. package/src/engine/extensions/extension_utils.ts +1 -1
  44. package/src/engine/xr/NeedleXRController.ts +36 -4
  45. package/src/engine-components/codegen/components.ts +1 -1
  46. package/src/engine-components/debug/LogStats.ts +1 -0
  47. package/src/engine-components/timeline/PlayableDirector.ts +1 -1
  48. package/src/engine-components/timeline/TimelineTracks.ts +24 -19
  49. package/src/engine-components/web/ScrollFollow.ts +40 -36
  50. package/src/engine-components/web/ViewBox.ts +45 -27
  51. package/src/engine-components-experimental/Presentation.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ViewBox.js","sourceRoot":"","sources":["../../../src/engine-components/web/ViewBox.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ViewBox.js","sourceRoot":"","sources":["../../../src/engine-components/web/ViewBox.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { KeyCode } from "../engine/engine_input.js";
2
2
  import { Behaviour } from "../engine-components/Component.js";
3
+ /** @internal */
3
4
  export declare class PresentationMode extends Behaviour {
4
5
  toggleKey: KeyCode;
5
6
  update(): void;
@@ -1,4 +1,5 @@
1
1
  import { Behaviour } from "../engine-components/Component.js";
2
+ /** @internal */
2
3
  export class PresentationMode extends Behaviour {
3
4
  toggleKey = "KeyP";
4
5
  update() {
@@ -1 +1 @@
1
- {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../src/engine-components-experimental/Presentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAE3C,SAAS,GAAY,MAAM,CAAC;IAE5B,MAAM;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;SACjE;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"Presentation.js","sourceRoot":"","sources":["../../src/engine-components-experimental/Presentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,gBAAgB;AAChB,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAE3C,SAAS,GAAY,MAAM,CAAC;IAE5B,MAAM;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;SACjE;IACL,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@needle-tools/engine",
3
- "version": "4.10.0-beta.3",
3
+ "version": "4.10.0-beta.5",
4
4
  "description": "Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.",
5
5
  "main": "dist/needle-engine.min.js",
6
6
  "exports": {
@@ -301,7 +301,7 @@ TypeStore.add("ClickThrough", ClickThrough);
301
301
  TypeStore.add("CursorFollow", CursorFollow);
302
302
  TypeStore.add("HoverAnimation", HoverAnimation);
303
303
  TypeStore.add("ScrollFollow", ScrollFollow);
304
- TypeStore.add("ViewBox", ViewBox);
304
+ TypeStore.add("ResponsiveBox", ViewBox);
305
305
  TypeStore.add("Avatar", Avatar);
306
306
  TypeStore.add("XRControllerFollow", XRControllerFollow);
307
307
  TypeStore.add("XRControllerModel", XRControllerModel);
@@ -2,6 +2,7 @@ import { Camera, HemisphereLightHelper, Object3D, PerspectiveCamera, Vector2, We
2
2
 
3
3
  import { Mathf } from "./engine_math.js";
4
4
  import type { ICameraController } from "./engine_types.js";
5
+ import { getParam } from "./engine_utils.js";
5
6
 
6
7
 
7
8
  const $cameraController = "needle:cameraController";
@@ -66,11 +67,15 @@ export type FocusRect = DOMRect | Element | { x: number, y: number, width: numbe
66
67
  let rendererRect: DOMRect | undefined = undefined;
67
68
  const overlapRect = { x: 0, y: 0, width: 0, height: 0 };
68
69
  const _testTime = 1;
70
+ const debug = getParam("debugfocusrect");
69
71
 
70
72
  /** Used internally by the Needle Engine context via 'setFocusRect(<rect>)' */
71
73
  export function updateCameraFocusRect(focusRect: FocusRect, settings: FocusRectSettings, dt: number, camera: PerspectiveCamera, renderer: WebGLRenderer) {
72
74
 
73
75
  if (focusRect instanceof Element) {
76
+ if(debug && focusRect instanceof HTMLElement) {
77
+ focusRect.style.outline = "2px dashed rgba(255, 150, 0, .8)";
78
+ }
74
79
  focusRect = focusRect.getBoundingClientRect();
75
80
  }
76
81
  rendererRect = renderer.domElement.getBoundingClientRect();
@@ -136,10 +141,3 @@ export function updateCameraFocusRect(focusRect: FocusRect, settings: FocusRectS
136
141
  settings.damping = Math.max(0, settings.damping);
137
142
  }
138
143
  }
139
-
140
-
141
- function fit(width1: number, height1: number, width2: number, height2: number) {
142
- const scaleX = width2 / width1;
143
- const scaleY = height2 / height1;
144
- return Math.max(scaleX, scaleY);
145
- }
@@ -1,4 +1,4 @@
1
- import { AxesHelper, Box3, BoxGeometry, BufferAttribute, BufferGeometry, Color, type ColorRepresentation, CylinderGeometry, EdgesGeometry, Line, LineBasicMaterial, LineSegments, Matrix4, Mesh, MeshBasicMaterial, Object3D, Quaternion, SphereGeometry, Vector3 } from 'three';
1
+ import { AxesHelper, Box3, BoxGeometry, BufferAttribute, BufferGeometry, Color, type ColorRepresentation, CylinderGeometry, EdgesGeometry, Line, LineBasicMaterial, LineSegments, Material,Matrix4, Mesh, MeshBasicMaterial, Object3D, Quaternion, SphereGeometry, Vector3 } from 'three';
2
2
  import ThreeMeshUI, { Inline, Text } from "three-mesh-ui"
3
3
  import { type Options } from 'three-mesh-ui/build/types/core/elements/MeshUIBaseElement.js';
4
4
 
@@ -8,6 +8,7 @@ import { getTempVector, getWorldPosition, lookAtObject, setWorldPositionXYZ } fr
8
8
  import type { Vec3, Vec4 } from './engine_types.js';
9
9
  import { getParam } from './engine_utils.js';
10
10
  import { NeedleXRSession } from './engine_xr.js';
11
+ import { RGBAColor } from './js-extensions/RGBAColor.js';
11
12
 
12
13
  const _tmp = new Vector3();
13
14
  const _tmp2 = new Vector3();
@@ -21,7 +22,7 @@ const circleSegments: number = 32;
21
22
  export type LabelHandle = {
22
23
  setText(str: string);
23
24
  }
24
- declare type ColorWithAlpha = Color & { a: number };
25
+ type GizmoColor = ColorRepresentation | (Color & { a: number }) | RGBAColor;
25
26
 
26
27
  /** Gizmos are temporary objects that are drawn in the scene for debugging or visualization purposes
27
28
  * They are automatically removed after a given duration and cached internally to reduce overhead.
@@ -62,7 +63,7 @@ export class Gizmos {
62
63
  * @param parent the parent object to attach the label to. If no parent is provided the label will be attached to the scene
63
64
  * @returns a handle to the label that can be used to update the text
64
65
  */
65
- static DrawLabel(position: Vec3, text: string, size: number = .05, duration: number = 0, color?: ColorRepresentation, backgroundColor?: ColorRepresentation | ColorWithAlpha, parent?: Object3D,) {
66
+ static DrawLabel(position: Vec3, text: string, size: number = .05, duration: number = 0, color?: ColorRepresentation, backgroundColor?: ColorRepresentation | GizmoColor, parent?: Object3D,) {
66
67
  if (!Gizmos.enabled) return null;
67
68
  if (!color) color = defaultColor;
68
69
  const rigScale = NeedleXRSession.active?.rigScale ?? 1;
@@ -82,7 +83,7 @@ export class Gizmos {
82
83
  * @param duration the duration in seconds the ray will be rendered. If 0 it will be rendered for one frame
83
84
  * @param depthTest if true the ray will be rendered with depth test
84
85
  */
85
- static DrawRay(origin: Vec3, dir: Vec3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
86
+ static DrawRay(origin: Vec3, dir: Vec3, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true) {
86
87
  if (!Gizmos.enabled) return;
87
88
  const obj = Internal.getLine(duration);
88
89
  const positions = obj.geometry.getAttribute("position");
@@ -90,9 +91,10 @@ export class Gizmos {
90
91
  _tmp.set(dir.x, dir.y, dir.z).multiplyScalar(999999999);
91
92
  positions.setXYZ(1, origin.x + _tmp.x, origin.y + _tmp.y, origin.z + _tmp.z);
92
93
  positions.needsUpdate = true;
93
- obj.material["color"].set(color);
94
94
  obj.material["depthTest"] = depthTest;
95
95
  obj.material["depthWrite"] = false;
96
+ obj.material["fog"] = false;
97
+ applyGizmoColor(obj.material, color);
96
98
  }
97
99
 
98
100
  /**
@@ -104,7 +106,7 @@ export class Gizmos {
104
106
  * @param depthTest if true the line will be rendered with depth test
105
107
  * @param lengthFactor the length of the line. Default is 1
106
108
  */
107
- static DrawDirection(pt: Vec3, direction: Vec3 | Vec4, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true, lengthFactor: number = 1) {
109
+ static DrawDirection(pt: Vec3, direction: Vec3 | Vec4, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true, lengthFactor: number = 1) {
108
110
  if (!Gizmos.enabled) return;
109
111
  const obj = Internal.getLine(duration);
110
112
  const positions = obj.geometry.getAttribute("position");
@@ -120,10 +122,9 @@ export class Gizmos {
120
122
  }
121
123
  positions.setXYZ(1, pt.x + _tmp.x, pt.y + _tmp.y, pt.z + _tmp.z);
122
124
  positions.needsUpdate = true;
123
- obj.material["color"].set(color);
124
125
  obj.material["depthTest"] = depthTest;
125
126
  obj.material["depthWrite"] = false;
126
-
127
+ applyGizmoColor(obj.material, color);
127
128
  }
128
129
 
129
130
  /**
@@ -134,17 +135,17 @@ export class Gizmos {
134
135
  * @param duration the duration in seconds the line will be rendered. If 0 it will be rendered for one frame
135
136
  * @param depthTest if true the line will be rendered with depth test
136
137
  */
137
- static DrawLine(pt0: Vec3, pt1: Vec3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
138
+ static DrawLine(pt0: Vec3, pt1: Vec3, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true) {
138
139
  if (!Gizmos.enabled) return;
139
140
  const obj = Internal.getLine(duration);
140
141
  const positions = obj.geometry.getAttribute("position");
141
142
  positions.setXYZ(0, pt0.x, pt0.y, pt0.z);
142
143
  positions.setXYZ(1, pt1.x, pt1.y, pt1.z);
143
144
  positions.needsUpdate = true;
144
- obj.material["color"].set(color);
145
145
  obj.material["depthTest"] = depthTest;
146
146
  obj.material["depthWrite"] = false;
147
147
  obj.material["fog"] = false;
148
+ applyGizmoColor(obj.material, color);
148
149
  }
149
150
 
150
151
  /**
@@ -162,10 +163,10 @@ export class Gizmos {
162
163
  obj.position.set(pt0.x, pt0.y, pt0.z);
163
164
  obj.scale.set(radius, radius, radius);
164
165
  obj.quaternion.setFromUnitVectors(this._up, _tmp.set(normal.x, normal.y, normal.z).normalize());
165
- obj.material["color"].set(color);
166
166
  obj.material["depthTest"] = depthTest;
167
167
  obj.material["depthWrite"] = false;
168
168
  obj.material["fog"] = false;
169
+ applyGizmoColor(obj.material, color);
169
170
  }
170
171
 
171
172
  /**
@@ -176,14 +177,14 @@ export class Gizmos {
176
177
  * @param duration the duration in seconds the sphere will be rendered. If 0 it will be rendered for one frame
177
178
  * @param depthTest if true the sphere will be rendered with depth test
178
179
  */
179
- static DrawWireSphere(center: Vec3, radius: number, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
180
+ static DrawWireSphere(center: Vec3, radius: number, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true) {
180
181
  if (!Gizmos.enabled) return;
181
182
  const obj = Internal.getSphere(radius, duration, true);
182
183
  setWorldPositionXYZ(obj, center.x, center.y, center.z);
183
- obj.material["color"].set(color);
184
184
  obj.material["depthTest"] = depthTest;
185
185
  obj.material["depthWrite"] = false;
186
186
  obj.material["fog"] = false;
187
+ applyGizmoColor(obj.material, color);
187
188
  }
188
189
 
189
190
  /**
@@ -194,13 +195,13 @@ export class Gizmos {
194
195
  * @param duration the duration in seconds the sphere will be rendered. If 0 it will be rendered for one frame
195
196
  * @param depthTest if true the sphere will be rendered with depth test
196
197
  */
197
- static DrawSphere(center: Vec3, radius: number, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
198
+ static DrawSphere(center: Vec3, radius: number, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true) {
198
199
  if (!Gizmos.enabled) return;
199
200
  const obj = Internal.getSphere(radius, duration, false);
200
201
  setWorldPositionXYZ(obj, center.x, center.y, center.z);
201
- obj.material["color"].set(color);
202
202
  obj.material["depthTest"] = depthTest;
203
203
  obj.material["depthWrite"] = false;
204
+ applyGizmoColor(obj.material, color);
204
205
  }
205
206
 
206
207
  /**
@@ -212,18 +213,18 @@ export class Gizmos {
212
213
  * @param duration the duration in seconds the box will be rendered. If 0 it will be rendered for one frame
213
214
  * @param depthTest if true the box will be rendered with depth test
214
215
  */
215
- static DrawWireBox(center: Vec3, size: Vec3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true, rotation: Quaternion|undefined = undefined) {
216
+ static DrawWireBox(center: Vec3, size: Vec3, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true, rotation: Quaternion | undefined = undefined) {
216
217
  if (!Gizmos.enabled) return;
217
218
  const obj = Internal.getBox(duration);
218
219
  obj.position.set(center.x, center.y, center.z);
219
220
  obj.scale.set(size.x, size.y, size.z);
220
- if(rotation) obj.quaternion.copy(rotation);
221
+ if (rotation) obj.quaternion.copy(rotation);
221
222
  else obj.quaternion.identity();
222
- obj.material["color"].set(color);
223
223
  obj.material["depthTest"] = depthTest;
224
224
  obj.material["wireframe"] = true;
225
225
  obj.material["depthWrite"] = false;
226
226
  obj.material["fog"] = false;
227
+ applyGizmoColor(obj.material, color);
227
228
  }
228
229
 
229
230
  /**
@@ -233,16 +234,16 @@ export class Gizmos {
233
234
  * @param duration the duration in seconds the box will be rendered. If 0 it will be rendered for one frame. Default: 0
234
235
  * @param depthTest if true the box will be rendered with depth test. Default: true
235
236
  */
236
- static DrawWireBox3(box: Box3, color: ColorRepresentation = defaultColor, duration: number = 0, depthTest: boolean = true) {
237
+ static DrawWireBox3(box: Box3, color: GizmoColor = defaultColor, duration: number = 0, depthTest: boolean = true) {
237
238
  if (!Gizmos.enabled) return;
238
239
  const obj = Internal.getBox(duration);
239
240
  obj.position.copy(box.getCenter(_tmp));
240
241
  obj.scale.copy(box.getSize(_tmp));
241
- obj.material["color"].set(color);
242
242
  obj.material["depthTest"] = depthTest;
243
243
  obj.material["wireframe"] = true;
244
244
  obj.material["depthWrite"] = false;
245
245
  obj.material["fog"] = false;
246
+ applyGizmoColor(obj.material, color);
246
247
  }
247
248
 
248
249
  private static _up = new Vector3(0, 1, 0);
@@ -263,9 +264,9 @@ export class Gizmos {
263
264
  const dist = _tmp.set(pt1.x, pt1.y, pt1.z).sub(_tmp2.set(pt0.x, pt0.y, pt0.z)).length();
264
265
  const scale = dist * 0.1;
265
266
  obj.scale.set(scale, scale, scale);
266
- obj.material["color"].set(color);
267
267
  obj.material["depthTest"] = depthTest;
268
268
  obj.material["wireframe"] = wireframe;
269
+ applyGizmoColor(obj.material, color);
269
270
  this.DrawLine(pt0, pt1, color, duration, depthTest);
270
271
  }
271
272
 
@@ -296,9 +297,9 @@ export class Gizmos {
296
297
  }
297
298
  mesh.matrixAutoUpdate = false;
298
299
  mesh.matrixWorldAutoUpdate = false;
299
- mesh.material["color"].set(options.color ?? defaultColor);
300
300
  mesh.material["depthTest"] = options.depthTest ?? true;
301
301
  mesh.material["wireframe"] = true;
302
+ applyGizmoColor(mesh.material, options.color ?? defaultColor);
302
303
  }
303
304
  }
304
305
 
@@ -316,6 +317,19 @@ export function CreateWireCube(col: ColorRepresentation | null = null): LineSegm
316
317
  }
317
318
 
318
319
 
320
+ function applyGizmoColor(material: Material | Material[], color: GizmoColor) {
321
+ if (Array.isArray(material)) {
322
+ for (const mat of material) {
323
+ applyGizmoColor(mat, color);
324
+ }
325
+ return;
326
+ }
327
+ const alpha = (color instanceof RGBAColor) ? color.a : 1.0;
328
+ material["color"].set(color);
329
+ material["opacity"] = alpha;
330
+ material["transparent"] = alpha < 1.0;
331
+ }
332
+
319
333
 
320
334
  const $cacheSymbol = Symbol("GizmoCache");
321
335
  class Internal {
@@ -335,7 +349,7 @@ class Internal {
335
349
  }
336
350
  }
337
351
 
338
- static getTextLabel(duration: number, text: string, size: number, color: ColorRepresentation, backgroundColor?: ColorRepresentation | ColorWithAlpha): Text & LabelHandle {
352
+ static getTextLabel(duration: number, text: string, size: number, color: ColorRepresentation, backgroundColor?: ColorRepresentation | GizmoColor): Text & LabelHandle {
339
353
  this.ensureFont();
340
354
  let element = this.textLabelCache.pop();
341
355
 
@@ -89,7 +89,7 @@ function internalResolve(paths: DependencyInfo[], parser: GLTFParserWithCache, o
89
89
  for (let i = 0; i < val.length; i++) {
90
90
  const entry = val[i];
91
91
  const ext = resolveExtension(parser, entry);
92
- if (ext !== null) {
92
+ if (ext !== null && ext !== undefined) {
93
93
  if (typeof ext.then === "function")
94
94
  promises.push(ext.then(res => val[i] = res));
95
95
  else val[i] = ext;
@@ -23,10 +23,10 @@ const debugCustomGesture = getParam("debugcustomgesture");
23
23
  // let _didReceiveSelectStartEvent = false;
24
24
 
25
25
  // https://github.com/immersive-web/webxr-input-profiles/blob/4484a05e30bcd43fe86bb4e06b7a707861a26796/packages/registry/profiles/meta/meta-quest-touch-plus.json
26
- declare type ControllerAxes = "xr-standard-thumbstick";
27
- declare type StickName = "xr-standard-thumbstick";
26
+ declare type ControllerAxes = "xr-standard-thumbstick" | "xr-standard-touchpad";
27
+ declare type StickName = "xr-standard-thumbstick" | "xr-standard-touchpad";
28
28
  declare type Mapping = "xr-standard";
29
- declare type ComponentType = "button" | "thumbstick" | "squeeze";
29
+ declare type ComponentType = "button" | "thumbstick" | "squeeze" | "touchpad";
30
30
  declare type GamepadKey = "button" | "xAxis" | "yAxis";
31
31
 
32
32
  declare type NeedleXRControllerButtonName = ButtonName | "primary-button" | "primary";
@@ -407,6 +407,16 @@ C:${this.connected ? "x" : "-"} T:${this.isTracking ? "x" : "-"} Hand:${this.inp
407
407
  gamepadStr += "\n[axes " + gp.axes.length + "]: " + gp.axes.map(a => a.toPrecision(1)).join(",");
408
408
  debugStr += "\n" + gamepadStr;
409
409
  }
410
+ if (this._layout) {
411
+ debugStr += "\nLayout: ";
412
+ for (const component of Object.keys(this._layout.components || {})) {
413
+ const val = this.getStick(component as StickName);
414
+ const indices = this._layout.components[component]?.gamepadIndices;
415
+ const indicesAsString = indices ? Object.entries(indices).map(e => e[0][0].toUpperCase() + e[0].slice(1) + "=" + e[1]).join(",") : "";
416
+ debugStr += `\n ${component}: ${this._layout.components[component]?.type} [${indicesAsString}] (${val.x.toPrecision(2)},${val.y.toPrecision(2)})`;
417
+ }
418
+ }
419
+
410
420
  Gizmos.DrawLabel(debugLabelPosition, debugStr, .006);
411
421
  }
412
422
 
@@ -730,6 +740,7 @@ C:${this.connected ? "x" : "-"} T:${this.isTracking ? "x" : "-"} Hand:${this.inp
730
740
  if (componentModel?.gamepadIndices) {
731
741
  switch (componentModel.type) {
732
742
  case "thumbstick":
743
+ case "touchpad":
733
744
  if (this.inputSource.gamepad) {
734
745
  const xIndex = componentModel.gamepadIndices!.xAxis!;
735
746
  const yIndex = componentModel.gamepadIndices!.yAxis!;
@@ -760,7 +771,11 @@ C:${this.connected ? "x" : "-"} T:${this.isTracking ? "x" : "-"} Hand:${this.inp
760
771
  this._isMetaQuestTouchController = this.profiles.includes("meta-quest-touch-plus") || this.profiles.includes("oculus-touch-v3");
761
772
 
762
773
  // Proper profile starting with v69 and browser 35.1
763
- this._isMxInk = this.profiles.includes("logitech-mx-ink")
774
+ this._isMxInk = this.profiles.includes("logitech-mx-ink");
775
+
776
+ // For debugging to see ALL available profiles
777
+ /** @ts-ignore */
778
+ // fetchProfilesList(DEFAULT_PROFILES_PATH).then(list => console.log("Available controller profiles", list));
764
779
 
765
780
  if (!this._layout) {
766
781
  // Ignore transient-pointer since we likely don't want to spawn a controller visual just for a temporary pointer.
@@ -780,6 +795,8 @@ C:${this.connected ? "x" : "-"} T:${this.isTracking ? "x" : "-"} Hand:${this.inp
780
795
  res.assetPath || ""
781
796
  );
782
797
 
798
+ // const overrideProfile = await fetch(DEFAULT_PROFILES_PATH + "/htc-vive-focus-3/profile.json").then(r => r.json());
799
+
783
800
  const profile = res.profile as InputDeviceProfile;
784
801
  const layout = profile.layouts[this.inputSource.handedness];
785
802
  this._layout = layout;
@@ -791,6 +808,21 @@ C:${this.connected ? "x" : "-"} T:${this.isTracking ? "x" : "-"} Hand:${this.inp
791
808
  this._layout.gamepad[component.gamepadIndices!.button!] = key as XRControllerButtonName;
792
809
  }
793
810
  }
811
+
812
+ // If we have 4 axes and no thumbstick defined, we define thumbstick for axis 3+4
813
+ // This is a workaround for HTC Vive Focus 3 controllers, which have the profile for Vive Focus Plus...
814
+ // This workaround fixes it for HTC Vive Focus 3 but does not change anything for Vive Focus Plus controllers
815
+ if (this.profiles.length >= 1 && this.profiles[0] === "htc-vive-focus-plus") {
816
+ if (this.inputSource.gamepad && this.inputSource.gamepad.axes.length === 4 && !this._layout.components["xr-standard-thumbstick"]) {
817
+ this._layout.components["xr-standard-thumbstick"] = {
818
+ type: "thumbstick",
819
+ gamepadIndices: {
820
+ xAxis: 2,
821
+ yAxis: 3,
822
+ }
823
+ }
824
+ }
825
+ }
794
826
  }
795
827
  // if (debug) console.log(this._layout, this.inputSource);
796
828
  // debugger;
@@ -208,7 +208,7 @@ export { ClickThrough } from "../web/Clickthrough.js";
208
208
  export { CursorFollow } from "../web/CursorFollow.js";
209
209
  export { HoverAnimation } from "../web/HoverAnimation.js";
210
210
  export { ScrollFollow } from "../web/ScrollFollow.js";
211
- export { ViewBox } from "../web/ViewBox.js";
211
+ export { ViewBox as ResponsiveBox } from "../web/ViewBox.js";
212
212
  export { Avatar } from "../webxr/Avatar.js";
213
213
  export { XRControllerFollow } from "../webxr/controllers/XRControllerFollow.js";
214
214
  export { XRControllerModel } from "../webxr/controllers/XRControllerModel.js";
@@ -4,6 +4,7 @@ import { Behaviour } from "../../engine-components/Component.js";
4
4
 
5
5
  const debug = getParam("logstats");
6
6
 
7
+ /** @internal */
7
8
  export class LogStats extends Behaviour {
8
9
 
9
10
  onEnable(): void {
@@ -115,7 +115,7 @@ export class PlayableDirector extends Behaviour {
115
115
  /** @internal */
116
116
  awake(): void {
117
117
  if (debug)
118
- console.log(this, this.playableAsset?.tracks);
118
+ console.log(this, this.playableAsset);
119
119
 
120
120
  this.rebuildGraph();
121
121
 
@@ -187,21 +187,22 @@ export class AnimationTrackHandler extends TrackHandler {
187
187
  return;
188
188
  }
189
189
  // we only want to hook into the binding of the root object
190
- // TODO: test with a clip with multiple roots
191
- const parts = clip.tracks[0].name.split(".");
192
- const rootName = parts[parts.length - 2];
193
- const positionTrackName = rootName + ".position";
194
- const rotationTrackName = rootName + ".quaternion";
195
190
  let foundPositionTrack: boolean = false;
196
191
  let foundRotationTrack: boolean = false;
197
- for (const t of clip.tracks) {
198
- if (t.name.endsWith(positionTrackName)) {
199
- foundPositionTrack = true;
200
- this.createPositionInterpolant(clip, clipModel, t);
201
- }
202
- else if (t.name.endsWith(rotationTrackName)) {
203
- foundRotationTrack = true;
204
- this.createRotationInterpolant(clip, clipModel, t);
192
+ const parts = clip.tracks.find(t => t.name.includes(".position") || t.name.includes(".quaternion"))?.name.split(".");
193
+ if (parts) {
194
+ const rootName = parts[parts.length - 2];
195
+ const positionTrackName = rootName + ".position";
196
+ const rotationTrackName = rootName + ".quaternion";
197
+ for (const t of clip.tracks) {
198
+ if (!foundPositionTrack && t.name.endsWith(positionTrackName)) {
199
+ foundPositionTrack = true;
200
+ this.createPositionInterpolant(clip, clipModel, t);
201
+ }
202
+ else if (!foundRotationTrack && t.name.endsWith(rotationTrackName)) {
203
+ foundRotationTrack = true;
204
+ this.createRotationInterpolant(clip, clipModel, t);
205
+ }
205
206
  }
206
207
  }
207
208
 
@@ -834,23 +835,27 @@ export class AudioTrackHandler extends TrackHandler {
834
835
 
835
836
  export class MarkerTrackHandler extends TrackHandler {
836
837
  models: Array<Models.MarkerModel & Record<string, any>> = [];
837
- isDirty = true;
838
+ needsSorting = true;
838
839
 
839
840
  *foreachMarker<T>(type: string | null = null) {
841
+ if(this.needsSorting) this.sort();
840
842
  for (const model of this.models) {
841
843
  if (model && model.type === type) yield model as T;
842
844
  }
843
845
  }
844
846
 
845
847
  onEnable() {
846
- this.isDirty = true;
848
+ this.needsSorting = true;
847
849
  }
848
850
 
849
851
  evaluate(_time: number) {
850
- if (this.isDirty) {
851
- this.isDirty = false;
852
- this.models.sort((a, b) => a.time - b.time);
853
- }
852
+ if (this.needsSorting) this.sort();
853
+ }
854
+
855
+ private sort() {
856
+ this.needsSorting = false;
857
+ this.models.sort((a, b) => a.time - b.time);
858
+
854
859
  }
855
860
  }
856
861