@tresjs/core 5.6.0 → 5.8.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.6.0
3
+ * version: v5.8.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.6.0
3
+ * version: v5.8.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/)
package/dist/tres.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.6.0
3
+ * version: v5.8.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/)
@@ -297,12 +297,14 @@ interface UseRendererOptions {
297
297
  scene: ShallowRef<TresScene>;
298
298
  canvas: MaybeRef<HTMLCanvasElement>;
299
299
  options: Reactive<RendererOptions>;
300
+ fpsLimit?: MaybeRefOrGetter<number>;
300
301
  contextParts: Pick<TresContext, 'sizes' | 'camera'>;
301
302
  }
302
303
  declare function useRendererManager({
303
304
  scene,
304
305
  canvas,
305
306
  options,
307
+ fpsLimit,
306
308
  contextParts: {
307
309
  sizes,
308
310
  camera
@@ -357,6 +359,7 @@ interface TresContext {
357
359
  declare const useTresContextProvider: (args_0: {
358
360
  scene: TresScene;
359
361
  canvas: MaybeRef<HTMLCanvasElement>;
362
+ fpsLimit?: MaybeRefOrGetter<number>;
360
363
  windowSize: MaybeRefOrGetter<boolean>;
361
364
  rendererOptions: RendererOptions;
362
365
  }) => TresContext;
@@ -675,6 +678,11 @@ interface ContextProps extends RendererOptions {
675
678
  * @default false
676
679
  */
677
680
  windowSize?: boolean;
681
+ /**
682
+ * The maximum number of frames per second to render
683
+ * @default undefined
684
+ */
685
+ fpsLimit?: number;
678
686
  /**
679
687
  * Whether to enable the provide/inject bridge between Vue and TresJS
680
688
  * When true, Vue's provide/inject will work across the TresJS boundary
@@ -911,6 +919,24 @@ declare const vLog: {
911
919
  }) => void;
912
920
  };
913
921
  //#endregion
922
+ //#region src/utils/createTimer.d.ts
923
+ interface TresTimer {
924
+ getDelta: () => number;
925
+ getElapsed: () => number;
926
+ update: () => void;
927
+ start: () => void;
928
+ stop: () => void;
929
+ }
930
+ /**
931
+ * Creates a unified timer abstraction that uses `Timer` on Three.js r179+
932
+ * and falls back to `Clock` on older versions.
933
+ *
934
+ * - On r179+: uses `Timer` with its Page Visibility API support (`connect`/`disconnect`).
935
+ * - On older versions: uses `Clock` with `start`/`stop`.
936
+ *
937
+ */
938
+ declare function createTimer(): TresTimer;
939
+ //#endregion
914
940
  //#region src/utils/is/three.d.ts
915
941
  /**
916
942
  * Type guard to check if a value is a Three.js Object3D
@@ -1154,4 +1180,4 @@ interface TresPlugin {
1154
1180
  }
1155
1181
  declare const plugin: TresPlugin;
1156
1182
  //#endregion
1157
- 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, TresVector2, TresVector3, TresVector4, UseCameraReturn, _default$2 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 };
1183
+ 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 };
package/dist/tres.js CHANGED
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v5.6.0
3
+ * version: v5.8.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
8
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createRenderer, defineComponent, getCurrentInstance, h, isRef, mergeProps, nextTick, 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
- import { ACESFilmicToneMapping, ArrowHelper, BackSide, BufferAttribute, BufferGeometry, Color, DirectionalLightHelper, DoubleSide, Float32BufferAttribute, HemisphereLightHelper, Layers, Line, LineBasicMaterial, Material, MathUtils, Mesh, MeshBasicMaterial, PCFSoftShadowMap, PerspectiveCamera, PointLightHelper, Scene, SpotLightHelper, Timer, Vector3, WebGLRenderer } from "three";
10
+ import { ACESFilmicToneMapping, ArrowHelper, BackSide, BufferAttribute, BufferGeometry, Color, DirectionalLightHelper, DoubleSide, Float32BufferAttribute, HemisphereLightHelper, Layers, Line, LineBasicMaterial, Material, MathUtils, Mesh, MeshBasicMaterial, 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
15
 
16
16
  //#region package.json
17
- var version = "5.6.0";
17
+ var version = "5.8.0";
18
18
 
19
19
  //#endregion
20
20
  //#region src/utils/makeMap.ts
@@ -716,13 +716,55 @@ const setPixelRatio = (renderer, systemDpr, userDpr) => {
716
716
  if (newDpr !== renderer.getPixelRatio?.()) renderer.setPixelRatio(newDpr);
717
717
  };
718
718
 
719
+ //#endregion
720
+ //#region src/core/revision.ts
721
+ const revision = Number.parseInt(REVISION.replace("dev", ""));
722
+
723
+ //#endregion
724
+ //#region src/utils/createTimer.ts
725
+ /**
726
+ * Minimum Three.js revision that ships the `Timer` class.
727
+ */
728
+ const TIMER_MIN_REVISION = 179;
729
+ /**
730
+ * Creates a unified timer abstraction that uses `Timer` on Three.js r179+
731
+ * and falls back to `Clock` on older versions.
732
+ *
733
+ * - On r179+: uses `Timer` with its Page Visibility API support (`connect`/`disconnect`).
734
+ * - On older versions: uses `Clock` with `start`/`stop`.
735
+ *
736
+ */
737
+ function createTimer() {
738
+ if (revision >= TIMER_MIN_REVISION) {
739
+ const timer = new THREE.Timer();
740
+ return {
741
+ getDelta: () => timer.getDelta(),
742
+ getElapsed: () => timer.getElapsed(),
743
+ update: () => timer.update(),
744
+ start: () => {
745
+ if (typeof document !== "undefined") timer.connect(document);
746
+ },
747
+ stop: () => timer.disconnect()
748
+ };
749
+ } else {
750
+ const clock = new THREE.Clock();
751
+ return {
752
+ getDelta: () => clock.getDelta(),
753
+ getElapsed: () => clock.elapsedTime,
754
+ update: () => {},
755
+ start: () => clock.start(),
756
+ stop: () => clock.stop()
757
+ };
758
+ }
759
+ }
760
+
719
761
  //#endregion
720
762
  //#region src/composables/useCreateRafLoop/index.ts
721
763
  /**
722
764
  * @param cycleFn the function that is called before the after event hook is triggered and after the before event hook is triggered.
723
765
  */
724
- const useCreateRafLoop = (cycleFn) => {
725
- const timer = new Timer();
766
+ const useCreateRafLoop = (cycleFn, { fpsLimit } = {}) => {
767
+ const timer = createTimer();
726
768
  const eventHooks = {
727
769
  before: createEventHook(),
728
770
  after: createEventHook()
@@ -736,13 +778,16 @@ const useCreateRafLoop = (cycleFn) => {
736
778
  eventHooks.before.trigger(context);
737
779
  cycleFn();
738
780
  eventHooks.after.trigger(context);
739
- }, { immediate: false });
781
+ }, {
782
+ immediate: false,
783
+ fpsLimit
784
+ });
740
785
  const start = () => {
741
- if (typeof document !== "undefined") timer.connect(document);
786
+ timer.start();
742
787
  resume();
743
788
  };
744
789
  const stop = () => {
745
- timer.disconnect();
790
+ timer.stop();
746
791
  pause();
747
792
  };
748
793
  return {
@@ -766,7 +811,7 @@ var TresRendererError = class extends Error {
766
811
 
767
812
  //#endregion
768
813
  //#region src/composables/useRenderer/useRendererManager.ts
769
- function useRendererManager({ scene, canvas, options, contextParts: { sizes, camera } }) {
814
+ function useRendererManager({ scene, canvas, options, fpsLimit, contextParts: { sizes, camera } }) {
770
815
  const getRenderer = () => {
771
816
  if (isFunction(options.renderer)) return options.renderer({
772
817
  sizes,
@@ -841,7 +886,7 @@ Error details: ${rendererError.message}`, rendererError);
841
886
  };
842
887
  const loop = useCreateRafLoop(() => {
843
888
  if (frames.value) renderFunction(notifyFrameRendered);
844
- });
889
+ }, { fpsLimit });
845
890
  readyEventHook.on(() => {
846
891
  if (isInitialized.value) loop.start();
847
892
  });
@@ -967,7 +1012,7 @@ function useEventManager({ canvas, contextParts: { scene, camera, renderer } })
967
1012
  //#endregion
968
1013
  //#region src/composables/useTresContextProvider/index.ts
969
1014
  const INJECTION_KEY = "useTres";
970
- const [useTresContextProvider, _useTresContext] = createInjectionState(({ scene, canvas, windowSize, rendererOptions }) => {
1015
+ const [useTresContextProvider, _useTresContext] = createInjectionState(({ scene, canvas, fpsLimit, windowSize, rendererOptions }) => {
971
1016
  const localScene = shallowRef(scene);
972
1017
  const sizes = useSizes(windowSize, canvas);
973
1018
  const camera = useCameraManager({ sizes });
@@ -975,6 +1020,7 @@ const [useTresContextProvider, _useTresContext] = createInjectionState(({ scene,
975
1020
  scene: localScene,
976
1021
  canvas,
977
1022
  options: rendererOptions,
1023
+ fpsLimit,
978
1024
  contextParts: {
979
1025
  sizes,
980
1026
  camera
@@ -1892,6 +1938,10 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
1892
1938
  type: Boolean,
1893
1939
  required: false
1894
1940
  },
1941
+ fpsLimit: {
1942
+ type: Number,
1943
+ required: false
1944
+ },
1895
1945
  enableProvideBridge: {
1896
1946
  type: Boolean,
1897
1947
  required: false
@@ -2067,6 +2117,7 @@ var Context_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
2067
2117
  const context = shallowRef(useTresContextProvider({
2068
2118
  scene: scene.value,
2069
2119
  canvas: props.canvas,
2120
+ fpsLimit: () => props.fpsLimit ?? Infinity,
2070
2121
  windowSize: props.windowSize ?? false,
2071
2122
  rendererOptions: props
2072
2123
  }));
@@ -2160,6 +2211,10 @@ var TresCanvas_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
2160
2211
  required: false,
2161
2212
  default: void 0
2162
2213
  },
2214
+ fpsLimit: {
2215
+ type: Number,
2216
+ required: false
2217
+ },
2163
2218
  enableProvideBridge: {
2164
2219
  type: Boolean,
2165
2220
  required: false,
@@ -2561,4 +2616,4 @@ const plugin = { install(app) {
2561
2616
  var src_default = plugin;
2562
2617
 
2563
2618
  //#endregion
2564
- export { DevtoolsMessenger, TresCanvas_default as TresCanvas, Context_default as TresCanvasContext, 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 };
2619
+ 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 };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "type": "module",
4
- "version": "5.6.0",
4
+ "version": "5.8.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",