@tresjs/core 5.8.3 → 5.9.1

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.8.3
3
+ * version: v5.9.1
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.8.3
3
+ * version: v5.9.1
4
4
  * (c) 2026
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
@@ -10,7 +10,8 @@ const whitelist = [
10
10
  "TresCanvas",
11
11
  "TresCanvasContext",
12
12
  "TresLeches",
13
- "TresScene"
13
+ "TresScene",
14
+ "TresPortal"
14
15
  ];
15
16
  const templateCompilerOptions = { template: { compilerOptions: { isCustomElement: (tag) => (/^Tres[A-Z]/.test(tag) || tag.startsWith("tres-")) && !whitelist.includes(tag) || tag === "primitive" } } };
16
17
  var template_compiler_options_default = templateCompilerOptions;
package/dist/tres.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.8.3
3
+ * version: v5.9.1
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 vue14 from "vue";
8
+ import * as vue20 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";
@@ -87,7 +87,7 @@ interface UseCameraReturn {
87
87
  /**
88
88
  * The list of cameras
89
89
  */
90
- cameras: Ref<TresCamera[]>;
90
+ cameras: ShallowRef<TresCamera[]>;
91
91
  /**
92
92
  * Register a camera
93
93
  * @param camera - The camera to register
@@ -247,10 +247,10 @@ interface RendererOptions {
247
247
  * Type of shadow map to use for shadow calculations
248
248
  * - `BasicShadowMap`: Basic shadow map.
249
249
  * - `PCFShadowMap`: Percentage-Closer Filtering shadow map.
250
- * - `PCFSoftShadowMap`: Percentage-Closer Filtering soft shadow map.
250
+ * - `PCFSoftShadowMap`: Deprecated on WebGL, three falls back to `PCFShadowMap`. Still supported on WebGPU.
251
251
  * - `VSMShadowMap`: Variance shadow map.
252
252
  * @see {@link https://threejs.org/docs/#api/en/constants/Renderer}
253
- * @default PCFSoftShadowMap (Opinionated default by TresJS)
253
+ * @default PCFShadowMap on WebGL, PCFSoftShadowMap on WebGPU (Opinionated default by TresJS)
254
254
  */
255
255
  shadowMapType?: ShadowMapType;
256
256
  /**
@@ -323,11 +323,11 @@ declare function useRendererManager({
323
323
  onRender: _vueuse_core0.EventHookOn<TresRenderer>;
324
324
  onError: _vueuse_core0.EventHookOn<TresRendererError>;
325
325
  invalidate: (amountOfFramesToInvalidate?: number) => void;
326
- canBeInvalidated: vue14.ComputedRef<boolean>;
326
+ canBeInvalidated: vue20.ComputedRef<boolean>;
327
327
  mode: "always" | "on-demand" | "manual" | undefined;
328
328
  replaceRenderFunction: (fn: RenderFunction) => void;
329
- isInitialized: vue14.Ref<boolean, boolean>;
330
- error: vue14.Ref<TresRendererError | null, TresRendererError | null>;
329
+ isInitialized: vue20.Ref<boolean, boolean>;
330
+ error: vue20.Ref<TresRendererError | null, TresRendererError | null>;
331
331
  };
332
332
  type UseRendererManagerReturn = ReturnType<typeof useRendererManager>;
333
333
  //#endregion
@@ -354,8 +354,18 @@ interface TresContext {
354
354
  camera: UseCameraReturn;
355
355
  controls: Ref<TresControl | null>;
356
356
  renderer: UseRendererManagerReturn;
357
+ /**
358
+ * Whether the active renderer is a Three.js WebGPU `Renderer` (as opposed to a
359
+ * `WebGLRenderer`). Reactive so downstream components can branch on it without
360
+ * re-deriving it from `renderer.instance`.
361
+ *
362
+ * Note: this reflects the renderer instance, not the active backend — a
363
+ * `WebGPURenderer` running on its WebGL2 fallback still reports `true`.
364
+ */
365
+ isWebGPU: ComputedRef<boolean>;
357
366
  events: ReturnType<typeof useEventManager>;
358
367
  }
368
+ declare const INJECTION_KEY = "useTres";
359
369
  declare const useTresContextProvider: (args_0: {
360
370
  scene: TresScene;
361
371
  canvas: MaybeRef<HTMLCanvasElement>;
@@ -445,17 +455,18 @@ interface TresScene extends THREE.Scene {
445
455
  };
446
456
  }
447
457
  interface MathRepresentation {
448
- set(...args: number[] | [THREE.ColorRepresentation]): any;
458
+ set(...args: number[]): any;
449
459
  }
450
460
  interface VectorRepresentation extends MathRepresentation {
451
461
  setScalar(s: number): any;
452
462
  }
463
+ type MathTypes = MathRepresentation | THREE.Euler | THREE.Color;
453
464
  interface VectorCoordinates {
454
465
  x: number;
455
466
  y: number;
456
467
  z: number;
457
468
  }
458
- type MathType<T extends MathRepresentation | THREE.Euler> = T extends THREE.Color ? ConstructorParameters<typeof THREE.Color> | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters<T['set']> | number | VectorCoordinates : T | Parameters<T['set']>;
469
+ type MathType<T extends MathTypes> = T extends THREE.Color ? ConstructorParameters<typeof THREE.Color> | THREE.ColorRepresentation : T extends VectorRepresentation | THREE.Layers | THREE.Euler ? T | Parameters<T['set']> | number | VectorCoordinates : T | Parameters<T['set']>;
459
470
  type VectorLike$1<VectorClass extends THREE.Vector2 | THREE.Vector3 | THREE.Vector4> = VectorClass | Parameters<VectorClass['set']> | Readonly<Parameters<VectorClass['set']>> | Parameters<VectorClass['setScalar']>[0];
460
471
  type TresVector2 = VectorLike$1<THREE.Vector2>;
461
472
  type TresVector3 = VectorLike$1<THREE.Vector3>;
@@ -472,7 +483,7 @@ type TresContextWithClock = TresContext & {
472
483
  delta: number;
473
484
  elapsed: number;
474
485
  };
475
- type WithMathProps<P> = { [K in keyof P]: P[K] extends MathRepresentation | THREE.Euler ? MathType<P[K]> : P[K] };
486
+ type WithMathProps<P> = { [K in keyof P]: P[K] extends MathTypes ? MathType<P[K]> : P[K] };
476
487
  interface RaycastableRepresentation {
477
488
  raycast: (raycaster: THREE.Raycaster, intersects: THREE.Intersection[]) => void;
478
489
  }
@@ -514,8 +525,8 @@ interface TresObjectMap {
514
525
  declare function buildGraph(object: Object3D | TresObject): TresObjectMap;
515
526
  //#endregion
516
527
  //#region src/composables/useLoader/component.vue.d.ts
517
- declare const __VLS_export$2: <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<{
518
- props: vue14.PublicProps & __VLS_PrettifyLocal<{
528
+ declare const __VLS_export$3: <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<{
529
+ props: vue20.PublicProps & __VLS_PrettifyLocal<{
519
530
  /**
520
531
  * The THREE.js loader to use
521
532
  */
@@ -539,20 +550,20 @@ declare const __VLS_export$2: <T extends TresObjectMap>(__VLS_props: NonNullable
539
550
  attrs: any;
540
551
  slots: {
541
552
  default?: (props: {
542
- state: vue14.UnwrapRef<T>;
553
+ state: vue20.UnwrapRef<T>;
543
554
  isLoading: boolean;
544
555
  error: unknown;
545
556
  }) => any;
546
557
  };
547
558
  emit: ((evt: "error", error: unknown) => void) & ((evt: "loaded", result: T) => void);
548
- }>) => vue14.VNode & {
559
+ }>) => vue20.VNode & {
549
560
  __ctx?: Awaited<typeof __VLS_setup>;
550
561
  };
551
- declare const _default$2: typeof __VLS_export$2;
562
+ declare const _default$3: typeof __VLS_export$3;
552
563
  type __VLS_PrettifyLocal<T> = (T extends any ? { [K in keyof T]: T[K] } : { [K in keyof T as K]: T[K] }) & {};
553
564
  //#endregion
554
565
  //#region src/composables/useGraph/index.d.ts
555
- declare const useGraph: (object: MaybeRef<TresObject | undefined>) => vue14.ComputedRef<TresObjectMap | undefined>;
566
+ declare const useGraph: (object: MaybeRef<TresObject | undefined>) => vue20.ComputedRef<TresObjectMap | undefined>;
556
567
  //#endregion
557
568
  //#region src/utils/createPriorityEventHook.d.ts
558
569
  type Callback<T> = Parameters<EventHookOff<T>>[0];
@@ -603,7 +614,7 @@ type LoopContext = RafLoopContext & TresPartialContext;
603
614
  declare const useLoop: () => {
604
615
  stop: () => void;
605
616
  start: () => void;
606
- isActive: Readonly<vue14.ShallowRef<boolean>>;
617
+ isActive: Readonly<vue20.ShallowRef<boolean>>;
607
618
  onBeforeRender: PriorityEventHookOn<LoopContext>;
608
619
  onRender: PriorityEventHookOn<LoopContext>;
609
620
  render: (fn: RenderFunction) => void;
@@ -704,16 +715,17 @@ type ContextEmits = {
704
715
  beforeLoop: [context: TresContextWithClock];
705
716
  loop: [context: TresContextWithClock];
706
717
  } & { [key in TresPointerEventName]: [event: TresPointerEvent] };
707
- type __VLS_Props = ContextProps & {
718
+ type __VLS_Props$1 = ContextProps & {
708
719
  canvas: HTMLCanvasElement;
709
720
  };
710
- type __VLS_Slots$1 = {
721
+ type __VLS_Slots$2 = {
711
722
  default: () => any;
712
723
  };
713
- declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
714
- context: vue14.ShallowRef<TresContext, TresContext>;
724
+ declare const __VLS_base$2: vue20.DefineComponent<__VLS_Props$1, {
725
+ context: vue20.ShallowRef<TresContext, TresContext>;
715
726
  dispose: () => void;
716
- }, {}, {}, {}, vue14.ComponentOptionsMixin, vue14.ComponentOptionsMixin, {
727
+ }, {}, {}, {}, vue20.ComponentOptionsMixin, vue20.ComponentOptionsMixin, {
728
+ render: (context: TresContext) => any;
717
729
  click: (event: TresPointerEvent) => any;
718
730
  contextmenu: (event: TresPointerEvent) => any;
719
731
  pointermove: (event: TresPointerEvent) => any;
@@ -730,10 +742,10 @@ declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
730
742
  ready: (context: TresContext) => any;
731
743
  error: (error: Error) => any;
732
744
  pointermissed: (event: TresPointerEvent) => any;
733
- render: (context: TresContext) => any;
734
745
  beforeLoop: (context: TresContextWithClock) => any;
735
746
  loop: (context: TresContextWithClock) => any;
736
- }, string, vue14.PublicProps, Readonly<__VLS_Props> & Readonly<{
747
+ }, string, vue20.PublicProps, Readonly<__VLS_Props$1> & Readonly<{
748
+ onRender?: ((context: TresContext) => any) | undefined;
737
749
  onClick?: ((event: TresPointerEvent) => any) | undefined;
738
750
  onContextmenu?: ((event: TresPointerEvent) => any) | undefined;
739
751
  onPointermove?: ((event: TresPointerEvent) => any) | undefined;
@@ -750,13 +762,12 @@ declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
750
762
  onReady?: ((context: TresContext) => any) | undefined;
751
763
  onError?: ((error: Error) => any) | undefined;
752
764
  onPointermissed?: ((event: TresPointerEvent) => any) | undefined;
753
- onRender?: ((context: TresContext) => any) | undefined;
754
765
  onBeforeLoop?: ((context: TresContextWithClock) => any) | undefined;
755
766
  onLoop?: ((context: TresContextWithClock) => any) | undefined;
756
- }>, {}, {}, {}, {}, string, vue14.ComponentProvideOptions, false, {}, any>;
757
- declare const __VLS_export$1: __VLS_WithSlots$1<typeof __VLS_base$1, __VLS_Slots$1>;
758
- declare const _default$1: typeof __VLS_export$1;
759
- type __VLS_WithSlots$1<T, S> = T & {
767
+ }>, {}, {}, {}, {}, string, vue20.ComponentProvideOptions, false, {}, any>;
768
+ declare const __VLS_export$2: __VLS_WithSlots$2<typeof __VLS_base$2, __VLS_Slots$2>;
769
+ declare const _default$1: typeof __VLS_export$2;
770
+ type __VLS_WithSlots$2<T, S> = T & {
760
771
  new (): {
761
772
  $slots: S;
762
773
  };
@@ -769,10 +780,11 @@ interface TresCanvasInstance {
769
780
  get context(): TresContext | undefined;
770
781
  dispose: () => void;
771
782
  }
772
- type __VLS_Slots = {
783
+ type __VLS_Slots$1 = {
773
784
  default: () => any;
774
785
  };
775
- declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue14.ComponentOptionsMixin, vue14.ComponentOptionsMixin, {
786
+ declare const __VLS_base$1: vue20.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue20.ComponentOptionsMixin, vue20.ComponentOptionsMixin, {
787
+ render: (context: TresContext) => any;
776
788
  click: (event: TresPointerEvent) => any;
777
789
  contextmenu: (event: TresPointerEvent) => any;
778
790
  pointermove: (event: TresPointerEvent) => any;
@@ -789,10 +801,10 @@ declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance
789
801
  ready: (context: TresContext) => any;
790
802
  error: (error: Error) => any;
791
803
  pointermissed: (event: TresPointerEvent) => any;
792
- render: (context: TresContext) => any;
793
804
  beforeLoop: (context: TresContextWithClock) => any;
794
805
  loop: (context: TresContextWithClock) => any;
795
- }, string, vue14.PublicProps, Readonly<ContextProps> & Readonly<{
806
+ }, string, vue20.PublicProps, Readonly<ContextProps> & Readonly<{
807
+ onRender?: ((context: TresContext) => any) | undefined;
796
808
  onClick?: ((event: TresPointerEvent) => any) | undefined;
797
809
  onContextmenu?: ((event: TresPointerEvent) => any) | undefined;
798
810
  onPointermove?: ((event: TresPointerEvent) => any) | undefined;
@@ -809,29 +821,49 @@ declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance
809
821
  onReady?: ((context: TresContext) => any) | undefined;
810
822
  onError?: ((error: Error) => any) | undefined;
811
823
  onPointermissed?: ((event: TresPointerEvent) => any) | undefined;
812
- onRender?: ((context: TresContext) => any) | undefined;
813
824
  onBeforeLoop?: ((context: TresContextWithClock) => any) | undefined;
814
825
  onLoop?: ((context: TresContextWithClock) => any) | undefined;
815
826
  }>, {
827
+ alpha: boolean;
828
+ logarithmicDepthBuffer: boolean;
829
+ toneMapping: THREE.ToneMapping;
830
+ depth: boolean;
831
+ stencil: boolean;
832
+ clearColor: THREE.ColorRepresentation;
816
833
  windowSize: boolean;
817
834
  enableProvideBridge: boolean;
835
+ customRendererOptions: TresCustomRendererOptions;
818
836
  antialias: boolean;
819
- stencil: boolean;
820
- depth: boolean;
821
- logarithmicDepthBuffer: boolean;
822
837
  preserveDrawingBuffer: boolean;
823
- alpha: boolean;
824
838
  failIfMajorPerformanceCaveat: boolean;
825
- clearColor: THREE.ColorRepresentation;
826
839
  clearAlpha: number;
827
840
  shadows: boolean;
828
- toneMapping: THREE.ToneMapping;
829
841
  shadowMapType: THREE.ShadowMapType;
830
842
  useLegacyLights: boolean;
831
843
  renderMode: "always" | "on-demand" | "manual";
832
- }, {}, {}, {}, string, vue14.ComponentProvideOptions, false, {}, any>;
844
+ }, {}, {}, {}, string, vue20.ComponentProvideOptions, false, {}, any>;
845
+ declare const __VLS_export$1: __VLS_WithSlots$1<typeof __VLS_base$1, __VLS_Slots$1>;
846
+ declare const _default: typeof __VLS_export$1;
847
+ type __VLS_WithSlots$1<T, S> = T & {
848
+ new (): {
849
+ $slots: S;
850
+ };
851
+ };
852
+ //#endregion
853
+ //#region src/components/TresPortal.vue.d.ts
854
+ type __VLS_Props = {
855
+ /** Target Object3D/Scene to reparent children into. */
856
+ to: Object3D;
857
+ /** When true, children render in place (main scene) instead of the target. */
858
+ disabled?: boolean;
859
+ };
860
+ declare var __VLS_7: {};
861
+ type __VLS_Slots = {} & {
862
+ default?: (props: typeof __VLS_7) => any;
863
+ };
864
+ declare const __VLS_base: vue20.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue20.ComponentOptionsMixin, vue20.ComponentOptionsMixin, {}, string, vue20.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, vue20.ComponentProvideOptions, false, {}, any>;
833
865
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
834
- declare const _default: typeof __VLS_export;
866
+ declare const _default$2: typeof __VLS_export;
835
867
  type __VLS_WithSlots<T, S> = T & {
836
868
  new (): {
837
869
  $slots: S;
@@ -1170,6 +1202,34 @@ declare const isTresPrimitive: (value: unknown) => value is TresPrimitive;
1170
1202
  * ```
1171
1203
  */
1172
1204
  declare const isTresInstance: (value: unknown) => value is TresInstance;
1205
+ /**
1206
+ * Type guard to check if a value is a Three.js WebGPU `Renderer`.
1207
+ *
1208
+ * Identifies the renderer *instance*, not the active backend: a `WebGPURenderer`
1209
+ * can run on a WebGPU **or** a WebGL2 fallback backend, and this returns `true`
1210
+ * for both. That is the right granularity for branching on capabilities —
1211
+ * `NodeMaterial` works on either backend, while a GLSL `ShaderMaterial` works on
1212
+ * neither under the WebGPU renderer.
1213
+ * @param value - The value to check
1214
+ * @returns True if the value is a WebGPU `Renderer` instance, false otherwise
1215
+ * @example
1216
+ * ```ts
1217
+ * const { renderer } = useTresContext()
1218
+ * if (isWebGPURenderer(renderer.instance)) {
1219
+ * // TypeScript knows renderer.instance is a WebGPU Renderer here
1220
+ * }
1221
+ * ```
1222
+ */
1223
+ declare const isWebGPURenderer: (value: unknown) => value is Renderer;
1224
+ /**
1225
+ * Type guard to check if a value is a Three.js `WebGLRenderer`.
1226
+ * @param value - The value to check
1227
+ * @returns True if the value is a `WebGLRenderer` instance, false otherwise
1228
+ * @see {@link isWebGPURenderer}
1229
+ */
1230
+ declare const isWebGLRenderer: (value: unknown) => value is WebGLRenderer & {
1231
+ isWebGLRenderer: true;
1232
+ };
1173
1233
  //#endregion
1174
1234
  //#region src/index.d.ts
1175
1235
  interface TresOptions {
@@ -1181,4 +1241,4 @@ interface TresPlugin {
1181
1241
  }
1182
1242
  declare const plugin: TresPlugin;
1183
1243
  //#endregion
1184
- 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, _default$1 as TresCanvasContext, 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, TresTimer, TresVector2, TresVector3, TresVector4, UseCameraReturn, _default$2 as UseLoader, UseLoaderReturn, UseRendererManagerReturn, UseRendererOptions, VectorCoordinates, type VectorFlexibleParams, VueProps, WithMathProps, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
1244
+ export { Args, AssetLoadData, AttachFnType, AttachType, ConstructorRepresentation, DevtoolsMessage, DevtoolsMessageType, DevtoolsMessenger, DevtoolsSubscriber, DisposeType, ElementProps, INJECTION_KEY, InstanceProps, LoaderMethods, LoaderProto, LocalState, LoopContext, MathType, Mutable, NonFunctionKeys, Overwrite, Properties, RenderFunction, RenderMode, RendererOptions, ThreeElement, ThreeInstances, TresCamera, _default as TresCanvas, _default$1 as TresCanvasContext, 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, _default$2 as TresPortal, TresPrimitive, TresQuaternion, TresRenderer, TresRendererError, TresRendererErrorCode, TresRendererSetupContext, TresScene, TresTimer, TresVector2, TresVector3, TresVector4, UseCameraReturn, _default$3 as UseLoader, UseLoaderReturn, UseRendererManagerReturn, UseRendererOptions, VectorCoordinates, type VectorFlexibleParams, VueProps, WithMathProps, 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 };
package/dist/tres.js CHANGED
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.8.3
3
+ * version: v5.9.1
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, computed, createBlock, createCommentVNode, createElementBlock, createRenderer, defineComponent, getCurrentInstance, h, isRef, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, provide, reactive, readonly, ref, renderSlot, shallowRef, toValue, unref, useSlots, watch, watchEffect, withCtx } from "vue";
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
- import { ACESFilmicToneMapping, ArrowHelper, BufferAttribute, Color, DirectionalLightHelper, DoubleSide, HemisphereLightHelper, Layers, Material, MathUtils, Mesh, MeshBasicMaterial, PCFSoftShadowMap, PerspectiveCamera, PointLightHelper, REVISION, Scene, SpotLightHelper, Vector3, WebGLRenderer } from "three";
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
11
  import { createEventHook, createInjectionState, promiseTimeout, refDebounced, tryOnScopeDispose, unrefElement, useAsyncState, useDevicePixelRatio, useElementSize, useFps, 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";
@@ -15,7 +15,7 @@ import { setupDevtoolsPlugin } from "@vue/devtools-api";
15
15
  import { RectAreaLightHelper } from "three/examples/jsm/helpers/RectAreaLightHelper.js";
16
16
 
17
17
  //#region package.json
18
- var version = "5.8.3";
18
+ var version = "5.9.1";
19
19
 
20
20
  //#endregion
21
21
  //#region src/utils/makeMap.ts
@@ -265,6 +265,32 @@ const isTresPrimitive = createTypeGuard("isPrimitive");
265
265
  * ```
266
266
  */
267
267
  const isTresInstance = (value) => isTresObject(value) && "__tres" in value;
268
+ /**
269
+ * Type guard to check if a value is a Three.js WebGPU `Renderer`.
270
+ *
271
+ * Identifies the renderer *instance*, not the active backend: a `WebGPURenderer`
272
+ * can run on a WebGPU **or** a WebGL2 fallback backend, and this returns `true`
273
+ * for both. That is the right granularity for branching on capabilities —
274
+ * `NodeMaterial` works on either backend, while a GLSL `ShaderMaterial` works on
275
+ * neither under the WebGPU renderer.
276
+ * @param value - The value to check
277
+ * @returns True if the value is a WebGPU `Renderer` instance, false otherwise
278
+ * @example
279
+ * ```ts
280
+ * const { renderer } = useTresContext()
281
+ * if (isWebGPURenderer(renderer.instance)) {
282
+ * // TypeScript knows renderer.instance is a WebGPU Renderer here
283
+ * }
284
+ * ```
285
+ */
286
+ const isWebGPURenderer = createTypeGuard("isRenderer");
287
+ /**
288
+ * Type guard to check if a value is a Three.js `WebGLRenderer`.
289
+ * @param value - The value to check
290
+ * @returns True if the value is a `WebGLRenderer` instance, false otherwise
291
+ * @see {@link isWebGPURenderer}
292
+ */
293
+ const isWebGLRenderer = createTypeGuard("isWebGLRenderer");
268
294
 
269
295
  //#endregion
270
296
  //#region src/utils/array.ts
@@ -577,7 +603,7 @@ var component_default = component_vue_vue_type_script_setup_true_lang_default;
577
603
  * @returns The camera management functions and state
578
604
  */
579
605
  const useCameraManager = ({ sizes }) => {
580
- const cameras = ref([]);
606
+ const cameras = shallowRef([]);
581
607
  const activeCamera = computed(() => cameras.value[0]);
582
608
  /**
583
609
  * Set the active camera
@@ -596,6 +622,7 @@ const useCameraManager = ({ sizes }) => {
596
622
  const registerCamera = (camera, active = false) => {
597
623
  if (cameras.value.some(({ uuid }) => uuid === camera.uuid)) return;
598
624
  cameras.value.push(camera);
625
+ triggerRef(cameras);
599
626
  if (active) setActiveCamera(camera.uuid);
600
627
  };
601
628
  /**
@@ -857,7 +884,6 @@ function useRendererManager({ scene, canvas, options, fpsLimit, contextParts: {
857
884
  if (toValue(options.renderMode) === "on-demand") invalidate();
858
885
  };
859
886
  const isModeAlways = computed(() => toValue(options.renderMode) === "always");
860
- const isRenderer = (value) => isObject(value) && "isRenderer" in value && Boolean(value.isRenderer);
861
887
  const readyEventHook = createEventHook();
862
888
  const errorEventHook = createEventHook();
863
889
  let hasTriggeredReady = false;
@@ -865,7 +891,7 @@ function useRendererManager({ scene, canvas, options, fpsLimit, contextParts: {
865
891
  const error = ref(null);
866
892
  const initializeRenderer = async () => {
867
893
  try {
868
- if (isRenderer(renderer)) await renderer.init();
894
+ if (isWebGPURenderer(renderer)) await renderer.init();
869
895
  isInitialized.value = true;
870
896
  } catch (e) {
871
897
  const rendererError = new TresRendererError(e instanceof Error ? e.message : "Unknown error", "INITIALIZATION_FAILED", { cause: e instanceof Error ? e : void 0 });
@@ -964,9 +990,8 @@ Error details: ${rendererError.message}`, rendererError);
964
990
  });
965
991
  watchEffect(() => {
966
992
  if (!isInitialized.value) return;
967
- const value = options.shadowMapType;
968
- if (value === void 0) return;
969
- renderer.shadowMap.type = value;
993
+ const fallback = isWebGPURenderer(renderer) ? PCFSoftShadowMap : PCFShadowMap;
994
+ renderer.shadowMap.type = options.shadowMapType ?? fallback;
970
995
  forceMaterialUpdate();
971
996
  });
972
997
  onUnmounted(() => {
@@ -1047,6 +1072,7 @@ const [useTresContextProvider, _useTresContext] = createInjectionState(({ scene,
1047
1072
  scene: localScene,
1048
1073
  camera,
1049
1074
  renderer,
1075
+ isWebGPU: computed(() => isWebGPURenderer(renderer.instance)),
1050
1076
  controls: ref(null),
1051
1077
  extend,
1052
1078
  events
@@ -1067,7 +1093,7 @@ const useTresContext = () => {
1067
1093
  //#endregion
1068
1094
  //#region src/composables/useTres/index.ts
1069
1095
  function useTres() {
1070
- const { scene, renderer, camera, sizes, controls, extend: extend$1, events } = useTresContext();
1096
+ const { scene, renderer, camera, sizes, controls, extend: extend$1, events, isWebGPU } = useTresContext();
1071
1097
  return {
1072
1098
  scene,
1073
1099
  renderer: renderer.instance,
@@ -1076,6 +1102,7 @@ function useTres() {
1076
1102
  controls,
1077
1103
  extend: extend$1,
1078
1104
  events,
1105
+ isWebGPU,
1079
1106
  invalidate: renderer.invalidate,
1080
1107
  advance: renderer.advance
1081
1108
  };
@@ -2261,7 +2288,8 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2261
2288
  },
2262
2289
  customRendererOptions: {
2263
2290
  type: Object,
2264
- required: false
2291
+ required: false,
2292
+ default: () => ({ primitivePrefix: "" })
2265
2293
  },
2266
2294
  antialias: {
2267
2295
  type: Boolean,
@@ -2337,7 +2365,7 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2337
2365
  shadowMapType: {
2338
2366
  type: null,
2339
2367
  required: false,
2340
- default: PCFSoftShadowMap
2368
+ default: void 0
2341
2369
  },
2342
2370
  useLegacyLights: {
2343
2371
  type: Boolean,
@@ -2480,11 +2508,40 @@ const whitelist = [
2480
2508
  "TresCanvas",
2481
2509
  "TresCanvasContext",
2482
2510
  "TresLeches",
2483
- "TresScene"
2511
+ "TresScene",
2512
+ "TresPortal"
2484
2513
  ];
2485
2514
  const templateCompilerOptions = { template: { compilerOptions: { isCustomElement: (tag) => (/^Tres[A-Z]/.test(tag) || tag.startsWith("tres-")) && !whitelist.includes(tag) || tag === "primitive" } } };
2486
2515
  var template_compiler_options_default = templateCompilerOptions;
2487
2516
 
2517
+ //#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({
2520
+ __name: "TresPortal",
2521
+ props: {
2522
+ to: {
2523
+ type: Object,
2524
+ required: true
2525
+ },
2526
+ disabled: {
2527
+ type: Boolean,
2528
+ required: false
2529
+ }
2530
+ },
2531
+ setup(__props) {
2532
+ return (_ctx, _cache) => {
2533
+ return openBlock(), createBlock(Teleport, {
2534
+ to: __props.to,
2535
+ disabled: __props.disabled
2536
+ }, [renderSlot(_ctx.$slots, "default")], 8, ["to", "disabled"]);
2537
+ };
2538
+ }
2539
+ });
2540
+
2541
+ //#endregion
2542
+ //#region src/components/TresPortal.vue
2543
+ var TresPortal_default = TresPortal_vue_vue_type_script_setup_true_lang_default;
2544
+
2488
2545
  //#endregion
2489
2546
  //#region src/directives/vDistanceTo.ts
2490
2547
  let arrowHelper = null;
@@ -2575,4 +2632,4 @@ const plugin = { install(app) {
2575
2632
  var src_default = plugin;
2576
2633
 
2577
2634
  //#endregion
2578
- export { DevtoolsMessenger, TresCanvas_default as TresCanvas, Context_default as TresCanvasContext, 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, logError, logMessage, logWarning, normalizeColor, normalizeVectorFlexibleParam, registerTresDevtools, template_compiler_options_default as templateCompilerOptions, useCameraManager, useGraph, useLoader, useLoop, useRendererManager, useTres, useTresContext, useTresContextProvider, vDistanceTo, vLightHelper, vLog };
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 };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "type": "module",
4
- "version": "5.8.3",
4
+ "version": "5.9.1",
5
5
  "description": "Declarative ThreeJS using Vue Components",
6
6
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
7
7
  "license": "MIT",
@@ -89,7 +89,7 @@
89
89
  "build": "tsdown",
90
90
  "build:analyze": "ANALYZE=true tsdown",
91
91
  "test": "vitest",
92
- "test:ci": "vitest run",
92
+ "test:ci": "vitest run --typecheck",
93
93
  "test:ui": "vitest --ui --coverage.enabled=true",
94
94
  "coverage": "vitest run --coverage",
95
95
  "lint": "eslint .",