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]
name = "micro_ldtk"
version = "0.13.0"
version = "0.14.0"
edition = "2021"
authors = [
......
......@@ -19,8 +19,9 @@ pub fn handle_ldtk_project_events(
if let Some(project) = assets.get(*id) {
for level in project.get_all_levels() {
if level.external_rel_path.is_none() {
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()));
}
}
......
......@@ -16,7 +16,7 @@ use quadtree_rs::Quadtree;
use serde::{Deserialize, Serialize};
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::{get_ldtk_tile_scale, px_to_grid};
use crate::MapQuery;
......@@ -117,6 +117,17 @@ pub struct 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 {
self.level.px_wid as f32
}
......@@ -162,6 +173,7 @@ impl LdtkLevel {
pub fn get_indexer(&self) -> Indexer {
Indexer::new(px_to_grid(self.level.px_wid), px_to_grid(self.level.px_hei))
}
}
#[derive(Debug, Clone, Default)]
......@@ -200,7 +212,7 @@ impl From<Level> for LdtkLevel {
let mut collider_quads = Quadtree::<i64, LocatedEntity>::new(32);
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());
for field in entity.field_instances.iter() {
properties.insert(
......@@ -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 _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);
let position = IVec2::new(level.level.px_wid as i32, level.level.px_hei as i32)
- (IVec2::new(entity.px[0] as i32, entity.px[1] as i32) + size);
// y indicates top left, we want bottom left
let y = (level_height - y) - height;
let position = IVec2::new(x, y as i32);
let size = IVec2::new(width, height as i32);
let entity = LocatedEntity {
position,
......@@ -245,6 +259,7 @@ pub struct LdtkLayer {
layer: LayerInstance,
position_lookup: HashMap<SpatialIndex, TileInstance>,
indexer: Indexer,
tags: Vec<String>,
}
impl LdtkLayer {
......@@ -268,6 +283,7 @@ impl LdtkLayer {
indexer,
layer,
position_lookup,
tags: Vec::new(),
}
}
......@@ -325,6 +341,13 @@ impl LdtkLayer {
pub fn layer_ref_mut(&mut self) -> &mut LayerInstance {
&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 {
......
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