summaryrefslogtreecommitdiff
path: root/assets/viz/2/quil/middlewares
diff options
context:
space:
mode:
authorBrian Picciano <mediocregopher@gmail.com>2018-11-12 16:18:45 -0500
committerBrian Picciano <mediocregopher@gmail.com>2018-11-12 16:18:45 -0500
commit5ed62d23b4bbbf7717de4adfa0eaf2af19365408 (patch)
treeaa3285b40f9905e45b33f61b77afa06a0d33a790 /assets/viz/2/quil/middlewares
parent886684ec4c0a3d032a974ae8b8e29fb0e0632125 (diff)
add viz 2 post
Diffstat (limited to 'assets/viz/2/quil/middlewares')
-rw-r--r--assets/viz/2/quil/middlewares/deprecated_options.cljc26
-rw-r--r--assets/viz/2/quil/middlewares/deprecated_options.cljc.cache.edn1
-rw-r--r--assets/viz/2/quil/middlewares/deprecated_options.js95
-rw-r--r--assets/viz/2/quil/middlewares/deprecated_options.js.map1
-rw-r--r--assets/viz/2/quil/middlewares/fun_mode.cljc78
-rw-r--r--assets/viz/2/quil/middlewares/fun_mode.cljc.cache.edn1
-rw-r--r--assets/viz/2/quil/middlewares/fun_mode.js155
-rw-r--r--assets/viz/2/quil/middlewares/fun_mode.js.map1
-rw-r--r--assets/viz/2/quil/middlewares/navigation_2d.cljc89
-rw-r--r--assets/viz/2/quil/middlewares/navigation_2d.cljc.cache.edn1
-rw-r--r--assets/viz/2/quil/middlewares/navigation_2d.js116
-rw-r--r--assets/viz/2/quil/middlewares/navigation_2d.js.map1
-rw-r--r--assets/viz/2/quil/middlewares/navigation_3d.cljc188
-rw-r--r--assets/viz/2/quil/middlewares/navigation_3d.cljc.cache.edn1
-rw-r--r--assets/viz/2/quil/middlewares/navigation_3d.js261
-rw-r--r--assets/viz/2/quil/middlewares/navigation_3d.js.map1
16 files changed, 1016 insertions, 0 deletions
diff --git a/assets/viz/2/quil/middlewares/deprecated_options.cljc b/assets/viz/2/quil/middlewares/deprecated_options.cljc
new file mode 100644
index 0000000..6ed40d2
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/deprecated_options.cljc
@@ -0,0 +1,26 @@
+(ns quil.middlewares.deprecated-options)
+
+(def ^:private deprecated
+ {:decor ["2.0" "Try :features [:present] for similar effect"]
+ :target ["2.0" "Use :features [:keep-on-top] instead."]
+ :safe-draw-fn ["2.0" "Use :features [:no-safe-fns] instead."]})
+
+(defn- check-features-vector [features]
+ (let [features (set features)]
+ (when (features :no-safe-draw)
+ (println "Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1."
+ "Use :feature [:no-safe-fns] now."))
+ (disj features :no-safe-draw)))
+
+(defn deprecated-options
+ "Checks if options map contains deprected options and removes them.
+ Prints messages how to fix deprecated functions."
+ [options]
+ (let [options (update-in options [:features] check-features-vector)]
+ (->> (for [[name value] options]
+ (if-let [[version message] (deprecated name)]
+ (do (println name "option was removed in Quil" version "." message)
+ nil)
+ [name value]))
+ (remove nil?)
+ (into {}))))
diff --git a/assets/viz/2/quil/middlewares/deprecated_options.cljc.cache.edn b/assets/viz/2/quil/middlewares/deprecated_options.cljc.cache.edn
new file mode 100644
index 0000000..0af4bd9
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/deprecated_options.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :use-macros {}, :excludes #{}, :name quil.middlewares.deprecated-options, :imports nil, :requires nil, :uses nil, :defs {deprecated {:name quil.middlewares.deprecated-options/deprecated, :file "out/quil/middlewares/deprecated_options.cljc", :line 3, :column 1, :end-line 3, :end-column 26, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 3, :column 16, :end-line 3, :end-column 26, :private true}, :tag cljs.core/IMap}, check-features-vector {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 8, :column 8, :end-line 8, :end-column 29, :private true, :arglists (quote ([features]))}, :private true, :name quil.middlewares.deprecated-options/check-features-vector, :variadic false, :file "out/quil/middlewares/deprecated_options.cljc", :end-column 29, :method-params ([features]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 8, :end-line 8, :max-fixed-arity 1, :fn-var true, :arglists (quote ([features]))}, deprecated-options {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/deprecated_options.cljc", :line 15, :column 7, :end-line 15, :end-column 25, :arglists (quote ([options])), :doc "Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."}, :name quil.middlewares.deprecated-options/deprecated-options, :variadic false, :file "out/quil/middlewares/deprecated_options.cljc", :end-column 25, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 15, :end-line 15, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Checks if options map contains deprected options and removes them.\n Prints messages how to fix deprecated functions."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:features :decor :safe-draw-fn :no-safe-draw :target}, :order [:decor :target :safe-draw-fn :no-safe-draw :features]}, :doc nil} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/deprecated_options.js b/assets/viz/2/quil/middlewares/deprecated_options.js
new file mode 100644
index 0000000..2ac66e3
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/deprecated_options.js
@@ -0,0 +1,95 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.deprecated_options');
+goog.require('cljs.core');
+quil.middlewares.deprecated_options.deprecated = new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"decor","decor",-1730969431),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Try :features [:present] for similar effect"], null),new cljs.core.Keyword(null,"target","target",253001721),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:keep-on-top] instead."], null),new cljs.core.Keyword(null,"safe-draw-fn","safe-draw-fn",1454900202),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, ["2.0","Use :features [:no-safe-fns] instead."], null)], null);
+quil.middlewares.deprecated_options.check_features_vector = (function quil$middlewares$deprecated_options$check_features_vector(features){
+var features__$1 = cljs.core.set.call(null,features);
+if(cljs.core.truth_(features__$1.call(null,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157)))){
+cljs.core.println.call(null,"Feature :no-safe-draw was renamed to :no-safe-fns in Quil 2.1.","Use :feature [:no-safe-fns] now.");
+} else {
+}
+
+return cljs.core.disj.call(null,features__$1,new cljs.core.Keyword(null,"no-safe-draw","no-safe-draw",-1157778157));
+});
+/**
+ * Checks if options map contains deprected options and removes them.
+ * Prints messages how to fix deprecated functions.
+ */
+quil.middlewares.deprecated_options.deprecated_options = (function quil$middlewares$deprecated_options$deprecated_options(options){
+var options__$1 = cljs.core.update_in.call(null,options,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"features","features",-1146962336)], null),quil.middlewares.deprecated_options.check_features_vector);
+return cljs.core.into.call(null,cljs.core.PersistentArrayMap.EMPTY,cljs.core.remove.call(null,cljs.core.nil_QMARK_,(function (){var iter__7602__auto__ = ((function (options__$1){
+return (function quil$middlewares$deprecated_options$deprecated_options_$_iter__8043(s__8044){
+return (new cljs.core.LazySeq(null,((function (options__$1){
+return (function (){
+var s__8044__$1 = s__8044;
+while(true){
+var temp__4657__auto__ = cljs.core.seq.call(null,s__8044__$1);
+if(temp__4657__auto__){
+var s__8044__$2 = temp__4657__auto__;
+if(cljs.core.chunked_seq_QMARK_.call(null,s__8044__$2)){
+var c__7600__auto__ = cljs.core.chunk_first.call(null,s__8044__$2);
+var size__7601__auto__ = cljs.core.count.call(null,c__7600__auto__);
+var b__8046 = cljs.core.chunk_buffer.call(null,size__7601__auto__);
+if((function (){var i__8045 = (0);
+while(true){
+if((i__8045 < size__7601__auto__)){
+var vec__8059 = cljs.core._nth.call(null,c__7600__auto__,i__8045);
+var name = cljs.core.nth.call(null,vec__8059,(0),null);
+var value = cljs.core.nth.call(null,vec__8059,(1),null);
+cljs.core.chunk_append.call(null,b__8046,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__8062 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__8062,(0),null);
+var message = cljs.core.nth.call(null,vec__8062,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})());
+
+var G__8071 = (i__8045 + (1));
+i__8045 = G__8071;
+continue;
+} else {
+return true;
+}
+break;
+}
+})()){
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__8046),quil$middlewares$deprecated_options$deprecated_options_$_iter__8043.call(null,cljs.core.chunk_rest.call(null,s__8044__$2)));
+} else {
+return cljs.core.chunk_cons.call(null,cljs.core.chunk.call(null,b__8046),null);
+}
+} else {
+var vec__8065 = cljs.core.first.call(null,s__8044__$2);
+var name = cljs.core.nth.call(null,vec__8065,(0),null);
+var value = cljs.core.nth.call(null,vec__8065,(1),null);
+return cljs.core.cons.call(null,(function (){var temp__4655__auto__ = quil.middlewares.deprecated_options.deprecated.call(null,name);
+if(cljs.core.truth_(temp__4655__auto__)){
+var vec__8068 = temp__4655__auto__;
+var version = cljs.core.nth.call(null,vec__8068,(0),null);
+var message = cljs.core.nth.call(null,vec__8068,(1),null);
+cljs.core.println.call(null,name,"option was removed in Quil",version,".",message);
+
+return null;
+} else {
+return new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [name,value], null);
+}
+})(),quil$middlewares$deprecated_options$deprecated_options_$_iter__8043.call(null,cljs.core.rest.call(null,s__8044__$2)));
+}
+} else {
+return null;
+}
+break;
+}
+});})(options__$1))
+,null,null));
+});})(options__$1))
+;
+return iter__7602__auto__.call(null,options__$1);
+})()));
+});
+
+//# sourceMappingURL=deprecated_options.js.map \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/deprecated_options.js.map b/assets/viz/2/quil/middlewares/deprecated_options.js.map
new file mode 100644
index 0000000..90fab0a
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/deprecated_options.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/deprecated_options.js","sources":["deprecated_options.cljc"],"lineCount":95,"mappings":";AAAA;;AAEA,iDAAA,2CAAA,wDAAA,mFAAA,MAAA,sDAAA,wDAAA,mFAAA,MAAA,gDAAA,qEAAA,mFAAA,MAAA,loBAAeA;AAKf,4DAAA,5DAAOC,gIAAuBC;AAA9B,AACE,IAAMA,eAAS,AAACC,wBAAID;AAApB,AACE,oBAAM,uBAAA,vBAACA;AAAP,AACE,4BAAA,iEAAA,7FAACE;;AADH;;AAGA,6CAAA,tCAACC,yBAAKH;;AAEV;;;;yDAAA,zDAAMI,0HAGHC;AAHH,AAIE,IAAMA,cAAQ,sCAAA,mFAAA,zHAACC,8BAAUD,iKAAoBN;AAA7C,mHACO,iBAAAQ,qBAAA,tFAKA,AAAC+B,2BAAOC,9FACR,gCAAA,zBAACC;qFANDhC;AAAA,AAAA,YAAAC,kBAAA,KAAA;;AAAA,AAAA,IAAAD,cAAAA;;AAAA,AAAA,IAAAE,qBAAA,AAAAC,wBAAAH;AAAA,AAAA,GAAAE;AAAA,AAAA,IAAAF,cAAAE;AAAA,AAAA,GAAA,AAAAE,uCAAAJ;AAAA,IAAAK,kBAqwE0C,AAAA4B,gCAAAjC;IArwE1CM,qBAAA,AAAAC,0BAAAF;IAAAG,UAAA,AAAAC,iCAAAH;AAAA,AAAA,GAAA,AAAA,iBAAAI,UAAA;;AAAA,AAAA,GAAA,CAAAA,UAAAJ;AAAA,IAAAK,YAAA,AAAAC,yBAAAP,gBAAAK;WAAA,AAAAG,wBAAAF,UAAA,IAAA,7CAAOY;YAAP,AAAAV,wBAAAF,UAAA,IAAA,9CAAYa;AAAZ,AAAA,AAAA,AAAAV,iCAAAN,QACE,iBAAAiB,qBAA2B,AAACnC,yDAAWiC;AAAvC,AAAA,oBAAAE;AAAA,IAAAC,YAAAD;cAAA,AAAAZ,wBAAAa,UAAA,IAAA,hDAAUE;cAAV,AAAAf,wBAAAa,UAAA,IAAA,hDAAkBG;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAACnC,4BAAQ6B,kCAAkCK,YAAYC;;AAA3D;;AADF,0FAGGN,KAAKC;;;;AAJV,cAAA,CAAAd,UAAA;;;;AAAA;;;;;AAAA,OAAAK,+BAAA,AAAAC,0BAAAR,SAAA,AAAAS,8EAAA,AAAAC,+BAAAlB;;AAAA,OAAAe,+BAAA,AAAAC,0BAAAR,SAAA;;;AAAA,IAAAW,YAAA,AAAAC,0BAAApB;WAAA,AAAAa,wBAAAM,UAAA,IAAA,7CAAOI;YAAP,AAAAV,wBAAAM,UAAA,IAAA,9CAAYK;AAAZ,AAAA,OAAAH,yBACE,iBAAAI,qBAA2B,AAACnC,yDAAWiC;AAAvC,AAAA,oBAAAE;AAAA,IAAAE,YAAAF;cAAA,AAAAZ,wBAAAc,UAAA,IAAA,hDAAUC;cAAV,AAAAf,wBAAAc,UAAA,IAAA,hDAAkBE;AAAlB,AACE,AAAI,iCAAA,qCAAA,tEAACnC,4BAAQ6B,kCAAkCK,YAAYC;;AAA3D;;AADF,0FAGGN,KAAKC;;KAJV,AAAAP,8EAAA,AAAAK,yBAAAtB;;;AAAA;;;;;CAAA,KAAA;;;AAAA,AAAA,OAAAD,6BAAmBF","names":["quil.middlewares.deprecated-options\/deprecated","quil.middlewares.deprecated-options\/check-features-vector","features","cljs.core\/set","cljs.core\/println","cljs.core\/disj","quil.middlewares.deprecated-options\/deprecated-options","options","cljs.core\/update-in","iter__7602__auto__","s__8044","cljs.core\/LazySeq","temp__4657__auto__","cljs.core\/seq","cljs.core\/chunked-seq?","c__7600__auto__","size__7601__auto__","cljs.core\/count","b__8046","cljs.core\/chunk-buffer","i__8045","vec__8059","cljs.core\/-nth","cljs.core\/nth","cljs.core\/chunk-append","cljs.core\/chunk-cons","cljs.core\/chunk","iter__8043","cljs.core\/chunk-rest","vec__8065","cljs.core\/first","cljs.core\/cons","cljs.core\/rest","name","value","temp__4655__auto__","vec__8062","vec__8068","version","message","cljs.core\/remove","cljs.core\/nil?","cljs.core\/into","cljs.core\/chunk-first"]} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/fun_mode.cljc b/assets/viz/2/quil/middlewares/fun_mode.cljc
new file mode 100644
index 0000000..14330c7
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/fun_mode.cljc
@@ -0,0 +1,78 @@
+(ns quil.middlewares.fun-mode
+ (:require [quil.core :as q]))
+
+(defn- wrap-setup [options]
+ (let [setup (:setup options (fn [] nil))]
+ (assoc options
+ :setup #(reset! (q/state-atom) (setup)))))
+
+(defn- wrap-draw-update [options]
+ (let [draw (:draw options (fn [_]))
+ update (:update options identity)
+ quil-draw #(-> (q/state-atom)
+ (swap! (if (= (q/frame-count) 1)
+ identity
+ update))
+ (draw))]
+ (-> options
+ (dissoc :update)
+ (assoc :draw quil-draw))))
+
+(defn- mouse-event []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)})
+
+(defn- mouse-event-full []
+ {:x (q/mouse-x)
+ :y (q/mouse-y)
+ :button (q/mouse-button)})
+
+(defn- key-event []
+ {:key (q/key-as-keyword)
+ :key-code (q/key-code)
+ :raw-key (q/raw-key)
+ #?@(:clj [:modifiers (q/key-modifiers)])})
+
+(defn- wrap-handler
+ ([options handler-key]
+ (wrap-handler options handler-key nil))
+ ([options handler-key event-fn]
+ (if-let [handler (options handler-key)]
+ (assoc options handler-key
+ (if event-fn
+ #(swap! (q/state-atom) handler (event-fn))
+ #(swap! (q/state-atom) handler)))
+ options)))
+
+(defn- wrap-handlers [options & handlers]
+ (reduce (fn [options handler]
+ (if (keyword? handler)
+ (wrap-handler options handler)
+ (apply wrap-handler options handler)))
+ options handlers))
+
+(defn- wrap-mouse-wheel [options]
+ (if-let [handler (:mouse-wheel options)]
+ (assoc options :mouse-wheel
+ (fn [rotation]
+ (swap! (q/state-atom) handler rotation)))
+ options))
+
+(defn fun-mode
+ "Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ state-aware. Adds support for 'update' function."
+ [options]
+ (-> options
+ wrap-setup
+ wrap-draw-update
+ (wrap-handlers :focus-gained :focus-lost [:mouse-entered mouse-event]
+ [:mouse-exited mouse-event] [:mouse-pressed mouse-event-full]
+ [:mouse-released mouse-event] [:mouse-clicked mouse-event-full]
+ [:mouse-moved (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)})]
+ [:mouse-dragged (fn [] {:x (q/mouse-x) :y (q/mouse-y)
+ :p-x (q/pmouse-x) :p-y (q/pmouse-y)
+ :button (q/mouse-button)})]
+ [:key-pressed key-event] :key-released [:key-typed key-event]
+ :on-close)
+ wrap-mouse-wheel))
diff --git a/assets/viz/2/quil/middlewares/fun_mode.cljc.cache.edn b/assets/viz/2/quil/middlewares/fun_mode.cljc.cache.edn
new file mode 100644
index 0000000..bde2282
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/fun_mode.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.fun-mode, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {wrap-setup {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 4, :column 8, :end-line 4, :end-column 18, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-setup, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 18, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 4, :end-line 4, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, wrap-draw-update {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 9, :column 8, :end-line 9, :end-column 24, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-draw-update, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, mouse-event {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 21, :column 8, :end-line 21, :end-column 19, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/mouse-event, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 19, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 21, :end-line 21, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, mouse-event-full {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 25, :column 8, :end-line 25, :end-column 24, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/mouse-event-full, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 25, :end-line 25, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, key-event {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 30, :column 8, :end-line 30, :end-column 17, :private true, :arglists (quote ([]))}, :private true, :name quil.middlewares.fun-mode/key-event, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 17, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 30, :end-line 30, :max-fixed-arity 0, :fn-var true, :arglists (quote ([]))}, wrap-handler {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 36, :column 8, :end-line 36, :end-column 20, :private true, :arglists (quote ([options handler-key] [options handler-key event-fn])), :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([options handler-key] [options handler-key event-fn]), :arglists ([options handler-key] [options handler-key event-fn]), :arglists-meta (nil nil)}}, :private true, :name quil.middlewares.fun-mode/wrap-handler, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 20, :top-fn {:variadic false, :max-fixed-arity 3, :method-params ([options handler-key] [options handler-key event-fn]), :arglists ([options handler-key] [options handler-key event-fn]), :arglists-meta (nil nil)}, :method-params ([options handler-key] [options handler-key event-fn]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 36, :end-line 36, :max-fixed-arity 3, :fn-var true, :arglists ([options handler-key] [options handler-key event-fn])}, wrap-handlers {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 47, :column 8, :end-line 47, :end-column 21, :private true, :arglists (quote ([options & handlers])), :top-fn {:variadic true, :max-fixed-arity 1, :method-params [(options handlers)], :arglists ([options & handlers]), :arglists-meta (nil)}}, :private true, :name quil.middlewares.fun-mode/wrap-handlers, :variadic true, :file "out/quil/middlewares/fun_mode.cljc", :end-column 21, :top-fn {:variadic true, :max-fixed-arity 1, :method-params [(options handlers)], :arglists ([options & handlers]), :arglists-meta (nil)}, :method-params [(options handlers)], :protocol-impl nil, :arglists-meta (nil), :column 1, :line 47, :end-line 47, :max-fixed-arity 1, :fn-var true, :arglists ([options & handlers])}, wrap-mouse-wheel {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 54, :column 8, :end-line 54, :end-column 24, :private true, :arglists (quote ([options]))}, :private true, :name quil.middlewares.fun-mode/wrap-mouse-wheel, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 24, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 54, :end-line 54, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options]))}, fun-mode {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/fun_mode.cljc", :line 61, :column 7, :end-line 61, :end-column 15, :arglists (quote ([options])), :doc "Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."}, :name quil.middlewares.fun-mode/fun-mode, :variadic false, :file "out/quil/middlewares/fun_mode.cljc", :end-column 15, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 61, :end-line 61, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Introduces function mode making all handlers (setup, draw, mouse-click, etc)\n state-aware. Adds support for 'update' function."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:y :key-code :p-y :key-typed :mouse-clicked :mouse-released :mouse-exited :key :on-close :button :mouse-wheel :mouse-moved :update :setup :mouse-pressed :focus-gained :mouse-entered :focus-lost :key-pressed :key-released :p-x :x :raw-key :draw :mouse-dragged}, :order [:setup :draw :update :x :y :button :key :key-code :raw-key :mouse-wheel :focus-gained :focus-lost :mouse-entered :mouse-exited :mouse-pressed :mouse-released :mouse-clicked :mouse-moved :p-x :p-y :mouse-dragged :key-pressed :key-released :key-typed :on-close]}, :doc nil} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/fun_mode.js b/assets/viz/2/quil/middlewares/fun_mode.js
new file mode 100644
index 0000000..73285ea
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/fun_mode.js
@@ -0,0 +1,155 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.fun_mode');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.fun_mode.wrap_setup = (function quil$middlewares$fun_mode$wrap_setup(options){
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,(function (){
+return null;
+}));
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),((function (setup){
+return (function (){
+return cljs.core.reset_BANG_.call(null,quil.core.state_atom.call(null),setup.call(null));
+});})(setup))
+);
+});
+quil.middlewares.fun_mode.wrap_draw_update = (function quil$middlewares$fun_mode$wrap_draw_update(options){
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,(function (_){
+return null;
+}));
+var update = new cljs.core.Keyword(null,"update","update",1045576396).cljs$core$IFn$_invoke$arity$2(options,cljs.core.identity);
+var quil_draw = ((function (draw,update){
+return (function (){
+return draw.call(null,cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),((cljs.core._EQ_.call(null,quil.core.frame_count.call(null),(1)))?cljs.core.identity:update)));
+});})(draw,update))
+;
+return cljs.core.assoc.call(null,cljs.core.dissoc.call(null,options,new cljs.core.Keyword(null,"update","update",1045576396)),new cljs.core.Keyword(null,"draw","draw",1358331674),quil_draw);
+});
+quil.middlewares.fun_mode.mouse_event = (function quil$middlewares$fun_mode$mouse_event(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null)], null);
+});
+quil.middlewares.fun_mode.mouse_event_full = (function quil$middlewares$fun_mode$mouse_event_full(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+});
+quil.middlewares.fun_mode.key_event = (function quil$middlewares$fun_mode$key_event(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"key","key",-1516042587),quil.core.key_as_keyword.call(null),new cljs.core.Keyword(null,"key-code","key-code",-1732114304),quil.core.key_code.call(null),new cljs.core.Keyword(null,"raw-key","raw-key",-162482279),quil.core.raw_key.call(null)], null);
+});
+quil.middlewares.fun_mode.wrap_handler = (function quil$middlewares$fun_mode$wrap_handler(var_args){
+var args9436 = [];
+var len__7927__auto___9439 = arguments.length;
+var i__7928__auto___9440 = (0);
+while(true){
+if((i__7928__auto___9440 < len__7927__auto___9439)){
+args9436.push((arguments[i__7928__auto___9440]));
+
+var G__9441 = (i__7928__auto___9440 + (1));
+i__7928__auto___9440 = G__9441;
+continue;
+} else {
+}
+break;
+}
+
+var G__9438 = args9436.length;
+switch (G__9438) {
+case 2:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2((arguments[(0)]),(arguments[(1)]));
+
+break;
+case 3:
+return quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3((arguments[(0)]),(arguments[(1)]),(arguments[(2)]));
+
+break;
+default:
+throw (new Error([cljs.core.str.cljs$core$IFn$_invoke$arity$1("Invalid arity: "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(args9436.length)].join('')));
+
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$2 = (function (options,handler_key){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options,handler_key,null);
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$core$IFn$_invoke$arity$3 = (function (options,handler_key,event_fn){
+var temp__4655__auto__ = options.call(null,handler_key);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,handler_key,(cljs.core.truth_(event_fn)?((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,event_fn.call(null));
+});})(handler,temp__4655__auto__))
+:((function (handler,temp__4655__auto__){
+return (function (){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler);
+});})(handler,temp__4655__auto__))
+));
+} else {
+return options;
+}
+});
+
+quil.middlewares.fun_mode.wrap_handler.cljs$lang$maxFixedArity = 3;
+
+quil.middlewares.fun_mode.wrap_handlers = (function quil$middlewares$fun_mode$wrap_handlers(var_args){
+var args__7934__auto__ = [];
+var len__7927__auto___9445 = arguments.length;
+var i__7928__auto___9446 = (0);
+while(true){
+if((i__7928__auto___9446 < len__7927__auto___9445)){
+args__7934__auto__.push((arguments[i__7928__auto___9446]));
+
+var G__9447 = (i__7928__auto___9446 + (1));
+i__7928__auto___9446 = G__9447;
+continue;
+} else {
+}
+break;
+}
+
+var argseq__7935__auto__ = ((((1) < args__7934__auto__.length))?(new cljs.core.IndexedSeq(args__7934__auto__.slice((1)),(0),null)):null);
+return quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic((arguments[(0)]),argseq__7935__auto__);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic = (function (options,handlers){
+return cljs.core.reduce.call(null,(function (options__$1,handler){
+if((handler instanceof cljs.core.Keyword)){
+return quil.middlewares.fun_mode.wrap_handler.call(null,options__$1,handler);
+} else {
+return cljs.core.apply.call(null,quil.middlewares.fun_mode.wrap_handler,options__$1,handler);
+}
+}),options,handlers);
+});
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$maxFixedArity = (1);
+
+quil.middlewares.fun_mode.wrap_handlers.cljs$lang$applyTo = (function (seq9443){
+var G__9444 = cljs.core.first.call(null,seq9443);
+var seq9443__$1 = cljs.core.next.call(null,seq9443);
+return quil.middlewares.fun_mode.wrap_handlers.cljs$core$IFn$_invoke$arity$variadic(G__9444,seq9443__$1);
+});
+
+quil.middlewares.fun_mode.wrap_mouse_wheel = (function quil$middlewares$fun_mode$wrap_mouse_wheel(options){
+var temp__4655__auto__ = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$1(options);
+if(cljs.core.truth_(temp__4655__auto__)){
+var handler = temp__4655__auto__;
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (handler,temp__4655__auto__){
+return (function (rotation){
+return cljs.core.swap_BANG_.call(null,quil.core.state_atom.call(null),handler,rotation);
+});})(handler,temp__4655__auto__))
+);
+} else {
+return options;
+}
+});
+/**
+ * Introduces function mode making all handlers (setup, draw, mouse-click, etc)
+ * state-aware. Adds support for 'update' function.
+ */
+quil.middlewares.fun_mode.fun_mode = (function quil$middlewares$fun_mode$fun_mode(options){
+return quil.middlewares.fun_mode.wrap_mouse_wheel.call(null,quil.middlewares.fun_mode.wrap_handlers.call(null,quil.middlewares.fun_mode.wrap_draw_update.call(null,quil.middlewares.fun_mode.wrap_setup.call(null,options)),new cljs.core.Keyword(null,"focus-gained","focus-gained",-857086384),new cljs.core.Keyword(null,"focus-lost","focus-lost",-554849613),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-entered","mouse-entered",811350322),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-exited","mouse-exited",-483205244),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-pressed","mouse-pressed",736955536),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-released","mouse-released",-664480061),quil.middlewares.fun_mode.mouse_event], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-clicked","mouse-clicked",-199339421),quil.middlewares.fun_mode.mouse_event_full], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-moved","mouse-moved",-1918152310),(function (){
+return new cljs.core.PersistentArrayMap(null, 4, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),(function (){
+return new cljs.core.PersistentArrayMap(null, 5, [new cljs.core.Keyword(null,"x","x",2099068185),quil.core.mouse_x.call(null),new cljs.core.Keyword(null,"y","y",-1757859776),quil.core.mouse_y.call(null),new cljs.core.Keyword(null,"p-x","p-x",-1721211211),quil.core.pmouse_x.call(null),new cljs.core.Keyword(null,"p-y","p-y",-530704830),quil.core.pmouse_y.call(null),new cljs.core.Keyword(null,"button","button",1456579943),quil.core.mouse_button.call(null)], null);
+})], null),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"key-released","key-released",215919828),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"key-typed","key-typed",-876037597),quil.middlewares.fun_mode.key_event], null),new cljs.core.Keyword(null,"on-close","on-close",-761178394)));
+});
+
+//# sourceMappingURL=fun_mode.js.map \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/fun_mode.js.map b/assets/viz/2/quil/middlewares/fun_mode.js.map
new file mode 100644
index 0000000..ee748fd
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/fun_mode.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/fun_mode.js","sources":["fun_mode.cljc"],"lineCount":155,"mappings":";AAAA;;;AAGA,uCAAA,vCAAOA,sFAAYC;AAAnB,AACE,IAAMC,QAAM,AAAA,qFAAQD,QAAQ;AAAA,AAAA;;AAA5B,AACE,yCAAA,uDAAA,zFAACE,0BAAMF;;AAAP,AACU,OAACG,gCAAO,AAACC,gCAAc,AAACH;;;;AAEtC,6CAAA,7CAAOI,kGAAkBL;AAAzB,AACE,IAAMM,OAAK,AAAA,mFAAON,QAAQ,WAAKO;AAAL,AAAA;;IACpBC,SAAO,AAAA,uFAASR,QAAQS;gBAD9B,ZAEMC;;AAFN,qDAEqB,AAACN,\/BACD,AAACO,+DAAM,EAAI,0DAAA,1DAACC,yBAAE,AAACC,uCACNJ,mBACAD,1KACT,OAACF;;;AANtB,4DAOMN,3BACA,mCAAA,nCAACc,jCACD,8HAAA,vHAACZ,4KAAYQ;;AAErB,wCAAA,xCAAOK;AAAP,AAAA,kDAAA,4EAAA,7BACM,AAACC,6EACD,AAACC;;AAEP,6CAAA,7CAAOC;AAAP,AAAA,kDAAA,4EAAA,6EAAA,1GACM,AAACF,6EACD,AAACC,sFACI,AAACE;;AAEZ,sCAAA,tCAAOC;AAAP,AAAA,kDAAA,wFAAA,4FAAA,hIACQ,AAACC,kGACI,AAACC,yFACF,AAACC;;AAGb,AAAA,yCAAA,iDAAAC,1FAAOK;AAAP,AAAA,IAAAJ,WAAA;AAAA,AAAA,IAAAC,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAD,cAAA,CAAA,UAAAE;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAC,UAAA,AAAAH;AAAA,AAAA,QAAAG;KAAA;AAAA,OAAAC,qEAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;KAAA;AAAA,OAAAA,qEAAA,CAAA,UAAA,MAAA,CAAA,UAAA,MAAA,CAAA,UAAA;;;;AAAA,MAAA,KAAAC,MAAA,6CAAA,+DAAA,AAAAL;;;;;AAAA,AAAA,uEAAA,vEAAOI,kFACH7B,QAAQ+B;AADZ,AAEK,4EAAA,rEAACF,iDAAa7B,QAAQ+B;;;AAF3B,AAAA,uEAAA,vEAAOF,kFAGH7B,QAAQ+B,YAAYC;AAHxB,AAIK,IAAAC,qBAAiB,AAACjC,kBAAQ+B;AAA1B,AAAA,oBAAAE;AAAA,cAAAA,VAASC;AAAT,AACE,OAAChC,0BAAMF,QAAQ+B,YACR,4BAAA,VAAIC;;AAAJ,AACG,OAACrB,+BAAM,AAACP,gCAAc8B,QAAQ,AAACF;;CADlC;;AAAA,AAEG,OAACrB,+BAAM,AAACP,gCAAc8B;;;;AAChClC;;;;AATP,AAAA,iEAAA,jEAAO6B;;AAAP,AAWA,AAAA,0CAAA,kDAAAL,5FAAOc;AAAP,AAAA,IAAAH,qBAAA;AAAA,AAAA,IAAAT,yBAAA,AAAA;AAAA,AAAA,IAAAC,uBAAA;;AAAA,AAAA,GAAA,CAAAA,uBAAAD;AAAA,AAAA,AAAAS,wBAAA,CAAA,UAAAR;;AAAA,cAAA,CAAAA,uBAAA;;;;AAAA;;;;AAAA,IAAAS,uBAAA,EAAA,CAAA,MAAA,AAAAD,4BAAA,AAAA,KAAAE,qBAAA,AAAAF,yBAAA,KAAA,IAAA,OAAA;AAAA,AAAA,OAAAG,6EAAA,CAAA,UAAA,MAAAF;;;AAAA,AAAA,AAAA,AAAAE,+EAAA,WAAsBtC,QAAU2C;AAAhC,AACE,OAACC,2BAAO,WAAK5C,YAAQkC;AAAb,AACE,GAAI,oBAAAW,nBAAUX;AACZ,OAACL,iDAAa7B,YAAQkC;;AACtB,OAACY,0BAAMjB,uCAAa7B,YAAQkC;;GAChClC,QAAQ2C;;;AALlB,AAAA,AAAAL,kEAAA;;AAAA,AAAA,AAAAA,4DAAA,WAAAC;AAAA,AAAA,IAAAC,UAAA,AAAAC,0BAAAF;IAAAA,cAAA,AAAAG,yBAAAH;AAAA,AAAA,OAAAD,6EAAAE,QAAAD;;;AAAA,AAOA,6CAAA,7CAAOQ,kGAAkB\/C;AAAzB,AACE,IAAAiC,qBAAiB,AAAA,iGAAcjC;AAA\/B,AAAA,oBAAAiC;AAAA,cAAAA,VAASC;AAAT,AACE,yCAAA,lCAAChC,0BAAMF,2EACA;kBAAKgD;AAAL,AACE,OAACrC,+BAAM,AAACP,gCAAc8B,QAAQc;;;;AACvChD;;;AAEJ;;;;qCAAA,rCAAMiD,kFAGHjD;AAHH,AAIE,kNAAIA,\/CACAD,rDACAM,lDACA,kDAAA,qDAAA,yDAAA,qEAAA,iEAAA,mFAAA,oHAAA,mFAAA,mHAAA,mFAAA,yHAAA,mFAAA,uHAAA,mFAAA,0HAAA,mFAAA,z2CAACiC,+bAAwDvB,sMAC3BA,uMAA6BG,+MAC3BH,wMAA6BG,0MAChC,l+CAO7B6B;AAP6B,AAAA,kDAAA,4EAAA,6EAAA,kFAAA,5LAAW,AAAC\/B,6EAAc,AAACC,iFACd,AAACiC,iFAAiB,AAACC;WAJ7D,mFAAA,wEAK+B;AAAA,AAAA,kDAAA,4EAAA,6EAAA,kFAAA,iFAAA,7QAAW,AAACnC,6EAAc,AAACC,iFACd,AAACiC,iFAAiB,AAACC,uFAChB,AAAChC;WAPhD,mFAAA,+GAAA,oEAAA,mFAAA,2GAAA,9SAQ6BC,kQAAqCA","names":["quil.middlewares.fun-mode\/wrap-setup","options","setup","cljs.core\/assoc","cljs.core\/reset!","quil.core\/state-atom","quil.middlewares.fun-mode\/wrap-draw-update","draw","_","update","cljs.core\/identity","quil-draw","cljs.core\/swap!","cljs.core\/=","quil.core\/frame-count","cljs.core\/dissoc","quil.middlewares.fun-mode\/mouse-event","quil.core\/mouse-x","quil.core\/mouse-y","quil.middlewares.fun-mode\/mouse-event-full","quil.core\/mouse-button","quil.middlewares.fun-mode\/key-event","quil.core\/key-as-keyword","quil.core\/key-code","quil.core\/raw-key","var_args","args9436","len__7927__auto__","i__7928__auto__","G__9438","quil.middlewares.fun-mode\/wrap-handler","js\/Error","handler-key","event-fn","temp__4655__auto__","handler","args__7934__auto__","argseq__7935__auto__","cljs.core\/IndexedSeq","quil.middlewares.fun-mode\/wrap-handlers","seq9443","G__9444","cljs.core\/first","cljs.core\/next","handlers","cljs.core\/reduce","cljs.core\/Keyword","cljs.core\/apply","quil.middlewares.fun-mode\/wrap-mouse-wheel","rotation","quil.middlewares.fun-mode\/fun-mode","quil.core\/pmouse-x","quil.core\/pmouse-y"]} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_2d.cljc b/assets/viz/2/quil/middlewares/navigation_2d.cljc
new file mode 100644
index 0000000..cd03710
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_2d.cljc
@@ -0,0 +1,89 @@
+(ns quil.middlewares.navigation-2d
+ (:require [quil.core :as q :include-macros true]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-2d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-2d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration: zoom is neutral and central point is
+ width/2, height/2."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)]
+ :zoom 1})
+
+(defn- setup-2d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:position :zoom])
+ (->> (merge (default-position))))]
+ (update-in (user-setup) [:navigation-2d]
+ #(merge initial-state %))))
+
+(defn- mouse-dragged
+ "Changes center of the sketch depending on the last mouse move. Takes
+ zoom into account as well."
+ [state event]
+ (assert-state-has-navigation state)
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:p-y event) (:y event))
+ zoom (-> state :navigation-2d :zoom)]
+ (-> state
+ (update-in [:navigation-2d :position 0] + (/ dx zoom))
+ (update-in [:navigation-2d :position 1] + (/ dy zoom)))))
+
+(defn- mouse-wheel
+ "Changes zoom settings based on scroll."
+ [state event]
+ (assert-state-has-navigation state)
+ (update-in state [:navigation-2d :zoom] * (+ 1 (* -0.1 event))))
+
+(defn- draw
+ "Calls user draw function with necessary all transformations (position
+ and zoom) applied."
+ [user-draw state]
+ (assert-state-has-navigation state)
+ (q/push-matrix)
+ (let [nav-2d (:navigation-2d state)
+ zoom (:zoom nav-2d)
+ pos (:position nav-2d)]
+ (q/scale zoom)
+ (q/with-translation [(- (/ (q/width) 2 zoom) (first pos))
+ (- (/ (q/height) 2 zoom) (second pos))]
+ (user-draw state)))
+ (q/pop-matrix))
+
+(defn navigation-2d
+ "Enables navigation over 2D sketch. Dragging mouse will move center of the
+ skecth and mouse wheel controls zoom."
+ [options]
+ (let [; 2d-navigation related user settings
+ user-settings (:navigation-2d options)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ user-draw (:draw options (fn [state]))
+ user-mouse-dragged (:mouse-dragged options (fn [state _] state))
+ user-mouse-wheel (:mouse-wheel options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-2d-nav setup user-settings)
+
+ :draw (partial draw user-draw)
+
+ :mouse-dragged (fn [state event]
+ (user-mouse-dragged (mouse-dragged state event) event))
+ :mouse-wheel (fn [state event]
+ (user-mouse-wheel (mouse-wheel state event) event)))))
diff --git a/assets/viz/2/quil/middlewares/navigation_2d.cljc.cache.edn b/assets/viz/2/quil/middlewares/navigation_2d.cljc.cache.edn
new file mode 100644
index 0000000..865d7b4
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_2d.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.navigation-2d, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {missing-navigation-key-error {:name quil.middlewares.navigation-2d/missing-navigation-key-error, :file "out/quil/middlewares/navigation_2d.cljc", :line 4, :column 1, :end-line 4, :end-column 44, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 4, :column 16, :end-line 4, :end-column 44, :private true}, :tag any}, assert-state-has-navigation {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 9, :column 8, :end-line 9, :end-column 35, :private true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, :private true, :name quil.middlewares.navigation-2d/assert-state-has-navigation, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 35, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, default-position {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 16, :column 8, :end-line 16, :end-column 24, :private true, :arglists (quote ([])), :doc "Default position configuration: zoom is neutral and central point is\n width/2, height/2."}, :private true, :name quil.middlewares.navigation-2d/default-position, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 16, :end-line 16, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Default position configuration: zoom is neutral and central point is\n width/2, height/2."}, setup-2d-nav {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 24, :column 8, :end-line 24, :end-column 20, :private true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, :private true, :name quil.middlewares.navigation-2d/setup-2d-nav, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 20, :method-params ([user-setup user-settings]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 24, :end-line 24, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, mouse-dragged {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 34, :column 8, :end-line 34, :end-column 21, :private true, :arglists (quote ([state event])), :doc "Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."}, :private true, :name quil.middlewares.navigation-2d/mouse-dragged, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 21, :method-params ([state event]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 34, :end-line 34, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state event])), :doc "Changes center of the sketch depending on the last mouse move. Takes\n zoom into account as well."}, mouse-wheel {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 46, :column 8, :end-line 46, :end-column 19, :private true, :arglists (quote ([state event])), :doc "Changes zoom settings based on scroll."}, :private true, :name quil.middlewares.navigation-2d/mouse-wheel, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 19, :method-params ([state event]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 46, :end-line 46, :max-fixed-arity 2, :fn-var true, :arglists (quote ([state event])), :doc "Changes zoom settings based on scroll."}, draw {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 52, :column 8, :end-line 52, :end-column 12, :private true, :arglists (quote ([user-draw state])), :doc "Calls user draw function with necessary all transformations (position\n and zoom) applied."}, :private true, :name quil.middlewares.navigation-2d/draw, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 12, :method-params ([user-draw state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 52, :end-line 52, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-draw state])), :doc "Calls user draw function with necessary all transformations (position\n and zoom) applied."}, navigation-2d {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_2d.cljc", :line 67, :column 7, :end-line 67, :end-column 20, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."}, :name quil.middlewares.navigation-2d/navigation-2d, :variadic false, :file "out/quil/middlewares/navigation_2d.cljc", :end-column 20, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 67, :end-line 67, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation over 2D sketch. Dragging mouse will move center of the\n skecth and mouse wheel controls zoom."}}, :require-macros {q quil.core, quil.core quil.core}, :cljs.analyzer/constants {:seen #{:y :p-y :zoom :mouse-wheel :setup :p-x :position :x :draw :navigation-2d :mouse-dragged}, :order [:navigation-2d :position :zoom :p-x :x :p-y :y :draw :mouse-dragged :mouse-wheel :setup]}, :doc nil} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_2d.js b/assets/viz/2/quil/middlewares/navigation_2d.js
new file mode 100644
index 0000000..5216b02
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_2d.js
@@ -0,0 +1,116 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.navigation_2d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_2d.missing_navigation_key_error = [cljs.core.str.cljs$core$IFn$_invoke$arity$1("state map is missing :navigation-2d key. "),cljs.core.str.cljs$core$IFn$_invoke$arity$1("Did you accidentally removed it from the state in "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(":update or any other handler?")].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_2d.assert_state_has_navigation = (function quil$middlewares$navigation_2d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_2d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration: zoom is neutral and central point is
+ * width/2, height/2.
+ */
+quil.middlewares.navigation_2d.default_position = (function quil$middlewares$navigation_2d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 2, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0)], null),new cljs.core.Keyword(null,"zoom","zoom",-1827487038),(1)], null);
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_2d.setup_2d_nav = (function quil$middlewares$navigation_2d$setup_2d_nav(user_setup,user_settings){
+var initial_state = cljs.core.merge.call(null,quil.middlewares.navigation_2d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null)));
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611)], null),((function (initial_state){
+return (function (p1__9429_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__9429_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Changes center of the sketch depending on the last mouse move. Takes
+ * zoom into account as well.
+ */
+quil.middlewares.navigation_2d.mouse_dragged = (function quil$middlewares$navigation_2d$mouse_dragged(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event));
+var zoom = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state));
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(0)], null),cljs.core._PLUS_,(dx / zoom)),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"position","position",-2011731912),(1)], null),cljs.core._PLUS_,(dy / zoom));
+});
+/**
+ * Changes zoom settings based on scroll.
+ */
+quil.middlewares.navigation_2d.mouse_wheel = (function quil$middlewares$navigation_2d$mouse_wheel(state,event){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611),new cljs.core.Keyword(null,"zoom","zoom",-1827487038)], null),cljs.core._STAR_,((1) + (-0.1 * event)));
+});
+/**
+ * Calls user draw function with necessary all transformations (position
+ * and zoom) applied.
+ */
+quil.middlewares.navigation_2d.draw = (function quil$middlewares$navigation_2d$draw(user_draw,state){
+quil.middlewares.navigation_2d.assert_state_has_navigation.call(null,state);
+
+quil.core.push_matrix.call(null);
+
+var nav_2d_9430 = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(state);
+var zoom_9431 = new cljs.core.Keyword(null,"zoom","zoom",-1827487038).cljs$core$IFn$_invoke$arity$1(nav_2d_9430);
+var pos_9432 = new cljs.core.Keyword(null,"position","position",-2011731912).cljs$core$IFn$_invoke$arity$1(nav_2d_9430);
+quil.core.scale.call(null,zoom_9431);
+
+var tr__9352__auto___9433 = new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((quil.core.width.call(null) / (2)) / zoom_9431) - cljs.core.first.call(null,pos_9432)),(((quil.core.height.call(null) / (2)) / zoom_9431) - cljs.core.second.call(null,pos_9432))], null);
+quil.core.push_matrix.call(null);
+
+try{quil.core.translate.call(null,tr__9352__auto___9433);
+
+user_draw.call(null,state);
+}finally {quil.core.pop_matrix.call(null);
+}
+return quil.core.pop_matrix.call(null);
+});
+/**
+ * Enables navigation over 2D sketch. Dragging mouse will move center of the
+ * skecth and mouse wheel controls zoom.
+ */
+quil.middlewares.navigation_2d.navigation_2d = (function quil$middlewares$navigation_2d$navigation_2d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-2d","navigation-2d",-1924168611).cljs$core$IFn$_invoke$arity$1(options);
+var user_draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings){
+return (function (state){
+return null;
+});})(user_settings))
+);
+var user_mouse_dragged = new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw))
+);
+var user_mouse_wheel = new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged){
+return (function (state,_){
+return state;
+});})(user_settings,user_draw,user_mouse_dragged))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_2d.setup_2d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),cljs.core.partial.call(null,quil.middlewares.navigation_2d.draw,user_draw),new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_dragged.call(null,quil.middlewares.navigation_2d.mouse_dragged.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+,new cljs.core.Keyword(null,"mouse-wheel","mouse-wheel",1811662439),((function (user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup){
+return (function (state,event){
+return user_mouse_wheel.call(null,quil.middlewares.navigation_2d.mouse_wheel.call(null,state,event),event);
+});})(user_settings,user_draw,user_mouse_dragged,user_mouse_wheel,setup))
+);
+});
+
+//# sourceMappingURL=navigation_2d.js.map \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_2d.js.map b/assets/viz/2/quil/middlewares/navigation_2d.js.map
new file mode 100644
index 0000000..59eb670
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_2d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_2d.js","sources":["navigation_2d.cljc"],"lineCount":116,"mappings":";AAAA;;;AAGA,AAAeA,8DACb,6CAAA,yFAAA,kGAAA;AAIF;;;6DAAA,7DAAOC,kIAEJC;AAFH,AAGE,oBAAU,AAAA,sGAAgBA;AAA1B;;AAAA,AACE,MACgB,KAAAC,MAAWH;;;AAE\/B;;;;kDAAA,lDAAOI;AAAP,AAAA,kDAAA,8DAAA,kKAAA,sDAAA,rIAIc,8BAAA,7BAAG,AAACC,kCACJ,+BAAA,9BAAG,AAACC;;AAGlB;;;;8CAAA,9CAAOC,oGAGJC,WAAWC;AAHd,AAIE,IAAMC,qIAAkBD,hCACA,8CAAA,mFAAA,8DAAA,\/LAACE,rFACI,AAACC,0BAAM,AAACR;AAFrC,AAGE,2DAAA,mFAAA,gFAAA,vNAACU,8BAAU,AAACN;kBAAZK;AAAA,AACY,+CAAAA,xCAACD,0BAAMF;;;;AAEvB;;;;+CAAA,\/CAAOK,sGAGJb,MAAMc;AAHT,AAIE,AAACf,qEAA4BC;;AAC7B,IAAMe,KAAG,CAAG,AAAA,kFAAMD,SAAO,AAAA,6EAAIA;IACvBE,KAAG,CAAG,AAAA,iFAAMF,SAAO,AAAA,8EAAIA;IACvBG,OAAK,AAAA,oFAAA,AAAA,sGAAIjB;AAFf,mEAGKA,9BACA,oCAAA,mFAAA,wEAAA,8DAAA,7PAACY,yQAAuCM,iBAAE,CAAGH,KAAGE,rUAChD,4UAAA,mFAAA,wEAAA,8DAAA,9hBAACL,0iBAAuCM,iBAAE,CAAGF,KAAGC;;AAEvD;;;6CAAA,7CAAOE,kGAEJnB,MAAMc;AAFT,AAGE,AAACf,qEAA4BC;;AAC7B,2CAAA,mFAAA,wEAAA,\/LAACY,8BAAUZ,+NAA6BoB,iBAAE,CAAA,MAAK,CAAA,OAAQN;;AAEzD;;;;sCAAA,tCAAOO,oFAGJC,UAAUtB;AAHb,AAIE,AAACD,qEAA4BC;;AAC7B,AAACuB;;AACD,IAAMC,cAAO,AAAA,sGAAgBxB;IACvBiB,YAAK,AAAA,oFAAOO;IACZC,WAAI,AAAA,4FAAWD;AAFrB,AAGE,AAACE,0BAAQT;;AACT,IAAAU,wBAAA,mFAAqB,CAAG,CAAA,8BAAA,7BAAG,AAACxB,oCAAWc,aAAM,AAACa,0BAAML,WAC\/B,CAAG,CAAA,+BAAA,9BAAG,AAACrB,qCAAYa,aAAM,AAACc,2BAAON;AADtD,AAAA,AAAAF;;AAAA,IAAA,AAAA,AAAAK,8BAAAD;;AAEE,AAACL,oBAAUtB;UAFb,AAAA,AAAA6B;;AAGF,OAACA;;AAEH;;;;+CAAA,\/CAAMG,sGAGHC;AAHH,AAIE,IACM1B,gBAAc,AAAA,sGAAgB0B;IAI9BX,YAAU,AAAA,mFAAOW,QAAQ;kBAAKjC;AAAL,AAAA;;;IACzBkC,qBAAmB,AAAA,sGAAgBD,QAAQ;kBAAKjC,MAAMmC;AAAX,AAAcnC;;;IACzDoC,mBAAiB,AAAA,iGAAcH,QAAQ;kBAAKjC,MAAMmC;AAAX,AAAcnC;;;IACrDqC,QAAM,AAAA,qFAAQJ,QAAQ;;AAAA,AAAA;;;AAR5B,AASE,yCAAA,oJAAA,gIAAA,tTAACK,0BAAML,+DAEE,AAACM,4BAAQlC,4CAAagC,MAAM9B,oEAE7B,AAACgC,4BAAQlB,oCAAKC,mFAEL;kBAAKtB,MAAMc;AAAX,AACE,OAACoB,6BAAmB,AAACrB,uDAAcb,MAAMc,OAAOA;;CAPnE,mEAQe;kBAAKd,MAAMc;AAAX,AACE,OAACsB,2BAAiB,AAACjB,qDAAYnB,MAAMc,OAAOA","names":["quil.middlewares.navigation-2d\/missing-navigation-key-error","quil.middlewares.navigation-2d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-2d\/default-position","quil.core\/width","quil.core\/height","quil.middlewares.navigation-2d\/setup-2d-nav","user-setup","user-settings","initial-state","cljs.core\/select-keys","cljs.core\/merge","p1__9429#","cljs.core\/update-in","quil.middlewares.navigation-2d\/mouse-dragged","event","dx","dy","zoom","cljs.core\/+","quil.middlewares.navigation-2d\/mouse-wheel","cljs.core\/*","quil.middlewares.navigation-2d\/draw","user-draw","quil.core\/push-matrix","nav-2d","pos","quil.core\/scale","tr__9352__auto__","quil.core\/translate","quil.core\/pop-matrix","cljs.core\/first","cljs.core\/second","quil.middlewares.navigation-2d\/navigation-2d","options","user-mouse-dragged","_","user-mouse-wheel","setup","cljs.core\/assoc","cljs.core\/partial"]} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_3d.cljc b/assets/viz/2/quil/middlewares/navigation_3d.cljc
new file mode 100644
index 0000000..3471cfd
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_3d.cljc
@@ -0,0 +1,188 @@
+(ns quil.middlewares.navigation-3d
+ (:require [quil.core :as q]))
+
+(def ^:private missing-navigation-key-error
+ (str "state map is missing :navigation-3d key. "
+ "Did you accidentally removed it from the state in "
+ ":update or any other handler?"))
+
+(defn- assert-state-has-navigation
+ "Asserts that state map contains :navigation-2d object."
+ [state]
+ (when-not (:navigation-3d state)
+ (throw #?(:clj (RuntimeException. missing-navigation-key-error)
+ :cljs (js/Error. missing-navigation-key-error)))))
+
+(defn- default-position
+ "Default position configuration. Check default configuration in
+ 'camera' function."
+ []
+ {:position [(/ (q/width) 2.0)
+ (/ (q/height) 2.0)
+ (/ (q/height) 2.0 (q/tan (/ (* q/PI 60.0) 360.0)))]
+ :straight [0 0 -1]
+ :up [0 1 0]})
+
+(defn- rotate-by-axis-and-angle
+ "Rotates vector v by angle with axis.
+ Formula is taken from wiki:
+ http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"
+ [v axis angle]
+ (let [[a-x a-y a-z] axis
+ [x y z] v
+ cs (q/cos angle)
+ -cs (- 1 cs)
+ sn (q/sin angle)
+ ; Matrix is
+ ; [a b c]
+ ; [d e f]
+ ; [g h i]
+ a (+ cs (* a-x a-x -cs))
+ b (- (* a-x a-y -cs)
+ (* a-z sn))
+ c (+ (* a-x a-z -cs)
+ (* a-y sn))
+ d (+ (* a-x a-y -cs)
+ (* a-z sn))
+ e (+ cs (* a-y a-y -cs))
+ f (- (* a-y a-z -cs)
+ (* a-x sn))
+ g (- (* a-x a-z -cs)
+ (* a-y sn))
+ h (+ (* a-y a-z -cs)
+ (* a-x sn))
+ i (+ cs (* a-z a-z -cs))]
+ [(+ (* a x) (* b y) (* c z))
+ (+ (* d x) (* e y) (* f z))
+ (+ (* g x) (* h y) (* i z))]))
+
+(defn- rotate-lr
+ "Rotates nav-3d configuration left-right. angle positive - rotate right,
+ negative - left."
+ [nav-3d angle]
+ (update-in nav-3d [:straight] rotate-by-axis-and-angle (:up nav-3d) angle))
+
+(defn- cross-product
+ "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"
+ [[u1 u2 u3] [v1 v2 v3]]
+ [(- (* u2 v3) (* u3 v2))
+ (- (* u3 v1) (* u1 v3))
+ (- (* u1 v2) (* u2 v1))])
+
+(defn- v-mult
+ "Multiply vector v by scalar mult."
+ [v mult]
+ (mapv #(* % mult) v))
+
+(defn- v-plus
+ "Sum of 2 vectors."
+ [v1 v2]
+ (mapv + v1 v2))
+
+(defn- v-opposite
+ "Returns vector opposite to vector v."
+ [v]
+ (v-mult v -1))
+
+(defn- v-normalize
+ "Normalize vector, returning vector
+ which has same direction but with norm equals to 1."
+ [v]
+ (let [norm (->> (map q/sq v)
+ (apply +)
+ (q/sqrt))]
+ (v-mult v (/ norm))))
+
+(defn- rotate-ud
+ "Rotates nav-3d configuration up-down."
+ [nav-3d angle]
+ (let [axis (cross-product (:straight nav-3d) (:up nav-3d))
+ rotate #(rotate-by-axis-and-angle % axis angle)]
+ (-> nav-3d
+ (update-in [:straight] rotate)
+ (update-in [:up] rotate))))
+
+(defn- rotate
+ "Mouse handler function which rotates nav-3d configuration.
+ It uses mouse from event object and pixels-in-360 to calculate
+ angles to rotate."
+ [state event pixels-in-360]
+ (assert-state-has-navigation state)
+ (if (= 0 (:p-x event) (:p-y event))
+ state
+ (let [dx (- (:p-x event) (:x event))
+ dy (- (:y event) (:p-y event))
+ angle-lr (q/map-range dx 0 pixels-in-360 0 q/TWO-PI)
+ angle-ud (q/map-range dy 0 pixels-in-360 0 q/TWO-PI)]
+ (update-in state [:navigation-3d]
+ #(-> %
+ (rotate-lr angle-lr)
+ (rotate-ud angle-ud))))))
+
+(def ^:private space (keyword " "))
+
+(defn- move
+ "Keyboard handler function which moves nav-3d configuration.
+ It uses keyboard key from event object to determing in which
+ direction to move."
+ [state event step-size]
+ (assert-state-has-navigation state)
+ (let [{:keys [up straight]} (:navigation-3d state)]
+ (if-let [dir (condp = (:key event)
+ :w straight
+ :s (v-opposite straight)
+ space (v-opposite up)
+ :z up
+ :d (cross-product straight up)
+ :a (cross-product up straight)
+ nil)]
+ (update-in state [:navigation-3d :position]
+ #(v-plus % (v-mult dir step-size)))
+ state)))
+
+(defn- setup-3d-nav
+ "Custom 'setup' function which creates initial position
+ configuration and puts it to the state map."
+ [user-setup user-settings]
+ (let [initial-state (-> user-settings
+ (select-keys [:straight :up :position])
+ (->> (merge (default-position)))
+ (update-in [:straight] v-normalize)
+ (update-in [:up] v-normalize))]
+ (update-in (user-setup) [:navigation-3d]
+ #(merge initial-state %))))
+
+(defn navigation-3d
+ "Enables navigation in 3D space. Similar to how it is done in
+ shooters: WASD navigation, space is go up, z is go down,
+ drag mouse to look around."
+ [options]
+ (let [; 3d-navigation related user settings
+ user-settings (:navigation-3d options)
+ pixels-in-360 (:pixels-in-360 user-settings 1000)
+ step-size (:step-size user-settings 20)
+ rotate-on (:rotate-on user-settings :mouse-dragged)
+
+ ; user-provided handlers which will be overridden
+ ; by 3d-navigation
+ draw (:draw options (fn [state]))
+ key-pressed (:key-pressed options (fn [state _] state))
+ rotate-on-fn (rotate-on options (fn [state _] state))
+ setup (:setup options (fn [] {}))]
+ (assoc options
+
+ :setup (partial setup-3d-nav setup user-settings)
+
+ :draw (fn [state]
+ (assert-state-has-navigation state)
+ (let [{[c-x c-y c-z] :straight
+ [u-x u-y u-z] :up
+ [p-x p-y p-z] :position} (:navigation-3d state)]
+ (q/camera p-x p-y p-z (+ p-x c-x) (+ p-y c-y) (+ p-z c-z) u-x u-y u-z))
+ (draw state))
+
+ :key-pressed (fn [state event]
+ (key-pressed (move state event step-size) event))
+
+ rotate-on (fn [state event]
+ (rotate-on-fn (rotate state event pixels-in-360) event)) )))
diff --git a/assets/viz/2/quil/middlewares/navigation_3d.cljc.cache.edn b/assets/viz/2/quil/middlewares/navigation_3d.cljc.cache.edn
new file mode 100644
index 0000000..ffa4e11
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_3d.cljc.cache.edn
@@ -0,0 +1 @@
+{:rename-macros {}, :renames {}, :externs {Error {}}, :use-macros {}, :excludes #{}, :name quil.middlewares.navigation-3d, :imports nil, :requires {q quil.core, quil.core quil.core}, :uses nil, :defs {missing-navigation-key-error {:name quil.middlewares.navigation-3d/missing-navigation-key-error, :file "out/quil/middlewares/navigation_3d.cljc", :line 4, :column 1, :end-line 4, :end-column 44, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 4, :column 16, :end-line 4, :end-column 44, :private true}, :tag any}, v-normalize {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 87, :column 8, :end-line 87, :end-column 19, :private true, :arglists (quote ([v])), :doc "Normalize vector, returning vector\n which has same direction but with norm equals to 1."}, :private true, :name quil.middlewares.navigation-3d/v-normalize, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 19, :method-params ([v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 87, :end-line 87, :max-fixed-arity 1, :fn-var true, :arglists (quote ([v])), :doc "Normalize vector, returning vector\n which has same direction but with norm equals to 1."}, v-opposite {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 82, :column 8, :end-line 82, :end-column 18, :private true, :arglists (quote ([v])), :doc "Returns vector opposite to vector v."}, :private true, :name quil.middlewares.navigation-3d/v-opposite, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 18, :method-params ([v]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 82, :end-line 82, :max-fixed-arity 1, :fn-var true, :arglists (quote ([v])), :doc "Returns vector opposite to vector v."}, v-plus {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 77, :column 8, :end-line 77, :end-column 14, :private true, :arglists (quote ([v1 v2])), :doc "Sum of 2 vectors."}, :private true, :name quil.middlewares.navigation-3d/v-plus, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([v1 v2]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 77, :end-line 77, :max-fixed-arity 2, :fn-var true, :arglists (quote ([v1 v2])), :doc "Sum of 2 vectors."}, v-mult {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 72, :column 8, :end-line 72, :end-column 14, :private true, :arglists (quote ([v mult])), :doc "Multiply vector v by scalar mult."}, :private true, :name quil.middlewares.navigation-3d/v-mult, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([v mult]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 72, :end-line 72, :max-fixed-arity 2, :fn-var true, :arglists (quote ([v mult])), :doc "Multiply vector v by scalar mult."}, space {:name quil.middlewares.navigation-3d/space, :file "out/quil/middlewares/navigation_3d.cljc", :line 122, :column 1, :end-line 122, :end-column 21, :private true, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 122, :column 16, :end-line 122, :end-column 21, :private true}, :tag any}, setup-3d-nav {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 143, :column 8, :end-line 143, :end-column 20, :private true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, :private true, :name quil.middlewares.navigation-3d/setup-3d-nav, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 20, :method-params ([user-setup user-settings]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 143, :end-line 143, :max-fixed-arity 2, :fn-var true, :arglists (quote ([user-setup user-settings])), :doc "Custom 'setup' function which creates initial position\n configuration and puts it to the state map."}, move {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 124, :column 8, :end-line 124, :end-column 12, :private true, :arglists (quote ([state event step-size])), :doc "Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."}, :private true, :name quil.middlewares.navigation-3d/move, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 12, :method-params ([state event step-size]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 124, :end-line 124, :max-fixed-arity 3, :fn-var true, :arglists (quote ([state event step-size])), :doc "Keyboard handler function which moves nav-3d configuration.\n It uses keyboard key from event object to determing in which\n direction to move."}, rotate-lr {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 59, :column 8, :end-line 59, :end-column 17, :private true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."}, :private true, :name quil.middlewares.navigation-3d/rotate-lr, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 17, :method-params ([nav-3d angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 59, :end-line 59, :max-fixed-arity 2, :fn-var true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration left-right. angle positive - rotate right,\n negative - left."}, cross-product {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 65, :column 8, :end-line 65, :end-column 21, :private true, :arglists (quote ([[u1 u2 u3] [v1 v2 v3]])), :doc "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"}, :private true, :name quil.middlewares.navigation-3d/cross-product, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 21, :method-params ([p__8907 p__8908]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 65, :end-line 65, :max-fixed-arity 2, :fn-var true, :arglists (quote ([[u1 u2 u3] [v1 v2 v3]])), :doc "Vector cross-product: http://en.wikipedia.org/wiki/Cross_product"}, rotate-by-axis-and-angle {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 26, :column 8, :end-line 26, :end-column 32, :private true, :arglists (quote ([v axis angle])), :doc "Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"}, :private true, :name quil.middlewares.navigation-3d/rotate-by-axis-and-angle, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 32, :method-params ([v axis angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 26, :end-line 26, :max-fixed-arity 3, :fn-var true, :arglists (quote ([v axis angle])), :doc "Rotates vector v by angle with axis.\n Formula is taken from wiki:\n http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle"}, assert-state-has-navigation {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 9, :column 8, :end-line 9, :end-column 35, :private true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, :private true, :name quil.middlewares.navigation-3d/assert-state-has-navigation, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 35, :method-params ([state]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 9, :end-line 9, :max-fixed-arity 1, :fn-var true, :arglists (quote ([state])), :doc "Asserts that state map contains :navigation-2d object."}, navigation-3d {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 155, :column 7, :end-line 155, :end-column 20, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."}, :name quil.middlewares.navigation-3d/navigation-3d, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 20, :method-params ([options]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 155, :end-line 155, :max-fixed-arity 1, :fn-var true, :arglists (quote ([options])), :doc "Enables navigation in 3D space. Similar to how it is done in\n shooters: WASD navigation, space is go up, z is go down,\n drag mouse to look around."}, default-position {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 16, :column 8, :end-line 16, :end-column 24, :private true, :arglists (quote ([])), :doc "Default position configuration. Check default configuration in\n 'camera' function."}, :private true, :name quil.middlewares.navigation-3d/default-position, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 24, :method-params ([]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 16, :end-line 16, :max-fixed-arity 0, :fn-var true, :arglists (quote ([])), :doc "Default position configuration. Check default configuration in\n 'camera' function."}, rotate {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 105, :column 8, :end-line 105, :end-column 14, :private true, :arglists (quote ([state event pixels-in-360])), :doc "Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."}, :private true, :name quil.middlewares.navigation-3d/rotate, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 14, :method-params ([state event pixels-in-360]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 105, :end-line 105, :max-fixed-arity 3, :fn-var true, :arglists (quote ([state event pixels-in-360])), :doc "Mouse handler function which rotates nav-3d configuration.\n It uses mouse from event object and pixels-in-360 to calculate\n angles to rotate."}, rotate-ud {:protocol-inline nil, :meta {:file "/home/mediocregopher/src/viz/out/quil/middlewares/navigation_3d.cljc", :line 96, :column 8, :end-line 96, :end-column 17, :private true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration up-down."}, :private true, :name quil.middlewares.navigation-3d/rotate-ud, :variadic false, :file "out/quil/middlewares/navigation_3d.cljc", :end-column 17, :method-params ([nav-3d angle]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 96, :end-line 96, :max-fixed-arity 2, :fn-var true, :arglists (quote ([nav-3d angle])), :doc "Rotates nav-3d configuration up-down."}}, :require-macros nil, :cljs.analyzer/constants {:seen #{:y :pixels-in-360 :p-y :step-size :key :w :s :rotate-on :up :setup :z :straight :key-pressed :p-x :navigation-3d :position :d :x :draw :a :mouse-dragged}, :order [:navigation-3d :position :straight :up :p-x :p-y :x :y :key :w :s :z :d :a :pixels-in-360 :step-size :rotate-on :mouse-dragged :draw :key-pressed :setup]}, :doc nil} \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_3d.js b/assets/viz/2/quil/middlewares/navigation_3d.js
new file mode 100644
index 0000000..54cac9e
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_3d.js
@@ -0,0 +1,261 @@
+// Compiled by ClojureScript 1.9.473 {}
+goog.provide('quil.middlewares.navigation_3d');
+goog.require('cljs.core');
+goog.require('quil.core');
+quil.middlewares.navigation_3d.missing_navigation_key_error = [cljs.core.str.cljs$core$IFn$_invoke$arity$1("state map is missing :navigation-3d key. "),cljs.core.str.cljs$core$IFn$_invoke$arity$1("Did you accidentally removed it from the state in "),cljs.core.str.cljs$core$IFn$_invoke$arity$1(":update or any other handler?")].join('');
+/**
+ * Asserts that state map contains :navigation-2d object.
+ */
+quil.middlewares.navigation_3d.assert_state_has_navigation = (function quil$middlewares$navigation_3d$assert_state_has_navigation(state){
+if(cljs.core.truth_(new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state))){
+return null;
+} else {
+throw (new Error(quil.middlewares.navigation_3d.missing_navigation_key_error));
+}
+});
+/**
+ * Default position configuration. Check default configuration in
+ * 'camera' function.
+ */
+quil.middlewares.navigation_3d.default_position = (function quil$middlewares$navigation_3d$default_position(){
+return new cljs.core.PersistentArrayMap(null, 3, [new cljs.core.Keyword(null,"position","position",-2011731912),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(quil.core.width.call(null) / 2.0),(quil.core.height.call(null) / 2.0),((quil.core.height.call(null) / 2.0) / quil.core.tan.call(null,((quil.core.PI * 60.0) / 360.0)))], null),new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(0),(-1)], null),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(0),(1),(0)], null)], null);
+});
+/**
+ * Rotates vector v by angle with axis.
+ * Formula is taken from wiki:
+ * http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle
+ */
+quil.middlewares.navigation_3d.rotate_by_axis_and_angle = (function quil$middlewares$navigation_3d$rotate_by_axis_and_angle(v,axis,angle){
+var vec__8901 = axis;
+var a_x = cljs.core.nth.call(null,vec__8901,(0),null);
+var a_y = cljs.core.nth.call(null,vec__8901,(1),null);
+var a_z = cljs.core.nth.call(null,vec__8901,(2),null);
+var vec__8904 = v;
+var x = cljs.core.nth.call(null,vec__8904,(0),null);
+var y = cljs.core.nth.call(null,vec__8904,(1),null);
+var z = cljs.core.nth.call(null,vec__8904,(2),null);
+var cs = quil.core.cos.call(null,angle);
+var _cs = ((1) - cs);
+var sn = quil.core.sin.call(null,angle);
+var a = (cs + ((a_x * a_x) * _cs));
+var b = (((a_x * a_y) * _cs) - (a_z * sn));
+var c = (((a_x * a_z) * _cs) + (a_y * sn));
+var d = (((a_x * a_y) * _cs) + (a_z * sn));
+var e = (cs + ((a_y * a_y) * _cs));
+var f = (((a_y * a_z) * _cs) - (a_x * sn));
+var g = (((a_x * a_z) * _cs) - (a_y * sn));
+var h = (((a_y * a_z) * _cs) + (a_x * sn));
+var i = (cs + ((a_z * a_z) * _cs));
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [(((a * x) + (b * y)) + (c * z)),(((d * x) + (e * y)) + (f * z)),(((g * x) + (h * y)) + (i * z))], null);
+});
+/**
+ * Rotates nav-3d configuration left-right. angle positive - rotate right,
+ * negative - left.
+ */
+quil.middlewares.navigation_3d.rotate_lr = (function quil$middlewares$navigation_3d$rotate_lr(nav_3d,angle){
+return cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.rotate_by_axis_and_angle,new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d),angle);
+});
+/**
+ * Vector cross-product: http://en.wikipedia.org/wiki/Cross_product
+ */
+quil.middlewares.navigation_3d.cross_product = (function quil$middlewares$navigation_3d$cross_product(p__8907,p__8908){
+var vec__8915 = p__8907;
+var u1 = cljs.core.nth.call(null,vec__8915,(0),null);
+var u2 = cljs.core.nth.call(null,vec__8915,(1),null);
+var u3 = cljs.core.nth.call(null,vec__8915,(2),null);
+var vec__8918 = p__8908;
+var v1 = cljs.core.nth.call(null,vec__8918,(0),null);
+var v2 = cljs.core.nth.call(null,vec__8918,(1),null);
+var v3 = cljs.core.nth.call(null,vec__8918,(2),null);
+return new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [((u2 * v3) - (u3 * v2)),((u3 * v1) - (u1 * v3)),((u1 * v2) - (u2 * v1))], null);
+});
+/**
+ * Multiply vector v by scalar mult.
+ */
+quil.middlewares.navigation_3d.v_mult = (function quil$middlewares$navigation_3d$v_mult(v,mult){
+return cljs.core.mapv.call(null,(function (p1__8921_SHARP_){
+return (p1__8921_SHARP_ * mult);
+}),v);
+});
+/**
+ * Sum of 2 vectors.
+ */
+quil.middlewares.navigation_3d.v_plus = (function quil$middlewares$navigation_3d$v_plus(v1,v2){
+return cljs.core.mapv.call(null,cljs.core._PLUS_,v1,v2);
+});
+/**
+ * Returns vector opposite to vector v.
+ */
+quil.middlewares.navigation_3d.v_opposite = (function quil$middlewares$navigation_3d$v_opposite(v){
+return quil.middlewares.navigation_3d.v_mult.call(null,v,(-1));
+});
+/**
+ * Normalize vector, returning vector
+ * which has same direction but with norm equals to 1.
+ */
+quil.middlewares.navigation_3d.v_normalize = (function quil$middlewares$navigation_3d$v_normalize(v){
+var norm = quil.core.sqrt.call(null,cljs.core.apply.call(null,cljs.core._PLUS_,cljs.core.map.call(null,quil.core.sq,v)));
+return quil.middlewares.navigation_3d.v_mult.call(null,v,((1) / norm));
+});
+/**
+ * Rotates nav-3d configuration up-down.
+ */
+quil.middlewares.navigation_3d.rotate_ud = (function quil$middlewares$navigation_3d$rotate_ud(nav_3d,angle){
+var axis = quil.middlewares.navigation_3d.cross_product.call(null,new cljs.core.Keyword(null,"straight","straight",-1252567854).cljs$core$IFn$_invoke$arity$1(nav_3d),new cljs.core.Keyword(null,"up","up",-269712113).cljs$core$IFn$_invoke$arity$1(nav_3d));
+var rotate = ((function (axis){
+return (function (p1__8922_SHARP_){
+return quil.middlewares.navigation_3d.rotate_by_axis_and_angle.call(null,p1__8922_SHARP_,axis,angle);
+});})(axis))
+;
+return cljs.core.update_in.call(null,cljs.core.update_in.call(null,nav_3d,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),rotate),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),rotate);
+});
+/**
+ * Mouse handler function which rotates nav-3d configuration.
+ * It uses mouse from event object and pixels-in-360 to calculate
+ * angles to rotate.
+ */
+quil.middlewares.navigation_3d.rotate = (function quil$middlewares$navigation_3d$rotate(state,event,pixels_in_360){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+if(cljs.core._EQ_.call(null,(0),new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event),new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event))){
+return state;
+} else {
+var dx = (new cljs.core.Keyword(null,"p-x","p-x",-1721211211).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"x","x",2099068185).cljs$core$IFn$_invoke$arity$1(event));
+var dy = (new cljs.core.Keyword(null,"y","y",-1757859776).cljs$core$IFn$_invoke$arity$1(event) - new cljs.core.Keyword(null,"p-y","p-y",-530704830).cljs$core$IFn$_invoke$arity$1(event));
+var angle_lr = quil.core.map_range.call(null,dx,(0),pixels_in_360,(0),quil.core.TWO_PI);
+var angle_ud = quil.core.map_range.call(null,dy,(0),pixels_in_360,(0),quil.core.TWO_PI);
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (dx,dy,angle_lr,angle_ud){
+return (function (p1__8923_SHARP_){
+return quil.middlewares.navigation_3d.rotate_ud.call(null,quil.middlewares.navigation_3d.rotate_lr.call(null,p1__8923_SHARP_,angle_lr),angle_ud);
+});})(dx,dy,angle_lr,angle_ud))
+);
+}
+});
+quil.middlewares.navigation_3d.space = cljs.core.keyword.call(null," ");
+/**
+ * Keyboard handler function which moves nav-3d configuration.
+ * It uses keyboard key from event object to determing in which
+ * direction to move.
+ */
+quil.middlewares.navigation_3d.move = (function quil$middlewares$navigation_3d$move(state,event,step_size){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__8930 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__8930__$1 = ((((!((map__8930 == null)))?((((map__8930.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__8930.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__8930):map__8930);
+var up = cljs.core.get.call(null,map__8930__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var straight = cljs.core.get.call(null,map__8930__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var temp__4655__auto__ = (function (){var pred__8932 = cljs.core._EQ_;
+var expr__8933 = new cljs.core.Keyword(null,"key","key",-1516042587).cljs$core$IFn$_invoke$arity$1(event);
+if(cljs.core.truth_(pred__8932.call(null,new cljs.core.Keyword(null,"w","w",354169001),expr__8933))){
+return straight;
+} else {
+if(cljs.core.truth_(pred__8932.call(null,new cljs.core.Keyword(null,"s","s",1705939918),expr__8933))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,straight);
+} else {
+if(cljs.core.truth_(pred__8932.call(null,quil.middlewares.navigation_3d.space,expr__8933))){
+return quil.middlewares.navigation_3d.v_opposite.call(null,up);
+} else {
+if(cljs.core.truth_(pred__8932.call(null,new cljs.core.Keyword(null,"z","z",-789527183),expr__8933))){
+return up;
+} else {
+if(cljs.core.truth_(pred__8932.call(null,new cljs.core.Keyword(null,"d","d",1972142424),expr__8933))){
+return quil.middlewares.navigation_3d.cross_product.call(null,straight,up);
+} else {
+if(cljs.core.truth_(pred__8932.call(null,new cljs.core.Keyword(null,"a","a",-2123407586),expr__8933))){
+return quil.middlewares.navigation_3d.cross_product.call(null,up,straight);
+} else {
+return null;
+}
+}
+}
+}
+}
+}
+})();
+if(cljs.core.truth_(temp__4655__auto__)){
+var dir = temp__4655__auto__;
+return cljs.core.update_in.call(null,state,new cljs.core.PersistentVector(null, 2, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301),new cljs.core.Keyword(null,"position","position",-2011731912)], null),((function (dir,temp__4655__auto__,map__8930,map__8930__$1,up,straight){
+return (function (p1__8924_SHARP_){
+return quil.middlewares.navigation_3d.v_plus.call(null,p1__8924_SHARP_,quil.middlewares.navigation_3d.v_mult.call(null,dir,step_size));
+});})(dir,temp__4655__auto__,map__8930,map__8930__$1,up,straight))
+);
+} else {
+return state;
+}
+});
+/**
+ * Custom 'setup' function which creates initial position
+ * configuration and puts it to the state map.
+ */
+quil.middlewares.navigation_3d.setup_3d_nav = (function quil$middlewares$navigation_3d$setup_3d_nav(user_setup,user_settings){
+var initial_state = cljs.core.update_in.call(null,cljs.core.update_in.call(null,cljs.core.merge.call(null,quil.middlewares.navigation_3d.default_position.call(null),cljs.core.select_keys.call(null,user_settings,new cljs.core.PersistentVector(null, 3, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854),new cljs.core.Keyword(null,"up","up",-269712113),new cljs.core.Keyword(null,"position","position",-2011731912)], null))),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"straight","straight",-1252567854)], null),quil.middlewares.navigation_3d.v_normalize),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"up","up",-269712113)], null),quil.middlewares.navigation_3d.v_normalize);
+return cljs.core.update_in.call(null,user_setup.call(null),new cljs.core.PersistentVector(null, 1, 5, cljs.core.PersistentVector.EMPTY_NODE, [new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301)], null),((function (initial_state){
+return (function (p1__8935_SHARP_){
+return cljs.core.merge.call(null,initial_state,p1__8935_SHARP_);
+});})(initial_state))
+);
+});
+/**
+ * Enables navigation in 3D space. Similar to how it is done in
+ * shooters: WASD navigation, space is go up, z is go down,
+ * drag mouse to look around.
+ */
+quil.middlewares.navigation_3d.navigation_3d = (function quil$middlewares$navigation_3d$navigation_3d(options){
+var user_settings = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(options);
+var pixels_in_360 = new cljs.core.Keyword(null,"pixels-in-360","pixels-in-360",1789567298).cljs$core$IFn$_invoke$arity$2(user_settings,(1000));
+var step_size = new cljs.core.Keyword(null,"step-size","step-size",1545609922).cljs$core$IFn$_invoke$arity$2(user_settings,(20));
+var rotate_on = new cljs.core.Keyword(null,"rotate-on","rotate-on",-1282225937).cljs$core$IFn$_invoke$arity$2(user_settings,new cljs.core.Keyword(null,"mouse-dragged","mouse-dragged",-1220073441));
+var draw = new cljs.core.Keyword(null,"draw","draw",1358331674).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on){
+return (function (state){
+return null;
+});})(user_settings,pixels_in_360,step_size,rotate_on))
+);
+var key_pressed = new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw))
+);
+var rotate_on_fn = rotate_on.call(null,options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed){
+return (function (state,_){
+return state;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed))
+);
+var setup = new cljs.core.Keyword(null,"setup","setup",1987730512).cljs$core$IFn$_invoke$arity$2(options,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn){
+return (function (){
+return cljs.core.PersistentArrayMap.EMPTY;
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn))
+);
+return cljs.core.assoc.call(null,options,new cljs.core.Keyword(null,"setup","setup",1987730512),cljs.core.partial.call(null,quil.middlewares.navigation_3d.setup_3d_nav,setup,user_settings),new cljs.core.Keyword(null,"draw","draw",1358331674),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state){
+quil.middlewares.navigation_3d.assert_state_has_navigation.call(null,state);
+
+var map__8947_8958 = new cljs.core.Keyword(null,"navigation-3d","navigation-3d",682305301).cljs$core$IFn$_invoke$arity$1(state);
+var map__8947_8959__$1 = ((((!((map__8947_8958 == null)))?((((map__8947_8958.cljs$lang$protocol_mask$partition0$ & (64))) || ((cljs.core.PROTOCOL_SENTINEL === map__8947_8958.cljs$core$ISeq$)))?true:false):false))?cljs.core.apply.call(null,cljs.core.hash_map,map__8947_8958):map__8947_8958);
+var vec__8948_8960 = cljs.core.get.call(null,map__8947_8959__$1,new cljs.core.Keyword(null,"straight","straight",-1252567854));
+var c_x_8961 = cljs.core.nth.call(null,vec__8948_8960,(0),null);
+var c_y_8962 = cljs.core.nth.call(null,vec__8948_8960,(1),null);
+var c_z_8963 = cljs.core.nth.call(null,vec__8948_8960,(2),null);
+var vec__8951_8964 = cljs.core.get.call(null,map__8947_8959__$1,new cljs.core.Keyword(null,"up","up",-269712113));
+var u_x_8965 = cljs.core.nth.call(null,vec__8951_8964,(0),null);
+var u_y_8966 = cljs.core.nth.call(null,vec__8951_8964,(1),null);
+var u_z_8967 = cljs.core.nth.call(null,vec__8951_8964,(2),null);
+var vec__8954_8968 = cljs.core.get.call(null,map__8947_8959__$1,new cljs.core.Keyword(null,"position","position",-2011731912));
+var p_x_8969 = cljs.core.nth.call(null,vec__8954_8968,(0),null);
+var p_y_8970 = cljs.core.nth.call(null,vec__8954_8968,(1),null);
+var p_z_8971 = cljs.core.nth.call(null,vec__8954_8968,(2),null);
+quil.core.camera.call(null,p_x_8969,p_y_8970,p_z_8971,(p_x_8969 + c_x_8961),(p_y_8970 + c_y_8962),(p_z_8971 + c_z_8963),u_x_8965,u_y_8966,u_z_8967);
+
+return draw.call(null,state);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,new cljs.core.Keyword(null,"key-pressed","key-pressed",-757100364),((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return key_pressed.call(null,quil.middlewares.navigation_3d.move.call(null,state,event,step_size),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+,rotate_on,((function (user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup){
+return (function (state,event){
+return rotate_on_fn.call(null,quil.middlewares.navigation_3d.rotate.call(null,state,event,pixels_in_360),event);
+});})(user_settings,pixels_in_360,step_size,rotate_on,draw,key_pressed,rotate_on_fn,setup))
+);
+});
+
+//# sourceMappingURL=navigation_3d.js.map \ No newline at end of file
diff --git a/assets/viz/2/quil/middlewares/navigation_3d.js.map b/assets/viz/2/quil/middlewares/navigation_3d.js.map
new file mode 100644
index 0000000..29e7b12
--- /dev/null
+++ b/assets/viz/2/quil/middlewares/navigation_3d.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"\/home\/mediocregopher\/src\/viz\/out\/quil\/middlewares\/navigation_3d.js","sources":["navigation_3d.cljc"],"lineCount":261,"mappings":"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","names":["quil.middlewares.navigation-3d\/missing-navigation-key-error","quil.middlewares.navigation-3d\/assert-state-has-navigation","state","js\/Error","quil.middlewares.navigation-3d\/default-position","quil.core\/width","quil.core\/height","quil.core\/tan","quil.core\/PI","quil.middlewares.navigation-3d\/rotate-by-axis-and-angle","v","axis","angle","vec__8901","cljs.core\/nth","vec__8904","a-x","a-y","a-z","x","y","z","cs","quil.core\/cos","-cs","sn","quil.core\/sin","a","b","c","d","e","f","g","h","i","quil.middlewares.navigation-3d\/rotate-lr","nav-3d","cljs.core\/update-in","p__8907","p__8908","vec__8915","vec__8918","quil.middlewares.navigation-3d\/cross-product","u1","u2","u3","v1","v2","v3","quil.middlewares.navigation-3d\/v-mult","mult","p1__8921#","cljs.core\/mapv","quil.middlewares.navigation-3d\/v-plus","cljs.core\/+","quil.middlewares.navigation-3d\/v-opposite","quil.middlewares.navigation-3d\/v-normalize","norm","cljs.core\/map","quil.core\/sq","cljs.core\/apply","quil.core\/sqrt","quil.middlewares.navigation-3d\/rotate-ud","p1__8922#","rotate","quil.middlewares.navigation-3d\/rotate","event","pixels-in-360","cljs.core\/=","dx","dy","angle-lr","quil.core\/map-range","quil.core\/TWO-PI","angle-ud","p1__8923#","quil.middlewares.navigation-3d\/space","cljs.core\/keyword","quil.middlewares.navigation-3d\/move","step-size","map__8930","cljs.core\/PROTOCOL_SENTINEL","cljs.core\/hash-map","cljs.core\/get","up","straight","temp__4655__auto__","dir","pred__8932","expr__8933","p1__8924#","quil.middlewares.navigation-3d\/setup-3d-nav","user-setup","user-settings","initial-state","cljs.core\/select-keys","cljs.core\/merge","p1__8935#","quil.middlewares.navigation-3d\/navigation-3d","options","rotate-on","draw","key-pressed","_","rotate-on-fn","setup","cljs.core\/assoc","cljs.core\/partial","map__8947","vec__8948","vec__8951","vec__8954","c-x","c-y","c-z","u-x","u-y","u-z","p-x","p-y","p-z","quil.core\/camera"]} \ No newline at end of file