PuckerAndBloatModifier.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {
  2. extendPrototype,
  3. } from '../functionExtensions';
  4. import PropertyFactory from '../PropertyFactory';
  5. import shapePool from '../pooling/shape_pool';
  6. import {
  7. ShapeModifier,
  8. } from './ShapeModifiers';
  9. function PuckerAndBloatModifier() {}
  10. extendPrototype([ShapeModifier], PuckerAndBloatModifier);
  11. PuckerAndBloatModifier.prototype.initModifierProperties = function (elem, data) {
  12. this.getValue = this.processKeys;
  13. this.amount = PropertyFactory.getProp(elem, data.a, 0, null, this);
  14. this._isAnimated = !!this.amount.effectsSequence.length;
  15. };
  16. PuckerAndBloatModifier.prototype.processPath = function (path, amount) {
  17. var percent = amount / 100;
  18. var centerPoint = [0, 0];
  19. var pathLength = path._length;
  20. var i = 0;
  21. for (i = 0; i < pathLength; i += 1) {
  22. centerPoint[0] += path.v[i][0];
  23. centerPoint[1] += path.v[i][1];
  24. }
  25. centerPoint[0] /= pathLength;
  26. centerPoint[1] /= pathLength;
  27. var clonedPath = shapePool.newElement();
  28. clonedPath.c = path.c;
  29. var vX;
  30. var vY;
  31. var oX;
  32. var oY;
  33. var iX;
  34. var iY;
  35. for (i = 0; i < pathLength; i += 1) {
  36. vX = path.v[i][0] + (centerPoint[0] - path.v[i][0]) * percent;
  37. vY = path.v[i][1] + (centerPoint[1] - path.v[i][1]) * percent;
  38. oX = path.o[i][0] + (centerPoint[0] - path.o[i][0]) * -percent;
  39. oY = path.o[i][1] + (centerPoint[1] - path.o[i][1]) * -percent;
  40. iX = path.i[i][0] + (centerPoint[0] - path.i[i][0]) * -percent;
  41. iY = path.i[i][1] + (centerPoint[1] - path.i[i][1]) * -percent;
  42. clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, i);
  43. }
  44. return clonedPath;
  45. };
  46. PuckerAndBloatModifier.prototype.processShapes = function (_isFirstFrame) {
  47. var shapePaths;
  48. var i;
  49. var len = this.shapes.length;
  50. var j;
  51. var jLen;
  52. var amount = this.amount.v;
  53. if (amount !== 0) {
  54. var shapeData;
  55. var localShapeCollection;
  56. for (i = 0; i < len; i += 1) {
  57. shapeData = this.shapes[i];
  58. localShapeCollection = shapeData.localShapeCollection;
  59. if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) {
  60. localShapeCollection.releaseShapes();
  61. shapeData.shape._mdf = true;
  62. shapePaths = shapeData.shape.paths.shapes;
  63. jLen = shapeData.shape.paths._length;
  64. for (j = 0; j < jLen; j += 1) {
  65. localShapeCollection.addShape(this.processPath(shapePaths[j], amount));
  66. }
  67. }
  68. shapeData.shape.paths = shapeData.localShapeCollection;
  69. }
  70. }
  71. if (!this.dynamicProperties.length) {
  72. this._mdf = false;
  73. }
  74. };
  75. export default PuckerAndBloatModifier;