@needle-tools/engine 5.1.0-experimental.08fa2ef → 5.1.0-experimental.13e2eed

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 (41) hide show
  1. package/dist/{needle-engine.bundle-6jp9Udrr.min.js → needle-engine.bundle-CaMhhAu6.min.js} +174 -174
  2. package/dist/{needle-engine.bundle-D5db5ZP1.umd.cjs → needle-engine.bundle-Cz1ToXrF.umd.cjs} +145 -145
  3. package/dist/{needle-engine.bundle-CB0g67az.js → needle-engine.bundle-DSqoJ8lF.js} +6009 -5947
  4. package/dist/needle-engine.d.ts +28 -28
  5. package/dist/needle-engine.js +160 -160
  6. package/dist/needle-engine.min.js +1 -1
  7. package/dist/needle-engine.umd.cjs +1 -1
  8. package/lib/engine/api.d.ts +1 -1
  9. package/lib/engine/api.js +1 -1
  10. package/lib/engine/api.js.map +1 -1
  11. package/lib/engine/engine_init.js +2 -2
  12. package/lib/engine/engine_init.js.map +1 -1
  13. package/lib/engine/engine_license.d.ts +7 -7
  14. package/lib/engine/engine_license.js +80 -78
  15. package/lib/engine/engine_license.js.map +1 -1
  16. package/lib/engine/engine_networking_blob.js +3 -3
  17. package/lib/engine/engine_utils_qrcode.js +2 -2
  18. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  19. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  20. package/lib/engine/webcomponents/needle menu/needle-menu.js +5 -5
  21. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  22. package/lib/engine/webcomponents/needle-engine.js +2 -2
  23. package/lib/engine/webcomponents/needle-engine.loading.js +2 -2
  24. package/lib/engine/webcomponents/needle-engine.loading.js.map +1 -1
  25. package/lib/engine/xr/TempXRContext.js +2 -2
  26. package/lib/engine-components/export/usdz/USDZExporter.js +4 -4
  27. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  28. package/package.json +1 -1
  29. package/plugins/common/license.js +4 -4
  30. package/plugins/vite/license.js +4 -4
  31. package/src/engine/api.ts +1 -1
  32. package/src/engine/engine_init.ts +2 -2
  33. package/src/engine/engine_license.ts +80 -76
  34. package/src/engine/engine_networking_blob.ts +3 -3
  35. package/src/engine/engine_utils_qrcode.ts +2 -2
  36. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -2
  37. package/src/engine/webcomponents/needle menu/needle-menu.ts +5 -5
  38. package/src/engine/webcomponents/needle-engine.loading.ts +6 -6
  39. package/src/engine/webcomponents/needle-engine.ts +2 -2
  40. package/src/engine/xr/TempXRContext.ts +2 -2
  41. package/src/engine-components/export/usdz/USDZExporter.ts +4 -4
@@ -9,19 +9,19 @@ import { getParam } from "./engine_utils.js";
9
9
 
10
10
  const debug = getParam("__debuglic__");
11
11
 
12
- const $jvc: ((result: boolean) => void)[] = [];
12
+ const __hSech: ((result: boolean) => void)[] = [];
13
+
14
+ // DO NOT EDIT MANUALLY
15
+ let _lFCA: string = "";
16
+ // eslint-disable-next-line prefer-const
17
+ let __FGH: string = "";
13
18
 
14
- // These are modified by a bundler (e.g. vite)
15
- // Do not edit manually
16
- let _TqYlV: string = "basic";
17
- // eslint-disable-next-line prefer-const -- value is replaced by the bundler at build time
18
- let _GYfnW: string = "";
19
19
  if (debug) {
20
- console.log("License Type: " + _TqYlV);
21
- if (_GYfnW) {
22
- console.log("License JWT: " + _GYfnW);
20
+ console.log("License Type: " + _lFCA);
21
+ if (__FGH) {
22
+ console.log("License JWT: " + __FGH);
23
23
  try {
24
- const payload = JSON.parse(atob(_GYfnW.split(".")[1].replace(/-/g, '+').replace(/_/g, '/')));
24
+ const payload = JSON.parse(atob(__FGH.split(".")[1].replace(/-/g, '+').replace(/_/g, '/')));
25
25
  console.log("License JWT payload:", payload);
26
26
  }
27
27
  catch { console.log("License JWT payload: (failed to decode)"); }
@@ -32,8 +32,8 @@ if (debug) {
32
32
  }
33
33
 
34
34
  /** @internal */
35
- export function _DTayQW() {
36
- switch (_TqYlV) {
35
+ export function __ZvwOPYX() {
36
+ switch (_lFCA) {
37
37
  case "pro":
38
38
  case "enterprise":
39
39
  return true;
@@ -42,8 +42,8 @@ export function _DTayQW() {
42
42
  }
43
43
 
44
44
  /** @internal */
45
- export function $JOB() {
46
- switch (_TqYlV) {
45
+ export function _xdl() {
46
+ switch (_lFCA) {
47
47
  case "indie":
48
48
  return true;
49
49
  }
@@ -51,8 +51,8 @@ export function $JOB() {
51
51
  }
52
52
 
53
53
  /** @internal */
54
- export function __eNCB() {
55
- switch (_TqYlV) {
54
+ export function oGz() {
55
+ switch (_lFCA) {
56
56
  case "edu":
57
57
  return true;
58
58
  }
@@ -60,20 +60,20 @@ export function __eNCB() {
60
60
  }
61
61
 
62
62
  /** @internal */
63
- export function _$MQoX() {
64
- return _DTayQW() || $JOB() || __eNCB();
63
+ export function $aZfNl() {
64
+ return __ZvwOPYX() || _xdl() || oGz();
65
65
  }
66
66
 
67
67
 
68
68
  /** @internal */
69
- export function _HMnTDWqR(cb: (result: boolean) => void) {
70
- if (_DTayQW() || $JOB() || __eNCB())
69
+ export function _lari(cb: (result: boolean) => void) {
70
+ if (__ZvwOPYX() || _xdl() || oGz())
71
71
  return cb(true);
72
- $jvc.push(cb);
72
+ __hSech.push(cb);
73
73
  }
74
74
 
75
- function wUuS(result: boolean) {
76
- for (const cb of $jvc) {
75
+ function $NOk(result: boolean) {
76
+ for (const cb of __hSech) {
77
77
  try {
78
78
  cb(result);
79
79
  }
@@ -84,11 +84,11 @@ function wUuS(result: boolean) {
84
84
  }
85
85
 
86
86
 
87
- // #region JWT License Verification
87
+ // #region JWT
88
88
 
89
89
  // ECDSA P-256 public key for verifying license JWTs (verification-only, safe to ship)
90
90
  /* eslint-disable no-secrets/no-secrets -- public key, not a secret */
91
- const $dnAvsc = {
91
+ const _$hfXcE = {
92
92
  kty: "EC",
93
93
  crv: "P-256",
94
94
  x: "A34nyKMjhQYVgzeE4tyLUYdx34TAKogDa7v7PRaO9Lg",
@@ -112,7 +112,7 @@ function base64urlDecode(str: string): Uint8Array {
112
112
  * Verify a JWT license token and return the `type` claim if valid.
113
113
  * Returns null if the JWT is missing, malformed, or has an invalid signature.
114
114
  */
115
- async function __YUuTdC(jwt: string): Promise<string | null> {
115
+ async function CRYE(jwt: string): Promise<string | null> {
116
116
  if (!jwt) return null;
117
117
  try {
118
118
  const parts = jwt.split(".");
@@ -122,7 +122,7 @@ async function __YUuTdC(jwt: string): Promise<string | null> {
122
122
 
123
123
  const key = await crypto.subtle.importKey(
124
124
  "jwk",
125
- $dnAvsc,
125
+ _$hfXcE,
126
126
  { name: "ECDSA", namedCurve: "P-256" },
127
127
  false,
128
128
  ["verify"]
@@ -182,24 +182,25 @@ async function __YUuTdC(jwt: string): Promise<string | null> {
182
182
  }
183
183
 
184
184
  /** Verify the injected JWT and update the license type if valid.
185
- * The engine ONLY trusts the JWT — the plain _TqYlV string is ignored. */
185
+ * The engine ONLY trusts the JWT — the plain _lFCA string is ignored. */
186
186
  let _jwtVerificationPromise: Promise<void> | undefined = undefined;
187
- async function _$tvXXHlah(): Promise<void> {
188
- if (!_GYfnW) {
189
- // No JWT present: license stays "basic" regardless of what _TqYlV says
190
- _TqYlV = "basic";
191
- return;
192
- }
193
- const verifiedType = await __YUuTdC(_GYfnW);
187
+ async function _$UzqLATRs(): Promise<void> {
188
+ // NOTE: do NOT add an `if (!__FGH) return` guard here.
189
+ // esbuild (Vite dependency pre-bundling) would see the variable as constant ""
190
+ // and tree-shake the entire JWT verification code path.
191
+ const jwt = __FGH;
192
+ // Clear after reading — this reassignment also prevents esbuild from
193
+ // constant-folding the variable (it now has multiple assignment sites).
194
+ __FGH = "";
195
+ const verifiedType = await CRYE(jwt);
194
196
  if (verifiedType) {
195
- _TqYlV = verifiedType;
197
+ _lFCA = verifiedType;
196
198
  if (debug) console.log("License type set from verified JWT: " + verifiedType);
197
- wUuS(_$MQoX());
199
+ $NOk($aZfNl());
198
200
  }
199
201
  else {
200
- // JWT present but invalid: reset to basic
201
- _TqYlV = "basic";
202
- if (debug) console.warn("JWT verification failed — license reset to basic");
202
+ _lFCA = "basic";
203
+ if (debug && jwt) console.warn("JWT verification failed — license reset to basic");
203
204
  }
204
205
  }
205
206
 
@@ -270,7 +271,7 @@ export namespace Telemetry {
270
271
 
271
272
  const attribute = domElement?.getAttribute("no-telemetry");
272
273
  if (attribute === "" || attribute === "true" || attribute === "1") {
273
- if (_TqYlV === "pro" || _TqYlV === "enterprise") {
274
+ if (_lFCA === "pro" || _lFCA === "enterprise") {
274
275
  if (debug) console.debug("Telemetry is disabled via no-telemetry attribute");
275
276
  return false;
276
277
  }
@@ -377,29 +378,32 @@ export namespace Telemetry {
377
378
  }
378
379
 
379
380
 
380
- export function _$PUXWQ() {
381
+ export function _$tjbq() {
382
+
383
+ if(_lFCA === "") _lFCA = "basic";
384
+
381
385
  // Start JWT verification — must be here (not top-level) to avoid tree-shaking
382
- _jwtVerificationPromise = _$tvXXHlah();
386
+ _jwtVerificationPromise = _$UzqLATRs();
383
387
 
384
388
  Telemetry.init();
385
389
  ContextRegistry.registerCallback(ContextEvent.ContextRegistered, evt => {
386
- $lHQle(evt.context);
387
- _$dIKVrNJ(evt.context);
388
- setTimeout(() => _mRKmGB(evt.context), 2000);
390
+ __dOUFH(evt.context);
391
+ _cZOAFlg(evt.context);
392
+ setTimeout(() => Hthf(evt.context), 2000);
389
393
  });
390
394
  }
391
395
 
392
- export let _$vBFuyQsS: Promise<void> | undefined = undefined;
396
+ export let $HKjlYRPK: Promise<void> | undefined = undefined;
393
397
  let applicationIsForbidden = false;
394
398
  let applicationForbiddenText = "";
395
- async function _xWdntM() {
399
+ async function _AwHwO() {
396
400
  // Only perform the runtime license check once
397
- if (_$vBFuyQsS) return _$vBFuyQsS;
401
+ if ($HKjlYRPK) return $HKjlYRPK;
398
402
  // Wait for JWT verification to complete first (if running)
399
403
  if (_jwtVerificationPromise) {
400
404
  await _jwtVerificationPromise;
401
405
  }
402
- if (_TqYlV === "basic") {
406
+ if (_lFCA === "basic") {
403
407
  try {
404
408
  const licenseUrl = "https://needle.tools/api/v1/needle-engine/check?location=" + encodeURIComponent(window.location.href) + "&version=" + VERSION + "&generator=" + encodeURIComponent(GENERATOR);
405
409
  const res = await fetch(licenseUrl, {
@@ -411,29 +415,29 @@ async function _xWdntM() {
411
415
  if (res?.status === 200) {
412
416
  applicationIsForbidden = false;
413
417
  if (debug) console.log("License check succeeded");
414
- _TqYlV = "pro";
415
- wUuS(true);
418
+ _lFCA = "pro";
419
+ $NOk(true);
416
420
  }
417
421
  else if (res?.status === 403) {
418
- wUuS(false);
422
+ $NOk(false);
419
423
  applicationIsForbidden = true;
420
424
  applicationForbiddenText = await res.text();
421
425
  }
422
426
  else {
423
- wUuS(false);
427
+ $NOk(false);
424
428
  if (debug) console.log("License check failed with status " + res?.status);
425
429
  }
426
430
  }
427
431
  catch (err) {
428
- wUuS(false);
432
+ $NOk(false);
429
433
  if (debug) console.error("License check failed", err);
430
434
  }
431
435
  }
432
- else if (debug) console.log("Runtime license check is skipped because license is already applied as \"" + _TqYlV + "\"");
436
+ else if (debug) console.log("Runtime license check is skipped because license is already applied as \"" + _lFCA + "\"");
433
437
  }
434
- _$vBFuyQsS = _xWdntM();
438
+ $HKjlYRPK = _AwHwO();
435
439
 
436
- async function _$dIKVrNJ(ctx: IContext) {
440
+ async function _cZOAFlg(ctx: IContext) {
437
441
  function createForbiddenElement() {
438
442
  const div = document.createElement("div");
439
443
  div.className = "needle-forbidden";
@@ -498,40 +502,40 @@ async function _$dIKVrNJ(ctx: IContext) {
498
502
  }, 500)
499
503
  }
500
504
 
501
- async function $lHQle(ctx: IContext) {
505
+ async function __dOUFH(ctx: IContext) {
502
506
  try {
503
- if (!_DTayQW() && !$JOB()) {
504
- return LkcJKXX(ctx);
507
+ if (!__ZvwOPYX() && !_xdl()) {
508
+ return uPq(ctx);
505
509
  }
506
510
  }
507
511
  catch (err) {
508
512
  if (debug) console.log("License check failed", err)
509
- return LkcJKXX(ctx)
513
+ return uPq(ctx)
510
514
  }
511
- if (debug) LkcJKXX(ctx)
515
+ if (debug) uPq(ctx)
512
516
  }
513
517
 
514
518
 
515
519
 
516
- async function LkcJKXX(ctx: IContext) {
520
+ async function uPq(ctx: IContext) {
517
521
 
518
522
  // if the engine loads faster than the license check, we need to capture the ready event here
519
523
  let isReady = false;
520
524
  ctx.domElement.addEventListener("ready", () => isReady = true);
521
525
 
522
- await _$vBFuyQsS?.catch(() => { });
526
+ await $HKjlYRPK?.catch(() => { });
523
527
 
524
528
 
525
- if (_DTayQW() || $JOB()) return;
526
- if (_$MQoX() === false) __Dnv();
529
+ if (__ZvwOPYX() || _xdl()) return;
530
+ if ($aZfNl() === false) __rraAdZZk();
527
531
 
528
532
  // check if the engine is already ready (meaning has finished loading)
529
533
  if (isReady) {
530
- $ThBU(ctx);
534
+ bXzSf(ctx);
531
535
  }
532
536
  else {
533
537
  ctx.domElement.addEventListener("ready", () => {
534
- $ThBU(ctx);
538
+ bXzSf(ctx);
535
539
  });
536
540
  }
537
541
  }
@@ -539,7 +543,7 @@ async function LkcJKXX(ctx: IContext) {
539
543
  // const licenseElementIdentifier = "needle-license-element";
540
544
  // const licenseDuration = 10000;
541
545
  // const licenseDelay = 1200;
542
- function $ThBU(ctx: IContext) {
546
+ function bXzSf(ctx: IContext) {
543
547
 
544
548
  const style = `
545
549
  position: relative;
@@ -552,7 +556,7 @@ function $ThBU(ctx: IContext) {
552
556
  padding: 10px;
553
557
  padding-left: 30px;
554
558
  `;
555
- if (_TqYlV === "edu") {
559
+ if (_lFCA === "edu") {
556
560
  if (navigator.webdriver) {
557
561
  console.log("This project is supported by Needle for Education – https://needle.tools");
558
562
  }
@@ -609,7 +613,7 @@ function $ThBU(ctx: IContext) {
609
613
  }
610
614
  }, 1000);
611
615
 
612
- if (__eNCB()) {
616
+ if (oGz()) {
613
617
  const removeDelay = 20_000;
614
618
  setTimeout(() => {
615
619
  clearInterval(interval);
@@ -618,7 +622,7 @@ function $ThBU(ctx: IContext) {
618
622
  const intervalInMinutes = 5;
619
623
  setTimeout(() => {
620
624
  if (ctx.domElement.parentNode)
621
- $ThBU(ctx);
625
+ bXzSf(ctx);
622
626
  }, 1000 * 60 * intervalInMinutes)
623
627
  }, removeDelay);
624
628
  }
@@ -629,7 +633,7 @@ function $ThBU(ctx: IContext) {
629
633
  const base64Logo = "data:image/webp;base64,UklGRrABAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSKEAAAARN6CmbSM4WR7vdARON11EBDq3fLiNbVtVzpMCPlKAEzsx0Y/x+Ovuv4dn0EFE/ydAvz6YggXzgh5sVgXM/zOC/4sii7qgGvB5N7hmuQYwkvazWAu1JPW41FXSHq6pnaQWvqYH18Fc0j1hO/BFTtIeSBlJi5w6qIIO7IOrwhFsB2Yxukif0FTRLpXswHR8MxbslKe9VZsn/Ub5C7YFOpqSTABWUDgg6AAAAFAGAJ0BKiAAIAA+7VyoTqmkpCI3+qgBMB2JbACdMt69DwMIQBLhkTO6XwY00UEDK6cNIDnuNibPf0EgAP7Y1myuiQHLDsF/0h5unrGh6WAbv7aegg2ZMd3uRKfT/3SJztcaujYfTvMXspfCTmYcoO6a+vhC3ss4M8uM58t4siiu59I4aOl59e9Sr6xoxYlHf2v+NnBNpJYeJf8jABQAId/PXuBkLEFkiCucgSGEcfhvajql/j3reCGl0M5/9gQWy7ayNPs+wlvIxFnNfSlfuND4CZOCyxOHhRqOmHN4ULHo3tCSrUNvgAA=";
630
634
 
631
635
  let lastLogTime = 0;
632
- async function __Dnv(_logo?: string) {
636
+ async function __rraAdZZk(_logo?: string) {
633
637
  const now = Date.now();
634
638
  if (now - lastLogTime < 2000) return;
635
639
  lastLogTime = now;
@@ -662,7 +666,7 @@ async function __Dnv(_logo?: string) {
662
666
  }
663
667
 
664
668
 
665
- async function _mRKmGB(context: IContext) {
669
+ async function Hthf(context: IContext) {
666
670
  // We can't send beacons from cross-origin isolated pages
667
671
  if (window.crossOriginIsolated) return;
668
672
 
@@ -677,7 +681,7 @@ async function _mRKmGB(context: IContext) {
677
681
 
678
682
  // current url without query parameters
679
683
  const currentUrl = window.location.href.split("?")[0];
680
- const license = _TqYlV;
684
+ const license = _lFCA;
681
685
 
682
686
  const beaconData = {
683
687
  license,
@@ -1,7 +1,7 @@
1
1
  import { FileLoader } from "three";
2
2
 
3
3
  import { showBalloonWarning } from "./debug/index.js";
4
- import { _$MQoX } from "./engine_license.js";
4
+ import { $aZfNl } from "./engine_license.js";
5
5
  import { delay } from "./engine_utils.js";
6
6
  import { md5AsBytes, md5Hex, sha256Base64 } from "./engine_utils_hash.js";
7
7
 
@@ -45,7 +45,7 @@ export namespace BlobStorage {
45
45
  */
46
46
  export function canUpload(info: { filesize: number }) {
47
47
  const sizeInMB = info.filesize / 1024 / 1024;
48
- if (_$MQoX()) {
48
+ if ($aZfNl()) {
49
49
  return sizeInMB < maxSizeInMB;
50
50
  }
51
51
  return sizeInMB < maxFreeSizeInMB;
@@ -100,7 +100,7 @@ export namespace BlobStorage {
100
100
  console.warn(`Your file is too large for uploading (${filesizeInMB.toFixed(1)}MB). Max allowed size is ${maxSizeInMB}MB`);
101
101
  return null;
102
102
  }
103
- else if (!_$MQoX() && filesizeInMB > maxFreeSizeInMB) {
103
+ else if (!$aZfNl() && filesizeInMB > maxFreeSizeInMB) {
104
104
  if (opts?.silent !== true) showBalloonWarning(`File is too large for uploading. Please get a <a href=\"https://needle.tools/pricing\" target=\"_blank\">commercial license</a> to upload files larger than 5MB`);
105
105
  console.warn(`Your file is too large for uploading (${filesizeInMB.toFixed(1)}MB). Max size is 5MB for non-commercial users. Please get a commercial license at https://needle.tools/pricing for larger files (up to 50MB)`);
106
106
  return null;
@@ -4,7 +4,7 @@ import { Quaternion, Vector2, Vector3, Vector4 } from "three";
4
4
 
5
5
  import { needleLogoOnlySVG } from "./assets/index.js";
6
6
  import { isDevEnvironment } from "./debug/debug.js";
7
- import { _$MQoX } from "./engine_license.js";
7
+ import { $aZfNl } from "./engine_license.js";
8
8
  import { InternalAttributeUtils } from "./engine_utils_attributes.js";
9
9
  import type { NeedleEngineWebComponent } from "./webcomponents/needle-engine.js";
10
10
 
@@ -135,7 +135,7 @@ async function internalRenderQRCodeOverlays(canvas: HTMLCanvasElement, args: { s
135
135
  console.debug("[QR Code] No web component found")
136
136
  }
137
137
 
138
- const canUseCustomLogo = _$MQoX();
138
+ const canUseCustomLogo = $aZfNl();
139
139
 
140
140
  // Query logo src from needle-engine attribute.
141
141
  // For any supported attribute it's possible to use "falsey" values (e.g. "0" or "false" to disable the logo in the QR code)
@@ -2,7 +2,7 @@ import { Mesh, Object3D, TextureLoader, Vector4 } from "three";
2
2
  import ThreeMeshUI from "three-mesh-ui";
3
3
 
4
4
  import { addNewComponent } from "../../engine_components.js";
5
- import { _DTayQW } from "../../engine_license.js";
5
+ import { __ZvwOPYX } from "../../engine_license.js";
6
6
  import { OneEuroFilterXYZ } from "../../engine_math.js";
7
7
  import type { Context } from "../../engine_setup.js";
8
8
  import { lookAtObject } from "../../engine_three_utils.js";
@@ -321,7 +321,7 @@ export class NeedleSpatialMenu {
321
321
  }
322
322
  if (this.menu) {
323
323
  const index = this.menu.children.indexOf(this._poweredByNeedleElement as any);
324
- if (!this._showNeedleLogo && _DTayQW()) {
324
+ if (!this._showNeedleLogo && __ZvwOPYX()) {
325
325
  if (index >= 0) {
326
326
  this._poweredByNeedleElement.removeFromParent();
327
327
  this.markDirty();
@@ -1,6 +1,6 @@
1
1
  import { showBalloonMessage } from "../../debug/debug.js";
2
2
  import type { Context } from "../../engine_context.js";
3
- import { _$MQoX, _HMnTDWqR, Telemetry } from "../../engine_license.js";
3
+ import { $aZfNl, _lari, Telemetry } from "../../engine_license.js";
4
4
  import { isLocalNetwork } from "../../engine_networking_utils.js";
5
5
  import { HTMLElementBase } from "../../engine_ssr.js";
6
6
  import { DeviceUtilities, getParam } from "../../engine_utils.js";
@@ -778,8 +778,8 @@ export class NeedleMenuElement extends HTMLElementBase {
778
778
  try {
779
779
  // if the user has a license then we CAN hide the needle logo
780
780
  // calling this method immediately will cause an issue with vite bundling tho
781
- window.requestAnimationFrame(() => _HMnTDWqR(res => {
782
- if (res == true && _$MQoX() && !debugNonCommercial) {
781
+ window.requestAnimationFrame(() => _lari(res => {
782
+ if (res == true && $aZfNl() && !debugNonCommercial) {
783
783
  let visible = this._userRequestedLogoVisible;
784
784
  if (visible === undefined) visible = false;
785
785
  this.___onSetLogoVisible(visible);
@@ -830,7 +830,7 @@ export class NeedleMenuElement extends HTMLElementBase {
830
830
  // ensure the menu is not hidden or removed
831
831
  const requiredParent = this?.parentNode;
832
832
  if (this.style.display != "flex" || this.style.visibility != "visible" || this.style.opacity != "1" || requiredParent != this._domElement?.shadowRoot) {
833
- if (!_$MQoX()) {
833
+ if (!$aZfNl()) {
834
834
  const change = changeEventCounter++;
835
835
  // if a user doesn't have a local pro license *but* for development the menu is hidden then we show a warning
836
836
  if (isLocalNetwork() && this._userRequestedMenuVisible === false) {
@@ -918,7 +918,7 @@ export class NeedleMenuElement extends HTMLElementBase {
918
918
  showNeedleLogo(visible: boolean) {
919
919
  this._userRequestedLogoVisible = visible;
920
920
  if (!visible) {
921
- if (!_$MQoX() || debugNonCommercial) {
921
+ if (!$aZfNl() || debugNonCommercial) {
922
922
  console.warn("[Needle Engine] You need a PRO license to hide the Needle Engine logo in production.");
923
923
  const localNetwork = isLocalNetwork()
924
924
  if (!localNetwork) return;
@@ -1,6 +1,6 @@
1
1
  import { needleLogoOnlySVG } from "../assets/index.js"
2
2
  import { isDevEnvironment, showBalloonWarning } from "../debug/index.js";
3
- import { _$MQoX, _DTayQW, _$vBFuyQsS } from "../engine_license.js";
3
+ import { $aZfNl, __ZvwOPYX, $HKjlYRPK } 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 = _DTayQW();
208
+ const hasLicense = __ZvwOPYX();
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 = _$MQoX();
376
+ // let commercialLicense = $aZfNl();
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() && _$vBFuyQsS) {
396
+ // if (!isDevEnvironment() && $HKjlYRPK) {
397
397
  // if (debugLicense) console.log("Waiting for runtime license check");
398
- // await _$vBFuyQsS;
399
- // commercialLicense = _$MQoX();
398
+ // await $HKjlYRPK;
399
+ // commercialLicense = $aZfNl();
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 { _$MQoX } from "../engine_license.js";
4
+ import { $aZfNl } 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 = _$MQoX();
549
+ const allowOverridingDefaultLoading = $aZfNl();
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 { _$MQoX } from "../engine_license.js";
6
+ import { $aZfNl } 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 (_$MQoX()) {
218
+ if ($aZfNl()) {
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 { _DTayQW } from "../../../engine/engine_license.js";
6
+ import { __ZvwOPYX } 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 (!_DTayQW()) {
280
+ if (!__ZvwOPYX()) {
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 (!_DTayQW()) {
685
+ if (!__ZvwOPYX()) {
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 (!_DTayQW()) {
700
+ if (!__ZvwOPYX()) {
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";