diff --git a/Cargo.lock b/Cargo.lock index 375e4ce9b63069cdf508b7679dfcd135ecfe46e0..292408023353aa769056c0ffdcdf3bc95eb1fa54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2066,6 +2066,15 @@ dependencies = [ "objc", ] +[[package]] +name = "micro_autotile" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78eda07db196df5c028f17242e7f5e9fd26efadf83d1e10d4927b56754155996" +dependencies = [ + "fastrand", +] + [[package]] name = "micro_ldtk" version = "0.3.0-beta.1" @@ -2073,6 +2082,7 @@ dependencies = [ "anyhow", "bevy", "log", + "micro_autotile", "num-traits", "quadtree_rs", "serde", diff --git a/Cargo.toml b/Cargo.toml index 2b84448834d37b946eeb3b523aa5884561e4b1f9..98d2d55b503380eae2455ad6b7cc4aff8919e895 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,9 +10,10 @@ repository = "https://lab.lcr.gr/microhacks/bevy-micro-ldtk.git" license = "Apache-2.0" [features] -default = ["ldtk_1_2_5"] +default = ["ldtk_1_2_5", "autotile"] ldtk_1_2_5 = [] ldtk_1_2_4 = [] +autotile = ["micro_autotile"] no_panic = [] [dependencies] @@ -24,4 +25,5 @@ serde = "1.0.147" serde_json = "1.0.87" num-traits = "0.2.15" quadtree_rs = "0.1.2" +micro_autotile = { version = "0.1.0", optional = true } diff --git a/src/ldtk/mod.rs b/src/ldtk/mod.rs index e217205d2444b641cd87caf57452da9cfe9494f6..2dbd780ebd4a2b4bb8ec65e72379adb3349f2ad7 100644 --- a/src/ldtk/mod.rs +++ b/src/ldtk/mod.rs @@ -68,6 +68,81 @@ impl AssetLoader for LdtkLoader { } } +#[cfg(feature = "autotile")] +mod autotile_support { + use micro_autotile::{AutoRuleSet, AutoTileRule, TileMatcher, TileOutput, TileStatus}; + + use crate::ldtk::{AutoLayerRuleGroup, Project}; + + impl From<&AutoLayerRuleGroup> for AutoRuleSet { + fn from(value: &AutoLayerRuleGroup) -> Self { + let set = value + .rules + .iter() + .filter_map(|rule| match rule.size { + 1 => { + let rule = AutoTileRule { + chance: rule.chance as f32, + output: TileOutput::Random( + rule.tile_ids.iter().map(|val| val as usize).collect(), + ), + matcher: TileMatcher::single_match(TileStatus::from_ldtk_value( + rule.pattern[0], + )), + }; + + Some(rule) + } + 3 => { + if rule.pattern.len() == 9 { + let matcher = TileMatcher([ + TileStatus::from_ldtk_value(rule.pattern[0]), + TileStatus::from_ldtk_value(rule.pattern[1]), + TileStatus::from_ldtk_value(rule.pattern[2]), + TileStatus::from_ldtk_value(rule.pattern[3]), + TileStatus::from_ldtk_value(rule.pattern[4]), + TileStatus::from_ldtk_value(rule.pattern[5]), + TileStatus::from_ldtk_value(rule.pattern[6]), + TileStatus::from_ldtk_value(rule.pattern[7]), + TileStatus::from_ldtk_value(rule.pattern[8]), + ]); + + let rule = AutoTileRule { + chance: rule.chance as f32, + matcher, + output: TileOutput::Random( + rule.tile_ids.iter().map(|val| val as usize).collect(), + ), + }; + + Some(rule) + } else { + None + } + } + _ => None, + }) + .collect(); + + AutoRuleSet(set) + } + } + + impl From<&Project> for AutoRuleSet { + fn from(value: &Project) -> Self { + let mut base_set = AutoRuleSet::default(); + + for layers in value.defs.layers.iter() { + for rule_group in layers.auto_rule_groups.iter() { + base_set = base_set + rule_group.into(); + } + } + + base_set + } + } +} + #[cfg(test)] mod test { use crate::ldtk::Project; diff --git a/src/ldtk/test_data/ver_1_2_5.ldtk b/src/ldtk/test_data/ver_1_2_5.ldtk index 6918e10192ec155aa3d126f583585e17019ee035..73e90b9a10aa96646b21ac9600538d84c5471ee0 100644 --- a/src/ldtk/test_data/ver_1_2_5.ldtk +++ b/src/ldtk/test_data/ver_1_2_5.ldtk @@ -11,7 +11,7 @@ "iid": "325092c0-c640-11ed-9e63-bd196e303d69", "jsonVersion": "1.2.5", "appBuildId": 464870, - "nextUid": 9, + "nextUid": 10, "identifierStyle": "Capitalize", "toc": [], "worldLayout": "Free", @@ -61,6 +61,30 @@ "excludedTags": [], "intGridValues": [], "autoRuleGroups": [{ "uid": 6, "name": "flloor", "active": true, "isOptional": false, "rules": [ + { + "uid": 9, + "active": true, + "size": 3, + "tileIds": [3], + "chance": 1, + "breakOnMatch": true, + "pattern": [0,0,0,0,2,2,0,2,0], + "flipX": false, + "flipY": false, + "xModulo": 1, + "yModulo": 1, + "xOffset": 0, + "yOffset": 0, + "checker": "None", + "tileMode": "Single", + "pivotX": 0, + "pivotY": 0, + "outOfBoundsValue": null, + "perlinActive": false, + "perlinSeed": 2913161, + "perlinScale": 0.2, + "perlinOctaves": 2 + }, { "uid": 8, "active": true, @@ -273,26 +297,26 @@ { "px": [80,192], "src": [368,48], "f": 0, "t": 119, "d": [7,197] }, { "px": [96,192], "src": [368,48], "f": 0, "t": 119, "d": [7,198] }, { "px": [112,192], "src": [368,48], "f": 0, "t": 119, "d": [7,199] }, - { "px": [144,80], "src": [16,0], "f": 0, "t": 1, "d": [8,89] }, - { "px": [160,80], "src": [16,0], "f": 0, "t": 1, "d": [8,90] }, - { "px": [176,80], "src": [16,0], "f": 0, "t": 1, "d": [8,91] }, { "px": [192,80], "src": [16,0], "f": 0, "t": 1, "d": [8,92] }, - { "px": [144,96], "src": [16,0], "f": 0, "t": 1, "d": [8,105] }, - { "px": [160,96], "src": [16,0], "f": 0, "t": 1, "d": [8,106] }, - { "px": [176,96], "src": [16,0], "f": 0, "t": 1, "d": [8,107] }, { "px": [192,96], "src": [16,0], "f": 0, "t": 1, "d": [8,108] }, - { "px": [144,112], "src": [16,0], "f": 0, "t": 1, "d": [8,121] }, - { "px": [160,112], "src": [16,0], "f": 0, "t": 1, "d": [8,122] }, - { "px": [176,112], "src": [16,0], "f": 0, "t": 1, "d": [8,123] }, { "px": [192,112], "src": [16,0], "f": 0, "t": 1, "d": [8,124] }, - { "px": [144,128], "src": [16,0], "f": 0, "t": 1, "d": [8,137] }, - { "px": [160,128], "src": [16,0], "f": 0, "t": 1, "d": [8,138] }, - { "px": [176,128], "src": [16,0], "f": 0, "t": 1, "d": [8,139] }, { "px": [192,128], "src": [16,0], "f": 0, "t": 1, "d": [8,140] }, { "px": [144,144], "src": [16,0], "f": 0, "t": 1, "d": [8,153] }, { "px": [160,144], "src": [16,0], "f": 0, "t": 1, "d": [8,154] }, { "px": [176,144], "src": [16,0], "f": 0, "t": 1, "d": [8,155] }, - { "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] } + { "px": [192,144], "src": [16,0], "f": 0, "t": 1, "d": [8,156] }, + { "px": [144,80], "src": [48,0], "f": 0, "t": 3, "d": [9,89] }, + { "px": [160,80], "src": [48,0], "f": 0, "t": 3, "d": [9,90] }, + { "px": [176,80], "src": [48,0], "f": 0, "t": 3, "d": [9,91] }, + { "px": [144,96], "src": [48,0], "f": 0, "t": 3, "d": [9,105] }, + { "px": [160,96], "src": [48,0], "f": 0, "t": 3, "d": [9,106] }, + { "px": [176,96], "src": [48,0], "f": 0, "t": 3, "d": [9,107] }, + { "px": [144,112], "src": [48,0], "f": 0, "t": 3, "d": [9,121] }, + { "px": [160,112], "src": [48,0], "f": 0, "t": 3, "d": [9,122] }, + { "px": [176,112], "src": [48,0], "f": 0, "t": 3, "d": [9,123] }, + { "px": [144,128], "src": [48,0], "f": 0, "t": 3, "d": [9,137] }, + { "px": [160,128], "src": [48,0], "f": 0, "t": 3, "d": [9,138] }, + { "px": [176,128], "src": [48,0], "f": 0, "t": 3, "d": [9,139] } ], "seed": 5669822, "overrideTilesetUid": null, diff --git a/src/lib.rs b/src/lib.rs index d1355c714b7f0d0efd4d7ab8bfba32f71ac7bd57..369a99eddbfa12071e2067b7077b035675e5c028 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,5 +80,7 @@ pub use assets::{LevelIndex, TileMetadata, TilesetIndex}; pub use camera::CameraBounder; pub use ldtk::{LdtkLoader, LdtkProject}; pub use map_query::{CameraBounds, MapQuery}; +#[cfg(feature = "autotile")] +pub use micro_autotile as autotile; pub use pregen::{write_layer_to_texture, write_map_to_texture, Rasterise}; pub use system::*;