# pilka 🔩 [![Crates.io](https://img.shields.io/crates/v/pilka.svg)](https://crates.io/crates/pilka) Pilka is a cross-platform live-coding tool for creating shader\* demos, similar to [Bonzomatic](https://github.com/Gargaj/Bonzomatic), [KodeLife](https://hexler.net/products/kodelife) or [sh4der-jockey](https://github.com/slerpyyy/sh4der-jockey). Available features: - [x] Hot-reload - [x] Saving shaders - [x] Taking screenshots - [x] Recording videos - [x] Compute pipeline for post processing ![preview](menger_sponge.png) ## How In current state `pilka` tries to seek `shaders` folder with the files `shader.vert` and `shader.frag`, on fail `pilka` will generate default setup for you. Then open shader in your favourite code editor (VS, emacs, vim, ed etc.) and `pilka` would fetch changes after each save. ## Controls - F1: Print help - F2: Toggle play/pause - F3: Pause and step back one frame - F4: Pause and step forward one frame - F5: Restart playback at frame 0 (`Time` and `Pos` = 0) - F6: Print parameters - F10: Save shaders - F11: Take Screenshot - F12: Start/Stop record video - ESC: Exit the application - Arrows: Change `Pos` ## Parameters (per-draw-update) | name | type | range | | ------------- | ------- | ------- | | position | vec3 | (-∞, ∞) | | time | float | [0, ∞) | | resolution | vec2 | [0, a] | | mouse | vec2 | [-1, 1] | | mouse_pressed | bool | | | frame | uint | | | time_delta | float | | | record_period | float | | | prev_frame | texture | | ## Flags - `--record f32` - Specify duration of recorded video - `--size u32xu32` - Specify window size and lock from resizing ## Requirements Vulkan SDK is required. On recent macOS, to allow sound input to be captured (for FFT textures to be generated), you need to: Open up System Preferences, click on Security & Privacy, click on the Privacy tab then click on the Microphone menu item. Make sure `pilka` is in the list and ticked... erm, probably. I don't have macOS. ## Installation ```Bash cargo install pilka ``` You also can install the application by to downloading the source code and build locally. ```Bash # or through ssh git@github.com:pudnax/pilka.git git clone https://github.com/pudnax/pilka.git cd pilka cargo install --path . ``` ## Dependencies [winit](https://crates.io/crates/winit) is the "default" window library in Rust ecosystem. And it covers the most of cross-platform issues for you. [png](https://crates.io/crates/png) is used to encode screenshots into png files. [notify](https://crates.io/crates/notify) is a file watcher and maintains the hot-reload. [ash](https://crates.io/crates/ash) is a Vulkan bindings. I choose `ash` because I see `pilka` as a learning project and want to touch the maximum untouched Vulkan. For the same reason I didn't use `vulkano`, `erupt`, `vulkanism`, `vkvk`. **Ffmpeg** is used to record videos. For my concerns it's temporary solution after which I switch to [rav1e](https://github.com/xiph/rav1e) on it's release. ### Places of inspiration (from where I steal code): - [piet-gpu](https://github.com/linebender/piet-gpu) - https://github.com/w23/OpenSource