Skip to content

Commit 24cec65

Browse files
committed
chore: abstract wrapCallback and move render loop register to useRender
1 parent 25ac4a4 commit 24cec65

File tree

3 files changed

+40
-33
lines changed

3 files changed

+40
-33
lines changed

src/composables/useLoop/index.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,26 @@ export function useLoop() {
3030
advance,
3131
} = useTresContext()
3232

33-
function onBeforeRender(cb: Fn, index = 0) {
34-
const wrappedCallback = (params: LoopCallback) => {
33+
function wrapCallback(cb: Fn) {
34+
return (params: LoopCallback) => {
3535
cb({ ...params, camera: unref(camera) as TresCamera, scene: unref(scene), renderer: unref(renderer), raycaster: unref(raycaster), controls: unref(controls), invalidate, advance })
3636
}
37+
}
38+
39+
function onBeforeRender(cb: Fn, index = 0) {
40+
const wrappedCallback = wrapCallback(cb)
3741
const { off } = loop.register(wrappedCallback, 'before', index)
3842
return { off }
3943
}
4044

4145
function render(cb: Fn) {
42-
const wrappedCallback = (params: LoopCallback) => {
43-
cb({ ...params, camera: unref(camera) as TresCamera, scene: unref(scene), renderer: unref(renderer), raycaster: unref(raycaster), controls: unref(controls), invalidate, advance })
44-
}
46+
const wrappedCallback = wrapCallback(cb)
4547
const { off } = loop.register(wrappedCallback, 'render')
4648
return { off }
4749
}
4850

4951
function onAfterRender(cb: Fn, index = 0) {
50-
const wrappedCallback = (params: LoopCallback) => {
51-
cb({ ...params, camera: unref(camera) as TresCamera, scene: unref(scene), renderer: unref(renderer), raycaster: unref(raycaster), controls: unref(controls), invalidate, advance })
52-
}
52+
const wrappedCallback = wrapCallback(cb)
5353
const { off } = loop.register(wrappedCallback, 'after', index)
5454
return { off }
5555
}

src/composables/useRenderer/index.ts

+29-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import {
88
useDevicePixelRatio,
99
} from '@vueuse/core'
1010

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'
1213
import { useLogger } from '../useLogger'
1314
import type { EmitEventFn, TresColor } from '../../types'
1415
import { normalizeColor } from '../../utils/normalize'
1516

16-
import type { TresContext } from '../useTresContextProvider'
17+
import { type TresContext, useTresContext } from '../useTresContextProvider'
1718
import { get, merge, set } from '../../utils'
1819

1920
// 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(
9899
{
99100
canvas,
100101
options,
101-
contextParts: { sizes, render, invalidate, advance },
102+
scene,
103+
emit,
104+
contextParts: { camera, sizes, render, invalidate, advance, loop },
102105
}:
103106
{
104107
canvas: MaybeRef<HTMLCanvasElement>
105108
scene: Scene
106109
options: UseRendererOptions
107110
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 }
109112
disableRender: MaybeRefOrGetter<boolean>
110113
},
111114
) {
@@ -247,9 +250,31 @@ export function useRenderer(
247250
}
248251
})
249252

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+
250274
onUnmounted(() => {
251275
renderer.value.dispose()
252276
renderer.value.forceContextLoss()
277+
loop.stop()
253278
})
254279

255280
return {

src/composables/useTresContextProvider/index.ts

+3-21
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ export function useTresContextProvider({
141141
logWarning('`advance` can only be used when `renderMode` is set to `manual`')
142142
}
143143
}
144+
const loop = createRenderLoop()
144145

145146
const { renderer } = useRenderer(
146147
{
@@ -149,7 +150,7 @@ export function useTresContextProvider({
149150
options: rendererOptions,
150151
emit,
151152
// TODO: replace contextParts with full ctx at https://github.com/Tresjs/tres/issues/516
152-
contextParts: { sizes, camera, render, invalidate, advance },
153+
contextParts: { sizes, camera, render, invalidate, advance, loop },
153154
disableRender,
154155
},
155156
)
@@ -181,7 +182,7 @@ export function useTresContextProvider({
181182
registerCamera,
182183
setCameraActive,
183184
deregisterCamera,
184-
loop: createRenderLoop(),
185+
loop,
185186
}
186187

187188
provide('useTres', ctx)
@@ -193,25 +194,6 @@ export function useTresContextProvider({
193194

194195
// The loop
195196

196-
ctx.loop.register(() => {
197-
if (camera.value && render.frames.value > 0) {
198-
renderer.value.render(scene, camera.value)
199-
emit('render', ctx.renderer.value)
200-
}
201-
202-
// Reset priority
203-
render.priority.value = 0
204-
205-
if (render.mode.value === 'always') {
206-
render.frames.value = 1
207-
}
208-
else {
209-
render.frames.value = Math.max(0, render.frames.value - 1)
210-
}
211-
}, 'render')
212-
213-
ctx.loop.start()
214-
215197
onUnmounted(() => {
216198
ctx.loop.stop()
217199
})

0 commit comments

Comments
 (0)