mirror of
https://github.com/FyroxEngine/Fyrox.git
synced 2026-10-12 02:02:20 +00:00
improved text formatting, added fps counter
This commit is contained in:
Generated
+97
-78
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user