fyrox_ui_sdl3/
lib.rs

1pub mod platform;
2pub mod renderer;
3pub mod utils;
4
5use crate::platform::Platform;
6use crate::renderer::UiRenderer;
7use fyrox_ui::UiUpdateSwitches;
8use fyrox_ui::{UserInterface, core::algebra::Vector2, message::UiMessage};
9use sdl3::gpu::*;
10
11pub struct FyroxUiSdl {
12    pub ui: UserInterface,
13    pub renderer: UiRenderer,
14    pub platform: Platform,
15
16    pub width: f32,
17    pub height: f32,
18}
19
20impl FyroxUiSdl {
21    pub fn new(device: &sdl3::gpu::Device, window: &sdl3::video::Window) -> Self {
22        let ui = UserInterface::new(Vector2::new(window.size().0 as f32, window.size().1 as f32));
23
24        let renderer = UiRenderer::new(device, window);
25        let platform = Platform::new();
26
27        Self {
28            ui,
29            renderer,
30            platform,
31            width: window.size().0 as f32,
32            height: window.size().1 as f32,
33        }
34    }
35
36    pub fn handle_event<T>(&mut self, event: &sdl3::event::Event, mut event_callback: T)
37    where
38        T: FnMut(UiMessage),
39    {
40        self.platform.handle_event(&mut self.ui, event);
41
42        while let Some(message) = self.ui.poll_message() {
43            event_callback(message);
44        }
45    }
46
47    /// Resize UI when window size changes.
48    pub fn resize(&mut self, width: f32, height: f32) {
49        self.width = width;
50        self.height = height;
51        self.ui.set_screen_size(Vector2::new(width, height));
52    }
53
54    /// Pump a frame of UI logic (animations, layout, message routing).
55    pub fn update(&mut self, dt: f32) {
56        self.ui.update(
57            Vector2::new(self.width, self.height),
58            dt,
59            &UiUpdateSwitches { node_overrides: None },
60        );
61    }
62
63    /// Send a generic UI message (you usually route input events to this).
64    pub fn send_message(&mut self, message: UiMessage) {
65        self.ui.send_message(message);
66    }
67
68    pub fn render(
69        &mut self,
70        device: &sdl3::gpu::Device,
71        window: &sdl3::video::Window,
72        command_buffer: &mut CommandBuffer,
73        color_targets: &[ColorTargetInfo],
74    ) -> Result<(), Box<dyn std::error::Error>> {
75        let draw_ctx = self.ui.draw();
76        self.renderer
77            .render(device, window, command_buffer, color_targets, draw_ctx)
78    }
79}