Browse Source

融合页面更新

xzw 2 years ago
parent
commit
b2ed298dec

+ 9 - 4
src/custom/materials/BasicMaterial.js

@@ -8,8 +8,9 @@ class BasicMaterial  extends THREE.ShaderMaterial{
         
        super( Object.assign({},{ 
             uniforms:{
-                map:    { type: 't',  value: o.map },
-                opacity : {type:'f', value : o.opacity == void 0 ? 1 : o.opacity }
+                color:  {type:'v3',   value: o.color || new THREE.Color("#FFF")} ,
+                map:    {type: 't',    value: o.map },
+                opacity : {type:'f',    value : o.opacity == void 0 ? 1 : o.opacity }
             },
             vertexShader: Shaders['basicTextured.vs'],   
             fragmentShader: Shaders['basicTextured.fs']  
@@ -36,8 +37,12 @@ class BasicMaterial  extends THREE.ShaderMaterial{
     
     set map(o){
         this.uniforms.map.value = o
-         
-          
+        if(o){
+            this.defines.HasMap = '';
+        }else{
+            delete this.defines.HasMap
+        }
+        console.log('hasMap', !!o, this.name )
     }
     get map(){
         return this.uniforms.map.value  

+ 4 - 3
src/custom/mergeStartTest.js

@@ -511,8 +511,9 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                 
                 var path = `${Potree.resourcePath}/models/glb/` 
                 viewer.loadModel({ 
+                    fileType:'glb',
                     name, 
-                    glburl: path+fileName,
+                    url: path+fileName,
                     transform : { 
                         rotation : [angle,  0,   0],
                         position : [0,0,0]  
@@ -523,14 +524,14 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
             }else if(name == '3dTiles'){
                  
                 viewer.loadModel({ 
-                    name, 
+                    fileType:'3dTiles',
                     /*  tilesUrl: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
                     transform : { 
                         rotation : [Math.PI/2,  0,   0],
                         position : [0,0,0]  
                     }  */    
    
-                    tilesUrl: 'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
+                    url: 'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
                     transform : { 
                         rotation : [/* Math.PI/2,   */0,  0,   0],
                         position : [0,0,0]   

+ 22 - 19
src/custom/modules/mergeModel/MergeEditor.js

@@ -458,7 +458,7 @@ let MergeEditor = {
         if(!by2d && model){
             model.dispatchEvent({type:'changeSelect', selected : state})
         }
-         
+        
     },
     
     
@@ -477,14 +477,16 @@ let MergeEditor = {
             
             this.timer = setTimeout(()=>{
                 viewer.outlinePass.selectedObjects = []
+                viewer.dispatchEvent('content_changed') 
             }, 1000)
         }else{
             if(state === false){
                 viewer.outlinePass.selectedObjects = []
             }else{
                 viewer.outlinePass.selectedObjects = [model]
-            }
+            } 
         }
+        viewer.dispatchEvent('content_changed') 
     },
     
     /*updateEdgeStrength(){
@@ -606,12 +608,10 @@ let MergeEditor = {
                 measure.update() 
                 measure.setSelected(false)//隐藏edgelabel  
             }
-        })
-        
-          
-     
+        }) 
         
         model.lastMatrixWorld = model.matrixWorld.clone()
+        viewer.dispatchEvent('content_changed')
     },
     
     
@@ -625,33 +625,36 @@ let MergeEditor = {
             //MergeEditor.updateEdgeStrength()
         }else{
             //model.traverse(e=>e.material && setOp(e, opacity))
-            model.traverse(mesh=>{
+            model.traverse(mesh=>{ 
                 if(mesh.material){ 
-                
-                    mesh.material.opacity = opacity
-                    if(opacity<1){
-                        mesh.material.transparent = true 
-                        if(model.isPointcloud){
-                            mesh.changePointOpacity(opacity)  
+                    if(mesh.material.originOpacity == void 0 ){
+                        mesh.material.originOpacity = mesh.material.opacity
+                    }
+                    mesh.material.opacity = mesh.material.originOpacity * opacity
+                    
+                    if(mesh.material.opacity<1){
+                        mesh.material.transparent = true  
+                        /* if(model.isPointcloud){
+                            mesh.changePointOpacity(realOpacity)  
                         }else{
-                            mesh.material.opacity = opacity
-                        }
+                            mesh.material.opacity = realOpacity
+                        } */
                         
                         mesh.renderOrder = Potree.config.renderOrders.model+1 
-                        mesh.material.depthWrite = false
+                        //mesh.material.depthWrite = false
                     }else{
                         mesh.material.transparent = false
                         mesh.renderOrder = Potree.config.renderOrders.model
-                        mesh.material.depthWrite = true
+                        //mesh.material.depthWrite = true
                     }
-                
+                    mesh.material.depthWrite = mesh.material.opacity>0.3
                 }
             })
         }
             
               
         isRoot && (model.opacity = opacity)//记录在最外层
-
+        viewer.dispatchEvent('content_changed')
         
     },
     

+ 2 - 2
src/custom/potree.shim.js

@@ -480,8 +480,8 @@ Utils.screenPass = new function () {
 			(composer || renderer).render(this.screenScene, this.camera);
 		} else {
             let oldTarget = renderer.getRenderTarget()
-            renderer.setRenderTarget(target)
-            renderer.clear(); 
+            renderer.setRenderTarget(target);
+            //renderer.clear();   //有时候不能clear,如renderBG后再
 			(composer || renderer).render(this.screenScene, this.camera);
             renderer.setRenderTarget(oldTarget)  
 		}

+ 28 - 13
src/custom/start.js

@@ -542,11 +542,12 @@ export function mergeEditStart(dom){
     }
     
     Potree.settings.sizeFitToLevel = true//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
-    Potree.loadPointCloudScene = function(sceneCode, type, id, done, onError){//对应4dkk的场景码
+    Potree.loadPointCloudScene = function(url, type, id, title, done, onError){//对应4dkk的场景码
           
-        let loadCloud = (cloudPath, sceneName, sceneCode, timeStamp, color)=>{
+        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
@@ -562,6 +563,8 @@ export function mergeEditStart(dom){
                 pointcloud.timeStamp = timeStamp 
                 //transformPointcloud(pointcloud, originDataset)
                 scene.addPointCloud(pointcloud);
+                 
+                
                 {
                     
                     viewer.updateModelBound()
@@ -587,19 +590,29 @@ export function mergeEditStart(dom){
         }
         
         if(type == 'laser'){ 
-            Potree.loadDatasets((data)=>{
+            let sceneCode = url
+            Potree.loadDatasets((data)=>{ 
                 let originDataset = data.find(e=>e.sceneCode == sceneCode);//只加载初始数据集  
                 let timeStamp = originDataset.updateTime ? originDataset.updateTime.replace(/[^0-9]/ig,'') : '';  //每重算一次后缀随updateTime更新一次 
                 //let cloudPath = `${Potree.settings.urls.prefix1}/${Potree.settings.webSite}/${sceneCode}/data/${sceneCode}/webcloud/cloud.js` 
                 let cloudPath = `${Potree.settings.urls.prefix1}/${originDataset.webBin}`  //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
                 
-                loadCloud(cloudPath, originDataset.sceneName, sceneCode, timeStamp, originDataset.color)
+                loadCloud({cloudPath, sceneName:originDataset.sceneName, sceneCode, timeStamp, color:originDataset.color})
             }, sceneCode, onError)
         
-        }else{//las or ply
-            let name = type + '|' + id
-            let cloudPath = sceneCode + '/cloud.js' 
-            loadCloud(cloudPath, name, name, '' )
+        }else{//las or ply  直接用url
+            let name = type + '|' + id + '|' + title
+             
+            if(url instanceof Array){
+                if(url.length == 1){
+                    url = url[0]
+                }else{
+                    console.error('有多个点云?暂时还不支持', url, name)//多个点云要一起移动没想好怎么写
+                }      
+            }
+            
+            let cloudPath = url + '/cloud.js' 
+            loadCloud({cloudPath, sceneName:name, sceneCode:name, timeStamp:'' })
         }   
          
     } 
@@ -786,10 +799,11 @@ export function mergeEditStart(dom){
             
              
             let info = { 
-                name: prop.type, 
+                fileType: prop.type, 
                 id: prop.id,
                 unlit:true,
-                glburl : prop.url,
+                url : prop.url,
+                name : prop.title,
                 /* transform : { 
                     position : prop.position,
                     rotation : new THREE.Euler().setFromVector3(prop.rotation), 
@@ -813,8 +827,9 @@ export function mergeEditStart(dom){
             }
         
             viewer.loadModel({ 
-                name: '3dTiles', 
+                fileType: '3dTiles', 
                 id: prop.id,
+                name : prop.title,
                 /* tilesUrl: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
                 transform : { 
                     rotation : [Math.PI/2,  0,   0],
@@ -827,7 +842,7 @@ export function mergeEditStart(dom){
                     position : [0,0,0]  
                 }  */
                 
-                tilesUrl:prop.url,
+                url:prop.url,
                 
             },callback,onprogress)
         
@@ -836,7 +851,7 @@ export function mergeEditStart(dom){
             
              //else if(prop.type == 'las' || prop.type == 'ply')
  
-            Potree.loadPointCloudScene(prop.url, prop.type, prop.modelId, (pointcloud)=>{  
+            Potree.loadPointCloudScene(prop.url, prop.type, prop.modelId, prop.title, (pointcloud)=>{  
                 pointcloud.matrixAutoUpdate = true
                 pointcloud.initialPosition = pointcloud.position.clone()
                 

+ 78 - 32
src/custom/viewer/ViewerNew.js

@@ -2714,11 +2714,11 @@ export class Viewer extends ViewerBase{
 		let pRenderer = this.getPRenderer();
         let viewports = params_.viewports || this.viewports
         
-        if(!this.needRender){
+        /* if(!this.needRender){
             viewports = viewports.filter(v=>v.needRender) //可以渲染的条件是viewer或viewport的needRender为true
         }
         viewports = viewports.filter(v=>v.active) 
-        if(viewports.length == 0)return   
+        if(viewports.length == 0)return    */
 		 
         viewer.addTimeMark('renderDefault','start')
         
@@ -3060,13 +3060,23 @@ export class Viewer extends ViewerBase{
         
         if(vrActive){
             this.renderVR();
-        }else{
-            if(this.outlinePass.selectedObjects.length && this.outlinePass.edgeStrength > 0 && !params.screenshot){  
-                let scenes = this.inputHandler.interactiveScenes.concat(this.scene.scene).concat(viewer.scene.scenePointCloud) 
-                this.composer.render(scenes, null, this.viewports, this.renderDefault.bind(this));  
-            }else{  
-                this.renderDefault(params);
-            }  
+        }else{ 
+            let viewports = params.viewports || this.viewports
+        
+            if(!this.needRender){
+                viewports = viewports.filter(v=>v.needRender) //可以渲染的条件是viewer或viewport的needRender为true
+            }
+            viewports = viewports.filter(v=>v.active) 
+            if(viewports.length > 0){   
+                params.viewports = viewports 
+            
+                if(this.outlinePass.selectedObjects.length && this.outlinePass.edgeStrength > 0 && !params.screenshot){  
+                    let scenes = this.inputHandler.interactiveScenes.concat(this.scene.scene).concat(viewer.scene.scenePointCloud) 
+                    this.composer.render(scenes, null, this.viewports, this.renderDefault.bind(this));  
+                }else{  
+                    this.renderDefault(params);
+                } 
+            }            
         }
 		viewer.addTimeMark('render','end')
 	} 
@@ -4253,17 +4263,56 @@ export class Viewer extends ViewerBase{
         /* if(!Potree.settings.boundAddObjs){
            boundingBox.min.set(-0.5,-0.5,-0.5); boundingBox.max.set(0.5,0.5,0.5) 
         } */ 
-        let fileType =  fileInfo.tilesUrl ? '3dTiles' :  fileInfo.objurl ? 'obj' : 'glb'
-        let loadDone = (object, total, url)=>{
+        if(fileInfo.objurl){ 
+            fileInfo.url = fileInfo.objurl,   fileInfo.fileType = 'obj'   //兼容最早的 
+        }
+        if(fileInfo.url instanceof Array){
+            if(fileInfo.url.length == 1){
+                fileInfo.url =  fileInfo.url[0]
+            }else{
+                fileInfo.loadedCount = 0  
+                fileInfo.modelGroup = new THREE.Object3D; //parentGroup.name = fileInfo.title
+                fileInfo.url.forEach((url,i)=>{
+                    let fileInfoS = Common.CloneObject(fileInfo)
+                    fileInfoS.url = url  
+                    fileInfoS.name = 'child-'+i
+                    fileInfoS.parentInfo = fileInfo
+                    this.loadModel(fileInfoS, done, onProgress_, onError)
+                })  
+                return
+            }
+        }
+        
+        
+        //let fileType =  fileInfo.tilesUrl ? '3dTiles' :  fileInfo.objurl ? 'obj' : 'glb'
+         
+        
+        let loadDone = (object,   fileInfo_    /* , total, url */)=>{ 
+            /* let weight = Math.round((total / 1024 / 1024) * 100) / 100;
+            url && console.log(url.split('/').pop() ,  '加载完毕, 模型数据量:' + weight + 'M')
+             */
+            fileInfo_ = fileInfo_ || fileInfo
+            if(fileInfo_.parentInfo){
+                object.name = fileInfo_.name   
+                fileInfo_.parentInfo.loadedCount ++
+                fileInfo_.parentInfo.modelGroup.add(object) 
+                if(fileInfo_.parentInfo.loadedCount == fileInfo_.parentInfo.url.length){ 
+                    return loadDone(fileInfo_.parentInfo.modelGroup, fileInfo_.parentInfo)
+                }else{ 
+                    return
+                }   
+            }
+            
+            object.name = fileInfo_.name != void 0 ? fileInfo_.name : fileInfo_.type
+            object.boundingBox = boundingBox  //未乘上matrixWorld的本地boundingBox
             //object.scale.set(1,1,1);//先获取原始的大小时的boundingBox
             object.opacity = 1 //初始化 记录
             object.updateMatrixWorld()
-            let weight = Math.round((total / 1024 / 1024) * 100) / 100;
-            if(fileInfo.id != void 0)object.dataset_id = fileInfo.id
             
-            console.log(url.split('/').pop() ,/*  fileInfo.id,  */ '加载完毕, 模型数据量:' + weight + 'M')
+            if(fileInfo_.id != void 0)object.dataset_id = fileInfo_.id
+            
             
-            if(fileType == '3dTiles'){
+            if(fileInfo_.fileType == '3dTiles'){
                 let tileset = object.runtime.getTileset()
                
                 //TileHeader: tileset.root 
@@ -4326,15 +4375,13 @@ export class Viewer extends ViewerBase{
                         }
                     }
                 } );
-            }
-           
-            object.name = fileInfo.name != void 0 ? fileInfo.name : 'obj'
+            } 
             this.objs.add(object) 
-            object.boundingBox = boundingBox  //未乘上matrixWorld的本地boundingBox
             
-            if(fileInfo.transform){
+            
+            if(fileInfo_.transform){
                 let setTransfrom = (name)=>{
-                    let value = fileInfo.transform[name]
+                    let value = fileInfo_.transform[name]
                     if(!value)return
                     if(value instanceof Array){
                         object[name].fromArray(value)
@@ -4348,7 +4395,7 @@ export class Viewer extends ViewerBase{
             }
             
             
-            if(fileInfo.moveWithPointcloud){
+            if(fileInfo_.moveWithPointcloud){
                 object.updateMatrix();
                 object.matrixAutoUpdate = false
                 object.matrix.premultiply(viewer.scene.pointclouds[0].transformMatrix) //默认跟随第一个数据集
@@ -4368,27 +4415,26 @@ export class Viewer extends ViewerBase{
             }  
         };
     
-        if(fileType == 'obj'){ 
+        if(fileInfo.fileType == 'obj'){ //暂时不支持数组
             loaders.mtlLoader.load( fileInfo.mtlurl , (materials)=>{ 
                 materials.preload(); 
         
                 loaders.objLoader.setMaterials( materials ).load(fileInfo.objurl, (object, total)=>{  
-                    loadDone(object, total, fileInfo.objurl)
+                    loadDone(object/* , total, fileInfo.objurl */)
                 })
             } , onProgress,  onError  );  
             
-        }else if(fileType == 'glb'){
+        }else if(fileInfo.fileType == 'glb'){
             loaders.glbLoader.unlitMat = true//!!fileInfo.unlit
-            loaders.glbLoader.load(fileInfo.glburl,  ( gltf, total )=>{     //.setPath( Potree.resourcePath + '/models/glb/'  );
+            loaders.glbLoader.load(fileInfo.url,  ( gltf, total )=>{    
                 //console.log('loadGLTF', gltf)
-                loadDone(gltf.scene, total, fileInfo.glburl) 
+                loadDone(gltf.scene/* , total, fileInfo.url */) 
             }, onProgress, onError)
             
-        }else if(fileType == '3dTiles'){
-            
-            
+        }else if(fileInfo.fileType == '3dTiles'){
+             
             let result = await Loader3DTiles.load({
-                url: fileInfo.tilesUrl,
+                url: fileInfo.url,
                 gltfLoader : loaders.glbLoader, 
                 //renderer: SceneRenderer.renderer  
                 options: {
@@ -4401,7 +4447,7 @@ export class Viewer extends ViewerBase{
             })
             console.log(result)
             result.model.runtime = result.runtime
-            loadDone(result.model, null, fileInfo.tilesUrl)  
+            loadDone(result.model/* , null, fileInfo.url */)  
               
 
               

+ 16 - 3
src/materials/shaders/basicTextured.fs

@@ -1,9 +1,22 @@
 varying vec2 vUv;
 uniform float opacity;
-uniform sampler2D map;
+ 
+uniform vec3 color;
+#ifdef HasMap
+    uniform sampler2D map;   
+#endif
 
 
 void main() {
-  vec4 texColor = texture2D(map, vUv);
-  gl_FragColor = vec4(texColor.rgb, texColor.a * opacity);
+     
+    #ifdef HasMap
+        vec4 texColor = texture2D(map, vUv);
+        gl_FragColor = texColor * vec4(color, opacity);
+    #else
+        gl_FragColor = vec4(color, opacity);
+    #endif
+ 
+  
+    //gl_FragColor = vec4(texColor.rgb, texColor.a * opacity);
+   
 }