2021-06-06 23:03:38 -04:00

144 lines
5.0 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](https://github.com/quil/quil/wiki/Functional-mode-%28fun-mode%29)
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 the user-provided handlers throws an 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 a map as
`:navigation-3d` option in [[quil.sketch/defsketch]]/[[quil.sketch/sketch]].
The map can have the following optional keys:
* `:position` - vector of 3 numbers, initial camera position. Default
is the same as in [[quil.core/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 your mouse to rotate 360 degrees.
The less the number the more sensitive the 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 a 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.
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 a map as
`:navigation-2d` option in [[quil.sketch/defsketch]]/[[quil.sketch/sketch]].
The map can have the 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 a 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.
Example:
```
(q/defsketch my-sketch
...
:middleware [m/fun-mode m/navigation-2d])
```"
[options]
(navigation-2d/navigation-2d options))