diff options
Diffstat (limited to 'engine/src/ui')
| -rw-r--r-- | engine/src/ui/dear_imgui.rs | 50 | ||||
| -rw-r--r-- | engine/src/ui/view/world.rs | 49 |
2 files changed, 51 insertions, 48 deletions
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 }) } } |
