]> git.jsancho.org Git - gacela.git/commitdiff
Real at-rate function and init values in reactive context feature/rate-based-animation
authorJavier Sancho <jsf@jsancho.org>
Thu, 11 May 2017 15:31:25 +0000 (17:31 +0200)
committerJavier Sancho <jsf@jsancho.org>
Thu, 11 May 2017 15:31:25 +0000 (17:31 +0200)
examples/07-rate-based-animations/07-rate-based-animations.scm
gacela/react.scm

index 9a4a86631c65d5a826459ce0d9ae7337a1ea9d98..7de2e88711680d127ecd9e2fc545d635e0cd4509 100644 (file)
@@ -23,5 +23,5 @@
 
 (display-scene
   (window ((resolution '(640 480)))
-    (context ((x (- (at-rate 1) 1)))
+    (context ((x (- (at-rate 100) 1)))
       (move bart x 0))))
index e9d0668b323e29764440362b9f9e5b5f16206110..76c76f55a83906034a003f445b42376fd1b35a66 100644 (file)
   #:export (context
             at-rate))
 
+
+;; Time Stack
+
+(define time-stack '())
+
+(define (push-init-time init-time)
+  (set! time-stack (cons init-time time-stack)))
+
+(define (pop-init-time)
+  (set! time-stack (cdr time-stack)))
+
+(define (head-init-time)
+  (car time-stack))
+
+
+;; Reactive context
+
 (define-syntax context
-  (syntax-rules ()
-    ((_ ((variable value)
-         ...)
-        scene)
-     (make-scene
-      "context"
-      (let* ((variable value)
-             ...)
-        (lambda ()
-          (begin
-            (set! variable value)
-            ...)
-          (display-scene scene)))))))
+  (lambda (x)
+    (define (transform vars)
+      (let ((datum (map (lambda (v) (syntax->datum v)) vars)))
+        (map (lambda (v) (datum->syntax x v))
+             (map (lambda (v)
+                    (cond ((and (= (length v) 4) (equal? (caddr v) '<=))
+                           (list (car v) (cadr v) (cadddr v)))
+                          ((= (length v) 2)
+                           (list (car v) (cadr v) 0))
+                          (else
+                           v)))
+                  datum))))
+    (syntax-case x (<=)
+      ((_ ((variable value <= init-value)
+           ...)
+          scene)
+       #'(make-scene
+          "context"
+          (let* ((variable init-value)
+                 ...
+                 (?init-time (get-internal-real-time)))
+            (lambda ()
+              (push-init-time ?init-time)
+              (begin
+                (set! variable value)
+                ...)
+              (display-scene scene)
+              (pop-init-time)))))
+      ((_ ((variable value value* ...)
+           ...)
+          scene)
+       (with-syntax ((((variable1 value1 init-value1) ...) (transform #'((variable value value* ...) ...))))
+         #'(context ((variable1 value1 <= init-value1)
+                     ...)
+                    scene))))))
+
+
+;; Rate based functions
 
 (define (at-rate value)
-  0)
+  (let ((delta (- (get-internal-real-time) (head-init-time))))
+    (* value (/ delta 1000.0))))