1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
Quickly jump sections of this text by searching forward/reverse for ---
---
Overview:
rototiller implements a corpus of software-rendered graphics
rendering modules, integrated into a single program.
It can be used as a static library (libtil.a) embedded in other
programs, or it can be used as a standalone CLI tool for displaying
stuff realtime via libdrm and/or SDL2.
If you wish to see some eye candy, just build it in the conventional
autotools project fashion:
`./bootstrap; mkdir build; cd build; ../configure; make`
If successful, run build/src/rototiller with no arguments for an
interactive dialog to choose what to see. You can just smash <enter> a
bunch for defaults and it will probably work. You can also just pass
"--defaults" on the command-line to achieve the same thing:
`./build/src/rototiller --defaults`
If you wish to hack on rototiller modules see HACKING.txt.
See https://rototiller.pengaru.com for more information, including
videos, and screenshots.
Everything below pertains to the CLI `rototiller` program, but much
will probably overlap with anything utilizing libtil.a.
---
Modules:
The list of currently available modules is found by running the CLI
tool `rototiller` without any flags. This enters an interactive setup
mode, beginning with selecting the module to use from a list.
Here's what's output as of writing this document:
```
$ build/src/rototiller
/module:
Renderer module:
0: blinds: Retro 80s-inspired window blinds (threaded)
1: checkers: Checker-patterned overlay (threaded)
2: compose: Layered modules compositor
3: drizzle: Classic 2D rain effect (threaded (poorly))
4: flow: 3D flow field
5: flui2d: Fluid dynamics simulation in 2D (threaded (poorly))
6: julia: Julia set fractal morpher (threaded)
7: meta2d: Classic 2D metaballs (threaded)
8: mixer: Module blender (threaded)
9: moire: 2D Moire interference patterns (threaded)
10: montage: Rototiller montage (threaded)
11: pixbounce: Pixmap bounce (threaded)
12: plasma: Oldskool plasma effect (threaded)
13: plato: Platonic solids rendered in 3D
14: ray: Ray tracer (threaded)
15: rkt: GNU Rocket module sequencer
16: roto: Anti-aliased tiled texture rotation (threaded)
17: rtv: Rototiller TV
18: shapes: Procedural 2D shapes (threaded)
19: snow: TV snow / white noise (threaded)
20: sparkler: Particle system with spatial interactions (threaded (poorly))
21: spiro: Spirograph emulator
22: stars: Basic starfield
23: strobe: Strobe light (threaded)
24: submit: Cellular automata conquest game sim (threaded (poorly))
25: swab: Colorful perlin-noise visualization (threaded)
26: swarm: "Boids"-inspired particle swarm in 3D
27: voronoi: Voronoi diagram (threaded)
28: blank: Blanker (built-in)
29: none: Disabled (built-in)
30: noop: Nothing-doer (built-in)
31: ref: Context referencer (built-in)
Enter a value 0-31 [17 (rtv)]:
```
Most modules are simple rendering modules, implementing a single
real-time graphics algorithm.
Some are more complex "composite" or "meta" modules, which play more
of a compositing or orchestrating role, utilizing other modules as
unwitting participants in a larger production. At this time, rtv, rkt,
compose, mixer, and montage, are the primary compositing/meta modules.
The default module selected by simply pressing <enter> at the list
above's prompt, or running with "--defaults", is rtv. This module
cycles through randomly configured modules on a regular interval. The
participating modules are configurable via its channels= setting. The
default is channels=compose, which results in a huge variety of
randomly configured compositions pulling from all available modules.
This is a good way to see what's available in rototiller in a
hands-off, automated fashion. Shortening the rtv channel durations,
e.g. duration=1,context_duration=1 as rtv settings can make it more
entertaining by increasing the pace.
Other modules sit in a sort of middle-ground between the purely
meta/composite, and implementing a graphics algorithm of their own.
This is due to their use of other modules as a sort of brush within
their own rendering. Some examples of these include roto and checkers,
which both support optional fill_module= settings for drawing an aspect
of their output using another module. The montage module kind of
straddles the boundary between these and the purely meta/composite
modules, due to the simplicity of its tiled layout and its output being
otherwise entirely determined by other modules.
At the bottom of the list above, there's a few entries labeled
(built-in). These are basic low-level modules that don't really
implement anything aesthetically interesting or particularly
substantial, but should always be present in libtil builds. They're
not generally interesting to use, unless testing things as a developer,
or in composing larger works. The ref module in particular plays an
important role in combination with rkt.
When starting rototiller, the top-level module to use may be
specified via the "--module=" flag. e.g. `rototiller --module=roto`.
For information on how modules are implemented, see HACKING.txt.
---
Execution:
The CLI UX is heavily biased towards module developers iterating on
and experimenting with their creations. As a result it's all rather
text/shell-centric, and works best with proficiency at quickly editing
shell command-lines in-situ. If you're not familiar with your shell's
command-line editing features, it might be quite frustrating and
cumbersome to work with. For me personally, GNU bash in vi-mode
(anything readline-based should offer this) makes quick work of editing
rototiller command-lines. YMMV
All rototiller flags are of the GNU long-form style prefixed by "--",
there are no short "-" variants. They also expect a trailing "="
separator if they accept a parameter, a space separator is not
supported. e.g. "--video=sdl" is valid, but "--video sdl" is not.
To see what flags are currently supported, there is a "--help" flag
which prints a summary:
```
$ build/src/rototiller --help
Run without any flags or partial settings for interactive mode.
Supported flags:
--defaults use defaults for unspecified settings
--go start rendering immediately upon fulfilling all required settings
--help this help
--module= module settings
--print-module-contexts print active contexts on-stream to stdout
--print-pipes print active pipes on-stream to stdout
--seed= seed to use for all PRNG in hexadecimal (e.g. 0xdeadbeef)
--title= title to use where applicable (e.g. window title)
--video= video settings
```
When you run rototiller without any flags, it enters an interactive
setup dialog mode, as shown in the Modules section. You can skip this
by specifying "--defaults" to automatically accept all defaults, the
equivalent of pressing <enter> at every prompt the interactive setup
would have presented.
When you specify some flags, but omit others, without "--defaults",
the interactive setup dialog will be performed for only what's missing.
This is done on a granular, per-setting basis, not per-flag.
Flags like "--module=" and "--video=" accept variadic,
value-dependent settings in their argument. Specifying "--video=sdl"
for instance, partially specifies the video settings in that it says
what fb backend to use (sdl), but no settings for that backend.
Without "--defaults" this results in an interactive dialog for
specifying sdl's needed settings:
```
$ build/src/rototiller --module=blank --video=sdl
/video/sdl/fullscreen:
SDL fullscreen mode:
0: off
1: on
Enter a value 0-1 [0 (off)]:
/video/sdl/size:
SDL window size [640x480]:
Configured settings as flags:
--seed=0x64f9cb30 '--module=blank' '--video=sdl,fullscreen=off,size=640x480'
Press enter to continue, add --go to skip this step...
```
In the above example, <enter> was pressed at the two setting prompts
accepting the defaults for "fullscreen=off" and "size=640x480". If the
command-line had specified "--video=sdl,size=300x300", only the
"fullscreen" setting would have been asked about interactively, in lieu
of "--defaults". The same thing applies to "--module=", any settings
omitted that the module wants will be asked for, in lieu of
"--defaults".
Before rototiller proceeds after completing the setup phase, it
normally waits for you to press <enter> at a prompt showing the
completed settings being used, in CLI argument format, as shown above
after "Configured settings as flags".
This provides an opportunity for review, copy-and-paste for saving
into a script or pasting into another command-line, or simply a
convenient log sitting in scrollback should you need to reproduce the
invocation. Suppress this review prompt by specifying "--go". The
complete settings will still be shown, just without the wait.
Note that whatever is shown under "Configured settings as flags:"
should always be comprehensive and reproduce the same results. If
placing those in wrapper scripts, by not adding "--defaults", it should
never enter an interactive setup mode unless new settings were
introduced in a newer build of rototiller. This is useful for
detecting when something relevant changes, so in scripted invocations
it's useful to not use "--defaults".
One power of this granular per-setting interactive fallback is you
can always just strip things off an existing invocation to receive
guidance on changing the stripped parts to something else. It's
especially useful during the development/creative process to use a
partially specified "--module=" flag, with some settings present, but
the ones you're experimenting with absent, then just keep re-running
from the shell history the same underspecified invocation.
You can also utilize the "rtv" module to automate the process of
exploring a module's possibility space by specifying the module of
interest as the sole "channels=" argument, since rtv randomizes
settings on every channel switch. Its "log_channels=on" mode is useful
in keeping track of which permutation you're looking at, and is printed
in the same CLI-appropriate format as "Configured settings as flags:"
shows.
---
Sequencing:
With the addition of the "rkt" module rototiller now integrates with
GNU Rocket[0] for supporting sequencing of variables that have been
exposed by modules as "taps". These taps show up in a Rocket Editor as
tracks you can control on a timeline, for easily choreographing what's
happening visually in a convenient, tracker-style GUI[1].
This opens up the possibility of using rototiller as a sort of
demo[2] engine, where the rendering modules are composed and sequenced
via the rkt module. For now, your demo would then be a .bat/.sh
wrapper containing the rototiller incantation for establishing all the
scenes via rkt settings, accompanied by Rocket tracks on the filesystem
exported as part of the Rocket Editor sequencing process.
You can explore this interesting space by simply running with
"--module=rkt". It will by default attempt to connect to the Rocket
Editor on localhost, as well as listen for telnet connects on port
54321.
The Rocket Editor is responsible for sequencing the taps, one of
which is the scene selection track, treated as an integer index into
the active scenes. The telnet interface is what's currently offered
for interactively creating and editing scenes, which you can access via
`telnet localhost 54321`.
When you trigger an export from the Rocket Editor, rototiller, via
the rkt module, will export the track data into a directory named by
rkt's "base=" setting (default is rkt). Note this does not trigger
saving the rototiller incantation needed for reproducing the scenes.
That command-line is found using the telnet interface, and must be
copy-and-pasted into a .sh/.bat wrapper to accompany the exported track
data and rototiller binary, to produce a reproducible work.
Also note that when you trigger an export from the Editor, it's only
instructing the Demo to dump the binary form, Demo-native tracks, local
to the Demo. These aren't usable by the Editor to import for future
editing, for that you want to Save the tracks with the Editor, which
will save an Editor-native format the Editor can load and edit, local
to the Editor. These are GNU Rocket-isms, and take some getting used
to.
This area of rototiller is still very experimental, and GNU Rocket
needs some work before it's a better, more polished/ergonomic
experience, which I am working towards with upstream.
There is also a need for music integration. I have an experimental
SchismTracker branch[3] integrating GNU Rocket support that already
mostly works. I've also already landed upstream changes to
RocketEditor[4] supporting multiple GNU Rocket clients, enabling having
both SchismTracker and rototiller (via rkt) connected to RocketEditor
simultaneously. The current Rocket "row" stays synchronized across the
three of them when playing, moving the cursor in Schism moves the
cursor in RocketEditor and vice-versa when editing.
The main remaining piece here is to get audio support sorted out in
rototiller, and some music playback modules, contributions welcome.
---
[0] GNU Rocket: https://github.com/rocket/rocket
[1] C/OpenGL: RocketEditor https://github.com/emoon/rocket
[2] Demos: https://en.wikipedia.org/wiki/Demo_scene
[3] Experimental SchismTracker GNU Rocket support: https://github.com/vcaputo/schismtracker/tree/gnurocket
[4] RocketEditor, the first GNU Rocket editor supporting multiple clients: https://github.com/emoon/rocket/pull/165
|