Skip to content

Commit

Permalink
added the option to advance a frame with frameloop set to "never"
Browse files Browse the repository at this point in the history
  • Loading branch information
grischaerbe committed May 18, 2022
1 parent 183dcef commit 272d17c
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/lib/Canvas.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
export let dpr: typeof devicePixelRatio = browser ? window.devicePixelRatio : 1
export let flat: boolean = false
export let linear: boolean = false
export let frameloop: 'always' | 'demand' = 'demand'
export let frameloop: 'always' | 'demand' | 'never' = 'demand'
export let debugFrameloop: boolean = false
export let shadows: boolean = true
export let shadowMapType: ShadowMapType = PCFSoftShadowMap
Expand Down
8 changes: 6 additions & 2 deletions src/lib/lib/contexts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export const createContexts = (
userSize: Writable<Size | undefined>,
parentSize: Writable<Size>,
debugFrameloop: boolean,
frameloop: 'always' | 'demand'
frameloop: 'always' | 'demand' | 'never'
): {
ctx: ThrelteContext
rootCtx: ThrelteRootContext
Expand Down Expand Up @@ -66,7 +66,8 @@ export const createContexts = (
frameInvalidated: true,
pointerInvalidated: true,
invalidations: {},
frameHandlers: new Set()
frameHandlers: new Set(),
advance: false
}

const ctx: ThrelteContext = {
Expand All @@ -89,6 +90,9 @@ export const createContexts = (
? renderCtx.invalidations[debugFrameloopMessage] + 1
: 1
}
},
advance: () => {
renderCtx.advance = true
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/lib/lib/frameloop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,9 @@ export const useFrameloop = (
useRaf(() => {
const shouldRender =
renderCtx.frameloop === 'always' ||
renderCtx.frameInvalidated ||
renderCtx.frameHandlers.size > 0
(renderCtx.frameloop === 'demand' &&
(renderCtx.frameInvalidated || renderCtx.frameHandlers.size > 0)) ||
(renderCtx.frameloop === 'never' && renderCtx.advance)

const shouldRaycast = shouldRender || renderCtx.pointerInvalidated

Expand All @@ -74,5 +75,6 @@ export const useFrameloop = (
}
debugFrame(renderCtx)
renderCtx.frameInvalidated = false
renderCtx.advance = false
})
}
10 changes: 9 additions & 1 deletion src/lib/types/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,17 +67,25 @@ export type ThrelteContext = {
scene: Scene
renderer?: WebGLRenderer
composer?: EffectComposer
/**
* Invalidates the current frame when frameloop === 'demand'
*/
invalidate: (debugFrameloopMessage?: string) => void
/**
* Advance one frame when frameloop === 'never'
*/
advance: () => void
}

export type ThrelteRenderContext = {
frameloop: 'always' | 'demand'
frameloop: 'always' | 'demand' | 'never'
debugFrameloop: boolean
pointerInvalidated: boolean
frameInvalidated: boolean
frame: number
invalidations: Record<string, number>
frameHandlers: Set<ThrelteFrameHandler>
advance: boolean
}

export type ThrelteAudioContext = {
Expand Down

0 comments on commit 272d17c

Please sign in to comment.