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_rp: EguiRenderPass,
ui: ui::UserInterface,
viewport: ui::ViewportWidget,
render_state: render::RenderState,
}
@ -78,7 +79,8 @@ impl Application {
egui_state,
egui_ctx,
egui_rp,
ui: ui::UserInterface::new(viewport_texture),
ui: ui::UserInterface::new(),
viewport: ui::ViewportWidget::new(viewport_texture),
render_state,
}
}
@ -106,11 +108,12 @@ impl Application {
let output = {
puffin::profile_scope!("Draw egui");
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");
self.render_state.update_viewport(&mut self.viewport);
self.render_state.render();
}

View File

@ -1,3 +1,4 @@
use crate::ui::ViewportWidget;
use crate::wgpu;
use cyborg::camera::Camera;
use cyborg::viewport::{Viewport, ViewportInfo, ViewportViews};
@ -65,6 +66,7 @@ pub struct OffscreenViewport {
pub output_format: wgpu::TextureFormat,
pub textures: OffscreenTextures,
pub egui_texture: egui::TextureId,
pub camera: Camera,
}
impl OffscreenViewport {
@ -88,14 +90,15 @@ impl OffscreenViewport {
output_format,
textures,
egui_texture,
camera: Camera {
eye: [1.0, 1.0, 1.0, 0.0],
vp: Default::default(),
},
}
}
pub fn get_camera(&self) -> Camera {
Camera {
eye: [1.0, 1.0, 1.0, 0.0],
vp: Default::default(),
}
self.camera.clone()
}
}
@ -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) {
self.render_schedule
.execute(&mut self.world, &mut self.resources);

View File

@ -1,21 +1,21 @@
use cyborg::camera::Flycam;
pub struct UserInterface {
developer_mode: bool,
show_profiler: bool,
quit: bool,
show_about: bool,
log_contents: String,
viewport: ViewportWidget,
}
impl UserInterface {
pub fn new(viewport_texture: egui::TextureId) -> Self {
pub fn new() -> Self {
Self {
developer_mode: true,
show_profiler: false,
quit: false,
show_about: false,
log_contents: "Hello logging!\n".to_string(),
viewport: ViewportWidget::new(viewport_texture),
}
}
@ -23,7 +23,7 @@ impl UserInterface {
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::menu::bar(ui, |ui| {
ui.menu_button("File", |ui| {
@ -120,19 +120,23 @@ impl UserInterface {
});
egui::CentralPanel::default().show(ctx, |ui| {
ui.add(&mut self.viewport);
ui.add(viewport);
ui.heading("Viewport");
});
}
}
pub struct ViewportWidget {
texture: egui::TextureId,
pub texture: egui::TextureId,
pub flycam: Flycam,
}
impl ViewportWidget {
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 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 uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
let tint = Color32::WHITE;
mesh.add_rect_with_uv(rect, uv, tint);
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
}
}

View File

@ -3,6 +3,7 @@ use std::f32::consts::LN_2;
use std::time::Instant;
use winit::event::{ElementState, VirtualKeyCode};
#[derive(Clone, Debug)]
pub struct Camera {
pub eye: [f32; 4],
pub vp: [[f32; 4]; 4],