From 044af6d62de364ce24de86f8f92897cefc97c35f Mon Sep 17 00:00:00 2001 From: Jerald-Golden-B Date: Tue, 9 Sep 2025 14:44:48 +0530 Subject: [PATCH] add limit fps constraints --- .../properties/GlobalProperties.tsx | 26 ++++++++----- .../modules/scene/helpers/frameLimiter.tsx | 39 +++++++++++-------- app/src/store/scene/useSceneStore.ts | 9 +++++ 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx b/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx index 900c260..1c1c1c6 100644 --- a/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx +++ b/app/src/components/layout/sidebarRight/properties/GlobalProperties.tsx @@ -32,7 +32,7 @@ const GlobalProperties: React.FC = () => { const { azimuth, setAzimuth } = useAzimuth(); const { renderDistance, setRenderDistance } = useRenderDistance(); const { setPlaneValue, setGridValue, planeValue, gridValue } = useTileDistance(); - const { fps, setFps } = useSceneStore(); + const { fps, setFps, limitFps, setLimitFps } = useSceneStore(); const { socket } = useSocketStore(); const { limitDistance, setLimitDistance } = useLimitDistance(); const [distance, setDistance] = useState(40); @@ -65,6 +65,17 @@ const GlobalProperties: React.FC = () => { setRenderDistance(value); } + const limitFpsToggle = async () => { + if (!projectId) return; + if (limitFps) { + // update backend + setFps(60); + } else { + // update backend + } + setLimitFps(!limitFps); + }; + function updateFps(value: number) { setFps(value); } @@ -161,14 +172,7 @@ const GlobalProperties: React.FC = () => {
- { - await limitRenderDistance(); // Call the function here - }} - /> + {
+ updateFps(value)} onPointerUp={() => {}} - key={"5"} + key={"8"} /> diff --git a/app/src/modules/scene/helpers/frameLimiter.tsx b/app/src/modules/scene/helpers/frameLimiter.tsx index 6ce581e..ec899c0 100644 --- a/app/src/modules/scene/helpers/frameLimiter.tsx +++ b/app/src/modules/scene/helpers/frameLimiter.tsx @@ -4,31 +4,36 @@ import { useSceneStore } from "../../../store/scene/useSceneStore"; function FPSLimiter() { const { advance, set, frameloop } = useThree(); - const { fps } = useSceneStore(); + const { fps, limitFps } = useSceneStore(); useLayoutEffect(() => { let then = 0; let raf: number; - const interval = 1000 / fps; - function tick(t: number) { - raf = requestAnimationFrame(tick); - const elapsed = t - then; + if (limitFps) { + const interval = 1000 / fps; - if (elapsed > interval) { - advance(t, true); - then = t - (elapsed % interval); + function tick(t: number) { + raf = requestAnimationFrame(tick); + const elapsed = t - then; + + if (elapsed > interval) { + advance(t, true); + then = t - (elapsed % interval); + } } + + set({ frameloop: "never" }); + raf = requestAnimationFrame(tick); + + return () => { + cancelAnimationFrame(raf); + set({ frameloop }); + }; + } else { + set({ frameloop: "always" }); } - - set({ frameloop: "never" }); - raf = requestAnimationFrame(tick); - - return () => { - cancelAnimationFrame(raf); - set({ frameloop }); - }; - }, [fps, advance, set, frameloop]); + }, [fps, limitFps, advance, set, frameloop]); return null; } diff --git a/app/src/store/scene/useSceneStore.ts b/app/src/store/scene/useSceneStore.ts index 9191fc7..3703d91 100644 --- a/app/src/store/scene/useSceneStore.ts +++ b/app/src/store/scene/useSceneStore.ts @@ -3,24 +3,33 @@ import { immer } from "zustand/middleware/immer"; import * as THREE from "three"; type SceneStore = { + limitFps: boolean; fps: number; camState: { position: THREE.Vector3; target: THREE.Vector3; }; + setLimitFps: (limitFps: boolean) => void; setFps: (fps: number) => void; setCamera: (pos: THREE.Vector3, target: THREE.Vector3) => void; }; export const useSceneStore = create()( immer((set) => ({ + limitFps: false, fps: 60, camState: { position: new THREE.Vector3(0, 5, 10), target: new THREE.Vector3(0, 0, 0), }, + setLimitFps: (limitFps) => { + set((state) => { + state.limitFps = limitFps; + }); + }, + setFps: (fps) => { set((state) => { state.fps = fps;