UNPKG

vrmaker

Version:

vamaker sdk help you build your 360 panorama solution more easily by aframe or krpano.

49 lines 69.4 kB
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("vrmaker",[],t):"object"==typeof exports?exports.vrmaker=t():e.vrmaker=t()}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=30)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.push=((e,t)=>[...e,t]),t.unshift=((e,t)=>[t,...e]);const a=t.clone=(e=>{if(!e&&"object"!=typeof e)return;let t=e.constructor===Object?{}:[];for(let n in e)t[n]=e[n]&&"object"==typeof e[n]?a(e[n]):e[n];return t}),s=(t.isEmpty=(e=>!e||void 0===e||(e.constructor===Object?0===Object.keys(e).length:e.constructor===Array?0===e.length:void 0)),t.isEqual=((e,t)=>{const n=Object.getOwnPropertyNames(e),r=Object.getOwnPropertyNames(t);if(n.length===r.length)return n.every(n=>e[n]===t[n])}),t.updateObject=((e,t)=>r({},e,t)),t.getIEVersion=(()=>{const e=window.navigator.userAgent,t=e.indexOf("MSIE ");if(t>0)return parseInt(e.substring(t+5,e.indexOf(".",t)),10);if(e.indexOf("Trident/")>0){const t=e.indexOf("rv:");return parseInt(e.substring(t+3,e.indexOf(".",t)),10)}const n=e.indexOf("Edge/");return n>0&&parseInt(e.substring(n+5,e.indexOf(".",n)),10)}),[]);t.loadImage=(async(e="",t=(()=>{}),n=(e=>{}),r=(()=>{}))=>{if("string"==typeof e||e instanceof String)try{if(s.some(t=>t===e))return void t();const a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=(()=>{s.push(e),t()}),a.onprogress=(e=>{n(Math.ceil(e.loaded/e.total*100))}),a.onerror=(()=>{r()}),a.send()}catch(e){}else if(("object"==typeof e||e instanceof Object)&&e.length>0){const n=e.filter(e=>e).map(e=>new Promise((n,a)=>{try{if(s.some(t=>t===e))return void t();const o=new XMLHttpRequest;o.open("GET",e,!0),o.responseType="arraybuffer",o.onload=(()=>{s.push(e),n()}),o.onerror=(()=>{r(),a(new Error("image load error"))}),o.send()}catch(e){a(new Error(e))}}));await Promise.all(n).then(()=>{t()}).catch(e=>{console.error(e)})}}),t.countText=((e,t)=>{const n=new RegExp(t,"g");return(e.match(n)||[]).length}),t.isFunction=(e=>"function"==typeof e&&e instanceof Function),t.enterFullScreen=(()=>{document.requestFullscreen?document.requestFullscreen():document.webkitRequestFullscreen?document.webkitRequestFullscreen():document.mozRequestFullScreen?document.mozRequestFullScreen():document.msRequestFullscreen&&document.msRequestFullscreen()}),t.exitFullScreen=(()=>{document.exitFullscreen?document.exitFullscreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a="",s="",o={},l={vrModeShouldHide:[],vrModeShouldShow:["vr_menu_bg","vr_menu_l","vr_menu","vr_menu_r"]},i=0;const c={setKrpanoId:e=>{a=e},setKrpanoXml:e=>{s=e},setKrpanoEl:e=>{o=e},addVrModeShouldHide:e=>{l.vrModeShouldHide.push(e)},addVrModeShouldShow:e=>{l.vrModeShouldShow.push(e)},setKrpanoLookAtH:e=>{i=e},getKrpanoId:()=>a,getKrpanoXml:()=>s,getKrpanoEl:()=>o,getKrpanoVrModeObj:()=>(0,r.clone)(l),getKrpanoLookAtH:()=>i,getDefaultFov:()=>120,getKrpanoXOffset:()=>90,getVrThumbAth:()=>24};t.default=c},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.checkPanoramaFormat=(e=>{if(!e.panoramaId)throw new Error("panoramaId is required")}),t.isRtl=((e="")=>{const t=e.toLowerCase();switch(t){case"ar":case"ar-dz":case"ar-bh":case"ar-eg":case"ar-iq":case"ar-jo":case"ar-kw":case"ar-lb":case"ar-ly":case"ar-ma":case"ar-om":case"ar-qa":case"ar-sa":case"ar-sy":case"ar-tn":case"ar-ae":case"ar-ye":return console.log("is rtl",t),!0;default:return!1}}),t.xmlUrlString=((e="")=>e=(e=(e=(e=(e=e.replace(/&/g,"&amp;")).replace(/</g,"&lt;")).replace(/>/g,"&gt;")).replace(/'/g,"&apos;")).replace(/"/g,"&quot;")),t.xmlString=((e="")=>e?e=(e=(e=(e=(e=(e=(e=(e=(e=window.escape(e)).replace(/%3A/g,":")).replace(/%23/g,"#")).replace(/%25/g,"%")).replace(/%3F/g,"?")).replace(/%26/g,"&amp;")).replace(/%3D/g,"=")).replace(/%5B/g,"[")).replace(/%5D/g,"]"):e),t.krpanoEnterString=((e="")=>e.replace(/\n/g,"[br]")),t.krpanoAutoBlank=((e="",t=15,n=!1)=>{let a;return a=(a=(a=(a=(a=e.replace(/\[br\]/g," [br]")).split(/[\n\t ]/g)).map(e=>{if(r(e)>=2*t)for(let r=t;r<=e.length;r+=t+" [br]".length)e=n?e.splice(r,0,"... [br]"):e.splice(r,0," [br]");return e})).join(" ")).replace(/ \[br\]/g,"[br]")});const r=t.lengthInUtf8Bytes=((e="")=>{const t=encodeURIComponent(e).match(/%[89ABab]/g);return e.length+(t?t.length-1:0)});t.getCorrectRotation=(e=>{for(;e<-180||e>180;)e<-180&&(e+=360),e>180&&(e-=360);return e}),t.coords3dTo2d=(({x:e,y:t,z:n})=>{const r=Math.sqrt(e*e+t*t+n*n);return{ath:180*-Math.atan2(e,n)/Math.PI+180,atv:180*-Math.asin(t/r)/Math.PI}})},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r="https://www.istaging.com/sdk/";t.frontArrowImage=`${r}front-arrow.png`,t.gyroMessageMinJs=`${r}gyro-message.min.js`,t.gyro2MinJs=`${r}gyro2.min.js`,t.leftArrowImage=`${r}left-arrow.png`,t.leftFrontArrowImage=`${r}left-front-arrow.png`,t.linkImage=`${r}link.png`,t.logoTripodImage=`${r}logo-tripod.png`,t.memoImage=`${r}memo.png`,t.menuImage=`${r}menu.png`,t.nextPanoramaImage=`${r}next-panorama.png`,t.pointImage=`${r}point.png`,t.prevPanoramaImage=`${r}prev-panorama.png`,t.rightArrowImage=`${r}right-arrow.png`,t.rightFrontArrowImage=`${r}right-front-arrow.png`,t.tagImage=`${r}tag.png`,t.threeKrpanopluginMinJs=`${r}three.krpanoplugin.min.js`,t.videoImage=`${r}video.png`,t.webvrMinJs=`${r}webvr.min.js`,t.webvrCursorImage=`${r}webvr_cursor_80x80_17f.png`},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=n(2),s=n(20);let o=new WeakMap,l=new WeakMap,i=new WeakMap,c=new WeakMap;t.default=class{init(e){this.setVersion(s.version),this.initEl(e.el),this.initPanoramas(e.panoramas),console.log("VRMaker version: ",this.getVersion()),i=void 0!==e.panoramaIndex?e.panoramaIndex:e.panoramas[0]}initEl(e){o=e}initPanoramas(e){e.map(e=>(0,a.checkPanoramaFormat)(e)),l=e,this.selectPanorama(e[0].panoramaId)}addPanoramas(e){l=l.concat(e)}addPanorama(e){l=(0,r.push)(e,l)}updatePanorama(e,t={}){let n;const a=l.find((t,r)=>(n=r,t.panoramaId===e));if(!a)throw new Error("updatePanorama failed, id can't find panorama");const s=(0,r.updateObject)(a,t),o=(0,r.clone)(l);o.splice(n,1,s),l=o}updateCurrentPanorama(e={}){const t=l.findIndex(e=>e.panoramaId===i.panoramaId);if(!i)throw new Error("updatePanorama failed, id can't find panorama");const n=(0,r.updateObject)(i,e);i=n;const a=(0,r.clone)(l);a.splice(t,1,n),l=a}removePanorama(e){const t=l.filter(t=>t.panoramaId!==e);l=(0,r.clone)(t)}selectPanorama(e){if(!e)throw new Error("selectPanorama id is required");const t=l.find(t=>t.panoramaId===e);if(!t)throw new Error("Panorama is not found by your id");return i=t}getEl(){return o}getPanoramas(){return(0,r.clone)(l)}getCurrentPanorama(){return(0,r.clone)(i)}getVersion(){return c}setVersion(e){c=e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.markerAlpha=".6"},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let r={},a={},s={};const o={setSceneEl:e=>{r=e},setSkyEl:e=>{a=e},setCameraEl:e=>{s=e},getSceneEl:()=>r,getSkyEl:()=>a,getCameraEl:()=>s};t.default=o},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=o(n(4)),s=o(n(6));function o(e){return e&&e.__esModule?e:{default:e}}t.default=class extends a.default{constructor(){super(...arguments),this.checkAframe()}generateAframe(e){const t=document.createElement("a-scene");s.default.setSceneEl(t);const n=document.createElement("a-sky");s.default.setSkyEl(n);const r=document.createElement("a-entity"),a=document.createElement("a-camera"),o=document.createElement("a-animation"),l=document.createElement("a-assets"),i=this.getEl(),{panoramaRotation:c}=this.getCurrentPanorama();s.default.setCameraEl(a);let _=c||{};l.setAttribute("timeout","1000"),t.append(l),this.getPanoramas().forEach(e=>{const t=document.createElement("img");t.src=e.downloadLink,t.id=e.panoramaId,l.appendChild(t)}),n.setAttribute("src",`#${this.getCurrentPanorama().panoramaId}`),t.setAttribute("embedded",""),t.appendChild(n),i.appendChild(t);const u=_.x||0,d=90+(_.y||0),v=_.z||0;r.setAttribute("rotation",`${u} ${d} ${v}`),o.setAttribute("attribute","rotation"),o.setAttribute("fill","forwards"),o.setAttribute("easing","linear"),o.setAttribute("dur","200000"),o.setAttribute("from","0 90 0"),o.setAttribute("to","0 450 0"),o.setAttribute("repeat","indefinite"),o.setAttribute("startEvents","rotation-start"),o.setAttribute("pauseEvents","rotation-pause"),r.appendChild(a),r.appendChild(o),t.appendChild(r),e&&e.disableVR&&t.setAttribute("vr-mode-ui","enabled: false"),t.addEventListener("click",function(e){o.emit("pause")})}changePanorama(e,t){this.selectPanorama(e);const n=s.default.getSkyEl(),a=this.getCurrentPanorama();(0,r.loadImage)(a.downloadLink,()=>{n.setAttribute("src",`#${this.getCurrentPanorama().panoramaId}`),(0,r.isFunction)(t)&&t()})}toggleVRMode(e){const t=s.default.getSceneEl();if(e){if(!(0,r.isFunction)(t.enterVR))throw new Error("Aframe can't execute enterVR");t.enterVR(),(0,r.enterFullScreen)()}else{if(!(0,r.isFunction)(t.exitVR))throw new Error("Aframe can't execute exitVR");t.exitVR(),(0,r.exitFullScreen)()}}destroy(){const e=s.default.getSceneEl();e.parentNode.removeChild(e),s.default.setSceneEl({}),s.default.setSkyEl({})}checkAframe(){if("undefined"==typeof window||!window.AFRAME)throw new Error("You need to include aframe script or import it first. Use it before vrmaker.")}}},function(e,t){e.exports= /*! * Method Missing Error. * * Main application entry. * @author Jarrad Seers <jarrad@seers.me> * @created 29/03/2017 NZDT */ class extends Error{constructor(e){super(e),this.name=this.constructor.name,Error.captureStackTrace(this,this.constructor)}}},function(e,t,n){ /*! * Method Missing. * * Main application entry. * @author Jarrad Seers <jarrad@seers.me> * @created 29/03/2017 NZDT */ const r=n(8);e.exports=function(e,t){return new Proxy(e,{get(e,n){if(Reflect.has(e,n))return Reflect.get(e,n);if("function"==typeof t)return function(...e){t.call(this,n,e)};if(Reflect.has(e,t))return function(...r){e[t].call(this,n,r)};throw new r(`${t}, use method '__call(method, args)' in your class to catch.`)}})}},function(e,t,n){ /*! * Method Missing. * * Main application file. * @author Jarrad Seers <jarrad@seers.me> * @created 29/03/2017 NZDT */ const r=n(9);e.exports=class{constructor(e){return r(this,e||"__call")}static static(e,t){return r(e,t||"__call")}}},function(e,t,n){ /*! * Method Missing. * * Application entry file. * @author Jarrad Seers <jarrad@seers.me> * @created 29/03/2017 NZDT */ e.exports=n(10)},function(e,t,n){ /*! * Extends Classes. * * Main application file. * @author Jarrad Seers <jarrad@seers.me> * @created 30/03/2017 NZDT */ const r=n(11);e.exports=function(...e){const t=[];class n extends r{constructor(...r){super();for(const r of e){const e=Object.getOwnPropertyNames(r.prototype);for(const a of e)"constructor"===a?t.push(r.prototype.constructor):n.prototype[a]=r.prototype[a]}for(const e of t)Object.assign(n.prototype,new e(...r))}}return n}},function(e,t,n){ /*! * Extends Classes. * * Main entry file. * @author Jarrad Seers <jarrad@seers.me> * @created 30/03/2017 NZDT */ e.exports=n(12)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a={onLoadingPanoramaStart(){},onLoadingPanoramaFinish(){},onLoadingPanoramaProgress(e){},onLoadingPanoramaError:e=>e};t.default=class{setLoadingSettings(e){a=e}getLoadingSettings(){return(0,r.clone)(a)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a={active:!0};t.default=class{setInitViewSettings(e){a=e}getInitViewSettings(){return(0,r.clone)(a)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a={mwheel:!0,focus:!1};t.default=class{setBasicSettings(e){a=e}getBasicSettings(){return(0,r.clone)(a)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a={image:n(3).logoTripodImage,size:100};t.default=class{setTripodSettings(e){a=e}getTripodSettings(){return(0,r.clone)(a)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);let a={active:!1};t.default=class{setGyroSettings(e){a=e}getGyroSettings(){return(0,r.clone)(a)}setGyroActive(e=!1){a.active=e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,a=n(0),s=n(1),o=(r=s)&&r.__esModule?r:{default:r};let l={isCameraRotating:!1,autoStartRotateTimer:null},i={active:!1,revert:!1,rotateDuration:2e5,restartTime:2e4};t.default=class{setAutoRotateSettings(e){i=e}getAutoRotateSettings(){return(0,a.clone)(i)}startAutoRotate(){(0,a.isEmpty)(o.default.getKrpanoEl)||o.default.getKrpanoEl().call("auto_rotate();"),l.isCameraRotating=!0}stopAutoRotate(e=!1,t=2e4){!0===l.isCameraRotating&&((0,a.isEmpty)(o.default.getKrpanoEl)||o.default.getKrpanoEl().call("stop_auto_rotate();"),l.isCameraRotating=!1),null!==l.autoStartRotateTimer&&window.clearTimeout(l.autoStartRotateTimer),l.autoStartRotateTimer=e?window.setTimeout(()=>{this.startAutoRotate()},t):null}}},function(e){e.exports={name:"vrmaker",keywords:["istaging","vrmaker","aframe","krpano","panorama","VR"],description:"vamaker sdk help you build your 360 panorama solution more easily by aframe or krpano.",version:"1.0.1",author:"kevin.hu <kevin.hu@staging.com.tw>, jason.tseng <jason@staging.com.tw>, alex <alex@staging.com.tw>",license:"MIT",private:!1,main:"dist/vrmaker.js",scripts:{start:"node app.js",dev:"cross-env NODE_ENV=development webpack-dev-server --open --hot --mode development",build:"cross-env NODE_ENV=production webpack --progress --hide-modules --mode production",unit:"jest","test-watch":"jest --watchAll"},repository:{type:"git",url:"git+https://github.com/istagingRD/vrmaker-sdk.git"},browserslist:["> 1%","last 2 versions","not ie <= 8"],dependencies:{"extends-classes":"^1.0.5","http-status":"^1.0.1",mime:"^2.2.2"},devDependencies:{aframe:"^0.8.2","babel-core":"^6.26.0","babel-eslint":"^8.2.2","babel-jest":"^22.4.3","babel-loader":"^7.1.4","babel-plugin-transform-object-rest-spread":"^6.26.0","babel-preset-env":"^1.6.1","babel-preset-stage-3":"^6.24.1",compression:"^1.7.2","connect-history-api-fallback":"^1.5.0","cross-env":"^5.1.4","css-loader":"^0.28.11",eslint:"^4.19.1","eslint-config-standard":"^11.0.0","eslint-friendly-formatter":"^3.0.0","eslint-loader":"^2.0.0","eslint-plugin-html":"^4.0.2","eslint-plugin-import":"^2.9.0","eslint-plugin-jest":"^21.15.0","eslint-plugin-node":"^6.0.1","eslint-plugin-promise":"^3.7.0","eslint-plugin-standard":"^3.0.1",express:"^4.16.3","file-loader":"^1.1.11",jest:"^22.4.3","regenerator-runtime":"^0.11.1","url-loader":"^1.0.1",webpack:"^4.4.1","webpack-cli":"^2.0.13","webpack-dev-server":"^3.1.1"},jest:{moduleNameMapper:{"^@/(.*)$":"<rootDir>/src/$1","\\.(css|jpg|png)$":"<rootDir>/empty-module.js"}}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,a=n(5),s=n(0),o=n(1),l=(r=o)&&r.__esModule?r:{default:r};t.default=function(e,t=0){try{this.getAutoRotateSettings}catch(e){throw new Error("getActionsXml must use getActionsXml.call(this, ...arg)")}const n=this.getAutoRotateSettings(),r=this.getInitViewSettings().active;return`<action name="startup">\n \n ${(()=>r?`loadscene(first_panorama_${e[t].panoramaId});\n planet_view();`:`loadscene(panorama_${e[t].panoramaId});`)()}\n set(plugin[gyro].enabled, false);\n</action>\n\n<action name="first_panorama_ready">\n\x3c!-- first panorama is vlookat 90, then turn to vlookat 0\n 鳥瞰視角進入後向前看\n--\x3e\n normal_view();\n set(plugin[gyro].enabled, %1);\n wait(1);\n jscall(calc('krpano.hooks.startAutoRotate()'));\n</action>\n\n<action name="look_straight">\nif (view.vlookat LT -80 OR view.vlookat GT +80, tween(view.vlookat, 0.0, 1.0, easeInOutSine); tween(view.fov, ${l.default.getDefaultFov()}, distance(150, 0.8)););\n</action>\n\n<action name="normal_view">\n look_straight();\n tween(view.architectural, 0.0, distance(2.0,1.5));\n tween(view.pannini, 0.0, distance(2.0,1.5));\n tween(view.fisheye, 0.0, distance(2.0,1.5));\n</action>\n\n<action name="planet_view">\n\x3c!-- start planet view --\x3e\n lookat(${(e[t].panoramaRotation?-e[t].panoramaRotation.y:0)+l.default.getKrpanoXOffset()}, 90, 150);\n set(view.architectural, 0.0);\n set(view.pannini, 0.0);\n set(view.fisheye, 1.0);\n</action>\n\n<action name="auto_rotate">\n\x3c!-- start auto rotate --\x3e\n ${(()=>{let e="-";return n.revert&&(e="+"),`tween(view.hlookat, calc(view.hlookat ${e} 360), ${n.rotateDuration/1e3}, linear, auto_rotate());`})()}\n</action>\n\n<action name="stop_auto_rotate">\n\x3c!-- stop auto rotate --\x3e\n stoptween(view.hlookat);\n</action>\n\n<action name="prepare_change_scene">\n\x3c!-- 儲存當前仰角 All javascript call this action to trigger change scene here first\n %1 = next scene name\n %2 = next scene panoramaId\n %3 = selectedMethod\n %4 = next scene hlookat offset (for marker)\n %5 = is clicked from marker point\n %6 = marker ath\n--\x3e\n\x3c!-- 把 vr 裡的 marker 對應 info 顯示/隱藏 --\x3e\n set(style[vr_panorama_style].scale, 0);\n ${(()=>{let t="";for(let n=0;n<e.length;n++){let e=Math.floor(n/4);t+=`hotspot[vr_panorama_${n}].loadstyle(vr_panorama_style);\nhotspot[vr_panorama_text_${n}].loadstyle(vr_panorama_style);\nset(hotspot[vr_panorama_${n}].ath, calc(view.hlookat + ${l.default.getVrThumbAth()*e}));\nset(hotspot[vr_panorama_text_${n}].ath, calc(view.hlookat + ${l.default.getVrThumbAth()*e}));`}return t})()}\n jscall(calc('krpano.hooks.prepareChangeScene("%1", "%2", "%3", "%4", %5, %6)'));\n</action>\n\n<action name="change_scene">\n\x3c!--\nchange scene in krpano, and callback to javascript (auto call it from prepare_change_scene)\n%1 ~ %6 is all same with prepare_change_scene\n%7 = newIndex\n%8 = oldIndex\n%9 = oldHLookat\n%10 is gyro enabled\n--\x3e\n jscall(calc('krpano.hooks.stopAutoRotate()'));\n if (%10 == true, set(plugin[gyro].enabled, false);); \x3c!-- 切換場景時 Gyro 需要先關閉,切換後設定好 h 視角,再打開 --\x3e\n if (webvr.isenabled AND webvr.headtracking == true, set(webvr.headtracking, false););\n\n jscall(calc('krpano.hooks.changeImage("%2", "%3", %5, ' + webvr.isenabled + ')'));\n def(prevVlookat, number, calc(view.vlookat)); \x3c!-- 儲存當前仰角 --\x3e\n def(prevHlookat, number, calc(view.hlookat)); \x3c!-- 儲存當前視角 --\x3e\n\n if (%5,\n ${(()=>(0,s.getIEVersion)()?"loadscene(%1, null, MERGE, BLEND(1));":"jscall(calc('krpano.hooks.threeJsMoving(%4, %6, %7, %8, %9)'));\n loadscene(%1, null, MERGE, BLEND(0.3));")()},\n loadscene(%1, null, MERGE, BLEND(1));\n );\n \x3c!-- 把 vr 裡的 marker 對應 info 顯示/隱藏 --\x3e\n if(webvr.isenabled, ${(()=>{let e="";const t=l.default.getKrpanoVrModeObj();return t.vrModeShouldShow.forEach(t=>{e+=` set(hotspot[${t}].visible,true);`}),t.vrModeShouldHide.forEach(t=>{e+=` set(hotspot[${t}].visible,false);`}),e})()});\n\n set(view.vlookat, calc(prevVlookat)); \x3c!-- 使用前一個 camera 仰角 --\x3e\n if (%4, set(view.hlookat, calc(%4 - (%6 - prevHlookat))));\n if (%10, set(plugin[gyro].enabled, true);); \x3c!-- 若有啟動 Gyro,在這裡要重新打開 --\x3e\n if (webvr.isenabled AND webvr.headtracking == false, set(webvr.headtracking, true););\n\n \x3c!-- 判斷下一個場景是否是 isTopLogo,要切換顯示 --\x3e\n if (scene[get(xml.scene)].name == '%1' AND scene[get(xml.scene)].isTopLogo == 'true',\n set(hotspot[topLogoTripod].visible, true);,\n set(hotspot[topLogoTripod].visible, false););\n\n ${(()=>(0,s.getIEVersion)()?"wait(LOAD);\n wait(BLEND);":"if (%5,\n jscall(calc('krpano.hooks.threeJsMovingStop()')); wait(LOAD);,\n wait(LOAD););")()}\n\n \x3c!-- 非 VR 模式時啟動自動旋轉 --\x3e\n if ((webvr.isenabled == false AND webvr.isfake == true) OR\n (webvr.isenabled == false AND webvr.isfake == false),\n jscall(calc('krpano.hooks.startAutoRotate()')););\n</action>\n\n<action name="toggle_vr_menu">\n\x3c!-- toggle show/hide menu in vr mode --\x3e\n if (style[vr_panorama_style].scale == 1,\n set(style[vr_panorama_style].scale, 0);,\n set(style[vr_panorama_style].scale, 1););\n ${(()=>{let t="";for(let n=0;n<e.length;n++){const e=Math.floor(n/4);t+=`hotspot[vr_panorama_${n}].loadstyle(vr_panorama_style);\nhotspot[vr_panorama_text_${n}].loadstyle(vr_panorama_style);\nset(hotspot[vr_panorama_${n}].ath, calc(view.hlookat + ${l.default.getVrThumbAth()*e}));\nset(hotspot[vr_panorama_text_${n}].ath, calc(view.hlookat + ${l.default.getVrThumbAth()*e}));`}return t})()}\n</action>\n\n<action name="nextscene_loop">\n\x3c!-- %1 Next Panorama: 1, Prev Panorama: -1 --\x3e\n if(xml.scene != null AND scene.count GT 1,\n if (scene[get(xml.scene)].index == 0,\n add(newsceneindex, scene[get(xml.scene)].index, calc(%1 + 1));,\n add(newsceneindex, scene[get(xml.scene)].index, %1););\n sub(lastsceneindex, scene.count, 1);\n if(newsceneindex LT 1, copy(newsceneindex, lastsceneindex));\n if(newsceneindex GT lastsceneindex, set(newsceneindex, 1));\n def(selectedMethod, string, 'VrModePrev');\n if(%1 == 1, set(selectedMethod, 'VrModeNext'));\n prepare_change_scene(get(scene[get(newsceneindex)].name), get(scene[get(newsceneindex)].panoramaId), get(selectedMethod), 0);\n );\n</action>\n\n<action name="marker_mousein">\n\x3c!-- marker hover --\x3e\n marker_fadein(%1);\n if(webvr.isenabled, if (%3 == tag, set(hotspot[markerInfoPhoto_%1].scale, 1);\n set(hotspot[markerInfoBg_%1].scale, 1);\n set(hotspot[markerInfoTitle_%1].scale, 1);\n set(hotspot[markerInfoDescription_%1].scale, 1);\n set(hotspot[markerInfoPrice_%1].scale, 1);,\n set(hotspot[markerInfo_%1].scale, 1););,\n spheretoscreen(hotspot[markerInfo_%1].ath, hotspot[markerInfo_%1].atv, mouseX, mouseY);\n jscall(calc('krpano.hooks.markerMousein(%2, ' + mouseX + ', ' + mouseY + ')')););\n</action>\n\n<action name="set_marker_info">\n jscall(calc('krpano.hooks.setMarkerInfo(%1)'));\n</action>\n\n<action name="marker_mouseout">\n\x3c!-- marker mouse leave --\x3e\n marker_fadeout(%1);\n if(webvr.isenabled, if (%3 == tag, set(hotspot[markerInfoPhoto_%1].scale, 0);\n set(hotspot[markerInfoBg_%1].scale, 0);\n set(hotspot[markerInfoTitle_%1].scale, 0);\n set(hotspot[markerInfoDescription_%1].scale, 0);\n set(hotspot[markerInfoPrice_%1].scale, 0);,\n set(hotspot[markerInfo_%1].scale, 0););,\n jscall(calc('krpano.hooks.markerMouseout(%2)')););\n</action>\n\n<action name="marker_fadein">\n\x3c!-- marker alpha to 1 --\x3e\n tween(hotspot[marker_%1].alpha, 1, .3, easeOutQuad);\n</action>\n\n<action name="marker_fadeout">\n\x3c!-- marker alpha to ${a.markerAlpha} --\x3e\n tween(hotspot[marker_%1].alpha, ${a.markerAlpha}, .3, easeOutQuad);\n</action>\n\n<action name="change_camera">\n\x3c!-- camera moving listen --\x3e\n jscall(calc('krpano.hooks.changeCamera(%1, %2)'));\n</action>\n\n<action name="handle_show_popup">\n\x3c!-- click popup marker show popup --\x3e\n jscall(calc('krpano.hooks.handleShowPopup(%1)'));\n</action>\n\n<action name="webvr_onentervr">\n ${(()=>{let e="";const t=l.default.getKrpanoVrModeObj();return t.vrModeShouldShow.forEach(t=>{e+=`set(hotspot[${t}].visible,true);`}),t.vrModeShouldHide.forEach(t=>{e+=`set(hotspot[${t}].visible,false);`}),e})()}\n jscall(calc('krpano.hooks.stopAutoRotate()'));\n webvr_showbuttons();\n webvr_hide_all_non_vr_layers();\n if(webvr.isfake, webvr_show_fakemode_info(true););\n</action>\n\n<action name="webvr_onexitvr">\n ${(()=>{let e="";const t=l.default.getKrpanoVrModeObj();return t.vrModeShouldShow.forEach(t=>{e+=`set(hotspot[${t}].visible,false);`}),t.vrModeShouldHide.forEach(t=>{e+=`set(hotspot[${t}].visible,true);`}),e})()}\n stopdelayedcall(vr_button_fadeout);\n tween(layer[webvr_exitbutton].alpha,0);\n tween(layer[webvr_setupbutton].alpha,0);\n webvr_show_fakemode_info(false);\n webvr_restore_layers();\n jscall(calc('krpano.hooks.startAutoRotate()'));\n</action>\n\n<action name="vr_menu_following" type="Javascript" devices="html5"><![CDATA[\nvar hs1 = krpano.get("hotspot[vr_menu_bg]");\nvar hs2 = krpano.get("hotspot[vr_menu_l]");\nvar hs3 = krpano.get("hotspot[vr_menu]");\nvar hs4 = krpano.get("hotspot[vr_menu_r]");\nif (!hs1.hovering && !hs2.hovering && !hs3.hovering && !hs4.hovering) {\n var f = 0.01;\n var h = krpano.view.hlookat;\n var v = krpano.view.vlookat;\n var hsh = hs1.ath;\n var hsv = hs1.atv;\n h = (h-(h|0)) + (((h|0)+360180)%360) - 180.0;\n hsh = (hsh-(hsh|0)) + (((hsh|0)+360180)%360) - 180.0;\n dh = h - hsh;\n dh += (dh>180) ? -360 : (dh<-180) ? 360 : 0\n hsh += dh*f;\n var a = Math.abs(v - hs1.atv) / 90.0;\n a = 0.5 * Math.max(1.0 - 2.0 * Math.sqrt(a), 0);\n v = v + 55.0 - v*1.5;\n hsv = hsv*(1-f) + v*f;\n hs1.alpha = a;\n if(!hs2.hovering) hs2.alpha = a;\n if(!hs3.hovering) hs3.alpha = a;\n if(!hs4.hovering) hs4.alpha = a;\n hs4.ath = hs3.ath = hs2.ath = hs1.ath = hsh;\n hs4.atv = hs3.atv = hs2.atv = hs1.atv = hsv;\n}]]></action>\n\n<action name="vr_menu_over">\ncallwith(hotspot[vr_menu_bg], tween(alpha|depth,1.0|650); );\ncallwith(hotspot[vr_menu_l], tween(alpha|depth,0.5|650); );\ncallwith(hotspot[vr_menu], tween(alpha|depth,0.5|650); );\ncallwith(hotspot[vr_menu_r], tween(alpha|depth,0.5|650); );\n</action>\n\n<action name="vr_menu_out">\nif(hotspot[vr_menu].hovering == false,\n callwith(hotspot[vr_menu_bg], tween(alpha|depth,0.25|800); );\n callwith(hotspot[vr_menu_l], tween(alpha|depth,0.25|800); );\n callwith(hotspot[vr_menu], tween(alpha|depth,0.25|800); );\n callwith(hotspot[vr_menu_r], tween(alpha|depth,0.25|800); );\n);\n</action>\n\n<action name="zoom_in">\ntween(view.fov, calc(view.fov - 30), .3, easeOutQuad);\n</action>\n\n<action name="zoom_out">\ntween(view.fov, calc(view.fov + 30), .3, easeOutQuad);\n</action>\n\n<layer name="webvr_exitbutton" keep="true" vr="true"\nstyle="webvr_button_style"\nhtml="Exit VR"\nalign="top" y="24"\nautoalpha="true" alpha="0.0"\nonclick="jscall(calc('krpano.hooks.exitVrMode()'));"\n/>\n\n<action name="start_gyro">\nset('plugin[gyro].enabled', 'true');\n</action>\n\n<action name="stop_gyro">\nset('plugin[gyro].enabled', 'false');\n</action>\n\n<action name="hover_closest_point_marker">\n\x3c!-- 得到公用參數 m_ath, m_atv --\x3e\nscreentosphere(mouse.x, mouse.y, m_ath, m_atv);\njscall(calc('krpano.hooks.findClosestPointMarker(' + m_ath + ', ' + m_atv + ', krpano.hooks.hoverClosestPointMarker);'));\n</action>\n\n<action name="click_krpano_screen">\njscall(calc('krpano.hooks.clickKrpanoScreen();'));\n</action>\n\n<action name="enter_closest_point_marker">\n\x3c!-- 滑鼠點的位置 --\x3e\nscreentosphere(mouse.x, mouse.y, m_ath, m_atv);\njscall(calc('krpano.hooks.findClosestPointMarker(' + m_ath + ', ' + m_atv + ', krpano.hooks.enterClosestPointMarker);'));\n</action>`}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,a=n(2),s=n(1),o=(r=s)&&r.__esModule?r:{default:r};const l=function(e,t){let n="";return n+=`<scene name="panorama_${e.panoramaId}" title="${(0,a.xmlString)(e.name)}" panoramaId="${e.panoramaId}" isTopLogo="${e.isTopLogo}">\n <view hlookat="${(e.panoramaRotation?-e.panoramaRotation.y:0)+o.default.getKrpanoXOffset()}" vlookat="0" fovtype="MFOV" fov="${o.default.getDefaultFov()}" fovmin="30" fovmax="${o.default.getDefaultFov()}"\n limitview="fullrange" vlookatmin="-90" vlookatmax="90" />\n ${(()=>e.cubemapReady?`<preview url="${e.cubemapLinks[0]?(0,a.xmlUrlString)(e.cubemapLinks[0]):""}" />\n<image><cube url="${e.cubemapLinks[1]?(0,a.xmlUrlString)(e.cubemapLinks[1]):""}" /></image>`:`<image><sphere url="${e.downloadLink?(0,a.xmlUrlString)(e.downloadLink):""}" /></image>`)()}\n ${t}</scene>`};t.default=function(e,t){try{o.default.getKrpanoXOffset}catch(e){throw new Error("getScenesXml must use getScenesXml.call(this, ...arg)")}let n="",r="";return e.forEach((e,s)=>{s===t&&(r=`<scene name="first_panorama_${e.panoramaId}" isTopLogo="${e.isTopLogo}">\n <view hlookat="${(e.panoramaRotation?-e.panoramaRotation.y:0)+o.default.getKrpanoXOffset()}" vlookat="90" fovtype="MFOV" fov="140" fovmin="30" fovmax="${o.default.getDefaultFov()}"\n limitview="fullrange" vlookatmin="-90" vlookatmax="90" />\n ${(()=>e.cubemapReady?`<preview url="${e.cubemapLinks[0]?(0,a.xmlUrlString)(e.cubemapLinks[0]):""}" />\n<image><cube url="${e.cubemapLinks[1]?(0,a.xmlUrlString)(e.cubemapLinks[1]):""}" /></image>`:`<image><sphere url="${e.downloadLink?(0,a.xmlUrlString)(e.downloadLink):""}" /></image>`)()}\n</scene>`),n+=l.call(this,e,"")}),n=r+n}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.default='<events name="changeCamera" keep="true" onviewchange="change_camera(get(\'view.hlookat\'), get(\'view.vlookat\'));" />\n<events name="logoTripod" keep="true" onviewchange="copy(hotspot[logoTripod].rotate, view.hlookat));" />\n<events name="topLogoTripod" keep="true" onviewchange="def(rotate, string, calc(view.hlookat * -1));copy(hotspot[topLogoTripod].rotate, rotate);" />\n<events name="vr_menu_events" keep="true" onviewchange="vr_menu_following();" />\n<events onclick="click_krpano_screen();" />'},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2);function a(e){return window.isNaN(e)||e<=0?0:e/100}t.default=((e,t,n=!1)=>`<hotspot name="logoTripod" keep="true" url="${(0,r.xmlUrlString)(e)}" ath="0" atv="90"\ndistorted="true" scale="${a(t)}" enabled="false" />\n<hotspot name="topLogoTripod" keep="true" url="${(0,r.xmlUrlString)(e)}" ath="0" atv="-90" distorted="true"\n scale="${a(t)}" visible="${n}" enabled="false" />`)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,a=n(2),s=n(5),o=n(1),l=(r=o)&&r.__esModule?r:{default:r},i=n(3);const c="font-family:Arial; color:#fff;",_='scale="1" distorted="true" wordwrap="true" bgcolor="0x000000" bgalpha=".8"',u=`zoom="true" distorted="true" scale="1" vr_timeout="700" keep="false" alpha="${s.markerAlpha}"`,d='width="51.2" height="51.2"';t.default=function(e){try{l.default.getVrThumbAth}catch(e){throw new Error("getStylesXml must use getStylesXml.call(this, ...arg)")}let t=`<style name="link" url="${i.linkImage}" ${u} ${d} />\n<style name="memo" url="${i.memoImage}" ${u} ${d} />\n<style name="point" url="${i.pointImage}" ${u} ${d} />\n<style name="tag" url="${i.tagImage}" ${u} ${d} />\n<style name="video" url="${i.videoImage}" ${u} ${d} />\n<style name="leftArrow" url="${i.leftArrowImage}" ${u} ${d} />\n<style name="rightArrow" url="${i.rightArrowImage}" ${u} ${d} />\n<style name="frontArrow" url="${i.frontArrowImage}" ${u} ${d} />\n<style name="leftFrontArrow" url="${i.leftFrontArrowImage}" ${u} ${d} />\n<style name="rightFrontArrow" url="${i.rightFrontArrowImage}" ${u} ${d} />\n<style name="markerInfo" css="${c} font-size:16px;" padding="15" bg="true" ${_} />\n<style name="markerInfoTag" ${_} padding="0" bg="false" css="${c} font-size:14px;" />\n<style name="markerInfoTagBg" ${_} padding="0" bg="true" css="${c} font-size:16px;" />\n<style name="vr_menu_style" depth="800" scale="0.2" distorted="true" ath="0" atv="45" visible="false" />\n<style name="vr_panorama_style" depth="800" distorted="true" keep="true" scale="0" />\n<hotspot name="vr_menu_bg" style="vr_menu_style" keep="true" zorder="5" bgcolor="0x000000" bgalpha=".8" bg="true" type="text"\nwidth="300" height="120" onover="vr_menu_over();" onout="vr_menu_out();" handcursor="false" />\n<hotspot name="vr_menu_l" style="vr_menu_style" keep="true" zorder="6" url="${i.prevPanoramaImage}"\nwidth="60" height="60" ox="-20" onover="vr_menu_over(); delayedcall(0,tween(alpha,0.75,0.1));" onout="vr_menu_out();" vr_timeout="700" onclick="nextscene_loop(-1);" />\n<hotspot name="vr_menu" style="vr_menu_style" keep="true" zorder="6" url="${i.menuImage}"\nwidth="60" height="60" onover="vr_menu_over(); delayedcall(0,tween(alpha,0.75,0.1));" onout="vr_menu_out();" vr_timeout="700" onclick="toggle_vr_menu(get('view.hlookat'));" />\n<hotspot name="vr_menu_r" style="vr_menu_style" keep="true" zorder="6" url="${i.nextPanoramaImage}"\nwidth="60" height="60" ox="+20" onover="vr_menu_over(); delayedcall(0,tween(alpha,0.75,0.1));" onout="vr_menu_out();" vr_timeout="700" onclick="nextscene_loop(+1);" />`;return e.forEach((e,n)=>{const r=n%4,s=Math.floor(n/4);let o=110*r-165,i=l.default.getVrThumbAth()*s;t+=`<hotspot name="vr_panorama_${n}" style="vr_panorama_style" zorder="6" url="${(0,a.xmlUrlString)(e.thumbnail)}" vr_timeout="2000"\nath="${i}" oy="${o}"\nwidth="160" height="80" onclick="prepare_change_scene(panorama_${e.panoramaId}, ${e.panoramaId}, VrModeThumbnail)" />\n<hotspot name="vr_panorama_text_${n}" css="font-family:Arial; color:#fff; font-size:12px; text-align: center; line-height: 18px;"\ntype="text" html="${(0,a.xmlString)((0,a.krpanoAutoBlank)((0,a.krpanoEnterString)(e.customCategory||e.category),10,!0))}" vr_timeout="2000"\nstyle="vr_panorama_style" bgcolor="0x000000" bgalpha=".8" zorder="7"\nath="${i}" oy="${o+50}"\nwidth="160" height="20" onclick="prepare_change_scene(panorama_${e.panoramaId}, ${e.panoramaId}, 'VrModeThumbnailText')" />`}),t}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,a=n(0),s=n(1),o=(r=s)&&r.__esModule?r:{default:r};t.default=(e=>({startAutoRotate(){e.startAutoRotate()},stopAutoRotate(t=!1){e.stopAutoRotate(t)},prepareChangeScene(t="",n="",r="",s=0,l=!1,i=0){const c=e.getPanoramas(),_=e.getCurrentPanorama(),u=e.getGyroSettings(),d=e.getLoadingSettings(),v=c.findIndex(e=>e.panoramaId===_.panoramaId),p=c.findIndex(e=>e.panoramaId===n);if(p>-1){const e=c[p],_=o.default.getKrpanoLookAtH();(0,a.isFunction)(d.onLoadingPanoramaStart)&&d.onLoadingPanoramaStart();const m=o.default.getKrpanoEl();e.cubemapReady?(m.call(`change_scene(${t}, ${n}, ${r}, ${s},\n ${l}, ${i}, ${p}, ${v}, ${_}, ${u.active});`),(0,a.isFunction)(d.onLoadingPanoramaFinish)&&d.onLoadingPanoramaFinish()):(0,a.loadImage)(e.downloadLink,()=>{(0,a.isFunction)(d.onLoadingPanoramaFinish)&&d.onLoadingPanoramaFinish(),m.call(`change_scene(${t}, ${n}, ${r}, ${s},\n ${l}, ${i}, ${p}, ${v}, ${_}, ${u.active});`)},e=>{(0,a.isFunction)(d.onLoadingPanoramaProgress)&&d.onLoadingPanoramaProgress(e)},e=>{(0,a.isFunction)(d.onLoadingPanoramaError)&&d.onLoadingPanoramaError(e)})}},changeImage(e,t,n,r){},threeJsMoving(e=0,t=0,n,r,a=0){window.animationStart=!0,window.build_scene(e,t,n,r,a)},threeJsMovingStop(){window.animationStart=!1},markerMousein(e=0,t=0,n=0){},markerMouseout(e){},setMarkerInfo(e){},changeCamera(e,t){o.default.setKrpanoLookAtH(e)},handleShowPopup(t){e.handleShowPopup(t)},exitVrMode(){e.toggleVRMode(!1)},clickKrpanoScreen(){}}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0),a=o(n(26)),s=o(n(1));function o(e){return e&&e.__esModule?e:{default:e}}const l={embedPano(e){const t=this.getEl();if(!t)throw new Error("element not found");const n=this.getBasicSettings(),o=s.default.getKrpanoId(),i=(e,t)=>{e.hooks=(0,a.default)(this),s.default.setKrpanoEl(e);const n=s.default.getKrpanoXml();e.call(`loadxml(${escape(n)})`),window.setTimeout(()=>{const n=this.getGyroSettings(),a=this.getAutoRotateSettings();e.call(`first_panorama_ready(${n.active||!1});`),a.active&&(this.startAutoRotate(),l.stopAutoRotateEvent.call(this).addEvent()),(0,r.isFunction)(t)&&t()},1500)};window.embedpano({id:o,target:t.id,xml:"",bgcolor:n.bgcolor,wmode:n.wmode,vars:n.vars,initvars:n.initvars,basepath:n.basepath,mwheel:n.mwheel,focus:n.focus,consolelog:n.consolelog,mobilescale:n.mobilescale,fakedevice:n.fakedevice,lazyLoad:!0,html5:"webgl+only",webglsettings:{depth:!0},passQueryParameters:!0,onready:t=>{i(t,e)},onerror(e){console.error("pano create error",e)}})},setConfig(e={}){const{autoRotateSettings:t,gyroSettings:n,tripodSettings:a,basicSettings:s,loadingSettings:o,initViewSettings:l}=e;t&&(0,r.isFunction)(this.setAutoRotateSettings)&&this.setAutoRotateSettings(t),n&&(0,r.isFunction)(this.setGyroSettings)&&this.setGyroSettings(n),a&&(0,r.isFunction)(this.setTripodSettings)&&this.setTripodSettings(a),s&&(0,r.isFunction)(this.setBasicSettings)&&this.setBasicSettings(s),o&&(0,r.isFunction)(this.setLoadingSettings)&&this.setLoadingSettings(o),l&&(0,r.isFunction)(this.setInitViewSettings)&&this.setInitViewSettings(l)},stopAutoRotateEvent(){const e=this.getAutoRotateSettings(),t=t=>{37!==t.keyCode&&38!==t.keyCode&&39!==t.keyCode&&40!==t.keyCode||this.stopAutoRotate(!0,e.restartTime)},n=()=>{this.stopAutoRotate(!0,e.restartTime)};return{addEvent(){window.addEventListener("keydown",t),window.addEventListener("mousedown",n),window.addEventListener("touchstart",n)},removeEvent(){window.removeEventListener("keydown",t),window.removeEventListener("mousedown",n),window.removeEventListener("touchstart",n)}}}};t.default=l},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.gyroMessageXml=t.threeJsXml=t.contextMenuXml=t.gyroXml=t.webVRXml=void 0;var r=n(3);t.webVRXml=`<plugin name="WebVR" devices="html5" keep="true"\nurl="${r.webvrMinJs}"\nonloaded="copy(webvr, plugin[WebVR]);"\nmousespeed="0.00125"\nmultireslock="true"\nfullscreen_mirroring="true"\nmobilevr_support="true"\nmobilevr_ipd="110"\nmobilevr_screensize="10.0"\nmobilevr_lens_overlap="1.0"\nmobilevr_lens_fov="96"\nmobilevr_lens_dist="0.6"\nmobilevr_lens_dist2="1|0|0|0"\nmobilevr_lens_ca="0.0"\nmobilevr_lens_vign="100"\nmobilevr_wakelock="true"\nmobilevr_sensor_mode="3"\nmobilevr_autocalibration="false"\nmobilevr_touch_support="true"\nmobilevr_fake_support="true"\nvr_cursor="hotspot[vr_cursor]"\nvr_cursor_enabled="true"\nvr_cursor_onover="if(handcursor, tween(hotspot[vr_cursor].scale,0.4,0.1); vr_auto_click(get(vr_timeout)); );"\nvr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"\nonavailable="webvr_onavailable();"\nonunavailable=""\nonunknowndevice="webvr_onunknowndevice();"\nonentervr="webvr_onentervr();"\nonexitvr="webvr_onexitvr();"\n/>\n\n<vrheadsets>\n<headset name="cb1" caption="Cardboard A" overlap="1.10" fov="96.0" dist="1.00" dist2="1|0|0|0" ca="0.000" vig="100" />\n<headset name="cb2" caption="Cardboard B" overlap="1.00" fov="96.0" dist="0.60" dist2="1|0|0|0" ca="0.000" vig="100" />\n<headset name="gvr" caption="GearVR" overlap="1.00" fov="112.0" dist="0.95" dist2="1|0|0|0" ca="0.090" vig="100" />\n<headset name="hom" caption="HOMiDO" overlap="1.00" fov="101.0" dist="1.10" dist2="1|0|0|0" ca="0.075" vig="100" />\n<headset name="one" caption="VR ONE" overlap="1.00" fov="109.9" dist="0.00" dist2="1.139|0.093|0.018|0.207" ca="0.090" vig="35" />\n<headset name="ccr" caption="ColorCross VR" overlap="1.00" fov="70.0" dist="0.65" dist2="1|0|0|0" ca="0.000" vig="100" />\n<headset name="nod" caption="No Distortion" overlap="1.00" fov="96.0" dist="0.00" dist2="1|0|0|0" ca="0.000" vig="100" />\n</vrheadsets>\n\n<hotspot name="vr_cursor" keep="true"\nurl="${r.webvrCursorImage}"\nvisible="false"\nenabled="false"\ndistorted="true"\ncrop="0|0|80|80"\nscale="0.3"\ndepth="1000"\n/>\n\n<action name="vr_auto_click">\nif(webvr.isenabled,\nif(%1 != null, set(vr_aclk_timeout, %1), set(vr_aclk_timeout, 2000));\ncopy(vr_aclk_t1, timertick);\nset(vr_aclk_waiting, true);\ncopy(vr_aclk_hotspot, name);\nset(hotspot[vr_cursor].crop,'0|0|80|80');\n\nasyncloop(vr_aclk_waiting AND vr_aclk_hotspot == name,\nsub(dt, timertick,vr_aclk_t1);\n\nif(!hovering,\nset(vr_aclk_waiting, false);\nset(hotspot[vr_cursor].crop,'0|0|80|80');\n,\ndiv(f, dt, vr_aclk_timeout);\nmul(f, 16);\nroundval(f);\nMath.min(f, 16);\nmul(f, 80);\n\ntxtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');\nsub(dt, 100);\nif(dt GT vr_aclk_timeout,\nset(vr_aclk_waiting,false);\nset(hotspot[vr_cursor].crop,'0|0|80|80');\nonclick();\n);\n);\n);\n);\n</action>\n<events name="webvr_events" devices="html5" keep="true"\nonkeydown="if(webvr AND webvr.isenabled AND keycode==32, webvr.resetSensor() );"\nonmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"\n/>\n<action name="webvr_onavailable">\nwebvr.loadsettings(local);\n</action>\n\n\n<action name="webvr_onunknowndevice">\nif(webvr.isfake AND device.desktop AND webvr.havesettings == false,\nset(webvr.mobilevr_lens_overlap, 1.0);\nset(webvr.mobilevr_lens_fov, 96.0);\nset(webvr.mobilevr_lens_dist, 0.0);\nset(webvr.mobilevr_lens_dist2, '1|0|0|0');\nset(webvr.mobilevr_lens_ca, 0.0);\nset(webvr.mobilevr_lens_vign, 100);\n,\nset(ask_user_for_screensize,true);\n);\n</action>\n\n<action name="webvr_hide_all_non_vr_layers">\nfor(set(i,0), i LT layer.count, inc(i),\ncopy(lr, layer[get(i)]);\nif(lr.vr !== true,\ncopy(lr.vr_backup_visible, lr.visible);\nset(lr.visible, false);\n);\n);\n</action>\n\n<action name="webvr_restore_layers">\nfor(set(i,0), i LT layer.count, inc(i),\ncopy(lr, layer[get(i)]);\nif(lr.vr_backup_visible,\ncopy(lr.visible, lr.vr_backup_visible);\ndelete(lr.vr_backup_visible);\n);\n);\n</action>\n\n<action name="webvr_show_fakemode_info">\nif('%1' == 'true',\naddlayer(webvr_fakemode_info);\nset(layer[webvr_fakemode_info].url, '%SWFPATH%/plugins/textfield.swf');\nset(layer[webvr_fakemode_info].keep, true);\nset(layer[webvr_fakemode_info].align, 'bottom');\nset(layer[webvr_fakemode_info].y, 80);\nset(layer[webvr_fakemode_info].background, false);\nset(layer[webvr_fakemode_info].css, 'color:#FFFFFF;text-align:center;');\nset(layer[webvr_fakemode_info].html, '[i][u]Simulated WebVR Mode![/u][/i][br]For real WebVR with headset tracking, either use a [a href="http://webvr.info" target="_blank" style="color:#FFFFFF;"]WebVR-API-capable[/a] desktop browser or a mobile device and a VR headset.');\n,\nremovelayer(webvr_fakemode_info);\n);\n</action>\n\n<krpano webvr_setup_scale="calc:(1.0 + 1.0*(device.mobile AND stagescale LT 1.0)) / (1.0 + 1.0*device.mobile)"\nwebvr_button_scale.normal="1.0"\nwebvr_button_scale.mobile="1.6"\n/>\n\n<style name="webvr_button_style"\nurl="%SWFPATH%/plugins/textfield.swf"\nbackgroundcolor="0x000000"\nbackgroundalpha="0.5"\nroundedge="calc:9*webvr_setup_scale*webvr_button_scale"\ncss="calc:'color:#FFFFFF;font-size:' + 20*webvr_setup_scale*webvr_button_scale + 'px;'"\npadding="calc:6*webvr_setup_scale*webvr_button_scale + ' ' + 10*webvr_setup_scale*webvr_button_scale"\n/>\n\n<layer name="webvr_setupbutton" keep="true" vr="true"\nstyle="webvr_button_style"\nhtml="VR Setup"\nalign="bottom" y="24"\nautoalpha="true" alpha="0.0"\nonclick="vr_setup()"\n/>\n\n<action name="webvr_showbuttons">\nstopdelayedcall(vr_button_fadeout);\nif(webvr.ismobilevr,\ntween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 1.0|1.0, 0.25);\ndelayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 0.0|0.0, 1.0); );\n,\ntween(layer[webvr_exitbutton].alpha, 1.0, 0.25);\ndelayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha, 0.0, 1.0); );\n);\n</action>\n\n<action name="vr_setup">\nset(webvr.vr_cursor_enabled, false);\n\ntween(layer[webvr_exitbutton].alpha,0);\ntween(layer[webvr_setupbutton].alpha,0);\n\naddlayer(vr_setup_bg);\nset(layer[vr_setup_bg].type, container);\nset(layer[vr_setup_bg].bgcolor, 0x000000);\nset(layer[vr_setup_bg].bgalpha, 0.5);\nset(layer[vr_setup_bg].bgcapture, true);\nset(layer[vr_setup_bg].handcursor, false);\nset(layer[vr_setup_bg].align, lefttop);\nset(layer[vr_setup_bg].width, 100%);\nset(layer[vr_setup_bg].height, 100%);\nset(layer[vr_setup_bg].zorder, 99999);\n\ncopy(i_screensize, webvr.mobilevr_screensize);\nif(i_screensize == 'auto', copy(i_screensize, webvr.devicesize));\nif(i_screensize LE 0, set(i_screensize, 5.0));\nroundval(i_screensize, 1);\ntxtadd(i_screensize, ' inch');\n\ncopy(i_ipd, webvr.mobilevr_ipd);\nroundval(i_ipd, 1);\ntxtadd(i_ipd, ' mm');\n\ncopy(i_fov, webvr.mobilevr_lens_fov);\nroundval(i_fov, 1);\n\ncopy(i_dist, webvr.mobilevr_lens_dist);\nroundval(i_dist, 2);\n\ncopy(i_dist2, webvr.mobilevr_lens_dist2);\ntxtsplit(i_dist2, '|', i_dist2_k1, i_dist2_k2, i_dist2_k3, i_dist2_k4);\nmul(i_dist2_k1,1);\nmul(i_dist2_k2,10);\nmul(i_dist2_k3,10);\nmul(i_dist2_k4,10);\nroundval(i_dist2_k1,2);\nroundval(i_dist2_k2,2);\nroundval(i_dist2_k3,2);\nroundval(i_dist2_k4,2);\n\ncopy(i_vig, webvr.mobilevr_lens_vign);\nroundval(i_vig, 0);\n\ncopy(i_overlap, webvr.mobilevr_lens_overlap);\nroundval(i_overlap, 2);\n\ncopy(i_ca, webvr.mobilevr_lens_ca);\nroundval(i_ca, 3);\n\nset(i_headset, 'Custom');\nfor(set(i,0), i LT vrheadsets.headset.count, inc(i),\ncopy(hs, vrheadsets.headset[get(i)]);\nif(i_overlap == hs.overlap AND i_fov == hs.fov AND i_dist == hs.dist AND i_dist2 == hs.dist2 AND i_ca == hs.ca AND i_vig == hs.vig , copy(i_headset, hs.caption));\n);\n\nset(known_size, true);\nset(sizcol, #FFFFFF);\ncopy(i_devicename, webvr.devicename);\nif(i_devicename == 'Unknown',\nif(webvr.mobilevr_screensize == 'auto',\nset(sizcol, #AA0000);\nset(known_size, false);\n,\nset(i_devicename, 'Custom');\n);\n);\n\naddlayer(vr_setup_m1);\nset(layer[vr_setup_m1].type, container);\nset(layer[vr_setup_m1].parent, vr_setup_bg);\nset(layer[vr_setup_m1].align, lefttop);\nset(layer[vr_setup_m1].width, 100%);\nset(layer[vr_setup_m1].height, 100%);\n\naddlayer(vr_setup_m3);\nset(layer[vr_setup_m3].type, container);\nset(layer[vr_setup_m3].parent, vr_setup_bg);\nset(layer[vr_setup_m3].align, lefttop);\nset(layer[vr_setup_m3].width, 100%);\nset(layer[vr_setup_m3].height, 100%);\nset(layer[vr_setup_m3].visible, false);\n\naddlayer(vr_setup_m2);\nset(layer[vr_setup_m2].type, container);\nset(layer[vr_setup_m2].parent, vr_setup_bg);\nset(layer[vr_setup_m2].align, lefttop);\nset(layer[vr_setup_m2].width, 100%);\nset(layer[vr_setup_m2].height, 100%);\nset(layer[vr_setup_m2].visible, false);\n\nset(vr_setup_text_parent, 'vr_setup_m1');\nvr_setup_createtext(vr_setup_title, 'MOBILE VR SETUP', center, center, 0, -225, #FFFFFF, false);\n\nvr_setup_createtext(vr_setup_dvn1, 'Device:', center, right, 0, -145, #FFFFFF, true, vr_setup_select('screen') );\nvr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left, 0, -145, get(sizcol), true, vr_setup_select('screen') );\nvr_setup_createtext(vr_setup_siz1, 'Screensize:', center, right, 0, -105, #FFFFFF, true, vr_setup_select('screen') );\nvr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left, 0, -105, get(sizcol), true, vr_setup_select('screen') );\n\nvr_setup_createtext(vr_setup_ipd1, 'IPD:', center, right, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );\nvr_setup_createtext(vr_setup_ipd2, get(i_ipd), center, left, 0, -35, #FFFFFF, true, vr_setup_select('ipd') );\n\nvr_setup_createtext(vr_setup_hmd1, 'VR Headset:', center, right, 0, +35, #FFFFFF, true, vr_setup_select('headset') );\nvr_setup_createtext(vr_setup_hmd2, get(i_headset), center, left, 0, +35, #FFFFFF, true, vr_setup_select('headset') );\n\nvr_setup_createtext(vr_setup_hmd3, 'Customize', center, center, 0, +75, #FFFFFF, true, set(background,true), set(background,false), vr_setup_customize_headset() );\n\nif(webvr.iswebvr == false,\nvr_setup_createtext(vr_setup_cal, 'Calibrate Gyroscope', center, center, 0, +145, #FFFFFF, true, set(background,true), set(background,false), vr_setup_calibration() );\n);\n\nvr_setup_createtext(vr_setup_sav, 'SAVE', center, center, -200, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_save() );\nvr_setup_createtext(vr_setup_rst, 'RESET', center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_reset() );\nvr_setup_createtext(vr_setup_cls, 'CLOSE', center, center, +200, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close() );\n\nvr_setup_createbutton(vr_setup_btn1, '&#60;', left, left, 5%, -35, #FFFFFF, true, null);\nvr_setup_createbutton(vr_setup_btn2, '&#62;', right, right, 5%, -35, #FFFFFF, true, null);\n\nset(vr_setup_text_parent, 'vr_setup_m3');\nvr_setup_createtext(vr_setup_m31, 'VR HEADSET', center, center, 0, -225, #FFFFFF, false);\n\nvr_setup_createtext(vr_setup_fov1, 'FOV:', center, right, 0, -80, #FFFFFF, true, vr_setup_select('fov') );\nvr_setup_createtext(vr_setup_fov2, get(i_fov), center, left, 0, -80, #FFFFFF, true, vr_setup_select('fov') );\nvr_setup_createtext(vr_setup_dst1, 'Distortion:', center, right, 0, -32, #FFFFFF, true, vr_setup_select('dist') );\nvr_setup_createtext(vr_setup_dst2, get(i_dist), center, left, 0, -32, #FFFFFF, true, vr_setup_select('dist') );\nvr_setup_createtext(vr_setup_d2tx, 'Dist2:', center, right, 0, +16, #FFFFFF, true, vr_setup_select('dist2k1') );\nvr_setup_createtext(vr_setup_d2k1, get(i_dist2_k1), center, left, 0, +16, #FFFFFF, true, vr_setup_select('dist2k1') );\nvr_setup_createtext(vr_setup_d2k2, get(i_dist2_k2), center, left, +100, +16, #FFFFFF, true, vr_setup_select('dist2k2') );\nvr_setup_createtext(vr_setup_d2k3, get(i_dist2_k3), center, left, +200, +16, #FFFFFF, true, vr_setup_select('dist2k3') );\nvr_setup_createtext(vr_setup_d2k4, get(i_dist2_k4), center, left, +300, +16, #FFFFFF, true, vr_setup_select('dist2k4') );\n\