|
@@ -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;
|
|
|
+
|
|
|
}
|