| function RepeaterModifier(){} |
| extendPrototype([ShapeModifier], RepeaterModifier); |
| |
| RepeaterModifier.prototype.initModifierProperties = function(elem,data){ |
| this.getValue = this.processKeys; |
| this.c = PropertyFactory.getProp(elem,data.c,0,null,this); |
| this.o = PropertyFactory.getProp(elem,data.o,0,null,this); |
| this.tr = TransformPropertyFactory.getTransformProperty(elem,data.tr,this); |
| this.so = PropertyFactory.getProp(elem,data.tr.so,0,0.01,this); |
| this.eo = PropertyFactory.getProp(elem,data.tr.eo,0,0.01,this); |
| this.data = data; |
| if(!this.dynamicProperties.length){ |
| this.getValue(true); |
| } |
| this._isAnimated = !!this.dynamicProperties.length; |
| this.pMatrix = new Matrix(); |
| this.rMatrix = new Matrix(); |
| this.sMatrix = new Matrix(); |
| this.tMatrix = new Matrix(); |
| this.matrix = new Matrix(); |
| }; |
| |
| RepeaterModifier.prototype.applyTransforms = function(pMatrix, rMatrix, sMatrix, transform, perc, inv){ |
| var dir = inv ? -1 : 1; |
| var scaleX = transform.s.v[0] + (1 - transform.s.v[0]) * (1 - perc); |
| var scaleY = transform.s.v[1] + (1 - transform.s.v[1]) * (1 - perc); |
| pMatrix.translate(transform.p.v[0] * dir * perc, transform.p.v[1] * dir * perc, transform.p.v[2]); |
| rMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]); |
| rMatrix.rotate(-transform.r.v * dir * perc); |
| rMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]); |
| sMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]); |
| sMatrix.scale(inv ? 1/scaleX : scaleX, inv ? 1/scaleY : scaleY); |
| sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]); |
| }; |
| |
| RepeaterModifier.prototype.init = function(elem, arr, pos, elemsData) { |
| this.elem = elem; |
| this.arr = arr; |
| this.pos = pos; |
| this.elemsData = elemsData; |
| this._currentCopies = 0; |
| this._elements = []; |
| this._groups = []; |
| this.frameId = -1; |
| this.initDynamicPropertyContainer(elem); |
| this.initModifierProperties(elem,arr[pos]); |
| var cont = 0; |
| while(pos>0){ |
| pos -= 1; |
| //this._elements.unshift(arr.splice(pos,1)[0]); |
| this._elements.unshift(arr[pos]); |
| cont += 1; |
| } |
| if(this.dynamicProperties.length){ |
| this.k = true; |
| }else{ |
| this.getValue(true); |
| } |
| }; |
| |
| RepeaterModifier.prototype.resetElements = function(elements){ |
| var i, len = elements.length; |
| for(i = 0; i < len; i += 1) { |
| elements[i]._processed = false; |
| if(elements[i].ty === 'gr'){ |
| this.resetElements(elements[i].it); |
| } |
| } |
| }; |
| |
| RepeaterModifier.prototype.cloneElements = function(elements){ |
| var i, len = elements.length; |
| var newElements = JSON.parse(JSON.stringify(elements)); |
| this.resetElements(newElements); |
| return newElements; |
| }; |
| |
| RepeaterModifier.prototype.changeGroupRender = function(elements, renderFlag) { |
| var i, len = elements.length; |
| for(i = 0; i < len; i += 1) { |
| elements[i]._render = renderFlag; |
| if(elements[i].ty === 'gr') { |
| this.changeGroupRender(elements[i].it, renderFlag); |
| } |
| } |
| }; |
| |
| RepeaterModifier.prototype.processShapes = function(_isFirstFrame) { |
| var items, itemsTransform, i, dir, cont; |
| if(this._mdf || _isFirstFrame){ |
| var copies = Math.ceil(this.c.v); |
| if(this._groups.length < copies){ |
| while(this._groups.length < copies){ |
| var group = { |
| it:this.cloneElements(this._elements), |
| ty:'gr' |
| }; |
| group.it.push({"a":{"a":0,"ix":1,"k":[0,0]},"nm":"Transform","o":{"a":0,"ix":7,"k":100},"p":{"a":0,"ix":2,"k":[0,0]},"r":{"a":1,"ix":6,"k":[{s:0,e:0,t:0},{s:0,e:0,t:1}]},"s":{"a":0,"ix":3,"k":[100,100]},"sa":{"a":0,"ix":5,"k":0},"sk":{"a":0,"ix":4,"k":0},"ty":"tr"}); |
| |
| this.arr.splice(0,0,group); |
| this._groups.splice(0,0,group); |
| this._currentCopies += 1; |
| } |
| this.elem.reloadShapes(); |
| } |
| cont = 0; |
| var renderFlag; |
| for(i = 0; i <= this._groups.length - 1; i += 1){ |
| renderFlag = cont < copies; |
| this._groups[i]._render = renderFlag; |
| this.changeGroupRender(this._groups[i].it, renderFlag); |
| cont += 1; |
| } |
| |
| this._currentCopies = copies; |
| //// |
| |
| var offset = this.o.v; |
| var offsetModulo = offset%1; |
| var roundOffset = offset > 0 ? Math.floor(offset) : Math.ceil(offset); |
| var k; |
| var tMat = this.tr.v.props; |
| var pProps = this.pMatrix.props; |
| var rProps = this.rMatrix.props; |
| var sProps = this.sMatrix.props; |
| this.pMatrix.reset(); |
| this.rMatrix.reset(); |
| this.sMatrix.reset(); |
| this.tMatrix.reset(); |
| this.matrix.reset(); |
| var iteration = 0; |
| |
| if(offset > 0) { |
| while(iteration<roundOffset){ |
| this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false); |
| iteration += 1; |
| } |
| if(offsetModulo){ |
| this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, offsetModulo, false); |
| iteration += offsetModulo; |
| } |
| } else if(offset < 0) { |
| while(iteration>roundOffset){ |
| this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, true); |
| iteration -= 1; |
| } |
| if(offsetModulo){ |
| this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, - offsetModulo, true); |
| iteration -= offsetModulo; |
| } |
| } |
| i = this.data.m === 1 ? 0 : this._currentCopies - 1; |
| dir = this.data.m === 1 ? 1 : -1; |
| cont = this._currentCopies; |
| var j, jLen; |
| while(cont){ |
| items = this.elemsData[i].it; |
| itemsTransform = items[items.length - 1].transform.mProps.v.props; |
| jLen = itemsTransform.length; |
| items[items.length - 1].transform.mProps._mdf = true; |
| items[items.length - 1].transform.op._mdf = true; |
| items[items.length - 1].transform.op.v = this.so.v + (this.eo.v - this.so.v) * (i / (this._currentCopies - 1)); |
| if(iteration !== 0){ |
| if((i !== 0 && dir === 1) || (i !== this._currentCopies - 1 && dir === -1)){ |
| this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false); |
| } |
| this.matrix.transform(rProps[0],rProps[1],rProps[2],rProps[3],rProps[4],rProps[5],rProps[6],rProps[7],rProps[8],rProps[9],rProps[10],rProps[11],rProps[12],rProps[13],rProps[14],rProps[15]); |
| this.matrix.transform(sProps[0],sProps[1],sProps[2],sProps[3],sProps[4],sProps[5],sProps[6],sProps[7],sProps[8],sProps[9],sProps[10],sProps[11],sProps[12],sProps[13],sProps[14],sProps[15]); |
| this.matrix.transform(pProps[0],pProps[1],pProps[2],pProps[3],pProps[4],pProps[5],pProps[6],pProps[7],pProps[8],pProps[9],pProps[10],pProps[11],pProps[12],pProps[13],pProps[14],pProps[15]); |
| |
| for(j=0;j<jLen;j+=1) { |
| itemsTransform[j] = this.matrix.props[j]; |
| } |
| this.matrix.reset(); |
| } else { |
| this.matrix.reset(); |
| for(j=0;j<jLen;j+=1) { |
| itemsTransform[j] = this.matrix.props[j]; |
| } |
| } |
| iteration += 1; |
| cont -= 1; |
| i += dir; |
| } |
| } else { |
| cont = this._currentCopies; |
| i = 0; |
| dir = 1; |
| while(cont){ |
| items = this.elemsData[i].it; |
| itemsTransform = items[items.length - 1].transform.mProps.v.props; |
| items[items.length - 1].transform.mProps._mdf = false; |
| items[items.length - 1].transform.op._mdf = false; |
| cont -= 1; |
| i += dir; |
| } |
| } |
| }; |
| |
| RepeaterModifier.prototype.addShape = function(){}; |
| |
| ShapeModifiers.registerModifier('rp',RepeaterModifier); |