Sped up rendering at the cost of some kludges

This commit is contained in:
Chris Hodapp 2020-07-11 14:20:25 -04:00
parent b660abef05
commit 74bd37e65c

View File

@ -2,7 +2,7 @@
(:require [quil.core :as q :include-macros true] (:require [quil.core :as q :include-macros true]
[quil.middleware :as m])) [quil.middleware :as m]))
(def framerate 30) (def framerate 60)
(def res-x 500) (def res-x 500)
(def res-y res-x) (def res-y res-x)
;; Lower grid size produces more points ;; Lower grid size produces more points
@ -11,8 +11,9 @@
(def alpha 20) (def alpha 20)
(def renderer #?(:clj :java2d (def renderer #?(:clj :java2d
:cljs :p3d)) :cljs :p2d))
;; TODO: Figure out my own test setup issues with p3d ;; TODO: I still must add xorg.libXxf86vm and prepend to 'lein run':
;; LD_LIBRARY_PATH=/nix/store/695kqk35hndbcn2p6crcd8062p13j2a6-libXxf86vm-1.1.4/lib
;; Return sequence of [x y], with ;; Return sequence of [x y], with
(defn grid [nx ny] (defn grid [nx ny]
@ -62,15 +63,29 @@
(defn dist [x y] (defn dist [x y]
(Math/sqrt (dist2 x y))) (Math/sqrt (dist2 x y)))
(defn clamp [v v0 v1]
(cond (< v v0) v0
(> v v1) v1
:else v))
(defn setup [] (defn setup []
(q/background 255) (q/background 255)
(q/frame-rate framerate) (q/frame-rate framerate)
(let [gr (q/create-graphics res-x res-y)] (let [gr (q/create-graphics res-x res-y)]
(q/with-graphics gr (q/background 255 alpha)) (q/with-graphics gr
(q/background 255 alpha))
{:frame 0 {:frame 0
:grid (pix-grid grid-size res-x res-y) :grid (pix-grid grid-size res-x res-y)
:blend gr})) :blend gr}))
(defn sdf-box [px py bx by]
(let [bx2 (* 0.5 bx)
by2 (* 0.5 by)
dx (- (Math/abs (- px bx2)) bx2)
dy (- (Math/abs (- py by2)) by2)
l (+ (dist (max 0.0 dx) (max 0.0 dy)) (min (max dx dy) 0.0))]
l))
(defn update-state [state] (defn update-state [state]
(let [w (q/width) (let [w (q/width)
h (q/height) h (q/height)
@ -96,12 +111,13 @@
1e6 ;; arbitrarily large value 1e6 ;; arbitrarily large value
) )
;; function for distance to the border: ;; function for distance to the border:
d-border (fn [x y] ;; d-border (fn [x y]
(min ;; (min
(- x margin) ;; (- x margin)
(- y margin) ;; (- y margin)
(- (- w margin) x) ;; (- (- w margin) x)
(- (- h margin) y))) ;; (- (- h margin) y)))
d-border (fn [x y] (- 50 (sdf-box x y w h)))
;; potential modulation function - takes (x,y): ;; potential modulation function - takes (x,y):
amp-fn #(ramp (min (/ (d-mouse %1 %2) d0) amp-fn #(ramp (min (/ (d-mouse %1 %2) d0)
(/ (d-border %1 %2) d0))) (/ (d-border %1 %2) d0)))
@ -132,26 +148,65 @@
(update :frame inc) (update :frame inc)
(assoc :grid points)))) (assoc :grid points))))
(defn draw-state [state] (def show-fn false)
#?(:cljs (q/translate (- (/ res-x 2)) (- (/ res-y 2))))
;; TODO: Is this a p3d thing? (defn draw-field [offset sdf]
(q/image (:blend state) 0 0)
(q/stroke 0)
(q/stroke-weight 5)
(let [pix (q/pixels) (let [pix (q/pixels)
w (q/width) w (q/width)
color (+ 255 (* 256 255) (* 256 256 255)) h (q/height)
] ]
(doseq [point (grid (q/width) (q/height))]
(let [[px py] point
px2 (- (* px 1.5) 50)
py2 (- (* py 1.5) 50)
;; TODO: Factor this out somehow (what's a good way to
;; factor out domain transformations?)
w2 w
h2 h
d (sdf px2 py2)
step (/ (mod d offset) offset)
val (int (* step 255))
[r g b] (if (>= (Math/abs d) (* offset 0.5))
[val val val]
[val 0.0 0.0])]
#?(:clj (aset-int pix (+ px (* py w)) (q/color r g b))
:cljs (let [offset (* 4 (+ px (* py w)))]
(aset pix offset r)
(aset pix (+ offset 1) g)
(aset pix (+ offset 2) b)
(aset pix (+ offset 3) 255) ;; alpha
))
))
(q/update-pixels)))
(defn draw-state [state]
;;#?(:cljs (q/translate (- (/ res-x 2)) (- (/ res-y 2))))
;; TODO: Is this a p3d thing or a cljs thing?
(q/image (:blend state) 0 0)
(let [pix (q/pixels)
w (q/width)
h (q/height)
color (q/color 0)
]
(if show-fn
(draw-field 10.0 #(- 40.0 (sdf-box %1 %2 (q/width) (q/height))))
(doseq [point (:grid state)] (doseq [point (:grid state)]
(let [[i j px py] point (let [[_ _ px py] point
;;pix (q/pixels) ix (clamp (int px) 0 (- w 1))
;; TODO: What am I doing wrong with accessing 'pix'? iy (clamp (int py) 0 (- h 1))]
] #?(:clj (aset-int pix (+ ix (* iy w)) color)
;;(aset-int pix (+ px (* py w)) color) :cljs (let [offset (* 4 (+ ix (* iy w)))]
(q/point px py) (aset pix offset 0) ;; R
)) (aset pix (+ offset 1) 0) ;; G
;;(q/update-pixels) (aset pix (+ offset 2) 0) ;; B
)) (aset pix (+ offset 3) 255) ;; alpha
)))))
(q/update-pixels)))
(defn settings []
;; https://github.com/quil/quil/issues/299
(q/pixel-density 1))
(defn ^:export run-sketch [] (defn ^:export run-sketch []
(q/defsketch curlnoise (q/defsketch curlnoise
@ -160,6 +215,7 @@
:size [res-x res-y] :size [res-x res-y]
:renderer renderer :renderer renderer
:setup setup :setup setup
:settings settings
:update update-state :update update-state
:draw draw-state :draw draw-state
:features [:keep-on-top] :features [:keep-on-top]
@ -170,3 +226,7 @@
(defn -main [& args] (defn -main [& args]
(run-sketch)) (run-sketch))
;; Just for testing:
;; (run-sketch)