@tresjs/core 5.3.0 → 5.3.2

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.3.0
3
+ * version: v5.3.2
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.3.0
3
+ * version: v5.3.2
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
package/dist/tres.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.3.0
3
+ * version: v5.3.2
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- import * as vue8 from "vue";
8
+ import * as vue0 from "vue";
9
9
  import { App, ComputedRef, DefineComponent, MaybeRef, MaybeRefOrGetter, Reactive, Ref, ShallowRef, VNode, VNodeRef } from "vue";
10
10
  import * as THREE from "three";
11
11
  import { BufferGeometry, Camera, Color, ColorRepresentation, ColorSpace, Event, Fog, Group, Layers, Light, Loader, LoadingManager, Material, Mesh, Object3D, Object3DEventMap, OrthographicCamera, PerspectiveCamera, Scene, ShadowMapType, ToneMapping, Vector3, WebGLRenderer } from "three";
@@ -121,6 +121,14 @@ declare const useCameraManager: ({
121
121
  sizes
122
122
  }: UseCameraParams) => UseCameraReturn;
123
123
  //#endregion
124
+ //#region src/utils/error.d.ts
125
+ type TresRendererErrorCode = 'INITIALIZATION_FAILED';
126
+ declare class TresRendererError extends Error {
127
+ readonly code: TresRendererErrorCode;
128
+ readonly name = "TresRendererError";
129
+ constructor(message: string, code: TresRendererErrorCode, options?: ErrorOptions);
130
+ }
131
+ //#endregion
124
132
  //#region src/composables/useRenderer/useRendererManager.d.ts
125
133
  /**
126
134
  * If set to 'on-demand', the scene will only be rendered when the current frame is invalidated
@@ -311,10 +319,13 @@ declare function useRendererManager({
311
319
  advance: () => void;
312
320
  onReady: _vueuse_core0.EventHookOn<TresRenderer>;
313
321
  onRender: _vueuse_core0.EventHookOn<TresRenderer>;
322
+ onError: _vueuse_core0.EventHookOn<TresRendererError>;
314
323
  invalidate: (amountOfFramesToInvalidate?: number) => void;
315
- canBeInvalidated: vue8.ComputedRef<boolean>;
324
+ canBeInvalidated: vue0.ComputedRef<boolean>;
316
325
  mode: "always" | "on-demand" | "manual" | undefined;
317
326
  replaceRenderFunction: (fn: RenderFunction) => void;
327
+ isInitialized: vue0.Ref<boolean, boolean>;
328
+ error: vue0.Ref<TresRendererError | null, TresRendererError | null>;
318
329
  };
319
330
  type UseRendererManagerReturn = ReturnType<typeof useRendererManager>;
320
331
  //#endregion
@@ -499,7 +510,7 @@ declare function buildGraph(object: Object3D | TresObject): TresObjectMap;
499
510
  //#endregion
500
511
  //#region src/composables/useLoader/component.vue.d.ts
501
512
  declare const __VLS_export$1: <T extends TresObjectMap>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
502
- props: vue8.PublicProps & __VLS_PrettifyLocal<{
513
+ props: vue0.PublicProps & __VLS_PrettifyLocal<{
503
514
  /**
504
515
  * The THREE.js loader to use
505
516
  */
@@ -513,8 +524,8 @@ declare const __VLS_export$1: <T extends TresObjectMap>(__VLS_props: NonNullable
513
524
  */
514
525
  manager?: LoadingManager;
515
526
  } & {
516
- onLoaded?: ((result: T) => any) | undefined;
517
527
  onError?: ((error: unknown) => any) | undefined;
528
+ onLoaded?: ((result: T) => any) | undefined;
518
529
  }> & (typeof globalThis extends {
519
530
  __VLS_PROPS_FALLBACK: infer P;
520
531
  } ? P : {});
@@ -522,20 +533,20 @@ declare const __VLS_export$1: <T extends TresObjectMap>(__VLS_props: NonNullable
522
533
  attrs: any;
523
534
  slots: {
524
535
  default?: (props: {
525
- state: vue8.UnwrapRef<T>;
536
+ state: vue0.UnwrapRef<T>;
526
537
  isLoading: boolean;
527
538
  error: unknown;
528
539
  }) => any;
529
540
  };
530
- emit: ((evt: "loaded", result: T) => void) & ((evt: "error", error: unknown) => void);
531
- }>) => vue8.VNode & {
541
+ emit: ((evt: "error", error: unknown) => void) & ((evt: "loaded", result: T) => void);
542
+ }>) => vue0.VNode & {
532
543
  __ctx?: Awaited<typeof __VLS_setup>;
533
544
  };
534
545
  declare const _default$1: typeof __VLS_export$1;
535
546
  type __VLS_PrettifyLocal<T> = (T extends any ? { [K in keyof T]: T[K] } : { [K in keyof T as K]: T[K] }) & {};
536
547
  //#endregion
537
548
  //#region src/composables/useGraph/index.d.ts
538
- declare const useGraph: (object: MaybeRef$1<TresObject | undefined>) => vue8.ComputedRef<TresObjectMap | undefined>;
549
+ declare const useGraph: (object: MaybeRef$1<TresObject | undefined>) => vue0.ComputedRef<TresObjectMap | undefined>;
539
550
  //#endregion
540
551
  //#region src/utils/createPriorityEventHook.d.ts
541
552
  type Callback<T> = Parameters<EventHookOff<T>>[0];
@@ -586,7 +597,7 @@ type LoopContext = RafLoopContext & TresPartialContext;
586
597
  declare const useLoop: () => {
587
598
  stop: () => void;
588
599
  start: () => void;
589
- isActive: Readonly<vue8.ShallowRef<boolean>>;
600
+ isActive: Readonly<vue0.ShallowRef<boolean>>;
590
601
  onBeforeRender: PriorityEventHookOn<LoopContext>;
591
602
  onRender: PriorityEventHookOn<LoopContext>;
592
603
  render: (fn: RenderFunction) => void;
@@ -676,6 +687,7 @@ interface ContextProps extends RendererOptions {
676
687
  }
677
688
  type ContextEmits = {
678
689
  ready: [context: TresContext];
690
+ error: [error: Error];
679
691
  pointermissed: [event: TresPointerEvent];
680
692
  render: [context: TresContext];
681
693
  beforeLoop: [context: TresContextWithClock];
@@ -692,7 +704,7 @@ interface TresCanvasInstance {
692
704
  type __VLS_Slots = {
693
705
  default: () => any;
694
706
  };
695
- declare const __VLS_base: vue8.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue8.ComponentOptionsMixin, vue8.ComponentOptionsMixin, {
707
+ declare const __VLS_base: vue0.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue0.ComponentOptionsMixin, vue0.ComponentOptionsMixin, {
696
708
  click: (event: TresPointerEvent) => any;
697
709
  contextmenu: (event: TresPointerEvent) => any;
698
710
  pointermove: (event: TresPointerEvent) => any;
@@ -707,11 +719,12 @@ declare const __VLS_base: vue8.DefineComponent<ContextProps, TresCanvasInstance,
707
719
  lostpointercapture: (event: TresPointerEvent) => any;
708
720
  wheel: (event: TresPointerEvent) => any;
709
721
  ready: (context: TresContext) => any;
722
+ error: (error: Error) => any;
710
723
  pointermissed: (event: TresPointerEvent) => any;
711
724
  render: (context: TresContext) => any;
712
725
  beforeLoop: (context: TresContextWithClock) => any;
713
726
  loop: (context: TresContextWithClock) => any;
714
- }, string, vue8.PublicProps, Readonly<ContextProps> & Readonly<{
727
+ }, string, vue0.PublicProps, Readonly<ContextProps> & Readonly<{
715
728
  onClick?: ((event: TresPointerEvent) => any) | undefined;
716
729
  onContextmenu?: ((event: TresPointerEvent) => any) | undefined;
717
730
  onPointermove?: ((event: TresPointerEvent) => any) | undefined;
@@ -726,13 +739,13 @@ declare const __VLS_base: vue8.DefineComponent<ContextProps, TresCanvasInstance,
726
739
  onLostpointercapture?: ((event: TresPointerEvent) => any) | undefined;
727
740
  onWheel?: ((event: TresPointerEvent) => any) | undefined;
728
741
  onReady?: ((context: TresContext) => any) | undefined;
742
+ onError?: ((error: Error) => any) | undefined;
729
743
  onPointermissed?: ((event: TresPointerEvent) => any) | undefined;
730
744
  onRender?: ((context: TresContext) => any) | undefined;
731
745
  onBeforeLoop?: ((context: TresContextWithClock) => any) | undefined;
732
746
  onLoop?: ((context: TresContextWithClock) => any) | undefined;
733
747
  }>, {
734
748
  windowSize: boolean;
735
- enableProvideBridge: boolean;
736
749
  antialias: boolean;
737
750
  stencil: boolean;
738
751
  depth: boolean;
@@ -747,7 +760,8 @@ declare const __VLS_base: vue8.DefineComponent<ContextProps, TresCanvasInstance,
747
760
  shadowMapType: THREE.ShadowMapType;
748
761
  useLegacyLights: boolean;
749
762
  renderMode: "always" | "on-demand" | "manual";
750
- }, {}, {}, {}, string, vue8.ComponentProvideOptions, false, {}, any>;
763
+ enableProvideBridge: boolean;
764
+ }, {}, {}, {}, string, vue0.ComponentProvideOptions, false, {}, any>;
751
765
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
752
766
  declare const _default: typeof __VLS_export;
753
767
  type __VLS_WithSlots<T, S> = T & {
@@ -992,7 +1006,7 @@ declare const isFog: (value: unknown) => value is Fog;
992
1006
  * }
993
1007
  * ```
994
1008
  */
995
- declare const isScene: (value: unknown) => value is Scene;
1009
+ declare const isScene: (value: unknown) => value is Scene<THREE.Object3DEventMap>;
996
1010
  /**
997
1011
  * Type guard to check if a value is a Three.js Group
998
1012
  * @param value - The value to check
@@ -1081,4 +1095,4 @@ interface TresPlugin {
1081
1095
  }
1082
1096
  declare const plugin: TresPlugin;
1083
1097
  //#endregion
1084
- export { Args, AssetLoadData, AttachFnType, AttachType, ConstructorRepresentation, DevtoolsMessage, DevtoolsMessageType, DevtoolsMessenger, DevtoolsSubscriber, DisposeType, ElementProps, InstanceProps, LoaderMethods, LoaderProto, LocalState, LoopContext, MathType, Mutable, NonFunctionKeys, Overwrite, Properties, RenderFunction, RenderMode, RendererOptions, ThreeElement, ThreeInstances, TresCamera, _default as TresCanvas, type TresCanvasEmits, type TresCanvasInstance, type TresCanvasProps, TresCatalogue, TresColor, TresColorArray, TresComponents, type TresContext, TresContextWithClock, TresControl, type TresCustomRendererOptions, TresEuler, TresInstance, TresLayers, TresLoader, TresLoaderOptions, TresMaterial, TresObject, TresObject3D, TresObjectMap, TresOptions, TresPartialContext, TresPlugin, type TresPointerEvent, TresPrimitive, TresQuaternion, TresRenderer, TresRendererSetupContext, TresScene, TresVector2, TresVector3, TresVector4, UseCameraReturn, _default$1 as UseLoader, UseLoaderReturn, UseRendererManagerReturn, UseRendererOptions, VectorCoordinates, type VectorFlexibleParams, VueProps, WithMathProps, buildGraph, catalogue, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
1098
+ export { Args, AssetLoadData, AttachFnType, AttachType, ConstructorRepresentation, DevtoolsMessage, DevtoolsMessageType, DevtoolsMessenger, DevtoolsSubscriber, DisposeType, ElementProps, InstanceProps, LoaderMethods, LoaderProto, LocalState, LoopContext, MathType, Mutable, NonFunctionKeys, Overwrite, Properties, RenderFunction, RenderMode, RendererOptions, ThreeElement, ThreeInstances, TresCamera, _default as TresCanvas, type TresCanvasEmits, type TresCanvasInstance, type TresCanvasProps, TresCatalogue, TresColor, TresColorArray, TresComponents, type TresContext, TresContextWithClock, TresControl, type TresCustomRendererOptions, TresEuler, TresInstance, TresLayers, TresLoader, TresLoaderOptions, TresMaterial, TresObject, TresObject3D, TresObjectMap, TresOptions, TresPartialContext, TresPlugin, type TresPointerEvent, TresPrimitive, TresQuaternion, TresRenderer, TresRendererError, TresRendererErrorCode, TresRendererSetupContext, TresScene, TresVector2, TresVector3, TresVector4, UseCameraReturn, _default$1 as UseLoader, UseLoaderReturn, UseRendererManagerReturn, UseRendererOptions, VectorCoordinates, type VectorFlexibleParams, VueProps, WithMathProps, buildGraph, catalogue, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
package/dist/tres.js CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.3.0
3
+ * version: v5.3.2
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- import { Fragment, camelize, computed, createBlock, createCommentVNode, createElementBlock, createRenderer, defineComponent, getCurrentInstance, h, isRef, mergeProps, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, reactive, readonly, ref, renderSlot, shallowRef, toHandlerKey, toRef, toValue, unref, useSlots, watch, watchEffect, withCtx } from "vue";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createRenderer, defineComponent, getCurrentInstance, h, isRef, mergeProps, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, provide, reactive, readonly, ref, renderSlot, shallowRef, toValue, unref, useSlots, watch, watchEffect, withCtx } from "vue";
9
9
  import * as THREE from "three";
10
10
  import { ACESFilmicToneMapping, ArrowHelper, BackSide, BufferAttribute, BufferGeometry, Clock, Color, DirectionalLightHelper, DoubleSide, Float32BufferAttribute, HemisphereLightHelper, Layers, Line, LineBasicMaterial, Material, MathUtils, Mesh, MeshBasicMaterial, Object3D, PCFSoftShadowMap, PerspectiveCamera, PointLightHelper, Scene, SpotLightHelper, Vector3, WebGLRenderer } from "three";
11
11
  import { createEventHook, createInjectionState, promiseTimeout, refDebounced, tryOnScopeDispose, unrefElement, useAsyncState, useDevicePixelRatio, useElementSize, useFps, useMemory, useRafFn, useTimeout, useWindowSize, whenever } from "@vueuse/core";
@@ -14,7 +14,7 @@ import { forwardHtmlEvents, getVoidObject } from "@pmndrs/pointer-events";
14
14
  import { setupDevtoolsPlugin } from "@vue/devtools-api";
15
15
 
16
16
  //#region package.json
17
- var version = "5.3.0";
17
+ var version = "5.3.2";
18
18
 
19
19
  //#endregion
20
20
  //#region src/utils/makeMap.ts
@@ -753,6 +753,16 @@ const useCreateRafLoop = (cycleFn) => {
753
753
  };
754
754
  };
755
755
 
756
+ //#endregion
757
+ //#region src/utils/error.ts
758
+ var TresRendererError = class extends Error {
759
+ name = "TresRendererError";
760
+ constructor(message, code, options) {
761
+ super(message, options);
762
+ this.code = code;
763
+ }
764
+ };
765
+
756
766
  //#endregion
757
767
  //#region src/composables/useRenderer/useRendererManager.ts
758
768
  function useRendererManager({ scene, canvas, options, contextParts: { sizes, camera } }) {
@@ -795,11 +805,26 @@ function useRendererManager({ scene, canvas, options, contextParts: { sizes, cam
795
805
  const isModeAlways = computed(() => toValue(options.renderMode) === "always");
796
806
  const isRenderer = (value) => isObject(value) && "isRenderer" in value && Boolean(value.isRenderer);
797
807
  const readyEventHook = createEventHook();
808
+ const errorEventHook = createEventHook();
798
809
  let hasTriggeredReady = false;
799
- if (isRenderer(renderer)) {
800
- renderer.init();
801
- readyEventHook.trigger(renderer);
802
- }
810
+ const isInitialized = ref(false);
811
+ const error = ref(null);
812
+ const initializeRenderer = async () => {
813
+ try {
814
+ if (isRenderer(renderer)) await renderer.init();
815
+ isInitialized.value = true;
816
+ } catch (e) {
817
+ const rendererError = new TresRendererError(e instanceof Error ? e.message : "Unknown error", "INITIALIZATION_FAILED", { cause: e instanceof Error ? e : void 0 });
818
+ error.value = rendererError;
819
+ console.error(`[TresJS] Renderer initialization failed. This may occur if:
820
+ - WebGPU is not supported by your browser
821
+ - GPU is not available or lacks required features
822
+ - GPU drivers are outdated
823
+ Error details: ${rendererError.message}`, rendererError);
824
+ errorEventHook.trigger(rendererError);
825
+ }
826
+ };
827
+ initializeRenderer();
803
828
  const renderEventHook = createEventHook();
804
829
  const notifyFrameRendered = () => {
805
830
  frames.value = isModeAlways.value ? 1 : Math.max(0, frames.value - 1);
@@ -817,8 +842,15 @@ function useRendererManager({ scene, canvas, options, contextParts: { sizes, cam
817
842
  const loop = useCreateRafLoop(() => {
818
843
  if (frames.value) renderFunction(notifyFrameRendered);
819
844
  });
820
- readyEventHook.on(loop.start);
821
- watch([sizes.width, sizes.height], () => {
845
+ readyEventHook.on(() => {
846
+ if (isInitialized.value) loop.start();
847
+ });
848
+ watch([
849
+ sizes.width,
850
+ sizes.height,
851
+ isInitialized
852
+ ], () => {
853
+ if (!isInitialized.value) return;
822
854
  renderer.setSize(sizes.width.value, sizes.height.value);
823
855
  if (!hasTriggeredReady && renderer.domElement.width && renderer.domElement.height) {
824
856
  readyEventHook.trigger(renderer);
@@ -827,6 +859,7 @@ function useRendererManager({ scene, canvas, options, contextParts: { sizes, cam
827
859
  invalidateOnDemand();
828
860
  }, { immediate: true });
829
861
  watchEffect(() => {
862
+ if (!isInitialized.value) return;
830
863
  setPixelRatio(renderer, sizes.pixelRatio.value, toValue(options.dpr));
831
864
  });
832
865
  if (toValue(options.renderMode) === "on-demand") invalidate();
@@ -846,29 +879,35 @@ function useRendererManager({ scene, canvas, options, contextParts: { sizes, cam
846
879
  };
847
880
  });
848
881
  watchEffect(() => {
882
+ if (!isInitialized.value) return;
849
883
  const value = clearColorAndAlpha.value;
850
884
  if (value.color === void 0 || value.alpha === void 0) return;
851
885
  renderer.setClearColor(value.color, value.alpha);
852
886
  });
853
887
  watchEffect(() => {
888
+ if (!isInitialized.value) return;
854
889
  const value = options.toneMapping;
855
890
  if (value) renderer.toneMapping = value;
856
891
  });
857
892
  watchEffect(() => {
893
+ if (!isInitialized.value) return;
858
894
  const value = options.toneMappingExposure;
859
895
  if (value) renderer.toneMappingExposure = value;
860
896
  });
861
897
  watchEffect(() => {
898
+ if (!isInitialized.value) return;
862
899
  const value = options.outputColorSpace;
863
900
  if (value) renderer.outputColorSpace = value;
864
901
  });
865
902
  watchEffect(() => {
903
+ if (!isInitialized.value) return;
866
904
  const value = options.shadows;
867
905
  if (value === void 0) return;
868
906
  renderer.shadowMap.enabled = value;
869
907
  forceMaterialUpdate();
870
908
  });
871
909
  watchEffect(() => {
910
+ if (!isInitialized.value) return;
872
911
  const value = options.shadowMapType;
873
912
  if (value === void 0) return;
874
913
  renderer.shadowMap.type = value;
@@ -884,10 +923,13 @@ function useRendererManager({ scene, canvas, options, contextParts: { sizes, cam
884
923
  advance,
885
924
  onReady: readyEventHook.on,
886
925
  onRender: renderEventHook.on,
926
+ onError: errorEventHook.on,
887
927
  invalidate,
888
928
  canBeInvalidated,
889
929
  mode: toValue(options.renderMode),
890
- replaceRenderFunction
930
+ replaceRenderFunction,
931
+ isInitialized,
932
+ error
891
933
  };
892
934
  }
893
935
 
@@ -1924,6 +1966,7 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
1924
1966
  },
1925
1967
  emits: [
1926
1968
  "ready",
1969
+ "error",
1927
1970
  "pointermissed",
1928
1971
  "render",
1929
1972
  "beforeLoop",
@@ -2008,7 +2051,6 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2008
2051
  };
2009
2052
  const { camera, renderer } = context.value;
2010
2053
  const { registerCamera, cameras, activeCamera, deregisterCamera } = camera;
2011
- mountCustomRenderer(context.value);
2012
2054
  const addDefaultCamera = () => {
2013
2055
  const camera$1 = new PerspectiveCamera(45, window.innerWidth / window.innerHeight, .1, 1e3);
2014
2056
  camera$1.position.set(3, 3, 3);
@@ -2032,7 +2074,6 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2032
2074
  deregisterCamera(toValue(oldCamera));
2033
2075
  }
2034
2076
  }, { immediate: true });
2035
- if (!activeCamera.value) addDefaultCamera();
2036
2077
  renderer.onRender(() => {
2037
2078
  if (context.value) emit("render", context.value);
2038
2079
  });
@@ -2049,7 +2090,12 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2049
2090
  });
2050
2091
  });
2051
2092
  renderer.onReady(() => {
2093
+ mountCustomRenderer(context.value, false);
2052
2094
  emit("ready", context.value);
2095
+ if (!activeCamera.value) addDefaultCamera();
2096
+ });
2097
+ renderer.onError((error) => {
2098
+ emit("error", error);
2053
2099
  });
2054
2100
  if (import.meta.hot) import.meta.hot.on("vite:afterUpdate", () => handleHMR(context.value));
2055
2101
  onMounted(async () => {
@@ -2065,78 +2111,6 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2065
2111
  //#region src/components/Context.vue
2066
2112
  var Context_default = Context_vue_vue_type_script_setup_true_lang_default;
2067
2113
 
2068
- //#endregion
2069
- //#region src/composables/useForwardProps/index.ts
2070
- /**
2071
- * The `useForwardProps` function in TypeScript takes in a set of props and returns a computed value
2072
- * that combines default props with assigned props from the current instance.
2073
- * @param {T} props - The `props` parameter is an object that represents the props passed to a
2074
- * component.
2075
- * @returns computed value that combines the default props, preserved props, and assigned props.
2076
- */
2077
- const useForwardProps = (props) => {
2078
- const vm = getCurrentInstance();
2079
- const defaultProps = Object.keys(vm?.type.props ?? {}).reduce((prev, curr) => {
2080
- const defaultValue = (vm?.type.props[curr]).default;
2081
- if (defaultValue !== void 0) prev[curr] = defaultValue;
2082
- return prev;
2083
- }, {});
2084
- const refProps = toRef(props);
2085
- return computed(() => {
2086
- const preservedProps = {};
2087
- const assignedProps = vm?.vnode.props ?? {};
2088
- Object.keys(assignedProps).forEach((key) => {
2089
- preservedProps[camelize(key)] = assignedProps[key];
2090
- });
2091
- return Object.keys({
2092
- ...defaultProps,
2093
- ...preservedProps
2094
- }).reduce((prev, curr) => {
2095
- if (refProps.value[curr] !== void 0) prev[curr] = refProps.value[curr];
2096
- return prev;
2097
- }, {});
2098
- });
2099
- };
2100
- /**
2101
- * The `useEmitAsProps` function is a TypeScript utility that converts emitted events into props for a
2102
- * Vue component.
2103
- * @param emit - The `emit` parameter is a function that is used to emit events from a component. It
2104
- * takes two parameters: `name` which is the name of the event to be emitted, and `...args` which are
2105
- * the arguments to be passed along with the event.
2106
- * @returns The function `useEmitAsProps` returns an object that maps event names to functions that
2107
- * call the `emit` function with the corresponding event name and arguments.
2108
- */
2109
- const useEmitAsProps = (emit) => {
2110
- const vm = getCurrentInstance();
2111
- const events = vm?.type.emits;
2112
- const result = {};
2113
- if (!events?.length) console.warn(`No emitted event found. Please check component: ${vm?.type.__name}`);
2114
- events?.forEach((ev) => {
2115
- result[toHandlerKey(camelize(ev))] = (...arg) => emit(ev, ...arg);
2116
- });
2117
- return result;
2118
- };
2119
- /**
2120
- * The function `useForwardPropsEmits` takes in props and an optional emit function, and returns a
2121
- * computed object that combines the parsed props and emits as props.
2122
- * @param {T} props - The `props` parameter is of type `T`, which is a generic type that extends the
2123
- * parameters of the `useForwardProps` function. It represents the props object that is passed to the
2124
- * `useForwardProps` function.
2125
- * @param [emit] - The `emit` parameter is a function that can be used to emit events. It takes two
2126
- * arguments: `name`, which is the name of the event to be emitted, and `args`, which are the arguments
2127
- * to be passed along with the event.
2128
- * @returns a computed property that combines the parsed
2129
- * props and emits as props.
2130
- */
2131
- const useForwardPropsEmits = (props, emit) => {
2132
- const parsedProps = useForwardProps(props);
2133
- const emitsAsProps = emit ? useEmitAsProps(emit) : {};
2134
- return computed(() => ({
2135
- ...parsedProps.value,
2136
- ...emitsAsProps
2137
- }));
2138
- };
2139
-
2140
2114
  //#endregion
2141
2115
  //#region src/components/TresCanvas.vue?vue&type=script&setup=true&lang.ts
2142
2116
  const _hoisted_1 = ["data-scene", "data-tres"];
@@ -2266,6 +2240,7 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2266
2240
  },
2267
2241
  emits: [
2268
2242
  "ready",
2243
+ "error",
2269
2244
  "pointermissed",
2270
2245
  "render",
2271
2246
  "beforeLoop",
@@ -2295,7 +2270,6 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2295
2270
  },
2296
2271
  dispose: () => contextRef.value?.dispose()
2297
2272
  });
2298
- const forwardedPropsEmits = useForwardPropsEmits(props, emit);
2299
2273
  return (_ctx, _cache) => {
2300
2274
  return openBlock(), createElementBlock("canvas", {
2301
2275
  ref_key: "canvasRef",
@@ -2319,7 +2293,27 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2319
2293
  ref_key: "contextRef",
2320
2294
  ref: contextRef,
2321
2295
  canvas: canvasRef.value
2322
- }, unref(forwardedPropsEmits)), {
2296
+ }, props, {
2297
+ onReady: _cache[0] || (_cache[0] = ($event) => emit("ready", $event)),
2298
+ onError: _cache[1] || (_cache[1] = ($event) => emit("error", $event)),
2299
+ onPointermissed: _cache[2] || (_cache[2] = ($event) => emit("pointermissed", $event)),
2300
+ onRender: _cache[3] || (_cache[3] = ($event) => emit("render", $event)),
2301
+ onBeforeLoop: _cache[4] || (_cache[4] = ($event) => emit("beforeLoop", $event)),
2302
+ onLoop: _cache[5] || (_cache[5] = ($event) => emit("loop", $event)),
2303
+ onClick: _cache[6] || (_cache[6] = ($event) => emit("click", $event)),
2304
+ onContextmenu: _cache[7] || (_cache[7] = ($event) => emit("contextmenu", $event)),
2305
+ onPointermove: _cache[8] || (_cache[8] = ($event) => emit("pointermove", $event)),
2306
+ onPointerenter: _cache[9] || (_cache[9] = ($event) => emit("pointerenter", $event)),
2307
+ onPointerleave: _cache[10] || (_cache[10] = ($event) => emit("pointerleave", $event)),
2308
+ onPointerover: _cache[11] || (_cache[11] = ($event) => emit("pointerover", $event)),
2309
+ onPointerout: _cache[12] || (_cache[12] = ($event) => emit("pointerout", $event)),
2310
+ onDblclick: _cache[13] || (_cache[13] = ($event) => emit("dblclick", $event)),
2311
+ onPointerdown: _cache[14] || (_cache[14] = ($event) => emit("pointerdown", $event)),
2312
+ onPointerup: _cache[15] || (_cache[15] = ($event) => emit("pointerup", $event)),
2313
+ onPointercancel: _cache[16] || (_cache[16] = ($event) => emit("pointercancel", $event)),
2314
+ onLostpointercapture: _cache[17] || (_cache[17] = ($event) => emit("lostpointercapture", $event)),
2315
+ onWheel: _cache[18] || (_cache[18] = ($event) => emit("wheel", $event))
2316
+ }), {
2323
2317
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
2324
2318
  _: 3
2325
2319
  }, 16, ["canvas"])) : createCommentVNode("v-if", true)], 14, _hoisted_1);
@@ -2399,7 +2393,7 @@ const vDistanceTo = {
2399
2393
  };
2400
2394
 
2401
2395
  //#endregion
2402
- //#region ../../node_modules/.pnpm/three-stdlib@2.36.1_three@0.180.0/node_modules/three-stdlib/helpers/RectAreaLightHelper.js
2396
+ //#region ../../node_modules/.pnpm/three-stdlib@2.36.1_three@0.181.2/node_modules/three-stdlib/helpers/RectAreaLightHelper.js
2403
2397
  var RectAreaLightHelper = class extends Line {
2404
2398
  constructor(light, color) {
2405
2399
  const positions = [
@@ -2532,4 +2526,4 @@ const plugin = { install(app) {
2532
2526
  var src_default = plugin;
2533
2527
 
2534
2528
  //#endregion
2535
- export { DevtoolsMessenger, TresCanvas_default as TresCanvas, component_default as UseLoader, buildGraph, catalogue, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, template_compiler_options_default as templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
2529
+ export { DevtoolsMessenger, TresCanvas_default as TresCanvas, TresRendererError, component_default as UseLoader, buildGraph, catalogue, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, template_compiler_options_default as templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "type": "module",
4
- "version": "5.3.0",
4
+ "version": "5.3.2",
5
5
  "description": "Declarative ThreeJS using Vue Components",
6
6
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
7
7
  "license": "MIT",
@@ -51,7 +51,7 @@
51
51
  "radashi": "^12.6.2"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/three": "^0.180.0",
54
+ "@types/three": "^0.181.0",
55
55
  "@typescript-eslint/eslint-plugin": "^8.42.0",
56
56
  "@typescript-eslint/parser": "^8.42.0",
57
57
  "@vitejs/plugin-vue": "^6.0.1",
@@ -66,7 +66,7 @@
66
66
  "rollup-plugin-analyzer": "^4.0.0",
67
67
  "rollup-plugin-copy": "^3.5.0",
68
68
  "rollup-plugin-visualizer": "^6.0.3",
69
- "three": "^0.180.0",
69
+ "three": "^0.181.0",
70
70
  "tsdown": "0.18.3",
71
71
  "typescript": "^5.8.3",
72
72
  "vite": "^7.1.9",