improved text formatting, added fps counter

This commit is contained in:
Dmitry
2019-07-09 22:37:29 +03:00
parent 3838ae9191
commit dd56773fa1
5 changed files with 223 additions and 113 deletions
+97 -78
View File
@@ -9,9 +9,7 @@
<change beforePath="$PROJECT_DIR$/src/engine/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/engine/mod.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/game/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/game/mod.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/gui/draw.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/gui/draw.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/gui/mod.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/gui/mod.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/renderer/renderer.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/renderer/renderer.rs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/resource/ttf.rs" beforeDir="false" afterPath="$PROJECT_DIR$/src/resource/ttf.rs" afterDir="false" />
</list>
<ignored path="$PROJECT_DIR$/target/" />
<ignored path="$PROJECT_DIR$/out/" />
@@ -21,26 +19,11 @@
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="DefaultGradleProjectSettings">
<option name="isMigrated" value="true" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/gui/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="612">
<caret line="36" column="22" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/gui/draw.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="752">
<caret line="169" column="42" selection-start-line="169" selection-start-column="42" selection-end-line="169" selection-end-column="42" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/resource/ttf.rs">
<provider selected="true" editor-type-id="text-editor">
@@ -59,11 +42,11 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/src/renderer/renderer.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-442">
<caret line="14" column="28" selection-start-line="14" selection-start-column="28" selection-end-line="14" selection-end-column="28" />
<state relative-caret-position="866">
<caret line="688" selection-start-line="688" selection-end-line="688" />
</state>
</provider>
</entry>
@@ -71,8 +54,8 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/engine/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2921">
<caret line="277" column="28" lean-forward="true" selection-start-line="277" selection-start-column="28" selection-end-line="277" selection-end-column="28" />
<state relative-caret-position="884">
<caret line="312" column="30" selection-start-line="312" selection-start-column="7" selection-end-line="312" selection-end-column="30" />
</state>
</provider>
</entry>
@@ -86,11 +69,47 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/game/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="544">
<caret line="38" column="52" selection-start-line="38" selection-start-column="52" selection-end-line="38" selection-end-column="52" />
<state relative-caret-position="408">
<caret line="24" column="1" selection-start-line="24" selection-start-column="1" selection-end-line="24" selection-end-column="1" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/renderer/surface.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="972">
<caret line="367" column="5" selection-start-line="367" selection-start-column="5" selection-end-line="367" selection-end-column="5" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/macros.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="335">
<caret line="379" column="13" selection-start-line="379" selection-start-column="13" selection-end-line="379" selection-end-column="13" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/utils/pool.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3825">
<caret line="225" column="9" selection-start-line="225" selection-start-column="9" selection-end-line="225" selection-end-column="9" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/slice/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16966">
<caret line="998" column="11" selection-start-line="998" selection-start-column="11" selection-end-line="998" selection-end-column="11" />
</state>
</provider>
</entry>
@@ -185,7 +204,6 @@
<option value="$PROJECT_DIR$/src/scene/mod.rs" />
<option value="$PROJECT_DIR$/src/game/player.rs" />
<option value="$PROJECT_DIR$/src/math/triangulator.rs" />
<option value="$PROJECT_DIR$/src/utils/pool.rs" />
<option value="$PROJECT_DIR$/src/resource/mod.rs" />
<option value="$PROJECT_DIR$/src/main.rs" />
<option value="$PROJECT_DIR$/src/math/vec2.rs" />
@@ -193,10 +211,11 @@
<option value="$PROJECT_DIR$/src/resource/fbx/mod.rs" />
<option value="$PROJECT_DIR$/src/gui/mod.rs" />
<option value="$PROJECT_DIR$/src/resource/ttf.rs" />
<option value="$PROJECT_DIR$/src/renderer/renderer.rs" />
<option value="$PROJECT_DIR$/src/engine/mod.rs" />
<option value="$PROJECT_DIR$/src/utils/pool.rs" />
<option value="$PROJECT_DIR$/src/gui/draw.rs" />
<option value="$PROJECT_DIR$/src/game/mod.rs" />
<option value="$PROJECT_DIR$/src/engine/mod.rs" />
<option value="$PROJECT_DIR$/src/renderer/renderer.rs" />
</list>
</option>
</component>
@@ -218,6 +237,7 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="PackagesPane" />
<pane id="ProjectPane">
<subPane>
@@ -301,7 +321,6 @@
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
@@ -433,7 +452,7 @@
<frame x="0" y="0" width="1280" height="1400" extended-state="0" />
<editor active="true" />
<layout>
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.2204918" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.23032787" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Image Layers" order="2" />
<window_info id="Designer" order="3" />
@@ -472,20 +491,6 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/lib.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="4624">
<caret line="272" column="11" selection-start-line="272" selection-start-column="11" selection-end-line="272" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/iter/traits/iterator.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="13124">
<caret line="772" column="22" selection-start-line="772" selection-start-column="22" selection-end-line="772" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/iter/adapters/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="14943">
@@ -668,13 +673,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/utils/pool.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-935">
<caret line="45" column="34" selection-start-line="45" selection-start-column="34" selection-end-line="45" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/resource/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="204">
@@ -745,13 +743,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/renderer/surface.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="6239">
<caret line="367" column="5" selection-start-line="367" selection-start-column="5" selection-end-line="367" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.0/src/window.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1734">
@@ -773,10 +764,17 @@
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/mem.rs">
<entry file="file://$PROJECT_DIR$/src/gui/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="9350">
<caret line="550" column="44" selection-start-line="550" selection-start-column="44" selection-end-line="550" selection-end-column="44" />
<state relative-caret-position="612">
<caret line="36" column="22" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/gui/draw.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3196">
<caret line="188" column="46" selection-start-line="188" selection-start-column="46" selection-end-line="188" selection-end-column="46" />
</state>
</provider>
</entry>
@@ -787,24 +785,24 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/renderer/renderer.rs">
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/mem.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-442">
<caret line="14" column="28" selection-start-line="14" selection-start-column="28" selection-end-line="14" selection-end-column="28" />
<state relative-caret-position="9350">
<caret line="550" column="44" selection-start-line="550" selection-start-column="44" selection-end-line="550" selection-end-column="44" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/gui/mod.rs">
<entry file="file://$PROJECT_DIR$/src/utils/pool.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="612">
<caret line="36" column="22" selection-start-line="36" selection-start-column="22" selection-end-line="36" selection-end-column="22" />
<state relative-caret-position="3825">
<caret line="225" column="9" selection-start-line="225" selection-start-column="9" selection-end-line="225" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/gui/draw.rs">
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/slice/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="752">
<caret line="169" column="42" selection-start-line="169" selection-start-column="42" selection-end-line="169" selection-end-column="42" />
<state relative-caret-position="16966">
<caret line="998" column="11" selection-start-line="998" selection-start-column="11" selection-end-line="998" selection-end-column="11" />
</state>
</provider>
</entry>
@@ -815,17 +813,38 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/engine/mod.rs">
<entry file="file://$USER_HOME$/.rustup/toolchains/stable-x86_64-pc-windows-gnu/lib/rustlib/src/rust/src/libcore/macros.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2921">
<caret line="277" column="28" lean-forward="true" selection-start-line="277" selection-start-column="28" selection-end-line="277" selection-end-column="28" />
<state relative-caret-position="335">
<caret line="379" column="13" selection-start-line="379" selection-start-column="13" selection-end-line="379" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/game/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="544">
<caret line="38" column="52" selection-start-line="38" selection-start-column="52" selection-end-line="38" selection-end-column="52" />
<state relative-caret-position="408">
<caret line="24" column="1" selection-start-line="24" selection-start-column="1" selection-end-line="24" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/renderer/surface.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="972">
<caret line="367" column="5" selection-start-line="367" selection-start-column="5" selection-end-line="367" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/engine/mod.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="884">
<caret line="312" column="30" selection-start-line="312" selection-start-column="7" selection-end-line="312" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/renderer/renderer.rs">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="866">
<caret line="688" selection-start-line="688" selection-end-line="688" />
</state>
</provider>
</entry>
+14 -1
View File
@@ -11,6 +11,7 @@ use crate::renderer::surface::SurfaceSharedData;
use crate::resource::model::Model;
use crate::resource::ttf::Font;
use crate::gui::UserInterface;
use std::time::Duration;
pub struct ResourceManager {
resources: RcPool<Resource>,
@@ -283,6 +284,10 @@ impl Engine {
&mut self.user_interface
}
pub fn get_rendering_statisting(&self) -> &Statistics {
self.renderer.get_statistics()
}
pub fn render(&mut self) {
self.renderer.upload_font_cache(&mut self.font_cache);
self.renderer.upload_resources(&mut self.state);
@@ -299,4 +304,12 @@ impl Engine {
pub fn pop_event(&mut self) -> Option<glutin::Event> {
self.events.pop_front()
}
}
}
pub fn duration_to_seconds_f64(duration: Duration) -> f64 {
duration.as_secs() as f64 + duration.subsec_nanos() as f64 / 1_000_000_000.0
}
pub fn duration_to_seconds_f32(duration: Duration) -> f32 {
duration_to_seconds_f64(duration) as f32
}
+22 -16
View File
@@ -4,10 +4,11 @@ pub mod weapon;
use std::fs::File;
use std::path::Path;
use std::fmt::Write;
use crate::game::level::Level;
use crate::engine::Engine;
use crate::engine::{Engine, duration_to_seconds_f64};
use std::time::{Duration, Instant};
use crate::gui::draw::{FormattedText, FormattedTextBuilder};
use crate::math::Rect;
@@ -15,7 +16,7 @@ use crate::math::Rect;
pub struct Game {
engine: Engine,
level: Level,
debug_text: FormattedText,
debug_text: Option<FormattedText>,
}
pub struct GameTime {
@@ -23,26 +24,17 @@ pub struct GameTime {
delta: f64,
}
fn duration_to_seconds_f64(duration: Duration) -> f64 {
duration.as_secs() as f64 + duration.subsec_nanos() as f64 / 1_000_000_000.0
}
impl Game {
pub fn new() -> Game {
let mut engine = Engine::new();
let level = Level::new(&mut engine);
let debug_text =
FormattedTextBuilder::new()
.with_font(engine.get_default_font())
.with_text("The quick brown fox jumps over a lazy dog. 1234567890!@#$%^&*()_+")
.with_bounds(Rect::new(0.0, 0.0, 220.0, 200.0))
.build();
let debug_text = FormattedTextBuilder::new().build();
Game {
engine,
level,
debug_text,
debug_text: Some(debug_text),
}
}
@@ -65,10 +57,8 @@ impl Game {
let clock = Instant::now();
let mut game_time = GameTime { elapsed: 0.0, delta: fixed_timestep };
let mut debug_string = String::new();
while self.engine.is_running() {
let dc = self.engine.get_ui_mut().get_drawing_context_mut();
dc.draw_text(&self.debug_text);
let mut dt = duration_to_seconds_f64(clock.elapsed()) - game_time.elapsed;
while dt >= fixed_timestep {
dt -= fixed_timestep;
@@ -93,6 +83,22 @@ impl Game {
self.update(&game_time);
self.engine.update(fixed_timestep);
}
debug_string.clear();
write!(debug_string, "Frame time: {:.2} ms\nFPS: {}\nUp time: {:.2} s",
self.engine.get_rendering_statisting().frame_time * 1000.0,
self.engine.get_rendering_statisting().current_fps,
game_time.elapsed);
self.debug_text = Some(FormattedTextBuilder::reuse(self.debug_text.take().unwrap())
.with_font(self.engine.get_default_font())
.with_text(debug_string.as_str())
.with_bounds(Rect::new(0.0, 0.0, 300.0, 300.0))
.build());
let drawing_context = self.engine.get_ui_mut().get_drawing_context_mut();
if let Some(ref debug_text) = self.debug_text {
drawing_context.draw_text(debug_text);
}
// Render at max speed
self.engine.render();
}
+34 -6
View File
@@ -100,7 +100,7 @@ struct TextLine {
begin: usize,
end: usize,
width: f32,
x: f32,
x_offset: f32
}
impl TextLine {
@@ -109,7 +109,7 @@ impl TextLine {
begin: 0,
end: 0,
width: 0.0,
x: 0.0
x_offset: 0.0
}
}
}
@@ -136,7 +136,8 @@ impl FormattedText {
}
}
fn build(&mut self, text: &str, font: &Font, bounds: &Rect<f32>, color: Color) {
fn build(&mut self, text: &str, font: &Font, bounds: &Rect<f32>, color: Color,
vertical_alignment: VerticalAlignment, horizontal_alignment: HorizontalAlignment) {
// Convert text to UTF32.
self.text.clear();
for code in text.chars().map(|c| c as u32) {
@@ -144,6 +145,7 @@ impl FormattedText {
}
// Split on lines.
let mut total_height = 0.0;
let mut current_line = TextLine::new();
self.lines.clear();
for (i, code) in self.text.iter().enumerate() {
@@ -159,6 +161,7 @@ impl FormattedText {
current_line.begin = if is_new_line { i + 1 } else { i };
current_line.end = current_line.begin + 1;
current_line.width = advance;
total_height += font.get_ascender();
} else {
current_line.width = new_width;
current_line.end += 1;
@@ -168,16 +171,34 @@ impl FormattedText {
if current_line.begin != current_line.end {
current_line.end = self.text.len();
self.lines.push(current_line);
total_height += font.get_ascender();
}
// Align lines according to desired alignment.
for line in self.lines.iter_mut() {
match horizontal_alignment {
HorizontalAlignment::Left => line.x_offset = 0.0,
HorizontalAlignment::Center => line.x_offset = 0.5 * (bounds.w - line.width),
HorizontalAlignment::Right => line.x_offset = bounds.w - line.width,
HorizontalAlignment::Stretch => line.x_offset = 0.0
}
}
self.texture = font.get_texture_id();
// Generate glyphs for each text line.
self.glyphs.clear();
let mut cursor = Vec2::make(bounds.x, bounds.y);
let cursor_y_start = match vertical_alignment {
VerticalAlignment::Top => bounds.y,
VerticalAlignment::Center => bounds.y + (bounds.h - total_height) * 0.5,
VerticalAlignment::Bottom => bounds.y + bounds.h - total_height,
VerticalAlignment::Stretch => bounds.y
};
let mut cursor = Vec2::make(bounds.x, cursor_y_start);
for line in self.lines.iter() {
cursor.x = bounds.x;
cursor.x = bounds.x + line.x_offset;
for code_index in line.begin..line.end {
let code = self.text[code_index];
@@ -302,7 +323,14 @@ impl<'a> FormattedTextBuilder<'a> {
pub fn build(mut self) -> FormattedText {
if let Some(text) = self.text {
if let Some(font) = self.font {
self.formatted_text.build(text, font, &self.bounds, self.color);
self.formatted_text.build(
text,
font,
&self.bounds,
self.color,
self.vertical_alignment,
self.horizontal_alignment
);
}
}
+56 -12
View File
@@ -6,13 +6,15 @@ use crate::math::vec2::*;
use crate::utils::pool::*;
use crate::scene::node::*;
use crate::renderer::surface::*;
use crate::engine::{ResourceManager, State};
use crate::engine::{ResourceManager, State, duration_to_seconds_f32};
use crate::math::{vec3::*};
use crate::resource::ResourceKind;
use std::mem::size_of;
use crate::resource::ttf::Font;
use crate::gui::draw::{DrawingContext, CommandKind, Color};
use crate::math::mat4::Mat4;
use std::time::{Instant, Duration};
use std::thread;
// Welcome to the kingdom of Unsafe Code
@@ -117,24 +119,48 @@ struct UIRenderBuffers {
ebo: GLuint,
}
pub struct Statistics {
pub frame_time: f32,
pub mean_fps: usize,
pub min_fps: usize,
pub current_fps: usize,
frame_time_accumulator: f32,
frame_time_measurements: usize,
time_last_fps_measured: f32,
}
impl Default for Statistics {
fn default() -> Self {
Self {
frame_time: 0.0,
mean_fps: 0,
min_fps: 0,
current_fps: 0,
frame_time_accumulator: 0.0,
frame_time_measurements: 0,
time_last_fps_measured: 0.0,
}
}
}
pub struct Renderer {
pub(crate) events_loop: glutin::EventsLoop,
pub(crate) context: glutin::WindowedContext,
flat_shader: FlatShader,
ui_shader: UIShader,
/// Dummy white one pixel texture which will be used as stub when rendering
/// something without texture specified.
white_dummy: GLuint,
/// Separate lists of handles to nodes of specified kinds
/// Used reduce tree traversal count, it will performed once.
/// Lists are valid while there is scene to render.
/// Separate lists of handles to nodes of specified kinds. Used reduce tree traversal
/// count, it will performed once. Lists are valid while there is scene to render.
cameras: Vec<Handle<Node>>,
lights: Vec<Handle<Node>>,
meshes: Vec<Handle<Node>>,
/// Scene graph traversal stack
/// Scene graph traversal stack.
traversal_stack: Vec<Handle<Node>>,
frame_rate_limit: usize,
ui_render_buffers: UIRenderBuffers,
statistics: Statistics
}
fn create_flat_shader() -> FlatShader {
@@ -279,8 +305,8 @@ impl Renderer {
let primary_monitor = events_loop.get_primary_monitor();
let mut monitor_dimensions = primary_monitor.get_dimensions();
monitor_dimensions.height = monitor_dimensions.height * 0.5;
monitor_dimensions.width = monitor_dimensions.width * 0.5;
monitor_dimensions.height = monitor_dimensions.height * 0.6;
monitor_dimensions.width = monitor_dimensions.width * 0.6;
let window_size = monitor_dimensions.to_logical(primary_monitor.get_hidpi_factor());
let window_builder = glutin::WindowBuilder::new()
@@ -307,12 +333,17 @@ impl Renderer {
cameras: Vec::new(),
lights: Vec::new(),
meshes: Vec::new(),
frame_rate_limit: 60,
statistics: Statistics::default(),
white_dummy: create_white_dummy(),
ui_render_buffers: create_ui_render_buffers(),
}
}
}
pub fn get_statistics(&self) -> &Statistics {
&self.statistics
}
fn draw_surface(&self, surf: &Surface, data: &SurfaceSharedData, resource_manager: &ResourceManager) {
unsafe {
@@ -473,14 +504,14 @@ impl Renderer {
}
pub fn render(&mut self, state: &State, drawing_context: &DrawingContext) {
let frame_start_time = Instant::now();
unsafe {
let client_size = self.context.get_inner_size().unwrap();
gl::ClearColor(0.0, 0.63, 0.91, 1.0);
gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT);
for scene in state.get_scenes().iter() {
// Prepare for render - fill lists of nodes participating in rendering
// by traversing scene graph
@@ -655,5 +686,18 @@ impl Renderer {
check_gl_error();
self.context.swap_buffers().unwrap();
if self.frame_rate_limit > 0 {
let frame_time_ms = 1000.0 * duration_to_seconds_f32(Instant::now().duration_since(frame_start_time));
let desired_frame_time_ms = 1000.0 / self.frame_rate_limit as f32;
if frame_time_ms < desired_frame_time_ms {
let sleep_time_us = 1000.0 * (desired_frame_time_ms - frame_time_ms);
thread::sleep(Duration::from_micros(sleep_time_us as u64));
}
}
let total_time_s = duration_to_seconds_f32(Instant::now().duration_since(frame_start_time));
self.statistics.frame_time = total_time_s;
self.statistics.current_fps = (1.0 / total_time_s) as usize;
}
}