Jelajahi Sumber

音频控制

xzw 3 tahun lalu
induk
melakukan
1eb06082f3
5 mengubah file dengan 448 tambahan dan 1289 penghapusan
  1. 54 44
      js/Hot.js
  2. 1 1
      js/edit.js
  3. 47 536
      js/main_2020_edit.js
  4. 63 612
      js/main_2020_show.js
  5. 283 96
      js/manage.js

+ 54 - 44
js/Hot.js

@@ -1,19 +1,9 @@
  
 //合并热点和展览 
-
+g_currentHot = null
 
 window.initHot = function(model){
-    
-    
-    
-
-    
-    
-    
-    
-    
-    
-    
+      
     var objLoader = new THREE.OBJLoader()    
     var _planeGeometry = new THREE.PlaneGeometry(1,1)
     var _boxGeometry = new THREE.BoxBufferGeometry(1,1,1)
@@ -137,7 +127,7 @@ window.initHot = function(model){
     class Hot extends THREE.Object3D{
         constructor(info, source){    
             super()
-            
+             
             
             this.sid = info.sid;
             this.preDeal(info, source)// source:来源
@@ -399,6 +389,7 @@ window.initHot = function(model){
                     }
                     this.changeShineTex(this.styleImg)
                 }
+                this.info.texSrc = null
             }
             if(this.material_.map){
                 /*  this.material_.map.minFilter = THREE.LinearFilter;
@@ -778,10 +769,10 @@ window.initHot = function(model){
                 return this.cornerPoints[player.currentPano.id]
             }else{
                 var boundPoint,  cornerPoint
+                var center//中心点
                 if(this.plane){ 
-                    var center = this.plane.position.clone()
-                    boundPoint = [
-                        center,
+                    center = this.plane.getWorldPosition()
+                    boundPoint = [ 
                         new THREE.Vector3(-0.5, 0.5, 0),
                         new THREE.Vector3(0.5, 0.5, 0),
                         new THREE.Vector3(0.5, -0.5, 0),
@@ -810,11 +801,11 @@ window.initHot = function(model){
                 var maxLat = -Infinity
                 var minLat = +Infinity
                 var pos1 = player.currentPano.position.clone();
-                var pos2 = this.position.clone()
-                var dir = pos2.clone().sub(pos1).normalize()
+                center = this.position.clone()  //模型bound的中心点已经位移到了hot中心点。 注意不能用getWorldPosition,得到的会是偏移的
+                var dir = center.clone().sub(pos1).normalize()
                 var centerDirInfo = { } 
                 player.cameraControls.controls.panorama.lookAt.call( centerDirInfo , null, dir )
-                    
+                     
                 boundPoint.forEach(e=>{//lon左右
                     var point = e.applyMatrix4(this.mesh.matrixWorld);
                     var dir = point.clone().sub(pos1).normalize()
@@ -856,19 +847,18 @@ window.initHot = function(model){
                         math.getDirByLonLat(minLon, minLat),
                         math.getDirByLonLat(maxLon, minLat),
                         math.getDirByLonLat(minLon, maxLat),
-                    ]
- 
+                    ] 
                     cornerPoint = dirs.map(e=>{
                         return e.clone().add(pos1) 
                     })
-                       
+                    cornerPoint = [center, ...cornerPoint]   //最后增加一个中心点
                 
                 
                 }
                 
-                if(this.objObject){
+                /* if(this.objObject){
                     cornerPoint = [pos2, ...cornerPoint]
-                }
+                } */
                 
                 
                 //addPoints(cornerPoint)
@@ -1032,12 +1022,12 @@ window.initHot = function(model){
               , n = []
               , r = this.mesh.getWorldPosition();
             if (e === "panorama") {
-                var o = t.position.clone().sub(r).normalize();
-                n.push(function(t, i) {//scoreFunctions.direction
+                /* var o = t.position.clone().sub(r).normalize();
+                n.push(function(t, i) {//scoreFunctions.direction 最好这个漫游点在currentPano到热点之间的路径上。但是这样的话可能就看不到热点正面,所以删掉
                     return function(e) {
-                        return e.position.clone().sub(t).normalize().dot(i) * window._settings.navigation.directionFactor
+                        return e.position.clone().sub(t).normalize().dot(i) * window._settings.navigation.directionFactor 
                     }}(r, o)
-                )
+                ) */  
             }
             var a = new THREE.Vector3;
             i.push(function(e) {
@@ -1114,9 +1104,9 @@ window.initHot = function(model){
                     exit.style["z-index"] = "3"
                     exit.onclick = ()=>{
                         $(div).remove()
-                        if(g_bgAudio && g_bgAudio.pauseByHot){
-                            manage.switchBgmState(true)
-                        }
+                        
+                        Hot.closePopup()
+                        
                     }  
                     
                     var myElement = document.createElement("iframe");
@@ -1130,12 +1120,8 @@ window.initHot = function(model){
                     div.appendChild(exit);
                     div.appendChild(myElement)
                     
+                    SoundManager.play('hot')
                     
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        manage.switchBgmState(false); 
-                        g_bgAudio.pauseByHot = true
-                    } 
-                    if(g_tourAudio)g_tourAudio.pause()
                     
                 }
                 
@@ -1154,11 +1140,9 @@ window.initHot = function(model){
                 popup.style.display = "block",
                 popup.classList.add("wait");
                 var n = document.createElement("iframe");
-                if(g_bgAudio && !g_bgAudio.paused){
-                    manage.switchBgmState(false); 
-                    g_bgAudio.pauseByHot = true
-                } 
-                if(g_tourAudio)g_tourAudio.pause()
+                 
+                SoundManager.play('hot')
+                
                 var src = getLink(this.info.link   )
                 n.src = src;
                 n.id = "id1",
@@ -1196,7 +1180,7 @@ window.initHot = function(model){
                 return;
             }
         
-            var c = /* m.tags.navigate.nearestPano && */ this.closestPanoTowardTag(player.mode, player.currentPano) || player.currentPano
+            var c = this.closestPanoTowardTag(player.mode, player.currentPano) || player.currentPano
               , h = this.mesh.getWorldPosition();
             player.flyingToTag = !0;
             
@@ -1337,7 +1321,7 @@ window.initHot = function(model){
         
         requestDownload(type,callback) { 
             var plane = this.plane;
-            
+             
             if(type == 'photo'){
                 if(this.photoHasRequestLoad || this.texType != 'photo')return;
                 console.log('overlay beginDownload : ' + this.sid)
@@ -1353,7 +1337,7 @@ window.initHot = function(model){
                     
                     setTimeout(Hot.loadNext, 50) 
                     hotGroup.children.forEach(e=>{
-                        if(e.info.texSrc == this.info.texSrc){ 
+                        if(e.info.texSrc == this.info.texSrc && e.info.texType == type  ){ 
                             e.material_.color.set("#FFFFFF") 
                             e.material_.opacity = 1;
                             console.log('overlay loaded: ' + e.sid + " - " + this.info.texSrc.split('/').pop());
@@ -1585,6 +1569,32 @@ window.initHot = function(model){
     }  
      */
      
+    //判断是否是移动端,如果是给关闭按钮添加touchstart事件
+    
+    
+     
+    
+    Hot.closePopup = ()=>{// 关闭热点页面
+        if(!g_currentHot) return;
+        g_currentHot = null;
+        var hotPop = document.getElementById('popup'); 
+            hotPop.style.display = "none";
+        document.querySelector(".popup-content").removeChild(document.getElementById("id1"));
+        $("#popup iframe:last").remove();
+         
+        
+        SoundManager.pause('hot', true)//自动播放被中断的音频 (bgm
+        
+         
+        return false
+    }  
+        
+ 
+    if(browser.isMobile()){
+        $('#closepop').on("touchstart",Hot.closePopup); 
+    }else{
+        $('#closepop').on("click",Hot.closePopup); 
+    }
     
 
 }

+ 1 - 1
js/edit.js

@@ -2047,7 +2047,7 @@ Hotpoint.prototype.initListSelect = function(){//热点样式图列表
                     object.scale.set(s,s,s)
                     
                     let center = bound.center()
-                    object.position.copy(center).negate().multiplyScalar(s)
+                    object.position.copy(center).negate().multiplyScalar(s)//保证模型的中心点和hot中心点重合
                     
                     object.modelBound = {
                         bound,

+ 47 - 536
js/main_2020_edit.js

@@ -2,29 +2,7 @@ window.common = null;
 window.MathLight = null;
 window.math = null
 
-
-g_playAudio = null
-
-g_tourAudio = new Audio 
-g_tourAudio.loop = !1 
-g_tourAudio.crossOrigin = "anonymous" 
-g_tourAudio.addEventListener("ended", function() {
-    var e = document.createEvent("MouseEvent");
-    e.initEvent("tourAudioEnded", !0, !0),
-    window.dispatchEvent(e)
-}) 
-
-g_tourAudio.oncanplaythrough = function() {
-    g_tourAudio.play();
-    /* if(g_bgAudio && !g_bgAudio.paused){
-        manage.switchBgmState(false); 
-        g_bgAudio.pauseByTour = true
-    } */
-    g_playAudio = g_tourAudio;  
-}
-
-
-
+ 
 var dealMap = (map)=>{//使不resize  when   image is not power of two
     map.wrapS = map.wrapT = THREE.ClampToEdgeWrapping; 
     map.minFilter = THREE.LinearFilter;
@@ -35,7 +13,7 @@ var dealMap = (map)=>{//使不resize  when   image is not power of two
  
 
 
-var sortByScore = function(list, request, rank) {
+/* var sortByScore = function(list,g_tourAudio request, rank) {
     var i = common.filterAll(list, request);
     return 0 === i.length ? null : i = i.map(function(e) {
         return {
@@ -48,7 +26,7 @@ var sortByScore = function(list, request, rank) {
         return t.score - e.score;
     });
 };
-
+ */
 var getTransformSid = function(){
     var name
     if(player.mode == 'panorama'){
@@ -4581,7 +4559,7 @@ function o(a, s, l) {
                 if (this.currentItem = null,
                 this.destinationItem = null,
                 this.tourIsPlaying = !1,
-                this.bgmReplay(),
+                //this.bgmReplay(),
                 this.transitionStage = v.None,
                 this.nextFunc = null,
                 this.onTheBus = !1,
@@ -4720,7 +4698,7 @@ function o(a, s, l) {
             t.prototype.interrupt = function(e, t) {
                 return !!this.wouldInterrupt() && (this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled),
                 this.tourIsPlaying = !1,
-                this.bgmReplay(),
+                //this.bgmReplay(),
                 this.interrupted = !0,
                 this.nextFunc = null,
                 this.emit(u.ActionInterrupted),
@@ -4832,26 +4810,22 @@ function o(a, s, l) {
                 //音频
                 var musicInfo = this.model.heroLocations[this.destinationItem[0]].musicInfo
                 if(musicInfo && musicInfo.music){
-                    var o1 = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
-                    
-                    let audioSrc1 = g_tourAudio.src.split('/').pop();
-                    let audioSrc2 = o1.split('/').pop();
+                    let src = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
+                    let audioObj = SoundManager.list.find(e=>e.name == 'tour')
+                    let audioSrc1 = common.getFileNameFromUrl(audioObj.src);  
+                    let audioSrc2 = common.getFileNameFromUrl(src)
                
                     if(audioSrc1 == audioSrc2){//应该是继续播放该folder 
                         if(this.destinationItem[1] == 0){//从头开始播放 因为可能暂停后然后再点该缩略图播
-                            g_tourAudio.currentTime = 0;  g_tourAudio.play();
-                        }else if(g_tourAudio.paused && g_tourAudio.currentTime < g_tourAudio.duration){//未播完
-                            g_tourAudio.play()
+                            SoundManager.play('tour',null,0)  // currentTime = 0; 
+                        }else if( audioObj.audio.paused && audioObj.audio.currentTime < audioObj.audio.duration   ){//未播完
+                            SoundManager.play('tour')//继续播。   如果不是<  说明播完了,item[1]不为0应该是继续播放就不需要从头
                         } 
                         
                     }else{//很可能是该folder的起始
-                        g_tourAudio.src = manage.dealURL(o1);
-                        g_tourAudio.load()  
-                    }
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        manage.switchBgmState(false); 
-                        g_bgAudio.pauseByTour = true
+                        SoundManager.play('tour', manage.dealURL(src))
                     }
+                     
                 }
                 
                 
@@ -4866,7 +4840,7 @@ function o(a, s, l) {
                           , s = null
                           , l = null;
                         if (a.isPano()) {  
-                            o1 = this.getMomentTour(this.destinationItem)   //window.DATA.momentTour || "walk";
+                            var o1 = this.getMomentTour(this.destinationItem)   //window.DATA.momentTour || "walk";
                             l = this.player.warpToPanoByHeroIndex.bind(this.player, this.destinationItem, g.Show, f.Slow, o1, !0, i, this.actionComplete.bind(this)),
                             s = this.arrivedAtDestination.bind(this, !0)
                              
@@ -4931,30 +4905,18 @@ function o(a, s, l) {
                     this.goToDestination()) : this.goNext()))
             }
             ,
-            t.prototype.bgmReplay = function() {
-                if(g_bgAudio && g_bgAudio.paused && g_bgAudio.pauseByTour){
-                    g_playAudio = g_bgAudio;
-                    g_tourAudio && g_tourAudio.pause();
-                    //window.tourAudio && window.tourAudio.pause(); 
-                    manage.switchBgmState(true); 
-				}
-            }
-            ,
+            
             t.prototype.stopTour = function(isAutoStop) {//停止导览        isAutoStop 希望仅在飞完结束自动停止时的stopTour不停止tourSound, 这样才能完整播放tourSound.  不过似乎会在倒数第二个片段点击按钮停止导览时也视作自动结束的(执行this.interrupt() )。
                 this.isInterrupted() || this.transitionStage === v.Moving && this.checkAndHandleWalkingtourInterruption(this.nextWarpStyle) || (this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled),
                 this.tourIsPlaying = !1,
-                (!isAutoStop || g_tourAudio && g_tourAudio.paused )&&this.bgmReplay(),//xzw
+                //(!isAutoStop || g_tourAudio && g_tourAudio.paused )&&this.bgmReplay(),//xzw
                 this.interrupt(),
                 this.clearWalkingSectionPaused(),
                 this.resetSpecialTransition(),
                 this.emit("update.controls")) 
                 
                 
-                if(!isAutoStop && g_tourAudio && g_tourAudio.paused == false )
-                {
-                    g_tourAudio.pause();
-                    g_tourAudio.src = ""
-                }
+                
             }
             ,
             t.prototype.endTourProgress = function() {
@@ -14259,20 +14221,19 @@ function o(a, s, l) {
                     });
                     
                   
-                    
-                    /* window.DATA.backgroundMusic ? (g_bgAudio.src = window.DATA.backgroundMusic,
-                    $("#volume").show()) : "one" === g_version && (g_bgAudio.src = g_Prefix + "/audio/audio" + window.number + "/background.mp3");
-                     */
-                    
+                     
                     if (window.DATA.backgroundMusic) {
-                        if(window.isLocal) g_bgAudio.src = manage.dealURL(window.DATA.backgroundMusic) ;
-                        else g_bgAudio.src = window.DATA.backgroundMusic 
-                        
+                        if(window.isLocal){
+                            SoundManager.setSrc('bgm', manage.dealURL(window.DATA.backgroundMusic))
+                        }else{
+                            SoundManager.setSrc('bgm', window.DATA.backgroundMusic )
+                        } 
                         $("#volume").show();
                     }else if (g_version === "one"){
-                        g_bgAudio.src = g_Prefix+"/audio/"+"audio"+window.number + "/background.mp3";
-                        
-                        //g_bgAudio.src = manage.dealURL(src) ;
+                        SoundManager.setSrc('bgm', manage.dealURL( g_Prefix+"/audio/"+"audio"+window.number + "/background.mp3"))
+                    
+                    
+                        $("#volume").show();
                     }
                     
                     //隐藏公司logo
@@ -15290,437 +15251,6 @@ function o(a, s, l) {
         })
     }
     , {}],
-    hot: [function(e, t, i) {
-        "use strict";
-        function n(e, t, i) {
-            this.sid = e,
-            this.position =  this.convertValue(t.position, g.Vector3)     
-            
-            if(t.quaternion){
-                this.quaternion =   this.convertValue(t.quaternion, g.Quaternion) 
-            }else{
-                this.rotation = new g.Euler().setFromVector3(this.convertValue(t.rotation, g.Vector3 )) 
-            }
-            
-            this.quaternion || (this.quaternion = new THREE.Quaternion().setFromEuler(this.rotation)) 
-            this.isSprite = t.isSprite || 0
-            this.actionType = (t.noAction ? 'noAction' : t.actionType ) || "common"
-            this.linkType = t.linkType || "common"
-           
-            this.link = t.link,
-            this.model = i,
-            this.size = t.size;
-      
-            this.styleImg = [] // 存储热点icon的图片 [{src:...}, {src:...} ] 最多两个,里面是带有src的object, 可以是img,会经常改变
-            
-            this.infoAttribute = t.infoAttribute || {};
-            this.transformAtPanos = t.transformAtPanos || {}
-            for (let i in this.transformAtPanos) {
-                this.transformAtPanos[i].pos = new THREE.Vector3().fromArray(this.transformAtPanos[i].pos)
-                this.transformAtPanos[i].qua && (this.transformAtPanos[i].qua = new THREE.Quaternion().fromArray(this.transformAtPanos[i].qua))
-            }
-            
-            this.build()
-            
-            
-            this.setFromInfo()
-            
-            this.changeTex()
-            
-            
-            this.visibleData = t.visiblePanos 
-            //this.setVisiblePanos(t.visiblePanos ); 
-            
-            
-        }
-        var g = e("three")
-          , r = e("../shaders")
-          , m = e("../settings")
-          , v = e("../enum/Viewmode")
-          , d = e("../objects/Panorama")
-          , o = e("../util/texture")
-          , math = e("../util/math")
-          , p = new g.Raycaster
-          , a = new g.PlaneBufferGeometry(g_HotMeshSize.g_HotMeshWidth,g_HotMeshSize.g_HotMeshHeight,1,1)
-            
-        
-        var defaultTex1 = o.load(g_HotImage.point);
-        var defaultTex2 = o.load(g_HotImage.point2)
-        //dealMap(defaultTex1)
-        //dealMap(defaultTex2)
-        
-        n.prototype.setFromInfo = function(){ //初始化或恢复
-            var info = this.infoAttribute
-            this.setTitleElem(info.title)
-            
-            this.transformAtPanos = info.transformAtPanos || this.transformAtPanos 
-            var curPanoTransform = this.transformAtPanos[ getTransformSid()] || {}
-            
-            var pos = curPanoTransform.pos || info.position
-            pos && this.mesh.position.copy(pos) 
-            info.position && this.position.copy(info.position) //this.position记录全局position
- 
-            var isSprite = info.isSprite != void 0 ? info.isSprite : this.isSprite
-            if(!isSprite){
-                var qua = curPanoTransform.qua || info.quaternion
-                qua && this.mesh.quaternion.copy(qua)
-            }                
-            info.quaternion && this.quaternion.copy(info.quaternion)  //this.quaternion记录全局quaternion
-          
-          
-           
-            var s = parseFloat(info.hotIconScale || window.DATA.hotIconScale )
-            s && this.mesh.scale.set(s, s, s) 
-            
-             
-            this.isSprite = isSprite
-            this.actionType = info.actionType != void 0 ? info.actionType : this.actionType 
-            this.linkType = info.linkType != void 0 ? info.linkType : this.linkType 
-            this.initStyleImg()
-            
-        }
-        
-        n.prototype.changeTex = function(styleImg){ 
-            var u = this.mesh.material.uniforms
-            var styleImg = styleImg || this.styleImg
-             
-            if(styleImg.length){
-                u.texture1.value = o.load(styleImg[0].src);
-                u.texture2.value = o.load(styleImg[1]&&styleImg[1].src || styleImg[0].src); 
-            }else{
-                u.texture1.value = defaultTex1;
-                u.texture2.value = defaultTex2; 
-            } 
-                
-            this.styleImg = styleImg
-        }
-        
-        n.prototype.initStyleImg = function(){
-            var t = this.infoAttribute;
-            this.styleImg = []
-            t.styleImg = t.styleImg || [];
-            t.styleImg.forEach((src)=>{ 
-                //src = src.src || src
-                this.styleImg.push({src:manage.dealURL(src)}) 
-            })
-            this.changeTex()
-        }
-        n.prototype.update = function(camera) {
-            if(this.isSprite){
-                this.mesh.quaternion.copy(camera.quaternion)
-            }
-        }
-        n.prototype.setVisiblePanos = function(visibleData ){ 
-            if(visibleData == "get"){ 
-                this.visiblePanos = player.model.panos.list.map((pano)=>{return pano.id})
-            }else if(visibleData){
-                this.visiblePanos = visibleData;
-            } 
-            
-            /* this.visiblePanos = [];  
-            this.model.panos.list.forEach((pano)=>{//考虑到热点可以移动,不好重新设置,还是不根据模型遮挡来初始化了,默认全部可见
-                if(visibleData && !visibleData.includes(pano.id))return;
-                var isShelter = convertTool.ifIntersectChunks(pano.position, this.position, {model: this.model.colliders});
-                if(!isShelter){
-                    this.visiblePanos.push(pano.id)
-                }
-            }) */
-            
-            
-        }
-        n.prototype.build = function() {
-            var t = g.UniformsUtils.clone(r.hot.uniforms); 
-            var e = new g.Mesh(a, new g.ShaderMaterial({ 
-                uniforms: t,
-                vertexShader: r.hot.vertexShader,
-                fragmentShader: r.hot.fragmentShader,
-                transparent: !0
-            }))
-            
-            e.dynamic = !0, //?
-            e.position.copy(this.position); 
-            e.quaternion.copy(this.quaternion)
-            e.name = this.sid,
-            e.type = "hotSprite",
-            (e.belongHot = this).link && (e.hotLink = this.link),
-            this.mesh = e,
-            this.model.add(e),
-            g_HotMeshes.push(e);
-            
-            
-            
-        }
-        n.prototype.setTitleElem = function(){
-            var root = $("#hot");
-            var title = this.infoAttribute.title;
-            if(title){
-                if(!this.titleElem){
-                    var elem = $(`<div></div>`)
-                    root.append(elem);
-                    this.titleElem = elem;
-                } 
-                this.titleElem.text(title)
-            }else{
-                if(this.titleElem){
-                    this.titleElem.remove()
-                    this.titleElem = null;
-                }
-            }
-            
-            
-        } 
-        n.prototype.showTitle = function(){
-            if(!this.titleElem)return;
-            var pos = math.getPos2d(this.position, player.camera, $("#player")[0])
-            if(pos.trueSide){//inSight
-                this.titleElem.css( { "left" : `${pos.pos.x}px`,  "top": `${pos.pos.y}px ` });
-                this.titleElem.css("display","block");
-            }else{
-                this.titleElem.css("display","none");
-            }                
-        } 
-        n.prototype.hideTitle = function(){
-            if(!this.titleElem)return;
-            this.titleElem.css("display","none");
-        }
-        ,
-        n.prototype.closestPanoTowardTag = function(e, t) {
-            var i = []
-              , n = []
-              , r = this.mesh.position;
-            if (e === v.PANORAMA) {
-                var o = t.position.clone().sub(r).normalize();
-                n.push(d.scoreFunctions.direction(r, o))
-            }
-            var a = new g.Vector3;
-            i.push(function(e) {
-                    return Math.abs(e.position.x - r.x) > m.tags.visibility.cameraClearance || Math.abs(e.position.z - r.z) > m.tags.visibility.cameraClearance
-                }, function(e) {
-                    a.copy(r).sub(e.position);
-                    var t = -g.Math.radToDeg(Math.atan(a.y / Math.sqrt(a.x * a.x + a.z * a.z)))
-                      , i = m.tags.navigate.tiltTolerance;
-                    return m.insideLookLimitDown - i < t && t < m.insideLookLimitUp + i
-                }, 
-                (pano)=>{ // add
-                    return player.checkHasNeighbor(pano) 
-                }
-     
-            ),
-            n.push(d.scoreFunctions.distanceSquared(this.mesh, -2));
-            var s = t.model.panos.sortByScore(i, n);
-            if (s && m.tags.navigate.lineOfSight) {
-                for (var l = 0; l < s.length; l++) {
-                    var c = s[l].pano
-                      , h = c.position.distanceTo(r);
-                    p.set(c.position, r.clone().sub(c.position).normalize());
-                    var u = p.intersectObjects(t.model.colliders);
-                    if (0 === u.length || u[0].distance > h)
-                        return console.log(l),
-                        c
-                }
-                return null
-            }
-            return s && 0 < s.length && s[0].pano
-        }
-         
-        
-        
-        
-        var getLink = function(link){
-            var src = '';
-            var r = link.substring(link.indexOf("html") + 4)
-              , o = "en" == manage.number("lang") ? "&lang=" + manage.number("lang") : "";
-            -1 == r.indexOf("?") ? src = link + "?time=" + randomTime().getTime() + "&id=" + window.number + o : src = link + "&time=" + randomTime().getTime() + "&id=" + window.number + o 
-                
-            return src
-            
-        }
-        
-        
-        n.prototype.examine = function(e, options) {
-            options = options || {}
-            
-            if(this.actionType == 'noAction')return
-            
-            
-            
-            if(this.linkType!="common" && this.infoAttribute.iframe && this.infoAttribute.iframe[0] && !options.dontOpen){
-                var src = getLink(this.infoAttribute.iframe[0]);
-                if(this.linkType=="jumpLink"){
-                    var newPage = window.open(src, "_blank" ); 
-                    newPage.focus();  
-                }else if(this.linkType=="iframeDiv"){
-                    
-                    var div = document.createElement("div");
-                    $("body").append(div);
-                    div.style.position = 'fixed';
-                    div.style.width = div.style.height = "100%";
-                    div.style.left = div.style.top = '0';
-                    div.style["z-index"] = "999"
-                    
-                    var exit = document.createElement("div");
-                    exit.style["background-image"] = "url(images/vrOffImg.png)";
-                    exit.style.position = 'absolute';
-                    exit.style.width = exit.style.height = "50px";
-                    exit.style.left = '17px';   exit.style.top = "20px"
-                    exit.style.cursor = "pointer";
-                    exit.style["background-repeat"] = "no-repeat";
-                    exit.style["background-size"] = "25%"; 
-                    exit.style["background-position"] = "center center"; 
-                    exit.style["background-color"] = "rgba(0, 0, 0, 0.2)"; 
-                    exit.style["border-radius"] = "50%";
-                    exit.style["z-index"] = "3"
-                    exit.onclick = ()=>{
-                        $(div).remove()
-                        if(g_bgAudio && g_bgAudio.pauseByHot){
-                            manage.switchBgmState(true)
-                        }
-                    }  
-                    
-                    var myElement = document.createElement("iframe");
-                    myElement.style.position = 'absolute';
-                    myElement.style.width = myElement.style.height = "100%";
-                    myElement.style.left = myElement.style.top = '0';
-                     
-                    myElement.src = src
-                     
-                    
-                    div.appendChild(exit);
-                    div.appendChild(myElement)
-                    
-                    
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        manage.switchBgmState(false); 
-                        g_bgAudio.pauseByHot = true
-                    } 
-                    if(g_tourAudio)g_tourAudio.pause()
-                    
-                }
-                
-                
-                
-                
-                return;
-            }
-            
-            
-            if(settings.dontExamHot || this.actionType == 'dontExam'){
-                o();
-                return;
-            }
-            
-            if(!player.currentPano)return;     
-             
-            var i = document.getElementById("popup");
-            
-            if (this.link && !options.dontOpen) {
-                g_currentHot = this,
-                i.style.display = "block",
-                i.classList.add("wait");
-                var n = document.createElement("iframe");
-                if(g_bgAudio && !g_bgAudio.paused){
-                    manage.switchBgmState(false); 
-                    g_bgAudio.pauseByHot = true
-                } 
-                if(g_tourAudio)g_tourAudio.pause()
-                var src = getLink(this.link   )
-                n.src = src;
-                n.id = "id1",
-                n.allowTransparency = "true";
-                var a = document.getElementById("id1");
-                if (void 0 === a || null == a) {
-                    document.querySelector(".popup-content").appendChild(n);
-                    var s = !1;
-                    window.loaddingSuccess = function() {
-                        s = !0
-                    }
-                    ,
-                    setTimeout(function e() {
-                        if (s) {
-                            var t = document.querySelector("#id1").contentWindow.document;
-                            t.querySelector("video") && (t.querySelector("video").play(),
-                            !t.querySelector("video").paused && t.querySelector(".playPause") && t.querySelector(".playPause").classList.add("fa-pause")),
-                            t.querySelector("audio") && t.querySelector("audio").play()
-                        } else
-                            setTimeout(e, 300)
-                    }, 800)
-                }
-            }
-            var l = e.mode
-              , c = m.tags.navigate.nearestPano && this.closestPanoTowardTag(l, e.currentPano) || e.currentPano
-              , h = this.mesh.position;
-            e.flyingToTag = !0;
-            var u = function() {
-                e.flyingToTag = !1;
-                options.dontOpen || this.link && i.classList.remove("wait")
-            }
-            .bind(this);
-            if (l === v.PANORAMA) {
-                var d = {
-                    pano: c,
-                    lookAtPoint: h,
-                    duration:  options.duration,
-                    maxDistanceOverride: null,
-                    skipWarpingCheck: !1,
-                    aimDuration: options.aimDuration,
-                    
-                };
-                e.flyToPano(d, u)
-            } else {
-                var p = {
-                    pano: c
-                };
-                if (h) {
-                    var f = (new g.Matrix4).lookAt(c.position, h, new g.Vector3(0,1,0));
-                    p.quaternion = (new g.Quaternion).setFromRotationMatrix(f)
-                }
-                p.callback = u,
-                p.duration = options.duration || 1500,
-                p.mode = v.PANORAMA,
-                p.aimDuration = options.aimDuration
-                e.flyToNewMode(p)
-            }
-        }
-        
-        ,
-        n.prototype.dispose = function(){
-            this.mesh.parent.remove(this.mesh);
-            var index = g_HotMeshes.indexOf(this.mesh);
-            g_HotMeshes.splice(index,1)
-        }
-        
-       /*  n.prototype.conversionArray = function(e) {
-            if ("[object Array]" == Object.prototype.toString.call(e))
-                return e;
-            var t = [];
-            for (var i in e)
-                t.push(parseFloat(e[i])); 
-            return t   
-        } */
-        n.prototype.convertValue = function(v ,Type){
-            var value; 
-            if(v instanceof Array){
-                v.forEach((v1)=>{v1 = parseFloat(v1)})
-                value = new Type().fromArray(v);
-            }else{
-                for(let i in v){v[i] = parseFloat(v[i])}
-                value = new Type().copy(v);
-            }
-            return value
-        } 
-        
-        ,
-        t.exports = n
-    }
-    , {
-        three: 217,
-        "../shaders": 167,
-        "../enum/Viewmode": 51,
-        "../objects/Panorama": 148,
-        "../util/texture": 194,
-        "../settings": 166,
-        "../util/math": 190,
-    }],
     123: [function(M, R, e) {
         (function(e) {
             "use strict";
@@ -17339,7 +16869,7 @@ function o(a, s, l) {
               , x = P("../exception/BasicException")
               , S = (P("../constants"),
             P("events").EventEmitter)
-              , M = P("hot")
+            // , M = P("hot")
               , R = new p(e);
             t.prototype = Object.create(o.Object3D.prototype),
             C.extend(t, S),
@@ -17957,7 +17487,7 @@ function o(a, s, l) {
         "./RoomCollection": 141,
         events: 202,
         three: 217,
-        hot: "hot"
+        //hot: "hot"
     }],
     140: [function(e, t, i) {
         "use strict";
@@ -18378,7 +17908,7 @@ function o(a, s, l) {
             this.add(e.skyboxMesh),
             e.marker && this.add(e.marker);
             
-            if(e.neighbourUUIDs.length){//add 有相邻点才算入bound 因为拍摄有bug,会出现floorPosition为000,且position位置很偏的点,它们一般都是不可见点。
+            if(e.neighbourUUIDs && e.neighbourUUIDs.length){//add 有相邻点才算入bound 因为拍摄有bug,会出现floorPosition为000,且position位置很偏的点,它们一般都是不可见点。
                 var t = new n.Vector3(1,1,1)
                   , i = (new n.Box3).setFromCenterAndSize(e.position, t);
                 this.boundingBox.union(i)
@@ -20881,7 +20411,7 @@ function o(a, s, l) {
               , y = J("./constants")
               , j = J("./util/common")
               , A = J("./util/cameraLight")
-              , C = J("hot")
+              //, C = J("hot")
               , Y = new i(e)
               , q = Object.freeze({
                 FlyToPano: G.getUniqueId(),
@@ -21104,28 +20634,8 @@ function o(a, s, l) {
             
             
              
-			//------end	 
-            
-            
-            
-            
-            t.prototype.closePopup = function() {
-                if (g_currentHot) {
-                    g_currentHot = null,
-                    document.getElementById("popup").style.display = "none",
-                    document.querySelector(".popup-content").removeChild(document.getElementById("id1")),
-                    $("#popup iframe:last").remove();
-                    document.getElementById("bgaudio");
-                    
-                    if(g_bgAudio && g_bgAudio.pauseByHot){
-                        manage.switchBgmState(true)
-                    }
- 
-                    
-                    return false
-                     
-                }
-            }
+			//------end	  
+           
             ,
             t.prototype.setupCustomProperties = function(e) {
                 var i = e || V.PANORAMA;
@@ -21243,10 +20753,8 @@ function o(a, s, l) {
                 return .5
             }
             ,
-            t.prototype.changeMusic = function() {
-				if(!this.director.tourIsPlaying) this.director.bgmReplay()
-            }
-            ,
+             
+             
             t.prototype.bindEvents = function(e) {
                 e !== document && e.setAttribute("tabindex", -1),
                 e.addEventListener("mousedown", this.onMouseDown.bind(this)),
@@ -21275,9 +20783,8 @@ function o(a, s, l) {
                 this.cameraControls.on(u.Pinch, this.handleControlPinch.bind(this)),
                 this.cameraControls.on(u.Scroll, this.handleControlScroll.bind(this)),
                 window.addEventListener("snapshotBegin", this.getWrapShot.bind(this)),
-                window.addEventListener("tourAudioEnded", this.changeMusic.bind(this)),
-                window.getSeft && getSeft(this),
-                /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent) ? $("#closepop").on("touchstart", this.closePopup.bind(this)) : $("#closepop").on("click", this.closePopup.bind(this))
+                //window.addEventListener("tourAudioEnded", this.changeMusic.bind(this)),
+                window.getSeft && getSeft(this)
             }
             ,
             t.prototype.onMouseDown = function(e) {
@@ -22529,7 +22036,7 @@ function o(a, s, l) {
             }
             ,
             t.prototype.flyDirection = function(e, t, i) {
-                this.closePopup();
+                Hot.closePopup();//xzw add
                 var n = $.Deferred();
                 this.history.invalidate();
                 var r = this.closestPanoInDirection(e, t, i);
@@ -22746,6 +22253,7 @@ function o(a, s, l) {
             }
             ,
             t.prototype.flyToNewMode = function(e, t) {
+                Hot.closePopup();//xzw add
                 var i = (e = e || {}).mode
                   , n = e.pano
                   , r = e.duration
@@ -23099,7 +22607,8 @@ function o(a, s, l) {
                 var rotTime
                 if(currentLocation.rotTime == void 0 || currentLocation.rotTime == ''){
                     var restChildCount = currentLocation.heroLocations ? (currentLocation.heroLocations.length-this.director.currentItem[1]-1) : 0
-                    var current = g_tourAudio ? 1e3 * g_tourAudio.currentTime : 0
+                    var audioObj = SoundManager.list.find(e=>e.name == 'tour')
+                    var current = audioObj.audio.currentTime * 1e3 // || 0  //g_tourAudio ? 1e3 * g_tourAudio.currentTime : 0
                     rotTime = currentLocation && currentLocation.musicInfo.music ? currentLocation.musicInfo.time - current : 2e3;  
                     
                     if(restChildCount){//如果当前folder中还有剩下的item,平分一下时间
@@ -23374,7 +22883,7 @@ function o(a, s, l) {
         "./util/logger": 189,
         "./util/math": 190,
         "./util/transitions": 195,
-        hot: "hot",
+       // hot: "hot",
         scaleImg: "scaleImg",
         events: 202,
         three: 217
@@ -29675,8 +29184,10 @@ function o(a, s, l) {
                     return t.score - e.score;
                 });
             } 
- 
-            
+            ,
+            getFileNameFromUrl:function(url){
+                return url.split('/').pop();
+            }
             
         },
         Math.sign = function(e) {

+ 63 - 612
js/main_2020_show.js

@@ -11,27 +11,7 @@ window.lerp = null
 window.transitions = null
 window.browser = null
 window.momentTourBlackNewType = 0//=  number == 'TEST'//true
-
-g_playAudio = null
-
-g_tourAudio = new Audio 
-g_tourAudio.loop = !1 
-g_tourAudio.crossOrigin = "anonymous" 
-g_tourAudio.addEventListener("ended", function() {
-    var e = document.createEvent("MouseEvent");
-    e.initEvent("tourAudioEnded", !0, !0),
-    window.dispatchEvent(e)
-}) 
-
-g_tourAudio.oncanplaythrough = function() {
-    g_tourAudio.play();
-    if(g_bgAudio && !g_bgAudio.paused){
-        manage.switchBgmState(false); 
-        g_bgAudio.pauseByTour = true
-    }
-    g_playAudio = g_tourAudio;  
-}
-
+ 
 
 var dealMap = (map)=>{//使不resize  when   image is not power of two
     map.wrapS = map.wrapT = THREE.ClampToEdgeWrapping;
@@ -4786,7 +4766,7 @@ window.Modernizr = function(n, e, t) {
                 if (this.currentItem = null,
                 this.destinationItem = null,
                 this.tourIsPlaying = !1,
-				this.bgmReplay(),//xzw
+				//this.bgmReplay(),//xzw
                 this.transitionStage = y.None,
                 this.nextFunc = null,
                 this.onTheBus = !1,
@@ -4924,7 +4904,7 @@ window.Modernizr = function(n, e, t) {
             n.prototype.interrupt = function(e, t) {
                 return !!this.wouldInterrupt() && (this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled),
                 this.tourIsPlaying = !1,
-				this.bgmReplay(),//xzw
+				//this.bgmReplay(),//xzw
                 this.interrupted = !0,
                 this.nextFunc = null,
                 this.emit(p.ActionInterrupted),
@@ -5030,33 +5010,30 @@ window.Modernizr = function(n, e, t) {
             }
             ,
             n.prototype.goToDestination = function(e, t, i, n) {
-              //音频 
-                //if(this.destinationItem[1] == 0){//如果是每个folder的起始
+                //音频 
+                
                 var musicInfo = this.model.heroLocations[this.destinationItem[0]].musicInfo
                 if(musicInfo && musicInfo.music){
-                    var o = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
-                    
-                    let audioSrc1 = g_tourAudio.src.split('/').pop();
-                    let audioSrc2 = o.split('/').pop();
+                    let src = musicInfo.music.includes(g_Prefix.slice(-10)) ? musicInfo.music :  g_Prefix + musicInfo.music;
+                    let audioObj = SoundManager.list.find(e=>e.name == 'tour')
+                    let audioSrc1 = common.getFileNameFromUrl(audioObj.src);  
+                    let audioSrc2 = common.getFileNameFromUrl(src)
                
                     if(audioSrc1 == audioSrc2){//应该是继续播放该folder 
                         if(this.destinationItem[1] == 0){//从头开始播放 因为可能暂停后然后再点该缩略图播
-                            g_tourAudio.currentTime = 0;  g_tourAudio.play();
-                        }else if(g_tourAudio.paused && g_tourAudio.currentTime < g_tourAudio.duration){//未播完
-                            g_tourAudio.play()
+                            SoundManager.play('tour',null,0)  // currentTime = 0; 
+                        }else if( audioObj.audio.paused && audioObj.audio.currentTime < audioObj.audio.duration   ){//未播完
+                            SoundManager.play('tour')//继续播。为什么会有暂停的情况?如果手动切换到bgm了呢?
                         } 
                         
                     }else{//很可能是该folder的起始
-                        g_tourAudio.src = manage.dealURL(o);
-                        g_tourAudio.load()  
+                         
+                        SoundManager.play('tour', manage.dealURL(src))
                     }
                     
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        manage.switchBgmState(false); 
-                        g_bgAudio.pauseByTour = true
-                    }
+                     
                 }
-                //}
+                
                 if (this.onTheBus = !0,
                 this.emit("update.controls"),
                 this.player.updateLastView(),
@@ -5136,30 +5113,19 @@ window.Modernizr = function(n, e, t) {
                     this.goToDestination()) : this.goNext()))
             } 
 			,
-			n.prototype.bgmReplay = function() {//xzw add  结束tour后可能要继续播放背景音乐
-				//if(g_tourAudio && g_tourAudio.paused && g_bgAudio && g_bgAudio.paused){
-                if(g_bgAudio && g_bgAudio.paused && g_bgAudio.pauseByTour){
-                    g_playAudio = g_bgAudio;
-                    g_tourAudio && g_tourAudio.pause();
-                    //window.tourAudio && window.tourAudio.pause(); 
-                    manage.switchBgmState(true); 
-				}
-			}
-			,
+			/* n.prototype.bgmReplay = function() {//xzw add  结束tour后可能要继续播放背景音乐
+			  
+                
+			} */
+			 
             n.prototype.stopTour = function(isAutoStop) {//停止导览        isAutoStop 希望仅在飞完结束自动停止时的stopTour不停止tourSound, 这样才能完整播放tourSound.  不过似乎会在倒数第二个片段点击按钮停止导览时也视作自动结束的(执行this.interrupt() )。
                 this.isInterrupted() || this.transitionStage === y.Moving && this.checkAndHandleWalkingtourInterruption(this.nextWarpStyle) || (this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled),
-                this.tourIsPlaying = !1,
-				(!isAutoStop || g_tourAudio && g_tourAudio.paused )&&this.bgmReplay(),//xzw
+                this.tourIsPlaying = !1, 
                 this.interrupt(),
                 this.clearWalkingSectionPaused(),
                 this.resetSpecialTransition(),
                 this.emit("update.controls"))
-                //window.tourAudio && window.tourAudio.pause();
-                if(!isAutoStop && g_tourAudio && g_tourAudio.paused == false )
-                {
-                    g_tourAudio.pause();
-                    //g_tourAudio.src = ""
-                }
+                
             }
             ,
             n.prototype.endTourProgress = function() {
@@ -9116,13 +9082,15 @@ window.Modernizr = function(n, e, t) {
             P.forEach(function(e) {
                 b.addEventListener(e, u.bind(this, !1), !0),
                 w.addEventListener(e, u.bind(this, !0), !0),
-                E.addEventListener(e, o, !0),
-                S.forEach(function(t) {
+                E.addEventListener(e, o, !0) 
+                               
+                S.forEach(function(t) {//会触发导览停止  
                     t.addEventListener(e, a, !0)
-                }),
+                }) 
                 $("#drawer img").on(e, a)
-            }),
-            document.addEventListener("keydown", u.bind(this, !1), !0),
+            }) 
+            document.addEventListener("keydown", u.bind(this, !1), !0) 
+             
             C.on(v.TourStart, function() {
                 E.classList.add("playing")
             })
@@ -9185,7 +9153,7 @@ window.Modernizr = function(n, e, t) {
                 !C.tourIsPlaying && C.tourInProgress && (_.removeClass("fadeIn"),
                 d(),
                 t.which !== f.SPACE && a()),
-                i && n && s()
+                i && n && s() 
             }
         }
         function d() {
@@ -15114,7 +15082,6 @@ window.Modernizr = function(n, e, t) {
                 
                 //czj 判断someData 有没有hoticon字段 修改热点的样式
                 if (window.DATA.hoticon){
-                    
                     g_HotImage = {
                         point: window.DATA.hoticon.default || "https://super.4dage.com/images/4dagePoint2.png",
                         point2: window.DATA.hoticon.higt || "https://super.4dage.com/images/4dagePoint.png"
@@ -15122,14 +15089,17 @@ window.Modernizr = function(n, e, t) {
                 }
                 //czj 判断someData 有没有backgroundMusic 添加音乐
                 if (window.DATA.backgroundMusic) {
-                    if(window.isLocal) g_bgAudio.src = manage.dealURL(window.DATA.backgroundMusic) ;
-                    //else g_bgAudio.src = window.DATA.backgroundMusic.substr(0,4)=="http" ? window.DATA.backgroundMusic : "//" + window.DATA.backgroundMusic;
-                    else g_bgAudio.src = window.DATA.backgroundMusic
-                    
+                    if(window.isLocal){
+                        SoundManager.setSrc('bgm', manage.dealURL(window.DATA.backgroundMusic))
+                    }else{
+                        SoundManager.setSrc('bgm', window.DATA.backgroundMusic )
+                    }  
                     $("#volume").show();
                 }else if (g_version === "one"){
-                    g_bgAudio.src = g_Prefix+"/audio/"+"audio"+window.number + "/background.mp3";
-                    //g_bgAudio.src = manage.dealURL(src) ;
+                    SoundManager.setSrc('bgm', manage.dealURL( g_Prefix+"/audio/"+"audio"+window.number + "/background.mp3"))
+                    
+                    
+                    $("#volume").show();
                 }
 
                 //隐藏公司logo
@@ -15879,485 +15849,7 @@ window.Modernizr = function(n, e, t) {
         })
     }
     , {}],
- /*********************************创建热点模型************************************************** */
-	"hot": [function(e, t, i) {//热点
-        "use strict";
-		function hot(sid,d,model){
-			this.sid = sid;
-           /*  this.position = (new r.Vector3).fromArray( this.conversionArray(d.position) )
-			if(d.quaternion){
-                this.quaternion = d.quaternion;
-            }else{
-                this.rotation = this.conversionArray(d.rotation) 
-            } */
-            
-            this.position =  this.convertValue(d.position, r.Vector3)    
-            if(d.quaternion){
-                this.quaternion =   this.convertValue(d.quaternion, r.Quaternion) 
-            }else{
-                this.rotation = new r.Euler().setFromVector3(this.convertValue(d.rotation, r.Vector3 )) 
-            }
-            this.quaternion || (this.quaternion = new THREE.Quaternion().setFromEuler(this.rotation)) 
-            this.isSprite = d.isSprite
-            this.actionType = (d.noAction ? 'noAction' : d.actionType) || "common"
-            this.linkType = d.linkType || "common"
-            
-            this.link = d.link;
-			this.model = model;
-			this.size = d.size;
-            this.infoAttribute = d.infoAttribute || {};
-            this.styleImg = [] // 存储热点icon的图片 [{src:...}, {src:...} ] 最多两个,里面是带有src的object, 可以是img
-            this.transformAtPanos = d.transformAtPanos || {}
-            for (let i in this.transformAtPanos) {
-                this.transformAtPanos[i].pos = new THREE.Vector3().fromArray(this.transformAtPanos[i].pos)
-                this.transformAtPanos[i].qua && (this.transformAtPanos[i].qua = new THREE.Quaternion().fromArray(this.transformAtPanos[i].qua))
-            }
-			this.build();
-            d.infoAttribute && d.infoAttribute.title && this.setTitleElem(d.infoAttribute.title)
-            this.changeTex()
-            
-            
-            
-            this.visibleData = d.visiblePanos 
-            //this.setVisiblePanos(d.visiblePanos); 
-            
-		}
-		var r = e("three")
-		, f = e("../shaders")
-		, a = e("../settings")
-		, s = e("../enum/Viewmode")
-		, p = e("../objects/Panorama")
-        , math = e("../util/math")
-        , te = e("../util/texture");
-        var raycaster = new r.Raycaster;
-        //热点大小
-        var geometry = new r.PlaneBufferGeometry( g_HotMeshSize.g_HotMeshWidth, g_HotMeshSize.g_HotMeshHeight,1,1);
-        var defaultTex1 = te.load(g_HotImage.point);
-        var defaultTex2 = te.load(g_HotImage.point2);
-         
-
-        hot.prototype.changeTex = function(){
-            var u = this.mesh.material.uniforms
-            if(this.styleImg.length){
-                u.texture1.value = te.load(this.styleImg[0].src);
-                u.texture2.value = te.load(this.styleImg[1]&&this.styleImg[1].src || this.styleImg[0].src); 
-            }else{
-                u.texture1.value = defaultTex1;
-                u.texture2.value = defaultTex2;
-             
-            }  
-        }
-        
-        hot.prototype.initStyleImg = function(t){
-            this.styleImg = []
-            t.styleImg = t.styleImg || [];
-            t.styleImg.forEach((src)=>{  
-                this.styleImg.push({src:manage.dealURL(src)}) 
-            })
-            this.changeTex()
-        }
-     
-        hot.prototype.update = function(camera) {
-            if(this.isSprite){
-                this.mesh.quaternion.copy(camera.quaternion)
-            }
-            
-            //this.showTitle()
-            
-        }
-        hot.prototype.setVisiblePanos = function(visibleData){ 
-            this.visiblePanos = []; 
-            
-            let maxCount = browser.isMobile() ? 4000 : 10000 
-            let c = this.model.panos.list.length * this.model.colliders.length
-            if(c < maxCount){
-                this.model.panos.list.forEach((pano)=>{// 模型遮挡的, 直接不可见
-                    if(visibleData && !visibleData.includes(pano.id))return; //在热点可视中设置过,不可见
-                    var isShelter = convertTool.ifIntersectChunks(pano.position, this.position, {model: this.model.colliders});
-                    if(!isShelter){
-                        this.visiblePanos.push(pano.id)
-                    }
-                }) 
-            }else{//防止加载时间过长,分批计算
-                let c1 = Math.ceil(maxCount / this.model.colliders.length)
-                let start = 0
-                let interval = setInterval(()=>{
-                    let end = start + c1; 
-                    end = Math.min(end, this.model.panos.list.length)
-                    let i = start
-                    start = end
-                    for(;i<end; i++){ 
-                        var pano = this.model.panos.list[i]
-                        if(visibleData && !visibleData.includes(pano.id))return; //在热点可视中设置过,不可见
-                        var isShelter = convertTool.ifIntersectChunks(pano.position, this.position, {model: this.model.colliders});
-                        if(!isShelter){
-                            this.visiblePanos.push(pano.id)
-                        }
-                    } 
-                    if(end>=this.model.panos.list.length){
-                        console.log(window.hotsi ?(++window.hotsi): (window.hotsi = 1))
-                        clearInterval(interval)
-                    }
-                },20 ) 
-            }
-        }
-        
-		 //绘制热点
-		hot.prototype.build = function(){
-            var t = r.UniformsUtils.clone(f.hot.uniforms); 
-            var shaderMaterial = new r.ShaderMaterial({ 
-                uniforms: t,
-                vertexShader: f.hot.vertexShader,
-                fragmentShader: f.hot.fragmentShader,
-                transparent: !0
-            })
-            var sprite = new r.Mesh( geometry, shaderMaterial );
-            var hotIconScale = parseFloat(this.infoAttribute.hotIconScale || window.DATA.hotIconScale);
-			sprite.dynamic = true; 
-			sprite.position.copy(this.position);
-            sprite.quaternion.copy(this.quaternion)
-            hotIconScale && sprite.scale.set(hotIconScale, hotIconScale, hotIconScale)
-			// this.size && sprite.scale.set(this.size,this.size,this.size);
-			sprite.name = this.sid; 
-			sprite.type = "hotSprite";
-			sprite.belongHot = this;	 
-			if(this.link) sprite.hotLink = this.link; 
-			this.mesh = sprite; 
-            this.model.add(sprite); 
-            g_HotMeshes.push(sprite);
-		}
-        hot.prototype.setTitleElem = function(title){
-            var root = $("#hot");
-            var elem = $(`<div> ${title}</div>`)
-            root.append(elem);
-            this.titleElem = elem;
-        } 
-        hot.prototype.showTitle = function(){
-            if(!this.titleElem)return;
-            var pos = math.getPos2d(this.position, player.camera, $("#player")[0])
-            if(pos.trueSide){//inSight
-                this.titleElem.css( { "left" : `${pos.pos.x}px`,  "top": `${pos.pos.y}px ` });
-                this.titleElem.css("display","block");
-            }else{
-                this.titleElem.css("display","none");
-            }                
-        }  
-        
-        
-        /* hot.prototype.showTitle = function(){//一直显示title的话
-            if(!this.titleElem)return;
-            
-            var unvisi = ()=>{
-                this.titleElem.css("display","none");
-            }
-            var visi = ()=>{
-                var pos = math.getPos2d(this.position, player.camera, $("#player")[0])
-                if(pos.trueSide){//inSight
-                    this.titleElem.css( { "left" : `${pos.pos.x}px`,  "top": `${pos.pos.y}px ` });
-                    this.titleElem.css("display","block");
-                }else{
-                    unvisi()
-                }
-            }
-            if(this.mesh.visible){
-                if(player.mode == 'panorama'){
-                    visi()
-                }else{
-                    var ifShelter = convertTool.ifShelter(this.position)
-                    if(ifShelter)unvisi()
-                    else visi() 
-                }
-            }else{
-                unvisi()
-            }                
-                           
-        }
-        
-        */        
-        
-        hot.prototype.hideTitle = function(){ 
-            if(!this.titleElem)return;
-            this.titleElem.css("display","none");
-        }
-        
-        
-		hot.prototype.closestPanoTowardTag = function(e, t) {
-            
-			var i = []
-			  , o = []
-			  , l = this.mesh.position;
-			if (e === s.PANORAMA) {
-				var c = .5
-                  , h = t.position.clone().sub(l).normalize();
-                // 方奕卓 注释掉下面的筛选条件, 使热点列表能点击过渡
-				// i.push(p.filters.isPanoAligned()),
-				// i.push(p.filters.inPanoDirection(l, h, c)),
-				// i.push(p.filters.isNeighbourPanoTo(t)),
-				o.push(p.scoreFunctions.direction(l, h))
-			}
-			var u = new r.Vector3
-			  , d = function(e) {
-				u.copy(l).sub(e.position);
-				var t = -r.Math.radToDeg(Math.atan(u.y / Math.sqrt(u.x * u.x + u.z * u.z)))
-				  , i = a.tags.navigate.tiltTolerance;
-				return a.insideLookLimitDown - i < t && t < a.insideLookLimitUp + i
-			}
-			  , f = function(e) {
-				return Math.abs(e.position.x - l.x) > a.tags.visibility.cameraClearance || Math.abs(e.position.z - l.z) > a.tags.visibility.cameraClearance
-			};
-			i.push(f, d, (pano)=>{ // add
-                    return player.checkHasNeighbor(pano) 
-                }),
-			o.push(p.scoreFunctions.distanceSquared(this.mesh, -2));
-			var g = t.model.panos.sortByScore(i, o);
-			if (g && a.tags.navigate.lineOfSight) {
-				for (var m = 0; m < g.length; m++) {
-					var v = g[m].pano
-					  , A = v.position.distanceTo(l); 
-					raycaster.set(v.position, l.clone().sub(v.position).normalize());
-                    var y = raycaster.intersectObjects(t.model.colliders);
-                    // return g[0].pano;
-					if (0 === y.length || y[0].distance > A) {
-                        console.log(m);
-                        return v
-                    }
-				}
-				return null
-			}
-			return g && g.length > 0 && g[0].pano
-		} 
-            
-        var getLink = function(link){
-            var src = '';
-            var r = link.substring(link.indexOf("html") + 4)//给热点后面加上随机数,让热点确保是最新的
-              , o = "en" == manage.number("lang") ? "&lang=" + manage.number("lang") : "";//如果热点的内容是英文版的
-            -1 == r.indexOf("?") ? src = link + "?time=" + randomTime().getTime() + "&id=" + window.number + o : src = link + "&time=" + randomTime().getTime() + "&id=" + window.number + o 
-                
-            return src
-            
-        }
-		hot.prototype.examine = function(e, options) { 
-            options = options || {}
-            
-            if(this.actionType == 'noAction'  )return;
-            if(this.linkType!="common" && this.infoAttribute.iframe && this.infoAttribute.iframe[0] && !options.dontOpen){
-                var src = getLink(this.infoAttribute.iframe[0]);
-                if(this.linkType=="jumpLink"){
-                    /* var newPage = window.open(src, "_blank" ); 
-                    newPage.focus(); */
-                    
-                    var href = window.location.href
-                    var index =  href.indexOf("&")
-                    if(index>-1) href = href.substr(0,index)   /* pushState replaceState*/
-                    history.pushState(null, "", href+'&qs=1&firstView=pano:'+player.currentPano.id+',qua:'+ player.quaternion.toArray());
-                    window.location.href = src
-                    
-                    
-                }else if(this.linkType=="iframeDiv"){
-                    var div = document.createElement("div");
-                    $("body").append(div);
-                    div.style.position = 'fixed';
-                    div.style.width = div.style.height = "100%";
-                    div.style.left = div.style.top = '0';
-                    div.style["z-index"] = "999"
-                    
-                    var exit = document.createElement("div");
-                    exit.style["background-image"] = "url(images/vrOffImg.png)";
-                    exit.style.position = 'absolute';
-                    exit.style.width = exit.style.height = "50px";
-                    exit.style.left = '17px';   exit.style.top = "20px"
-                    exit.style.cursor = "pointer";
-                    exit.style["background-repeat"] = "no-repeat";
-                    exit.style["background-size"] = "25%"; 
-                    exit.style["background-position"] = "center center"; 
-                    exit.style["background-color"] = "rgba(0, 0, 0, 0.2)"; 
-                    exit.style["border-radius"] = "50%";
-                    exit.style["z-index"] = "3"
-                    exit.onclick = ()=>{
-                        $(div).remove()
-                        if(g_bgAudio && g_bgAudio.pauseByHot){
-                            manage.switchBgmState(true)
-                        }
-                    }  
-                    
-                    var myElement = document.createElement("iframe");
-                    myElement.style.position = 'absolute';
-                    myElement.style.width = myElement.style.height = "100%";
-                    myElement.style.left = myElement.style.top = '0';
-                     
-                    myElement.src = src
-                    
-                    
-                    
-                    
-                    div.appendChild(exit);
-                    div.appendChild(myElement)
-                    
-                    
-                    //打开热点的时候把背景音乐关闭了,避免与热点里面的音乐冲突
-                    //g_bgAudio && g_bgAudio.pause();
-                    if(g_bgAudio && !g_bgAudio.paused){
-                        manage.switchBgmState(false); 
-                        g_bgAudio.pauseByHot = true
-                    } 
-                    if(g_tourAudio)g_tourAudio.pause()
-                    
-                    
-                    
-                }
-                
-                
-                
-                
-                return;
-            }
-        
-        
-            if(settings.dontExamHot || this.actionType == 'dontExam'){
-                o();
-                return;
-            }
-        
-            if(!player.currentPano)return;
-			var hotPop = document.getElementById('popup');
-            //获取那个热点的链接 
-			if(this.link){
-				g_currentHot = this;		
-				hotPop.style.display = "block";
-				hotPop.classList.add("wait");
-				var myElement = document.createElement("iframe");
-                //打开热点的时候把背景音乐关闭了,避免与热点里面的音乐冲突
-                //g_bgAudio && g_bgAudio.pause();
-                if(g_bgAudio && !g_bgAudio.paused){
-                    manage.switchBgmState(false); 
-                    g_bgAudio.pauseByHot = true
-                } 
-                if(g_tourAudio)g_tourAudio.pause()
-                
-                var src = getLink(this.link   )
-                myElement.src = src; 
-                myElement.id = "id1";
-				myElement.allowTransparency = "true";
-				// myElement.scrolling = "no";
-				var element=document.getElementById("id1");  //判断页面是否有iframe 
-				if (typeof(element)== "undefined" || element == null){
-                    document.querySelector(".popup-content").appendChild(myElement);
-                    //移动端自动播放
-                    var videoLoaddingResult = false
-                    window.loaddingSuccess = function() {
-                        videoLoaddingResult = true
-                    }
-
-                    setTimeout(function func() {
-                        if (videoLoaddingResult) {
-                            var $iframe = document.querySelector('#id1').contentWindow.document;
-                            if($iframe.querySelector('video')){
-                                $iframe.querySelector('video').play();
-                                // alert($iframe.querySelector('video'));
-                                if(!$iframe.querySelector('video').paused && $iframe.querySelector('.playPause')){
-                                    $iframe.querySelector('.playPause').classList.add("fa-pause");
-                                }
-                            }
-                            if($iframe.querySelector('audio')){
-                                $iframe.querySelector('audio').play();
-                            }
-                        } else {
-                            setTimeout(func, 300)
-                        }
-                    }, 800);
-				}  
-				
-				//setTimeout(function(){$('#player').on("click",e.closePopup);},20)
-				
-			}
-			
-            // if(hotListSta) {
-            //     hotPop.classList.remove("wait"); 
-            //     return;
-            // }
-			
-			var t = e.mode
-			  , i = a.tags.navigate.nearestPano && this.closestPanoTowardTag(t, e.currentPano) || e.currentPano
-			  , n = this.mesh.position;
-			e.flyingToTag = true;
-			var o = function() {
-				e.flyingToTag = false;
-				if(this.link){ 
-					hotPop.classList.remove("wait"); 
-				}
-				
-			}.bind(this);
-            
-            
-            if(settings.dontExamHot){
-                o();
-                return;
-            }
-            
-            
-            
-			if (t === s.PANORAMA){ 
-				var l = {
-					pano: i,
-					lookAtPoint: n,
-					duration: null,
-					maxDistanceOverride: null,
-					skipWarpingCheck: !1
-				};
-                e.flyToPano(l, o) 
-			}else {
-				var c = {
-					pano: i
-				};
-				if (n) {
-					var h = (new r.Matrix4).lookAt(i.position, n, new r.Vector3(0,1,0));
-					c.quaternion = (new r.Quaternion).setFromRotationMatrix(h)
-				}
-				c.callback = o,
-				c.duration = 1500,
-				c.mode = s.PANORAMA,
-				e.flyToNewMode(c)
-			}
-		},
-	
-        //判断someData里面是否有special字段,如果有就会处理这些特殊的大场景
-        // if(window.DATA.special){
-        //     specialScene.special().beforeImplement();
-        // }
-        
-		//czj 判断是否是数组 如果不是将对象转换为数组
-        /* hot.prototype.conversionArray = function(obj){
-            if(Object.prototype.toString.call(obj)=='[object Array]') return obj;
-            var arr = []
-            for (var i in obj) {
-                arr.push(obj[i]); //属性
-            }
-            return arr
-        } */
-		hot.prototype.convertValue = function(v ,Type){
-            var value; 
-            if(v instanceof Array){
-                v.forEach((v1)=>{v1 = parseFloat(v1)})
-                value = new Type().fromArray(v);
-            }else{
-                for(let i in v){v[i] = parseFloat(v[i])}
-                value = new Type().copy(v);
-            }
-            return value
-        } 
-		
-        t.exports = hot;
-    }
-    , {
-		three: 217,
-		"../shaders":167,
-		"../enum/Viewmode":51,
-		"../objects/Panorama":148,
-		"../util/texture":194,
-		"../settings":166,
-        "../util/math": 190,
-	}], 
-	/************************************创建热点模型************************************ */
+    
     123: [function(e, t, i) {//tag
         (function(i) {
             "use strict";
@@ -18288,15 +17780,7 @@ window.Modernizr = function(n, e, t) {
                          
                         
                         g_index = w.valueFromHash("m");
-                        /* if(t.tourAudio){
-                            g_tourAudio = new Audio; 
-                            g_tourAudio.loop = false;
-                            g_tourAudio.addEventListener('ended', function () {  
-                                var ev = document.createEvent("MouseEvent"); 
-                                ev.initEvent("tourAudioEnded",true,true);
-                                window.dispatchEvent(ev);
-                            });
-                        }; */ 
+                         
                         
                     }
                     /***************************方奕卓 请求data.js数据, 用于初始化热点列表 ****************************/
@@ -22146,31 +21630,12 @@ window.Modernizr = function(n, e, t) {
                 str += ( '"camera_position":['+ info.camera_position + '],"camera_quaternion":['+info.camera_quaternion+'], "zoom":' + info.zoom + '}');
 				return str; 
 			}
+            
+            
 			//------end	 
-			n.prototype.closePopup = function() {//xzw  关闭热点页面
-				if(!g_currentHot) return;
-				g_currentHot = null;
-				var hotPop = document.getElementById('popup'); 
-				hotPop.style.display = "none";
-				document.querySelector(".popup-content").removeChild(document.getElementById("id1"));
-				$("#popup iframe:last").remove();
-                var _bgaudio = document.getElementById("bgaudio");
-                //判断音乐是否暂停或者是否存在
-                /* if(g_bgAudio && g_bgAudio.paused && g_bgAudio.readyState != 0 && g_play === 1)
-                {
-                    //g_bgAudio.play();
-                    manage.switchBgmState(true)
-                }; */
-                
-                if(g_bgAudio && g_bgAudio.pauseByHot){
-                    manage.switchBgmState(true)
-                }
-                
-                
-				//$('#player').off("click",this.closePopup);
-                return false
-			}  
-				 
+            
+            
+			
 			 
 			
             n.prototype.setupCustomProperties = function(e) {
@@ -22294,26 +21759,10 @@ window.Modernizr = function(n, e, t) {
                 return .5
             }
             ,
-			n.prototype.changeMusic = function() {//xzw add
-				/* if(!this.director.tourIsPlaying && g_play && g_bgAudio){
-					g_playAudio = g_bgAudio; 
-					//g_bgAudio.play();
-                    manage.switchBgmState(true)
-				}else{
-					if(!g_play){
-						g_playAudio =  g_bgAudio; 
-					}else{//防止再次播放时重播一遍
-						g_playAudio = null;
-					}
-				}  */  
-                 
-                /* if(!this.director.tourIsPlaying && g_bgAudio){
-                    manage.switchBgmState(true)
-                } */
-                
+			/* n.prototype.changeMusic = function() {//xzw add 
                 if(!this.director.tourIsPlaying) this.director.bgmReplay()
-			}
-			,
+			} */
+			 
             n.prototype.bindEvents = function(e) {
                 e !== document && e.setAttribute("tabindex", -1),
                 e.addEventListener("mousedown", this.onMouseDown.bind(this)),
@@ -22336,17 +21785,12 @@ window.Modernizr = function(n, e, t) {
                 this.cameraControls.on(_.Pinch, this.handleControlPinch.bind(this)),
                 this.cameraControls.on(_.Scroll, this.handleControlScroll.bind(this)),
                 window.addEventListener("snapshotBegin", this.getWrapShot.bind(this)),//xzw add
-				window.addEventListener("tourAudioEnded", this.changeMusic.bind(this));//xzw add
+				//window.addEventListener("tourAudioEnded", this.changeMusic.bind(this));//xzw add
                 
                 // lzb
                 window.getSeft && getSeft(this);
 
-                //判断是否是移动端,如果是给关闭按钮添加touchstart事件
-                if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)){
-                    $('#closepop').on("touchstart",this.closePopup.bind(this)); 
-                }else{
-                    $('#closepop').on("click",this.closePopup.bind(this)); 
-                }
+                
             }
             ,
             n.prototype.onMouseDown = function(e) {
@@ -23780,7 +23224,8 @@ window.Modernizr = function(n, e, t) {
             }
             ,
             n.prototype.flyDirection = function(e, t, i) {
-				this.closePopup();//xzw add
+				Hot.closePopup();//xzw add
+                
                 var n = $.Deferred();
                 this.history.invalidate();
                 var r = this.closestPanoInDirection(e, t, i);
@@ -24002,6 +23447,8 @@ window.Modernizr = function(n, e, t) {
             }
             ,
             n.prototype.flyToNewMode = function(e, t) {
+                Hot.closePopup();//xzw add
+                
                 e = e || {};
                 var i = e.mode
                   , n = e.pano
@@ -24371,7 +23818,8 @@ window.Modernizr = function(n, e, t) {
                 var rotTime
                 if(currentLocation.rotTime == void 0 || currentLocation.rotTime == ''){
                     var restChildCount = currentLocation.heroLocations ? (currentLocation.heroLocations.length-this.director.currentItem[1]-1) : 0
-                    var current = g_tourAudio ? 1e3 * g_tourAudio.currentTime : 0
+                    var audioObj = SoundManager.list.find(e=>e.name == 'tour')
+                    var current = audioObj.audio.currentTime * 1e3 // || 0  //g_tourAudio ? 1e3 * g_tourAudio.currentTime : 0
                     rotTime = currentLocation && currentLocation.musicInfo.music ? currentLocation.musicInfo.time - current : 2e3;  
                     
                     if(restChildCount){//如果当前folder中还有剩下的item,平分一下时间
@@ -27048,7 +26496,7 @@ window.Modernizr = function(n, e, t) {
                 matchCam: !1,
                 blur: .33,
                 fastTime: 1500,
-                teleportTime:  1500,
+                teleportTime:  1500,//瞬间过渡的时间
                 outsideTime: 2e3,
                 lookAheadMax: .3,
                 lookAheadDist: 2.5,
@@ -31356,7 +30804,10 @@ window.Modernizr = function(n, e, t) {
                 }).sort(function(e, t) {
                     return t.score - e.score;
                 });
-            } 
+            },
+            getFileNameFromUrl:function(url){
+                return url.split('/').pop();
+            }
  
             
         },

+ 283 - 96
js/manage.js

@@ -105,98 +105,6 @@ Manage.prototype.loadWeixin = function() {
 
 }
 
-Manage.prototype.loadAudio = function() { //相关:g_tourAudio \  g_playAudio
-    g_bgAudio = new Audio;
-    g_bgAudio.loop = true;
-    g_bgAudio.autoplay = true;
-    g_bgAudio.id = "bgaudio";
-    
-    //https://www.cnblogs.com/interdrp/p/4211883.html   部分资料
-    g_bgAudio.load();	// iOS 9   还需要额外的 load 一下, 否则直接 play 无效
-    var play = function(){
-        //if(window.tourAudioSta) return;
-         
-        if(this.bgmShouldPlay){
-            this.switchBgmState(true)
-        }
-        
-        document.removeEventListener("touchstart",play);
-        document.removeEventListener("click",play);
-        $('#player')[0].removeEventListener("touchstart", play);
-    }.bind(this);
-    
-    g_bgAudio.oncanplay = ()=>{ 
-        this.switchBgmState(true)
-    }
-    document.addEventListener("WeixinJSBridgeReady", ()=> {
-        this.switchBgmState(true)
-    }, false);
-    
-    document.addEventListener("touchstart", play);//ios需要加个事件才能播放 不能自动播放;如果还有浏览器不行,换成别的交互事件
-    document.addEventListener("click", play);
-     $('#player')[0].addEventListener("touchstart", play);
-    g_bgAudio.addEventListener('ended', ()=>{ 
-        this.switchBgmState(true)
-    }); 
-    
-    
-    
-    $("#volume").find("a").on("click", ()=> { 
-         
-        if($("#volume img")[0].src.indexOf("btn_on.png")>-1)
-        { 
-            this.switchBgmState(true); 
-        }
-        else if($("#volume img")[0].src.indexOf("btn_off.png")>-1)
-        {
-            this.switchBgmState(false);    
-        }
-    }) 
-
-    
-    
-}   
-Manage.prototype.switchBgmState = function(state){
-    if(!g_bgAudio || !g_bgAudio.src) return;
-    this.bgmShouldPlay = state
-    
-    var played = function(){
-        console.log('begin play bgm');
-        g_play = 1; 
-        g_playAudio = g_bgAudio;
-        $("#volume a img").attr("src", "./images/Volume btn_off.png")
-        $("#volume").attr("title", "关闭声音");
-        g_tourAudio && g_tourAudio.pause()
-    }
-    var paused = function(){ 
-        g_play = 0;
-        g_playAudio == g_bgAudio && (g_playAudio =  null)
-        $("#volume a img").attr("src", "./images/Volume btn_on.png")
-        $("#volume").attr("title", "打开声音");
-    }
-    
-    if(state ){
-        g_bgAudio.play(); 
-        if(g_bgAudio.paused){
-            paused()
-        }else{
-            played()
-            return true
-        }            
-    }else{
-        g_bgAudio.pause();
-        paused()
-    } 
-    
-    
-    g_bgAudio.pauseByHot = false
-    g_bgAudio.pauseByTour = false
-}    
-    
- 
-
- 
-
 
  
 
@@ -404,7 +312,6 @@ Manage.prototype.showInfo = function (o) { // ({result:true, title:"发布成功
 
 
 
-var manage = new Manage();
 
 //公用的函数
 
@@ -655,8 +562,8 @@ var ifSame = function(object1, object2){
 
 
 
-var SoundPriority = {//暂不支持同时播放
-    currentPlay:null,//当前正在播放list中的哪一个
+/* var SoundManager = {//暂不支持同时播放
+    currentAudio:null,//当前正在播放list中的哪一个
     list:[
         {
             name:"bg", 
@@ -686,15 +593,295 @@ var SoundPriority = {//暂不支持同时播放
         
         
     ],
+    switchPlay:function(){
+        
+    },
     register:function(){
         
         
         
-    }
+    } 
+    
+}
+ */
+ 
+ 
+ 
+//最好能知道应该播放到的currentTime
+var SoundManager = {//暂不支持同时播放
+    currentAudio:null,//当前正在播放list中的哪一个
+    enableSound:true,//是否允许有声音
+    
     
+    playHistory:[],
+    
+    list:[ //同一级别可以互相打断 //暂时不做多级别
+    ],
+     
+    
+    play:function(name, src, currentTime){
+        var object = this.list.find(e=>e.name == name)
+        if(object){
+            if(this.currentAudio){ 
+                this.pause(this.currentAudio.name, false, true)
+                
+            }
+            
+            {//将当前要播放的播放历史中清除
+                let index = this.playHistory.indexOf(object)
+                if(index>-1)this.playHistory.splice(index,1);
+                
+            }
+               
+            
+            this.currentAudio = object
+            if(src){ 
+                this.setSrc(name, src)
+            }
+            if(currentTime!=void 0){
+                object.audio.currentTime = currentTime
+            }
+            if(object.audio){
+                object.audio.load();	// iOS 9   还需要额外的 load 一下, 否则直接 play 无效 *///https://www.cnblogs.com/interdrp/p/4211883.html   部分资料
+                object.audio.play();
+                object.callback && object.callback(true)
+            }
+            Log(name + '  播放 '  )
+        }
+        
+    },
+    
+    
+    pause:function(name, autoReplayLast, isInterrupt){//需要能自动恢复上一个被打算的音频。恢复前判断是否还需要播放
+        var object = this.list.find(e=>e.name == name)
+        if(object){
+            this.currentAudio = null
+            
+            
+            if(object.audio){
+                object.audio.pause()
+                object.callback && object.callback(false)
+                Log(name + ' 中断音频 '+  "("+common.getFileNameFromUrl(object.audio.src)+')' )
+            }
+            
+            
+            
+            if(isInterrupt){//一般主动调用不需要加这个
+                this.playHistory.push(object)//如果是被中断的,加入播放历史,等待恢复播放
+            }
+             
+            
+            if(autoReplayLast){ //播放之前的音频。它们是被打断过的。
+                while(this.playHistory.length){ 
+                    var last = this.playHistory.pop();
+                    if(last.src && last.canplay(last.audio)){
+                        this.play(last.name )
+                    }
+                    
+                }
+                
+            }
+            
+            
+        }
+        
+    },
+    
+    
+    /* resume:function(){ //比如热点关闭后继续播放bgm
+        
+    }, */
+    
+    setSrc : function(name, src){//不能直接给audio赋src!一定要用这个函数!因为我要拿这里的src来判断有无src,因为貌似audio的src会自动变,''时会变成html的链接
+        var object = this.list.find(e=>e.name == name)
+        object.src = src
+        object.audio.src = src
+        Log(`${object.name} 设置src: ${src}`)
+    },
     
+    createAudio:function(object={}){//name, level, canplay
+        if(!object.fake){
+            object.audio = new Audio(); 
+            object.audio.loop = !!object.loop;
+            //object.audio.autoplay = true;
+        
+            
+            object.audio.addEventListener('ended', ()=>{ 
+                if(object.loop){//循环
+                    Log(`${object.name} 播放完毕,重新播放`)
+                    object.audio.play()
+                }else{
+                    this.pause(object.name, true);//停止后的后续处理
+                }
+            });
+            
+            
+            object.audio.oncanplaythrough = ()=>{ 
+                Log(`${object.name} canplaythrough  `) 
+            }
+        }
+        
+        this.list.push(object)
+        
+    },
+    initAutoPlay:function(){  
+        let play = function(){  
+            if(this.currentAudio && this.currentAudio.audio){
+                this.currentAudio.audio.play() 
+                Log(`${this.currentAudio.name} 自动播放成功`) //即使设置src在这之后好像也能成功播放
+            }else{
+                
+            }
+            document.removeEventListener("touchstart",play);
+            document.removeEventListener("click",play);
+            $('#player')[0].removeEventListener("touchstart", play);
+        }.bind(this);
+        
+        
+        document.addEventListener("WeixinJSBridgeReady", play, false);
+        document.addEventListener("touchstart", play);//ios需要加个事件才能播放 不能自动播放;如果还有浏览器不行,换成别的交互事件
+        document.addEventListener("click", play);
+        $('#player')[0].addEventListener("touchstart", play); 
+            
+         
+    }
+}
+
+
+function Log(value, color, fontSize){
+    color = color || '#13f'
+    fontSize = fontSize || 14
+    console.warn(`%c${value}`, `color:${color};font-size:${fontSize}px`) 
 }
 
+
+
+
+
+
+Manage.prototype.loadAudio = function() { //相关:g_tourAudio \  g_playAudio
+    
+     
+    
+    
+    //热点页面因为挡住了界面,所以暂时不存在别的音频阻止热点音频的可能
+    //box视频都静音,所以暂时不考虑
+    
+    SoundManager.createAudio({
+        name:'bgm',
+        level:0, 
+        src:'',
+        loop:true,
+        canplay:(audio)=>{
+            return this.bgmShouldPlay
+        },
+        callback:(state)=>{//play或pause时随之触发的函数(即使还没开始播放)
+            if(state){
+                $("#volume a img").attr("src", "./images/Volume btn_off.png")
+                $("#volume").attr("title", "关闭声音");
+            }else{
+                $("#volume a img").attr("src", "./images/Volume btn_on.png")
+                $("#volume").attr("title", "打开声音");
+            }
+        }
+    })  
+    SoundManager.createAudio({
+        name:'tour',
+        level:0, 
+        src:'',
+        loop:false,
+        canplay:(audio)=>{
+            return player.director && player.director.tourIsPlaying && player.director.getAudio()
+        }
+    })
+    SoundManager.createAudio({
+        name:'hot',
+        fake:true,//实际上没有audio. 只是为了来停止和续播其他音频
+        level:1, 
+        src:'',
+        loop:false,
+        canplay:(audio)=>{
+            
+        }
+    })
+     
+    
+    $("#volume").find("a").on("click", ()=> {  
+        if($("#volume img")[0].src.indexOf("btn_on.png")>-1)
+        { 
+            this.switchBgmState(true); 
+        }
+        else if($("#volume img")[0].src.indexOf("btn_off.png")>-1)
+        {
+            this.switchBgmState(false);    
+        }
+    })  
+    
+    this.switchBgmState(true);//初始设置允许播放bgm 
+    SoundManager.initAutoPlay()
+    
+    
+}  
+
+
+ 
+Manage.prototype.switchBgmState = function(state){//按钮的状态完全代表是否应该播放bgm,即使还没加载完
+    this.bgmShouldPlay = state
+    
+    
+    if(state){
+        
+        SoundManager.play('bgm')
+    }else{
+        
+        SoundManager.pause('bgm')
+    }
+    
+    
+    /* if(!g_bgAudio || !g_bgAudio.src) return;
+    
+    
+    var played = function(){
+        console.log('begin play bgm');
+        g_play = 1; 
+        g_playAudio = g_bgAudio;
+        
+        g_tourAudio && g_tourAudio.pause()
+    }
+    var paused = function(){ 
+        g_play = 0;
+        g_playAudio == g_bgAudio && (g_playAudio =  null)
+        
+    }
+    
+    if(state ){
+        g_bgAudio.play(); 
+        if(g_bgAudio.paused){
+            paused()
+        }else{
+            played()
+            return true
+        }            
+    }else{
+        g_bgAudio.pause();
+        paused()
+    } 
+    
+    
+    g_bgAudio.pauseByHot = false
+    g_bgAudio.pauseByTour = false */
+}    
+    
+    
+    
+    
+    
+var manage = new Manage();
+
+ 
+
+
+
 //兼容一代的場景
 //請求地址統一管理
 var g_onePregix = "https://bigscene.4dage.com/" //对应一代  http://www.4dmodel.com/SuperPanoramic/index.html?m=55