Floorplan.js 6.1 KB

1
  1. var Floorplan=function(){"use strict";var o=function(o,t){var e=this;this.app=o,this.opitons=t||{},this.player=this.app.core.get("Player"),this.movable=!0,this.display=!1,this.inited=!1,this.floorPlanAngle=0,this.coord={defaultZoom:100,zoom:100,res:80,defaultCenter:null,center:null,ratio:1},this.app.core.get("SceneRenderer").resizeListeners.push({setSize:function(o,t){e.display&&e.$canvas&&(e.$canvas.width=e.$dom.clientWidth,e.$canvas.height=e.$dom.clientHeight,e.app.core.get("CameraControls").emit("syncCadAnd3D",e._getScreenInfoForCAD()),e.render())}})},t={panos:{configurable:!0}};return t.panos.get=function(){return kankan.core.get("Player").model.currentFloor.panos.filter((function(o){return!o.panoType}))},o.prototype.enter=function(){var o=this;return this.display=!0,this.app.Camera.setCompassDisplay(!1,!0),this.player.model.floorplanCadImg.deleteAllCadPlanes(!1),this.player.path.currentPanoMarker.mesh.visible=!1,this.app.Camera.floorplan().then((function(){o.$dom=o.app.dom.querySelector("[xui_floorplan]"),o.$dom.style.display="block",o.$canvas||(o.$dom.addEventListener("contextmenu",(function(o){o.preventDefault()})),o.$dom.addEventListener("mousewheel",o._onMouseWheel.bind(o)),o.$dom.addEventListener("DOMMouseScroll",o._onMouseWheel.bind(o)),o.$dom.addEventListener("mousedown",(function(t){t.preventDefault(),t.stopPropagation(),o.movable&&null!=o.coord.defaultCenter&&(o.lastX=t.offsetX||t.layerX,o.lastY=t.offsetY||t.layerY,o._isMousedown=!0,o.app.core.get("CameraControls").onMouseDown(t))})),o.$dom.addEventListener("mousemove",(function(t){if(o.movable&&o._isMousedown&&null!=o.coord.defaultCenter){var e=t.offsetX||t.layerX,n=t.offsetY||t.layerY,r=e-o.lastX,a=n-o.lastY;o.coord.center.x=o.coord.center.x-100*r/o.coord.zoom/o.coord.res,o.coord.center.y=o.coord.center.y+100*a/o.coord.zoom/o.coord.res,o.lastX=e,o.lastY=n,o.app.core.get("CameraControls").emit("syncCadAnd3D",o._getScreenInfoForCAD()),o.render()}})),o.$dom.addEventListener("mouseup",(function(t){o.movable&&null!=o.coord.defaultCenter&&(o._isMousedown=!1,o.app.core.get("CameraControls").onMouseUp(t))})),o.opitons.init&&o.opitons.init.call(o,o)),o.$canvas=o.$dom.querySelector("canvas"),o.$canvas.width=o.$dom.clientWidth,o.$canvas.height=o.$dom.clientHeight,o.inited||(o.inited=!0,o._init()),o.context=o.$canvas.getContext("2d"),o.app.core.get("CameraControls").emit("syncCadAnd3D",o._getScreenInfoForCAD()),o.render()}))},o.prototype.leave=function(){return this.display=!1,this.$dom.style.display="none",this.app.Camera.setCompassDisplay(!0,!1),this.player.model.floorplanCadImg.deleteAllCadPlanes(!0),this.player.path.currentPanoMarker.mesh.visible=!0,this.app.Camera.panorama()},o.prototype.render=function(){"function"==typeof this.opitons.render&&this.opitons.render.call(this,this,this.panos,this.coord.zoom/100)},o.prototype.flyToNearPano=function(o){var t=this,e={pano:null,dist:9999};if(this.panos.forEach((function(n){var r=KanKan.Utils.convert.pointFrom3DTo2D(n.position,t.player),a=Math.abs(r.x-o.x),i=Math.abs(r.y-o.y),s=Math.sqrt(Math.pow(a,2)+Math.pow(i,2));s<e.dist&&(e.pano=n,e.dist=s)})),e.pano){this.display=!1,this.$dom.style.display="none",this.app.Camera.setCompassDisplay(!0,!1),this.player.model.floorplanCadImg.deleteAllCadPlanes(!0),this.player.path.currentPanoMarker.mesh.visible=!0;var n=e.pano;this.player.flyToNewMode({pano:n,quaternion:n.quaternion,mode:"panorama"});var r=KanKan.Utils.convert.pointFrom2DTo3D(o,this.player);return{panoId:n.id,position:r}}},o.prototype.getNearPano=function(o){var t=this,e={pano:null,dist:9999};if(this.panos.forEach((function(n){var r=KanKan.Utils.convert.pointFrom3DTo2D(n.position,t.player),a=Math.abs(r.x-o.x),i=Math.abs(r.y-o.y),s=Math.sqrt(Math.pow(a,2)+Math.pow(i,2));s<e.dist&&(e.pano=n,e.dist=s)})),e.pano){var n=KanKan.Utils.convert.pointFrom2DTo3D(o,this.player);return{panoId:e.pano.id,position:n}}},o.prototype.getScreenPosition=function(o){if(null==this.$canvas.width||null==this.$canvas.height)return null;var t=o.x,e=-o.z,n=this.$canvas.width/2+(t-this.coord.center.x)*this.coord.res*this.coord.zoom/100,r=this.$canvas.height/2-(e-this.coord.center.y)*this.coord.res*this.coord.zoom/100;return n=.5+n<<0,r=.5+r<<0,{x:Math.floor(n)*this.coord.ratio,y:Math.floor(r)*this.coord.ratio}},o.prototype.setFloor=function(o){this.app.Scene.gotoFloor(o),this.render()},o.prototype._onMouseWheel=function(o){o.preventDefault();var t=o.type;"DOMMouseScroll"!=t&&"mousewheel"!=t||(this._updateCoordForZoom(o),this.app.core.get("CameraControls").emit("syncCadAnd3D",this._getScreenInfoForCAD()),this.render())},o.prototype._init=function(){var o=this.app.core.get("CameraControls").activeControl.camera;this._initCoord(o.left,o.right,this.player.model.center)},o.prototype._initCoord=function(o,t,e){this.coord.res=this.$canvas.width/Math.abs(t-o),this.coord.defaultCenter={x:e.x,y:-e.z},this.coord.center={x:e.x,y:-e.z}},o.prototype._updateCoordForZoom=function(o){var t=o.wheelDelta?o.wheelDelta/120*2:-(o.detail||0)/3*2,e=this.coord.zoom+t;e<14||(this.coord.zoom=e)},o.prototype._getXYFromScreen=function(o){var t={};return t.x=(o.x-this.$canvas.width/2)/this.coord.res*this.coord.defaultZoom/this.coord.zoom+this.coord.center.x,t.y=(this.$canvas.height/2-o.y)/this.coord.res*this.coord.defaultZoom/this.coord.zoom+this.coord.center.y,t},o.prototype._getScreenInfoForCAD=function(){var o=this._getXYFromScreen({x:this.$canvas.width,y:this.$canvas.height}),t=this._getXYFromScreen({x:0,y:0}),e={x:this.coord.center.x,y:this.coord.center.y};return{width:Math.abs(o.x-t.x),height:Math.abs(o.y-t.y),center:{x:e.x,y:e.y},defaultCenter:this.coord.defaultCenter,floorPlanAngle:this.floorPlanAngle}},Object.defineProperties(o.prototype,t),function(t,e){var n=KanKan.Deferred();return t.Scene.on("loaded",(function(){var r=new o(t,e);r.$html="<div xui_floorplan> <canvas></canvas> </div> <style> [xui_floorplan] {\n display: none;\n position: absolute;\n pointer-events: all;\n width: 100%;\n height: 100%;\n \n\n }\n [xui_floorplan] canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n } </style> ",r.$name="Floorplan",r.$load=function(){},n.resolve(r)})),n}}();