use crate::fyrox::{
core::pool::Handle,
engine::{Engine, GraphicsContext},
gui::{
message::UiMessage,
scroll_viewer::ScrollViewerBuilder,
text::{TextBuilder, TextMessage},
widget::{WidgetBuilder, WidgetMessage},
window::{WindowBuilder, WindowMessage, WindowTitle},
BuildContext, HorizontalAlignment, Thickness, UiNode, UserInterface, VerticalAlignment,
},
};
use fyrox::core::pool::ObjectOrVariant;
use fyrox::gui::text::Text;
use fyrox::gui::window::{Window, WindowAlignment};
use fyrox::scene::Scene;
pub struct StatisticsWindow {
pub window: Handle<Window>,
text: Handle<Text>,
}
pub enum StatisticsWindowAction {
None,
Remove,
}
impl StatisticsWindow {
pub fn new(ctx: &mut BuildContext, anchor: Handle<impl ObjectOrVariant<UiNode>>) -> Self {
let text;
let window = WindowBuilder::new(WidgetBuilder::new().with_width(215.0).with_height(300.0))
.open(false)
.with_content(
ScrollViewerBuilder::new(WidgetBuilder::new())
.with_content({
text = TextBuilder::new(
WidgetBuilder::new().with_margin(Thickness::uniform(2.0)),
)
.build(ctx);
text
})
.build(ctx),
)
.with_title(WindowTitle::text("Rendering Statistics"))
.build(ctx);
ctx.inner().send(
window,
WindowMessage::Open {
alignment: WindowAlignment::Relative {
relative_to: anchor.to_base(),
horizontal_alignment: HorizontalAlignment::Right,
vertical_alignment: VerticalAlignment::Top,
margin: Thickness::uniform(2.0),
},
focus_content: false,
modal: false,
},
);
Self { window, text }
}
pub fn handle_ui_message(
&self,
message: &UiMessage,
ui: &UserInterface,
) -> StatisticsWindowAction {
if let Some(WindowMessage::Close) = message.data() {
if message.destination() == self.window {
ui.send(self.window, WidgetMessage::Remove);
return StatisticsWindowAction::Remove;
}
}
StatisticsWindowAction::None
}
pub fn update(&self, current_scene: Handle<Scene>, engine: &Engine) {
if let GraphicsContext::Initialized(ref graphics_context) = engine.graphics_context {
if let Some(stats) = graphics_context.renderer.scene_data_map.get(¤t_scene) {
let global_stats = graphics_context.renderer.get_statistics();
let statistics = format!(
"FPS: {}\nFrame Time:{}\n{}\nMemory Usage:\n{}",
global_stats.frames_per_second,
global_stats.pure_frame_time,
stats.scene_data.statistics,
graphics_context.renderer.server.memory_usage()
);
engine
.user_interfaces
.first()
.send(self.text, TextMessage::Text(statistics));
}
}
}
}