diff options
| -rw-r--r-- | Cargo.lock | 20 | ||||
| -rw-r--r-- | engine/Cargo.toml | 6 | ||||
| -rw-r--r-- | engine/src/ui/dear_imgui.rs | 50 | ||||
| -rw-r--r-- | engine/src/ui/view/world.rs | 49 | ||||
| -rw-r--r-- | engine/src/util.rs | 2 |
5 files changed, 64 insertions, 63 deletions
@@ -499,9 +499,9 @@ checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "dear-imgui-build-support" -version = "0.16.0-alpha.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9910bfb7b9c312809c1957efc9bd4c96e275ec08bc4888020472dab9bd2ae576" +checksum = "02da0cb00f1035b67f4caf8c91dd926da86b591350d19b330e2de2f1431e51df" dependencies = [ "cc", "pkg-config", @@ -512,9 +512,9 @@ dependencies = [ [[package]] name = "dear-imgui-rs" -version = "0.16.0-alpha.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4842e82949f15b8b507fd2808529311e6ddacba25721b4e0c4b7c868243174fd" +checksum = "c0c64d4b6afbba994f9d52d531ed82e760d185d4ab39a77cbdfe021f096d4501" dependencies = [ "bitflags 2.11.1", "dear-imgui-sys", @@ -524,9 +524,9 @@ dependencies = [ [[package]] name = "dear-imgui-sys" -version = "0.16.0-alpha.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2894ef8941cca0807c4e56f4c80e1f479ccc61100554c803df4e4cc955ec3dd" +checksum = "18dff8796ca8ea21fae88ea91b6111898ba86ef14cac20d1f149138f5fbb2ff0" dependencies = [ "cc", "dear-imgui-build-support", @@ -535,9 +535,9 @@ dependencies = [ [[package]] name = "dear-imguizmo" -version = "0.16.0-alpha.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444474eac0664b01b7717f64a4c29b6b39be54e081c0fcee8f84f866b10f2d76" +checksum = "6856ce90723833c886e57ae950d0704410641942a4503122af00510c5b23cdbe" dependencies = [ "bitflags 2.11.1", "dear-imgui-rs", @@ -548,9 +548,9 @@ dependencies = [ [[package]] name = "dear-imguizmo-sys" -version = "0.16.0-alpha.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61304895d92846f80d4800f3cea7d4564afe0a8fd34e1afab87386b22dfefef5" +checksum = "a97f06f20ffdac7e3e7ba07dbe3874ccc0979e49bc7e4bf5586ffaf55b4e0e71" dependencies = [ "cc", "dear-imgui-build-support", 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<Box<dear_imgui_rs::Context>>, 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<dear_imgui_bindings::ManagedTextureId, dear_imgui_bindings::TextureDataError> { - 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<Self, crate::Error> { 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<T> /// See <https://github.com/rust-lang/rust/issues/143648> fn get_or_try_insert_with_fn<Err>( &mut self, - func: impl Fn() -> Result<T, Err>, + func: impl FnOnce() -> Result<T, Err>, ) -> Result<&mut T, Err>; } |
