use macroquad::prelude::*;
use crate::prelude::{Context, TileMapLayerComponent};
use crate::graphics::tiled_map::components::TileMapComponent;
use crate::camera::camera2d::components::{CameraComponent, MainCamera};
fn get_visible_world_rect(ctx: &mut Context) -> Rect {
let mut active_camera: Option<&Camera2D> = None;
let mut query = ctx.world.query::<(&CameraComponent, &MainCamera)>();
for (_, (cam_comp, _)) in query.iter() {
active_camera = Some(&cam_comp.camera);
break;
}
if let Some(cam) = active_camera {
let top_left = cam.screen_to_world(vec2(0.0, 0.0));
let bottom_right = cam.screen_to_world(vec2(screen_width(), screen_height()));
Rect::new(
top_left.x,
top_left.y,
bottom_right.x - top_left.x,
bottom_right.y - top_left.y
)
} else {
Rect::new(0.0, 0.0, screen_width(), screen_height())
}
}
pub fn tilemap_render_system(ctx: &mut Context) {
let visible_rect = get_visible_world_rect(ctx);
for (_, tileset_comp) in ctx.world.query::<&TileMapComponent>().iter() {
let map_id = &tileset_comp.0;
if let Some(rendered_map) = ctx.asset_server.get_renderer_map(map_id) {
draw_texture_ex(
&rendered_map.texture.texture,
0.0,
0.0,
WHITE,
DrawTextureParams {
dest_size: Some(vec2(rendered_map.width, rendered_map.height)),
..Default::default()
}
);
}
else if let Some(map) = ctx.asset_server.get_map(map_id) {
for layer_name in map.tile_layers.keys() {
ctx.asset_server.render_layer(
map_id,
layer_name,
Some(visible_rect) );
}
}
}
}
pub fn tilemap_layer_render_system(ctx: &mut Context) {
let visible_rect = get_visible_world_rect(ctx);
for (_, layer_comp) in ctx.world.query::<&TileMapLayerComponent>().iter() {
ctx.asset_server.render_layer(
&layer_comp.tilemap_name,
&layer_comp.layer_name,
Some(visible_rect)
);
}
}