Skip to content
Snippets Groups Projects
Verified Commit 3e277359 authored by Louis's avatar Louis :fire:
Browse files

Include layer UI tags in LdtkLayer type

parent 590b48a6
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
[package] [package]
name = "micro_ldtk" name = "micro_ldtk"
version = "0.13.0" version = "0.14.0"
edition = "2021" edition = "2021"
authors = [ authors = [
......
...@@ -19,8 +19,9 @@ pub fn handle_ldtk_project_events( ...@@ -19,8 +19,9 @@ pub fn handle_ldtk_project_events(
if let Some(project) = assets.get(*id) { if let Some(project) = assets.get(*id) {
for level in project.get_all_levels() { for level in project.get_all_levels() {
if level.external_rel_path.is_none() { if level.external_rel_path.is_none() {
level_index level_index
.insert(level.identifier.clone(), LdtkLevel::from(level.clone())); .insert(level.identifier.clone(), LdtkLevel::from_project(&project, level.clone()));
update_events.send(LevelDataUpdated(level.identifier.clone())); update_events.send(LevelDataUpdated(level.identifier.clone()));
} }
} }
......
...@@ -16,7 +16,7 @@ use quadtree_rs::Quadtree; ...@@ -16,7 +16,7 @@ use quadtree_rs::Quadtree;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::{Map, Number, Value}; use serde_json::{Map, Number, Value};
use crate::ldtk::{EntityInstance, FieldInstance, LayerInstance, Level, TileInstance}; use crate::ldtk::{EntityInstance, FieldInstance, LayerInstance, Level, Project, TileInstance};
use crate::system::Indexer; use crate::system::Indexer;
use crate::{get_ldtk_tile_scale, px_to_grid}; use crate::{get_ldtk_tile_scale, px_to_grid};
use crate::MapQuery; use crate::MapQuery;
...@@ -117,6 +117,17 @@ pub struct LdtkLevel { ...@@ -117,6 +117,17 @@ pub struct LdtkLevel {
} }
impl LdtkLevel { impl LdtkLevel {
pub fn from_project(project: &Project, level: Level) -> Self {
let mut level_data = LdtkLevel::from(level);
level_data.layers_mut().for_each(|layer| {
if let Some(def) = project.defs.layers.iter().find(|inner| {
inner.uid == layer.layer.layer_def_uid
}) {
layer.tags = def.ui_filter_tags.clone();
}
});
level_data
}
pub fn width(&self) -> f32 { pub fn width(&self) -> f32 {
self.level.px_wid as f32 self.level.px_wid as f32
} }
...@@ -162,6 +173,7 @@ impl LdtkLevel { ...@@ -162,6 +173,7 @@ impl LdtkLevel {
pub fn get_indexer(&self) -> Indexer { pub fn get_indexer(&self) -> Indexer {
Indexer::new(px_to_grid(self.level.px_wid), px_to_grid(self.level.px_hei)) Indexer::new(px_to_grid(self.level.px_wid), px_to_grid(self.level.px_hei))
} }
} }
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
...@@ -200,7 +212,7 @@ impl From<Level> for LdtkLevel { ...@@ -200,7 +212,7 @@ impl From<Level> for LdtkLevel {
let mut collider_quads = Quadtree::<i64, LocatedEntity>::new(32); let mut collider_quads = Quadtree::<i64, LocatedEntity>::new(32);
for entity in MapQuery::get_entities_of(&level) { for entity in MapQuery::get_entities_of(&level) {
if entity.tags.contains(&String::from("Collider")) { if entity.tags.contains(&String::from("collider")) {
let mut properties = HashMap::with_capacity(entity.field_instances.len()); let mut properties = HashMap::with_capacity(entity.field_instances.len());
for field in entity.field_instances.iter() { for field in entity.field_instances.iter() {
properties.insert( properties.insert(
...@@ -209,14 +221,16 @@ impl From<Level> for LdtkLevel { ...@@ -209,14 +221,16 @@ impl From<Level> for LdtkLevel {
); );
} }
let _width = entity.width; let x = entity.px[0] as i32;
let y = entity.px[1];
let width = entity.width as i32;
let height = entity.height; let height = entity.height;
let _left_x = entity.px[0];
let _bottom_y = level_height - (entity.px[1] + height);
let size = IVec2::new(entity.width as i32, entity.height as i32); // y indicates top left, we want bottom left
let position = IVec2::new(level.level.px_wid as i32, level.level.px_hei as i32) let y = (level_height - y) - height;
- (IVec2::new(entity.px[0] as i32, entity.px[1] as i32) + size);
let position = IVec2::new(x, y as i32);
let size = IVec2::new(width, height as i32);
let entity = LocatedEntity { let entity = LocatedEntity {
position, position,
...@@ -245,6 +259,7 @@ pub struct LdtkLayer { ...@@ -245,6 +259,7 @@ pub struct LdtkLayer {
layer: LayerInstance, layer: LayerInstance,
position_lookup: HashMap<SpatialIndex, TileInstance>, position_lookup: HashMap<SpatialIndex, TileInstance>,
indexer: Indexer, indexer: Indexer,
tags: Vec<String>,
} }
impl LdtkLayer { impl LdtkLayer {
...@@ -268,6 +283,7 @@ impl LdtkLayer { ...@@ -268,6 +283,7 @@ impl LdtkLayer {
indexer, indexer,
layer, layer,
position_lookup, position_lookup,
tags: Vec::new(),
} }
} }
...@@ -325,6 +341,13 @@ impl LdtkLayer { ...@@ -325,6 +341,13 @@ impl LdtkLayer {
pub fn layer_ref_mut(&mut self) -> &mut LayerInstance { pub fn layer_ref_mut(&mut self) -> &mut LayerInstance {
&mut self.layer &mut self.layer
} }
pub fn tags(&self) -> &[String] {
&self.tags
}
pub fn has_tag(&self, tag: &str) -> bool {
self.tags.iter().any(|t| t == tag)
}
} }
impl AsRef<LayerInstance> for LdtkLayer { impl AsRef<LayerInstance> for LdtkLayer {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment