changeset 114:dac8ff197a6a

The repaint function can be used to pass a state to the next paint iteration.
author Mikhail Kryshen <mikhail@kryshen.net>
date Fri, 04 Nov 2011 04:14:50 +0300
parents 38576aca70d8
children d7ff88fa680f
files src/net/kryshen/indyvon/core.clj
diffstat 1 files changed, 25 insertions(+), 6 deletions(-) [+]
line diff
     1.1 --- a/src/net/kryshen/indyvon/core.clj	Fri Nov 04 00:18:11 2011 +0300
     1.2 +++ b/src/net/kryshen/indyvon/core.clj	Fri Nov 04 04:14:50 2011 +0300
     1.3 @@ -50,6 +50,9 @@
     1.4  (def ^:dynamic *scene*
     1.5    "Encloses state that should be retained between repaints.")
     1.6  
     1.7 +(def ^:dynamic *states*
     1.8 +  "Transient scene states, a map.")
     1.9 +
    1.10  (def ^:dynamic *event-dispatcher*)
    1.11  
    1.12  (def ^:dynamic ^AffineTransform *initial-transform*
    1.13 @@ -252,9 +255,15 @@
    1.14        (add-observer scene target (fn [w _] (update w))))))
    1.15  
    1.16  (defn repaint
    1.17 -  "Repaint the current scene."
    1.18 -  []
    1.19 -  (update *scene*))
    1.20 +  "Requests repaint of the current scene. If handle and state are
    1.21 +  specified, the handle will be associated with the state in the
    1.22 +  *states* map for the next paint iteration."
    1.23 +  ([]
    1.24 +     (update *scene*))
    1.25 +  ([handle state]
    1.26 +     (let [scene *scene*]
    1.27 +       (swap! (:next-state scene) assoc handle state)
    1.28 +       (update scene))))
    1.29  
    1.30  ;;
    1.31  ;; Rendering
    1.32 @@ -651,7 +660,7 @@
    1.33  ;; Scene
    1.34  ;;
    1.35  
    1.36 -(defrecord Scene [layer event-dispatcher component])
    1.37 +(defrecord Scene [layer event-dispatcher component next-state])
    1.38  
    1.39  (defn make-scene
    1.40    ([layer]
    1.41 @@ -659,7 +668,16 @@
    1.42    ([layer event-dispatcher]
    1.43       (make-scene layer event-dispatcher nil))
    1.44    ([layer event-dispatcher component]
    1.45 -     (->Scene layer event-dispatcher component)))
    1.46 +     (->Scene layer event-dispatcher component (atom nil))))
    1.47 +
    1.48 +(defn- get-and-set!
    1.49 +  "Atomically sets the value of atom to newval and returns the old
    1.50 +  value."
    1.51 +  [atom newval]
    1.52 +  (loop [v @atom]
    1.53 +    (if (compare-and-set! atom v newval)
    1.54 +      v
    1.55 +      (recur @atom))))
    1.56  
    1.57  (defn draw-scene!
    1.58    [scene ^Graphics2D graphics width height]
    1.59 @@ -675,7 +693,8 @@
    1.60    ;; (.setRenderingHint graphics
    1.61    ;;                    RenderingHints/KEY_TEXT_ANTIALIASING
    1.62    ;;                    RenderingHints/VALUE_TEXT_ANTIALIAS_ON)
    1.63 -  (binding [*scene* scene
    1.64 +  (binding [*states* (get-and-set! (:next-state scene) nil)
    1.65 +            *scene* scene
    1.66              *graphics* graphics
    1.67              *font-context* (.getFontRenderContext graphics)
    1.68              *initial-transform* (.getTransform graphics)