@needle-tools/engine 5.1.0-alpha.5 → 5.1.0-alpha.6

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 (54) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/{needle-engine.bundle-OPkPmdUM.umd.cjs → needle-engine.bundle-5avtTUMM.umd.cjs} +146 -145
  3. package/dist/{needle-engine.bundle-D7tzaiYE.min.js → needle-engine.bundle-BHcw4C8f.min.js} +175 -174
  4. package/dist/{needle-engine.bundle-C-LG00ZZ.js → needle-engine.bundle-C0gPOq4m.js} +6332 -6201
  5. package/dist/needle-engine.d.ts +91 -29
  6. package/dist/needle-engine.js +329 -329
  7. package/dist/needle-engine.min.js +1 -1
  8. package/dist/needle-engine.umd.cjs +1 -1
  9. package/lib/engine/api.d.ts +1 -1
  10. package/lib/engine/api.js +1 -1
  11. package/lib/engine/api.js.map +1 -1
  12. package/lib/engine/engine_context.js +7 -0
  13. package/lib/engine/engine_context.js.map +1 -1
  14. package/lib/engine/engine_init.js +2 -2
  15. package/lib/engine/engine_init.js.map +1 -1
  16. package/lib/engine/engine_license.d.ts +7 -7
  17. package/lib/engine/engine_license.js +185 -57
  18. package/lib/engine/engine_license.js.map +1 -1
  19. package/lib/engine/engine_networking_blob.js +3 -3
  20. package/lib/engine/engine_networking_blob.js.map +1 -1
  21. package/lib/engine/engine_utils_qrcode.js +2 -2
  22. package/lib/engine/engine_utils_qrcode.js.map +1 -1
  23. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  24. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  25. package/lib/engine/webcomponents/needle menu/needle-menu.js +5 -5
  26. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  27. package/lib/engine/webcomponents/needle-engine.js +2 -2
  28. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  29. package/lib/engine/webcomponents/needle-engine.loading.js +2 -2
  30. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  31. package/lib/engine/xr/TempXRContext.js +2 -2
  32. package/lib/engine/xr/TempXRContext.js.map +1 -1
  33. package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
  34. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  35. package/lib/engine-components/webxr/WebXRImageTracking.d.ts +62 -1
  36. package/lib/engine-components/webxr/WebXRImageTracking.js +55 -2
  37. package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
  38. package/package.json +1 -1
  39. package/plugins/common/license.js +26 -8
  40. package/plugins/vite/license.js +29 -12
  41. package/src/engine/api.ts +1 -1
  42. package/src/engine/engine_context.ts +11 -1
  43. package/src/engine/engine_init.ts +2 -2
  44. package/src/engine/engine_license.ts +201 -55
  45. package/src/engine/engine_networking_blob.ts +3 -3
  46. package/src/engine/engine_utils_qrcode.ts +2 -2
  47. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
  48. package/src/engine/webcomponents/needle menu/needle-menu.ts +5 -5
  49. package/src/engine/webcomponents/needle-engine.loading.ts +6 -6
  50. package/src/engine/webcomponents/needle-engine.ts +2 -2
  51. package/src/engine/xr/TempXRContext.ts +2 -2
  52. package/src/engine-components/export/usdz/USDZExporter.ts +4 -4
  53. package/src/engine-components/webxr/WebXRImageTracking.ts +77 -7
  54. package/src/vite-env.d.ts +0 -16
@@ -1,6 +1,6 @@
1
1
  import { needleLogoOnlySVG } from "../assets/index.js"
2
2
  import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
3
- import { hasCommercialLicense, hasProLicense, runtimeLicenseCheckPromise } from "../engine_license.js";
3
+ import { LynjGsV, _cxKhKwDL, _$oYJ } from "../engine_license.js";
4
4
  import { Mathf } from "../engine_math.js";
5
5
  import { LoadingProgressArgs } from "../engine_setup.js";
6
6
  import { getParam } from "../engine_utils.js";
@@ -205,7 +205,7 @@ export class EngineLoadingView implements ILoadingViewHandler {
205
205
  }
206
206
 
207
207
 
208
- const hasLicense = hasProLicense();
208
+ const hasLicense = _cxKhKwDL();
209
209
  if (!existing) {
210
210
  this._loadingElement.style.position = "absolute";
211
211
  this._loadingElement.style.width = "100%";
@@ -373,7 +373,7 @@ export class EngineLoadingView implements ILoadingViewHandler {
373
373
 
374
374
  // private async handleRuntimeLicense(loadingElement: HTMLElement) {
375
375
  // // First check if we have a commercial license
376
- // let commercialLicense = hasCommercialLicense();
376
+ // let commercialLicense = LynjGsV();
377
377
  // // if it's the case then we don't need to perform a runtime check
378
378
  // if (commercialLicense) return;
379
379
 
@@ -393,10 +393,10 @@ export class EngineLoadingView implements ILoadingViewHandler {
393
393
  // loadingElement.appendChild(nonCommercialContainer);
394
394
 
395
395
  // // Use the runtime license check
396
- // if (!isDevEnvironment() && runtimeLicenseCheckPromise) {
396
+ // if (!isDevEnvironment() && _$oYJ) {
397
397
  // if (debugLicense) console.log("Waiting for runtime license check");
398
- // await runtimeLicenseCheckPromise;
399
- // commercialLicense = hasCommercialLicense();
398
+ // await _$oYJ;
399
+ // commercialLicense = LynjGsV();
400
400
  // }
401
401
  // if (commercialLicense) return;
402
402
  // nonCommercialContainer.style.transition = "opacity .5s ease-in-out";
@@ -1,7 +1,7 @@
1
1
  import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
2
2
  import { PUBLIC_KEY, VERSION } from "../engine_constants.js";
3
3
  import { ContextEvent, ContextRegistry } from "../engine_context_registry.js";
4
- import { hasCommercialLicense } from "../engine_license.js";
4
+ import { LynjGsV } from "../engine_license.js";
5
5
  import { onStart } from "../engine_lifecycle_api.js";
6
6
  import { setDracoDecoderPath, setDracoDecoderType, setKtx2TranscoderPath } from "../engine_loaders.gltf.js";
7
7
  import { Context, ContextCreateArgs } from "../engine_setup.js";
@@ -546,7 +546,7 @@ export class NeedleEngineWebComponent extends HTMLElementBase implements INeedle
546
546
 
547
547
 
548
548
  // Loading start events
549
- const allowOverridingDefaultLoading = hasCommercialLicense();
549
+ const allowOverridingDefaultLoading = LynjGsV();
550
550
  // default loading can be overriden by calling preventDefault in the onload start event
551
551
  this.ensureLoadStartIsRegistered();
552
552
  let useDefaultLoading = this.dispatchEvent(new CustomEvent("loadstart", {
@@ -3,7 +3,7 @@ import { ArrayCamera, AxesHelper, Camera, Color, DirectionalLight, Fog, GridHelp
3
3
  import { needleLogoOnlySVG } from "../assets/index.js";
4
4
  import { isDevEnvironment } from "../debug/index.js";
5
5
  import { ObjectUtils, PrimitiveType } from "../engine_create_objects.js";
6
- import { hasCommercialLicense } from "../engine_license.js";
6
+ import { LynjGsV } from "../engine_license.js";
7
7
  import { Mathf } from "../engine_math.js";
8
8
  import { delay, DeviceUtilities } from "../engine_utils.js";
9
9
 
@@ -215,7 +215,7 @@ export class TemporaryXRContext {
215
215
  this._scene.background = new Color(0x000000);
216
216
 
217
217
  let logoSrc = needleLogoOnlySVG;
218
- if (hasCommercialLicense()) {
218
+ if (LynjGsV()) {
219
219
  const htmlComponent = document.querySelector("needle-engine");
220
220
  if (htmlComponent) {
221
221
  const licenseLogo = htmlComponent.getAttribute("logo-src");
@@ -3,7 +3,7 @@ import { Euler, Material, Matrix4, Mesh, Object3D, Quaternion, Vector3 } from "t
3
3
 
4
4
  import { isDevEnvironment, showBalloonMessage, showBalloonWarning } from "../../../engine/debug/index.js";
5
5
  import { findObjectOfType } from "../../../engine/engine_components.js";
6
- import { hasProLicense } from "../../../engine/engine_license.js";
6
+ import { _cxKhKwDL } from "../../../engine/engine_license.js";
7
7
  import { serializable } from "../../../engine/engine_serialization.js";
8
8
  import { getFormattedDate, Progress } from "../../../engine/engine_time_utils.js";
9
9
  import { DeviceUtilities, getParam } from "../../../engine/engine_utils.js";
@@ -277,7 +277,7 @@ export class USDZExporter extends Behaviour {
277
277
  let name = this.exportFileName ?? this.objectToExport?.name ?? this.name;
278
278
  name += "-" + getFormattedDate(); // seems iOS caches the file in some cases, this ensures we always have a fresh file
279
279
 
280
- if (!hasProLicense()) {
280
+ if (!_cxKhKwDL()) {
281
281
  if (name !== "") name += "-";
282
282
  name += "MadeWithNeedle";
283
283
  }
@@ -682,7 +682,7 @@ export class USDZExporter extends Behaviour {
682
682
  if (debug)
683
683
  showBalloonMessage("Quicklook url: " + callToActionURL);
684
684
  if (callToActionURL) {
685
- if (!hasProLicense()) {
685
+ if (!_cxKhKwDL()) {
686
686
  console.warn("Quicklook closed: custom redirects require a Needle Engine Pro license: https://needle.tools/pricing", callToActionURL)
687
687
  }
688
688
  else {
@@ -697,7 +697,7 @@ export class USDZExporter extends Behaviour {
697
697
  private buildQuicklookOverlay(): CustomBranding {
698
698
  const obj: CustomBranding = {};
699
699
  if (this.customBranding) Object.assign(obj, this.customBranding);
700
- if (!hasProLicense()) {
700
+ if (!_cxKhKwDL()) {
701
701
  console.log("Custom Quicklook banner text requires pro license: https://needle.tools/pricing");
702
702
  obj.callToAction = "Close";
703
703
  obj.checkoutTitle = "🌵 Made with Needle";
@@ -12,6 +12,7 @@ import { IUSDExporterExtension } from "../../engine-components/export/usdz/Exten
12
12
  import { imageToCanvas, USDObject, USDWriter, USDZExporterContext } from "../../engine-components/export/usdz/ThreeUSDZExporter.js";
13
13
  import { USDZExporter } from "../../engine-components/export/usdz/USDZExporter.js";
14
14
  import { Behaviour, GameObject } from "../Component.js";
15
+ import { EventList } from "../EventList.js";
15
16
  import { Renderer } from "../Renderer.js";
16
17
 
17
18
  // https://github.com/immersive-web/marker-tracking/blob/main/explainer.md
@@ -41,8 +42,41 @@ export class WebXRTrackedImage {
41
42
  get widthInMeters() { return this._trackedImage.widthInMeters ?? undefined; }
42
43
  /** The ImageBitmap used for tracking */
43
44
  get bitmap(): ImageBitmap { return this._bitmap; }
44
- /** The {@link WebXRImageTrackingModel} configuration for this tracked image */
45
+ /**
46
+ * The {@link WebXRImageTrackingModel} configuration for this tracked image.
47
+ * Use this to access the assigned 3D object, marker settings, and other image tracking configuration.
48
+ * Available on each {@link WebXRTrackedImage} received from the `image-tracking` {@link CustomEvent} (`event.detail`).
49
+ * @example
50
+ * ```ts
51
+ * tracker.addEventListener("image-tracking", event => {
52
+ * for (const img of event.detail.trackedImages) {
53
+ * const model = img.model;
54
+ * // Access the assigned 3D object
55
+ * const obj = model.object;
56
+ * // Access other settings
57
+ * console.log(model.widthInMeters, model.hideWhenTrackingIsLost);
58
+ * }
59
+ * });
60
+ * ```
61
+ */
45
62
  get model(): WebXRImageTrackingModel { return this._trackedImage; }
63
+
64
+ /**
65
+ * The 3D object or prefab assigned to this tracked image marker in the {@link WebXRImageTrackingModel}.
66
+ * Use this to access the object associated with an AR image tracking marker from the `image-tracking` {@link CustomEvent}.
67
+ * Shorthand for `this.model.object`.
68
+ * @example
69
+ * ```ts
70
+ * tracker.addEventListener("image-tracking", event => {
71
+ * for (const img of event.detail.trackedImages) {
72
+ * const obj = img.trackedModel;
73
+ * // verbose alternative: img.model.object
74
+ * }
75
+ * });
76
+ * ```
77
+ */
78
+ get trackedModel(): AssetReference | undefined { return this._trackedImage.object; }
79
+
46
80
  /**
47
81
  * The measured size of the detected image in the real world.
48
82
  * May differ from `widthInMeters` if the physical marker doesn't match the configured size.
@@ -133,11 +167,6 @@ export class WebXRTrackedImage {
133
167
 
134
168
  }
135
169
 
136
- /**
137
- * Event callback type for image tracking updates.
138
- * @param images Array of currently tracked images
139
- */
140
- declare type WebXRImageTrackingEvent = (images: WebXRImageTrackingEvent[]) => void;
141
170
 
142
171
  /**
143
172
  * Initial state of tracked image objects before entering an XR session.
@@ -293,6 +322,17 @@ export class WebXRImageTrackingModel {
293
322
  }
294
323
  }
295
324
 
325
+ /** Data passed to image tracking event listeners. */
326
+ export interface WebXRImageTrackingEvent {
327
+ /** The images currently being tracked this frame. */
328
+ readonly trackedImages: readonly WebXRTrackedImage[];
329
+ }
330
+
331
+ /** Event map for {@link WebXRImageTracking} events. Use with `addEventListener` for typed event handling. */
332
+ export interface WebXRImageTrackingEventMap {
333
+ /** Dispatched every frame when images are being tracked. The event detail contains the tracking data for the current frame. */
334
+ "image-tracking": CustomEvent<WebXRImageTrackingEvent>;
335
+ }
296
336
 
297
337
  // #region USDZ Extension
298
338
  class ImageTrackingExtension implements IUSDExporterExtension {
@@ -515,6 +555,34 @@ class ImageTrackingExtension implements IUSDExporterExtension {
515
555
  */
516
556
  export class WebXRImageTracking extends Behaviour {
517
557
 
558
+ /**
559
+ * Event invoked every frame when images are being tracked.
560
+ * @example
561
+ * ```ts
562
+ * const tracker = this.gameObject.getComponent(WebXRImageTracking);
563
+ * tracker?.imageTracked.addEventListener(evt => {
564
+ * for (const img of evt.trackedImages) {
565
+ * console.log(img.url, img.state);
566
+ * }
567
+ * });
568
+ * ```
569
+ */
570
+ imageTracked: EventList<WebXRImageTrackingEvent> = new EventList();
571
+
572
+ /** @inheritdoc */
573
+ addEventListener<K extends keyof WebXRImageTrackingEventMap>(type: K, listener: (evt: WebXRImageTrackingEventMap[K]) => any): void;
574
+ addEventListener<T extends Event>(type: string, listener: (evt: T) => any): void;
575
+ addEventListener(type: string, listener: (evt: any) => any): void {
576
+ super.addEventListener(type, listener);
577
+ }
578
+
579
+ /** @inheritdoc */
580
+ removeEventListener<K extends keyof WebXRImageTrackingEventMap>(type: K, listener: (evt: WebXRImageTrackingEventMap[K]) => any): void;
581
+ removeEventListener<T extends Event>(type: string, listener: (evt: T) => any): void;
582
+ removeEventListener(type: string, listener: (evt: any) => any): void {
583
+ super.removeEventListener(type, listener);
584
+ }
585
+
518
586
  /**
519
587
  * Set which marker should be primary (first in the list).
520
588
  * Useful when deploying to QuickLook mode where one marker is tracked at a time.
@@ -763,7 +831,9 @@ export class WebXRImageTracking extends Behaviour {
763
831
  }
764
832
  if (this.currentImages.length > 0) {
765
833
  try {
766
- this.dispatchEvent(new CustomEvent("image-tracking", { detail: this.currentImages }));
834
+ const eventData: WebXRImageTrackingEvent = { trackedImages: this.currentImages };
835
+ this.dispatchEvent(new CustomEvent("image-tracking", { detail: eventData }));
836
+ this.imageTracked.invoke(eventData);
767
837
  this.onImageTrackingUpdate(this.currentImages);
768
838
  }
769
839
  catch (e) {
package/src/vite-env.d.ts DELETED
@@ -1,16 +0,0 @@
1
- // Vite global defines — see plugins/vite/defines.js
2
- // declare const entries here are picked up globally (ambient, no import/export).
3
- // Vite sets these as globals in dev and statically replaces them at build time.
4
- // Webpack DefinePlugin replaces them at build time too.
5
- // The globalThis fallbacks for vanilla JS are in engine_constants.ts.
6
-
7
- declare const NEEDLE_ENGINE_VERSION: string;
8
- declare const NEEDLE_ENGINE_GENERATOR: string;
9
- declare const NEEDLE_PROJECT_BUILD_TIME: string;
10
- declare const NEEDLE_PUBLIC_KEY: string;
11
-
12
- // #region treeshake flags
13
- // declare var (not const) so globalThis["NEEDLE_USE_*"] access is also type-safe
14
- declare var NEEDLE_USE_RAPIER: boolean;
15
- declare var NEEDLE_USE_POSTPROCESSING: boolean;
16
- // #endregion treeshake flags