index.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { useTresContext } from '..'
  2. import { createPriorityEventHook } from '../../utils/createPriorityEventHook'
  3. import type { RafLoopContext } from '../useCreateRafLoop'
  4. import type { TresPartialContext } from '../useTres'
  5. import { useTres } from '../useTres'
  6. export type LoopContext = RafLoopContext & TresPartialContext
  7. /**
  8. * Composable that provides control over the render loop and animation lifecycle.
  9. */
  10. export const useLoop = () => {
  11. const tresContext = useTres()
  12. const { renderer: rendererManager } = useTresContext()
  13. const eventHookBeforeRender = createPriorityEventHook<LoopContext>()
  14. const eventHookAfterRender = createPriorityEventHook<LoopContext>()
  15. rendererManager.loop.onBeforeLoop((loopContext) => {
  16. eventHookBeforeRender.trigger({ ...tresContext, ...loopContext })
  17. })
  18. rendererManager.loop.onLoop((loopContext) => {
  19. eventHookAfterRender.trigger({ ...tresContext, ...loopContext })
  20. })
  21. const render = rendererManager.loop.replaceLoopFunction
  22. return {
  23. stop: rendererManager.loop.stop,
  24. start: rendererManager.loop.start,
  25. isActive: rendererManager.loop.isActive,
  26. onBeforeRender: eventHookBeforeRender.on,
  27. onRender: eventHookAfterRender.on,
  28. render,
  29. }
  30. }