65 lines
3.9 KiB
Markdown
65 lines
3.9 KiB
Markdown
# User documentation — WSG
|
||
|
||
**Usage** documentation for the `wsg-lib` crate: how to build a 3D rendering application
|
||
without touching wgpu directly. It targets a developer with basic Rust knowledge; no prior
|
||
GPU graphics background is required.
|
||
|
||
> **Not to be confused**: these pages explain *how to use* the API. The **technical**
|
||
> documentation (internal architecture, design decisions, future targets) lives in
|
||
> [../tech/](../tech/ARCHI_APP.md), and the exhaustive API reference is generated by rustdoc
|
||
> (`cargo doc -p wsg-lib --no-deps`).
|
||
|
||
## Where to start
|
||
|
||
1. [Quickstart](quickstart.md) — your first window and your first object, in ~30 lines.
|
||
2. Then, at your own pace, depending on what you need:
|
||
|
||
| Page | Topic |
|
||
|-------|-------|
|
||
| [Meshes](meshes.md) | Geometries: procedural primitives, custom `Geometry`, entities and `Transform` |
|
||
| [Materials & textures](materials.md) | Appearance: the `standard` shader, unlit mode, diffuse textures |
|
||
| [Lights](lights.md) | Directional, point, spot, ambient, `MAX_LIGHTS` |
|
||
| [Shadows](shadows.md) | Shadow mapping: picking the casting light, the packed-index pitfall |
|
||
| [Mesh & primitives](mesh.md) | Procedural generators + file import (OBJ), feature-gated |
|
||
| [HDR & tone mapping](hdr.md) | Offscreen float render + ACES/Reinhard, opt-in via `with_hdr` |
|
||
| [MSAA (anti-aliasing)](msaa.md) | Multi-sample edge smoothing, opt-in via `with_msaa(4)` |
|
||
| [Fog (distance)](fog.md) | Distance fog (3 modes), masks world edges, opt-in via `with_fog()` |
|
||
| [DoF (depth of field)](dof.md) | Cinematic bokeh blur, focus plane, opt-in via `with_dof()` |
|
||
| [GPU-driven rendering](gpu-driven.md) | GPU world matrices + indirect draws, opt-in frustum culling |
|
||
| [Camera & input](camera-input.md) | Active camera, orbital controller, unified keyboard/mouse state |
|
||
| [Examples](examples.md) | The 7 repo examples, the advanced `manual` workflow, adding your own example |
|
||
|
||
The pages are cross-linked: each page ends with a link to the next one.
|
||
|
||
## Design principle: opt-in = zero cost
|
||
|
||
WSG follows a strict rule: **a feature you don't enable costs nothing at runtime**.
|
||
|
||
| Feature | How to enable | If NOT enabled |
|
||
|---------|--------------|----------------|
|
||
| Shadows | `scene.set_shadow_caster(Some(idx))` | No shadow map allocated, no depth pass, no PCF sampling |
|
||
| HDR + Tone mapping | `AppBuilder::with_hdr(ToneMapper::Aces)` | No offscreen texture, no TM pass, direct-to-surface render |
|
||
| MSAA | `AppBuilder::with_msaa(4)` | Single-sample (1×), zero overhead |
|
||
| GPU-driven culling | `AppBuilder::with_gpu_driven(true)` | No compute pipeline, no indirect draw buffers |
|
||
| LOD | `scene.create_mesh_with_lod(…, levels)` | Single-level mesh, no decimation, no hysteresis |
|
||
| Primitives | Cargo feature `prim-*` (default: all) | Not compiled at all |
|
||
| File import | Cargo feature `import-*` | Not compiled at all |
|
||
|
||
The distinction matters:
|
||
- **Runtime opt-in** (shadows, HDR, culling, LOD): the code is compiled into your binary
|
||
but is **completely inert** if you never call the activation method. No GPU resources are
|
||
allocated, no passes execute, no per-frame overhead. The cost of the code being in the
|
||
binary is a few KB — negligible.
|
||
- **Compile-time opt-in** (primitives, import): the code is **not compiled at all** unless
|
||
you opt in via Cargo features. This matters when you want to minimize compile time or
|
||
binary size for a minimal build.
|
||
|
||
You can mix both: build with `--no-default-features --features "prim-cube"` for a minimal
|
||
binary, then enable shadows/HDR at runtime only for the scenes that need them.
|
||
|
||
## Links
|
||
|
||
- Technical documentation (architecture): [ARCHI_APP](../tech/ARCHI_APP.md) · [ARCHI_RENDU](../tech/ARCHI_RENDU.md) · [ARCHI_CPU_GPU](../tech/ARCHI_CPU_GPU.md) · [ARCHI_ARENES](../tech/ARCHI_ARENES.md) · [FRAME_LOOP](../tech/FRAME_LOOP.md)
|
||
- [Root README](../../README.md) · [ROADMAP](../ROADMAP.md) · [DRAFT](../DRAFT.md)
|
||
- Full API reference: `cargo doc -p wsg-lib --no-deps`
|