2020-08-19 11:21:40 +00:00
|
|
|
use std::time::Instant;
|
|
|
|
|
|
|
|
use imgui::{FontConfig, FontSource};
|
2020-08-19 19:11:32 +00:00
|
|
|
use imgui::sys::*;
|
2020-08-19 11:21:40 +00:00
|
|
|
use imgui_gfx_renderer::{Renderer, Shaders};
|
2020-09-20 15:27:31 +00:00
|
|
|
use imgui_gfx_renderer::gfx::format::DepthStencil;
|
2020-08-19 11:21:40 +00:00
|
|
|
use imgui_gfx_renderer::gfx::format::Rgba8;
|
2020-09-20 15:27:31 +00:00
|
|
|
use imgui_gfx_renderer::gfx::handle::DepthStencilView;
|
2020-08-19 11:21:40 +00:00
|
|
|
use imgui_gfx_renderer::gfx::handle::RenderTargetView;
|
|
|
|
use imgui_gfx_renderer::gfx::memory::Typed;
|
|
|
|
use imgui_winit_support::{HiDpiMode, WinitPlatform};
|
|
|
|
|
2020-11-04 23:25:18 +00:00
|
|
|
use ggez::{Context, GameResult, graphics};
|
|
|
|
use ggez::GameError::RenderError;
|
2020-08-19 13:11:34 +00:00
|
|
|
use crate::live_debugger::LiveDebugger;
|
2020-08-19 11:21:40 +00:00
|
|
|
use crate::scene::Scene;
|
2020-09-20 15:27:31 +00:00
|
|
|
use crate::shared_game_state::SharedGameState;
|
2020-08-19 11:21:40 +00:00
|
|
|
|
|
|
|
mod types {
|
|
|
|
pub type Device = gfx_device_gl::Device;
|
|
|
|
pub type Factory = gfx_device_gl::Factory;
|
|
|
|
pub type Resources = gfx_device_gl::Resources;
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct UI {
|
|
|
|
pub imgui: imgui::Context,
|
|
|
|
pub platform: WinitPlatform,
|
|
|
|
pub renderer: Renderer<Rgba8, types::Resources>,
|
2020-08-23 02:16:31 +00:00
|
|
|
pub components: Components,
|
2020-09-20 15:27:31 +00:00
|
|
|
pub main_color: RenderTargetView<types::Resources, Rgba8>,
|
|
|
|
pub main_depth: DepthStencilView<types::Resources, DepthStencil>,
|
2020-08-19 11:21:40 +00:00
|
|
|
last_frame: Instant,
|
|
|
|
}
|
|
|
|
|
2020-08-23 02:16:31 +00:00
|
|
|
pub struct Components {
|
|
|
|
pub live_debugger: LiveDebugger,
|
|
|
|
}
|
|
|
|
|
2020-08-19 11:21:40 +00:00
|
|
|
impl UI {
|
|
|
|
pub fn new(ctx: &mut Context) -> GameResult<Self> {
|
|
|
|
let mut imgui = imgui::Context::create();
|
|
|
|
imgui.set_ini_filename(None);
|
|
|
|
imgui.fonts().add_font(&[
|
|
|
|
FontSource::DefaultFontData {
|
|
|
|
config: Some(FontConfig::default()),
|
|
|
|
},
|
|
|
|
]);
|
2020-08-19 19:11:32 +00:00
|
|
|
|
|
|
|
imgui.style_mut().window_padding = [4.0, 6.0];
|
|
|
|
imgui.style_mut().frame_padding = [8.0, 6.0];
|
|
|
|
imgui.style_mut().item_spacing = [8.0, 6.0];
|
|
|
|
imgui.style_mut().item_inner_spacing = [8.0, 6.0];
|
|
|
|
imgui.style_mut().indent_spacing = 20.0;
|
|
|
|
|
|
|
|
imgui.style_mut().scrollbar_size = 20.0;
|
|
|
|
imgui.style_mut().grab_min_size = 5.0;
|
|
|
|
imgui.style_mut().window_border_size = 0.0;
|
|
|
|
imgui.style_mut().child_border_size = 1.0;
|
|
|
|
imgui.style_mut().popup_border_size = 1.0;
|
|
|
|
imgui.style_mut().frame_border_size = 1.0;
|
|
|
|
imgui.style_mut().tab_border_size = 0.0;
|
|
|
|
|
|
|
|
imgui.style_mut().window_rounding = 0.0;
|
|
|
|
imgui.style_mut().child_rounding = 0.0;
|
|
|
|
imgui.style_mut().frame_rounding = 0.0;
|
|
|
|
imgui.style_mut().popup_rounding = 0.0;
|
|
|
|
imgui.style_mut().scrollbar_rounding = 0.0;
|
|
|
|
imgui.style_mut().grab_rounding = 0.0;
|
|
|
|
imgui.style_mut().tab_rounding = 0.0;
|
|
|
|
|
|
|
|
imgui.style_mut().window_title_align = [0.50, 0.50];
|
|
|
|
imgui.style_mut().window_rounding = 0.0;
|
|
|
|
|
|
|
|
let colors = &mut imgui.style_mut().colors;
|
|
|
|
colors[ImGuiCol_Text as usize] = [0.90, 0.90, 0.90, 1.00];
|
|
|
|
colors[ImGuiCol_TextDisabled as usize] = [0.50, 0.50, 0.50, 1.00];
|
|
|
|
colors[ImGuiCol_WindowBg as usize] = [0.05, 0.05, 0.05, 0.60];
|
|
|
|
colors[ImGuiCol_ChildBg as usize] = [0.05, 0.05, 0.05, 0.60];
|
|
|
|
colors[ImGuiCol_PopupBg as usize] = [0.00, 0.00, 0.00, 0.60];
|
|
|
|
colors[ImGuiCol_Border as usize] = [0.40, 0.40, 0.40, 1.00];
|
|
|
|
colors[ImGuiCol_BorderShadow as usize] = [1.00, 1.00, 1.00, 0.00];
|
|
|
|
colors[ImGuiCol_FrameBg as usize] = [0.00, 0.00, 0.00, 0.60];
|
|
|
|
colors[ImGuiCol_FrameBgHovered as usize] = [0.84, 0.37, 0.00, 0.20];
|
|
|
|
colors[ImGuiCol_FrameBgActive as usize] = [0.84, 0.37, 0.00, 1.00];
|
|
|
|
colors[ImGuiCol_TitleBg as usize] = [0.06, 0.06, 0.06, 1.00];
|
|
|
|
colors[ImGuiCol_TitleBgActive as usize] = [0.00, 0.00, 0.00, 1.00];
|
|
|
|
colors[ImGuiCol_TitleBgCollapsed as usize] = [0.06, 0.06, 0.06, 0.40];
|
|
|
|
colors[ImGuiCol_MenuBarBg as usize] = [0.14, 0.14, 0.14, 1.00];
|
|
|
|
colors[ImGuiCol_ScrollbarBg as usize] = [0.14, 0.14, 0.14, 0.40];
|
|
|
|
colors[ImGuiCol_ScrollbarGrab as usize] = [0.31, 0.31, 0.31, 0.30];
|
|
|
|
colors[ImGuiCol_ScrollbarGrabHovered as usize] = [1.00, 1.00, 1.00, 0.30];
|
|
|
|
colors[ImGuiCol_ScrollbarGrabActive as usize] = [1.00, 1.00, 1.00, 0.50];
|
|
|
|
colors[ImGuiCol_CheckMark as usize] = [0.90, 0.90, 0.90, 1.00];
|
|
|
|
colors[ImGuiCol_SliderGrab as usize] = [0.31, 0.31, 0.31, 1.00];
|
|
|
|
colors[ImGuiCol_SliderGrabActive as usize] = [1.00, 1.00, 1.00, 0.50];
|
|
|
|
colors[ImGuiCol_Button as usize] = [0.14, 0.14, 0.14, 1.00];
|
|
|
|
colors[ImGuiCol_ButtonHovered as usize] = [0.84, 0.37, 0.00, 0.20];
|
|
|
|
colors[ImGuiCol_ButtonActive as usize] = [0.84, 0.37, 0.00, 1.00];
|
|
|
|
colors[ImGuiCol_Header as usize] = [0.14, 0.14, 0.14, 1.00];
|
|
|
|
colors[ImGuiCol_HeaderHovered as usize] = [0.84, 0.37, 0.00, 0.20];
|
|
|
|
colors[ImGuiCol_HeaderActive as usize] = [0.84, 0.37, 0.00, 1.00];
|
|
|
|
colors[ImGuiCol_Separator as usize] = [0.50, 0.50, 0.43, 0.50];
|
|
|
|
colors[ImGuiCol_SeparatorHovered as usize] = [0.75, 0.45, 0.10, 0.78];
|
|
|
|
colors[ImGuiCol_SeparatorActive as usize] = [0.75, 0.45, 0.10, 1.00];
|
|
|
|
colors[ImGuiCol_ResizeGrip as usize] = [0.98, 0.65, 0.26, 0.25];
|
|
|
|
colors[ImGuiCol_ResizeGripHovered as usize] = [0.98, 0.65, 0.26, 0.67];
|
|
|
|
colors[ImGuiCol_ResizeGripActive as usize] = [0.98, 0.65, 0.26, 0.95];
|
|
|
|
colors[ImGuiCol_Tab as usize] = [0.17, 0.10, 0.04, 0.94];
|
|
|
|
colors[ImGuiCol_TabHovered as usize] = [0.84, 0.37, 0.00, 0.60];
|
|
|
|
colors[ImGuiCol_TabActive as usize] = [0.67, 0.30, 0.00, 0.68];
|
|
|
|
colors[ImGuiCol_TabUnfocused as usize] = [0.06, 0.05, 0.05, 0.69];
|
|
|
|
colors[ImGuiCol_TabUnfocusedActive as usize] = [0.36, 0.17, 0.03, 0.64];
|
|
|
|
colors[ImGuiCol_PlotLines as usize] = [0.39, 0.39, 0.39, 1.00];
|
|
|
|
colors[ImGuiCol_PlotLinesHovered as usize] = [0.35, 0.92, 1.00, 1.00];
|
|
|
|
colors[ImGuiCol_PlotHistogram as usize] = [0.00, 0.20, 0.90, 1.00];
|
|
|
|
colors[ImGuiCol_PlotHistogramHovered as usize] = [0.00, 0.40, 1.00, 1.00];
|
|
|
|
colors[ImGuiCol_TextSelectedBg as usize] = [0.98, 0.65, 0.26, 0.35];
|
|
|
|
colors[ImGuiCol_DragDropTarget as usize] = [0.00, 0.00, 1.00, 0.90];
|
|
|
|
colors[ImGuiCol_NavHighlight as usize] = [0.98, 0.65, 0.26, 1.00];
|
|
|
|
colors[ImGuiCol_NavWindowingHighlight as usize] = [0.00, 0.00, 0.00, 0.70];
|
|
|
|
colors[ImGuiCol_NavWindowingDimBg as usize] = [0.20, 0.20, 0.20, 0.20];
|
|
|
|
colors[ImGuiCol_ModalWindowDimBg as usize] = [0.20, 0.20, 0.20, 0.35];
|
2020-08-19 11:21:40 +00:00
|
|
|
|
|
|
|
let mut platform = WinitPlatform::init(&mut imgui);
|
2020-10-07 14:08:12 +00:00
|
|
|
platform.attach_window(imgui.io_mut(), graphics::window(ctx).window(), HiDpiMode::Rounded);
|
2020-08-19 11:21:40 +00:00
|
|
|
|
2020-09-20 15:27:31 +00:00
|
|
|
let (factory, dev, _, depth, color) = graphics::gfx_objects(ctx);
|
2020-08-19 11:21:40 +00:00
|
|
|
let shaders = {
|
|
|
|
let version = dev.get_info().shading_language;
|
|
|
|
if version.is_embedded {
|
|
|
|
if version.major >= 3 {
|
|
|
|
Shaders::GlSlEs300
|
|
|
|
} else {
|
|
|
|
Shaders::GlSlEs100
|
|
|
|
}
|
|
|
|
} else if version.major >= 4 {
|
|
|
|
Shaders::GlSl400
|
|
|
|
} else if version.major >= 3 {
|
|
|
|
if version.minor >= 2 {
|
|
|
|
Shaders::GlSl150
|
|
|
|
} else {
|
|
|
|
Shaders::GlSl130
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Shaders::GlSl110
|
|
|
|
}
|
|
|
|
};
|
|
|
|
let renderer = Renderer::init(&mut imgui, factory, shaders)
|
|
|
|
.map_err(|e| RenderError(e.to_string()))?;
|
|
|
|
|
|
|
|
Ok(Self {
|
|
|
|
imgui,
|
|
|
|
platform,
|
|
|
|
renderer,
|
2020-08-23 02:16:31 +00:00
|
|
|
components: Components {
|
|
|
|
live_debugger: LiveDebugger::new(),
|
|
|
|
},
|
2020-08-19 11:21:40 +00:00
|
|
|
main_color: RenderTargetView::new(color),
|
2020-09-20 15:27:31 +00:00
|
|
|
main_depth: DepthStencilView::new(depth),
|
2020-08-19 11:21:40 +00:00
|
|
|
last_frame: Instant::now(),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-10-07 14:08:12 +00:00
|
|
|
pub fn handle_events(&mut self, ctx: &mut Context, event: &winit::event::Event<()>) {
|
|
|
|
self.platform.handle_event(self.imgui.io_mut(), graphics::window(ctx).window(), &event);
|
2020-08-19 11:21:40 +00:00
|
|
|
}
|
|
|
|
|
2020-08-23 02:16:31 +00:00
|
|
|
pub fn draw(&mut self, state: &mut SharedGameState, ctx: &mut Context, scene: &mut Box<dyn Scene>) -> GameResult {
|
2020-08-19 11:21:40 +00:00
|
|
|
{
|
|
|
|
let io = self.imgui.io_mut();
|
2020-10-07 14:08:12 +00:00
|
|
|
self.platform.prepare_frame(io, graphics::window(ctx).window())
|
|
|
|
.map_err(|e| RenderError(e.to_string()))?;
|
2020-08-19 11:21:40 +00:00
|
|
|
|
2020-10-07 14:08:12 +00:00
|
|
|
let now = Instant::now();
|
|
|
|
io.update_delta_time(now - self.last_frame);
|
|
|
|
self.last_frame = now;
|
2020-08-19 11:21:40 +00:00
|
|
|
}
|
|
|
|
let mut ui = self.imgui.frame();
|
|
|
|
|
2020-08-23 02:16:31 +00:00
|
|
|
scene.debug_overlay_draw(&mut self.components, state, ctx, &mut ui)?;
|
2020-08-19 11:21:40 +00:00
|
|
|
|
2020-10-07 14:08:12 +00:00
|
|
|
self.platform.prepare_render(&ui, graphics::window(ctx).window());
|
2020-08-19 11:21:40 +00:00
|
|
|
let draw_data = ui.render();
|
|
|
|
let (factory, dev, encoder, _, _) = graphics::gfx_objects(ctx);
|
|
|
|
self.renderer
|
|
|
|
.render(factory, encoder, &mut self.main_color, draw_data)
|
|
|
|
.map_err(|e| RenderError(e.to_string()))?;
|
|
|
|
|
|
|
|
encoder.flush(dev);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|