|
@@ -9,6 +9,9 @@ export const enter = (dom, isLocal) => {
|
|
|
//Potree.fileServer = axios
|
|
|
Potree.settings.libsUrl = '../lib/'
|
|
|
|
|
|
+ const tagLimitDis = 8;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
let {THREE} = Potree.mergeEditStart(dom)
|
|
|
let MergeEditor = viewer.modules.MergeEditor
|
|
@@ -21,16 +24,23 @@ export const enter = (dom, isLocal) => {
|
|
|
sceneBus.emit('cameraChange', { x: pos.x, y: pos.y, z: pos.z, rotate: camera.rotation })
|
|
|
}
|
|
|
})
|
|
|
+ viewer.addEventListener('webglError', e => {
|
|
|
+ console.error('viewer webglError: ' + e)
|
|
|
+ sceneBus.emit('webglError', { msg: e.msg })
|
|
|
+ })
|
|
|
|
|
|
window.THREE = THREE
|
|
|
-
|
|
|
- let autoLoads = []
|
|
|
- let autoLoadsDone = []
|
|
|
-
|
|
|
+ //isLocal = false
|
|
|
+ let autoLoads = []
|
|
|
+ let readyToAddModel
|
|
|
+ let maxLoadingCount = /* isLocal ? 1 : */2; //正在加载模型的最大数目
|
|
|
+
|
|
|
|
|
|
let sdk = {
|
|
|
sceneBus,
|
|
|
- getPositionByScreen(pos2d, mustModelId ){//通过屏幕坐标获取真实坐标 . mustModelId: 如果指定了模型,modelId必须为mustModelId才有效
|
|
|
+ getPositionByScreen(pos2d, hopeModelId ){//通过屏幕坐标获取真实坐标 . hopeModelId: 如果指定了模型,优先返回hopeModelId上的intersect
|
|
|
+ console.log('getPositionByScreen',hopeModelId)
|
|
|
+ hopeModelId = null
|
|
|
let worldPos, localPos, modelId, intersect
|
|
|
let Handler = viewer.inputHandler
|
|
|
|
|
@@ -39,19 +49,22 @@ export const enter = (dom, isLocal) => {
|
|
|
pos2d.clientY = pos2d.y
|
|
|
pos2d.onlyGetIntersect = true
|
|
|
pos2d.whichPointcloud = true
|
|
|
- if(mustModelId != void 0){//隐藏其他的模型
|
|
|
+ if(hopeModelId != void 0){//隐藏其他的模型
|
|
|
let models = MergeEditor.getAllObjects()
|
|
|
models.forEach(model=>{
|
|
|
- viewer.updateVisible(model, 'forPick', model.dataset_id == mustModelId)
|
|
|
+ viewer.updateVisible(model, 'forPick', model.dataset_id == hopeModelId)
|
|
|
})
|
|
|
}
|
|
|
- intersect = Handler.onMouseMove(pos2d)
|
|
|
- if(mustModelId != void 0){//恢复
|
|
|
+ let intersect2 = Handler.onMouseMove(pos2d)
|
|
|
+ if(hopeModelId != void 0){//恢复
|
|
|
let models = MergeEditor.getAllObjects()
|
|
|
models.forEach(model=>{
|
|
|
viewer.updateVisible(model, 'forPick', true)
|
|
|
})
|
|
|
}
|
|
|
+ if(intersect2 && intersect2.location){
|
|
|
+ intersect = intersect2
|
|
|
+ }
|
|
|
}
|
|
|
if (pos2d && pos2d.inDrag) {
|
|
|
reGet()
|
|
@@ -59,7 +72,7 @@ export const enter = (dom, isLocal) => {
|
|
|
intersect = Handler.intersect
|
|
|
if(intersect){
|
|
|
modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
|
|
|
- if(mustModelId != void 0 && modelId != mustModelId){
|
|
|
+ if(hopeModelId != void 0 && modelId != hopeModelId){
|
|
|
reGet()
|
|
|
}
|
|
|
}
|
|
@@ -67,9 +80,9 @@ export const enter = (dom, isLocal) => {
|
|
|
|
|
|
if (intersect && intersect.location) {
|
|
|
modelId = intersect.pointcloud ? intersect.pointcloud.dataset_id : intersect.object.dataset_id
|
|
|
- if(mustModelId != void 0 && modelId != mustModelId){
|
|
|
+ /* if(hopeModelId != void 0 && modelId != hopeModelId){
|
|
|
return null
|
|
|
- }
|
|
|
+ } */
|
|
|
worldPos = intersect.location.clone()
|
|
|
localPos = Potree.Utils.datasetPosTransform({ toDataset: true, datasetId:modelId, position:worldPos })
|
|
|
} else return null
|
|
@@ -82,14 +95,30 @@ export const enter = (dom, isLocal) => {
|
|
|
|
|
|
|
|
|
|
|
|
- getScreenByPosition(pos3d, modelId){//通过模型局部坐标获取屏幕坐标
|
|
|
+ getScreenByPosition(pos3d, modelId, canShelter/* , disToCameraLimit */){//通过模型局部坐标获取屏幕坐标
|
|
|
+
|
|
|
+
|
|
|
let isLocal = modelId != void 0
|
|
|
pos3d = new THREE.Vector3().copy(pos3d)
|
|
|
let worldPos = isLocal ? Potree.Utils.datasetPosTransform({ fromDataset: true, datasetId: modelId, position:pos3d}) : pos3d
|
|
|
- if(!worldPos)return
|
|
|
+ if(!worldPos)return
|
|
|
+
|
|
|
+
|
|
|
+ if(canShelter){
|
|
|
+ if(viewer.inputHandler.ifBlockedByIntersect(worldPos, 0.1, true)) return {trueSide:false};
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
var viewport = viewer.mainViewport
|
|
|
var camera = viewport.camera
|
|
|
var dom = viewer.renderArea
|
|
|
+ if(tagLimitDis != void 0){
|
|
|
+ if(camera.position.distanceTo(worldPos) > tagLimitDis)return false
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
//console.log('getScreenByPoint ' + pos3d.toArray())
|
|
|
return Potree.Utils.getPos2d(worldPos, camera, dom, viewport)
|
|
|
},
|
|
@@ -326,45 +355,80 @@ export const enter = (dom, isLocal) => {
|
|
|
//scaleRange: { min, max }, opacityRange: { min, max }, bottomRange: { min, max } })
|
|
|
|
|
|
addModel(props){
|
|
|
+
|
|
|
let bus = mitt()
|
|
|
//console.log('addModel',props)
|
|
|
props.isFirstLoad = props.bottom == void 0 //在编辑时用户添加的
|
|
|
if(props.opacity == void 0) props.opacity = 1
|
|
|
props.scale /= 100
|
|
|
- var oneByOne = !!isLocal;
|
|
|
-
|
|
|
- if(!props.isFirstLoad){
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(!props.isFirstLoad){
|
|
|
+ if(autoLoads.length == 0){ //首次加载
|
|
|
+ setTimeout(()=>{
|
|
|
+ let sizes = autoLoads.map(e=>e.size||'0')
|
|
|
+ console.log('需要请求加载的模型大小为', sizes, '总大小', sizes.reduce(function(total, currentValue ){
|
|
|
+ let current = parseFloat(currentValue)
|
|
|
+ return total + (currentValue.includes('M') ? current : current / 1024)
|
|
|
+ }, 0))
|
|
|
+
|
|
|
+ readyToAddModel = true //准备开始加载
|
|
|
+ startLoad(autoLoads[0])
|
|
|
+ },30)
|
|
|
+ }
|
|
|
autoLoads.push(props)
|
|
|
+ }else{
|
|
|
+ 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)
|
|
|
- console.log('startLoad', prop)
|
|
|
+ prop.loading = true
|
|
|
+ console.log('startLoad',getName(prop.url), prop )
|
|
|
}
|
|
|
|
|
|
let spliceFromArr = (model,loaded)=>{
|
|
|
- let index = autoLoads.indexOf(props)
|
|
|
- if(index>-1){
|
|
|
- autoLoads.splice(index,1)
|
|
|
-
|
|
|
- if(loaded){
|
|
|
- autoLoadsDone.push(model)
|
|
|
- }
|
|
|
+ //let autoLoads.find()
|
|
|
+ props.loadFinish = true
|
|
|
+ props.loading = false
|
|
|
+
|
|
|
+ if(loaded){
|
|
|
+ props.loaded = true
|
|
|
+ props.model = model
|
|
|
+ }else{
|
|
|
+ props.error = true
|
|
|
}
|
|
|
-
|
|
|
- if(oneByOne && autoLoads[0]){
|
|
|
- startLoad(autoLoads[0])
|
|
|
+
|
|
|
+ let haventLoad = autoLoads.filter(e=>!e.loading && !e.loadFinish);
|
|
|
+ if( haventLoad[0]){
|
|
|
+ startLoad(haventLoad[0])
|
|
|
|
|
|
//this.addModel(autoLoads[0])
|
|
|
- }else if(autoLoads.length == 0 && autoLoadsDone.length>0){//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;
|
|
|
- MergeEditor.focusOn(autoLoadsDone, 1000)
|
|
|
+ }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.visible = true)
|
|
|
+
|
|
|
+ MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let model
|
|
|
let done = (model_)=>{
|
|
|
model = model_
|
|
|
- props.opacity < 1 && result.changeOpacity(props.opacity)
|
|
|
+ if(!props.isFirstLoad){
|
|
|
+ model.visible = false//先不显示,防止卡顿
|
|
|
+ }
|
|
|
+ props.opacity < 100 && result.changeOpacity(props.opacity)
|
|
|
|
|
|
model.addEventListener('changeSelect',(e)=>{
|
|
|
bus.emit('changeSelect',e.selected)
|
|
@@ -388,8 +452,8 @@ export const enter = (dom, isLocal) => {
|
|
|
|
|
|
let onError = function ( xhr ) {
|
|
|
bus.emit('loadError', xhr)
|
|
|
+ console.log('loadError!!!!!!!!!', getName(props.url), props.size, xhr)
|
|
|
spliceFromArr(model,false)
|
|
|
- console.log('loadError!!!!!!!!!', props.url, props.size, xhr)
|
|
|
}
|
|
|
|
|
|
if(props.type == "glb"){////////////////////////////test
|
|
@@ -405,36 +469,42 @@ export const enter = (dom, isLocal) => {
|
|
|
props.done = done; props.progressFun = progressFun; props.onError = onError
|
|
|
|
|
|
|
|
|
-
|
|
|
- if(!oneByOne || autoLoads.length==1){
|
|
|
- startLoad(props)
|
|
|
- }
|
|
|
+ if(readyToAddModel){
|
|
|
+
|
|
|
+ if(autoLoads.filter(e=>e.loading).length<maxLoadingCount ){
|
|
|
+ startLoad(props)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
|
|
|
let result = {
|
|
|
bus,
|
|
|
changeShow(show){
|
|
|
- if(model){
|
|
|
- viewer.updateVisible(model, 'changeShow', show)
|
|
|
+ if(model){
|
|
|
+ viewer.updateVisible(model, 'changeShow', show)
|
|
|
}
|
|
|
},
|
|
|
changeSelect(state){
|
|
|
if(model){
|
|
|
MergeEditor.selectModel(model, state, true, true)
|
|
|
if(state && viewer.inputHandler.selection[0]){
|
|
|
- viewer.transformObject(model); //交换
|
|
|
+ MergeEditor.transformControls.attach(model) //viewer.transformObject(model); //交换
|
|
|
}
|
|
|
+ //console.log('changeSelect', props.id, state)
|
|
|
}
|
|
|
},
|
|
|
changeScale(s){
|
|
|
if(model){
|
|
|
s /= 100
|
|
|
model.scale.set(s,s,s)
|
|
|
+ model.isPointcloud && model.changePointSize(Potree.config.material.realPointSize * s)
|
|
|
model.dispatchEvent("scale_changed")
|
|
|
}
|
|
|
},
|
|
|
- changeOpacity(opacity){
|
|
|
- if(opacity == void 0)opacity = 1
|
|
|
+ changeOpacity(opacity){
|
|
|
+ if(opacity == void 0)opacity = 100
|
|
|
+ opacity/=100
|
|
|
if(model){
|
|
|
if(model.isPointcloud){
|
|
|
model.material.opacity = opacity
|
|
@@ -449,24 +519,30 @@ export const enter = (dom, isLocal) => {
|
|
|
},
|
|
|
enterRotateMode(){
|
|
|
if(model){
|
|
|
- viewer.transformObject(model);
|
|
|
+ MergeEditor.transformControls.attach(model)
|
|
|
+ MergeEditor.transformControls.mode = 'rotate'
|
|
|
+ /* viewer.transformObject(model);
|
|
|
viewer.transformationTool.setModeEnable('rotation',true)
|
|
|
- viewer.transformationTool.setModeEnable('translation',false)
|
|
|
+ viewer.transformationTool.setModeEnable('translation',false) */
|
|
|
}
|
|
|
},
|
|
|
enterMoveMode(){
|
|
|
if(model){
|
|
|
- viewer.transformObject(model);
|
|
|
+
|
|
|
+ MergeEditor.transformControls.attach(model)
|
|
|
+ MergeEditor.transformControls.mode = 'translate'
|
|
|
+ /* viewer.transformObject(model);
|
|
|
viewer.transformationTool.setModeEnable('rotation',false)
|
|
|
- viewer.transformationTool.setModeEnable('translation',true)
|
|
|
+ viewer.transformationTool.setModeEnable('translation',true) */
|
|
|
}
|
|
|
},
|
|
|
leaveTransform(){
|
|
|
- viewer.transformObject(null);
|
|
|
+ //viewer.transformObject(null);
|
|
|
+ MergeEditor.transformControls.detach()
|
|
|
},
|
|
|
|
|
|
destroy(){
|
|
|
- MergeEditor.removeModel(model)
|
|
|
+ model && MergeEditor.removeModel(model)
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -482,10 +558,12 @@ export const enter = (dom, isLocal) => {
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
+ function getName(url){
|
|
|
+ return url.split('/').pop()
|
|
|
+ }
|
|
|
|
|
|
|
|
|
-
|
|
|
+ console.log('版本: 2022.8.23-1')
|
|
|
|
|
|
return sdk
|
|
|
}
|