#![allow(dead_code)]
use bevy::prelude::{
Bundle, Changed, Component, Deref, First, GlobalTransform, InheritedVisibility, Plugin, Query,
Reflect, ReflectComponent, Transform, ViewVisibility, Visibility,
};
#[cfg(feature = "render")]
use bevy::prelude::Handle;
use map::{
TilemapGridSize, TilemapSize, TilemapSpacing, TilemapTexture, TilemapTextureSize,
TilemapTileSize, TilemapType,
};
use prelude::{TilemapId, TilemapRenderSettings};
#[cfg(feature = "render")]
use render::material::{MaterialTilemap, StandardTilemapMaterial};
use tiles::{
AnimatedTile, TileColor, TileFlip, TilePos, TilePosOld, TileStorage, TileTextureIndex,
TileVisible,
};
#[cfg(all(not(feature = "atlas"), feature = "render"))]
use bevy::render::{ExtractSchedule, RenderApp};
#[cfg(all(not(feature = "atlas"), feature = "render"))]
mod array_texture_preload;
pub mod helpers;
pub mod map;
#[cfg(feature = "render")]
pub(crate) mod render;
pub mod tiles;
pub struct TilemapPlugin;
impl Plugin for TilemapPlugin {
fn build(&self, app: &mut bevy::prelude::App) {
#[cfg(feature = "render")]
app.add_plugins(render::TilemapRenderingPlugin);
app.add_systems(First, update_changed_tile_positions);
#[cfg(all(not(feature = "atlas"), feature = "render"))]
{
app.insert_resource(array_texture_preload::ArrayTextureLoader::default());
let render_app = app.sub_app_mut(RenderApp);
render_app.add_systems(ExtractSchedule, array_texture_preload::extract);
}
app.register_type::<FrustumCulling>()
.register_type::<TilemapId>()
.register_type::<TilemapSize>()
.register_type::<TilemapTexture>()
.register_type::<TilemapTileSize>()
.register_type::<TilemapGridSize>()
.register_type::<TilemapSpacing>()
.register_type::<TilemapTextureSize>()
.register_type::<TilemapType>()
.register_type::<TilePos>()
.register_type::<TileTextureIndex>()
.register_type::<TileColor>()
.register_type::<TileVisible>()
.register_type::<TileFlip>()
.register_type::<TileStorage>()
.register_type::<TilePosOld>()
.register_type::<AnimatedTile>();
}
}
#[derive(Component, Reflect, Debug, Clone, Copy, Deref)]
#[reflect(Component)]
pub struct FrustumCulling(pub bool);
impl Default for FrustumCulling {
fn default() -> Self {
FrustumCulling(true)
}
}
#[cfg(feature = "render")]
pub type TilemapBundle = MaterialTilemapBundle<StandardTilemapMaterial>;
#[cfg(feature = "render")]
#[derive(Bundle, Debug, Default, Clone)]
pub struct MaterialTilemapBundle<M: MaterialTilemap> {
pub grid_size: TilemapGridSize,
pub map_type: TilemapType,
pub size: TilemapSize,
pub spacing: TilemapSpacing,
pub storage: TileStorage,
pub texture: TilemapTexture,
pub tile_size: TilemapTileSize,
pub transform: Transform,
pub global_transform: GlobalTransform,
pub render_settings: TilemapRenderSettings,
pub visibility: Visibility,
pub inherited_visibility: InheritedVisibility,
pub view_visibility: ViewVisibility,
pub frustum_culling: FrustumCulling,
pub material: Handle<M>,
}
#[cfg(not(feature = "render"))]
#[derive(Bundle, Debug, Default, Clone)]
pub struct StandardTilemapBundle {
pub grid_size: TilemapGridSize,
pub map_type: TilemapType,
pub size: TilemapSize,
pub spacing: TilemapSpacing,
pub storage: TileStorage,
pub texture: TilemapTexture,
pub tile_size: TilemapTileSize,
pub transform: Transform,
pub global_transform: GlobalTransform,
pub render_settings: TilemapRenderSettings,
pub visibility: Visibility,
pub inherited_visibility: InheritedVisibility,
pub view_visibility: ViewVisibility,
pub frustum_culling: FrustumCulling,
}
pub mod prelude {
#[cfg(all(not(feature = "atlas"), feature = "render"))]
pub use crate::array_texture_preload::*;
pub use crate::helpers;
pub use crate::helpers::filling::*;
pub use crate::helpers::geometry::*;
pub use crate::helpers::transform::*;
pub use crate::map::*;
#[cfg(feature = "render")]
pub use crate::render::material::MaterialTilemap;
#[cfg(feature = "render")]
pub use crate::render::material::MaterialTilemapKey;
#[cfg(feature = "render")]
pub use crate::render::material::MaterialTilemapPlugin;
#[cfg(feature = "render")]
pub use crate::render::material::StandardTilemapMaterial;
pub use crate::tiles::*;
#[cfg(feature = "render")]
pub use crate::MaterialTilemapBundle;
#[cfg(feature = "render")]
pub use crate::TilemapBundle;
pub use crate::TilemapPlugin;
}
fn update_changed_tile_positions(mut query: Query<(&TilePos, &mut TilePosOld), Changed<TilePos>>) {
for (tile_pos, mut tile_pos_old) in query.iter_mut() {
tile_pos_old.0 = *tile_pos;
}
}