blob: 701563d3abab5650d934e1cd889712b2d08e7ae3 [file] [log] [blame]
function SVGRenderer(animationItem){
this.animationItem = animationItem;
this.layers = null;
this.lastFrame = -1;
this.globalData = {
frameNum: -1
};
this.elements = [];
}
SVGRenderer.prototype.configAnimation = function(animData){
this.animationItem.container = document.createElementNS(svgNS,'svg');
this.animationItem.container.setAttribute('xmlns','http://www.w3.org/2000/svg');
this.animationItem.container.setAttribute('width',animData.animation.compWidth);
this.animationItem.container.setAttribute('height',animData.animation.compHeight);
this.animationItem.container.setAttribute('viewBox','0 0 '+animData.animation.compWidth+' '+animData.animation.compHeight);
this.animationItem.container.setAttribute('preserveAspectRatio','xMidYMid meet');
this.animationItem.container.style.width = '100%';
this.animationItem.container.style.height = '100%';
this.animationItem.container.style.transformOrigin = this.animationItem.container.style.mozTransformOrigin = this.animationItem.container.style.webkitTransformOrigin = this.animationItem.container.style['-webkit-transform'] = "0px 0px 0px";
this.animationItem.wrapper.appendChild(this.animationItem.container);
//Mask animation
var defs = document.createElementNS(svgNS, 'defs');
this.globalData.defs = defs;
this.animationItem.container.appendChild(defs);
var maskElement = document.createElementNS(svgNS, 'clipPath');
var rect = document.createElementNS(svgNS,'rect');
rect.setAttribute('width',animData.animation.compWidth);
rect.setAttribute('height',animData.animation.compHeight);
rect.setAttribute('x',0);
rect.setAttribute('y',0);
var maskId = 'animationMask_'+randomString(10);
maskElement.setAttribute('id', maskId);
maskElement.appendChild(rect);
var maskedElement = document.createElementNS(svgNS,'g');
maskedElement.setAttribute("clip-path", "url(#"+maskId+")");
this.animationItem.container.appendChild(maskedElement);
defs.appendChild(maskElement);
this.animationItem.container = maskedElement;
this.layers = animData.animation.layers;
console.log(this.layers);
};
SVGRenderer.prototype.buildItems = function(layers,parentContainer,elements){
var count = 0, i, len = layers.length;
if(!elements){
elements = this.elements;
}
if(!parentContainer){
parentContainer = this.animationItem.container;
}
for (i = len - 1; i >= 0; i--) {
if (layers[i].type == 'StillLayer') {
count++;
elements[i] = this.createImage(layers[i],parentContainer);
} else if (layers[i].type == 'PreCompLayer') {
elements[i] = this.createComp(layers[i],parentContainer);
var elems = [];
this.buildItems(layers[i].layers,elements[i].getDomElement(),elems);
elements[i].setElements(elems);
} else if (layers[i].type == 'SolidLayer') {
elements[i] = this.createSolid(layers[i],parentContainer);
} else if (layers[i].type == 'ShapeLayer') {
elements[i] = this.createShape(layers[i],parentContainer);
} else if (layers[i].type == 'TextLayer') {
elements[i] = this.createText(layers[i],parentContainer);
}else{
elements[i] = this.createBase(layers[i],parentContainer);
//console.log('NO TYPE: ',layers[i]);
}
if(layers[i].td){
elements[i+1].setMatte(elements[i].layerId);
}
//NullLayer
}
};
SVGRenderer.prototype.createBase = function (data,parentContainer) {
return new BaseElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.createShape = function (data,parentContainer) {
return new IShapeElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.createText = function (data,parentContainer) {
return new ITextElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.createImage = function (data,parentContainer) {
return new IImageElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.createComp = function (data,parentContainer) {
return new ICompElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.createSolid = function (data,parentContainer) {
return new ISolidElement(data, this.animationItem,parentContainer,this.globalData);
};
SVGRenderer.prototype.buildStage = function (container, layers,elements) {
var i, len = layers.length, layerData;
if(!elements){
elements = this.elements;
}
for (i = len - 1; i >= 0; i--) {
layerData = layers[i];
if (layerData.parent !== undefined) {
this.buildItemParenting(layerData,elements[i],layers,layerData.parent,elements);
}
if (layerData.type == 'PreCompLayer') {
this.buildStage(elements[i].getComposingElement(), layerData.layers, elements[i].getElements());
}
}
};
SVGRenderer.prototype.buildItemParenting = function (layerData,element,layers,parentName,elements) {
if(!layerData.parents){
layerData.parents = [];
}
var i=0, len = layers.length;
while(i<len){
if(layers[i].ind == parentName){
element.getHierarchy().push(elements[i]);
if(layers[i].parent !== undefined){
this.buildItemParenting(layerData,element,layers,layers[i].parent,elements);
}
}
i += 1;
}
};
SVGRenderer.prototype.updateContainerSize = function () {
};
SVGRenderer.prototype.renderFrame = function(num){
if(this.lastFrame == num){
return;
}
this.lastFrame = num;
this.globalData.frameNum = num;
var i, len = this.layers.length;
for (i = 0; i < len; i++) {
this.elements[i].prepareFrame(num - this.layers[i].startTime);
}
for (i = 0; i < len; i++) {
this.elements[i].renderFrame(num - this.layers[i].startTime);
}
};