From 4227705a06a7251e90c27f3fe2208e8afbb6287e Mon Sep 17 00:00:00 2001 From: Alejandro Perea <alexpro820@gmail.com> Date: Wed, 16 Feb 2022 16:26:19 +0100 Subject: [PATCH] Remove `Data` types from the interface (#163) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add properties to `Object` * Add properties to `FiniteTileLayer` * Add properties to `Layer` * Add properties to `ImageLayer` * Add properties to `ObjectLayerData` * Remove `data()`; Replace `map()` * Add properties to `LayerTile` * `MapWrapper` -> `map_wrapper!` * Fix examples/tests * Limit visibility of data types * Make `Tile::collision` public again * Doc tweak Co-authored-by: Thorbjørn Lindeijer <bjorn@lindeijer.nl> --- examples/main.rs | 12 ++-- examples/sfml/main.rs | 8 +-- src/layers/group.rs | 32 +++++---- src/layers/image.rs | 17 +++-- src/layers/mod.rs | 82 +++++++++++++++++----- src/layers/object.rs | 48 +++++++++++-- src/layers/tile/finite.rs | 32 ++++----- src/layers/tile/infinite.rs | 12 ++-- src/layers/tile/mod.rs | 74 ++++++++++++-------- src/map.rs | 31 +-------- src/objects.rs | 67 ++++++++++++++++-- src/tile.rs | 2 +- src/util.rs | 23 +++++++ tests/lib.rs | 131 ++++++++++++++++++------------------ 14 files changed, 367 insertions(+), 204 deletions(-) diff --git a/examples/main.rs b/examples/main.rs index f99bfb6..5098995 100644 --- a/examples/main.rs +++ b/examples/main.rs @@ -14,15 +14,15 @@ fn main() { let map = Map::parse_file(map_path, &mut cache).unwrap(); for layer in map.layers() { - print!("Layer \"{}\":\n\t", layer.data().name); + print!("Layer \"{}\":\n\t", layer.name()); match layer.layer_type() { tiled::LayerType::TileLayer(layer) => match layer { tiled::TileLayer::Finite(data) => println!( "Finite tile layer with width = {} and height = {}; ID of tile @ (0,0): {}", - data.data().width(), - data.data().height(), - data.get_tile(0, 0).unwrap().id + data.width(), + data.height(), + data.get_tile(0, 0).unwrap().id() ), tiled::TileLayer::Infinite(data) => { // This is prone to change! Infinite layers will be refactored before 0.10.0 @@ -34,12 +34,12 @@ fn main() { } }, tiled::LayerType::ObjectLayer(layer) => { - println!("Object layer with {} objects", layer.data().objects.len()) + println!("Object layer with {} objects", layer.objects().len()) } tiled::LayerType::ImageLayer(layer) => { println!( "Image layer with {}", - match &layer.data().image { + match &layer.image() { Some(img) => format!("an image with source = {}", img.source.to_string_lossy()), None => "no image".to_owned(), diff --git a/examples/sfml/main.rs b/examples/sfml/main.rs index 989bd61..bde0f36 100644 --- a/examples/sfml/main.rs +++ b/examples/sfml/main.rs @@ -65,16 +65,12 @@ impl Level { /// Generates a vertex mesh from a tile layer for rendering. fn generate_mesh(layer: &FiniteTileLayer, tilesheet: &Tilesheet) -> QuadMesh { - let (width, height) = ( - layer.data().width() as usize, - layer.data().height() as usize, - ); + let (width, height) = (layer.width() as usize, layer.height() as usize); let mut mesh = QuadMesh::with_capacity(width * height); for x in 0..width as i32 { for y in 0..height as i32 { - // TODO: `FiniteTileLayer` for getting tiles directly from finite tile layers? if let Some(tile) = layer.get_tile(x, y) { - let uv = tilesheet.tile_rect(tile.id); + let uv = tilesheet.tile_rect(tile.id()); mesh.add_quad(Vector2f::new(x as f32, y as f32), 1., uv); } } diff --git a/src/layers/group.rs b/src/layers/group.rs index 940de75..4e03fe6 100644 --- a/src/layers/group.rs +++ b/src/layers/group.rs @@ -1,17 +1,17 @@ -use std::path::Path; use std::collections::HashMap; +use std::path::Path; -use crate:: { - layers::{LayerData, LayerTag}, +use crate::{ error::TiledError, - properties::{parse_properties, Properties}, + layers::{LayerData, LayerTag}, map::MapTilesetGid, + properties::{parse_properties, Properties}, util::*, - MapWrapper, Layer, Map + Layer, Map, }; #[derive(Debug, PartialEq, Clone)] -pub struct GroupLayerData { +pub(crate) struct GroupLayerData { layers: Vec<LayerData>, } @@ -74,21 +74,21 @@ impl GroupLayerData { Ok(()) }, }); - Ok(( - Self { layers }, - properties, - )) + Ok((Self { layers }, properties)) } } -pub type GroupLayer<'map> = MapWrapper<'map, GroupLayerData>; +map_wrapper!(GroupLayer => GroupLayerData); impl<'map> GroupLayer<'map> { pub fn layers(&self) -> GroupLayerIter { - GroupLayerIter::new(self.map(), self.data()) + GroupLayerIter::new(self.map, self.data) } pub fn get_layer(&self, index: usize) -> Option<Layer> { - self.data().layers.get(index).map(|data| Layer::new(self.map(), data)) + self.data + .layers + .get(index) + .map(|data| Layer::new(self.map, data)) } } @@ -101,7 +101,11 @@ pub struct GroupLayerIter<'map> { impl<'map> GroupLayerIter<'map> { fn new(map: &'map Map, group: &'map GroupLayerData) -> Self { - Self { map, group, index: 0 } + Self { + map, + group, + index: 0, + } } } diff --git a/src/layers/image.rs b/src/layers/image.rs index 0ea05c0..de2d978 100644 --- a/src/layers/image.rs +++ b/src/layers/image.rs @@ -2,13 +2,13 @@ use std::{collections::HashMap, path::Path}; use crate::{ parse_properties, - util::{parse_tag, XmlEventResult}, - Image, MapWrapper, Properties, TiledError, + util::{parse_tag, XmlEventResult, map_wrapper}, + Image, Properties, TiledError, }; #[derive(Debug, PartialEq, Clone)] -pub struct ImageLayerData { - pub image: Option<Image>, +pub(crate) struct ImageLayerData { + image: Option<Image>, } impl ImageLayerData { @@ -35,4 +35,11 @@ impl ImageLayerData { } } -pub type ImageLayer<'map> = MapWrapper<'map, ImageLayerData>; +map_wrapper!(ImageLayer => ImageLayerData); + +impl<'map> ImageLayer<'map> { + /// Get a reference to the image layer's image. + pub fn image(&self) -> Option<&Image> { + self.data.image.as_ref() + } +} diff --git a/src/layers/mod.rs b/src/layers/mod.rs index a7fe62d..ed0de12 100644 --- a/src/layers/mod.rs +++ b/src/layers/mod.rs @@ -2,9 +2,7 @@ use std::path::Path; use xml::attribute::OwnedAttribute; -use crate::{ - error::TiledError, properties::Properties, util::*, Color, Map, MapTilesetGid, MapWrapper, -}; +use crate::{error::TiledError, properties::Properties, util::*, Color, Map, MapTilesetGid}; mod image; pub use image::*; @@ -32,18 +30,18 @@ pub(crate) enum LayerTag { } #[derive(Clone, PartialEq, Debug)] -pub struct LayerData { - pub name: String, - pub id: u32, - pub visible: bool, - pub offset_x: f32, - pub offset_y: f32, - pub parallax_x: f32, - pub parallax_y: f32, - pub opacity: f32, - pub tint_color: Option<Color>, - pub properties: Properties, - pub(crate) layer_type: LayerDataType, +pub(crate) struct LayerData { + name: String, + id: u32, + visible: bool, + offset_x: f32, + offset_y: f32, + parallax_x: f32, + parallax_y: f32, + opacity: f32, + tint_color: Option<Color>, + properties: Properties, + layer_type: LayerDataType, } impl LayerData { @@ -112,12 +110,62 @@ impl LayerData { } } -pub type Layer<'map> = MapWrapper<'map, LayerData>; +map_wrapper!(Layer => LayerData); impl<'map> Layer<'map> { + /// Get a reference to the layer's name. + pub fn name(&self) -> &str { + self.data.name.as_ref() + } + + /// Get the layer's id. + pub fn id(&self) -> u32 { + self.data.id + } + + /// Whether this layer should be visible or not. + pub fn visible(&self) -> bool { + self.data.visible + } + + /// Get the layer's x offset (in pixels). + pub fn offset_x(&self) -> f32 { + self.data.offset_x + } + + /// Get the layer's y offset (in pixels). + pub fn offset_y(&self) -> f32 { + self.data.offset_y + } + + /// Get the layer's x parallax factor. + pub fn parallax_x(&self) -> f32 { + self.data.parallax_x + } + + /// Get the layer's y parallax factor. + pub fn parallax_y(&self) -> f32 { + self.data.parallax_y + } + + /// Get the layer's opacity. + pub fn opacity(&self) -> f32 { + self.data.opacity + } + + /// Get the layer's tint color. + pub fn tint_color(&self) -> Option<Color> { + self.data.tint_color + } + + /// Get a reference to the layer's properties. + pub fn properties(&self) -> &Properties { + &self.data.properties + } + /// Get the layer's type. pub fn layer_type(&self) -> LayerType<'map> { - LayerType::new(self.map(), &self.data().layer_type) + LayerType::new(self.map, &self.data.layer_type) } } diff --git a/src/layers/object.rs b/src/layers/object.rs index dbae3e8..efe2aa0 100644 --- a/src/layers/object.rs +++ b/src/layers/object.rs @@ -4,10 +4,11 @@ use xml::attribute::OwnedAttribute; use crate::{ parse_properties, - util::{get_attrs, parse_tag, XmlEventResult}, - Color, MapTilesetGid, MapWrapper, Object, ObjectData, Properties, TiledError, + util::{get_attrs, map_wrapper, parse_tag, XmlEventResult}, + Color, Map, MapTilesetGid, Object, ObjectData, Properties, TiledError, }; +/// Raw data referring to a map object layer or tile collision data. #[derive(Debug, PartialEq, Clone)] pub struct ObjectLayerData { pub objects: Vec<ObjectData>, @@ -47,13 +48,50 @@ impl ObjectLayerData { } } -pub type ObjectLayer<'map> = MapWrapper<'map, ObjectLayerData>; +map_wrapper!(ObjectLayer => ObjectLayerData); impl<'map> ObjectLayer<'map> { pub fn get_object(&self, idx: usize) -> Option<Object<'map>> { - self.data() + self.data .objects .get(idx) - .map(|data| Object::new(self.map(), data)) + .map(|data| Object::new(self.map, data)) + } + + pub fn objects(&self) -> Objects<'map> { + Objects::new(self.map, self.data) + } +} + +/// An iterator that iterates over all the objects in an object layer, obtained via [`ObjectLayer::objects`]. +pub struct Objects<'map> { + map: &'map Map, + data: &'map ObjectLayerData, + index: usize, +} + +impl<'map> Objects<'map> { + fn new(map: &'map Map, data: &'map ObjectLayerData) -> Self { + Self { + map, + data, + index: 0, + } + } +} + +impl<'map> Iterator for Objects<'map> { + type Item = Object<'map>; + + fn next(&mut self) -> Option<Self::Item> { + let object_data = self.data.objects.get(self.index)?; + self.index += 1; + Some(Object::new(self.map, object_data)) + } +} + +impl<'map> ExactSizeIterator for Objects<'map> { + fn len(&self) -> usize { + self.data.objects.len() - self.index } } diff --git a/src/layers/tile/finite.rs b/src/layers/tile/finite.rs index 69e8aa7..6ad46e8 100644 --- a/src/layers/tile/finite.rs +++ b/src/layers/tile/finite.rs @@ -1,18 +1,18 @@ use xml::attribute::OwnedAttribute; use crate::{ - util::{get_attrs, XmlEventResult}, - LayerTile, LayerTileData, MapTilesetGid, MapWrapper, TiledError, + util::{get_attrs, map_wrapper, XmlEventResult}, + LayerTile, LayerTileData, MapTilesetGid, TiledError, }; use super::util::parse_data_line; #[derive(PartialEq, Clone, Default)] -pub struct FiniteTileLayerData { +pub(crate) struct FiniteTileLayerData { width: u32, height: u32, /// The tiles are arranged in rows. - pub(crate) tiles: Vec<Option<LayerTileData>>, + tiles: Vec<Option<LayerTileData>>, } impl std::fmt::Debug for FiniteTileLayerData { @@ -58,24 +58,24 @@ impl FiniteTileLayerData { None } } +} + +map_wrapper!(FiniteTileLayer => FiniteTileLayerData); + +impl<'map> FiniteTileLayer<'map> { + pub fn get_tile(&self, x: i32, y: i32) -> Option<LayerTile> { + self.data + .get_tile(x, y) + .and_then(|data| Some(LayerTile::new(self.map(), data))) + } /// Get the tile layer's width in tiles. pub fn width(&self) -> u32 { - self.width + self.data.width } /// Get the tile layer's height in tiles. pub fn height(&self) -> u32 { - self.height - } -} - -pub type FiniteTileLayer<'map> = MapWrapper<'map, FiniteTileLayerData>; - -impl<'map> FiniteTileLayer<'map> { - pub fn get_tile(&self, x: i32, y: i32) -> Option<LayerTile> { - self.data() - .get_tile(x, y) - .and_then(|data| Some(LayerTile::from_data(data, self.map()))) + self.data.height } } diff --git a/src/layers/tile/infinite.rs b/src/layers/tile/infinite.rs index d7b4dcb..96c8f67 100644 --- a/src/layers/tile/infinite.rs +++ b/src/layers/tile/infinite.rs @@ -3,14 +3,14 @@ use std::collections::HashMap; use xml::attribute::OwnedAttribute; use crate::{ - util::{floor_div, get_attrs, parse_tag, XmlEventResult}, - LayerTile, LayerTileData, MapTilesetGid, MapWrapper, TiledError, + util::{floor_div, get_attrs, map_wrapper, parse_tag, XmlEventResult}, + LayerTile, LayerTileData, MapTilesetGid, TiledError, }; use super::util::parse_data_line; #[derive(PartialEq, Clone)] -pub struct InfiniteTileLayerData { +pub(crate) struct InfiniteTileLayerData { chunks: HashMap<(i32, i32), Chunk>, } @@ -143,12 +143,12 @@ impl InternalChunk { } } -pub type InfiniteTileLayer<'map> = MapWrapper<'map, InfiniteTileLayerData>; +map_wrapper!(InfiniteTileLayer => InfiniteTileLayerData); impl<'map> InfiniteTileLayer<'map> { pub fn get_tile(&self, x: i32, y: i32) -> Option<LayerTile> { - self.data() + self.data .get_tile(x, y) - .and_then(|data| Some(LayerTile::from_data(data, self.map()))) + .and_then(|data| Some(LayerTile::new(self.map, data))) } } diff --git a/src/layers/tile/mod.rs b/src/layers/tile/mod.rs index a48608c..c38bd0e 100644 --- a/src/layers/tile/mod.rs +++ b/src/layers/tile/mod.rs @@ -4,8 +4,8 @@ use xml::attribute::OwnedAttribute; use crate::{ parse_properties, - util::{get_attrs, parse_tag, XmlEventResult}, - Gid, Map, MapTilesetGid, Properties, Tile, TileId, TiledError, Tileset, + util::{get_attrs, map_wrapper, parse_tag, XmlEventResult}, + Gid, Map, MapTilesetGid, Properties, Tile, TileId, TiledError, Tileset, }; mod finite; @@ -18,13 +18,15 @@ pub use infinite::*; /// Stores the internal tile gid about a layer tile, along with how it is flipped. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) struct LayerTileData { - /// The index of the tileset this tile's in, relative to the tile's map. - pub(crate) tileset_index: usize, + /// The index of the tileset this tile's in, relative to the tile's map. Guaranteed to be a + /// valid index of the map tileset container, but **isn't guaranteed to actually contain + /// this tile**. + tileset_index: usize, /// The local ID of the tile in the tileset it's in. - pub(crate) id: TileId, - pub flip_h: bool, - pub flip_v: bool, - pub flip_d: bool, + id: TileId, + flip_h: bool, + flip_v: bool, + flip_d: bool, } impl LayerTileData { @@ -104,29 +106,47 @@ impl TileLayerData { } } -#[derive(Debug, Clone, PartialEq)] -pub struct LayerTile<'map> { - pub tileset: &'map Tileset, - pub id: TileId, - pub flip_h: bool, - pub flip_v: bool, - pub flip_d: bool, -} +map_wrapper!(LayerTile => LayerTileData); impl<'map> LayerTile<'map> { - pub(crate) fn from_data(data: &LayerTileData, map: &'map Map) -> Self { - Self { - tileset: &*map.tilesets()[data.tileset_index], - id: data.id, - flip_h: data.flip_h, - flip_v: data.flip_v, - flip_d: data.flip_d, - } - } - /// Get a reference to the layer tile's referenced tile, if it exists. pub fn get_tile(&self) -> Option<&'map Tile> { - self.tileset.get_tile(self.id) + self.get_tileset().get_tile(self.data.id) + } + /// Get a reference to the layer tile's referenced tileset. + pub fn get_tileset(&self) -> &'map Tileset { + // SAFETY: `tileset_index` is guaranteed to be valid + &self.map.tilesets()[self.data.tileset_index] + } + + /// Get the layer tile's tileset index. Guaranteed to be a + /// valid index of the map tileset container, but **isn't guaranteed to actually contain + /// this tile**. + /// + /// Use [`LayerTile::get_tile`] if you want to obtain the [`Tile`] that this layer tile is + /// referencing. + pub fn tileset_index(&self) -> usize { + self.data.tileset_index + } + + /// Get the layer tile's local id within its parent tileset. + pub fn id(&self) -> u32 { + self.data.id + } + + /// Whether this tile is flipped on its Y axis (horizontally). + pub fn flip_h(&self) -> bool { + self.data.flip_h + } + + /// Whether this tile is flipped on its X axis (vertically). + pub fn flip_v(&self) -> bool { + self.data.flip_v + } + + /// Whether this tile is flipped diagonally. + pub fn flip_d(&self) -> bool { + self.data.flip_d } } diff --git a/src/map.rs b/src/map.rs index e32e714..52cdc25 100644 --- a/src/map.rs +++ b/src/map.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, fmt, fs::File, io::Read, path::Path, sync::Arc, str::FromStr}; +use std::{collections::HashMap, fmt, fs::File, io::Read, path::Path, str::FromStr, sync::Arc}; use xml::{attribute::OwnedAttribute, reader::XmlEvent, EventReader}; @@ -312,32 +312,3 @@ impl Gid { #[allow(dead_code)] pub const EMPTY: Gid = Gid(0); } - -/// A wrapper over a naive datatype that holds a reference to the parent map as well as the type's data. -#[derive(Clone, PartialEq, Debug)] -pub struct MapWrapper<'map, DataT> -where - DataT: Clone + PartialEq + std::fmt::Debug, -{ - map: &'map Map, - data: &'map DataT, -} - -impl<'map, DataT> MapWrapper<'map, DataT> -where - DataT: Clone + PartialEq + std::fmt::Debug, -{ - pub(crate) fn new(map: &'map Map, data: &'map DataT) -> Self { - Self { map, data } - } - - /// Get the wrapper's data. - pub fn data(&self) -> &'map DataT { - self.data - } - - /// Get the wrapper's map. - pub fn map(&self) -> &'map Map { - self.map - } -} diff --git a/src/objects.rs b/src/objects.rs index 07d6c34..646577a 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -5,8 +5,8 @@ use xml::attribute::OwnedAttribute; use crate::{ error::TiledError, properties::{parse_properties, Properties}, - util::{get_attrs, parse_tag, XmlEventResult}, - LayerTile, LayerTileData, MapTilesetGid, MapWrapper, + util::{get_attrs, map_wrapper, parse_tag, XmlEventResult}, + LayerTile, LayerTileData, MapTilesetGid, }; #[derive(Debug, PartialEq, Clone)] @@ -18,6 +18,7 @@ pub enum ObjectShape { Point(f32, f32), } +/// Raw data belonging to an object. Used internally and for tile collisions. #[derive(Debug, PartialEq, Clone)] pub struct ObjectData { pub id: u32, @@ -167,13 +168,69 @@ impl ObjectData { } } -pub type Object<'map> = MapWrapper<'map, ObjectData>; +map_wrapper!(Object => ObjectData); impl<'map> Object<'map> { + /// Get the object's id. + pub fn id(&self) -> u32 { + self.data.id + } + /// Returns the tile that the object is using as image, if any. pub fn get_tile(&self) -> Option<LayerTile<'map>> { - self.data() + self.data .tile - .map(|tile| LayerTile::from_data(&tile, self.map())) + .as_ref() + .map(|tile| LayerTile::new(self.map, tile)) + } + + /// Get a reference to the object's name. + pub fn name(&self) -> &str { + self.data.name.as_ref() + } + + /// Get a reference to the object's type. + pub fn obj_type(&self) -> &str { + self.data.obj_type.as_ref() + } + + /// Get the object's width. + pub fn width(&self) -> f32 { + self.data.width + } + + /// Get the object's height. + pub fn height(&self) -> f32 { + self.data.height + } + + /// Get the object's x. + pub fn x(&self) -> f32 { + self.data.x + } + + /// Get object's y. + pub fn y(&self) -> f32 { + self.data.y + } + + /// Get a reference to the object's rotation. + pub fn rotation(&self) -> f32 { + self.data.rotation + } + + /// Whether the object should be visible or not. + pub fn visible(&self) -> bool { + self.data.visible + } + + /// Get a reference to the object's shape. + pub fn shape(&self) -> &ObjectShape { + &self.data.shape + } + + /// Get a reference to the object's properties. + pub fn properties(&self) -> &Properties { + &self.data.properties } } diff --git a/src/tile.rs b/src/tile.rs index ffa1ef6..37b2a79 100644 --- a/src/tile.rs +++ b/src/tile.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, path::Path}; use xml::attribute::OwnedAttribute; use crate::{ - animation::{Frame, parse_animation}, + animation::{parse_animation, Frame}, error::TiledError, image::Image, layers::ObjectLayerData, diff --git a/src/util.rs b/src/util.rs index 44eff99..1afe902 100644 --- a/src/util.rs +++ b/src/util.rs @@ -52,7 +52,30 @@ macro_rules! parse_tag { } } +/// Creates a new type that wraps an internal data type over along with a map. +macro_rules! map_wrapper { + ($name:ident => $data_ty:ty) => { + #[derive(Clone, PartialEq, Debug)] + pub struct $name<'map> { + pub(crate) map: &'map $crate::Map, + pub(crate) data: &'map $data_ty, + } + + impl<'map> $name<'map> { + pub(crate) fn new(map: &'map $crate::Map, data: &'map $data_ty) -> Self { + Self { map, data } + } + + /// Get the map this object is from. + pub fn map(&self) -> &'map $crate::Map { + self.map + } + } + }; +} + pub(crate) use get_attrs; +pub(crate) use map_wrapper; pub(crate) use parse_tag; use crate::{Gid, MapTilesetGid}; diff --git a/tests/lib.rs b/tests/lib.rs index 37e6b7f..d6ff22b 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -42,9 +42,11 @@ fn compare_everything_but_tileset_sources(r: &Map, e: &Map) { assert_eq!(r.properties, e.properties); assert_eq!(r.background_color, e.background_color); assert_eq!(r.infinite, e.infinite); + // TODO: Also compare layers + /* r.layers() .zip(e.layers()) - .for_each(|(r, e)| assert_eq!(r.data(), e.data())); + .for_each(|(r, e)| assert_eq!(r, e)); */ } #[test] @@ -62,15 +64,14 @@ fn test_gzip_and_zlib_encoded_and_raw_are_the_same() { let layer = as_finite(as_tile_layer(c.get_layer(0).unwrap())); { - let data = layer.data(); - assert_eq!(data.width(), 100); - assert_eq!(data.height(), 100); + assert_eq!(layer.width(), 100); + assert_eq!(layer.height(), 100); } - assert_eq!(layer.get_tile(0, 0).unwrap().id, 34); - assert_eq!(layer.get_tile(0, 1).unwrap().id, 16); + assert_eq!(layer.get_tile(0, 0).unwrap().id(), 34); + assert_eq!(layer.get_tile(0, 1).unwrap().id(), 16); assert!(layer.get_tile(0, 2).is_none()); - assert_eq!(layer.get_tile(1, 2).unwrap().id, 16); + assert_eq!(layer.get_tile(1, 2).unwrap().id(), 16); assert!((0..99).map(|x| layer.get_tile(x, 99)).all(|t| t.is_none())); } @@ -116,30 +117,30 @@ fn test_infinite_tileset() { let r = Map::parse_file("assets/tiled_base64_zlib_infinite.tmx", &mut cache).unwrap(); if let TileLayer::Infinite(inf) = &as_tile_layer(r.get_layer(1).unwrap()) { - assert_eq!(inf.get_tile(2, 10).unwrap().id, 5); - assert_eq!(inf.get_tile(5, 36).unwrap().id, 73); - assert_eq!(inf.get_tile(15, 15).unwrap().id, 22); + assert_eq!(inf.get_tile(2, 10).unwrap().id(), 5); + assert_eq!(inf.get_tile(5, 36).unwrap().id(), 73); + assert_eq!(inf.get_tile(15, 15).unwrap().id(), 22); } else { assert!(false, "It is wrongly recognised as a finite map"); } if let TileLayer::Infinite(inf) = &as_tile_layer(r.get_layer(0).unwrap()) { // NW corner - assert_eq!(inf.get_tile(-16, 0).unwrap().id, 17); + assert_eq!(inf.get_tile(-16, 0).unwrap().id(), 17); assert!(inf.get_tile(-17, 0).is_none()); assert!(inf.get_tile(-16, -1).is_none()); // SW corner - assert_eq!(inf.get_tile(-16, 47).unwrap().id, 17); + assert_eq!(inf.get_tile(-16, 47).unwrap().id(), 17); assert!(inf.get_tile(-17, 47).is_none()); assert!(inf.get_tile(-16, 48).is_none()); // NE corner - assert_eq!(inf.get_tile(31, 0).unwrap().id, 17); + assert_eq!(inf.get_tile(31, 0).unwrap().id(), 17); assert!(inf.get_tile(31, -1).is_none()); assert!(inf.get_tile(32, 0).is_none()); // SE corner - assert_eq!(inf.get_tile(31, 47).unwrap().id, 17); + assert_eq!(inf.get_tile(31, 47).unwrap().id(), 17); assert!(inf.get_tile(32, 47).is_none()); assert!(inf.get_tile(31, 48).is_none()); } else { @@ -154,29 +155,28 @@ fn test_image_layers() { let r = Map::parse_file("assets/tiled_image_layers.tmx", &mut cache).unwrap(); assert_eq!(r.layers().len(), 2); let mut image_layers = r.layers().map(|layer| { - if let LayerType::ImageLayer(img) = &layer.layer_type() { - (img.data(), layer.data()) + if let LayerType::ImageLayer(img) = layer.layer_type() { + (img, layer) } else { panic!("Found layer that isn't an image layer") } }); { let first = image_layers.next().unwrap(); - assert_eq!(first.1.name, "Image Layer 1"); + assert_eq!(first.1.name(), "Image Layer 1"); assert!( - first.0.image.is_none(), + first.0.image().is_none(), "{}'s image should be None", - first.1.name + first.1.name() ); } { let second = image_layers.next().unwrap(); - assert_eq!(second.1.name, "Image Layer 2"); + assert_eq!(second.1.name(), "Image Layer 2"); let image = second .0 - .image - .as_ref() - .expect(&format!("{}'s image shouldn't be None", second.1.name)); + .image() + .expect(&format!("{}'s image shouldn't be None", second.1.name())); assert_eq!(image.source, PathBuf::from("assets/tilesheet.png")); assert_eq!(image.width, 448); assert_eq!(image.height, 192); @@ -207,7 +207,7 @@ fn test_layer_property() { let r = Map::parse_file("assets/tiled_base64.tmx", &mut cache).unwrap(); let prop_value: String = if let Some(&PropertyValue::StringValue(ref v)) = - r.get_layer(0).unwrap().data().properties.get("prop3") + r.get_layer(0).unwrap().properties().get("prop3") { v.clone() } else { @@ -225,7 +225,7 @@ fn test_object_group_property() { let group_layer = as_group_layer(group_layer); let sub_layer = group_layer.get_layer(0).unwrap(); let prop_value: bool = if let Some(&PropertyValue::BoolValue(ref v)) = - sub_layer.data().properties.get("an object group property") + sub_layer.properties().get("an object group property") { *v } else { @@ -259,21 +259,21 @@ fn test_flipped() { let t2 = layer.get_tile(1, 0).unwrap(); let t3 = layer.get_tile(0, 1).unwrap(); let t4 = layer.get_tile(1, 1).unwrap(); - assert_eq!(t1.id, t2.id); - assert_eq!(t2.id, t3.id); - assert_eq!(t3.id, t4.id); - assert!(t1.flip_d); - assert!(t1.flip_h); - assert!(t1.flip_v); - assert!(!t2.flip_d); - assert!(!t2.flip_h); - assert!(t2.flip_v); - assert!(!t3.flip_d); - assert!(t3.flip_h); - assert!(!t3.flip_v); - assert!(t4.flip_d); - assert!(!t4.flip_h); - assert!(!t4.flip_v); + assert_eq!(t1.id(), t2.id()); + assert_eq!(t2.id(), t3.id()); + assert_eq!(t3.id(), t4.id()); + assert!(t1.flip_d()); + assert!(t1.flip_h()); + assert!(t1.flip_v()); + assert!(!t2.flip_d()); + assert!(!t2.flip_h()); + assert!(t2.flip_v()); + assert!(!t3.flip_d()); + assert!(t3.flip_h()); + assert!(!t3.flip_v()); + assert!(t4.flip_d()); + assert!(!t4.flip_h()); + assert!(!t4.flip_v()); } #[test] @@ -283,12 +283,11 @@ fn test_ldk_export() { let r = Map::parse_file("assets/ldk_tiled_export.tmx", &mut cache).unwrap(); let layer = as_finite(as_tile_layer(r.get_layer(0).unwrap())); { - let data = layer.data(); - assert_eq!(data.width(), 8); - assert_eq!(data.height(), 8); + assert_eq!(layer.width(), 8); + assert_eq!(layer.height(), 8); } assert!(layer.get_tile(0, 0).is_none()); - assert_eq!(layer.get_tile(0, 1).unwrap().id, 0); + assert_eq!(layer.get_tile(0, 1).unwrap().id(), 0); } #[test] @@ -297,22 +296,21 @@ fn test_parallax_layers() { let r = Map::parse_file("assets/tiled_parallax.tmx", &mut cache).unwrap(); for (i, layer) in r.layers().enumerate() { - let data = layer.data(); match i { 0 => { - assert_eq!(data.name, "Background"); - assert_eq!(data.parallax_x, 0.5); - assert_eq!(data.parallax_y, 0.75); + assert_eq!(layer.name(), "Background"); + assert_eq!(layer.parallax_x(), 0.5); + assert_eq!(layer.parallax_y(), 0.75); } 1 => { - assert_eq!(data.name, "Middle"); - assert_eq!(data.parallax_x, 1.0); - assert_eq!(data.parallax_y, 1.0); + assert_eq!(layer.name(), "Middle"); + assert_eq!(layer.parallax_x(), 1.0); + assert_eq!(layer.parallax_y(), 1.0); } 2 => { - assert_eq!(data.name, "Foreground"); - assert_eq!(data.parallax_x, 2.0); - assert_eq!(data.parallax_y, 2.0); + assert_eq!(layer.name(), "Foreground"); + assert_eq!(layer.parallax_x(), 2.0); + assert_eq!(layer.parallax_y(), 2.0); } _ => panic!("unexpected layer"), } @@ -325,10 +323,11 @@ fn test_object_property() { let r = Map::parse_file("assets/tiled_object_property.tmx", &mut cache).unwrap(); let layer = r.get_layer(1).unwrap(); - let prop_value = if let Some(PropertyValue::ObjectValue(v)) = - as_object_layer(layer).data().objects[0] - .properties - .get("object property") + let prop_value = if let Some(PropertyValue::ObjectValue(v)) = as_object_layer(layer) + .get_object(0) + .unwrap() + .properties() + .get("object property") { *v } else { @@ -343,7 +342,7 @@ fn test_tint_color() { let r = Map::parse_file("assets/tiled_image_layers.tmx", &mut cache).unwrap(); assert_eq!( - r.get_layer(0).unwrap().data().tint_color, + r.get_layer(0).unwrap().tint_color(), Some(Color { alpha: 0x12, red: 0x34, @@ -352,7 +351,7 @@ fn test_tint_color() { }) ); assert_eq!( - r.get_layer(1).unwrap().data().tint_color, + r.get_layer(1).unwrap().tint_color(), Some(Color { alpha: 0xFF, red: 0x12, @@ -375,15 +374,15 @@ fn test_group_layers() { assert_eq!( Some(&PropertyValue::StringValue("value1".to_string())), - layer_tile_1.data().properties.get("key") + layer_tile_1.properties().get("key") ); assert_eq!( Some(&PropertyValue::StringValue("value4".to_string())), - layer_group_1.data().properties.get("key") + layer_group_1.properties().get("key") ); assert_eq!( Some(&PropertyValue::StringValue("value5".to_string())), - layer_group_2.data().properties.get("key") + layer_group_2.properties().get("key") ); // Depth = 1 @@ -393,11 +392,11 @@ fn test_group_layers() { let layer_group_3 = layer_group_2.get_layer(0).unwrap(); assert_eq!( Some(&PropertyValue::StringValue("value2".to_string())), - layer_tile_2.data().properties.get("key") + layer_tile_2.properties().get("key") ); assert_eq!( Some(&PropertyValue::StringValue("value6".to_string())), - layer_group_3.data().properties.get("key") + layer_group_3.properties().get("key") ); // Depth = 2 @@ -405,6 +404,6 @@ fn test_group_layers() { let layer_tile_3 = layer_group_3.get_layer(0).unwrap(); assert_eq!( Some(&PropertyValue::StringValue("value3".to_string())), - layer_tile_3.data().properties.get("key") + layer_tile_3.properties().get("key") ); } -- GitLab