mediocre-blog/assets/viz/2/quil/middleware.cljc
2018-11-12 16:18:45 -05:00

145 lines
4.7 KiB
Clojure

(ns ^{:doc "Quil middleware."}
quil.middleware
(:require [quil.middlewares.fun-mode :as fun-mode]
#?(:clj [quil.middlewares.pause-on-error :as pause-on-error])
[quil.middlewares.navigation-3d :as navigation-3d]
[quil.middlewares.navigation-2d :as navigation-2d]
))
(defn ^{:requires-bindings false
:category "Middleware"
:subcategory nil
:ns "quil.middleware"
:added "2.1.0"}
fun-mode
"Introduces function mode. Adds 'update' function which takes current
state and returns new state. Makes all other functions (setup, draw,
mouse-click, etc) state-aware. See wiki for more details."
[options]
(fun-mode/fun-mode options))
#?(:clj
(defn ^{:requires-bindings false
:category "Middleware"
:subcategory nil
:ns "quil.middleware"
:added "2.2.0"}
pause-on-error
"Pauses sketch if any of user-provided handlers throws error.
It allows to fix the error on the fly and continue sketch.
May be good alternative to default '500ms pause if exception'
behaviour."
[options]
(pause-on-error/pause-on-error options)))
(defn ^{:requires-bindings false
:category "Middleware"
:subcategory nil
:ns "quil.middleware"
:added "2.2.0"}
navigation-3d
"Enables navigation in 3D space. Similar to how it is done in
shooters: WASD navigation, space is go up, drag mouse to look around.
This middleware requires fun-mode.
Navigation
* Drag mouse to look around. You can change settings to bind
mouse-moved instead of mouse-dragged to look around. See
customization info below.
* Keyboard:
* w - go forward
* s - go backward
* a - strafe left
* d - strafe right
* space - go up
* z - go down, can't bind to ctrl, limitation of Processing
Customization
You can customize this middleware by providing map as
:navigation-3d option in defsketch/sketch. Map can have following
optional keys:
:position - vector of 3 numbers, initial camera position. Default
is the same as in 'camera' function.
:straight - vector of 3 numbers, direction you'll be looking at.
Default is [0 0 -1] (looking down).
:up - vector of 3 numbers, 'up' direction. Default is [0 1 0].
:pixels-in-360 - number, mouse sensitivity. Defines how many pixels
you need to move/drag you mouse to rotate 360 degrees.
The less the number the more sensitive is mouse.
Default is 1000.
:step-size - number, number of pixels you move on each key event (wasd).
Default is 20.
:rotate-on - keyword, either :mouse-dragged or :mouse-moved. Specifies
on which mouse event camera should rotate. Default is
:mouse-dragged.
Accessing position information from sketch
navigation-3d uses fun-mode under the hood so all position-related
information is stored in the state map. It means that you can access in
draw/update/any handler and modify it if you need to. Position
information is a map which is stored under :navigation-3d key in the
state map. Position consists of 3 values: :position, :straight and :up.
See \"Customization\" section above for more details.
Usage example:
(q/defsketch my-sketch
...
:middleware [m/fun-mode m/navigation-3d])
See wiki article for more(?) details:
https://github.com/quil/quil/wiki/Navigation-3D"
[options]
(navigation-3d/navigation-3d options))
(defn ^{:requires-bindings false
:category "Middleware"
:subcategory nil
:ns "quil.middleware"
:added "2.2.6"}
navigation-2d
"Enables navigation over 2D sketch. Drag mouse to change the center of the
sketch and mouse wheel controls zoom. This middleware requires fun-mode.
Customization
You can customize this middleware by providing map as
:navigation-2d option in defsketch/sketch. Map can have following
optional keys:
:position - vector of 2 numbers, x and y - center of the screen.
Default is width/2, height/2.
:zoom - number indicating current zoom level. Default is 1.
Accessing position information from sketch
navigation-2d uses fun-mode under the hood so all position-related
information is stored in the state map. It means that you can access in
draw/update/any handler and modify it if you need to. Position
information is a map which is stored under :navigation-2d key in the
state map. Position consists of 2 values: :position and :zoom.
See \"Customization\" section above for more details.
Usage example:
(q/defsketch my-sketch
...
:middleware [m/fun-mode m/navigation-2d])
"
[options]
(navigation-2d/navigation-2d options))