added blur effect to pixi renderer
diff --git a/player/index.html b/player/index.html
index 0a741a6..3b6808f 100644
--- a/player/index.html
+++ b/player/index.html
@@ -166,6 +166,8 @@
<script src="js/elements/pixiElements/PIXIShapeElement.js" data-light-skip="true"></script>
<script src="js/elements/pixiElements/PIXICompElement.js" data-light-skip="true"></script>
<script src="js/elements/pixiElements/PIXIMask.js" data-light-skip="true"></script>
+ <script src="js/elements/pixiElements/PIXIEffects.js"></script>
+ <script src="js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js"></script>
<script src="js/animation/AnimationManager.js"></script>
<script src="js/animation/AnimationItem.js"></script>
<!-- Expressions -->
@@ -195,6 +197,13 @@
<body>
<div id="lottie"></div>
+<script id="shader" type="shader">
+
+void main(){
+ gl_FragColor = vec4(1.0,1.0,1.0,1.0);
+}
+</script>
+
<script>
var anim;
var elem = document.getElementById('lottie');
@@ -202,7 +211,7 @@
var animData = {
container: elem,
renderer: 'pixi',
- loop: false,
+ loop: true,
autoplay: true,
rendererSettings: {
progressiveLoad:false,
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 74ae6af..f09eb50 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -544,6 +544,7 @@
AnimationItem.prototype.getAssetsPath = function (assetData) {
var path = '';
+ console.log('getAssetsPath')
if(this.assetsPath){
var imagePath = assetData.p;
if(imagePath.indexOf('images/') !== -1){
diff --git a/player/js/elements/pixiElements/PIXIBaseElement.js b/player/js/elements/pixiElements/PIXIBaseElement.js
index 1c54fa6..e2bd947 100644
--- a/player/js/elements/pixiElements/PIXIBaseElement.js
+++ b/player/js/elements/pixiElements/PIXIBaseElement.js
@@ -14,7 +14,6 @@
this.layerElement = new PIXI.DisplayObjectContainer();
},
createContainerElements: function(){
- this.matteElement = createNS('g');
this.transformedElement = this.layerElement;
this.maskedElement = this.layerElement;
this._sizeChanged = false;
@@ -23,93 +22,17 @@
var filId, fil, gg;
if (this.data.td) {
if (this.data.td == 3 || this.data.td == 1) {
- var masker = createNS('mask');
- masker.setAttribute('id', this.layerId);
- masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha');
- masker.appendChild(this.layerElement);
- layerElementParent = masker;
- this.globalData.defs.appendChild(masker);
- // This is only for IE and Edge when mask if of type alpha
- if (!featureSupport.maskType && this.data.td == 1) {
- masker.setAttribute('mask-type', 'luminance');
- filId = randomString(10);
- fil = filtersFactory.createFilter(filId);
- this.globalData.defs.appendChild(fil);
- fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
- gg = createNS('g');
- gg.appendChild(this.layerElement);
- layerElementParent = gg;
- masker.appendChild(gg);
- gg.setAttribute('filter','url(' + locationHref + '#' + filId + ')');
- }
} else if(this.data.td == 2) {
- var maskGroup = createNS('mask');
- maskGroup.setAttribute('id', this.layerId);
- maskGroup.setAttribute('mask-type','alpha');
- var maskGrouper = createNS('g');
- maskGroup.appendChild(maskGrouper);
- filId = randomString(10);
- fil = filtersFactory.createFilter(filId);
- ////
-
- var feColorMatrix = createNS('feColorMatrix');
- feColorMatrix.setAttribute('type', 'matrix');
- feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB');
- feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1');
- fil.appendChild(feColorMatrix);
-
- this.globalData.defs.appendChild(fil);
- var alphaRect = createNS('rect');
- alphaRect.setAttribute('width', this.comp.data.w);
- alphaRect.setAttribute('height', this.comp.data.h);
- alphaRect.setAttribute('x','0');
- alphaRect.setAttribute('y','0');
- alphaRect.setAttribute('fill','#ffffff');
- alphaRect.setAttribute('opacity','0');
- maskGrouper.setAttribute('filter', 'url(' + locationHref + '#'+filId+')');
- maskGrouper.appendChild(alphaRect);
- maskGrouper.appendChild(this.layerElement);
- layerElementParent = maskGrouper;
- if (!featureSupport.maskType) {
- maskGroup.setAttribute('mask-type', 'luminance');
- fil.appendChild(filtersFactory.createAlphaToLuminanceFilter());
- gg = createNS('g');
- maskGrouper.appendChild(alphaRect);
- gg.appendChild(this.layerElement);
- layerElementParent = gg;
- maskGrouper.appendChild(gg);
- }
- this.globalData.defs.appendChild(maskGroup);
}
} else if (this.data.tt) {
- this.matteElement.appendChild(this.layerElement);
- layerElementParent = this.matteElement;
- this.baseElement = this.matteElement;
} else {
this.baseElement = this.layerElement;
- this.PBaseElement = this.PLayerElement;
- }
- if (this.data.ln) {
- this.layerElement.setAttribute('id', this.data.ln);
- }
- if (this.data.cl) {
- this.layerElement.setAttribute('class', this.data.cl);
}
//Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped
if (this.data.ty === 0 && !this.data.hd) {
- var cp = createNS( 'clipPath');
- var pt = createNS('path');
- pt.setAttribute('d','M0,0 L' + this.data.w + ',0' + ' L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z');
- var clipId = 'cp_'+randomString(8);
- cp.setAttribute('id',clipId);
- cp.appendChild(pt);
- this.globalData.defs.appendChild(cp);
+ //Todo Clip compositions
if (this.checkMasks()) {
- var cpGroup = createNS('g');
- cpGroup.setAttribute('clip-path','url(' + locationHref + '#'+clipId + ')');
- cpGroup.appendChild(this.layerElement);
- this.transformedElement = cpGroup;
if (layerElementParent) {
layerElementParent.appendChild(this.transformedElement);
} else {
@@ -121,9 +44,9 @@
}
if (this.data.bm !== 0) {
- this.setBlendMode();
+ //this.setBlendMode();
}
- this.renderableEffectsManager = new SVGEffects(this);
+ this.renderableEffectsManager = new PIXIEffects(this);
},
renderInnerContent: function() {},
renderFrame: function() {
@@ -169,7 +92,7 @@
};
PIXIBaseElement.prototype.getBaseElement = function(){
- return this.PBaseElement;
+ return this.baseElement;
};
PIXIBaseElement.prototype.addMasks = function(){
this.maskManager = new PIXIMaskElement(this.data, this, this.globalData);
@@ -182,27 +105,17 @@
this.matteElement.setAttribute("mask", "url(#" + id + ")");
};
-PIXIBaseElement.prototype.setMatte = function(id){
- if(!this.matteElement){
- return;
- }
- this.matteElement.setAttribute("mask", "url(#" + id + ")");
-};
-
PIXIBaseElement.prototype.show = function(){
if (this.isInRange && !this.isTransparent){
this.hidden = false;
this._isFirstFrame = true;
+ this.layerElement.visible = true;
}
};
PIXIBaseElement.prototype.hide = function(){
-
-};
-
-PIXIBaseElement.prototype.prepareFrame = function(num){
- this._mdf = false;
- this.prepareRenderableFrame(num);
- this.prepareProperties(num, this.isInRange);
- this.checkTransparency();
+ if (!this.hidden && (!this.isInRange || this.isTransparent)) {
+ this.layerElement.visible = false;
+ this.hidden = true;
+ }
};
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXICompElement.js b/player/js/elements/pixiElements/PIXICompElement.js
index 35e7e85..e0ee205 100644
--- a/player/js/elements/pixiElements/PIXICompElement.js
+++ b/player/js/elements/pixiElements/PIXICompElement.js
@@ -7,4 +7,13 @@
this.tm = data.tm ? PropertyFactory.getProp(this,data.tm,0,globalData.frameRate, this) : {_placeholder:true};
}
-extendPrototype([PIXIRenderer, ICompElement, PIXIBaseElement], PIXICompElement);
\ No newline at end of file
+extendPrototype([PIXIRenderer, ICompElement, PIXIBaseElement], PIXICompElement);
+
+PIXICompElement.prototype.renderInnerContent = function() {
+ var i,len = this.layers.length;
+ for( i = len - 1; i >= 0; i -= 1 ){
+ if(this.completeLayers || this.elements[i]){
+ this.elements[i].renderFrame();
+ }
+ }
+};
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIEffects.js b/player/js/elements/pixiElements/PIXIEffects.js
new file mode 100644
index 0000000..cb1e5ac
--- /dev/null
+++ b/player/js/elements/pixiElements/PIXIEffects.js
@@ -0,0 +1,31 @@
+function PIXIEffects(elem){
+ var i, len = elem.data.ef ? elem.data.ef.length : 0;
+ var count = 0;
+ this.filters = [];
+ var filterManager;
+ for(i = 0; i < len; i += 1) {
+ filterManager = null;
+ if (elem.data.ef[i].ty === 29) {
+ filterManager = new PIXIGaussianBlurEffect(elem.effectsManager.effectElements[i]);
+ }
+ if (filterManager) {
+ this.filters.push(filterManager);
+ }
+ }
+ if (this.filters.length) {
+ var i, len = this.filters.length;
+ var pixiFilters = [];
+ for(i = 0; i < len ; i += 1) {
+ pixiFilters.push(this.filters[i].pixiFilter);
+ }
+ elem.layerElement.filters = pixiFilters;
+ elem.addRenderableComponent(this);
+ }
+}
+
+PIXIEffects.prototype.renderFrame = function(_isFirstFrame){
+ var i, len = this.filters.length;
+ for(i=0;i<len;i+=1){
+ this.filters[i].renderFrame(_isFirstFrame);
+ }
+};
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIImageElement.js b/player/js/elements/pixiElements/PIXIImageElement.js
index 9fe6832..e4da173 100644
--- a/player/js/elements/pixiElements/PIXIImageElement.js
+++ b/player/js/elements/pixiElements/PIXIImageElement.js
@@ -1,60 +1,28 @@
-function PIXIImageElement(data,parentContainer,globalData,comp,placeholder){
+function PIXIImageElement(data,globalData,comp){
this.assetData = globalData.getAssetData(data.refId);
- this._parent.constructor.call(this,data,parentContainer,globalData,comp,placeholder);
+ this.initElement(data,globalData,comp);
}
extendPrototype([BaseElement, TransformElement, PIXIBaseElement, HierarchyElement, FrameElement, RenderableElement], PIXIImageElement);
-PIXIImageElement.prototype.createElements = function(){
-
+PIXIImageElement.prototype.createContent = function(){
var assetPath = this.globalData.getAssetsPath(this.assetData);
-
- this._parent.createElements.call(this);
-
- this.innerElem = document.createElementNS(svgNS,'image');
- this.innerElem.setAttribute('width',this.assetData.w+"px");
- this.innerElem.setAttribute('height',this.assetData.h+"px");
- this.innerElem.setAttribute('preserveAspectRatio','xMidYMid slice');
- this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink','href',assetPath);
- this.maskedElement = this.innerElem;
- this.layerElement.appendChild(this.innerElem);
- if(this.data.ln){
- this.innerElem.setAttribute('id',this.data.ln);
- }
- if(this.data.cl){
- this.innerElem.setAttribute('class',this.data.cl);
- }
-
var texture = PIXI.Texture.fromImage(assetPath);
- this.PInnerElem = new PIXI.Sprite(texture);
- this.PLayerElement.addChild(this.PInnerElem);
+ this.innerElem = new PIXI.Sprite(texture);
+ this.layerElement.addChild(this.innerElem);
};
-PIXIImageElement.prototype.hide = function(){
- if(!this.hidden){
- this.innerElem.style.display = 'none';
- this.PLayerElement.visible = false;
- this.hidden = true;
- }
-};
+PIXIImageElement.prototype.initElement = function(data,globalData,comp) {
+ this.initFrame();
+ this.initBaseData(data, globalData, comp);
+ this.initTransform(data, globalData, comp);
+ this.initHierarchy();
+ this.initRenderable();
+ this.initRendererElement();
+ this.createContainerElements();
+ this.addMasks();
+ this.createContent();
+ this.hide();
+}
-PIXIImageElement.prototype.renderFrame = function(parentMatrix){
- var renderParent = this._parent.renderFrame.call(this,parentMatrix);
- if(renderParent===false){
- this.hide();
- return;
- }
- if(this.hidden){
- this.hidden = false;
- this.innerElem.style.display = 'block';
- this.PLayerElement.visible = true;
- }
- if(this.firstFrame){
- this.firstFrame = false;
- }
-};
-
-PIXIImageElement.prototype.destroy = function(){
- this._parent.destroy.call();
- this.innerElem = null;
-};
\ No newline at end of file
+PIXIImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/PIXIMask.js b/player/js/elements/pixiElements/PIXIMask.js
index 1e69d83..695d99d 100644
--- a/player/js/elements/pixiElements/PIXIMask.js
+++ b/player/js/elements/pixiElements/PIXIMask.js
@@ -146,9 +146,8 @@
}
if(count > 0){
- this.element.maskedElement.setAttribute(maskRef, "url(#" + layerId + ")");
- this.element.PMaskedElement.mask = currentPMasks[0];
- this.element.PMaskedElement.addChild(currentPMasks[0]);
+ this.element.maskedElement.mask = currentPMasks[0];
+ this.element.maskedElement.addChild(currentPMasks[0]);
}
if (this.viewData.length) {
this.element.addRenderableComponent(this);
diff --git a/player/js/elements/pixiElements/PIXIShapeElement.js b/player/js/elements/pixiElements/PIXIShapeElement.js
index 3b8329e..9cf2369 100644
--- a/player/js/elements/pixiElements/PIXIShapeElement.js
+++ b/player/js/elements/pixiElements/PIXIShapeElement.js
@@ -44,7 +44,7 @@
PIXIShapeElement.prototype.buildExpressionInterface = function(){};
PIXIShapeElement.prototype.createContent = function(){
- this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.PLayerElement, 0, [], true);
+ this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement, 0, [], true);
this.filterUniqueShapes();
};
diff --git a/player/js/elements/pixiElements/PIXISolidElement.js b/player/js/elements/pixiElements/PIXISolidElement.js
index 9b6af4b..0317beb 100644
--- a/player/js/elements/pixiElements/PIXISolidElement.js
+++ b/player/js/elements/pixiElements/PIXISolidElement.js
@@ -21,4 +21,6 @@
this.addMasks();
this.createContent();
this.hide();
-}
\ No newline at end of file
+}
+
+PIXISolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame;
\ No newline at end of file
diff --git a/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js b/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js
new file mode 100644
index 0000000..28019d7
--- /dev/null
+++ b/player/js/elements/pixiElements/effects/PIXIGaussianBlurEffect.js
@@ -0,0 +1,26 @@
+function PIXIGaussianBlurEffect(filterManager){
+ this.filterManager = filterManager;
+ this.pixiFilter = new PIXI.filters.BlurFilter(0, 10, 1, 5);
+}
+
+PIXIGaussianBlurEffect.prototype.renderFrame = function(forceRender){
+ if(forceRender || this.filterManager._mdf){
+ if(forceRender || this.filterManager.effectElements[0]._mdf || this.filterManager.effectElements[1]._mdf) {
+ var blurStrength = this.filterManager.effectElements[0].p.v;
+ switch(this.filterManager.effectElements[1].p.v) {
+ case 1:
+ this.pixiFilter.blurX = blurStrength;
+ this.pixiFilter.blurY = blurStrength;
+ break;
+ case 2:
+ this.pixiFilter.blurX = blurStrength;
+ this.pixiFilter.blurY = 0;
+ break;
+ case 3:
+ this.pixiFilter.blurX = 0;
+ this.pixiFilter.blurY = blurStrength;
+ break;
+ }
+ }
+ }
+};
\ No newline at end of file
diff --git a/player/js/renderers/PIXIRenderer.js b/player/js/renderers/PIXIRenderer.js
index 8c1f3a6..aa1388b 100644
--- a/player/js/renderers/PIXIRenderer.js
+++ b/player/js/renderers/PIXIRenderer.js
@@ -36,7 +36,6 @@
PIXIRenderer.prototype.createComp = function (data) {
return new PIXICompElement(data,this.globalData,this);
-
};
PIXIRenderer.prototype.createSolid = function (data) {
@@ -64,20 +63,19 @@
//this.animationItem.wrapper.appendChild(this.layerElement);
///
this.renderer = new PIXI.WebGLRenderer(animData.w, animData.h,{antialias:true,transparent:true});
- //this.renderer.view.style.transform = 'scale(0.5,0.5)';
+ this.renderer.view.style.transform = 'scale(0.5,0.5)';
this.renderer.view.style.transformOrigin = '0 0';
this.animationItem.wrapper.appendChild(this.renderer.view);
this.stage = new PIXI.Container();
- this.PLayerElement = this.stage;
+ this.layerElement = this.stage;
///
//Mask animation
var defs = document.createElementNS(svgNS, 'defs');
this.globalData.defs = defs;
- this.layerElement.appendChild(defs);
this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem);
this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem);
- this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;
+ this.globalData.renderConfig = this.renderConfig;
this.globalData.frameId = 0;
this.globalData.compSize = {
w: animData.w,
@@ -85,7 +83,9 @@
};
this.data = animData;
this.globalData.frameRate = animData.fr;
- var maskElement = document.createElementNS(svgNS, 'clipPath');
+
+ //Todo mask main container and remove this block of code
+ /*var maskElement = document.createElementNS(svgNS, 'clipPath');
var rect = document.createElementNS(svgNS,'rect');
rect.setAttribute('width',animData.w);
rect.setAttribute('height',animData.h);
@@ -98,7 +98,8 @@
maskedElement.setAttribute("clip-path", "url(#"+maskId+")");
this.layerElement.appendChild(maskedElement);
defs.appendChild(maskElement);
- this.layerElement = maskedElement;
+ this.layerElement = maskedElement;*/
+
this.layers = animData.layers;
this.globalData.fontManager = new FontManager();
this.globalData.fontManager.addChars(animData.chars);
@@ -198,10 +199,10 @@
i += 1;
}
if(nextElement){
- var index = this.PLayerElement.getChildIndex(nextElement);
- this.PLayerElement.addChildAt(newElement,index);
+ var index = this.layerElement.getChildIndex(nextElement);
+ this.layerElement.addChildAt(newElement,index);
} else {
- this.PLayerElement.addChild(newElement);
+ this.layerElement.addChild(newElement);
}
};
diff --git a/player/js/utils/shapes/shapePathBuilder.js b/player/js/utils/shapes/shapePathBuilder.js
index 67ff949..c68e21a 100644
--- a/player/js/utils/shapes/shapePathBuilder.js
+++ b/player/js/utils/shapes/shapePathBuilder.js
@@ -41,5 +41,19 @@
c:mat.applyToPointArray(_o[i - 1][0], _o[i - 1][1], 0).concat(mat.applyToPointArray(_i[0][0], _i[0][1], 0)).concat(mat.applyToPointArray(_v[0][0], _v[0][1], 0))
})
}
+
+ //Fix for shapes with no length.
+ //Todo: search a better solution. AE draws a point on this cases so the shape can't be removed.
+ if(_PIXIcommands.length === 2
+ && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[0]
+ && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[1]
+ && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[3]
+ && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[4]
+ && _PIXIcommands[0].c[0] === _PIXIcommands[1].c[6]
+ && _PIXIcommands[0].c[1] === _PIXIcommands[1].c[7]
+ ) {
+ _PIXIcommands[1].c[6] += 0.5;
+ _PIXIcommands[1].c[7] += 0.5;
+ }
return _PIXIcommands;
};
\ No newline at end of file