]> git.nega.tv - josh/narcissus/commitdiff
narcissus-core: Use stable trait upcasting
authorJosh Simmons <josh@nega.tv>
Sat, 5 Apr 2025 21:38:07 +0000 (23:38 +0200)
committerJosh Simmons <josh@nega.tv>
Sat, 5 Apr 2025 21:38:07 +0000 (23:38 +0200)
engine/narcissus-app/src/lib.rs
engine/narcissus-app/src/sdl.rs
engine/narcissus-core/src/lib.rs
title/shark/src/main.rs

index f4f2d3b79ef50e448ad71d79a4fd9ff269e8c8a9..f2c206f512e2a6e5103cc9f691627e88054b7d8a 100644 (file)
@@ -3,7 +3,7 @@ mod sdl;
 
 use std::rc::Rc;
 
-use narcissus_core::{flags_def, raw_window::AsRawWindow, Upcast};
+use narcissus_core::{flags_def, raw_window::AsRawWindow};
 
 pub use key::Key;
 
@@ -33,7 +33,7 @@ pub struct WindowDesc<'a> {
 #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
 pub struct WindowId(u64);
 
-pub trait Window: AsRawWindow + Upcast<dyn AsRawWindow> {
+pub trait Window: AsRawWindow {
     fn id(&self) -> WindowId;
 
     fn size(&self) -> (u32, u32);
index 167680111a4b4ea7db4cf7255bca4687ff785909..542b36f26e91094a328127adb6c3ffc274e52f81 100644 (file)
@@ -8,19 +8,19 @@ use std::{
 use crate::{App, ButtonFlags, Event, Key, ModifierFlags, Window, WindowId};
 
 use narcissus_core::{
+    Mutex,
     raw_window::{AsRawWindow, RawWindow, WaylandWindow, XlibWindow},
-    Mutex, Upcast,
 };
 use sdl3_sys::{
     events::{
-        SDL_EventType, SDL_PollEvent, SDL_EVENT_KEY_DOWN, SDL_EVENT_KEY_UP,
-        SDL_EVENT_MOUSE_BUTTON_DOWN, SDL_EVENT_MOUSE_BUTTON_UP, SDL_EVENT_MOUSE_MOTION,
-        SDL_EVENT_QUIT, SDL_EVENT_WINDOW_CLOSE_REQUESTED, SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED,
+        SDL_EVENT_KEY_DOWN, SDL_EVENT_KEY_UP, SDL_EVENT_MOUSE_BUTTON_DOWN,
+        SDL_EVENT_MOUSE_BUTTON_UP, SDL_EVENT_MOUSE_MOTION, SDL_EVENT_QUIT,
+        SDL_EVENT_WINDOW_CLOSE_REQUESTED, SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED,
         SDL_EVENT_WINDOW_FOCUS_GAINED, SDL_EVENT_WINDOW_FOCUS_LOST, SDL_EVENT_WINDOW_MOUSE_ENTER,
         SDL_EVENT_WINDOW_MOUSE_LEAVE, SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,
-        SDL_EVENT_WINDOW_RESIZED,
+        SDL_EVENT_WINDOW_RESIZED, SDL_EventType, SDL_PollEvent,
     },
-    init::{SDL_InitSubSystem, SDL_Quit, SDL_INIT_VIDEO},
+    init::{SDL_INIT_VIDEO, SDL_InitSubSystem, SDL_Quit},
     keycode::*,
     mouse::{
         SDL_BUTTON_LMASK, SDL_BUTTON_MMASK, SDL_BUTTON_RMASK, SDL_BUTTON_X1MASK, SDL_BUTTON_X2MASK,
@@ -30,10 +30,9 @@ use sdl3_sys::{
     video::{
         SDL_CreateWindow, SDL_DestroyWindow, SDL_GetCurrentVideoDriver, SDL_GetWindowDisplayScale,
         SDL_GetWindowID, SDL_GetWindowProperties, SDL_GetWindowSize, SDL_GetWindowSizeInPixels,
-        SDL_Window, SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER,
-        SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER, SDL_PROP_WINDOW_X11_DISPLAY_POINTER,
-        SDL_PROP_WINDOW_X11_WINDOW_NUMBER, SDL_WINDOW_HIGH_PIXEL_DENSITY, SDL_WINDOW_RESIZABLE,
-        SDL_WINDOW_VULKAN,
+        SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER, SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER,
+        SDL_PROP_WINDOW_X11_DISPLAY_POINTER, SDL_PROP_WINDOW_X11_WINDOW_NUMBER,
+        SDL_WINDOW_HIGH_PIXEL_DENSITY, SDL_WINDOW_RESIZABLE, SDL_WINDOW_VULKAN, SDL_Window,
     },
 };
 
@@ -137,12 +136,6 @@ impl AsRawWindow for SdlWindow {
     }
 }
 
-impl Upcast<dyn AsRawWindow> for SdlWindow {
-    fn upcast(&self) -> &(dyn AsRawWindow + 'static) {
-        self
-    }
-}
-
 pub struct SdlApp {
     windows: Mutex<HashMap<WindowId, Rc<SdlWindow>>>,
 }
index cc9f12cfa30e882f249d3c0e0283fe07415cb32c..17eb36740a0adc95017c837cd83f702eb1b9f3b2 100644 (file)
@@ -258,10 +258,6 @@ pub unsafe fn box_assume_init<T>(value: Box<MaybeUninit<T>>) -> Box<T> {
 /// Negative traits aren't stable yet, so use a dummy PhantomData marker to implement !Send
 pub type PhantomUnsend = std::marker::PhantomData<*mut ()>;
 
-pub trait Upcast<T: ?Sized> {
-    fn upcast(&self) -> &T;
-}
-
 #[must_use]
 pub fn align_offset(x: usize, align: usize) -> usize {
     debug_assert!(align.is_power_of_two());
index 8529445342d0e5e4cc09931b98bdee23e4882c4c..fe4652f6e52c4eb6dbaf4198ba5efe0201761f42 100644 (file)
@@ -10,14 +10,14 @@ use shark_shaders::pipelines::{Draw2dCmd, Draw2dScissor};
 use renderdoc_sys as rdoc;
 
 use fonts::{FontFamily, Fonts};
-use narcissus_app::{create_app, Event, Key, WindowDesc};
+use narcissus_app::{Event, Key, WindowDesc, create_app};
 use narcissus_core::default;
 use narcissus_font::{FontCollection, GlyphCache, HorizontalMetrics};
 use narcissus_gpu::{
-    create_device, ColorSpace, ImageFormat, ImageUsageFlags, PresentMode, SwapchainConfigurator,
-    SwapchainImage, ThreadToken,
+    ColorSpace, ImageFormat, ImageUsageFlags, PresentMode, SwapchainConfigurator, SwapchainImage,
+    ThreadToken, create_device,
 };
-use narcissus_maths::{sin_cos_pi_f32, vec2, Vec2};
+use narcissus_maths::{Vec2, sin_cos_pi_f32, vec2};
 
 mod draw;
 mod fonts;
@@ -295,7 +295,7 @@ pub fn main() {
                 let (width, height) = window.size_in_pixels();
                 if let Ok(result) = gpu.acquire_swapchain(
                     frame,
-                    window.upcast(),
+                    window.as_ref(),
                     width,
                     height,
                     &mut swapchain_configurator,
@@ -346,7 +346,7 @@ pub fn main() {
                         }
                         CloseRequested { window_id } => {
                             let window = app.window(window_id);
-                            gpu.destroy_swapchain(window.upcast());
+                            gpu.destroy_swapchain(window.as_ref());
                         }
                         _ => {}
                     }