Selaa lähdekoodia

准备切分支去看splatter为什么比原版的cpu高

xzw 19 tuntia sitten
vanhempi
commit
da3c69bd2e

+ 3 - 1
src/PotreeRendererNew.js

@@ -1491,7 +1491,9 @@ export class Renderer {
             }
             if (material.highlightBoxes && material.highlightBoxes.length > 0) {//add 
                 const boxes_highlight = shader.uniformLocations["boxes_highlight[0]"];
-                gl.uniformMatrix4fv(boxes_highlight, false, material.uniforms.boxes_highlight.value);  
+                gl.uniformMatrix4fv(boxes_highlight, false, material.uniforms.boxes_highlight.value); 
+                const boxHighlightColor = shader.uniformLocations["boxHighlightColor[0]"];
+                gl.uniform3fv(boxHighlightColor,  material.uniforms.boxHighlightColor.value); 
             }
             if (material.bigClipInBox ) {//add 
 				shader.setUniformMatrix4("clipBoxBig_in", material.uniforms.clipBoxBig_in.value); 

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 15 - 12
src/custom/objects/3dgs/splatter/SplatterThree.js


+ 1 - 1
src/custom/objects/tool/MeasuringTool.js

@@ -83,7 +83,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
 		}
 		 
          
-        viewer.addEventListener('camera_changed', this.update.bind(this),{importance:10})//优先级高于sprite
+        //viewer.addEventListener('camera_changed', this.update.bind(this),{importance:10})//优先级高于sprite
          
          
         if(Potree.config.measure.mulLabelHideFaraway ){

+ 10 - 0
src/custom/potree.shim.js

@@ -1072,6 +1072,16 @@ Utils.tilesetCoincide‌WithPoc = function(tilesetModel, tranInfo){//使刚加
     
 }
 
+Utils.setTileClass = (model, resolution )=>{ 
+    if(resolution == void 0){
+        resolution = model.isPointcloud ? '4k' : '2k' //点云没见过低于4k的
+    }
+    
+    if(resolution.indexOf('/') != -1) {
+        resolution = resolution.split('/')[1]
+    } 
+    model.tileClass = parseInt(resolution) * 1024 
+}
 
 BinaryLoader.prototype.load = function(node, callback){//解析点云
     if (node.loaded) {

+ 6 - 13
src/custom/start.js

@@ -147,7 +147,7 @@ export function start(dom, mapDom, number, info={} ){ //t-Zvd3w0m
                     if(pano){
                         viewer.images360.flyToPano({
                             pano,  duration:0,
-                            target : viewer.images360.bound.center.setZ(pano.position.z)    //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)  
+                            //target : viewer.images360.bound.center.setZ(pano.position.z) //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)//2026.4 说要默认朝上,日本那边要求  
                         }) 
                     }else{// 无漫游点  避免加载时看不到点云 SG-t-DXmdymgZ2sX  SG-t-rVB03a5GXr8 
                         //SG-t-XPf1k9pv3Zg 总有极端的场景,如这是倾斜的桥 - -, 只能调整为看到全局了
@@ -360,16 +360,9 @@ export function start(dom, mapDom, number, info={} ){ //t-Zvd3w0m
                     } 
                     pointcloudLoaded ++;
                     if(pointcloudLoaded == datasetLength)pointcloudLoadDone()
-                    
-                    {   
-                        let resolution = dataset.sceneResolution || '4k' //融合页面还有一个tileRes
-                        if(resolution.indexOf('/') != -1) {
-                            resolution = resolution.split('/')[1]
-                        } 
-                        pointcloud.tileClass = parseInt(resolution) * 1024
-                    
-                    }
-                    
+                        
+                    Potree.Utils.setTileClass(pointcloud, dataset.sceneResolution)
+                   
                     Potree.loadPanos(dataset.id, (data) => { 
                         //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
                         viewer.images360.addPanoData(data, pointcloud)
@@ -684,9 +677,9 @@ export function panoEditStart(dom, number, EditCloudsArgs){
                 
                 if(datasetData){//非4dkk
                     pointcloud.datasetData = datasetData
-                    pointcloud.hasDepthTex = Potree.settings.useDepthTex && !!datasetData.has_depth   
+                    pointcloud.hasDepthTex = Potree.settings.useDepthTex && !!datasetData.has_depth  
                 }
-                
+                Potree.Utils.setTileClass(pointcloud, datasetData?.sceneResolution)
                 //transformPointcloud(pointcloud, pano)
                 scene.addPointCloud(pointcloud);
                 pointcloudLoaded ++;

+ 1 - 1
src/custom/utils/PanoScreenshot.js

@@ -93,7 +93,7 @@ export const PanoScreenshot = {
                         debugger
                     }
              
-                    var {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', noOverlay:true, useRenderTarget: true }, size.width, size.height, 1) //因尺寸可能大于8192, 所以使用离屏渲染,否则canvas超过该大小容易黑屏。
+                    var {getImagePromise, finishPromise} = viewer.startScreenshot({ type: 'default', noOverlay:true, useRenderTarget: true, hideMarkers:true}, size.width, size.height, 1) //因尺寸可能大于8192, 所以使用离屏渲染,否则canvas超过该大小容易黑屏。
                     finishPromise.done((e) => {
                         //Potree.Common.downloadFile(e.dataUrl, 'screenshot.png') 
                         Potree.settings.highestQualityTile = false 

+ 53 - 24
src/custom/viewer/ViewerNew.js

@@ -29,7 +29,7 @@ import {EDLRenderer} from "../../viewer/EDLRendererNew.js";
 import {HQSplatRenderer} from "../../viewer/HQSplatRenderer.js";
 import {MapViewer} from "./map/MapViewer.js";
                                                                  
-import {NavigationCube} from '../../viewer/NavigationCube.js'
+//import {NavigationCube} from '../../viewer/NavigationCube.js'
    
 //import {MapView} from "../viewer/map.js"; 
 import {ProfileWindow, ProfileWindowController} from "../../viewer/profile.js";
@@ -618,8 +618,8 @@ export class Viewer extends ViewerBase{
                 
                 this.clippingTool = new ClippingTool(this);
                 this.transformationTool = new TransformationTool(this);
-                this.navigationCube = new NavigationCube(this);
-                this.navigationCube.visible = false;
+                /* this.navigationCube = new NavigationCube(this);
+                this.navigationCube.visible = false; */
 
                 
                 
@@ -1396,7 +1396,15 @@ export class Viewer extends ViewerBase{
         //console.error('updatePanosVisibles', currentFloor)
         let SiteModel = this.modules.SiteModel
         viewer.images360.panos.forEach(pano=>{
-            let visible = inEntity ? inEntity.panos.includes(pano) : this.atDatasets.some(e=>e.panos.includes(pano))
+            
+            let visible
+             
+            if(Potree.settings.markerMode == 'permanent'){//2026 要求常驻必须至少显示一处漫游点,那就和当前地图显示的fp的一致吧
+                visible = this.fpVisiDatasets.some(e=>e.panos.includes(pano))
+            }else{
+                visible = inEntity ? inEntity.panos.includes(pano) : this.atDatasets.some(e=>e.panos.includes(pano))
+
+            }
             /* if(!visible && inEntity && SiteModel.noEditBefore && !SiteModel.entities.some(e=>e.panos.includes(pano))){
                  //没编辑过的空间模型很有错的可能,如果pano不在任何楼里就显示2025.3  for https://laser.4dkankan.com/?lang=zh&m=SG-y2wVWYmrM7u#/
                  visible = true
@@ -1415,7 +1423,12 @@ export class Viewer extends ViewerBase{
     
     updateMarkerVisibles(){//限制显示的marker个数,因镜头内marker多的时候可能会卡 
         if(!Potree.settings.ifShowMarker)return
-       
+        if(Potree.settings.markerMode == 'permanent'){//一直显示
+            viewer.images360.panos.forEach(pano=>{
+                Potree.Utils.updateVisible(pano.marker, 'limitMarkerShow', true ) 
+            })
+            return
+        }
         
         const minRadius = 8 * this.images360.zoomLevel,  //当视线垂直于marker时的最小可见距离,此范围内可见的pano绝对可见
             maxRadius = 50 * this.images360.zoomLevel,    //当视线垂直于marker时的最大可见距离,此范围外绝对不可见
@@ -3115,9 +3128,9 @@ export class Viewer extends ViewerBase{
 			}
 		}
 		
-		{ // update navigation cube
+		/* { // update navigation cube
 			this.navigationCube.update(camera.rotation);
-		}
+		} */
 
 		this.updateAnnotations();
 
@@ -3899,8 +3912,8 @@ export class Viewer extends ViewerBase{
         let finishDeferred = info.finishDeferred || $.Deferred();
  
         let viewerMaster = info.map ? this.mapViewer : this; //截图主体
-        let useMap = info.map || info.type == 'measure' || info.type.includes('prism2d')
-        
+        let useMap = info.map || info.type == 'measure' || info.type.includes('prism2d');
+        (info.type == 'measure' || info.type.includes('prism2d')) && (info.hideMapCursor = true)
         
         
         if(Potree.settings.displayMode == 'showPanos' && viewer.mainViewport.view.isFlying('pos')){//如果在飞,飞完再截图
@@ -3945,8 +3958,13 @@ export class Viewer extends ViewerBase{
             let render = async ()=>{ 
             
                 this.needRender = true
-                viewports.forEach(e=>e.active = true)  
-            
+                 
+                 
+                //viewports.forEach(e=>e.active = true)  
+                oldStates.viewports.forEach(old=>{ 
+                    var viewport = viewports.find(v=>v.name == old.name);
+                    viewport.active = old.active
+                })
                 if(info.useRenderTarget){
                     //离屏渲染 有抗锯齿问题、在手机上速度慢   主视图一样会变内容,还是不用这个了
                     var { dataUrl  } = viewerMaster.makeScreenshot( new THREE.Vector2(width,height), null, compressRatio    );
@@ -4013,8 +4031,8 @@ export class Viewer extends ViewerBase{
                     if(viewport.camera.isOrthographicCamera){
                         viewport.camera.zoom = viewport.view.zoom
                     }
-                }) 
-                
+                    
+                })   
                 viewerMaster.updateScreenSize({forceUpdateSize:true})//更新像素
                 
                 /* oldStates.viewports.forEach(old=>{//恢复相机
@@ -4133,7 +4151,7 @@ export class Viewer extends ViewerBase{
         let mainViewport = info.mainViewport || this.mainViewport
         let viewports = [],  oldStates = {
             viewports:[],
-            pano: Potree.settings.displayMode == 'showPanos' ? viewer.images360.currentPano : null,
+            pano: Potree.settings.displayMode == 'showPanos' ? this.images360.currentPano : null,
             bgOpacity : this.backgroundOpacity,
             background: this.background
         }
@@ -4142,7 +4160,7 @@ export class Viewer extends ViewerBase{
             mainViewport.camera.isOrthographicCamera && (mainViewport.view.zoom = mainViewport.camera.zoom)
             oldStates.viewports.push(mainViewport.clone()) 
         }
-        if(useMap){
+        //if(useMap){
             mapViewport = this.mapViewer.viewports[0]
             mapViewport.view.zoom = mapViewport.camera.zoom
             viewports.push(mapViewport)
@@ -4151,11 +4169,18 @@ export class Viewer extends ViewerBase{
             oldStates.noPointcloud = mapViewport.noPointcloud
             oldStates.displayMode = Potree.settings.displayMode
              
-            Potree.Utils.updateVisible(this.mapViewer.cursor, 'screenshot', false)//令mapCursor不可见
-        }
-         
+            useMap && info.hideMapCursor && Potree.Utils.updateVisible(this.mapViewer.cursor, 'screenshot', false)//令mapCursor不可见
+        //}
+        this.viewports.forEach(viewport=>{
+            if(!viewports.includes(viewport)){
+                viewports.push(viewport)
+                oldStates.viewports.push(viewport.clone()) 
+            }
+        }) 
+        
         viewports.forEach(e=>e.active = false) //暂停渲染
         
+        
         if(info.hideMarkers){
             this.images360.panos.forEach(pano=>{//令漫游点不可见
                 Potree.Utils.updateVisible(pano, 'screenshot', false)
@@ -4203,7 +4228,7 @@ export class Viewer extends ViewerBase{
                 oldStates.oldSplitDir = this.mapViewer.splitDir
                 this.mapViewer.attachToMainViewer(true, 'measure', 0.5 ,  {dir:'leftRight'} ) 
             }  
-            viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
+            viewerMaster.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
              
             let begin = ()=>{
                 useMap = this.mapViewer.attachedToViewer 
@@ -4242,7 +4267,7 @@ export class Viewer extends ViewerBase{
                 let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)//如果没有floorplan展示就不分屏(如果focus时飞出数据集从而不展示怎么办。尤其是俯瞰比较长的线时容易这样,或许要根据其所在数据集强制显示)
                 if(!floorplanShowed && this.mapViewer.attachedToViewer){ 
                     this.mapViewer.attachToMainViewer(false) //取消分屏
-                    viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视
+                    viewerMaster.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视
                     let {promise} = this.focusOnObject(info.measurement, 'measure', 0,     {basePanoSize:1024,gotoBestView:true,}  )//因画面比例更改,重新focus
                     promise.done(()=>{ 
                         begin()  
@@ -4258,7 +4283,7 @@ export class Viewer extends ViewerBase{
             
             this.mapViewer.attachToMainViewer(true, 'screenshot', 1 ,  {/* dir:'leftRight' */} ) 
             
-            viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
+            viewerMaster.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
              
             prisms.forEach(prism=>{ 
                 
@@ -4309,13 +4334,13 @@ export class Viewer extends ViewerBase{
         
             let done = ()=>{
                 updateCamera()
-                if(info.splitRenderInfo){ 
+                if(info.splitRenderInfo || info.map){ 
                     screenshot()
                 }else{
                     this.waitPointLoad(screenshot, info.maxTimeForPointLoad, mainViewport)
                 }
             }
-            viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
+            viewerMaster.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
             if(info.focusObjectInfo){  
                 let {promise} = this.focusOnObject( ...info.focusObjectInfo)
                 promise.done(()=>{
@@ -4428,7 +4453,11 @@ export class Viewer extends ViewerBase{
         let camera = o.endCamera || viewport.camera  
         let cameraPos = camera.position.clone()
         let boundSize   
-        
+        if(object instanceof THREE.Vector3){
+            object = {position: object}, type = 'point'
+        }else if(object instanceof THREE.Box3){
+            object = {boundingBox: object}, type = 'boundingBox'
+        }
         
         if(o.dontChangeCamDir && (o.endYaw == void 0 || o.endPitch == void 0)){ //在俯视时仅靠dir来算不准
             o.endYaw = viewport.view.yaw

+ 1 - 1
src/custom/viewer/map/MapViewer.js

@@ -739,7 +739,7 @@ export class MapViewer extends ViewerBase{
     //拆成两次渲染,一个地图一个其他物体,且地图渲染后保存在buffer中,只有当地图变化后才重渲染。 
     render(params={}){ 
     
-        if(!this.visible && !this.attachedToViewer || !this.needRender && !params.force){  //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
+        if(!this.visible && !this.attachedToViewer || !this.viewports[0].active || !this.needRender && !params.force){  //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
             return 
         } 
         viewer.addTimeMark('mapRender','start') 

+ 3 - 1
src/materials/ExtendPointCloudMaterial.js

@@ -57,6 +57,7 @@ export class ExtendPointCloudMaterial extends PointCloudMaterial {
             clipBoxes_out:  { type: "Matrix4fv", value: [] },
             clipBoxBig_in:  { type: "Matrix4fv", value: [] },
             boxes_highlight:  { type: "Matrix4fv", value: [] },
+            boxHighlightColor:  {  value: [] },
 			progress: {
 				type: "f",
 				value: 0
@@ -367,7 +368,7 @@ export class ExtendPointCloudMaterial extends PointCloudMaterial {
 		this.uniforms.clipBoxes_in.value = new Float32Array(clipBoxes_in.length * 16);
 		this.uniforms.clipBoxes_out.value = new Float32Array(clipBoxes_out.length * 16);
 		this.uniforms.boxes_highlight.value = new Float32Array(highlightBoxes.length * 16);
-        
+        this.uniforms.boxHighlightColor.value = new Float32Array(highlightBoxes.length * 3);
         
         
 		for (let i = 0; i < clipBoxes_in.length; i++) {
@@ -381,6 +382,7 @@ export class ExtendPointCloudMaterial extends PointCloudMaterial {
 		for (let i = 0; i < highlightBoxes.length; i++) {
 			let box = highlightBoxes[i];  
 			this.uniforms.boxes_highlight.value.set(box.inverse.elements, 16 * i);
+            this.uniforms.boxHighlightColor.value.set(box.box.highlightColor.toArray() , 3 * i)
 		}
 
 

+ 5 - 2
src/materials/shaders/pointcloud_new.vs

@@ -104,7 +104,8 @@ uniform float uOrthoHeight;
 
  
 #if defined(num_highlightBox) && num_highlightBox > 0
-    uniform mat4 boxes_highlight[num_highlightBox];   
+    uniform mat4 boxes_highlight[num_highlightBox];  
+    uniform vec3 boxHighlightColor[num_highlightBox];
 #endif        
 		 
 
@@ -1023,14 +1024,16 @@ void doClipping(vec4 world){
     #if defined(num_highlightBox) && num_highlightBox > 0
         //当有高亮box时,需要在任一可见高亮内都高宽
         bool highlight = false;
+        int index;
 		for(int i = 0; i < num_highlightBox; i++){ 
             if(insideBox(boxes_highlight[i], world)){
                 highlight = true;
+                index = i;
                 break;
             } 
 		}
         if(highlight){
-            vColor.r += 0.5; 
+            vColor = mix(vColor, boxHighlightColor[index],  0.5); 
         }
 	#endif
  

+ 1 - 1
src/utils/VolumeNew.js

@@ -194,7 +194,7 @@ export class BoxVolume extends Volume{
 		this.frame = LineDraw.createFatLine(
                 boxFrameGeometry.vertices, 
                 { color: colors[this.clipTask], opacity:LineOpacity.default, lineWidth:1,  dontAlwaysSeen:true}   )
-                      
+        this.highlightColor = new THREE.Color(1,0,0)
         // this.frame.mode = THREE.Lines;
 		this.add(this.frame);