From 615c4a95a8339a7239603aa02b033f905ec46ec5 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Thu, 13 Jun 2024 23:45:45 +0300 Subject: [PATCH] surface data viewer for surface resource --- editor/src/lib.rs | 11 +++++++- editor/src/mesh.rs | 58 +++++++++++++++++++++++++++++++++++++++++-- editor/src/preview.rs | 8 ++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/editor/src/lib.rs b/editor/src/lib.rs index edf5ddb81..a03088edd 100644 --- a/editor/src/lib.rs +++ b/editor/src/lib.rs @@ -161,7 +161,7 @@ use std::{ use crate::command::Command; use crate::export::ExportWindow; -use crate::mesh::MeshControlPanel; +use crate::mesh::{MeshControlPanel, SurfaceDataViewer}; use crate::settings::build::BuildCommand; use crate::stats::{StatisticsWindow, StatisticsWindowAction}; pub use message::Message; @@ -524,6 +524,7 @@ pub struct Editor { pub highlighter: Option>>, pub export_window: Option, pub statistics_window: Option, + pub surface_data_viewer: Option, } impl Editor { @@ -859,6 +860,7 @@ impl Editor { highlighter: None, export_window: None, statistics_window: None, + surface_data_viewer: None, }; if let Some(data) = startup_data { @@ -1160,6 +1162,10 @@ impl Editor { }, ); + if let Some(surface_data_viewer) = self.surface_data_viewer.as_mut() { + surface_data_viewer.handle_ui_message(message, engine); + } + self.build_window.handle_ui_message( message, &self.message_sender, @@ -2233,6 +2239,9 @@ impl Editor { if let Some(export_window) = self.export_window.as_mut() { export_window.update(self.engine.user_interfaces.first_mut()); } + if let Some(surface_data_viewer) = self.surface_data_viewer.as_mut() { + surface_data_viewer.update(&mut self.engine); + } self.scene_viewer .pre_update(&self.settings, &mut self.engine); diff --git a/editor/src/mesh.rs b/editor/src/mesh.rs index f8b957cb9..b671d2de5 100644 --- a/editor/src/mesh.rs +++ b/editor/src/mesh.rs @@ -18,11 +18,12 @@ use crate::{ collider::{ColliderBuilder, ColliderShape, ConvexPolyhedronShape, GeometrySource}, mesh::Mesh, node::Node, - rigidbody::{RigidBodyBuilder, RigidBodyType}, + rigidbody::{RigidBody, RigidBodyBuilder, RigidBodyType}, Scene, }, }, message::MessageSender, + preview::PreviewPanel, scene::{ commands::graph::{AddNodeCommand, LinkNodesCommand}, GameScene, Selection, @@ -30,7 +31,9 @@ use crate::{ world::graph::selection::GraphSelection, Message, }; -use fyrox::scene::rigidbody::RigidBody; +use fyrox::gui::widget::WidgetMessage; +use fyrox::scene::mesh::surface::{SurfaceBuilder, SurfaceResource}; +use fyrox::scene::mesh::MeshBuilder; pub struct MeshControlPanel { scene_viewer_frame: Handle, @@ -282,3 +285,54 @@ impl MeshControlPanel { } } } + +pub struct SurfaceDataViewer { + pub window: Handle, + preview_panel: PreviewPanel, +} + +impl SurfaceDataViewer { + pub fn new(engine: &mut Engine) -> Self { + let preview_panel = PreviewPanel::new(engine, 256, 256); + + let ctx = &mut engine.user_interfaces.first_mut().build_ctx(); + + let window = WindowBuilder::new(WidgetBuilder::new()) + .open(false) + .with_content(preview_panel.root) + .build(ctx); + + Self { + window, + preview_panel, + } + } + + pub fn open(&mut self, surface_data: SurfaceResource, engine: &mut Engine) { + let graph = &mut engine.scenes[self.preview_panel.scene()].graph; + let sphere = MeshBuilder::new(BaseBuilder::new()) + .with_surfaces(vec![SurfaceBuilder::new(surface_data).build()]) + .build(graph); + + self.preview_panel.set_model(sphere, engine); + } + + pub fn close_and_destroy(self, engine: &mut Engine) { + engine + .user_interfaces + .first_mut() + .send_message(WidgetMessage::remove( + self.window, + MessageDirection::ToWidget, + )); + self.preview_panel.destroy(engine); + } + + pub fn handle_ui_message(&mut self, message: &UiMessage, engine: &mut Engine) { + self.preview_panel.handle_message(message, engine) + } + + pub fn update(&mut self, engine: &mut Engine) { + self.preview_panel.update(engine) + } +} diff --git a/editor/src/preview.rs b/editor/src/preview.rs index b7a659b32..e304a43c8 100644 --- a/editor/src/preview.rs +++ b/editor/src/preview.rs @@ -416,4 +416,12 @@ impl PreviewPanel { pub fn model(&self) -> Handle { self.model } + + pub fn destroy(self, engine: &mut Engine) { + engine + .user_interfaces + .first_mut() + .send_message(WidgetMessage::remove(self.root, MessageDirection::ToWidget)); + engine.scenes.remove(self.scene); + } }