App.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <script setup lang="ts">
  2. import { onMounted, ref, h, computed, unref, watchEffect } from "vue";
  3. import { createApp } from "/@/hooks/userApp";
  4. import tagView from "/@/components/custom/tagView.vue";
  5. import LoadingLogo from "/@/components/basic/loading.vue";
  6. import MiniMap from "/@/components/basic/miniMap.vue";
  7. import FloorplanView from "/@/components/basic/floorplan.vue";
  8. import { useSceneStore } from "./store/modules/scene";
  9. import type { FloorsType } from "./store/modules/scene";
  10. import { useAppStore } from "./store/modules/app";
  11. const sceneStore = useSceneStore();
  12. const appStore = useAppStore();
  13. const dataLoaded = ref(false);
  14. const scene$ = ref<Nullable<HTMLElement>>(null);
  15. const refMiniMap = ref<Nullable<string>>(null);
  16. const flying = computed(() => appStore.flying);
  17. const player = computed(() => appStore.player);
  18. const metadata = computed(() => sceneStore.metadata);
  19. const mode = computed(() => appStore.mode);
  20. const controls = computed(() => {
  21. return metadata.value.controls;
  22. });
  23. const floorplanViewShow = computed(() => {
  24. return (
  25. Boolean(controls.value.showDollhouse) &&
  26. Boolean(controls.value.showFloorplan) &&
  27. mode.value !== "panorama"
  28. );
  29. });
  30. const show = ref(false);
  31. watchEffect(() => {
  32. console.warn("mode", mode);
  33. });
  34. onMounted(async () => {
  35. const app = await createApp({
  36. dom: scene$.value as HTMLElement,
  37. num: "KK-t-gpAaKxXhE9",
  38. mobile: true,
  39. });
  40. // SDK初始化
  41. app.use("MinMap", { theme: { camera_fillStyle: "#ED5D18" } });
  42. app.use("Tag");
  43. app.use("TourPlayer");
  44. app.use("TagView", {
  45. render(data) {
  46. if (data.media["image"] && data.media["image"].length) {
  47. return h(tagView, {
  48. sid: data.sid,
  49. url: app.resource.getUserResourceURL(data.media["image"][0].src),
  50. content: data.content,
  51. title: data.title,
  52. });
  53. }
  54. return `<span class="tag-icon animate" style="display:none"></span>`;
  55. },
  56. });
  57. app.use("TourPlayer");
  58. app.render();
  59. // SDK初始化结束
  60. // SDK global Event start
  61. app.Scene.on("ready", () => {
  62. show.value = true;
  63. });
  64. app.Scene.on("loaded", (pano) => {
  65. refMiniMap.value = "[xui_min_map]";
  66. appStore.setFloorId(pano.floorIndex);
  67. // store.commit("setFloorId", pano.floorIndex);
  68. // store.commit("rtc/setShowdaogou", true);
  69. // if (browser.getURLParam("roomId") && browser.getURLParam("vruserId") && browser.getURLParam("name")) {
  70. // store.commit("showShoppingguide", true);
  71. // }
  72. });
  73. app.store.on("metadata", (metadata: KankanMetaDataType) => {
  74. sceneStore.load(metadata);
  75. if (!metadata.controls.showMap) {
  76. app.MinMap.hide(true);
  77. }
  78. dataLoaded.value = true;
  79. });
  80. app.store.on("floorcad", ({ floors }: { floors: FloorsType[] }) => {
  81. if (floors?.length) {
  82. sceneStore.loadFloorData(floors);
  83. }
  84. });
  85. app.Camera.on("mode.beforeChange", ({ toMode, floorIndex, fromMode }) => {
  86. appStore.setMode(toMode);
  87. if (toMode != "dollhouse") {
  88. appStore.setFloorId(floorIndex);
  89. }
  90. if (fromMode) {
  91. appStore.setFlying(true);
  92. }
  93. });
  94. app.Camera.on("mode.afterChange", () => {
  95. appStore.setFlying(false);
  96. });
  97. app.Camera.on("flying.started", () => {
  98. appStore.setFlying(true);
  99. });
  100. app.Camera.on("flying.ended", ({ targetPano }) => {
  101. appStore.setFlying(false);
  102. appStore.setFloorId(targetPano.id);
  103. });
  104. });
  105. // SDK global Event end
  106. // method
  107. const changeMode = (name: string) => {
  108. if (!flying.value) {
  109. appStore.setMode(name);
  110. } else {
  111. appStore.setMode(name);
  112. }
  113. };
  114. </script>
  115. <template>
  116. <LoadingLogo :thumb="true" />
  117. <div class="ui-view-layout" :class="{ show: show }">
  118. <div class="scene" ref="scene$"></div>
  119. <template v-if="dataLoaded">
  120. <!-- 小地图 start -->
  121. <MiniMap
  122. :show="!!unref(refMiniMap) && player.showWidgets"
  123. :show-dollhouse="Boolean(controls.showDollhouse)"
  124. :to="refMiniMap"
  125. @change-mode="changeMode"
  126. />
  127. <!-- 小地图 end -->
  128. <!-- 平面图 start -->
  129. <FloorplanView
  130. :show="floorplanViewShow"
  131. :mode="mode"
  132. @change-mode="changeMode"
  133. />
  134. <!-- 平面图 end -->
  135. </template>
  136. </div>
  137. </template>
  138. <style lang="scss">
  139. @import "./app.scss";
  140. </style>