# `Cauldron2D.Projection.Volume.Shapes`
[🔗](https://github.com/jaman/cauldron/blob/v0.2.2/cauldron_2d/lib/cauldron_2d/projection/volume/shapes.ex#L1)

The shapes `Cauldron2D.Projection.Volume` knows without being told: a sphere, a
cylinder, a cone, a beam, and a set of whole grid tiles.

    {:sphere, 1.5, 0.0}                 half a ball standing on the ground
    {:sphere, 1.0, 1.5}                 a ball floating a tile and a half up
    {:cylinder, 3.0, 2.0}               a disc of three tiles, two tiles tall
    {:cone, 6.0, :math.pi() / 2, 0.0, 2.0}   a quarter turn wide, six tiles long
    {:beam, 8.0, 1.0, 0.0, 2.0}         a tile wide and eight long, along `+x`
    {:cells, MapSet.new([{0, 0}, {1, 0}]), 2.0}   two whole tiles

Everything is measured from the volume's own place on the ground, with `z` running up.
A sphere's second number is how far its centre floats; at `0.0` it is a dome. A cone
and a beam run along a heading in radians, `0` along `+x`, and a cone's spread is the
angle it opens to, less than half a turn. `:cells` covers whole tiles of the grid the
volume stands on, named by their offset from it, which is how a table that plays by
squares marks an area out; put the volume on a tile corner for it.

Nothing below the ground counts, so these shapes do not clip themselves to it.

# `kinds`

```elixir
@spec kinds() :: [atom()]
```

The shapes this module takes, for a caller checking one before it is drawn.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
