@@ -8,12 +8,13 @@ import {
8
8
useDevicePixelRatio ,
9
9
} from '@vueuse/core'
10
10
11
- import type { ColorSpace , Scene , ShadowMapType , ToneMapping , WebGLRendererParameters } from 'three'
11
+ import type { Camera , ColorSpace , Scene , ShadowMapType , ToneMapping , WebGLRendererParameters } from 'three'
12
+ import type { RendererLoop } from 'src/core/loop'
12
13
import { useLogger } from '../useLogger'
13
14
import type { EmitEventFn , TresColor } from '../../types'
14
15
import { normalizeColor } from '../../utils/normalize'
15
16
16
- import type { TresContext } from '../useTresContextProvider'
17
+ import { type TresContext , useTresContext } from '../useTresContextProvider'
17
18
import { get , merge , set } from '../../utils'
18
19
19
20
// Solution taken from Thretle that actually support different versions https://github.com/threlte/threlte/blob/5fa541179460f0dadc7dc17ae5e6854d1689379e/packages/core/src/lib/lib/useRenderer.ts
@@ -98,14 +99,16 @@ export function useRenderer(
98
99
{
99
100
canvas,
100
101
options,
101
- contextParts : { sizes, render, invalidate, advance } ,
102
+ scene,
103
+ emit,
104
+ contextParts : { camera, sizes, render, invalidate, advance, loop } ,
102
105
} :
103
106
{
104
107
canvas : MaybeRef < HTMLCanvasElement >
105
108
scene : Scene
106
109
options : UseRendererOptions
107
110
emit : EmitEventFn
108
- contextParts : Pick < TresContext , 'sizes' | 'camera' | 'render' > & { invalidate : ( ) => void , advance : ( ) => void }
111
+ contextParts : Pick < TresContext , 'sizes' | 'camera' | 'render' > & { invalidate : ( ) => void , advance : ( ) => void , loop : RendererLoop }
109
112
disableRender : MaybeRefOrGetter < boolean >
110
113
} ,
111
114
) {
@@ -247,9 +250,31 @@ export function useRenderer(
247
250
}
248
251
} )
249
252
253
+ // Register loop
254
+
255
+ loop . register ( ( ) => {
256
+ if ( camera . value && render . frames . value > 0 ) {
257
+ renderer . value . render ( scene , camera . value as Camera )
258
+ emit ( 'render' , renderer . value )
259
+ }
260
+
261
+ // Reset priority
262
+ render . priority . value = 0
263
+
264
+ if ( render . mode . value === 'always' ) {
265
+ render . frames . value = 1
266
+ }
267
+ else {
268
+ render . frames . value = Math . max ( 0 , render . frames . value - 1 )
269
+ }
270
+ } , 'render' )
271
+
272
+ loop . start ( )
273
+
250
274
onUnmounted ( ( ) => {
251
275
renderer . value . dispose ( )
252
276
renderer . value . forceContextLoss ( )
277
+ loop . stop ( )
253
278
} )
254
279
255
280
return {
0 commit comments