@needle-tools/engine 4.8.6-next.f3ce848 → 4.8.7-next.3c34e8b

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 (75) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/components.needle.json +1 -1
  3. package/dist/{gltf-progressive-DXRy9EQz.js → gltf-progressive-BcHT3Nyo.js} +1 -1
  4. package/dist/{gltf-progressive-C-U_onhf.umd.cjs → gltf-progressive-CH3Q4H06.umd.cjs} +1 -1
  5. package/dist/{gltf-progressive-DViD_J_l.min.js → gltf-progressive-DR6HqF_h.min.js} +1 -1
  6. package/dist/{needle-engine.bundle-C4N-adas.umd.cjs → needle-engine.bundle-BgFqEj5W.umd.cjs} +134 -134
  7. package/dist/{needle-engine.bundle-CJSl-mXb.min.js → needle-engine.bundle-BthqMTPI.min.js} +124 -124
  8. package/dist/{needle-engine.bundle-fXDFH_oR.js → needle-engine.bundle-Fj5SzBaF.js} +3850 -3812
  9. package/dist/needle-engine.js +394 -393
  10. package/dist/needle-engine.min.js +1 -1
  11. package/dist/needle-engine.umd.cjs +1 -1
  12. package/dist/{postprocessing-61aXdqNz.umd.cjs → postprocessing-CVb_x9YY.umd.cjs} +1 -1
  13. package/dist/{postprocessing-D9jDHD0U.js → postprocessing-ORx-0eCx.js} +1 -1
  14. package/dist/{postprocessing-Be9Ds4NK.min.js → postprocessing-Ywv5oKkX.min.js} +1 -1
  15. package/dist/three-examples-BX_Sktc9.min.js +501 -0
  16. package/dist/{three-examples-BihZ_R96.js → three-examples-CNexix3E.js} +2436 -2781
  17. package/dist/{three-examples-Ce6Th3bv.umd.cjs → three-examples-DWxXVnws.umd.cjs} +21 -21
  18. package/dist/{vendor-BRpzuoJE.min.js → vendor-C43vobGc.min.js} +37 -37
  19. package/dist/{vendor-p_xp9KuJ.js → vendor-Z4SPrTcP.js} +2402 -2047
  20. package/dist/vendor-xfQ8tKF3.umd.cjs +1121 -0
  21. package/lib/engine/api.d.ts +1 -0
  22. package/lib/engine/api.js +1 -0
  23. package/lib/engine/api.js.map +1 -1
  24. package/lib/engine/engine_addressables.d.ts +12 -12
  25. package/lib/engine/engine_addressables.js +30 -23
  26. package/lib/engine/engine_addressables.js.map +1 -1
  27. package/lib/engine/engine_animation.d.ts +1 -3
  28. package/lib/engine/engine_animation.js +15 -9
  29. package/lib/engine/engine_animation.js.map +1 -1
  30. package/lib/engine/engine_feature_flags.d.ts +3 -0
  31. package/lib/engine/engine_feature_flags.js +6 -0
  32. package/lib/engine/engine_feature_flags.js.map +1 -0
  33. package/lib/engine/engine_loaders.js +15 -11
  34. package/lib/engine/engine_loaders.js.map +1 -1
  35. package/lib/engine/engine_mainloop_utils.d.ts +2 -1
  36. package/lib/engine/engine_mainloop_utils.js +16 -4
  37. package/lib/engine/engine_mainloop_utils.js.map +1 -1
  38. package/lib/engine/extensions/extensions.js +2 -2
  39. package/lib/engine/extensions/extensions.js.map +1 -1
  40. package/lib/engine/js-extensions/Object3D.js +19 -0
  41. package/lib/engine/js-extensions/Object3D.js.map +1 -1
  42. package/lib/engine-components/Animation.js +2 -1
  43. package/lib/engine-components/Animation.js.map +1 -1
  44. package/lib/engine-components/AnimationUtilsAutoplay.js +1 -6
  45. package/lib/engine-components/AnimationUtilsAutoplay.js.map +1 -1
  46. package/lib/engine-components/DropListener.d.ts +17 -12
  47. package/lib/engine-components/DropListener.js +34 -31
  48. package/lib/engine-components/DropListener.js.map +1 -1
  49. package/lib/engine-components/LookAtConstraint.d.ts +5 -1
  50. package/lib/engine-components/LookAtConstraint.js +8 -0
  51. package/lib/engine-components/LookAtConstraint.js.map +1 -1
  52. package/lib/engine-components/OrbitControls.d.ts +5 -7
  53. package/lib/engine-components/OrbitControls.js +12 -11
  54. package/lib/engine-components/OrbitControls.js.map +1 -1
  55. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +1 -1
  56. package/lib/engine-components/webxr/WebXRImageTracking.js +12 -10
  57. package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
  58. package/package.json +3 -2
  59. package/plugins/vite/alias.js +45 -23
  60. package/src/engine/api.ts +2 -1
  61. package/src/engine/engine_addressables.ts +44 -33
  62. package/src/engine/engine_animation.ts +17 -9
  63. package/src/engine/engine_feature_flags.ts +8 -0
  64. package/src/engine/engine_loaders.ts +18 -13
  65. package/src/engine/engine_mainloop_utils.ts +21 -6
  66. package/src/engine/extensions/extensions.ts +2 -2
  67. package/src/engine/js-extensions/Object3D.ts +25 -2
  68. package/src/engine-components/Animation.ts +1 -1
  69. package/src/engine-components/AnimationUtilsAutoplay.ts +1 -6
  70. package/src/engine-components/DropListener.ts +40 -31
  71. package/src/engine-components/LookAtConstraint.ts +9 -1
  72. package/src/engine-components/OrbitControls.ts +19 -16
  73. package/src/engine-components/webxr/WebXRImageTracking.ts +16 -14
  74. package/dist/three-examples-DKY9Nfge.min.js +0 -501
  75. package/dist/vendor-Ja-vKV-a.umd.cjs +0 -1121
@@ -649,12 +649,12 @@ export class OrbitControls extends Behaviour implements ICameraController {
649
649
  if (this._lookTargetLerpActive) {
650
650
  this._lookTargetLerp01 += this.context.time.deltaTime / this._lookTargetLerpDuration;
651
651
  if (this._lookTargetLerp01 >= 1) {
652
- this._controls.target.copy(this._lookTargetEndPosition);
652
+ this.lerpLookTarget(this._lookTargetEndPosition, this._lookTargetEndPosition, 1);
653
653
  this._lookTargetLerpActive = false;
654
654
  this.dispatchEvent(new CameraTargetReachedEvent(this, "lookat"));
655
655
  } else {
656
656
  const t = Mathf.easeInOutCubic(this._lookTargetLerp01);
657
- this._controls.target.lerpVectors(this._lookTargetStartPosition, this._lookTargetEndPosition, t);
657
+ this.lerpLookTarget(this._lookTargetStartPosition, this._lookTargetEndPosition, t);
658
658
  }
659
659
  }
660
660
 
@@ -729,7 +729,9 @@ export class OrbitControls extends Behaviour implements ICameraController {
729
729
 
730
730
  // this._controls.zoomToCursor = this.zoomToCursor;
731
731
  if (!this.context.isInXR) {
732
- if (!freeCam && this.lookAtConstraint?.locked) this.setLookTargetFromConstraint(0, this.lookAtConstraint01);
732
+ if (!freeCam && this.lookAtConstraint?.locked && !this._lookTargetLerpActive) {
733
+ this.setLookTargetFromConstraint(0, this.lookAtConstraint01);
734
+ }
733
735
  this._controls.update(this.context.time.deltaTime);
734
736
 
735
737
  if (debug) {
@@ -910,7 +912,7 @@ export class OrbitControls extends Behaviour implements ICameraController {
910
912
  }
911
913
 
912
914
  if (immediateOrDuration === true) {
913
- this._controls.target.copy(this._lookTargetEndPosition);
915
+ this.lerpLookTarget(this._lookTargetEndPosition, this._lookTargetEndPosition, 1);
914
916
  }
915
917
  else {
916
918
  this._lookTargetLerpActive = true;
@@ -941,20 +943,18 @@ export class OrbitControls extends Behaviour implements ICameraController {
941
943
  const target = sources[index];
942
944
  if (target) {
943
945
  target.getWorldPosition(this._lookTargetEndPosition);
944
- this.lerpLookTarget(this._lookTargetEndPosition, t);
946
+ this.lerpLookTarget(this._controls.target, this._lookTargetEndPosition, t);
945
947
  return true;
946
948
  }
947
949
  }
948
950
  return false;
949
951
  }
950
952
 
951
- /** @deprecated use `controls.target.lerp(position, delta)` */
952
- public lerpTarget(position: Vector3, delta: number) { return this.lerpLookTarget(position, delta); }
953
-
954
- private lerpLookTarget(position: Vector3, delta: number) {
953
+ private lerpLookTarget(start: Vector3, position: Vector3, t: number) {
955
954
  if (!this._controls) return;
956
- if (delta >= 1) this._controls.target.copy(position);
957
- else this._controls.target.lerp(position, delta);
955
+ if (t >= 1) this._controls.target.copy(position);
956
+ else this._controls.target.lerpVectors(start, position, t);
957
+ if (this.lookAtConstraint) this.lookAtConstraint.setConstraintPosition(this._controls.target);
958
958
  }
959
959
 
960
960
  private setTargetFromRaycast(ray?: Ray, immediateOrDuration: number | boolean = false): boolean {
@@ -1063,7 +1063,7 @@ export class OrbitControls extends Behaviour implements ICameraController {
1063
1063
  return;
1064
1064
  }
1065
1065
 
1066
- const verticalFov = options.fov || camera.fov;
1066
+ const verticalFov = fov;
1067
1067
  const horizontalFov = 2 * Math.atan(Math.tan(verticalFov * Math.PI / 360 / 2) * camera.aspect) / Math.PI * 360;
1068
1068
  const fitHeightDistance = size.y / (2 * Math.atan(Math.PI * verticalFov / 360));
1069
1069
  const fitWidthDistance = size.x / (2 * Math.atan(Math.PI * horizontalFov / 360));
@@ -1161,16 +1161,19 @@ declare type FitCameraOptions = {
1161
1161
  * The objects to fit the camera to. If not provided the scene children will be used
1162
1162
  */
1163
1163
  objects?: Object3D[] | Object3D;
1164
- /** Fit offset: A factor to multiply the distance to the objects by
1165
- * @default 1.1
1166
- */
1167
- fitOffset?: number,
1168
1164
  /** If true the camera will move immediately to the new position, otherwise it will lerp
1169
1165
  * @default false
1170
1166
  */
1171
1167
  immediate?: boolean,
1168
+
1172
1169
  /** If set to "y" the camera will be centered in the y axis */
1173
1170
  centerCamera?: "none" | "y",
1174
1171
  cameraNearFar?: "keep" | "auto",
1172
+
1175
1173
  fov?: number,
1174
+
1175
+ /** Fit offset: A factor to multiply the distance to the objects by
1176
+ * @default 1.1
1177
+ */
1178
+ fitOffset?: number,
1176
1179
  }
@@ -12,6 +12,7 @@ import { imageToCanvas, USDObject, USDWriter, USDZExporterContext } from "../../
12
12
  import { USDZExporter } from "../../engine-components/export/usdz/USDZExporter.js";
13
13
  import { Behaviour, GameObject } from "../Component.js";
14
14
  import { Renderer } from "../Renderer.js";
15
+ import { Context } from "../../engine/engine_context.js";
15
16
 
16
17
  // https://github.com/immersive-web/marker-tracking/blob/main/explainer.md
17
18
 
@@ -159,6 +160,10 @@ class ImageTrackingExtension implements IUSDExporterExtension {
159
160
  this.widthInMeters = widthInMeters;
160
161
  }
161
162
 
163
+ private getImageTrackingComponents() {
164
+ return GameObject.findObjectsOfType(WebXRImageTracking, Context.Current).filter(c => c.trackedImages && c.trackedImages.length > 0 && c.activeAndEnabled);
165
+ }
166
+
162
167
  onAfterHierarchy(_context: USDZExporterContext, writer: USDWriter) {
163
168
  const iOSVersion = DeviceUtilities.getiOSVersion();
164
169
  const majorVersion = iOSVersion ? parseInt(iOSVersion.split(".")[0]) : 18;
@@ -171,12 +176,10 @@ class ImageTrackingExtension implements IUSDExporterExtension {
171
176
  }
172
177
 
173
178
  onBeforeBuildDocument(_context: USDZExporterContext) {
174
- const imageTracking = GameObject.findObjectOfType(WebXRImageTracking);
175
- if (!imageTracking || !imageTracking.trackedImages) return;
179
+ const imageTracking = this.getImageTrackingComponents()[0];
176
180
 
177
181
  // Warn if more than one tracked image is used for USDZ; that's not supported at the moment.
178
- if (imageTracking.trackedImages.length > 1)
179
- {
182
+ if (imageTracking && imageTracking.trackedImages?.length > 1) {
180
183
  if (isDevEnvironment()) showBalloonWarning("USDZ: Only one tracked image is supported.");
181
184
  console.warn("USDZ: Only one tracked image is supported.");
182
185
  }
@@ -187,15 +190,14 @@ class ImageTrackingExtension implements IUSDExporterExtension {
187
190
  }
188
191
 
189
192
  onExportObject(object: Object3D<Object3DEventMap>, model: USDObject, _context: USDZExporterContext) {
190
- const imageTracking = GameObject.findObjectOfType(WebXRImageTracking);
191
- if (!imageTracking || !imageTracking.trackedImages) return;
193
+ const imageTracking = this.getImageTrackingComponents()[0];
194
+ if (!imageTracking || !imageTracking.trackedImages?.length) return;
192
195
 
196
+ const exporter = GameObject.findObjectOfType(USDZExporter);
197
+ if (!exporter) return;
193
198
 
194
199
  for (const trackedImage of imageTracking.trackedImages) {
195
200
  if (trackedImage.object?.asset === object) {
196
- const exporter = GameObject.findObjectOfType(USDZExporter);
197
- if (!exporter) continue;
198
-
199
201
  const { scale, target } = exporter.getARScaleAndTarget();
200
202
 
201
203
  // We have to reset the image tracking object's position and rotation, because QuickLook applies them.
@@ -220,8 +222,8 @@ class ImageTrackingExtension implements IUSDExporterExtension {
220
222
  // Thus, we can't have separate transforms for "regularly placing content" and "placing content with an image marker".
221
223
  // model.extraSchemas.push("Preliminary_AnchoringAPI");
222
224
  // model.addEventListener("serialize", (_writer: USDWriter, _context: USDZExporterContext) => {
223
- // writer.appendLine( `token preliminary:anchoring:type = "image"` );
224
- // writer.appendLine( `rel preliminary:imageAnchoring:referenceImage = </${context.document.name}/Scenes/Scene/AnchoringReferenceImage>` );
225
+ // writer.appendLine( `token preliminary:anchoring:type = "image"` );
226
+ // writer.appendLine( `rel preliminary:imageAnchoring:referenceImage = </${context.document.name}/Scenes/Scene/AnchoringReferenceImage>` );
225
227
  // });
226
228
 
227
229
  // We can only apply this to the first tracked image, more are not supported by QuickLook.
@@ -238,7 +240,7 @@ class ImageTrackingExtension implements IUSDExporterExtension {
238
240
  export class WebXRImageTracking extends Behaviour {
239
241
 
240
242
  @serializable(WebXRImageTrackingModel)
241
- trackedImages?: WebXRImageTrackingModel[];
243
+ trackedImages: WebXRImageTrackingModel[] = [];
242
244
 
243
245
  /** Applies smoothing based on detected jitter to the tracked image. */
244
246
  @serializable()
@@ -337,7 +339,7 @@ export class WebXRImageTracking extends Behaviour {
337
339
 
338
340
  onLeaveXR(_args: NeedleXREventArgs): void {
339
341
 
340
- if(!this.supported && DeviceUtilities.isAndroidDevice()) {
342
+ if (!this.supported && DeviceUtilities.isAndroidDevice()) {
341
343
  showBalloonWarning(this.webXRIncubationsWarning);
342
344
  }
343
345
 
@@ -364,7 +366,7 @@ export class WebXRImageTracking extends Behaviour {
364
366
  private readonly imageToObjectMap = new Map<WebXRImageTrackingModel, { object: Object3D | null, frames: number, lastTrackingTime: number }>();
365
367
  private readonly currentImages: WebXRTrackedImage[] = [];
366
368
 
367
-
369
+
368
370
  private readonly webXRIncubationsWarning = "Image tracking is currently not supported on this device. On Chrome for Android, you can enable the <a target=\"_blank\" href=\"#\" onclick=\"() => console.log('I')\">chrome://flags/#webxr-incubations</a> flag.";
369
371
 
370
372
  onUpdateXR(args: NeedleXREventArgs): void {