CADViewComponent/dist/Viewer.js
ChenX cbe28efb08 分离选择材质,避免实体选中时,选中材质导致的内部拉槽显示问题.
修正未选中板件时,视图没有刷新的问题.
加入排钻显示.
2018-05-31 11:12:29 +08:00

139 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const THREE = require("three");
const CameraUpdate_1 = require("./CameraUpdate");
const GeUtils_1 = require("./GeUtils");
const PlaneExt_1 = require("./PlaneExt");
const _1 = require(".");
class Viewer {
//构造
constructor(canvasContainer) {
this.m_Camera = new CameraUpdate_1.CameraUpdate();
this.m_bNeedUpdate = true;
this.m_Scene = new THREE.Scene();
this.OnSize = (width, height) => {
this._Width = width ? width : this.m_DomEl.scrollWidth;
this._Height = height ? height : this.m_DomEl.scrollHeight;
//校验.成为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 = () => {
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();
new _1.CameraControls(this);
window.addEventListener("resize", () => {
this.OnSize();
});
let oldMesh;
this.m_Render.domElement.addEventListener("mousemove", (e) => {
let mesh = _1.PointPick(this, e.offsetX, e.offsetY);
if (oldMesh)
oldMesh.material = _1.boardMaterial;
if (mesh) {
oldMesh = mesh;
mesh.material = _1.selectMaterial;
}
this.m_bNeedUpdate = true;
});
}
//初始化render
initRender(canvasContainer) {
this.m_Render = new THREE.WebGLRenderer({
antialias: true,
precision: "highp",
alpha: true,
});
//加到画布
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 = THREE.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();
}
Render() {
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
}
ScreenToWorld(pt, planVec) {
//变换和求交点
let plan = new PlaneExt_1.PlaneExt(planVec || new THREE.Vector3(0, 0, 1));
let raycaster = new THREE.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);
}
WorldToScreen(pt) {
let widthHalf = this._Width * 0.5;
let 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
*/
UpdateLockTarget() {
let renderList = this.m_Render.renderLists.get(this.m_Scene, this.m_Camera.Camera);
let box = GeUtils_1.GetBoxArr(renderList.opaque.map(o => o.object));
if (box)
this.m_LookTarget = box.getCenter(new THREE.Vector3());
else
this.m_LookTarget = GeUtils_1.cZeroVec;
}
Rotate(mouseMove) {
this.m_Camera.Rotate(mouseMove, this.m_LookTarget);
this.m_bNeedUpdate = true;
}
Pan(mouseMove) {
this.m_Camera.Pan(mouseMove);
this.m_bNeedUpdate = true;
}
Zoom(scale, center) {
this.m_Camera.Zoom(scale, center);
this.m_bNeedUpdate = true;
}
ZoomAll() {
this.m_Camera.ZoomExtensBox3(GeUtils_1.GetBox(this.m_Scene, true));
this.m_bNeedUpdate = true;
}
ViewToTop() {
this.m_Camera.LookAt(new THREE.Vector3(0, 0, -1));
this.m_bNeedUpdate = true;
}
ViewToFront() {
this.m_Camera.LookAt(new THREE.Vector3(0, 1, 0));
this.m_bNeedUpdate = true;
}
ViewToSwiso() {
this.m_Camera.LookAt(new THREE.Vector3(1, 1, -1));
this.m_bNeedUpdate = true;
}
}
exports.Viewer = Viewer;
//# sourceMappingURL=Viewer.js.map