diff --git a/Cargo.lock b/Cargo.lock index 944544d0..fbd683f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1133,6 +1133,7 @@ dependencies = [ "dreammaker 0.1.0", "gfx 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)", "gfx_device_gl 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)", + "gfx_gl 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "gfx_window_glutin 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)", "glutin 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "imgui 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/src/editor/Cargo.toml b/src/editor/Cargo.toml index 289d2cef..f23f6b24 100644 --- a/src/editor/Cargo.toml +++ b/src/editor/Cargo.toml @@ -11,6 +11,7 @@ path = "main.rs" dreammaker = { path = "../dreammaker" } dmm-tools = { path = "../tools" } glutin = "0.18.0" +gfx_gl = "0.5.0" gfx = "0.17.1" gfx_window_glutin = "0.26.0" gfx_device_gl = "0.15.3" diff --git a/src/editor/dmi.rs b/src/editor/dmi.rs index 7d4a9d21..f134c6e1 100644 --- a/src/editor/dmi.rs +++ b/src/editor/dmi.rs @@ -156,7 +156,7 @@ pub fn load_texture(factory: &mut Factory, bitmap: lodepng::Bitmap) -> Tex } let kind = gfx::texture::Kind::D2(width as u16, height as u16, gfx::texture::AaMode::Single); - let (_, view) = factory.create_texture_immutable_u8::( + let (_, view) = factory.create_texture_immutable_u8::<::ColorFormat>( kind, gfx::texture::Mipmap::Provided, &[&new_buffer[..]] diff --git a/src/editor/main.rs b/src/editor/main.rs index 805021e8..375e95fe 100644 --- a/src/editor/main.rs +++ b/src/editor/main.rs @@ -15,6 +15,7 @@ extern crate divrem; extern crate serde; extern crate toml; extern crate petgraph; +extern crate gfx_gl as gl; extern crate dreammaker as dm; extern crate dmm_tools; diff --git a/src/editor/support.rs b/src/editor/support.rs index edb78c5f..4056510d 100644 --- a/src/editor/support.rs +++ b/src/editor/support.rs @@ -1,4 +1,4 @@ -use imgui::{FrameSize, ImFontConfig, ImGui, ImGuiMouseCursor, ImVec4, ImGuiStyle}; +use imgui::{FrameSize, ImFontConfig, ImGui, ImGuiMouseCursor, ImVec4}; use imgui_gfx_renderer::{Renderer, Shaders}; use std::time::Instant; @@ -26,6 +26,16 @@ pub fn run(title: String, clear_color: [f32; 4]) -> ::EditorScene { let (window, mut device, mut factory, mut main_color, mut main_depth) = gfx_window_glutin::init::(window, context, &events_loop); + // gfx's gl backend sets FRAMEBUFFER_SRGB permanently by default - actually + // we want it off permanently. I've been told this is most sanely set on a + // per-render-pass basis, but neither the world nor imgui blend colors + // accurately if it is set. + unsafe { + device.with_gl(|gl| { + gl.Disable(::gl::FRAMEBUFFER_SRGB); + }); + } + let (ww, wh): (f64, f64) = window.get_outer_size().unwrap().into(); let (dw, dh): (f64, f64) = window.get_primary_monitor().get_dimensions().into(); window.set_position(((dw - ww) / 2.0, (dh - wh) / 2.0).into()); @@ -49,7 +59,7 @@ pub fn run(title: String, clear_color: [f32; 4]) -> ::EditorScene { }; let mut imgui = ImGui::init(); - fix_imgui_srgb(&mut imgui.style_mut().colors, &dark_theme()); + imgui.style_mut().colors.clone_from(&dark_theme()); imgui.set_ini_filename(None); // In the examples we only use integer DPI factors, because the UI can get very blurry @@ -301,40 +311,6 @@ fn update_mouse(imgui: &mut ImGui, mouse_state: &mut MouseState) { mouse_state.wheel = 0.0; } -fn fix_imgui_srgb(dest: &mut [ImVec4; 43], source: &[ImVec4; 43]) { - // Fix incorrect colors with sRGB framebuffer - fn imgui_gamma_to_linear(col: ImVec4) -> ImVec4 { - let x = col.x.powf(2.2); - let y = col.y.powf(2.2); - let z = col.z.powf(2.2); - let w = 1.0 - (1.0 - col.w).powf(2.2); - ImVec4::new(x, y, z, w) - } - - for (dest, source) in dest.iter_mut().zip(source.iter()) { - *dest = imgui_gamma_to_linear(*source); - } -} - -// Workaround for ImGuiStyle not being Clone. -fn _clone_imgui_style(style: &ImGuiStyle) -> ImGuiStyle { - macro_rules! f { - ($($f:ident,)*) => { - ImGuiStyle { - $($f: style.$f,)* - } - } - } - f! { alpha, window_padding, window_rounding, window_border_size, - window_min_size, window_title_align, child_rounding, child_border_size, - popup_rounding, popup_border_size, frame_padding, frame_rounding, - frame_border_size, item_spacing, item_inner_spacing, touch_extra_padding, - indent_spacing, columns_min_spacing, scrollbar_size, scrollbar_rounding, - grab_min_size, grab_rounding, button_text_align, display_window_padding, - display_safe_area_padding, anti_aliased_lines, anti_aliased_fill, - curve_tessellation_tol, colors, } -} - fn dark_theme() -> [ImVec4; 43] { [ ImVec4::new(1.00, 1.00, 1.00, 1.00),