Mercurial > hg > indyvon
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)