@needle-tools/engine 3.2.15-alpha → 3.4.0-alpha

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 (151) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/needle-engine.js +44005 -36382
  3. package/dist/needle-engine.min.js +706 -513
  4. package/dist/needle-engine.umd.cjs +685 -492
  5. package/lib/engine/codegen/register_types.js +54 -4
  6. package/lib/engine/codegen/register_types.js.map +1 -1
  7. package/lib/engine/engine_addressables.d.ts +3 -3
  8. package/lib/engine/engine_addressables.js +30 -9
  9. package/lib/engine/engine_addressables.js.map +1 -1
  10. package/lib/engine/engine_element.js +1 -1
  11. package/lib/engine/engine_element.js.map +1 -1
  12. package/lib/engine/engine_gameobject.d.ts +2 -1
  13. package/lib/engine/engine_gameobject.js +19 -0
  14. package/lib/engine/engine_gameobject.js.map +1 -1
  15. package/lib/engine/engine_input.js +10 -0
  16. package/lib/engine/engine_input.js.map +1 -1
  17. package/lib/engine/engine_math.d.ts +4 -0
  18. package/lib/engine/engine_math.js +6 -0
  19. package/lib/engine/engine_math.js.map +1 -1
  20. package/lib/engine/engine_three_utils.js +2 -2
  21. package/lib/engine/engine_three_utils.js.map +1 -1
  22. package/lib/engine-components/Animation.js +4 -0
  23. package/lib/engine-components/Animation.js.map +1 -1
  24. package/lib/engine-components/AnimatorController.js +7 -2
  25. package/lib/engine-components/AnimatorController.js.map +1 -1
  26. package/lib/engine-components/OrbitControls.js +13 -4
  27. package/lib/engine-components/OrbitControls.js.map +1 -1
  28. package/lib/engine-components/TransformGizmo.d.ts +8 -4
  29. package/lib/engine-components/TransformGizmo.js +62 -63
  30. package/lib/engine-components/TransformGizmo.js.map +1 -1
  31. package/lib/engine-components/codegen/components.d.ts +27 -2
  32. package/lib/engine-components/codegen/components.js +27 -2
  33. package/lib/engine-components/codegen/components.js.map +1 -1
  34. package/lib/engine-components/export/usdz/Extension.d.ts +4 -4
  35. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +86 -0
  36. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +830 -0
  37. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js.map +1 -0
  38. package/lib/engine-components/export/usdz/USDZExporter.d.ts +6 -3
  39. package/lib/engine-components/export/usdz/USDZExporter.js +34 -11
  40. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  41. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +15 -15
  42. package/lib/engine-components/export/usdz/extensions/Animation.js +24 -29
  43. package/lib/engine-components/export/usdz/extensions/Animation.js.map +1 -1
  44. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -0
  45. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +7 -0
  46. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js.map +1 -0
  47. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +47 -0
  48. package/lib/engine-components/export/usdz/extensions/USDZText.js +114 -0
  49. package/lib/engine-components/export/usdz/extensions/USDZText.js.map +1 -0
  50. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -0
  51. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +89 -0
  52. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js.map +1 -0
  53. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +23 -0
  54. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +114 -0
  55. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js.map +1 -0
  56. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +96 -0
  57. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +421 -0
  58. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -0
  59. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +111 -0
  60. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +409 -0
  61. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js.map +1 -0
  62. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  63. package/lib/engine-components/ui/BaseUIComponent.d.ts +2 -0
  64. package/lib/engine-components/ui/BaseUIComponent.js +6 -0
  65. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  66. package/lib/engine-components/ui/Button.js +9 -5
  67. package/lib/engine-components/ui/Button.js.map +1 -1
  68. package/lib/engine-components/ui/Canvas.d.ts +23 -6
  69. package/lib/engine-components/ui/Canvas.js +167 -34
  70. package/lib/engine-components/ui/Canvas.js.map +1 -1
  71. package/lib/engine-components/ui/EventSystem.d.ts +6 -0
  72. package/lib/engine-components/ui/EventSystem.js +4 -4
  73. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  74. package/lib/engine-components/ui/Graphic.d.ts +5 -2
  75. package/lib/engine-components/ui/Graphic.js +38 -7
  76. package/lib/engine-components/ui/Graphic.js.map +1 -1
  77. package/lib/engine-components/ui/Image.d.ts +1 -0
  78. package/lib/engine-components/ui/Image.js +14 -5
  79. package/lib/engine-components/ui/Image.js.map +1 -1
  80. package/lib/engine-components/ui/InputField.d.ts +1 -0
  81. package/lib/engine-components/ui/InputField.js +8 -0
  82. package/lib/engine-components/ui/InputField.js.map +1 -1
  83. package/lib/engine-components/ui/Interfaces.d.ts +19 -0
  84. package/lib/engine-components/ui/Interfaces.js +11 -0
  85. package/lib/engine-components/ui/Interfaces.js.map +1 -1
  86. package/lib/engine-components/ui/Layout.d.ts +65 -3
  87. package/lib/engine-components/ui/Layout.js +304 -3
  88. package/lib/engine-components/ui/Layout.js.map +1 -1
  89. package/lib/engine-components/ui/Outline.d.ts +7 -0
  90. package/lib/engine-components/ui/Outline.js +21 -0
  91. package/lib/engine-components/ui/Outline.js.map +1 -0
  92. package/lib/engine-components/ui/RectTransform.d.ts +32 -13
  93. package/lib/engine-components/ui/RectTransform.js +216 -56
  94. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  95. package/lib/engine-components/ui/Text.d.ts +13 -10
  96. package/lib/engine-components/ui/Text.js +177 -246
  97. package/lib/engine-components/ui/Text.js.map +1 -1
  98. package/lib/engine-components/utils/LookAt.d.ts +13 -0
  99. package/lib/engine-components/utils/LookAt.js +66 -0
  100. package/lib/engine-components/utils/LookAt.js.map +1 -0
  101. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +12 -3
  102. package/lib/engine-components/webxr/WebXRImageTracking.js +156 -24
  103. package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
  104. package/lib/tsconfig.tsbuildinfo +1 -1
  105. package/package.json +2 -2
  106. package/plugins/vite/reload.js +13 -2
  107. package/src/engine/codegen/register_types.js +56 -6
  108. package/src/engine/engine_addressables.ts +28 -10
  109. package/src/engine/engine_element.ts +1 -1
  110. package/src/engine/engine_gameobject.ts +19 -1
  111. package/src/engine/engine_input.ts +11 -0
  112. package/src/engine/engine_math.ts +10 -0
  113. package/src/engine/engine_three_utils.ts +2 -2
  114. package/src/engine-components/Animation.ts +4 -0
  115. package/src/engine-components/AnimatorController.ts +7 -1
  116. package/src/engine-components/OrbitControls.ts +14 -6
  117. package/src/engine-components/TransformGizmo.ts +64 -70
  118. package/src/engine-components/codegen/components.ts +27 -2
  119. package/src/engine-components/export/usdz/Extension.ts +4 -5
  120. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1280 -0
  121. package/src/engine-components/export/usdz/USDZExporter.ts +39 -17
  122. package/src/engine-components/export/usdz/extensions/Animation.ts +37 -45
  123. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +10 -0
  124. package/src/engine-components/export/usdz/extensions/USDZText.ts +142 -0
  125. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -0
  126. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +181 -0
  127. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +503 -0
  128. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +459 -0
  129. package/src/engine-components/postprocessing/PostProcessingHandler.ts +1 -1
  130. package/src/engine-components/ui/BaseUIComponent.ts +7 -1
  131. package/src/engine-components/ui/Button.ts +14 -9
  132. package/src/engine-components/ui/Canvas.ts +178 -39
  133. package/src/engine-components/ui/EventSystem.ts +16 -9
  134. package/src/engine-components/ui/Graphic.ts +46 -8
  135. package/src/engine-components/ui/Image.ts +13 -4
  136. package/src/engine-components/ui/InputField.ts +9 -1
  137. package/src/engine-components/ui/Interfaces.ts +39 -3
  138. package/src/engine-components/ui/Layout.ts +303 -4
  139. package/src/engine-components/ui/Outline.ts +13 -0
  140. package/src/engine-components/ui/RectTransform.ts +236 -68
  141. package/src/engine-components/ui/Text.ts +284 -265
  142. package/src/engine-components/utils/LookAt.ts +74 -0
  143. package/src/engine-components/webxr/WebXRImageTracking.ts +179 -31
  144. package/lib/engine-components/export/usdz/types.d.ts +0 -34
  145. package/lib/engine-components/export/usdz/types.js +0 -2
  146. package/lib/engine-components/export/usdz/types.js.map +0 -1
  147. package/lib/engine-components/ui/Keyboard.d.ts +0 -31
  148. package/lib/engine-components/ui/Keyboard.js +0 -178
  149. package/lib/engine-components/ui/Keyboard.js.map +0 -1
  150. package/src/engine-components/export/usdz/types.ts +0 -39
  151. package/src/engine-components/ui/Keyboard.ts +0 -204
@@ -0,0 +1,74 @@
1
+ import { serializable } from "../../engine/engine_serialization";
2
+ import { Behaviour } from "../Component";
3
+ import { Matrix4, Object3D, Quaternion, Vector3 } from "three";
4
+ import { getWorldPosition, getWorldQuaternion, setWorldQuaternion } from "../../engine/engine_three_utils";
5
+
6
+ import { USDObject } from "../../engine-components/export/usdz/ThreeUSDZExporter";
7
+ import { UsdzBehaviour } from "../../engine-components/export/usdz/extensions/behavior/Behaviour";
8
+ import { ActionBuilder, BehaviorModel, TriggerBuilder, USDVec3 } from "../../engine-components/export/usdz/extensions/behavior/BehavioursBuilder";
9
+
10
+ export class LookAt extends Behaviour implements UsdzBehaviour {
11
+
12
+ @serializable(Object3D)
13
+ target?: Object3D;
14
+
15
+ @serializable()
16
+ invertForward: boolean = false;
17
+
18
+ @serializable()
19
+ keepUpDirection: boolean = true;
20
+
21
+ @serializable()
22
+ copyTargetRotation: boolean = false;
23
+
24
+ private static flipYQuat: Quaternion = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
25
+
26
+ onBeforeRender(): void {
27
+ let target: Object3D | null | undefined = this.target;
28
+ if (!target) target = this.context.mainCamera;
29
+ if (!target) return;
30
+
31
+ const lookTarget = getWorldPosition(target);
32
+ const lookFrom = getWorldPosition(this.gameObject);
33
+
34
+ if (this.keepUpDirection)
35
+ lookTarget.y = lookFrom.y;
36
+
37
+ if (this.copyTargetRotation)
38
+ setWorldQuaternion(this.gameObject, getWorldQuaternion(target));
39
+ else
40
+ this.gameObject.lookAt(lookTarget);
41
+
42
+ if (this.invertForward)
43
+ this.gameObject.quaternion.multiply(LookAt.flipYQuat);
44
+ }
45
+
46
+ createBehaviours(ext, model: USDObject, _context) {
47
+ if (model.uuid === this.gameObject.uuid) {
48
+ let alignmentTarget = model;
49
+
50
+ // not entirely sure why we need to do this - looks like LookAt with up vector doesn't work properly in
51
+ // QuickLook, so we need to introduce an empty parent and rotate the model by 90° around Y
52
+ if (this.keepUpDirection) {
53
+ const parent = USDObject.createEmptyParent(model);
54
+ alignmentTarget = parent;
55
+
56
+ // rotate by 90° - counter-rotation on the parent makes sure
57
+ // that without Preliminary Behaviours it still looks right
58
+ parent.matrix.multiply(new Matrix4().makeRotationZ(Math.PI / 2));
59
+ model.matrix.multiply(new Matrix4().makeRotationZ(-Math.PI / 2));
60
+ }
61
+
62
+ const lookAt = new BehaviorModel("lookat " + this.name,
63
+ TriggerBuilder.sceneStartTrigger(),
64
+ ActionBuilder.lookAtCameraAction(
65
+ alignmentTarget,
66
+ undefined,
67
+ this.invertForward ? USDVec3.back : USDVec3.forward,
68
+ this.keepUpDirection ? USDVec3.up : USDVec3.zero
69
+ ),
70
+ );
71
+ ext.addBehavior(lookAt);
72
+ }
73
+ }
74
+ }
@@ -1,34 +1,27 @@
1
- import { WebXR } from "./WebXR";
1
+ import { WebXR, WebXREvent } from "./WebXR";
2
2
  import { serializable } from "../../engine/engine_serialization";
3
- import { Behaviour } from "../Component";
4
- import { Matrix4, Object3D, Quaternion, Vector, Vector3 } from "three";
3
+ import { Behaviour, GameObject } from "../Component";
4
+ import { Object3D, Quaternion, Vector3 } from "three";
5
5
  import { CircularBuffer, getParam } from "../../engine/engine_utils";
6
+ import { AssetReference } from "../../engine/engine_addressables";
7
+ import { showBalloonWarning } from "../../engine/debug";
8
+
9
+ import { USDZExporter } from "../../engine-components/export/usdz/USDZExporter";
10
+ import { USDZExporterContext, USDWriter, imageToCanvas } from "../../engine-components/export/usdz/ThreeUSDZExporter";
6
11
 
7
12
  // https://github.com/immersive-web/marker-tracking/blob/main/explainer.md
8
13
 
9
14
  const debug = getParam("debugimagetracking");
10
15
 
11
- const _scaleTemp = new Vector3();
12
-
13
16
  export class WebXRTrackedImage {
14
17
 
15
-
16
18
  get url(): string { return this._trackedImage.image ?? ""; }
17
19
  get widthInMeters() { return this._trackedImage.widthInMeters ?? undefined; }
18
20
  get bitmap(): ImageBitmap { return this._bitmap; }
21
+ get model(): WebXRImageTrackingModel { return this._trackedImage; }
19
22
  readonly measuredSize: number;
20
23
  readonly state: "tracked" | "emulated";
21
24
 
22
- // private _matrix: Matrix4 | null = null;
23
- // private get matrix(): Matrix4 {
24
- // if (!this._matrix) {
25
- // // this._matrix = WebXRTrackedImage._matrixBuffer.get();
26
- // // const matrix = this._pose.transform.matrix;
27
- // // this._matrix.fromArray(matrix);
28
- // }
29
- // return this._matrix!;
30
- // }
31
-
32
25
  /** Copy the image position to a vector */
33
26
  getPosition(vec: Vector3) {
34
27
  this.ensureTransformData();
@@ -43,13 +36,23 @@ export class WebXRTrackedImage {
43
36
  return quat;
44
37
  }
45
38
 
46
- applyToObject(object: Object3D) {
39
+ private static y180 = new Quaternion().setFromAxisAngle(new Vector3(0, 1, 0), Math.PI);
40
+ applyToObject(object: Object3D, t01: number | undefined = undefined) {
47
41
  this.ensureTransformData();
48
- object.position.copy(this._position);
49
- object.quaternion.copy(this._rotation);
42
+ // check if position/_position or rotation/_rotation changed more than just a little bit
43
+ const haveChanged = object.position.distanceToSquared(this._position) > 0.05 || object.quaternion.angleTo(this._rotation) > 0.05;
44
+ if (t01 === undefined || t01 >= 1 || haveChanged) {
45
+ object.position.copy(this._position);
46
+ object.quaternion.copy(this._rotation);
47
+ }
48
+ else {
49
+ t01 = Math.max(0, Math.min(1, t01));
50
+ object.position.lerp(this._position, t01);
51
+ object.quaternion.slerp(this._rotation, t01);
52
+ }
53
+ object.quaternion.multiply(WebXRTrackedImage.y180);
50
54
  }
51
55
 
52
- // private static _matrixBuffer: CircularBuffer<Matrix4> = new CircularBuffer(() => new Matrix4(), 20);
53
56
  private static _positionBuffer: CircularBuffer<Vector3> = new CircularBuffer(() => new Vector3(), 20);
54
57
  private static _rotationBuffer: CircularBuffer<Quaternion> = new CircularBuffer(() => new Quaternion(), 20);
55
58
  private _position!: Vector3;
@@ -59,12 +62,18 @@ export class WebXRTrackedImage {
59
62
  this._position = WebXRTrackedImage._positionBuffer.get();
60
63
  this._rotation = WebXRTrackedImage._rotationBuffer.get();
61
64
  const t = this._pose.transform;
62
- this._position.set(-t.position.x, t.position.y, -t.position.z);
63
- this._rotation.set(-t.orientation.x, t.orientation.y, -t.orientation.z, t.orientation.w);
65
+
66
+ // when parented to the world, we need to flip data here
67
+ //this._position.set(-t.position.x, t.position.y, -t.position.z);
68
+ // this._rotation.set(-t.orientation.x, t.orientation.y, -t.orientation.z, t.orientation.w);
69
+
70
+ // for some reason when parented to the XRRig, we need the original data
71
+ this._position.set(t.position.x, t.position.y, t.position.z);
72
+ this._rotation.set(t.orientation.x, t.orientation.y, t.orientation.z, t.orientation.w);
64
73
  }
65
74
  }
66
75
 
67
- private readonly _trackingComponent: WebXRImageTracking;;
76
+ private readonly _trackingComponent: WebXRImageTracking;
68
77
  private readonly _trackedImage: WebXRImageTrackingModel;
69
78
  private readonly _bitmap: ImageBitmap;
70
79
  private readonly _pose: any;
@@ -90,15 +99,46 @@ export class WebXRImageTrackingModel {
90
99
  @serializable()
91
100
  widthInMeters!: number;
92
101
 
102
+ @serializable(AssetReference)
103
+ object?: AssetReference;
104
+
105
+ @serializable()
106
+ createObjectInstance: boolean = false;
107
+
108
+ @serializable()
109
+ imageDoesNotMove: boolean = false;
93
110
  }
94
111
 
95
- export class WebXRImageTracking extends Behaviour {
112
+ class ImageTrackingExtension {
96
113
 
97
- @serializable(WebXRImageTrackingModel)
98
- trackedImages!: WebXRImageTrackingModel[];
114
+ get extensionName() { return "image-tracking"; }
99
115
 
116
+ private filename: string;
117
+ private widthInMeters: number;
118
+ private imageData: Uint8Array;
100
119
 
120
+ constructor(filename: string, imageData: Uint8Array, widthInMeters: number) {
121
+ this.filename = filename;
122
+ this.imageData = imageData;
123
+ this.widthInMeters = widthInMeters;
124
+ }
101
125
 
126
+ onAfterHierarchy(_context: USDZExporterContext, writer: USDWriter) {
127
+ writer.beginBlock(`def Preliminary_ReferenceImage "AnchoringReferenceImage"`);
128
+ writer.appendLine(`uniform asset image = @tracker/` + this.filename + `@`);
129
+ writer.appendLine(`uniform double physicalWidth = ` + (this.widthInMeters * 100).toFixed(8));
130
+ writer.closeBlock();
131
+ }
132
+
133
+ onAfterSerialize(context: USDZExporterContext) {
134
+ context.files['tracker/' + this.filename] = this.imageData;
135
+ }
136
+ }
137
+
138
+ export class WebXRImageTracking extends Behaviour {
139
+
140
+ @serializable(WebXRImageTrackingModel)
141
+ trackedImages!: WebXRImageTrackingModel[];
102
142
 
103
143
  private readonly trackedImageIndexMap: Map<number, WebXRImageTrackingModel> = new Map();
104
144
 
@@ -117,21 +157,45 @@ export class WebXRImageTracking extends Behaviour {
117
157
  imageElement.addEventListener("load", async () => {
118
158
  const img = await createImageBitmap(imageElement);
119
159
  WebXRImageTracking._imageElements.set(url, img);
160
+
161
+ // read back Uint8Array to use in USDZ -
162
+ // TODO better would be to do that once we actually need it
163
+ const canvas = await imageToCanvas( img );
164
+ if (canvas) {
165
+ const blob = await new Promise( resolve => canvas.toBlob( resolve, 'image/png', 1 ) ) as any;
166
+ const arrayBuffer = await blob.arrayBuffer();
167
+
168
+ const exporter = GameObject.findObjectOfType(USDZExporter);
169
+ if (exporter) {
170
+ exporter.extensions.push(
171
+ new ImageTrackingExtension("marker.png", new Uint8Array(arrayBuffer), this.trackedImages[0].widthInMeters)
172
+ );
173
+ exporter.anchoringType = "image";
174
+ }
175
+ }
120
176
  });
121
177
  }
122
178
  }
123
179
  }
124
180
  }
125
181
 
182
+ private xr: WebXR | null = null;
183
+
126
184
  onEnable(): void {
127
- WebXR.addEventListener("modify-ar-options", this.onModifyAROptions);
185
+ this.xr = GameObject.findObjectOfType(WebXR);
186
+ WebXR.addEventListener(WebXREvent.ModifyAROptions, this.onModifyAROptions);
187
+ WebXR.addEventListener(WebXREvent.XRStarted, this.onXRStarted);
188
+ WebXR.addEventListener(WebXREvent.XRUpdate, this.onXRUpdate);
189
+ this.addEventListener("image-tracking", this.onImageTrackingUpdate);
128
190
  }
129
191
 
130
192
  onDisable(): void {
131
- WebXR.removeEventListener("modify-ar-options", this.onModifyAROptions);
193
+ WebXR.removeEventListener(WebXREvent.ModifyAROptions, this.onModifyAROptions);
194
+ WebXR.removeEventListener(WebXREvent.XRStarted, this.onXRStarted);
195
+ WebXR.removeEventListener(WebXREvent.XRUpdate, this.onXRUpdate);
196
+ this.removeEventListener("image-tracking", this.onImageTrackingUpdate);
132
197
  }
133
198
 
134
-
135
199
  private onModifyAROptions = (event: any) => {
136
200
  const options = event.detail;
137
201
  const features = options.optionalFeatures || [];
@@ -154,9 +218,93 @@ export class WebXRImageTracking extends Behaviour {
154
218
  }
155
219
  }
156
220
 
157
- onBeforeRender(frame: XRFrame | null): void {
221
+ private imageToObjectMap: Map<WebXRImageTrackingModel, { object: GameObject | null, frames: number }> = new Map();
222
+
223
+ private onImageTrackingUpdate = (event: any) => {
224
+ const images = event.detail as WebXRTrackedImage[];
225
+
226
+ // disable any objects that are no longer tracked
227
+ for (const [model, object] of this.imageToObjectMap) {
228
+ if (!object.object || !model) continue;
229
+ let found = false;
230
+ for (const trackedImage of images) {
231
+ if (trackedImage.model === model) {
232
+ found = true;
233
+ break;
234
+ }
235
+ }
236
+ if (!found) {
237
+ GameObject.setActive(object.object, false);
238
+ }
239
+ }
240
+
241
+ for (const image of images) {
242
+ const model = image.model;
243
+ // don't do anything if we don't have an object to track - can be handled externally through events
244
+ if (!model.object) continue;
245
+
246
+ let trackedData = this.imageToObjectMap.get(model);
247
+ if (trackedData === undefined) {
248
+ trackedData = { object: null, frames: 0 };
249
+ this.imageToObjectMap.set(model, trackedData);
250
+
251
+ model.object.loadAssetAsync().then((asset: GameObject | null) => {
252
+ if (model.createObjectInstance)
253
+ asset = GameObject.instantiate(asset);
254
+
255
+ if (asset) {
256
+ trackedData!.object = asset;
257
+
258
+ // make sure to parent to the WebXR.rig
259
+ if (this.xr) {
260
+ this.xr.Rig.add(asset);
261
+ }
262
+
263
+ image.applyToObject(asset);
264
+ if (!asset.activeSelf)
265
+ GameObject.setActive(asset, true);
266
+ }
267
+ });
268
+ }
269
+ else {
270
+ trackedData.frames++;
271
+
272
+ // TODO we could do a bit more here: e.g. sample for the first 1s or so of getting pose data
273
+ // to improve the tracking quality a bit.
274
+ if (model.imageDoesNotMove && trackedData.frames > 10)
275
+ continue;
276
+
277
+ if (!trackedData.object) continue;
278
+
279
+ if (this.xr) {
280
+ this.xr.Rig.add(trackedData.object);
281
+ }
282
+
283
+ image.applyToObject(trackedData.object);
284
+ if (!trackedData.object.activeSelf)
285
+ GameObject.setActive(trackedData.object, true);
286
+ }
287
+ }
288
+ }
289
+
290
+ private onXRStarted = (_: any) => {
291
+ // clear out all frame counters for tracking
292
+ for (const trackedData of this.imageToObjectMap.values()) {
293
+ trackedData.frames = 0;
294
+ }
295
+ };
296
+
297
+ private onXRUpdate = (evt): void => {
298
+ const frame = evt.frame;
299
+ if (!frame) return;
300
+
301
+ if (frame.session && !("getImageTrackingResults" in frame)) {
302
+ showBalloonWarning("Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a href=\"chrome://flags/#webxr-incubations\">chrome://flags/#webxr-incubations</a> flag.");
303
+ return;
304
+ }
305
+
158
306
  //@ts-ignore
159
- if (frame?.session && typeof frame.getImageTrackingResults === "function") {
307
+ if (frame.session && typeof frame.getImageTrackingResults === "function") {
160
308
  //@ts-ignore
161
309
  const results = frame.getImageTrackingResults();
162
310
  if (results.length) {
@@ -1,34 +0,0 @@
1
- import { Object3D, Matrix4, Material, BufferGeometry } from "three";
2
- /** implementation is in three */
3
- export declare class USDZDocument {
4
- name: string;
5
- get isDocumentRoot(): boolean;
6
- add(obj: USDZObject): any;
7
- remove(obj: USDZObject): any;
8
- traverse(callback: (obj: USDZObject) => void): any;
9
- findById(uuid: string): USDZObject | undefined;
10
- get isDynamic(): boolean;
11
- }
12
- /** implementation is in three */
13
- export declare class USDZObject {
14
- static createEmptyParent(parent: USDZObject): any;
15
- uuid: string;
16
- name: string;
17
- matrix: Matrix4;
18
- material: Material;
19
- geometry: BufferGeometry;
20
- parent: USDZObject | USDZDocument | null;
21
- children: USDZObject[];
22
- _eventListeners: {
23
- [event: string]: Function[];
24
- };
25
- isDynamic: boolean;
26
- is(obj: Object3D): boolean;
27
- isEmpty(): boolean;
28
- clone(): any;
29
- getPath(): any;
30
- add(child: USDZObject): any;
31
- remove(child: USDZObject): any;
32
- addEventListener(evt: string, listener: Function): any;
33
- removeEventListener(evt: string, listener: Function): any;
34
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/engine-components/export/usdz/types.ts"],"names":[],"mappings":""}
@@ -1,31 +0,0 @@
1
- import { BaseUIComponent } from './BaseUIComponent';
2
- import { Text } from './Text';
3
- declare enum KeymapOption {
4
- fr = 0,
5
- ru = 1,
6
- de = 2,
7
- es = 3,
8
- el = 4,
9
- nord = 5,
10
- eng = 6
11
- }
12
- export declare class Keyboard extends BaseUIComponent {
13
- font?: string;
14
- text?: Text;
15
- keymap?: KeymapOption;
16
- padding?: number;
17
- margin?: number;
18
- fontSize?: number;
19
- borderRadius?: number;
20
- private colors;
21
- awake(): void;
22
- onEnable(): void;
23
- onDisable(): void;
24
- private keyboard;
25
- private _lastKeyPressed;
26
- private _lastKeyPressedStartTime;
27
- private _lastKeyPressedTime;
28
- private makeKeyboard;
29
- private tryAppend;
30
- }
31
- export {};
@@ -1,178 +0,0 @@
1
- import * as ThreeMeshUI from 'three-mesh-ui';
2
- import * as THREE from 'three';
3
- import { BaseUIComponent, includesDir } from './BaseUIComponent';
4
- import { RectTransform } from './RectTransform';
5
- import { GameObject } from '../Component';
6
- var KeymapOption;
7
- (function (KeymapOption) {
8
- KeymapOption[KeymapOption["fr"] = 0] = "fr";
9
- KeymapOption[KeymapOption["ru"] = 1] = "ru";
10
- KeymapOption[KeymapOption["de"] = 2] = "de";
11
- KeymapOption[KeymapOption["es"] = 3] = "es";
12
- KeymapOption[KeymapOption["el"] = 4] = "el";
13
- KeymapOption[KeymapOption["nord"] = 5] = "nord";
14
- KeymapOption[KeymapOption["eng"] = 6] = "eng";
15
- })(KeymapOption || (KeymapOption = {}));
16
- // see https://github.com/felixmariotto/three-mesh-ui/blob/master/examples/keyboard.js
17
- export class Keyboard extends BaseUIComponent {
18
- font;
19
- text;
20
- keymap;
21
- padding;
22
- margin;
23
- fontSize;
24
- borderRadius;
25
- colors = {
26
- keyboardBack: 0x858585,
27
- panelBack: 0x262626,
28
- button: 0x363636,
29
- hovered: 0x1c1c1c,
30
- selected: 0x109c5d,
31
- };
32
- awake() {
33
- super.awake();
34
- const langKey = KeymapOption[this.keymap || KeymapOption.eng];
35
- this.makeKeyboard(langKey);
36
- }
37
- onEnable() {
38
- this.addShadowComponent(this.keyboard);
39
- }
40
- onDisable() {
41
- this.removeShadowComponent();
42
- }
43
- keyboard = null;
44
- _lastKeyPressed;
45
- _lastKeyPressedStartTime = 0;
46
- _lastKeyPressedTime = 0;
47
- makeKeyboard(language) {
48
- if (!language && !navigator.language) {
49
- language = "en";
50
- }
51
- const fontName = this.font ? this.font : "arial";
52
- const rt = GameObject.getComponent(this.gameObject, RectTransform);
53
- if (!rt) {
54
- console.error("Missing rect transform, please add this component inside a canvas");
55
- return;
56
- }
57
- const opts = {
58
- ...rt.getBasicOptions(),
59
- margin: this.margin || 0,
60
- padding: this.padding || 0,
61
- language: language,
62
- fontFamily: includesDir + "/" + fontName + "-msdf.json",
63
- fontTexture: includesDir + "/" + fontName + ".png",
64
- fontSize: this.fontSize || 6,
65
- backgroundColor: new THREE.Color(this.colors.keyboardBack),
66
- backspaceTexture: includesDir + '/backspace.png',
67
- shiftTexture: includesDir + '/shift.png',
68
- enterTexture: includesDir + '/enter.png',
69
- borderRadius: this.borderRadius || 0,
70
- autoLayout: false,
71
- };
72
- // const ws = getWorldScale(this.gameObject);
73
- const scale = this.gameObject.scale;
74
- opts.width *= this.gameObject.scale.x;
75
- opts.height *= this.gameObject.scale.y;
76
- opts.fontSize *= Math.max(scale.x, scale.y);
77
- this.keyboard = new ThreeMeshUI.Keyboard(opts);
78
- // const scale = this.gameObject.scale;
79
- // const max = Math.max(scale.x, scale.y, scale.z);
80
- this.gameObject.scale.set(1, 1, 1);
81
- //@ts-ignore
82
- this.keyboard.keys.forEach((key) => {
83
- key.setupState({
84
- state: 'normal',
85
- attributes: {
86
- offset: 0.003,
87
- backgroundColor: new THREE.Color(this.colors.button),
88
- backgroundOpacity: 1
89
- }
90
- });
91
- key.setState("normal");
92
- key.setupState({
93
- state: 'hovered',
94
- attributes: {
95
- offset: 0.3,
96
- backgroundColor: new THREE.Color(this.colors.hovered),
97
- backgroundOpacity: 1
98
- }
99
- });
100
- key.setupState({
101
- state: 'pressed',
102
- attributes: {
103
- offset: 0.1,
104
- backgroundColor: new THREE.Color(this.colors.selected),
105
- backgroundOpacity: 1
106
- },
107
- // triggered when the user clicked on a keyboard's key
108
- onSet: () => {
109
- const input = key.info.input;
110
- const cmd = key.info.command;
111
- if (this._lastKeyPressed !== input) {
112
- this._lastKeyPressedStartTime = this.context.time.time;
113
- }
114
- else if (this.context.time.time - this._lastKeyPressedTime > .05) {
115
- // there was probably a key up inbetween
116
- this._lastKeyPressedStartTime = this.context.time.time;
117
- }
118
- else if (this.context.time.time - this._lastKeyPressedStartTime < .5
119
- || cmd == "switch"
120
- || cmd == "shift"
121
- || cmd == "switch-set") {
122
- this._lastKeyPressedTime = this.context.time.time;
123
- return;
124
- }
125
- this._lastKeyPressedTime = this.context.time.time;
126
- this._lastKeyPressed = input;
127
- // if the key have a command (eg: 'backspace', 'switch', 'enter'...)
128
- // special actions are taken
129
- if (cmd) {
130
- switch (cmd) {
131
- // switch between panels
132
- case 'switch':
133
- //@ts-ignore
134
- this.keyboard.setNextPanel();
135
- break;
136
- // switch between panel charsets (eg: russian/english)
137
- case 'switch-set':
138
- //@ts-ignore
139
- this.keyboard.setNextCharset();
140
- break;
141
- case 'enter':
142
- this.tryAppend('\n');
143
- break;
144
- case 'space':
145
- this.tryAppend(' ');
146
- break;
147
- case 'backspace':
148
- //@ts-ignore
149
- if (!this.text?.text?.length)
150
- break;
151
- if (this.text?.text)
152
- this.text.text = this.text.text.substring(0, this.text.text.length - 1) || "";
153
- break;
154
- case 'shift':
155
- //@ts-ignore
156
- this.keyboard.toggleCase();
157
- break;
158
- }
159
- ;
160
- // print a glyph, if any
161
- }
162
- else if (key.info.input !== undefined) {
163
- this.tryAppend(key.info.input);
164
- }
165
- ;
166
- }
167
- });
168
- });
169
- }
170
- ;
171
- tryAppend(char) {
172
- if (this.text) {
173
- this.text.text += char;
174
- this.markDirty();
175
- }
176
- }
177
- }
178
- //# sourceMappingURL=Keyboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Keyboard.js","sourceRoot":"","sources":["../../../src/engine-components/ui/Keyboard.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import { Object3D, Matrix4, Material, BufferGeometry } from "three";
2
-
3
- // keep in sync with USDZExporter.js
4
-
5
- /** implementation is in three */
6
- export declare class USDZDocument {
7
- name: string;
8
- get isDocumentRoot(): boolean;
9
- add(obj: USDZObject);
10
- remove(obj: USDZObject);
11
- traverse(callback: (obj: USDZObject) => void);
12
- findById(uuid: string): USDZObject | undefined;
13
- get isDynamic(): boolean;
14
- }
15
-
16
-
17
-
18
- /** implementation is in three */
19
- export declare class USDZObject {
20
- static createEmptyParent(parent: USDZObject);
21
- uuid: string;
22
- name: string;
23
- matrix: Matrix4;
24
- material: Material;
25
- geometry: BufferGeometry;
26
- parent: USDZObject | USDZDocument | null;
27
- children: USDZObject[];
28
- _eventListeners: { [event: string]: Function[] };
29
- isDynamic: boolean;
30
-
31
- is(obj: Object3D): boolean;
32
- isEmpty(): boolean;
33
- clone();
34
- getPath();
35
- add(child: USDZObject);
36
- remove(child: USDZObject);
37
- addEventListener(evt: string, listener: Function);
38
- removeEventListener(evt: string, listener: Function);
39
- }