performance
diff --git a/player/index.html b/player/index.html
index cb5f4c1..d9baebd 100644
--- a/player/index.html
+++ b/player/index.html
@@ -40,6 +40,6 @@
</head>
<body style="background-color:#666; margin: 10px;height: 100%; font-family: sans-serif;font-size: 10px">
<div id="loader"></div>
-<div style="width:800px;height:800px;background-color:#cccccc" class="bodymovin" data-animation-path="exports/ninja" data-bm-player="0" data-anim-type="canvas" data-anim-loop="true"></div>
+<div style="width:800px;height:800px;background-color:#cccccc" class="bodymovin" data-animation-path="exports/shapes" data-bm-player="0" data-anim-type="canvas" data-anim-loop="true"></div>
</body>
</html>
diff --git a/player/js/3rd_party/transformation-matrix.js b/player/js/3rd_party/transformation-matrix.js
index 9bd83e1..67fc5ea 100644
--- a/player/js/3rd_party/transformation-matrix.js
+++ b/player/js/3rd_party/transformation-matrix.js
@@ -36,6 +36,8 @@
me.context = context;
+ me.cos = me.sin = 0;
+
// reset canvas transformations (if any) to enable 100% sync.
if (context) context.setTransform(1, 0, 0, 1, 0, 0);
}
@@ -100,9 +102,12 @@
* @param {number} angle - angle in radians
*/
rotate: function(angle) {
- var cos = Math.cos(angle),
- sin = Math.sin(angle);
- return this._t(cos, sin, -sin, cos, 0, 0);
+ if(angle == 0){
+ return this;
+ }
+ this.cos = Math.cos(angle);
+ this.sin = Math.sin(angle);
+ return this._t(this.cos, this.sin, -this.sin, this.cos, 0, 0);
},
/**
@@ -138,6 +143,9 @@
* @param {number} sy - scale factor y (1 does nothing)
*/
scale: function(sx, sy) {
+ if(sx == 1 && sy == 1){
+ return this;
+ }
return this._t(sx, 0, 0, sy, 0, 0);
},
@@ -217,14 +225,13 @@
* @param {number} f - translate y
*/
setTransform: function(a, b, c, d, e, f) {
- var me = this;
- me.a = a;
- me.b = b;
- me.c = c;
- me.d = d;
- me.e = e;
- me.f = f;
- return me._x();
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.d = d;
+ this.e = e;
+ this.f = f;
+ return this._x();
},
/**
@@ -263,27 +270,26 @@
*/
transform: function(a2, b2, c2, d2, e2, f2) {
- var me = this,
- a1 = me.a,
- b1 = me.b,
- c1 = me.c,
- d1 = me.d,
- e1 = me.e,
- f1 = me.f;
+ var a1 = this.a,
+ b1 = this.b,
+ c1 = this.c,
+ d1 = this.d,
+ e1 = this.e,
+ f1 = this.f;
/* matrix order (canvas compatible):
* ace
* bdf
* 001
*/
- me.a = a1 * a2 + c1 * b2;
- me.b = b1 * a2 + d1 * b2;
- me.c = a1 * c2 + c1 * d2;
- me.d = b1 * c2 + d1 * d2;
- me.e = a1 * e2 + c1 * f2 + e1;
- me.f = b1 * e2 + d1 * f2 + f1;
+ this.a = a1 * a2 + c1 * b2;
+ this.b = b1 * a2 + d1 * b2;
+ this.c = a1 * c2 + c1 * d2;
+ this.d = b1 * c2 + d1 * d2;
+ this.e = a1 * e2 + c1 * f2 + e1;
+ this.f = b1 * e2 + d1 * f2 + f1;
- return me._x();
+ return this._x();
},
/**
@@ -672,8 +678,7 @@
* @returns {Array}
*/
toArray: function() {
- var me = this;
- return [me.a, me.b, me.c, me.d, me.e, me.f];
+ return [this.a, this.b, this.c, this.d, this.e, this.f];
},
/**
@@ -681,7 +686,7 @@
* @returns {string}
*/
toCSS: function() {
- return "matrix(" + this.toArray() + ")";
+ return "matrix(" + this.a + ',' + this.b + ',' + this.c + ',' + this.d + ',' + this.e + ',' + this.f + ")";
},
/**
@@ -717,9 +722,8 @@
* @private
*/
_x: function() {
- var me = this;
- if (me.context)
- me.context.setTransform(me.a, me.b, me.c, me.d, me.e, me.f);
- return me;
+ if (this.context)
+ this.context.setTransform(this.a, this.b, this.c, this.d, this.e, this.f);
+ return this;
}
};
\ No newline at end of file
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index f11c8b8..4bb6b11 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -103,7 +103,7 @@
AnimationItem.prototype.gotoFrame = function () {
if(subframeEnabled){
- this.renderedFrames = [];
+ //this.renderedFrames = [];
this.currentFrame = Math.round(this.currentRawFrame*100)/100;
}else{
this.currentFrame = Math.floor(this.currentRawFrame);
diff --git a/player/js/elements/canvasElements/CVBaseElement.js b/player/js/elements/canvasElements/CVBaseElement.js
index d04a16a..9571579 100644
--- a/player/js/elements/canvasElements/CVBaseElement.js
+++ b/player/js/elements/canvasElements/CVBaseElement.js
@@ -43,10 +43,6 @@
return false;
}
var ctx = this.renderer.canvasContext;
- /*console.log('this.data.layerName: ',this.data.layerName);
- console.log('this.data.width: ',this.data.width);
- console.log('this.data.height: ',this.data.height);*/
- //ctx.translate(-this.data.width/2,-this.data.height/2);
if(this.data.parentHierarchy){
var i, len = this.data.parentHierarchy.length, animData;
for(i = len - 1; i>=0 ; i -= 1){
@@ -58,7 +54,6 @@
}
}
- //ctx.translate(this.currentAnimData.tr.a[0],this.currentAnimData.tr.a[1]);
ctx.globalAlpha = this.currentAnimData.tr.o;
var matrixValue = this.currentAnimData.matrixArray;
ctx.transform(matrixValue[0], matrixValue[1], matrixValue[2], matrixValue[3], matrixValue[4], matrixValue[5]);
diff --git a/player/js/elements/canvasElements/CVShapeItemElement.js b/player/js/elements/canvasElements/CVShapeItemElement.js
index 7f6b162..7ac9bc6 100644
--- a/player/js/elements/canvasElements/CVShapeItemElement.js
+++ b/player/js/elements/canvasElements/CVShapeItemElement.js
@@ -3,6 +3,8 @@
this.renderer = renderer;
this.frameNum = -1;
this.renderedPaths = {};
+ this.trims = [];
+ this.trimPos = 0;
}
CVShapeItemElement.prototype.adjustTrim = function(){
@@ -18,8 +20,7 @@
CVShapeItemElement.prototype.renderShape = function(){
var num = this.frameNum;
var ctx = this.renderer.canvasContext;
- ctx.save();
- this.renderTransform(num);
+ var flag = this.renderTransform(num);
if(this.data.type=="pathShape"){
if(this.data.trim){
this.renderTrimPath(num);
@@ -48,8 +49,9 @@
this.renderer.canvasContext.fill();
this.renderer.canvasContext.stroke();
}
- delete this.renderedPaths[num];
- ctx.restore();
+ if(flag){
+ ctx.restore();
+ }
};
CVShapeItemElement.prototype.prepareFrame = function(num){
@@ -63,15 +65,25 @@
var tr = animData.tr[animData.tr[num].forwardFrame];
animData.renderedFrame.tr = tr.forwardFrame;
var matrixValue = tr.mtArr;
- //ctx.translate(tr.a[0],tr.a[1]);
+ if(matrixValue[0] == 1 && matrixValue[1] == 0 && matrixValue[2] == 0 && matrixValue[3] == 1 && matrixValue[4] == 0 && matrixValue[5] == 0){
+ return false;
+ }
+ ctx.save();
ctx.transform(matrixValue[0], matrixValue[1], matrixValue[2], matrixValue[3], matrixValue[4], matrixValue[5]);
ctx.translate(-tr.a[0],-tr.a[1]);
- //ctx.translate(-tr.a[0],-tr.a[1]);
- //ctx.translate(-tr.a[0],-tr.a[1]);
-
+ return true;
}
};
+CVShapeItemElement.prototype.addToTrim = function(pos,s,e){
+ if(!this.trims[pos]){
+ this.trims.push({});
+ }
+ this.trims[pos].s = s;
+ this.trims[pos].e = e;
+ this.trims[pos].ended = false;
+};
+
CVShapeItemElement.prototype.renderTrimPath = function(num){
var trimData = this.data.trim.an[this.data.trim.an[num].forwardFrame];
if(trimData.e == trimData.s){
@@ -88,36 +100,29 @@
var totalLength = 0;
var i, len = pathNodes.v.length;
for(i = 0; i < len - 1; i += 1){
- segments.push(dataManager.drawBezierCurve([pathNodes.v[i],pathNodes.v[i+1],pathNodes.o[i],pathNodes.i[i+1]]));
+ segments.push(bez.drawBezierCurve(pathNodes.v[i],pathNodes.v[i+1],pathNodes.o[i],pathNodes.i[i+1]));
totalLength += segments[i].segmentLength;
}
if(path.closed){
- segments.push(dataManager.drawBezierCurve([pathNodes.v[len - 1],pathNodes.v[0],pathNodes.o[len - 1],pathNodes.i[0]]));
+ segments.push(bez.drawBezierCurve(pathNodes.v[len - 1],pathNodes.v[0],pathNodes.o[len - 1],pathNodes.i[0]));
totalLength += segments[i].segmentLength;
}
len = segments.length;
var segmentLength = totalLength*(trimData.e - trimData.s)/100;
var offset = ((trimData.s/100 + (trimData.o%360)/360)%1)*totalLength;
- var trims = [];
+ var endedCount = 0;
if(offset + segmentLength - totalLength > 0.00001){
var secondarySegment = offset + segmentLength - totalLength;
- trims.push({
- s: offset,
- e: offset + segmentLength - secondarySegment
- });
- trims.push({
- s: 0,
- e: offset + segmentLength - totalLength
- })
+ this.addToTrim(0,offset,offset + segmentLength - secondarySegment);
+ this.addToTrim(1,0,offset + segmentLength - totalLength);
+ endedCount += 2;
}else{
- trims.push({
- s: offset,
- e: offset + segmentLength
- })
+ this.addToTrim(0,offset,offset + segmentLength);
+ endedCount += 1;
}
var addedLength = 0;
var j, jLen,perc,flag, ended = false;
- var k, kLen = trims.length;
+ var k, kLen = this.trims.length;
for(i = 0; i < len; i += 1){
if(ended){
@@ -126,7 +131,7 @@
jLen = segments[i].points.length;
flag = true;
for(k = 0; k < kLen; k+=1){
- if(addedLength + segments[i].segmentLength > trims[k].s){
+ if(addedLength + segments[i].segmentLength > this.trims[k].s){
flag = false;
}
}
@@ -138,26 +143,28 @@
if(ended){
break;
}
- kLen = trims.length;
+ kLen = this.trims.length;
addedLength += segments[i].points[j].partialLength;
for(k = 0; k < kLen; k+=1){
- if(trims[k].s >= addedLength && trims[k].s < addedLength + segments[i].points[j+1].partialLength){
- perc = ( trims[k].s - addedLength)/segments[i].points[j+1].partialLength;
+ if(this.trims[k].ended){
+ continue;
+ }
+ if(this.trims[k].s >= addedLength && this.trims[k].s < addedLength + segments[i].points[j+1].partialLength){
+ perc = ( this.trims[k].s - addedLength)/segments[i].points[j+1].partialLength;
path2d.moveTo(segments[i].points[j].point[0]+(segments[i].points[j+1].point[0] - segments[i].points[j].point[0])*perc
,segments[i].points[j].point[1]+(segments[i].points[j+1].point[1] - segments[i].points[j].point[1])*perc);
}
- if(trims[k].e > addedLength && trims[k].e <= addedLength + segments[i].points[j+1].partialLength){
- perc = ( trims[k].e - addedLength)/segments[i].points[j+1].partialLength;
+ if(this.trims[k].e > addedLength && this.trims[k].e <= addedLength + segments[i].points[j+1].partialLength){
+ perc = ( this.trims[k].e - addedLength)/segments[i].points[j+1].partialLength;
path2d.lineTo(segments[i].points[j].point[0]+(segments[i].points[j+1].point[0] - segments[i].points[j].point[0])*perc
,segments[i].points[j].point[1]+(segments[i].points[j+1].point[1] - segments[i].points[j].point[1])*perc);
- trims.splice(k,1);
- k -= 1;
- kLen -= 1;
- if(kLen == 0){
+ endedCount -= 1;
+ this.trims[k].ended = false;
+ if(endedCount == 0){
ended = true;
break;
}
- }else if(addedLength > trims[k].s && addedLength < trims[k].e){
+ }else if(addedLength > this.trims[k].s && addedLength < this.trims[k].e){
path2d.lineTo(segments[i].points[j].point[0],segments[i].points[j].point[1]);
}
}
@@ -184,14 +191,11 @@
}
var i,len = pathNodes.i.length;
ctx.beginPath();
- for(i=0;i<len;i+=1){
- if(i == 0){
- path2d.moveTo(pathNodes.v[i][0],pathNodes.v[i][1]);
- }else{
- path2d.bezierCurveTo(pathNodes.o[i-1][0]+pathNodes.v[i-1][0],pathNodes.o[i-1][1]+pathNodes.v[i-1][1]
- ,pathNodes.i[i][0]+pathNodes.v[i][0],pathNodes.i[i][1]+pathNodes.v[i][1]
- ,pathNodes.v[i][0],pathNodes.v[i][1]);
- }
+ path2d.moveTo(pathNodes.v[0][0],pathNodes.v[0][1]);
+ for(i=1;i<len;i+=1){
+ path2d.bezierCurveTo(pathNodes.o[i-1][0]+pathNodes.v[i-1][0],pathNodes.o[i-1][1]+pathNodes.v[i-1][1]
+ ,pathNodes.i[i][0]+pathNodes.v[i][0],pathNodes.i[i][1]+pathNodes.v[i][1]
+ ,pathNodes.v[i][0],pathNodes.v[i][1]);
}
if(path.closed){
path2d.bezierCurveTo(pathNodes.o[i-1][0]+pathNodes.v[i-1][0],pathNodes.o[i-1][1]+pathNodes.v[i-1][1]
@@ -244,16 +248,15 @@
var fill = animData.fill[animData.fill[num].forwardFrame];
animData.renderedFrame.fill = {color:fill.color,opacity:fill.opacity};
if(this.data.fillEnabled!==false){
- var rgbColor = hexToRgb(fill.color);
- this.renderer.canvasContext.fillStyle='rgba('+rgbColor.r+','+rgbColor.g+','+rgbColor.b+','+fill.opacity+')';
- }else{
- this.renderer.canvasContext.fillStyle='rgba(0,0,0,0)';
+ if(fill.opacity < 1){
+ this.renderer.canvasContext.fillStyle=fillToRgba(fill.color, fill.opacity);
+ }else{
+ this.renderer.canvasContext.fillStyle=fill.color;
+ }
+ return;
}
- }else{
- this.renderer.canvasContext.fillStyle='rgba(0,0,0,0)';
}
- //this.renderer.canvasContext.fillStyle='rgba(255,0,0,0)';
- //this.renderer.canvasContext.globalAlpha = .3;
+ this.renderer.canvasContext.fillStyle='rgba(0,0,0,0)';
};
CVShapeItemElement.prototype.renderStroke = function(num){
@@ -265,12 +268,13 @@
*/
this.renderer.canvasContext.lineWidth=stroke.width;
if(this.data.strokeEnabled!==false){
- var rgbColor = hexToRgb(stroke.color);
- this.renderer.canvasContext.strokeStyle='rgba('+rgbColor.r+','+rgbColor.g+','+rgbColor.b+','+stroke.opacity+')';
- }else{
- this.renderer.canvasContext.strokeStyle='rgba(0,0,0,0)';
+ if(stroke.opacity < 1){
+ this.renderer.canvasContext.strokeStyle=fillToRgba(stroke.color, stroke.opacity);
+ }else{
+ this.renderer.canvasContext.strokeStyle=stroke.color;
+ }
+ return;
}
- }else{
- this.renderer.canvasContext.strokeStyle = 'rgba(0,0,0,0)';
}
+ this.renderer.canvasContext.strokeStyle = 'rgba(0,0,0,0)';
};
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 30089cc..52adf1e 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -64,6 +64,7 @@
var curveSegments = 1000;
var absToCoord = [];
var absTiCoord = [];
+ //len = keyframes.length;
keyframes.forEach(function(keyData){
keyData.t -= offsetTime;
if(keyData.to){
@@ -130,7 +131,7 @@
}else if(i>=keyData.t && i<nextKeyData.t){
propertyArray = [];
if(keyData.to){
- perc = bez.getCurve([keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y])('',i-keyData.t,0,1,nextKeyData.t-keyData.t);
+ perc = bez.getEasingCurve([keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y])('',i-keyData.t,0,1,nextKeyData.t-keyData.t);
var bezierData = keyData.bezierData;
var distanceInLine = bezierData.segmentLength*perc;
var k, kLen, segmentPerc;
@@ -169,7 +170,7 @@
inX = keyData.i.x;
inY = keyData.i.y;
}
- perc = bez.getCurve([outX,outY,inX,inY])('',i-keyData.t,0,1,nextKeyData.t-keyData.t);
+ perc = bez.getEasingCurve([outX,outY,inX,inY])('',i-keyData.t,0,1,nextKeyData.t-keyData.t);
}
// for shapes
if(startItem.i){
@@ -235,106 +236,6 @@
return valuesArray;
}
- function drawBezierCurve(coOrdArray){
- var bezierName = coOrdArray.join('_').replace(/\./g, 'p');
- if(storedBezierCurves[bezierName]){
-
- return storedBezierCurves[bezierName];
- }
- var curveSegments = 1000, absToCoord, absTiCoord;
- var k;
- var triCoord1,triCoord2,triCoord3,liCoord1,liCoord2,ptCoord,perc,addedLength = 0;
- var ptDistance;
- var point,lastPoint = null;
- var bezierData = {
- points :[],
- segmentLength: 0
- };
- if(pointOnLine2D(coOrdArray[0][0],coOrdArray[0][1],coOrdArray[1][0],coOrdArray[1][1],coOrdArray[0][0]+coOrdArray[2][0],coOrdArray[0][1]+coOrdArray[2][1])
- && pointOnLine2D(coOrdArray[0][0],coOrdArray[0][1],coOrdArray[1][0],coOrdArray[1][1],coOrdArray[1][0]+coOrdArray[3][0],coOrdArray[1][1]+coOrdArray[3][1])){
- curveSegments = 2;
- }
- for(k=0;k<curveSegments;k+=1){
- point = [];
- perc = k/(curveSegments-1);
- ptDistance = 0;
- absToCoord = [];
- absTiCoord = [];
- coOrdArray[2].forEach(function(item,index){
- if(absToCoord[index] == null){
- absToCoord[index] = coOrdArray[0][index] + item;
- absTiCoord[index] = coOrdArray[1][index] + coOrdArray[3][index];
- }
- triCoord1 = coOrdArray[0][index] + (absToCoord[index] - coOrdArray[0][index])*perc;
- triCoord2 = absToCoord[index] + (absTiCoord[index] - absToCoord[index])*perc;
- triCoord3 = absTiCoord[index] + (coOrdArray[1][index] - absTiCoord[index])*perc;
- liCoord1 = triCoord1 + (triCoord2 - triCoord1)*perc;
- liCoord2 = triCoord2 + (triCoord3 - triCoord2)*perc;
- ptCoord = liCoord1 + (liCoord2 - liCoord1)*perc;
- point.push(ptCoord);
- if(lastPoint !== null){
- ptDistance += Math.pow(point[index] - lastPoint[index],2);
- }
- });
- ptDistance = Math.sqrt(ptDistance);
- addedLength += ptDistance;
- bezierData.points.push({partialLength: ptDistance, point: point});
- lastPoint = point;
- }
- bezierData.segmentLength = addedLength;
- storedBezierCurves[bezierName] = bezierData;
- return bezierData;
- }
-
- function pointOnLine2D(x1,y1, x2,y2, x3,y3){
- return Math.abs(((x2 - x1) * (y3 - y1)) - ((x3 - x1) * (y2 - y1))) < 0.0000001;
- }
-
- function buildBezierData(keyData){
- var curveSegments = 1000, absToCoord, absTiCoord;
- var k;
- var triCoord1,triCoord2,triCoord3,liCoord1,liCoord2,ptCoord,perc,addedLength = 0;
- var ptDistance;
- var point,lastPoint = null;
- var bezierData = {
- points :[],
- segmentLength: 0
- };
- if(pointOnLine2D(keyData.s[0],keyData.s[1],keyData.e[0],keyData.e[1],keyData.s[0]+keyData.to[0],keyData.s[1]+keyData.to[1])
- && pointOnLine2D(keyData.s[0],keyData.s[1],keyData.e[0],keyData.e[1],keyData.e[0]+keyData.ti[0],keyData.e[1]+keyData.ti[1])){
- curveSegments = 2;
- }
- for(k=0;k<curveSegments;k+=1){
- point = [];
- perc = k/(curveSegments-1);
- ptDistance = 0;
- absToCoord = [];
- absTiCoord = [];
- keyData.to.forEach(function(item,index){
- if(absToCoord[index] == null){
- absToCoord[index] = keyData.s[index] + item;
- absTiCoord[index] = keyData.e[index] + keyData.ti[index];
- }
- triCoord1 = keyData.s[index] + (absToCoord[index] - keyData.s[index])*perc;
- triCoord2 = absToCoord[index] + (absTiCoord[index] - absToCoord[index])*perc;
- triCoord3 = absTiCoord[index] + (keyData.e[index] - absTiCoord[index])*perc;
- liCoord1 = triCoord1 + (triCoord2 - triCoord1)*perc;
- liCoord2 = triCoord2 + (triCoord3 - triCoord2)*perc;
- ptCoord = liCoord1 + (liCoord2 - liCoord1)*perc;
- point.push(ptCoord);
- if(lastPoint !== null){
- ptDistance += Math.pow(point[index] - lastPoint[index],2);
- }
- });
- ptDistance = Math.sqrt(ptDistance);
- addedLength += ptDistance;
- bezierData.points.push({partialLength: addedLength, point: point});
- lastPoint = point;
- }
- keyData.bezierData = bezierData;
- bezierData.segmentLength = addedLength;
- }
-
var keyData, nextKeyData,propertyArray,bezierData;
function getInterpolatedValue(keyframes, frameNum, offsetTime){
@@ -355,10 +256,10 @@
}
if(keyData.to && !keyData.bezierData){
- buildBezierData(keyData);
+ bez.buildBezierData(keyData);
}
var k, kLen;
- var easingFnName, perc, j = 0;
+ var perc, j = 0;
propertyArray = [];
if(keyData.to){
bezierData = keyData.bezierData;
@@ -367,18 +268,20 @@
}else if(frameNum < keyData.t-offsetTime){
return bezierData.points[0].point;
}
- perc = bez.getCurve([keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y])('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime));
+ perc = bez.getEasingCurve([keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y])('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime));
var distanceInLine = bezierData.segmentLength*perc;
var segmentPerc;
+ var addedLength = 0;
while(j<bezierData.points.length){
+ addedLength +=bezierData.points[j].partialLength;
if(frameNum == 0 || distanceInLine == 0 || perc == 0){
propertyArray = bezierData.points[j].point;
break;
}else if(j == bezierData.points.length - 1){
propertyArray = bezierData.points[j].point;
- }else if(distanceInLine > bezierData.points[j].partialLength && distanceInLine < bezierData.points[j+1].partialLength){
+ }else if(distanceInLine > addedLength && distanceInLine < addedLength + bezierData.points[j+1].partialLength){
kLen = bezierData.points[j].point.length;
- segmentPerc = (distanceInLine-bezierData.points[j].partialLength)/(bezierData.points[j+1].partialLength-bezierData.points[j].partialLength);
+ segmentPerc = (distanceInLine-addedLength)/(bezierData.points[j+1].partialLength);
for(k=0;k<kLen;k+=1){
propertyArray.push(bezierData.points[j].point[k] + (bezierData.points[j+1].point[k] - bezierData.points[j].point[k])*segmentPerc);
}
@@ -403,7 +306,7 @@
inX = keyData.i.x;
inY = keyData.i.y;
}
- perc = bez.getCurve([outX,outY,inX,inY])('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime));
+ perc = bez.getEasingCurve([outX,outY,inX,inY])('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime));
if(frameNum >= nextKeyData.t-offsetTime){
perc = 1;
}else if(frameNum < keyData.t-offsetTime){
@@ -510,9 +413,6 @@
trOb.s = scale instanceof Array ? scale.length > 1 ? [scale[0]/100,scale[1]/100,scale[2]/100] : [scale[0]/100,scale[0]/100,scale[0]/100] : [scale/100,scale/100,scale/100];
trOb.r = rot instanceof Array ? rot.length > 1 ? [rot[0]*Math.PI/180,rot[1]*Math.PI/180,rot[2]*Math.PI/180] : [rot[0]*Math.PI/180,rot[0]*Math.PI/180,rot[0]*Math.PI/180] : [0,0,rot*Math.PI/180];
trOb.p = pos;
- if(subframeEnabled){
- item.an = [];
- }
item.an[offsettedFrameNum] = {
forwardFrame : offsettedFrameNum,
tr: dataOb,
@@ -523,7 +423,7 @@
maskProps = item.masksProperties;
len = maskProps.length;
for(i=0;i<len;i+=1){
- if(!maskProps[i].pathStrings || subframeEnabled){
+ if(!maskProps[i].pathStrings){
maskProps[i].pathStrings = [];
maskProps[i].pathVertices = [];
maskProps[i].opacity = [];
@@ -544,7 +444,7 @@
len = item.shapes.length;
for(i=0;i<len;i+=1){
shapeItem = item.shapes[i];
- if(!shapeItem._created || subframeEnabled){
+ if(!shapeItem._created){
shapeItem.an.tr = [];
shapeItem.an.renderedFrame = {};
if(shapeItem.ks){
@@ -561,7 +461,7 @@
shapeItem.an.stroke = [];
}
}
- if(shapeItem.trim && (!shapeItem._created || subframeEnabled)){
+ if(shapeItem.trim && (!shapeItem._created)){
shapeItem.trim.an = [];
}
if(shapeItem.fl){
@@ -654,7 +554,6 @@
var moduleOb = {};
moduleOb.completeData = completeData;
moduleOb.renderFrame = renderFrame;
- moduleOb.drawBezierCurve = drawBezierCurve;
return moduleOb;
}());
\ No newline at end of file
diff --git a/player/js/utils/MatrixManager.js b/player/js/utils/MatrixManager.js
index a870542..9a57e1c 100644
--- a/player/js/utils/MatrixManager.js
+++ b/player/js/utils/MatrixManager.js
@@ -1,5 +1,7 @@
var MatrixManager = function(){
+ var mat = new Matrix();
+
var returnMatrix3D = function(rX, rY, rZ, scaleX, scaleY, scaleZ, tX, tY, tZ) {
var rotationXMatrix, rotationYMatrix, rotationZMatrix, s, scaleMatrix, transformationMatrix, translationMatrix;
@@ -63,7 +65,7 @@
};*/
var returnMatrix2D = function(rX, scaleX, scaleY, tX, tY){
- return new Matrix().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toCSS();
+ return mat.reset().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toCSS();
};
/*var returnMatrix2DArray = function(rX, scaleX, scaleY, tX, tY){
@@ -86,7 +88,7 @@
};*/
var returnMatrix2DArray = function(rX, scaleX, scaleY, tX, tY){
- return new Matrix().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toArray();
+ return mat.reset().translate(tX,tY).rotate(rX).scale(scaleX,scaleY).toArray();
};
var get2DMatrix = function(animData){
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
new file mode 100644
index 0000000..7d8f8e3
--- /dev/null
+++ b/player/js/utils/bez.js
@@ -0,0 +1,101 @@
+var bez = (function(){
+
+ var easingFunctions = {};
+ var storedBezierCurves = {};
+
+ function pointOnLine2D(x1,y1, x2,y2, x3,y3){
+ return Math.abs(((x2 - x1) * (y3 - y1)) - ((x3 - x1) * (y2 - y1))) < 0.0000001;
+ }
+
+ function getEasingCurve(encodedFuncName, coOrdArray) {
+ coOrdArray = encodedFuncName;
+ encodedFuncName = 'bez_' + coOrdArray.join('_').replace(/\./g, 'p');
+ if(easingFunctions[encodedFuncName]){
+ return easingFunctions[encodedFuncName];
+ }
+ var polyBez = function(p1, p2) {
+ var A = [null, null], B = [null, null], C = [null, null],
+ bezCoOrd = function(t, ax) {
+ C[ax] = 3 * p1[ax], B[ax] = 3 * (p2[ax] - p1[ax]) - C[ax], A[ax] = 1 - C[ax] - B[ax];
+ return t * (C[ax] + t * (B[ax] + t * A[ax]));
+ };
+ return function(t) {
+ var x = t, i = 0, z;
+ while (++i < 14) {
+ z = bezCoOrd(x, 0) - t;
+ if (Math.abs(z) < 1e-3) break;
+ x -= z / (C[0] + x * (2 * B[0] + 3 * A[0] * x));
+ }
+ return bezCoOrd(x, 1);
+ }
+ };
+ easingFunctions[encodedFuncName] = function(x, t, b, c, d) {
+ return c * polyBez([coOrdArray[0], coOrdArray[1]], [coOrdArray[2], coOrdArray[3]])(t/d) + b;
+ };
+ return easingFunctions[encodedFuncName];
+ }
+
+ function drawBezierCurve(pt1,pt2,pt3,pt4){
+ var bezierName = (pt1.join('_')+'_'+pt2.join('_')+'_'+pt3.join('_')+'_'+pt4.join('_')).replace(/\./g, 'p');
+ if(storedBezierCurves[bezierName]){
+ return storedBezierCurves[bezierName];
+ }
+ var curveSegments = 500, absToCoord, absTiCoord;
+ var k;
+ var i, len;
+ var triCoord1,triCoord2,triCoord3,liCoord1,liCoord2,ptCoord,perc,addedLength = 0;
+ var ptDistance;
+ var point,lastPoint = null;
+ var bezierData = {
+ points :[],
+ segmentLength: 0
+ };
+ if(pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1])
+ && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){
+ curveSegments = 2;
+ }
+ for(k=0;k<curveSegments;k+=1){
+ point = [];
+ perc = k/(curveSegments-1);
+ ptDistance = 0;
+ absToCoord = [];
+ absTiCoord = [];
+ len = pt3.length;
+ for(i=0;i<len;i+=1){
+ if(absToCoord[i] == null){
+ absToCoord[i] = pt1[i] + pt3[i];
+ absTiCoord[i] = pt2[i] + pt4[i];
+ }
+ triCoord1 = pt1[i] + (absToCoord[i] - pt1[i])*perc;
+ triCoord2 = absToCoord[i] + (absTiCoord[i] - absToCoord[i])*perc;
+ triCoord3 = absTiCoord[i] + (pt2[i] - absTiCoord[i])*perc;
+ liCoord1 = triCoord1 + (triCoord2 - triCoord1)*perc;
+ liCoord2 = triCoord2 + (triCoord3 - triCoord2)*perc;
+ ptCoord = liCoord1 + (liCoord2 - liCoord1)*perc;
+ point.push(ptCoord);
+ if(lastPoint !== null){
+ ptDistance += Math.pow(point[i] - lastPoint[i],2);
+ }
+ }
+ ptDistance = Math.sqrt(ptDistance);
+ addedLength += ptDistance;
+ bezierData.points.push({partialLength: ptDistance, point: point});
+ lastPoint = point;
+ }
+ bezierData.segmentLength = addedLength;
+ storedBezierCurves[bezierName] = bezierData;
+ return bezierData;
+ }
+
+ function buildBezierData(keyData){
+ keyData.bezierData = drawBezierCurve(keyData.s,keyData.e,keyData.to,keyData.ti);
+ }
+
+ var ob = {
+ getEasingCurve : getEasingCurve,
+ drawBezierCurve : drawBezierCurve,
+ buildBezierData : buildBezierData
+ };
+
+ return ob;
+}());
\ No newline at end of file
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index bf7d32d..ad9bf7c 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -48,4 +48,9 @@
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
+}
+
+function fillToRgba(hex,alpha){
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ return result ? 'rgba('+parseInt(result[1], 16)+','+parseInt(result[2], 16)+','+parseInt(result[3], 16)+','+ alpha+')' : null;
}
\ No newline at end of file