diff --git a/src/framework/backend.rs b/src/framework/backend.rs index 91d3761..1dffe93 100644 --- a/src/framework/backend.rs +++ b/src/framework/backend.rs @@ -60,6 +60,8 @@ pub trait BackendRenderer { fn imgui_texture_id(&self, texture: &Box) -> GameResult; + fn prepare_imgui(&mut self, ui: &imgui::Ui) -> GameResult; + fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult; fn supports_vertex_draw(&self) -> bool { diff --git a/src/framework/backend_null.rs b/src/framework/backend_null.rs index eed488f..ab6a931 100644 --- a/src/framework/backend_null.rs +++ b/src/framework/backend_null.rs @@ -2,7 +2,7 @@ use std::any::Any; use std::cell::RefCell; use std::mem; -use imgui::{DrawData, TextureId}; +use imgui::{DrawData, TextureId, Ui}; use crate::common::{Color, Rect}; use crate::framework::backend::{ @@ -135,6 +135,10 @@ impl BackendRenderer for NullRenderer { Ok(TextureId::from(0)) } + fn prepare_imgui(&mut self, _ui: &Ui) -> GameResult { + Ok(()) + } + fn render_imgui(&mut self, _draw_data: &DrawData) -> GameResult { Ok(()) } diff --git a/src/framework/backend_sdl2.rs b/src/framework/backend_sdl2.rs index 4249457..66d9cf8 100644 --- a/src/framework/backend_sdl2.rs +++ b/src/framework/backend_sdl2.rs @@ -8,7 +8,7 @@ use std::rc::Rc; use std::time::Duration; use imgui::internal::RawWrapper; -use imgui::{ConfigFlags, DrawCmd, DrawData, Key, MouseCursor, TextureId}; +use imgui::{ConfigFlags, DrawCmd, DrawData, Key, MouseCursor, TextureId, Ui}; use sdl2::event::{Event, WindowEvent}; use sdl2::keyboard::Scancode; use sdl2::mouse::{Cursor, SystemCursor}; @@ -602,6 +602,13 @@ impl BackendRenderer for SDL2Renderer { Ok(TextureId::new(sdl_texture.texture.as_ref().map(|t| t.raw()).unwrap_or(null_mut()) as usize)) } + fn prepare_imgui(&mut self, ui: &Ui) -> GameResult { + let refs = self.refs.borrow_mut(); + self.imgui_event.borrow_mut().prepare_render(ui, refs.canvas.window()); + + Ok(()) + } + fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult { let mut refs = self.refs.borrow_mut(); @@ -1100,6 +1107,10 @@ impl ImguiSdl2 { imgui.io_mut().key_super = super_; } + if self.ignore_event(event) { + return; + } + match *event { Event::MouseWheel { y, .. } => { imgui.io_mut().mouse_wheel = y as f32; diff --git a/src/framework/graphics.rs b/src/framework/graphics.rs index f1bee30..588c398 100644 --- a/src/framework/graphics.rs +++ b/src/framework/graphics.rs @@ -128,6 +128,14 @@ pub fn imgui_texture_id(ctx: &Context, texture: &Box) -> Gam Err(GameError::RenderError("Rendering backend hasn't been initialized yet.".to_string())) } +pub fn prepare_imgui(ctx: &mut Context, ui: &imgui::Ui) -> GameResult { + if let Some(renderer) = ctx.renderer.as_mut() { + return renderer.prepare_imgui(ui); + } + + Err(GameError::RenderError("Rendering backend hasn't been initialized yet.".to_string())) +} + pub fn render_imgui(ctx: &mut Context, draw_data: &imgui::DrawData) -> GameResult { if let Some(renderer) = ctx.renderer.as_mut() { return renderer.render_imgui(draw_data); diff --git a/src/framework/mod.rs b/src/framework/mod.rs index 3fac1da..da091b3 100644 --- a/src/framework/mod.rs +++ b/src/framework/mod.rs @@ -1,3 +1,5 @@ +#![allow(unused)] + pub mod backend; pub mod backend_null; #[cfg(feature = "backend-glutin")] diff --git a/src/framework/render_opengl.rs b/src/framework/render_opengl.rs index ff254a0..1ce15dc 100644 --- a/src/framework/render_opengl.rs +++ b/src/framework/render_opengl.rs @@ -6,7 +6,7 @@ use std::mem::MaybeUninit; use std::ptr::null; use std::sync::Arc; -use imgui::{DrawCmd, DrawCmdParams, DrawData, DrawIdx, DrawVert, TextureId}; +use imgui::{DrawCmd, DrawCmdParams, DrawData, DrawIdx, DrawVert, TextureId, Ui}; use crate::common::{Color, Rect}; use crate::framework::backend::{BackendRenderer, BackendShader, BackendTexture, SpriteBatchCommand, VertexData}; @@ -1053,6 +1053,10 @@ impl BackendRenderer for OpenGLRenderer { Ok(TextureId::new(gl_texture.texture_id as usize)) } + fn prepare_imgui(&mut self, _ui: &Ui) -> GameResult { + Ok(()) + } + fn render_imgui(&mut self, draw_data: &DrawData) -> GameResult { // https://github.com/michaelfairley/rust-imgui-opengl-renderer if let Some((_, gl)) = self.get_context() { diff --git a/src/framework/ui.rs b/src/framework/ui.rs index ba51452..09b6b70 100644 --- a/src/framework/ui.rs +++ b/src/framework/ui.rs @@ -6,6 +6,7 @@ use imgui::sys::*; use crate::framework::context::Context; use crate::framework::error::GameResult; use crate::framework::graphics::{imgui_context, render_imgui}; +use crate::graphics::prepare_imgui; use crate::live_debugger::LiveDebugger; use crate::scene::Scene; use crate::shared_game_state::SharedGameState; @@ -128,6 +129,7 @@ impl UI { scene.imgui_draw(&mut self.components, state, ctx2, &mut ui)?; + prepare_imgui(ctx2, &ui); let draw_data = ui.render(); render_imgui(ctx2, draw_data)?;