rust/mapgen/src/template/wavefront_collapse.rs
author unC0Rr
Sun, 26 Jan 2025 21:29:54 +0100
changeset 16062 288df7b85efc
parent 16059 2acea266d297
child 16064 07cb6dbc8444
permissions -rw-r--r--
Fix inversion parameters being disregarded
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
     1
use integral_geometry::Size;
15923
d46ad15c6dec Get wavefront collapse generator to work in engine
unC0Rr
parents: 15922
diff changeset
     2
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
     3
use landgen::wavefront_collapse::generator::*;
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
     4
use serde_derive::Deserialize;
15923
d46ad15c6dec Get wavefront collapse generator to work in engine
unC0Rr
parents: 15922
diff changeset
     5
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
     6
use std::collections::hash_map::HashMap;
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
     7
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
     8
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
     9
#[serde(remote = "EdgeDescription")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    10
pub struct EdgeDesc {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    11
    pub name: String,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    12
    pub reversed: Option<bool>,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    13
    pub symmetrical: Option<bool>,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    14
}
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    15
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    16
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    17
#[serde(remote = "EdgesDescription")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    18
pub struct EdgesDesc {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    19
    #[serde(with = "EdgeDesc")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    20
    pub top: EdgeDescription,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    21
    #[serde(with = "EdgeDesc")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    22
    pub right: EdgeDescription,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    23
    #[serde(with = "EdgeDesc")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    24
    pub bottom: EdgeDescription,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    25
    #[serde(with = "EdgeDesc")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    26
    pub left: EdgeDescription,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    27
}
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    28
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    29
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    30
#[serde(remote = "TileDescription")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    31
pub struct TileDesc {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    32
    pub name: String,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    33
    #[serde(with = "EdgesDesc")]
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    34
    pub edges: EdgesDescription,
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    35
    pub is_negative: Option<bool>,
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    36
    pub can_flip: Option<bool>,
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    37
    pub can_mirror: Option<bool>,
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    38
    pub can_rotate90: Option<bool>,
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    39
    pub can_rotate180: Option<bool>,
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    40
    pub can_rotate270: Option<bool>,
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    41
}
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    42
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    43
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    44
pub struct TileDescriptionHelper(#[serde(with = "TileDesc")] TileDescription);
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    45
#[derive(Debug, Deserialize)]
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    46
pub struct EdgeDescriptionHelper(#[serde(with = "EdgeDesc")] EdgeDescription);
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    47
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    48
#[derive(Debug, Deserialize)]
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    49
pub struct ComplexEdgeDesc {
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    50
    pub begin: Option<EdgeDescriptionHelper>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    51
    pub fill: Option<EdgeDescriptionHelper>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    52
    pub end: Option<EdgeDescriptionHelper>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    53
}
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    54
#[derive(Debug, Deserialize)]
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    55
pub struct NonStrictComplexEdgesDesc {
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    56
    pub top: Option<ComplexEdgeDesc>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    57
    pub right: Option<ComplexEdgeDesc>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    58
    pub bottom: Option<ComplexEdgeDesc>,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    59
    pub left: Option<ComplexEdgeDesc>,
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    60
}
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    61
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    62
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    63
pub struct TemplateDesc {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    64
    pub width: usize,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    65
    pub height: usize,
15923
d46ad15c6dec Get wavefront collapse generator to work in engine
unC0Rr
parents: 15922
diff changeset
    66
    pub can_invert: bool,
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    67
    pub is_negative: bool,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    68
    pub put_girders: bool,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    69
    pub max_hedgehogs: u8,
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
    70
    pub wrap: bool,
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    71
    pub edges: Option<NonStrictComplexEdgesDesc>,
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    72
    pub tiles: Vec<TileDescriptionHelper>,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    73
}
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    74
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    75
#[derive(Debug, Deserialize)]
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    76
pub struct TemplateCollectionDesc {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    77
    pub templates: Vec<TemplateDesc>,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    78
    pub template_types: HashMap<String, Vec<usize>>,
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    79
}
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    80
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    81
impl From<&TemplateDesc> for TemplateDescription {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    82
    fn from(desc: &TemplateDesc) -> Self {
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    83
        let [top, right, bottom, left]:[Option<ComplexEdgeDescription>; 4] = if let Some(edges) = &desc.edges {
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    84
            [
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    85
                &edges.top,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    86
                &edges.right,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    87
                &edges.bottom,
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    88
                &edges.left,
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    89
            ]
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
    90
            .map(|e| e.as_ref().map(Into::into))
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    91
        } else {
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    92
            [None, None, None, None]
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    93
        };
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
    94
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    95
        Self {
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    96
            size: Size::new(desc.width, desc.height),
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    97
            tiles: desc
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    98
                .tiles
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
    99
                .iter()
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
   100
                .map(|TileDescriptionHelper(t)| t.clone())
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
   101
                .collect(),
15924
9502611bffc1 Some bug fixes, build fixes and code formatting
unC0Rr
parents: 15923
diff changeset
   102
            wrap: desc.wrap,
16062
288df7b85efc Fix inversion parameters being disregarded
unC0Rr
parents: 16059
diff changeset
   103
            can_invert: desc.can_invert,
288df7b85efc Fix inversion parameters being disregarded
unC0Rr
parents: 16059
diff changeset
   104
            is_negative: desc.is_negative,
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   105
            edges: NonStrictComplexEdgesDescription {
15925
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
   106
                top,
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
   107
                right,
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
   108
                bottom,
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
   109
                left,
b0e8cc72bfef Allow defining compatible edges for grid, add few more templates
unC0Rr
parents: 15924
diff changeset
   110
            },
15922
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
   111
        }
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
   112
    }
da6b67f13c12 Refactor mapgen to allow for easy switching between generators
unC0Rr
parents:
diff changeset
   113
}
16059
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   114
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   115
impl From<&ComplexEdgeDesc> for ComplexEdgeDescription {
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   116
    fn from(value: &ComplexEdgeDesc) -> Self {
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   117
        Self {
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   118
            begin: value.begin.as_ref().map(|EdgeDescriptionHelper(e)| e.clone()),
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   119
            fill: value.fill.as_ref().map(|EdgeDescriptionHelper(e)| e.clone()),
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   120
            end: value.end.as_ref().map(|EdgeDescriptionHelper(e)| e.clone()),
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   121
        }
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   122
    }
2acea266d297 Fix generation in corners by extending outline edge definitions
unC0Rr
parents: 15925
diff changeset
   123
}