fractl_lib 0.1.0

Fractal renderer supporting multithreading, gpu compute and wasm
Documentation
# [Fractl]https://shapur1234.github.io/Fractl/

- Fractal renderer written in rust
- Singlethreaded, multithreading (using [rayon]https://github.com/rayon-rs/rayon) and gpu compute (using [wgpu]https://github.com/gfx-rs/wgpu - [WebGpu]https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API implementation) versions
- Supports both native targets and [wasm]https://en.wikipedia.org/wiki/WebAssembly
- Currently renders the [Mandelbrot set]https://en.wikipedia.org/wiki/Mandelbrot_set and the [Multibrot set]https://en.wikipedia.org/wiki/Multibrot_set

## Screenshots

![Mandelbrot](./screenshot/mandelbrot.png)
![Multibrot](./screenshot/multibrot.png)

## How to

- Try the [live demo]https://shapur1234.github.io/Fractl/ (Note: the web version runs on a signle thread without GPU acceleration, native version are much faster)
- Download a pre-build binary from [./bin]./bin
- Install using cargo (TODO)

### Controls

| Key             | Action                                  |
| --------------- | --------------------------------------- |
| LeftMouseButton | Center view on cursor                   |
| WSAD            | Move view                               |
| R               | Reset view                              |
| ScrollWheel     | Increase / Decrease zoom                |
| O               | Increase zoom                           |
| P               | Decrease zoom                           |
| ArrowKey        | Increase / Decrease zoom in a direction |
| T               | Reset zoom                              |
| K               | Increase percision (max iterations)     |
| L               | Decrease percision (max iterations)     |
| M               | Next fractal                            |
| N               | Previous fractal                        |
| B               | Next fractal coloring                   |
| V               | Previous fractal coloring               |
| U               | Toggle UI                               |
| Y               | Toggle crosshair                        |
| C               | Increase exponent (for multi-fractals)  |
| X               | Decrease exponent (for multi-fractals)  |
| F11             | Toggle Fullscreen                       |
| Escape          | Exit                                    |

### Building using nix

- (This should be the most reliable way)
- Have [nix]https://nixos.org/ [installed]https://nix.dev/install-nix.html on your system
- Pick a package

| Package                    | Description                               | Pararelism         | Floatin point percision |
| -------------------------- | ----------------------------------------- | ------------------ | ----------------------- |
| fractl_gui                 | Native gui                                | No                 | Double (f64)            |
| fractl_gui-multithread     | Native gui                                | CPU multithreading | Double (f64)            |
| fractl_gui-gpu             | Native gui                                | GPU compute shader | Single (f32)            |
| fractl_gui-wasm            | Web gui                                   | No                 | Double (f64)            |
| fractl_gui-win             | Native gui crosscompiled to Winows x86_64 | No                 | Double (f64)            |
| fractl_gui-win-multithread | Native gui crosscompiled to Winows x86_64 | CPU multithreading | Double (f64)            |
| fractl_gui-win-gpu         | Native gui crosscompiled to Winows x86_64 | GPU compute shader | Single (f32)            |

- To build: `nix build .#Package`
- To build and run locally: `nix run .#Package`
- Example: `nix run .#gui-gpu`

- Or use on of the build scripts in [./script]./script

### Building using cargo

- Have [rust]https://www.rust-lang.org/tools/install installed, or optionally use the included dev shelle: `nix develop`
- Pick feautres

| Feature    | Description                             | Notes                                                                       |
| ---------- | --------------------------------------- | --------------------------------------------------------------------------- |
| multithred | CPU multithreading                      | _multithread_ and _gpu_ cannot be enabled at the same time                  |
| gpu        | GPU computing                           | _multithread_ and _gpu_, _gpu_ and _f64_ cannot be enabled at the same time |
| f32        | Single percision floating point numbers | _f32_ and _f64_ cannot be enabled at the same time                          |
| f64        | Double percision floating point numbers | _f32_ and _f64_ cannot be enabled at the same time                          |

- To build: `cargo build --package=fractl_gui --no-default-features --release --features "Feature1 Feature2"`
- To run: `cargo run --package=fractl_gui --no-default-features --release --features "Feature1 Feature2"`
- Example: `cargo build --package=fractl_gui --no-default-features --release --features "gpu f32"`

## TODO

- Add Julia set, more fractals
- F128 floating point
- Wasm WebGpu with compute shader
- Redox port