Ver código fonte

fix: 支持多个(2)模型同时加载

xzw 1 ano atrás
pai
commit
c947afe754
1 arquivos alterados com 73 adições e 50 exclusões
  1. 73 50
      src/sdk/cover/index.js

+ 73 - 50
src/sdk/cover/index.js

@@ -457,7 +457,7 @@ export const enter = (dom, isLocal) => {
             requestLoadCount++ */ 
             //console.log(props.isDynamicAdded, props.mode)
  
-            let bus = mitt()  
+            let bus = props.bus = mitt()
             //console.log('addModel',props)
             props.isFirstLoad = isLocal ? props.bottom == void 0 : (props.isDynamicAdded || props.mode == 'single')  // 在编辑时用户添加的 或 展示单个模型 (props.mode='single'模型展示页, props.mode='many'融合页)
             if(props.opacity == void 0)  props.opacity = 1 
@@ -468,7 +468,12 @@ export const enter = (dom, isLocal) => {
                     props.rotation = new THREE.Euler().setFromVector3(props.rotation)
                 }
             }
-
+            let getDefaultRotation = () => {
+                //0看看,1看见,2深时,3用户上传三维模型,4深时mesh,5深光点云,6深光mesh
+                if (props.fromType == 1 || props.fromType == 6 || props.fromType == 4 && props.type != 'glb') {//来自4dkk的3dtiles初始需要转90度
+                    return new THREE.Euler(Math.PI / 2, 0, 0)
+                } else return new THREE.Euler(0, 0, 0)
+            }
 
 
             if(!props.isFirstLoad){ 
@@ -481,58 +486,24 @@ export const enter = (dom, isLocal) => {
                         }, 0))
                          
                         readyToAddModel = true  //准备开始加载
-                        startLoad(autoLoads[0])
+                        loadNext()//startLoad(autoLoads[0])
                     },30) 
                 }
                 autoLoads.push(props)
                 readyToAddModel = false               
             }else{
-                readyToAddModel = true 
-            }
+                readyToAddModel = true
              
-            
-            
-            let startLoad = (prop)=>{
-                //if(autoLoads.filter(e=>e.loaded).length>1)return console.log('取消加载', prop), prop.onError()
-                
-                //return prop.onError()
-            
-                Potree.addModel(prop,  prop.done , prop.progressFun, prop.onError)
-                prop.loading = true
-                console.log('-------开始加载 id:', prop.id, 'title:', prop.title, ', filename:', Potree.Common.getNameFromURL(prop.url),  prop ) 
+
+                props.rotation = getDefaultRotation()
             }
             
-            let spliceFromArr = (model,loaded)=>{
-                //let autoLoads.find()
-                props.loadFinish = true
-                props.loading = false
-                  
-                if(loaded){
-                    props.loaded = true
-                    props.model = model
-                }else{
-                    props.error = true 
-                }
-               
-                let haventLoad = autoLoads.filter(e=>!e.loading && !e.loadFinish);
-                if( haventLoad[0]){
-                    startLoad(haventLoad[0])
-                     
-                    //this.addModel(autoLoads[0])
-                }else if(autoLoads.filter(e=>!e.loadFinish).length == 0 && autoLoads.filter(e=>e.loaded).length>0 && !props.isFirstLoad){//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
-                    let autoLoadsDone = autoLoads.filter(e=>e.loaded).map(e=>e.model)
-                    console.log('所有模型加载完毕')
-                    autoLoads.filter(e=>e.loaded && e.show).forEach(e=>e.model.visible = true)
-                    
-                    MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
-                    autoLoads.length = 0
-                    
-                }  
-            }
             
+             
             let model
             let done = (model_)=>{
                 model = model_
+                model.result_ = result
                 if(!props.isFirstLoad){
                     model.visible = false//先不显示,防止卡顿
                 }
@@ -559,7 +530,7 @@ export const enter = (dom, isLocal) => {
                     //console.log(msg)
                     bus.emit('transformChanged', msg )
                 }) 
-                spliceFromArr(model,true)
+                spliceFromArr(model, props, true)
                 
                                 
                 if(props.mode == 'single'){//模型查看页
@@ -581,7 +552,7 @@ export const enter = (dom, isLocal) => {
             let onError = function ( xhr ) {
                 bus.emit('loadError', xhr)
                 console.log('loadError!!!!!!!!!',  Potree.Common.getNameFromURL(props.url), props.size, xhr) 
-                spliceFromArr(model,false)
+                spliceFromArr(model, props, false)
             }
             
              
@@ -994,13 +965,65 @@ export const enter = (dom, isLocal) => {
    
  
       
-    
-    //sdk.hideGrid()
-    
-    
-    console.log('版本: 2022.12.20-1')
+    function spliceFromArr(model, props, loaded){
+        //let autoLoads.find()
+        props.loadFinish = true
+        props.loading = false
+
+        if (loaded) {
+            props.loaded = true
+            props.model = model
+        } else {
+            props.error = true
+        }
+
+         
+        if (!loadNext()) {
+            if (autoLoads.filter(e => !e.loadFinish).length == 0 && autoLoads.filter(e => e.loaded).length > 0 && !props.isFirstLoad) {//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
+                let autoLoadsDone = autoLoads.filter(e => e.loaded).map(e => e.model)
+                console.log('所有模型加载完毕')
+                autoLoads.filter(e => e.loaded && e.show).forEach(e => e.model.visible = true)
+
+                MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
+                autoLoads.length = 0
+            }
+        }
+    }
+     
      
-    return sdk 
+    function loadNext(){
+        let haventLoad = autoLoads.filter(e => !e.loading && !e.loadFinish);
+        let loading = autoLoads.filter(e => e.loading);
+        let needLoad = haventLoad.slice(0, maxLoadingCount - loading.length)
+        needLoad.forEach(e => startLoad(e))
+        return haventLoad.length > 0
+    } 
+      
+    function startLoad(prop){ 
+        /* if(prop.raw.visible !== 1){//用于临时隐藏 
+            setTimeout(()=>{
+                spliceFromArr(null, prop, false)
+                prop.bus.emit('loadError' ) 
+            },1) 
+            return
+        }  */  
+        
+        if(prop.loading || prop.loadFinish)return
+        
+        Potree.Log(`--开始加载--`, { font: { color: '#f68' } });
+        console.log('id:', prop.id, ', title:', prop.title, ', filename:', Potree.Common.getNameFromURL(prop.url), ', type:', prop.type, prop)
+
+        prop.unlit = prop.renderType != 'normal'
+        prop.maximumScreenSpaceError = 70
+        prop.prefix = prop.raw.prefix
+        Potree.addModel(prop, prop.done, prop.progressFun, prop.onError)
+        prop.loading = true
+
+    }
+
+
+
+    return sdk
 }
 
 export default enter