Create Flycam, pass to RenderState, and handle drags
This commit is contained in:
parent
e7ff524e7b
commit
23234c2263
|
@ -23,6 +23,7 @@ struct Application {
|
||||||
egui_ctx: egui::Context,
|
egui_ctx: egui::Context,
|
||||||
egui_rp: EguiRenderPass,
|
egui_rp: EguiRenderPass,
|
||||||
ui: ui::UserInterface,
|
ui: ui::UserInterface,
|
||||||
|
viewport: ui::ViewportWidget,
|
||||||
render_state: render::RenderState,
|
render_state: render::RenderState,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +79,8 @@ impl Application {
|
||||||
egui_state,
|
egui_state,
|
||||||
egui_ctx,
|
egui_ctx,
|
||||||
egui_rp,
|
egui_rp,
|
||||||
ui: ui::UserInterface::new(viewport_texture),
|
ui: ui::UserInterface::new(),
|
||||||
|
viewport: ui::ViewportWidget::new(viewport_texture),
|
||||||
render_state,
|
render_state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,11 +108,12 @@ impl Application {
|
||||||
let output = {
|
let output = {
|
||||||
puffin::profile_scope!("Draw egui");
|
puffin::profile_scope!("Draw egui");
|
||||||
let raw_input = self.egui_state.take_egui_input(&self.window);
|
let raw_input = self.egui_state.take_egui_input(&self.window);
|
||||||
self.egui_ctx.run(raw_input, |ctx| self.ui.run(ctx))
|
self.egui_ctx.run(raw_input, |ctx| self.ui.run(ctx, &mut self.viewport))
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
puffin::profile_scope!("Main render");
|
puffin::profile_scope!("Main render");
|
||||||
|
self.render_state.update_viewport(&mut self.viewport);
|
||||||
self.render_state.render();
|
self.render_state.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::ui::ViewportWidget;
|
||||||
use crate::wgpu;
|
use crate::wgpu;
|
||||||
use cyborg::camera::Camera;
|
use cyborg::camera::Camera;
|
||||||
use cyborg::viewport::{Viewport, ViewportInfo, ViewportViews};
|
use cyborg::viewport::{Viewport, ViewportInfo, ViewportViews};
|
||||||
|
@ -65,6 +66,7 @@ pub struct OffscreenViewport {
|
||||||
pub output_format: wgpu::TextureFormat,
|
pub output_format: wgpu::TextureFormat,
|
||||||
pub textures: OffscreenTextures,
|
pub textures: OffscreenTextures,
|
||||||
pub egui_texture: egui::TextureId,
|
pub egui_texture: egui::TextureId,
|
||||||
|
pub camera: Camera,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OffscreenViewport {
|
impl OffscreenViewport {
|
||||||
|
@ -88,14 +90,15 @@ impl OffscreenViewport {
|
||||||
output_format,
|
output_format,
|
||||||
textures,
|
textures,
|
||||||
egui_texture,
|
egui_texture,
|
||||||
|
camera: Camera {
|
||||||
|
eye: [1.0, 1.0, 1.0, 0.0],
|
||||||
|
vp: Default::default(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_camera(&self) -> Camera {
|
pub fn get_camera(&self) -> Camera {
|
||||||
Camera {
|
self.camera.clone()
|
||||||
eye: [1.0, 1.0, 1.0, 0.0],
|
|
||||||
vp: Default::default(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,6 +226,11 @@ impl RenderState {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update_viewport(&mut self, viewport: &mut ViewportWidget) {
|
||||||
|
let mut store = self.resources.get_mut::<ViewportStore>().unwrap();
|
||||||
|
store.viewport.camera = viewport.flycam.get_camera();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn render(&mut self) {
|
pub fn render(&mut self) {
|
||||||
self.render_schedule
|
self.render_schedule
|
||||||
.execute(&mut self.world, &mut self.resources);
|
.execute(&mut self.world, &mut self.resources);
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
|
use cyborg::camera::Flycam;
|
||||||
|
|
||||||
pub struct UserInterface {
|
pub struct UserInterface {
|
||||||
developer_mode: bool,
|
developer_mode: bool,
|
||||||
show_profiler: bool,
|
show_profiler: bool,
|
||||||
quit: bool,
|
quit: bool,
|
||||||
show_about: bool,
|
show_about: bool,
|
||||||
log_contents: String,
|
log_contents: String,
|
||||||
viewport: ViewportWidget,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UserInterface {
|
impl UserInterface {
|
||||||
pub fn new(viewport_texture: egui::TextureId) -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
developer_mode: true,
|
developer_mode: true,
|
||||||
show_profiler: false,
|
show_profiler: false,
|
||||||
quit: false,
|
quit: false,
|
||||||
show_about: false,
|
show_about: false,
|
||||||
log_contents: "Hello logging!\n".to_string(),
|
log_contents: "Hello logging!\n".to_string(),
|
||||||
viewport: ViewportWidget::new(viewport_texture),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ impl UserInterface {
|
||||||
self.quit
|
self.quit
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(&mut self, ctx: &egui::Context) {
|
pub fn run(&mut self, ctx: &egui::Context, viewport: &mut ViewportWidget) {
|
||||||
egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| {
|
egui::TopBottomPanel::top("menu_bar").show(ctx, |ui| {
|
||||||
egui::menu::bar(ui, |ui| {
|
egui::menu::bar(ui, |ui| {
|
||||||
ui.menu_button("File", |ui| {
|
ui.menu_button("File", |ui| {
|
||||||
|
@ -120,19 +120,23 @@ impl UserInterface {
|
||||||
});
|
});
|
||||||
|
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
ui.add(&mut self.viewport);
|
ui.add(viewport);
|
||||||
ui.heading("Viewport");
|
ui.heading("Viewport");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ViewportWidget {
|
pub struct ViewportWidget {
|
||||||
texture: egui::TextureId,
|
pub texture: egui::TextureId,
|
||||||
|
pub flycam: Flycam,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ViewportWidget {
|
impl ViewportWidget {
|
||||||
pub fn new(texture: egui::TextureId) -> Self {
|
pub fn new(texture: egui::TextureId) -> Self {
|
||||||
Self { texture }
|
Self {
|
||||||
|
texture,
|
||||||
|
flycam: Flycam::new(0.002, 10.0, 0.25),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,13 +148,23 @@ impl egui::Widget for &mut ViewportWidget {
|
||||||
let sense = egui::Sense::click_and_drag();
|
let sense = egui::Sense::click_and_drag();
|
||||||
let response = ui.interact(rect, id, sense);
|
let response = ui.interact(rect, id, sense);
|
||||||
|
|
||||||
use egui::{pos2, Mesh, Rect, Color32, Shape};
|
use egui::{pos2, Color32, Mesh, Rect, Shape};
|
||||||
let mut mesh = Mesh::with_texture(self.texture);
|
let mut mesh = Mesh::with_texture(self.texture);
|
||||||
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
||||||
let tint = Color32::WHITE;
|
let tint = Color32::WHITE;
|
||||||
mesh.add_rect_with_uv(rect, uv, tint);
|
mesh.add_rect_with_uv(rect, uv, tint);
|
||||||
ui.painter().add(Shape::mesh(mesh));
|
ui.painter().add(Shape::mesh(mesh));
|
||||||
|
|
||||||
|
if response.dragged() {
|
||||||
|
println!("dragging");
|
||||||
|
let delta = response.drag_delta();
|
||||||
|
self.flycam.process_mouse(delta.x as f64, delta.y as f64);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{:#?}", self.flycam);
|
||||||
|
|
||||||
|
self.flycam.update();
|
||||||
|
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ use std::f32::consts::LN_2;
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
use winit::event::{ElementState, VirtualKeyCode};
|
use winit::event::{ElementState, VirtualKeyCode};
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
pub struct Camera {
|
pub struct Camera {
|
||||||
pub eye: [f32; 4],
|
pub eye: [f32; 4],
|
||||||
pub vp: [[f32; 4]; 4],
|
pub vp: [[f32; 4]; 4],
|
||||||
|
|
Loading…
Reference in New Issue