summaryrefslogtreecommitdiff
path: root/tweening.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'tweening.lisp')
-rw-r--r--tweening.lisp55
1 files changed, 55 insertions, 0 deletions
diff --git a/tweening.lisp b/tweening.lisp
new file mode 100644
index 0000000..12ddc5e
--- /dev/null
+++ b/tweening.lisp
@@ -0,0 +1,55 @@
+(in-package :animise)
+
+(defmacro when-bound (symbol)
+ `(when (boundp (quote ,symbol)) ,symbol))
+
+(defvar *duration*)
+(defvar *target*)
+(defvar *start-time*)
+
+(defmacro sequencing ((&key loop-mode start starting with-target targeting target) &body forms)
+ (let ((this-seq (gensym))
+ (dyn-vars (append (when (or with-target target targeting)
+ `((*target* ,(or with-target target targeting))))
+ (when (or start starting)
+ `((*start-time* ,(or start starting)))))))
+ `(let ,dyn-vars
+ (let ((,this-seq (in-sequence ,@forms)))
+ (setf (loop-mode ,this-seq) ',loop-mode)
+ ,this-seq))))
+
+
+(defun pausing (&key for duration start)
+ (pause (or for duration (when-bound *duration*) 0)
+ (or start (when-bound *start-time*) 0)))
+
+(defmacro grouping ((&key duration for with-duration) &body forms)
+ (let ((dyn-vars (append (when (or duration for with-duration)
+ `((*duration* ,(or duration for with-duration)))))))
+ `(let ,dyn-vars
+ (as-group ,@forms))))
+
+
+(defun keyword->ease-fn (name)
+ (case name
+ ((:bounce-out :bouncing-out) #'bounce-out)
+ ((:cubing-in :cubically-in :cubic-in) #'cubic-in)
+ ((:cubing-in-out :cubically-in-out :cubic-in-out) #'cubic-in-out)
+ ((:cubing-out :cubically-out :cubic-out) #'cubic-out)
+ ((:elastic-out :elastically-out) #'elastic-out)
+ ((:linear :linearly) #'linear)
+ ((:quading-in :quad-in :quadratically-in) #'quad-in)
+ ((:quading-in-out :quad-in-out :quadratically-in-out) #'quad-in-out)
+ ((:quading-out :quad-out :quadratically-out) #'quad-out)
+ ((:sine-in :sinusoidal-in :sinusoidally-in) #'sinusoidal-in)
+ ((:sine-in-out :sinusoidally-in-out :sinusoidal-in-out) #'sinusoidal-in-out)
+ ((:sine-out :sinusoidal-out :sinusoidally-out) #'sinusoidal-out)))
+
+(defun animating (ease &key the modifying of to for start starting)
+ (animate (or of (when-bound *target*))
+ (or the modifying)
+ to
+ :start (or start starting (when-bound *start-time*) 0)
+ :ease (if (functionp ease) ease (keyword->ease-fn ease))
+ :duration (or for (when-bound *duration*) 0)))
+