diff --git a/editor/src/main.rs b/editor/src/main.rs index 475ccb0..86e0655 100644 --- a/editor/src/main.rs +++ b/editor/src/main.rs @@ -68,6 +68,9 @@ impl Application { let render_state = render::RenderState::new(device.clone(), queue.clone(), config.format); + let image = egui::ColorImage::example(); + let viewport_texture = egui_ctx.load_texture("example_viewport", image); + Self { window, device, @@ -78,7 +81,7 @@ impl Application { egui_state, egui_ctx, egui_rp, - ui: ui::UserInterface::new(), + ui: ui::UserInterface::new(viewport_texture), render_state, } } diff --git a/editor/src/ui.rs b/editor/src/ui.rs index 69dcde7..0b8c87a 100644 --- a/editor/src/ui.rs +++ b/editor/src/ui.rs @@ -4,16 +4,18 @@ pub struct UserInterface { quit: bool, show_about: bool, log_contents: String, + viewport: ViewportWidget, } impl UserInterface { - pub fn new() -> Self { + pub fn new(viewport_texture: egui::TextureHandle) -> 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), } } @@ -117,6 +119,38 @@ impl UserInterface { }); }); - egui::CentralPanel::default().show(ctx, |ui| {}); + egui::CentralPanel::default().show(ctx, |ui| { + ui.add(&mut self.viewport); + ui.heading("Viewport"); + }); + } +} + +pub struct ViewportWidget { + texture: egui::TextureHandle, +} + +impl ViewportWidget { + pub fn new(texture: egui::TextureHandle) -> Self { + Self { texture } + } +} + +impl egui::Widget for &mut ViewportWidget { + fn ui(self, ui: &mut egui::Ui) -> egui::Response { + ui.style_mut().spacing.window_margin = egui::style::Margin::same(0.0); + let rect = ui.max_rect(); + let id = egui::Id::new("viewport_widget"); + let sense = egui::Sense::click_and_drag(); + let response = ui.interact(rect, id, sense); + + use egui::{pos2, Mesh, Rect, Color32, Shape}; + let mut mesh = Mesh::with_texture(self.texture.id()); + 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)); + + response } }