pilka 🔩

Crates.io

Pilka is a cross-platform live-coding tool for creating shader* demos, similar to Bonzomatic, KodeLife or sh4der-jockey.

Available features:

preview

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

Parameters

(per-draw-update)

| name | type | range | | ------------- | ------- | ------- | | position | vec3 | (-∞, ∞) | | time | float | [0, ∞) | | resolution | vec2 | [0, a] | | mouse | vec2 | [-1, 1] | | mousepressed | bool | | | frame | uint | | | timedelta | float | | | recordperiod | float | | | prevframe | texture | |

Flags

Choosing backend

You can select which backend to start with with the PILKA_BACKEND variable. Currently two backends are available: "wgpu" and "ash". If the value of the variable is incorrect, the default backend "wgpu" will be rolled back.

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 is the "default" window library in Rust ecosystem. And it covers the most of cross-platform issues for you.

png is used to encode screenshots into png files.

notify is a file watcher and maintains the hot-reload.

shaderc is used to compile GLSL shaders on the runtime instead of opening a process with glslc or glslangValidator. I hope to switch to naga soon, when it's mature enough.

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.

wgpu is save GPU abstraction over different graphics API like Vulkan, Metal, OpenGL and used for primary backend aside of ash.

puffin is scoped profiler written in Rust by EmbarkStudios and I baked it to pilka for fast performance checking.

pollster is smol blocking executor and needed for eliminating async wgpu API.

Ffmpeg is used to record videos. For my concerns it's temporary solution after which I switch to rav1e on it's release.

Places of inspiration (from where I steal code):

Examples

You can run any example by executing pilka inside of the folder bash cd examples/cube cargo run

| cube | cellular automata | line segment | |-----------------------------------------------------|-----------------------------------------------------------------|---------------------------------------------------| | cube | automata | line | | dithering | circle pattern | menger sponge | | dithering | pattern | spoonge | | path tracer | lasers | oblique slices | | tracer | lasers | slices |