summaryrefslogtreecommitdiff
path: root/tweening.lisp
blob: 12ddc5e7918f044723ff16f5b5300af66bccfa00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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)))