canvas mouse modifier
diff --git a/player/index.html b/player/index.html
index 8444836..1f307a7 100644
--- a/player/index.html
+++ b/player/index.html
@@ -119,21 +119,22 @@
     var elem = document.getElementById('bodymovin')
     var animData = {
         container: elem,
-        renderer: 'svg',
+        renderer: 'canvas',
         loop: true,
         autoplay: true,
         rendererSettings: {
-            progressiveLoad:false
+            progressiveLoad:false,
+            dpr: 1
         },
-        path: 'exports/render/data3.json'
+        path: 'exports/render/data.json'
     };
     anim = bodymovin.loadAnimation(animData);
     anim.addEventListener('DOMLoaded', function(){
         window.addEventListener('mousemove', function(ev){
-            anim.renderer.globalData.mouseX = ev.offsetX || ev.pageX;
-            anim.renderer.globalData.mouseY = ev.offsetY || ev.pageY;
+            anim.renderer.globalData.mouseCoords.x = ev.offsetX || ev.pageX;
+            anim.renderer.globalData.mouseCoords.y = ev.offsetY || ev.pageY;
         })
-        //createDrawingCanvas();
+        createDrawingCanvas();
     })
 
     function createDrawingCanvas(){
@@ -144,8 +145,12 @@
         var maxOffset = 250;
         var currentOffset = 0;
         var offsetDir = -1;
+        var lastSecond = Number.NEGATIVE_INFINITY;
+        var xOffset = 0;
+        var newSegmentHeight = 40;
+        var pairs = [];
         
-        function tick(){
+        function tick(time){
             ////
                 /*// get svg data
                 var xml = new XMLSerializer().serializeToString(sourceSVG);
@@ -162,9 +167,9 @@
             ////
             isEven = !isEven;
             if(isEven){
-                canvasCtx.globalCompositeOperation = 'exclusion';
+                //canvasCtx.globalCompositeOperation = 'exclusion';
             }else {
-                canvasCtx.globalCompositeOperation = 'multiply';
+                //canvasCtx.globalCompositeOperation = 'multiply';
             }
             if(offsetDir > 0){
                 currentOffset = currentOffset >= maxOffset ? maxOffset : currentOffset + offsetDir;
@@ -173,22 +178,38 @@
             }
 
             if(anim.currentFrame !== currentAnimFrame){
+                var newPairs = false;
+                if(time - lastSecond > 1000){
+                   newPairs = true;
+                   pairs.length = 0;
+                }
                 currentAnimFrame = anim.currentFrame;
-                var currentH = 0;
+                var currentH = 0, currentPair = 0;
                 while(currentH < canvasH){
-                    var newSegmentHeight = 2 + Math.round(2*Math.random());
-                    if(currentH + newSegmentHeight > canvasH){
-                        newSegmentHeight = canvasH - currentH;
+                    if(newPairs){
+                        newSegmentHeight = 2 + Math.round(20*Math.random());
+                        if(currentH + newSegmentHeight > canvasH){
+                            newSegmentHeight = canvasH - currentH;
+                        }
+                        xOffset = Math.round(Math.random()*(canvasW - 1));
+                        pairs.push([newSegmentHeight, xOffset]);
+                    } else {
+                        newSegmentHeight = pairs[currentPair][0];
+                        xOffset = pairs[currentPair][1];
+                        currentPair += 1;
                     }
-                    var xOffset = Math.round(Math.random()*canvasW/10);
-                    var xOffset = 1 + Math.round(Math.random()*currentOffset);
+                    //var xOffset = 1 + Math.round(Math.random()*currentOffset);
                     //xOffset = 0;
                     bufferCanvasCtx.drawImage(source, xOffset, currentH, canvasW - xOffset, newSegmentHeight, 0 , currentH, canvasW - xOffset, newSegmentHeight);
                     bufferCanvasCtx.drawImage(source, 0, currentH, xOffset, newSegmentHeight, canvasW - xOffset , currentH, xOffset, newSegmentHeight);
                     currentH += newSegmentHeight;
                 }
                 canvasCtx.drawImage(bufferCanvas, 0, 0);
+                if(newPairs){
+                    lastSecond = time;
+                }
             }
+
             requestAnimationFrame(tick);
         }
 
@@ -227,7 +248,7 @@
         elem.appendChild(canvas);
         elem.addEventListener('mousedown', elemDownHandler);
         elem.addEventListener('mouseup', elemUpHandler);
-        tick();
+        requestAnimationFrame(tick);
 
 
     }
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 91261c5..4433605 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -221,6 +221,26 @@
 AnimationItem.prototype.configAnimation = function (animData) {
     //ERASE
     console.log(animData);
+    // two_dance
+    for(var i =0; i < animData.assets[0].layers.length; i += 1){
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":50,"dc":0.95}); /// OPTION C 2
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":250,"dc":0.25}); /// OPTION A 1
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":300,"dc":.75}); /// OPTION A 2
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":300,"dc":.95}); /// OPTION A 3
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":250,"dc":.999}); /// OPTION A 4
+        if(animData.assets[0].layers[i].ty === 4){
+            animData.assets[0].layers[i].shapes.push({"ty": "ms","dc":1, "ss": 140, "mx": 15}); /// OPTION B 1
+        }
+    }
+    for(var i =0; i < animData.assets[1].layers.length; i += 1){
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":50,"dc":0.95}); /// OPTION C 2
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":250,"dc":0.25}); /// OPTION A 1
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":300,"dc":.75}); /// OPTION A 2
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":300,"dc":.95}); /// OPTION A 3
+        //animData.layers[i].shapes.push({"ty": "ms","maxDist":250,"dc":.999}); /// OPTION A 4
+        animData.assets[1].layers[i].shapes.push({"ty": "ms","dc":1, "ss": 140, "mx": 15}); /// OPTION B 1
+    }
+
     // DANCING DARWIN
     /*for(var i =0; i < 32; i+= 1){
         //animData.layers[i].shapes.push({"ty": "ms","maxDist":50,"dc":0.95}); /// OPTION C 2
@@ -231,10 +251,12 @@
         animData.layers[i].shapes.push({"ty": "ms","dc":1, "ss": 140, "mx": 15}); /// OPTION B 1
     }*/
     // CIRCLE
-    /*animData.layers[0].shapes.push({"ty": "ms","dc":.5, "ss": 140, "mx": 15});
+    //animData.assets[1].layers[1].shapes.push({"ty": "ms","dc":.5, "ss": 140, "mx": 15});
+
+    ////
     if(this.renderer && this.renderer.destroyed){
         return;
-    }*/
+    }
     //console.log(JSON.parse(JSON.stringify(animData)));
     //animData.w = Math.round(animData.w/blitter);
     //animData.h = Math.round(animData.h/blitter);
diff --git a/player/js/elements/BaseElement.js b/player/js/elements/BaseElement.js
index 6658bc4..73ed5c2 100644
--- a/player/js/elements/BaseElement.js
+++ b/player/js/elements/BaseElement.js
@@ -87,8 +87,14 @@
     var comp = this.comp;
     while(flag){
         if(comp.finalTransform){
-            if(comp.data.hasMask){
-                transforms.splice(0,0,comp.finalTransform);
+            transforms.push(comp.finalTransform);
+            if(comp.hierarchy){
+                i = 0;
+                len = comp.hierarchy.length;
+                while(i < len) {
+                    transforms.push(comp.hierarchy[i].finalTransform);
+                    i += 1;
+                } 
             }
             comp = comp.comp;
         } else {
@@ -123,8 +129,14 @@
     var comp = this.comp;
     while(flag){
         if(comp.finalTransform){
-            if(comp.data.hasMask){
-                transforms.splice(0,0,comp.finalTransform);
+            transforms.splice(0,0,comp.finalTransform);
+            if(comp.hierarchy){
+                len = comp.hierarchy.length;
+                i = 0;
+                while(i < len) {
+                    transforms.splice(0,0,comp.hierarchy[i].finalTransform);
+                    i += 1;
+                } 
             }
             comp = comp.comp;
         } else {
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index 2c4ca28..a2642df 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -160,6 +160,10 @@
         w: animData.w,
         h: animData.h
     };
+    this.globalData.mouseCoords = {
+        x: 0,
+        y: 0
+    };
     this.globalData.progressiveLoad = this.renderConfig.progressiveLoad;
     this.layers = animData.layers;
     this.transformCanvas = {};
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 5b6bacd..25acbc0 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -68,6 +68,10 @@
         w: animData.w,
         h: animData.h
     };
+    this.globalData.mouseCoords = {
+        x: 0,
+        y: 0
+    };
     this.data = animData;
     this.globalData.frameRate = animData.fr;
     var maskElement = document.createElementNS(svgNS, 'clipPath');
diff --git a/player/js/utils/shapes/MouseModifier.js b/player/js/utils/shapes/MouseModifier.js
index b3b98bd..0256a03 100644
--- a/player/js/utils/shapes/MouseModifier.js
+++ b/player/js/utils/shapes/MouseModifier.js
@@ -196,15 +196,15 @@
         perc = Math.min(1,distance/maxDist);
 
         //// OPTION 1
-        // if(distance < maxDist){
-        //     cloned_path.setTripleAt(path.v[i][0],path.v[i][1]
-        //     ,path.v[i][0]+(path.o[i][0] - path.v[i][0])*perc,path.v[i][1]+(path.o[i][1] - path.v[i][1])*perc
-        //     ,path.v[i][0]+(path.i[i][0] - path.v[i][0])*perc,path.v[i][1]+(path.i[i][1] - path.v[i][1])*perc, i);
-        // } else {
-        //     cloned_path.setTripleAt(path.v[i][0],path.v[i][1]
-        //     ,path.o[i][0],path.o[i][1]
-        //     ,path.i[i][0],path.i[i][1], i);
-        // }
+        if(distance < maxDist){
+            cloned_path.setTripleAt(path.v[i][0],path.v[i][1]
+            ,path.v[i][0]+(path.o[i][0] - path.v[i][0])*perc,path.v[i][1]+(path.o[i][1] - path.v[i][1])*perc
+            ,path.v[i][0]+(path.i[i][0] - path.v[i][0])*perc,path.v[i][1]+(path.i[i][1] - path.v[i][1])*perc, i);
+        } else {
+            cloned_path.setTripleAt(path.v[i][0],path.v[i][1]
+            ,path.o[i][0],path.o[i][1]
+            ,path.i[i][0],path.i[i][1], i);
+        }
 
         //// OPTION 2
         // perc = 1 - perc*5;
@@ -233,9 +233,7 @@
     }*/
 
     ////OPTION D
-    //console.log('mouseCoords:', mouseCoords)
     var localMouseCoords = this.elem.globalToLocal(mouseCoords, transformers);
-    //console.log(localMouseCoords);
 
     var maxDist = this.data.maxDist;
     var perc, distance;
@@ -243,11 +241,6 @@
 
         //globalPt = this.elem.localToGlobal(path.v[i],transformers);
 
-        /*theta = Math.atan2(
-            path.v[i][1] - localMouseCoords[1],
-            path.v[i][0] - localMouseCoords[0]
-        );*/
-
         x = path.v[i][0] - localMouseCoords[0];
         y =path.v[i][1] - localMouseCoords[1];
         distance = Math.sqrt( (x * x) + (y * y) );
@@ -274,8 +267,8 @@
 }
 
 MouseModifier.prototype.processShapes = function(){
-    var mouseX = this.elem.globalData.mouseX || 100;
-    var mouseY = this.elem.globalData.mouseY || 100;
+    var mouseX = this.elem.globalData.mouseCoords.x;
+    var mouseY = this.elem.globalData.mouseCoords.y;
     var shapePaths;
     var i, len = this.shapes.length;
     var j, jLen;
@@ -321,6 +314,7 @@
     this.getValue = this.processKeys;
     this.data = data;
     this.positions = [];
+    this.dynamicProperties.push({});
 };