index.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { createEventHook, useRafFn } from '@vueuse/core'
  2. import { Clock } from 'three'
  3. export interface RafLoopContext { delta: number, elapsed: number }
  4. /**
  5. * @param cycleFn the function that is called before the after event hook is triggered and after the before event hook is triggered.
  6. */
  7. export const useCreateRafLoop = (cycleFn: () => void) => {
  8. const clock = new Clock()
  9. const eventHooks = {
  10. before: createEventHook<RafLoopContext>(),
  11. after: createEventHook<RafLoopContext>(),
  12. }
  13. const { pause, resume, isActive } = useRafFn(() => {
  14. const getContextWithClock = (): RafLoopContext => ({
  15. delta: clock.getDelta(),
  16. elapsed: clock.elapsedTime,
  17. })
  18. eventHooks.before.trigger(getContextWithClock())
  19. cycleFn()
  20. eventHooks.after.trigger(getContextWithClock())
  21. }, {
  22. immediate: false,
  23. })
  24. const start = () => {
  25. clock.start()
  26. resume()
  27. }
  28. const stop = () => {
  29. clock.stop()
  30. pause()
  31. }
  32. return {
  33. start,
  34. stop,
  35. isActive,
  36. onBeforeLoop: eventHooks.before.on,
  37. onLoop: eventHooks.after.on,
  38. }
  39. }