@@ -91,6 +91,7 @@ export function SceneCanvas({
9191 null ,
9292 )
9393 const sceneBoundsRef = useRef ( sceneBounds )
94+ const requestRenderRef = useRef < ( ) => void > ( ( ) => { } )
9495
9596 useEffect ( ( ) => {
9697 sceneBoundsRef . current = sceneBounds
@@ -133,6 +134,7 @@ export function SceneCanvas({
133134 up,
134135 viewPreset,
135136 } )
137+ requestRenderRef . current ( )
136138 }
137139 resize ( )
138140 const updateCompass = ( ) => {
@@ -197,26 +199,40 @@ export function SceneCanvas({
197199 canvas . addEventListener ( "pointermove" , onPointerMove )
198200 canvas . addEventListener ( "pointerleave" , onPointerLeave )
199201
200- let animationFrame = 0
202+ let animationFrame : number | null = null
201203 const render = ( ) => {
202- animationFrame = window . requestAnimationFrame ( render )
203- controls . update ( )
204+ animationFrame = null
205+ const controlsMoved = controls . update ( )
204206 updateCompass ( )
205207 renderer . clear ( )
206208 renderer . render ( scene , camera )
207209 renderer . clearDepth ( )
208210 renderer . render ( overlayScene , camera )
211+ if ( controlsMoved ) {
212+ requestRender ( )
213+ }
209214 }
210- render ( )
215+ const requestRender = ( ) => {
216+ if ( animationFrame !== null ) {
217+ return
218+ }
219+ animationFrame = window . requestAnimationFrame ( render )
220+ }
221+ requestRenderRef . current = requestRender
222+ controls . addEventListener ( "change" , requestRender )
223+ requestRender ( )
211224
212225 const observer = new ResizeObserver ( resize )
213226 observer . observe ( canvas )
214227
215228 return ( ) => {
216- window . cancelAnimationFrame ( animationFrame )
229+ if ( animationFrame !== null ) {
230+ window . cancelAnimationFrame ( animationFrame )
231+ }
217232 observer . disconnect ( )
218233 canvas . removeEventListener ( "pointermove" , onPointerMove )
219234 canvas . removeEventListener ( "pointerleave" , onPointerLeave )
235+ controls . removeEventListener ( "change" , requestRender )
220236 controls . dispose ( )
221237 renderer . dispose ( )
222238 disposeScene ( scene )
@@ -228,6 +244,7 @@ export function SceneCanvas({
228244 controlsRef . current = null
229245 sceneRef . current = null
230246 overlaySceneRef . current = null
247+ requestRenderRef . current = ( ) => { }
231248 setCompassPoints ( null )
232249 }
233250 } , [ projection , up , viewPreset ] )
@@ -250,6 +267,7 @@ export function SceneCanvas({
250267 up,
251268 viewPreset,
252269 } )
270+ requestRenderRef . current ( )
253271 } , [ fitRequest ] )
254272
255273 useEffect ( ( ) => {
@@ -267,6 +285,7 @@ export function SceneCanvas({
267285 for ( const object of buildResult ?. overlayObjects ?? [ ] ) {
268286 overlayScene . add ( object )
269287 }
288+ requestRenderRef . current ( )
270289 } , [ buildScene , projection , up , viewPreset ] )
271290
272291 return (
0 commit comments