From 3d091f32753239933a39f37025949885d09a1d69 Mon Sep 17 00:00:00 2001 From: arne Date: Fri, 20 Feb 2026 08:52:57 +0100 Subject: [PATCH 1/4] Fix default behavior of `screenshottable` --- src/aphorisms/utils/middleware.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aphorisms/utils/middleware.clj b/src/aphorisms/utils/middleware.clj index bf620f8..eafa2e7 100644 --- a/src/aphorisms/utils/middleware.clj +++ b/src/aphorisms/utils/middleware.clj @@ -31,4 +31,4 @@ (q/save path))) (when (fn? key-pressed) (key-pressed state ev)) - {})))))) + state)))))) From fbbc60a39c5ffc87f530c91dd321450cd55cb45f Mon Sep 17 00:00:00 2001 From: arne Date: Fri, 20 Feb 2026 08:54:19 +0100 Subject: [PATCH 2/4] Start scribbling around again --- src/aphorisms/fourty.clj | 73 ++++++++++++++++++++++++++ src/aphorisms/fourty_one.clj | 99 ++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 src/aphorisms/fourty.clj create mode 100644 src/aphorisms/fourty_one.clj diff --git a/src/aphorisms/fourty.clj b/src/aphorisms/fourty.clj new file mode 100644 index 0000000..d6ba72d --- /dev/null +++ b/src/aphorisms/fourty.clj @@ -0,0 +1,73 @@ +(ns aphorisms.fourty + (:require [thi.ng.geom.core :as g] + [thi.ng.geom.vector :as v] + [quil.core :as q] + [quil.middleware :as qm] + [thi.ng.geom.rect :as r] + [aphorisms.utils.middleware :refer [screenshottable]] + )) + +;; Getting a feeling for the `thi.ng` API again; mostly playing around with how +;; to partition geometries into a grid and how to position things relative to +;; each other. + +(def height 500 #_(int (* width (Math/sqrt 2)))) +(def width #_500 (int (* height (Math/sqrt 2)))) +(def padding (* height 0.1)) +(def canvas (r/rect width height)) + +(defn center-in + "Centers `r2` in or around `r1`." + [r1 r2] + (g/translate (assoc r2 :p (:p r1)) + (v/vec2 (* 0.5 (- (g/width r1) (g/width r2))) + (* 0.5 (- (g/height r1) (g/height r2)))))) + +(def bounds (center-in canvas (r/rect (- width (* 2 padding)) (- height (* 2 padding))))) + +(defn as-grid [rect cell-size] + (let [n-x (int (/ (g/width rect) cell-size)) + n-y (int (/ (g/height rect) cell-size)) + t (v/vec2 (* (mod (g/width rect) n-x) 0.5) + (* (mod (g/height rect) n-x) 0.5))] + (for [x (range n-x) + y (range n-y)] + (-> (r/rect (* x cell-size) (* y cell-size) cell-size) + (g/translate (:p rect)) + (g/translate t ))))) + +(def grid (as-grid bounds 20)) + +;; below is the rendering logic + +(defn setup [] + (q/frame-rate 30) + (q/color-mode :hsb 360 100 100) + (q/rect-mode :center) + (q/ellipse-mode :center) + (q/background 350) + {}) + +(defn update-state [state] + state) + +(defn draw-state [state] + (q/translate -0.5) + (q/background 180 0 98) + (q/stroke-weight 0.5) + (q/no-fill) + (q/stroke 320 100 70) + (doseq [cell grid + :let [[x y] (g/centroid cell)]] + (q/ellipse x y 10 10))) + +#_:clj-kondo/ignore +(q/defsketch fourty + :title "Fourty" + :size [width height] + :settings #(q/pixel-density (q/display-density)) + :setup setup + :update update-state + :draw draw-state + :features [:keep-on-top :no-bind-output] + :middleware [qm/pause-on-error qm/fun-mode (screenshottable)]) diff --git a/src/aphorisms/fourty_one.clj b/src/aphorisms/fourty_one.clj new file mode 100644 index 0000000..4dc910c --- /dev/null +++ b/src/aphorisms/fourty_one.clj @@ -0,0 +1,99 @@ +(ns aphorisms.fourty-one + (:require [thi.ng.geom.core :as g] + [thi.ng.geom.vector :as v] + [quil.core :as q] + [quil.middleware :as qm] + [thi.ng.geom.rect :as r] + [aphorisms.utils.middleware :refer [screenshottable]] + + [thi.ng.geom.line :as l] + [thi.ng.math.core :as m] + [thi.ng.geom.utils.intersect :as isec])) + +;; More practice to get a feeling for the `thi.ng` API again +;; Resizing cells in the grid, generating random lines and playing with intersections + +(def height 500 #_(int (* width (Math/sqrt 2)))) +(def width #_500 (int (* height (Math/sqrt 2)))) +(def padding (* height 0.1)) +(def canvas (r/rect width height)) + +(defn center-in + "Centers `r2` in or around `r1`." + [r1 r2] + (g/translate (assoc r2 :p (:p r1)) + (v/vec2 (* 0.5 (- (g/width r1) (g/width r2))) + (* 0.5 (- (g/height r1) (g/height r2)))))) + +(def bounds (center-in canvas (r/rect (- width (* 2 padding)) (- height (* 2 padding))))) + +(defn as-grid [rect cell-size] + (let [n-x (int (/ (g/width rect) cell-size)) + n-y (int (/ (g/height rect) cell-size)) + t (v/vec2 (* (mod (g/width rect) n-x) 0.5) + (* (mod (g/height rect) n-x) 0.5))] + (for [x (range n-x) + y (range n-y)] + (-> (r/rect (* x cell-size) (* y cell-size) cell-size) + (g/translate (:p rect)) + (g/translate t ))))) + +(def grid (map #(g/scale-size % 0.92) (as-grid bounds 50))) + +(defn line-inside [rect] + (l/line2 (g/random-point-inside rect) (g/random-point-inside rect))) + +;; below is the rendering logic + +(defn setup [] + (q/frame-rate 30) + (q/color-mode :hsb 360 100 100) + (q/rect-mode :center) + (q/ellipse-mode :center) + (q/background 350) + {:lines (repeatedly 5 #(line-inside bounds))}) + +(defn update-state [state] + state) + +(defn mouse-pressed [state _] + (assoc state :lines (repeatedly 20 #(line-inside bounds)))) + +(let [l (l/line2 50 50 200 210)] + (g/intersect-line l (first (g/edges (first grid))))) + +(defn draw-state [state] + (q/translate -0.5 -0.5) + (q/background 180 0 98) + (q/stroke-weight 0.5) + (q/no-fill) + (q/stroke 320 100 70) + (doseq [line (:lines state) + :let [[a b] (g/vertices line)]] + (q/line a b)) + (doseq [cell grid + [a b] (g/edges cell)] + (q/line a b)) + (q/no-stroke) + (q/fill 320 100 70) + (doseq [cell grid + line (:lines state) + isecs (->> + (map #(g/intersect-line line %) (g/edges cell)) + (keep #(when (= (:type %) :intersect) (:p %)))) + :let [[i1 i2] isecs]] + (q/ellipse i1 i2 5 5))) + +#_:clj-kondo/ignore +(q/defsketch fourty-one + :title "Fourty One" + :size [width height] + :settings (fn [] + (q/smooth 2) + (q/pixel-density (q/display-density))) + :setup setup + :update #'update-state + :mouse-pressed #'mouse-pressed + :draw #'draw-state + :features [:keep-on-top :no-bind-output] + :middleware [qm/pause-on-error qm/fun-mode (screenshottable)]) From 0075c83b5e971a72b67e05f481d051233c4881ea Mon Sep 17 00:00:00 2001 From: arne Date: Fri, 20 Feb 2026 09:00:03 +0100 Subject: [PATCH 3/4] Fix `:renderer :p2d` so it's at least starting from within emacs --- .gitignore | 3 +++ deps.edn | 23 ++++++++++++++++++++--- flake.lock | 6 +++--- flake.nix | 7 ++++--- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 9d56060..fcc3216 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ /.direnv/ /.cpcache/ +/exports +/resources +.rebel_readline_history # Created by https://www.gitignore.io/api/clojure diff --git a/deps.edn b/deps.edn index 327e443..9493b93 100644 --- a/deps.edn +++ b/deps.edn @@ -1,7 +1,24 @@ -{:deps {#_#_ org.clojure/clojure {:mvn/version "1.11.1"} - quil/quil {:mvn/version "4.3.1563"} +{#_#_ :mvn/repos {"jogl" {:url "https://jogamp.org/deployment/maven/"}} + :deps {#_#_ org.clojure/clojure {:mvn/version "1.11.1"} + quil/quil {:mvn/version "4.3.1563" + #_#_ :exclusions [org.jogamp.jogl/jogl-all + org.jogamp.gluegen/gluegen-rt]} thi.ng/geom {:mvn/version "1.0.0-RC3" :exclusions [org.jogamp.jogl/jogl-all org.jogamp.gluegen/gluegen-rt]} com.cnuernber/charred {:mvn/version "1.034"} - overtone/osc-clj {:mvn/version "0.9.0"}}} + overtone/osc-clj {:mvn/version "0.9.0"} + + ;; ;; native display code + ;; org.jogamp.gluegen/gluegen-rt {:mvn/version "2.5.0"} + ;; org.jogamp.gluegen/gluegen-rt$natives-macosx-universal {:mvn/version "2.5.0"} + ;; org.jogamp.gluegen/gluegen-rt$natives-linux-amd64 {:mvn/version "2.5.0"} + ;; org.jogamp.gluegen/gluegen-rt$natives-linux-aarch64 {:mvn/version "2.5.0"} + ;; org.jogamp.gluegen/gluegen-rt$natives-windows-amd64 {:mvn/version "2.5.0"} + + ;; org.jogamp.jogl/jogl-all {:mvn/version "2.5.0"} + ;; org.jogamp.jogl/jogl-all$natives-macosx-universal {:mvn/version "2.5.0"} + ;; org.jogamp.jogl/jogl-all$natives-linux-amd64 {:mvn/version "2.5.0"} + ;; org.jogamp.jogl/jogl-all$natives-linux-aarch64 {:mvn/version "2.5.0"} + ;; org.jogamp.jogl/jogl-all$natives-windows-amd64 {:mvn/version "2.5.0"} + }} diff --git a/flake.lock b/flake.lock index 6de6815..0a331a5 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1741513245, - "narHash": "sha256-7rTAMNTY1xoBwz0h7ZMtEcd8LELk9R5TzBPoHuhNSCk=", + "lastModified": 1771432645, + "narHash": "sha256-ZqRiU5/c+1+QoeaMJJgpqjwimCSNnIl0AUW4z7Md6Ps=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e3e32b642a31e6714ec1b712de8c91a3352ce7e1", + "rev": "02263f46911178e286242786fd6ea1d229583fbb", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 3bde407..bd4960b 100644 --- a/flake.nix +++ b/flake.nix @@ -10,13 +10,14 @@ devShells.${system}.default = pkgs.mkShell rec { name = "quil-env"; buildInputs = [ - pkgs.xorg_sys_opengl - pkgs.xorg.libXxf86vm - pkgs.xwayland pkgs.clojure + + pkgs.libGL + pkgs.libxxf86vm # pkgs.jogl ]; LD_LIBRARY_PATH = "${lib.makeLibraryPath buildInputs}"; + JAVA_OPTS = "-Dawt.useSystemAAFontSettings=lcd"; # wayland compat # see https://discourse.ubuntu.com/t/environment-variables-for-wayland-hackers/12750 From 5937c7d14f1f36473c8cdf6717cfc7b3a9858b6f Mon Sep 17 00:00:00 2001 From: arne Date: Sat, 21 Feb 2026 09:15:57 +0100 Subject: [PATCH 4/4] Fix bug in grid alignment of fourty-one --- src/aphorisms/fourty_one.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aphorisms/fourty_one.clj b/src/aphorisms/fourty_one.clj index 4dc910c..defac0e 100644 --- a/src/aphorisms/fourty_one.clj +++ b/src/aphorisms/fourty_one.clj @@ -30,8 +30,8 @@ (defn as-grid [rect cell-size] (let [n-x (int (/ (g/width rect) cell-size)) n-y (int (/ (g/height rect) cell-size)) - t (v/vec2 (* (mod (g/width rect) n-x) 0.5) - (* (mod (g/height rect) n-x) 0.5))] + t (v/vec2 (* (mod (g/width rect) (* cell-size n-x)) 0.5) + (* (mod (g/height rect) (* cell-size n-x)) 0.5))] (for [x (range n-x) y (range n-y)] (-> (r/rect (* x cell-size) (* y cell-size) cell-size)