Add ViewportWidget

This commit is contained in:
mars 2022-05-15 14:25:17 -06:00
parent 73eceb601e
commit 0359c92ae9
2 changed files with 40 additions and 3 deletions

View File

@ -68,6 +68,9 @@ impl Application {
let render_state = render::RenderState::new(device.clone(), queue.clone(), config.format); 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 { Self {
window, window,
device, device,
@ -78,7 +81,7 @@ impl Application {
egui_state, egui_state,
egui_ctx, egui_ctx,
egui_rp, egui_rp,
ui: ui::UserInterface::new(), ui: ui::UserInterface::new(viewport_texture),
render_state, render_state,
} }
} }

View File

@ -4,16 +4,18 @@ pub struct UserInterface {
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() -> Self { pub fn new(viewport_texture: egui::TextureHandle) -> 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),
} }
} }
@ -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
} }
} }