|
@@ -56754,28 +56754,30 @@ void main() {
|
|
|
if(useDepth) this.useDepth_ = true;
|
|
|
|
|
|
|
|
|
- let setSize = (e)=>{//如果出现横条状的异常,往往是viewportOffset出错
|
|
|
- let viewport = e.viewport;
|
|
|
- let viewportOffset = viewport.offset || new Vector2$1();
|
|
|
- this.uniforms.resolution.value.copy(viewport.resolution2);
|
|
|
- this.uniforms.viewportOffset.value.copy(viewportOffset);
|
|
|
-
|
|
|
- //console.log('depth '+viewportOffset.toArray())
|
|
|
- };
|
|
|
-
|
|
|
- let viewport = viewer.mainViewport;
|
|
|
-
|
|
|
- setSize( {viewport} );
|
|
|
-
|
|
|
- viewer.addEventListener('resize',(e)=>{
|
|
|
- if(!e.viewport || e.viewport.camera.isPerspectiveCamera){//地图不需要
|
|
|
- setSize(e);
|
|
|
- //console.log(this.name + viewportOffset.toArray())
|
|
|
- }
|
|
|
- });
|
|
|
|
|
|
|
|
|
if(this.useDepth){
|
|
|
+
|
|
|
+ let setSize = (e)=>{//如果出现横条状的异常,往往是viewportOffset出错
|
|
|
+ let viewport = e.viewport;
|
|
|
+ let viewportOffset = viewport.offset || new Vector2$1();
|
|
|
+ this.uniforms.resolution.value.copy(viewport.resolution2);
|
|
|
+ this.uniforms.viewportOffset.value.copy(viewportOffset);
|
|
|
+
|
|
|
+ //console.log('depth '+viewportOffset.toArray())
|
|
|
+ };
|
|
|
+
|
|
|
+ let viewport = viewer.mainViewport;
|
|
|
+
|
|
|
+ setSize( {viewport} );
|
|
|
+
|
|
|
+ viewer.addEventListener('resize',(e)=>{
|
|
|
+ if(!this.useDepth || !e.viewport || e.viewport.camera.isPerspectiveCamera){//地图不需要
|
|
|
+ setSize(e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
|
|
|
/* viewer.addEventListener('camera_changed', (e)=>{
|
|
|
if(e.viewport.name != 'mapViewport') this.updateDepthParams(e)
|
|
@@ -56924,16 +56926,15 @@ void main() {
|
|
|
|
|
|
var scale;
|
|
|
if(info.restricMeshScale){//仅限制最大或最小的话,不判断像素大小,直接限制mesh的scale
|
|
|
- var dis = camera.position.distanceTo(this.getWorldPosition(new Vector3()));
|
|
|
+ var dis = camera.position.distanceTo(this.root.getWorldPosition(new Vector3()));
|
|
|
if(dis < info.nearBound){
|
|
|
scale = info.scale * dis / info.nearBound;
|
|
|
}else {
|
|
|
scale = info.scale;
|
|
|
}
|
|
|
- }else {
|
|
|
-
|
|
|
+ }else {
|
|
|
scale = math.getScaleForConstantSize($.extend(info,{//规定下最小最大像素
|
|
|
- camera , position:this.getWorldPosition(new Vector3()) ,
|
|
|
+ camera , position:this.root.getWorldPosition(new Vector3()) ,
|
|
|
resolution: e.viewport.resolution//2
|
|
|
}));
|
|
|
|
|
@@ -56985,23 +56986,25 @@ void main() {
|
|
|
|
|
|
//可能还是要用html写,因为要加按钮和图片
|
|
|
|
|
|
- class TextSprite extends Object3D{
|
|
|
-
|
|
|
+ class TextSprite extends Object3D{
|
|
|
+ //注:为了分两层控制scale,不直接extend Sprite
|
|
|
constructor( options={}){
|
|
|
super();
|
|
|
let map = new Texture();
|
|
|
map.minFilter = LinearFilter;
|
|
|
map.magFilter = LinearFilter;
|
|
|
|
|
|
- this.sprite = new Sprite$1( Object.assign({},options,
|
|
|
- {
|
|
|
- root: this ,
|
|
|
+ this.sprite = new Sprite$1( Object.assign({
|
|
|
+ root:this
|
|
|
+ }
|
|
|
+ ,options,
|
|
|
+ {
|
|
|
map,
|
|
|
})
|
|
|
);
|
|
|
this.add(this.sprite);
|
|
|
|
|
|
-
|
|
|
+ this.fontWeight = options.fontWeight == void 0 ? 'Bold' : options.fontWeight;
|
|
|
this.rectBorderThick = options.rectBorderThick || 0;
|
|
|
this.textBorderThick = options.textBorderThick || 0;
|
|
|
this.fontface = 'Arial';
|
|
@@ -57061,21 +57064,21 @@ void main() {
|
|
|
updateTexture(){
|
|
|
let canvas = document.createElement('canvas');
|
|
|
let context = canvas.getContext('2d');
|
|
|
- context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;
|
|
|
+ context.font = this.fontWeight + ' ' + this.fontsize + 'px ' + this.fontface;
|
|
|
|
|
|
- context["font-weight"] = 100; //语法与 CSS font 属性相同。
|
|
|
+ //context["font-weight"] = 100; //语法与 CSS font 属性相同。
|
|
|
// get size data (height depends only on font size)
|
|
|
|
|
|
//this.text = '啊啊啊啊啊啊fag'
|
|
|
|
|
|
let metrics = context.measureText(this.text );
|
|
|
let textWidth = metrics.width;
|
|
|
- let margin = new Vector2$1(this.fontsize, this.fontsize*0.4);
|
|
|
+ let margin = new Vector2$1(this.fontsize, Math.max( this.fontsize*0.4, 10) );
|
|
|
let spriteWidth = 2 * margin.x + textWidth + 2 * this.rectBorderThick;
|
|
|
let spriteHeight = 2 * margin.y + this.fontsize + 2 * this.rectBorderThick;
|
|
|
context.canvas.width = spriteWidth;
|
|
|
context.canvas.height = spriteHeight;
|
|
|
- context.font = 'Bold ' + this.fontsize + 'px ' + this.fontface;
|
|
|
+ context.font = this.fontWeight + ' ' + this.fontsize + 'px ' + this.fontface;
|
|
|
|
|
|
|
|
|
let diff = 2;//针对英文大部分在baseLine之上所以降低一点(metrics.fontBoundingBoxAscent - metrics.fontBoundingBoxDescent) / 2
|
|
@@ -63100,7 +63103,7 @@ void main() {
|
|
|
}
|
|
|
}else {
|
|
|
if(Potree.settings.intersectOnObjs){
|
|
|
- let object = viewer.objs.children.find(e=>e.dataset_id == o.datasetId);
|
|
|
+ let object = o.object || viewer.objs.children.find(e=>e.dataset_id == o.datasetId);
|
|
|
if(object){
|
|
|
tranMatrix = o.fromDataset ? object.matrixWorld : new Matrix4().copy(object.matrixWorld).invert();
|
|
|
}
|
|
@@ -63890,21 +63893,10 @@ void main() {
|
|
|
//object.dataset_id = Date.now() //暂时
|
|
|
|
|
|
object.traverse(e=>e.material && (e.material.transparent = true));
|
|
|
- /* object.addEventListener('select',(e)=>{
|
|
|
- if(Potree.settings.displayMode == 'showPanos')return
|
|
|
- console.log('select',e)
|
|
|
-
|
|
|
- MergeEditor.selectModel(object, true)
|
|
|
- return {stopContinue:true}
|
|
|
- },1)
|
|
|
- object.addEventListener('deselect',(e)=>{
|
|
|
- console.log('deselect',e)
|
|
|
- MergeEditor.selectModel(object, false)
|
|
|
- viewer.outlinePass.selectedObjects = []
|
|
|
- }) */
|
|
|
- object.addEventListener('click',(e)=>{
|
|
|
+
|
|
|
+ /* object.addEventListener('click',(e)=>{
|
|
|
//只是为了能得到hoverElement识别才加这个侦听
|
|
|
- });
|
|
|
+ }) */
|
|
|
/* let updateBound = ()=>{
|
|
|
object.updateMatrixWorld()
|
|
|
viewer.updateModelBound()
|
|
@@ -85943,24 +85935,21 @@ void main() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
-
|
|
|
- getHoveredElements (interactables, dontCheckDis, raycaster) {
|
|
|
-
|
|
|
-
|
|
|
- let scenes = this.hoverViewport.interactiveScenes || this.interactiveScenes.concat(this.scene);
|
|
|
-
|
|
|
- let interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
|
|
|
+ getHoveredElements (interactables, dontCheckDis, raycaster) {
|
|
|
|
|
|
if(!interactables){
|
|
|
- if(Potree.settings.editType == 'merge'){
|
|
|
- return [] /////暂时!!!!!!!!!!因为卡顿
|
|
|
- }
|
|
|
+
|
|
|
+
|
|
|
+ let scenes = this.hoverViewport.interactiveScenes || this.interactiveScenes.concat(this.scene);
|
|
|
+
|
|
|
+ let interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
|
|
|
interactables = [];
|
|
|
for (let scene of scenes) {
|
|
|
scene.traverseVisible(node => {//检测加了侦听的object
|
|
|
- if (node._listeners && node.visible && (Potree.settings.intersectOnObjs || !this.blacklist.has(node))) {
|
|
|
+ if (node._listeners && node.visible && !this.blacklist.has(node) ) {
|
|
|
let hasInteractableListener = interactableListeners.filter((e) => {
|
|
|
return node._listeners[e] !== undefined;
|
|
|
}).length > 0;
|
|
@@ -85970,7 +85959,7 @@ void main() {
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
- }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
let camera = this.hoverViewport.camera;
|
|
@@ -102967,7 +102956,7 @@ ENDSEC
|
|
|
|
|
|
const renderOrders = {
|
|
|
line: 0 ,
|
|
|
- spot: 1,
|
|
|
+ spot: 15, //高过模型
|
|
|
};
|
|
|
const planeGeo$3 = new PlaneGeometry(1,1);
|
|
|
let texLoader$5 = new TextureLoader();
|
|
@@ -102977,6 +102966,7 @@ ENDSEC
|
|
|
});
|
|
|
let spotMat;
|
|
|
const defaultLineLength = 0.6;
|
|
|
+ const defaultSpotScale = 0.4;
|
|
|
|
|
|
class Tag extends Object3D{
|
|
|
constructor(o){
|
|
@@ -102986,11 +102976,11 @@ ENDSEC
|
|
|
|
|
|
this.lineLength = o.lineLength != void 0 ? o.lineLength : defaultLineLength;
|
|
|
this.position.copy(o.position);
|
|
|
- this.normal = o.normal != void 0 ? o.normal : new Vector3(0,0,1);
|
|
|
+ this.normal = o.normal != void 0 ? o.normal : new Vector3(0,0,-1);
|
|
|
this.root = o.root;
|
|
|
|
|
|
|
|
|
- this.matrixAutoUpdate = false;
|
|
|
+ //this.matrixAutoUpdate = false
|
|
|
|
|
|
this.build();
|
|
|
|
|
@@ -103006,26 +102996,45 @@ ENDSEC
|
|
|
if(!spotMat){
|
|
|
spotMat = new MeshBasicMaterial({
|
|
|
transparent:true,
|
|
|
- map: texLoader$5.load(Potree.resourcePath+'/textures/icon-fire.png' ),
|
|
|
+ map: texLoader$5.load(Potree.resourcePath+'/textures/spot_default.png' ),
|
|
|
});
|
|
|
}
|
|
|
let endPos = this.normal.clone().multiplyScalar(this.lineLength);
|
|
|
|
|
|
- //this.spot = new Sprite({mat:spotMat})
|
|
|
- this.spot = new Mesh(planeGeo$3, spotMat);
|
|
|
- this.spot.position.copy(endPos);
|
|
|
-
|
|
|
+
|
|
|
this.line = LineDraw.createLine([
|
|
|
new Vector3(0,0,0),
|
|
|
endPos
|
|
|
], {mat:lineMat});
|
|
|
|
|
|
|
|
|
+ let group = new Object3D();
|
|
|
+ this.spot = new Mesh(planeGeo$3, spotMat);
|
|
|
+ this.spot.scale.set(defaultSpotScale,defaultSpotScale,defaultSpotScale);
|
|
|
+ this.titleLabel = new TextSprite({root: group, text:'1', sizeInfo:{width2d:200},
|
|
|
+ textColor:{r:255,g:255,b:255,a:1.0},
|
|
|
+ backgroundColor:{r:0,g:0,b:0,a:0.8},
|
|
|
+ borderRadius: 6,
|
|
|
+ fontsize:13, fontWeight:'',//thick
|
|
|
+ renderOrder : renderOrders.spot, pickOrder:renderOrders.spot,
|
|
|
+ }); //更新sprite时,实际更新的是root: spot的矩阵
|
|
|
+ this.spot.renderOrder = renderOrders.spot;
|
|
|
+ /* const mainLabelProp = {
|
|
|
+ backgroundColor: {r: defaultColor.r*255, g: defaultColor.g*255, b: defaultColor.b*255, a:config.measure.default.opacity},
|
|
|
+ textColor: {r: textColor.r*255, g: textColor.g*255, b: textColor.b*255, a: 1.0},
|
|
|
+ fontsize:16,
|
|
|
+ useDepth : true ,
|
|
|
+ renderOrder : 5, pickOrder:5,
|
|
|
+ } */
|
|
|
+
|
|
|
+ this.titleLabel.position.set(0,0.4,0);
|
|
|
+ this.titleLabel.sprite.material.depthTest = this.titleLabel.sprite.material.depthWrite = true;
|
|
|
|
|
|
|
|
|
- this.titleLabel = new TextSprite({root: this.spot, text:'1'});
|
|
|
- this.titleLabel.position.set(0,0,1);
|
|
|
- this.add(this.spot);
|
|
|
+ group.position.copy(endPos);
|
|
|
+ group.add(this.spot);
|
|
|
+ group.add(this.titleLabel);
|
|
|
+ this.add(group);
|
|
|
this.add(this.line);
|
|
|
|
|
|
|
|
@@ -103036,21 +103045,41 @@ ENDSEC
|
|
|
|
|
|
}
|
|
|
|
|
|
- updateMatrixWorld(){
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- this.updateMatrix();
|
|
|
-
|
|
|
-
|
|
|
+ updateMatrixWorld(force){ //重写,只为了将root当做parent
|
|
|
+
|
|
|
+ this.updateMatrix();
|
|
|
this.matrixWorld.multiplyMatrices( this.root.matrixWorld, this.matrix );
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ const children = this.children;
|
|
|
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
|
+ children[ i ].updateMatrixWorld( force );
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ updateWorldMatrix( updateParents, updateChildren ) {//重写,只为了将root当做parent
|
|
|
+
|
|
|
+ if ( updateParents === true && this.root !== null ) {
|
|
|
+ this.root.updateWorldMatrix( true, false );
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( this.matrixAutoUpdate ) this.updateMatrix();
|
|
|
+ this.matrixWorld.multiplyMatrices( this.root.matrixWorld, this.matrix );
|
|
|
+
|
|
|
+ if ( updateChildren === true ) {
|
|
|
+ const children = this.children;
|
|
|
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
|
+ children[ i ].updateWorldMatrix( false, true );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
class TagTool extends EventDispatcher{
|
|
@@ -103090,12 +103119,16 @@ ENDSEC
|
|
|
let click = (e)=>{
|
|
|
|
|
|
|
|
|
- var I = e.intersect && (/* e.intersect.orthoIntersect || */e.intersect.location);
|
|
|
- if(!I){
|
|
|
+ var worldPos = e.intersect && (/* e.intersect.orthoIntersect || */e.intersect.location);
|
|
|
+ if(!worldPos){
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+ let localPos = Potree.Utils.datasetPosTransform({ toDataset: true, pointcloud:e.intersect.pointcloud, object:e.intersect.object, position:worldPos });
|
|
|
+
|
|
|
+
|
|
|
let tag = new Tag({
|
|
|
- title: '1', position: I.clone(), normal:e.intersect.normal,
|
|
|
+ title: '1', position: localPos, normal:e.intersect.point.normal,
|
|
|
root: e.intersect.pointcloud || e.intersect.object}
|
|
|
);
|
|
|
|
|
@@ -117488,7 +117521,20 @@ ENDSEC
|
|
|
model.boundCenter = model.boundingBox.getCenter(new Vector3).applyMatrix4(model.matrixWorld);
|
|
|
}
|
|
|
|
|
|
- };
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+
|
|
|
+ note:
|
|
|
+
|
|
|
+ 要注意getHoveredElements只在getIntersect时才使interactables包含加载的model, 也就是model上不能有使之成为interactables的事件,否则在鼠标hover到模型上开始转动的一瞬间很卡。
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ */
|
|
|
|
|
|
const texLoader$9 = new TextureLoader();
|
|
|
const circleGeo = new CircleGeometry(1.45,100);
|
|
@@ -130307,7 +130353,6 @@ ENDSEC
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
};
|
|
|
|
|
|
|