imgui piped sort of how I want it. but not really

master
mitchellhansen 4 years ago
parent d12083506b
commit fa059fd177

@ -8,6 +8,11 @@ use cgmath::Deg;
// a component is any type that is 'static, sized, send and sync // a component is any type that is 'static, sized, send and sync
pub struct ImguiWindow<'a> {
pub window: imgui::Window<'a>,
}
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
pub struct LoopState { pub struct LoopState {
pub delta_time: Duration, pub delta_time: Duration,

@ -1,4 +1,4 @@
//! This crate provides a winit-based backend platform for imgui-rs. //! This crate provides a winit-based backend platform for imgui_supp-rs.
//! //!
//! A backend platform handles window/input device events and manages their //! A backend platform handles window/input device events and manages their
//! state. //! state.
@ -17,7 +17,7 @@
//! //!
//! ```rust,no_run,ignore //! ```rust,no_run,ignore
//! # // TODO: Remove ignore when only one winit version is used //! # // TODO: Remove ignore when only one winit version is used
//! use imgui::Context; //! use imgui_supp::Context;
//! use imgui_winit_support::{HiDpiMode, WinitPlatform}; //! use imgui_winit_support::{HiDpiMode, WinitPlatform};
//! use std::time::Instant; //! use std::time::Instant;
//! use winit::event::{Event, WindowEvent}; //! use winit::event::{Event, WindowEvent};
@ -27,11 +27,11 @@
//! let mut event_loop = EventLoop::new(); //! let mut event_loop = EventLoop::new();
//! let mut window = Window::new(&event_loop).unwrap(); //! let mut window = Window::new(&event_loop).unwrap();
//! //!
//! let mut imgui = Context::create(); //! let mut imgui_supp = Context::create();
//! // configure imgui-rs Context if necessary //! // configure imgui_supp-rs Context if necessary
//! //!
//! let mut platform = WinitPlatform::init(&mut imgui); // step 1 //! let mut platform = WinitPlatform::init(&mut imgui_supp); // step 1
//! platform.attach_window(imgui.io_mut(), &window, HiDpiMode::Default); // step 2 //! platform.attach_window(imgui_supp.io_mut(), &window, HiDpiMode::Default); // step 2
//! //!
//! let mut last_frame = Instant::now(); //! let mut last_frame = Instant::now();
//! let mut run = true; //! let mut run = true;
@ -39,16 +39,16 @@
//! match event { //! match event {
//! Event::NewEvents(_) => { //! Event::NewEvents(_) => {
//! // other application-specific logic //! // other application-specific logic
//! last_frame = imgui.io_mut().update_delta_time(last_frame); //! last_frame = imgui_supp.io_mut().update_delta_time(last_frame);
//! }, //! },
//! Event::MainEventsCleared => { //! Event::MainEventsCleared => {
//! // other application-specific logic //! // other application-specific logic
//! platform.prepare_frame(imgui.io_mut(), &window) // step 4 //! platform.prepare_frame(imgui_supp.io_mut(), &window) // step 4
//! .expect("Failed to prepare frame"); //! .expect("Failed to prepare frame");
//! window.request_redraw(); //! window.request_redraw();
//! } //! }
//! Event::RedrawRequested(_) => { //! Event::RedrawRequested(_) => {
//! let ui = imgui.frame(); //! let ui = imgui_supp.frame();
//! // application-specific rendering *under the UI* //! // application-specific rendering *under the UI*
//! //!
//! // construct the UI //! // construct the UI
@ -65,7 +65,7 @@
//! } //! }
//! // other application-specific event handling //! // other application-specific event handling
//! event => { //! event => {
//! platform.handle_event(imgui.io_mut(), &window, &event); // step 3 //! platform.handle_event(imgui_supp.io_mut(), &window, &event); // step 3
//! // other application-specific event handling //! // other application-specific event handling
//! } //! }
//! } //! }
@ -107,7 +107,7 @@
//! your `Cargo.toml`: //! your `Cargo.toml`:
//! //!
//! ```toml //! ```toml
//! [dependencies.imgui-winit-support] //! [dependencies.imgui_supp-winit-support]
//! version = "0.6" //! version = "0.6"
//! features = ["winit-$YOUR_VERSION_HERE"] //! features = ["winit-$YOUR_VERSION_HERE"]
//! default-features = false //! default-features = false
@ -238,7 +238,7 @@ fn check_multiple_winits() {
// ensure atomicity. // ensure atomicity.
let _ = writeln!( let _ = writeln!(
err, err,
"Warning (imgui-winit-support): More than one `winit-*` version feature is enabled \ "Warning (imgui_supp-winit-support): More than one `winit-*` version feature is enabled \
(this likely indicates misconfiguration, see documentation for details)." (this likely indicates misconfiguration, see documentation for details)."
); );
let feats = [ let feats = [
@ -373,10 +373,10 @@ enum ActiveHiDpiMode {
/// DPI factor handling mode. /// DPI factor handling mode.
/// ///
/// Applications that use imgui-rs might want to customize the used DPI factor and not use /// Applications that use imgui_supp-rs might want to customize the used DPI factor and not use
/// directly the value coming from winit. /// directly the value coming from winit.
/// ///
/// **Note: if you use a mode other than default and the DPI factor is adjusted, winit and imgui-rs /// **Note: if you use a mode other than default and the DPI factor is adjusted, winit and imgui_supp-rs
/// will use different logical coordinates, so be careful if you pass around logical size or /// will use different logical coordinates, so be careful if you pass around logical size or
/// position values.** /// position values.**
#[derive(Copy, Clone, Debug, PartialEq)] #[derive(Copy, Clone, Debug, PartialEq)]
@ -405,9 +405,9 @@ impl HiDpiMode {
} }
impl WinitPlatform { impl WinitPlatform {
/// Initializes a winit platform instance and configures imgui. /// Initializes a winit platform instance and configures imgui_supp.
/// ///
/// This function configures imgui-rs in the following ways: /// This function configures imgui_supp-rs in the following ways:
/// ///
/// * backend flags are updated /// * backend flags are updated
/// * keys are configured /// * keys are configured
@ -441,7 +441,7 @@ impl WinitPlatform {
io[Key::Y] = VirtualKeyCode::Y as _; io[Key::Y] = VirtualKeyCode::Y as _;
io[Key::Z] = VirtualKeyCode::Z as _; io[Key::Z] = VirtualKeyCode::Z as _;
imgui.set_platform_name(Some(ImString::from(format!( imgui.set_platform_name(Some(ImString::from(format!(
"imgui-winit-support {}", "imgui_supp-winit-support {}",
env!("CARGO_PKG_VERSION") env!("CARGO_PKG_VERSION")
)))); ))));
WinitPlatform { WinitPlatform {
@ -453,7 +453,7 @@ impl WinitPlatform {
} }
/// Attaches the platform instance to a winit window. /// Attaches the platform instance to a winit window.
/// ///
/// This function configures imgui-rs in the following ways: /// This function configures imgui_supp-rs in the following ways:
/// ///
/// * framebuffer scale (= DPI factor) is set /// * framebuffer scale (= DPI factor) is set
/// * display size is set /// * display size is set
@ -478,7 +478,7 @@ impl WinitPlatform {
} }
/// Attaches the platform instance to a winit window. /// Attaches the platform instance to a winit window.
/// ///
/// This function configures imgui-rs in the following ways: /// This function configures imgui_supp-rs in the following ways:
/// ///
/// * framebuffer scale (= DPI factor) is set /// * framebuffer scale (= DPI factor) is set
/// * display size is set /// * display size is set
@ -506,7 +506,7 @@ impl WinitPlatform {
/// Scales a logical size coming from winit using the current DPI mode. /// Scales a logical size coming from winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(all( #[cfg(all(
not(any( not(any(
feature = "winit-24", feature = "winit-24",
@ -527,7 +527,7 @@ impl WinitPlatform {
/// Scales a logical size coming from winit using the current DPI mode. /// Scales a logical size coming from winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(any( #[cfg(any(
feature = "winit-20", feature = "winit-20",
feature = "winit-22", feature = "winit-22",
@ -549,7 +549,7 @@ impl WinitPlatform {
/// Scales a logical position coming from winit using the current DPI mode. /// Scales a logical position coming from winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(all( #[cfg(all(
not(any( not(any(
feature = "winit-24", feature = "winit-24",
@ -574,7 +574,7 @@ impl WinitPlatform {
/// Scales a logical position coming from winit using the current DPI mode. /// Scales a logical position coming from winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(any( #[cfg(any(
feature = "winit-20", feature = "winit-20",
feature = "winit-22", feature = "winit-22",
@ -596,7 +596,7 @@ impl WinitPlatform {
/// Scales a logical position for winit using the current DPI mode. /// Scales a logical position for winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(all( #[cfg(all(
not(any( not(any(
feature = "winit-24", feature = "winit-24",
@ -621,7 +621,7 @@ impl WinitPlatform {
/// Scales a logical position for winit using the current DPI mode. /// Scales a logical position for winit using the current DPI mode.
/// ///
/// This utility function is useful if you are using a DPI mode other than default, and want /// This utility function is useful if you are using a DPI mode other than default, and want
/// your application to use the same logical coordinates as imgui-rs. /// your application to use the same logical coordinates as imgui_supp-rs.
#[cfg(any( #[cfg(any(
feature = "winit-20", feature = "winit-20",
feature = "winit-22", feature = "winit-22",
@ -722,7 +722,7 @@ impl WinitPlatform {
// We need to track modifiers separately because some system like macOS, will // We need to track modifiers separately because some system like macOS, will
// not reliably send modifier states during certain events like ScreenCapture. // not reliably send modifier states during certain events like ScreenCapture.
// Gotta let the people show off their pretty imgui widgets! // Gotta let the people show off their pretty imgui_supp widgets!
Event::DeviceEvent { Event::DeviceEvent {
event: DeviceEvent::ModifiersChanged(modifiers), event: DeviceEvent::ModifiersChanged(modifiers),
.. ..
@ -751,7 +751,7 @@ impl WinitPlatform {
} if window_id == window.id() => { } if window_id == window.id() => {
// We need to track modifiers separately because some system like macOS, will // We need to track modifiers separately because some system like macOS, will
// not reliably send modifier states during certain events like ScreenCapture. // not reliably send modifier states during certain events like ScreenCapture.
// Gotta let the people show off their pretty imgui widgets! // Gotta let the people show off their pretty imgui_supp widgets!
if let OwnedWindowEvent::ModifiersChanged(modifiers) = event { if let OwnedWindowEvent::ModifiersChanged(modifiers) = event {
io.key_shift = modifiers.shift(); io.key_shift = modifiers.shift();
io.key_ctrl = modifiers.ctrl(); io.key_ctrl = modifiers.ctrl();
@ -1084,10 +1084,10 @@ impl WinitPlatform {
} }
/// Frame preparation callback. /// Frame preparation callback.
/// ///
/// Call this before calling the imgui-rs context `frame` function. /// Call this before calling the imgui_supp-rs context `frame` function.
/// This function performs the following actions: /// This function performs the following actions:
/// ///
/// * mouse cursor is repositioned (if requested by imgui-rs) /// * mouse cursor is repositioned (if requested by imgui_supp-rs)
#[cfg(all( #[cfg(all(
not(any( not(any(
feature = "winit-24", feature = "winit-24",
@ -1111,10 +1111,10 @@ impl WinitPlatform {
} }
/// Frame preparation callback. /// Frame preparation callback.
/// ///
/// Call this before calling the imgui-rs context `frame` function. /// Call this before calling the imgui_supp-rs context `frame` function.
/// This function performs the following actions: /// This function performs the following actions:
/// ///
/// * mouse cursor is repositioned (if requested by imgui-rs) /// * mouse cursor is repositioned (if requested by imgui_supp-rs)
#[cfg(any( #[cfg(any(
feature = "winit-20", feature = "winit-20",
feature = "winit-22", feature = "winit-22",
@ -1142,10 +1142,10 @@ impl WinitPlatform {
/// Render preparation callback. /// Render preparation callback.
/// ///
/// Call this before calling the imgui-rs UI `render_with`/`render` function. /// Call this before calling the imgui_supp-rs UI `render_with`/`render` function.
/// This function performs the following actions: /// This function performs the following actions:
/// ///
/// * mouse cursor is changed and/or hidden (if requested by imgui-rs) /// * mouse cursor is changed and/or hidden (if requested by imgui_supp-rs)
pub fn prepare_render(&mut self, ui: &Ui, window: &Window) { pub fn prepare_render(&mut self, ui: &Ui, window: &Window) {
let io = ui.io(); let io = ui.io();
if !io if !io

@ -0,0 +1,12 @@
use crate::imgui_supp::extended_winit_imgui_support::WinitPlatform;
pub struct ImguiContext {
pub context: imgui::Context,
}
unsafe impl Send for ImguiContext {}
pub struct ImguiPlatform {
pub platform: WinitPlatform,
}
unsafe impl Send for ImguiPlatform {}

@ -0,0 +1,2 @@
pub mod extended_winit_imgui_support;
pub mod imgui_support;

@ -3,6 +3,7 @@ extern crate imgui_wgpu;
extern crate tobj; extern crate tobj;
extern crate winit_24; extern crate winit_24;
use std::borrow::Borrow;
use std::f32::consts::PI; use std::f32::consts::PI;
use std::rc::Rc; use std::rc::Rc;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
@ -15,10 +16,13 @@ use cgmath::{
}; };
use futures::executor::block_on; use futures::executor::block_on;
use futures::task::LocalSpawn; use futures::task::LocalSpawn;
use gilrs::{Gamepad, Gilrs};
use gilrs::Event as GilEvent; use gilrs::Event as GilEvent;
use gilrs::{Gamepad, Gilrs};
use imgui::FontSource;
use imgui::__core::convert::TryInto;
use imgui::*; use imgui::*;
use imgui_wgpu::{Renderer as ImguiRenderer, RendererConfig as ImguiRendererConfig}; use imgui_wgpu::{Renderer as ImguiRenderer, RendererConfig as ImguiRendererConfig};
use legion::systems::{SyncResources, UnsafeResources};
use legion::*; use legion::*;
use rapier3d::counters::Timer; use rapier3d::counters::Timer;
use rapier3d::dynamics::{ use rapier3d::dynamics::{
@ -30,32 +34,30 @@ use rapier3d::na::{Isometry, Isometry3, Vector, Vector3};
use rapier3d::pipeline::PhysicsPipeline; use rapier3d::pipeline::PhysicsPipeline;
use wgpu::{BindGroup, Buffer, TextureView}; use wgpu::{BindGroup, Buffer, TextureView};
use wgpu_subscriber; use wgpu_subscriber;
use winit_24::event::DeviceEvent::MouseMotion;
use winit_24::platform::unix::x11::ffi::Time;
use winit_24::window::Window;
use winit_24::{ use winit_24::{
event::{self, WindowEvent}, event::{self, WindowEvent},
event_loop::{ControlFlow, EventLoop}, event_loop::{ControlFlow, EventLoop},
}; };
use winit_24::event::DeviceEvent::MouseMotion;
use winit_24::platform::unix::x11::ffi::Time;
use winit_24::window::Window;
use crate::camera::{Camera, CameraController}; use crate::camera::{Camera, CameraController};
use crate::components::{Collider, Color, LoopState, Physics, Position}; use crate::components::{Collider, Color, ImguiWindow, LoopState, Physics, Position};
use crate::imgui_supp::extended_winit_imgui_support;
use crate::imgui_supp::imgui_support::{ImguiContext, ImguiPlatform};
use crate::owned_event::{OwnedEvent, OwnedEventExtension}; use crate::owned_event::{OwnedEvent, OwnedEventExtension};
use crate::physics::PhysicsState; use crate::physics::PhysicsState;
use crate::render::Renderer; use crate::render::Renderer;
use legion::systems::{UnsafeResources, SyncResources};
use std::borrow::Borrow;
use imgui::__core::convert::TryInto;
use crate::extended_winit_imgui_support::WinitPlatform;
mod camera; mod camera;
mod components; mod components;
mod geometry; mod geometry;
mod imgui_supp;
mod light; mod light;
mod owned_event; mod owned_event;
mod physics; mod physics;
mod render; mod render;
mod extended_winit_imgui_support;
/* /*
@ -75,12 +77,10 @@ legion ECS
https://github.com/amethyst/legion https://github.com/amethyst/legion
mvp:
ECS ECS
animation animation
render 3d (good!) render 3d (good!)
input/io input/io (yep!)
collision / physics (yep!) collision / physics (yep!)
entities & behaviours (got the entities!) entities & behaviours (got the entities!)
@ -88,20 +88,18 @@ ECS
//log::info!(""); //log::info!("");
// ImGUI works on more or less a global state. which is MegaLame
static mut CURRENT_UI: Option<imgui::Ui<'static>> = None;
pub unsafe fn current_ui<'a>() -> Option<&'a imgui::Ui<'a>> { CURRENT_UI.as_ref() }
pub struct ImguiContext {
pub context: imgui::Context,
}
unsafe impl Send for ImguiContext {}
pub struct ImguiPlatform {
pub platform: WinitPlatform,
}
unsafe impl Send for ImguiPlatform {}
fn main() { fn main() {
let mut world = World::default(); let mut world = World::default();
let mut imgui_prepare_schedule = Schedule::builder()
.add_system(render::imgui_prepare_system())
.build();
let mut render_schedule = Schedule::builder() let mut render_schedule = Schedule::builder()
.add_system(render::render_test_system()) .add_system(render::render_test_system())
.build(); .build();
@ -135,23 +133,24 @@ fn main() {
extended_winit_imgui_support::HiDpiMode::Default, extended_winit_imgui_support::HiDpiMode::Default,
); );
// imgui rendering context // imgui_supp rendering context
let mut imgui_context = ImguiContext { let mut imgui_context = ImguiContext {
context: imgui_context, context: imgui_context,
}; };
let mut imgui_platform = ImguiPlatform { let mut imgui_platform = ImguiPlatform { platform: platform };
platform: platform,
};
let font_size = 20.0 as f32; let font_size = 20.0 as f32;
imgui_context.context.io_mut().font_global_scale = 1.0 as f32; imgui_context.context.io_mut().font_global_scale = 1.0 as f32;
imgui_context.context.fonts().add_font(&[FontSource::DefaultFontData { imgui_context
config: Some(imgui::FontConfig { .context
oversample_h: 1, .fonts()
pixel_snap_h: true, .add_font(&[FontSource::DefaultFontData {
size_pixels: font_size, config: Some(imgui::FontConfig {
..Default::default() oversample_h: 1,
}), pixel_snap_h: true,
}]); size_pixels: font_size,
..Default::default()
}),
}]);
imgui_context.context.set_ini_filename(None); imgui_context.context.set_ini_filename(None);
// The renderer // The renderer
@ -236,13 +235,21 @@ fn main() {
*control_flow = ControlFlow::Poll; *control_flow = ControlFlow::Poll;
match event { match event {
event::Event::NewEvents(cause) => { event::Event::NewEvents(cause) => {
}
// This is the big boy section of the event loop
// We : dispatch events and clear the queue, query the loops
// time data and prep the dt data. Loop the dt locked
// conditionally, and run the fps locked renderer
event::Event::MainEventsCleared => {
event_schedule.execute(&mut world, &mut resources); event_schedule.execute(&mut world, &mut resources);
imgui_prepare_schedule.execute(&mut world, &mut resources);
resources resources
.get_mut::<Vec<OwnedEvent<OwnedEventExtension>>>() .get_mut::<Vec<OwnedEvent<OwnedEventExtension>>>()
.unwrap() .unwrap()
.clear(); .clear();
}
event::Event::MainEventsCleared => {
let (step_size, elapsed_time) = { let (step_size, elapsed_time) = {
// deltatime since last frame // deltatime since last frame
let loop_state = resources.get::<LoopState>().unwrap(); let loop_state = resources.get::<LoopState>().unwrap();
@ -287,7 +294,8 @@ fn main() {
} => *control_flow = ControlFlow::Exit, } => *control_flow = ControlFlow::Exit,
event::Event::RedrawRequested(_) => { event::Event::RedrawRequested(_) => {
// Call the render system // Call the render system
render_schedule.execute(&mut world, &mut resources); // imgui_prepare_schedule.execute(&mut world, &mut resources);
// render_schedule.execute(&mut world, &mut resources);
} }
_ => {} _ => {}
} }
@ -299,8 +307,9 @@ fn main() {
}); });
} }
pub fn entity_loading(world: &mut World, renderer: &mut Renderer) { pub fn entity_loading(world: &mut World, renderer: &mut Renderer) {
let monkey_mesh = renderer.load_mesh_to_buffer("./resources/monkey.obj"); let monkey_mesh = renderer.load_mesh_to_buffer("./resources/monkey.obj");
let camera_ent: Entity = world.push(( let camera_ent: Entity = world.push((

@ -10,10 +10,10 @@ use winit_24::window::{Theme, WindowId, Window};
use crate::camera::{Camera, CameraController}; use crate::camera::{Camera, CameraController};
use crate::owned_event::OwnedWindowEvent::MouseWheel; use crate::owned_event::OwnedWindowEvent::MouseWheel;
use crate::{ImguiPlatform, ImguiContext};
use std::sync::{Mutex, Arc}; use std::sync::{Mutex, Arc};
use std::cmp::Ordering; use std::cmp::Ordering;
use imgui::Io; use imgui::Io;
use crate::imgui_supp::imgui_support::{ImguiContext, ImguiPlatform};
#[derive(Clone)] #[derive(Clone)]
pub enum OwnedUIEvent<T> { pub enum OwnedUIEvent<T> {
@ -297,6 +297,7 @@ pub fn event_dispatch(
} }
_ => {} _ => {}
} }
let mut imgui_context = &mut imgui_context.lock().unwrap().context; let mut imgui_context = &mut imgui_context.lock().unwrap().context;
let mut imgui_platform = &mut imgui_platform.lock().unwrap().platform; let mut imgui_platform = &mut imgui_platform.lock().unwrap().platform;

@ -1,4 +1,7 @@
use std::cell::RefCell;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread::current;
use std::time::Duration;
use std::{iter, num::NonZeroU32, ops::Range, rc::Rc}; use std::{iter, num::NonZeroU32, ops::Range, rc::Rc};
use bytemuck::__core::mem; use bytemuck::__core::mem;
@ -8,6 +11,9 @@ use cgmath::{
Transform, Vector3, Transform, Vector3,
}; };
use futures::executor::LocalPool; use futures::executor::LocalPool;
use imgui::sys::ImGuiContext;
use imgui::*;
use imgui_wgpu::{Renderer as ImguiRenderer, RendererConfig as ImguiRendererConfig};
use legion::world::SubWorld; use legion::world::SubWorld;
use legion::*; use legion::*;
use rapier3d::parry::motion::RigidMotionComposition; use rapier3d::parry::motion::RigidMotionComposition;
@ -23,14 +29,10 @@ use winit_24::window::Window;
use crate::camera::{Camera, CameraController}; use crate::camera::{Camera, CameraController};
use crate::components::{Color, Mesh, Position, RangeCopy}; use crate::components::{Color, Mesh, Position, RangeCopy};
use crate::current_ui;
use crate::geometry::{import_mesh, vertex, Vertex}; use crate::geometry::{import_mesh, vertex, Vertex};
use crate::imgui_supp::imgui_support::{ImguiContext, ImguiPlatform};
use crate::light::{DirectionalLight, LightRaw}; use crate::light::{DirectionalLight, LightRaw};
use imgui::*;
use imgui_wgpu::{Renderer as ImguiRenderer, RendererConfig as ImguiRendererConfig};
use std::cell::RefCell;
use imgui::sys::ImGuiContext;
use crate::{ImguiContext, ImguiPlatform};
use std::time::Duration;
#[cfg_attr(rustfmt, rustfmt_skip)] #[cfg_attr(rustfmt, rustfmt_skip)]
#[allow(unused)] #[allow(unused)]
@ -79,6 +81,27 @@ pub struct Pass {
uniform_buf: wgpu::Buffer, uniform_buf: wgpu::Buffer,
} }
#[system]
#[write_component(Camera)]
pub fn imgui_prepare(
world: &mut SubWorld,
#[resource] winit_window: &mut Window,
#[resource] imgui_context: &mut Arc<Mutex<ImguiContext>>,
#[resource] imgui_platform: &mut Arc<Mutex<ImguiPlatform>>,
) {
let mut imgui_context = &mut imgui_context.lock().unwrap().context;
let mut imgui_platform = &mut imgui_platform.lock().unwrap().platform;
//imgui_state.context.io_mut().update_delta_time(Duration::new(0,160));
imgui_platform
.prepare_frame(imgui_context.io_mut(), &winit_window)
.expect("Failed to prepare frame");
// get the frame and build a ui window
unsafe { crate::CURRENT_UI = Some(std::mem::transmute(imgui_context.frame())) }
}
#[system] #[system]
#[write_component(Camera)] #[write_component(Camera)]
#[write_component(Position)] #[write_component(Position)]
@ -93,7 +116,6 @@ pub fn render_test(
#[resource] imgui_context: &mut Arc<Mutex<ImguiContext>>, #[resource] imgui_context: &mut Arc<Mutex<ImguiContext>>,
#[resource] imgui_platform: &mut Arc<Mutex<ImguiPlatform>>, #[resource] imgui_platform: &mut Arc<Mutex<ImguiPlatform>>,
) { ) {
let mut encoder = renderer let mut encoder = renderer
.device .device
.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
@ -101,9 +123,6 @@ pub fn render_test(
let frame = renderer.get_current_frame(); let frame = renderer.get_current_frame();
// Update the camera uniform buffers, need to make it support selection of // Update the camera uniform buffers, need to make it support selection of
// cameras // cameras
let mut query = <(&mut Camera)>::query(); let mut query = <(&mut Camera)>::query();
@ -118,7 +137,6 @@ pub fn render_test(
} }
let mut query = <(&mut Position, &mut Mesh, &mut Color)>::query(); let mut query = <(&mut Position, &mut Mesh, &mut Color)>::query();
let mut mesh_stack = Vec::new(); let mut mesh_stack = Vec::new();
// Update the entity uniforms // Update the entity uniforms
@ -244,17 +262,12 @@ pub fn render_test(
encoder.pop_debug_group(); encoder.pop_debug_group();
{ {
let mut imgui_context = &mut imgui_context.lock().unwrap().context; let mut imgui_context = &mut imgui_context.lock().unwrap().context;
let mut imgui_platform = &mut imgui_platform.lock().unwrap().platform; let mut imgui_platform = &mut imgui_platform.lock().unwrap().platform;
//imgui_state.context.io_mut().update_delta_time(Duration::new(0,160)); //imgui_state.context.io_mut().update_delta_time(Duration::new(0,160));
imgui_platform let ui = unsafe { crate::current_ui().unwrap() };
.prepare_frame(imgui_context.io_mut(), &winit_window)
.expect("Failed to prepare frame");
// get the frame and build a ui window
let ui = imgui_context.frame();
let window = imgui::Window::new(im_str!("Hello too")); let window = imgui::Window::new(im_str!("Hello too"));
window window
.size([400.0, 100.0], Condition::FirstUseEver) .size([400.0, 100.0], Condition::FirstUseEver)
@ -263,8 +276,7 @@ pub fn render_test(
ui.text(im_str!("Frametime: {:?}", 10.0)); ui.text(im_str!("Frametime: {:?}", 10.0));
}); });
// ui.show_demo_window(&mut true);
//ui.show_demo_window(&mut demo_open);
imgui_platform.prepare_render(&ui, &winit_window); imgui_platform.prepare_render(&ui, &winit_window);
let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
@ -279,16 +291,23 @@ pub fn render_test(
}], }],
depth_stencil_attachment: None, depth_stencil_attachment: None,
}); });
renderer.imgui_renderer
.render(ui.render(), &renderer.queue, &renderer.device, &mut rpass) // We gotta do some jank shit here and manually pull the draw data from the UI
let draw_data = unsafe {
crate::CURRENT_UI = None; // This is where the drop() occurs
imgui::sys::igRender();
&*(imgui::sys::igGetDrawData() as *mut imgui::DrawData)
};
renderer
.imgui_renderer
.render(draw_data, &renderer.queue, &renderer.device, &mut rpass)
.expect("Rendering failed"); .expect("Rendering failed");
} }
renderer.queue.submit(iter::once(encoder.finish())); renderer.queue.submit(iter::once(encoder.finish()));
} }
pub struct Renderer { pub struct Renderer {
swapchain: SwapChain, swapchain: SwapChain,
swapchain_description: SwapChainDescriptor, swapchain_description: SwapChainDescriptor,
@ -314,7 +333,6 @@ pub struct Renderer {
camera_projection: Matrix4<f32>, camera_projection: Matrix4<f32>,
imgui_renderer: ImguiRenderer, imgui_renderer: ImguiRenderer,
} }
impl Renderer { impl Renderer {
@ -456,7 +474,6 @@ impl Renderer {
} }
pub fn init(window: &Window, imgui_context: &mut ImguiContext) -> Renderer { pub fn init(window: &Window, imgui_context: &mut ImguiContext) -> Renderer {
// Grab the GPU instance, and query its features // Grab the GPU instance, and query its features
let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY); let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY);
let (size, surface) = unsafe { let (size, surface) = unsafe {
@ -631,9 +648,7 @@ impl Renderer {
slope_scale: 2.0, slope_scale: 2.0,
clamp: 0.0, clamp: 0.0,
}, },
clamp_depth: device.features().contains( clamp_depth: device.features().contains(wgpu::Features::DEPTH_CLAMPING),
wgpu::Features::DEPTH_CLAMPING
),
}), }),
multisample: wgpu::MultisampleState::default(), multisample: wgpu::MultisampleState::default(),
}); });
@ -867,14 +882,13 @@ impl Renderer {
label: Some("Depth Texture"), label: Some("Depth Texture"),
}); });
// Imgui renderer // Imgui renderer
let renderer_config = ImguiRendererConfig { let renderer_config = ImguiRendererConfig {
texture_format: sc_desc.format, texture_format: sc_desc.format,
..Default::default() ..Default::default()
}; };
let mut imgui_renderer = ImguiRenderer::new(&mut imgui_context.context, &device, &queue, renderer_config); let mut imgui_renderer =
ImguiRenderer::new(&mut imgui_context.context, &device, &queue, renderer_config);
Renderer { Renderer {
swapchain: swap_chain, swapchain: swap_chain,
@ -893,7 +907,7 @@ impl Renderer {
instance: Arc::new(instance), instance: Arc::new(instance),
views_given: 0, views_given: 0,
camera_projection: mx_projection, camera_projection: mx_projection,
imgui_renderer imgui_renderer,
} }
} }

Loading…
Cancel
Save