@needle-tools/engine 3.3.0-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 (101) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/needle-engine.js +26116 -24881
  3. package/dist/needle-engine.min.js +384 -383
  4. package/dist/needle-engine.umd.cjs +372 -371
  5. package/lib/engine/codegen/register_types.js +50 -2
  6. package/lib/engine/codegen/register_types.js.map +1 -1
  7. package/lib/engine/engine_gameobject.d.ts +1 -1
  8. package/lib/engine/engine_gameobject.js +4 -2
  9. package/lib/engine/engine_gameobject.js.map +1 -1
  10. package/lib/engine/engine_three_utils.js +2 -2
  11. package/lib/engine/engine_three_utils.js.map +1 -1
  12. package/lib/engine-components/Animation.js +4 -0
  13. package/lib/engine-components/Animation.js.map +1 -1
  14. package/lib/engine-components/codegen/components.d.ts +25 -1
  15. package/lib/engine-components/codegen/components.js +25 -1
  16. package/lib/engine-components/codegen/components.js.map +1 -1
  17. package/lib/engine-components/export/usdz/Extension.d.ts +4 -4
  18. package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +86 -0
  19. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +830 -0
  20. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js.map +1 -0
  21. package/lib/engine-components/export/usdz/USDZExporter.d.ts +6 -3
  22. package/lib/engine-components/export/usdz/USDZExporter.js +34 -11
  23. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  24. package/lib/engine-components/export/usdz/extensions/Animation.d.ts +15 -15
  25. package/lib/engine-components/export/usdz/extensions/Animation.js +24 -29
  26. package/lib/engine-components/export/usdz/extensions/Animation.js.map +1 -1
  27. package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -0
  28. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +7 -0
  29. package/lib/engine-components/export/usdz/extensions/DocumentExtension.js.map +1 -0
  30. package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +47 -0
  31. package/lib/engine-components/export/usdz/extensions/USDZText.js +114 -0
  32. package/lib/engine-components/export/usdz/extensions/USDZText.js.map +1 -0
  33. package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -0
  34. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +89 -0
  35. package/lib/engine-components/export/usdz/extensions/behavior/Actions.js.map +1 -0
  36. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +23 -0
  37. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +114 -0
  38. package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js.map +1 -0
  39. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +96 -0
  40. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +421 -0
  41. package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js.map +1 -0
  42. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +111 -0
  43. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +409 -0
  44. package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js.map +1 -0
  45. package/lib/engine-components/postprocessing/PostProcessingHandler.js.map +1 -1
  46. package/lib/engine-components/ui/BaseUIComponent.d.ts +2 -0
  47. package/lib/engine-components/ui/BaseUIComponent.js +6 -0
  48. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  49. package/lib/engine-components/ui/Canvas.d.ts +11 -1
  50. package/lib/engine-components/ui/Canvas.js +72 -3
  51. package/lib/engine-components/ui/Canvas.js.map +1 -1
  52. package/lib/engine-components/ui/Graphic.js.map +1 -1
  53. package/lib/engine-components/ui/Image.js +4 -4
  54. package/lib/engine-components/ui/Image.js.map +1 -1
  55. package/lib/engine-components/ui/Interfaces.d.ts +11 -0
  56. package/lib/engine-components/ui/Interfaces.js +11 -0
  57. package/lib/engine-components/ui/Interfaces.js.map +1 -1
  58. package/lib/engine-components/ui/Layout.d.ts +65 -3
  59. package/lib/engine-components/ui/Layout.js +304 -3
  60. package/lib/engine-components/ui/Layout.js.map +1 -1
  61. package/lib/engine-components/ui/RectTransform.d.ts +8 -7
  62. package/lib/engine-components/ui/RectTransform.js +63 -35
  63. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  64. package/lib/engine-components/utils/LookAt.d.ts +7 -1
  65. package/lib/engine-components/utils/LookAt.js +43 -6
  66. package/lib/engine-components/utils/LookAt.js.map +1 -1
  67. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +4 -3
  68. package/lib/engine-components/webxr/WebXRImageTracking.js +81 -25
  69. package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
  70. package/lib/tsconfig.tsbuildinfo +1 -1
  71. package/package.json +1 -1
  72. package/plugins/vite/reload.js +13 -2
  73. package/src/engine/codegen/register_types.js +52 -4
  74. package/src/engine/engine_gameobject.ts +3 -2
  75. package/src/engine/engine_three_utils.ts +2 -2
  76. package/src/engine-components/Animation.ts +4 -0
  77. package/src/engine-components/codegen/components.ts +25 -1
  78. package/src/engine-components/export/usdz/Extension.ts +4 -5
  79. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +1280 -0
  80. package/src/engine-components/export/usdz/USDZExporter.ts +39 -17
  81. package/src/engine-components/export/usdz/extensions/Animation.ts +37 -45
  82. package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +10 -0
  83. package/src/engine-components/export/usdz/extensions/USDZText.ts +142 -0
  84. package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -0
  85. package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +181 -0
  86. package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +503 -0
  87. package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +459 -0
  88. package/src/engine-components/postprocessing/PostProcessingHandler.ts +1 -1
  89. package/src/engine-components/ui/BaseUIComponent.ts +7 -1
  90. package/src/engine-components/ui/Canvas.ts +80 -5
  91. package/src/engine-components/ui/Graphic.ts +2 -0
  92. package/src/engine-components/ui/Image.ts +3 -3
  93. package/src/engine-components/ui/Interfaces.ts +30 -6
  94. package/src/engine-components/ui/Layout.ts +303 -4
  95. package/src/engine-components/ui/RectTransform.ts +65 -40
  96. package/src/engine-components/utils/LookAt.ts +60 -7
  97. package/src/engine-components/webxr/WebXRImageTracking.ts +100 -27
  98. package/lib/engine-components/export/usdz/types.d.ts +0 -34
  99. package/lib/engine-components/export/usdz/types.js +0 -2
  100. package/lib/engine-components/export/usdz/types.js.map +0 -1
  101. package/src/engine-components/export/usdz/types.ts +0 -39
@@ -1,9 +1,13 @@
1
- import { WebXR } from "./WebXR";
1
+ import { WebXR, WebXREvent } from "./WebXR";
2
2
  import { serializable } from "../../engine/engine_serialization";
3
3
  import { Behaviour, GameObject } from "../Component";
4
4
  import { Object3D, Quaternion, Vector3 } from "three";
5
5
  import { CircularBuffer, getParam } from "../../engine/engine_utils";
6
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";
7
11
 
8
12
  // https://github.com/immersive-web/marker-tracking/blob/main/explainer.md
9
13
 
@@ -18,16 +22,6 @@ export class WebXRTrackedImage {
18
22
  readonly measuredSize: number;
19
23
  readonly state: "tracked" | "emulated";
20
24
 
21
- // private _matrix: Matrix4 | null = null;
22
- // private get matrix(): Matrix4 {
23
- // if (!this._matrix) {
24
- // // this._matrix = WebXRTrackedImage._matrixBuffer.get();
25
- // // const matrix = this._pose.transform.matrix;
26
- // // this._matrix.fromArray(matrix);
27
- // }
28
- // return this._matrix!;
29
- // }
30
-
31
25
  /** Copy the image position to a vector */
32
26
  getPosition(vec: Vector3) {
33
27
  this.ensureTransformData();
@@ -42,13 +36,23 @@ export class WebXRTrackedImage {
42
36
  return quat;
43
37
  }
44
38
 
45
- 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) {
46
41
  this.ensureTransformData();
47
- object.position.copy(this._position);
48
- 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);
49
54
  }
50
55
 
51
- // private static _matrixBuffer: CircularBuffer<Matrix4> = new CircularBuffer(() => new Matrix4(), 20);
52
56
  private static _positionBuffer: CircularBuffer<Vector3> = new CircularBuffer(() => new Vector3(), 20);
53
57
  private static _rotationBuffer: CircularBuffer<Quaternion> = new CircularBuffer(() => new Quaternion(), 20);
54
58
  private _position!: Vector3;
@@ -58,8 +62,14 @@ export class WebXRTrackedImage {
58
62
  this._position = WebXRTrackedImage._positionBuffer.get();
59
63
  this._rotation = WebXRTrackedImage._rotationBuffer.get();
60
64
  const t = this._pose.transform;
61
- this._position.set(-t.position.x, t.position.y, -t.position.z);
62
- 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);
63
73
  }
64
74
  }
65
75
 
@@ -99,6 +109,32 @@ export class WebXRImageTrackingModel {
99
109
  imageDoesNotMove: boolean = false;
100
110
  }
101
111
 
112
+ class ImageTrackingExtension {
113
+
114
+ get extensionName() { return "image-tracking"; }
115
+
116
+ private filename: string;
117
+ private widthInMeters: number;
118
+ private imageData: Uint8Array;
119
+
120
+ constructor(filename: string, imageData: Uint8Array, widthInMeters: number) {
121
+ this.filename = filename;
122
+ this.imageData = imageData;
123
+ this.widthInMeters = widthInMeters;
124
+ }
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
+
102
138
  export class WebXRImageTracking extends Behaviour {
103
139
 
104
140
  @serializable(WebXRImageTrackingModel)
@@ -121,22 +157,43 @@ export class WebXRImageTracking extends Behaviour {
121
157
  imageElement.addEventListener("load", async () => {
122
158
  const img = await createImageBitmap(imageElement);
123
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
+ }
124
176
  });
125
177
  }
126
178
  }
127
179
  }
128
180
  }
129
181
 
182
+ private xr: WebXR | null = null;
183
+
130
184
  onEnable(): void {
131
- WebXR.addEventListener("modify-ar-options", this.onModifyAROptions);
132
- WebXR.addEventListener("xrStarted", this.onXRStarted);
133
- this.addEventListener("image-tracking", this.onImageTrackingUpdate)
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);
134
190
  }
135
191
 
136
192
  onDisable(): void {
137
- WebXR.removeEventListener("modify-ar-options", this.onModifyAROptions);
138
- WebXR.removeEventListener("xrStarted", this.onXRStarted);
139
- this.removeEventListener("image-tracking", this.onImageTrackingUpdate)
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);
140
197
  }
141
198
 
142
199
  private onModifyAROptions = (event: any) => {
@@ -197,8 +254,12 @@ export class WebXRImageTracking extends Behaviour {
197
254
 
198
255
  if (asset) {
199
256
  trackedData!.object = asset;
200
- if (asset !== this.gameObject)
201
- this.gameObject.add(asset);
257
+
258
+ // make sure to parent to the WebXR.rig
259
+ if (this.xr) {
260
+ this.xr.Rig.add(asset);
261
+ }
262
+
202
263
  image.applyToObject(asset);
203
264
  if (!asset.activeSelf)
204
265
  GameObject.setActive(asset, true);
@@ -215,6 +276,10 @@ export class WebXRImageTracking extends Behaviour {
215
276
 
216
277
  if (!trackedData.object) continue;
217
278
 
279
+ if (this.xr) {
280
+ this.xr.Rig.add(trackedData.object);
281
+ }
282
+
218
283
  image.applyToObject(trackedData.object);
219
284
  if (!trackedData.object.activeSelf)
220
285
  GameObject.setActive(trackedData.object, true);
@@ -229,9 +294,17 @@ export class WebXRImageTracking extends Behaviour {
229
294
  }
230
295
  };
231
296
 
232
- onBeforeRender(frame: XRFrame | null): void {
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
+
233
306
  //@ts-ignore
234
- if (frame?.session && typeof frame.getImageTrackingResults === "function") {
307
+ if (frame.session && typeof frame.getImageTrackingResults === "function") {
235
308
  //@ts-ignore
236
309
  const results = frame.getImageTrackingResults();
237
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,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
- }