feat: debug visualizer for dirty rects

fix/collision-refresh
hheik 2022-12-12 04:36:44 +02:00
parent 21255120c5
commit 2bdc5182a5
2 changed files with 48 additions and 2 deletions

View File

@ -4,6 +4,7 @@ use std::collections::{
}; };
use bevy::prelude::*; use bevy::prelude::*;
use bevy_prototype_debug_lines::DebugLines;
mod chunk2d; mod chunk2d;
mod terrain_gen2d; mod terrain_gen2d;
@ -22,6 +23,10 @@ impl Plugin for Terrain2DPlugin {
app.register_type::<TerrainChunk2D>() app.register_type::<TerrainChunk2D>()
.insert_resource(Terrain2D::new()) .insert_resource(Terrain2D::new())
.add_event::<TerrainEvent2D>() .add_event::<TerrainEvent2D>()
.add_system_to_stage(
CoreStage::PostUpdate,
dirty_rect_visualizer.before(emit_terrain_events),
)
.add_system_to_stage(CoreStage::PostUpdate, emit_terrain_events) .add_system_to_stage(CoreStage::PostUpdate, emit_terrain_events)
.add_system(chunk_spawner) .add_system(chunk_spawner)
.add_system(chunk_sprite_sync) .add_system(chunk_sprite_sync)
@ -29,12 +34,43 @@ impl Plugin for Terrain2DPlugin {
} }
} }
/**
Visualize dirty rects
*/
fn dirty_rect_visualizer(terrain: Res<Terrain2D>, mut debug_draw: ResMut<DebugLines>) {
for (chunk_index, chunk) in terrain.chunk_iter() {
let rect = if let Some(rect) = chunk.dirty_rect {
rect
} else {
continue;
};
let color = Color::RED;
let points = vec![
Vec3::new(rect.min.x as f32, rect.min.y as f32, 0.0),
Vec3::new((rect.max.x + 1) as f32, rect.min.y as f32, 0.0),
Vec3::new((rect.max.x + 1) as f32, (rect.max.y + 1) as f32, 0.0),
Vec3::new(rect.min.x as f32, (rect.max.y + 1) as f32, 0.0),
];
for i in 0..points.len() {
let offset = Vec3::from(chunk_index_to_global(chunk_index));
debug_draw.line_colored(
offset + points[i],
offset + points[(i + 1) % points.len()],
0.0,
color,
);
}
}
}
fn emit_terrain_events( fn emit_terrain_events(
mut terrain: ResMut<Terrain2D>, mut terrain: ResMut<Terrain2D>,
mut terrain_events: EventWriter<TerrainEvent2D>, mut terrain_events: EventWriter<TerrainEvent2D>,
) { ) {
for event in terrain.events.drain(..) { for event in terrain.events.drain(..) {
terrain_events.send(event) terrain_events.send(event);
} }
for (chunk_index, chunk) in terrain.chunk_iter_mut() { for (chunk_index, chunk) in terrain.chunk_iter_mut() {
if let Some(rect) = &chunk.dirty_rect { if let Some(rect) = &chunk.dirty_rect {

View File

@ -1,4 +1,4 @@
use bevy::prelude::Vec2; use bevy::prelude::*;
use super::Vector2; use super::Vector2;
@ -25,3 +25,13 @@ impl From<Vector2I> for Vec2 {
} }
} }
} }
impl From<Vector2I> for Vec3 {
fn from(vec: Vector2I) -> Self {
Vec3 {
x: vec.x as f32,
y: vec.y as f32,
z: 0.0,
}
}
}