From 749303f2bab1b2b374f7b837cc75acf65067699e Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 24 Sep 2026 20:29:27 +0200 Subject: refactor(engine): update to version 0.18.0 dear-imgui-rs & dear-imguizmo --- engine/Cargo.toml | 6 ++---- engine/src/ui/dear_imgui.rs | 50 +++++++++++++++++++++++---------------------- engine/src/ui/view/world.rs | 49 ++++++++++++++++++++++---------------------- engine/src/util.rs | 2 +- 4 files changed, 54 insertions(+), 53 deletions(-) (limited to 'engine') diff --git a/engine/Cargo.toml b/engine/Cargo.toml index f46433e..1e2e84d 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -43,13 +43,11 @@ git = "https://github.com/HampusMat/slang-rs" branch = "prebuilt-and-artifacts" [dependencies.dear-imgui-rs] -# This alpha release has a fix for linking with libstdc++ on non-msvc Windows targets. -# When a stable release with this fix is available, it should be used instead -version = "=0.16.0-alpha.1" +version = "0.18.0" features = ["freetype"] [dependencies.dear-imguizmo] -version = "=0.16.0-alpha.1" +version = "0.18.0" default-features = false # A dependency on glam is not desired [build-dependencies] diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs index c5f7ce2..0047394 100644 --- a/engine/src/ui/dear_imgui.rs +++ b/engine/src/ui/dear_imgui.rs @@ -173,21 +173,20 @@ impl ecs::extension::Extension for Extension ); } - unsafe { - context.ctx.font_atlas().add_font_from_memory_ttf( + context.ctx.font_atlas().add_font(&[unsafe { + dear_imgui_rs::FontSource::ttf_data_with_size( include_bytes!("../../res/FiraMono-Regular.ttf"), 14.0, - Some( - &dear_imgui_rs::FontConfig::default() - .name("FiraMono-Regular.ttf") - .font_loader_flags( - dear_imgui_rs::FontLoaderFlags::BITMAP - | dear_imgui_rs::FontLoaderFlags::FORCE_AUTOHINT, - ), - ), - None, - ); - } + ) + .with_config( + dear_imgui_rs::FontConfig::default() + .name("FiraMono-Regular.ttf") + .font_loader_flags( + dear_imgui_rs::FontLoaderFlags::BITMAP + | dear_imgui_rs::FontLoaderFlags::FORCE_AUTOHINT, + ), + ) + }]); collector.add_sole(context).ok(); @@ -521,7 +520,7 @@ fn add_drawing_render_pass( texture_id_lookup, } = context; - let mut render_frame = ctx.render(); + let render_frame = ctx.render(); let mut tex_feedbacks = Vec::with_capacity(render_frame.texture_requests().len()); @@ -570,7 +569,8 @@ fn add_drawing_render_pass( Ok(texture_feedback) => texture_feedback, Err( dear_imgui_rs::TextureFeedbackError::UploadForDestroy - | dear_imgui_rs::TextureFeedbackError::DestroyForUpload, + | dear_imgui_rs::TextureFeedbackError::DestroyForUpload + | dear_imgui_rs::TextureFeedbackError::NullTextureId, ) => unreachable!(), }; @@ -627,7 +627,8 @@ fn add_drawing_render_pass( Ok(texture_feedback) => texture_feedback, Err( dear_imgui_rs::TextureFeedbackError::UploadForDestroy - | dear_imgui_rs::TextureFeedbackError::DestroyForUpload, + | dear_imgui_rs::TextureFeedbackError::DestroyForUpload + | dear_imgui_rs::TextureFeedbackError::NullTextureId, ) => unreachable!(), }; @@ -660,7 +661,8 @@ fn add_drawing_render_pass( Ok(texture_feedback) => texture_feedback, Err( dear_imgui_rs::TextureFeedbackError::UploadForDestroy - | dear_imgui_rs::TextureFeedbackError::DestroyForUpload, + | dear_imgui_rs::TextureFeedbackError::DestroyForUpload + | dear_imgui_rs::TextureFeedbackError::NullTextureId, ) => unreachable!(), }; @@ -669,11 +671,11 @@ fn add_drawing_render_pass( } } - render_frame + let frame = render_frame .reconcile_texture_feedback(tex_feedbacks) .with_context(|| "Failed to reconcile texture feedback")?; - let draw_data = render_frame.draw_data(); + let draw_data = frame.draw_data(); let [display_width, display_height] = draw_data.display_size(); @@ -959,7 +961,7 @@ mod inner_context_wrapper { ctx: Pin>, frame: *mut dear_imgui_rs::Ui, - _renderer_consumer: dear_imgui_rs::RendererConsumer, + renderer_consumer: dear_imgui_rs::SynchronousRendererConsumer, } impl InnerContextWrapper @@ -974,12 +976,12 @@ mod inner_context_wrapper ctx.io_mut() .set_backend_flags(dear_imgui_rs::BackendFlags::RENDERER_HAS_TEXTURES); - let renderer_consumer = ctx.create_renderer_consumer().unwrap(); + let renderer_consumer = ctx.create_synchronous_renderer_consumer().unwrap(); Self { ctx, frame: null_mut(), - _renderer_consumer: renderer_consumer, + renderer_consumer, } } @@ -1014,9 +1016,9 @@ mod inner_context_wrapper // self.ctx.create_renderer_consumer().unwrap() // } - pub fn render(&mut self) -> dear_imgui_rs::RenderedFrame<'_> + pub fn render(&mut self) -> dear_imgui_rs::PendingFrame<'_> { - self.ctx.render() + self.ctx.render(&self.renderer_consumer) } pub fn new_frame(&mut self) diff --git a/engine/src/ui/view/world.rs b/engine/src/ui/view/world.rs index 95f29d0..411acd7 100644 --- a/engine/src/ui/view/world.rs +++ b/engine/src/ui/view/world.rs @@ -3,6 +3,8 @@ use std::borrow::Cow; use std::io::Cursor; use std::ops::{Deref, DerefMut}; +use ecs::error::Context; + use crate::color::{Rgb, Rgba}; use crate::ecs::actions::Actions; use crate::ecs::component::local::Local; @@ -30,6 +32,7 @@ use crate::ui::dear_imgui::{ bindings as dear_imgui_bindings, Context as DearImguiContext, }; +use crate::util::OptionExt; const BUTTON_RED_NORMAL: [f32; 4] = [124.0, 52.0, 39.0, 255.0]; const BUTTON_RED_HOVERED: [f32; 4] = [181.0, 76.0, 57.0, 255.0]; @@ -59,8 +62,8 @@ pub fn show( icon_textures, } = &mut *state; - let icon_textures = - icon_textures.get_or_insert_with(|| IconTextures::new(dear_imgui_context)); + let icon_textures = icon_textures + .get_or_try_insert_with_fn(|| IconTextures::new(dear_imgui_context))?; let Some(frame) = dear_imgui_context.frame() else { return Ok(()); @@ -113,21 +116,16 @@ pub fn show( fn create_texture( dear_imgui_context: &mut DearImguiContext, image: Image, -) -> dear_imgui_bindings::ManagedTextureId +) -> Result { - let image = image.into_rgba8(); - - let mut texture_data = dear_imgui_bindings::OwnedTextureData::new(); - - texture_data.create( - dear_imgui_bindings::TextureFormat::RGBA32, - image.dimensions().width, - image.dimensions().height, - ); - - texture_data.set_data(image.as_bytes()); - - dear_imgui_context.register_texture(texture_data) + Ok(dear_imgui_context.register_texture( + dear_imgui_bindings::OwnedTextureData::from_pixels( + dear_imgui_bindings::TextureFormat::RGBA32, + image.dimensions().width, + image.dimensions().height, + image.into_rgba8().as_bytes(), + )?, + )) } fn create_spawn_button_widgets( @@ -2238,7 +2236,7 @@ struct IconTextures impl IconTextures { - fn new(dear_imgui_context: &mut DearImguiContext) -> Self + fn new(dear_imgui_context: &mut DearImguiContext) -> Result { let despawn = create_texture( dear_imgui_context, @@ -2246,8 +2244,9 @@ impl IconTextures Cursor::new(include_bytes!("../../../res/ui/delete.png")), ImageFormat::Png, ) - .unwrap(), - ); + .context("Failed to decode 'delete' icon image")?, + ) + .context("Failed to create 'delete' icon texture")?; let warning = create_texture( dear_imgui_context, @@ -2255,8 +2254,9 @@ impl IconTextures Cursor::new(include_bytes!("../../../res/ui/warning.png")), ImageFormat::Png, ) - .unwrap(), - ); + .context("Failed to decode 'warning' icon image")?, + ) + .context("Failed to create 'warning' icon texture")?; let edit = create_texture( dear_imgui_context, @@ -2264,10 +2264,11 @@ impl IconTextures Cursor::new(include_bytes!("../../../res/ui/edit.png")), ImageFormat::Png, ) - .unwrap(), - ); + .context("Failed to decode 'edit' icon image")?, + ) + .context("Failed to create 'edit' icon texture")?; - Self { despawn, warning, edit } + Ok(Self { despawn, warning, edit }) } } diff --git a/engine/src/util.rs b/engine/src/util.rs index 61a8613..fc4c1c8 100644 --- a/engine/src/util.rs +++ b/engine/src/util.rs @@ -9,7 +9,7 @@ pub trait OptionExt /// See fn get_or_try_insert_with_fn( &mut self, - func: impl Fn() -> Result, + func: impl FnOnce() -> Result, ) -> Result<&mut T, Err>; } -- cgit v1.2.3-18-g5258