partial
diff --git a/player/index.html b/player/index.html
index 07db12b..19bb60c 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:510px;height:676px;background-color:#cccccc" class="bodymovin" data-animation-path="exports/mcangel" data-bm-player="0" data-anim-type="svg" data-anim-loop="true"></div>
+<div style="width:510px;height:676px;background-color:#cccccc" class="bodymovin" data-animation-path="exports/mcangel" data-bm-player="0" data-anim-type="canvas" data-anim-loop="true"></div>
</body>
</html>
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 4bb6b11..1e0491d 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -20,6 +20,7 @@
this.isScrolling = false;
this.loop = true;
this.renderer = null;
+ this.animationID = randomString(10);
};
AnimationItem.prototype.setData = function (wrapper) {
@@ -60,12 +61,14 @@
this.effectsManager = new EffectsManager();
this.animationData = animData;
+ this.animationData._id = this.animationID;
+ this.animationData._animType = this.animType;
this.layers = this.animationData.animation.layers;
this.assets = this.animationData.assets;
this.totalFrames = this.animationData.animation.totalFrames;
this.frameRate = this.animationData.animation.frameRate;
this.frameMult = this.animationData.animation.frameRate / 1000;
- dataManager.completeData(this.layers, this.frameRate);
+ dataManager.completeData(this.animationData);
this.renderer.buildItems(this.animationData.animation.layers);
this.updaFrameModifier();
this.checkLoaded();
@@ -120,7 +123,7 @@
}
if(!this.renderedFrames[this.currentFrame]){
this.renderedFrames[this.currentFrame] = true;
- dataManager.renderFrame(this.layers,this.currentFrame,this.animType);
+ dataManager.renderFrame(this.animationID,this.currentFrame);
}
this.renderer.renderFrame(this.currentFrame);
};
diff --git a/player/js/elements/canvasElements/CVBaseElement.js b/player/js/elements/canvasElements/CVBaseElement.js
index b3bb1f6..47c0218 100644
--- a/player/js/elements/canvasElements/CVBaseElement.js
+++ b/player/js/elements/canvasElements/CVBaseElement.js
@@ -26,7 +26,7 @@
this.currentAnimData = null;
return false;
}
- this.currentAnimData = this.data.an[this.data.an[num].forwardFrame];
+ this.currentAnimData = this.data.renderedData[num].an;
if(this.data.hasMask){
this.maskManager.prepareFrame(num);
diff --git a/player/js/elements/canvasElements/CVShapeItemElement.js b/player/js/elements/canvasElements/CVShapeItemElement.js
index 685876e..374780e 100644
--- a/player/js/elements/canvasElements/CVShapeItemElement.js
+++ b/player/js/elements/canvasElements/CVShapeItemElement.js
@@ -22,6 +22,7 @@
return;
}
var num = this.frameNum;
+ this.currentData = this.data.renderedData[num];
var ctx = this.renderer.canvasContext;
var flag = this.renderTransform(num);
if(this.data.type=="pathShape"){
@@ -61,12 +62,11 @@
this.frameNum = num;
};
-CVShapeItemElement.prototype.renderTransform = function(num){
- var animData = this.data.an;
+CVShapeItemElement.prototype.renderTransform = function(){
+ var animData = this.currentData;
if(animData.tr){
var ctx = this.renderer.canvasContext;
- var tr = animData.tr[animData.tr[num].forwardFrame];
- animData.renderedFrame.tr = tr.forwardFrame;
+ var tr = animData.tr;
var matrixValue = tr.mtArr;
if(matrixValue[0] == 1 && matrixValue[1] == 0 && matrixValue[2] == 0 && matrixValue[3] == 1 && matrixValue[4] == 0 && matrixValue[5] == 0 && tr.o >= 1){
return false;
@@ -180,15 +180,14 @@
};
CVShapeItemElement.prototype.renderPath = function(num){
- var animData = this.data.an;
- var path = animData.path[animData.path[num].forwardFrame];
+ var animData = this.currentData;
+ var path = animData.path;
if(this.renderedPaths[num]){
return;
}
var path2d = new Path2D();
- animData.renderedFrame.path = path.pathString;
var ctx = this.renderer.canvasContext;
var pathNodes = path.pathNodes;
@@ -214,7 +213,6 @@
CVShapeItemElement.prototype.renderEllipse = function(num){
var animData = this.data.an;
var ell = animData.ell[animData.ell[num].forwardFrame];
- animData.renderedFrame.ell = ell.forwardFrame;
var ctx = this.renderer.canvasContext;
@@ -249,10 +247,9 @@
};
CVShapeItemElement.prototype.renderFill = function(num){
- var animData = this.data.an;
+ var animData = this.currentData;
if(animData.fill){
- var fill = animData.fill[animData.fill[num].forwardFrame];
- animData.renderedFrame.fill = {color:fill.color,opacity:fill.opacity};
+ var fill = animData.fill;
if(this.data.fillEnabled!==false){
if(fill.opacity < 1){
this.renderer.canvasContext.fillStyle=fillToRgba(fill.color, fill.opacity);
@@ -266,10 +263,9 @@
};
CVShapeItemElement.prototype.renderStroke = function(num){
- var animData = this.data.an;
+ var animData = this.currentData;
if(animData.stroke){
- var stroke = animData.stroke[animData.stroke[num].forwardFrame];
- animData.renderedFrame.stroke = stroke.forwardFrame;
+ var stroke = animData.stroke;
/*ctx.strokeStyle="red";
*/
this.renderer.canvasContext.lineWidth=stroke.width;
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index cbea694..2dfcb2e 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -36,7 +36,7 @@
CanvasRenderer.prototype.createComp = function (data) {
data.element = new CVCompElement(data, this);
- this.buildItems(data.layers, data.element.getType());
+ this.buildItems(data.layers);
};
CanvasRenderer.prototype.createSolid = function (data) {
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 45b9167..85d168b 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -1,7 +1,7 @@
-var dataManager = (function(){
+function dataFunctionManager(){
var frameRate = 0;
var matrixInstance = new MatrixManager();
- var storedBezierCurves = {};
+ var animations = {};
function completeTimeRemap(tm, layerFrames, offsetFrame){
var interpolatedProperty = getInterpolatedValues(tm,layerFrames, offsetFrame);
@@ -23,6 +23,7 @@
layerData.parent = convertLayerNameToID(layerData.parent);
}
layerData.renderedFrame = {};
+ layerData.renderedData = {};
animArray = [];
lastFrame = -1;
if(layerData.tm){
@@ -30,13 +31,20 @@
}
if(layerData.type=='PreCompLayer'){
completeLayers(layerData.layers);
+ }else if(layerData.type == 'ShapeLayer'){
+ var i, len = layerData.shapes.length;
+ for(i=0;i<len;i+=1){
+ shapeItem = layerData.shapes[i];
+ shapeItem.renderedData = {};
+ }
}
})
}
- function completeData(layers, fRate){
- frameRate = fRate;
- completeLayers(layers);
+ function completeData(animationData){
+ animations[animationData._id] = animationData;
+ frameRate = animationData.animation.frameRate;
+ completeLayers(animationData.animation.layers);
}
function convertLayerNameToID(string){
@@ -389,7 +397,7 @@
var fillOpacity,fillColor, shape, strokeColor, strokeOpacity, strokeWidth, elmPos, elmSize, elmRound;
var shapeTrOb = {};
- function iterateLayers(layers, frameNum,renderType){
+ function iterateLayers(layers, frameNum,renderType, rendered){
var offsettedFrameNum, i, len;
var j, jLen = layers.length, item;
@@ -397,9 +405,11 @@
item = layers[j];
offsettedFrameNum = frameNum - item.startTime;
if(frameNum < item.inPoint || frameNum > item.outPoint){
+ rendered.push('');
continue;
}
if(item.an[offsettedFrameNum]){
+ rendered.push('');
continue;
}
trOb = {};
@@ -413,7 +423,8 @@
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;
- item.an[offsettedFrameNum] = {
+ rendered[j] = {};
+ rendered[j].an = {
forwardFrame : offsettedFrameNum,
tr: dataOb,
matrixValue: matrixInstance.getMatrix2(trOb),
@@ -439,10 +450,13 @@
}
if(item.type == 'PreCompLayer'){
timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : item.tm[offsettedFrameNum] : offsettedFrameNum;
- iterateLayers(item.layers,timeRemapped,renderType);
+ rendered.renderedArray = [];
+ iterateLayers(item.layers,timeRemapped,renderType,rendered.renderedArray);
}else if(item.type == 'ShapeLayer'){
+ rendered[j].shapes = [];
len = item.shapes.length;
for(i=0;i<len;i+=1){
+ rendered[j].shapes.push({});
shapeItem = item.shapes[i];
if(!shapeItem._created){
shapeItem.an.tr = [];
@@ -467,7 +481,7 @@
if(shapeItem.fl){
fillColor = getInterpolatedValue(shapeItem.fl.c,offsettedFrameNum, item.startTime);
fillOpacity = getInterpolatedValue(shapeItem.fl.o,offsettedFrameNum, item.startTime);
- shapeItem.an.fill[offsettedFrameNum] = {
+ rendered[j].shapes[i].fill = {
color : rgbToHex(Math.round(fillColor[0]),Math.round(fillColor[1]),Math.round(fillColor[2])),
opacity : fillOpacity instanceof Array ? fillOpacity[0]/100 : fillOpacity/100,
forwardFrame : offsettedFrameNum
@@ -475,18 +489,18 @@
}
if(shapeItem.ks){
shape = getInterpolatedValue(shapeItem.ks,offsettedFrameNum, item.startTime);
- shapeItem.an.path[offsettedFrameNum] = {
+ rendered[j].shapes[i].path = {
pathNodes: shape,
closed: shapeItem.closed,
forwardFrame : offsettedFrameNum
};
if(renderType == 'svg'){
- shapeItem.an.path[offsettedFrameNum].pathString = createPathString(shape,shapeItem.closed);
+ rendered[j].shapes[i].path.pathString = createPathString(shape,shapeItem.closed);
}
}else if(shapeItem.el){
elmPos = getInterpolatedValue(shapeItem.el.p,offsettedFrameNum, item.startTime);
elmSize = getInterpolatedValue(shapeItem.el.s,offsettedFrameNum, item.startTime);
- shapeItem.an.ell[offsettedFrameNum] = {
+ rendered[j].shapes[i].ell = {
p : elmPos,
size : elmSize,
forwardFrame : offsettedFrameNum
@@ -495,7 +509,7 @@
elmPos = getInterpolatedValue(shapeItem.rc.p,offsettedFrameNum, item.startTime);
elmSize = getInterpolatedValue(shapeItem.rc.s,offsettedFrameNum, item.startTime);
elmRound = getInterpolatedValue(shapeItem.rc.r,offsettedFrameNum, item.startTime);
- shapeItem.an.rect[offsettedFrameNum] = {
+ rendered[j].shapes[i].rect = {
position : elmPos,
size : elmSize,
roundness : elmRound,
@@ -506,7 +520,7 @@
strokeColor = getInterpolatedValue(shapeItem.st.c,offsettedFrameNum, item.startTime);
strokeOpacity = getInterpolatedValue(shapeItem.st.o,offsettedFrameNum, item.startTime);
strokeWidth = getInterpolatedValue(shapeItem.st.w,offsettedFrameNum, item.startTime);
- shapeItem.an.stroke[offsettedFrameNum] = {
+ rendered[j].shapes[i].stroke = {
color : rgbToHex(Math.round(strokeColor[0]),Math.round(strokeColor[1]),Math.round(strokeColor[2])),
opacity : strokeOpacity instanceof Array ? strokeOpacity[0]/100 : strokeOpacity/100,
width : strokeWidth instanceof Array ? strokeWidth[0] : strokeWidth,
@@ -527,12 +541,13 @@
shapeTrOb.mtArr = matrixInstance.getMatrixArray(shapeTrOb);
shapeTrOb.forwardFrame = offsettedFrameNum;
shapeItem.an.tr[offsettedFrameNum] = shapeTrOb;
+ rendered[j].shapes[i].tr = shapeTrOb;
if(shapeItem.trim){
var trimS = getInterpolatedValue(shapeItem.trim.s,offsettedFrameNum, item.startTime);
var trimE = getInterpolatedValue(shapeItem.trim.e,offsettedFrameNum, item.startTime);
var trimO = getInterpolatedValue(shapeItem.trim.o,offsettedFrameNum, item.startTime);
- shapeItem.trim.an[offsettedFrameNum] = {
+ rendered[j].shapes[i].trim = {
s: trimS,
e: trimE,
o: trimO,
@@ -547,8 +562,33 @@
}
}
- function renderFrame(layers,num, renderType){
- iterateLayers(layers, num, renderType);
+ function renderFrame(animationId,num){
+ var renderedArray = [];
+ iterateLayers(animations[animationId].animation.layers, num, animations[animationId]._animType, renderedArray);
+ populateLayers(animations[animationId].animation.layers, num,renderedArray);
+ }
+
+ function populateLayers(layers, num, rendered){
+ var i, len = layers.length, j, jLen;
+ var offsettedFrameNum, timeRemapped;
+ var shapes;
+ for(i=0;i<len;i+=1){
+ if(rendered[i] == ''){
+ continue;
+ }
+ offsettedFrameNum = num - layers[i].startTime;
+ layers[i].renderedData[offsettedFrameNum] = rendered[i];
+ if(layers[i].type == 'PreCompLayer'){
+ timeRemapped = layers[i].tm ? layers[i].tm[offsettedFrameNum] < 0 ? 0 : layers[i].tm[offsettedFrameNum] : offsettedFrameNum;
+ populateLayers(layers[i].layers,timeRemapped,rendered.renderedArray);
+ }else if(layers[i].type == 'ShapeLayer'){
+ shapes = layers[i].shapes;
+ jLen = shapes.length;
+ for(j=0;j<jLen;j+=1){
+ shapes[j].renderedData[offsettedFrameNum] = rendered[i].shapes[j];
+ }
+ }
+ }
}
var moduleOb = {};
@@ -556,4 +596,49 @@
moduleOb.renderFrame = renderFrame;
return moduleOb;
-}());
\ No newline at end of file
+};
+if(Worker && 1 == 2){
+ function handleEvents(){
+ self.onmessage = function(e){
+ var data = e.data;
+ if(data.message == 'new'){
+ dataManager.completeData(data.animation);
+ }
+ self.postMessage("new anim created");
+ }
+ }
+// URL.createObjectURL
+ window.URL = window.URL || window.webkitURL;
+// Build a worker from an anonymous function body
+ var blobURL = URL.createObjectURL( new Blob([
+ handleEvents.toString(),
+ matrixManagerFunction.toString(),
+ 'var MatrixManager = matrixManagerFunction;',
+
+ dataFunctionManager.toString(),
+ Matrix.toString(),
+
+ 'var dataManager = dataFunctionManager();handleEvents();' ], { type: 'application/javascript' } ) ),
+
+ worker = new Worker( blobURL );
+// Won't be needing this anymore
+ URL.revokeObjectURL( blobURL );
+
+ worker.addEventListener('message',function(e){
+ console.log('mensaje', e.data);
+ })
+ var dataManager = function(){
+ function completeData(animationData){
+ worker.postMessage({message:'new',animation:animationData});
+ }
+ function renderFrame(num){
+
+ }
+ return {
+ completeData: completeData
+ }
+ }();
+
+}else{
+ var dataManager = dataFunctionManager();
+}
\ No newline at end of file
diff --git a/player/js/utils/MatrixManager.js b/player/js/utils/MatrixManager.js
index 9a57e1c..9e5ac33 100644
--- a/player/js/utils/MatrixManager.js
+++ b/player/js/utils/MatrixManager.js
@@ -1,4 +1,4 @@
-var MatrixManager = function(){
+function matrixManagerFunction(){
var mat = new Matrix();
@@ -135,4 +135,5 @@
getMatrixArray : getMatrixArray
}
-};
\ No newline at end of file
+};
+var MatrixManager = matrixManagerFunction;
\ No newline at end of file