Procházet zdrojové kódy

fix: path animation

xzw před 8 měsíci
rodič
revize
4a267c0f40

+ 187 - 137
public/lib/potree/potree.js

@@ -8100,6 +8100,20 @@
 	      });
 	    }
 	  }
+	  set fadeFar(far) {
+	    var needsUpdate = !this.fadeFar != !far; //null为全部范围可见
+	    //console.log('fadeFar needsUpdate', needsUpdate)
+	    if (far) {
+	      this.defines.FadeFar = true;
+	      this.uniforms.fadeFar.value = far;
+	    } else {
+	      delete this.defines.FadeFar;
+	    }
+	    needsUpdate && (this.needsUpdate = true);
+	  }
+	  get fadeFar() {
+	    return 'FadeFar' in this.defines && this.uniforms.fadeFar.value;
+	  }
 	  updateDepthParams() {
 	    var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 	    var viewport = e.viewport || viewer.mainViewport;
@@ -17238,8 +17252,7 @@
 	      fragmentShader: fs,
 	      depthWrite: false,
 	      depthTest: false,
-	      transparent: o.transparent == void 0 ? true : o.transparent,
-	      side: o.side || 0 /* THREE.DoubleSide */
+	      transparent: o.transparent == void 0 ? true : o.transparent
 	    });
 	    this.events = {
 	      setSize: e => {
@@ -17264,12 +17277,15 @@
 
 	    //-----其他----
 
-	    this.autoDepthTest = o.autoDepthTest;
-	    if (o.opacity != void 0) {
-	      this.opacity = o.opacity;
+	    /*this.autoDepthTest = o.autoDepthTest
+	     if(o.opacity != void 0){
+	        this.opacity = o.opacity
 	    }
-	    this.useDepth = o.useDepth;
-	    this.map = o.map;
+	    this.useDepth = o.useDepth
+	    this.fadeFar = o.fadeFar
+	    this.map = o.map */
+
+	    this.setValues(o);
 	  }
 	  get useDepth() {
 	    return this.useDepth_;
@@ -17323,7 +17339,7 @@
 	    return this.uniforms.opacity.value;
 	  }
 	  set opacity(o) {
-	    this.uniforms && (this.uniforms.opacity.value = o);
+	    this.uniforms && o != void 0 && (this.uniforms.opacity.value = o);
 	  }
 	  get color() {
 	    return this.uniforms.baseColor.value;
@@ -17331,12 +17347,20 @@
 	  set color(c) {
 	    this.uniforms && this.uniforms.baseColor.value.set(c);
 	  }
-
-	  /* dispose(){ 
-	      super.dispose()
-	      viewer.depthBasic
-	  } */
-
+	  set fadeFar(far) {
+	    var needsUpdate = !this.fadeFar != !far; //null为全部范围可见
+	    //console.log('fadeFar needsUpdate', needsUpdate)
+	    if (far) {
+	      this.defines.FadeFar = true;
+	      this.uniforms.fadeFar.value = far;
+	    } else {
+	      delete this.defines.FadeFar;
+	    }
+	    needsUpdate && (this.needsUpdate = true);
+	  }
+	  get fadeFar() {
+	    return 'FadeFar' in this.defines && this.uniforms.fadeFar.value;
+	  }
 	  copy(source) {
 	    super.copy(source);
 	    this.useDepth = source.useDepth;
@@ -17828,12 +17852,9 @@
 	    this.position.copy(pos);
 	    this.sprite.waitUpdate();
 	  }
-	  /* update(){
-	      this.sprite.waitUpdate()
-	  } */
-	  /* setVisible(v){ 
-	      Potree.Utils.updateVisible(this, 'setVisible', v)
-	  } */
+	  updatePose() {
+	    this.sprite.waitUpdate();
+	  }
 	  setUniforms(name, value) {
 	    this.sprite.setUniforms(name, value);
 	  }
@@ -26955,18 +26976,8 @@
 	        this.label.position.copy(this.floorPosition);
 	      }
 	      this.label.position.z += 0.14;
-	      this.label.update();
+	      this.label.updatePose();
 	    }
-
-	    /* if(this.label2){
-	        if(Potree.settings.editType == 'pano'){
-	            this.label2.position.copy(this.position)
-	        }else{
-	            this.label2.position.copy(this.floorPosition)
-	        }
-	        this.label2.position.copy(this.marker.position) 
-	        this.label2.update()
-	    } */
 	  }
 
 	  /* getRealPos(){//当整体移动以后
@@ -40376,9 +40387,8 @@
 	  removeMarker(index) {
 	    this.points.splice(index, 1);
 	    var marker = this.markers[index];
-	    //this.remove(marker); 
 	    this.markers.splice(index, 1);
-	    marker.dispose && marker.dispose();
+	    marker.dispose ? marker.dispose() : marker.parent.remove(marker);
 	    var edgeIndex = index; //(index === 0) ? 0 : (index - 1);
 	    var edge = this.edges[edgeIndex];
 	    if (edge) {
@@ -42413,6 +42423,21 @@
 	  var s = halfPathWidth * 2.9;
 	  marker.scale.set(s, s, s);
 	};
+	/* let getFakeMarker = ()=>{//添加marker时指示位置 
+	    let marker
+	    if(!marker){
+	        let marker = new THREE.Mesh(planeGeo, getMarkerMat('default'))  
+	            marker.name = 'fakeMarker'
+	            setMarkerScale(marker,this.halfPathWidth)
+	            marker.markerSelectStates = {} 
+	            Potree.Utils.setObjectLayers(marker, 'measure' )
+	            marker.renderOrder = renderOrders.marker 
+	 
+	    } 
+	    return 
+	}
+	  */
+
 	class Path$1 extends ctrlPolygon {
 	  constructor(prop) {
 	    super('Path', prop);
@@ -42443,13 +42468,15 @@
 	        fontsize: this.fontsize || 13,
 	        renderOrder: renderOrders.label,
 	        pickOrder: renderOrders.label,
-	        clipDistance: 10 //消失距离   
+	        clipDistance: 10,
+	        fadeFar: this.fadeFar
 	      }));
 	      this.titleLabel.sprite.material.depthTest = false;
 	      var line = LineDraw.createFatLine([new Vector3(0, 0, 0), new Vector3(0, 0, titleLineHeight)], Object.assign({}, depthProps, {
 	        color: '#ffffff',
 	        lineWidth: 1,
-	        transparent: true
+	        transparent: true,
+	        fadeFar: this.fadeFar
 	      }));
 	      line.renderOrder = renderOrders.line;
 	      group.add(line);
@@ -42459,28 +42486,28 @@
 	      this.setTitleVisi(this.titleLabel.parent, false, 'noPoint');
 	      this.setTitle(Potree.settings.isOfficial ? '' : 'title');
 	      line.addEventListener('mouseover', e => {
-	        viewer.dispatchEvent({
+	        this.editEnable && viewer.dispatchEvent({
 	          type: "CursorChange",
 	          action: 'add',
 	          name: 'hoverGrab'
 	        });
 	      });
 	      line.addEventListener('startDragging', e => {
-	        viewer.dispatchEvent({
+	        this.editEnable && viewer.dispatchEvent({
 	          type: "CursorChange",
 	          action: 'add',
 	          name: 'grabbing'
 	        });
 	      });
 	      line.addEventListener('drop', e => {
-	        viewer.dispatchEvent({
+	        this.editEnable && viewer.dispatchEvent({
 	          type: "CursorChange",
 	          action: 'remove',
 	          name: 'hoverGrab'
 	        });
 	      });
 	      line.addEventListener('mouseleave', e => {
-	        viewer.dispatchEvent({
+	        this.editEnable && viewer.dispatchEvent({
 	          type: "CursorChange",
 	          action: 'remove',
 	          name: 'grabbing'
@@ -42488,7 +42515,7 @@
 	      });
 	      line.addEventListener('drag', e => {
 	        var _e$intersect;
-	        if ((_e$intersect = e.intersect) !== null && _e$intersect !== void 0 && _e$intersect.location) {
+	        if (this.editEnable && (_e$intersect = e.intersect) !== null && _e$intersect !== void 0 && _e$intersect.location) {
 	          this.updateTitlePos(e.intersect.location);
 	          this.dispatchEvent({
 	            type: 'titlePosChanged',
@@ -42504,7 +42531,8 @@
 	        color: this.pathColor || '#fff',
 	        opacity: 0.5,
 	        side: 2,
-	        transparent: true
+	        transparent: true,
+	        fadeFar: this.fadeFar
 	      })));
 	      //new THREE.MeshBasicMaterial({depthWrite:false, transparent:true, color:this.pathColor || '#fff', opacity:0.5, side:2}))
 	      this.add(this.edge);
@@ -42513,9 +42541,21 @@
 	      var addHoverEvent = () => {
 	        var mouseover = e => {
 	          this.setSelected(true, 'edge');
+	          if (this.addOrRemovePoint && !this.isNew) {
+	            viewer.dispatchEvent({
+	              type: "CursorChange",
+	              action: 'add',
+	              name: 'pen_addPoint'
+	            });
+	          }
 	        };
 	        var mouseleave = e => {
 	          this.setSelected(false, 'edge');
+	          viewer.dispatchEvent({
+	            type: "CursorChange",
+	            action: 'remove',
+	            name: 'pen_addPoint'
+	          });
 	        };
 	        this.edge.addEventListener('mouseover', mouseover);
 	        this.edge.addEventListener('mouseleave', mouseleave);
@@ -42523,7 +42563,7 @@
 	          var now = Date.now();
 	          if (now - this.lastDropTime < 100 || this.isNew) return; //防止拖拽marker时误触导致focus, 以及点到marker不focus
 
-	          if (this.enableEdit) {
+	          if (this.addOrRemovePoint) {
 	            viewer.measuringTool.history.beforeChange(this);
 	            var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
 	            var nextIndex = this.getIndex(prevIndex, 1); //端点2(可能是第一个)
@@ -42558,6 +42598,12 @@
 	    this.setEditEnable(true);
 	    this.lastDropTime = 0;
 	    Potree.Utils.setObjectLayers(this, 'measure');
+	    if (!Potree.settings.isOfficial) {
+	      this.setAddOrRemPoint(true);
+	      this.addEventListener('createDone', () => {
+	        this.setAddOrRemPoint(false);
+	      });
+	    }
 	    this.initData(prop);
 	  }
 	  updateTitlePos(pos) {
@@ -42571,14 +42617,14 @@
 	    }
 	    if (pos) {
 	      this.titleLabel.parent.position.copy(pos);
-	      this.titleLabel.sprite.waitUpdate();
+	      this.titleLabel.updatePose();
 	    }
 	  }
 	  createMarkerLabel(text, hasHoverEvent) {
 	    var label = new TextSprite$2($.extend({}, depthProps, {
 	      sizeInfo: labelSizeInfo$1,
 	      name: 'markerTitle',
-	      text: text || Potree.settings.isOfficial ? "" : 'point',
+	      text: "",
 	      fontsize: this.fontsize || 12,
 	      renderOrder: renderOrders.label,
 	      pickOrder: renderOrders.label,
@@ -42595,7 +42641,8 @@
 	        g: 0,
 	        b: 0,
 	        a: 1
-	      }
+	      },
+	      fadeFar: this.fadeFar
 	    }));
 	    if (hasHoverEvent) {
 	      label.addEventListener('mouseover', () => {
@@ -42608,8 +42655,8 @@
 	        this.isNew || viewer.measuringTool.isAdding || viewer.focusOnObject(this, 'measure');
 	      });
 	    }
-	    label.measure = this;
-	    label.sprite.material.depthTestWhenPick = true;
+	    //label.measure = this
+	    //label.sprite.material.depthTestWhenPick = true
 	    Potree.Utils.setObjectLayers(label, 'measure');
 	    this.add(label);
 	    return label;
@@ -42621,7 +42668,7 @@
 	    if (this.markerLabels[index]) {
 	      this.markerLabels[index].position.copy(pos);
 	      this.markerLabels[index].position.z += 1;
-	      this.markerLabels[index].sprite.waitUpdate();
+	      this.markerLabels[index].updatePose();
 	    }
 	  }
 	  setPathWidth(w) {
@@ -42695,7 +42742,7 @@
 	    {
 	      var oldVisi = this.titleLabel.parent.visible;
 	      this.setTitleVisi(this.titleLabel.parent, this.markers.length > 0, 'noPoint');
-	      if (this.titleLabel.parent.visible && !oldVisi) this.titleLabel.sprite.waitUpdate();
+	      if (this.titleLabel.parent.visible && !oldVisi) this.titleLabel.updatePose();
 	    }
 	    this.updateTitlePos();
 	  }
@@ -42704,31 +42751,60 @@
 	    var index = o.index == void 0 ? this.points.length : o.index; //要当第几个
 
 	    var marker = new Mesh(planeGeo$2, getMarkerMat('default'));
+	    marker.name = 'marker';
 	    setMarkerScale(marker, this.halfPathWidth);
 	    marker.markerSelectStates = {};
 	    Potree.Utils.setObjectLayers(marker, 'measure');
 	    marker.renderOrder = renderOrders.marker;
-	    marker.addEventListener('click', e => {
-	      this.dispatchEvent({
-	        type: 'markerSelect',
-	        marker
+	    marker.addEventListener('mouseover', e => {
+	      if (this.addOrRemovePoint && !this.isNew) {
+	        viewer.dispatchEvent({
+	          type: "CursorChange",
+	          action: 'add',
+	          name: 'pen_delPoint'
+	        });
+	      }
+	    } /* ,{importance:1} */);
+	    marker.addEventListener('mouseleave', e => {
+	      viewer.dispatchEvent({
+	        type: "CursorChange",
+	        action: 'remove',
+	        name: 'pen_delPoint'
 	      });
-	      this.setMarkerSelected(marker, 'click');
-	      setTimeout(() => {
-	        viewer.addEventListener('global_click', () => {
-	          this.dispatchEvent({
-	            type: 'markerSelect',
-	            marker,
-	            cancel: true
-	          });
-	          this.setMarkerSelected(marker, 'unclick');
-	        }, {
-	          once: true
+	    });
+	    marker.addEventListener('click', e => {
+	      if (this.isNew) return;
+	      if (this.addOrRemovePoint) {
+	        //点击删除点
+
+	        //viewer.measuringTool.history.beforeChange(this)
+	        var _index = this.markers.indexOf(marker);
+	        this.removeMarker(_index);
+	        //viewer.measuringTool.history.afterChange(this)
+	        this.dispatchEvent('changed');
+	      } else {
+	        //点击选中点
+	        this.dispatchEvent({
+	          type: 'markerSelect',
+	          marker
 	        });
-	      }, 1);
+	        this.setMarkerSelected(marker, 'click');
+	        setTimeout(() => {
+	          viewer.addEventListener('global_click', () => {
+	            this.dispatchEvent({
+	              type: 'markerSelect',
+	              marker,
+	              cancel: true
+	            });
+	            this.setMarkerSelected(marker, 'unclick');
+	          }, {
+	            once: true
+	          });
+	        }, 1);
+	      }
 	    });
 	    marker.addEventListener('startDragging', e => {
-	      this.setMarkerSelected(marker, 'click');
+	      this.isNew || this.setMarkerSelected(marker, 'click'); //选中
 	    });
 	    marker.addEventListener('drop', e => {
 	      if (e.button != MOUSE.LEFT) return;
@@ -42745,6 +42821,7 @@
 	    });
 	    var label = this.createMarkerLabel('');
 	    this.markerLabels = [...this.markerLabels.slice(0, index), label, ...this.markerLabels.slice(index, this.points.length)];
+	    this.setMarkerTitle(index, Potree.settings.isOfficial ? '' : 'point');
 	    super.addMarker(Object.assign(o, {
 	      index,
 	      marker
@@ -42755,9 +42832,18 @@
 	  }
 	  setEditEnable(state) {
 	    //是否显示可修改控件
-	    this.enableEdit = !!state;
+	    this.editEnable = !!state;
 	    this.markers.forEach(e => Potree.Utils.updateVisible(e, 'editEnable', this.enableEdit));
 	  }
+	  setAddOrRemPoint(state) {
+	    //是否可以加减点, 此时不能拖拽marker
+	    this.addOrRemovePoint = !!state;
+	    viewer.dispatchEvent({
+	      type: "CursorChange",
+	      action: state ? 'add' : 'remove',
+	      name: 'pen'
+	    });
+	  }
 	  setTitleVisi(label, v) {
 	    var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
 	    Potree.Utils.updateVisible(label, 'hideTitle-' + reason, v);
@@ -42807,7 +42893,7 @@
 	      marker.material = getMarkerMat('drag');
 	      marker.renderOrder = marker.pickOrder = renderOrders.marker + 2;
 	    } else if (marker.markerSelectStates.hover) {
-	      marker.material = getMarkerMat('delete');
+	      marker.material = getMarkerMat(this.addOrRemovePoint ? 'delete' : 'drag');
 	      marker.renderOrder = marker.pickOrder = renderOrders.marker + 1;
 	    } else {
 	      marker.material = getMarkerMat('default');
@@ -42878,42 +42964,6 @@
 	    super.dispose();
 	    this.dispatchEvent('disposed');
 	  }
-
-	  /* getCenter(type){  
-	      if(this.center){
-	          return this.center.clone()
-	      }else{  
-	          let center = this.points.reduce(function(total, currentValue ){
-	              return total.add(currentValue)
-	          }, new THREE.Vector3 ) 
-	          
-	          this.points.length && center.multiplyScalar(1/this.points.length)
-	          return center //求不出重心呜呜
-	      } 
-	      
-	  } */
-
-	  /* createCenterLabel(name){
-	      const centerLabel = new TextSprite(
-	          $.extend({},mainLabelProp,{sizeInfo: labelSizeInfo, name, disToLine:0, fontsize:16*textSizeRatio} )
-	      )
-	      
-	      centerLabel.addEventListener('mouseover',()=>{
-	          this.isNew || this.setSelected(true, 'centerLabel')
-	      })
-	      centerLabel.addEventListener('mouseleave',()=>{
-	          this.isNew || this.setSelected(false, 'centerLabel')
-	      }) 
-	      centerLabel.addEventListener('click',()=>{
-	          this.isNew || viewer.measuringTool.isAdding || viewer.focusOnObject(this, 'measure')
-	      })
-	      Potree.Utils.setObjectLayers(centerLabel, 'measure' )
-	     
-	      Utils.updateVisible(centerLabel, 'setVisible', false)
-	      return centerLabel; 
-	  }
-	   */
-
 	  setFontSize(fontsize) {
 	    this.fontsize = fontsize;
 	    this.markerLabels.concat(this.titleLabel).forEach(e => {
@@ -42924,17 +42974,11 @@
 	  }
 	  setFadeFar(far) {
 	    //消失距离 
-	    var needsUpdate = far == void 0 != (this.fadeFar == void 0); //null为全部范围可见
 	    this.traverse(e => {
 	      var _e$material;
+	      if (e.name == 'marker') return; //因为marker材质共用的所以不改。因此正式编辑时(有marker时)别设置消失距离。
 	      if ((_e$material = e.material) !== null && _e$material !== void 0 && (_e$material = _e$material.uniforms) !== null && _e$material !== void 0 && _e$material.fadeFar) {
-	        if (far) {
-	          e.material.defines.FadeFar = '';
-	          e.material.uniforms.fadeFar.value = far;
-	        } else {
-	          delete e.material.defines.FadeFar;
-	        }
-	        needsUpdate && (e.material.needsUpdate = true);
+	        e.material.fadeFar = far;
 	      }
 	    });
 	    this.fadeFar = far;
@@ -42973,6 +43017,7 @@
 	}
 	Path$1.prototype.cloneMarker = Measure$1.prototype.cloneMarker;
 	Path$1.prototype.updateDatasetBelong = Measure$1.prototype.updateDatasetBelong;
+	Path$1.prototype.getTotalDistance = Measure$1.prototype.getTotalDistance;
 
 	/* 
 
@@ -43293,9 +43338,14 @@
 	    var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 	    var callback = arguments.length > 1 ? arguments[1] : undefined;
 	    var cancelFun = arguments.length > 2 ? arguments[2] : undefined;
+	    var measure;
 	    var domElement = this.viewer.renderer.domElement;
-	    var measure = args.measureType == 'MulDistance Ring' ? new Prism(args) : args.type == 'Path' ? new Path$1(args) : new Measure$1(args);
-	    this.scene.add(measure);
+	    if (args.resume) {
+	      measure = args.measure;
+	    } else {
+	      measure = args.measureType == 'MulDistance Ring' ? new Prism(args) : args.type == 'Path' ? new Path$1(args) : new Measure$1(args);
+	      this.scene.add(measure);
+	    }
 	    measure.isNew = true;
 	    this.viewer.dispatchEvent({
 	      type: 'start_inserting_measurement',
@@ -43437,7 +43487,7 @@
 	      if (e.measure && e.measure != measure || !viewer.scene.measurements.includes(measure) || !measure.isNew) {
 	        return; //若指定了退出的measure但和该measure不一致,就返回
 	      }
-	      if (e.remove || e.type == 'cancel_insertions') {
+	      if (e.remove || e.type == 'cancel_insertions' && !e.dontRemove) {
 	        viewer.scene.removeMeasurement(measure);
 	      }
 	      measure.editStateChange(false);
@@ -57859,7 +57909,7 @@
 	  constructor(points, lineMat, color, name) {
 	    var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
 	    super();
-	    this.curve = new CatmullRomCurve3(points, false, "centripetal" /* , tension */);
+	    this.curve = new CatmullRomCurve3(points, false, options.tension == void 0 ? "centripetal" : 'catmullrom', options.tension);
 	    this.name = name || 'curveNode';
 	    this.handleMat = options.handleMat;
 	    this.lineMat = lineMat;
@@ -58053,7 +58103,7 @@
 	  return lineMats$1[name];
 	};
 	class CameraAnimation$1 extends EventDispatcher {
-	  constructor(viewer) {
+	  constructor(viewer, tension) {
 	    super();
 	    this.viewer = viewer;
 	    this.selectedElement = null;
@@ -58072,7 +58122,7 @@
 	    this.curveType = "centripetal";
 	    this.visible = true;
 	    this.targets = [];
-	    this.createPath();
+	    this.createPath(tension);
 	    this.duration = 5;
 	    this.percent = 0;
 	    this.currentIndex = 0;
@@ -58196,8 +58246,10 @@
 	      this.durations.splice(index, 1);
 	    }
 	  }
-	  createPath() {
-	    this.posCurve = new CurveCtrl([], getLineMat('position'), colors$1.position, 'posCurve');
+	  createPath(tension) {
+	    this.posCurve = new CurveCtrl([], getLineMat('position'), colors$1.position, 'posCurve', {
+	      tension
+	    });
 	    //this.targetCurve = new CurveCtrl([], getLineMat('target'), colors.target, 'targetCurve', {noLine:true}); 
 	    this.posCurve.needsPercent = true;
 	    this.node.add(this.posCurve);
@@ -63728,18 +63780,7 @@
 	var CursorDeal = {
 	  priorityEvent: [
 	  //在前面的优先级高
-
 	  {
-	    'zoomInCloud': 'zoom-in'
-	  }, {
-	    'hoverPano': 'pointer'
-	  }, {
-	    "notAllowed-default": 'not-allowed'
-	  }, {
-	    'connectPano': "url({Potree.resourcePath}/images/connect.png),auto"
-	  }, {
-	    'disconnectPano': "url({Potree.resourcePath}/images/connect-dis.png),auto"
-	  }, {
 	    'grabbing': 'grabbing'
 	  },
 	  //通用
@@ -63747,18 +63788,27 @@
 	    'hoverGrab': 'grab'
 	  },
 	  //通用
-
 	  {
-	    'hoverLine': 'pointer'
-	  }, {
-	    'hoverTranHandle': 'grab'
-	  }, {
 	    pen_delPoint: "url({Potree.resourcePath}/images/polygon_mark/pic_pen_sub.png),auto"
 	  }, {
 	    pen_addPoint: "url({Potree.resourcePath}/images/polygon_mark/pic_pen_add.png),auto"
 	  }, {
 	    pen: "url({Potree.resourcePath}/images/polygon_mark/pic_pen.png),auto"
 	  }, {
+	    'zoomInCloud': 'zoom-in'
+	  }, {
+	    'hoverPano': 'pointer'
+	  }, {
+	    "notAllowed-default": 'not-allowed'
+	  }, {
+	    'connectPano': "url({Potree.resourcePath}/images/connect.png),auto"
+	  }, {
+	    'disconnectPano': "url({Potree.resourcePath}/images/connect-dis.png),auto"
+	  }, {
+	    'hoverLine': 'pointer'
+	  }, {
+	    'hoverTranHandle': 'grab'
+	  }, {
 	    "movePointcloud": 'move'
 	  }, {
 	    "polygon_isIntersectSelf": 'not-allowed'
@@ -73024,7 +73074,7 @@
 
 	var CamAniEditor = {
 	  createAnimation(data) {
-	    var animation = new CameraAnimation$1(viewer);
+	    var animation = new CameraAnimation$1(viewer, data.tension);
 	    if (data) {
 	      animation.name = data.name;
 	      animation.duration = data.duration;

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
public/lib/potree/potree.js.map


binární
public/lib/potree/resources/textures/polygon_mark/pic_pen.png


binární
public/lib/potree/resources/textures/polygon_mark/pic_pen_add.png


binární
public/lib/potree/resources/textures/polygon_mark/pic_pen_sub.png


+ 126 - 26
src/sdk/cover/index.js

@@ -293,8 +293,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
                 }
             }
         }
-         
-        measure.addEventListener('marker_dropped', update)
+        measure.addEventListener('marker_dropped', update) 
+        measure.addEventListener('removeMarker', update)
         measure.addEventListener('createDone', update)
        
         return {
@@ -1255,11 +1255,13 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
         
             let path
             let info = {type : 'Path', minMarkers : 2, title:props.name}
+             
+                 
             if(props.points.length == 0){
-
                 path = viewer.measuringTool.startInsertion( info, () => { 
-                    bus.emit("end", functions); //完成  
-                }) 
+                    bus.emit("drawed" ); //完成   
+                })
+                viewer.dispatchEvent({ type: 'cancel_insertions', dontRemove: true, measure:path }) //要等进入编辑才能继续编辑
             }else{
                 info.dataset_points = props.points.map(e=>e.modelId)
                 info.points_datasets = props.points.map(e=>e.position)
@@ -1267,37 +1269,54 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
                 
                 if(props.line.position) {
                     let pos = Potree.Utils.datasetPosTransform({toDataset:true, position: props.line.position,  datasetId: props.line.modelId })
-                    path.updateTitlePos(pos)  
-                    
-                    
-                    
+                    path.updateTitlePos(pos) 
                 }
-                
+                 
             }
-             
-            
-            path.addEventListener('markerSelect',(e)=>{ 
-                bus.emit('activePoint',   e.cancel ? -1 : path.markers.indexOf(e.marker)   )
-            }) 
-            path.addEventListener('titlePosChanged',(e)=>{
-                bus.emit('linePositionChange', {
-                    modelId: e.root.dataset_id, 
-                    pos:  Potree.Utils.datasetPosTransform({toDataset:true, position: e.position.clone(),  datasetId: e.root.dataset_id })
+            {
+                path.addEventListener('markerSelect',(e)=>{ 
+                    bus.emit('activePoint',   e.cancel ? -1 : path.markers.indexOf(e.marker)   )
+                }) 
+                path.addEventListener('titlePosChanged',(e)=>{
+                    bus.emit('linePositionChange', {
+                        modelId: e.root.dataset_id, 
+                        pos:  Potree.Utils.datasetPosTransform({toDataset:true, position: e.position.clone(),  datasetId: e.root.dataset_id })
+                    })
+                     
                 })
-                 
-            })
-            
-            
+            }
             let funs = getMeasureFunction(path, bus) 
 
 
             let fadeFar = -1 
-            
+              
             let functions = Object.assign(funs,{
                 bus,
-                changeCanEdit(state){
+                
+                changeEditMode(state){//进入编辑
+                    console.log('changeEditMode', path.title, state)
+                    if(!state){ 
+                        viewer.dispatchEvent({ type: 'cancel_insertions', dontRemove: true, measure:path })
+                    }
+ 
                     path.setEditEnable(state)
                     functions.changeVisibilityRange(fadeFar)
+                },
+                
+                changeCanEdit(state){//是否点击pen图标以加点和删点 
+                    if(state){
+                        if(path.points.length < 2){//继续绘制
+                            info.resume = true, info.measure = path
+                            path = viewer.measuringTool.startInsertion( info, () => { 
+                                bus.emit("drawed" ); //完成   
+                            })
+                        }  
+                    }else{ 
+                        viewer.dispatchEvent({ type: 'cancel_insertions', dontRemove: true, measure:path })
+                    }
+                
+                    console.log('changeCanEdit', path.title, state)
+                    path.setAddOrRemPoint(state) 
                 }, 
                 visibility(v){ 
                     console.log('visibility', path.title, v)
@@ -1325,10 +1344,91 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
                 },
                 changeVisibilityRange(far){//设置消失距离
                     fadeFar = far 
-                    path.setFadeFar(( far== -1 || path.enableEdit) ? null : far) //注意:编辑时显示全部
+                    path.setFadeFar(( far== -1 || path.editEnable) ? null : far) //注意:编辑时显示全部
+                },
+                createAni(tension){
+                    let distance = path.getTotalDistance()
+                    let pathPoints = path.points.map(e=>e.clone().add(new THREE.Vector3(0,0,2))) //在地面之上一定高度
+                    
+                    const speed = 3, //m/s
+                          turnDisPerRad = 1.5,  
+                          maxTurnDis = 3,//拐弯最大距离
+                          maxRoadTurnRatio = 0.8 //每段路单次转弯最大比例,防止拐弯占据一整条路直到下一个点
+                    let roadLens = []
+                    let vecs = pathPoints.map((p,i)=>{
+                        if(i==0)return 
+                        let last = pathPoints[i-1]
+                        roadLens.push(p.distanceTo(last))
+                        return new THREE.Vector3().subVectors(p,last).normalize()
+                    })
+                    let turnDis = vecs.map((vec,i)=>{//在每个转折点拐弯前后需要的米数
+                        if(i==0 || i==vecs.length-1)return 0
+                        let next = vecs[i+1]
+                        let angle = next.angleTo(vec) 
+                        return Math.min(turnDisPerRad * angle / 2,  maxTurnDis )
+                    })
+                    let points = []
+                    let len = pathPoints.length
+                    for(let i=0;i<len;i++){
+                        let thisPoint = pathPoints[i]
+                        let nextPoint = pathPoints[i+1]
+                        if(i==0 || i==len-1){//首尾的点直接加入,其他点不加
+                            points.push({
+                                position: thisPoint.clone(), 
+                                target: i==0 ? nextPoint.clone() : pathPoints[len-1].clone().add(vecs[len-1])
+                            })
+                        }
+                            
+                        if(i<len-1){  //加入每段边要加入的两个(or一个)拐点 ,拐点之间方向沿着路径 
+                            let turnDis1 = Math.min(turnDis[i], roadLens[i] * maxRoadTurnRatio) 
+                            let turnDis2 = Math.min(turnDis[i+1], roadLens[i] * maxRoadTurnRatio)
+                            let turnDisSum = turnDis1 + turnDis2 //两端拐弯距离之和。
+                            
+                            if(turnDisSum > roadLens[i]){//如果超过了路长度, 该条路就只有一个拐点
+                                turnDis1 = turnDis1 / turnDisSum * roadLens[i]
+                                let p = thisPoint.clone().add(vecs[i+1].clone().multiplyScalar(turnDis1))
+                                points.push({position: p, target: nextPoint.clone()}) 
+                            }else{
+                                if(turnDis1>0){ //i==0时为0
+                                    let turnPoint1 = thisPoint.clone().add(vecs[i+1].clone().multiplyScalar(turnDis1))
+                                    points.push({position: turnPoint1, target: nextPoint.clone()})
+                                } 
+                                if(turnDis2>0){//i==len-2时为0
+                                    let turnPoint2 = nextPoint.clone().sub(vecs[i+1].clone().multiplyScalar(turnDis2)) 
+                                    points.push({position:turnPoint2, target: nextPoint.clone()})
+                                }
+                            }  
+                        } 
+                    }
+                    //加后缀&test以看路线
+                     
+                    let data = { 
+                        name : 'path_guideTour',
+                        duration :  distance / speed,
+                        points,
+                        tension
+                        
+                    }
+                    path.animation_ = viewer.modules.CamAniEditor.createAnimation(data)
+                },
+                play(playDone){
+                    functions.createAni();//不传参数时路径最圆润缓和,但会脱离原路径。传参后除了拐弯都按路径,参数越大越圆润,但容易有折回的bug。 如果没有严格要求就不传参效果最佳。
+                    path.animation_.play()
+                    path.animation.event_.addEventListener('playDone', () => {
+                        playDone && playDone()
+                        //viewer.images360.panos.forEach(e=>e.marker && Potree.Utils.updateVisible(e, 'playAni', true))
+                    }) 
+                    
+                },
+                pause(){
+                    path.animation_.pause()
+                    viewer.modules.CamAniEditor.removeAnimation(path.animation_)
                 }
                 
             })
+            
+            path.functions = functions
+            
             return functions