procedural_tilemaps_core/
lib.rs

1#![warn(missing_docs)]
2
3//! A library for 2D & 3D procedural generation with Model synthesis/Wave function Collapse.
4//! Includes lightweight grid utilities tailored for cartesian tile grids.
5
6use generator::model::{ModelIndex, ModelRotation, ModelVariantIndex};
7use grid::GridIndex;
8
9pub mod grid;
10pub mod prelude;
11
12/// Model synthesis/Wave function Collapse generator
13pub mod generator;
14
15/// Our grid elements are called Nodes
16pub type NodeIndex = GridIndex;
17
18/// Error returned by a [`generator::Generator`] when a generation fails
19#[derive(thiserror::Error, Debug, Clone, Copy)]
20#[error("Failed to generate, contradiction at node with index {}", node_index)]
21pub struct GeneratorError {
22    /// Node index at which the contradiction occurred
23    pub node_index: NodeIndex,
24}
25
26/// Error returned by a [`generator::rules::RulesBuilder`] when correct [`generator::rules::Rules`] cannot be built
27#[derive(thiserror::Error, Debug, Clone, Copy)]
28pub enum RulesBuilderError {
29    /// Rules cannot be built without models or sockets
30    #[error("Empty models or sockets collection")]
31    NoModelsOrSockets,
32}
33
34/// Error returned by a [`generator::Generator`] when a node set operation fails
35#[derive(thiserror::Error, Debug, Clone)]
36pub enum NodeSetError {
37    /// An invalid [`ModelVariantIndex`] was given
38    #[error("Invalid model variant index `{0}`, does not exist in the rules")]
39    InvalidModelIndex(ModelVariantIndex),
40    /// An invalid [`generator::rules::ModelVariantRef`] was given
41    #[error("Invalid model variant reference: model index `{0}` with rotation `{1:?}`, does not exist in the rules")]
42    InvalidModelRef(ModelIndex, ModelRotation),
43    /// An invalid node index was given
44    #[error("Invalid node index `{0}`, does not exist in the grid")]
45    InvalidNodeIndex(NodeIndex),
46    /// An operation requested to set a model on a node that does not allow it
47    #[error("Model variant `{0}` not allowed by the Rules on node {1}")]
48    IllegalModel(ModelVariantIndex, NodeIndex),
49    /// Wraps a [`GeneratorError`]
50    #[error("Generation error: {0}")]
51    GenerationError(#[from] GeneratorError),
52}
53
54/// Errors returned by a [`generator::builder::GeneratorBuilder`]
55#[derive(thiserror::Error, Debug, Clone)]
56pub enum GeneratorBuilderError {
57    /// Error returned by a [`generator::builder::GeneratorBuilder`] when a node set operation fails
58    #[error("Initial node set error: {0}")]
59    InitialNodeSetError(#[from] NodeSetError),
60    /// Error returned by a [`generator::builder::GeneratorBuilder`] when a given grid does not match the size of the builder's grid.
61    #[error("Given grid size {0:?} does not match the expected size {1:?}")]
62    InvalidGridSize(usize, usize),
63}