scenes.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { defineStore } from 'pinia'
  2. import { ref } from 'vue'
  3. import { createScene, deleteScene, fetchScenes, renameScene } from '../api/scenes'
  4. import { getViewer } from '../three/instance'
  5. import type { ScenePosition } from '../types'
  6. export const useScenesStore = defineStore('scenes', () => {
  7. const items = ref<ScenePosition[]>([])
  8. const loaded = ref(false)
  9. const loading = ref(false)
  10. async function load(force = false): Promise<void> {
  11. if (loaded.value && !force) return
  12. loading.value = true
  13. try {
  14. items.value = await fetchScenes()
  15. loaded.value = true
  16. } finally {
  17. loading.value = false
  18. }
  19. }
  20. function apply(scene: ScenePosition, animate = true): void {
  21. const viewer = getViewer()
  22. if (!viewer) return
  23. if (animate) viewer.flyToCamera(scene.camera, scene.target)
  24. else viewer.applyCamera(scene.camera, scene.target)
  25. }
  26. async function add(name: string): Promise<void> {
  27. const state = getViewer()?.getCameraState()
  28. if (!state) return
  29. const scene = await createScene(name, state.camera, state.target)
  30. items.value = [...items.value, scene]
  31. }
  32. async function rename(id: number, name: string): Promise<void> {
  33. const scene = await renameScene(id, name)
  34. const target = items.value.find((item) => item.id === id)
  35. if (target) target.name = scene.name
  36. }
  37. async function remove(id: number): Promise<void> {
  38. await deleteScene(id)
  39. items.value = items.value.filter((item) => item.id !== id)
  40. }
  41. function reset(): void {
  42. items.value = []
  43. loaded.value = false
  44. loading.value = false
  45. }
  46. return { items, loaded, loading, load, apply, add, rename, remove, reset }
  47. })