//! Панель вьюпорта — перенос `simv::editor::EditorUI`. //! //! Про [`DisplayMode`]. Панель обязана как-то сообщить рендереру выбранный режим, но //! `simv_vk::RenderMode` ей недоступен: `simv-editor` не зависит от `simv-vk`, и это //! проверяет компилятор. C++ обходит ту же границу, возвращая из `EditorUI` голый //! `int`, который `main.cpp` приводит через `static_cast` к `vk::RenderMode` — //! связь между двумя перечислениями там держится на честном слове. Здесь у панели //! свой типизированный режим, а разбор в `simv_vk::RenderMode` делает `simv-app` //! обычным `match`: добавите вариант — компилятор укажет, где его дописать. use crate::camera::{Camera, ViewPlane}; /// Как отображать модель. Соответствует `simv_vk::RenderMode`, но живёт по эту /// сторону границы модулей. #[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] pub enum DisplayMode { #[default] Solid, Wireframe, SolidWire, } pub struct EditorUi { display_mode: DisplayMode, grid_visible: bool, } impl Default for EditorUi { fn default() -> Self { Self { display_mode: DisplayMode::Solid, grid_visible: true, } } } impl EditorUi { pub fn display_mode(&self) -> DisplayMode { self.display_mode } pub fn grid_visible(&self) -> bool { self.grid_visible } pub fn draw(&mut self, ctx: &egui::Context, camera: &mut Camera) { egui::Window::new("Viewport") .default_size([280.0, 200.0]) .show(ctx, |ui| { ui.label(egui::RichText::new("Камера").weak()); ui.horizontal(|ui| { if ui.button("Спереди").clicked() { camera.align_to_plane(ViewPlane::Front); } if ui.button("Сверху").clicked() { camera.align_to_plane(ViewPlane::Top); } if ui.button("Сбоку").clicked() { camera.align_to_plane(ViewPlane::Side); } }); ui.label( egui::RichText::new("Перетаскивание — поворот, колесо — приближение").weak(), ); ui.separator(); ui.label(egui::RichText::new("Отображение модели").weak()); ui.radio_value(&mut self.display_mode, DisplayMode::Solid, "Заливка"); ui.radio_value(&mut self.display_mode, DisplayMode::Wireframe, "Каркас"); ui.radio_value( &mut self.display_mode, DisplayMode::SolidWire, "Заливка с каркасом", ); ui.separator(); ui.checkbox(&mut self.grid_visible, "Показывать сетку"); }); } }