|
@@ -597,6 +597,10 @@
|
|
|
siteModeOnlyMapVisi:12,//只能mapViewer可见
|
|
|
siteModelMapUnvisi:13,//只有mapViewer不可见
|
|
|
siteModeSideVisi:14,//只有侧面可见
|
|
|
+
|
|
|
+
|
|
|
+ layer1: 10,// 备用1
|
|
|
+ layer2: 15,// 备用2
|
|
|
},
|
|
|
|
|
|
renderOrders:{ //会影响到绘制、pick时的顺序。
|
|
@@ -63754,13 +63758,11 @@ void main() {
|
|
|
}
|
|
|
|
|
|
Potree.settings.sizeFitToLevel = true;//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
|
|
|
- Potree.loadPointCloudScene = function(sceneCode, done, onError){//对应4dkk的场景码
|
|
|
- Potree.loadDatasets((data)=>{
|
|
|
- var originDataset = data.find(e=>e.sceneCode == sceneCode);//只加载初始数据集
|
|
|
- var cloudPath = `${Potree.settings.urls.prefix}/${Potree.settings.webSite}/${sceneCode}/data/${sceneCode}/webcloud/cloud.js`;
|
|
|
- var timeStamp = originDataset.createTime ? originDataset.createTime.replace(/[^0-9]/ig,'') : ''; //每重算一次后缀随createTime更新一次
|
|
|
- //console.warn(dataset.sceneName, 'timeStamp', timeStamp)
|
|
|
- Potree.loadPointCloud(cloudPath, originDataset.sceneName , sceneCode, timeStamp, e => {
|
|
|
+ Potree.loadPointCloudScene = function(sceneCode, type, id, done, onError){//对应4dkk的场景码
|
|
|
+
|
|
|
+ let loadCloud = (cloudPath, sceneName, sceneCode, timeStamp, color)=>{
|
|
|
+
|
|
|
+ Potree.loadPointCloud(cloudPath, sceneName , sceneCode, timeStamp, e => {
|
|
|
let scene = viewer.scene;
|
|
|
let pointcloud = e.pointcloud;
|
|
|
let config = Potree.config.material;
|
|
@@ -63772,8 +63774,7 @@ void main() {
|
|
|
pointcloud.changePointSize(config.realPointSize); //material.size = config.pointSize;
|
|
|
pointcloud.changePointOpacity(1);
|
|
|
material.shape = Potree.PointShape.SQUARE;
|
|
|
- pointcloud.color = pointcloud.material.color = originDataset.color;
|
|
|
- pointcloud.dataset_id = originDataset.id;//供漫游点找到属于的dataset点云
|
|
|
+ color && (pointcloud.color = pointcloud.material.color = color);
|
|
|
pointcloud.timeStamp = timeStamp;
|
|
|
//transformPointcloud(pointcloud, originDataset)
|
|
|
scene.addPointCloud(pointcloud);
|
|
@@ -63797,10 +63798,23 @@ void main() {
|
|
|
viewer.dispatchEvent('allLoaded');
|
|
|
done(pointcloud);
|
|
|
},onError);
|
|
|
-
|
|
|
|
|
|
- }, sceneCode, onError);
|
|
|
-
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ if(type == 'laser'){
|
|
|
+ Potree.loadDatasets((data)=>{
|
|
|
+ let originDataset = data.find(e=>e.sceneCode == sceneCode);//只加载初始数据集
|
|
|
+ let timeStamp = originDataset.createTime ? originDataset.createTime.replace(/[^0-9]/ig,'') : ''; //每重算一次后缀随createTime更新一次
|
|
|
+ let cloudPath = `${Potree.settings.urls.prefix}/${Potree.settings.webSite}/${sceneCode}/data/${sceneCode}/webcloud/cloud.js`;
|
|
|
+ loadCloud(cloudPath, originDataset.sceneName, sceneCode, timeStamp, originDataset.color);
|
|
|
+ }, sceneCode, onError);
|
|
|
+
|
|
|
+ }else {//las or ply
|
|
|
+ let name = type + '|' + id;
|
|
|
+ let cloudPath = sceneCode + '/cloud.js';
|
|
|
+ loadCloud(cloudPath, name, name, '' );
|
|
|
+ }
|
|
|
|
|
|
};
|
|
|
|
|
@@ -63878,11 +63892,11 @@ void main() {
|
|
|
|
|
|
if(prop.isFirstLoad){
|
|
|
modelEditing = model;
|
|
|
- MergeEditor.setModelBtmHeight(model, 0); //默认离地高度为0
|
|
|
+ //MergeEditor.setModelBtmHeight(model, 0) //默认离地高度为0
|
|
|
viewer.addEventListener('global_mousemove', moveModel);
|
|
|
viewer.addEventListener('global_click', confirmPos, 3);
|
|
|
}else {
|
|
|
- MergeEditor.setModelBtmHeight(model, prop.bottom || 0); //默认离地高度为0
|
|
|
+ //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
|
|
|
modelEditing = null;
|
|
|
}
|
|
|
|
|
@@ -63892,35 +63906,61 @@ void main() {
|
|
|
}
|
|
|
|
|
|
|
|
|
- {//transform
|
|
|
+ /* {//transform --------维持离地高度和中心点的版本
|
|
|
+ let updateBound = ()=>{
|
|
|
+ model.updateMatrixWorld()
|
|
|
+ viewer.updateModelBound()
|
|
|
+ }
|
|
|
+ let maintainBtmZAndCenter = ()=>{
|
|
|
+ MergeEditor.maintainBoundXY(model)
|
|
|
+ MergeEditor.setModelBtmHeight(model)
|
|
|
+ updateBound()
|
|
|
+ model.dispatchEvent('transformChanged')
|
|
|
+ }
|
|
|
+ model.addEventListener('position_changed', ()=>{
|
|
|
+ updateBound()
|
|
|
+ MergeEditor.getBoundCenter(model);//更新boundcenter
|
|
|
+ MergeEditor.computeBtmHeight(model)
|
|
|
+ if(prop.bottomRange && (model.btmHeight > prop.bottomRange.max || model.btmHeight < prop.bottomRange.min)){
|
|
|
+ model.btmHeight = THREE.Math.clamp(model.btmHeight, prop.bottomRange.min, prop.bottomRange.max)
|
|
|
+ MergeEditor.setModelBtmHeight(model)
|
|
|
+ updateBound()
|
|
|
+ }
|
|
|
+ model.dispatchEvent('transformChanged')
|
|
|
+ })
|
|
|
+ model.addEventListener("rotation_changed", maintainBtmZAndCenter )
|
|
|
+ model.addEventListener("scale_changed", maintainBtmZAndCenter )
|
|
|
+ model.addEventListener('transformChanged', ()=>{
|
|
|
+ MergeEditor.modelTransformCallback(model)
|
|
|
+ })
|
|
|
+ //离地高度只是boundingbox在transform后的最低点的高度,而非模型transform后的最低点的高度,所以旋转过后看起来不太准确
|
|
|
+ } */
|
|
|
+
|
|
|
+ {//transform --------维持中心点的版本
|
|
|
let updateBound = ()=>{
|
|
|
model.updateMatrixWorld();
|
|
|
viewer.updateModelBound();
|
|
|
};
|
|
|
- let maintainBtmZAndCenter = ()=>{
|
|
|
- MergeEditor.maintainBoundXY(model);
|
|
|
- MergeEditor.setModelBtmHeight(model);
|
|
|
+ let maintainCenter = ()=>{
|
|
|
+ //MergeEditor.maintainBoundXY(model)
|
|
|
+ MergeEditor.maintainBoundCenter(model);
|
|
|
updateBound();
|
|
|
model.dispatchEvent('transformChanged');
|
|
|
};
|
|
|
model.addEventListener('position_changed', ()=>{
|
|
|
updateBound();
|
|
|
MergeEditor.getBoundCenter(model);//更新boundcenter
|
|
|
- MergeEditor.computeBtmHeight(model);
|
|
|
- if(prop.bottomRange && (model.btmHeight > prop.bottomRange.max || model.btmHeight < prop.bottomRange.min)){
|
|
|
- model.btmHeight = MathUtils.clamp(model.btmHeight, prop.bottomRange.min, prop.bottomRange.max);
|
|
|
- MergeEditor.setModelBtmHeight(model);
|
|
|
- updateBound();
|
|
|
- }
|
|
|
+
|
|
|
model.dispatchEvent('transformChanged');
|
|
|
});
|
|
|
- model.addEventListener("rotation_changed", maintainBtmZAndCenter );
|
|
|
- model.addEventListener("scale_changed", maintainBtmZAndCenter );
|
|
|
+ model.addEventListener("rotation_changed", maintainCenter );
|
|
|
+ model.addEventListener("scale_changed", maintainCenter );
|
|
|
model.addEventListener('transformChanged', ()=>{
|
|
|
MergeEditor.modelTransformCallback(model);
|
|
|
});
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
model.updateMatrixWorld();
|
|
|
viewer.updateModelBound();
|
|
|
|
|
@@ -63928,9 +63968,55 @@ void main() {
|
|
|
model.lastMatrixWorld = model.matrixWorld.clone();
|
|
|
done(model);
|
|
|
};
|
|
|
-
|
|
|
- if(prop.type == 'laser'){
|
|
|
- Potree.loadPointCloudScene(prop.url, (pointcloud)=>{
|
|
|
+
|
|
|
+ if(prop.type == 'glb'){
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let callback = (object)=>{
|
|
|
+ //focusOnSelect(object, 1000)
|
|
|
+ object.isModel = true;
|
|
|
+ //object.dataset_id = Date.now() //暂时
|
|
|
+
|
|
|
+ object.traverse(e=>e.material && (e.material.transparent = true));
|
|
|
+
|
|
|
+ /* object.addEventListener('click',(e)=>{
|
|
|
+ //只是为了能得到hoverElement识别才加这个侦听
|
|
|
+ }) */
|
|
|
+
|
|
|
+ loadDone(object);
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ let info = {
|
|
|
+ name: prop.type,
|
|
|
+ id: prop.id,
|
|
|
+ unlit:true,
|
|
|
+ /* transform : {
|
|
|
+ position : prop.position,
|
|
|
+ rotation : new THREE.Euler().setFromVector3(prop.rotation),
|
|
|
+ scale: new THREE.Vector3(prop.scale,prop.scale,prop.scale),
|
|
|
+ } */
|
|
|
+ };
|
|
|
+
|
|
|
+ if(prop.type == 'glb'){
|
|
|
+ info.glburl = prop.url;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ viewer.loadModel(info , callback, onProgress, onError);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }else {
|
|
|
+
|
|
|
+ //else if(prop.type == 'las' || prop.type == 'ply')
|
|
|
+
|
|
|
+ Potree.loadPointCloudScene(prop.url, prop.type, prop.modelId, (pointcloud)=>{
|
|
|
pointcloud.matrixAutoUpdate = true;
|
|
|
pointcloud.initialPosition = pointcloud.position.clone();
|
|
|
|
|
@@ -63965,54 +64051,9 @@ void main() {
|
|
|
}) */
|
|
|
|
|
|
}, onError);
|
|
|
- }else {
|
|
|
-
|
|
|
-
|
|
|
- let callback = (object)=>{
|
|
|
- //focusOnSelect(object, 1000)
|
|
|
- object.isModel = true;
|
|
|
- //object.dataset_id = Date.now() //暂时
|
|
|
-
|
|
|
- object.traverse(e=>e.material && (e.material.transparent = true));
|
|
|
-
|
|
|
- /* object.addEventListener('click',(e)=>{
|
|
|
- //只是为了能得到hoverElement识别才加这个侦听
|
|
|
- }) */
|
|
|
- /* let updateBound = ()=>{
|
|
|
- object.updateMatrixWorld()
|
|
|
- viewer.updateModelBound()
|
|
|
- object.dispatchEvent('transformChanged')
|
|
|
-
|
|
|
- }
|
|
|
- let maintainBtmZ = ()=>{
|
|
|
- MergeEditor.setModelBtmHeight(object)
|
|
|
- updateBound()
|
|
|
- }
|
|
|
- object.addEventListener('position_changed', updateBound )
|
|
|
- object.addEventListener("orientation_changed", maintainBtmZ )
|
|
|
- object.addEventListener("scale_changed", maintainBtmZ ) */
|
|
|
- loadDone(object);
|
|
|
- };
|
|
|
-
|
|
|
+
|
|
|
|
|
|
- let info = {
|
|
|
- name: prop.type,
|
|
|
- id: prop.id,
|
|
|
- unlit:true,
|
|
|
- /* transform : {
|
|
|
- position : prop.position,
|
|
|
- rotation : new THREE.Euler().setFromVector3(prop.rotation),
|
|
|
- scale: new THREE.Vector3(prop.scale,prop.scale,prop.scale),
|
|
|
- } */
|
|
|
- };
|
|
|
|
|
|
- if(prop.type == 'glb'){
|
|
|
- info.glburl = prop.url;
|
|
|
- }else {
|
|
|
- info.objurl = prop.url;
|
|
|
- info.mtlurl = prop.mtlurl;
|
|
|
- }
|
|
|
- viewer.loadModel(info , callback, onProgress, onError);
|
|
|
|
|
|
}
|
|
|
};
|
|
@@ -86091,7 +86132,7 @@ void main() {
|
|
|
['sceneObjects','mapObjects','measure', 'transformationTool', 'model'],
|
|
|
this.hoverViewport && this.hoverViewport.extraEnableLayers
|
|
|
);
|
|
|
-
|
|
|
+ //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
|
|
|
|
|
|
viewer.dispatchEvent( {type:'raycaster', viewport: this.hoverViewport});//add
|
|
|
let intersections = raycaster.intersectObjects(interactables.filter(o => o.visible), true); //原本是false 检测不到children
|
|
@@ -103165,6 +103206,12 @@ ENDSEC
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ changeTitle(title){
|
|
|
+ this.titleLabel.changeText(title);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
updateMatrixWorld(force){ //重写,只为了将root当做parent
|
|
|
|
|
|
this.updateMatrix();
|
|
@@ -103196,7 +103243,11 @@ ENDSEC
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
+ dispose(){
|
|
|
+ this.parent.remove(this);
|
|
|
+ this.titleLabel.dispatchEvent({type:'dispose'});
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
|
@@ -103221,6 +103272,17 @@ ENDSEC
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+ createTagFromData(data){
|
|
|
+ let tag = new Tag({
|
|
|
+ title: data.title, position: data.position, normal: data.normal,
|
|
|
+ root: data.root //e.intersect.pointcloud || e.intersect.object
|
|
|
+ });
|
|
|
+
|
|
|
+ return tag
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
startInsertion (args = {}, callback, cancelFun) {
|
|
@@ -103253,8 +103315,8 @@ ENDSEC
|
|
|
|
|
|
let tag = new Tag({
|
|
|
title: '1', position: localPos, normal:e.intersect.normal,
|
|
|
- root: e.intersect.pointcloud || e.intersect.object}
|
|
|
- );
|
|
|
+ root: e.intersect.pointcloud || e.intersect.object
|
|
|
+ });
|
|
|
|
|
|
//pointcloud里加一个normal 的非float32
|
|
|
|
|
@@ -115643,11 +115705,14 @@ ENDSEC
|
|
|
|
|
|
Object3D.call( this );
|
|
|
|
|
|
+
|
|
|
this.visible = false;
|
|
|
this.domElement = domElement;
|
|
|
|
|
|
var _gizmo = new TransformControlsGizmo(options);
|
|
|
this.add( _gizmo );
|
|
|
+ this._gizmo = _gizmo;
|
|
|
+
|
|
|
|
|
|
var _plane = new TransformControlsPlane(options);
|
|
|
this.add( _plane );
|
|
@@ -115811,6 +115876,22 @@ ENDSEC
|
|
|
return this;
|
|
|
|
|
|
};
|
|
|
+
|
|
|
+
|
|
|
+ /* this.hideAxis = function ( mode, axis=[] ) {//xzw add 设置不可见的axis
|
|
|
+
|
|
|
+ var handles = [];
|
|
|
+ handles = handles.concat( this._gizmo.picker[ mode ].children );
|
|
|
+ handles = handles.concat( this._gizmo.gizmo[ mode ].children );
|
|
|
+ handles = handles.concat( this._gizmo.helper[ mode ].children );
|
|
|
+ handles.forEach(e=>e.visible = false)
|
|
|
+ axis.forEach(name=>{
|
|
|
+ handles.filter(handle =>!handle.name.includes(name))
|
|
|
+ })
|
|
|
+ handles.forEach(e=>e.visible = true)
|
|
|
+ }; */
|
|
|
+
|
|
|
+
|
|
|
|
|
|
// Defined getter, setter and store for a property
|
|
|
function defineProperty( propName, defaultValue ) {
|
|
@@ -115868,7 +115949,15 @@ ENDSEC
|
|
|
this.camera.updateMatrixWorld();
|
|
|
this.camera.matrixWorld.decompose( cameraPosition, cameraQuaternion, cameraScale );
|
|
|
|
|
|
- eye.copy( cameraPosition ).sub( worldPosition ).normalize();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(this.camera.type == "OrthographicCamera"){//xzw add
|
|
|
+ eye.copy( this.view.direction);
|
|
|
+ }else {
|
|
|
+ eye.copy( cameraPosition ).sub( worldPosition ).normalize();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
Object3D.prototype.updateMatrixWorld.call( this );
|
|
|
|
|
@@ -115887,7 +115976,11 @@ ENDSEC
|
|
|
//ray.setFromCamera( pointer, this.camera ); //这句会在floorplan模式get不到intersect
|
|
|
let {origin, direction} = viewer.inputHandler.getMouseDirection();
|
|
|
ray.set(origin, direction);
|
|
|
-
|
|
|
+
|
|
|
+ viewer.setCameraLayers(ray, //设置能识别到的layers
|
|
|
+ ['sceneObjects','mapObjects','measure', 'transformationTool', 'model'],
|
|
|
+ viewer.inputHandler.hoverViewport && viewer.inputHandler.hoverViewport.extraEnableLayers
|
|
|
+ );
|
|
|
|
|
|
|
|
|
var intersect = ray.intersectObjects( _gizmo.picker[ this.mode ].children, true )[ 0 ] || false;
|
|
@@ -115916,6 +116009,14 @@ ENDSEC
|
|
|
//ray.setFromCamera( pointer, this.camera ); //这句会在floorplan模式get不到intersect
|
|
|
let {origin, direction} = viewer.inputHandler.getMouseDirection();
|
|
|
ray.set(origin, direction);
|
|
|
+
|
|
|
+ viewer.setCameraLayers(ray, //设置能识别到的layers
|
|
|
+ ['sceneObjects','mapObjects','measure', 'transformationTool', 'model'],
|
|
|
+ viewer.inputHandler.hoverViewport && viewer.inputHandler.hoverViewport.extraEnableLayers
|
|
|
+ );
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
var planeIntersect = ray.intersectObjects( [ _plane ], true )[ 0 ] || false;
|
|
|
|
|
|
if ( planeIntersect ) {
|
|
@@ -115994,6 +116095,13 @@ ENDSEC
|
|
|
let {origin, direction} = viewer.inputHandler.getMouseDirection();
|
|
|
ray.set(origin, direction);
|
|
|
|
|
|
+ viewer.setCameraLayers(ray, //设置能识别到的layers
|
|
|
+ ['sceneObjects','mapObjects','measure', 'transformationTool', 'model'],
|
|
|
+ viewer.inputHandler.hoverViewport && viewer.inputHandler.hoverViewport.extraEnableLayers
|
|
|
+ );
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
var planeIntersect = ray.intersectObjects( [ _plane ], true )[ 0 ] || false;
|
|
|
|
|
|
if ( planeIntersect === false ) return;
|
|
@@ -116429,7 +116537,7 @@ ENDSEC
|
|
|
this.type = 'TransformControlsGizmo';
|
|
|
|
|
|
// shared materials
|
|
|
-
|
|
|
+ this.hideAxis = {};
|
|
|
var gizmoMaterial = new MeshBasicMaterial( {
|
|
|
depthTest: false,
|
|
|
depthWrite: false,
|
|
@@ -116451,7 +116559,7 @@ ENDSEC
|
|
|
matInvisible.opacity = 0.15;
|
|
|
|
|
|
var matHelper = gizmoMaterial.clone();
|
|
|
- matHelper.opacity = 0.33;
|
|
|
+ matHelper.opacity = 0.1;
|
|
|
|
|
|
var matRed = gizmoMaterial.clone();
|
|
|
matRed.color.set( 0xff0000 );
|
|
@@ -116884,24 +116992,26 @@ ENDSEC
|
|
|
for ( var i = 0; i < handles.length; i ++ ) {
|
|
|
|
|
|
var handle = handles[ i ];
|
|
|
+ //add
|
|
|
+ if(this.hideAxis[this.mode] && this.hideAxis[this.mode].some(e=>handle.name.includes(e.toUpperCase()))){
|
|
|
+ viewer.updateVisible(handle, 'hidden', false);
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
let visible = true;
|
|
|
// hide aligned to camera
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
|
|
|
handle.rotation.set( 0, 0, 0 );
|
|
|
handle.position.copy( this.worldPosition );
|
|
|
|
|
|
- var eyeDistance = this.worldPosition.distanceTo( this.cameraPosition );
|
|
|
-
|
|
|
- //俯视图的透视和距离无关,因此在两种相机切换切换时大小过渡比较困难
|
|
|
- /* if(player.mode == "transitioning" && (player.modeTran.split('-')[0] == "floorplan" || player.modeTran.split('-')[1] == "floorplan")){
|
|
|
- eyeDistance = Math.min(eyeDistance, 6.5)//从一开始很小的距离过渡到俯视图50的高度,会变得很大。
|
|
|
- }else if(player.mode == "floorplan"){
|
|
|
- var flcamera = player.cameraControls.cameras.floorplan;
|
|
|
- eyeDistance = (flcamera.right - flcamera.left ) / flcamera.aspect ;
|
|
|
- }
|
|
|
- */
|
|
|
+
|
|
|
+ if(this.camera.type == "OrthographicCamera"){
|
|
|
+ var eyeDistance = 800 / this.camera.zoom;
|
|
|
+ }else {
|
|
|
+ var eyeDistance = this.worldPosition.distanceTo( this.cameraPosition );
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
handle.scale.set( 1, 1, 1 ).multiplyScalar( eyeDistance * this.size / 7 );
|
|
|
|
|
@@ -117484,7 +117594,10 @@ ENDSEC
|
|
|
const texLoader$8 = new TextureLoader();
|
|
|
texLoader$8.crossOrigin = "anonymous";
|
|
|
|
|
|
-
|
|
|
+ const edgeStrengths = {
|
|
|
+ pointcloud: 4,
|
|
|
+ glb: 100
|
|
|
+ };
|
|
|
const viewportProps$1 = [{
|
|
|
left:0,
|
|
|
bottom:0,
|
|
@@ -117547,7 +117660,7 @@ ENDSEC
|
|
|
|
|
|
this.transformControls = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{
|
|
|
|
|
|
- dontHideWhenFaceCamera: true,
|
|
|
+ //dontHideWhenFaceCamera: true,
|
|
|
/* scaleAxis: ["x", "y"],
|
|
|
//隐藏了z轴。虽然参数没用上
|
|
|
NoScaleZ: true //整体缩放时只缩放xy轴。 */
|
|
@@ -117556,6 +117669,28 @@ ENDSEC
|
|
|
this.transformControls.setSize(1.5);
|
|
|
viewer.scene.scene.add(this.transformControls);
|
|
|
|
|
|
+ //右屏
|
|
|
+ this.transformControls2 = new TransformControls(viewer.mainViewport.camera, viewer.renderArea,{
|
|
|
+ });
|
|
|
+ this.transformControls.setSize(1.5);
|
|
|
+ viewer.scene.scene.add(this.transformControls2);
|
|
|
+ viewer.setObjectLayers(this.transformControls2, 'layer2' );
|
|
|
+
|
|
|
+ let mouseDown = (e)=>{
|
|
|
+ if(this.split && this.selected.isPointcloud){
|
|
|
+ viewer.outlinePass.edgeStrength = 0;//暂时消失线
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let mouseUp = (e)=>{
|
|
|
+ if(this.split && this.selected.isPointcloud){
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ this.transformControls.addEventListener('mouseDown',mouseDown);
|
|
|
+ this.transformControls2.addEventListener('mouseDown',mouseDown);
|
|
|
+ this.transformControls.addEventListener('mouseUp',mouseUp);
|
|
|
+ this.transformControls2.addEventListener('mouseUp',mouseUp);
|
|
|
+
|
|
|
|
|
|
}
|
|
|
|
|
@@ -117619,8 +117754,11 @@ ENDSEC
|
|
|
if(e.type == 'global_mousedown' ){ //开始
|
|
|
//if((e.intersect.object || e.intersect.pointcloud) == this.selected){
|
|
|
if(e.intersect.pointclouds.includes(this.selected) || e.intersect.allElements.some(e=>e.object == this.selected)){
|
|
|
-
|
|
|
- dragInfo = {};
|
|
|
+
|
|
|
+ dragInfo = {};
|
|
|
+ if(this.selected.isPointcloud){
|
|
|
+ viewer.outlinePass.edgeStrength = 0;//暂时消失线
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -117662,7 +117800,17 @@ ENDSEC
|
|
|
viewer.addEventListener('global_mousedown', drag);
|
|
|
viewer.addEventListener('global_drag', drag, 10);
|
|
|
viewer.addEventListener('global_mousemove', (e)=>{
|
|
|
- if(this.split && this.transformState && !e.drag && (e.hoverViewport.name == 'top' || this.transformState == 'translate')){
|
|
|
+ if(this.split && this.transformState && !e.drag && (e.hoverViewport.name == 'top' || this.transformState == 'translate')){
|
|
|
+
|
|
|
+ /* if(this.lastHoverViewport != e.hoverViewport){
|
|
|
+ this.lastHoverViewport = e.hoverViewport
|
|
|
+ this.transformControls.view = e.hoverViewport.view
|
|
|
+ this.transformControls.camera = e.hoverViewport.camera
|
|
|
+ this.transformControls.hideAxis( this.transformState, e.hoverViewport.name == 'top' ? [z] : [x,y]);
|
|
|
+ } */
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
let mouseover = e.intersect.pointclouds.includes(this.selected) || e.intersect.allElements.some(e=>e.object == this.selected);
|
|
|
//let mouseover = (e.intersect.object || e.intersect.pointcloud) == this.selected
|
|
@@ -117678,13 +117826,19 @@ ENDSEC
|
|
|
}
|
|
|
}else {
|
|
|
this.clearTranCursor();
|
|
|
- }
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
viewer.addEventListener('global_drop', (e)=>{
|
|
|
dragInfo = null;
|
|
|
this.clearTranCursor();
|
|
|
+
|
|
|
+ if(this.selected.isPointcloud){
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;
|
|
|
+ }
|
|
|
+
|
|
|
});
|
|
|
|
|
|
}
|
|
@@ -117726,6 +117880,19 @@ ENDSEC
|
|
|
viewer.setControls(viewer.fpControls);
|
|
|
viewer.viewports.find(e=>e.name == 'right').rotateSide = true;
|
|
|
viewer.viewports.find(e=>e.name == 'top').alignment = true;
|
|
|
+
|
|
|
+
|
|
|
+ viewer.viewports[1].layersAdd('layer2');
|
|
|
+ viewer.viewports[0].layersAdd('layer1');
|
|
|
+ viewer.setObjectLayers(this.transformControls, 'layer1' );
|
|
|
+ this.transformControls.view = viewer.viewports[0].view;
|
|
|
+ this.transformControls.camera = viewer.viewports[0].camera;
|
|
|
+ this.transformControls._gizmo.hideAxis = {translate:['z'], rotate:['x','y','z'] };
|
|
|
+ this.transformControls2.view = viewer.viewports[1].view;
|
|
|
+ this.transformControls2.camera = viewer.viewports[1].camera;
|
|
|
+ this.transformControls2._gizmo.hideAxis = {translate:['x','y'], rotate:['x','y','z'] };
|
|
|
+
|
|
|
+
|
|
|
|
|
|
},
|
|
|
|
|
@@ -117739,6 +117906,13 @@ ENDSEC
|
|
|
this.showModelOutline(this.selected, true)
|
|
|
this.selected.material.activeAttributeName = "rgba"
|
|
|
} */
|
|
|
+ this.transformControls.camera = viewer.viewports[0].camera;
|
|
|
+ this.transformControls.view = viewer.viewports[0].view;
|
|
|
+ this.transformControls._gizmo.hideAxis = {};
|
|
|
+ viewer.setObjectLayers(this.transformControls, 'sceneObjects' ); //恢复
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
},
|
|
|
|
|
|
rotateSideCamera(angle){
|
|
@@ -117806,9 +117980,9 @@ ENDSEC
|
|
|
this.showModelOutline(model);
|
|
|
|
|
|
if(model.isPointcloud){
|
|
|
- viewer.outlinePass.edgeStrength = 4;
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;
|
|
|
}else {
|
|
|
- viewer.outlinePass.edgeStrength = 100;
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.glb;
|
|
|
}
|
|
|
//console.log('selectModel', model)
|
|
|
|
|
@@ -117854,26 +118028,7 @@ ENDSEC
|
|
|
}
|
|
|
},
|
|
|
|
|
|
- /* focusOn(object, duration = 400){
|
|
|
- let boundingBox = object.boundingBox.clone().applyMatrix4(object.matrixWorld)
|
|
|
- let center = boundingBox.getCenter(new THREE.Vector3)
|
|
|
- let size = boundingBox.getSize(new THREE.Vector3)
|
|
|
- let maxSize = size.length() //对角线长度
|
|
|
-
|
|
|
- if(object.isPointcloud){
|
|
|
- maxSize /= 2
|
|
|
- }
|
|
|
-
|
|
|
- let hfov = cameraLight.getHFOVForCamera(viewer.mainViewport.camera,true)
|
|
|
- let minRadius = maxSize / Math.tan(hfov/2)
|
|
|
- //viewer.mainViewport.view.lookAt(center)
|
|
|
- viewer.mainViewport.view.setView({
|
|
|
- position: center.clone().sub(viewer.mainViewport.view.direction.clone().multiplyScalar(minRadius)),
|
|
|
- target: center,
|
|
|
- duration
|
|
|
- }) //setView can cancel bump
|
|
|
-
|
|
|
- }, */
|
|
|
+
|
|
|
focusOn(objects, duration = 400, fitBound=true, dontLookUp){
|
|
|
if(!(objects instanceof Array)){
|
|
|
objects = [objects];
|
|
@@ -117905,9 +118060,18 @@ ENDSEC
|
|
|
|
|
|
viewer.mainViewport.view.radius = viewer.mainViewport.camera.position.distanceTo(position);
|
|
|
//为了不改画面,不调节方向了,只能调调radius,一定程度将target靠近model
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ moveBoundCenterTo(model,pos){ //使boundCenter在所要的位置
|
|
|
+ let diff = new Vector3().subVectors(pos, model.boundCenter);
|
|
|
+ model.position.add(diff);
|
|
|
+ },
|
|
|
+
|
|
|
+ getBoundCenter(model){
|
|
|
+ if(!model.boundCenter) model.boundCenter = new Vector3;
|
|
|
+ model.boundingBox.getCenter(model.boundCenter).applyMatrix4(model.matrixWorld);
|
|
|
},
|
|
|
|
|
|
setModelBtmHeight(model, z ){
|
|
@@ -117932,6 +118096,7 @@ ENDSEC
|
|
|
model.btmHeight = center.z - size.z / 2;
|
|
|
},
|
|
|
|
|
|
+
|
|
|
maintainBoundXY(model){ //在旋转和缩放后,立即执行这个函数,使boundCenter保持原位
|
|
|
|
|
|
model.updateMatrixWorld();
|
|
@@ -117941,23 +118106,21 @@ ENDSEC
|
|
|
let diff = new Vector2$1().subVectors(center1,center2);
|
|
|
model.position.x += diff.x;
|
|
|
model.position.y += diff.y;
|
|
|
- /* model.updateMatrixWorld()
|
|
|
- this.getBoundCenter(model)//再次更新,它需要和center1相同 */
|
|
|
model.boundCenter.copy(center1);
|
|
|
- },
|
|
|
+ },
|
|
|
+
|
|
|
|
|
|
- moveBoundCenterTo(model,pos){ //使boundCenter在所要的位置
|
|
|
- let diff = new Vector3().subVectors(pos, model.boundCenter);
|
|
|
- model.position.add(diff);
|
|
|
- },
|
|
|
|
|
|
- getBoundCenter(model){
|
|
|
- if(!model.boundCenter) model.boundCenter = new Vector3;
|
|
|
- model.boundingBox.getCenter(model.boundCenter).applyMatrix4(model.matrixWorld);
|
|
|
+ maintainBoundCenter(model){
|
|
|
+ model.updateMatrixWorld();
|
|
|
+ let center1 = model.boundCenter.clone();//还未更新的
|
|
|
+ this.getBoundCenter(model);//更新
|
|
|
+ let center2 = model.boundCenter.clone();
|
|
|
+ let diff = new Vector3().subVectors(center1,center2);
|
|
|
+ model.position.add(diff);
|
|
|
+ model.boundCenter.copy(center1);
|
|
|
},
|
|
|
|
|
|
-
|
|
|
-
|
|
|
modelTransformCallback(model){
|
|
|
|
|
|
model.updateMatrixWorld();
|
|
@@ -125502,7 +125665,12 @@ ENDSEC
|
|
|
|
|
|
render: function (scenes, camera, viewports, renderer, writeBuffer, readBuffer, maskActive, renderFun ) {
|
|
|
if(!(scenes instanceof Array))scenes = [scenes];
|
|
|
- if ( this.selectedObjects.length > 0 ) {
|
|
|
+
|
|
|
+ if(this.edgeStrength == 0){
|
|
|
+ console.log('this.edgeStrength == 0');
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( this.selectedObjects.length > 0 && this.edgeStrength > 0) {
|
|
|
|
|
|
let render2 = (target, dontRenderRtEDL=true)=>{
|
|
|
if(renderFun){
|
|
@@ -125513,8 +125681,12 @@ ENDSEC
|
|
|
scenes.forEach(scene=>renderer.render( scene, camera));
|
|
|
}
|
|
|
};
|
|
|
- viewports.forEach(e=> e.beforeRender = ()=>{
|
|
|
- this.replaceDepthToViewZ( e.camera );
|
|
|
+ viewports.forEach(e=>{
|
|
|
+ e.oldBeforeRender = e.beforeRender;
|
|
|
+ e.beforeRender = ()=>{
|
|
|
+ e.oldBeforeRender && e.oldBeforeRender();
|
|
|
+ this.replaceDepthToViewZ( e.camera );
|
|
|
+ };
|
|
|
});
|
|
|
|
|
|
|
|
@@ -125549,10 +125721,13 @@ ENDSEC
|
|
|
this.changeVisibilityOfSelectedObjects( true );
|
|
|
|
|
|
|
|
|
- viewports.forEach(e=> e.beforeRender = ()=>{
|
|
|
- // Update Texture Matrix for Depth compare
|
|
|
- this.updateTextureMatrix(e.camera);
|
|
|
- this.prepareMaskMaterial.uniforms[ "cameraNearFar" ].value = new Vector2$1( e.camera.near, e.camera.far );
|
|
|
+ viewports.forEach(e=>{
|
|
|
+ e.beforeRender = ()=>{
|
|
|
+ e.oldBeforeRender && e.oldBeforeRender();
|
|
|
+ // Update Texture Matrix for Depth compare
|
|
|
+ this.updateTextureMatrix(e.camera);
|
|
|
+ this.prepareMaskMaterial.uniforms[ "cameraNearFar" ].value = new Vector2$1( e.camera.near, e.camera.far );
|
|
|
+ };
|
|
|
});
|
|
|
|
|
|
|
|
@@ -125575,7 +125750,7 @@ ENDSEC
|
|
|
//renderer.render( scene, camera/* , this.renderTargetMaskBuffer, true */ );
|
|
|
render2(this.renderTargetMaskBuffer);
|
|
|
|
|
|
- viewports.forEach((e)=>{e.beforeRender = null;});
|
|
|
+ viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});
|
|
|
|
|
|
this.changeVisibilityOfNonSelectedObjects( true , scenes);
|
|
|
|
|
@@ -129025,7 +129200,7 @@ ENDSEC
|
|
|
|
|
|
render(params={}){//add params
|
|
|
if(Potree.measureTimings) performance.mark("render-start");
|
|
|
- if(this.outlinePass.selectedObjects.length && !params.screenshot){
|
|
|
+ if(this.outlinePass.selectedObjects.length && this.outlinePass.edgeStrength > 0 && !params.screenshot){
|
|
|
this.composer.render(this.inputHandler.interactiveScenes.concat(this.scene.scene).concat(viewer.scene.scenePointCloud), null, this.viewports, this.renderDefault.bind(this));
|
|
|
}else {
|
|
|
this.renderDefault(params);
|