|
@@ -1,46 +1,14 @@
|
|
|
-import { sdk } from "../sdk";
|
|
|
+import { SceneGuide, sdk } from "../sdk";
|
|
|
import { toRaw, ref, watch, watchEffect } from "vue";
|
|
|
import { viewModeStack, showLeftPanoStack, custom } from "@/env";
|
|
|
import { togetherCallback, asyncTimeout } from "@/utils";
|
|
|
import { fuseModels, isEdit, sysBus, fuseModelsLoaded } from "@/store";
|
|
|
import type { FuseModel, FuseModels, Guide, GuidePath } from "@/store";
|
|
|
import { analysisPoseInfo } from ".";
|
|
|
+import { fullView, isScenePlayRun, pauseScene, playScene } from "@/utils/full";
|
|
|
|
|
|
// -----------------导览关联--------------------
|
|
|
|
|
|
-const fullView = async (fn: () => void) => {
|
|
|
- const popViewMode = togetherCallback([
|
|
|
- viewModeStack.push(ref("full")),
|
|
|
- showLeftPanoStack.push(ref(false)),
|
|
|
- ]);
|
|
|
- let isFull = false;
|
|
|
- try {
|
|
|
- await document.documentElement.requestFullscreen();
|
|
|
- isFull = true;
|
|
|
- } catch {}
|
|
|
-
|
|
|
- const driving = () => document.fullscreenElement || fn();
|
|
|
- const stop = (ev: KeyboardEvent) => ev.key == "Escape" && fn();
|
|
|
-
|
|
|
- if (isFull) {
|
|
|
- document.addEventListener("fullscreenchange", driving);
|
|
|
- document.addEventListener("fullscreenerror", fn);
|
|
|
- } else {
|
|
|
- document.addEventListener("keyup", stop);
|
|
|
- }
|
|
|
-
|
|
|
- return () => {
|
|
|
- popViewMode();
|
|
|
- if (isFull) {
|
|
|
- document.fullscreenElement && document.exitFullscreen();
|
|
|
- document.removeEventListener("fullscreenchange", driving);
|
|
|
- document.removeEventListener("fullscreenerror", fn);
|
|
|
- } else {
|
|
|
- document.removeEventListener("keyup", stop);
|
|
|
- }
|
|
|
- };
|
|
|
-};
|
|
|
-
|
|
|
export const recovery = async (guide: Guide) => {
|
|
|
let rFuseModels: (FuseModel & { viewShow: boolean })[];
|
|
|
try {
|
|
@@ -112,67 +80,32 @@ export const recovery = async (guide: Guide) => {
|
|
|
);
|
|
|
};
|
|
|
|
|
|
-export enum ScenePlayIngEnum {
|
|
|
- ing = 1,
|
|
|
- stop = 0,
|
|
|
- ready = 2,
|
|
|
-}
|
|
|
-export const isScenePlayIng = ref<ScenePlayIngEnum>(ScenePlayIngEnum.stop);
|
|
|
-let pauseRecovery: () => void;
|
|
|
-export const playSceneGuide = async (
|
|
|
+export const playSceneGuide = (
|
|
|
paths: GuidePath[],
|
|
|
changeIndexCallback?: (index: number) => void,
|
|
|
forceFull = false
|
|
|
) => {
|
|
|
- if (isScenePlayIng.value) {
|
|
|
- throw new Error("导览正在播放");
|
|
|
- }
|
|
|
- isScenePlayIng.value = ScenePlayIngEnum.ready;
|
|
|
- // pauseRecovery = await recovery(guide)
|
|
|
- isScenePlayIng.value = ScenePlayIngEnum.ing;
|
|
|
-
|
|
|
- const sceneGuide = sdk.enterSceneGuide(
|
|
|
- paths.map((path) => ({ ...path, ...analysisPoseInfo(path) }))
|
|
|
- );
|
|
|
-
|
|
|
- changeIndexCallback && sceneGuide.bus.on("changePoint", changeIndexCallback);
|
|
|
-
|
|
|
- const quitHandler = pauseSceneGuide;
|
|
|
- const clearHandler =
|
|
|
- !forceFull && isEdit.value ? null : await fullView(quitHandler);
|
|
|
- if (!clearHandler) {
|
|
|
- sysBus.on("leave", quitHandler, { last: true });
|
|
|
- sysBus.on("save", quitHandler, { last: true });
|
|
|
- }
|
|
|
-
|
|
|
- sceneGuide.play();
|
|
|
- const reces = [
|
|
|
- new Promise((resolve) => sceneGuide.bus.on("playComplete", resolve)),
|
|
|
- new Promise<void>((resolve) => {
|
|
|
- const stop = watch(isScenePlayIng, () => {
|
|
|
- if (!isScenePlayIng.value) {
|
|
|
- resolve();
|
|
|
- sceneGuide.pause();
|
|
|
- stop();
|
|
|
- }
|
|
|
- });
|
|
|
- }),
|
|
|
- ];
|
|
|
-
|
|
|
- await Promise.race(reces);
|
|
|
- pauseSceneGuide();
|
|
|
-
|
|
|
- if (clearHandler) {
|
|
|
- clearHandler();
|
|
|
- } else {
|
|
|
- sysBus.off("leave", quitHandler);
|
|
|
- sysBus.off("save", quitHandler);
|
|
|
- }
|
|
|
- sceneGuide.clear();
|
|
|
- sceneGuide.bus.off("changePoint");
|
|
|
-};
|
|
|
+ let sceneGuide: SceneGuide
|
|
|
+ playScene({
|
|
|
+ create: () => {
|
|
|
+ sceneGuide = sdk.enterSceneGuide(
|
|
|
+ paths.map((path) => ({ ...path, ...analysisPoseInfo(path) }))
|
|
|
+ );
|
|
|
+ changeIndexCallback && sceneGuide.bus.on("changePoint", changeIndexCallback);
|
|
|
+ },
|
|
|
+ play: () => {
|
|
|
+ sceneGuide.play();
|
|
|
+ return new Promise((resolve) => sceneGuide.bus.on("playComplete", resolve))
|
|
|
+ },
|
|
|
+ pause: () => {
|
|
|
+ sceneGuide.pause();
|
|
|
+ },
|
|
|
+ clear: () => {
|
|
|
+ sceneGuide.clear();
|
|
|
+ sceneGuide.bus.off("changePoint");
|
|
|
+ }
|
|
|
+ }, forceFull)
|
|
|
+}
|
|
|
|
|
|
-export const pauseSceneGuide = () => {
|
|
|
- isScenePlayIng.value = ScenePlayIngEnum.stop;
|
|
|
- pauseRecovery! && pauseRecovery();
|
|
|
-};
|
|
|
+export const pauseSceneGuide = pauseScene
|
|
|
+export const isScenePlayIng = isScenePlayRun
|