feat: add fps and frametime ui information

This commit is contained in:
Rekai Nyangadzayi Musuka 2021-04-06 23:53:54 -05:00
parent 9d5a84b142
commit 10c789f569
2 changed files with 118 additions and 8 deletions

View File

@ -24,7 +24,7 @@ Key | Action
<kbd>R</kbd> | Increase Scale <kbd>R</kbd> | Increase Scale
<kbd>F</kbd> | Decrease Scale <kbd>F</kbd> | Decrease Scale
#### Mandelbrot Iteration Limit (Max 512 by default) #### Mandelbrot Iteration Limit (Can go up to 1024)
Key | Action Key | Action
--- | --- --- | ---
<kbd>T</kbd> | Increment by a factor of 2 <kbd>T</kbd> | Increment by a factor of 2

View File

@ -1,19 +1,35 @@
use bevy::diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin};
use bevy::prelude::*; use bevy::prelude::*;
use bevy::render::texture::{Extent3d, TextureDimension, TextureFormat}; use bevy::render::texture::{Extent3d, TextureDimension, TextureFormat};
use mandelbrot::{Bounds, Mandelbrot, TEXTURE_HEIGHT, TEXTURE_WIDTH}; use mandelbrot::{Bounds, Mandelbrot, TEXTURE_HEIGHT, TEXTURE_WIDTH};
use std::time::Instant; use std::time::Instant;
const MAX_ITERATION_COUNT: u32 = 1024;
fn main() { fn main() {
// Mandelbrot::escape_time_image(); let window_settings = WindowDescriptor {
width: TEXTURE_WIDTH as f32,
height: TEXTURE_HEIGHT as f32,
title: "Mandelbrot".to_string(),
vsync: false,
resizable: false,
..Default::default()
};
App::build() App::build()
.insert_resource(window_settings)
.add_plugins(DefaultPlugins) .add_plugins(DefaultPlugins)
.add_startup_system(startup.system()) .add_plugin(FrameTimeDiagnosticsPlugin)
.add_startup_system(setup.system())
.insert_resource(TextureOptions::default()) .insert_resource(TextureOptions::default())
.add_system(performance_info_system.system())
.add_system(mandelbrot_render_system.system()) .add_system(mandelbrot_render_system.system())
.add_system(transform_mandelbrot_system.system()) .add_system(user_input_system.system())
.run(); .run();
} }
struct PerformanceInfo;
struct TextureOptions { struct TextureOptions {
zoom: f64, zoom: f64,
horizontal: f64, horizontal: f64,
@ -34,7 +50,7 @@ impl Default for TextureOptions {
} }
} }
fn transform_mandelbrot_system(input: Res<Input<KeyCode>>, mut scale: ResMut<TextureOptions>) { fn user_input_system(input: Res<Input<KeyCode>>, mut scale: ResMut<TextureOptions>) {
// Zoom: E to Zoom In, Q to Zoom Out // Zoom: E to Zoom In, Q to Zoom Out
// Horizontal Movement: D to move right, A to move left // Horizontal Movement: D to move right, A to move left
// Vertical Movement: W to move up, S to move Down // Vertical Movement: W to move up, S to move Down
@ -54,8 +70,8 @@ fn transform_mandelbrot_system(input: Res<Input<KeyCode>>, mut scale: ResMut<Tex
if limit_change == 1 { if limit_change == 1 {
scale.iteration_limit *= 2; scale.iteration_limit *= 2;
if scale.iteration_limit > 512 { if scale.iteration_limit > MAX_ITERATION_COUNT {
scale.iteration_limit = 512; scale.iteration_limit = MAX_ITERATION_COUNT;
} }
} else if limit_change == -1 { } else if limit_change == -1 {
scale.iteration_limit /= 2; scale.iteration_limit /= 2;
@ -74,6 +90,35 @@ fn transform_mandelbrot_system(input: Res<Input<KeyCode>>, mut scale: ResMut<Tex
} }
} }
fn performance_info_system(
// time: Res<Time>,
diag: Res<Diagnostics>,
mut query: Query<&mut Text, With<PerformanceInfo>>,
) {
for mut text in query.iter_mut() {
let mut fps = 0.00;
let mut frametime = 0.00;
if let Some(fps_diag) = diag.get(FrameTimeDiagnosticsPlugin::FPS) {
if let Some(average) = fps_diag.average() {
fps = average;
}
}
if let Some(frametime_diag) = diag.get(FrameTimeDiagnosticsPlugin::FRAME_TIME) {
if let Some(average) = frametime_diag.average() {
frametime = average;
}
}
// FPS Number
text.sections[1].value = format!("{:.1}", fps);
// Frametime Number
text.sections[3].value = format!("{:.3}", frametime * 1000.0);
}
}
fn mandelbrot_render_system( fn mandelbrot_render_system(
materials: Res<Assets<ColorMaterial>>, materials: Res<Assets<ColorMaterial>>,
mut textures: ResMut<Assets<Texture>>, mut textures: ResMut<Assets<Texture>>,
@ -106,11 +151,14 @@ fn mandelbrot_render_system(
} }
} }
fn startup( fn setup(
mut commands: Commands, mut commands: Commands,
mut textures: ResMut<Assets<Texture>>, mut textures: ResMut<Assets<Texture>>,
mut materials: ResMut<Assets<ColorMaterial>>, mut materials: ResMut<Assets<ColorMaterial>>,
asset_server: Res<AssetServer>,
) { ) {
let ui_font = asset_server.load("fonts/vcr_osd_mono.ttf");
let white = Color::rgb(1.0, 1.0, 1.0);
let mut fractal = Mandelbrot::default(); let mut fractal = Mandelbrot::default();
let texture_size = Extent3d::new(TEXTURE_WIDTH as u32, TEXTURE_HEIGHT as u32, 1); let texture_size = Extent3d::new(TEXTURE_WIDTH as u32, TEXTURE_HEIGHT as u32, 1);
@ -124,10 +172,72 @@ fn startup(
)); ));
commands.spawn_bundle(OrthographicCameraBundle::new_2d()); commands.spawn_bundle(OrthographicCameraBundle::new_2d());
commands.spawn_bundle(UiCameraBundle::default());
commands commands
.spawn_bundle(SpriteBundle { .spawn_bundle(SpriteBundle {
material: materials.add(texture_handle.into()), material: materials.add(texture_handle.into()),
..Default::default() ..Default::default()
}) })
.insert(fractal); .insert(fractal);
commands
.spawn_bundle(TextBundle {
text: Text {
sections: vec![
TextSection {
value: "FPS: ".to_string(),
style: TextStyle {
font: ui_font.clone(),
font_size: 40.0,
color: white,
},
..Default::default()
},
TextSection {
value: "".to_string(),
style: TextStyle {
font: ui_font.clone(),
font_size: 40.0,
color: white,
},
..Default::default()
},
TextSection {
value: "\nFrametime: ".to_string(),
style: TextStyle {
font: ui_font.clone(),
font_size: 40.0,
color: white,
},
..Default::default()
},
TextSection {
value: "".to_string(),
style: TextStyle {
font: ui_font.clone(),
font_size: 40.0,
color: white,
},
..Default::default()
},
TextSection {
value: "ms".to_string(),
style: TextStyle {
font: ui_font.clone(),
font_size: 40.0,
color: white,
},
..Default::default()
},
],
..Default::default()
},
style: Style {
..Default::default()
},
..Default::default()
})
.insert(PerformanceInfo);
} }