xzw 4 年之前
父節點
當前提交
4738bc1c39
共有 8 個文件被更改,包括 993 次插入177 次删除
  1. 23 19
      css/lzb.css
  2. 39 19
      edit.html
  3. 78 28
      eforclient.html
  4. 21 8
      js/TransformControls.js
  5. 195 36
      js/edit.js
  6. 213 18
      js/main_2020_edit.js
  7. 364 35
      js/main_2020_show.js
  8. 60 14
      js/overlay.js

+ 23 - 19
css/lzb.css

@@ -475,22 +475,21 @@ ul.MenuOptions li.chosen {
     margin: 0;
 }
 
-#tourSwitch, #hotListSwitch, #VRSwitch {
+.switch {
     display: flex;
-    justify-content: center;
-    margin: 0;
-}
-
-#tourSwitch label, #hotListSwitch label, #VRSwitch label {
+    /* justify-content: center; */
+    margin-left:5px !important
+} 
+.switch label {
     display: block;
     vertical-align: middle;
 }
 
-#tourSwitch label input, #hotListSwitch label input, #VRSwitch label input {
+.switch input {
     vertical-align: middle;
 }
 
-.mui-switch {
+.switch .mui-switch {
     width: 52px !important;
     height: 24px !important;
     position: relative !important;
@@ -513,7 +512,7 @@ ul.MenuOptions li.chosen {
     top:-2px;
 }
 
-.mui-switch:before {
+.switch .mui-switch:before {
     content: '';
     width: 22px;
     height: 22px;
@@ -529,52 +528,57 @@ ul.MenuOptions li.chosen {
     box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
 }
 
-.mui-switch:checked {
+.switch .mui-switch:checked {
     border-color: #00b4ed;
     box-shadow: #00b4ed 0 0 0 16px inset;
     background-color: #00b4ed;
 }
 
-.mui-switch:checked:before {
+.switch .mui-switch:checked:before {
     left: 29px;
 }
 
-.mui-switch.mui-switch-animbg {
+.switch .mui-switch.mui-switch-animbg {
     transition: background-color ease 0.4s;
 }
 
-.mui-switch.mui-switch-animbg:before {
+.switch .mui-switch.mui-switch-animbg:before {
     transition: left 0.3s;
 }
 
-.mui-switch.mui-switch-animbg:checked {
+.switch .mui-switch.mui-switch-animbg:checked {
     box-shadow: #dfdfdf 0 0 0 0 inset;
     background-color: #00b4ed !important;
     transition: border-color 0.4s, background-color ease 0.4s;
 }
 
-.mui-switch.mui-switch-animbg:checked:before {
+.switch .mui-switch.mui-switch-animbg:checked:before {
     transition: left 0.3s;
 }
 
-.mui-switch.mui-switch-anim {
+.switch .mui-switch.mui-switch-anim {
     transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;
 }
 
-.mui-switch.mui-switch-anim:before {
+.switch .mui-switch.mui-switch-anim:before {
     transition: left 0.3s;
 }
 
-.mui-switch.mui-switch-anim:checked {
+.switch .mui-switch.mui-switch-anim:checked {
     box-shadow: #64bd63 0 0 0 16px inset;
     background-color: #64bd63;
     transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s;
 }
 
-.mui-switch.mui-switch-anim:checked:before {
+.switch .mui-switch.mui-switch-anim:checked:before {
     transition: left 0.3s;
 }
 
+
+
+
+
+
 .toolRight .snapTour .tourList {
     padding-bottom: 20px;
     height: 100%;

+ 39 - 19
edit.html

@@ -87,8 +87,8 @@
                     </li>
                     <li data-name="overlay">
                         <span class="overlay"></span>
-                        <label>视频</label>
-                    </li>
+                        <label>展览</label>
+                    </li> 
                     <li data-name="panoVisible">
                         <span class="panoVisible"></span>
                         <label>漫游可行</label>
@@ -908,7 +908,7 @@
                             <div class="itemTitle hotListSwitchTitle">
                                 <span>热点列表</span>
                             </div>
-                            <ul id="hotListSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="hotListSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用热点列表
                                 </label>
@@ -1055,6 +1055,22 @@
                                     <div class="itemTitle">
                                         <span>添加网页</span>
                                     </div>
+                                     
+                                    <!-- <ul>
+                                        <li>
+                                            <input name="linkOutside" class="editCheckbox" type="checkbox" value="linkOutside" id="linkOutside"></input>
+                                            <label for="linkOutside"></label>
+                                            <label for="linkOutside">在新窗口打开(其他内容将失效) </label>
+                                        </li>
+                                    </ul>   
+                                    --> 
+
+                                    <ul class="MenuOptions innerBtn" name="linkType">
+                                        <li class="halfCell chosen" index="common" data-lang="">普通</li>
+                                        <li class="halfCell" index="jumpLink" data-lang="">跳转</li>
+                                        <li class="halfCell" index="iframeDiv" data-lang="">iframe</li>
+                                    </ul> 
+                                    <label class="remark">方式1须https, 方式2、3  除当前第一个链接外,其他内容将不展现。</label>
                                     <div class="list"></div>
                                     <div class="linkBtns">
                                         <div class="buttons">
@@ -1073,7 +1089,7 @@
                                             <label for="noAction"></label>
                                             <label for="noAction">仅用于指示(不弹窗)</label>
                                         </li>
-                                    </ul>
+                                    </ul> 
                                 </li>
                             </ul>
                         </div>
@@ -1312,7 +1328,7 @@
                             <div class="itemTitle">
                                 <span>选择导览过渡效果</span>
                             </div>
-                            <ul id="tourSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="tourSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用瞬间过渡
                                 </label>
@@ -1331,7 +1347,7 @@
                             <div class="itemTitle">
                                 <span>VR</span>
                             </div>
-                            <ul id="VRSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="VRSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用VR功能
                                 </label>
@@ -1351,7 +1367,8 @@
                     <ul>
 						<li class="addBtn"> 
 							<div class="buttons">
-								<button class="innerBtn" data-lang="">添加视频</button>
+								<button class="innerBtn" data-type = 'video' >添加视频</button>
+                                <button class="innerBtn" data-type = 'photo'>添加图片</button>
 							</div>
 						</li>
 						<li class="overlayList ">
@@ -1367,7 +1384,7 @@
                 
 				<div id="overlayProp" class="secondary atRight ">
 					<div class="itemTitle head">
-						<span data-lang="">BOX视频属性</span>
+						<span data-lang="">展览属性</span>
 						<a class="close"></a>
 					</div> 
 					<div class="content"> 
@@ -1376,7 +1393,7 @@
 								<div class="itemTitle">
 									<span data-lang="">预览</span>  
 									<div class="buttons" name="upload">
-										<button class="innerBtn" data-lang="">上传视频</button>
+										<button class="innerBtn" data-lang="">上传视频</button> 
 									</div>
 								</div> 
 								<div class="preview"><span class="text">支持MP4、MOV等,<20M</span> <span attr-type="height"></span><span attr-type="width"></span></div>
@@ -1387,17 +1404,20 @@
 									<li class="halfCell chosen" index="translate" data-lang="">位移</li>
 									<li class="halfCell" index="scale" data-lang="">缩放</li>
 									<li class="halfCell" index="rotate" data-lang="">旋转</li>
-								</ul>							
+								</ul> 
+                                <ul id='setOverlayPosForPano' class="switch clearfix hotStyle-item colorWrap" style="margin-top:20px">
+                                    <label><input class="mui-switch mui-switch-animbg" type="checkbox">
+                                        当前漫游点独立调整 
+                                    </label>
+                                    
+                                </ul>
+                                <label class="remark">如在其他点位出现错位,请开启此开关,独立调整在特定点位的位移/缩放/旋转。
+                                     </label>
 							</li>
-						 
-							
-							<li>
-								<!-- <div class="itemTitle" data-name="overlayAddBox">
-									<span data-lang="">厚度</span>
-									<div class="switch">
-										<div></div>
-									</div>									
-								</div> -->
+                            
+                               
+							 
+							<li> 
 								<div class="itemTitle">
 									<span data-lang="">厚度</span>  
 								</div>

+ 78 - 28
eforclient.html

@@ -87,8 +87,8 @@
                     </li>
                     <li data-name="overlay">
                         <span class="overlay"></span>
-                        <label>视频</label>
-                    </li>
+                        <label>展览</label>
+                    </li> 
                     <li data-name="panoVisible">
                         <span class="panoVisible"></span>
                         <label>漫游可行</label>
@@ -123,7 +123,7 @@
                                 </div>
                                 <div id="gui-loading" class="message-outer darkGlass" style="display: none;">
                                     <h2 class="model-title"></h2>
-                                    <div class="message-inner">
+                                    <div class="message-inner"> 
                                         <div class="progressbar" data-perc="100">
                                             <div class="label">
                                                 <div class="perc">0%</div>
@@ -908,7 +908,7 @@
                             <div class="itemTitle hotListSwitchTitle">
                                 <span>热点列表</span>
                             </div>
-                            <ul id="hotListSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="hotListSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用热点列表
                                 </label>
@@ -923,6 +923,11 @@
                                     step="0.1">
                             </ul>
                         </li>
+                        <li>
+                            <div class="buttons">
+                                <button class="innerBtn cancel" id="hotVisible">热点可视</button>
+                            </div>
+                        </li>
                         <li class="spotList">
                             <div class="itemTitle">
                                 <span>已添加的热点( <i class="hotNum"></i> )</span>
@@ -938,18 +943,18 @@
                         <div class="content">
                             <ul>
                                 <li class="info">
-                                    <div class="itemTitle" data-size="15" id="project-name1">
+                                    <div class="itemTitle" data-size="50" id="project-name1">
                                         <span>标题</span>
                                     </div>
                                     <!-- <span class="redPoint" id="project-name2" data-size="15">标题</span> -->
                                     <div class="name">
                                         <input spellcheck="false" placeholder="热点的标题" class="right" type="text"
-                                            minlength="1" maxlength="15" placeholder="">
+                                            minlength="1" maxlength="50" placeholder="">
                                     </div><!-- 必填,限15字 ??-->
-                                    <div class="itemTitle" data-size="200">
+                                    <div class="itemTitle" data-size="500">
                                         <span>简介</span>
                                     </div>
-                                    <textarea placeholder="热点的简介" class="editText" maxlength="200"></textarea>
+                                    <textarea placeholder="热点的简介" class="editText" maxlength="500"></textarea>
 
 
 
@@ -987,7 +992,7 @@
                                     </div>
                                 </li>
                                 <li class="photo">
-                                    <div class="itemTitle" data-size="<2M">
+                                    <div class="itemTitle" data-size="<9M">
                                         <span>图片</span>
                                     </div>
                                     <div class="list edit-fun-images clearfix"></div>
@@ -1050,6 +1055,22 @@
                                     <div class="itemTitle">
                                         <span>添加网页</span>
                                     </div>
+                                     
+                                    <!-- <ul>
+                                        <li>
+                                            <input name="linkOutside" class="editCheckbox" type="checkbox" value="linkOutside" id="linkOutside"></input>
+                                            <label for="linkOutside"></label>
+                                            <label for="linkOutside">在新窗口打开(其他内容将失效) </label>
+                                        </li>
+                                    </ul>   
+                                    --> 
+
+                                    <ul class="MenuOptions innerBtn" name="linkType">
+                                        <li class="halfCell chosen" index="common" data-lang="">普通</li>
+                                        <li class="halfCell" index="jumpLink" data-lang="">跳转</li>
+                                        <li class="halfCell" index="iframeDiv" data-lang="">iframe</li>
+                                    </ul> 
+                                    <label class="remark">方式1须https, 方式2、3  除当前第一个链接外,其他内容将不展现。</label>
                                     <div class="list"></div>
                                     <div class="linkBtns">
                                         <div class="buttons">
@@ -1058,6 +1079,18 @@
                                         </div>
                                     </div>
                                 </li>
+                                <li class="">
+                                    <div class="itemTitle">
+                                        <span>其他</span>
+                                    </div>
+                                    <ul>
+                                        <li>
+                                            <input name="noAction" class="editCheckbox" type="checkbox" value="noAction" id="noAction">
+                                            <label for="noAction"></label>
+                                            <label for="noAction">仅用于指示(不弹窗)</label>
+                                        </li>
+                                    </ul> 
+                                </li>
                             </ul>
                         </div>
                         <div class="buttons tail">
@@ -1102,7 +1135,21 @@
                             </div>
 
                             <textarea placeholder="微信分享的描述" id="weixin-summary" class="editText" maxlength="200"></textarea>
-
+                            
+                            <div class="itemTitle" data-size="建议图片为正方形" >
+                                <span>分享图片</span>
+                            </div> 
+                            <div class="list edit-fun-images clearfix forShareImg"></div>
+                            <div class="upload" id="shareImgUpload">
+                                <div data-type="photo">
+                                    <span>手动上传</span>
+                                    <div class="buttons">
+                                        <button class="submit innerBtn">更改</button>
+                                    </div>
+                                    <input type="file" >
+                                </div>
+                                <a class="del hasHover"></a>
+                            </div>
                         </li>
                         <li data-name="hotStyle">
                             <div class="itemTitle">
@@ -1274,21 +1321,20 @@
                         </div>
                         <li class="addTour">
                             <div class="buttons begin">
-                                <button class="innerBtn">添加导览</button>
+                                <button class="innerBtn">添加导览</button> 
                             </div>
                         </li>
                         <li data-name="MouseMarkerColor" class="tourSelectWarp">
                             <div class="itemTitle">
                                 <span>选择导览过渡效果</span>
                             </div>
-                            <ul id="tourSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="tourSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用瞬间过渡
                                 </label>
                             </ul>
                         </li>
-                        <li class="tourList">
-
+                        <li class="tourList"> 
                             <ul id="tourListWrap" class="tourListWrap">
 
                             </ul>
@@ -1301,7 +1347,7 @@
                             <div class="itemTitle">
                                 <span>VR</span>
                             </div>
-                            <ul id="VRSwitch" class="clearfix hotStyle-item colorWrap">
+                            <ul id="VRSwitch" class="switch clearfix hotStyle-item colorWrap">
                                 <label><input class="mui-switch mui-switch-animbg" type="checkbox">
                                     启用VR功能
                                 </label>
@@ -1321,7 +1367,8 @@
                     <ul>
 						<li class="addBtn"> 
 							<div class="buttons">
-								<button class="innerBtn" data-lang="">添加视频</button>
+								<button class="innerBtn" data-type = 'video' >添加视频</button>
+                                <button class="innerBtn" data-type = 'photo'>添加图片</button>
 							</div>
 						</li>
 						<li class="overlayList ">
@@ -1337,7 +1384,7 @@
                 
 				<div id="overlayProp" class="secondary atRight ">
 					<div class="itemTitle head">
-						<span data-lang="">BOX视频属性</span>
+						<span data-lang="">展览属性</span>
 						<a class="close"></a>
 					</div> 
 					<div class="content"> 
@@ -1346,7 +1393,7 @@
 								<div class="itemTitle">
 									<span data-lang="">预览</span>  
 									<div class="buttons" name="upload">
-										<button class="innerBtn" data-lang="">上传视频</button>
+										<button class="innerBtn" data-lang="">上传视频</button> 
 									</div>
 								</div> 
 								<div class="preview"><span class="text">支持MP4、MOV等,<20M</span> <span attr-type="height"></span><span attr-type="width"></span></div>
@@ -1357,17 +1404,20 @@
 									<li class="halfCell chosen" index="translate" data-lang="">位移</li>
 									<li class="halfCell" index="scale" data-lang="">缩放</li>
 									<li class="halfCell" index="rotate" data-lang="">旋转</li>
-								</ul>							
+								</ul> 
+                                <ul id='setOverlayPosForPano' class="switch clearfix hotStyle-item colorWrap" style="margin-top:20px">
+                                    <label><input class="mui-switch mui-switch-animbg" type="checkbox">
+                                        当前漫游点独立调整 
+                                    </label>
+                                    
+                                </ul>
+                                <label class="remark">如在其他点位出现错位,请开启此开关,独立调整在特定点位的位移/缩放/旋转。
+                                     </label>
 							</li>
-						 
-							
-							<li>
-								<!-- <div class="itemTitle" data-name="overlayAddBox">
-									<span data-lang="">厚度</span>
-									<div class="switch">
-										<div></div>
-									</div>									
-								</div> -->
+                            
+                               
+							 
+							<li> 
 								<div class="itemTitle">
 									<span data-lang="">厚度</span>  
 								</div>

+ 21 - 8
js/TransformControls.js

@@ -151,7 +151,7 @@ var TransformControls = function ( camera, domElement, options ) {
 		domElement.removeEventListener( "mousedown", onPointerDown );
 		domElement.removeEventListener( "touchstart", onPointerDown );
 		domElement.removeEventListener( "mousemove", onPointerHover );
-		document.removeEventListener( "mousemove", onPointerMove );
+		domElement.removeEventListener( "mousemove", onPointerMove );
 		domElement.removeEventListener( "touchmove", onPointerHover );
 		domElement.removeEventListener( "touchmove", onPointerMove );
 		document.removeEventListener( "mouseup", onPointerUp );
@@ -348,7 +348,7 @@ var TransformControls = function ( camera, domElement, options ) {
 			space = 'world';
 
 		}
-		console.log(axis)
+		 
 
 		if ( object === undefined || axis === null || this.dragging === false || ( pointer.button !== undefined && pointer.button !== 0 ) ) return;
 
@@ -456,6 +456,15 @@ var TransformControls = function ( camera, domElement, options ) {
 
 			}
 
+
+            //add:
+             
+            if(EditOverlay.editing){
+                EditOverlay.updatePosition();
+            }
+
+
+
 		} else if ( mode === 'scale' ) {
 
 			if ( axis.search( 'XYZ' ) !== - 1 ) {
@@ -528,10 +537,7 @@ var TransformControls = function ( camera, domElement, options ) {
             
            
             if(EditOverlay.editing){
-                object.width = settings.overlay.width * object.scale.x;
-                object.height = settings.overlay.height * object.scale.y;
-                //object.depth = Settings.overlay.height * object.scale.y;
-                EditOverlay.updateOverlayScaleDisplay()
+                EditOverlay.updateScale(); 
             }
 
 
@@ -540,7 +546,7 @@ var TransformControls = function ( camera, domElement, options ) {
 
 			offset.copy( pointEnd ).sub( pointStart );
 
-			var ROTATION_SPEED = 20 / worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );
+			var ROTATION_SPEED = 2 / worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );
 
 			if ( axis === 'E' ) {
 
@@ -592,7 +598,14 @@ var TransformControls = function ( camera, domElement, options ) {
 				object.quaternion.multiply( quaternionStart ).normalize();
 
 			}
-
+            
+            //add:
+            
+            
+           
+            if(EditOverlay.editing){
+                EditOverlay.updateQua(); 
+            }
 		}
 
 		this.dispatchEvent( changeEvent );

+ 195 - 36
js/edit.js

@@ -164,7 +164,8 @@ EditTools.prototype.initSaveAll = function() {
                     //有的定制场景代码是旧的,只能使用rotation,所以不输出quaternion : 
                     rotation: hot.isSprite ? new THREE.Euler().setFromQuaternion(hot.quaternion).toObject() : hot.mesh.rotation.toObject(),
                     isSprite: hot.isSprite ? 1 : 0,
-                    noAction: hot.noAction ? 1 : 0,
+                    noAction: hot.noAction ? 1 : 0, 
+                    linkType: hot.linkType,
                     infoAttribute: hot.infoAttribute,
                     order: hotLength++//因为热点保存后在hots里的顺序会被修改,所以使用order来记录顺序 
                 }
@@ -516,6 +517,7 @@ Hotpoint.prototype.init = function(n) {
             info.quaternion && hot.mesh.quaternion.copy(info.quaternion)
             hot.isSprite = info.isSprite
             hot.noAction = info.noAction
+            hot.linkOutside = info.linkOutside
         }
         that.hotpointDetail.addClass("atRight");
         transformControls.detach()
@@ -585,7 +587,9 @@ Hotpoint.prototype.editHot = function(target) {
 
     $("#isSprite")[0].checked = this.editSpot.isSprite
     $("#noAction")[0].checked = this.editSpot.noAction
-
+    $(".webPage .MenuOptions li").removeClass("chosen")
+    $(".webPage .MenuOptions li[index = " + this.editSpot.linkType+"]").addClass("chosen")
+      
     var iframesHTML = info.iframe.map(function(iframe) {
         return this.inputList("请填写网页链接", iframe)
     }
@@ -988,7 +992,7 @@ Hotpoint.prototype.initSaveHot = function() {
         //热点模型
         var $modules = hotpointDetail.find(".model input");
         //热点内嵌网页
-        var $iframes = hotpointDetail.find(".webPage input");
+        var $iframes = hotpointDetail.find(".webPage input.text");
         //热点音乐
         var $miusc = hotpointDetail.find("#upload-hotBgm");
 
@@ -1138,6 +1142,14 @@ Hotpoint.prototype.initSaveHot = function() {
         }
 
     })
+    
+    $(".webPage .MenuOptions li").on("click", (e)=>{ //链接打开方式切换 
+        _this.editSpot.linkType = $(e.target).attr("index") 
+        $(".webPage .MenuOptions li").removeClass("chosen");
+        $(e.target).addClass("chosen")
+        
+    })
+    
     $("#noAction").on("change", function(e) {
         _this.editSpot.noAction = this.checked;
     })
@@ -1796,7 +1808,7 @@ dataURLtoBlob = function(dataurl) {
 var eachMaxWeights = {
     //大小限制
     "photo": 10,
-    "video": 50,
+    "video": 1000,//50,  expand size for overlayVideo 
     //20,
     "audio": 10 //5
 }
@@ -2374,6 +2386,7 @@ var initTransformCtl = function(THREE) {
         //隐藏了z轴。虽然参数没用上
         NoScaleZ: true //整体缩放时只缩放xy轴。 
     });
+    transformControls.space = 'local'//为了在当前方向上平移
     transformControls.setSize(1.5)
     player.model.add(transformControls)
 
@@ -2408,6 +2421,8 @@ var EditOverlay = {
             }
         })
     },
+    panoPosSwitch : $('#setOverlayPosForPano input') //   当前漫游点独立调整位置开关
+    ,                              
     init: function(THREE) {
         var mat = new THREE.MeshBasicMaterial({
             wireframe: true,
@@ -2427,6 +2442,9 @@ var EditOverlay = {
         player.model.add(wireframeModel)
         //------------------------------
 
+        this.panoPosSwitch.on("change", this.panoPosSwitchOnChange.bind(this))  
+
+
         $('.overlay .addBtn button').on("click", this.beginToAddPlane.bind(this))
         $("#overlayProp a.close").on("click", ()=>{
             this.closeOverlayPanel("cancel")
@@ -2444,16 +2462,19 @@ var EditOverlay = {
 
         $('#overlayUpload [name="useImgRatio"] button').on("click", this.useImgRatio.bind(this));
 
-        var uploadInput = $('<input  type="file" style="display:none" accept="video/*"></input>');
-        $('#overlayUpload [name="upload"] button').on('click', ()=>{
-            uploadInput.click()
+        var uploadInputs = {
+            video : $('<input  type="file" style="display:none" accept="video/*"></input>'),
+            photo : $('<input  type="file" style="display:none" accept="image/*"></input>')
         }
-        )
+       
+        $('#overlayUpload [name="upload"] button').on('click', ()=>{
+            uploadInputs[this.editType].click()
+        })
 
-        uploadInput.on("change", (e)=>{
+        uploadInputs.video.on("change", (e)=>{
             inputMedia({
-                enableTypes: [/* "photo", */
-                "video"],
+                enableTypes: [this.editType ],
+                
                 videoDone: (file,video)=>{
                     var plane = this.editPlane.plane
                     $(video).css('width', '100%')
@@ -2480,9 +2501,40 @@ var EditOverlay = {
             }, "video", e);
         }
         )
+        
+        uploadInputs.photo.on("change", (e)=>{ 
+            inputMedia({
+                enableTypes: [this.editType ],
+                photoDone: (photo)=>{
+                    var plane = this.editPlane.plane
+                    /* $(video).css('width', '100%')
+                    $(video).css('height', '100%') */
+                    
+                    plane.material.map = new THREE.Texture(); 
+                    plane.material.map.image = photo
+                    plane.material.map.needsUpdate = !0  
+                    plane.material.map.minFilter = THREE.LinearFilter;
+
+                    this.editPlane.overlayType = "photo";
+                    $('#overlayUpload .preview video').remove();
+                    //$('#overlayUpload .preview').css('background-image',"").append($(video));
+                   
+                    this.useImgRatio()
+                    //自适应比例 
+                    this.editPlane.file = photo.file;
+                    plane.material.opacity = 1;
+                    plane.material.color = new THREE.Color(1,1,1)
+                    plane.material.needsUpdate = true;
+
+                }
+            }, "photo", e);
+            }
+        )
+        
 
         player.overlayGroup.children.forEach((overlay)=>{
-            this.getOverlayInfo(overlay)
+            if(overlay.plane.material.map.image)this.getOverlayInfo(overlay)
+            else   overlay._loadDone = ()=>{this.getOverlayInfo(overlay)}    
             this.addToList(overlay)
         }
         )
@@ -2499,14 +2551,19 @@ var EditOverlay = {
         this.endAddPlane();
         this.wireframeModel.visible = false;
     },
-    beginToAddPlane: function() {
+    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");
+    },
+    beginToAddPlane: function(event) {
+        this.switchEditType($(event.target).attr("data-type"))   
         player.reticule.visible = false;
         this.objCursorType = 'overlay';
         player.currentCursor = 'url(images/edit/box_video.png), auto'
         $('#player').css('cursor', player.currentCursor)
         $('.overlay .addBtn button').addClass("unable")
         //可以加多个视频时的按钮
-
     },
     endAddPlane: function() {
         this.objCursorType = null;
@@ -2530,6 +2587,12 @@ var EditOverlay = {
             overlay.lookAt(o.intersect.face.normal.clone().add(pos));
             overlay.position.add(o.intersect.face.normal.clone().multiplyScalar(0.01))
         }
+        overlay.posCustom = overlay.position.clone();
+        overlay.quaCustom = overlay.quaternion.clone();
+        overlay.widthCustom = overlay.width;
+        overlay.heightCustom = overlay.height;
+        
+        
         overlay.isNew = true
         player.clickOverlay(overlay)
         transformControls.transCtlChangeMode("translate")
@@ -2561,14 +2624,27 @@ var EditOverlay = {
         var plane = overlay.plane
         var src = plane.material.map && plane.material.map.image.src;
         $('#overlayUpload .preview video').remove();
+        
+        overlay.overlayType && this.switchEditType(overlay.overlayType)
+        
+        
         if (overlay.overlayType == "video") {
             var video = plane.material.map.image
-            $('#overlayUpload .preview').css('background-image', "").append(video);
-        } else {
+            $('#overlayUpload .preview').css({'background-image':"", 'background-size':""}).append(video);
+            
+        } else if(overlay.overlayType == "photo" || overlay.overlayType == "text"){
             $('#overlayUpload .preview').css({
-                'background-image': src ? ("url(" + src + ")") : ""
+                'background-image': src ? ("url(" + src + ")") : "",
+                'background-size': "contain"
+            })
+        }else{
+            $('#overlayUpload .preview').css({ 
+                'background-image': "",
+                'background-size': ""
             })
         }
+            
+         
         if (overlay.overlayType) {
             $('#overlayUpload [name="useImgRatio"]').removeClass("hide")
             $('#overlayUpload .preview').addClass('uploaded')
@@ -2588,8 +2664,70 @@ var EditOverlay = {
             this.scroller.videoDepth.InitOffset()
         }
         , 201)
+        
+        
+        this.updatePano(player.currentPano)
     },
-
+    
+    //----------------------------
+    panoPosSwitchOnChange : function(){
+        var on = this.panoPosSwitch.is(':checked')
+        if(!on) delete this.editPlane.transformAtPanos[player.currentPano.id] 
+    }
+    ,
+    
+    getTransformAtPano : function(){
+        this.editPlane.transformAtPanos[player.currentPano.id] = {
+            pos : this.editPlane.position.clone(),
+            qua : this.editPlane.quaternion.clone(),
+            width : this.editPlane.width,
+            height : this.editPlane.height,
+        }
+    },
+    
+    updatePosition:function(){ 
+        var on = this.panoPosSwitch.is(':checked')
+        if(on && player.mode == 'panorama'){
+            this.getTransformAtPano() 
+        }else{
+            this.editPlane.posCustom.copy(this.editPlane.position)
+        }
+        
+    }, 
+    updateScale : function(){
+        var on = this.panoPosSwitch.is(':checked')
+        var size = this.editPlane.getSizeByScale( )
+        this.editPlane.width = size.width
+        this.editPlane.height = size.height
+        
+        if(on && player.mode == 'panorama'){
+            this.getTransformAtPano() 
+        }else{
+            this.editPlane.widthCustom = this.editPlane.width 
+            this.editPlane.heightCustom = this.editPlane.height 
+        }
+         
+        this.updateOverlayScaleDisplay()
+    }
+    ,
+    
+    updateQua : function(){
+        var on = this.panoPosSwitch.is(':checked')
+        if(on && player.mode == 'panorama'){
+            this.getTransformAtPano() 
+        }else{
+            this.editPlane.quaCustom.copy(this.editPlane.quaternion)
+        }
+        
+    }
+    ,
+    updatePano:function(pano){
+        if(!EditOverlay.editPlane ) return;
+        this.panoPosSwitch.prop('checked', !!EditOverlay.editPlane.transformAtPanos[pano.id]);
+    },
+    //------------------------------
+    
+    
     closeOverlayPanel: function(type) {
         if (!this.editPlane)
             return;
@@ -2640,23 +2778,36 @@ var EditOverlay = {
         this.editPlane.scale.setY(h / settings.overlay.height)
         this.editPlane.width = w;
         this.editPlane.height = h;
-
-        this.updateOverlayPanel(this.editPlane)
+        
+        this.updateScale()
+        
+        //this.updateOverlayPanel(this.editPlane)
     },
-
+     
     getOverlayInfo: function(overlay) {
         //2 编辑前, 从当前状态获取info
         var plane = overlay.plane;
+        var transformAtPanos = {}
+        for(var i in overlay.transformAtPanos){
+            transformAtPanos[i] = {
+                width : overlay.transformAtPanos[i].width,
+                height : overlay.transformAtPanos[i].height,
+                pos : overlay.transformAtPanos[i].pos.clone(),
+                qua : overlay.transformAtPanos[i].qua.clone(),
+            }      
+        }
+        
         overlay.info = {
-            width: overlay.width,
-            height: overlay.height,
+            width: overlay.widthCustom,
+            height: overlay.heightCustom,
             depth: settings.overlay.depth * overlay.scale.z,
-            pos: overlay.position.clone(),
-            qua: overlay.quaternion.clone(),
+            pos: overlay.posCustom.clone(),
+            qua: overlay.quaCustom.clone(),
             media: plane.material.map.image,
             file: overlay.file,
             type: overlay.overlayType,
-            hasBox: overlay.hasBox
+            hasBox: overlay.hasBox,
+            transformAtPanos:  transformAtPanos
         }
     },
 
@@ -2665,18 +2816,26 @@ var EditOverlay = {
         if (!overlay.file && (!overlay.plane.material.map || !overlay.plane.material.map.image)) {
             return;
         }
-
+        var transformAtPanos = {}
+        for(var i in overlay.transformAtPanos){ 
+            transformAtPanos[i] = {
+                width : toPrecision(overlay.transformAtPanos[i].width, 4),
+                height : toPrecision(overlay.transformAtPanos[i].height, 4),
+                pos : toPrecision(overlay.transformAtPanos[i].pos.toArray(), 3),
+                qua : toPrecision(overlay.transformAtPanos[i].qua.toArray(), 5)
+            }  
+        }
         var info = {
-            width: toPrecision(overlay.width, 4),
-            height: toPrecision(overlay.height, 4),
+            width: toPrecision(overlay.widthCustom, 4),
+            height: toPrecision(overlay.heightCustom, 4),
             depth: toPrecision(settings.overlay.depth * overlay.scale.z, 4),
-            pos: toPrecision(overlay.position.toArray(), 4),
-            qua: toPrecision(overlay.quaternion.toArray(), 4),
+            pos: toPrecision(overlay.posCustom.toArray(), 3),
+            qua: toPrecision(overlay.quaCustom.toArray(), 5),
             sid: overlay.sid,
             hasBox: overlay.hasBox ? 1 : 0,
-            media: [overlay.overlayType],
-
-            file: overlay.fileSrc || overlay.plane.material.map.image.src
+            media: [overlay.overlayType], 
+            file: overlay.fileSrc || overlay.plane.material.map.image.src,
+            transformAtPanos : transformAtPanos
         }
 
         return info
@@ -2686,7 +2845,7 @@ var EditOverlay = {
     SaveOverlay: function() {
         var overlay = this.editPlane;
         if (!overlay.file && (!overlay.plane.material.map || !overlay.plane.material.map.image)) {
-            alert("请上传视频");
+            this.editType == "video" ? alert("请上传视频") : alert("请上传图片");
             return;
         }
 
@@ -2749,7 +2908,7 @@ var EditOverlay = {
         }
     },
     addToList: function(overlay) {
-        var li = $(`<li><div class="icon"></div><div class="title">${overlay.sid}</div></li>`)
+        var li = $(`<li><div class="icon"></div><div class="title">${(overlay.overlayType == "video" ? "视频 ":"图片 ")+  overlay.sid}</div></li>`)
         $(".overlayList ul").append(li);
         li.on("click", ()=>{
             player.clickOverlay(overlay)

+ 213 - 18
js/main_2020_edit.js

@@ -2992,7 +2992,7 @@ function o(a, s, l) {
             signedUrlCheckInterval: 1e4,
             signedUrlRefreshBuffer: 15e3,
             dollhouseFOV: 70,
-            dollhouseNear: 1,
+            dollhouseNear: .1,//1,
             dollhouseFar: 5e3,
             insideFOV: 70,
             insideFOVMax: 120,
@@ -7417,8 +7417,8 @@ function o(a, s, l) {
                 /* e && (f.addClass("quick-brand"), //quick-brand样式有问题 会遮住屏幕
                 d.before(f),
                 p = $(".quick-brand").toArray()), */
-                u.addClass("fadeOut"),
-                setTimeout(function() {
+                u.addClass("fadeOut") 
+                /* setTimeout(function() {
                     p.forEach(function(e) {
                         e.classList.add("fadeIn")
                     })
@@ -7427,7 +7427,7 @@ function o(a, s, l) {
                     p.forEach(function(e) {
                         e.classList.add("fadeOut")
                     })
-                }, o.quickstart.fadeOutDelay)
+                }, o.quickstart.fadeOutDelay) */
             }(i),
             n = o.quickstart.showTextDelay + o.quickstart.fadeOutDelay),
             function(e, t) {
@@ -14820,7 +14820,9 @@ function o(a, s, l) {
             
             this.quaternion || (this.quaternion = new THREE.Quaternion().setFromEuler(this.rotation)) 
             this.isSprite = t.isSprite
-            this.noAction = t.noAction
+            this.noAction = t.noAction 
+            this.linkType = t.linkType || "common"
+           
             this.link = t.link,
             this.model = i,
             this.size = t.size;
@@ -14962,12 +14964,89 @@ function o(a, s, l) {
             }
             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.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(!player.currentPano)return;     
              
             var i = document.getElementById("popup");
-            options = options || {}
+            
             if (this.link && !options.dontOpen) {
                 g_currentHot = this,
                 i.style.display = "block",
@@ -14978,9 +15057,8 @@ function o(a, s, l) {
                     g_bgAudio.pauseByHot = true
                 } 
                 if(g_tourAudio)g_tourAudio.pause()
-                var r = this.link.substring(this.link.indexOf("html") + 4)
-                  , o = "en" == manage.number("lang") ? "&lang=" + manage.number("lang") : "";
-                -1 == r.indexOf("?") ? n.src = this.link + "?time=" + randomTime().getTime() + "&id=" + window.number + o : n.src = this.link + "&time=" + randomTime().getTime() + "&id=" + window.number + o,
+                var src = getLink(this.link   )
+                n.src = src;
                 n.id = "id1",
                 n.allowTransparency = "true";
                 var a = document.getElementById("id1");
@@ -16587,7 +16665,7 @@ function o(a, s, l) {
                 this.supportedModes[s.FLOORPLAN] = !t.player_options || t.player_options.floor_plan && I.valueFromHash("dh", 1),
                 this.supportedModes[s.TRANSITIONING] = !0,
                 this.supportsTiles = this.configureTiling(),
-                this.supportsVR = window.MP_PREFETCHED_MODELDATA.supportsVR || !0,
+                this.supportsVR = window.MP_PREFETCHED_MODELDATA.supportsVR || false//!0,
                 this.mode = s.DOLLHOUSE,
                 this.size = null,
                 this.center = null,
@@ -20298,6 +20376,9 @@ function o(a, s, l) {
                 
                 return str; 
 			}
+            
+            
+             
 			//------end	 
             
             
@@ -20455,6 +20536,12 @@ function o(a, s, l) {
                 e.addEventListener("pointerdown", this.onPointerDown.bind(this)),
                 e.addEventListener("pointermove", this.onPointerMove.bind(this)),
                 e.addEventListener("pointerup", this.onPointerUp.bind(this)),
+                
+                document.addEventListener("pointerup", ()=>{//add
+                    window.transformControls && transformControls.onPointerUp()
+                }),
+                 
+                
                 e.addEventListener("pointerout", this.onPointerOut.bind(this)),
                 e.addEventListener("pointercancel", this.onPointerCancel.bind(this)),
                 document.addEventListener("keydown", this.onKeyDown.bind(this)),
@@ -20539,7 +20626,7 @@ function o(a, s, l) {
                 "mouse" !== e.pointerType ? this.handleInputMove.call(this, e.clientX, e.clientY, !0) : this.onMouseMove(e)
             }
             ,
-            t.prototype.onPointerUp = function(e) {
+            t.prototype.onPointerUp = function(e) { 
                 return this.mouseDown && "mouse" !== e.pointerType ? (clearTimeout(this.mouseDownTimer),
                 this.couldBeLongTap = !1,
                 this.updateIntersect(),
@@ -20619,7 +20706,9 @@ function o(a, s, l) {
                 
                 if(!this.overlayInitedPlay && this.overlayGroup.children.length){
                     try{
-                        this.overlayGroup.children.forEach((overlay)=>{overlay.plane.material.map.image.play()})
+                        this.overlayGroup.children.forEach((overlay)=>{
+                            overlay.overlayType == "video" &&  overlay.plane.material.map.image.play()
+                        })
                     }catch(e){}
                     
                     this.overlayInitedPlay = true
@@ -20801,6 +20890,11 @@ function o(a, s, l) {
                     if (this.checkAndWaitForPanoLoad(e, "high", "low", this.basePanoSize, a))
                         return
                 }
+                
+                //add
+                this.transitionPos({type:"beforeFlytopano", pano:this.currentPano, dur:0})
+                
+                
                 return this.mode = V.PANORAMA,
                 e.floor.enter(this.mode),
                 this.emit(W.PanoChosen, this.currentPano, this.currentPano),
@@ -20919,11 +21013,35 @@ function o(a, s, l) {
                     i.lookAt(r.add(n.position));
                     break;
                 case V.DOLLHOUSE:
-                    var o = this.position.clone();
+                   /*  var o = this.position.clone();
                     this.mode === V.PANORAMA ? o.add(new B.Vector3(0,6,0)).add(this.getDirection().multiplyScalar(-10)) : o.add(T.DOWN.clone().applyQuaternion(this.quaternion).multiplyScalar(6)).setY(6),
                     n.position.copy(o),
                     i.target.copy(this.target.clone().setY(this.model.center.y));
-                    break;
+                    break; */
+                    //for多楼层 且 让模型刚好适应屏幕
+                    
+                    var box = this.model.boundingBox.clone();
+                        box.applyMatrix4(this.camera.matrixWorld);//将 boundingbox、也就是模型, 转换到当前相机朝向
+                    var boxSize = box.size() //其中boxSize.x是模型在当前相机视角下的横向宽度,当飞出后,该宽度要刚好占满窗口宽度
+                    
+                    var fov = A.getHFOVFromVFOV(k.insideFOV, n.aspect, 1); //获得在当前窗口的横向的fov
+                    var distance = Math.abs(boxSize.x) / 2 / Math.tan(THREE.Math.degToRad(fov / 2))//根据上面获得的参数得到target到相机的距离
+                    
+                    console.log(boxSize.x,distance, boxSize.length() / 2)
+                    
+                    distance +=  boxSize.length() / 2   //由于此时模型从中心向相机的部分由于近大远小仍超出屏幕,所以将target放在靠近模型靠近相机的这一端,故而再加上box的对角线长度的一半, 虽然本该加上Math.sqrt(boxSize.z*boxSize.z +boxSize.y+boxSize.y)/2,但是这样模型显得比较满
+                     
+                    if(this.mode === V.PANORAMA){
+                        i.target.copy(this.model.center); 
+                        var vec = this.getDirection().negate().setY(1).normalize()//获得朝向
+                    }else{
+                        i.target.copy(this.target.clone().setY(this.model.center.y))
+                        var vec = T.DOWN.clone().applyQuaternion(this.quaternion).setY(1).normalize()
+                    }                       
+                      
+                    vec.multiplyScalar(distance )
+                    n.position.copy(i.target.clone().add(vec)) 
+                    break
                 case V.FLOORPLAN:
                     n.position.copy(this.model.center).setY(k.floorplan.cameraHeight),
                     i.target.copy(this.model.center).setY(0),
@@ -21298,10 +21416,11 @@ function o(a, s, l) {
             }
             ,
             t.prototype.fitDollhouse = function(e, t, i) {
+                var maxY = this.model.boundingBox.max.y;//add
                 var n = T.FORWARD.clone().applyQuaternion(i);
                 i = n.clone().add(e);
                 this.cameraControls.activeControl.target.copy(i),
-                this.cameraControls.activeControl.camera.position.set(0, 6, 0).add(e).add(n.multiplyScalar(-10))
+                this.cameraControls.activeControl.camera.position.set(0, maxY * 2.4, 0).add(e).add(n.multiplyScalar(-10))
             }
             ,
             t.prototype.floorplanMode = function(e, t, i) {
@@ -21435,7 +21554,7 @@ function o(a, s, l) {
                     
                     
                     this.updateHotVisible(n); //更新热点显示
-                    
+                    this.transitionPos({type:"beforeFlytopano", pano:n, dur:p})//add 
                     
                     
                     
@@ -21449,7 +21568,9 @@ function o(a, s, l) {
                     .bind(this), p, null, 0, z[k.transition.movementEasing], null, q.LookTransition);
                     
                     var w = c ? null : z[k.transition.movementEasing];
-                    this.nextPano = n,
+                    this.nextPano = n;
+                    
+                     
                     G.start(H.uniform(this.model.skybox, "progress", 1), p, null, 0, z[k.transition.blendEasing], "skyFly", q.FlyToPano),
                     G.start(H.allUniforms(this.model.chunks, "progress", 1), p, null, 0, z[k.transition.blendEasing], "chunkFly", q.FlyToPano),
                     G.start(H.vector(this.cameraControls.cameras[V.PANORAMA].position, n.position), p, function(e) {
@@ -21464,11 +21585,71 @@ function o(a, s, l) {
                         this.emit(W.FlyingEnded, n.position, _, n, b),
                         this.updateMarkerVisi();//add
                         d(e)
+                        
+                        if(this.mode == "panorama" && EditOverlay.editing){
+                            EditOverlay.updatePano(this.currentPano)
+                        }
+                        
                     }
                     .bind(this), 0, w, "camFly", q.FlyToPano)
                 }
             }
             ,
+            
+            
+            
+            
+            window._transitionPosId = 9999
+            
+            t.prototype.transitionPos = function(o={}) {//渐变overlay和热点的位置
+            
+                G.cancelById(_transitionPosId)
+                  
+                var begin = function(object, pos, qua, scale){ 
+                    if(pos){
+                        if(!same(object.position, pos, 0.01)){
+                              
+                            G.start(H.vector(object.position, pos), o.dur, (e)=>{
+                                
+                            },0, z[k.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }    
+                        
+                        if(!same(object.quaternion, qua, 1e-6)){
+                            G.start(H.quaternion(object.quaternion, qua), o.dur, (e)=>{
+                                
+                            },0, z[k.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }
+                        
+                        
+                        if(!same(object.scale, scale, 0.001)){ 
+                            G.start(H.vector(object.scale, scale), o.dur, (e)=>{
+                                
+                            },0, z[k.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }   
+                        
+                        
+                    }
+                }
+                var same = function(vec1, vec2, diff){ 
+                    var s = Math.abs(vec1.x-vec2.x) < diff && Math.abs(vec1.y-vec2.y) < diff && Math.abs(vec1.z-vec2.z) < diff 
+                    if(s && vec1.w) s = Math.abs(vec1.w-vec2.w) < diff 
+                    return s
+                }
+                this.overlayGroup.children.forEach(overlay=>{
+                    var panoData = o.pano != void 0 && overlay.transformAtPanos[o.pano.id]
+                    var useCustom = o.type == "beforeFlyOut" || !panoData
+                    var pos = useCustom ? overlay.posCustom : panoData.pos;
+                    var qua = useCustom ? overlay.quaCustom : panoData.qua;
+                    var scale = useCustom ? overlay.getScaleBySize(overlay.widthCustom, overlay.heightCustom) :  
+                                overlay.getScaleBySize(panoData.width , panoData.height)
+                        scale = new THREE.Vector3(scale.x, scale.y, overlay.scale.z)        
+                    begin(overlay, pos, qua, scale  )
+                    
+                })
+            
+            }
+            
+            
             t.prototype.fastForwardActivePanoFlight = function(e) {
                 e = e || k.transition.fastForwardFactor / 10 * 4 + 1,
                 G.adjustSpeed(q.FlyToPano, e),
@@ -21775,6 +21956,14 @@ function o(a, s, l) {
                     if(this.mode == "panorama") $(".confirmSnap").addClass("unable")
                     else if(i == "panorama") $(".confirmSnap").removeClass("unable")
                 }
+            
+                if(i == "panorama"){  
+                    this.transitionPos({type:"beforeFlyIn", pano:n, dur:p})//add                     
+                }else{  
+                    this.transitionPos({type:"beforeFlyOut",  dur:p/2})//add                       
+                }
+            
+            
                 
                 if (i === V.PANORAMA)
                     this.emit(W.PanoChosen, n, n),
@@ -21865,6 +22054,12 @@ function o(a, s, l) {
                     this.updateMarkerVisi();//add
                     (u === V.PANORAMA || i == V.PANORAMA) && this.updateHotVisible()//add
                     
+                    if(this.mode == "panorama" && EditOverlay.editing){
+                        EditOverlay.updatePano(this.currentPano)
+                    }
+                    //this.mode == u.PANORAMA && this.transitionPos({type:"flyDone", this.currentPano})//add   
+                    
+                    
                     c && u !== V.PANORAMA && i === V.PANORAMA ? this.startWarp(M.Retain, S.Retain, R.BLACK, null, null, a) : (a && a(),
                     t.resolve())
                 }

+ 364 - 35
js/main_2020_show.js

@@ -15389,6 +15389,8 @@ window.Modernizr = function(n, e, t) {
             this.quaternion || (this.quaternion = new THREE.Quaternion().setFromEuler(this.rotation)) 
             this.isSprite = d.isSprite
             this.noAction = d.noAction
+            this.linkType = d.linkType || "common"
+            
             this.link = d.link;
 			this.model = model;
 			this.size = d.size;
@@ -15401,7 +15403,7 @@ window.Modernizr = function(n, e, t) {
             this.changeTex()
             
             this.setVisiblePanos(d.visiblePanos); 
-            
+            this.infoAttribute = d.infoAttribute;
 		}
 		var r = e("three")
 		, f = e("../shaders")
@@ -15535,10 +15537,92 @@ window.Modernizr = function(n, e, t) {
 				return null
 			}
 			return g && g.length > 0 && g[0].pano
-		},
+		} 
             
-		
-		hot.prototype.examine = function(e, hotListSta) { 
+        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.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(!player.currentPano)return;
 			var hotPop = document.getElementById('popup');
             //获取那个热点的链接 
@@ -15555,11 +15639,8 @@ window.Modernizr = function(n, e, t) {
                 } 
                 if(g_tourAudio)g_tourAudio.pause()
                 
-                //给热点后面加上随机数,让热点确保是最新的
-                var hotLinkParameter = this.link.substring(this.link.indexOf("html")+4);
-                //如果热点的内容是英文版的
-                var lang = manage.number("lang") == "en" ? "&lang="+ manage.number("lang") : "" ;
-                hotLinkParameter.indexOf("?") == -1 ? myElement.src = this.link + "?time="+randomTime().getTime() + "&id=" + window.number +lang : myElement.src = this.link + "&time="+randomTime().getTime() + "&id=" + window.number + lang;
+                var src = getLink(this.link   )
+                myElement.src = src; 
                 myElement.id = "id1";
 				myElement.allowTransparency = "true";
 				// myElement.scrolling = "no";
@@ -17282,7 +17363,7 @@ window.Modernizr = function(n, e, t) {
                 this.supportedModes[c.TRANSITIONING] = !0,
                 this.supportsTiles = this.configureTiling(),
                 // this.supportsVR = t.is_vr,
-                this.supportsVR = window.MP_PREFETCHED_MODELDATA.supportsVR || true;   // 方奕卓 VR功能可配置
+                this.supportsVR = window.MP_PREFETCHED_MODELDATA.supportsVR || false//true;   // 方奕卓 VR功能可配置
                 this.mode = c.DOLLHOUSE,
                 this.size = null,
                 this.center = null,
@@ -19494,7 +19575,7 @@ window.Modernizr = function(n, e, t) {
                 this.UP = A.UP.clone(),
                 this.longestStep = 0,
                 this.upcomingTransType = null,
-                this.burnsDir = 1,
+                this.burnsDir = 1,  //导览在DOLLHOUSE停留时的旋转方向 1 或 -1
                 this.prevNextDist = 0,
                 this.nextI = 0,
                 this.activeTransType = null,
@@ -20249,16 +20330,16 @@ window.Modernizr = function(n, e, t) {
                 p.start(u, i, h, 0, d.easeInOutQuad, "wait")
 
                 //zoom动画
-
+                //这是啥?
                 var currentGuide = player.model.heroLocations[app.director.currentItem];
-                
-                this.player.zoomEnabled = true;
-                var zoom = function(e, d) { 
-                    this.player.zoomTo(e * currentGuide.zoom.toFixed(2), true)        
+                if(currentGuide.zoom){
+                    this.player.zoomEnabled = true;
+                    var zoom = function(e, d) { 
+                        this.player.zoomTo(e * currentGuide.zoom.toFixed(2), true)        
 
-                }.bind(this)
-                p.start(zoom, 2000, null, 0, d.easeOutQuad, "zoom")
-                
+                    }.bind(this)
+                    p.start(zoom, 2000, null, 0, d.easeOutQuad, "zoom")
+                }
             }
             ,
             n.prototype.warpToNonPano = function(e) {
@@ -20324,8 +20405,7 @@ window.Modernizr = function(n, e, t) {
             }
             ,
             n.prototype._warpCameraAim = function(e, t) {
-
-            
+     
                 var i = this.warpDestHeroLoc.quaternion
                   , n = this.playerControls.cameras[a.PANORAMA]
                   , o = new r.Vector3(0,0,1).applyQuaternion(i).normalize()
@@ -21672,9 +21752,11 @@ window.Modernizr = function(n, e, t) {
                     //window.DownInterface && new DownInterface().state(this,Hot);
                     window.Hotpoint && new Hotpoint().state(this,Hot);
                 }
-                if(!this.overlayInitedPlay /* && !settings.isEdit */ && this.overlayGroup.children.length){
-                    this.overlayGroup.children.forEach((overlay)=>{overlay.plane.material.map.image.play()})
-                    this.overlayInitedPlay = true
+                if( this.overlayGroup.children.length){
+                    this.overlayGroup.children.forEach((overlay)=>{
+                        overlay.overlayType == "video" /* && overlay.inSight */&&  overlay.plane.material.map.image.play()
+                    })
+                    //this.overlayInitedPlay = true
                 }
             }
             ,
@@ -21823,6 +21905,13 @@ window.Modernizr = function(n, e, t) {
                     if (this.checkAndWaitForPanoLoad(e, "high", "low", this.basePanoSize, a))
                         return
                 }
+                
+                
+                //add
+                this.transitionPos({type:"beforeFlytopano", pano:this.currentPano, dur:0})
+                
+                
+                
                 return this.mode = u.PANORAMA,
                 e.floor.enter(this.mode),
                 this.emit(w.PanoChosen, this.currentPano, this.currentPano),
@@ -21947,11 +22036,35 @@ window.Modernizr = function(n, e, t) {
                     i.lookAt(o.add(n.position));
                     break;
                 case u.DOLLHOUSE:
-                    var a = this.position.clone();
+                    /* var a = this.position.clone();
                     this.mode === u.PANORAMA ? a.add(new r.Vector3(0,6,0)).add(this.getDirection().multiplyScalar(-10)) : a.add(d.DOWN.clone().applyQuaternion(this.quaternion).multiplyScalar(6)).setY(6),
                     n.position.copy(a),
                     i.target.copy(this.target.clone().setY(this.model.center.y));
-                    break;
+                    break; */
+                    //for多楼层 且 让模型刚好适应屏幕
+                    var box = this.model.boundingBox.clone();
+                        box.applyMatrix4(this.camera.matrixWorld);//将 boundingbox、也就是模型, 转换到当前相机朝向
+                    var boxSize = box.size() //其中boxSize.x是模型在当前相机视角下的横向宽度,当飞出后,该宽度要刚好占满窗口宽度
+                    
+                    var fov = B.getHFOVFromVFOV(f.insideFOV, n.aspect, 1); //获得在当前窗口的横向的fov
+                    var distance = Math.abs(boxSize.x) / 2 / Math.tan(THREE.Math.degToRad(fov / 2))//根据上面获得的参数得到target到相机的距离
+                    
+                    console.log(boxSize.x,distance, boxSize.length() / 2)
+                    
+                    distance +=  boxSize.length() / 2   //由于此时模型从中心向相机的部分由于近大远小仍超出屏幕,所以将target放在靠近模型靠近相机的这一端,故而再加上box的对角线长度的一半, 虽然本该加上Math.sqrt(boxSize.z*boxSize.z +boxSize.y+boxSize.y)/2,但是这样模型显得比较满
+                     
+                    if(this.mode === u.PANORAMA){
+                        i.target.copy(this.model.center); 
+                        var vec = this.getDirection().negate().setY(1).normalize()//获得朝向
+                    }else{
+                        i.target.copy(this.target.clone().setY(this.model.center.y))
+                        var vec = d.DOWN.clone().applyQuaternion(this.quaternion).setY(1).normalize()
+                    }                       
+                      
+                    vec.multiplyScalar(distance )
+                    n.position.copy(i.target.clone().add(vec)) 
+                    
+                    break
                 case u.FLOORPLAN:
                     n.position.copy(this.model.center).setY(f.floorplan.cameraHeight),
                     i.target.copy(this.model.center).setY(0),
@@ -21976,8 +22089,15 @@ window.Modernizr = function(n, e, t) {
                         this.intersectHot && this.intersectHot.showTitle() 
                         for(var i in this.model.hots){
                             this.model.hots[i].update(this.camera)
-                        }
+                        } 
+
                     }
+
+                    /* if(e.cameraChanged){
+                        this.controlVideosPlay()
+                    } */
+
+
                     this.model.supportsTiles && (this.updateTileDownloader(t),
                     this.updatePanoRenderer(t)),
                     this.updatePreRendering(t),
@@ -21989,6 +22109,57 @@ window.Modernizr = function(n, e, t) {
                     this.model.supportsTiles && this.updateZoomPano()
                 }
             }(),
+
+
+
+            /* n.prototype.controlVideosPlay = function() {//判断box视频是否可见 不可见就暂停
+                var lastMode, lastPano;
+                return function(){
+                    var mode = this.mode;
+                    var pano = mode == "panorama" ? this.currentPano : "";
+                    
+                    if(mode != "panorama" || pano != lastPano){
+                        overlay.noBlock = null
+                    }
+                    
+                    this.overlayGroup.children.forEach((overlay)=>{
+                        if(overlay.overlayType == "video" ){
+                            var matrix = overlay.plane.matrixWorld;
+                            var inSight = false;
+                            var cameraDir = this.getDirection();
+                            var planeDir = (new r.Vector3).copy(d.FORWARD).applyQuaternion(overlay.plane.quaternion)
+                            var vertexes = []
+                            if(cameraDir.angleTo(planeDir)>Math.PI/2){//朝向相机视线
+                                for(let i=0; i<4; i++){
+                                    var vertex = overlay.plane.geometry.vertices[i].clone().applyMatrix4(matrix)
+                                    vertexes.push(vertex)
+                                    if(overlay.noBlock == null){
+                                        if(!m.ifShelter(vertex)){
+                                            overlay.noBlock = true 
+                                        }
+                                        inSight = true; break;
+                                    }else{
+                                        overlay.noBlock = true
+                                    }
+                                    
+                                    if(m.getPos2d(vertex, this.camera, $("#player")[0]).inSight){
+                                        
+                                        inSight = true; break;
+                                    }
+                                }
+                            }
+                            overlay.inSight = inSight 
+                            if(!inSight)overlay.plane.material.map.image.pause()
+                            else overlay.plane.material.map.image.play()//maybe fail
+                        }
+                    })
+                    lastMode = mode, lastPano = pano
+                }  
+            }() */
+
+
+
+
             n.prototype.updatePersistentZooming = function(e) {
                 1 === this.zooming ? this.zoomBy(1 + this.zoomSpeed * e) : this.zooming === -1 && this.zoomBy(1 - this.zoomSpeed * e)
             }
@@ -22083,7 +22254,7 @@ window.Modernizr = function(n, e, t) {
             }
             ,
             n.prototype.hasChanged = function(e) {
-                if (!this.previousState)
+                /* if (!this.previousState)
                     return this.previousState = {
                         allFloorsVisible: this.model.allFloorsVisible,
                         position: this.position.clone(),
@@ -22125,7 +22296,65 @@ window.Modernizr = function(n, e, t) {
                 this.previousState.modelPosition.copy(this.model.position),
                 this.previousState.modelCenter.copy(this.model.center),
                 this.previousState.zoomLevel = this.zoomLevel,
-                !t
+                !t */
+
+                if (!this.previousState)
+                    {
+                        this.previousState = {
+                            allFloorsVisible: this.model.allFloorsVisible,
+                            position: this.position.clone(),
+                            quaternion: this.quaternion.clone(),
+                            mouse: this.mouse.clone(),
+                            //labelScaleFactor: this.getLabelScaleFactor(),
+                            currentFloor: this.model.currentFloor,
+                            projectionMatrix: this.camera.projectionMatrix.clone(),
+                            worldMatrix: this.camera.matrixWorld.clone(),
+                            mode: this.mode,
+                            modelPosition: this.model.position.clone(),
+                            modelCenter: this.model.center.clone(),
+                            zoomLevel: this.zoomLevel
+                        };
+                        return !0;
+                    }
+                    //许钟文改 分成相机是否改变cameraChanged 和其他
+                    var a = this.position.equals(this.previousState.position) &&  this.quaternion.equals(this.previousState.quaternion)&& this.camera.matrixWorld.equals(this.previousState.worldMatrix) && this.camera.projectionMatrix.equals(this.previousState.projectionMatrix) && this.mode === this.previousState.mode &&  this.zoomLevel === this.previousState.zoomLevel && this.model.center.equals(this.previousState.modelCenter) && this.model.position.equals(this.previousState.modelPosition)  
+                    var t = a && this.mouse.equals(this.previousState.mouse) && this.model.allFloorsVisible === this.previousState.allFloorsVisible   /* && this.getLabelScaleFactor() === this.previousState.labelScaleFactor */ && this.model.currentFloor === this.previousState.currentFloor  && null === this.nextPano ;
+                    e.cameraChanged = !a;
+                    
+                   /*  if(!t){//主要判断相机是否旋转
+                        e.cameraChanged2 = !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 3) || !MathLight.closeTo(this.position, this.previousState.position, 4)  
+                    }else e.cameraChanged2 = false */
+                    
+                    
+                    e.allFloorsVisible = this.model.allFloorsVisible !== this.previousState.allFloorsVisible,
+                    e.moved = !this.position.equals(this.previousState.position),
+                    e.rotated = !this.quaternion.equals(this.previousState.quaternion),
+                    e.mouseMoved = !this.mouse.equals(this.previousState.mouse),
+                   // e.labelScaleFactor = this.getLabelScaleFactor() !== this.previousState.labelScaleFactor,
+                    e.floorChanged = this.model.currentFloor !== this.previousState.currentFloor,
+                    e.cameraProjectionChanged = !this.camera.projectionMatrix.equals(this.previousState.projectionMatrix),
+                    e.cameraWorldMatrixChanged = !this.camera.matrixWorld.equals(this.previousState.worldMatrix),
+                    e.modeChanged = this.mode !== this.previousState.mode,
+                    e.modelPositionChanged = !this.model.position.equals(this.previousState.modelPosition),
+                    e.modelCenterChanged = !this.model.center.equals(this.previousState.modelCenter),
+                    e.nextPanoActive = null !== this.nextPano,
+                    e.zoomLevel = this.zoomLevel !== this.previousState.zoomLevel,
+                     
+                    this.previousState.allFloorsVisible = this.model.allFloorsVisible,
+                    this.previousState.position.copy(this.position),
+                    this.previousState.quaternion.copy(this.quaternion),
+                    this.previousState.mouse.copy(this.mouse),
+                    //this.previousState.labelScaleFactor = this.getLabelScaleFactor(),
+                    this.previousState.currentFloor = this.model.currentFloor,
+                    this.previousState.projectionMatrix.copy(this.camera.projectionMatrix),
+                    this.previousState.worldMatrix.copy(this.camera.matrixWorld),
+                    this.previousState.mode = this.mode,
+                    this.previousState.modelPosition.copy(this.model.position),
+                    this.previousState.modelCenter.copy(this.model.center),
+                    this.previousState.zoomLevel = this.zoomLevel;
+                    //console.log("cameraChanged2 "+ e.cameraChanged2 + ", mouseMoved "+e.mouseMoved)
+                    
+                    return !t
             }
             ,
             n.prototype.updateIntersect = function() {
@@ -22143,8 +22372,7 @@ window.Modernizr = function(n, e, t) {
             ,
 			n.prototype.checkHotClick = function() { 
 				if(this.intersectHot){
-					
-					this.intersectHot.noAction || this.intersectHot.examine(this);
+                    this.intersectHot.noAction || this.intersectHot.examine(this) 
 					
 					
 					
@@ -22335,11 +22563,18 @@ window.Modernizr = function(n, e, t) {
             n.prototype.fitDollhouse = function(e, t, i) {//许钟文改   飞入前寻找和初始视角最合适的位置
 				//if(urlHasValue('oldEntry')){
 					//搬自一代。
-					var n = d.FORWARD.clone().applyQuaternion(i)
+                    var maxY = this.model.boundingBox.max.y;
+					  var n = d.FORWARD.clone().applyQuaternion(i)
 					  , i = n.clone().add(e); 
 					this.cameraControls.activeControl.target.copy(i),
-					this.cameraControls.activeControl.camera.position.set(0, 6, 0).add(e).add(n.multiplyScalar(-10)) 
-					//return;	
+					this.cameraControls.activeControl.camera.position.set(0, maxY * 2.4, 0).add(e).add(n.multiplyScalar(-10)) 
+					//return;	  
+                    
+                    /* //this.camera.position.copy(this.model.center);
+                    //this.camera.updateMatrixWorld()
+                    this.switchCameraMode("dollhouse", i) */
+                    
+                    
 					
 				//}//下面是二代代码,看不太懂。因为有的场景在靠近一端的某个方向截取的初始视角会甩镜头,也就是不是下去之后的方向
                //直接用一代的这个 效果和二代几乎一样,且不会甩
@@ -22518,6 +22753,9 @@ window.Modernizr = function(n, e, t) {
                     
                      //---------before fly--------------- add
                     this.updateHotVisible(i); //更新热点显示
+                    this.transitionPos({type:"beforeFlytopano", pano:i, dur:I})//add 
+                    
+                    
                     //地标变化
                     if(this.model.floorLogos){
                         this.model.changefloorLogoOpa({index:0, opa:0, dur: p, delay:0.7})//this.model.floorLogoFade(0, _duration*0.5, 0.7);  
@@ -22566,6 +22804,60 @@ window.Modernizr = function(n, e, t) {
                 }
             }
             ,
+            
+            
+            
+            window._transitionPosId = 9999
+            
+            n.prototype.transitionPos = function(o={}) {//渐变overlay和热点的位置
+            
+                y.cancelById(_transitionPosId)
+                  
+                var begin = function(object, pos, qua, scale){ 
+                    if(pos){
+                        if(!same(object.position, pos, 0.01)){
+                              
+                            y.start(v.vector(object.position, pos), o.dur, (e)=>{
+                                
+                            },0, A[f.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }    
+                        
+                        if(!same(object.quaternion, qua, 1e-6)){
+                            y.start(v.quaternion(object.quaternion, qua), o.dur, (e)=>{
+                                
+                            },0, A[f.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }
+                        
+                        
+                        if(!same(object.scale, scale, 0.001)){ 
+                            y.start(v.vector(object.scale, scale), o.dur, (e)=>{
+                                
+                            },0, A[f.transition.movementEasing], "transitionPos", _transitionPosId)
+                        }   
+                        
+                        
+                    }
+                }
+                var same = function(vec1, vec2, diff){ 
+                    var s = Math.abs(vec1.x-vec2.x) < diff && Math.abs(vec1.y-vec2.y) < diff && Math.abs(vec1.z-vec2.z) < diff 
+                    if(s && vec1.w) s = Math.abs(vec1.w-vec2.w) < diff 
+                    return s
+                }
+                this.overlayGroup.children.forEach(overlay=>{
+                    var panoData = o.pano != void 0 && overlay.transformAtPanos[o.pano.id]
+                    var useCustom = o.type == "beforeFlyOut" || !panoData
+                    var pos = useCustom ? overlay.posCustom : panoData.pos;
+                    var qua = useCustom ? overlay.quaCustom : panoData.qua;
+                    var scale = useCustom ? overlay.getScaleBySize(overlay.widthCustom, overlay.heightCustom) :  
+                                overlay.getScaleBySize(panoData.width , panoData.height)
+                        scale = new THREE.Vector3(scale.x, scale.y, overlay.scale.z)        
+                    begin(overlay, pos, qua, scale  )
+                    
+                })
+            
+            }
+            
+            
             n.prototype.fastForwardActivePanoFlight = function(e) {
                 e = e || f.transition.fastForwardFactor / 10 * 4 + 1,
                 y.adjustSpeed(V.FlyToPano, e),
@@ -22875,6 +23167,12 @@ window.Modernizr = function(n, e, t) {
                     }
                 }
                 
+                if(i == "panorama"){  
+                    this.transitionPos({type:"beforeFlyIn", pano:n, dur:I})//add                     
+                }else{  
+                    this.transitionPos({type:"beforeFlyOut",  dur:I/2})//add                       
+                }
+                
                 //------------------------------------
                 
                 
@@ -25773,7 +26071,7 @@ window.Modernizr = function(n, e, t) {
                 softBendTilt: 4,
                 softBendEnd: .3,
                 doBurns: true, //r.valueFromHash("kb", !0),
-                burnsAngle: 8,
+                burnsAngle: 8, //导览在每个点停留时的旋转角度
                 minBurnsAngle: 35,
                 minDownAngle: -35,
                 maxTurnPerSec: 280,
@@ -29673,6 +29971,35 @@ window.Modernizr = function(n, e, t) {
             "use strict";
             function n(e, t) {
                 var i = r(t);
+                 
+                
+                var replaceAll = function (str, f, e) {
+                  //f全部替换成e
+                  var reg = new RegExp(f, "g"); //创建正则RegExp对象   
+                  return str.replace(reg, e);
+                }; 
+                var urlFirstView = c.valueFromHash('firstView');
+                if(urlFirstView){
+                    try{  
+                        urlFirstView = replaceAll(urlFirstView, "pano", '"pano"')  
+                        urlFirstView = replaceAll(urlFirstView, "qua:", '"qua":[') 
+                        urlFirstView = "{"+urlFirstView+"]}"
+                        let info = JSON.parse(urlFirstView);   
+                        i.pano = t.list[info.pano] //panos.get(info.pano)
+                        if(!i.pano){
+                            urlFirstView = false
+                            console.error('检测到firstView但是 找不到该pano')
+                        }else{
+                            i.quaternion = new THREE.Quaternion().fromArray(info.qua)
+                            i.zoom = -1;
+                            i.mode = "panorama"
+                            i.setByUrl = true
+                        } 
+                    }catch(e){
+                        urlFirstView = false
+                        console.error('检测到firstView但是解析出错'+e)
+                    } 
+                }
                 if (Object.keys(i).length > 0)
                     return i;
                 if (e.heroImage)
@@ -30688,7 +31015,9 @@ window.Modernizr = function(n, e, t) {
             isLoaded: function(e) {
                 return !!a[e]
             }
+            
         }
+        window.Texture = t.exports
     }
     , {
         "../settings": 166,

+ 60 - 14
js/overlay.js

@@ -61,10 +61,14 @@ var initOverlay = function(THREE){
                 video.volume = 0
                 video.muted = true
             }else if(info.media.includes('photo')){
-                var img = new Image();
-                /* img.src = "https://4dkk.4dage.com/images/images"+Config.projectNum+"/overlay"+this.sid+".jpg?m="+new Date().getTime()
+                /* var img = new Image();
+                 
+                img.src = manage.dealURL(info.file) //"https://4dkk.4dage.com/images/images"+Config.projectNum+"/overlay"+this.sid+".jpg?m="+new Date().getTime()
                 info.media = img
-                info.type = "photo"  */
+                 */
+                
+                info.type = "photo"  
+                
             }
             plane.material.opacity = 1;
             plane.material.color = new THREE.Color(1,1,1) 
@@ -79,18 +83,39 @@ var initOverlay = function(THREE){
      
       
     Overlay.prototype.setFromInfo = function(info){//1 恢复到编辑之前 2 初始加载 
-        var plane = this.plane;
-        info.width && (this.scale.setX(info.width/settings.overlay.width),this.width = info.width)
-        info.height && (this.scale.setY(info.height/settings.overlay.height),this.height = info.height) 
+        var plane = this.plane; 
+        this.transformAtPanos = info.transformAtPanos || {} //在每个漫游点独立设置的position。  
+        var curPanoTransform = player.currentPano && this.transformAtPanos[player.currentPano.id] || {} 
+        
         info.depth && this.scale.setZ(info.depth/settings.overlay.depth)
-        info.pos && this.position.copy(info.pos);
-        info.qua && this.quaternion.copy(info.qua);
+        
+         
+        this.posCustom = info.pos ? info.pos.clone() : this.position.clone(); //没有单独设置position的漫游点使用的position
+        this.position.copy(curPanoTransform.pos || this.posCustom )
+        
+        this.quaCustom = info.qua ? info.qua.clone() : this.quaternion.clone()
+        this.quaternion.copy(curPanoTransform.qua || this.quaCustom);
+        
+        
+        this.widthCustom = info.width  
+        this.heightCustom = info.height  
+        this.width = curPanoTransform.width || this.widthCustom
+        this.height = curPanoTransform.height || this.heightCustom
+        var a = this.getScaleBySize(this.width, this.height)
+        this.scale.setX( a.x )
+        this.scale.setY( a.y )
+        
+        
+        
+        
         if(info.type){
             if(!plane.material.map){
                 if(info.type == "video"){ 
                     plane.material.map = new THREE.VideoTexture( info.media );  
-                }else{
-                    plane.material.map = texture.load(info.media) 
+                }else{  
+                    plane.material.map = Texture.load(info.file,()=>{
+                        if(this._loadDone)this._loadDone()
+                    }) 
                 } 
                 plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
                 plane.material.map.minFilter = THREE.LinearFilter;
@@ -104,6 +129,9 @@ var initOverlay = function(THREE){
         if(!!this.hasBox != !!info.hasBox){
             this.addBox(!this.hasBox); 
         }
+        
+        
+        
     } 
 
     Overlay.prototype.addBox = function(state){
@@ -126,9 +154,18 @@ var initOverlay = function(THREE){
         this.hasBox = state
     }
     
-    
-    
-    
+    Overlay.prototype.getSizeByScale = function(){ 
+        return {
+            width : settings.overlay.width * this.scale.x,
+            height : settings.overlay.height * this.scale.y
+        }
+    }
+    Overlay.prototype.getScaleBySize = function(width, height){ 
+        return {
+            x : width / settings.overlay.width,
+            y : height / settings.overlay.height,
+        }  
+    } 
     
     Overlay.prototype.preDeal = function(info){
         info.pos = new THREE.Vector3().fromArray(info.pos)
@@ -143,7 +180,16 @@ var initOverlay = function(THREE){
         info.qua.x = parseFloat(info.qua.x)
         info.qua.y = parseFloat(info.qua.y)
         info.qua.z = parseFloat(info.qua.z)
-        info.qua.w = parseFloat(info.qua.w) 
+        info.qua.w = parseFloat(info.qua.w)
+        
+        if(!info.transformAtPanos)info.transformAtPanos = {}
+               
+        for(let i in info.transformAtPanos){
+            info.transformAtPanos[i].pos = new THREE.Vector3().fromArray(info.transformAtPanos[i].pos)
+            info.transformAtPanos[i].qua = new THREE.Quaternion().fromArray(info.transformAtPanos[i].qua)
+                
+        }
+        
     }