bevy_tilemap 0.2.2

Tile maps with chunks for the Bevy game engine, a simple-driven game engine and app framework
Documentation
# Changelog


All notable changes to this project will be documented in this file. Usually 
just additions, fixes as well as if the API had been added to.

This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]


## [0.2.2] - 2020-11-23


### Added


* `Tilemap::clear_tile` was added to easily clear a single tile.
* `Tilemap::clear_tiles` likewise will clear an array of tiles.
* `Point2` now implements `From<&Point2>`.
* `Point3` now implements `From<&Point3>`.
* `tilemap::Tilemap::set_tiles` now implements 
`IntoIterator<Item = ((i32, i32, i32), Tile)>` which had broken the previous 
compatibility.
* `tile::Tile` had the `non_exhaustive` derive added it now that the fields are
all public.
* `tile::Tile` added methods `with_tint` and `with_tint_and_z_order`.
* `chunk_update_system` was added internally to manage chunks and to get them to
update if needed.

### Changed


* `random_dungeon` example was updated to be interactive.
* `Tilemap::set_tiles` was changed to take in a `IntoIterator<Item = Tile<P, C>`,
where `C` is `Into<Color>` and P is `Into<Point2>`, from 
`IntoIterator<Item = (i32, i32, i32), Tile>`.
* `tile::Tile` was changed to include `z_order`, `sprite_index`, and `point`.
Field `color` is now `tint`. All fields were made public.
* `tile::Tile` methods `default`, `new` updated.
* `ChunkDimensions` was made private, it should never of been exposed but I also
very much doubt anyone would have used it.
* `map_system` was made private, it should never of been exposed.
* `add_tile` was renamed to `insert_tile`.
* `add_tiles` was renamed to `insert_tiles`.
* `clear_tile` was renamed to `remove_tile`.
* `clear_tiles` was renamed to `remove_tiles`.

**Before**
```rust
let z_order = 0;
let point = (1, 1, z_order)
let tile = Tile::new(0);
let tiles = vec![(point, tile)];
 
// defined elsewhere
tilemap.set_tiles(tiles).unwrap();
```

**After**
```rust
let point = (1, 1);
let z_order = 0;
let tiles = vec![Tile::new(point, z_order)];

// defined elsewhere
tilemap.set_tiles(tiles).unwrap();
```

* `Tilemap::set_tile` was changed to take in `Tile<P, C>`, where `P` is 
`Into<Point2>` and `C` is `Into<Color>`. This replaces the previous argument
`P` and `T` where `T` was `Into<Tile>`.

**Before**
```rust
let point = (9, 3, 0);
let sprite_index = 3;
let tile = Tile::new(sprite_index);

// defined elsewhere
tilemap.set(point, tile).unwrap();
```

**After**
```rust
let point = (9, 3);
let sprite_index = 3;
let tile = Tile::new(point, sprite_index);

tilemap.set_tile(tile).unwrap();
```

### Removed


* `tile::Tiles` was removed as it is no longer needed as all data as been set
into `Tile` to make everything easier.
* `tile::Tiles` was removed from `prelude`.
* `tile::Tile` methods `index` and `color` were removed as the fields are now
public.
* `tile::Tile` all `<Into<Tile>>` implements were removed.

## [0.2.1] - 2020-11-21


### Added


* Minimum supported rust version (MSRV) were noted to be 1.43.0 in documents.

### Fixes


* Coordinates were fixed so that 0,0 is now by default the center of the area,
not the bottom left per chunk.
* Coordinates outside of a single chunk were fixed so that they do not cause a
panic.
* Missing doc links were fixed.

### Changed


* `Tilemap::set_tiles` now implements `IntoIterator<Item = ((i32, i32, i32), Tile)>`
which had broken the previous compatibility.

**Before**
```rust
let mut tiles = Tiles::default();
for y in 0..31 {
    for x in 0..31 {
        tiles.insert((x, y, 0), 0.into());
    }
}

// Constructed Tilemap
tilemap.set_tiles(&mut tiles);
```

**After**
```rust
let mut tiles = Tiles::default();
for y in 0..31 {
    for x in 0..31 {
        tiles.insert((x, y, 0), 0.into());
    }
}

// Constructed tilemap
tilemap.set_tiles(tiles);
```

### Removed


* `Point2` impl `AsRef<(i32, i32)>` and `AsMut<(i32, i32)>` as it is not 
possible to deprecate it.

### Deprecated


* `Point2` methods `.x()` and `.y()` were deprecated to be inline with glam 
crate.
* `Point3` methods `.x()`, `.x()`, and `.z()` were deprecated to be inline with 
glam crate.

### Upgrade notes


Unfortunately some fairly big issues were released as more examples were being
made. These were fairly critical as they absolutely hindered the goals of the 
library. These have now since been fixed. Thanks to all that pointed out the
issues.

## [0.2.0] - 2020-11-20


### Added


* `ChunkDimensions` component to help the renderer know the dimensions of a 
chunk.
* `Layer` trait was added internally to implement the same methods on layers.
* `DenseLayer` and `SparseLayer` structs were added internally to provide
different methods of storing tiles.
* `LayerKind` enum was added to help specify what kind of layer needs to be
created.
* `LayerKindInner` enum was added internally to help wrap `DenseLayer` and 
`SparseLayer`.
* `Chunk` struct was added internally to store its location and sprite layers.
* `ChunkComponents` entity was added internally to help spawn chunks.
* `TilemapComponents` entity was added to help spawn tilemaps.
* `prelude` module was added versioned.
* `ChunkMesh` was added to add meshes to rendered layers.
* `point` module was added publicly with `Point2` and `Point3` structs which 
help with various operations to do with coordinates. They are not required to
be used at all.
* Render pipelines were added with GLSL shader files.
* `Tile` struct was added publicly which stores the index value of a texture
in a texture atlas.
* `Tiles` a type for `Hashmap<(i32, i32, i32), Tile>` was added publicly. Helps
to set tiles in bulk.
* `TilePoints` was added privately which is similar to `Tiles` but stores the
new `Point3`s instead.
* `dense_tiles_to_attributes` and `sparse_tiles_to_attributes` were added to 
help turn layers into attributes for the renderer.
* `Tilemap` was added with a variety of new public API to help construct new
tilemaps.
* `TilemapBuilder` factory was added to help construct new `Tilemap`s.
* Chunks with odd dimensions can now be spawned. (Thanks @blamelessgames!)

### Changed


* Updated `random_dungeon` example to use latest features.
* Changed `serde` to be and optional feature.
* Changed `Dimension2` and `Dimension3` into a struct and changed them
extensively. They were also made into private API.
* Changed `map_system` had been updated to accommodate for the new `Tilemap`.

### Broken API


* `Chunk` trait was made into a struct and vastly changed as well as made 
internal.
* `WorldChunk` struct was removed entirely.
* `WorldMap` struct was removed entirely.
* `Tile` trait was removed and replaced with a `Tile` struct.
* `coord` module was removed entirely.
* `dimension` module was made internal.
* `Dimension2` and `Dimension3` traits were made into structs and made internal.
* `ChunkTilesPlugin` had all the generic traits removed, replaced with structs.
This makes it easier for people to use the library and encourages others to
help contribute instead of keeping all the sweet updates to themselves. In the
future, generic traits will likely be brought back.
* `DimesionError` and `DimensionResult` were made private.
* `MapError` was renamed to `TilemapError` and made private. 
* `MapResult` was renamed to `TilemapResult` and made private.
* `MapEvent` was renamed to `TilemapEvent` and made private.

### Upgrade Notes


The breakpocalypse is here... But with good reasons why!

This was the actual update that made tilemap into mostly what was intended to be
on release however, due to the clear early need a naive version was pushed for
v0.1.0. Before, everything was rendered from textures that were made by the CPU
for use with the GPU. Through proper research, help from the Bevy community, and
education on GLSL shaders, shaders were created to offload all the work onto the
GPU.

The huge downside though is that pretty much 98% of the API had been broken
entirely. So, extra time and effort was put in this time to ensure that the API
will be stable from now on and going forward. Proper deprecation warnings and 
everything will be done from here on.

It was really considered to bring back all the API but, that would have been
too much work from here and onwards. Plus, it was warned that the API will be
broken between v0.1 and v0.2.

### Key points


- No more CPU work, all on the GPU with GLSL shaders.
- Huge breaking API changes everywhere, oh my! (I warned it would happen :)...)
- All traits removed, replaced with structs for early day simplicity.
- Dense and sparse layers were added to cut down on data use and increase 
performance where necessary.

### Thanks


Thank you so much @alec-deason, @alexschrod and @superdump for all your feedback, suggestions
and help understanding everything needed for this release.

## [0.1.0] - 2020-11-04


### Notes

* Rebranded from `bevy_chunk_tiles` to `bevy_tilemap`.
* `TileSetter` had a `push_stack` method added to it which allows for a whole 
`Vec<Tile>`. This is then rendered from index 0. For example, if you want to 
render a character sprite with a tile background you would push the tile in 
first then add in the character after. It is recommended to track if the floor
tile in that previous example had something on top of it before or not to cut 
down on pushing the floor tile twice, which is wasteful.

### Added

- [Tile texture stack]https://github.com/joshuajbouw/bevy_tilemap/commit/d91f9a97645d7f7692ccd532fc3cb941c0c58764
- [Multi-thread map events]https://github.com/joshuajbouw/bevy_tilemap/commit/3312090ae3eba9a8e7edf87aaaf63d1cf96ecc07
- [Initial commit]https://github.com/joshuajbouw/bevy_tilemap/commit/764b79e037b292d473220f43d9c8776ce626d6cb

### Fixes

- [Fix obscure `no_implicit_prelude` issue with serde.]https://github.com/joshuajbouw/bevy_tilemap/commit/33c1317d65be3c1a0d511a2527745046cfd273fb
- [Remove dangerous access to tiles mutably]https://github.com/joshuajbouw/bevy_tilemap/commit/90cc791a4f3d8f36421a01451020fbc927e226b2

## [0.1.0-pre] - 2020-11-03


### Notes

* Initial release