summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-09-24 20:29:27 +0200
committerHampusM <hampus@hampusmat.com>2026-09-27 19:20:44 +0200
commit749303f2bab1b2b374f7b837cc75acf65067699e (patch)
tree47f0d7ef6ecffe9d6107d02b508347a2ffdabcf5
parent9adf24618a943bab4ce39267760d3a5348519fb2 (diff)
refactor(engine): update to version 0.18.0 dear-imgui-rs & dear-imguizmo
-rw-r--r--Cargo.lock20
-rw-r--r--engine/Cargo.toml6
-rw-r--r--engine/src/ui/dear_imgui.rs50
-rw-r--r--engine/src/ui/view/world.rs49
-rw-r--r--engine/src/util.rs2
5 files changed, 64 insertions, 63 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 8b73712..aa0557c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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>;
}