guide.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { SceneGuide, sdk } from "../sdk";
  2. import { toRaw, ref, watch, watchEffect } from "vue";
  3. import { viewModeStack, showLeftPanoStack, custom } from "@/env";
  4. import { togetherCallback, asyncTimeout } from "@/utils";
  5. import { fuseModels, isEdit, sysBus, fuseModelsLoaded } from "@/store";
  6. import type { FuseModel, FuseModels, Guide, GuidePath } from "@/store";
  7. import { analysisPoseInfo } from ".";
  8. import { fullView, isScenePlayRun, pauseScene, playScene } from "@/utils/full";
  9. // -----------------导览关联--------------------
  10. export const recovery = async (guide: Guide) => {
  11. let rFuseModels: (FuseModel & { viewShow: boolean })[];
  12. try {
  13. if (!guide.recoveryContent) {
  14. throw "没有recovery";
  15. }
  16. rFuseModels = JSON.parse(guide.recoveryContent);
  17. } catch (e) {
  18. return () => {};
  19. }
  20. const initFuseModels = JSON.parse(
  21. JSON.stringify(fuseModels.value)
  22. ) as FuseModels;
  23. const initViewShow = fuseModels.value.map((item) =>
  24. custom.showModelsMap.get(item)
  25. );
  26. const setModels = async (models: (FuseModel & { viewShow: boolean })[]) => {
  27. for (let i = 0; i < models.length; i++) {
  28. const ndx = fuseModels.value.findIndex(
  29. ({ modelId }) => modelId === models[i].modelId
  30. );
  31. if (~ndx) {
  32. Object.assign(fuseModels.value[ndx], models[i]);
  33. custom.showModelsMap.set(
  34. toRaw(fuseModels.value[ndx]),
  35. models[i].viewShow
  36. );
  37. } else {
  38. fuseModels.value.push(models[i]);
  39. custom.showModelsMap.set(toRaw(models[i]), models[i].viewShow);
  40. }
  41. }
  42. // console.log(models)
  43. for (let i = 0; i < fuseModels.value.length; i++) {
  44. const ndx = models.findIndex(
  45. ({ modelId }) => modelId === fuseModels.value[i].modelId
  46. );
  47. if (!~ndx) {
  48. fuseModels.value.splice(i, 1);
  49. i--;
  50. }
  51. }
  52. await asyncTimeout(100);
  53. await new Promise<void>((resolve) => {
  54. const stop = watchEffect(() => {
  55. if (fuseModelsLoaded.value) {
  56. setTimeout(() => stop());
  57. resolve();
  58. }
  59. });
  60. });
  61. };
  62. for (let i = 0; i < fuseModels.value.length; i++) {
  63. const ndx = rFuseModels.findIndex(
  64. ({ modelId }) => modelId === fuseModels.value[i].modelId
  65. );
  66. if (!~ndx) {
  67. rFuseModels.push({ ...fuseModels.value[i], viewShow: false });
  68. }
  69. }
  70. await setModels(rFuseModels);
  71. return () =>
  72. setModels(
  73. initFuseModels.map((item, i) => ({ ...item, viewShow: initViewShow[i]! }))
  74. );
  75. };
  76. export const playSceneGuide = (
  77. paths: GuidePath[],
  78. changeIndexCallback?: (index: number) => void,
  79. forceFull = false
  80. ) => {
  81. let sceneGuide: SceneGuide
  82. return playScene({
  83. create: () => {
  84. sceneGuide = sdk.enterSceneGuide(
  85. paths.map((path) => ({ ...path, ...analysisPoseInfo(path) }))
  86. );
  87. changeIndexCallback && sceneGuide.bus.on("changePoint", changeIndexCallback);
  88. },
  89. play: () => {
  90. sceneGuide.play();
  91. return new Promise((resolve) => sceneGuide.bus.on("playComplete", resolve))
  92. },
  93. pause: () => {
  94. console.error('pause??')
  95. sceneGuide.pause();
  96. },
  97. clear: () => {
  98. sceneGuide.clear();
  99. sceneGuide.bus.off("changePoint");
  100. }
  101. }, forceFull)
  102. }
  103. export const pauseSceneGuide = pauseScene
  104. export const isScenePlayIng = isScenePlayRun