@needle-tools/engine 4.2.0 → 4.2.3

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 (91) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/gltf-progressive.js +258 -257
  3. package/dist/gltf-progressive.light.js +258 -257
  4. package/dist/gltf-progressive.light.min.js +7 -7
  5. package/dist/gltf-progressive.light.umd.cjs +7 -7
  6. package/dist/gltf-progressive.min.js +7 -7
  7. package/dist/gltf-progressive.umd.cjs +7 -7
  8. package/dist/needle-engine.bundle.js +6660 -6588
  9. package/dist/needle-engine.bundle.light.js +6651 -6579
  10. package/dist/needle-engine.bundle.light.min.js +124 -120
  11. package/dist/needle-engine.bundle.light.umd.cjs +122 -118
  12. package/dist/needle-engine.bundle.min.js +124 -120
  13. package/dist/needle-engine.bundle.umd.cjs +122 -118
  14. package/dist/needle-engine.light.d.ts +9 -9
  15. package/lib/engine/engine_context.d.ts +1 -0
  16. package/lib/engine/engine_context.js +7 -3
  17. package/lib/engine/engine_context.js.map +1 -1
  18. package/lib/engine/engine_input.d.ts +14 -2
  19. package/lib/engine/engine_input.js +41 -6
  20. package/lib/engine/engine_input.js.map +1 -1
  21. package/lib/engine/engine_loaders.js +6 -12
  22. package/lib/engine/engine_loaders.js.map +1 -1
  23. package/lib/engine/engine_physics_rapier.js +1 -1
  24. package/lib/engine/engine_physics_rapier.js.map +1 -1
  25. package/lib/engine/engine_serialization_core.js +16 -3
  26. package/lib/engine/engine_serialization_core.js.map +1 -1
  27. package/lib/engine/engine_types.d.ts +5 -0
  28. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  29. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  30. package/lib/engine-components/Duplicatable.js +2 -2
  31. package/lib/engine-components/Duplicatable.js.map +1 -1
  32. package/lib/engine-components/EventTrigger.d.ts +2 -0
  33. package/lib/engine-components/EventTrigger.js +12 -0
  34. package/lib/engine-components/EventTrigger.js.map +1 -1
  35. package/lib/engine-components/OrbitControls.d.ts +9 -2
  36. package/lib/engine-components/OrbitControls.js +62 -19
  37. package/lib/engine-components/OrbitControls.js.map +1 -1
  38. package/lib/engine-components/Renderer.js +5 -0
  39. package/lib/engine-components/Renderer.js.map +1 -1
  40. package/lib/engine-components/ScreenCapture.js +2 -2
  41. package/lib/engine-components/ScreenCapture.js.map +1 -1
  42. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +0 -1
  43. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js.map +1 -1
  44. package/lib/engine-components/export/usdz/USDZExporter.js +2 -2
  45. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  46. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +19 -11
  47. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js.map +1 -1
  48. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +7 -2
  49. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +33 -11
  50. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -1
  51. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +1 -0
  52. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +5 -2
  53. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js.map +1 -1
  54. package/lib/engine-components/ui/Button.js +3 -3
  55. package/lib/engine-components/ui/Button.js.map +1 -1
  56. package/lib/engine-components/ui/EventSystem.d.ts +6 -10
  57. package/lib/engine-components/ui/EventSystem.js +35 -52
  58. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  59. package/lib/engine-components/ui/InputField.d.ts +4 -1
  60. package/lib/engine-components/ui/InputField.js +19 -0
  61. package/lib/engine-components/ui/InputField.js.map +1 -1
  62. package/lib/engine-components/utils/OpenURL.js +2 -2
  63. package/lib/engine-components/utils/OpenURL.js.map +1 -1
  64. package/lib/engine-components/webxr/WebXRImageTracking.js +5 -1
  65. package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
  66. package/package.json +2 -2
  67. package/plugins/types/userconfig.d.ts +2 -2
  68. package/plugins/vite/pwa.js +33 -22
  69. package/src/engine/codegen/register_types.ts +2 -2
  70. package/src/engine/engine_context.ts +7 -3
  71. package/src/engine/engine_input.ts +47 -9
  72. package/src/engine/engine_loaders.ts +6 -10
  73. package/src/engine/engine_physics_rapier.ts +1 -1
  74. package/src/engine/engine_serialization_core.ts +13 -4
  75. package/src/engine/engine_types.ts +5 -0
  76. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
  77. package/src/engine-components/Duplicatable.ts +2 -2
  78. package/src/engine-components/EventTrigger.ts +14 -0
  79. package/src/engine-components/OrbitControls.ts +71 -21
  80. package/src/engine-components/Renderer.ts +5 -0
  81. package/src/engine-components/ScreenCapture.ts +2 -2
  82. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +0 -1
  83. package/src/engine-components/export/usdz/USDZExporter.ts +2 -2
  84. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +17 -11
  85. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +41 -23
  86. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +5 -2
  87. package/src/engine-components/ui/Button.ts +3 -3
  88. package/src/engine-components/ui/EventSystem.ts +45 -62
  89. package/src/engine-components/ui/InputField.ts +18 -1
  90. package/src/engine-components/utils/OpenURL.ts +2 -2
  91. package/src/engine-components/webxr/WebXRImageTracking.ts +5 -1
@@ -17,7 +17,7 @@ import { makeNameSafeForUSD,USDDocument, USDObject, USDZExporterContext } from "
17
17
  import { AnimationExtension, RegisteredAnimationInfo, type UsdzAnimation } from "../Animation.js";
18
18
  import { AudioExtension } from "./AudioExtension.js";
19
19
  import type { BehaviorExtension, UsdzBehaviour } from "./Behaviour.js";
20
- import { ActionBuilder, ActionModel, BehaviorModel, EmphasizeActionMotionType,type IBehaviorElement, Target, TriggerBuilder } from "./BehavioursBuilder.js";
20
+ import { ActionBuilder, ActionModel, BehaviorModel, EmphasizeActionMotionType,GroupActionModel,type IBehaviorElement, Target, TriggerBuilder } from "./BehavioursBuilder.js";
21
21
 
22
22
  const debug = getParam("debugusdzbehaviours");
23
23
 
@@ -203,10 +203,10 @@ export class ChangeMaterialOnClick extends Behaviour implements IPointerClickHan
203
203
  }
204
204
 
205
205
  onPointerEnter(_args: PointerEventData) {
206
- this.context.input.setCursorPointer();
206
+ this.context.input.setCursor("pointer");
207
207
  }
208
208
  onPointerExit(_: PointerEventData) {
209
- this.context.input.setCursorNormal();
209
+ this.context.input.unsetCursor("pointer");
210
210
  }
211
211
  onPointerClick(args: PointerEventData) {
212
212
  args.use();
@@ -251,7 +251,8 @@ export class ChangeMaterialOnClick extends Behaviour implements IPointerClickHan
251
251
  private targetModels!: USDObject[];
252
252
 
253
253
  private static _materialTriggersPerId: { [key: string]: ChangeMaterialOnClick[] } = {}
254
-
254
+ private static _startHiddenBehaviour: BehaviorModel | null = null;
255
+ private static _parallelStartHiddenActions: USDObject[] = [];
255
256
 
256
257
  async beforeCreateDocument(_ext: BehaviorExtension, _context) {
257
258
  this.targetModels = [];
@@ -309,23 +310,25 @@ export class ChangeMaterialOnClick extends Behaviour implements IPointerClickHan
309
310
  }
310
311
 
311
312
  private createAndAttachBehaviors(ext: BehaviorExtension, myVariants: Array<USDObject>, otherVariants: Array<USDObject>) {
312
- const start: ActionModel[] = [];
313
313
  const select: ActionModel[] = [];
314
314
 
315
315
  const fadeDuration = Math.max(0, this.fadeDuration);
316
316
 
317
317
  select.push(ActionBuilder.fadeAction([...this.targetModels, ...otherVariants], fadeDuration, false));
318
- start.push(ActionBuilder.fadeAction(myVariants, fadeDuration, false));
319
318
  select.push(ActionBuilder.fadeAction(myVariants, fadeDuration, true));
320
319
 
321
320
  ext.addBehavior(new BehaviorModel("Select_" + this.selfModel.name,
322
321
  TriggerBuilder.tapTrigger(this.selfModel),
323
322
  ActionBuilder.parallel(...select))
324
323
  );
325
- ext.addBehavior(new BehaviorModel("StartHidden_" + this.selfModel.name,
326
- TriggerBuilder.sceneStartTrigger(),
327
- ActionBuilder.parallel(...start))
328
- );
324
+ ChangeMaterialOnClick._parallelStartHiddenActions.push(...myVariants);
325
+ if (!ChangeMaterialOnClick._startHiddenBehaviour) {
326
+ ChangeMaterialOnClick._startHiddenBehaviour =
327
+ new BehaviorModel("StartHidden_" + this.selfModel.name,
328
+ TriggerBuilder.sceneStartTrigger(),
329
+ ActionBuilder.fadeAction(ChangeMaterialOnClick._parallelStartHiddenActions, fadeDuration, false));
330
+ ext.addBehavior(ChangeMaterialOnClick._startHiddenBehaviour);
331
+ }
329
332
  }
330
333
 
331
334
  private static getMaterialName(material: Material) {
@@ -526,9 +529,9 @@ export class SetActiveOnClick extends Behaviour implements IPointerClickHandler,
526
529
  sequence.push(ActionBuilder.fadeAction(selfModel, 0, false));
527
530
  sequence.push(ActionBuilder.fadeAction(this.targetModel, 0, targetState));
528
531
 
529
- ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_toggleTo" + (targetState ? "On" : "Off"),
532
+ ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_ToggleTo" + (targetState ? "On" : "Off"),
530
533
  TriggerBuilder.tapTrigger(selfModel),
531
- ActionBuilder.parallel(...sequence)
534
+ sequence.length > 1 ? ActionBuilder.parallel(...sequence) : sequence[0],
532
535
  ));
533
536
  }
534
537
  // We have a toggleModel, so we need to set up two sequences:
@@ -540,7 +543,7 @@ export class SetActiveOnClick extends Behaviour implements IPointerClickHandler,
540
543
  toggleSequence.push(ActionBuilder.fadeAction(this.toggleModel, 0, true));
541
544
  toggleSequence.push(ActionBuilder.fadeAction(this.targetModel, 0, targetState));
542
545
 
543
- ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_toggleTo" + (targetState ? "On" : "Off"),
546
+ ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_ToggleTo" + (targetState ? "On" : "Off"),
544
547
  TriggerBuilder.tapTrigger(selfModel),
545
548
  ActionBuilder.parallel(...toggleSequence)
546
549
  ));
@@ -550,7 +553,7 @@ export class SetActiveOnClick extends Behaviour implements IPointerClickHandler,
550
553
  reverseSequence.push(ActionBuilder.fadeAction(selfModel, 0, true));
551
554
  reverseSequence.push(ActionBuilder.fadeAction(this.targetModel, 0, !targetState));
552
555
 
553
- ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_toggleTo" + (!targetState ? "On" : "Off"),
556
+ ext.addBehavior(new BehaviorModel("Toggle_" + selfModel.name + "_ToggleTo" + (!targetState ? "On" : "Off"),
554
557
  TriggerBuilder.tapTrigger(this.toggleModel),
555
558
  ActionBuilder.parallel(...reverseSequence)
556
559
  ));
@@ -565,10 +568,7 @@ export class SetActiveOnClick extends Behaviour implements IPointerClickHandler,
565
568
  if (this.toggleModel)
566
569
  objectsToHide.push(this.toggleModel);
567
570
 
568
- ext.addBehavior(new BehaviorModel("HideOnStart_" + this.gameObject.name,
569
- TriggerBuilder.sceneStartTrigger(),
570
- ActionBuilder.fadeAction(objectsToHide, 0, false)
571
- ));
571
+ HideOnStart.add(objectsToHide, ext);
572
572
  }
573
573
  }
574
574
 
@@ -595,6 +595,27 @@ export class SetActiveOnClick extends Behaviour implements IPointerClickHandler,
595
595
  */
596
596
  export class HideOnStart extends Behaviour implements UsdzBehaviour {
597
597
 
598
+ private static _fadeBehaviour?: BehaviorModel;
599
+ private static _fadeObjects: Array<USDObject | Object3D> = [];
600
+
601
+ static add(target: Target, ext: BehaviorExtension) {
602
+ const arr = Array.isArray(target) ? target : [target];
603
+ for (const entry of arr) {
604
+ if (!HideOnStart._fadeObjects.includes(entry)) {
605
+ console.log("adding hide on start", entry);
606
+ HideOnStart._fadeObjects.push(entry);
607
+ }
608
+ }
609
+ if (HideOnStart._fadeBehaviour === undefined) {
610
+ HideOnStart._fadeBehaviour = new BehaviorModel("HideOnStart",
611
+ TriggerBuilder.sceneStartTrigger(),
612
+ //@ts-ignore
613
+ ActionBuilder.fadeAction(HideOnStart._fadeObjects, 0, false)
614
+ );
615
+ ext.addBehavior(HideOnStart._fadeBehaviour);
616
+ }
617
+ }
618
+
598
619
  start() {
599
620
  GameObject.setActive(this.gameObject, false);
600
621
  }
@@ -603,10 +624,7 @@ export class HideOnStart extends Behaviour implements UsdzBehaviour {
603
624
  if (model.uuid === this.gameObject.uuid) {
604
625
  // we only want to mark the object as HideOnStart if it's still hidden
605
626
  if (!this.wasVisible) {
606
- ext.addBehavior(new BehaviorModel("HideOnStart_" + this.gameObject.name,
607
- TriggerBuilder.sceneStartTrigger(),
608
- ActionBuilder.fadeAction(model, 0, false)
609
- ));
627
+ HideOnStart.add(model, ext);
610
628
  }
611
629
  }
612
630
  }
@@ -752,7 +770,7 @@ export class PlayAudioOnClick extends Behaviour implements IPointerClickHandler,
752
770
  // automatically play audio on start too if the referenced AudioSource has playOnAwake enabled
753
771
  if (this.target && this.target.playOnAwake && this.target.enabled) {
754
772
  if (anyChildHasGeometry && this.trigger === "tap") {
755
- // HACK Currently (20240509) we MUST not emit this behaviour if we're also expecting the tap trigger to work.
773
+ // WORKAROUND Currently (20240509) we MUST not emit this behaviour if we're also expecting the tap trigger to work.
756
774
  // Seems to be a regression in QuickLook... audio clips can't be stopped anymore as soon as they start playing.
757
775
  console.warn("USDZExport: Audio sources that are played on tap can't also auto-play at scene start due to a QuickLook bug.");
758
776
  }
@@ -199,11 +199,14 @@ function addInputTargetComponent(model: USDObject, options: { direct: boolean, i
199
199
 
200
200
  export class TriggerBuilder {
201
201
 
202
+ private static __sceneStartTrigger?: TriggerModel;
203
+
202
204
  static sceneStartTrigger(): TriggerModel {
203
- const trigger = new TriggerModel();
204
- trigger.targetId = undefined;
205
+ if (this.__sceneStartTrigger !== undefined) return this.__sceneStartTrigger;
206
+ const trigger = new TriggerModel(undefined, "SceneStart");
205
207
  trigger.tokenId = "SceneTransition";
206
208
  trigger.type = "enter";
209
+ this.__sceneStartTrigger = trigger;
207
210
  return trigger;
208
211
  }
209
212
 
@@ -90,7 +90,7 @@ export class Button extends Behaviour implements IPointerEventHandler {
90
90
  else if (this.transition === Transition.ColorTint && this.colors) {
91
91
  this._image?.setState("hovered");
92
92
  }
93
- if (canSetCursor) this.context.input.setCursorPointer();
93
+ if (canSetCursor) this.context.input.setCursor("pointer");
94
94
  }
95
95
 
96
96
  onPointerExit() {
@@ -107,7 +107,7 @@ export class Button extends Behaviour implements IPointerEventHandler {
107
107
  else if (this.transition === Transition.ColorTint && this.colors) {
108
108
  this._image?.setState("normal");
109
109
  }
110
- this.context.input.setCursorNormal();
110
+ this.context.input.unsetCursor("pointer");
111
111
  }
112
112
 
113
113
  onPointerDown(_) {
@@ -211,7 +211,7 @@ export class Button extends Behaviour implements IPointerEventHandler {
211
211
  }
212
212
 
213
213
  onDestroy(): void {
214
- if (this._isHovered) this.context.input.setCursorNormal();
214
+ if (this._isHovered) this.context.input.unsetCursor("pointer");
215
215
  }
216
216
 
217
217
  private _requestedAnimatorTrigger?: string;
@@ -1,11 +1,12 @@
1
- import { type Intersection, Mesh,Object3D } from "three";
1
+ import { type Intersection, Mesh, Object3D } from "three";
2
2
 
3
3
  import { isDevEnvironment, showBalloonMessage } from "../../engine/debug/index.js";
4
- import { type InputEventNames, InputEvents, NEPointerEvent, NEPointerEventIntersection,PointerType } from "../../engine/engine_input.js";
4
+ import { type InputEventNames, InputEvents, NEPointerEvent, NEPointerEventIntersection, PointerType } from "../../engine/engine_input.js";
5
+ import { onInitialized } from "../../engine/engine_lifecycle_api.js";
5
6
  import { Mathf } from "../../engine/engine_math.js";
6
7
  import { RaycastOptions, type RaycastTestObjectReturnType } from "../../engine/engine_physics.js";
7
8
  import { Context } from "../../engine/engine_setup.js";
8
- import type { IComponent } from "../../engine/engine_types.js";
9
+ import { HideFlags, type IComponent } from "../../engine/engine_types.js";
9
10
  import { getParam } from "../../engine/engine_utils.js";
10
11
  import { Behaviour, GameObject } from "../Component.js";
11
12
  import { $shadowDomOwner } from "./BaseUIComponent.js";
@@ -30,47 +31,15 @@ export declare type AfterHandleInputEvent = {
30
31
 
31
32
  declare type IComponentCanMaybeReceiveEvents = IPointerEventHandler & IComponent & { interactable?: boolean };
32
33
 
34
+ onInitialized((ctx) => {
35
+ EventSystem.createIfNoneExists(ctx);
36
+ })
37
+
33
38
  /**
34
39
  * @category User Interface
35
40
  * @group Components
36
41
  */
37
42
  export class EventSystem extends Behaviour {
38
- private static _eventSystemMap = new Map<Context, EventSystem[]>();
39
-
40
- static didSearchEventSystem: boolean = false;
41
- static createIfNoneExists(context: Context) {
42
- if (!this.didSearchEventSystem) {
43
- this.didSearchEventSystem = true;
44
- if (EventSystem.systems.length <= 0) {
45
- EventSystem.systems.push(...GameObject.findObjectsOfType(EventSystem, context));
46
- }
47
- }
48
- for (const sys of EventSystem.systems) {
49
- if (sys.context === context) return; // exists
50
- }
51
- const go = new Object3D();
52
- GameObject.addComponent(go, EventSystem);
53
- context.scene.add(go);
54
- }
55
-
56
- static get systems(): EventSystem[] {
57
- const context = Context.Current;
58
- if (!this._eventSystemMap.has(context)) {
59
- this._eventSystemMap.set(context, []);
60
- }
61
- return this._eventSystemMap.get(context)!;
62
- }
63
-
64
- static get(ctx: Context): EventSystem | null {
65
- const systems = this._eventSystemMap.get(ctx);
66
- if (systems && systems.length > 0) return systems[0];
67
- return null;
68
- }
69
-
70
- static get instance(): EventSystem | null {
71
- return this.systems[0];
72
- }
73
-
74
43
  //@ts-ignore
75
44
  static ensureUpdateMeshUI(instance, context: Context, force: boolean = false) {
76
45
  MeshUIHelper.update(instance, context, force);
@@ -79,32 +48,22 @@ export class EventSystem extends Behaviour {
79
48
  MeshUIHelper.markDirty();
80
49
  }
81
50
 
82
- private raycaster: Raycaster[] = [];
83
-
84
- constructor() {
85
- super();
86
- EventSystem.systems.push(this);
51
+ static createIfNoneExists(context: Context) {
52
+ if (!context.scene.getComponent(EventSystem)) {
53
+ context.scene.addComponent(EventSystem);
54
+ }
87
55
  }
88
56
 
89
- get hasActiveUI() { return this.currentActiveMeshUIComponents.length > 0; }
90
- get isHoveringObjects() { return this.hoveredByID.size > 0; }
91
-
92
- onDestroy(): void {
93
- EventSystem.systems.splice(EventSystem.systems.indexOf(this), 1);
57
+ static get(ctx: Context): EventSystem | null {
58
+ this.createIfNoneExists(ctx);
59
+ return ctx.scene.getComponent(EventSystem);
94
60
  }
95
61
 
96
- start() {
97
- if (this.raycaster.length <= 0) {
98
- const res = GameObject.findObjectOfType(Raycaster, this.context);
99
- if (!res) {
100
- const rc = GameObject.addComponent(this.context.scene, ObjectRaycaster);
101
- this.raycaster.push(rc);
102
- if (isDevEnvironment() || debug)
103
- console.warn("Added an ObjectRaycaster to the scene because no raycaster was found.");
104
- }
105
- }
62
+ static get instance(): EventSystem | null {
63
+ return this.get(Context.Current);
106
64
  }
107
65
 
66
+ private readonly raycaster: Raycaster[] = [];
108
67
  register(rc: Raycaster) {
109
68
  if (rc && this.raycaster && !this.raycaster.includes(rc))
110
69
  this.raycaster?.push(rc);
@@ -116,6 +75,23 @@ export class EventSystem extends Behaviour {
116
75
  }
117
76
  }
118
77
 
78
+ get hasActiveUI() { return this.currentActiveMeshUIComponents.length > 0; }
79
+ get isHoveringObjects() { return this.hoveredByID.size > 0; }
80
+
81
+ awake(): void {
82
+ // We only want ONE eventsystem on the root scene
83
+ // as long as this component is not implemented in core we need to check this here
84
+ if (this.gameObject as Object3D !== this.context.scene) {
85
+ this.enabled = false;
86
+ }
87
+ }
88
+
89
+ start() {
90
+ if (!this.context.scene.getComponent(Raycaster)) {
91
+ this.context.scene.addComponent(ObjectRaycaster);
92
+ }
93
+ }
94
+
119
95
  onEnable(): void {
120
96
  this.context.input.addEventListener(InputEvents.PointerDown, this.onPointerEvent);
121
97
  this.context.input.addEventListener(InputEvents.PointerUp, this.onPointerEvent);
@@ -183,7 +159,6 @@ export class EventSystem extends Behaviour {
183
159
  options.screenPoint = this.context.input.getPointerPositionRC(pointerEvent.pointerId)!;
184
160
  }
185
161
 
186
-
187
162
  const hits = this.performRaycast(options) as Array<NEPointerEventIntersection>;
188
163
  if (hits) {
189
164
  for (const hit of hits) {
@@ -242,6 +217,14 @@ export class EventSystem extends Behaviour {
242
217
  // TODO: this implementation below should be removed and we should regularly raycast objects in the scene unless marked as "do not raycast"
243
218
  // with the introduction of the mesh-bvh based raycasting the performance impact should be greatly reduced. But this needs further testing
244
219
 
220
+ const raycasterOnObject = obj && "getComponent" in obj ? obj.getComponent(Raycaster) : null;
221
+ if (raycasterOnObject && raycasterOnObject != this._currentlyActiveRaycaster) {
222
+ return false;
223
+ }
224
+ // if (this._currentPointerEventName == "pointermove") {
225
+ // console.log(this.context.time.frame, obj.name, obj.type, obj.guid)
226
+ // }
227
+
245
228
  // check if this object is actually a UI shadow hierarchy object
246
229
  let uiOwner: Object3D | null = null;
247
230
  const isUI = isUIObject(obj);
@@ -450,7 +433,7 @@ export class EventSystem extends Behaviour {
450
433
  isShadow = true;
451
434
  }
452
435
  }
453
-
436
+
454
437
  // adding this to have a way for allowing to receive events on TMUI elements without shadow hierarchy
455
438
  // if(parent["needle:use_eventsystem"] == true){
456
439
  // // if use_eventsystem is true, we want to handle the event
@@ -671,7 +654,7 @@ export class EventSystem extends Behaviour {
671
654
  comp[symbol] = state;
672
655
  return true;
673
656
  }
674
- else {
657
+ else {
675
658
  if (!state || !state.includes(pointerId)) return false;
676
659
  const i = state.indexOf(pointerId);
677
660
  if (i !== -1) {
@@ -3,7 +3,7 @@ import { FrameEvent } from "../../engine/engine_setup.js";
3
3
  import { DeviceUtilities, getParam } from "../../engine/engine_utils.js";
4
4
  import { Behaviour, GameObject } from "../Component.js";
5
5
  import { EventList } from "../EventList.js";
6
- import { type IPointerEventHandler } from "./PointerEvents.js";
6
+ import { type IPointerEventHandler,PointerEventData } from "./PointerEvents.js";
7
7
  import { Text } from "./Text.js";
8
8
  import { tryGetUIComponent } from "./Utils.js";
9
9
 
@@ -18,6 +18,15 @@ export class InputField extends Behaviour implements IPointerEventHandler {
18
18
  get text(): string {
19
19
  return this.textComponent?.text ?? "";
20
20
  }
21
+ set text(value: string) {
22
+ if (this.textComponent) {
23
+ this.textComponent.text = value;
24
+ if (this.placeholder) {
25
+ if (value.length > 0) this.placeholder.gameObject.visible = false;
26
+ else this.placeholder.gameObject.visible = true;
27
+ }
28
+ }
29
+ }
21
30
 
22
31
  get isFocused() {
23
32
  return InputField.active === this;
@@ -113,6 +122,14 @@ export class InputField extends Behaviour implements IPointerEventHandler {
113
122
  this.onDeselected();
114
123
  }
115
124
 
125
+ onPointerEnter(_args: PointerEventData) {
126
+ const canSetCursor = _args.event.pointerType === "mouse" && _args.button === 0;
127
+ if(canSetCursor) this.context.input.setCursor("text");
128
+ }
129
+ onPointerExit(_args: PointerEventData) {
130
+ this.context.input.unsetCursor("text")
131
+ }
132
+
116
133
  onPointerClick(_args) {
117
134
  if (debug) console.log("CLICK", _args, InputField.active);
118
135
  InputField.activeTime = this.context.time.time;
@@ -91,12 +91,12 @@ export class OpenURL extends Behaviour implements IPointerClickHandler {
91
91
  /** @internal */
92
92
  onPointerEnter(args) {
93
93
  if (!args.used && this.clickable)
94
- this.context.input.setCursorPointer();
94
+ this.context.input.setCursor("pointer");
95
95
  }
96
96
  /** @internal */
97
97
  onPointerExit() {
98
98
  if (this.clickable)
99
- this.context.input.setCursorNormal();
99
+ this.context.input.unsetCursor("pointer");
100
100
  }
101
101
  /** @internal */
102
102
  onPointerClick(args: PointerEventData) {
@@ -160,9 +160,13 @@ class ImageTrackingExtension implements IUSDExporterExtension {
160
160
  }
161
161
 
162
162
  onAfterHierarchy(_context: USDZExporterContext, writer: USDWriter) {
163
+ const iOSVersion = DeviceUtilities.getiOSVersion();
164
+ const majorVersion = iOSVersion ? parseInt(iOSVersion.split(".")[0]) : 18;
165
+ const workaroundForFB16119331 = majorVersion >= 18;
166
+ const multiplier = workaroundForFB16119331 ? 1 : 100;
163
167
  writer.beginBlock(`def Preliminary_ReferenceImage "AnchoringReferenceImage"`);
164
168
  writer.appendLine(`uniform asset image = @image_tracking/` + this.filename + `@`);
165
- writer.appendLine(`uniform double physicalWidth = ` + (this.widthInMeters * 100).toFixed(8));
169
+ writer.appendLine(`uniform double physicalWidth = ` + (this.widthInMeters * multiplier).toFixed(8));
166
170
  writer.closeBlock();
167
171
  }
168
172