|
@@ -793,7 +793,7 @@
|
|
intersectOnObjs:false,
|
|
intersectOnObjs:false,
|
|
intersectWhenHover:true,
|
|
intersectWhenHover:true,
|
|
|
|
|
|
-
|
|
|
|
|
|
+ notAdditiveBlending:false, //点云是否使用普通的blend, 否则会曝光过渡
|
|
precision:2 // 两位小数
|
|
precision:2 // 两位小数
|
|
};
|
|
};
|
|
|
|
|
|
@@ -63893,19 +63893,7 @@ void main() {
|
|
if(prop.scale){
|
|
if(prop.scale){
|
|
model.scale.set(prop.scale,prop.scale,prop.scale);
|
|
model.scale.set(prop.scale,prop.scale,prop.scale);
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
- if(prop.isFirstLoad){
|
|
|
|
- modelEditing = model;
|
|
|
|
- //MergeEditor.setModelBtmHeight(model, 0) //默认离地高度为0
|
|
|
|
- viewer.addEventListener('global_mousemove', moveModel);
|
|
|
|
- viewer.addEventListener('global_click', confirmPos, 3);
|
|
|
|
- }else {
|
|
|
|
- //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
|
|
|
|
- modelEditing = null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+
|
|
if(model.isPointcloud){
|
|
if(model.isPointcloud){
|
|
model.renderOrder = Potree.config.renderOrders.model; //same as glb
|
|
model.renderOrder = Potree.config.renderOrders.model; //same as glb
|
|
}
|
|
}
|
|
@@ -63971,9 +63959,37 @@ void main() {
|
|
|
|
|
|
MergeEditor.getBoundCenter(model); //初始化
|
|
MergeEditor.getBoundCenter(model); //初始化
|
|
model.lastMatrixWorld = model.matrixWorld.clone();
|
|
model.lastMatrixWorld = model.matrixWorld.clone();
|
|
- done(model);
|
|
|
|
|
|
+
|
|
|
|
+ done(model); // 先发送成功,因为2d界面会随机执行changePosition等初始化,然后这边再将模型移到中心地面上
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(prop.isFirstLoad){
|
|
|
|
+
|
|
|
|
+ MergeEditor.moveBoundCenterTo(model, new Vector3(0,0,0));
|
|
|
|
+ MergeEditor.setModelBtmHeight(model, 0); //初始加载设置离地高度为0
|
|
|
|
+
|
|
|
|
+ if(prop.mode != 'single'){//如果不是模型展示页,模型会随着鼠标位置移动
|
|
|
|
+ viewer.addEventListener('global_mousemove', moveModel);
|
|
|
|
+ viewer.addEventListener('global_click', confirmPos, 3);
|
|
|
|
+ modelEditing = model;
|
|
|
|
+ }
|
|
|
|
+ model.dispatchEvent("position_changed");
|
|
|
|
+ }else {
|
|
|
|
+ //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
|
|
|
|
+ modelEditing = null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
if(prop.type == 'glb'){
|
|
if(prop.type == 'glb'){
|
|
|
|
|
|
|
|
|
|
@@ -71846,7 +71862,7 @@ void main() {
|
|
|
|
|
|
let node = stack.pop();
|
|
let node = stack.pop();
|
|
|
|
|
|
- if (node instanceof PointCloudTree) {
|
|
|
|
|
|
+ if (node instanceof PointCloudTree) {
|
|
octrees.push(node);
|
|
octrees.push(node);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -72385,12 +72401,15 @@ void main() {
|
|
|
|
|
|
if(params.notAdditiveBlending){
|
|
if(params.notAdditiveBlending){
|
|
gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); //NormalBlending
|
|
gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA ); //NormalBlending
|
|
|
|
+ gl.enable(gl.DEPTH_TEST);
|
|
|
|
+ gl.depthMask(true); //如果不开启depthWrite,深度会错乱。
|
|
}else {
|
|
}else {
|
|
gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending 原本
|
|
gl.blendFunc(gl.SRC_ALPHA, gl.ONE); //AdditiveBlending 原本
|
|
- }
|
|
|
|
|
|
+ gl.disable(gl.DEPTH_TEST);
|
|
|
|
+ gl.depthMask(false);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
- gl.depthMask(false);
|
|
|
|
- gl.disable(gl.DEPTH_TEST);
|
|
|
|
} else {
|
|
} else {
|
|
gl.disable(gl.BLEND);
|
|
gl.disable(gl.BLEND);
|
|
gl.depthMask(true);
|
|
gl.depthMask(true);
|
|
@@ -72733,11 +72752,42 @@ void main() {
|
|
// camera.matrixWorldInverse.invert(camera.matrixWorld);
|
|
// camera.matrixWorldInverse.invert(camera.matrixWorld);
|
|
|
|
|
|
const traversalResult = this.traverse(scene);
|
|
const traversalResult = this.traverse(scene);
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ //排序
|
|
|
|
+ if(Potree.settings.notAdditiveBlending){//add
|
|
|
|
+
|
|
|
|
+ traversalResult.octrees.forEach(tree=>{
|
|
|
|
+ if(tree.material.opacity==1){
|
|
|
|
+ tree._z = Infinity; //不透明的先渲染
|
|
|
|
+ }else {
|
|
|
|
+ let center = tree.boundCenter ? tree.boundCenter.clone() : tree.boundingBox.getCenter(tree.boundCenter).applyMatrix4(tree.matrixWorld);
|
|
|
|
+ center.project(camera);
|
|
|
|
+ tree._z = center.z;
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ traversalResult.octrees.sort((tree1,tree2)=>{
|
|
|
|
+ return tree2._z - tree1._z //降序 (-1 朝外)。 离屏幕近的后渲染
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
// RENDER
|
|
// RENDER
|
|
for (const octree of traversalResult.octrees) {
|
|
for (const octree of traversalResult.octrees) {
|
|
let nodes = octree.visibleNodes;
|
|
let nodes = octree.visibleNodes;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /* nodes.sort((node1,node2)=>{//姑且
|
|
|
|
+
|
|
|
|
+ let center = node.getBoundingSphere().center.clone().applyMatrix4(octree.matrixWorld)
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }) */
|
|
|
|
+
|
|
this.renderOctree(octree, nodes, camera, target, params);
|
|
this.renderOctree(octree, nodes, camera, target, params);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -74989,7 +75039,7 @@ void main() {
|
|
percent = 0;
|
|
percent = 0;
|
|
hasPlayedTime += e.delta;
|
|
hasPlayedTime += e.delta;
|
|
transitionRatio = startTransitionRatio;
|
|
transitionRatio = startTransitionRatio;
|
|
- console.log('延迟开始');
|
|
|
|
|
|
+ //console.log('延迟开始')
|
|
if(hasPlayedTime > startDelay){
|
|
if(hasPlayedTime > startDelay){
|
|
tStart = performance.now();
|
|
tStart = performance.now();
|
|
}
|
|
}
|
|
@@ -75024,7 +75074,7 @@ void main() {
|
|
this.pause();
|
|
this.pause();
|
|
}else {
|
|
}else {
|
|
hasStoppedTime += e.delta;
|
|
hasStoppedTime += e.delta;
|
|
- console.log('延迟结束');
|
|
|
|
|
|
+ //console.log('延迟结束')
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -78445,7 +78495,7 @@ void main() {
|
|
|
|
|
|
viewer.setCameraLayers(o.camera, ['measure']);
|
|
viewer.setCameraLayers(o.camera, ['measure']);
|
|
|
|
|
|
- if(o.screenshot){ //抗锯齿
|
|
|
|
|
|
+ if(o.screenshot && this.viewer.ssaaRenderPass.enabled){ //抗锯齿
|
|
this.viewer.ssaaRenderPass.sampleLevel = 4;
|
|
this.viewer.ssaaRenderPass.sampleLevel = 4;
|
|
this.viewer.composer.render(this.scene, o.camera );
|
|
this.viewer.composer.render(this.scene, o.camera );
|
|
/* viewer.scene.measurements.forEach(e=>{ //隐藏除了label以外的
|
|
/* viewer.scene.measurements.forEach(e=>{ //隐藏除了label以外的
|
|
@@ -80112,7 +80162,7 @@ void main() {
|
|
this.dom = $('<div name="compass"></div>');
|
|
this.dom = $('<div name="compass"></div>');
|
|
$(viewer.renderArea).append(this.dom);
|
|
$(viewer.renderArea).append(this.dom);
|
|
}
|
|
}
|
|
- this.dom.css({ display:"none", position:"absolute",right:"2%",top: "4%",width:width+"px",height:height+"px", "z-index":100,"pointer-events":"none" });
|
|
|
|
|
|
+ this.dom.css({ display:"none", position:"absolute",right:"1%",top: "60px",width:width+"px",height:height+"px", "z-index":100,"pointer-events":"none" });
|
|
|
|
|
|
let child = $("<div class='dirText north'><span>"+/* (config.lang=='zh'? */'北'/* :'N') */+"</span></div><div class='center'></div>");
|
|
let child = $("<div class='dirText north'><span>"+/* (config.lang=='zh'? */'北'/* :'N') */+"</span></div><div class='center'></div>");
|
|
this.dom.append(child);
|
|
this.dom.append(child);
|
|
@@ -80174,7 +80224,7 @@ void main() {
|
|
}
|
|
}
|
|
|
|
|
|
this.dom.find(".center")[0].appendChild(this.renderer.domElement);
|
|
this.dom.find(".center")[0].appendChild(this.renderer.domElement);
|
|
-
|
|
|
|
|
|
+ this.renderer.domElement.style.width = this.renderer.domElement.style.height = '100%';
|
|
|
|
|
|
|
|
|
|
this.camera = new PerspectiveCamera;
|
|
this.camera = new PerspectiveCamera;
|
|
@@ -80222,7 +80272,7 @@ void main() {
|
|
set(1,color1); set(5,color1);set(6,color1);
|
|
set(1,color1); set(5,color1);set(6,color1);
|
|
set(2,mid); set(3,mid);set(7,mid);
|
|
set(2,mid); set(3,mid);set(7,mid);
|
|
set(4,color2); set(8,color2);set(9,color2);
|
|
set(4,color2); set(8,color2);set(9,color2);
|
|
- geometry.addAttribute("color", new BufferAttribute(new Float32Array(colors), 3));
|
|
|
|
|
|
+ geometry.setAttribute("color", new BufferAttribute(new Float32Array(colors), 3));
|
|
};
|
|
};
|
|
var blue1 = [1/255,238/255,245/255]; //逐渐变深
|
|
var blue1 = [1/255,238/255,245/255]; //逐渐变深
|
|
var blue2 = [20/255,146/255,170/255];
|
|
var blue2 = [20/255,146/255,170/255];
|
|
@@ -80332,7 +80382,14 @@ void main() {
|
|
var dir = this.viewport.view.direction; //相机朝向
|
|
var dir = this.viewport.view.direction; //相机朝向
|
|
this.camera.position.copy(dir.multiplyScalar(radius).negate()); //相机绕着指南针中心(000)转动
|
|
this.camera.position.copy(dir.multiplyScalar(radius).negate()); //相机绕着指南针中心(000)转动
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ changeViewport(viewport){
|
|
|
|
+ this.viewport = viewport;
|
|
|
|
+ this.update(); //因相机更新了
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
render(){
|
|
render(){
|
|
this.renderer.render(this.scene, this.camera);
|
|
this.renderer.render(this.scene, this.camera);
|
|
}
|
|
}
|
|
@@ -80353,12 +80410,13 @@ void main() {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
setDomPos(){
|
|
setDomPos(){
|
|
if(!this.viewport)return
|
|
if(!this.viewport)return
|
|
let right = this.viewport.left + this.viewport.width;
|
|
let right = this.viewport.left + this.viewport.width;
|
|
- this.dom.css({'right':((1-right)*100 + 2) + '%'});
|
|
|
|
-
|
|
|
|
- //this.dom.css({'right':'none','left':config.isMobile? "1%" : "2%"})
|
|
|
|
|
|
+ this.dom.css({'right':((1-right)*100 + 1) + '%'});
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -80848,7 +80906,10 @@ void main() {
|
|
}
|
|
}
|
|
if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
|
|
if(Potree.settings.intersectOnObjs){// model也要渲染到rtEDL
|
|
camera.layers.set(Potree.config.renderLayers.model);
|
|
camera.layers.set(Potree.config.renderLayers.model);
|
|
|
|
+ viewer.objs.traverse(e=>{if(e.material)e._OlddepthWrite = e.material.depthWrite, e.material.depthWrite = true;}); //否则半透明的mesh无法遮住测量线
|
|
viewer.renderer.render(viewer.scene.scene, camera);
|
|
viewer.renderer.render(viewer.scene.scene, camera);
|
|
|
|
+ viewer.objs.traverse(e=>{if(e.material)e.material.depthWrite = e._OlddepthWrite;});
|
|
|
|
+ //缺点:半透明的model 就算完全透明, 也会遮住测量线
|
|
}
|
|
}
|
|
//test
|
|
//test
|
|
/* {
|
|
/* {
|
|
@@ -80913,14 +80974,12 @@ void main() {
|
|
}else {
|
|
}else {
|
|
//渲染点云 (直接用rtEDL上的会失去抗锯齿)
|
|
//渲染点云 (直接用rtEDL上的会失去抗锯齿)
|
|
|
|
|
|
- let prop = {
|
|
|
|
- shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
|
- clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume))
|
|
|
|
- };
|
|
|
|
- if(Potree.settings.editType == 'merge'){//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
|
|
|
|
- prop.depthTest = prop.depthWrite = true;
|
|
|
|
- prop.notAdditiveBlending = true;
|
|
|
|
- }
|
|
|
|
|
|
+ let prop = {
|
|
|
|
+ shadowMaps: lights.length > 0 ? [this.shadowMap] : null,
|
|
|
|
+ clipSpheres: viewer.scene.volumes.filter(v => (v instanceof SphereVolume)) ,
|
|
|
|
+ notAdditiveBlending: Potree.settings.notAdditiveBlending//add 否则透明的点云会挡住后面的模型。 加上这句后竟然透明不会叠加了!
|
|
|
|
+ };
|
|
|
|
+
|
|
viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);
|
|
viewer.pRenderer.render(viewer.scene.scenePointCloud, camera, null , prop);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -81527,15 +81586,9 @@ void main() {
|
|
};
|
|
};
|
|
|
|
|
|
let endPosition = new Vector3().copy(info.position);
|
|
let endPosition = new Vector3().copy(info.position);
|
|
-
|
|
|
|
- const startPosition = this.position.clone();
|
|
|
|
- const startTarget = this.getPivot();
|
|
|
|
- let startQuaternion = math.getQuaFromPosAim(startPosition,startTarget);
|
|
|
|
-
|
|
|
|
- let endTarget = null, endQuaternion ;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ let startPosition = this.position.clone();
|
|
|
|
+ let startQuaternion, endQuaternion, endTarget = null ;
|
|
|
|
+
|
|
|
|
|
|
if(info.target ){
|
|
if(info.target ){
|
|
endTarget = new Vector3().copy(info.target);
|
|
endTarget = new Vector3().copy(info.target);
|
|
@@ -81544,7 +81597,14 @@ void main() {
|
|
endQuaternion = info.quaternion.clone();
|
|
endQuaternion = info.quaternion.clone();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+ if(endQuaternion){
|
|
|
|
+ startQuaternion = new Quaternion().setFromEuler(this.rotation);
|
|
|
|
+ /* const startTarget = this.getPivot();
|
|
|
|
+ let startQuaternion = math.getQuaFromPosAim(startPosition,startTarget) */
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
if(!info.duration){
|
|
if(!info.duration){
|
|
this.position.copy(endPosition);
|
|
this.position.copy(endPosition);
|
|
this.restrictPos();
|
|
this.restrictPos();
|
|
@@ -85672,7 +85732,7 @@ void main() {
|
|
|
|
|
|
// check for a click
|
|
// check for a click
|
|
|
|
|
|
- if(pressDistance < Potree.config.clickMaxDragDis && pressTime<Potree.config.clickMaxPressTime){
|
|
|
|
|
|
+ if(pressDistance < Potree.config.clickMaxDragDis && pressTime<Potree.config.clickMaxPressTime && !e.unableClick){
|
|
let clickElement;
|
|
let clickElement;
|
|
if(this.hoveredElements){
|
|
if(this.hoveredElements){
|
|
clickElement = this.hoveredElements.find(e=>e.object._listeners['click']);
|
|
clickElement = this.hoveredElements.find(e=>e.object._listeners['click']);
|
|
@@ -85846,12 +85906,15 @@ void main() {
|
|
//点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
|
|
//点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
|
|
}
|
|
}
|
|
|
|
|
|
- getIntersect(viewport, onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, prop={}){
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ getIntersect(viewport, onlyGetIntersect, pickWindowSize, dontIntersect, usePointcloud, prop={}){// usePointcloud:必须使用点云
|
|
let intersectPoint;
|
|
let intersectPoint;
|
|
let camera = viewport.camera;
|
|
let camera = viewport.camera;
|
|
let raycaster;
|
|
let raycaster;
|
|
- if(Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && !usePointcloud && !this.isMeasuring && viewport == viewer.mainViewport ){
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ let getByDepthTex = ()=>{
|
|
/* if(prop.point){
|
|
/* if(prop.point){
|
|
raycaster = new THREE.Raycaster()
|
|
raycaster = new THREE.Raycaster()
|
|
var dir = new THREE.Vector3().subVectors(prop.point, camera.position).normalize()
|
|
var dir = new THREE.Vector3().subVectors(prop.point, camera.position).normalize()
|
|
@@ -85866,8 +85929,9 @@ void main() {
|
|
intersect = Utils.getIntersect(camera, [viewer.images360.cube], this.pointer, raycaster);
|
|
intersect = Utils.getIntersect(camera, [viewer.images360.cube], this.pointer, raycaster);
|
|
}
|
|
}
|
|
intersectPoint = viewer.images360.depthSampler.sample(intersect, prop.pano, !!prop.point); //可能不准确, 因pano可能未加载depthTex
|
|
intersectPoint = viewer.images360.depthSampler.sample(intersect, prop.pano, !!prop.point); //可能不准确, 因pano可能未加载depthTex
|
|
-
|
|
|
|
- }else {
|
|
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ let getByCloud = ()=>{
|
|
if(prop.point){
|
|
if(prop.point){
|
|
prop.cameraPos && camera.position.copy(prop.cameraPos);
|
|
prop.cameraPos && camera.position.copy(prop.cameraPos);
|
|
camera.lookAt(prop.point);
|
|
camera.lookAt(prop.point);
|
|
@@ -85894,6 +85958,19 @@ void main() {
|
|
this.pointer.copy(prop.pointer);
|
|
this.pointer.copy(prop.pointer);
|
|
this.mouse.copy(prop.mouse);
|
|
this.mouse.copy(prop.mouse);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ let canUseDepthTex = Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && viewport == viewer.mainViewport && !usePointcloud;
|
|
|
|
+
|
|
|
|
+ if(canUseDepthTex && !this.isMeasuring){
|
|
|
|
+ getByDepthTex();
|
|
|
|
+ }else {
|
|
|
|
+ getByCloud();
|
|
|
|
+ if(!intersectPoint && canUseDepthTex ){//得不到的话再使用 getByDepthTex 得一次
|
|
|
|
+ getByDepthTex();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
//console.log(viewport.name , intersectPoint && intersectPoint.location )
|
|
//console.log(viewport.name , intersectPoint && intersectPoint.location )
|
|
@@ -86053,9 +86130,7 @@ void main() {
|
|
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+
|
|
if (this.logMessages) console.log(this.constructor.name + ': drag: ');
|
|
if (this.logMessages) console.log(this.constructor.name + ': drag: ');
|
|
|
|
|
|
let dragConsumed = false;
|
|
let dragConsumed = false;
|
|
@@ -87777,6 +87852,7 @@ void main() {
|
|
|
|
|
|
|
|
|
|
let marker = new Mesh(planeGeo$1, getMarerMat() );
|
|
let marker = new Mesh(planeGeo$1, getMarerMat() );
|
|
|
|
+ marker.name = 'marker_'+this.id;
|
|
marker.up.set(0,0,1);
|
|
marker.up.set(0,0,1);
|
|
marker.lookAt(marker.up);
|
|
marker.lookAt(marker.up);
|
|
marker.scale.set(2,2,2);
|
|
marker.scale.set(2,2,2);
|
|
@@ -91630,7 +91706,7 @@ void main() {
|
|
|
|
|
|
viewer.addEventListener("global_mousemove", (e) => {
|
|
viewer.addEventListener("global_mousemove", (e) => {
|
|
if(!Potree.settings.unableNavigate && Potree.settings.ifShowMarker && e.hoverViewport == viewer.mainViewport){//如果不显示marker,就在点击时再更新
|
|
if(!Potree.settings.unableNavigate && Potree.settings.ifShowMarker && e.hoverViewport == viewer.mainViewport){//如果不显示marker,就在点击时再更新
|
|
- this.updateClosestPano(e.intersectPoint);
|
|
|
|
|
|
+ this.updateClosestPano(e.intersect);
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
@@ -91711,7 +91787,7 @@ void main() {
|
|
},
|
|
},
|
|
set: (mode)=> {
|
|
set: (mode)=> {
|
|
latestRequestMode = mode;
|
|
latestRequestMode = mode;
|
|
- console.warn('Request setMode: ' + mode);
|
|
|
|
|
|
+ //console.warn('Request setMode: ' + mode)
|
|
|
|
|
|
if(mode != displayMode){
|
|
if(mode != displayMode){
|
|
let config = Potree.config.displayMode[mode];
|
|
let config = Potree.config.displayMode[mode];
|
|
@@ -91879,7 +91955,7 @@ void main() {
|
|
|
|
|
|
|
|
|
|
this.dispatchEvent({type:'endChangeMode',mode});
|
|
this.dispatchEvent({type:'endChangeMode',mode});
|
|
- console.log('setModeSuccess: ' + mode);
|
|
|
|
|
|
+ //console.log('setModeSuccess: ' + mode)
|
|
}else {
|
|
}else {
|
|
|
|
|
|
//this.dispatchEvent({type:'endChangeMode',mode})
|
|
//this.dispatchEvent({type:'endChangeMode',mode})
|
|
@@ -93434,7 +93510,7 @@ void main() {
|
|
} */
|
|
} */
|
|
|
|
|
|
if(!Potree.settings.ifShowMarker){//不显示marker的时候mousemove没更新鼠标最近点所以更新
|
|
if(!Potree.settings.ifShowMarker){//不显示marker的时候mousemove没更新鼠标最近点所以更新
|
|
- this.updateClosestPano(viewer.inputHandler.intersectPoint);
|
|
|
|
|
|
+ this.updateClosestPano(viewer.inputHandler.intersect);
|
|
}
|
|
}
|
|
//console.log('flyToPanoClosestToMouse',this.closestPano)
|
|
//console.log('flyToPanoClosestToMouse',this.closestPano)
|
|
|
|
|
|
@@ -93624,36 +93700,42 @@ void main() {
|
|
|
|
|
|
|
|
|
|
updateClosestPano(intersect, state) {//hover到的pano 大多数时候是null
|
|
updateClosestPano(intersect, state) {//hover到的pano 大多数时候是null
|
|
- /* if(this.isAtPano() ){
|
|
|
|
- filterFuncs.push(Images360.filters.not(this.currentPano));
|
|
|
|
-
|
|
|
|
- //当静止在漫游点时closestPano只限制在每个漫游点附近,而在观看整个模型时,范围夸大,识别为离鼠标最近的漫游点。 (故而要排除flying时)
|
|
|
|
- filterFuncs.push(Images360.filters.inFloorDirection(this.position, viewer.scene.view.direction, .25))//许钟文改
|
|
|
|
- filterFuncs.push(Images360.filters.isCloseEnoughTo(intersect, 0.35));
|
|
|
|
- filterFuncs.push(Images360.filters.isEnabled())
|
|
|
|
- }else{
|
|
|
|
-
|
|
|
|
- } */
|
|
|
|
|
|
|
|
-
|
|
|
|
- var pano;
|
|
|
|
- if(this.isAtPano() ){
|
|
|
|
|
|
+ /*
|
|
|
|
+ var pano
|
|
|
|
+ if(this.isAtPano() ){ //为什么之前Panorama要加这个限制?
|
|
if(intersect instanceof Panorama){
|
|
if(intersect instanceof Panorama){
|
|
- pano = state ? intersect : null;
|
|
|
|
- }else {
|
|
|
|
|
|
+ pano = state ? intersect : null
|
|
|
|
+ }else{
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- }else {
|
|
|
|
|
|
+ }else{
|
|
if(this.flying)return;
|
|
if(this.flying)return;
|
|
var filterFuncs = [];
|
|
var filterFuncs = [];
|
|
- intersect = intersect && intersect.location;
|
|
|
|
|
|
+ intersect = intersect && intersect.location
|
|
if(!intersect)return
|
|
if(!intersect)return
|
|
- let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)];
|
|
|
|
|
|
+ let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)]
|
|
pano = Common.find(this.panos, filterFuncs, sortFuncs);
|
|
pano = Common.find(this.panos, filterFuncs, sortFuncs);
|
|
}
|
|
}
|
|
|
|
+ */
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
+ var pano;
|
|
|
|
+
|
|
|
|
+ if(intersect instanceof Panorama){
|
|
|
|
+ pano = state ? intersect : null;
|
|
|
|
+ }else {
|
|
|
|
+ if(this.isAtPano()){
|
|
|
|
+ return
|
|
|
|
+ }else {
|
|
|
|
+ if(this.flying)return;
|
|
|
|
+ var filterFuncs = [];
|
|
|
|
+ intersect = intersect && intersect.location;
|
|
|
|
+ if(!intersect)return
|
|
|
|
+ let sortFuncs = Potree.settings.editType != 'pano'? [Images360.sortFunctions.floorDisSquaredToPoint(intersect)] : [Images360.sortFunctions.disSquaredToPoint(intersect)];
|
|
|
|
+ pano = Common.find(this.panos, filterFuncs, sortFuncs);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (pano != this.closestPano) {
|
|
if (pano != this.closestPano) {
|
|
pano && (this.isPanoHover = !0);
|
|
pano && (this.isPanoHover = !0);
|
|
@@ -117923,7 +118005,7 @@ ENDSEC
|
|
};
|
|
};
|
|
let mouseUp = (e)=>{
|
|
let mouseUp = (e)=>{
|
|
|
|
|
|
- viewer.outlinePass.edgeStrength = this.selected.isPointcloud ? edgeStrengths.pointcloud : edgeStrengths.glb;
|
|
|
|
|
|
+ this.updateEdgeStrength();
|
|
|
|
|
|
};
|
|
};
|
|
this.transformControls.addEventListener('mouseDown',mouseDown);
|
|
this.transformControls.addEventListener('mouseDown',mouseDown);
|
|
@@ -117947,7 +118029,9 @@ ENDSEC
|
|
|
|
|
|
|
|
|
|
viewer.addEventListener('global_single_click',(e)=>{
|
|
viewer.addEventListener('global_single_click',(e)=>{
|
|
- if( viewer.scene.cameraAnimations.some(c=>c.onUpdate) //正在播放
|
|
|
|
|
|
+ if(
|
|
|
|
+ this.noNeedSelection //如模型查看页
|
|
|
|
+ || viewer.scene.cameraAnimations.some(c=>c.onUpdate) //正在播放
|
|
|| e.drag && e.drag.notPressMouse //在加测量线
|
|
|| e.drag && e.drag.notPressMouse //在加测量线
|
|
|| viewer.mainViewport.view.isFlying() //有其他校准
|
|
|| viewer.mainViewport.view.isFlying() //有其他校准
|
|
|| this.split //分屏中
|
|
|| this.split //分屏中
|
|
@@ -118081,10 +118165,9 @@ ENDSEC
|
|
viewer.addEventListener('global_drop', (e)=>{
|
|
viewer.addEventListener('global_drop', (e)=>{
|
|
dragInfo = null;
|
|
dragInfo = null;
|
|
this.clearTranCursor();
|
|
this.clearTranCursor();
|
|
-
|
|
|
|
- if(this.selected/* && this.selected.isPointcloud */){
|
|
|
|
- viewer.outlinePass.edgeStrength = this.selected.isPointcloud ? edgeStrengths.pointcloud : edgeStrengths.glb;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ this.updateEdgeStrength();
|
|
|
|
+
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
@@ -118138,12 +118221,14 @@ ENDSEC
|
|
this.transformControls2.view = viewer.viewports[1].view;
|
|
this.transformControls2.view = viewer.viewports[1].view;
|
|
this.transformControls2.camera = viewer.viewports[1].camera;
|
|
this.transformControls2.camera = viewer.viewports[1].camera;
|
|
this.transformControls2._gizmo.hideAxis = {translate:['x','y'], rotate:['x','y','z'] };
|
|
this.transformControls2._gizmo.hideAxis = {translate:['x','y'], rotate:['x','y','z'] };
|
|
-
|
|
|
|
- viewer.compass.viewport = viewer.viewports[0];
|
|
|
|
- viewer.compass.setDomPos();
|
|
|
|
- this.secondCompass.viewport = viewer.viewports[1];
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ this.secondCompass.changeViewport(viewer.viewports[0]);
|
|
this.secondCompass.setDomPos();
|
|
this.secondCompass.setDomPos();
|
|
- this.secondCompass.setDisplay(true);
|
|
|
|
|
|
+ this.secondCompass.setDisplay(true);
|
|
|
|
+ viewer.compass.changeViewport(viewer.viewports[1]);
|
|
|
|
+ viewer.compass.setDomPos();
|
|
|
|
+
|
|
},
|
|
},
|
|
|
|
|
|
leaveSplit(){
|
|
leaveSplit(){
|
|
@@ -118161,7 +118246,9 @@ ENDSEC
|
|
this.transformControls._gizmo.hideAxis = {};
|
|
this.transformControls._gizmo.hideAxis = {};
|
|
viewer.setObjectLayers(this.transformControls, 'sceneObjects' ); //恢复
|
|
viewer.setObjectLayers(this.transformControls, 'sceneObjects' ); //恢复
|
|
|
|
|
|
- viewer.compass.viewport = viewer.viewports[0];//恢复
|
|
|
|
|
|
+
|
|
|
|
+ viewer.compass.changeViewport(viewer.viewports[0]); //恢复
|
|
|
|
+ viewer.compass.setDomPos();
|
|
this.secondCompass.setDisplay(false);
|
|
this.secondCompass.setDisplay(false);
|
|
|
|
|
|
|
|
|
|
@@ -118222,7 +118309,11 @@ ENDSEC
|
|
if(state){
|
|
if(state){
|
|
if(this.selected){
|
|
if(this.selected){
|
|
if(this.selected == model) return
|
|
if(this.selected == model) return
|
|
- else this.selectModel(this.selected, false, fitBound, by2d);
|
|
|
|
|
|
+ else {
|
|
|
|
+ let transToolAttached = !!this.transformControls.object;
|
|
|
|
+ this.selectModel(this.selected, false, fitBound, by2d);
|
|
|
|
+ transToolAttached && this.transformControls.attach(model);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
this.selected = model;
|
|
this.selected = model;
|
|
|
|
|
|
@@ -118231,14 +118322,14 @@ ENDSEC
|
|
|
|
|
|
this.showModelOutline(model);
|
|
this.showModelOutline(model);
|
|
|
|
|
|
- if(model.isPointcloud){
|
|
|
|
- viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;
|
|
|
|
- }else {
|
|
|
|
- viewer.outlinePass.edgeStrength = edgeStrengths.glb;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ this.updateEdgeStrength();
|
|
|
|
+
|
|
//console.log('selectModel', model)
|
|
//console.log('selectModel', model)
|
|
|
|
|
|
- }else {
|
|
|
|
|
|
+ }else {
|
|
|
|
+ if(this.selected != model)return //model本来就没选中,不需要处理(防止2d先选中新的再取消旧的)
|
|
this.showModelOutline(model, false);
|
|
this.showModelOutline(model, false);
|
|
|
|
|
|
this.selected = null;
|
|
this.selected = null;
|
|
@@ -118280,7 +118371,14 @@ ENDSEC
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
|
|
-
|
|
|
|
|
|
+ updateEdgeStrength(){
|
|
|
|
+ if(!this.selected)return
|
|
|
|
+ if(this.selected.isPointcloud){
|
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.pointcloud;// / this.selected.material.opacity
|
|
|
|
+ }else {
|
|
|
|
+ viewer.outlinePass.edgeStrength = edgeStrengths.glb;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
focusOn(objects, duration = 400, fitBound=true, dontLookUp){
|
|
focusOn(objects, duration = 400, fitBound=true, dontLookUp){
|
|
if(!(objects instanceof Array)){
|
|
if(!(objects instanceof Array)){
|
|
objects = [objects];
|
|
objects = [objects];
|
|
@@ -118426,7 +118524,7 @@ ENDSEC
|
|
let w$2 = 200/1.43;
|
|
let w$2 = 200/1.43;
|
|
let maxPX = 1366*1024; //ipad pro. 大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
|
|
let maxPX = 1366*1024; //ipad pro. 大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
|
|
const width2dPX = Math.round(window.devicePixelRatio >= 2 ? ( window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio/1.2 : window.devicePixelRatio/1.5)*w$2 : w$2); //触屏或高分辨率的可能要放大些。但在手机上不能太大
|
|
const width2dPX = Math.round(window.devicePixelRatio >= 2 ? ( window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio/1.2 : window.devicePixelRatio/1.5)*w$2 : w$2); //触屏或高分辨率的可能要放大些。但在手机上不能太大
|
|
- console.log('width2dPX', width2dPX);
|
|
|
|
|
|
+ //console.log('width2dPX', width2dPX)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -125710,6 +125808,8 @@ ENDSEC
|
|
this.renderTargetBlurBuffer2.texture.generateMipmaps = false; */
|
|
this.renderTargetBlurBuffer2.texture.generateMipmaps = false; */
|
|
|
|
|
|
this.edgeDetectionMaterial = this.getEdgeDetectionMaterial(this.edgeStrength);
|
|
this.edgeDetectionMaterial = this.getEdgeDetectionMaterial(this.edgeStrength);
|
|
|
|
+
|
|
|
|
+
|
|
this.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy, pars );
|
|
this.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy, pars );
|
|
this.renderTargetEdgeBuffer1.texture.name = "OutlinePass.edge1";
|
|
this.renderTargetEdgeBuffer1.texture.name = "OutlinePass.edge1";
|
|
this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;
|
|
this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;
|
|
@@ -125998,8 +126098,19 @@ ENDSEC
|
|
//renderer.setRenderTarget(this.renderTargetMaskBuffer)
|
|
//renderer.setRenderTarget(this.renderTargetMaskBuffer)
|
|
//renderer.clear()
|
|
//renderer.clear()
|
|
//renderer.render( scene, camera/* , this.renderTargetMaskBuffer, true */ );
|
|
//renderer.render( scene, camera/* , this.renderTargetMaskBuffer, true */ );
|
|
|
|
+
|
|
|
|
+ viewer.scene.pointclouds.forEach(e=>{ //先将点云透明度变为1,因为点云透明度莫名其妙会影响其r值
|
|
|
|
+ e.material._oldOpa = e.material.opacity;
|
|
|
|
+ e.material.opacity = 1;
|
|
|
|
+ });
|
|
|
|
+
|
|
render2(this.renderTargetMaskBuffer);
|
|
render2(this.renderTargetMaskBuffer);
|
|
|
|
|
|
|
|
+ viewer.scene.pointclouds.forEach(e=>{//恢复
|
|
|
|
+ e.material.opacity = e.material._oldOpa;
|
|
|
|
+ delete e.material._oldOpa;
|
|
|
|
+ });
|
|
|
|
+
|
|
viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});
|
|
viewports.forEach((e)=>{e.beforeRender = e.oldBeforeRender;});
|
|
|
|
|
|
this.changeVisibilityOfNonSelectedObjects( true , scenes);
|
|
this.changeVisibilityOfNonSelectedObjects( true , scenes);
|
|
@@ -126018,7 +126129,7 @@ ENDSEC
|
|
this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;//this.renderTargetMaskDownSampleBuffer.texture;
|
|
this.edgeDetectionMaterial.uniforms[ "maskTexture" ].value = this.renderTargetMaskBuffer.texture;//this.renderTargetMaskDownSampleBuffer.texture;
|
|
this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new Vector2$1(this.resolution.x, this.resolution.y );//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
|
|
this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new Vector2$1(this.resolution.x, this.resolution.y );//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
|
|
//this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2(this.renderTargetMaskBuffer.width, this.renderTargetMaskBuffer.height)//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
|
|
//this.edgeDetectionMaterial.uniforms[ "texSize" ].value = new THREE.Vector2(this.renderTargetMaskBuffer.width, this.renderTargetMaskBuffer.height)//new THREE.Vector2( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );
|
|
- this.edgeDetectionMaterial.uniforms[ "thickness" ].value = this.edgeStrength;
|
|
|
|
|
|
+ this.edgeDetectionMaterial.uniforms[ "edgeStrength" ].value = this.edgeStrength;
|
|
|
|
|
|
this.edgeDetectionMaterial.uniforms[ "visibleEdgeColor" ].value = this.visibleEdgeColor;//this.tempPulseColor1;
|
|
this.edgeDetectionMaterial.uniforms[ "visibleEdgeColor" ].value = this.visibleEdgeColor;//this.tempPulseColor1;
|
|
this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.hiddenEdgeColor; //this.tempPulseColor2;
|
|
this.edgeDetectionMaterial.uniforms[ "hiddenEdgeColor" ].value = this.hiddenEdgeColor; //this.tempPulseColor2;
|
|
@@ -126028,6 +126139,7 @@ ENDSEC
|
|
let buffer = readBuffer;
|
|
let buffer = readBuffer;
|
|
if ( this.renderToScreen ) {
|
|
if ( this.renderToScreen ) {
|
|
this.quad.material.transparent = true;
|
|
this.quad.material.transparent = true;
|
|
|
|
+
|
|
buffer = null;
|
|
buffer = null;
|
|
renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
|
|
renderer.setClearColor( this.oldClearColor, this.oldClearAlpha );
|
|
render2(null,false);
|
|
render2(null,false);
|
|
@@ -126042,7 +126154,7 @@ ENDSEC
|
|
renderer.clear();
|
|
renderer.clear();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
renderer.setRenderTarget(buffer/* this.renderTargetEdgeBuffer1 */);
|
|
renderer.setRenderTarget(buffer/* this.renderTargetEdgeBuffer1 */);
|
|
|
|
|
|
renderer.render( this.scene, this.camera/* , this.renderTargetEdgeBuffer1, true */);
|
|
renderer.render( this.scene, this.camera/* , this.renderTargetEdgeBuffer1, true */);
|
|
@@ -126127,17 +126239,18 @@ ENDSEC
|
|
|
|
|
|
'}'
|
|
'}'
|
|
].join( '\n' )
|
|
].join( '\n' )
|
|
-
|
|
|
|
|
|
+ //scene.overrideMaterial
|
|
|
|
+ //为什么画出来红色通道不为0,且depthTest似乎会改变红色通道的值
|
|
} );
|
|
} );
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
- getEdgeDetectionMaterial: function (thickness) {
|
|
|
|
|
|
+ getEdgeDetectionMaterial: function (edgeStrength) {
|
|
|
|
|
|
return new ShaderMaterial( {
|
|
return new ShaderMaterial( {
|
|
|
|
|
|
uniforms: {
|
|
uniforms: {
|
|
- "thickness": { value: thickness },
|
|
|
|
|
|
+ "edgeStrength": { value: edgeStrength },
|
|
"maskTexture": { value: null },
|
|
"maskTexture": { value: null },
|
|
"texSize": { value: new Vector2$1( 10, 10 ) },
|
|
"texSize": { value: new Vector2$1( 10, 10 ) },
|
|
"visibleEdgeColor": { value: new Vector3( 1.0, 1.0, 1.0 ) },
|
|
"visibleEdgeColor": { value: new Vector3( 1.0, 1.0, 1.0 ) },
|
|
@@ -126175,30 +126288,33 @@ ENDSEC
|
|
gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
|
|
gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
|
|
}" */
|
|
}" */
|
|
fragmentShader:
|
|
fragmentShader:
|
|
- "varying vec2 vUv;\
|
|
|
|
- uniform sampler2D maskTexture;\
|
|
|
|
- uniform float thickness;\
|
|
|
|
- uniform vec2 texSize;\
|
|
|
|
- uniform vec3 visibleEdgeColor;\
|
|
|
|
- uniform vec3 hiddenEdgeColor;\
|
|
|
|
- \
|
|
|
|
- void main() {\n\
|
|
|
|
- vec2 invSize = 1.0 / texSize;\
|
|
|
|
- vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\
|
|
|
|
- vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\
|
|
|
|
- vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\
|
|
|
|
- vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\
|
|
|
|
- vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\
|
|
|
|
- float diff1 = (c1.r - c2.r)*0.5;\
|
|
|
|
- float diff2 = (c3.r - c4.r)*0.5;\
|
|
|
|
- float d = length( vec2(diff1, diff2) ) * thickness;\
|
|
|
|
- float a1 = min(c1.g, c2.g);\
|
|
|
|
- float a2 = min(c3.g, c4.g);\
|
|
|
|
- float visibilityFactor = min(a1, a2);\
|
|
|
|
- vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\
|
|
|
|
- gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\
|
|
|
|
- }"
|
|
|
|
|
|
+ `varying vec2 vUv;
|
|
|
|
+ uniform sampler2D maskTexture;
|
|
|
|
+ uniform float edgeStrength;
|
|
|
|
+ uniform vec2 texSize;
|
|
|
|
+ uniform vec3 visibleEdgeColor;
|
|
|
|
+ uniform vec3 hiddenEdgeColor;
|
|
|
|
+
|
|
|
|
+ void main() {
|
|
|
|
+ const float thickness = 1.0;
|
|
|
|
+ vec2 invSize = thickness / texSize;
|
|
|
|
+ vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);
|
|
|
|
+ vec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);
|
|
|
|
+ vec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);
|
|
|
|
+ vec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);
|
|
|
|
+ vec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);
|
|
|
|
+ float diff1 = (c1.r - c2.r)*0.5; //检测边缘,
|
|
|
|
+ float diff2 = (c3.r - c4.r)*0.5;
|
|
|
|
+ float d = length( vec2(diff1, diff2) ) * edgeStrength;
|
|
|
|
+ float a1 = min(c1.g, c2.g);
|
|
|
|
+ float a2 = min(c3.g, c4.g);
|
|
|
|
+ float visibilityFactor = min(a1, a2);
|
|
|
|
+ vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;
|
|
|
|
+ //gl_FragColor = vec4(0.0,1.0,0.0,1.0);
|
|
|
|
+ gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);
|
|
|
|
+ }`
|
|
} );
|
|
} );
|
|
|
|
+ //为什么vec4(0.0,1.0,1.0,1.0); 显示出来的是rgb(109,255,255) ? 几乎只有绿色通道会影响红色通道
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
@@ -126395,7 +126511,7 @@ ENDSEC
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- console.log('create viewer');
|
|
|
|
|
|
+ //console.log('create viewer')
|
|
|
|
|
|
this.navigateMode = 'free'; // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点,
|
|
this.navigateMode = 'free'; // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点,
|
|
this.isEdit = true;
|
|
this.isEdit = true;
|
|
@@ -129134,22 +129250,33 @@ ENDSEC
|
|
}));
|
|
}));
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
- view.render || this.clear(params);
|
|
|
|
- pRenderer.clearTargets(params);
|
|
|
|
-
|
|
|
|
- //先渲染不透明的model:
|
|
|
|
- if(this.objs.children.length){
|
|
|
|
- this.renderer.setRenderTarget(params.target||null);
|
|
|
|
- this.setCameraLayers(params.camera, ['model'] );//先渲染模型后渲染点云,否则半透明的点云的blend没有混合模型的部分(但模型为何可以混合点云的部分?估计还是PotreeRenderer有问题)
|
|
|
|
- /* this.objs.children.forEach(e=>{
|
|
|
|
- this.updateVisible(e, 'renderOpa', e.opacity == 1)
|
|
|
|
- }) */
|
|
|
|
- this.renderer.render(this.scene.scene, params.camera);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(!view.noPointcloud ){
|
|
|
|
|
|
+ if(!view.render){
|
|
|
|
+ this.clear(params);
|
|
|
|
+ pRenderer.clearTargets(params);
|
|
|
|
+
|
|
|
|
|
|
|
|
+ //先渲染不透明的model:
|
|
|
|
+ /* if(this.objs.children.length){
|
|
|
|
+ this.renderer.setRenderTarget(params.target||null)
|
|
|
|
+ this.setCameraLayers(params.camera, ['model'] )//先渲染模型后渲染点云,否则半透明的点云的blend没有混合模型的部分(但模型为何可以混合点云的部分?估计还是PotreeRenderer有问题)
|
|
|
|
+
|
|
|
|
+ this.renderer.render(this.scene.scene, params.camera);
|
|
|
|
+ } */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(Potree.settings.notAdditiveBlending){
|
|
|
|
+ params.renderBeforeCloud = true;
|
|
|
|
+ this.renderOverlay1(params);
|
|
|
|
+ //view.render || this.renderOverlay(params)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ /* view.render || this.clear(params)
|
|
|
|
+ pRenderer.clearTargets(params); */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(!view.noPointcloud ){
|
|
//if(!params.target){
|
|
//if(!params.target){
|
|
//params.width = width; params.height = height;
|
|
//params.width = width; params.height = height;
|
|
|
|
|
|
@@ -129157,8 +129284,7 @@ ENDSEC
|
|
if(view.render){
|
|
if(view.render){
|
|
params.noBG = true;
|
|
params.noBG = true;
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
|
|
view.beforeRender && view.beforeRender();
|
|
view.beforeRender && view.beforeRender();
|
|
|
|
|
|
@@ -129172,11 +129298,24 @@ ENDSEC
|
|
pRenderer.render(params);
|
|
pRenderer.render(params);
|
|
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
+ if(!view.render){
|
|
|
|
+ //view.render || this.renderOverlay(params)
|
|
|
|
+ if(Potree.settings.notAdditiveBlending){
|
|
|
|
+ params.renderBeforeCloud = false;
|
|
|
|
+ this.renderOverlay1(params);
|
|
|
|
+ this.renderOverlay2(params);
|
|
|
|
+ }else {
|
|
|
|
+ /* view.render || */this.renderOverlay(params);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
- view.render || this.renderOverlay(params);
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
view.afterRender && view.afterRender();
|
|
view.afterRender && view.afterRender();
|
|
@@ -129209,15 +129348,84 @@ ENDSEC
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ 关于透明度:
|
|
|
|
+ 由于点云和mesh是分开渲染的,且材质很不一样,所以透明和blend有冲突
|
|
|
|
+
|
|
|
|
+ 1 如果点云的blend是AdditiveBlending,也就是普通的叠加模式。
|
|
|
|
+ 则半透明点云的depthTest和depthWrite都为false
|
|
|
|
+ 这时候mesh要后渲染,且depthWrite不能为false(除非depthTest也为false),否则将被点云遮住。
|
|
|
|
+ 2 如果点云的blend是普通型
|
|
|
|
+ 则半透明点云的depthTest和depthWrite都为true。(为何depthWrite不能像mesh一样为false, 否则点云自身透明会错乱,可能因为太多points了)
|
|
|
|
+ 这时候若mesh全部先渲染,则 透过depthWrite为false的半透明mesh看不透明点云,mesh会完全被点云遮住。但是透明的物体就是depthWrite要为false,否则也会完全遮住点云
|
|
|
|
+
|
|
|
|
+ 即使是后渲染半透明的mesh,若透过点云看mesh,mesh会完全被点云遮住(为什么之前遇到过 透过点云看mesh,点云会显示不出)
|
|
|
|
+
|
|
|
|
+ 最终选择是先渲染不透明的mesh,然后点云,然后透明的mesh。虽然点云对mesh透明会失效。
|
|
|
|
|
|
-
|
|
|
|
|
|
+ */
|
|
|
|
|
|
renderOverlay(params){
|
|
renderOverlay(params){
|
|
|
|
+ this.renderOverlay1(params);
|
|
|
|
+ this.renderOverlay2(params);
|
|
|
|
+ /* let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
|
|
+
|
|
|
|
+ this.reticule.updateAtViewports(params.viewport)
|
|
|
|
+ this.renderer.setRenderTarget(params.target||null)
|
|
|
|
+
|
|
|
|
+ //为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖
|
|
|
|
+ let cameraLayers
|
|
|
|
+
|
|
|
|
+ if(params.cameraLayers) cameraLayers = params.cameraLayers
|
|
|
|
+ else{
|
|
|
|
+ if(params.isMap)cameraLayers = ['bothMapAndScene']
|
|
|
|
+ else cameraLayers = ['sceneObjects', 'model', 'bothMapAndScene' ];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(cameraLayers.length){
|
|
|
|
+ this.setCameraLayers(camera, cameraLayers, params.extraEnableLayers) //透明贴图层 skybox 、reticule marker 不能遮住测量线
|
|
|
|
+
|
|
|
|
+ this.renderer.render(this.scene.scene, camera);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //清除深度 !!!!
|
|
|
|
+ this.renderer.clearDepth();
|
|
|
|
+
|
|
|
|
+ //this.transformationTool.update();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if(!params.magnifier){
|
|
|
|
+ //测量线
|
|
|
|
+ this.dispatchEvent({type: "render.pass.perspective_overlay", camera, screenshot:params.screenshot});
|
|
|
|
+
|
|
|
|
+ if(!params.screenshot && !params.isMap){
|
|
|
|
+ this.setCameraLayers(camera, ['magnifier']) //magnifier 遮住测量线
|
|
|
|
+ this.renderer.render(this.scene.scene, camera);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(!params.isMap) {
|
|
|
|
+ this.setCameraLayers(camera, ['volume','transformationTool'])
|
|
|
|
+ this.renderer.render(this.clippingTool.sceneVolume, camera);
|
|
|
|
+ this.renderer.render(this.transformationTool.scene, camera);
|
|
|
|
+ } */
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ renderOverlay1(params){
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
|
|
|
|
this.reticule.updateAtViewports(params.viewport);
|
|
this.reticule.updateAtViewports(params.viewport);
|
|
-
|
|
|
|
|
|
+ this.renderer.setRenderTarget(params.target||null);
|
|
|
|
|
|
//为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖
|
|
//为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖
|
|
let cameraLayers;
|
|
let cameraLayers;
|
|
@@ -129225,22 +129433,45 @@ ENDSEC
|
|
if(params.cameraLayers) cameraLayers = params.cameraLayers;
|
|
if(params.cameraLayers) cameraLayers = params.cameraLayers;
|
|
else {
|
|
else {
|
|
if(params.isMap)cameraLayers = ['bothMapAndScene'];
|
|
if(params.isMap)cameraLayers = ['bothMapAndScene'];
|
|
- else cameraLayers = ['sceneObjects', /* 'model', */ 'bothMapAndScene' ];
|
|
|
|
|
|
+ else cameraLayers = ['sceneObjects', 'model', 'bothMapAndScene' ];
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(cameraLayers.length){
|
|
if(cameraLayers.length){
|
|
this.setCameraLayers(camera, cameraLayers, params.extraEnableLayers); //透明贴图层 skybox 、reticule marker 不能遮住测量线
|
|
this.setCameraLayers(camera, cameraLayers, params.extraEnableLayers); //透明贴图层 skybox 、reticule marker 不能遮住测量线
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ if('renderBeforeCloud' in params){
|
|
|
|
+ this.scene.scene.traverse((object)=>{
|
|
|
|
+ if(object.material){
|
|
|
|
+ this.updateVisible(object, 'renderOpa',
|
|
|
|
+ (params.renderBeforeCloud && (object.material.opacity<1 || !object.material.depthTest) || (!params.renderBeforeCloud) && (object.material.opacity==1 && object.material.depthTest))? false:true);
|
|
|
|
+ //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染
|
|
|
|
+ }
|
|
|
|
+ });//ground的材质中opacity为1,所以被当做不透明了
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
this.renderer.render(this.scene.scene, camera);
|
|
this.renderer.render(this.scene.scene, camera);
|
|
|
|
+
|
|
|
|
+ if('renderBeforeCloud' in params){
|
|
|
|
+ this.scene.scene.traverse((object)=>{
|
|
|
|
+ if(object.material){
|
|
|
|
+ this.updateVisible(object, 'renderOpa', true); //恢复
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
|
|
this.dispatchEvent({type: "render.pass.scene", viewer: viewer});
|
|
|
|
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
+ renderOverlay2(params){
|
|
|
|
+ let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
//清除深度 !!!!
|
|
//清除深度 !!!!
|
|
this.renderer.clearDepth();
|
|
this.renderer.clearDepth();
|
|
|
|
|
|
@@ -129262,8 +129493,12 @@ ENDSEC
|
|
this.renderer.render(this.clippingTool.sceneVolume, camera);
|
|
this.renderer.render(this.clippingTool.sceneVolume, camera);
|
|
this.renderer.render(this.transformationTool.scene, camera);
|
|
this.renderer.render(this.transformationTool.scene, camera);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
/* renderDefault(){//测试 ios15.4.1
|
|
/* renderDefault(){//测试 ios15.4.1
|
|
//let pRenderer = this.getPRenderer();
|
|
//let pRenderer = this.getPRenderer();
|
|
//this.clear()
|
|
//this.clear()
|
|
@@ -131449,6 +131684,8 @@ ENDSEC
|
|
async function loadFile(path, callback, onError){
|
|
async function loadFile(path, callback, onError){
|
|
if(Potree.fileServer){
|
|
if(Potree.fileServer){
|
|
Potree.fileServer.get(path).then(data=>{
|
|
Potree.fileServer.get(path).then(data=>{
|
|
|
|
+ if(data.data)data = data.data;
|
|
|
|
+ if(data.data)data = data.data; //融合页面getdataset需要查找两次data
|
|
callback && callback(data);
|
|
callback && callback(data);
|
|
}).catch(onError);
|
|
}).catch(onError);
|
|
}else {
|
|
}else {
|