| 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
import { __extends } from "tslib"; 
 | 
/** 
 | 
 * Provide effect for line 
 | 
 */ 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import Line from './Line.js'; 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import { createSymbol } from '../../util/symbol.js'; 
 | 
import * as vec2 from 'zrender/lib/core/vector.js'; 
 | 
import * as curveUtil from 'zrender/lib/core/curve.js'; 
 | 
var EffectLine = /** @class */function (_super) { 
 | 
  __extends(EffectLine, _super); 
 | 
  function EffectLine(lineData, idx, seriesScope) { 
 | 
    var _this = _super.call(this) || this; 
 | 
    _this.add(_this.createLine(lineData, idx, seriesScope)); 
 | 
    _this._updateEffectSymbol(lineData, idx); 
 | 
    return _this; 
 | 
  } 
 | 
  EffectLine.prototype.createLine = function (lineData, idx, seriesScope) { 
 | 
    return new Line(lineData, idx, seriesScope); 
 | 
  }; 
 | 
  EffectLine.prototype._updateEffectSymbol = function (lineData, idx) { 
 | 
    var itemModel = lineData.getItemModel(idx); 
 | 
    var effectModel = itemModel.getModel('effect'); 
 | 
    var size = effectModel.get('symbolSize'); 
 | 
    var symbolType = effectModel.get('symbol'); 
 | 
    if (!zrUtil.isArray(size)) { 
 | 
      size = [size, size]; 
 | 
    } 
 | 
    var lineStyle = lineData.getItemVisual(idx, 'style'); 
 | 
    var color = effectModel.get('color') || lineStyle && lineStyle.stroke; 
 | 
    var symbol = this.childAt(1); 
 | 
    if (this._symbolType !== symbolType) { 
 | 
      // Remove previous 
 | 
      this.remove(symbol); 
 | 
      symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color); 
 | 
      symbol.z2 = 100; 
 | 
      symbol.culling = true; 
 | 
      this.add(symbol); 
 | 
    } 
 | 
    // Symbol may be removed if loop is false 
 | 
    if (!symbol) { 
 | 
      return; 
 | 
    } 
 | 
    // Shadow color is same with color in default 
 | 
    symbol.setStyle('shadowColor', color); 
 | 
    symbol.setStyle(effectModel.getItemStyle(['color'])); 
 | 
    symbol.scaleX = size[0]; 
 | 
    symbol.scaleY = size[1]; 
 | 
    symbol.setColor(color); 
 | 
    this._symbolType = symbolType; 
 | 
    this._symbolScale = size; 
 | 
    this._updateEffectAnimation(lineData, effectModel, idx); 
 | 
  }; 
 | 
  EffectLine.prototype._updateEffectAnimation = function (lineData, effectModel, idx) { 
 | 
    var symbol = this.childAt(1); 
 | 
    if (!symbol) { 
 | 
      return; 
 | 
    } 
 | 
    var points = lineData.getItemLayout(idx); 
 | 
    var period = effectModel.get('period') * 1000; 
 | 
    var loop = effectModel.get('loop'); 
 | 
    var roundTrip = effectModel.get('roundTrip'); 
 | 
    var constantSpeed = effectModel.get('constantSpeed'); 
 | 
    var delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) { 
 | 
      return idx / lineData.count() * period / 3; 
 | 
    }); 
 | 
    // Ignore when updating 
 | 
    symbol.ignore = true; 
 | 
    this._updateAnimationPoints(symbol, points); 
 | 
    if (constantSpeed > 0) { 
 | 
      period = this._getLineLength(symbol) / constantSpeed * 1000; 
 | 
    } 
 | 
    if (period !== this._period || loop !== this._loop || roundTrip !== this._roundTrip) { 
 | 
      symbol.stopAnimation(); 
 | 
      var delayNum = void 0; 
 | 
      if (zrUtil.isFunction(delayExpr)) { 
 | 
        delayNum = delayExpr(idx); 
 | 
      } else { 
 | 
        delayNum = delayExpr; 
 | 
      } 
 | 
      if (symbol.__t > 0) { 
 | 
        delayNum = -period * symbol.__t; 
 | 
      } 
 | 
      this._animateSymbol(symbol, period, delayNum, loop, roundTrip); 
 | 
    } 
 | 
    this._period = period; 
 | 
    this._loop = loop; 
 | 
    this._roundTrip = roundTrip; 
 | 
  }; 
 | 
  EffectLine.prototype._animateSymbol = function (symbol, period, delayNum, loop, roundTrip) { 
 | 
    if (period > 0) { 
 | 
      symbol.__t = 0; 
 | 
      var self_1 = this; 
 | 
      var animator = symbol.animate('', loop).when(roundTrip ? period * 2 : period, { 
 | 
        __t: roundTrip ? 2 : 1 
 | 
      }).delay(delayNum).during(function () { 
 | 
        self_1._updateSymbolPosition(symbol); 
 | 
      }); 
 | 
      if (!loop) { 
 | 
        animator.done(function () { 
 | 
          self_1.remove(symbol); 
 | 
        }); 
 | 
      } 
 | 
      animator.start(); 
 | 
    } 
 | 
  }; 
 | 
  EffectLine.prototype._getLineLength = function (symbol) { 
 | 
    // Not so accurate 
 | 
    return vec2.dist(symbol.__p1, symbol.__cp1) + vec2.dist(symbol.__cp1, symbol.__p2); 
 | 
  }; 
 | 
  EffectLine.prototype._updateAnimationPoints = function (symbol, points) { 
 | 
    symbol.__p1 = points[0]; 
 | 
    symbol.__p2 = points[1]; 
 | 
    symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2]; 
 | 
  }; 
 | 
  EffectLine.prototype.updateData = function (lineData, idx, seriesScope) { 
 | 
    this.childAt(0).updateData(lineData, idx, seriesScope); 
 | 
    this._updateEffectSymbol(lineData, idx); 
 | 
  }; 
 | 
  EffectLine.prototype._updateSymbolPosition = function (symbol) { 
 | 
    var p1 = symbol.__p1; 
 | 
    var p2 = symbol.__p2; 
 | 
    var cp1 = symbol.__cp1; 
 | 
    var t = symbol.__t < 1 ? symbol.__t : 2 - symbol.__t; 
 | 
    var pos = [symbol.x, symbol.y]; 
 | 
    var lastPos = pos.slice(); 
 | 
    var quadraticAt = curveUtil.quadraticAt; 
 | 
    var quadraticDerivativeAt = curveUtil.quadraticDerivativeAt; 
 | 
    pos[0] = quadraticAt(p1[0], cp1[0], p2[0], t); 
 | 
    pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t); 
 | 
    // Tangent 
 | 
    var tx = symbol.__t < 1 ? quadraticDerivativeAt(p1[0], cp1[0], p2[0], t) : quadraticDerivativeAt(p2[0], cp1[0], p1[0], 1 - t); 
 | 
    var ty = symbol.__t < 1 ? quadraticDerivativeAt(p1[1], cp1[1], p2[1], t) : quadraticDerivativeAt(p2[1], cp1[1], p1[1], 1 - t); 
 | 
    symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; 
 | 
    // enable continuity trail for 'line', 'rect', 'roundRect' symbolType 
 | 
    if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') { 
 | 
      if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) { 
 | 
        symbol.scaleY = vec2.dist(lastPos, pos) * 1.05; 
 | 
        // make sure the last segment render within endPoint 
 | 
        if (t === 1) { 
 | 
          pos[0] = lastPos[0] + (pos[0] - lastPos[0]) / 2; 
 | 
          pos[1] = lastPos[1] + (pos[1] - lastPos[1]) / 2; 
 | 
        } 
 | 
      } else if (symbol.__lastT === 1) { 
 | 
        // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly. 
 | 
        symbol.scaleY = 2 * vec2.dist(p1, pos); 
 | 
      } else { 
 | 
        symbol.scaleY = this._symbolScale[1]; 
 | 
      } 
 | 
    } 
 | 
    symbol.__lastT = symbol.__t; 
 | 
    symbol.ignore = false; 
 | 
    symbol.x = pos[0]; 
 | 
    symbol.y = pos[1]; 
 | 
  }; 
 | 
  EffectLine.prototype.updateLayout = function (lineData, idx) { 
 | 
    this.childAt(0).updateLayout(lineData, idx); 
 | 
    var effectModel = lineData.getItemModel(idx).getModel('effect'); 
 | 
    this._updateEffectAnimation(lineData, effectModel, idx); 
 | 
  }; 
 | 
  return EffectLine; 
 | 
}(graphic.Group); 
 | 
export default EffectLine; 
 |