SPG.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <template>
  2. <Password />
  3. <LoadingLogo :thumb="true" />
  4. <div class="ui-view-layout" :class="{ show: show }">
  5. <div class="scene" ref="scene$"></div>
  6. <!-- <template v-show="sceneUi"> -->
  7. <div>
  8. <UiTags />
  9. <Information />
  10. <BottomControl />
  11. </div>
  12. <!-- </template> -->
  13. </div>
  14. <DesignOption />
  15. </template>
  16. <script setup>
  17. import { useMusicPlayer } from '@/utils/sound'
  18. const musicPlayer = useMusicPlayer()
  19. import UiTags from '@/components/Tags'
  20. import DesignOption from './DesignOption'
  21. import Information from '@/components/Information'
  22. import BottomControl from '@/components/Controls/BottomControl'
  23. import Password from '@/components/shared/Password.vue'
  24. import LoadingLogo from '@/components/shared/Loading.vue'
  25. import { createApp } from '@/app'
  26. import { listenMessage } from '@/utils/messageHandler'
  27. import {Dialog} from '@/global_components'
  28. import { ref, onMounted, computed } from 'vue'
  29. import { useStore } from 'vuex'
  30. import { useApp, getApp } from '@/app'
  31. import browser from '@/utils/browser'
  32. import { useI18n, getLocale } from '@/i18n'
  33. const { t } = useI18n({ useScope: 'global' })
  34. const autoPlayMedia = player => {
  35. function onclick() {
  36. window.parent.postMessage(
  37. {
  38. source: "qjkankan",
  39. event: "autoPlayBgm",
  40. params: {
  41. status: true,
  42. },
  43. },
  44. "*"
  45. );
  46. $player.removeEventListener('click', onclick)
  47. $player.removeEventListener('touchstart', onclick)
  48. }
  49. const $player = document.querySelector('.player')
  50. $player.addEventListener('click', onclick)
  51. $player.addEventListener('touchstart', onclick)
  52. }
  53. const store = useStore()
  54. const show = ref(false)
  55. const scene$ = ref(null)
  56. const sceneUI = computed(() => store.getters['sceneUI'])
  57. listenMessage()
  58. onMounted(() => {
  59. const app = createApp({
  60. num: browser.getURLParam('m'),
  61. dom: scene$.value,
  62. lang: getLocale(),
  63. langs: {
  64. en: {
  65. 'model.enter': t('model.enter'),
  66. },
  67. },
  68. useShortcutKeys: true,
  69. })
  70. app.use("MinMap", { theme: { camera_fillStyle: "#0076f6" } });
  71. app.use('Tag')
  72. app.use('TourPlayer')
  73. app.Scene.lock()
  74. app.Scene.on('ready', () => {
  75. show.value = true
  76. })
  77. app.Scene.on('error', data => {
  78. console.error(data)
  79. switch (data.code) {
  80. case 5033:
  81. window.location.replace(`/5033.html?m=` + browser.getURLParam('m'))
  82. break
  83. case 5034:
  84. window.location.replace(`/5034.html?m=` + browser.getURLParam('m'))
  85. break
  86. case 5009:
  87. window.location.replace(`/5034.html?m=` + browser.getURLParam('m'))
  88. break
  89. case 5005:
  90. Dialog.toast({
  91. content: t('guide.no_scene'),
  92. type: 'error',
  93. })
  94. break
  95. }
  96. })
  97. app.Scene.on('loaded', pano => {
  98. store.commit('setFloorId', pano.floorIndex)
  99. useMusicPlayer()
  100. let music = store.getters['scene/musicURL']
  101. window.parent.postMessage(
  102. {
  103. source: "qjkankan",
  104. event: "fdkkBgmLink",
  105. params: {
  106. music,
  107. },
  108. },
  109. "*"
  110. );
  111. autoPlayMedia()
  112. })
  113. app.store.on('tags', tags => {
  114. store.commit('tag/load', tags)
  115. })
  116. app.store.on('metadata', metadata => {
  117. store.commit('scene/load', metadata)
  118. console.log(metadata, 'metadata');
  119. if (!metadata.controls.showMap) {
  120. app.MinMap.hide(true)
  121. }
  122. })
  123. app.Scene.on('panorama.videorenderer.resumerender', () => {
  124. console.log(1111111);
  125. window.parent.postMessage(
  126. {
  127. source: "qjkankan",
  128. event: "togglefdkkBGM",
  129. params: {
  130. paly: false,
  131. },
  132. },
  133. "*"
  134. );
  135. window.parent.postMessage(
  136. {
  137. source: "qjkankan",
  138. event: "toggleBgmStatus",
  139. params: {
  140. status: false,
  141. },
  142. },
  143. "*"
  144. );
  145. })
  146. app.Scene.on('panorama.videorenderer.suspendrender', async () => {
  147. let player = await getApp().TourManager.player
  148. if (!player.isPlaying) {
  149. // musicPlayer.resume()
  150. window.parent.postMessage(
  151. {
  152. source: "qjkankan",
  153. event: "togglefdkkBGM",
  154. params: {
  155. paly: true,
  156. },
  157. },
  158. "*"
  159. );
  160. window.parent.postMessage(
  161. {
  162. source: "qjkankan",
  163. event: "toggleBgmStatus",
  164. params: {
  165. status: true,
  166. },
  167. },
  168. "*"
  169. );
  170. }
  171. })
  172. app.Camera.on('mode.beforeChange', ({ fromMode, toMode, floorIndex }) => {
  173. if (fromMode) {
  174. store.commit('setFlying', true)
  175. }
  176. })
  177. app.Camera.on('mode.afterChange', ({ toMode, floorIndex }) => {
  178. store.commit('setFlying', false)
  179. })
  180. app.Camera.on('flying.started', pano => {
  181. store.commit('setFlying', true)
  182. })
  183. app.Camera.on('flying.ended', ({ targetPano }) => {
  184. store.commit('setFlying', false)
  185. store.commit('setPanoId', targetPano.id)
  186. })
  187. app.TourManager.on('loaded', async tour => {
  188. let tours = JSON.parse(
  189. JSON.stringify(app.TourManager.tours, (key, val) => {
  190. if (key === 'audio') {
  191. return null
  192. } else {
  193. return val
  194. }
  195. })
  196. )
  197. store.commit('tour/setData', {
  198. tours: tours,
  199. })
  200. window.parent.postMessage(
  201. {
  202. source: "qjkankan",
  203. event: "toursList",
  204. params: {
  205. tours,
  206. },
  207. },
  208. "*"
  209. );
  210. store.commit('tour/setBackUp', {
  211. tours: JSON.parse(
  212. JSON.stringify(app.TourManager.tours, (key, val) => {
  213. if (key === 'audio') {
  214. return null
  215. } else {
  216. return val
  217. }
  218. })
  219. ),
  220. })
  221. })
  222. app.store.on('floorcad', floor => store.commit('scene/loadFloorData', floor))
  223. app.store.on('flooruser', floor => store.commit('scene/loadFloorData', floor)) //4.7以后新楼层方式
  224. app.render()
  225. })
  226. </script>