mirror of https://github.com/Leinnan/doppler.git
Working imgui
This commit is contained in:
parent
de84cca5b9
commit
8e66183b63
|
|
@ -2,3 +2,4 @@
|
||||||
**png
|
**png
|
||||||
**jpg
|
**jpg
|
||||||
**jpeg
|
**jpeg
|
||||||
|
imgui.ini
|
||||||
|
|
@ -197,9 +197,9 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cgmath",
|
"cgmath",
|
||||||
"gl",
|
"gl",
|
||||||
"glfw",
|
|
||||||
"human-panic",
|
"human-panic",
|
||||||
"image",
|
"image",
|
||||||
|
"imgui-glfw-rs",
|
||||||
"num",
|
"num",
|
||||||
"rand 0.7.3",
|
"rand 0.7.3",
|
||||||
"tobj",
|
"tobj",
|
||||||
|
|
@ -250,7 +250,18 @@ version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404"
|
checksum = "a94edab108827d67608095e269cf862e60d920f144a5026d3dbcfd8b877fb404"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gl_generator",
|
"gl_generator 0.14.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gl_generator"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
|
||||||
|
dependencies = [
|
||||||
|
"khronos_api 2.2.0",
|
||||||
|
"log",
|
||||||
|
"xml-rs 0.7.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -259,20 +270,19 @@ version = "0.14.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
|
checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"khronos_api",
|
"khronos_api 3.1.0",
|
||||||
"log",
|
"log",
|
||||||
"xml-rs",
|
"xml-rs 0.8.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "glfw"
|
name = "glfw"
|
||||||
version = "0.39.1"
|
version = "0.40.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d26b0c94d75430f0e8f0359c3f669c89b79df6c291f999596fb07e536b41c050"
|
checksum = "985f851b0d032911e199f308689d25c71f79d12c44625c3a31b683ad4e4f5dd9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"glfw-sys",
|
"glfw-sys",
|
||||||
"libc",
|
|
||||||
"log",
|
"log",
|
||||||
"objc",
|
"objc",
|
||||||
"raw-window-handle",
|
"raw-window-handle",
|
||||||
|
|
@ -330,6 +340,47 @@ dependencies = [
|
||||||
"tiff",
|
"tiff",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imgui"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9fdb2bcc7e498e78137ce28705ae836d69e36ee2eac89d0d926cfabfcf550570"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"imgui-sys",
|
||||||
|
"lazy_static",
|
||||||
|
"parking_lot",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imgui-glfw-rs"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "git+https://github.com/Leinnan/imgui-glfw-rs#9537c6d82f1594b22603a4e729e3943a326c54ac"
|
||||||
|
dependencies = [
|
||||||
|
"glfw",
|
||||||
|
"imgui",
|
||||||
|
"imgui-opengl-renderer",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imgui-opengl-renderer"
|
||||||
|
version = "0.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "610bc2facbf1fe9bcf24bf6d299fada80ad1fc86283bac986b5cfc258e971e56"
|
||||||
|
dependencies = [
|
||||||
|
"gl_generator 0.9.0",
|
||||||
|
"imgui",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imgui-sys"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72be9671d64dd0ed26bb708cd10060a431262ac90ae70cf7c5912feefe6849da"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "inflate"
|
name = "inflate"
|
||||||
version = "0.4.5"
|
version = "0.4.5"
|
||||||
|
|
@ -349,6 +400,12 @@ dependencies = [
|
||||||
"rayon",
|
"rayon",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "khronos_api"
|
||||||
|
version = "2.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "khronos_api"
|
name = "khronos_api"
|
||||||
version = "3.1.0"
|
version = "3.1.0"
|
||||||
|
|
@ -367,6 +424,15 @@ version = "0.2.74"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10"
|
checksum = "a2f02823cf78b754822df5f7f268fb59822e7296276d3e069d8e8cb26a14bd10"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lock_api"
|
||||||
|
version = "0.3.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
|
||||||
|
dependencies = [
|
||||||
|
"scopeguard",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.11"
|
version = "0.4.11"
|
||||||
|
|
@ -553,6 +619,30 @@ dependencies = [
|
||||||
"regex",
|
"regex",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking_lot"
|
||||||
|
version = "0.10.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e"
|
||||||
|
dependencies = [
|
||||||
|
"lock_api",
|
||||||
|
"parking_lot_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking_lot_core"
|
||||||
|
version = "0.7.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"cloudabi",
|
||||||
|
"libc",
|
||||||
|
"redox_syscall",
|
||||||
|
"smallvec",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "png"
|
name = "png"
|
||||||
version = "0.15.3"
|
version = "0.15.3"
|
||||||
|
|
@ -797,6 +887,12 @@ dependencies = [
|
||||||
"rand_core 0.3.1",
|
"rand_core 0.3.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.1.57"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.3.9"
|
version = "1.3.9"
|
||||||
|
|
@ -865,6 +961,12 @@ dependencies = [
|
||||||
"syn 1.0.38",
|
"syn 1.0.38",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "smallvec"
|
||||||
|
version = "1.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "0.15.44"
|
version = "0.15.44"
|
||||||
|
|
@ -990,6 +1092,15 @@ version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xml-rs"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xml-rs"
|
name = "xml-rs"
|
||||||
version = "0.8.3"
|
version = "0.8.3"
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ lto = true
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cgmath = "0.17.0"
|
cgmath = "0.17.0"
|
||||||
gl = "0.14.0"
|
gl = "0.14.0"
|
||||||
glfw = "0.39.1"
|
|
||||||
image = "0.22.5"
|
image = "0.22.5"
|
||||||
|
imgui-glfw-rs = { git = "https://github.com/Leinnan/imgui-glfw-rs" }
|
||||||
# only needed from chapter 3 on
|
# only needed from chapter 3 on
|
||||||
tobj = "2.0.2"
|
tobj = "2.0.2"
|
||||||
num = "0.3.0"
|
num = "0.3.0"
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,6 @@ use std::path::Path;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
|
|
||||||
use gl;
|
use gl;
|
||||||
extern crate glfw;
|
|
||||||
use self::glfw::{Action, Key};
|
|
||||||
|
|
||||||
use image;
|
use image;
|
||||||
use image::DynamicImage::*;
|
use image::DynamicImage::*;
|
||||||
|
|
|
||||||
114
src/main.rs
114
src/main.rs
|
|
@ -1,10 +1,15 @@
|
||||||
extern crate gl;
|
extern crate gl;
|
||||||
extern crate glfw;
|
extern crate imgui_glfw_rs;
|
||||||
extern crate image;
|
extern crate image;
|
||||||
|
// Use the reexported glfw crate to avoid version conflicts.
|
||||||
|
use imgui_glfw_rs::glfw;
|
||||||
|
// Use the reexported imgui crate to avoid version conflicts.
|
||||||
|
use imgui_glfw_rs::imgui;
|
||||||
|
|
||||||
|
use imgui_glfw_rs::ImguiGLFW;
|
||||||
use self::camera::*;
|
use self::camera::*;
|
||||||
use self::gl::types::*;
|
use self::gl::types::*;
|
||||||
use self::glfw::{Action, Context, Key};
|
use imgui_glfw_rs::glfw::{Action, Context, Key};
|
||||||
use cgmath::prelude::*;
|
use cgmath::prelude::*;
|
||||||
use cgmath::{perspective, vec3, Deg, Matrix4, Point3, Rad, Vector3};
|
use cgmath::{perspective, vec3, Deg, Matrix4, Point3, Rad, Vector3};
|
||||||
use human_panic::setup_panic;
|
use human_panic::setup_panic;
|
||||||
|
|
@ -71,6 +76,7 @@ pub fn main() {
|
||||||
.expect("Failed to create GLFW window");
|
.expect("Failed to create GLFW window");
|
||||||
|
|
||||||
window.make_current();
|
window.make_current();
|
||||||
|
window.set_all_polling(true);
|
||||||
window.set_framebuffer_size_polling(true);
|
window.set_framebuffer_size_polling(true);
|
||||||
window.set_cursor_pos_polling(true);
|
window.set_cursor_pos_polling(true);
|
||||||
window.set_scroll_polling(true);
|
window.set_scroll_polling(true);
|
||||||
|
|
@ -105,10 +111,13 @@ pub fn main() {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let mut imgui = imgui::Context::create();
|
||||||
|
|
||||||
|
let mut imgui_glfw = ImguiGLFW::new(&mut imgui, &mut window);
|
||||||
|
|
||||||
// render loop
|
// render loop
|
||||||
// -----------
|
// -----------
|
||||||
let (r, g, b) = (0.188, 0.22, 0.235);
|
let (mut r,mut g,mut b) = (0.188, 0.22, 0.235);
|
||||||
while !window.should_close() {
|
while !window.should_close() {
|
||||||
// per-frame time logic
|
// per-frame time logic
|
||||||
// --------------------
|
// --------------------
|
||||||
|
|
@ -116,16 +125,6 @@ pub fn main() {
|
||||||
delta_time = cur_frame - last_frame;
|
delta_time = cur_frame - last_frame;
|
||||||
last_frame = cur_frame;
|
last_frame = cur_frame;
|
||||||
|
|
||||||
// events
|
|
||||||
// -----
|
|
||||||
process_events(
|
|
||||||
&events,
|
|
||||||
&mut first_mouse,
|
|
||||||
&mut last_x,
|
|
||||||
&mut last_y,
|
|
||||||
&mut camera,
|
|
||||||
);
|
|
||||||
|
|
||||||
// input
|
// input
|
||||||
// -----
|
// -----
|
||||||
process_input(&mut window, delta_time, &mut camera);
|
process_input(&mut window, delta_time, &mut camera);
|
||||||
|
|
@ -133,7 +132,7 @@ pub fn main() {
|
||||||
// render
|
// render
|
||||||
// ------
|
// ------
|
||||||
unsafe {
|
unsafe {
|
||||||
gl::ClearColor(0.1, 0.1, 0.1, 1.0);
|
gl::ClearColor(r, g, b, 1.0);
|
||||||
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
|
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
// don't forget to enable shader before setting uniforms
|
// don't forget to enable shader before setting uniforms
|
||||||
|
|
@ -154,46 +153,83 @@ pub fn main() {
|
||||||
|
|
||||||
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
let ui = imgui_glfw.frame(&mut window, &mut imgui);
|
||||||
|
|
||||||
|
{
|
||||||
|
use imgui::*;
|
||||||
|
Window::new(im_str!("Hello world"))
|
||||||
|
.size([300.0, 110.0], Condition::FirstUseEver)
|
||||||
|
.build(&ui, || {
|
||||||
|
ui.text(im_str!("Hello world!"));
|
||||||
|
ui.text(im_str!("こんにちは世界!"));
|
||||||
|
ui.text(im_str!("This...is...imgui-rs!"));
|
||||||
|
ui.separator();
|
||||||
|
ui.text(format!(
|
||||||
|
"Mouse Position: ({:.1},{:.1})",
|
||||||
|
last_x, last_y
|
||||||
|
));
|
||||||
|
imgui::Slider::new(im_str!("r"), 0.0 ..= 1.0)
|
||||||
|
.build(&ui, &mut r);
|
||||||
|
imgui::Slider::new(im_str!("g"), 0.0 ..= 1.0)
|
||||||
|
.build(&ui, &mut g);
|
||||||
|
imgui::Slider::new(im_str!("b"), 0.0 ..= 1.0)
|
||||||
|
.build(&ui, &mut b);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
imgui_glfw.draw(ui, &mut window);
|
||||||
window.swap_buffers();
|
window.swap_buffers();
|
||||||
glfw.poll_events();
|
glfw.poll_events();
|
||||||
|
// events
|
||||||
|
// -----
|
||||||
|
|
||||||
|
for (_, event) in glfw::flush_messages(&events) {
|
||||||
|
imgui_glfw.handle_event(&mut imgui, &event);
|
||||||
|
process_events(
|
||||||
|
event,
|
||||||
|
&mut first_mouse,
|
||||||
|
&mut last_x,
|
||||||
|
&mut last_y,
|
||||||
|
&mut camera,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_events(
|
pub fn process_events(
|
||||||
events: &Receiver<(f64, glfw::WindowEvent)>,
|
event: imgui_glfw_rs::glfw::WindowEvent,
|
||||||
first_mouse: &mut bool,
|
first_mouse: &mut bool,
|
||||||
last_x: &mut f32,
|
last_x: &mut f32,
|
||||||
last_y: &mut f32,
|
last_y: &mut f32,
|
||||||
camera: &mut Camera,
|
camera: &mut Camera,
|
||||||
) {
|
) {
|
||||||
for (_, event) in glfw::flush_messages(events) {
|
match event {
|
||||||
match event {
|
glfw::WindowEvent::FramebufferSize(width, height) => {
|
||||||
glfw::WindowEvent::FramebufferSize(width, height) => {
|
// make sure the viewport matches the new window dimensions; note that width and
|
||||||
// make sure the viewport matches the new window dimensions; note that width and
|
// height will be significantly larger than specified on retina displays.
|
||||||
// height will be significantly larger than specified on retina displays.
|
unsafe { gl::Viewport(0, 0, width, height) }
|
||||||
unsafe { gl::Viewport(0, 0, width, height) }
|
}
|
||||||
}
|
glfw::WindowEvent::CursorPos(xpos, ypos) => {
|
||||||
glfw::WindowEvent::CursorPos(xpos, ypos) => {
|
let (xpos, ypos) = (xpos as f32, ypos as f32);
|
||||||
let (xpos, ypos) = (xpos as f32, ypos as f32);
|
if *first_mouse {
|
||||||
if *first_mouse {
|
|
||||||
*last_x = xpos;
|
|
||||||
*last_y = ypos;
|
|
||||||
*first_mouse = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let xoffset = xpos - *last_x;
|
|
||||||
let yoffset = *last_y - ypos; // reversed since y-coordinates go from bottom to top
|
|
||||||
|
|
||||||
*last_x = xpos;
|
*last_x = xpos;
|
||||||
*last_y = ypos;
|
*last_y = ypos;
|
||||||
|
*first_mouse = false;
|
||||||
|
}
|
||||||
|
|
||||||
camera.process_mouse_movement(xoffset, yoffset, true);
|
let xoffset = xpos - *last_x;
|
||||||
}
|
let yoffset = *last_y - ypos; // reversed since y-coordinates go from bottom to top
|
||||||
glfw::WindowEvent::Scroll(_xoffset, yoffset) => {
|
|
||||||
camera.process_mouse_scroll(yoffset as f32);
|
*last_x = xpos;
|
||||||
}
|
*last_y = ypos;
|
||||||
_ => {}
|
|
||||||
|
camera.process_mouse_movement(xoffset, yoffset, true);
|
||||||
}
|
}
|
||||||
|
glfw::WindowEvent::Scroll(_xoffset, yoffset) => {
|
||||||
|
camera.process_mouse_scroll(yoffset as f32);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue