blob: 8f03301bcfc06418d0d34ce443052f0b72b7e385 [file] [log] [blame]
/*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */
/*global bez*/
var PropertyFactory = (function () {
var initFrame = -999999;
var degToRads = Math.PI / 180;
var bm_min = Math.min;
function getValue() {
if (this.elem.globalData.frameId === this.frameId) {
return;
}
this.mdf = false;
this.frameId = this.elem.globalData.frameId;
var frameNum = this.comp.renderedFrame - this.offsetTime;
if (frameNum === this.lastFrame || (this.lastFrame !== initFrame && ((this.lastFrame >= this.keyframes[this.keyframes.length - 1].t - this.offsetTime && frameNum >= this.keyframes[this.keyframes.length - 1].t - this.offsetTime) || (this.lastFrame < this.keyframes[0].t - this.offsetTime && frameNum < this.keyframes[0].t - this.offsetTime)))) {
} else {
var i = 0, len = this.keyframes.length - 1, dir = 1, flag = true, keyData, nextKeyData;
while (flag) {
keyData = this.keyframes[i];
nextKeyData = this.keyframes[i + 1];
if (i === len - 1 && frameNum >= nextKeyData.t - this.offsetTime) {
if (keyData.h) {
keyData = nextKeyData;
}
break;
}
if ((nextKeyData.t - this.offsetTime) > frameNum) {
break;
}
if (i < len - 1) {
i += dir;
} else {
flag = false;
}
}
var k, kLen, perc, jLen, j = 0, fnc;
if (keyData.to) {
var bezierData = bez.buildBezierData(keyData);
if (frameNum >= nextKeyData.t - this.offsetTime || frameNum < keyData.t - this.offsetTime) {
var ind = frameNum >= nextKeyData.t - this.offsetTime ? bezierData.points.length - 1 : 0;
kLen = bezierData.points[ind].point.length;
for (k = 0; k < kLen; k += 1) {
this.v[k] = this.mult ? bezierData.points[ind].point[k] * this.mult : bezierData.points[ind].point[k];
this.pv[k] = bezierData.points[ind].point[k];
if (this.lastPValue[k] !== this.pv[k]) {
this.mdf = true;
this.lastPValue[k] = this.pv[k];
}
}
} else {
if (keyData.__fnct) {
fnc = keyData.__fnct;
} else {
fnc = bez.getEasingCurve(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y, keyData.n);
keyData.__fnct = fnc;
}
perc = fnc('', (frameNum) - (keyData.t - this.offsetTime), 0, 1, (nextKeyData.t - this.offsetTime) - (keyData.t - this.offsetTime));
var distanceInLine = bezierData.segmentLength * perc;
var segmentPerc;
var addedLength = 0;
dir = 1;
flag = true;
jLen = bezierData.points.length;
while (flag) {
addedLength += bezierData.points[j].partialLength * dir;
if (distanceInLine === 0 || perc === 0 || j === bezierData.points.length - 1) {
kLen = bezierData.points[j].point.length;
for (k = 0; k < kLen; k += 1) {
this.v[k] = this.mult ? bezierData.points[j].point[k] * this.mult : bezierData.points[j].point[k];
this.pv[k] = bezierData.points[j].point[k];
if (this.lastPValue[k] !== this.pv[k]) {
this.mdf = true;
this.lastPValue[k] = this.pv[k];
}
}
break;
} else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {
segmentPerc = (distanceInLine - addedLength) / (bezierData.points[j + 1].partialLength);
kLen = bezierData.points[j].point.length;
for (k = 0; k < kLen; k += 1) {
this.v[k] = this.mult ? (bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc) * this.mult : bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc;
this.pv[k] = bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc;
if (this.lastPValue[k] !== this.pv[k]) {
this.mdf = true;
this.lastPValue[k] = this.pv[k];
}
}
break;
}
if ((j < jLen - 1 && dir === 1) || (j > 0 && dir === -1)) {
j += dir;
} else {
flag = false;
}
}
}
} else {
var outX, outY, inX, inY, isArray = false, keyValue;
len = keyData.s.length;
for (i = 0; i < len; i += 1) {
if (keyData.h !== 1) {
if (keyData.o.x instanceof Array) {
isArray = true;
if (!keyData.__fnct) {
keyData.__fnct = [];
}
if (!keyData.__fnct[i]) {
outX = keyData.o.x[i] || keyData.o.x[0];
outY = keyData.o.y[i] || keyData.o.y[0];
inX = keyData.i.x[i] || keyData.i.x[0];
inY = keyData.i.y[i] || keyData.i.y[0];
}
} else {
isArray = false;
if (!keyData.__fnct) {
outX = keyData.o.x;
outY = keyData.o.y;
inX = keyData.i.x;
inY = keyData.i.y;
}
}
if (isArray) {
if (keyData.__fnct[i]) {
fnc = keyData.__fnct[i];
} else {
fnc = bez.getEasingCurve(outX, outY, inX, inY);
keyData.__fnct[i] = fnc;
}
} else {
if (keyData.__fnct) {
fnc = keyData.__fnct;
} else {
fnc = bez.getEasingCurve(outX, outY, inX, inY);
keyData.__fnct = fnc;
}
}
if (frameNum >= nextKeyData.t - this.offsetTime) {
perc = 1;
} else if (frameNum < keyData.t - this.offsetTime) {
perc = 0;
} else {
perc = fnc('', (frameNum) - (keyData.t - this.offsetTime), 0, 1, (nextKeyData.t - this.offsetTime) - (keyData.t - this.offsetTime));
}
}
keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (keyData.e[i] - keyData.s[i]) * perc;
if (len === 1) {
this.v = this.mult ? keyValue * this.mult : keyValue;
this.pv = keyValue;
if (this.lastPValue !== this.pv) {
this.mdf = true;
this.lastPValue = this.pv;
}
} else {
this.v[i] = this.mult ? keyValue * this.mult : keyValue;
this.pv[i] = keyValue;
if (this.lastPValue[i] !== this.pv[i]) {
this.mdf = true;
this.lastPValue[i] = this.pv[i];
}
}
}
}
}
this.lastFrame = frameNum;
}
function interpolateShape() {
this.mdf = false;
var frameNum = this.comp.renderedFrame - this.offsetTime;
if(this.lastFrame !== initFrame && ((this.lastFrame < this.keyframes[0].t-this.offsetTime && frameNum < this.keyframes[0].t-this.offsetTime) || (this.lastFrame > this.keyframes[this.keyframes.length - 1].t-this.offsetTime && frameNum > this.keyframes[this.keyframes.length - 1].t-this.offsetTime))){
}else{
var keyPropS,keyPropE,isHold;
if(frameNum < this.keyframes[0].t-this.offsetTime){
this.mdf = true;
keyPropS = this.keyframes[0].s[0];
isHold = true;
}else if(frameNum > this.keyframes[this.keyframes.length - 1].t-this.offsetTime){
this.mdf = true;
if(this.keyframes[this.keyframes.length - 2].h === 1){
keyPropS = this.keyframes[this.keyframes.length - 2].s[0];
}else{
keyPropS = this.keyframes[this.keyframes.length - 2].e[0];
}
isHold = true;
}else{
this.mdf = true;
var i = 0,len = this.keyframes.length- 1, dir = 1,flag = true,keyData,nextKeyData, j, jLen, k, kLen;
while(flag){
keyData = this.keyframes[i];
nextKeyData = this.keyframes[i+1];
if((nextKeyData.t - this.offsetTime) > frameNum && dir == 1){
break;
}
if(i < len - 1 && dir == 1){
i += dir;
}else{
flag = false;
}
}
var perc;
if(keyData.h !== 1){
var fnc;
if(keyData.__fnct){
fnc = keyData.__fnct;
}else{
fnc = bez.getEasingCurve(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y);
keyData.__fnct = fnc;
}
if(frameNum >= nextKeyData.t-this.offsetTime){
perc = 1;
}else if(frameNum < keyData.t-this.offsetTime){
perc = 0;
}else{
perc = fnc('',(frameNum)-(keyData.t-this.offsetTime),0,1,(nextKeyData.t-this.offsetTime)-(keyData.t-this.offsetTime));
}
keyPropE = keyData.e[0];
}
keyPropS = keyData.s[0];
isHold = keyData.h === 1;
}
jLen = this.v.i.length;
kLen = keyPropS.i[0].length;
for(j=0;j<jLen;j+=1){
for(k=0;k<kLen;k+=1){
if(isHold){
this.v.i[j][k] = keyPropS.i[j][k];
this.v.o[j][k] = keyPropS.o[j][k];
this.v.v[j][k] = keyPropS.v[j][k];
this.pv.i[j][k] = keyPropS.i[j][k];
this.pv.o[j][k] = keyPropS.o[j][k];
this.pv.v[j][k] = keyPropS.v[j][k];
}else{
this.v.i[j][k] = keyPropS.i[j][k]+(keyPropE.i[j][k]-keyPropS.i[j][k])*perc;
this.v.o[j][k] = keyPropS.o[j][k]+(keyPropE.o[j][k]-keyPropS.o[j][k])*perc;
this.v.v[j][k] = keyPropS.v[j][k]+(keyPropE.v[j][k]-keyPropS.v[j][k])*perc;
this.pv.i[j][k] = keyPropS.i[j][k]+(keyPropE.i[j][k]-keyPropS.i[j][k])*perc;
this.pv.o[j][k] = keyPropS.o[j][k]+(keyPropE.o[j][k]-keyPropS.o[j][k])*perc;
this.pv.v[j][k] = keyPropS.v[j][k]+(keyPropE.v[j][k]-keyPropS.v[j][k])*perc;
}
}
}
}
this.lastFrame = frameNum;
}
function getKeys(arr){
var i = 0, len = arr.length;
if(!this.keyframes){
var i = 0, len = arr.length;
while(i<len){
if(arr[i] === 0){
return;
}
i+=1;
}
arr.push(0);
}else{
var j, jLen = this.keyframes.length,found;
for(j=0;j<jLen;j+=1){
i = 0;
found = false;
while(i<len){
if(arr[i] === this.keyframes[j].t){
found = true;
}
i+=1;
}
if(!found){
arr.push(this.keyframes[j].t);
}
}
}
}
function ValueProperty(elem,data, mult){
this.mult = mult;
this.v = mult ? data.k * mult : data.k;
this.pv = data.k;
this.mdf = false;
this.comp = elem.comp;
this.k = false;
this.getKeys = getKeys;
}
function MultiDimensionalProperty(elem,data, mult){
this.mult = mult;
this.mdf = false;
this.comp = elem.comp;
this.k = false;
this.v = new Array(data.k.length);
this.pv = new Array(data.k.length);
this.getKeys = getKeys;
var i, len = data.k.length;
for(i = 0;i<len;i+=1){
this.v[i] = mult ? data.k[i] * mult : data.k[i];
this.pv[i] = data.k[i];
}
}
function KeyframedValueProperty(elem, data, mult){
this.keyframes = data.k;
this.offsetTime = elem.data.st;
this.lastValue = -99999;
this.lastPValue = -99999;
this.frameId = -1;
this.k = true;
this.mult = mult;
this.elem = elem;
this.comp = elem.comp;
this.lastFrame = initFrame;
this.v = mult ? data.k[0].s[0]*mult : data.k[0].s[0];
this.pv = data.k[0].s[0];
this.getValue = getValue;
this.getKeys = getKeys;
}
function KeyframedMultidimensionalProperty(elem, data, mult){
this.keyframes = data.k;
this.offsetTime = elem.data.st;
this.k = true;
this.mult = mult;
this.elem = elem;
this.comp = elem.comp;
this.getValue = getValue;
this.frameId = -1;
this.v = new Array(data.k[0].s.length);
this.pv = new Array(data.k[0].s.length);
this.lastValue = new Array(data.k[0].s.length);
this.lastPValue = new Array(data.k[0].s.length);
this.lastFrame = initFrame;
this.getKeys = getKeys;
}
var TransformProperty = (function(){
function getKeys(arr){
this.a.getKeys(arr);
this.p.getKeys(arr);
this.s.getKeys(arr);
this.r.getKeys(arr);
}
function processKeys(){
if(this.elem.globalData.frameId === this.frameId){
return;
}
this.mdf = false;
this.frameId = this.elem.globalData.frameId;
var i, len = this.dynamicProperties.length;
for(i=0;i<len;i+=1){
this.dynamicProperties[i].getValue();
if(this.dynamicProperties[i].mdf){
this.mdf = true;
}
}
if(this.mdf){
if(this.data.p.s){
this.v.reset().translate(this.px.v,this.py.v).rotate(this.r.v).scale(this.s.v[0],this.s.v[1]).translate(-this.a.v[0],-this.a.v[1]);
}else{
this.v.reset().translate(this.p.v[0],this.p.v[1]).rotate(this.r.v).scale(this.s.v[0],this.s.v[1]).translate(-this.a.v[0],-this.a.v[1]);
}
}
}
return function(elem,data,arr){
this.elem = elem;
this.frameId = -1;
this.dynamicProperties = [];
this.mdf = false;
this.data = data;
this.getValue = processKeys;
this.getKeys = getKeys;
this.v = new Matrix();
this.a = getProp(elem,data.a,1,0,this.dynamicProperties);
if(data.p.s){
this.px = getProp(elem,data.p.x,0,0,this.dynamicProperties);
this.py = getProp(elem,data.p.y,0,0,this.dynamicProperties);
}else{
this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
}
this.s = getProp(elem,data.s,1,0.01,this.dynamicProperties);
this.r = getProp(elem,data.r,0,degToRads,this.dynamicProperties);
this.o = getProp(elem,data.o,0,0.01,arr);
if(this.dynamicProperties.length){
arr.push(this);
}else{
if(this.data.p.s){
this.v.translate(this.px.v,this.py.v).rotate(this.r.v).scale(this.s.v[0],this.s.v[1]).translate(-this.a.v[0],-this.a.v[1]);
}else{
this.v.translate(this.p.v[0],this.p.v[1]).rotate(this.r.v).scale(this.s.v[0],this.s.v[1]).translate(-this.a.v[0],-this.a.v[1]);
}
}
}
}());
function getProp(elem,data,type, mult, arr) {
var p;
if(type === 2){
p = new TransformProperty(elem, data, arr);
}else if(!data.k.length){
p = new ValueProperty(elem,data, mult);
}else if(typeof(data.k[0]) === 'number'){
p = new MultiDimensionalProperty(elem,data, mult);
}else{
switch(type){
case 0:
p = new KeyframedValueProperty(elem,data,mult);
break;
case 1:
p = new KeyframedMultidimensionalProperty(elem,data,mult);
break;
}
}
if(p.k || p.x){
arr.push(p);
}
return p;
}
function ShapeProperty(elem, data, type){
this.comp = elem.comp;
this.k = false;
this.mdf = false;
this.closed = type === 3 ? data.cl : data.closed;
this.numNodes = type === 3 ? data.pt.k.v.length : data.ks.k.v.length;
this.v = type === 3 ? data.pt.k : data.ks.k;
var shapeData = type === 3 ? data.pt : data.ks;
this.pv = this.v;
this.getKeys = getKeys;
}
function KeyframedShapeProperty(elem,data,type){
this.comp = elem.comp;
this.offsetTime = elem.data.st;
this.getValue = interpolateShape;
this.keyframes = type === 3 ? data.pt.k : data.ks.k;
this.getKeys = getKeys;
this.k = true;
this.closed = type === 3 ? data.cl : data.closed;
var i, len = this.keyframes[0].s[0].i.length;
var jLen = this.keyframes[0].s[0].i[0].length;
this.numNodes = len;
this.v = {
i: new Array(len),
o: new Array(len),
v: new Array(len)
};
this.pv = {
i: new Array(len),
o: new Array(len),
v: new Array(len)
};
for(i=0;i<len;i+=1){
this.v.i[i] = new Array(jLen);
this.v.o[i] = new Array(jLen);
this.v.v[i] = new Array(jLen);
this.pv.i[i] = new Array(jLen);
this.pv.o[i] = new Array(jLen);
this.pv.v[i] = new Array(jLen);
}
this.lastFrame = initFrame;
}
var EllShapeProperty = (function(){
var cPoint = 0.5519;
function convertEllToPath(){
var p0 = this.p.v[0], p1 = this.p.v[1], s0 = this.s.v[0]/2, s1 = this.s.v[1]/2;
if(this.d !== 2 && this.d !== 3){
this.v.v[0] = [p0,p1-s1];
this.v.i[0] = [p0 - s0*cPoint,p1 - s1];
this.v.o[0] = [p0 + s0*cPoint,p1 - s1];
this.v.v[1] = [p0 + s0,p1];
this.v.i[1] = [p0 + s0,p1 - s1*cPoint];
this.v.o[1] = [p0 + s0,p1 + s1*cPoint];
this.v.v[2] = [p0,p1+s1];
this.v.i[2] = [p0 + s0*cPoint,p1 + s1];
this.v.o[2] = [p0 - s0*cPoint,p1 + s1];
this.v.v[3] = [p0 - s0,p1];
this.v.i[3] = [p0 - s0,p1 + s1*cPoint];
this.v.o[3] = [p0 - s0,p1 - s1*cPoint];
}else{
this.v.v[0] = [p0,p1-s1];
this.v.o[0] = [p0 - s0*cPoint,p1 - s1];
this.v.i[0] = [p0 + s0*cPoint,p1 - s1];
this.v.v[1] = [p0 - s0,p1];
this.v.o[1] = [p0 - s0,p1 + s1*cPoint];
this.v.i[1] = [p0 - s0,p1 - s1*cPoint];
this.v.v[2] = [p0,p1+s1];
this.v.o[2] = [p0 + s0*cPoint,p1 + s1];
this.v.i[2] = [p0 - s0*cPoint,p1 + s1];
this.v.v[3] = [p0 + s0,p1];
this.v.o[3] = [p0 + s0,p1 - s1*cPoint];
this.v.i[3] = [p0 + s0,p1 + s1*cPoint];
}
}
function processKeys(frameNum){
var i, len = this.dynamicProperties.length;
if(this.elem.globalData.frameId === this.frameId){
return;
}
this.mdf = false;
this.frameId = this.elem.globalData.frameId;
for(i=0;i<len;i+=1){
this.dynamicProperties[i].getValue(frameNum);
if(this.dynamicProperties[i].mdf){
this.mdf = true;
}
}
if(this.mdf){
this.convertEllToPath();
}
}
function getKeys(arr){
this.p.getKeys(arr);
this.s.getKeys(arr);
}
return function(elem,data) {
this.v = {
v: new Array(4),
i: new Array(4),
o: new Array(4),
c: true
};
this.numNodes = 4;
this.d = data.d;
this.dynamicProperties = [];
data.closed = true;
this.closed = true;
this.elem = elem;
this.comp = elem.comp;
this.frameId = -1;
this.mdf = false;
this.getValue = processKeys;
this.convertEllToPath = convertEllToPath;
this.getKeys = getKeys;
this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
this.s = getProp(elem,data.s,1,0,this.dynamicProperties);
if(this.dynamicProperties.length){
this.k = true;
}else{
this.convertEllToPath();
}
}
}());
var RectShapeProperty = (function() {
function processKeys(frameNum){
if(this.elem.globalData.frameId === this.frameId){
return;
}
this.mdf = false;
this.frameId = this.elem.globalData.frameId;
var i, len = this.dynamicProperties.length;
for(i=0;i<len;i+=1){
this.dynamicProperties[i].getValue(frameNum);
if(this.dynamicProperties[i].mdf){
this.mdf = true;
}
}
if(this.mdf){
this.convertRectToPath();
}
}
function convertRectToPath(){
var p0 = this.p.v[0], p1 = this.p.v[1], v0 = this.s.v[0]/2, v1 = this.s.v[1]/2;
var round = bm_min(v0,v1,this.r.v);
var cPoint = round*(1-0.5519);
if(this.d === 2 || this.d === 1) {
this.v.v[0] = [p0+v0,p1-v1+round];
this.v.o[0] = this.v.v[0];
this.v.i[0] = [p0+v0,p1-v1+cPoint];
this.v.v[1] = [p0+v0,p1+v1-round];
this.v.o[1] = [p0+v0,p1+v1-cPoint];
this.v.i[1] = this.v.v[1];
this.v.v[2] = [p0+v0-round,p1+v1];
this.v.o[2] = this.v.v[2];
this.v.i[2] = [p0+v0-cPoint,p1+v1];
this.v.v[3] = [p0-v0+round,p1+v1];
this.v.o[3] = [p0-v0+cPoint,p1+v1];
this.v.i[3] = this.v.v[3];
this.v.v[4] = [p0-v0,p1+v1-round];
this.v.o[4] = this.v.v[4];
this.v.i[4] = [p0-v0,p1+v1-cPoint];
this.v.v[5] = [p0-v0,p1-v1+round];
this.v.o[5] = [p0-v0,p1-v1+cPoint];
this.v.i[5] = this.v.v[5];
this.v.v[6] = [p0-v0+round,p1-v1];
this.v.o[6] = this.v.v[6];
this.v.i[6] = [p0-v0+cPoint,p1-v1];
this.v.v[7] = [p0+v0-round,p1-v1];
this.v.o[7] = [p0+v0-cPoint,p1-v1];
this.v.i[7] = this.v.v[7];
}else{
this.v.v[0] = [p0+v0,p1-v1+round];
this.v.o[0] = [p0+v0,p1-v1+cPoint];
this.v.i[0] = this.v.v[0];
this.v.v[1] = [p0+v0-round,p1-v1];
this.v.o[1] = this.v.v[1];
this.v.i[1] = [p0+v0-cPoint,p1-v1];
this.v.v[2] = [p0-v0+round,p1-v1];
this.v.o[2] = [p0-v0+cPoint,p1-v1];
this.v.i[2] = this.v.v[2];
this.v.v[3] = [p0-v0,p1-v1+round];
this.v.o[3] = this.v.v[3];
this.v.i[3] = [p0-v0,p1-v1+cPoint];
this.v.v[4] = [p0-v0,p1+v1-round];
this.v.o[4] = [p0-v0,p1+v1-cPoint];
this.v.i[4] = this.v.v[4];
this.v.v[5] = [p0-v0+round,p1+v1];
this.v.o[5] = this.v.v[5];
this.v.i[5] = [p0-v0+cPoint,p1+v1];
this.v.v[6] = [p0+v0-round,p1+v1];
this.v.o[6] = [p0+v0-cPoint,p1+v1];
this.v.i[6] = this.v.v[6];
this.v.v[7] = [p0+v0,p1+v1-round];
this.v.o[7] = this.v.v[7];
this.v.i[7] = [p0+v0,p1+v1-cPoint];
}
}
function getKeys(arr){
this.p.getKeys(arr);
this.s.getKeys(arr);
this.r.getKeys(arr);
}
return function(elem,data) {
this.v = {
v: new Array(8),
i: new Array(8),
o: new Array(8),
c: true
};
this.numNodes = 8;
this.elem = elem;
this.comp = elem.comp;
this.frameId = -1;
this.d = data.d;
this.dynamicProperties = [];
this.mdf = false;
data.closed = true;
this.closed = true;
this.getValue = processKeys;
this.convertRectToPath = convertRectToPath;
this.getKeys = getKeys;
this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
this.s = getProp(elem,data.s,1,0,this.dynamicProperties);
this.r = getProp(elem,data.r,0,0,this.dynamicProperties);
if(this.dynamicProperties.length){
this.k = true;
}else{
this.convertRectToPath();
}
}
}());
var StarShapeProperty = (function() {
function convertPolygonToPath(){
var numPts = Math.floor(this.pt.v);
var angle = Math.PI*2/numPts;
this.v.v.length = numPts;
this.v.i.length = numPts;
this.v.o.length = numPts;
var rad = this.or.v;
var roundness = this.os.v;
var perimSegment = 2*Math.PI*rad/(numPts*4);
var i, currentAng = -Math.PI/ 2;
var dir = this.data.d === 3 ? -1 : 1;
currentAng += this.r.v;
for(i=0;i<numPts;i+=1){
var x = rad * Math.cos(currentAng);
var y = rad * Math.sin(currentAng);
var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
x += + this.p.v[0];
y += + this.p.v[1];
this.v.v[i] = [x,y];
this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
currentAng += angle*dir;
}
this.numNodes = numPts;
}
function convertStarToPath() {
var numPts = Math.floor(this.pt.v)*2;
var angle = Math.PI*2/numPts;
this.v.v.length = numPts;
this.v.i.length = numPts;
this.v.o.length = numPts;
var longFlag = true;
var longRad = this.or.v;
var shortRad = this.ir.v;
var longRound = this.os.v;
var shortRound = this.is.v;
var longPerimSegment = 2*Math.PI*longRad/(numPts*2);
var shortPerimSegment = 2*Math.PI*shortRad/(numPts*2);
var i, rad,roundness,perimSegment, currentAng = -Math.PI/ 2;
currentAng += this.r.v;
var dir = this.data.d === 3 ? -1 : 1;
for(i=0;i<numPts;i+=1){
rad = longFlag ? longRad : shortRad;
roundness = longFlag ? longRound : shortRound;
perimSegment = longFlag ? longPerimSegment : shortPerimSegment;
var x = rad * Math.cos(currentAng);
var y = rad * Math.sin(currentAng);
var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
x += + this.p.v[0];
y += + this.p.v[1];
this.v.v[i] = [x,y];
this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
longFlag = !longFlag;
currentAng += angle*dir;
}
this.numNodes = numPts;
}
function processKeys() {
if(this.elem.globalData.frameId === this.frameId){
return;
}
this.mdf = false;
this.frameId = this.elem.globalData.frameId;
var i, len = this.dynamicProperties.length;
for(i=0;i<len;i+=1){
this.dynamicProperties[i].getValue();
if(this.dynamicProperties[i].mdf){
this.mdf = true;
}
}
if(this.mdf){
this.convertToPath();
}
}
function getKeys(arr){
this.pt.getKeys(arr);
this.p.getKeys(arr);
this.r.getKeys(arr);
this.or.getKeys(arr);
this.os.getKeys(arr);
if(this.data.sy === 1){
this.ir.getKeys(arr);
this.is.getKeys(arr);
}
}
return function StarShapeProperty(elem,data) {
this.v = {
v: [],
i: [],
o: [],
c: true
};
this.elem = elem;
this.comp = elem.comp;
this.data = data;
this.frameId = -1;
this.d = data.d;
this.dynamicProperties = [];
this.mdf = false;
data.closed = true;
this.closed = true;
this.getValue = processKeys;
if(data.sy === 1){
this.ir = getProp(elem,data.ir,0,0,this.dynamicProperties);
this.is = getProp(elem,data.is,0,0.01,this.dynamicProperties);
this.convertToPath = convertStarToPath;
} else {
this.convertToPath = convertPolygonToPath;
}
this.getKeys = getKeys;
this.pt = getProp(elem,data.pt,0,0,this.dynamicProperties);
this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
this.r = getProp(elem,data.r,0,degToRads,this.dynamicProperties);
this.or = getProp(elem,data.or,0,0,this.dynamicProperties);
this.os = getProp(elem,data.os,0,0.01,this.dynamicProperties);
if(this.dynamicProperties.length){
this.k = true;
}else{
this.convertToPath();
}
}
}());
function getShapeProp(elem,data,type, arr, trims){
var prop;
if(type === 3 || type === 4){
var keys = type === 3 ? data.pt.k : data.ks.k;
if(keys.length){
prop = new KeyframedShapeProperty(elem, data, type);
}else{
prop = new ShapeProperty(elem, data, type);
}
}else if(type === 5){
prop = new RectShapeProperty(elem, data);
}else if(type === 6){
prop = new EllShapeProperty(elem, data);
}else if(type === 7){
prop = new StarShapeProperty(elem, data);
}
var hasTrims = false;
if(trims){
var i = 0, len = trims.length;
while(i<len){
if(!trims[i].closed){
hasTrims = true;
break;
}
i += 1;
}
}
if(hasTrims){
prop = new TrimTransformerProperty(prop,trims);
}
if(prop.k){
arr.push(prop);
}
return prop;
}
var ob = {};
ob.getProp = getProp;
ob.getShapeProp = getShapeProp;
return ob;
}());