Procházet zdrojové kódy

Merge branch 'master' of http://192.168.0.115:3000/chenzhiguang/zhengzhou_university

tremble před 4 roky
rodič
revize
e865915662

+ 10 - 4
edit-backstage/js/edit.js

@@ -3003,8 +3003,13 @@ var EditOverlay = {
         
 
         player.overlayGroup.children.forEach((overlay)=>{
-            if(overlay.plane.material.map.image)this.getOverlayInfo(overlay)
-            else   overlay._loadDones = [()=>{this.getOverlayInfo(overlay)}]   
+            if(!overlay.plane.material.map || !overlay.plane.material.map.image){
+                overlay._loadDones = [()=>{this.getOverlayInfo(overlay)}] 
+            }
+            else {
+                this.getOverlayInfo(overlay)
+            }
+              
             this.addToList(overlay)
         }
         )
@@ -3024,7 +3029,7 @@ var EditOverlay = {
     switchEditType : function(type){
         this.editType = type;
         $('#overlayUpload [name="upload"] button').text(type == 'video' ? "上传视频" : "上传图片")  
-        $('#overlayUpload .preview span').text(type == 'video' ? "支持MP4、MOV等,<20M" : "支持jpg、png等,<20M");
+        $('#overlayUpload .preview span').text(type == 'video' ? "支持MP4、MOV等,<20M" : "支持jpg、png等,<10M");
     },
     beginToAddPlane: function(event) {
         this.switchEditType($(event.target).attr("data-type"))   
@@ -3091,7 +3096,8 @@ var EditOverlay = {
     },
     updateOverlayPanel: function(overlay) {
         this.editPlane = overlay;
-        
+        overlay.requestDownload()
+         
         if(overlay._loadDones){
             $('.waiting').addClass('showloading');
             overlay._loadDones.push(()=>{

+ 37 - 22
edit-backstage/js/main_2020_edit.js

@@ -1,4 +1,25 @@
-
+var getVisiblePano = function(position, options={}){
+    var visiblePanos = []; 
+    var B = position.clone(); 
+    var panos = options.panos ||  player.model.panos.list;
+     
+    panos.forEach((pano)=>{
+        if(!pano.isAligned())return;
+        var A = pano.position.clone();
+          
+        var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, A.distanceTo(B) - (options.tolerance||0) ) 
+        var o = ray.intersectObjects(options.model || player.model.colliders, true);
+         
+         
+        if (!o || !o.length)visiblePanos.push(pano );
+         
+        
+    })  	  
+     
+    return visiblePanos
+} 
+  
+  
 
 g_playAudio = null
 
@@ -24,9 +45,6 @@ g_tourAudio.oncanplaythrough = function() {
 
 
 
-
-
-
 var dom = {
     getOffset: function(e, t, i) {
         for (left = "left" == e ? t.offsetLeft : t.offsetTop,
@@ -14233,7 +14251,7 @@ function o(a, s, l) {
                                     labelDisplayController: d,
                                     controls: h
                                 }
-                            }(o, s.mode),
+                            }(o,  o ? s.mode : "dollhouse" ), // change
                             l = m.controls,
                             c = m.player,
                             h = m.director,
@@ -17100,22 +17118,14 @@ function o(a, s, l) {
             }
             ,
             t.prototype.loadOverlays = function(overlays){
-                var overlays = window.data2 && window.data2.overlays /* ||
-                 [
-                    { depth: 0.02,
-                    file: "https://super.4dage.com/data/TEST/overlay/b6fe7cb6bd2b6.mp4",
-                    hasBox: 0,
-                    height: 0.8165,
-                    media: ["video"],
-                    pos:  [-4.3132, 0.6788, -13.5162],
-                    qua:  [0, 0.9396, 0, 0.3421],
-                    sid: "1591079418827",
-                    width: 0.6124
-                }]  */
-                
+                var overlays = window.data2 && window.data2.overlays 
                 overlays && overlays.forEach((info)=>{ 
                     new Overlay(info)  
                 })
+                
+                
+                Overlay.load()
+                
             }
             
             ,
@@ -20969,7 +20979,7 @@ function o(a, s, l) {
                 if(!this.overlayInitedPlay && this.overlayGroup.children.length){
                     try{
                         this.overlayGroup.children.forEach((overlay)=>{
-                            overlay.overlayType == "video" &&  overlay.plane.material.map.image.play()
+                            //overlay.overlayType == "video" &&  overlay.plane.material.map.image.play()
                         })
                     }catch(e){}
                     
@@ -21826,7 +21836,7 @@ function o(a, s, l) {
                     
                     this.updateHotVisible(n); //更新热点显示
                     this.transitionPos({type:"beforeFlytopano", pano:n, dur:p})//add 
-                    
+                    Overlay.updateVisibles([this.currentPano, n])
                     
                     
                     
@@ -21859,6 +21869,7 @@ function o(a, s, l) {
                         
                         if(this.mode == "panorama" && EditOverlay.editing){
                             EditOverlay.updatePano(this.currentPano)
+                            Overlay.updateVisibles([this.currentPano])
                         }
                         
                     }
@@ -22327,9 +22338,13 @@ function o(a, s, l) {
                     
                     if(this.mode == "panorama" && EditOverlay.editing){
                         EditOverlay.updatePano(this.currentPano)
-                    }
+                    } 
                     //this.mode == u.PANORAMA && this.transitionPos({type:"flyDone", this.currentPano})//add   
-                    
+                    if(this.mode == V.PANORAMA){ 
+                        Overlay.updateVisibles([this.currentPano])
+                    }else{
+                        Overlay.updateVisibles(true)
+                    }
                     
                     c && u !== V.PANORAMA && i === V.PANORAMA ? this.startWarp(M.Retain, S.Retain, R.BLACK, null, null, a) : (a && a(),
                     t.resolve())

+ 208 - 10
edit-backstage/js/overlay.js

@@ -1,3 +1,51 @@
+var MathLight = {};
+MathLight.RADIANS_PER_DEGREE = Math.PI / 180;
+MathLight.DEGREES_PER_RADIAN = 180 / Math.PI;
+
+var filterAll = function filterAll(e, t) {
+    return e.filter(function (e) {
+  return t.every(function (t) {
+    return t(e);
+  });
+});
+} 
+var sortByScore = function (list, request, rank) {
+  var i = filterAll(list, request);
+  return 0 === i.length ? null : i = i.map(function (e) {
+    return {
+      item: e,
+      score: rank.reduce(function (t, i) {
+        return t + i(e);
+      }, 0)
+    };
+  }).sort(function (e, t) {
+    return t.score - e.score;
+  });
+};
+/* var cameraLight = {
+    clampVFOV: function(fov, t, i, n) {
+        var r = cameraLight.getHFOVFromVFOV(fov, i, n);
+        return r > t ? cameraLight.getVFOVFromHFOV(t, i, n) : fov
+    },
+    getHFOVForCamera: function(e, t, i) {
+        return cameraLight.getHFOVFromVFOV(e.fov, t, i)
+    },
+    getHFOVFromVFOV: function(fov, t, i) {
+        var n = t
+            , o = i
+            , a = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (n / o)) * MathLight.DEGREES_PER_RADIAN;
+        return a
+    },
+    getVFOVFromHFOV: function(e, t, i) {
+        var n = t
+            , o = i
+            , a = 2 * Math.atan(Math.tan(e * MathLight.RADIANS_PER_DEGREE / 2) * (o / n)) * MathLight.DEGREES_PER_RADIAN;
+        return a
+    }
+};
+  */
+ 
+ 
  
 var initOverlay = function(THREE){
     var _planeGeometry = new THREE.PlaneGeometry(settings.overlay.width, settings.overlay.height,1,1)
@@ -70,7 +118,7 @@ var initOverlay = function(THREE){
                 info.type = "photo"  
                 
             }
-            plane.material.opacity = 1;
+            plane.material.opacity = 0.1;
             plane.material.color = new THREE.Color(1,1,1) 
         }
         if(info.width == void 0) info.width = settings.overlay.width;
@@ -79,9 +127,9 @@ var initOverlay = function(THREE){
         this.fileSrc = info.file
         
     }
-
+    
+     
      
-      
     Overlay.prototype.setFromInfo = function(info){//1 恢复到编辑之前 2 初始加载 
         var plane = this.plane; 
         this.transformAtPanos = info.transformAtPanos || {} //在每个漫游点独立设置的position。  
@@ -111,16 +159,27 @@ var initOverlay = function(THREE){
         if(info.type){
             if(!plane.material.map){
                 if(info.type == "video"){ 
-                    plane.material.map = new THREE.VideoTexture( info.media );  
+                    plane.material.map = new THREE.VideoTexture( info.media ); 
+                    this.hasRequestLoad = true
+                    
+                    plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
+                    plane.material.map.minFilter = THREE.LinearFilter;
+                    plane.material.map.magFilter = THREE.LinearFilter;
+                    plane.material.map.generateMipmaps = true; 
+                    
                 }else{  
-                    plane.material.map = Texture.load(info.file,()=>{
-                        if(this._loadDone)this._loadDone()
-                    }) 
+                    this._loadDones = []
+                    /* plane.material.map = Texture.load(info.file,()=>{
+                        if(this._loadDones){
+                            this._loadDones.forEach(e=>e())
+                            this._loadDones = null
+                        }
+                    })  */
                 } 
-                plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
+                /* plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
                 plane.material.map.minFilter = THREE.LinearFilter;
                 plane.material.map.magFilter = THREE.LinearFilter;
-                plane.material.map.generateMipmaps = true; 
+                plane.material.map.generateMipmaps = true;  */
             }else plane.material.map.image = info.media; 
             this.file = info.file;
         }
@@ -130,7 +189,8 @@ var initOverlay = function(THREE){
             this.addBox(!this.hasBox); 
         }
         
-        
+        this.updateMatrixWorld()
+        this.getVisiblePanos()
         
     } 
 
@@ -192,6 +252,144 @@ var initOverlay = function(THREE){
         
     }
     
+    Overlay.prototype.getVisiblePanos = function(){ 
+        this.visiblePanos = getVisiblePano(this.plane.getWorldPosition(),{model: null});  
+        
+    }
+    Overlay.prototype.updateVisibles = function(panos){ 
+        this.visible = !!panos.find(pano=>this.visiblePanos.includes(pano))
+    }    
+    Overlay.updateVisibles = function(panos){
+        if(panos === true){
+            player.overlayGroup.children.forEach(e=>e.visible = true)
+        }else{
+            player.overlayGroup.children.forEach(e=>e.updateVisibles(panos))
+        }
+    }
+    
+    
+    Overlay.prototype.addToLoadQueue = function(){
+        if(this.overlayType == 'photo'){ 
+            Overlay.loadQueue.includes(this) || Overlay.loadQueue.push(this)
+              
+        }
+    } 
+    Overlay.prototype.requestDownload = function(){
+        if(this.hasRequestLoad ||  this.overlayType != 'photo')return
+        
+        console.log('overlay requestDownload : '+this.sid)
+        var plane = this.plane; 
+        
+        plane.material.map = Texture.load(this.file,()=>{
+            plane.material.needsUpdate = true
+            if(this._loadDones){
+                this._loadDones.forEach(e=>e())
+                this._loadDones = null  
+            }
+            setTimeout(Overlay.loadNext,50)
+            plane.material.opacity = 1;
+            console.log('overlay loaded: '+this.sid)
+        })
+        plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
+        plane.material.map.minFilter = THREE.LinearFilter;
+        plane.material.map.magFilter = THREE.LinearFilter;
+        plane.material.map.generateMipmaps = true; 
+        
+         
+        this.hasRequestLoad = true
+    }
+    
+    
+    
+    
+    
+ 
+    Overlay.loadQueue = [];
+  
+    
+    Overlay.getNeedLoad = function(){ 
+        if(!player || !player.domElement || !player.mode)return;
+        
+        if(player.mode != 'panorama'){
+            if( !Overlay.loadWhenOutside) return;
+            /* var loadings = player.overlayGroup.children.filter(e=>e.hasRequestLoad && e._loadDones)//开始下载了但是没加载好的
+            
+            if(loadings.length==4){
+                Overlay.loadQueue = player.overlayGroup.children.filter(e=>!e.hasRequestLoad) .slice(0,5);
+            } */
+            
+            if(Overlay.loadQueue.length == 0){
+                Overlay.loadQueue = player.overlayGroup.children.filter(e=>!e.hasRequestLoad).slice(0,5);
+            }
+            
+            return;
+        }
+        Overlay.loadWhenOutside = true
+        var overlays = player.overlayGroup.children.filter(e=>!e.hasRequestLoad && e.visiblePanos.includes(player.currentPano))
+        //var maxAngle = THREE.Math.degToRad( cameraLight.getHFOVFromVFOV(70, player.domElement.clientWidth, app.player.domElement.clientHeight) / 2);
+        var cameraDir = player.getDirection()
+        
+        /* var maxCount = 5; 
+        if(overlays.length>maxCount){
+            for(var i=0;i<overlays.length;i++){ 
+                //角度为可见范围 
+                var v1 = cameraDir.clone().setY(0);
+                var v2 = overlays[i].plane.getWorldPosition().sub(player.position).setY(0)
+                if(v1.angleTo(v2) <= maxAngle){
+                    Overlay.loadQueue.push(overlays[i])
+                    if(Overlay.loadQueue.length>=10) break;
+                }  
+            } 
+            if(Overlay.loadQueue.length<Overlay.maxLoadingCount){
+                Overlay.loadQueue.push()
+            }
+        }else{ */
+            Overlay.loadQueue = overlays
+        //} 
+        
+        
+      
+        var request = [(overlay)=>{ 
+            return true
+        }];
+        var rank = [(overlay)=>{
+            var dis = overlay.plane.getWorldPosition().distanceTo(player.position);
+            return -dis
+        },(overlay)=>{
+            var tagDir = overlay.plane.getWorldPosition().sub(player.position) 
+            var angle = tagDir.angleTo(cameraDir)
+            return -angle*20
+        }]
+        var result = sortByScore(Overlay.loadQueue, request,rank); 
+        Overlay.loadQueue = result ? result.slice(0,5).map(e=>e.item) : player.overlayGroup.children.filter(e=>!e.hasRequestLoad).slice(0,2);
+         
+      
+    }
+    
+    Overlay.maxLoadingCount = 3;
+    Overlay.loadNext = ()=>{
+        
+        var loadings = player.overlayGroup.children.filter(e=>e.hasRequestLoad && e._loadDones)//开始下载了但是没加载好的
+        Overlay.loadQueue.slice(0,Overlay.maxLoadingCount-loadings.length).forEach(e=>e.requestDownload())
+        Overlay.loadQueue.splice(0,Overlay.maxLoadingCount-loadings.length)
+    } 
+    
+    
+    Overlay.load = ()=>{
+        Overlay.getNeedLoad()
+        //Overlay.loadQueue.slice(0,2).forEach(e=>e.requestDownload())
+        Overlay.loadNext() 
+        var unloads = player.overlayGroup.children.filter(e=>!e.hasRequestLoad) 
+        if(unloads.length){ 
+            setTimeout(Overlay.load, 200)
+        }else{
+            Overlay.allRequestLoad = true
+            console.log('allRequestLoad')
+        }
+    }
+  
+    
     
     window.Overlay = Overlay;
+    
 } 

+ 1 - 1
web/public/static/js/main_2020_show.js

@@ -17934,7 +17934,7 @@ window.Modernizr = function(n, e, t) {
 					func: function(e) {
 						var opa = e <= .5 ? 2 * e : -2 * e + 2
                         for(var i in this.hots){
-                            this.hots[i].mesh.material.uniforms.opac.value = opa;
+                            if(this.hots[i].mesh.visible) this.hots[i].mesh.material.uniforms.opac.value = opa;
                         }
 					}.bind(this),
 					cycling: true,

+ 11 - 8
web/public/static/js/overlay.js

@@ -22,7 +22,7 @@ var sortByScore = function (list, request, rank) {
     return t.score - e.score;
   });
 };
-var cameraLight = {
+/* var cameraLight = {
     clampVFOV: function(fov, t, i, n) {
         var r = cameraLight.getHFOVFromVFOV(fov, i, n);
         return r > t ? cameraLight.getVFOVFromHFOV(t, i, n) : fov
@@ -43,7 +43,7 @@ var cameraLight = {
         return a
     }
 };
- 
+  */
  
  
  
@@ -118,7 +118,7 @@ var initOverlay = function(THREE){
                 info.type = "photo"  
                 
             }
-            plane.material.opacity = 1;
+            plane.material.opacity = 0.1;
             plane.material.color = new THREE.Color(1,1,1) 
         }
         if(info.width == void 0) info.width = settings.overlay.width;
@@ -257,7 +257,7 @@ var initOverlay = function(THREE){
         
     }
     Overlay.prototype.updateVisibles = function(panos){ 
-        this.visible = panos.find(pano=>this.visiblePanos.includes(pano))
+        this.visible = !!panos.find(pano=>this.visiblePanos.includes(pano))
     }    
     Overlay.updateVisibles = function(panos){
         if(panos === true){
@@ -286,7 +286,8 @@ var initOverlay = function(THREE){
                 this._loadDones.forEach(e=>e())
                 this._loadDones = null  
             }
-            Overlay.loadNext()
+            setTimeout(Overlay.loadNext,50)
+            plane.material.opacity = 1;
             console.log('overlay loaded: '+this.sid)
         })
         plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
@@ -379,10 +380,12 @@ var initOverlay = function(THREE){
         //Overlay.loadQueue.slice(0,2).forEach(e=>e.requestDownload())
         Overlay.loadNext() 
         var unloads = player.overlayGroup.children.filter(e=>!e.hasRequestLoad) 
-        if(unloads){
-            Overlay.hasAllRequestLoad = true
+        if(unloads.length){ 
             setTimeout(Overlay.load, 200)
-        } 
+        }else{
+            Overlay.allRequestLoad = true
+            console.log('allRequestLoad')
+        }
     }