|
@@ -216,7 +216,11 @@ export class Viewer extends ViewerBase{
|
|
this.fakeMeasure = {};
|
|
this.fakeMeasure = {};
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
+ setTimeout(()=>{
|
|
|
|
+ if(!Potree.settings.isWebgl2 && !Potree.browser.urlHasValue('webgl1')){
|
|
|
|
+ console.warn('不支持webgl2')
|
|
|
|
+ }
|
|
|
|
+ },3000)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -3218,7 +3222,7 @@ export class Viewer extends ViewerBase{
|
|
let viewports = params_.viewports || this.viewports
|
|
let viewports = params_.viewports || this.viewports
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
+ let renderer = params_.renderer || this.renderer
|
|
viewer.addTimeMark('renderDefault','start')
|
|
viewer.addTimeMark('renderDefault','start')
|
|
|
|
|
|
//console.log('render', viewports.map(e=>e.name).join(','))
|
|
//console.log('render', viewports.map(e=>e.name).join(','))
|
|
@@ -3228,7 +3232,7 @@ export class Viewer extends ViewerBase{
|
|
renderSize = new THREE.Vector2(params_.target.width, params_.target.height) //是画布大小
|
|
renderSize = new THREE.Vector2(params_.target.width, params_.target.height) //是画布大小
|
|
//可能需要viewer.setSize
|
|
//可能需要viewer.setSize
|
|
}else{
|
|
}else{
|
|
- renderSize = this.renderer.getSize(new THREE.Vector2()); //是client大小
|
|
|
|
|
|
+ renderSize = renderer.getSize(new THREE.Vector2()); //是client大小
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3269,7 +3273,7 @@ export class Viewer extends ViewerBase{
|
|
params_.target.viewport.set(left, bottom, width, height);
|
|
params_.target.viewport.set(left, bottom, width, height);
|
|
scissorTest && params_.target.scissor.set(left, bottom, width, height);
|
|
scissorTest && params_.target.scissor.set(left, bottom, width, height);
|
|
params_.target.scissorTest = scissorTest
|
|
params_.target.scissorTest = scissorTest
|
|
- this.renderer.setRenderTarget(params_.target)
|
|
|
|
|
|
+ renderer.setRenderTarget(params_.target)
|
|
}else{
|
|
}else{
|
|
/* if(viewports.length == 1 && left == 0 && bottom == 0){
|
|
/* if(viewports.length == 1 && left == 0 && bottom == 0){
|
|
left = 1 , width-=1 //这种情况下渲染也会有问题,只有鼠标的地方刷新 估计是pick那影响的
|
|
left = 1 , width-=1 //这种情况下渲染也会有问题,只有鼠标的地方刷新 估计是pick那影响的
|
|
@@ -3280,15 +3284,15 @@ export class Viewer extends ViewerBase{
|
|
} */
|
|
} */
|
|
if(viewport.forViewOffset){ //分块渲染,渲染时的camera还是原来的,但加载点云时的camera是分块中的
|
|
if(viewport.forViewOffset){ //分块渲染,渲染时的camera还是原来的,但加载点云时的camera是分块中的
|
|
viewport.forViewOffset.camera.setViewOffset(renderSize.x, renderSize.y, left, renderSize.y - bottom - height, width, height)
|
|
viewport.forViewOffset.camera.setViewOffset(renderSize.x, renderSize.y, left, renderSize.y - bottom - height, width, height)
|
|
- this.renderer.setViewport(0,0,renderSize.x, renderSize.y)
|
|
|
|
|
|
+ renderer.setViewport(0,0,renderSize.x, renderSize.y)
|
|
viewport.resolution.copy(viewport.forViewOffset.originViewport.resolution)
|
|
viewport.resolution.copy(viewport.forViewOffset.originViewport.resolution)
|
|
viewport.resolution2.copy(viewport.forViewOffset.originViewport.resolution2) //后续渲染都当做原先的viewport
|
|
viewport.resolution2.copy(viewport.forViewOffset.originViewport.resolution2) //后续渲染都当做原先的viewport
|
|
}else{
|
|
}else{
|
|
- this.renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围)
|
|
|
|
|
|
+ renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围)
|
|
}
|
|
}
|
|
//scissorTest && console.log('setScissor', left, bottom, width, height)
|
|
//scissorTest && console.log('setScissor', left, bottom, width, height)
|
|
- scissorTest && this.renderer.setScissor( left, bottom, width, height );//规定渲染范围
|
|
|
|
- this.renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
|
|
|
|
|
|
+ scissorTest && renderer.setScissor( left, bottom, width, height );//规定渲染范围
|
|
|
|
+ renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -3304,7 +3308,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
if(viewport.render){
|
|
if(viewport.render){
|
|
if(!viewport.render($.extend({}, params, {
|
|
if(!viewport.render($.extend({}, params, {
|
|
- renderer:this.renderer, clear:this.clear.bind(this), resize:null,
|
|
|
|
|
|
+ renderer, clear:params.clear || this.clear.bind(this), resize:null,
|
|
renderBG:this.renderBG.bind(this), force:true //viewer content_change时map也直接渲染吧 //!viewport.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
|
|
renderBG:this.renderBG.bind(this), force:true //viewer content_change时map也直接渲染吧 //!viewport.noPointcloud //如果要渲染点云,必须也一直渲染地图,否则地图会被覆盖(点云目前未能获取是否改变,也可能有其他动态物体,所以还是一直渲染的好)
|
|
}))) continue//return
|
|
}))) continue//return
|
|
}else{
|
|
}else{
|
|
@@ -3332,7 +3336,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- pRenderer.render(params); //渲染点云 skybox
|
|
|
|
|
|
+ pRenderer.render(params); //渲染点云 skybox。
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3458,7 +3462,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- renderOverlay1(params){
|
|
|
|
|
|
+ renderOverlay1(params){//渲染主要的mesh
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let renderer = params.renderer || this.renderer
|
|
let renderer = params.renderer || this.renderer
|
|
this.reticule.updateAtViewports(params.viewport)
|
|
this.reticule.updateAtViewports(params.viewport)
|
|
@@ -3486,9 +3490,9 @@ export class Viewer extends ViewerBase{
|
|
if('renderBeforeCloud' in params){
|
|
if('renderBeforeCloud' in params){
|
|
this.scene.scene.traverse((object)=>{
|
|
this.scene.scene.traverse((object)=>{
|
|
if(object.material){
|
|
if(object.material){
|
|
- Potree.Utils.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的也最后渲染
|
|
|
|
|
|
+ let transparent = object.material.opacity<1 || object.material.mapTransparent || !object.material.depthTest
|
|
|
|
+ Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud != transparent)
|
|
|
|
+ //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
|
|
}
|
|
}
|
|
})//ground的材质中opacity为1,所以被当做不透明了
|
|
})//ground的材质中opacity为1,所以被当做不透明了
|
|
}
|
|
}
|
|
@@ -3512,7 +3516,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- renderOverlay2(params){
|
|
|
|
|
|
+ renderOverlay2(params){//渲染剩余部分
|
|
let renderer = params.renderer || this.renderer
|
|
let renderer = params.renderer || this.renderer
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
let camera = params.camera ? params.camera : this.scene.getActiveCamera();
|
|
//清除深度 !!!!
|
|
//清除深度 !!!!
|
|
@@ -4718,13 +4722,17 @@ export class Viewer extends ViewerBase{
|
|
addTimeMark(name, type){
|
|
addTimeMark(name, type){
|
|
let record = Potree.timeCollect[name]
|
|
let record = Potree.timeCollect[name]
|
|
let needRecord = record && record.start && record.measures.length < record.minCount
|
|
let needRecord = record && record.start && record.measures.length < record.minCount
|
|
-
|
|
|
|
|
|
+
|
|
if(needRecord || Potree.measureTimings){
|
|
if(needRecord || Potree.measureTimings){
|
|
performance.mark(name+"-"+type)
|
|
performance.mark(name+"-"+type)
|
|
|
|
+
|
|
if(type == 'end'){
|
|
if(type == 'end'){
|
|
let measure = performance.measure(name,name+"-start",name+"-end");
|
|
let measure = performance.measure(name,name+"-start",name+"-end");
|
|
-
|
|
|
|
- if(needRecord){
|
|
|
|
|
|
+
|
|
|
|
+ if(needRecord){
|
|
|
|
+ if(!measure){ //有出现过手机的depthSamChangeImg得不到measure,可能是因为时间太长在resolveTimings被清除了? iphone8 plus ios14.1 型号MQ8F2CH/A
|
|
|
|
+ return //console.log('未能得到performance.measure',name)
|
|
|
|
+ }
|
|
record.measures.push( measure.duration )
|
|
record.measures.push( measure.duration )
|
|
record.sum += measure.duration;
|
|
record.sum += measure.duration;
|
|
record.ave = record.sum / record.measures.length;
|
|
record.ave = record.sum / record.measures.length;
|
|
@@ -4754,7 +4762,7 @@ export class Viewer extends ViewerBase{
|
|
this.toggle = timestamp;
|
|
this.toggle = timestamp;
|
|
}
|
|
}
|
|
let duration = timestamp - this.toggle;
|
|
let duration = timestamp - this.toggle;
|
|
- if(duration > 1000.0){
|
|
|
|
|
|
+ if(duration > 4000.0){
|
|
if(log){
|
|
if(log){
|
|
let measures = performance.getEntriesByType("measure");
|
|
let measures = performance.getEntriesByType("measure");
|
|
for(let i in this.fakeMeasure){
|
|
for(let i in this.fakeMeasure){
|
|
@@ -5200,7 +5208,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
fileInfo_.loadCostTime = Date.now() - fileInfo_.loadStartTime
|
|
fileInfo_.loadCostTime = Date.now() - fileInfo_.loadStartTime
|
|
/* let weight = Math.round((total / 1024 / 1024) * 100) / 100;*/
|
|
/* let weight = Math.round((total / 1024 / 1024) * 100) / 100;*/
|
|
- console.log( '加载完毕:', Common.getNameFromURL(fileInfo_.url), '耗时(ms)', fileInfo_.loadCostTime, /* 模型数据量:' + weight + 'M' */)
|
|
|
|
|
|
+ console.log( '加载完毕:', fileInfo_.name, Common.getNameFromURL(fileInfo_.url), '耗时(ms)', fileInfo_.loadCostTime, /* 模型数据量:' + weight + 'M' */)
|
|
|
|
|
|
|
|
|
|
if(fileInfo_.fileType == '3dTiles'){
|
|
if(fileInfo_.fileType == '3dTiles'){
|
|
@@ -5260,7 +5268,7 @@ export class Viewer extends ViewerBase{
|
|
}
|
|
}
|
|
|
|
|
|
//中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
|
|
//中心点居然没用。可能是漏用了什么信息,也许这和LVBADUI_qp是散的有关。
|
|
- console.log('3d tiles json',json)
|
|
|
|
|
|
+ //console.log('3d tiles json',json)
|
|
|
|
|
|
json.root.refine = 'ADD';
|
|
json.root.refine = 'ADD';
|
|
json.refine = 'ADD';
|
|
json.refine = 'ADD';
|
|
@@ -5350,7 +5358,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
async loadModel(fileInfo, done, onProgress_, onError){
|
|
async loadModel(fileInfo, done, onProgress_, onError){
|
|
- console.log('开始加载', Common.getNameFromURL(fileInfo.url) )
|
|
|
|
|
|
+ console.log('开始加载', fileInfo.name, Common.getNameFromURL(fileInfo.url) )
|
|
|
|
|
|
let boundingBox = new THREE.Box3()
|
|
let boundingBox = new THREE.Box3()
|
|
/* if(!Potree.settings.boundAddObjs){
|
|
/* if(!Potree.settings.boundAddObjs){
|
|
@@ -5445,7 +5453,7 @@ export class Viewer extends ViewerBase{
|
|
updateTime: fileInfo.updateTime, //加后缀防止缓存
|
|
updateTime: fileInfo.updateTime, //加后缀防止缓存
|
|
},
|
|
},
|
|
})
|
|
})
|
|
- console.log(result)
|
|
|
|
|
|
+ //console.log(result)
|
|
result.model.runtime = result.runtime
|
|
result.model.runtime = result.runtime
|
|
|
|
|
|
|
|
|
|
@@ -5454,13 +5462,16 @@ export class Viewer extends ViewerBase{
|
|
tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
|
|
tileset.addEventListener('endTileLoading', function (data) {//Tileset3D
|
|
if (data.loadingCount == 0 && !loaded) {
|
|
if (data.loadingCount == 0 && !loaded) {
|
|
loaded = true;
|
|
loaded = true;
|
|
- console.log('loaded!!!!!!!!!!!!!')
|
|
|
|
|
|
+ //console.log('loaded!!!!!!!!!!!!!')
|
|
}
|
|
}
|
|
});
|
|
});
|
|
tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
|
|
tileset.addEventListener('tileLoaded',(e)=>{ //每一个tile加载完要更改透明度
|
|
let opacity = result.model.parent == this.objs ? result.model.opacity : result.model.parent.opacity//最多两层
|
|
let opacity = result.model.parent == this.objs ? result.model.opacity : result.model.parent.opacity//最多两层
|
|
- MergeEditor.changeOpacity(e.tileContent,opacity)
|
|
|
|
|
|
+ MergeEditor.changeOpacity(e.tileContent, opacity)
|
|
|
|
+ viewer.images360.judgeModelMat(e.tileContent)
|
|
//set Layers ?
|
|
//set Layers ?
|
|
|
|
+ Potree.Utils.setObjectLayers(e.tileContent, Potree.settings.showObjectsOnMap ? 'bothMapAndScene' : 'model')
|
|
|
|
+
|
|
})
|
|
})
|
|
|
|
|
|
{
|
|
{
|
|
@@ -5482,7 +5493,7 @@ export class Viewer extends ViewerBase{
|
|
if(v != visi){
|
|
if(v != visi){
|
|
tileset.nextForceUpdate = true
|
|
tileset.nextForceUpdate = true
|
|
v = visi
|
|
v = visi
|
|
- }
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
loadDone(result.model/* , null, fileInfo.url */)
|
|
loadDone(result.model/* , null, fileInfo.url */)
|
|
|
|
|
|
@@ -5518,20 +5529,28 @@ export class Viewer extends ViewerBase{
|
|
'streamView': true
|
|
'streamView': true
|
|
})
|
|
})
|
|
.then(() => {
|
|
.then(() => {
|
|
- gsViewer.start();
|
|
|
|
- /* gsViewer.splatMesh.rotation.x = -2.365929590263301
|
|
|
|
- gsViewer.splatMesh.position.z = 5 */
|
|
|
|
|
|
+ gsViewer.start();
|
|
gsViewer.splatMesh.updateMatrix()
|
|
gsViewer.splatMesh.updateMatrix()
|
|
gsViewer.splatMesh.updateMatrixWorld()
|
|
gsViewer.splatMesh.updateMatrixWorld()
|
|
- gsViewer.splatMesh.visible = false
|
|
|
|
- //viewer.mainViewport.view.setView({position: new THREE.Vector3(-4.980, -5.3879, 5.4503095), quaternion:new THREE.Quaternion(0.5750,-0.2809,-0.3372,0.6903)})
|
|
|
|
-
|
|
|
|
|
|
+
|
|
gsViewer.splatMesh.onSplatTreeReadyCallback = ()=>{
|
|
gsViewer.splatMesh.onSplatTreeReadyCallback = ()=>{
|
|
loadDone(gsViewer.splatMesh)
|
|
loadDone(gsViewer.splatMesh)
|
|
let {sceneMax,sceneMin} = gsViewer.splatMesh.splatTree.subTrees[0]
|
|
let {sceneMax,sceneMin} = gsViewer.splatMesh.splatTree.subTrees[0]
|
|
gsViewer.splatMesh.boundingBox.min.copy(sceneMin)
|
|
gsViewer.splatMesh.boundingBox.min.copy(sceneMin)
|
|
gsViewer.splatMesh.boundingBox.max.copy(sceneMax)
|
|
gsViewer.splatMesh.boundingBox.max.copy(sceneMax)
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ let selfRaycaster = new GaussianSplats3D.Raycaster
|
|
|
|
+ gsViewer.splatMesh.raycast = function(raycaster, intersects ){//重写
|
|
|
|
+ let hits = []
|
|
|
|
+ selfRaycaster.ray.setParameters(raycaster.ray.origin, raycaster.ray.direction)
|
|
|
|
+ selfRaycaster.intersectSplatMesh(gsViewer.splatMesh, hits)
|
|
|
|
+ hits.forEach(e=>{
|
|
|
|
+ e.object = gsViewer.splatMesh
|
|
|
|
+ e.point = e.origin
|
|
|
|
+ delete e.origin
|
|
|
|
+ })
|
|
|
|
+ intersects.push(...hits)
|
|
|
|
+ } //问题:感觉normal不准
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -5542,7 +5561,7 @@ export class Viewer extends ViewerBase{
|
|
gsViewer.update()
|
|
gsViewer.update()
|
|
|
|
|
|
if(gsViewer.initialized && gsViewer.splatRenderReady){
|
|
if(gsViewer.initialized && gsViewer.splatRenderReady){
|
|
- gsViewer.splatMesh.visible = true
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})
|
|
})
|
|
@@ -5568,10 +5587,13 @@ export class Viewer extends ViewerBase{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
-
|
|
|
|
- setAllTilesets(fun){//让所有tileset执行fun。 objs.children中的3dtiles最多两层tileset
|
|
|
|
- this.objs.children.forEach(e=>{
|
|
|
|
|
|
+ setAllTilesets(){//让所有tileset执行fun。 objs里每个model最多两层tileset
|
|
|
|
+ let models = arguments.length == 2 ? [arguments[0]] : this.objs.children //如果要设定某个model的tileset,就传第一个参数
|
|
|
|
+ let fun = arguments[1] || arguments[0]
|
|
|
|
+
|
|
|
|
+ models.forEach(e=>{
|
|
if(e.fileType == '3dTiles'){
|
|
if(e.fileType == '3dTiles'){
|
|
e.traverse(child=>{
|
|
e.traverse(child=>{
|
|
if(child.runtime){
|
|
if(child.runtime){
|