]> source.dussan.org Git - svg.js.git/commitdiff
Refactored the getOrigin helper to help fix the relative affine animations
authorSaivan <savian@me.com>
Mon, 17 Sep 2018 04:50:56 +0000 (14:50 +1000)
committerSaivan <savian@me.com>
Mon, 17 Sep 2018 04:50:56 +0000 (14:50 +1000)
This commit refactors the getOrigin helper, in order to send the origin to the correct
space. The origin should be expressed in the space of the last animation.

Changes
=======
- Refactored the getOrigin helper
- Added a simple example to the dirty file to test multiple transformations

dirty.html
src/helpers.js
src/runner.js

index f7542e6474755c14a5a92e25b127098db9b2cf0e..68a9aa8537799b4e91c459b98061acf04580c921 100644 (file)
@@ -305,40 +305,31 @@ let wait = 1000
 let rAnim = r.clone().attr('fill', '#f00').animate(wait).attr('fill', '#0f0')
 let rDecl = r.clone().attr('fill', 'blue').animate(new SVG.Spring(wait, 15))
 
-// // Move once
-// setTimeout(() => {
-//   let trans = {tx: 500, ty: 300}
-//   r.transform(trans, true)
-//   // rAnim.animate(wait, 0, 'start').transform(trans, true)
-//   rDecl.transform(trans, true)
-// }, wait)
-
-// Move again
-setTimeout(() => {
-  let transform = {
-    origin: 'top-left',
-    translate: [530, 250],
-    rotate: 300,
-    scale: 2,
-    shear: 1,
+let runTransformation = (transform) => {
+  return () => {
+    let relative = false
+    let affine = false
+    r.transform(transform, relative)
+    rAnim.animate(wait).transform(transform, relative, affine)
+    rDecl.transform(transform, relative, affine)
   }
-  let relative = true
-  let affine = false
-  r.transform(transform, relative)
-  rAnim.animate(wait).transform(transform, relative, affine)
-  rDecl.transform(transform, relative, affine)
-}, 0.1 * wait )
-
-
-// declaritive relative (affine/nonaffine)
-// declaritive absolute non affine
-// normal non affine relative
-
-//    D N
-// R
-// A
-
+}
 
+setTimeout(runTransformation({
+  origin: 'top-left',
+  translate: [530, 250],
+  rotate: 300,
+  scale: 2,
+  shear: 1,
+}), 0.1 * wait )
+
+// setTimeout(runTransformation({
+//   origin: 'top-left',
+//   translate: [530, 250],
+//   rotate: 800,
+//   scale: 2,
+//   shear: 1,
+// }), wait )
 
 
 
index 44bce729915581893f8af87f0e3667f9d4df3f55..786004877cfa127d24af86ff8bca16761c146202 100644 (file)
@@ -249,7 +249,7 @@ function formatTransforms (o) {
 }
 
 
-function getOrigin (o, element, relative) {
+function getOrigin (o, element, inSpace) {
   // Allow origin or around as the names
   let origin = o.around == null ? o.origin : o.around
   let ox, oy
@@ -279,9 +279,8 @@ function getOrigin (o, element, relative) {
   }
 
   // Transform the origin into the current reference frame
-  if ( relative ) {
-    let matrix = new SVG.Matrix(element)
-    let originRelative = new SVG.Point( ox, oy ).transform(matrix)
+  if ( inSpace ) {
+    let originRelative = new SVG.Point( ox, oy ).transform(inSpace)
     ox = originRelative.x
     oy = originRelative.y
   }
index 881efd412e46ad2231d6141f6c247e6d66804282..298db36190bbfd3d0f300e7d3a7c45620eefdea6 100644 (file)
@@ -653,9 +653,19 @@ SVG.extend(SVG.Runner, {
 
       // make sure element and origin is defined
       element = element || this.element()
-      origin = origin || getOrigin(transforms, element, relative)
 
-this.element().parent().ellipse(50, 50).center(...origin)
+      // TODO: Give me all matricies concatenated, up until this matrix,
+      // for example, if I have M = E D C B A
+      // If I'm about to run D, I want transform space to be
+      //    C * B * A
+      // Where C B and A are the current morpher targets
+      // The solution I've added here won't work if we interrupt an animation
+      // mid-animation (try turning on the second animation in dirty)
+
+      let transformSpace = relative
+        ? new SVG.Matrix(element)
+        : undefined
+      origin = origin || getOrigin(transforms, element, transformSpace)
 
       // add the runner to the element so it can merge transformations
       element.addRunner(this)