GameCult.Geometry.Csg/README.md
Meta Vens 4b5894b009 README: document the signed distance seam
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 16:54:10 +02:00

100 lines
3.2 KiB
Markdown

# GameCult.Geometry.Csg
The project is known as **CultGeometry CSG**. Its Rust package is
`gamecult-geometry-csg`, exposed to Rust code as `gamecult_geometry_csg`.
Lean constructive geometry tooling for Rust/Bevy-math scene blockouts.
CultGeometry CSG is the extracted CSG kernel from VibeGeometry. It is not trying to be
a full CAD kernel. It is a small, inspectable machine for agent-authored level
and habitat geometry:
- ordered additive, subtractive, and intersecting brush streams
- axis-aligned and oriented box CSG through convex plane splitting
- RealtimeCSG-shaped public vocabulary for operations, branches, trees, and
dirty brush generations
- exact observable parity fixtures where the public RealtimeCSG/demo API surface
overlaps
- mesh-array output suitable for Bevy-side ingestion
- dirty-frontier and prefix-checkpoint experiments for realtime editing
- additive habitat primitives used by the current examples
The crate is young and sharp in the places young crates are sharp. It exists so
we can build concrete fixtures, profile real edits, and grow the API from
working procedural scenes instead of designing the perfect museum label first.
## Quick Start
```powershell
cargo test
cargo run --example csg_room
cargo run --example dream_machine_level
cargo run --example industrial_maintenance_loop
```
The showpiece examples write OBJ/MTL/SVG artifacts under:
```text
experiments/generated/
```
## Core Shape
```rust
use bevy_math::{Quat, Vec3};
use gamecult_geometry_csg::{LevelDsl, MaterialId};
let mut level = LevelDsl::new();
level.solid_box(
"wall",
Vec3::new(0.0, 0.0, 1.5),
Vec3::new(5.0, 0.3, 3.0),
MaterialId(1),
);
level.cut_oriented_box(
"angled doorway",
Vec3::new(0.0, 0.0, 1.2),
Vec3::new(1.4, 0.8, 2.2),
Quat::from_rotation_z(0.25),
);
let output = level.assemble();
println!("triangles={}", output.mesh.triangle_count());
```
## Doctrine
CSG is the adjudicator, not the authoring language. Good procedural scenes
should still be written in the coordinate system that belongs to the domain:
room bay, curved shell segment, manifold face, staging rail, brush tree, dirty
frontier. Compile those local claims into CSG brushes late.
That bias is visible in `examples/industrial_maintenance_loop.rs`, where a
curved habitat room is authored in tangent/radial/up space and then lowered into
world-space oriented boxes and mesh bands.
## Signed Distance
`Assembler::distance(p)` (and `stream_distance` over any brush slice) lowers the
same ordered brush stream to a scalar field instead of triangles: negative
inside, positive outside. `Add` folds with `min`, `Subtract` with `max(d, -b)`,
`Intersect` with `max`. It is the seam for isosurface meshing and GPU field
refinement.
Boxes, oriented boxes and Z cylinders are exact distances. Domes (a
half-ellipsoid) and floret arms (max of face planes) are bounds that are exact
on the surface and never overestimate. The field honours every operation on
every primitive, including the non-box cutters the polygon kernel currently
warns about and skips.
## Docs
Research and implementation notes live in `docs/`:
- `docs/realtime-csg-bevy-assembler.md`
- `docs/realtime-csg-doctrine.md`
- `docs/csg-performance-fixtures.md`
## License
MIT