@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.
- package/CHANGELOG.md +10 -0
- package/dist/{needle-engine.bundle-OPkPmdUM.umd.cjs → needle-engine.bundle-5avtTUMM.umd.cjs} +146 -145
- package/dist/{needle-engine.bundle-D7tzaiYE.min.js → needle-engine.bundle-BHcw4C8f.min.js} +175 -174
- package/dist/{needle-engine.bundle-C-LG00ZZ.js → needle-engine.bundle-C0gPOq4m.js} +6332 -6201
- package/dist/needle-engine.d.ts +91 -29
- package/dist/needle-engine.js +329 -329
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/engine/api.d.ts +1 -1
- package/lib/engine/api.js +1 -1
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/engine_context.js +7 -0
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_init.js +2 -2
- package/lib/engine/engine_init.js.map +1 -1
- package/lib/engine/engine_license.d.ts +7 -7
- package/lib/engine/engine_license.js +185 -57
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_networking_blob.js +3 -3
- package/lib/engine/engine_networking_blob.js.map +1 -1
- package/lib/engine/engine_utils_qrcode.js +2 -2
- package/lib/engine/engine_utils_qrcode.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.js +5 -5
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.js +2 -2
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.loading.js +2 -2
- package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
- package/lib/engine/xr/TempXRContext.js +2 -2
- package/lib/engine/xr/TempXRContext.js.map +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +62 -1
- package/lib/engine-components/webxr/WebXRImageTracking.js +55 -2
- package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
- package/package.json +1 -1
- package/plugins/common/license.js +26 -8
- package/plugins/vite/license.js +29 -12
- package/src/engine/api.ts +1 -1
- package/src/engine/engine_context.ts +11 -1
- package/src/engine/engine_init.ts +2 -2
- package/src/engine/engine_license.ts +201 -55
- package/src/engine/engine_networking_blob.ts +3 -3
- package/src/engine/engine_utils_qrcode.ts +2 -2
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
- package/src/engine/webcomponents/needle menu/needle-menu.ts +5 -5
- package/src/engine/webcomponents/needle-engine.loading.ts +6 -6
- package/src/engine/webcomponents/needle-engine.ts +2 -2
- package/src/engine/xr/TempXRContext.ts +2 -2
- package/src/engine-components/export/usdz/USDZExporter.ts +4 -4
- package/src/engine-components/webxr/WebXRImageTracking.ts +77 -7
- 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 {
|
|
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 =
|
|
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 =
|
|
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() &&
|
|
396
|
+
// if (!isDevEnvironment() && _$oYJ) {
|
|
397
397
|
// if (debugLicense) console.log("Waiting for runtime license check");
|
|
398
|
-
// await
|
|
399
|
-
// commercialLicense =
|
|
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 {
|
|
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 =
|
|
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 {
|
|
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 (
|
|
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 {
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|