From 2d36d49b1394ab7551738f1e90a6055e48f08421 Mon Sep 17 00:00:00 2001 From: Ryan Walters Date: Thu, 4 Sep 2025 16:09:46 -0500 Subject: [PATCH] feat: enumerate and display render driver info, increase node id text opacity --- src/app.rs | 40 ++++++++++++++++++++++++++++++++++++++++ src/systems/debug.rs | 18 ++++++++---------- src/systems/input.rs | 17 +++++++++++++++-- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/src/app.rs b/src/app.rs index 9e4c1fd..db5d8b4 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::time::{Duration, Instant}; use crate::error::{GameError, GameResult}; @@ -5,7 +6,10 @@ use crate::error::{GameError, GameResult}; use crate::constants::{CANVAS_SIZE, LOOP_TIME, SCALE}; use crate::game::Game; use crate::platform; +use sdl2::pixels::PixelFormatEnum; +use sdl2::render::RendererInfo; use sdl2::{AudioSubsystem, Sdl}; +use tracing::debug; /// Main application wrapper that manages SDL initialization, window lifecycle, and the game loop. /// @@ -50,15 +54,51 @@ impl App { .build() .map_err(|e| GameError::Sdl(e.to_string()))?; + #[derive(Debug)] + struct DriverDetail { + info: RendererInfo, + index: usize, + } + + let drivers: HashMap<&'static str, DriverDetail> = sdl2::render::drivers() + .enumerate() + .map(|(index, d)| (d.name, DriverDetail { info: d, index })) + .collect::>(); + + let get_driver = + |name: &'static str| -> Option { drivers.get(name.to_lowercase().as_str()).map(|d| d.index as u32) }; + + { + let mut names = drivers.keys().collect::>(); + names.sort_by_key(|k| get_driver(k)); + debug!("Drivers: {names:?}") + } + + // Count the number of times each pixel format is supported by each driver + let pixel_format_counts: HashMap = drivers + .values() + .flat_map(|d| d.info.texture_formats.iter()) + .fold(HashMap::new(), |mut counts, format| { + *counts.entry(*format).or_insert(0) += 1; + counts + }); + + debug!("Pixel format counts: {pixel_format_counts:?}"); + + let index = get_driver("direct3d"); + debug!("Driver index: {index:?}"); + let mut canvas = window .into_canvas() .accelerated() + // .index(index) .build() .map_err(|e| GameError::Sdl(e.to_string()))?; canvas .set_logical_size(CANVAS_SIZE.x, CANVAS_SIZE.y) .map_err(|e| GameError::Sdl(e.to_string()))?; + debug!("Renderer: {:?}", canvas.info()); let texture_creator = canvas.texture_creator(); diff --git a/src/systems/debug.rs b/src/systems/debug.rs index 14db924..cef2201 100644 --- a/src/systems/debug.rs +++ b/src/systems/debug.rs @@ -7,7 +7,7 @@ use crate::systems::{Collider, CursorPosition, NodeId, Position, SystemTimings}; use crate::texture::ttf::{TtfAtlas, TtfRenderer}; use bevy_ecs::resource::Resource; use bevy_ecs::system::{Query, Res}; -use glam::{IVec2, UVec2, Vec2}; +use glam::{IVec2, Vec2}; use sdl2::pixels::Color; use sdl2::rect::{Point, Rect}; use sdl2::render::{Canvas, Texture}; @@ -215,8 +215,6 @@ pub fn debug_render_system( if !debug_state.enabled { return; } - let scale = constants::LARGE_SCALE as f32; - // Create debug text renderer let text_renderer = TtfRenderer::new(1.0); @@ -249,8 +247,8 @@ pub fn debug_render_system( let pos = position.get_pixel_position(&map.graph).unwrap(); // Transform position and size using common methods - let pos = (pos * scale).as_ivec2(); - let size = (collider.size * scale) as u32; + let pos = (pos * constants::LARGE_SCALE).as_ivec2(); + let size = (collider.size * constants::LARGE_SCALE) as u32; Rect::from_center(Point::from((pos.x, pos.y)), size, size) }) @@ -266,7 +264,7 @@ pub fn debug_render_system( } canvas.set_draw_color(Color { - a: f32_to_u8(0.6), + a: f32_to_u8(0.65), ..Color::RED }); canvas.set_blend_mode(sdl2::render::BlendMode::Blend); @@ -280,8 +278,8 @@ pub fn debug_render_system( .nodes() .enumerate() .filter_map(|(id, node)| { - let pos = transform_position_with_offset(node.position, scale); - let size = (2.0 * scale) as u32; + let pos = transform_position_with_offset(node.position, constants::LARGE_SCALE); + let size = (2.0 * constants::LARGE_SCALE) as u32; let rect = Rect::new(pos.x - (size as i32 / 2), pos.y - (size as i32 / 2), size, size); // If the node is the one closest to the cursor, draw it immediately @@ -311,7 +309,7 @@ pub fn debug_render_system( // Render node ID if a node is highlighted if let Some(closest_node_id) = closest_node { let node = map.graph.get_node(closest_node_id as NodeId).unwrap(); - let pos = transform_position_with_offset(node.position, scale); + let pos = transform_position_with_offset(node.position, constants::LARGE_SCALE); let node_id_text = closest_node_id.to_string(); let text_pos = Vec2::new((pos.x + 10) as f32, (pos.y - 5) as f32); @@ -323,7 +321,7 @@ pub fn debug_render_system( &node_id_text, text_pos, Color { - a: f32_to_u8(0.4), + a: f32_to_u8(0.9), ..Color::WHITE }, ) diff --git a/src/systems/input.rs b/src/systems/input.rs index 1e9efe1..a308dff 100644 --- a/src/systems/input.rs +++ b/src/systems/input.rs @@ -6,8 +6,13 @@ use bevy_ecs::{ system::{NonSendMut, Res, ResMut}, }; use glam::Vec2; -use sdl2::{event::Event, keyboard::Keycode, EventPump}; +use sdl2::{ + event::{Event, WindowEvent}, + keyboard::Keycode, + EventPump, +}; use smallvec::{smallvec, SmallVec}; +use tracing::{debug, info}; use crate::systems::components::DeltaTime; use crate::{ @@ -293,7 +298,15 @@ pub fn input_system( simple_key_events.push(SimpleKeyEvent::KeyUp(key)); } } - Event::RenderTargetsReset { .. } | Event::Window { .. } => { + Event::Window { win_event, .. } => match win_event { + WindowEvent::Resized(w, h) => { + info!("Window resized to {}x{}", w, h); + } + _ => { + debug!("Window event: {:?}", win_event); + } + }, + Event::RenderTargetsReset { .. } => { // No-op } _ => {