Skip to content

Commit 8b648a7

Browse files
committed
feat: render state instead of internal
1 parent 6426856 commit 8b648a7

File tree

3 files changed

+50
-44
lines changed

3 files changed

+50
-44
lines changed

src/composables/useRenderer/index.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,14 @@ export function useRenderer(
111111
options,
112112
disableRender,
113113
emit,
114-
contextParts: { sizes, camera, internal, invalidate, advance },
114+
contextParts: { sizes, camera, render, invalidate, advance },
115115
}:
116116
{
117117
canvas: MaybeRef<HTMLCanvasElement>
118118
scene: Scene
119119
options: UseRendererOptions
120120
emit: (event: string, ...args: any[]) => void
121-
contextParts: Pick<TresContext, 'sizes' | 'camera' | 'internal'> & { invalidate: () => void; advance: () => void }
121+
contextParts: Pick<TresContext, 'sizes' | 'camera' | 'render'> & { invalidate: () => void; advance: () => void }
122122
disableRender: MaybeRefOrGetter<boolean>
123123
},
124124
) {
@@ -178,19 +178,19 @@ export function useRenderer(
178178
const { resume, onLoop } = useRenderLoop()
179179

180180
onLoop(() => {
181-
if (camera.value && !toValue(disableRender) && internal.frames.value > 0) {
181+
if (camera.value && !toValue(disableRender) && render.frames.value > 0) {
182182
renderer.value.render(scene, camera.value)
183183
emit('render', renderer.value)
184184
}
185185

186186
// Reset priority
187-
internal.priority.value = 0
187+
render.priority.value = 0
188188

189189
if (toValue(options.renderMode) === 'always') {
190-
internal.frames.value = 1
190+
render.frames.value = 1
191191
}
192192
else {
193-
internal.frames.value = Math.max(0, internal.frames.value - 1)
193+
render.frames.value = Math.max(0, render.frames.value - 1)
194194
}
195195

196196
})
@@ -245,7 +245,7 @@ export function useRenderer(
245245

246246
if (renderMode === 'always') {
247247
// If the render mode is 'always', ensure there's always a frame pending
248-
internal.frames.value = Math.max(1, internal.frames.value)
248+
render.frames.value = Math.max(1, render.frames.value)
249249
}
250250

251251
const getValue = <T>(option: MaybeRefOrGetter<T>, pathInThree: string): T | undefined => {

src/composables/useTresContextProvider/index.ts

+42-36
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ export interface InternalState {
1616
maxFrames: number
1717
}
1818

19+
export interface RenderState {
20+
/**
21+
* If set to 'on-demand', the scene will only be rendered when the current frame is invalidated
22+
* If set to 'manual', the scene will only be rendered when advance() is called
23+
* If set to 'always', the scene will be rendered every frame
24+
*/
25+
mode: Ref<'always' | 'on-demand' | 'manual'>
26+
priority: Ref<number>
27+
frames: Ref<number>
28+
maxFrames: number
29+
canBeInvalidated: ComputedRef<boolean>
30+
}
31+
1932
export interface PerformanceState {
2033
maxFrames: number
2134
fps: {
@@ -39,21 +52,14 @@ export interface TresContext {
3952
renderer: ShallowRef<WebGLRenderer>
4053
raycaster: ShallowRef<Raycaster>
4154
perf: PerformanceState
42-
/**
43-
* If set to 'on-demand', the scene will only be rendered when the current frame is invalidated
44-
* If set to 'manual', the scene will only be rendered when advance() is called
45-
* If set to 'always', the scene will be rendered every frame
46-
*/
47-
renderMode: Ref<'always' | 'on-demand' | 'manual'>
48-
canBeInvalidated: ComputedRef<boolean>
49-
internal: InternalState
55+
render: RenderState
5056
/**
5157
* Invalidates the current frame when renderMode === 'on-demand'
5258
*/
5359
invalidate: () => void
5460
/**
55-
* Advance one frame when renderMode === 'manual'
56-
*/
61+
* Advance one frame when renderMode === 'manual'
62+
*/
5763
advance: () => void
5864
registerCamera: (camera: Camera) => void
5965
setCameraActive: (cameraOrUuid: Camera | string) => void
@@ -112,17 +118,20 @@ export function useTresContextProvider({
112118
setCameraActive,
113119
} = useCamera({ sizes, scene })
114120

115-
// Initialize internal state
116-
const internal: InternalState = {
121+
// Render state
122+
123+
const render: RenderState = {
124+
mode: ref<'always' | 'on-demand' | 'manual'>(rendererOptions.renderMode || 'always'),
117125
priority: ref(0),
118126
frames: ref(0),
119127
maxFrames: 60,
128+
canBeInvalidated: computed(() => render.mode.value === 'on-demand' && render.frames.value === 0),
120129
}
121130

122131
function invalidate(frames = 1) {
123132
// Increase the frame count, ensuring not to exceed a maximum if desired
124133
if (rendererOptions.renderMode === 'on-demand') {
125-
internal.frames.value = Math.min(internal.maxFrames, internal.frames.value + frames)
134+
render.frames.value = Math.min(render.maxFrames, render.frames.value + frames)
126135
}
127136
else {
128137
logWarning('`invalidate` can only be used when `renderMode` is set to `on-demand`')
@@ -131,7 +140,7 @@ export function useTresContextProvider({
131140

132141
function advance() {
133142
if (rendererOptions.renderMode === 'manual') {
134-
internal.frames.value = 1
143+
render.frames.value = 1
135144
}
136145
else {
137146
logWarning('`advance` can only be used when `renderMode` is set to `manual`')
@@ -144,13 +153,12 @@ export function useTresContextProvider({
144153
canvas,
145154
options: rendererOptions,
146155
emit,
147-
contextParts: { sizes, camera, internal, invalidate, advance },
156+
// TODO: replace contextParts with full ctx at https://github.com/Tresjs/tres/issues/516
157+
contextParts: { sizes, camera, render, invalidate, advance },
148158
disableRender,
149159
})
150160

151-
const renderMode = ref<'always' | 'on-demand' | 'manual'>(rendererOptions.renderMode || 'always')
152-
153-
const toProvide: TresContext = {
161+
const ctx: TresContext = {
154162
sizes,
155163
scene: localScene,
156164
camera,
@@ -170,9 +178,7 @@ export function useTresContextProvider({
170178
accumulator: [],
171179
},
172180
},
173-
renderMode,
174-
canBeInvalidated: computed(() => renderMode.value === 'on-demand' && internal.frames.value === 0),
175-
internal,
181+
render,
176182
advance,
177183
extend,
178184
invalidate,
@@ -181,10 +187,10 @@ export function useTresContextProvider({
181187
deregisterCamera,
182188
}
183189

184-
provide('useTres', toProvide)
190+
provide('useTres', ctx)
185191

186192
// Add context to scene.userData
187-
toProvide.scene.value.userData.tres__context = toProvide
193+
ctx.scene.value.userData.tres__context = ctx
188194

189195
// Performance
190196
const updateInterval = 100 // Update interval in milliseconds
@@ -197,33 +203,33 @@ export function useTresContextProvider({
197203

198204
// Update WebGL Memory Usage (Placeholder for actual logic)
199205
// perf.memory.value = calculateMemoryUsage(gl)
200-
if (toProvide.scene.value) {
201-
toProvide.perf.memory.allocatedMem = calculateMemoryUsage(toProvide.scene.value as unknown as TresObject)
206+
if (ctx.scene.value) {
207+
ctx.perf.memory.allocatedMem = calculateMemoryUsage(ctx.scene.value as unknown as TresObject)
202208
}
203209

204210
// Update memory usage
205211
if (timestamp - lastUpdateTime >= updateInterval) {
206212
lastUpdateTime = timestamp
207213

208214
// Update FPS
209-
toProvide.perf.fps.accumulator.push(fps.value as never)
215+
ctx.perf.fps.accumulator.push(fps.value as never)
210216

211-
if (toProvide.perf.fps.accumulator.length > maxFrames) {
212-
toProvide.perf.fps.accumulator.shift()
217+
if (ctx.perf.fps.accumulator.length > maxFrames) {
218+
ctx.perf.fps.accumulator.shift()
213219
}
214220

215-
toProvide.perf.fps.value = fps.value
221+
ctx.perf.fps.value = fps.value
216222

217223
// Update memory
218224
if (isSupported.value && memory.value) {
219-
toProvide.perf.memory.accumulator.push(memory.value.usedJSHeapSize / 1024 / 1024 as never)
225+
ctx.perf.memory.accumulator.push(memory.value.usedJSHeapSize / 1024 / 1024 as never)
220226

221-
if (toProvide.perf.memory.accumulator.length > maxFrames) {
222-
toProvide.perf.memory.accumulator.shift()
227+
if (ctx.perf.memory.accumulator.length > maxFrames) {
228+
ctx.perf.memory.accumulator.shift()
223229
}
224230

225-
toProvide.perf.memory.currentMem
226-
= toProvide.perf.memory.accumulator.reduce((a, b) => a + b, 0) / toProvide.perf.memory.accumulator.length
231+
ctx.perf.memory.currentMem
232+
= ctx.perf.memory.accumulator.reduce((a, b) => a + b, 0) / ctx.perf.memory.accumulator.length
227233

228234
}
229235
}
@@ -243,7 +249,7 @@ export function useTresContextProvider({
243249

244250
// Check if the accumulated time is greater than or equal to the interval
245251
if (accumulatedTime >= interval) {
246-
window.__TRES__DEVTOOLS__.cb(toProvide)
252+
window.__TRES__DEVTOOLS__.cb(ctx)
247253

248254
// Reset the accumulated time
249255
accumulatedTime = 0
@@ -255,7 +261,7 @@ export function useTresContextProvider({
255261
pause()
256262
})
257263

258-
return toProvide
264+
return ctx
259265
}
260266

261267
export function useTresContext(): TresContext {

src/core/nodeOps.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function invalidateInstance(instance: TresObject) {
2828

2929
if (!ctx) return
3030

31-
if (ctx.canBeInvalidated.value) {
31+
if (ctx.render && ctx.render.canBeInvalidated.value) {
3232
ctx.invalidate()
3333
}
3434

0 commit comments

Comments
 (0)