From ca47efba429f791278b0576f7c9f9a729db86ed4 Mon Sep 17 00:00:00 2001 From: lisk77 Date: Sat, 25 Oct 2025 01:43:34 +0200 Subject: [PATCH] feat(renderer2d): added a simple draw order to the Renderer2D which can be defined by the draw_index in the Render2D component --- crates/comet_ecs/src/component.rs | 21 +++++++++++++++++++++ crates/comet_renderer/src/renderer2d.rs | 15 ++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/crates/comet_ecs/src/component.rs b/crates/comet_ecs/src/component.rs index 8f1a845..cfba8a8 100755 --- a/crates/comet_ecs/src/component.rs +++ b/crates/comet_ecs/src/component.rs @@ -46,6 +46,7 @@ pub struct Render2D { is_visible: bool, texture_name: &'static str, scale: v2, + draw_index: u32, } #[derive(Component)] @@ -62,6 +63,7 @@ pub struct Text { font_size: f32, color: Color, is_visible: bool, + bounds: v2, } #[derive(Component)] @@ -274,11 +276,21 @@ impl Collider for Rectangle2D { } impl Render2D { + pub fn new(texture: &'static str, is_visible: bool, scale: v2, draw_index: u32) -> Self { + Self { + is_visible, + texture_name: texture, + scale, + draw_index, + } + } + pub fn with_texture(texture: &'static str) -> Self { Self { is_visible: true, texture_name: texture, scale: v2::new(1.0, 1.0), + draw_index: 0, } } @@ -289,6 +301,14 @@ impl Render2D { pub fn set_scale(&mut self, scale: v2) { self.scale = scale; } + + pub fn draw_index(&self) -> u32 { + self.draw_index + } + + pub fn set_draw_index(&mut self, index: u32) { + self.draw_index = index + } } impl Render for Render2D { @@ -449,6 +469,7 @@ impl Text { font_size, color: Color::from_wgpu_color(color.to_wgpu()), is_visible, + bounds: v2::ZERO, } } diff --git a/crates/comet_renderer/src/renderer2d.rs b/crates/comet_renderer/src/renderer2d.rs index 2450d74..ba29c82 100755 --- a/crates/comet_renderer/src/renderer2d.rs +++ b/crates/comet_renderer/src/renderer2d.rs @@ -686,7 +686,15 @@ impl<'a> Renderer2D<'a> { return; } - let entities = scene.get_entities_with(vec![Transform2D::type_id(), Render2D::type_id()]); + let mut entities = + scene.get_entities_with(vec![Transform2D::type_id(), Render2D::type_id()]); + + entities.sort_by(|&a, &b| { + let ra = scene.get_component::(a).unwrap(); + let rb = scene.get_component::(b).unwrap(); + ra.draw_index().cmp(&rb.draw_index()) + }); + let texts = scene.get_entities_with(vec![Transform2D::type_id(), comet_ecs::Text::type_id()]); @@ -713,8 +721,9 @@ impl<'a> Renderer2D<'a> { let region = t_region.unwrap(); let (dim_x, dim_y) = region.dimensions(); - let half_width = dim_x as f32 * 0.5; - let half_height = dim_y as f32 * 0.5; + let scale = renderer_component.scale(); + let half_width = dim_x as f32 * 0.5 * scale.x(); + let half_height = dim_y as f32 * 0.5 * scale.y(); let buffer_size = vertex_buffer.len() as u16;