From 9abd736f1355ae18ebe643fd0ccdc69ab7de12f7 Mon Sep 17 00:00:00 2001 From: heyarne Date: Sun, 11 Apr 2021 10:51:10 +0200 Subject: [PATCH] Initial commit w/ rudimentary visualization --- .envrc | 13 +++++ .gitignore | 73 ++++++++++++++++++++++++++++ deps.edn | 7 +++ shell.nix | 8 +++ src/heyarne/all_my_friends/core.cljc | 61 +++++++++++++++++++++++ 5 files changed, 162 insertions(+) create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 deps.edn create mode 100644 shell.nix create mode 100644 src/heyarne/all_my_friends/core.cljc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..cb20e39 --- /dev/null +++ b/.envrc @@ -0,0 +1,13 @@ +if type lorri &>/dev/null; then + echo "direnv: using lorri from PATH ($(type -p lorri))" + eval "$(lorri direnv)" +else + # fall back to using direnv's builtin nix support + # to prevent bootstrapping problems. + use nix +fi + +# source an additional user-specific .envrc in ./.envrc-local +if [ -e .envrc-local ]; then + source .envrc-local +fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1615b60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/clojure,emacs +# Edit at https://www.toptal.com/developers/gitignore?templates=clojure,emacs + +### Clojure ### +pom.xml +pom.xml.asc +*.jar +*.class +/lib/ +/classes/ +/target/ +/checkouts/ +.lein-deps-sum +.lein-repl-history +.lein-plugins/ +.lein-failures +.nrepl-port +.cpcache/ + +### Emacs ### +# -*- mode: gitignore; -*- +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +*.elc +auto-save-list +tramp +.\#* + +# Org-mode +.org-id-locations +*_archive +ltximg/** + +# flymake-mode +*_flymake.* + +# eshell files +/eshell/history +/eshell/lastdir + +# elpa packages +/elpa/ + +# reftex files +*.rel + +# AUCTeX auto folder +/auto/ + +# cask packages +.cask/ +dist/ + +# Flycheck +flycheck_*.el + +# server auth directory +/server/ + +# projectiles files +.projectile + +# directory configuration +.dir-locals.el + +# network security +/network-security.data + + +# End of https://www.toptal.com/developers/gitignore/api/clojure,emacs diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..ed2c2d9 --- /dev/null +++ b/deps.edn @@ -0,0 +1,7 @@ +{:deps {org.clojure/clojure {:mvn/version "1.10.0"} + cheshire/cheshire {:mvn/version "5.1.0"} + camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.2"} + quil/quil {:mvn/version "3.1.0"} + thi.ng/geom {:mvn/version "1.0.0-RC3" + :exclusions [org.jogamp.jogl/jogl-all + org.jogamp.gluegen/gluegen-rt]}}} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..4d7cb30 --- /dev/null +++ b/shell.nix @@ -0,0 +1,8 @@ +with import { }; +mkShell rec { + name = "quil-env"; + buildInputs = with pkgs; [ + xorg_sys_opengl + ]; + LD_LIBRARY_PATH = "${lib.makeLibraryPath buildInputs}"; +} diff --git a/src/heyarne/all_my_friends/core.cljc b/src/heyarne/all_my_friends/core.cljc new file mode 100644 index 0000000..007fc67 --- /dev/null +++ b/src/heyarne/all_my_friends/core.cljc @@ -0,0 +1,61 @@ +(ns heyarne.all-my-friends.core + (:require [quil.core :as q] + [quil.middlewares.pause-on-error :refer [pause-on-error]] + [camel-snake-kebab.core :refer [->kebab-case]] + [cheshire.core :as json] + [thi.ng.geom.vector :as v] + [thi.ng.geom.core :as g] + [thi.ng.math.core :as m] + [clojure.java.io :as io] + [clojure.string :as str])) + +;; TODO All PNGs are missing an extension +(def uploads + #?(:clj (->> + (map bean (file-seq (io/file "../uploads"))) + (filter :file) + (remove :hidden) + (sort-by :name) + (partition-by #(first (str/split (:name %) #"\.")))) + :cljs [])) ;; TODO + +(def key-fn (comp keyword ->kebab-case)) + +(defn parse-most-recent [uploads] + (when-let [most-recent (last uploads)] + (let [[_image computational-gaze] most-recent] + #?(:clj + (with-open [rdr (io/reader (:path computational-gaze))] + (json/parse-stream rdr key-fn)) + :cljs nil)))) ;; TODO + +(def most-recent (parse-most-recent uploads)) + +;; "most-recent" now contains a seq of all faces detected in the most recently +;; uploaded picture + +(defn setup [] + (q/frame-rate 60) + (q/color-mode :hsb)) + +(defn draw [] + (q/clear) + (q/background 40 80 255) + (q/stroke 240 100 255) + (q/stroke-weight 1) + (q/no-fill) + + (doseq [face most-recent + :let [mesh (:mesh face)]] + (doseq [[[x1 y1 z1] pt2] (partition 2 mesh)] + (q/line x1 y1 (+ (q/random -2 2) x1) (+ (q/random -2 2) y1)) + #_(apply q/line pt1 pt2)))) + +#_:clj-kondo/ignore +(q/defsketch all-my-friends + :title "These are all my friends" + :settings #(q/smooth 2) + :middleware [pause-on-error] + :setup setup + :draw draw + :size [500 500])