@tresjs/core 5.9.1 → 5.9.3

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/dist/tres.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.9.1
3
+ * version: v5.9.3
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
@@ -8,15 +8,13 @@
8
8
  import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createRenderer, defineComponent, getCurrentInstance, h, isRef, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, provide, reactive, readonly, ref, renderSlot, shallowRef, toValue, triggerRef, unref, useSlots, watch, watchEffect, withCtx } from "vue";
9
9
  import * as THREE from "three";
10
10
  import { ACESFilmicToneMapping, ArrowHelper, BufferAttribute, Color, DirectionalLightHelper, DoubleSide, HemisphereLightHelper, Layers, Material, MathUtils, Mesh, MeshBasicMaterial, PCFShadowMap, PCFSoftShadowMap, PerspectiveCamera, PointLightHelper, REVISION, Scene, SpotLightHelper, Vector3, WebGLRenderer } from "three";
11
- import { createEventHook, createInjectionState, promiseTimeout, refDebounced, tryOnScopeDispose, unrefElement, useAsyncState, useDevicePixelRatio, useElementSize, useFps, useMemory, useRafFn, useTimeout, useWindowSize, whenever } from "@vueuse/core";
11
+ import { createEventHook, createInjectionState, promiseTimeout, refDebounced, tryOnScopeDispose, unrefElement, useAsyncState, useDevicePixelRatio, useElementSize, useFps, useIntervalFn, useMemory, useRafFn, useTimeout, useWindowSize, whenever } from "@vueuse/core";
12
12
  import { camel, isEqual, isFunction, isNumber, isObject, isString, isUndefined } from "radashi";
13
13
  import { forwardHtmlEvents, getVoidObject } from "@pmndrs/pointer-events";
14
14
  import { setupDevtoolsPlugin } from "@vue/devtools-api";
15
15
  import { RectAreaLightHelper } from "three/examples/jsm/helpers/RectAreaLightHelper.js";
16
-
17
16
  //#region package.json
18
- var version = "5.9.1";
19
-
17
+ var version = "5.9.3";
20
18
  //#endregion
21
19
  //#region src/utils/makeMap.ts
22
20
  /**
@@ -32,16 +30,10 @@ function makeMap(str) {
32
30
  for (const key of str.split(",")) map[key] = 1;
33
31
  return (val) => val in map;
34
32
  }
35
-
36
- //#endregion
37
- //#region src/utils/is/dom.ts
38
- const HTML_TAGS = "html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot";
39
- const isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);
40
-
33
+ const isHTMLTag = /* #__PURE__ */ makeMap("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot");
41
34
  //#endregion
42
35
  //#region src/utils/is/util.ts
43
36
  const createTypeGuard = (property) => (value) => isObject(value) && property in value && !!value[property];
44
-
45
37
  //#endregion
46
38
  //#region src/utils/is/three.ts
47
39
  /**
@@ -205,7 +197,6 @@ const isScene = createTypeGuard("isScene");
205
197
  * ```
206
198
  */
207
199
  const isGroup = createTypeGuard("isGroup");
208
-
209
200
  //#endregion
210
201
  //#region src/utils/is/tres.ts
211
202
  const isVectorLike = (value) => value !== null && typeof value === "object" && "set" in value && typeof value.set === "function";
@@ -291,7 +282,6 @@ const isWebGPURenderer = createTypeGuard("isRenderer");
291
282
  * @see {@link isWebGPURenderer}
292
283
  */
293
284
  const isWebGLRenderer = createTypeGuard("isWebGLRenderer");
294
-
295
285
  //#endregion
296
286
  //#region src/utils/array.ts
297
287
  /**
@@ -308,7 +298,6 @@ const filterInPlace = (array, callbackFn) => {
308
298
  array.length = i;
309
299
  return array;
310
300
  };
311
-
312
301
  //#endregion
313
302
  //#region src/utils/logger.ts
314
303
  /**
@@ -317,7 +306,7 @@ const filterInPlace = (array, callbackFn) => {
317
306
  */
318
307
  function resolveRuntimeMode() {
319
308
  try {
320
- const modeFromImportMeta = import.meta?.env?.MODE;
309
+ const modeFromImportMeta = import.meta.env?.MODE;
321
310
  if (modeFromImportMeta) return modeFromImportMeta;
322
311
  } catch {}
323
312
  return typeof process !== "undefined" && process.env && process.env.NODE_ENV ? process.env.NODE_ENV : "production";
@@ -350,11 +339,10 @@ function logWarning(...args) {
350
339
  function logMessage(name, value) {
351
340
  if (!isProd) console.log(`${logPrefix} - ${name}:`, value);
352
341
  }
353
-
354
342
  //#endregion
355
343
  //#region src/utils/index.ts
356
344
  function disposeMaterial(material) {
357
- const hasMap = (material$1) => "map" in material$1 && !!material$1.map;
345
+ const hasMap = (material) => "map" in material && !!material.map;
358
346
  if (hasMap(material)) material.map.dispose();
359
347
  material.dispose();
360
348
  }
@@ -396,14 +384,14 @@ function attach(parent, child, type) {
396
384
  const INDEX_REGEX = /-\d+$/;
397
385
  if (isString(type)) {
398
386
  if (INDEX_REGEX.test(type)) {
399
- const { target: target$1, key: key$1 } = resolve(parent, type.replace(INDEX_REGEX, ""));
400
- if (!Array.isArray(target$1[key$1])) {
401
- const previousAttach = target$1[key$1];
387
+ const { target, key } = resolve(parent, type.replace(INDEX_REGEX, ""));
388
+ if (!Array.isArray(target[key])) {
389
+ const previousAttach = target[key];
402
390
  const augmentedArray = [];
403
391
  augmentedArray.__tresDetach = () => {
404
- if (augmentedArray.every((v) => isUndefined(v))) target$1[key$1] = previousAttach;
392
+ if (augmentedArray.every((v) => isUndefined(v))) target[key] = previousAttach;
405
393
  };
406
- target$1[key$1] = augmentedArray;
394
+ target[key] = augmentedArray;
407
395
  }
408
396
  }
409
397
  const { target, key } = resolve(parent, type);
@@ -489,7 +477,6 @@ function doRemoveDeregister(node, context) {
489
477
  if (isTresCamera(node)) context.camera.deregisterCamera(node);
490
478
  invalidateInstance(node);
491
479
  }
492
-
493
480
  //#endregion
494
481
  //#region src/composables/useLoader/index.ts
495
482
  /**
@@ -499,8 +486,8 @@ function doRemoveDeregister(node, context) {
499
486
  * @param options - Optional configuration for the loader
500
487
  * @returns UseAsyncState composable with the loaded model
501
488
  */
502
- function useLoader(Loader$1, path, options) {
503
- const proto = new Loader$1(options?.manager);
489
+ function useLoader(Loader, path, options) {
490
+ const proto = new Loader(options?.manager);
504
491
  const progress = reactive({
505
492
  loaded: 0,
506
493
  total: 0,
@@ -508,10 +495,10 @@ function useLoader(Loader$1, path, options) {
508
495
  });
509
496
  if (options?.extensions) options.extensions(proto);
510
497
  const initialPath = toValue(path);
511
- const result = useAsyncState((path$1) => new Promise((resolve$1, reject) => {
512
- const assetPath = path$1 || initialPath || "";
513
- proto.load(assetPath, (result$1) => {
514
- resolve$1(result$1);
498
+ const result = useAsyncState((path) => new Promise((resolve, reject) => {
499
+ const assetPath = path || initialPath || "";
500
+ proto.load(assetPath, (result) => {
501
+ resolve(result);
515
502
  }, (event) => {
516
503
  progress.loaded = event.loaded;
517
504
  progress.total = event.total;
@@ -537,16 +524,15 @@ function useLoader(Loader$1, path, options) {
537
524
  });
538
525
  return {
539
526
  ...result,
540
- load: (path$1) => {
541
- result.execute(0, path$1);
527
+ load: (path) => {
528
+ result.execute(0, path);
542
529
  },
543
530
  progress
544
531
  };
545
532
  }
546
-
547
533
  //#endregion
548
- //#region src/composables/useLoader/component.vue?vue&type=script&setup=true&lang.ts
549
- var component_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
534
+ //#region src/composables/useLoader/component.vue
535
+ var component_default = /* @__PURE__ */ defineComponent({
550
536
  __name: "component",
551
537
  props: {
552
538
  loader: {
@@ -589,11 +575,6 @@ var component_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defi
589
575
  };
590
576
  }
591
577
  });
592
-
593
- //#endregion
594
- //#region src/composables/useLoader/component.vue
595
- var component_default = component_vue_vue_type_script_setup_true_lang_default;
596
-
597
578
  //#endregion
598
579
  //#region src/composables/useCamera/index.ts
599
580
  /**
@@ -610,9 +591,10 @@ const useCameraManager = ({ sizes }) => {
610
591
  * @param cameraOrUuid - The camera or its UUID to set as active
611
592
  */
612
593
  const setActiveCamera = (cameraOrUuid) => {
613
- const camera = isCamera(cameraOrUuid) ? cameraOrUuid : cameras.value.find((camera$1) => camera$1.uuid === cameraOrUuid);
594
+ const camera = isCamera(cameraOrUuid) ? cameraOrUuid : cameras.value.find((camera) => camera.uuid === cameraOrUuid);
614
595
  if (!camera) return;
615
- cameras.value = [camera, ...cameras.value.filter(({ uuid }) => uuid !== camera.uuid)];
596
+ const otherCameras = cameras.value.filter(({ uuid }) => uuid !== camera.uuid);
597
+ cameras.value = [camera, ...otherCameras];
616
598
  };
617
599
  /**
618
600
  * Register a camera
@@ -651,7 +633,6 @@ const useCameraManager = ({ sizes }) => {
651
633
  setActiveCamera
652
634
  };
653
635
  };
654
-
655
636
  //#endregion
656
637
  //#region src/utils/graph.ts
657
638
  function buildGraph(object) {
@@ -671,7 +652,6 @@ function buildGraph(object) {
671
652
  });
672
653
  return data;
673
654
  }
674
-
675
655
  //#endregion
676
656
  //#region src/composables/useGraph/index.ts
677
657
  const useGraph = (object) => {
@@ -681,7 +661,6 @@ const useGraph = (object) => {
681
661
  return buildGraph(obj);
682
662
  });
683
663
  };
684
-
685
664
  //#endregion
686
665
  //#region src/utils/createPriorityEventHook.ts
687
666
  function createPriorityEventHook() {
@@ -732,12 +711,10 @@ function createPriorityEventHook() {
732
711
  }
733
712
  };
734
713
  }
735
-
736
714
  //#endregion
737
715
  //#region src/core/catalogue.ts
738
716
  const catalogue = ref({});
739
717
  const extend = (objects) => Object.assign(catalogue.value, objects);
740
-
741
718
  //#endregion
742
719
  //#region src/composables/useRenderer/pixelRatio.ts
743
720
  const setPixelRatio = (renderer, systemDpr, userDpr) => {
@@ -750,11 +727,9 @@ const setPixelRatio = (renderer, systemDpr, userDpr) => {
750
727
  else newDpr = systemDpr;
751
728
  if (newDpr !== renderer.getPixelRatio?.()) renderer.setPixelRatio(newDpr);
752
729
  };
753
-
754
730
  //#endregion
755
731
  //#region src/core/revision.ts
756
732
  const revision = Number.parseInt(REVISION.replace("dev", ""));
757
-
758
733
  //#endregion
759
734
  //#region src/utils/createTimer.ts
760
735
  /**
@@ -792,7 +767,6 @@ function createTimer() {
792
767
  };
793
768
  }
794
769
  }
795
-
796
770
  //#endregion
797
771
  //#region src/composables/useCreateRafLoop/index.ts
798
772
  /**
@@ -833,19 +807,22 @@ const useCreateRafLoop = (cycleFn, { fpsLimit } = {}) => {
833
807
  onLoop: eventHooks.after.on
834
808
  };
835
809
  };
836
-
837
810
  //#endregion
838
811
  //#region src/utils/error.ts
839
812
  var TresRendererError = class extends Error {
813
+ code;
840
814
  name = "TresRendererError";
841
815
  constructor(message, code, options) {
842
816
  super(message, options);
843
817
  this.code = code;
844
818
  }
845
819
  };
846
-
847
820
  //#endregion
848
821
  //#region src/composables/useRenderer/useRendererManager.ts
822
+ /**
823
+ * Three.js revision where `WebGPURenderer` removed `PCFSoftShadowMap`.
824
+ */
825
+ const WEBGPU_PCF_SOFT_REMOVED_REVISION = 186;
849
826
  function useRendererManager({ scene, canvas, options, fpsLimit, contextParts: { sizes, camera } }) {
850
827
  const getRenderer = () => {
851
828
  if (isFunction(options.renderer)) return options.renderer({
@@ -990,7 +967,7 @@ Error details: ${rendererError.message}`, rendererError);
990
967
  });
991
968
  watchEffect(() => {
992
969
  if (!isInitialized.value) return;
993
- const fallback = isWebGPURenderer(renderer) ? PCFSoftShadowMap : PCFShadowMap;
970
+ const fallback = isWebGPURenderer(renderer) && revision < WEBGPU_PCF_SOFT_REMOVED_REVISION ? PCFSoftShadowMap : PCFShadowMap;
994
971
  renderer.shadowMap.type = options.shadowMapType ?? fallback;
995
972
  forceMaterialUpdate();
996
973
  });
@@ -1013,7 +990,6 @@ Error details: ${rendererError.message}`, rendererError);
1013
990
  error
1014
991
  };
1015
992
  }
1016
-
1017
993
  //#endregion
1018
994
  //#region src/composables/useSizes/index.ts
1019
995
  function useSizes(windowSize, canvas, debounceMs = 10) {
@@ -1028,7 +1004,6 @@ function useSizes(windowSize, canvas, debounceMs = 10) {
1028
1004
  aspectRatio: computed(() => debouncedReactiveWidth.value / debouncedReactiveHeight.value)
1029
1005
  };
1030
1006
  }
1031
-
1032
1007
  //#endregion
1033
1008
  //#region src/composables/useEventManager/index.ts
1034
1009
  function useEventManager({ canvas, contextParts: { scene, camera, renderer } }) {
@@ -1041,7 +1016,6 @@ function useEventManager({ canvas, contextParts: { scene, camera, renderer } })
1041
1016
  voidObject.addEventListener("click", pointerMissedEventHook.trigger);
1042
1017
  return { onPointerMissed: pointerMissedEventHook.on };
1043
1018
  }
1044
-
1045
1019
  //#endregion
1046
1020
  //#region src/composables/useTresContextProvider/index.ts
1047
1021
  const INJECTION_KEY = "useTres";
@@ -1089,25 +1063,23 @@ const useTresContext = () => {
1089
1063
  if (!ctx) throw new Error("useTresContext must be used together with useTresContextProvider.\n You probably tried to use it above or on the same level as a TresCanvas component.\n It should be used in child components of a TresCanvas instance.");
1090
1064
  return ctx;
1091
1065
  };
1092
-
1093
1066
  //#endregion
1094
1067
  //#region src/composables/useTres/index.ts
1095
1068
  function useTres() {
1096
- const { scene, renderer, camera, sizes, controls, extend: extend$1, events, isWebGPU } = useTresContext();
1069
+ const { scene, renderer, camera, sizes, controls, extend, events, isWebGPU } = useTresContext();
1097
1070
  return {
1098
1071
  scene,
1099
1072
  renderer: renderer.instance,
1100
1073
  camera: camera.activeCamera,
1101
1074
  sizes,
1102
1075
  controls,
1103
- extend: extend$1,
1076
+ extend,
1104
1077
  events,
1105
1078
  isWebGPU,
1106
1079
  invalidate: renderer.invalidate,
1107
1080
  advance: renderer.advance
1108
1081
  };
1109
1082
  }
1110
-
1111
1083
  //#endregion
1112
1084
  //#region src/composables/useLoop/index.ts
1113
1085
  /**
@@ -1140,7 +1112,6 @@ const useLoop = () => {
1140
1112
  render
1141
1113
  };
1142
1114
  };
1143
-
1144
1115
  //#endregion
1145
1116
  //#region src/utils/primitive/createRetargetingProxy.ts
1146
1117
  function createRetargetingProxy(target, getters = {}, setters = {}) {
@@ -1165,7 +1136,6 @@ function createRetargetingProxy(target, getters = {}, setters = {}) {
1165
1136
  });
1166
1137
  return proxy;
1167
1138
  }
1168
-
1169
1139
  //#endregion
1170
1140
  //#region src/utils/pointerEvents.ts
1171
1141
  const supportedPointerEvents = [
@@ -1199,7 +1169,6 @@ const pointerEventsMapVueToThree = {
1199
1169
  onWheel: "wheel"
1200
1170
  };
1201
1171
  const isSupportedPointerEvent = (event) => supportedPointerEvents.includes(event);
1202
-
1203
1172
  //#endregion
1204
1173
  //#region src/core/nodeOps.ts
1205
1174
  const textNodeSymbol = Symbol("tresTextNode");
@@ -1269,12 +1238,12 @@ const nodeOps = ({ context, options = { primitivePrefix: "" } }) => {
1269
1238
  if (!child) return;
1270
1239
  parent = parent || scene;
1271
1240
  if (isTextNode(child) || isCommentNode(child)) {
1272
- const parentInstance$1 = parent.__tres ? parent : prepareTresInstance(parent, {}, context);
1273
- child.__tres.parent = parentInstance$1;
1274
- if (parentInstance$1.__tres.objects) {
1275
- const insertIndex = anchor ? parentInstance$1.__tres.objects.findIndex((obj) => obj === anchor) : -1;
1276
- if (insertIndex >= 0) parentInstance$1.__tres.objects.splice(insertIndex, 0, child);
1277
- else parentInstance$1.__tres.objects.push(child);
1241
+ const parentInstance = parent.__tres ? parent : prepareTresInstance(parent, {}, context);
1242
+ child.__tres.parent = parentInstance;
1243
+ if (parentInstance.__tres.objects) {
1244
+ const insertIndex = anchor ? parentInstance.__tres.objects.findIndex((obj) => obj === anchor) : -1;
1245
+ if (insertIndex >= 0) parentInstance.__tres.objects.splice(insertIndex, 0, child);
1246
+ else parentInstance.__tres.objects.push(child);
1278
1247
  }
1279
1248
  return;
1280
1249
  }
@@ -1309,8 +1278,10 @@ const nodeOps = ({ context, options = { primitivePrefix: "" } }) => {
1309
1278
  }
1310
1279
  dispose = isUndefined(dispose) ? "default" : dispose;
1311
1280
  const userDispose = node.__tres?.dispose;
1312
- if (!isUndefined(userDispose)) if (userDispose === null) dispose = false;
1313
- else dispose = userDispose;
1281
+ if (!isUndefined(userDispose)) {
1282
+ if (userDispose === null) dispose = false;
1283
+ else dispose = userDispose;
1284
+ }
1314
1285
  const isPrimitive = node.__tres?.primitive;
1315
1286
  const shouldDispose = dispose === "default" ? !isPrimitive : !!dispose;
1316
1287
  if (node.__tres && "objects" in node.__tres) [...node.__tres.objects].forEach((obj) => remove(obj, dispose));
@@ -1355,12 +1326,12 @@ const nodeOps = ({ context, options = { primitivePrefix: "" } }) => {
1355
1326
  if (instanceName && prevArgs.length && !isEqual(prevArgs, args)) {
1356
1327
  const newInstance = new catalogue.value[instanceName](...nextValue);
1357
1328
  const descriptors = Object.getOwnPropertyDescriptors(newInstance);
1358
- Object.entries(descriptors).forEach(([key$1, descriptor]) => {
1329
+ Object.entries(descriptors).forEach(([key, descriptor]) => {
1359
1330
  if (!descriptor.writable && !descriptor.set) return;
1360
- if (key$1 in prevNode) try {
1361
- prevNode[key$1] = newInstance[key$1];
1331
+ if (key in prevNode) try {
1332
+ prevNode[key] = newInstance[key];
1362
1333
  } catch (e) {
1363
- console.warn(`Could not set property ${key$1} on ${instanceName}:`, e);
1334
+ console.warn(`Could not set property ${key} on ${instanceName}:`, e);
1364
1335
  }
1365
1336
  });
1366
1337
  root = prevNode;
@@ -1387,19 +1358,23 @@ const nodeOps = ({ context, options = { primitivePrefix: "" } }) => {
1387
1358
  let value = nextValue;
1388
1359
  if (value === "") value = true;
1389
1360
  if (isFunction(target)) {
1390
- if (!isSupportedPointerEvent(prop)) if (Array.isArray(value)) node[finalKey](...value);
1391
- else node[finalKey](value);
1361
+ if (!isSupportedPointerEvent(prop)) {
1362
+ if (Array.isArray(value)) node[finalKey](...value);
1363
+ else node[finalKey](value);
1364
+ }
1392
1365
  if (finalKey.startsWith("on") && isFunction(value)) root[finalKey] = value;
1393
1366
  return;
1394
1367
  }
1395
1368
  if (isLayers(target) && isLayers(value)) target.mask = value.mask;
1396
1369
  else if (isColor(target) && isColorRepresentation(value)) target.set(value);
1397
1370
  else if (isCopyable(target) && isClassInstance(value) && target.constructor === value.constructor) target.copy(value);
1398
- else if (isVectorLike(target) && Array.isArray(value)) if ("fromArray" in target && typeof target.fromArray === "function") target.fromArray(value);
1399
- else target.set(...value);
1400
- else if (isVectorLike(target) && typeof value === "number") if ("setScalar" in target && typeof target.setScalar === "function") target.setScalar(value);
1401
- else target.set(value);
1402
- else root[finalKey] = value;
1371
+ else if (isVectorLike(target) && Array.isArray(value)) {
1372
+ if ("fromArray" in target && typeof target.fromArray === "function") target.fromArray(value);
1373
+ else target.set(...value);
1374
+ } else if (isVectorLike(target) && typeof value === "number") {
1375
+ if ("setScalar" in target && typeof target.setScalar === "function") target.setScalar(value);
1376
+ else target.set(value);
1377
+ } else root[finalKey] = value;
1403
1378
  if (isTresCamera(node)) node.updateProjectionMatrix();
1404
1379
  invalidateInstance(node);
1405
1380
  }
@@ -1431,7 +1406,6 @@ const nodeOps = ({ context, options = { primitivePrefix: "" } }) => {
1431
1406
  insertStaticContent: noop
1432
1407
  };
1433
1408
  };
1434
-
1435
1409
  //#endregion
1436
1410
  //#region src/core/roots.ts
1437
1411
  const _roots = /* @__PURE__ */ new Map();
@@ -1440,7 +1414,6 @@ const setRoot = (canvas, root) => {
1440
1414
  _roots.set(canvas, root);
1441
1415
  };
1442
1416
  const deleteRoot = (canvas) => _roots.delete(canvas);
1443
-
1444
1417
  //#endregion
1445
1418
  //#region src/devtools/DevtoolsMessenger.ts
1446
1419
  const QUEUEABLE_MESSAGE_TYPES = ["asset-load"];
@@ -1512,7 +1485,6 @@ var DevtoolsMessenger = class {
1512
1485
  this.messageQueue = [];
1513
1486
  }
1514
1487
  };
1515
-
1516
1488
  //#endregion
1517
1489
  //#region src/devtools/utils.ts
1518
1490
  /**
@@ -1531,7 +1503,6 @@ function toastMessage(message, type) {
1531
1503
  function __VUE_DEVTOOLS_TOAST__(tresMessage, type) {
1532
1504
  throw new Error(tresMessage + type);
1533
1505
  }
1534
-
1535
1506
  //#endregion
1536
1507
  //#region src/utils/perf.ts
1537
1508
  function calculateMemoryUsage(object) {
@@ -1556,7 +1527,6 @@ function boundedPush(arr, value, max) {
1556
1527
  function bytesToKB(bytes) {
1557
1528
  return (bytes / 1024).toFixed(2);
1558
1529
  }
1559
-
1560
1530
  //#endregion
1561
1531
  //#region src/devtools/setupDevtools.ts
1562
1532
  function setupTresDevtools(ctx) {
@@ -1576,7 +1546,7 @@ function setupTresDevtools(ctx) {
1576
1546
  };
1577
1547
  const updateInterval = 100;
1578
1548
  const fps = useFps({ every: updateInterval });
1579
- const { isSupported, memory } = useMemory({ interval: updateInterval });
1549
+ const { isSupported, memory } = useMemory({ scheduler: (cb) => useIntervalFn(cb, updateInterval) });
1580
1550
  const maxFrames = 160;
1581
1551
  let lastUpdateTime = performance.now();
1582
1552
  let accumulatedTime = 0;
@@ -1607,7 +1577,6 @@ function setupTresDevtools(ctx) {
1607
1577
  pause();
1608
1578
  });
1609
1579
  }
1610
-
1611
1580
  //#endregion
1612
1581
  //#region src/utils/three.ts
1613
1582
  /**
@@ -1624,7 +1593,6 @@ const getObjectByUuid = (node, uuid) => {
1624
1593
  if (found) return found;
1625
1594
  }
1626
1595
  };
1627
-
1628
1596
  //#endregion
1629
1597
  //#region src/devtools/highlight.ts
1630
1598
  var HightlightMesh = class extends THREE.Mesh {
@@ -1640,7 +1608,6 @@ var HightlightMesh = class extends THREE.Mesh {
1640
1608
  this.scale.set(scaleFactor, scaleFactor, scaleFactor);
1641
1609
  }
1642
1610
  };
1643
-
1644
1611
  //#endregion
1645
1612
  //#region src/devtools/inspectorHandlers.ts
1646
1613
  /**
@@ -1754,14 +1721,16 @@ function buildContextGraph(object, node, visited = /* @__PURE__ */ new WeakSet()
1754
1721
  });
1755
1722
  if (value.value && typeof value.value === "object") buildContextGraph(value.value, childNode, visited, depth + 1, maxDepth, uuid, chainedKey);
1756
1723
  else childNode.label = `${key}: ${JSON.stringify(value.value)}`;
1757
- } else if (value && typeof value === "object" && !Array.isArray(value)) if (Object.keys(value).length > 0) if (visited.has(value)) childNode.tags.push({
1758
- label: "Circular",
1759
- textColor: 16711680,
1760
- backgroundColor: 16773360
1761
- });
1762
- else buildContextGraph(value, childNode, visited, depth + 1, maxDepth, uuid, chainedKey);
1763
- else childNode.label = `${key}: {}`;
1764
- else if (Array.isArray(value)) {
1724
+ } else if (value && typeof value === "object" && !Array.isArray(value)) {
1725
+ if (Object.keys(value).length > 0) {
1726
+ if (visited.has(value)) childNode.tags.push({
1727
+ label: "Circular",
1728
+ textColor: 16711680,
1729
+ backgroundColor: 16773360
1730
+ });
1731
+ else buildContextGraph(value, childNode, visited, depth + 1, maxDepth, uuid, chainedKey);
1732
+ } else childNode.label = `${key}: {}`;
1733
+ } else if (Array.isArray(value)) {
1765
1734
  childNode.label = `${key}: Array(${value.length})`;
1766
1735
  childNode.tags.push({
1767
1736
  label: `length: ${value.length}`,
@@ -1778,7 +1747,7 @@ function buildContextGraph(object, node, visited = /* @__PURE__ */ new WeakSet()
1778
1747
  * @returns A function that handles inspector tree payload updates
1779
1748
  */
1780
1749
  const inspectorTreeHandler = (tres) => (payload) => {
1781
- if (payload.inspectorId === INSPECTOR_ID) {
1750
+ if (payload.inspectorId === "tres:inspector") {
1782
1751
  const root = createNode(tres.scene.value);
1783
1752
  buildGraph$1(tres.scene.value, root, payload.filter);
1784
1753
  const rootContext = {
@@ -1800,7 +1769,7 @@ const inspectorTreeHandler = (tres) => (payload) => {
1800
1769
  * @returns A function that handles inspector state payload updates
1801
1770
  */
1802
1771
  const inspectorStateHandler = (tres, { highlightMesh, prevInstance }) => (payload) => {
1803
- if (payload.inspectorId !== INSPECTOR_ID) return;
1772
+ if (payload.inspectorId !== "tres:inspector") return;
1804
1773
  const highlightMaterial = new MeshBasicMaterial({
1805
1774
  color: 11003607,
1806
1775
  transparent: true,
@@ -1862,9 +1831,9 @@ const inspectorStateHandler = (tres, { highlightMesh, prevInstance }) => (payloa
1862
1831
  const match = payload.nodeId.match(/^context-([^-]+(?:-[^-]+)*)-(.+)$/);
1863
1832
  const chainedKey = match ? match[2] : "context";
1864
1833
  if (!chainedKey || chainedKey === "context") {
1865
- payload.state = { object: Object.entries(tres).filter(([key]) => !key.startsWith("_") && key !== "parent").map(([key, value$1]) => ({
1834
+ payload.state = { object: Object.entries(tres).filter(([key]) => !key.startsWith("_") && key !== "parent").map(([key, value]) => ({
1866
1835
  key,
1867
- value: isRef(value$1) ? value$1.value : value$1,
1836
+ value: isRef(value) ? value.value : value,
1868
1837
  editable: false
1869
1838
  })) };
1870
1839
  return;
@@ -1921,7 +1890,7 @@ const editSceneObject = (scene, objectUuid, propertyPath, value) => {
1921
1890
  * @returns A function that handles inspector state edit payload updates
1922
1891
  */
1923
1892
  const inspectorEditStateHandler = (tres) => (payload) => {
1924
- if (payload.inspectorId === INSPECTOR_ID) {
1893
+ if (payload.inspectorId === "tres:inspector") {
1925
1894
  if (payload.nodeId.includes("scene")) {
1926
1895
  const match = payload.nodeId.match(/^scene-(.+)$/);
1927
1896
  const uuid = match ? match[1] : null;
@@ -1930,7 +1899,6 @@ const inspectorEditStateHandler = (tres) => (payload) => {
1930
1899
  }
1931
1900
  }
1932
1901
  };
1933
-
1934
1902
  //#endregion
1935
1903
  //#region src/devtools/plugin.ts
1936
1904
  const INSPECTOR_ID = "tres:inspector";
@@ -1968,10 +1936,9 @@ function registerTresDevtools(app, tres) {
1968
1936
  api.on.editInspectorState(inspectorEditStateHandler(tres));
1969
1937
  });
1970
1938
  }
1971
-
1972
1939
  //#endregion
1973
- //#region src/components/Context.vue?vue&type=script&setup=true&lang.ts
1974
- var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
1940
+ //#region src/components/Context.vue
1941
+ var Context_default = /* @__PURE__ */ defineComponent({
1975
1942
  __name: "Context",
1976
1943
  props: {
1977
1944
  camera: {
@@ -2115,14 +2082,14 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2115
2082
  const scene = shallowRef(new Scene());
2116
2083
  const instance = getCurrentInstance();
2117
2084
  extend(THREE);
2118
- const createInternalComponent = (context$1, hmrTick) => defineComponent({ setup() {
2085
+ const createInternalComponent = (context, hmrTick) => defineComponent({ setup() {
2119
2086
  const ctx = getCurrentInstance()?.appContext;
2120
2087
  if (ctx) ctx.app = instance?.appContext.app;
2121
2088
  const provides = {};
2122
- function mergeProvides(currentInstance$1) {
2123
- if (!currentInstance$1) return;
2124
- if (currentInstance$1.parent) mergeProvides(currentInstance$1.parent);
2125
- if (currentInstance$1.provides) Object.assign(provides, currentInstance$1.provides);
2089
+ function mergeProvides(currentInstance) {
2090
+ if (!currentInstance) return;
2091
+ if (currentInstance.parent) mergeProvides(currentInstance.parent);
2092
+ if (currentInstance.provides) Object.assign(provides, currentInstance.provides);
2126
2093
  }
2127
2094
  if (instance?.parent && props.enableProvideBridge) {
2128
2095
  mergeProvides(instance.parent);
@@ -2130,42 +2097,42 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2130
2097
  provide(key, provides[key]);
2131
2098
  });
2132
2099
  }
2133
- provide(INJECTION_KEY, context$1);
2100
+ provide(INJECTION_KEY, context);
2134
2101
  provide("extend", extend);
2135
- if (typeof window !== "undefined" && ctx?.app) registerTresDevtools(ctx?.app, context$1);
2102
+ if (typeof window !== "undefined" && ctx?.app) registerTresDevtools(ctx?.app, context);
2136
2103
  return () => {
2137
2104
  hmrTick.value;
2138
2105
  return h(Fragment, null, slots.default?.() ?? []);
2139
2106
  };
2140
2107
  } });
2141
- const mountCustomRenderer = (context$1) => {
2108
+ const mountCustomRenderer = (context) => {
2142
2109
  const canvas = props.canvas;
2143
2110
  if (getRoot(canvas)) return;
2144
2111
  const hmrTick = ref(0);
2145
- const internalComponent = createInternalComponent(context$1, hmrTick);
2146
- const renderer$1 = createRenderer(nodeOps({
2147
- context: context$1,
2112
+ const internalComponent = createInternalComponent(context, hmrTick);
2113
+ const renderer = createRenderer(nodeOps({
2114
+ context,
2148
2115
  options: props.customRendererOptions
2149
2116
  }));
2150
- renderer$1.render(h(internalComponent), scene.value);
2117
+ renderer.render(h(internalComponent), scene.value);
2151
2118
  setRoot(canvas, {
2152
- renderer: renderer$1,
2119
+ renderer,
2153
2120
  internalComponent,
2154
2121
  hmrTick,
2155
- context: context$1
2122
+ context
2156
2123
  });
2157
2124
  };
2158
- const dispose = (context$1, force = false) => {
2159
- disposeObject3D(context$1.scene.value);
2125
+ const dispose = (context, force = false) => {
2126
+ disposeObject3D(context.scene.value);
2160
2127
  if (force) {
2161
- context$1.renderer.instance.dispose();
2162
- if (context$1.renderer.instance instanceof WebGLRenderer) {
2163
- context$1.renderer.instance.renderLists.dispose();
2164
- context$1.renderer.instance.forceContextLoss();
2128
+ context.renderer.instance.dispose();
2129
+ if (context.renderer.instance instanceof WebGLRenderer) {
2130
+ context.renderer.instance.renderLists.dispose();
2131
+ context.renderer.instance.forceContextLoss();
2165
2132
  }
2166
2133
  }
2167
2134
  scene.value.__tres = {
2168
- root: context$1,
2135
+ root: context,
2169
2136
  objects: [],
2170
2137
  isUnmounting: true
2171
2138
  };
@@ -2197,14 +2164,14 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2197
2164
  const { camera, renderer } = context.value;
2198
2165
  const { registerCamera, cameras, activeCamera, deregisterCamera } = camera;
2199
2166
  const addDefaultCamera = () => {
2200
- const camera$1 = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, .1, 1e3);
2201
- camera$1.position.set(3, 3, 3);
2202
- camera$1.lookAt(0, 0, 0);
2203
- registerCamera(camera$1);
2167
+ const camera = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, .1, 1e3);
2168
+ camera.position.set(3, 3, 3);
2169
+ camera.lookAt(0, 0, 0);
2170
+ registerCamera(camera);
2204
2171
  const unwatch = watchEffect(() => {
2205
2172
  if (cameras.value.length >= 2) {
2206
- camera$1.removeFromParent();
2207
- deregisterCamera(camera$1);
2173
+ camera.removeFromParent();
2174
+ deregisterCamera(camera);
2208
2175
  unwatch?.();
2209
2176
  }
2210
2177
  });
@@ -2257,15 +2224,12 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2257
2224
  return () => {};
2258
2225
  }
2259
2226
  });
2260
-
2261
- //#endregion
2262
- //#region src/components/Context.vue
2263
- var Context_default = Context_vue_vue_type_script_setup_true_lang_default;
2264
-
2265
2227
  //#endregion
2266
2228
  //#region src/components/TresCanvas.vue?vue&type=script&setup=true&lang.ts
2267
2229
  const _hoisted_1 = ["data-scene", "data-tres"];
2268
- var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
2230
+ //#endregion
2231
+ //#region src/components/TresCanvas.vue
2232
+ var TresCanvas_default = /* @__PURE__ */ defineComponent({
2269
2233
  __name: "TresCanvas",
2270
2234
  props: {
2271
2235
  camera: {
@@ -2476,11 +2440,6 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2476
2440
  };
2477
2441
  }
2478
2442
  });
2479
-
2480
- //#endregion
2481
- //#region src/components/TresCanvas.vue
2482
- var TresCanvas_default = TresCanvas_vue_vue_type_script_setup_true_lang_default;
2483
-
2484
2443
  //#endregion
2485
2444
  //#region src/utils/normalize.ts
2486
2445
  function normalizeVectorFlexibleParam(value) {
@@ -2501,7 +2460,6 @@ function normalizeColor(value) {
2501
2460
  if (Array.isArray(value)) return new Color(...value);
2502
2461
  return new Color(value);
2503
2462
  }
2504
-
2505
2463
  //#endregion
2506
2464
  //#region src/utils/template-compiler-options.ts
2507
2465
  const whitelist = [
@@ -2512,11 +2470,9 @@ const whitelist = [
2512
2470
  "TresPortal"
2513
2471
  ];
2514
2472
  const templateCompilerOptions = { template: { compilerOptions: { isCustomElement: (tag) => (/^Tres[A-Z]/.test(tag) || tag.startsWith("tres-")) && !whitelist.includes(tag) || tag === "primitive" } } };
2515
- var template_compiler_options_default = templateCompilerOptions;
2516
-
2517
2473
  //#endregion
2518
- //#region src/components/TresPortal.vue?vue&type=script&setup=true&lang.ts
2519
- var TresPortal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
2474
+ //#region src/components/TresPortal.vue
2475
+ var TresPortal_default = /* @__PURE__ */ defineComponent({
2520
2476
  __name: "TresPortal",
2521
2477
  props: {
2522
2478
  to: {
@@ -2537,21 +2493,16 @@ var TresPortal_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2537
2493
  };
2538
2494
  }
2539
2495
  });
2540
-
2541
- //#endregion
2542
- //#region src/components/TresPortal.vue
2543
- var TresPortal_default = TresPortal_vue_vue_type_script_setup_true_lang_default;
2544
-
2545
2496
  //#endregion
2546
2497
  //#region src/directives/vDistanceTo.ts
2547
2498
  let arrowHelper = null;
2548
2499
  const vDistanceTo = {
2549
2500
  updated: (el, binding) => {
2550
- const extractBindingPosition = (binding$1) => {
2551
- let observer$1 = binding$1.value;
2552
- if (binding$1.value && isMesh(binding$1.value)) observer$1 = binding$1.value.position;
2553
- if (Array.isArray(binding$1.value)) observer$1 = new Vector3(...observer$1);
2554
- return observer$1;
2501
+ const extractBindingPosition = (binding) => {
2502
+ let observer = binding.value;
2503
+ if (binding.value && isMesh(binding.value)) observer = binding.value.position;
2504
+ if (Array.isArray(binding.value)) observer = new Vector3(...observer);
2505
+ return observer;
2555
2506
  };
2556
2507
  const observer = extractBindingPosition(binding);
2557
2508
  if (!observer) {
@@ -2577,7 +2528,6 @@ const vDistanceTo = {
2577
2528
  if (el.parent) el.parent.remove(arrowHelper);
2578
2529
  }
2579
2530
  };
2580
-
2581
2531
  //#endregion
2582
2532
  //#region src/directives/vLightHelper.ts
2583
2533
  let CurrentHelper;
@@ -2613,7 +2563,6 @@ const vLightHelper = {
2613
2563
  if (el.parent) el.parent.remove(currentInstance);
2614
2564
  }
2615
2565
  };
2616
-
2617
2566
  //#endregion
2618
2567
  //#region src/directives/vLog.ts
2619
2568
  const vLog = { mounted: (el, binding) => {
@@ -2623,13 +2572,10 @@ const vLog = { mounted: (el, binding) => {
2623
2572
  }
2624
2573
  console.log("v-log", el);
2625
2574
  } };
2626
-
2627
2575
  //#endregion
2628
2576
  //#region src/index.ts
2629
2577
  const plugin = { install(app) {
2630
2578
  app.component("TresCanvas", TresCanvas_default);
2631
2579
  } };
2632
- var src_default = plugin;
2633
-
2634
2580
  //#endregion
2635
- export { DevtoolsMessenger, INJECTION_KEY, TresCanvas_default as TresCanvas, Context_default as TresCanvasContext, TresPortal_default as TresPortal, TresRendererError, component_default as UseLoader, buildGraph, catalogue, createTimer, src_default as default, disposeObject3D as dispose, extend, isBufferGeometry, isCamera, isClassInstance, isColor, isColorRepresentation, isCopyable, isFog, isGroup, isLayers, isLight, isMaterial, isMesh, isObject3D, isOrthographicCamera, isPerspectiveCamera, isProd, isScene, isTresCamera, isTresInstance, isTresObject, isTresPrimitive, isVectorLike, isWebGLRenderer, isWebGPURenderer, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, template_compiler_options_default as templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
2581
+ export { DevtoolsMessenger, INJECTION_KEY, TresCanvas_default as TresCanvas, Context_default as TresCanvasContext, TresPortal_default as TresPortal, TresRendererError, component_default as UseLoader, buildGraph, catalogue, createTimer, plugin as default, disposeObject3D as dispose, extend, isBufferGeometry, isCamera, isClassInstance, isColor, isColorRepresentation, isCopyable, isFog, isGroup, isLayers, isLight, isMaterial, isMesh, isObject3D, isOrthographicCamera, isPerspectiveCamera, isProd, isScene, isTresCamera, isTresInstance, isTresObject, isTresPrimitive, isVectorLike, isWebGLRenderer, isWebGPURenderer, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };