partial
diff --git a/gulpfile.js b/gulpfile.js
index ae3a2af..62595db 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -158,6 +158,6 @@
'player/js/module.js'
])
.pipe(concat('concat.js', {newLine: '\r\n'}))
- .pipe(wrap('\'use strict\';\r\n(function(){\r\n<%= contents %>\r\n}());'))
+ .pipe(wrap('\r\n(function(){\r\n\'use strict\';\r\n<%= contents %>\r\n}());'))
.pipe(gulp.dest('build/player/'))
});
\ No newline at end of file
diff --git a/player/index.html b/player/index.html
index ec01d29..1f9d66e 100644
--- a/player/index.html
+++ b/player/index.html
@@ -36,6 +36,6 @@
<!-- endbuild -->
</head>
<body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:600px;height:300px;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/gear" data-bm-type="svg" data-bm-loop="false" data-bm-prerender="true"></div>
+<div style="width:690px;height:913px;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/gear" data-bm-type="svg" data-bm-loop="true" data-bm-prerender="true"></div>
</body>
</html>
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index aad5c07..d461e21 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -125,7 +125,7 @@
this.frameRate = this.animationData.animation.frameRate;
this.frameMult = this.animationData.animation.frameRate / 1000;
dataManager.completeData(this.animationData);
- this.renderer.buildItems(this.animationData.animation.layers);
+ this.renderer.buildItems(this.animationData.animation.layers,this.container);
this.updaFrameModifier();
this.checkLoaded();
};
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 5e13cfc..fd921be 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -1,9 +1,13 @@
-var BaseElement = function (data, animationItem){
+var BaseElement = function (data, animationItem,parentContainer){
this.animationItem = animationItem;
this.data = data;
- this.transformChanged = false;
this.forceRender = false;
- this.currentMatrix = new Matrix();
+ this.ownMatrix = new Matrix();
+ this.finalTransform = {
+ mat: new Matrix(),
+ op: 1
+ };
+ this.parentContainer = parentContainer;
this.init();
};
@@ -18,35 +22,37 @@
};
BaseElement.prototype.createElements = function(){
- this.layerElement = document.createElementNS(svgNS,'g');
- this.layerElement.setAttribute('id',this.data.layerName);
+ if(this.data.hasMask){
+ this.layerElement = document.createElementNS(svgNS,'g');
+ }else{
+ this.layerElement = this.parentContainer;
+ }
this.maskingGroup = this.layerElement;
this.maskedElement = this.layerElement;
};
BaseElement.prototype.prepareFrame = function(num){
this.currentAnimData = this.data.renderedData[num].an;
- if(this.data.renderedFrame.tr !== this.currentAnimData.matrixValue){
- this.transformChanged = true;
- this.data.renderedFrame.tr = this.currentAnimData.matrixValue;
- }else{
- this.transformChanged = false;
- }
+ this.data.renderedFrame.tr = this.currentAnimData.matrixValue;
+ var mat = this.currentAnimData.matrixArray;
+ this.ownMatrix.reset();
+ this.ownMatrix.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
+ this.ownMatrix.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]);
};
-BaseElement.prototype.renderFrame = function(num){
+BaseElement.prototype.renderFrame = function(num,parentTransform){
if(this.data.inPoint - this.data.startTime <= num && this.data.outPoint - this.data.startTime > num)
{
if(this.isVisible !== true){
this.isVisible = true;
this.forceRender = true;
- this.mainElement.setAttribute('opacity',1);
}
+ this.finalTransform.opacity = 1;
}else{
if(this.isVisible !== false){
this.isVisible = false;
- this.mainElement.setAttribute('opacity',0);
}
+ this.finalTransform.opacity = 0;
}
if(this.data.eff){
@@ -61,58 +67,37 @@
this.maskManager.renderFrame(num);
}
- if(this.data.renderedFrame.o !== this.currentAnimData.tr.o){
- this.data.renderedFrame.o = this.currentAnimData.tr.o;
- if(this.isVisible){
- this.layerElement.setAttribute('opacity',this.currentAnimData.tr.o);
- }
+ this.finalTransform.opacity *= this.currentAnimData.tr.o;
+
+ if(parentTransform){
+ this.finalTransform.mat.reset();
+ mat = parentTransform.mat.props;
+ this.finalTransform.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
+ this.finalTransform.opacity *= parentTransform.opacity;
}
- var transformValue = '';
-
-
if(this.data.parents){
- var changedFlag = false;
- var i = 0, len = this.data.parents.length, parentAnimData;
- if(!this.transformChanged){
- while(i<len){
- if(this.data.parents[i].elem.element.transformChanged){
- changedFlag = true;
- break;
- }
- i+=1;
- }
- }else{
- changedFlag = true;
+ var i, len = this.data.parents.length, parentAnimData,mat;
+ if(!parentTransform){
+ this.finalTransform.mat.reset();
}
- if(changedFlag){
- for(i=len-1;i>=0;i-=1){
- parentAnimData = this.data.parents[i].elem.element.currentAnimData;
- transformValue += parentAnimData.matrixValue + ' ';
- }
- transformValue += this.currentAnimData.matrixValue;
- if(this.isVisible){
- this.layerElement.setAttribute('transform',transformValue);
- }
- this.fullTransform = transformValue;
+ for(i=len-1;i>=0;i-=1){
+ mat = this.data.parents[i].elem.element.ownMatrix.props;
+ this.finalTransform.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
+ parentAnimData = this.data.parents[i].elem.element.currentAnimData;
}
- }else if(this.transformChanged){
- transformValue += this.currentAnimData.matrixValue;
+ mat = this.ownMatrix.props;
+ this.finalTransform.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
+ }else{
if(this.isVisible){
- var mat = this.currentAnimData.matrixArray;
- this.currentMatrix.reset();
- this.currentMatrix.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
- this.currentMatrix.translate(-this.currentAnimData.tr.a[0],-this.currentAnimData.tr.a[1]);
- //this.layerElement.setAttribute('transform',transformValue);
+ if(!parentTransform){
+ this.finalTransform.mat = this.ownMatrix;
+ }else{
+ mat = this.ownMatrix.props;
+ this.finalTransform.mat.transform(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5]);
+ }
}
- this.fullTransform = transformValue;
}
- if(this.forceRender){
- this.forceRender = false;
- this.layerElement.setAttribute('opacity',this.currentAnimData.tr.o);
- //this.layerElement.setAttribute('transform',this.fullTransform);
- }
-
return this.isVisible;
};
diff --git a/player/js/elements/CompElement.js b/player/js/elements/CompElement.js
index d375452..96551b8 100644
--- a/player/js/elements/CompElement.js
+++ b/player/js/elements/CompElement.js
@@ -1,21 +1,15 @@
-function ICompElement(data, animationItem){
- this.parent.constructor.call(this,data, animationItem);
+function ICompElement(data, animationItem,parentContainer){
+ this.parent.constructor.call(this,data, animationItem,parentContainer);
this.layers = data.layers;
}
createElement(BaseElement, ICompElement);
-ICompElement.prototype.createElements = function(){
-
- this.svgElem = document.createElementNS (svgNS, "g");
- this.parent.createElements.call(this);
-};
-
ICompElement.prototype.getComposingElement = function(){
return this.layerElement;
};
-ICompElement.prototype.renderFrame = function(num){
- var renderParent = this.parent.renderFrame.call(this,num);
+ICompElement.prototype.renderFrame = function(num,parentMatrix){
+ var renderParent = this.parent.renderFrame.call(this,num,parentMatrix);
if(renderParent===false){
return;
}
@@ -26,6 +20,6 @@
this.layers[i].element.prepareFrame(timeRemapped - this.layers[i].startTime);
}
for( i = 0; i < len; i+=1 ){
- this.layers[i].element.renderFrame(timeRemapped - this.layers[i].startTime);
+ this.layers[i].element.renderFrame(timeRemapped - this.layers[i].startTime,this.finalTransform);
}
};
\ No newline at end of file
diff --git a/player/js/elements/ImageElement.js b/player/js/elements/ImageElement.js
index 50afe0b..f51de21 100644
--- a/player/js/elements/ImageElement.js
+++ b/player/js/elements/ImageElement.js
@@ -1,8 +1,8 @@
-function IImageElement(data, animationItem){
+function IImageElement(data, animationItem,parentContainer){
this.animationItem = animationItem;
this.assets = this.animationItem.getAssets();
this.path = this.animationItem.getPath();
- this.parent.constructor.call(this,data, animationItem);
+ this.parent.constructor.call(this,data, animationItem,parentContainer);
}
createElement(BaseElement, IImageElement);
@@ -20,16 +20,13 @@
img.addEventListener('load', imageLoaded, false);
img.src = this.path+this.assets[this.data.assetId].path;
- this.svgElem = document.createElementNS(svgNS, "g");
-
this.parent.createElements.call(this);
this.image = document.createElementNS(svgNS,'image');
this.image.setAttribute('width',this.data.width+"px");
this.image.setAttribute('height',this.data.height+"px");
- this.svgElem.appendChild(this.image);
- this.layerElement.appendChild(this.svgElem);
- this.maskingGroup = this.svgElem;
+ this.layerElement.appendChild(this.image);
+ this.maskingGroup = this.image;
styleUnselectableDiv(this.image);
};
\ No newline at end of file
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index 914d090..342d783 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -1,6 +1,6 @@
-function IShapeElement(data, animationItem){
+function IShapeElement(data, animationItem,parentContainer){
this.shapes = [];
- this.parent.constructor.call(this,data, animationItem);
+ this.parent.constructor.call(this,data, animationItem,parentContainer);
}
createElement(BaseElement, IShapeElement);
@@ -19,21 +19,36 @@
}
};
-IShapeElement.prototype.renderFrame = function(num){
- var renderParent = this.parent.renderFrame.call(this,num);
+IShapeElement.prototype.renderFrame = function(num,parentMatrix){
+ var renderParent = this.parent.renderFrame.call(this,num,parentMatrix);
if(renderParent===false){
+ if(!this.hidden){
+ this.hideShapes();
+ }
return;
}
this.renderShapes(num);
};
-IShapeElement.prototype.renderShapes = function(num){
+IShapeElement.prototype.hideShapes = function(){
var i,len = this.data.shapes.length,shapeData;
var shapeItem;
for(i=len-1;i>=0;i--){
shapeData = this.data.shapes[i];
shapeItem = this.shapes[len - 1 - i];
- shapeItem.renderShape(num,this.currentMatrix);
+ shapeItem.hideShape();
+ }
+ this.hidden = true;
+};
+
+IShapeElement.prototype.renderShapes = function(num){
+ this.hidden = false;
+ var i,len = this.data.shapes.length,shapeData;
+ var shapeItem;
+ for(i=len-1;i>=0;i--){
+ shapeData = this.data.shapes[i];
+ shapeItem = this.shapes[len - 1 - i];
+ shapeItem.renderShape(num,this.finalTransform);
}
};
\ No newline at end of file
diff --git a/player/js/elements/ShapeItemElement.js b/player/js/elements/ShapeItemElement.js
index 058fa18..c896ccf 100644
--- a/player/js/elements/ShapeItemElement.js
+++ b/player/js/elements/ShapeItemElement.js
@@ -14,6 +14,12 @@
var ownArrays = [];
for(i=len;i>=0;i-=1){
if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
+ arr[i].renderedFrames = [];
+ arr[i].lastData = {
+ c: '',
+ o:'',
+ w: ''
+ };
this.stylesList.push({
elements: [],
type: arr[i].ty,
@@ -24,9 +30,18 @@
}else if(arr[i].ty == 'gr'){
this.searchShapes(arr[i].it);
}else if(arr[i].ty == 'tr'){
- arr[i].matrix = new Matrix();
+ arr[i].transform = {
+ mat: new Matrix(),
+ opacity: 1
+ };
}else if(arr[i].ty == 'sh'){
arr[i].elements = [];
+ arr[i].renderedFrames = [];
+ arr[i].lastData = {
+ d: '',
+ o:'',
+ tr:''
+ };
jLen = this.stylesList.length;
for(j=0;j<jLen;j+=1){
if(!this.stylesList[j].closed){
@@ -34,11 +49,27 @@
arr[i].elements.push(pathNode);
this.shape.appendChild(pathNode);
this.stylesList[j].elements.push(pathNode);
+ if(this.stylesList[j].type == 'st'){
+ pathNode.setAttribute('fill-opacity',0);
+ pathNode.setAttribute('stroke-linejoin','round');
+ pathNode.setAttribute('stroke-linecap','round');
+ }
}
}
}else if(arr[i].ty == 'rc'){
arr[i].elements = [];
+ arr[i].renderedFrames = [];
+ arr[i].lastData = {
+ roundness: '',
+ w: '',
+ h: '',
+ x: '',
+ y:'',
+ o:'',
+ tr:''
+ };
+ arr[i].renderedFrames = [];
jLen = this.stylesList.length;
for(j=0;j<jLen;j+=1){
if(!this.stylesList[j].closed){
@@ -46,11 +77,23 @@
arr[i].elements.push(pathNode);
this.shape.appendChild(pathNode);
this.stylesList[j].elements.push(pathNode);
+ if(this.stylesList[j].type == 'st'){
+ pathNode.setAttribute('fill-opacity',0);
+ }
}
}
}else if(arr[i].ty == 'el'){
arr[i].elements = [];
+ arr[i].renderedFrames = [];
+ arr[i].lastData = {
+ cx: '',
+ cy: '',
+ rx: '',
+ ry: '',
+ o:'',
+ tr:''
+ };
jLen = this.stylesList.length;
for(j=0;j<jLen;j+=1){
if(!this.stylesList[j].closed){
@@ -58,6 +101,9 @@
arr[i].elements.push(pathNode);
this.shape.appendChild(pathNode);
this.stylesList[j].elements.push(pathNode);
+ if(this.stylesList[j].type == 'st'){
+ pathNode.setAttribute('fill-opacity',0);
+ }
}
}
@@ -66,7 +112,6 @@
len = ownArrays.length;
for(i=0;i<len;i+=1){
ownArrays[i].closed = true;
- console.log('ownArrays[i]: ',ownArrays[i]);
}
};
@@ -74,156 +119,253 @@
return this.shape;
};
-ShapeItemElement.prototype.renderShape = function(num,matrix,items){
+ShapeItemElement.prototype.hideShape = function(){
+ var i, len = this.stylesList.length;
+ var j, jLen;
+ var elements;
+ for(i=0;i<len;i+=1){
+ elements = this.stylesList[i].elements;
+ jLen = elements.length;
+ for(j=0;j<jLen;j+=1){
+ elements[j].setAttribute('opacity','0');
+ }
+ }
+};
+
+ShapeItemElement.prototype.renderShape = function(num,parentTransform,items){
if(!items){
items = this.data;
}
this.posCount = 0;
this.frameNum = num;
var i, len;
- var j, jLen;
- var styleElem;
len = items.length - 1;
- var groupMatrix;
+ var groupTransform,groupMatrix;
for(i=len;i>=0;i-=1){
if(items[i].ty == 'tr'){
- var props = matrix.props;
+ var props = parentTransform.mat.props;
var mtArr = items[i].renderedData[num].mtArr;
- groupMatrix = items[i].matrix;
+ groupTransform = items[i].transform;
+ groupTransform.opacity = parentTransform.opacity;
+ groupTransform.opacity *= items[i].renderedData[num].o;
+ groupMatrix = groupTransform.mat;
groupMatrix.reset().transform(props[0],props[1],props[2],props[3],props[4],props[5]).transform(mtArr[0],mtArr[1],mtArr[2],mtArr[3],mtArr[4],mtArr[5]).translate(-items[i].renderedData[num].a[0],-items[i].renderedData[num].a[1]);
}else if(items[i].ty == 'sh'){
- this.renderPath(items[i],num,groupMatrix);
+ this.renderPath(items[i],num,groupTransform);
}else if(items[i].ty == 'el'){
- this.renderEllipse(items[i],num,groupMatrix);
+ this.renderEllipse(items[i],num,groupTransform);
}else if(items[i].ty == 'rc'){
- this.renderRect(items[i],num,groupMatrix);
+ this.renderRect(items[i],num,groupTransform);
}else if(items[i].ty == 'fl'){
- styleElem = items[i].style;
- jLen = styleElem.elements.length;
- for(j=0;j<jLen;j+=1){
- styleElem.elements[j].setAttribute('fill',items[i].renderedData[num].color);
- styleElem.elements[j].setAttribute('fill-opacity',items[i].renderedData[num].opacity);
- }
+ this.renderFill(items[i],num);
}else if(items[i].ty == 'st'){
- styleElem = items[i].style;
- jLen = styleElem.elements.length;
- for(j=0;j<jLen;j+=1){
- styleElem.elements[j].setAttribute('stroke-width',items[i].renderedData[num].width);
- styleElem.elements[j].setAttribute('stroke',items[i].renderedData[num].color);
- styleElem.elements[j].setAttribute('stroke-opacity',items[i].renderedData[num].opacity);
- styleElem.elements[j].setAttribute('fill-opacity',0);
- }
+ this.renderStroke(items[i],num);
}else if(items[i].ty == 'gr'){
- this.renderShape(num,this.currentMatrix,items[i].it);
+ this.renderShape(num,groupTransform,items[i].it);
}
}
};
-ShapeItemElement.prototype.renderPath = function(pathData,num,matrix){
- if(!pathData.renderedFrames){
- pathData.renderedFrames = [];
+ShapeItemElement.prototype.renderPath = function(pathData,num,transform){
+ if(!pathData.renderedFrames[num]){
+ pathData.renderedFrames[num] = {
+ d: pathData.renderedData[num].path.pathString,
+ tr: 'matrix('+transform.mat.props.join(',')+')',
+ o: transform.opacity
+ };
}
- var pathString = '';
- if(pathData.renderedFrames[num]){
- pathString = pathData.renderedFrames[num];
- }else{
- pathString = pathData.renderedData[num].path.pathString;
- pathData.renderedFrames[num] = pathString;
- }
+ var pathString = pathData.renderedFrames[num].d;
+ var transformString = pathData.renderedFrames[num].tr;
+ var opacity = pathData.renderedFrames[num].o;
var elements = pathData.elements;
var i, len = elements.length;
for(i=0;i<len;i+=1){
- //this.stylesList[i].d += pathData.path.pathString;
- elements[i].setAttribute('d',pathString);
- elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
+ if(pathData.lastData.d != pathString){
+ elements[i].setAttribute('d',pathString);
+ }
+ if(pathData.lastData.tr != transformString){
+ elements[i].setAttribute('transform',transformString);
+ }
+ if(pathData.lastData.o != opacity){
+ elements[i].setAttribute('opacity',opacity);
+ }
}
+ pathData.lastData.d = pathString;
+ pathData.lastData.tr = transformString;
+ pathData.lastData.o = opacity;
};
-ShapeItemElement.prototype.renderEllipse = function(ellipseData,num,matrix){
- // cx="40" cy="40" rx="30" ry="15"
-
+ShapeItemElement.prototype.renderEllipse = function(ellipseData,num,transform){
+ var ellipseAttrs = ellipseData.renderedData[num];
+ if(!ellipseData.renderedFrames[num]){
+ ellipseData.renderedFrames[num] = {
+ cx: ellipseAttrs.p[0],
+ cy: ellipseAttrs.p[1],
+ rx: ellipseAttrs.size[0]/2,
+ ry: ellipseAttrs.size[1]/2,
+ tr: 'matrix('+transform.mat.props.join(',')+')',
+ o: transform.opacity
+ };
+ }
+ var cx = ellipseData.renderedFrames[num].cx;
+ var cy = ellipseData.renderedFrames[num].cy;
+ var rx = ellipseData.renderedFrames[num].rx;
+ var ry = ellipseData.renderedFrames[num].ry;
+ var tr = ellipseData.renderedFrames[num].tr;
+ var o = ellipseData.renderedFrames[num].o;
var elements = ellipseData.elements;
- var ellipseAttrs = ellipseData.renderedData[num];
- console.log(ellipseAttrs);
var i, len = elements.length;
for(i=0;i<len;i+=1){
- elements[i].setAttribute('cx',ellipseAttrs.p[0]);
- elements[i].setAttribute('cy',ellipseAttrs.p[1]);
- elements[i].setAttribute('rx',ellipseAttrs.size[0]/2);
- elements[i].setAttribute('ry',ellipseAttrs.size[1]/2);
- //elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
+ if(ellipseData.lastData.cx != cx){
+ elements[i].setAttribute('cx',cx);
+ }
+ if(ellipseData.lastData.cy != cy){
+ elements[i].setAttribute('cy',cy);
+ }
+ if(ellipseData.lastData.rx != rx){
+ elements[i].setAttribute('rx',rx);
+ }
+ if(ellipseData.lastData.ry != ry){
+ elements[i].setAttribute('ry',ry);
+ }
+ if(ellipseData.lastData.tr != tr){
+ elements[i].setAttribute('transform',tr);
+ }
+ if(ellipseData.lastData.o != o){
+ elements[i].setAttribute('opacity',o);
+ }
}
+ ellipseData.lastData.cx = cx;
+ ellipseData.lastData.cy = cy;
+ ellipseData.lastData.rx = rx;
+ ellipseData.lastData.ry = ry;
+ ellipseData.lastData.tr = tr;
+ ellipseData.lastData.o = o;
};
-ShapeItemElement.prototype.renderRect = function(rectData,num,matrix){
+ShapeItemElement.prototype.renderRect = function(rectData,num,transform){
var elements = rectData.elements;
- var ellipseAttrs = rectData.renderedData[num];
- var animData = this.currentData;
+ var rectAttrs = rectData.renderedData[num];
+ var roundness;
+ if(!rectData.renderedFrames[num]){
+ roundness = rectAttrs.roundness;
+
+ if(roundness > rectAttrs.size[0]/2){
+ roundness = rectAttrs.size[0]/2;
+ }
+ if(roundness > rectAttrs.size[1]/2){
+ roundness = rectAttrs.size[1]/2;
+ }
+ rectData.renderedFrames[num] = {
+ round: roundness,
+ w: rectAttrs.size[0],
+ h: rectAttrs.size[1],
+ x: rectAttrs.position[0] - rectAttrs.size[0]/2,
+ y: rectAttrs.position[1] - rectAttrs.size[1]/2,
+ tr: 'matrix('+transform.mat.props.join(',')+')',
+ o: transform.opacity
+ };
+ }
+ roundness = rectData.renderedFrames[num].round;
+ var w = rectData.renderedFrames[num].w;
+ var h = rectData.renderedFrames[num].h;
+ var x = rectData.renderedFrames[num].x;
+ var y = rectData.renderedFrames[num].y;
+ var tr = rectData.renderedFrames[num].tr;
+ var o = rectData.renderedFrames[num].o;
var i, len = elements.length;
for(i=0;i<len;i+=1){
- elements[i].setAttribute('rx',ellipseAttrs.roundness);
- elements[i].setAttribute('ry',ellipseAttrs.roundness);
- elements[i].setAttribute('width',ellipseAttrs.size[0]);
- elements[i].setAttribute('height',ellipseAttrs.size[1]);
- elements[i].setAttribute('x',ellipseAttrs.position[0] - ellipseAttrs.size[0]/2);
- elements[i].setAttribute('y',ellipseAttrs.position[1] - ellipseAttrs.size[1]/2);
- //elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
+ if(rectData.lastData.roundness != roundness){
+ elements[i].setAttribute('rx',roundness);
+ elements[i].setAttribute('ry',roundness);
+ }
+ if(rectData.lastData.w != w){
+ elements[i].setAttribute('width',w);
+ }
+ if(rectData.lastData.h != h){
+ elements[i].setAttribute('height',h);
+ }
+ if(rectData.lastData.x != x){
+ elements[i].setAttribute('x',x);
+ }
+ if(rectData.lastData.y != y){
+ elements[i].setAttribute('y',y);
+ }
+ if(rectData.lastData.tr != tr){
+ elements[i].setAttribute('transform',tr);
+ }
+ if(rectData.lastData.o != o){
+ elements[i].setAttribute('opacity',o);
+ }
}
+ rectData.lastData.roundness = roundness;
+ rectData.lastData.w = w;
+ rectData.lastData.h = h;
+ rectData.lastData.x = x;
+ rectData.lastData.y = y;
+ rectData.lastData.o = o;
};
-ShapeItemElement.prototype.renderFill = function(num){
- var animData = this.currentData;
- if(animData.fill){
- var fill = animData.fill;
- if(this.renderedFrame.fill.color !== fill.color){
- this.shape.setAttribute('fill',fill.color);
- this.renderedFrame.fill.color = fill.color;
- }
- if(this.data.fillEnabled!==false){
- if(this.renderedFrame.fill.opacity !== fill.opacity){
- this.shape.setAttribute('fill-opacity',fill.opacity);
- this.renderedFrame.fill.opacity = fill.opacity;
- }
- }else{
- if(this.renderedFrame.fill.opacity !== 0){
- this.shape.setAttribute('fill-opacity',0);
- this.renderedFrame.fill.opacity = 0;
- }
- }
- }else{
- if(this.renderedFrame.fill.opacity !== 0){
- this.shape.setAttribute('fill-opacity',0);
- this.renderedFrame.fill.opacity = 0;
+ShapeItemElement.prototype.renderFill = function(styleData,num){
+ var fillData = styleData.renderedData[num];
+ var styleElem = styleData.style;
+ if(!styleData.renderedFrames[num]){
+ styleData.renderedFrames[num] = {
+ c: fillData.color,
+ o: fillData.opacity
}
}
+
+ var c = styleData.renderedFrames[num].c;
+ var o = styleData.renderedFrames[num].o;
+
+ var elements = styleElem.elements;
+ var i, len = elements.length;
+ for(i=0;i<len;i+=1){
+ if(styleData.lastData.c != c){
+ elements[i].setAttribute('fill',c);
+ }
+ if(styleData.lastData.o != o){
+ elements[i].setAttribute('fill-opacity',o);
+ }
+ }
+ styleData.lastData.c = c;
+ styleData.lastData.o = o;
};
-ShapeItemElement.prototype.renderStroke = function(num){
- var animData = this.currentData;
- if(animData.stroke){
- var stroke = animData.stroke;
- if(this.renderedFrame.stroke.color !== stroke.color){
- this.renderedFrame.stroke.color = stroke.color;
- this.shape.setAttribute('stroke',stroke.color);
- }
- if(this.renderedFrame.stroke.width !== stroke.width){
- this.renderedFrame.stroke.width = stroke.width;
- this.shape.setAttribute('stroke-width',stroke.width);
- }
- if(this.data.strokeEnabled!==false){
- if(this.renderedFrame.stroke.opacity !== stroke.opacity){
- this.renderedFrame.stroke.opacity = stroke.opacity;
- this.shape.setAttribute('stroke-opacity',stroke.opacity);
- }
- }else{
- if(this.renderedFrame.stroke.opacity !== 0){
- this.renderedFrame.stroke.opacity = 0;
- this.shape.setAttribute('stroke-opacity',0);
- }
+ShapeItemElement.prototype.renderStroke = function(styleData,num){
+ var fillData = styleData.renderedData[num];
+ var styleElem = styleData.style;
+ if(!styleData.renderedFrames[num]){
+ styleData.renderedFrames[num] = {
+ c: fillData.color,
+ o: fillData.opacity,
+ w: fillData.width
}
}
+
+ var c = styleData.renderedFrames[num].c;
+ var o = styleData.renderedFrames[num].o;
+ var w = styleData.renderedFrames[num].w;
+
+ var elements = styleElem.elements;
+ var i, len = elements.length;
+ for(i=0;i<len;i+=1){
+ if(styleData.lastData.c != c){
+ elements[i].setAttribute('stroke',c);
+ }
+ if(styleData.lastData.o != o){
+ elements[i].setAttribute('stroke-opacity',o);
+ }
+ if(styleData.lastData.o != o){
+ elements[i].setAttribute('stroke-width',w);
+ }
+ }
+ styleData.lastData.c = c;
+ styleData.lastData.o = o;
+ styleData.lastData.w = w;
};
ShapeItemElement.prototype.renderTransform = function(num){
diff --git a/player/js/elements/SolidElement.js b/player/js/elements/SolidElement.js
index f183d3a..7cf3e1a 100644
--- a/player/js/elements/SolidElement.js
+++ b/player/js/elements/SolidElement.js
@@ -1,12 +1,10 @@
-function ISolidElement(data, animationItem){
- this.parent.constructor.call(this,data, animationItem);
+function ISolidElement(data, animationItem,parentContainer){
+ this.parent.constructor.call(this,data, animationItem,parentContainer);
}
createElement(BaseElement, ISolidElement);
ISolidElement.prototype.createElements = function(){
- this.svgElem = document.createElementNS (svgNS, "g");
this.parent.createElements.call(this);
- this.layerElement.appendChild(this.svgElem);
var rect = document.createElementNS(svgNS,'rect');
rect.setAttribute('width',this.data.width);
@@ -14,10 +12,8 @@
/*rect.setAttribute('width',1);
rect.setAttribute('height',1);*/
rect.setAttribute('fill',this.data.color);
- this.svgElem.appendChild(rect);
- styleUnselectableDiv(this.svgElem);
- styleUnselectableDiv(rect);
+ this.layerElement.appendChild(rect);
- this.maskingGroup = this.svgElem;
+ this.maskingGroup = rect;
this.maskedElement = rect;
};
\ No newline at end of file
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index 0b25e39..5d1b0ec 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -1,5 +1,5 @@
-function ITextElement(data, animationItem){
- this.parent.constructor.call(this,data, animationItem);
+function ITextElement(data, animationItem,parentContainer){
+ this.parent.constructor.call(this,data, animationItem,parentContainer);
}
createElement(BaseElement, ITextElement);
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index a2a8f90..5b2d02b 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -4,45 +4,45 @@
this.lastFrame = -1;
}
-SVGRenderer.prototype.buildItems = function(layers){
+SVGRenderer.prototype.buildItems = function(layers,parentContainer){
var count = 0, i, len = layers.length;
- for (i = 0; i < len; i++) {
+ for (i = len - 1; i >= 0; i--) {
if (layers[i].type == 'StillLayer') {
count++;
- this.createImage(layers[i]);
+ this.createImage(layers[i],parentContainer);
} else if (layers[i].type == 'PreCompLayer') {
- this.createComp(layers[i]);
+ this.createComp(layers[i],parentContainer);
} else if (layers[i].type == 'SolidLayer') {
- this.createSolid(layers[i]);
+ this.createSolid(layers[i],parentContainer);
} else if (layers[i].type == 'ShapeLayer') {
- this.createShape(layers[i]);
+ this.createShape(layers[i],parentContainer);
} else if (layers[i].type == 'TextLayer') {
- this.createText(layers[i]);
+ this.createText(layers[i],parentContainer);
}else{
console.log('NO TYPE: ',layers[i]);
}
}
};
-SVGRenderer.prototype.createShape = function (data) {
- data.element = new IShapeElement(data, this.animationItem);
+SVGRenderer.prototype.createShape = function (data,parentContainer) {
+ data.element = new IShapeElement(data, this.animationItem,parentContainer);
};
-SVGRenderer.prototype.createText = function (data) {
- data.element = new ITextElement(data, this.animationItem);
+SVGRenderer.prototype.createText = function (data,parentContainer) {
+ data.element = new ITextElement(data, this.animationItem,parentContainer);
};
-SVGRenderer.prototype.createImage = function (data) {
- data.element = new IImageElement(data, this.animationItem);
+SVGRenderer.prototype.createImage = function (data,parentContainer) {
+ data.element = new IImageElement(data, this.animationItem,parentContainer);
};
-SVGRenderer.prototype.createComp = function (data) {
- data.element = new ICompElement(data, this.animationItem);
- this.buildItems(data.layers, data.element.getType());
+SVGRenderer.prototype.createComp = function (data,parentContainer) {
+ data.element = new ICompElement(data, this.animationItem,parentContainer);
+ this.buildItems(data.layers,data.element.getDomElement());
};
-SVGRenderer.prototype.createSolid = function (data) {
- data.element = new ISolidElement(data, this.animationItem);
+SVGRenderer.prototype.createSolid = function (data,parentContainer) {
+ data.element = new ISolidElement(data, this.animationItem,parentContainer);
};
SVGRenderer.prototype.configAnimation = function(animData){
@@ -76,19 +76,24 @@
};
SVGRenderer.prototype.buildStage = function (container, layers) {
- var i, len = layers.length, layerData;
+ var i, len = layers.length, layerData,mainContainer;
for (i = len - 1; i >= 0; i--) {
layerData = layers[i];
if (layerData.parent) {
this.buildItemParenting(layerData,layers,layerData.parent);
- var mainContainer = layerData.element.getDomElement();
- mainContainer.setAttribute("data-layer-name", layerData.layerName);
- container.appendChild(mainContainer);
+ mainContainer = layerData.element.getDomElement();
+ if(container != mainContainer){
+ mainContainer.setAttribute("data-layer-name", layerData.layerName);
+ container.appendChild(mainContainer);
+ }
layerData.element.setMainElement(mainContainer);
} else {
- layerData.element.getDomElement().setAttribute("data-layer-name", layerData.layerName);
- container.appendChild(layerData.element.getDomElement());
- layerData.element.setMainElement(layerData.element.getDomElement());
+ mainContainer = layerData.element.getDomElement();
+ if(container != mainContainer){
+ mainContainer.setAttribute("data-layer-name", layerData.layerName);
+ container.appendChild(mainContainer);
+ }
+ layerData.element.setMainElement(mainContainer);
}
if (layerData.type == 'PreCompLayer') {
this.buildStage(layerData.element.getComposingElement(), layerData.layers, layerData.element.getType());
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 9132ee2..87d08e5 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -121,9 +121,9 @@
if(arr[i].ks.i){
convertPathsToAbsoluteValues(arr[i].ks);
}else{
- jLen = shapeItem[i].ks.length;
+ jLen = arr[i].ks.length;
for(j=0;j<jLen;j+=1){
- if(shapeItem[i].ks[j].s){
+ if(arr[i].ks[j].s){
convertPathsToAbsoluteValues(arr[i].ks[j].s[0]);
convertPathsToAbsoluteValues(arr[i].ks[j].e[0]);
}
@@ -340,7 +340,7 @@
return [keyframes];
}
return keyframes;
- }else if(keyframes[0].t === null){
+ }else if(keyframes[0].t === undefined){
if(interpolatedParams.type == 'p'){
matrixParams.px = keyframes[0];
matrixParams.py = keyframes[1];
@@ -383,10 +383,10 @@
}
var k, kLen;
var perc,jLen, j = 0;
+ var fnc;
if(interpolatedParams.type == 'default'){
propertyArray = [];
}
- var fnc;
if(keyData.to){
bezierData = keyData.bezierData;
if(frameNum >= nextKeyData.t-offsetTime){
@@ -720,8 +720,8 @@
}
}
if(renderType == 'svg'){
- //pathData.pathString = createPathString(propertyArray[0],pathData.closed);
- pathData.pathNodes = propertyArray[0];
+ pathData.pathString = createPathString(propertyArray[0],pathData.closed);
+ //pathData.pathNodes = propertyArray[0];
}else{
pathData.pathNodes = propertyArray[0];
}