Create Flycam, pass to RenderState, and handle drags

This commit is contained in:
mars 2022-05-15 15:30:05 -06:00
parent e7ff524e7b
commit 23234c2263
4 changed files with 40 additions and 14 deletions

View File

@ -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();
} }

View File

@ -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);

View File

@ -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
} }
} }

View File

@ -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],