diff --git a/editor/src/main.rs b/editor/src/main.rs index 9a0fef6..dd60289 100644 --- a/editor/src/main.rs +++ b/editor/src/main.rs @@ -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(); } diff --git a/editor/src/render.rs b/editor/src/render.rs index 8bf730a..626b779 100644 --- a/editor/src/render.rs +++ b/editor/src/render.rs @@ -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::().unwrap(); + store.viewport.camera = viewport.flycam.get_camera(); + } + pub fn render(&mut self) { self.render_schedule .execute(&mut self.world, &mut self.resources); diff --git a/editor/src/ui.rs b/editor/src/ui.rs index 2e745ca..3c54603 100644 --- a/editor/src/ui.rs +++ b/editor/src/ui.rs @@ -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 } } diff --git a/src/camera.rs b/src/camera.rs index 2d9679f..ef4f3f4 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -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],