"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var three_1 = require("three"); var _1 = require("."); var CameraUpdate_1 = require("./CameraUpdate"); var ColorPalette_1 = require("./ColorPalette"); var GeUtils_1 = require("./GeUtils"); var PlaneExt_1 = require("./PlaneExt"); var Viewer = /** @class */ (function () { /** * * @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布 * @memberof Viewer */ function Viewer(canvasContainer) { var _this = this; this.m_Camera = new CameraUpdate_1.CameraUpdate(); this.m_bNeedUpdate = true; this.m_Scene = new three_1.Scene(); this.OnSize = function (width, height) { _this._Width = width ? width : _this.m_DomEl.clientWidth; _this._Height = height ? height : _this.m_DomEl.clientHeight; //校验.成为2的倍数 避免外轮廓错误. if (_this._Width % 2 == 1) _this._Width -= 1; if (_this._Height % 2 == 1) _this._Height -= 1; _this.m_Render.setSize(_this._Width, _this._Height); _this.m_Camera.SetSize(_this._Width, _this._Height); }; this.StartRender = function () { requestAnimationFrame(_this.StartRender); if (_this.m_Scene != null && _this.m_bNeedUpdate) { _this.Render(); _this.m_bNeedUpdate = false; } }; this.m_DomEl = canvasContainer; this.initRender(canvasContainer); this.OnSize(); this.StartRender(); this.m_CameraCtrl = new _1.CameraControls(this); window.addEventListener("resize", function () { _this.OnSize(); }); this.m_Render.domElement.addEventListener("mousemove", function (e) { _this.SelectByPoint(e.offsetX, e.offsetY); }); } //初始化render Viewer.prototype.initRender = function (canvasContainer) { var params = { antialias: true, precision: "highp", alpha: true //alpha:true/false是否可以设置背景色透明 }; if (canvasContainer instanceof HTMLCanvasElement) { params.canvas = canvasContainer; this.m_Render = new three_1.WebGLRenderer(params); } else { this.m_Render = new three_1.WebGLRenderer(params); //加到画布 canvasContainer.appendChild(this.m_Render.domElement); } this.m_Render.autoClear = true; //如果设置,那么它希望所有的纹理和颜色都是预乘的伽玛。默认值为false。 // this.m_Render.gammaInput = true; // this.m_Render.gammaOutput = true; // this.m_Render.shadowMap.enabled = true; // this.m_Render.toneMapping = ReinhardToneMapping; //设置设备像素比。 这通常用于HiDPI设备,以防止模糊输出画布。 this.m_Render.setPixelRatio(window.devicePixelRatio); this.m_Render.physicallyCorrectLights = true; //this.m_Render.toneMappingExposure = Math.pow(1, 5.0); // to allow for very bright scenes. //设置它的背景色为黑色 this.m_Render.setClearColor(0xffffff, 1); this.OnSize(); }; Viewer.prototype.Render = function () { this.m_Render.render(this.m_Scene, this.m_Camera.Camera); }; Viewer.prototype.ScreenToWorld = function (pt, planVec) { //变换和求交点 var plan = new PlaneExt_1.PlaneExt(planVec || new three_1.Vector3(0, 0, 1)); var raycaster = new three_1.Raycaster(); // 射线从相机射线向屏幕点位置 raycaster.setFromCamera({ x: (pt.x / this._Width) * 2 - 1, y: -(pt.y / this._Height) * 2 + 1 }, this.m_Camera.Camera); plan.intersectRay(raycaster.ray, pt, true); }; Viewer.prototype.WorldToScreen = function (pt) { var widthHalf = this._Width * 0.5; var heightHalf = this._Height * 0.5; pt.project(this.m_Camera.Camera); pt.x = (pt.x * widthHalf) + widthHalf; pt.y = -(pt.y * heightHalf) + heightHalf; }; /** * 更新视角观测目标(物体中心) * * @memberof Viewer */ Viewer.prototype.UpdateLockTarget = function () { var renderList = this.m_Render.renderLists.get(this.m_Scene, this.m_Camera.Camera); var box = GeUtils_1.GetBoxArr(renderList.opaque.map(function (o) { return o.object; })); if (box) this.m_LookTarget = box.getCenter(new three_1.Vector3()); else this.m_LookTarget = GeUtils_1.cZeroVec; }; Viewer.prototype.Rotate = function (mouseMove) { this.m_Camera.Rotate(mouseMove, this.m_LookTarget); this.m_bNeedUpdate = true; }; Viewer.prototype.Pan = function (mouseMove) { this.m_Camera.Pan(mouseMove); this.m_bNeedUpdate = true; }; Viewer.prototype.Zoom = function (scale, center) { this.m_Camera.Zoom(scale, center); this.m_bNeedUpdate = true; }; Viewer.prototype.ZoomAll = function () { this.m_Camera.ZoomExtensBox3(GeUtils_1.GetBox(this.m_Scene, true)); this.m_bNeedUpdate = true; }; Viewer.prototype.ViewToTop = function () { this.m_Camera.LookAt(new three_1.Vector3(0, 0, -1)); this.m_bNeedUpdate = true; }; Viewer.prototype.ViewToFront = function () { this.m_Camera.LookAt(new three_1.Vector3(0, 1, 0)); this.m_bNeedUpdate = true; }; Viewer.prototype.ViewToSwiso = function () { this.m_Camera.LookAt(new three_1.Vector3(1, 1, -1)); this.m_bNeedUpdate = true; }; Viewer.prototype.SelectByPoint = function (x, y) { var mesh = _1.PointPick(this, x, y); if (this.oldMesh) this.oldMesh.material = _1.boardMaterial; if (mesh && mesh.material !== ColorPalette_1.ColorMaterial.GetBasicMaterial(1)) { this.oldMesh = mesh; mesh.material = _1.selectMaterial; } this.m_bNeedUpdate = true; }; Viewer.prototype.SelectBlock = function (blockMeshMap, dataID) { var _this = this; if (blockMeshMap.has(dataID)) { var meshId_1 = blockMeshMap.get(dataID); if (this.oldMesh) this.oldMesh.material = _1.boardMaterial; this.m_Scene.children.forEach(function (obj) { if (obj instanceof three_1.Mesh) { if (obj.id == meshId_1) { _this.oldMesh = obj; obj.material = _1.selectMaterial; _this.m_bNeedUpdate = true; } } }); } }; return Viewer; }()); exports.Viewer = Viewer; //# sourceMappingURL=Viewer.js.map