@tresjs/core 5.8.2 → 5.9.0

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.2
3
+ * version: v5.9.0
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.2
3
+ * version: v5.9.0
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.2
3
+ * version: v5.9.0
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>;
@@ -514,8 +524,8 @@ interface TresObjectMap {
514
524
  declare function buildGraph(object: Object3D | TresObject): TresObjectMap;
515
525
  //#endregion
516
526
  //#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<{
527
+ 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<{
528
+ props: vue20.PublicProps & __VLS_PrettifyLocal<{
519
529
  /**
520
530
  * The THREE.js loader to use
521
531
  */
@@ -539,20 +549,20 @@ declare const __VLS_export$2: <T extends TresObjectMap>(__VLS_props: NonNullable
539
549
  attrs: any;
540
550
  slots: {
541
551
  default?: (props: {
542
- state: vue14.UnwrapRef<T>;
552
+ state: vue20.UnwrapRef<T>;
543
553
  isLoading: boolean;
544
554
  error: unknown;
545
555
  }) => any;
546
556
  };
547
557
  emit: ((evt: "error", error: unknown) => void) & ((evt: "loaded", result: T) => void);
548
- }>) => vue14.VNode & {
558
+ }>) => vue20.VNode & {
549
559
  __ctx?: Awaited<typeof __VLS_setup>;
550
560
  };
551
- declare const _default$2: typeof __VLS_export$2;
561
+ declare const _default$3: typeof __VLS_export$3;
552
562
  type __VLS_PrettifyLocal<T> = (T extends any ? { [K in keyof T]: T[K] } : { [K in keyof T as K]: T[K] }) & {};
553
563
  //#endregion
554
564
  //#region src/composables/useGraph/index.d.ts
555
- declare const useGraph: (object: MaybeRef<TresObject | undefined>) => vue14.ComputedRef<TresObjectMap | undefined>;
565
+ declare const useGraph: (object: MaybeRef<TresObject | undefined>) => vue20.ComputedRef<TresObjectMap | undefined>;
556
566
  //#endregion
557
567
  //#region src/utils/createPriorityEventHook.d.ts
558
568
  type Callback<T> = Parameters<EventHookOff<T>>[0];
@@ -603,7 +613,7 @@ type LoopContext = RafLoopContext & TresPartialContext;
603
613
  declare const useLoop: () => {
604
614
  stop: () => void;
605
615
  start: () => void;
606
- isActive: Readonly<vue14.ShallowRef<boolean>>;
616
+ isActive: Readonly<vue20.ShallowRef<boolean>>;
607
617
  onBeforeRender: PriorityEventHookOn<LoopContext>;
608
618
  onRender: PriorityEventHookOn<LoopContext>;
609
619
  render: (fn: RenderFunction) => void;
@@ -704,16 +714,17 @@ type ContextEmits = {
704
714
  beforeLoop: [context: TresContextWithClock];
705
715
  loop: [context: TresContextWithClock];
706
716
  } & { [key in TresPointerEventName]: [event: TresPointerEvent] };
707
- type __VLS_Props = ContextProps & {
717
+ type __VLS_Props$1 = ContextProps & {
708
718
  canvas: HTMLCanvasElement;
709
719
  };
710
- type __VLS_Slots$1 = {
720
+ type __VLS_Slots$2 = {
711
721
  default: () => any;
712
722
  };
713
- declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
714
- context: vue14.ShallowRef<TresContext, TresContext>;
723
+ declare const __VLS_base$2: vue20.DefineComponent<__VLS_Props$1, {
724
+ context: vue20.ShallowRef<TresContext, TresContext>;
715
725
  dispose: () => void;
716
- }, {}, {}, {}, vue14.ComponentOptionsMixin, vue14.ComponentOptionsMixin, {
726
+ }, {}, {}, {}, vue20.ComponentOptionsMixin, vue20.ComponentOptionsMixin, {
727
+ render: (context: TresContext) => any;
717
728
  click: (event: TresPointerEvent) => any;
718
729
  contextmenu: (event: TresPointerEvent) => any;
719
730
  pointermove: (event: TresPointerEvent) => any;
@@ -730,10 +741,10 @@ declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
730
741
  ready: (context: TresContext) => any;
731
742
  error: (error: Error) => any;
732
743
  pointermissed: (event: TresPointerEvent) => any;
733
- render: (context: TresContext) => any;
734
744
  beforeLoop: (context: TresContextWithClock) => any;
735
745
  loop: (context: TresContextWithClock) => any;
736
- }, string, vue14.PublicProps, Readonly<__VLS_Props> & Readonly<{
746
+ }, string, vue20.PublicProps, Readonly<__VLS_Props$1> & Readonly<{
747
+ onRender?: ((context: TresContext) => any) | undefined;
737
748
  onClick?: ((event: TresPointerEvent) => any) | undefined;
738
749
  onContextmenu?: ((event: TresPointerEvent) => any) | undefined;
739
750
  onPointermove?: ((event: TresPointerEvent) => any) | undefined;
@@ -750,13 +761,12 @@ declare const __VLS_base$1: vue14.DefineComponent<__VLS_Props, {
750
761
  onReady?: ((context: TresContext) => any) | undefined;
751
762
  onError?: ((error: Error) => any) | undefined;
752
763
  onPointermissed?: ((event: TresPointerEvent) => any) | undefined;
753
- onRender?: ((context: TresContext) => any) | undefined;
754
764
  onBeforeLoop?: ((context: TresContextWithClock) => any) | undefined;
755
765
  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 & {
766
+ }>, {}, {}, {}, {}, string, vue20.ComponentProvideOptions, false, {}, any>;
767
+ declare const __VLS_export$2: __VLS_WithSlots$2<typeof __VLS_base$2, __VLS_Slots$2>;
768
+ declare const _default$1: typeof __VLS_export$2;
769
+ type __VLS_WithSlots$2<T, S> = T & {
760
770
  new (): {
761
771
  $slots: S;
762
772
  };
@@ -769,10 +779,11 @@ interface TresCanvasInstance {
769
779
  get context(): TresContext | undefined;
770
780
  dispose: () => void;
771
781
  }
772
- type __VLS_Slots = {
782
+ type __VLS_Slots$1 = {
773
783
  default: () => any;
774
784
  };
775
- declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue14.ComponentOptionsMixin, vue14.ComponentOptionsMixin, {
785
+ declare const __VLS_base$1: vue20.DefineComponent<ContextProps, TresCanvasInstance, {}, {}, {}, vue20.ComponentOptionsMixin, vue20.ComponentOptionsMixin, {
786
+ render: (context: TresContext) => any;
776
787
  click: (event: TresPointerEvent) => any;
777
788
  contextmenu: (event: TresPointerEvent) => any;
778
789
  pointermove: (event: TresPointerEvent) => any;
@@ -789,10 +800,10 @@ declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance
789
800
  ready: (context: TresContext) => any;
790
801
  error: (error: Error) => any;
791
802
  pointermissed: (event: TresPointerEvent) => any;
792
- render: (context: TresContext) => any;
793
803
  beforeLoop: (context: TresContextWithClock) => any;
794
804
  loop: (context: TresContextWithClock) => any;
795
- }, string, vue14.PublicProps, Readonly<ContextProps> & Readonly<{
805
+ }, string, vue20.PublicProps, Readonly<ContextProps> & Readonly<{
806
+ onRender?: ((context: TresContext) => any) | undefined;
796
807
  onClick?: ((event: TresPointerEvent) => any) | undefined;
797
808
  onContextmenu?: ((event: TresPointerEvent) => any) | undefined;
798
809
  onPointermove?: ((event: TresPointerEvent) => any) | undefined;
@@ -809,29 +820,49 @@ declare const __VLS_base: vue14.DefineComponent<ContextProps, TresCanvasInstance
809
820
  onReady?: ((context: TresContext) => any) | undefined;
810
821
  onError?: ((error: Error) => any) | undefined;
811
822
  onPointermissed?: ((event: TresPointerEvent) => any) | undefined;
812
- onRender?: ((context: TresContext) => any) | undefined;
813
823
  onBeforeLoop?: ((context: TresContextWithClock) => any) | undefined;
814
824
  onLoop?: ((context: TresContextWithClock) => any) | undefined;
815
825
  }>, {
816
- windowSize: boolean;
826
+ alpha: boolean;
827
+ logarithmicDepthBuffer: boolean;
817
828
  toneMapping: THREE.ToneMapping;
829
+ depth: boolean;
830
+ stencil: boolean;
831
+ clearColor: THREE.ColorRepresentation;
832
+ windowSize: boolean;
818
833
  enableProvideBridge: boolean;
834
+ customRendererOptions: TresCustomRendererOptions;
819
835
  antialias: boolean;
820
- stencil: boolean;
821
- depth: boolean;
822
- logarithmicDepthBuffer: boolean;
823
836
  preserveDrawingBuffer: boolean;
824
- alpha: boolean;
825
837
  failIfMajorPerformanceCaveat: boolean;
826
- clearColor: THREE.ColorRepresentation;
827
838
  clearAlpha: number;
828
839
  shadows: boolean;
829
840
  shadowMapType: THREE.ShadowMapType;
830
841
  useLegacyLights: boolean;
831
842
  renderMode: "always" | "on-demand" | "manual";
832
- }, {}, {}, {}, string, vue14.ComponentProvideOptions, false, {}, any>;
843
+ }, {}, {}, {}, string, vue20.ComponentProvideOptions, false, {}, any>;
844
+ declare const __VLS_export$1: __VLS_WithSlots$1<typeof __VLS_base$1, __VLS_Slots$1>;
845
+ declare const _default: typeof __VLS_export$1;
846
+ type __VLS_WithSlots$1<T, S> = T & {
847
+ new (): {
848
+ $slots: S;
849
+ };
850
+ };
851
+ //#endregion
852
+ //#region src/components/TresPortal.vue.d.ts
853
+ type __VLS_Props = {
854
+ /** Target Object3D/Scene to reparent children into. */
855
+ to: Object3D;
856
+ /** When true, children render in place (main scene) instead of the target. */
857
+ disabled?: boolean;
858
+ };
859
+ declare var __VLS_7: {};
860
+ type __VLS_Slots = {} & {
861
+ default?: (props: typeof __VLS_7) => any;
862
+ };
863
+ 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
864
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
834
- declare const _default: typeof __VLS_export;
865
+ declare const _default$2: typeof __VLS_export;
835
866
  type __VLS_WithSlots<T, S> = T & {
836
867
  new (): {
837
868
  $slots: S;
@@ -1170,6 +1201,34 @@ declare const isTresPrimitive: (value: unknown) => value is TresPrimitive;
1170
1201
  * ```
1171
1202
  */
1172
1203
  declare const isTresInstance: (value: unknown) => value is TresInstance;
1204
+ /**
1205
+ * Type guard to check if a value is a Three.js WebGPU `Renderer`.
1206
+ *
1207
+ * Identifies the renderer *instance*, not the active backend: a `WebGPURenderer`
1208
+ * can run on a WebGPU **or** a WebGL2 fallback backend, and this returns `true`
1209
+ * for both. That is the right granularity for branching on capabilities —
1210
+ * `NodeMaterial` works on either backend, while a GLSL `ShaderMaterial` works on
1211
+ * neither under the WebGPU renderer.
1212
+ * @param value - The value to check
1213
+ * @returns True if the value is a WebGPU `Renderer` instance, false otherwise
1214
+ * @example
1215
+ * ```ts
1216
+ * const { renderer } = useTresContext()
1217
+ * if (isWebGPURenderer(renderer.instance)) {
1218
+ * // TypeScript knows renderer.instance is a WebGPU Renderer here
1219
+ * }
1220
+ * ```
1221
+ */
1222
+ declare const isWebGPURenderer: (value: unknown) => value is Renderer;
1223
+ /**
1224
+ * Type guard to check if a value is a Three.js `WebGLRenderer`.
1225
+ * @param value - The value to check
1226
+ * @returns True if the value is a `WebGLRenderer` instance, false otherwise
1227
+ * @see {@link isWebGPURenderer}
1228
+ */
1229
+ declare const isWebGLRenderer: (value: unknown) => value is WebGLRenderer & {
1230
+ isWebGLRenderer: true;
1231
+ };
1173
1232
  //#endregion
1174
1233
  //#region src/index.d.ts
1175
1234
  interface TresOptions {
@@ -1181,4 +1240,4 @@ interface TresPlugin {
1181
1240
  }
1182
1241
  declare const plugin: TresPlugin;
1183
1242
  //#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 };
1243
+ 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,21 +1,21 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.8.2
3
+ * version: v5.9.0
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";
14
14
  import { setupDevtoolsPlugin } from "@vue/devtools-api";
15
- import { RectAreaLightHelper } from "three-stdlib";
15
+ import { RectAreaLightHelper } from "three/examples/jsm/helpers/RectAreaLightHelper.js";
16
16
 
17
17
  //#region package.json
18
- var version = "5.8.2";
18
+ var version = "5.9.0";
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.2",
4
+ "version": "5.9.0",
5
5
  "description": "Declarative ThreeJS using Vue Components",
6
6
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
7
7
  "license": "MIT",
@@ -48,8 +48,7 @@
48
48
  "@pmndrs/pointer-events": "^6.6.30",
49
49
  "@vue/devtools-api": "^8.1.2",
50
50
  "@vueuse/core": "^14.3.0",
51
- "radashi": "^12.9.1",
52
- "three-stdlib": "^2.36.1"
51
+ "radashi": "^12.9.1"
53
52
  },
54
53
  "devDependencies": {
55
54
  "@types/node": "^25.9.3",