From e603d2fefe01597098d7e8eddfb4898005bc9ee6 Mon Sep 17 00:00:00 2001 From: milek7 Date: Thu, 2 Aug 2018 20:38:39 +0200 Subject: [PATCH] map --- CMakeLists.txt | 1 + Globals.cpp | 5 + Globals.h | 4 +- Track.cpp | 9 + Track.h | 1 + World.h | 1 + gl/ubo.cpp | 10 +- gl/ubo.h | 5 +- map.cpp | 177 ++++++ map.h | 34 ++ openglgeometrybank.cpp | 90 ++- openglgeometrybank.h | 22 +- renderer.cpp | 25 +- renderer.h | 2 + scene.cpp | 31 + scene.h | 16 + shaders/map.frag | 8 + shaders/map.vert | 12 + shaders/mat_default.frag | 2 +- simulation.cpp | 3 + uilayer.cpp | 1159 +++++++++++++++++++------------------- uilayer.h | 3 + 22 files changed, 1007 insertions(+), 613 deletions(-) create mode 100644 map.cpp create mode 100644 map.h create mode 100644 shaders/map.frag create mode 100644 shaders/map.vert diff --git a/CMakeLists.txt b/CMakeLists.txt index 4a49cee6..ff21a2cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,7 @@ set(SOURCES "simulationtime.cpp" "sceneeditor.cpp" "screenshot.cpp" +"map.cpp" "gl/shader.cpp" "gl/vao.cpp" diff --git a/Globals.cpp b/Globals.cpp index 92c8cc39..0a4b2942 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -679,6 +679,11 @@ global_settings::ConfigParse(cParser &Parser) { Parser.getTokens(1); Parser >> gfx_postfx_motionblur_shutter; } + else if (token == "map.enabled") + { + Parser.getTokens(1); + Parser >> map_enabled; + } } while ((token != "") && (token != "endconfig")); //(!Parser->EndOfFile) // na koniec trochę zależności if (!bLoadTraction) // wczytywanie drutów i słupów diff --git a/Globals.h b/Globals.h index 74b1993c..10875aba 100644 --- a/Globals.h +++ b/Globals.h @@ -108,7 +108,6 @@ struct global_settings { float BaseDrawRange{ 2500.f }; int DynamicLightCount{ 8 }; bool ScaleSpecularValues{ true }; - bool gfx_shadowmap_enabled{ true }; struct shadowtune_t { unsigned int map_size{ 2048 }; float width{ 250.f }; // no longer used @@ -176,10 +175,13 @@ struct global_settings { bool dds_upper_origin = false; bool captureonstart = true; + bool gfx_shadowmap_enabled = true; bool gfx_envmap_enabled = true; bool gfx_postfx_motionblur_enabled = true; float gfx_postfx_motionblur_shutter = 0.01f; + bool map_enabled = true; + // methods void LoadIniFile( std::string asFileName ); void ConfigParse( cParser &parser ); diff --git a/Track.cpp b/Track.cpp index 6932e88c..9a3252c1 100644 --- a/Track.cpp +++ b/Track.cpp @@ -1126,6 +1126,15 @@ void TTrack::RaAssign( TAnimModel *am, TEvent *done, TEvent *joined ) } }; +void TTrack::create_map_geometry(std::vector &Bank) +{ + if (iCategoryFlag != 1) + return; // only tracks for now + + for (auto &v : endpoints()) + Bank.push_back(gfx::basic_vertex(glm::vec3(v), glm::vec3(0.0f), glm::vec2(0.0f))); +} + // wypełnianie tablic VBO void TTrack::create_geometry( gfx::geometrybank_handle const &Bank ) { // Ra: trzeba rozdzielić szyny od podsypki, aby móc grupować wg tekstur diff --git a/Track.h b/Track.h index 97222d84..bb28ce22 100644 --- a/Track.h +++ b/Track.h @@ -251,6 +251,7 @@ public: endpoints() const; void create_geometry( gfx::geometrybank_handle const &Bank ); // wypełnianie VBO + void create_map_geometry(std::vector &Bank); void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania void RaOwnerSet( scene::basic_cell *o ) { diff --git a/World.h b/World.h index c5cac85b..9e22e2ab 100644 --- a/World.h +++ b/World.h @@ -76,6 +76,7 @@ TWorld(); void compute_season( int const Yearday ) const; // calculates current weather void compute_weather() const; + TCamera& get_camera() { return Camera; } // members diff --git a/gl/ubo.cpp b/gl/ubo.cpp index 5ca8323d..94cace07 100644 --- a/gl/ubo.cpp +++ b/gl/ubo.cpp @@ -1,11 +1,17 @@ #include "stdafx.h" #include "ubo.h" -gl::ubo::ubo(int size, int index) +gl::ubo::ubo(int size, int idx, GLenum hint) { glGenBuffers(1, *this); bind(); - glBufferData(GL_UNIFORM_BUFFER, size, nullptr, GL_STREAM_DRAW); + glBufferData(GL_UNIFORM_BUFFER, size, nullptr, hint); + index = idx; + bind_uniform(); +} + +void gl::ubo::bind_uniform() +{ glBindBufferBase(GL_UNIFORM_BUFFER, index, *this); } diff --git a/gl/ubo.h b/gl/ubo.h index ff6075b4..5bbd050e 100644 --- a/gl/ubo.h +++ b/gl/ubo.h @@ -11,10 +11,13 @@ namespace gl class ubo : public object, public bindable { + int index; + public: - ubo(int size, int index); + ubo(int size, int index, GLenum hint = GL_DYNAMIC_DRAW); ~ubo(); + void bind_uniform(); using bindable::bind; static void bind(GLuint i); diff --git a/map.cpp b/map.cpp new file mode 100644 index 00000000..4790aac1 --- /dev/null +++ b/map.cpp @@ -0,0 +1,177 @@ +#include "stdafx.h" +#include "map.h" +#include "imgui/imgui.h" +#include "Logs.h" +#include "World.h" +#include "Train.h" +#include "Camera.h" + +void map::init() +{ + gl::shader vert("map.vert"); + gl::shader frag("map.frag"); + gl::program *prog = new gl::program({vert, frag}); + m_shader = std::unique_ptr(prog); + + m_tex = std::make_unique(); + m_tex->alloc_rendertarget(GL_RGB4, GL_RGB, GL_FLOAT, fb_size, fb_size); + + m_fb = std::make_unique(); + m_fb->attach(*m_tex, GL_COLOR_ATTACHMENT0); + + m_fb->setup_drawing(1); + + if (!m_fb->is_complete()) + throw std::runtime_error("map framebuffer incomplete"); + + if (Global.iMultisampling) + { + m_msaa_rb = std::make_unique(); + m_msaa_rb->alloc(GL_RGB4, fb_size, fb_size, 1 << Global.iMultisampling); + + m_msaa_fb = std::make_unique(); + m_msaa_fb->attach(*m_msaa_rb, GL_COLOR_ATTACHMENT0); + + m_msaa_fb->setup_drawing(1); + + if (!m_msaa_fb->is_complete()) + throw std::runtime_error("map multisampling framebuffer incomplete"); + } + + scene_ubo = std::make_unique(sizeof(gl::scene_ubs), 0); +} + +float map::get_vehicle_rotation() +{ + const TDynamicObject *vehicle = World.train()->Dynamic(); + glm::vec3 front = glm::dvec3(vehicle->VectorFront()) * (vehicle->DirectionGet() > 0 ? 1.0 : -1.0); + glm::vec2 f2(front.x, front.z); + glm::vec2 north_ptr(0.0f, 1.0f); + return glm::atan(f2.y, f2.x) - glm::atan(north_ptr.y, north_ptr.x); +} + +void map::render(scene::basic_region *Region) +{ + if (!map_opened) + return; + + if (!m_shader) + init(); + + ImGui::SetNextWindowSizeConstraints(ImVec2(200, 200), ImVec2(fb_size, fb_size)); + if (ImGui::Begin("Map", &map_opened, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse)) + { + float prevzoom = zoom; + + if (ImGui::Button("-")) + zoom /= 2; + ImGui::SameLine(); + if (ImGui::Button("+")) + zoom *= 2; + ImGui::SameLine(); + + float x = zoom / prevzoom; + translate *= x; + + glm::mat4 transform; + transform[0][0] = -1.0f; + + static int mode = 0; + ImGui::RadioButton("manual", &mode, 0); ImGui::SameLine(); + ImGui::RadioButton("cam", &mode, 1); ImGui::SameLine(); + ImGui::RadioButton("vehicle", &mode, 2); + + if (mode == 2 && World.train() && World.train()->Dynamic()) + { + float rot = get_vehicle_rotation(); + + transform = glm::rotate(transform, rot, glm::vec3(0.0f, 1.0f, 0.0f)); + + glm::dvec3 vpos = World.train()->Dynamic()->GetPosition(); + translate = glm::vec2(vpos.x, vpos.z) * -zoom; + } + else if (mode == 1) + { + float rot; + if (FreeFlyModeFlag) + rot = glm::pi() - World.get_camera().Yaw; + else + rot = get_vehicle_rotation() - World.get_camera().Yaw; + + transform = glm::rotate(transform, rot, glm::vec3(0.0f, 1.0f, 0.0f)); + + glm::dvec3 vpos = World.get_camera().Pos; + translate = glm::vec2(vpos.x, vpos.z) * -zoom; + } + + ImVec2 size = ImGui::GetContentRegionAvail(); + + transform = glm::translate(transform, glm::vec3(translate.x, 0.0f, translate.y)); + transform = glm::scale(transform, glm::vec3(zoom)); + + frustum.calculate(transform, glm::mat4()); + + m_section_handles.clear(); + + for (int row = 0; row < scene::EU07_REGIONSIDESECTIONCOUNT; row++) + { + for (int column = 0; column < scene::EU07_REGIONSIDESECTIONCOUNT; column++) + { + scene::basic_section *s = Region->get_section(row * scene::EU07_REGIONSIDESECTIONCOUNT + column); + if (s && frustum.sphere_inside(s->area().center, s->area().radius) > 0.f) + { + const gfx::geometrybank_handle handle = s->get_map_geometry(); + if (handle != null_handle) + m_section_handles.push_back(handle); + } + } + } + + scene_ubs.projection = transform; + scene_ubo->update(scene_ubs); + scene_ubo->bind_uniform(); + + glDisable(GL_DEPTH_TEST); + if (Global.iMultisampling) + { + m_msaa_fb->clear(GL_COLOR_BUFFER_BIT); + m_msaa_fb->bind(); + } + else + { + m_fb->clear(GL_COLOR_BUFFER_BIT); + m_fb->bind(); + } + + m_shader->bind(); + glLineWidth(1.5f); + glViewport(0, 0, size.x, size.y); + + GfxRenderer.Draw_Geometry(m_section_handles.begin(), m_section_handles.end()); + + if (Global.iMultisampling) + m_fb->blit_from(*m_msaa_fb, size.x, size.y, GL_COLOR_BUFFER_BIT, GL_COLOR_ATTACHMENT0); + + m_fb->unbind(); + + ImGui::ImageButton(reinterpret_cast(m_tex->id), size, ImVec2(0, size.y / fb_size), ImVec2(size.x / fb_size, 0), 0); + + if (mode == 0 && ImGui::IsItemHovered() && ImGui::IsMouseDragging()) + { + ImVec2 ivdelta = ImGui::GetMouseDragDelta(); + ImGui::ResetMouseDragDelta(); + + glm::vec2 delta(ivdelta.x, ivdelta.y); + delta.x /= size.x; + delta.y /= size.y; + + translate -= delta * 2.0f; + } + } + ImGui::End(); +} + +void map::toggle_window() +{ + map_opened = !map_opened; +} diff --git a/map.h b/map.h new file mode 100644 index 00000000..b59a6fb5 --- /dev/null +++ b/map.h @@ -0,0 +1,34 @@ +#pragma once + +#include "gl/shader.h" +#include "renderer.h" +#include "Texture.h" + +class map +{ + std::unique_ptr m_shader; + std::unique_ptr m_msaa_fb; + std::unique_ptr m_msaa_rb; + + std::unique_ptr m_fb; + std::unique_ptr m_tex; + + std::unique_ptr scene_ubo; + gl::scene_ubs scene_ubs; + + std::vector m_section_handles; + + const int fb_size = 1024; + + glm::vec2 translate; + float zoom = 1.0f / 1000.0f; + float get_vehicle_rotation(); + + void init(); + + cFrustum frustum; +public: + bool map_opened = false; + void render(scene::basic_region *Region); + void toggle_window(); +}; diff --git a/openglgeometrybank.cpp b/openglgeometrybank.cpp index c5bbf998..5c1bd397 100644 --- a/openglgeometrybank.cpp +++ b/openglgeometrybank.cpp @@ -241,10 +241,8 @@ opengl_vbogeometrybank::replace_( gfx::geometry_handle const &Geometry ) { } } -// draw() subclass details -void -opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry) { - +void opengl_vbogeometrybank::setup_buffer() +{ if( m_buffer == 0 ) { // if there's no buffer, we'll have to make one // NOTE: this isn't exactly optimal in terms of ensuring the gfx card doesn't stall waiting for the data @@ -300,6 +298,13 @@ opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry) { glBindBuffer(GL_ARRAY_BUFFER, 0); m_vao->unbind(); } +} + +// draw() subclass details +void +opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry) +{ + setup_buffer(); // actual draw procedure starts here auto &chunkrecord = m_chunkrecords.at(Geometry.chunk - 1); @@ -321,6 +326,60 @@ opengl_vbogeometrybank::draw_( gfx::geometry_handle const &Geometry) { ::glDrawArrays( chunk.type, chunkrecord.offset, chunkrecord.size ); } +void opengl_vbogeometrybank::draw_(const std::vector::iterator begin, const std::vector::iterator end) +{ + if (begin == end) + return; + + setup_buffer(); + + m_offsets.clear(); + m_counts.clear(); + GLenum type = 0; + bool coalesce = false; + + for (auto it = begin; it != end; it++) + { + gfx::geometry_handle Geometry = *it; + auto &chunkrecord = m_chunkrecords.at(Geometry.chunk - 1); + auto const &chunk = gfx::geometry_bank::chunk( Geometry ); + if( false == chunkrecord.is_good ) { + glBindBuffer( GL_ARRAY_BUFFER, m_buffer ); + // we may potentially need to upload new buffer data before we can draw it + ::glBufferSubData( + GL_ARRAY_BUFFER, + chunkrecord.offset * sizeof( gfx::basic_vertex ), + chunkrecord.size * sizeof( gfx::basic_vertex ), + chunk.vertices.data() ); + glBindBuffer(GL_ARRAY_BUFFER, 0); + chunkrecord.is_good = true; + } + + if (!type) + { + type = chunk.type; + if (type == GL_POINTS || type == GL_LINES || type == GL_TRIANGLES) + coalesce = true; + } + else if (type != chunk.type) + throw std::logic_error("inconsistent draw types"); + + if (coalesce && m_offsets.size() && chunkrecord.offset == m_offsets.back() + m_counts.back()) + m_counts.back() += chunkrecord.size; + else + { + m_offsets.push_back(chunkrecord.offset); + m_counts.push_back(chunkrecord.size); + } + } + + m_vao->bind(); + if (m_offsets.size() == 1) + glDrawArrays(type, m_offsets.front(), m_counts.front()); + else + glMultiDrawArrays(type, m_offsets.data(), m_counts.data(), m_offsets.size()); +} + // release () subclass details void opengl_vbogeometrybank::release_() { @@ -394,6 +453,29 @@ geometrybank_manager::draw( gfx::geometry_handle const &Geometry ) { bankrecord.first->draw( Geometry ); } +void geometrybank_manager::draw(const std::vector::iterator begin, const std::vector::iterator end) +{ + if (begin == end) + return; + + auto &run_bank = bank(*begin); + std::vector::iterator run_begin = begin; + + std::vector::iterator it; + for (it = begin; it != end; it++) + { + if (bank(*it) != run_bank) + { + run_bank.first->draw(run_begin, it); + run_bank = bank(*it); + run_begin = it; + } + } + + if (run_begin != it) + run_bank.first->draw(run_begin, it); +} + // provides direct access to vertex data of specfied chunk gfx::vertex_array const & geometrybank_manager::vertices( gfx::geometry_handle const &Geometry ) const { diff --git a/openglgeometrybank.h b/openglgeometrybank.h index ccfb524a..2cafa346 100644 --- a/openglgeometrybank.h +++ b/openglgeometrybank.h @@ -94,9 +94,10 @@ public: void draw( gfx::geometry_handle const &Geometry ); // draws geometry stored in supplied list of chunks - template - void - draw( Iterator_ First, Iterator_ Last ) { while( First != Last ) { draw( *First ); ++First; } } + void draw(std::vector::iterator begin, std::vector::iterator end) + { + draw_(begin, end); + } // frees subclass-specific resources associated with the bank, typically called when the bank wasn't in use for a period of time void release(); @@ -139,6 +140,7 @@ private: virtual void replace_( gfx::geometry_handle const &Geometry ) = 0; // draw() subclass details virtual void draw_( gfx::geometry_handle const &Geometry ) = 0; + virtual void draw_(const std::vector::iterator begin, const std::vector::iterator end) = 0; // resource release subclass details virtual void release_() = 0; }; @@ -167,6 +169,12 @@ private: }; typedef std::vector chunkrecord_sequence; + void setup_buffer(); + + // vectors for glMultiDrawArrays in class scope + // to don't waste time on reallocating + std::vector m_offsets; + std::vector m_counts; // methods: // create() subclass details @@ -178,6 +186,7 @@ private: // draw() subclass details void draw_( gfx::geometry_handle const &Geometry ); + void draw_(const std::vector::iterator begin, const std::vector::iterator end); // release() subclass details void release_(); @@ -217,12 +226,7 @@ public: // draws geometry stored in specified chunk void draw( gfx::geometry_handle const &Geometry); - template - void - draw( Iterator_ First, Iterator_ Last ) { - while( First != Last ) { - draw( *First ); - ++First; } } + void draw(const std::vector::iterator begin, const std::vector::iterator end); // provides direct access to vertex data of specfied chunk gfx::vertex_array const & vertices( gfx::geometry_handle const &Geometry ) const; diff --git a/renderer.cpp b/renderer.cpp index 9d300aa1..8a170bdf 100644 --- a/renderer.cpp +++ b/renderer.cpp @@ -158,9 +158,9 @@ bool opengl_renderer::Init(GLFWwindow *Window) return false; } - scene_ubo = std::make_unique(sizeof(gl::scene_ubs), 0); - model_ubo = std::make_unique(sizeof(gl::model_ubs), 1); - light_ubo = std::make_unique(sizeof(gl::light_ubs), 2); + scene_ubo = std::make_unique(sizeof(gl::scene_ubs), 0); + model_ubo = std::make_unique(sizeof(gl::model_ubs), 1, GL_STREAM_DRAW); + light_ubo = std::make_unique(sizeof(gl::light_ubs), 2); // better initialize with 0 to not crash driver/whole system // when we forget @@ -384,6 +384,7 @@ void opengl_renderer::Render_pass(rendermode const Mode) scene_ubs.time = Timer::GetTime(); scene_ubs.projection = OpenGLMatrices.data(GL_PROJECTION); scene_ubo->update(scene_ubs); + scene_ubo->bind_uniform(); m_colorpass = m_renderpass; @@ -493,6 +494,8 @@ void opengl_renderer::Render_pass(rendermode const Mode) setup_shadow_map(nullptr, m_renderpass); setup_env_map(nullptr); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + if (Global.gfx_postfx_motionblur_enabled) { m_main_fb->clear(GL_COLOR_BUFFER_BIT); @@ -509,9 +512,8 @@ void opengl_renderer::Render_pass(rendermode const Mode) m_msaa_fb->blit_to(*m_main2_fb.get(), Global.render_width, Global.render_height, GL_COLOR_BUFFER_BIT, GL_COLOR_ATTACHMENT0); } - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_FRAMEBUFFER_SRGB); - glViewport(0, 0, Global.iWindowWidth, Global.iWindowHeight); + glViewport(0, 0, Global.iWindowWidth, Global.iWindowHeight); m_pfx_tonemapping->apply(*m_main2_tex, nullptr); opengl_texture::reset_unit_cache(); glDisable(GL_FRAMEBUFFER_SRGB); @@ -1484,7 +1486,7 @@ void opengl_renderer::Render(section_sequence::iterator First, section_sequence: if (false == section->m_shapes.empty()) { // since all shapes of the section share center point we can optimize out a few calls here - ::glPushMatrix(); + ::glPushMatrix(); auto const originoffset{section->m_area.center - m_renderpass.camera.position()}; ::glTranslated(originoffset.x, originoffset.y, originoffset.z); // render @@ -1681,6 +1683,11 @@ void opengl_renderer::Render(cell_sequence::iterator First, cell_sequence::itera } } +void opengl_renderer::Draw_Geometry(std::vector::iterator begin, std::vector::iterator end) +{ + m_geometry.draw(begin, end); +} + void opengl_renderer::draw(const gfx::geometry_handle &handle) { model_ubs.set_modelview(OpenGLMatrices.data(GL_MODELVIEW)); @@ -1694,11 +1701,7 @@ void opengl_renderer::draw(std::vector::iterator it, s model_ubs.set_modelview(OpenGLMatrices.data(GL_MODELVIEW)); model_ubo->update(model_ubs); - while (it != end) - { - m_geometry.draw(*it); - it++; - } + Draw_Geometry(it, end); } void opengl_renderer::Render(scene::shape_node const &Shape, bool const Ignorerange) diff --git a/renderer.h b/renderer.h index 6227fad6..013c7daf 100644 --- a/renderer.h +++ b/renderer.h @@ -146,6 +146,8 @@ class opengl_renderer bool Replace(gfx::vertex_array &Vertices, gfx::geometry_handle const &Geometry, int const Type, std::size_t const Offset = 0); // adds supplied vertex data at the end of specified chunk bool Append(gfx::vertex_array &Vertices, gfx::geometry_handle const &Geometry, int const Type); + // draws supplied geometry handles + void Draw_Geometry(std::vector::iterator begin, std::vector::iterator end); // provides direct access to vertex data of specfied chunk gfx::vertex_array const &Vertices(gfx::geometry_handle const &Geometry) const; // material methods diff --git a/scene.cpp b/scene.cpp index 736866d3..4b69715d 100644 --- a/scene.cpp +++ b/scene.cpp @@ -599,6 +599,15 @@ basic_cell::create_geometry( gfx::geometrybank_handle const &Bank ) { m_geometrycreated = true; // helper for legacy animation code, get rid of it after refactoring } +void basic_cell::create_map_geometry(std::vector &Bank) +{ + if (!m_active) + return; + + for (auto *path : m_paths) + path->create_map_geometry(Bank); +} + // executes event assigned to specified launcher void basic_cell::launch_event( TEventLauncher *Launcher ) { @@ -902,6 +911,15 @@ basic_section::create_geometry() { } } +void basic_section::create_map_geometry(const gfx::geometrybank_handle handle) +{ + std::vector lines; + for (auto &cell : m_cells) + cell.create_map_geometry(lines); + + m_map_geometryhandle = GfxRenderer.Insert(lines, handle, GL_LINES); +} + // provides access to section enclosing specified point basic_cell & basic_section::cell( glm::dvec3 const &Location ) { @@ -1557,6 +1575,19 @@ basic_region::section( glm::dvec3 const &Location ) { return *section; } +void basic_region::create_map_geometry() +{ + m_map_geometrybank = GfxRenderer.Create_Bank(); + + for (int row = 0; row < EU07_REGIONSIDESECTIONCOUNT; row++) + for (int column = 0; column < EU07_REGIONSIDESECTIONCOUNT; column++) + { + basic_section *s = m_sections[row * EU07_REGIONSIDESECTIONCOUNT + column]; + if (s) + s->create_map_geometry(m_map_geometrybank); + } +} + } // scene //--------------------------------------------------------------------------- diff --git a/scene.h b/scene.h index e784caba..952b83ef 100644 --- a/scene.h +++ b/scene.h @@ -151,6 +151,7 @@ public: // generates renderable version of held non-instanced geometry in specified geometry bank void create_geometry( gfx::geometrybank_handle const &Bank ); + void create_map_geometry(std::vector &Bank); // provides access to bounding area data bounding_area const & area() const { @@ -274,10 +275,15 @@ public: // generates renderable version of held non-instanced geometry void create_geometry(); + void create_map_geometry(const gfx::geometrybank_handle handle); // provides access to bounding area data bounding_area const & area() const { return m_area; } + const gfx::geometrybank_handle get_map_geometry() + { + return m_map_geometryhandle; + } private: // types @@ -289,6 +295,7 @@ private: cell( glm::dvec3 const &Location ); // members // placement and visibility + scene::bounding_area m_area { glm::dvec3(), static_cast( 0.5 * M_SQRT2 * EU07_SECTIONSIZE ) }; // content cell_array m_cells; // partitioning scheme @@ -297,6 +304,8 @@ private: // gfx renderer data gfx::geometrybank_handle m_geometrybank; bool m_geometrycreated { false }; + + gfx::geometrybank_handle m_map_geometryhandle; }; // top-level of scene spatial structure, holds collection of sections @@ -383,6 +392,11 @@ public: // finds sections inside specified sphere. returns: list of sections std::vector const & sections( glm::dvec3 const &Point, float const Radius ); + void create_map_geometry(); + basic_section* get_section(size_t section) + { + return m_sections[section]; + } private: // types @@ -393,6 +407,8 @@ private: std::vector sections; }; + gfx::geometrybank_handle m_map_geometrybank; + // methods // checks whether specified point is within boundaries of the region bool diff --git a/shaders/map.frag b/shaders/map.frag new file mode 100644 index 00000000..47583e13 --- /dev/null +++ b/shaders/map.frag @@ -0,0 +1,8 @@ +#version 330 + +#include + +void main() +{ + gl_FragData[0] = vec4(1.0f); +} diff --git a/shaders/map.vert b/shaders/map.vert new file mode 100644 index 00000000..70a47c78 --- /dev/null +++ b/shaders/map.vert @@ -0,0 +1,12 @@ +#version 330 + +layout(location = 0) in vec3 v_vert; + +#include + +void main() +{ + vec4 clip_pos = projection * vec4(v_vert, 1.0f); + + gl_Position = vec4(clip_pos.xz, 0.5, 1.0); +} diff --git a/shaders/mat_default.frag b/shaders/mat_default.frag index 0f9b3e66..d330df76 100644 --- a/shaders/mat_default.frag +++ b/shaders/mat_default.frag @@ -74,7 +74,7 @@ void main() vec2 a = (f_clip_future_pos.xy / f_clip_future_pos.w) * 0.5 + 0.5;; vec2 b = (f_clip_pos.xy / f_clip_pos.w) * 0.5 + 0.5;; - gl_FragData[1] = vec4(a - b, 0.0f, tex_color.a < 0.9f ? 0.0f : 1.0f); + gl_FragData[1] = vec4(a - b, 0.0f, tex_color.a); } #endif } diff --git a/simulation.cpp b/simulation.cpp index 491faa80..340cf359 100644 --- a/simulation.cpp +++ b/simulation.cpp @@ -163,6 +163,9 @@ state_serializer::deserialize( cParser &Input, scene::scratch_data &Scratchpad ) // manually perform scenario initialization deserialize_firstinit( Input, Scratchpad ); } + + if (Global.map_enabled) + Region->create_map_geometry(); } void diff --git a/uilayer.cpp b/uilayer.cpp index 7e389a78..1f39ea97 100644 --- a/uilayer.cpp +++ b/uilayer.cpp @@ -22,22 +22,23 @@ ui_layer UILayer; -ui_layer::~ui_layer() { +ui_layer::~ui_layer() {} -} - -bool -ui_layer::init( GLFWwindow *Window ) { +bool ui_layer::init(GLFWwindow *Window) +{ m_window = Window; log_active = Global.loading_log; IMGUI_CHECKVERSION(); ImGui::CreateContext(); imgui_io = &ImGui::GetIO(); - //imgui_io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; - //imgui_io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; + // imgui_io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; + // imgui_io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; imgui_io->Fonts->AddFontFromFileTTF("DejaVuSansMono.ttf", 13.0f); + if (Global.map_enabled) + m_map = std::make_unique(); + ImGui_ImplGlfw_InitForOpenGL(m_window); ImGui_ImplOpenGL3_Init(); ImGui::StyleColorsClassic(); @@ -83,115 +84,146 @@ bool ui_layer::mouse_button_callback(int button, int action, int mods) void ui_layer::set_cursor(const int Mode) { - glfwSetInputMode( m_window, GLFW_CURSOR, Mode ); - m_cursorvisible = ( Mode != GLFW_CURSOR_DISABLED ); + glfwSetInputMode(m_window, GLFW_CURSOR, Mode); + m_cursorvisible = (Mode != GLFW_CURSOR_DISABLED); } // potentially processes provided input key. returns: true if key was processed, false otherwise -bool -ui_layer::on_key( int const Key, int const Action ) { +bool ui_layer::on_key(int const Key, int const Action) +{ // TODO: pass the input first through an active ui element if there's any // if the ui element shows no interest or we don't have one, try to interpret the input yourself: // shared conditions - switch( Key ) { - - case GLFW_KEY_F1: - case GLFW_KEY_F2: - case GLFW_KEY_F3: - case GLFW_KEY_F8: - case GLFW_KEY_F9: - case GLFW_KEY_F10: - case GLFW_KEY_F11: - case GLFW_KEY_F12: { // ui mode selectors - - if( ( true == Global.ctrlState ) - || ( true == Global.shiftState ) ) { - // only react to keys without modifiers - return false; - } - - if( Action == GLFW_RELEASE ) { return true; } // recognized, but ignored - } + switch (Key) + { + case GLFW_KEY_F1: + case GLFW_KEY_F2: + case GLFW_KEY_F3: + case GLFW_KEY_F8: + case GLFW_KEY_F9: + case GLFW_KEY_F10: + case GLFW_KEY_F11: + case GLFW_KEY_F12: case GLFW_KEY_Y: - if (quit_active) - glfwSetWindowShouldClose(m_window, GLFW_TRUE); - break; - case GLFW_KEY_N: - if (quit_active) - quit_active = false; + case GLFW_KEY_TAB: + { // ui mode selectors - default: { // everything else - break; + if ((true == Global.ctrlState) || (true == Global.shiftState)) + { + // only react to keys without modifiers + return false; } + + if (Action == GLFW_RELEASE) + { + return true; + } // recognized, but ignored + break; } - switch (Key) { - - case GLFW_KEY_F1: { - // basic consist info - basic_info_active = !basic_info_active; - return true; - } + default: + { // everything else + return false; + } + } - case GLFW_KEY_F2: { - // parametry pojazdu - vehicle_info_active = !vehicle_info_active; - return true; - } + switch (Key) + { - case GLFW_KEY_F3: { - // timetable - timetable_active = !timetable_active; - return true; - } + case GLFW_KEY_F1: + { + // basic consist info + basic_info_active = !basic_info_active; + return true; + } - case GLFW_KEY_F8: { - // renderer debug data - renderer_debug_active = !renderer_debug_active; - return true; - } + case GLFW_KEY_F2: + { + // parametry pojazdu + vehicle_info_active = !vehicle_info_active; + return true; + } - case GLFW_KEY_F9: { - // wersja - about_active = !about_active; - return true; - } + case GLFW_KEY_F3: + { + // timetable + timetable_active = !timetable_active; + return true; + } - case GLFW_KEY_F10: { - // quit - quit_active = !quit_active; - return true; - } + case GLFW_KEY_F8: + { + // renderer debug data + renderer_debug_active = !renderer_debug_active; + return true; + } - case GLFW_KEY_F11: { - // scenario inspector - EditorModeFlag = !EditorModeFlag; - if( ( true == EditorModeFlag ) - && ( false == Global.ControlPicking ) ) - { - set_cursor(GLFW_CURSOR_NORMAL); - Global.ControlPicking = true; - } - return true; - } + case GLFW_KEY_F9: + { + // wersja + about_active = !about_active; + return true; + } - case GLFW_KEY_F12: { - log_active = !log_active; - return true; - } + case GLFW_KEY_F10: + { + // quit + quit_active = !quit_active; + return true; + } - default: { - break; + case GLFW_KEY_F11: + { + // scenario inspector + EditorModeFlag = !EditorModeFlag; + if ((true == EditorModeFlag) && (false == Global.ControlPicking)) + { + set_cursor(GLFW_CURSOR_NORMAL); + Global.ControlPicking = true; } + return true; + } + + case GLFW_KEY_F12: + { + log_active = !log_active; + return true; + } + + case GLFW_KEY_Y: + { + if (quit_active) + glfwSetWindowShouldClose(m_window, GLFW_TRUE); + return true; + } + + case GLFW_KEY_N: + { + if (quit_active) + quit_active = false; + return true; + } + + case GLFW_KEY_TAB: + { + if (m_map) + m_map->toggle_window(); + return true; + } + + default: + { + break; + } } return false; } -void -ui_layer::render() { +void ui_layer::render() +{ // render code here Timer::subsystem.gfx_gui.start(); @@ -199,32 +231,33 @@ ui_layer::render() { render_progress(); - //ImGui::ShowDemoWindow(); + // ImGui::ShowDemoWindow(); std::string uitextline1, uitextline2, uitextline3, uitextline4; - UILayer.set_tooltip( "" ); + UILayer.set_tooltip(""); - auto const *train { ( Global.pWorld ? Global.pWorld->train() : nullptr ) }; - auto const *controlled { ( Global.pWorld ? Global.pWorld->controlled() : nullptr ) }; - auto const *camera { Global.pCamera }; + auto const *train{(Global.pWorld ? Global.pWorld->train() : nullptr)}; + auto const *controlled{(Global.pWorld ? Global.pWorld->controlled() : nullptr)}; + auto const *camera{Global.pCamera}; - if( ( train != nullptr ) && ( false == FreeFlyModeFlag ) ) { - if( false == DebugModeFlag ) { + if ((train != nullptr) && (false == FreeFlyModeFlag)) + { + if (false == DebugModeFlag) + { // in regular mode show control functions, for defined controls - UILayer.set_tooltip( locale::label_cab_control( train->GetLabel( GfxRenderer.Pick_Control() ) ) ); + UILayer.set_tooltip(locale::label_cab_control(train->GetLabel(GfxRenderer.Pick_Control()))); } - else { + else + { // in debug mode show names of submodels, to help with cab setup and/or debugging auto const cabcontrol = GfxRenderer.Pick_Control(); - UILayer.set_tooltip( ( cabcontrol ? cabcontrol->pName : "" ) ); + UILayer.set_tooltip((cabcontrol ? cabcontrol->pName : "")); } } - if( ( true == Global.ControlPicking ) && ( true == FreeFlyModeFlag ) && ( true == DebugModeFlag ) ) { + if ((true == Global.ControlPicking) && (true == FreeFlyModeFlag) && (true == DebugModeFlag)) + { auto const scenerynode = GfxRenderer.Pick_Node(); - UILayer.set_tooltip( - ( scenerynode ? - scenerynode->name() : - "" ) ); + UILayer.set_tooltip((scenerynode ? scenerynode->name() : "")); } render_tooltip(); @@ -240,54 +273,56 @@ ui_layer::render() { } ImGui::TextUnformatted(uitextline1.c_str()); - if( ( controlled != nullptr ) - && ( controlled->Mechanik != nullptr ) ) { + if ((controlled != nullptr) && (controlled->Mechanik != nullptr)) + { auto const &mover = controlled->MoverParameters; auto const &driver = controlled->Mechanik; - uitextline2 = "Throttle: " + to_string( driver->Controlling()->MainCtrlPos, 0, 2 ) + "+" + std::to_string( driver->Controlling()->ScndCtrlPos ); - if( mover->ActiveDir > 0 ) { uitextline2 += " D"; } - else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; } - else { uitextline2 += " N"; } + uitextline2 = "Throttle: " + to_string(driver->Controlling()->MainCtrlPos, 0, 2) + "+" + std::to_string(driver->Controlling()->ScndCtrlPos); + if (mover->ActiveDir > 0) + { + uitextline2 += " D"; + } + else if (mover->ActiveDir < 0) + { + uitextline2 += " R"; + } + else + { + uitextline2 += " N"; + } - uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePosA ) + ( mover->SlippingWheels ? " !" : " " ); + uitextline3 = "Brakes:" + to_string(mover->fBrakeCtrlPos, 1, 5) + "+" + std::to_string(mover->LocalBrakePosA) + (mover->SlippingWheels ? " !" : " "); - uitextline4 = ( - true == TestFlag( mover->SecuritySystem.Status, s_aware ) ? - "!ALERTER! " : - " " ); - uitextline4 += ( - true == TestFlag( mover->SecuritySystem.Status, s_active ) ? - "!SHP! " : - " " ); + uitextline4 = (true == TestFlag(mover->SecuritySystem.Status, s_aware) ? "!ALERTER! " : " "); + uitextline4 += (true == TestFlag(mover->SecuritySystem.Status, s_active) ? "!SHP! " : " "); static bool detail = false; ImGui::Checkbox("More", &detail); - if (detail) { - auto const speedlimit { static_cast( std::floor( driver->VelDesired ) ) }; - uitextline2 += - " Speed: " + std::to_string( static_cast( std::floor( mover->Vel ) ) ) + " km/h" - + " (limit: " + std::to_string( speedlimit ) + " km/h"; - auto const nextspeedlimit { static_cast( std::floor( controlled->Mechanik->VelNext ) ) }; - if( nextspeedlimit != speedlimit ) { - uitextline2 += - ", new limit: " + std::to_string( nextspeedlimit ) + " km/h" - + " in " + to_string( controlled->Mechanik->ActualProximityDist * 0.001, 1 ) + " km"; + if (detail) + { + auto const speedlimit{static_cast(std::floor(driver->VelDesired))}; + uitextline2 += " Speed: " + std::to_string(static_cast(std::floor(mover->Vel))) + " km/h" + " (limit: " + std::to_string(speedlimit) + " km/h"; + auto const nextspeedlimit{static_cast(std::floor(controlled->Mechanik->VelNext))}; + if (nextspeedlimit != speedlimit) + { + uitextline2 += ", new limit: " + std::to_string(nextspeedlimit) + " km/h" + " in " + to_string(controlled->Mechanik->ActualProximityDist * 0.001, 1) + " km"; } uitextline2 += ")"; - uitextline3 += - " Pressure: " + to_string( mover->BrakePress * 100.0, 2 ) + " kPa" - + " (train pipe: " + to_string( mover->PipePress * 100.0, 2 ) + " kPa)"; + uitextline3 += " Pressure: " + to_string(mover->BrakePress * 100.0, 2) + " kPa" + " (train pipe: " + to_string(mover->PipePress * 100.0, 2) + " kPa)"; - auto const stoptime { static_cast( -1.0 * controlled->Mechanik->fStopTime ) }; - if( stoptime > 0 ) { - uitextline4 += " Loading/unloading in progress (" + to_string( stoptime ) + ( stoptime > 1 ? " seconds" : " second" ) + " left)"; + auto const stoptime{static_cast(-1.0 * controlled->Mechanik->fStopTime)}; + if (stoptime > 0) + { + uitextline4 += " Loading/unloading in progress (" + to_string(stoptime) + (stoptime > 1 ? " seconds" : " second") + " left)"; } - else { - auto const trackblockdistance{ std::abs( controlled->Mechanik->TrackBlock() ) }; - if( trackblockdistance <= 75.0 ) { - uitextline4 += " Another vehicle ahead (distance: " + to_string( trackblockdistance, 1 ) + " m)"; + else + { + auto const trackblockdistance{std::abs(controlled->Mechanik->TrackBlock())}; + if (trackblockdistance <= 75.0) + { + uitextline4 += " Another vehicle ahead (distance: " + to_string(trackblockdistance, 1) + " m)"; } } } @@ -303,39 +338,31 @@ ui_layer::render() { if (vehicle_info_active) { // timetable - auto *vehicle { - ( FreeFlyModeFlag ? - std::get( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) : - controlled ) }; // w trybie latania lokalizujemy wg mapy + auto *vehicle{(FreeFlyModeFlag ? std::get(simulation::Region->find_vehicle(camera->Pos, 20, false, false)) : controlled)}; // w trybie latania lokalizujemy wg mapy - if( vehicle == nullptr ) + if (vehicle == nullptr) goto f2_cancel; // if the nearest located vehicle doesn't have a direct driver, try to query its owner - auto const owner = ( - ( ( vehicle->Mechanik != nullptr ) && ( vehicle->Mechanik->Primary() ) ) ? - vehicle->Mechanik : - vehicle->ctOwner ); - if( owner == nullptr ) + auto const owner = (((vehicle->Mechanik != nullptr) && (vehicle->Mechanik->Primary())) ? vehicle->Mechanik : vehicle->ctOwner); + if (owner == nullptr) goto f2_cancel; auto const *table = owner->TrainTimetable(); - if( table == nullptr ) + if (table == nullptr) goto f2_cancel; auto const &time = simulation::Time.data(); - uitextline1 = - "Time: " - + to_string( time.wHour ) + ":" - + ( time.wMinute < 10 ? "0" : "" ) + to_string( time.wMinute ) + ":" - + ( time.wSecond < 10 ? "0" : "" ) + to_string( time.wSecond ); - if( Global.iPause ) { + uitextline1 = "Time: " + to_string(time.wHour) + ":" + (time.wMinute < 10 ? "0" : "") + to_string(time.wMinute) + ":" + (time.wSecond < 10 ? "0" : "") + to_string(time.wSecond); + if (Global.iPause) + { uitextline1 += " (paused)"; } - uitextline2 = std::string( owner->Relation() ) + " (" + std::string( owner->TrainName() ) + ")"; - auto const nextstation = std::string( owner->NextStop() ); + uitextline2 = std::string(owner->Relation()) + " (" + std::string(owner->TrainName()) + ")"; + auto const nextstation = std::string(owner->NextStop()); uitextline3 = ""; - if( !nextstation.empty() ) { + if (!nextstation.empty()) + { // jeśli jest podana relacja, to dodajemy punkt następnego zatrzymania uitextline3 = " -> " + nextstation; } @@ -346,7 +373,7 @@ ui_layer::render() { ImGui::TextUnformatted(uitextline2.c_str()); ImGui::TextUnformatted(uitextline3.c_str()); - if( table->StationCount > 0) + if (table->StationCount > 0) { static bool show = false; ImGui::Checkbox("show", &show); @@ -356,42 +383,23 @@ ui_layer::render() { ImGui::TextUnformatted("+-----+------------------------------------+-------+-----+"); TMTableLine const *tableline; - for( int i = owner->iStationStart; i <= table->StationCount; ++i ) { + for (int i = owner->iStationStart; i <= table->StationCount; ++i) + { // wyświetlenie pozycji z rozkładu tableline = table->TimeTable + i; // linijka rozkładu - std::string vmax = - " " - + to_string( tableline->vmax, 0 ); - vmax = vmax.substr( vmax.size() - 3, 3 ); // z wyrównaniem do prawej - std::string const station = ( - std::string( tableline->StationName ) - + " " ) - .substr( 0, 34 ); - std::string const location = ( - ( tableline->km > 0.0 ? - to_string( tableline->km, 2 ) : - "" ) - + " " ) - .substr( 0, 34 - tableline->StationWare.size() ); - std::string const arrival = ( - tableline->Ah >= 0 ? - to_string( int( 100 + tableline->Ah ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Am ) ).substr( 1, 2 ) : - " | " ); - std::string const departure = ( - tableline->Dh >= 0 ? - to_string( int( 100 + tableline->Dh ) ).substr( 1, 2 ) + ":" + to_string( int( 100 + tableline->Dm ) ).substr( 1, 2 ) : - " | " ); - auto const candeparture = ( - ( owner->iStationStart < table->StationIndex ) - && ( i < table->StationIndex ) - && ( ( time.wHour * 60 + time.wMinute ) >= ( tableline->Dh * 60 + tableline->Dm ) ) ); + std::string vmax = " " + to_string(tableline->vmax, 0); + vmax = vmax.substr(vmax.size() - 3, 3); // z wyrównaniem do prawej + std::string const station = (std::string(tableline->StationName) + " ").substr(0, 34); + std::string const location = ((tableline->km > 0.0 ? to_string(tableline->km, 2) : "") + " ").substr(0, 34 - tableline->StationWare.size()); + std::string const arrival = (tableline->Ah >= 0 ? to_string(int(100 + tableline->Ah)).substr(1, 2) + ":" + to_string(int(100 + tableline->Am)).substr(1, 2) : " | "); + std::string const departure = (tableline->Dh >= 0 ? to_string(int(100 + tableline->Dh)).substr(1, 2) + ":" + to_string(int(100 + tableline->Dm)).substr(1, 2) : " | "); + auto const candeparture = ((owner->iStationStart < table->StationIndex) && (i < table->StationIndex) && ((time.wHour * 60 + time.wMinute) >= (tableline->Dh * 60 + tableline->Dm))); auto traveltime = - " " - + ( i < 2 ? "" : - tableline->Ah >= 0 ? to_string( CompareTime( table->TimeTable[ i - 1 ].Dh, table->TimeTable[ i - 1 ].Dm, tableline->Ah, tableline->Am ), 0 ) : - to_string( std::max( 0.0, CompareTime( table->TimeTable[ i - 1 ].Dh, table->TimeTable[ i - 1 ].Dm, tableline->Dh, tableline->Dm ) - 0.5 ), 0 ) ); - traveltime = traveltime.substr( traveltime.size() - 3, 3 ); // z wyrównaniem do prawej + " " + (i < 2 ? "" : + tableline->Ah >= 0 ? to_string(CompareTime(table->TimeTable[i - 1].Dh, table->TimeTable[i - 1].Dm, tableline->Ah, tableline->Am), 0) : + to_string(std::max(0.0, CompareTime(table->TimeTable[i - 1].Dh, table->TimeTable[i - 1].Dm, tableline->Dh, tableline->Dm) - 0.5), 0)); + traveltime = traveltime.substr(traveltime.size() - 3, 3); // z wyrównaniem do prawej uitextline1 = "| " + vmax + " | " + station + " | " + arrival + " | " + traveltime + " |"; uitextline2 = "| | " + location + tableline->StationWare + " | " + departure + " | |"; @@ -414,7 +422,7 @@ ui_layer::render() { ImGui::End(); } - f2_cancel:; +f2_cancel:; if (timetable_active) { @@ -426,175 +434,148 @@ ui_layer::render() { uitextline3 = ""; uitextline4 = ""; - auto *vehicle{ - ( FreeFlyModeFlag ? - std::get( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) : - controlled ) }; // w trybie latania lokalizujemy wg mapy + auto *vehicle{(FreeFlyModeFlag ? std::get(simulation::Region->find_vehicle(camera->Pos, 20, false, false)) : controlled)}; // w trybie latania lokalizujemy wg mapy - if( vehicle != nullptr ) { + if (vehicle != nullptr) + { // jeśli domyślny ekran po pierwszym naciśnięciu uitextline1 = "Vehicle name: " + vehicle->MoverParameters->Name; - if( ( vehicle->Mechanik == nullptr ) && ( vehicle->ctOwner ) ) { + if ((vehicle->Mechanik == nullptr) && (vehicle->ctOwner)) + { // for cars other than leading unit indicate the leader uitextline1 += ", owned by " + vehicle->ctOwner->OwnerName(); } - uitextline1 += "; Status: " + vehicle->MoverParameters->EngineDescription( 0 ); + uitextline1 += "; Status: " + vehicle->MoverParameters->EngineDescription(0); // informacja o sprzęgach uitextline1 += - "; C0:" + - ( vehicle->PrevConnected ? - vehicle->PrevConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag ) + ( - vehicle->MoverParameters->Couplers[ 0 ].CouplingFlag == 0 ? - " (" + to_string( vehicle->MoverParameters->Couplers[ 0 ].CoupleDist, 1 ) + " m)" : - "" ) : - "none" ); + "; C0:" + (vehicle->PrevConnected ? vehicle->PrevConnected->name() + ":" + to_string(vehicle->MoverParameters->Couplers[0].CouplingFlag) + + (vehicle->MoverParameters->Couplers[0].CouplingFlag == 0 ? " (" + to_string(vehicle->MoverParameters->Couplers[0].CoupleDist, 1) + " m)" : "") : + "none"); uitextline1 += - " C1:" + - ( vehicle->NextConnected ? - vehicle->NextConnected->name() + ":" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag ) + ( - vehicle->MoverParameters->Couplers[ 1 ].CouplingFlag == 0 ? - " (" + to_string( vehicle->MoverParameters->Couplers[ 1 ].CoupleDist, 1 ) + " m)" : - "" ) : - "none" ); + " C1:" + (vehicle->NextConnected ? vehicle->NextConnected->name() + ":" + to_string(vehicle->MoverParameters->Couplers[1].CouplingFlag) + + (vehicle->MoverParameters->Couplers[1].CouplingFlag == 0 ? " (" + to_string(vehicle->MoverParameters->Couplers[1].CoupleDist, 1) + " m)" : "") : + "none"); // equipment flags - uitextline2 = ( vehicle->MoverParameters->Battery ? "B" : "." ); - uitextline2 += ( vehicle->MoverParameters->Mains ? "M" : "." ); - uitextline2 += ( vehicle->MoverParameters->PantRearUp ? ( vehicle->MoverParameters->PantRearVolt > 0.0 ? "O" : "o" ) : "." ); - uitextline2 += ( vehicle->MoverParameters->PantFrontUp ? ( vehicle->MoverParameters->PantFrontVolt > 0.0 ? "P" : "p" ) : "." ); - uitextline2 += ( vehicle->MoverParameters->PantPressLockActive ? "!" : ( vehicle->MoverParameters->PantPressSwitchActive ? "*" : "." ) ); - uitextline2 += ( vehicle->MoverParameters->WaterPump.is_active ? "W" : ( false == vehicle->MoverParameters->WaterPump.breaker ? "-" : ( vehicle->MoverParameters->WaterPump.is_enabled ? "w" : "." ) ) ); - uitextline2 += ( true == vehicle->MoverParameters->WaterHeater.is_damaged ? "!" : ( vehicle->MoverParameters->WaterHeater.is_active ? "H" : ( false == vehicle->MoverParameters->WaterHeater.breaker ? "-" : ( vehicle->MoverParameters->WaterHeater.is_enabled ? "h" : "." ) ) ) ); - uitextline2 += ( vehicle->MoverParameters->FuelPump.is_active ? "F" : ( vehicle->MoverParameters->FuelPump.is_enabled ? "f" : "." ) ); - uitextline2 += ( vehicle->MoverParameters->OilPump.is_active ? "O" : ( vehicle->MoverParameters->OilPump.is_enabled ? "o" : "." ) ); - uitextline2 += ( false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : ( vehicle->MoverParameters->ConverterAllow ? ( vehicle->MoverParameters->ConverterFlag ? "X" : "x" ) : "." ) ); - uitextline2 += ( vehicle->MoverParameters->ConvOvldFlag ? "!" : "." ); - uitextline2 += ( vehicle->MoverParameters->CompressorFlag ? "C" : ( false == vehicle->MoverParameters->CompressorAllowLocal ? "-" : ( ( vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorStart == start_t::automatic ) ? "c" : "." ) ) ); - uitextline2 += ( vehicle->MoverParameters->CompressorGovernorLock ? "!" : "." ); - - auto const train { Global.pWorld->train() }; - if( ( train != nullptr ) && ( train->Dynamic() == vehicle ) ) { - uitextline2 += ( vehicle->MoverParameters->Radio ? " R: " : " r: " ) + std::to_string( train->RadioChannel() ); - } -/* + uitextline2 = (vehicle->MoverParameters->Battery ? "B" : "."); + uitextline2 += (vehicle->MoverParameters->Mains ? "M" : "."); + uitextline2 += (vehicle->MoverParameters->PantRearUp ? (vehicle->MoverParameters->PantRearVolt > 0.0 ? "O" : "o") : "."); + uitextline2 += (vehicle->MoverParameters->PantFrontUp ? (vehicle->MoverParameters->PantFrontVolt > 0.0 ? "P" : "p") : "."); + uitextline2 += (vehicle->MoverParameters->PantPressLockActive ? "!" : (vehicle->MoverParameters->PantPressSwitchActive ? "*" : ".")); uitextline2 += - " AnlgB: " + to_string( tmp->MoverParameters->AnPos, 1 ) - + "+" - + to_string( tmp->MoverParameters->LocalBrakePosA, 1 ) -*/ + (vehicle->MoverParameters->WaterPump.is_active ? "W" : (false == vehicle->MoverParameters->WaterPump.breaker ? "-" : (vehicle->MoverParameters->WaterPump.is_enabled ? "w" : "."))); + uitextline2 += (true == vehicle->MoverParameters->WaterHeater.is_damaged ? + "!" : + (vehicle->MoverParameters->WaterHeater.is_active ? + "H" : + (false == vehicle->MoverParameters->WaterHeater.breaker ? "-" : (vehicle->MoverParameters->WaterHeater.is_enabled ? "h" : ".")))); + uitextline2 += (vehicle->MoverParameters->FuelPump.is_active ? "F" : (vehicle->MoverParameters->FuelPump.is_enabled ? "f" : ".")); + uitextline2 += (vehicle->MoverParameters->OilPump.is_active ? "O" : (vehicle->MoverParameters->OilPump.is_enabled ? "o" : ".")); + uitextline2 += (false == vehicle->MoverParameters->ConverterAllowLocal ? "-" : (vehicle->MoverParameters->ConverterAllow ? (vehicle->MoverParameters->ConverterFlag ? "X" : "x") : ".")); + uitextline2 += (vehicle->MoverParameters->ConvOvldFlag ? "!" : "."); + uitextline2 += + (vehicle->MoverParameters->CompressorFlag ? "C" : + (false == vehicle->MoverParameters->CompressorAllowLocal ? + "-" : + ((vehicle->MoverParameters->CompressorAllow || vehicle->MoverParameters->CompressorStart == start_t::automatic) ? "c" : "."))); + uitextline2 += (vehicle->MoverParameters->CompressorGovernorLock ? "!" : "."); + + auto const train{Global.pWorld->train()}; + if ((train != nullptr) && (train->Dynamic() == vehicle)) + { + uitextline2 += (vehicle->MoverParameters->Radio ? " R: " : " r: ") + std::to_string(train->RadioChannel()); + } + /* + uitextline2 += + " AnlgB: " + to_string( tmp->MoverParameters->AnPos, 1 ) + + "+" + + to_string( tmp->MoverParameters->LocalBrakePosA, 1 ) + */ uitextline2 += " Bdelay: "; - if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_G ) == bdelay_G ) + if ((vehicle->MoverParameters->BrakeDelayFlag & bdelay_G) == bdelay_G) uitextline2 += "G"; - if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_P ) == bdelay_P ) + if ((vehicle->MoverParameters->BrakeDelayFlag & bdelay_P) == bdelay_P) uitextline2 += "P"; - if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_R ) == bdelay_R ) + if ((vehicle->MoverParameters->BrakeDelayFlag & bdelay_R) == bdelay_R) uitextline2 += "R"; - if( ( vehicle->MoverParameters->BrakeDelayFlag & bdelay_M ) == bdelay_M ) + if ((vehicle->MoverParameters->BrakeDelayFlag & bdelay_M) == bdelay_M) uitextline2 += "+Mg"; - uitextline2 += ", Load: " + to_string( vehicle->MoverParameters->Load, 0 ) + " (" + to_string( vehicle->MoverParameters->LoadFlag, 0 ) + ")"; + uitextline2 += ", Load: " + to_string(vehicle->MoverParameters->Load, 0) + " (" + to_string(vehicle->MoverParameters->LoadFlag, 0) + ")"; - uitextline2 += - "; Pant: " - + to_string( vehicle->MoverParameters->PantPress, 2 ) - + ( vehicle->MoverParameters->bPantKurek3 ? "-ZG" : "|ZG" ); + uitextline2 += "; Pant: " + to_string(vehicle->MoverParameters->PantPress, 2) + (vehicle->MoverParameters->bPantKurek3 ? "-ZG" : "|ZG"); - uitextline2 += - "; Ft: " + to_string( - vehicle->MoverParameters->Ft * 0.001f * ( - vehicle->MoverParameters->ActiveCab ? vehicle->MoverParameters->ActiveCab : - vehicle->ctOwner ? vehicle->ctOwner->Controlling()->ActiveCab : - 1 ), 1 ) - + ", Fb: " + to_string( vehicle->MoverParameters->Fb * 0.001f, 1 ) - + ", Fr: " + to_string( vehicle->MoverParameters->Adhesive( vehicle->MoverParameters->RunningTrack.friction ), 2 ) - + ( vehicle->MoverParameters->SlippingWheels ? " (!)" : "" ); + uitextline2 += "; Ft: " + + to_string(vehicle->MoverParameters->Ft * 0.001f * + (vehicle->MoverParameters->ActiveCab ? vehicle->MoverParameters->ActiveCab : vehicle->ctOwner ? vehicle->ctOwner->Controlling()->ActiveCab : 1), + 1) + + ", Fb: " + to_string(vehicle->MoverParameters->Fb * 0.001f, 1) + + ", Fr: " + to_string(vehicle->MoverParameters->Adhesive(vehicle->MoverParameters->RunningTrack.friction), 2) + (vehicle->MoverParameters->SlippingWheels ? " (!)" : ""); - if( vehicle->Mechanik ) { - uitextline2 += "; Ag: " + to_string( vehicle->Mechanik->fAccGravity, 2 ); + if (vehicle->Mechanik) + { + uitextline2 += "; Ag: " + to_string(vehicle->Mechanik->fAccGravity, 2); } - uitextline2 += - "; TC:" - + to_string( vehicle->MoverParameters->TotalCurrent, 0 ); + uitextline2 += "; TC:" + to_string(vehicle->MoverParameters->TotalCurrent, 0); auto const frontcouplerhighvoltage = - to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.voltage, 0 ) - + "@" - + to_string( vehicle->MoverParameters->Couplers[ side::front ].power_high.current, 0 ); + to_string(vehicle->MoverParameters->Couplers[side::front].power_high.voltage, 0) + "@" + to_string(vehicle->MoverParameters->Couplers[side::front].power_high.current, 0); auto const rearcouplerhighvoltage = - to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.voltage, 0 ) - + "@" - + to_string( vehicle->MoverParameters->Couplers[ side::rear ].power_high.current, 0 ); + to_string(vehicle->MoverParameters->Couplers[side::rear].power_high.voltage, 0) + "@" + to_string(vehicle->MoverParameters->Couplers[side::rear].power_high.current, 0); uitextline2 += ", HV: "; - if( vehicle->MoverParameters->Couplers[ side::front ].power_high.local == false ) { - uitextline2 += - "(" + frontcouplerhighvoltage + ")-" - + ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:" - + "-(" + rearcouplerhighvoltage + ")"; + if (vehicle->MoverParameters->Couplers[side::front].power_high.local == false) + { + uitextline2 += "(" + frontcouplerhighvoltage + ")-" + ":F" + (vehicle->DirectionGet() ? "<<" : ">>") + "R:" + "-(" + rearcouplerhighvoltage + ")"; } - else { - uitextline2 += - frontcouplerhighvoltage - + ":F" + ( vehicle->DirectionGet() ? "<<" : ">>" ) + "R:" - + rearcouplerhighvoltage; + else + { + uitextline2 += frontcouplerhighvoltage + ":F" + (vehicle->DirectionGet() ? "<<" : ">>") + "R:" + rearcouplerhighvoltage; } - uitextline3 += - "TrB: " + to_string( vehicle->MoverParameters->BrakePress, 2 ) - + ", " + to_hex_str( vehicle->MoverParameters->Hamulec->GetBrakeStatus(), 2 ); + uitextline3 += "TrB: " + to_string(vehicle->MoverParameters->BrakePress, 2) + ", " + to_hex_str(vehicle->MoverParameters->Hamulec->GetBrakeStatus(), 2); - uitextline3 += - "; LcB: " + to_string( vehicle->MoverParameters->LocBrakePress, 2 ) - + "; hat: " + to_string( vehicle->MoverParameters->BrakeCtrlPos2, 2 ) - + "; pipes: " + to_string( vehicle->MoverParameters->PipePress, 2 ) - + "/" + to_string( vehicle->MoverParameters->ScndPipePress, 2 ) - + "/" + to_string( vehicle->MoverParameters->EqvtPipePress, 2 ) - + ", MT: " + to_string( vehicle->MoverParameters->CompressedVolume, 3 ) - + ", BT: " + to_string( vehicle->MoverParameters->Volume, 3 ) - + ", CtlP: " + to_string( vehicle->MoverParameters->CntrlPipePress, 3 ) - + ", CtlT: " + to_string( vehicle->MoverParameters->Hamulec->GetCRP(), 3 ); + uitextline3 += "; LcB: " + to_string(vehicle->MoverParameters->LocBrakePress, 2) + "; hat: " + to_string(vehicle->MoverParameters->BrakeCtrlPos2, 2) + + "; pipes: " + to_string(vehicle->MoverParameters->PipePress, 2) + "/" + to_string(vehicle->MoverParameters->ScndPipePress, 2) + "/" + + to_string(vehicle->MoverParameters->EqvtPipePress, 2) + ", MT: " + to_string(vehicle->MoverParameters->CompressedVolume, 3) + + ", BT: " + to_string(vehicle->MoverParameters->Volume, 3) + ", CtlP: " + to_string(vehicle->MoverParameters->CntrlPipePress, 3) + + ", CtlT: " + to_string(vehicle->MoverParameters->Hamulec->GetCRP(), 3); - if( vehicle->MoverParameters->ManualBrakePos > 0 ) { + if (vehicle->MoverParameters->ManualBrakePos > 0) + { uitextline3 += "; manual brake on"; } -/* - if( tmp->MoverParameters->LocalBrakePos > 0 ) { + /* + if( tmp->MoverParameters->LocalBrakePos > 0 ) { - uitextline3 += ", local brake on"; - } - else { + uitextline3 += ", local brake on"; + } + else { - uitextline3 += ", local brake off"; - } -*/ - if( vehicle->Mechanik ) { + uitextline3 += ", local brake off"; + } + */ + if (vehicle->Mechanik) + { // o ile jest ktoś w środku std::string flags = "cpapcplhhndoiefgvdpseil "; // flagi AI (definicja w Driver.h) - for( int i = 0, j = 1; i < 23; ++i, j <<= 1 ) - if( false == ( vehicle->Mechanik->DrivigFlags() & j ) ) // jak bit ustawiony - flags[ i ] = '.';// std::toupper( flags[ i ] ); // ^= 0x20; // to zmiana na wielką literę + for (int i = 0, j = 1; i < 23; ++i, j <<= 1) + if (false == (vehicle->Mechanik->DrivigFlags() & j)) // jak bit ustawiony + flags[i] = '.'; // std::toupper( flags[ i ] ); // ^= 0x20; // to zmiana na wielką literę uitextline4 = flags; - uitextline4 += - "Driver: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 ) - + " Ad=" + to_string( vehicle->Mechanik->AccDesired, 2 ) - + " Ah=" + to_string( vehicle->Mechanik->fAccThreshold, 2 ) - + "@" + to_string( vehicle->Mechanik->fBrake_a0[ 0 ], 2 ) - + "+" + to_string( vehicle->Mechanik->fBrake_a1[ 0 ], 2 ) - + " Bd=" + to_string( vehicle->Mechanik->fBrakeDist, 0 ) - + " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 ) - + " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 ) - + " VSl=" + to_string( vehicle->Mechanik->VelSignalLast, 0 ) - + " VLl=" + to_string( vehicle->Mechanik->VelLimitLast, 0 ) - + " VRd=" + to_string( vehicle->Mechanik->VelRoad, 0 ) - + " VRst=" + to_string( vehicle->Mechanik->VelRestricted, 0 ); + uitextline4 += "Driver: Vd=" + to_string(vehicle->Mechanik->VelDesired, 0) + " Ad=" + to_string(vehicle->Mechanik->AccDesired, 2) + + " Ah=" + to_string(vehicle->Mechanik->fAccThreshold, 2) + "@" + to_string(vehicle->Mechanik->fBrake_a0[0], 2) + "+" + to_string(vehicle->Mechanik->fBrake_a1[0], 2) + + " Bd=" + to_string(vehicle->Mechanik->fBrakeDist, 0) + " Pd=" + to_string(vehicle->Mechanik->ActualProximityDist, 0) + + " Vn=" + to_string(vehicle->Mechanik->VelNext, 0) + " VSl=" + to_string(vehicle->Mechanik->VelSignalLast, 0) + " VLl=" + to_string(vehicle->Mechanik->VelLimitLast, 0) + + " VRd=" + to_string(vehicle->Mechanik->VelRoad, 0) + " VRst=" + to_string(vehicle->Mechanik->VelRestricted, 0); - if( ( vehicle->Mechanik->VelNext == 0.0 ) - && ( vehicle->Mechanik->eSignNext ) ) { + if ((vehicle->Mechanik->VelNext == 0.0) && (vehicle->Mechanik->eSignNext)) + { // jeśli ma zapamiętany event semafora, nazwa eventu semafora - uitextline4 += " (" + ( vehicle->Mechanik->eSignNext->asName ) + ")"; + uitextline4 += " (" + (vehicle->Mechanik->eSignNext->asName) + ")"; } // biezaca komenda dla AI @@ -605,17 +586,22 @@ ui_layer::render() { if (scantable) { // f2 screen, track scan mode - if( vehicle->Mechanik) + if (vehicle->Mechanik) { ImGui::SetNextWindowSize(ImVec2(0, 0)); ImGui::Begin("Scan table", &scantable, ImGuiWindowFlags_NoResize); - std::size_t i = 0; std::size_t const speedtablesize = clamp( static_cast( vehicle->Mechanik->TableSize() ) - 1, 0, 30 ); - do { - std::string scanline = vehicle->Mechanik->TableText( i ); - if( scanline.empty() ) { break; } + std::size_t i = 0; + std::size_t const speedtablesize = clamp(static_cast(vehicle->Mechanik->TableSize()) - 1, 0, 30); + do + { + std::string scanline = vehicle->Mechanik->TableText(i); + if (scanline.empty()) + { + break; + } ImGui::TextUnformatted(scanline.c_str()); ++i; - } while( i < speedtablesize ); // TController:iSpeedTableSize TODO: change when the table gets recoded + } while (i < speedtablesize); // TController:iSpeedTableSize TODO: change when the table gets recoded ImGui::End(); } } @@ -626,21 +612,18 @@ ui_layer::render() { ImGui::TextUnformatted(uitextline4.c_str()); ImGui::Checkbox("Show scan table", &scantable); } - else { + else + { // wyświetlenie współrzędnych w scenerii oraz kąta kamery, gdy nie mamy wskaźnika - uitextline1 = - "Camera position: " - + to_string( camera->Pos.x, 2 ) + " " - + to_string( camera->Pos.y, 2 ) + " " - + to_string( camera->Pos.z, 2 ) - + ", azimuth: " - + to_string( 180.0 - glm::degrees( camera->Yaw ), 0 ) // ma być azymut, czyli 0 na północy i rośnie na wschód - + " " - + std::string( "S SEE NEN NWW SW" ) - .substr( 0 + 2 * floor( fmod( 8 + ( camera->Yaw + 0.5 * M_PI_4 ) / M_PI_4, 8 ) ), 2 ); + uitextline1 = "Camera position: " + to_string(camera->Pos.x, 2) + " " + to_string(camera->Pos.y, 2) + " " + to_string(camera->Pos.z, 2) + + ", azimuth: " + to_string(180.0 - glm::degrees(camera->Yaw), 0) // ma być azymut, czyli 0 na północy i rośnie na wschód + + " " + std::string("S SEE NEN NWW SW").substr(0 + 2 * floor(fmod(8 + (camera->Yaw + 0.5 * M_PI_4) / M_PI_4, 8)), 2); // current luminance level - uitextline2 = "Light level: " + to_string( Global.fLuminance, 3 ); - if( Global.FakeLight ) { uitextline2 += "(*)"; } + uitextline2 = "Light level: " + to_string(Global.fLuminance, 3); + if (Global.FakeLight) + { + uitextline2 += "(*)"; + } ImGui::TextUnformatted(uitextline1.c_str()); ImGui::TextUnformatted(uitextline2.c_str()); @@ -653,22 +636,20 @@ ui_layer::render() { ImGui::SetNextWindowSize(ImVec2(0, 0)); ImGui::Begin("Renderer stats", &renderer_debug_active, ImGuiWindowFlags_NoResize); // gfx renderer data - uitextline1 = - "FoV: " + to_string( Global.FieldOfView / Global.ZoomFactor, 1 ) - + ", Draw range x " + to_string( Global.fDistanceFactor, 1 ) -// + "; sectors: " + std::to_string( GfxRenderer.m_drawcount ) -// + ", FPS: " + to_string( Timer::GetFPS(), 2 ); - + ", FPS: " + std::to_string( static_cast(std::round(GfxRenderer.Framerate())) ); - if( Global.iSlowMotion ) { - uitextline1 += " (slowmotion " + to_string( Global.iSlowMotion ) + ")"; + uitextline1 = "FoV: " + to_string(Global.FieldOfView / Global.ZoomFactor, 1) + ", Draw range x " + + to_string(Global.fDistanceFactor, 1) + // + "; sectors: " + std::to_string( GfxRenderer.m_drawcount ) + // + ", FPS: " + to_string( Timer::GetFPS(), 2 ); + + ", FPS: " + std::to_string(static_cast(std::round(GfxRenderer.Framerate()))); + if (Global.iSlowMotion) + { + uitextline1 += " (slowmotion " + to_string(Global.iSlowMotion) + ")"; } - uitextline2 = - std::string( "Rendering mode: VBO" ); - if( false == Global.LastGLError.empty() ) { - uitextline2 += - "Last openGL error: " - + Global.LastGLError; + uitextline2 = std::string("Rendering mode: VBO"); + if (false == Global.LastGLError.empty()) + { + uitextline2 += "Last openGL error: " + Global.LastGLError; } // renderer stats uitextline3 = GfxRenderer.info_times(); @@ -688,12 +669,11 @@ ui_layer::render() { // informacja o wersji uitextline1 = "MaSzyna " + Global.asVersion; // informacja o wersji - if( Global.iMultiplayer ) { + if (Global.iMultiplayer) + { uitextline1 += " (multiplayer mode is active)"; } - uitextline3 = - "vehicles: " + to_string( Timer::subsystem.sim_dynamics.average(), 2 ) + " msec" - + " update total: " + to_string( Timer::subsystem.sim_total.average(), 2 ) + " msec"; + uitextline3 = "vehicles: " + to_string(Timer::subsystem.sim_dynamics.average(), 2) + " msec" + " update total: " + to_string(Timer::subsystem.sim_total.average(), 2) + " msec"; ImGui::TextUnformatted(uitextline1.c_str()); ImGui::TextUnformatted(uitextline3.c_str()); @@ -720,129 +700,122 @@ ui_layer::render() { uitextline3 = ""; uitextline4 = ""; - auto const *node { scene::Editor.node() }; + auto const *node{scene::Editor.node()}; - if( node == nullptr ) { - auto const mouseposition { Global.pCamera->Pos + GfxRenderer.Mouse_Position() }; - uitextline1 = "mouse location: [" + to_string( mouseposition.x, 2 ) + ", " + to_string( mouseposition.y, 2 ) + ", " + to_string( mouseposition.z, 2 ) + "]"; + if (node == nullptr) + { + auto const mouseposition{Global.pCamera->Pos + GfxRenderer.Mouse_Position()}; + uitextline1 = "mouse location: [" + to_string(mouseposition.x, 2) + ", " + to_string(mouseposition.y, 2) + ", " + to_string(mouseposition.z, 2) + "]"; } else { - uitextline1 = - "node name: " + node->name() - + "; location: [" + to_string( node->location().x, 2 ) + ", " + to_string( node->location().y, 2 ) + ", " + to_string( node->location().z, 2 ) + "]" - + " (distance: " + to_string( glm::length( glm::dvec3{ node->location().x, 0.0, node->location().z } -glm::dvec3{ Global.pCameraPosition.x, 0.0, Global.pCameraPosition.z } ), 1 ) + " m)"; + uitextline1 = "node name: " + node->name() + "; location: [" + to_string(node->location().x, 2) + ", " + to_string(node->location().y, 2) + ", " + to_string(node->location().z, 2) + "]" + + " (distance: " + to_string(glm::length(glm::dvec3{node->location().x, 0.0, node->location().z} - glm::dvec3{Global.pCameraPosition.x, 0.0, Global.pCameraPosition.z}), 1) + + " m)"; // subclass-specific data // TBD, TODO: specialized data dump method in each node subclass, or data imports in the panel for provided subclass pointer? - if( typeid( *node ) == typeid( TAnimModel ) ) { + if (typeid(*node) == typeid(TAnimModel)) + { - auto const *subnode = static_cast( node ); + auto const *subnode = static_cast(node); - uitextline2 = "angle: " + to_string( clamp_circular( subnode->vAngle.y, 360.f ), 2 ) + " deg"; + uitextline2 = "angle: " + to_string(clamp_circular(subnode->vAngle.y, 360.f), 2) + " deg"; uitextline2 += "; lights: "; - if( subnode->iNumLights > 0 ) { + if (subnode->iNumLights > 0) + { uitextline2 += '['; - for( int lightidx = 0; lightidx < subnode->iNumLights; ++lightidx ) { - uitextline2 += to_string( subnode->lsLights[ lightidx ] ); - if( lightidx < subnode->iNumLights - 1 ) { + for (int lightidx = 0; lightidx < subnode->iNumLights; ++lightidx) + { + uitextline2 += to_string(subnode->lsLights[lightidx]); + if (lightidx < subnode->iNumLights - 1) + { uitextline2 += ", "; } } uitextline2 += ']'; } - else { + else + { uitextline2 += "none"; } - // 3d shape - auto modelfile { ( - subnode->pModel ? - subnode->pModel->NameGet() : - "none" ) }; - if( modelfile.find( szModelPath ) == 0 ) { + // 3d shape + auto modelfile{(subnode->pModel ? subnode->pModel->NameGet() : "none")}; + if (modelfile.find(szModelPath) == 0) + { // don't include 'models/' in the path - modelfile.erase( 0, std::string{ szModelPath }.size() ); + modelfile.erase(0, std::string{szModelPath}.size()); } // texture - auto texturefile { ( - subnode->Material()->replacable_skins[ 1 ] != null_handle ? - GfxRenderer.Material( subnode->Material()->replacable_skins[ 1 ] ).name : - "none" ) }; - if( texturefile.find( szTexturePath ) == 0 ) { + auto texturefile{(subnode->Material()->replacable_skins[1] != null_handle ? GfxRenderer.Material(subnode->Material()->replacable_skins[1]).name : "none")}; + if (texturefile.find(szTexturePath) == 0) + { // don't include 'textures/' in the path - texturefile.erase( 0, std::string{ szTexturePath }.size() ); + texturefile.erase(0, std::string{szTexturePath}.size()); } uitextline3 = "mesh: " + modelfile; uitextline4 = "skin: " + texturefile; } - else if( typeid( *node ) == typeid( TTrack ) ) { + else if (typeid(*node) == typeid(TTrack)) + { - auto const *subnode = static_cast( node ); + auto const *subnode = static_cast(node); // basic attributes - uitextline2 = - "isolated: " + ( subnode->pIsolated ? subnode->pIsolated->asName : "none" ) - + "; velocity: " + to_string( subnode->SwitchExtension ? subnode->SwitchExtension->fVelocity : subnode->fVelocity ) - + "; width: " + to_string( subnode->fTrackWidth ) + " m" - + "; friction: " + to_string( subnode->fFriction, 2 ) - + "; quality: " + to_string( subnode->iQualityFlag ); + uitextline2 = "isolated: " + (subnode->pIsolated ? subnode->pIsolated->asName : "none") + + "; velocity: " + to_string(subnode->SwitchExtension ? subnode->SwitchExtension->fVelocity : subnode->fVelocity) + "; width: " + to_string(subnode->fTrackWidth) + " m" + + "; friction: " + to_string(subnode->fFriction, 2) + "; quality: " + to_string(subnode->iQualityFlag); // textures - auto texturefile { ( - subnode->m_material1 != null_handle ? - GfxRenderer.Material( subnode->m_material1 ).name : - "none" ) }; - if( texturefile.find( szTexturePath ) == 0 ) { - texturefile.erase( 0, std::string{ szTexturePath }.size() ); + auto texturefile{(subnode->m_material1 != null_handle ? GfxRenderer.Material(subnode->m_material1).name : "none")}; + if (texturefile.find(szTexturePath) == 0) + { + texturefile.erase(0, std::string{szTexturePath}.size()); } - auto texturefile2{ ( - subnode->m_material2 != null_handle ? - GfxRenderer.Material( subnode->m_material2 ).name : - "none" ) }; - if( texturefile2.find( szTexturePath ) == 0 ) { - texturefile2.erase( 0, std::string{ szTexturePath }.size() ); + auto texturefile2{(subnode->m_material2 != null_handle ? GfxRenderer.Material(subnode->m_material2).name : "none")}; + if (texturefile2.find(szTexturePath) == 0) + { + texturefile2.erase(0, std::string{szTexturePath}.size()); } uitextline2 += "; skins: [" + texturefile + ", " + texturefile2 + "]"; // paths uitextline3 = "paths: "; - for( auto const &path : subnode->m_paths ) { - uitextline3 += - "[" - + to_string( path.points[ segment_data::point::start ].x, 3 ) + ", " - + to_string( path.points[ segment_data::point::start ].y, 3 ) + ", " - + to_string( path.points[ segment_data::point::start ].z, 3 ) + "]->" - + "[" - + to_string( path.points[ segment_data::point::end ].x, 3 ) + ", " - + to_string( path.points[ segment_data::point::end ].y, 3 ) + ", " - + to_string( path.points[ segment_data::point::end ].z, 3 ) + "] "; + for (auto const &path : subnode->m_paths) + { + uitextline3 += "[" + to_string(path.points[segment_data::point::start].x, 3) + ", " + to_string(path.points[segment_data::point::start].y, 3) + ", " + + to_string(path.points[segment_data::point::start].z, 3) + "]->" + "[" + to_string(path.points[segment_data::point::end].x, 3) + ", " + + to_string(path.points[segment_data::point::end].y, 3) + ", " + to_string(path.points[segment_data::point::end].z, 3) + "] "; } // events - std::vector< std::pair< std::string, TTrack::event_sequence const * > > const eventsequences { - { "ev0", &subnode->m_events0 }, { "ev0all", &subnode->m_events0all }, - { "ev1", &subnode->m_events1 }, { "ev1all", &subnode->m_events1all }, - { "ev2", &subnode->m_events2 }, { "ev2all", &subnode->m_events2all } }; + std::vector> const eventsequences{{"ev0", &subnode->m_events0}, {"ev0all", &subnode->m_events0all}, + {"ev1", &subnode->m_events1}, {"ev1all", &subnode->m_events1all}, + {"ev2", &subnode->m_events2}, {"ev2all", &subnode->m_events2all}}; - for( auto const &eventsequence : eventsequences ) { - if( eventsequence.second->empty() ) { continue; } + for (auto const &eventsequence : eventsequences) + { + if (eventsequence.second->empty()) + { + continue; + } uitextline4 += eventsequence.first + ": ["; - for( auto const &event : *( eventsequence.second ) ) { - if( uitextline4.back() != '[' ) { + for (auto const &event : *(eventsequence.second)) + { + if (uitextline4.back() != '[') + { uitextline4 += ", "; } - if( event.second ) { + if (event.second) + { uitextline4 += event.second->asName; } } uitextline4 += "] "; } - } - else if( typeid( *node ) == typeid( TMemCell ) ) { + else if (typeid(*node) == typeid(TMemCell)) + { - auto const *subnode = static_cast( node ); + auto const *subnode = static_cast(node); - uitextline2 = - "data: [" + subnode->Text() + "]" - + " [" + to_string( subnode->Value1(), 2 ) + "]" - + " [" + to_string( subnode->Value2(), 2 ) + "]"; - uitextline3 = "track: " + ( subnode->asTrackName.empty() ? "none" : subnode->asTrackName ); + uitextline2 = "data: [" + subnode->Text() + "]" + " [" + to_string(subnode->Value1(), 2) + "]" + " [" + to_string(subnode->Value2(), 2) + "]"; + uitextline3 = "track: " + (subnode->asTrackName.empty() ? "none" : subnode->asTrackName); } } ImGui::SetNextWindowSize(ImVec2(0, 0)); @@ -859,21 +832,19 @@ ui_layer::render() { ImGui::SetNextWindowSize(ImVec2(0, 0)); ImGui::Begin("Events", &events_active, ImGuiWindowFlags_NoResize); - auto const time { Timer::GetTime() }; - auto const *event { simulation::Events.begin() }; + auto const time{Timer::GetTime()}; + auto const *event{simulation::Events.begin()}; - auto eventtableindex{ 0 }; - while( ( event != nullptr )) { + auto eventtableindex{0}; + while ((event != nullptr)) + { - if( ( false == event->m_ignored ) - && ( true == event->bEnabled ) ) { + if ((false == event->m_ignored) && (true == event->bEnabled)) + { - auto const delay { " " + to_string( std::max( 0.0, event->fStartTime - time ), 1 ) }; - auto const eventline = - "Delay: " + delay.substr( delay.length() - 6 ) - + ", Event: " + event->asName - + ( event->Activator ? " (by: " + event->Activator->asName + ")" : "" ) - + ( event->evJoined ? " (joint event)" : "" ); + auto const delay{" " + to_string(std::max(0.0, event->fStartTime - time), 1)}; + auto const eventline = "Delay: " + delay.substr(delay.length() - 6) + ", Event: " + event->asName + (event->Activator ? " (by: " + event->Activator->asName + ")" : "") + + (event->evJoined ? " (joint event)" : ""); ImGui::TextUnformatted(eventline.c_str()); ++eventtableindex; @@ -884,150 +855,151 @@ ui_layer::render() { ImGui::End(); } - auto *vehicle { - ( FreeFlyModeFlag ? - std::get( simulation::Region->find_vehicle( camera->Pos, 20, false, false ) ) : - controlled ) }; // w trybie latania lokalizujemy wg mapy + auto *vehicle{(FreeFlyModeFlag ? std::get(simulation::Region->find_vehicle(camera->Pos, 20, false, false)) : controlled)}; // w trybie latania lokalizujemy wg mapy - if( DebugModeFlag && vehicle) + if (DebugModeFlag && vehicle) { - uitextline1 = - "vel: " + to_string( vehicle->GetVelocity(), 2 ) + "/" + to_string( vehicle->MoverParameters->nrot* M_PI * vehicle->MoverParameters->WheelDiameter * 3.6, 2 ) - + " km/h;" + ( vehicle->MoverParameters->SlippingWheels ? " (!)" : " " ) - + " dist: " + to_string( vehicle->MoverParameters->DistCounter, 2 ) + " km" - + "; pos: [" + to_string( vehicle->GetPosition().x, 2 ) + ", " + to_string( vehicle->GetPosition().y, 2 ) + ", " + to_string( vehicle->GetPosition().z, 2 ) + "]" - + ", PM=" + to_string( vehicle->MoverParameters->WheelFlat, 1 ) - + " mm; enpwr=" + to_string( vehicle->MoverParameters->EnginePower, 1 ) - + "; enrot=" + to_string( vehicle->MoverParameters->enrot * 60, 0 ) - + " tmrot=" + to_string( std::abs( vehicle->MoverParameters->nrot ) * vehicle->MoverParameters->Transmision.Ratio * 60, 0 ) - + "; ventrot=" + to_string( vehicle->MoverParameters->RventRot * 60, 1 ) - + "; fanrot=" + to_string( vehicle->MoverParameters->dizel_heat.rpmw, 1 ) + ", " + to_string( vehicle->MoverParameters->dizel_heat.rpmw2, 1 ); + uitextline1 = "vel: " + to_string(vehicle->GetVelocity(), 2) + "/" + to_string(vehicle->MoverParameters->nrot * M_PI * vehicle->MoverParameters->WheelDiameter * 3.6, 2) + " km/h;" + + (vehicle->MoverParameters->SlippingWheels ? " (!)" : " ") + " dist: " + to_string(vehicle->MoverParameters->DistCounter, 2) + " km" + "; pos: [" + + to_string(vehicle->GetPosition().x, 2) + ", " + to_string(vehicle->GetPosition().y, 2) + ", " + to_string(vehicle->GetPosition().z, 2) + "]" + + ", PM=" + to_string(vehicle->MoverParameters->WheelFlat, 1) + " mm; enpwr=" + to_string(vehicle->MoverParameters->EnginePower, 1) + + "; enrot=" + to_string(vehicle->MoverParameters->enrot * 60, 0) + + " tmrot=" + to_string(std::abs(vehicle->MoverParameters->nrot) * vehicle->MoverParameters->Transmision.Ratio * 60, 0) + + "; ventrot=" + to_string(vehicle->MoverParameters->RventRot * 60, 1) + "; fanrot=" + to_string(vehicle->MoverParameters->dizel_heat.rpmw, 1) + ", " + + to_string(vehicle->MoverParameters->dizel_heat.rpmw2, 1); - uitextline2 = - "HamZ=" + to_string( vehicle->MoverParameters->fBrakeCtrlPos, 2 ) - + "; HamP=" + std::to_string( vehicle->MoverParameters->LocalBrakePosA ) - + "; NasJ=" + std::to_string( vehicle->MoverParameters->MainCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->MainCtrlActualPos ) + ")" - + ( ( vehicle->MoverParameters->ShuntMode && vehicle->MoverParameters->EngineType == TEngineType::DieselElectric ) ? - "; NasB=" + to_string( vehicle->MoverParameters->AnPos, 2 ) : - "; NasB=" + std::to_string( vehicle->MoverParameters->ScndCtrlPos ) + "(" + std::to_string( vehicle->MoverParameters->ScndCtrlActualPos ) + ")" ) - + "; I=" + - ( vehicle->MoverParameters->TrainType == dt_EZT ? - std::to_string( int( vehicle->MoverParameters->ShowCurrent( 0 ) ) ) : - std::to_string( int( vehicle->MoverParameters->Im ) ) ) - + "; U=" + to_string( int( vehicle->MoverParameters->RunningTraction.TractionVoltage + 0.5 ) ) - + "; R=" + - ( std::abs( vehicle->MoverParameters->RunningShape.R ) > 10000.0 ? - "~0.0" : - to_string( vehicle->MoverParameters->RunningShape.R, 1 ) ) - + " An=" + to_string( vehicle->MoverParameters->AccN, 2 ); // przyspieszenie poprzeczne + uitextline2 = "HamZ=" + to_string(vehicle->MoverParameters->fBrakeCtrlPos, 2) + "; HamP=" + std::to_string(vehicle->MoverParameters->LocalBrakePosA) + + "; NasJ=" + std::to_string(vehicle->MoverParameters->MainCtrlPos) + "(" + std::to_string(vehicle->MoverParameters->MainCtrlActualPos) + ")" + + ((vehicle->MoverParameters->ShuntMode && vehicle->MoverParameters->EngineType == TEngineType::DieselElectric) ? + "; NasB=" + to_string(vehicle->MoverParameters->AnPos, 2) : + "; NasB=" + std::to_string(vehicle->MoverParameters->ScndCtrlPos) + "(" + std::to_string(vehicle->MoverParameters->ScndCtrlActualPos) + ")") + + "; I=" + (vehicle->MoverParameters->TrainType == dt_EZT ? std::to_string(int(vehicle->MoverParameters->ShowCurrent(0))) : std::to_string(int(vehicle->MoverParameters->Im))) + + "; U=" + to_string(int(vehicle->MoverParameters->RunningTraction.TractionVoltage + 0.5)) + + "; R=" + (std::abs(vehicle->MoverParameters->RunningShape.R) > 10000.0 ? "~0.0" : to_string(vehicle->MoverParameters->RunningShape.R, 1)) + + " An=" + to_string(vehicle->MoverParameters->AccN, 2); // przyspieszenie poprzeczne - if( tprev != simulation::Time.data().wSecond ) { + if (tprev != simulation::Time.data().wSecond) + { tprev = simulation::Time.data().wSecond; - Acc = ( vehicle->MoverParameters->Vel - VelPrev ) / 3.6; + Acc = (vehicle->MoverParameters->Vel - VelPrev) / 3.6; VelPrev = vehicle->MoverParameters->Vel; } - uitextline2 += "; As=" + to_string( Acc, 2 ); // przyspieszenie wzdłużne -/* - uitextline2 += " eAngle=" + to_string( std::cos( vehicle->MoverParameters->eAngle ), 2 ); -*/ - uitextline2 += "; oilP=" + to_string( vehicle->MoverParameters->OilPump.pressure_present, 3 ); - uitextline2 += " oilT=" + to_string( vehicle->MoverParameters->dizel_heat.To, 2 ); - uitextline2 += "; waterT=" + to_string( vehicle->MoverParameters->dizel_heat.temperatura1, 2 ); - uitextline2 += ( vehicle->MoverParameters->WaterCircuitsLink ? "-" : "|" ); - uitextline2 += to_string( vehicle->MoverParameters->dizel_heat.temperatura2, 2 ); - uitextline2 += "; engineT=" + to_string( vehicle->MoverParameters->dizel_heat.Ts, 2 ); + uitextline2 += "; As=" + to_string(Acc, 2); // przyspieszenie wzdłużne + /* + uitextline2 += " eAngle=" + to_string( std::cos( vehicle->MoverParameters->eAngle ), 2 ); + */ + uitextline2 += "; oilP=" + to_string(vehicle->MoverParameters->OilPump.pressure_present, 3); + uitextline2 += " oilT=" + to_string(vehicle->MoverParameters->dizel_heat.To, 2); + uitextline2 += "; waterT=" + to_string(vehicle->MoverParameters->dizel_heat.temperatura1, 2); + uitextline2 += (vehicle->MoverParameters->WaterCircuitsLink ? "-" : "|"); + uitextline2 += to_string(vehicle->MoverParameters->dizel_heat.temperatura2, 2); + uitextline2 += "; engineT=" + to_string(vehicle->MoverParameters->dizel_heat.Ts, 2); - uitextline3 = - "cyl.ham. " + to_string( vehicle->MoverParameters->BrakePress, 2 ) - + "; prz.gl. " + to_string( vehicle->MoverParameters->PipePress, 2 ) - + "; zb.gl. " + to_string( vehicle->MoverParameters->CompressedVolume, 2 ) - // youBy - drugi wezyk - + "; p.zas. " + to_string( vehicle->MoverParameters->ScndPipePress, 2 ); + uitextline3 = "cyl.ham. " + to_string(vehicle->MoverParameters->BrakePress, 2) + "; prz.gl. " + to_string(vehicle->MoverParameters->PipePress, 2) + "; zb.gl. " + + to_string(vehicle->MoverParameters->CompressedVolume, 2) + // youBy - drugi wezyk + + "; p.zas. " + to_string(vehicle->MoverParameters->ScndPipePress, 2); // McZapkie: warto wiedziec w jakim stanie sa przelaczniki - if( vehicle->MoverParameters->ConvOvldFlag ) + if (vehicle->MoverParameters->ConvOvldFlag) uitextline3 += " C! "; - else if( vehicle->MoverParameters->FuseFlag ) + else if (vehicle->MoverParameters->FuseFlag) uitextline3 += " F! "; - else if( !vehicle->MoverParameters->Mains ) + else if (!vehicle->MoverParameters->Mains) uitextline3 += " () "; - else { - switch( - vehicle->MoverParameters->ActiveDir * - ( vehicle->MoverParameters->Imin == vehicle->MoverParameters->IminLo ? - 1 : - 2 ) ) { - case 2: { uitextline3 += " >> "; break; } - case 1: { uitextline3 += " -> "; break; } - case 0: { uitextline3 += " -- "; break; } - case -1: { uitextline3 += " <- "; break; } - case -2: { uitextline3 += " << "; break; } + else + { + switch (vehicle->MoverParameters->ActiveDir * (vehicle->MoverParameters->Imin == vehicle->MoverParameters->IminLo ? 1 : 2)) + { + case 2: + { + uitextline3 += " >> "; + break; + } + case 1: + { + uitextline3 += " -> "; + break; + } + case 0: + { + uitextline3 += " -- "; + break; + } + case -1: + { + uitextline3 += " <- "; + break; + } + case -2: + { + uitextline3 += " << "; + break; + } } } // McZapkie: predkosc szlakowa - if( vehicle->MoverParameters->RunningTrack.Velmax == -1 ) { + if (vehicle->MoverParameters->RunningTrack.Velmax == -1) + { uitextline3 += " Vtrack=Vmax"; } - else { - uitextline3 += " Vtrack " + to_string( vehicle->MoverParameters->RunningTrack.Velmax, 2 ); + else + { + uitextline3 += " Vtrack " + to_string(vehicle->MoverParameters->RunningTrack.Velmax, 2); } - if( ( vehicle->MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) - || ( vehicle->MoverParameters->TrainType == dt_EZT ) ) { - uitextline3 += - "; pant. " + to_string( vehicle->MoverParameters->PantPress, 2 ) - + ( vehicle->MoverParameters->bPantKurek3 ? "=" : "^" ) + "ZG"; + if ((vehicle->MoverParameters->EnginePowerSource.SourceType == TPowerSource::CurrentCollector) || (vehicle->MoverParameters->TrainType == dt_EZT)) + { + uitextline3 += "; pant. " + to_string(vehicle->MoverParameters->PantPress, 2) + (vehicle->MoverParameters->bPantKurek3 ? "=" : "^") + "ZG"; } uitextline4 = ""; // McZapkie: komenda i jej parametry - if( vehicle->MoverParameters->CommandIn.Command != ( "" ) ) { - uitextline4 = - "C:" + vehicle->MoverParameters->CommandIn.Command - + " V1=" + to_string( vehicle->MoverParameters->CommandIn.Value1, 0 ) - + " V2=" + to_string( vehicle->MoverParameters->CommandIn.Value2, 0 ); + if (vehicle->MoverParameters->CommandIn.Command != ("")) + { + uitextline4 = "C:" + vehicle->MoverParameters->CommandIn.Command + " V1=" + to_string(vehicle->MoverParameters->CommandIn.Value1, 0) + + " V2=" + to_string(vehicle->MoverParameters->CommandIn.Value2, 0); } - if( ( vehicle->Mechanik ) - && ( vehicle->Mechanik->AIControllFlag == AIdriver ) ) { - uitextline4 += - "AI: Vd=" + to_string( vehicle->Mechanik->VelDesired, 0 ) - + " ad=" + to_string(vehicle->Mechanik->AccDesired, 2) - + "/" + to_string(vehicle->Mechanik->AccDesired*vehicle->Mechanik->BrakeAccFactor(), 2) - + " atrain=" + to_string(vehicle->Mechanik->fBrake_a0[0], 2) - + "+" + to_string(vehicle->Mechanik->fBrake_a1[0], 2) - + " aS=" + to_string(vehicle->Mechanik->AbsAccS_pub, 2) - + " Pd=" + to_string( vehicle->Mechanik->ActualProximityDist, 0 ) - + " Vn=" + to_string( vehicle->Mechanik->VelNext, 0 ); + if ((vehicle->Mechanik) && (vehicle->Mechanik->AIControllFlag == AIdriver)) + { + uitextline4 += "AI: Vd=" + to_string(vehicle->Mechanik->VelDesired, 0) + " ad=" + to_string(vehicle->Mechanik->AccDesired, 2) + "/" + + to_string(vehicle->Mechanik->AccDesired * vehicle->Mechanik->BrakeAccFactor(), 2) + " atrain=" + to_string(vehicle->Mechanik->fBrake_a0[0], 2) + "+" + + to_string(vehicle->Mechanik->fBrake_a1[0], 2) + " aS=" + to_string(vehicle->Mechanik->AbsAccS_pub, 2) + " Pd=" + to_string(vehicle->Mechanik->ActualProximityDist, 0) + + " Vn=" + to_string(vehicle->Mechanik->VelNext, 0); } std::list table; // induction motor data - if( vehicle->MoverParameters->EngineType == TEngineType::ElectricInductionMotor ) { + if (vehicle->MoverParameters->EngineType == TEngineType::ElectricInductionMotor) + { - table.emplace_back( " eimc: eimv: press:" ); - for( int i = 0; i <= 20; ++i ) { + table.emplace_back(" eimc: eimv: press:"); + for (int i = 0; i <= 20; ++i) + { - std::string parameters = - vehicle->MoverParameters->eimc_labels[ i ] + to_string( vehicle->MoverParameters->eimc[ i ], 2, 9 ) - + " | " - + vehicle->MoverParameters->eimv_labels[ i ] + to_string( vehicle->MoverParameters->eimv[ i ], 2, 9 ); + std::string parameters = vehicle->MoverParameters->eimc_labels[i] + to_string(vehicle->MoverParameters->eimc[i], 2, 9) + " | " + vehicle->MoverParameters->eimv_labels[i] + + to_string(vehicle->MoverParameters->eimv[i], 2, 9); - if( i < 10 ) { - parameters += " | " + train->fPress_labels[i] + to_string( train->fPress[ i ][ 0 ], 2, 9 ); + if (i < 10) + { + parameters += " | " + train->fPress_labels[i] + to_string(train->fPress[i][0], 2, 9); } - else if( i == 12 ) { + else if (i == 12) + { parameters += " med:"; } - else if( i >= 13 ) { - parameters += " | " + vehicle->MED_labels[ i - 13 ] + to_string( vehicle->MED[ 0 ][ i - 13 ], 2, 9 ); + else if (i >= 13) + { + parameters += " | " + vehicle->MED_labels[i - 13] + to_string(vehicle->MED[0][i - 13], 2, 9); } - table.emplace_back( parameters); + table.emplace_back(parameters); } } - if (vehicle->MoverParameters->EngineType == TEngineType::DieselEngine) { + if (vehicle->MoverParameters->EngineType == TEngineType::DieselEngine) + { std::string parameters = "param value"; table.emplace_back(parameters); parameters = "efill: " + to_string(vehicle->MoverParameters->dizel_fill, 2, 9); @@ -1058,8 +1030,8 @@ ui_layer::render() { table.emplace_back(parameters); parameters = "hTCLR: " + to_string(vehicle->MoverParameters->hydro_TC_LockupRate, 2, 9); table.emplace_back(parameters); - //parameters = "hTCXX: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9); - //table.emplace_back(parameters); + // parameters = "hTCXX: " + to_string(vehicle->MoverParameters->hydro_TC_nIn, 2, 9); + // table.emplace_back(parameters); } ImGui::Begin("Debug", &DebugModeFlag, ImGuiWindowFlags_NoResize); ImGui::TextUnformatted(uitextline1.c_str()); @@ -1072,17 +1044,20 @@ ui_layer::render() { } #ifdef EU07_USE_OLD_UI_CODE - if( Controlled && DebugModeFlag && !Global.iTextMode ) { + if (Controlled && DebugModeFlag && !Global.iTextMode) + { - uitextline1 += - ( "; d_omega " ) + to_string( Controlled->MoverParameters->dizel_engagedeltaomega, 3 ); + uitextline1 += ("; d_omega ") + to_string(Controlled->MoverParameters->dizel_engagedeltaomega, 3); - if( Controlled->MoverParameters->EngineType == ElectricInductionMotor ) { + if (Controlled->MoverParameters->EngineType == ElectricInductionMotor) + { - for( int i = 0; i <= 8; i++ ) { - for( int j = 0; j <= 9; j++ ) { - glRasterPos2f( 0.05f + 0.03f * i, 0.16f - 0.01f * j ); - uitextline4 = to_string( Train->fEIMParams[ i ][ j ], 2 ); + for (int i = 0; i <= 8; i++) + { + for (int j = 0; j <= 9; j++) + { + glRasterPos2f(0.05f + 0.03f * i, 0.16f - 0.01f * j); + uitextline4 = to_string(Train->fEIMParams[i][j], 2); } } } @@ -1091,15 +1066,19 @@ ui_layer::render() { // stenogramy dźwięków (ukryć, gdy tabelka skanowania lub rozkład?) std::vector transcripts; - for( auto const &transcript : ui::Transcripts.aLines ) { + for (auto const &transcript : ui::Transcripts.aLines) + { - if( Global.fTimeAngleDeg >= transcript.fShow ) { + if (Global.fTimeAngleDeg >= transcript.fShow) + { - cParser parser( transcript.asText ); - while( true == parser.getTokens( 1, false, "|" ) ) { + cParser parser(transcript.asText); + while (true == parser.getTokens(1, false, "|")) + { - std::string transcriptline; parser >> transcriptline; - transcripts.emplace_back( transcriptline ); + std::string transcriptline; + parser >> transcriptline; + transcripts.emplace_back(transcriptline); } } } @@ -1147,6 +1126,8 @@ ui_layer::render() { ImGui::MenuItem("Scenery inspector", "F11", &EditorModeFlag); ImGui::MenuItem("Events", nullptr, &events_active); ImGui::MenuItem("Log", "F12", &log_active); + if (Global.map_enabled && m_map) + ImGui::MenuItem("Map", "Tab", &m_map->map_opened); ImGui::EndMenu(); } if (ImGui::BeginMenu("Tools")) @@ -1172,6 +1153,9 @@ ui_layer::render() { } } + if (m_map && World.InitPerformed()) + m_map->render(simulation::Region); + glDebug("uilayer render"); ImGui::Render(); @@ -1186,30 +1170,34 @@ ui_layer::render() { glDebug("uilayer render done"); } -void -ui_layer::set_progress( float const Progress, float const Subtaskprogress ) { +void ui_layer::set_progress(float const Progress, float const Subtaskprogress) +{ m_progress = Progress * 0.01f; m_subtaskprogress = Subtaskprogress * 0.01f; } -void -ui_layer::set_background( std::string const &Filename ) { +void ui_layer::set_background(std::string const &Filename) +{ - if( false == Filename.empty() ) { - m_background = GfxRenderer.Fetch_Texture( Filename ); + if (false == Filename.empty()) + { + m_background = GfxRenderer.Fetch_Texture(Filename); } - else { + else + { m_background = null_handle; } - if( m_background != null_handle ) { - auto const &texture = GfxRenderer.Texture( m_background ); + if (m_background != null_handle) + { + auto const &texture = GfxRenderer.Texture(m_background); } } -void -ui_layer::render_progress() { - if( (m_progress == 0.0f) && (m_subtaskprogress == 0.0f) ) return; +void ui_layer::render_progress() +{ + if ((m_progress == 0.0f) && (m_subtaskprogress == 0.0f)) + return; ImGui::SetNextWindowPos(ImVec2(50, 50)); ImGui::SetNextWindowSize(ImVec2(0, 0)); @@ -1222,20 +1210,24 @@ ui_layer::render_progress() { ImGui::End(); } -void -ui_layer::render_tooltip() { +void ui_layer::render_tooltip() +{ - if( !m_cursorvisible || m_tooltip.empty() ) { return; } + if (!m_cursorvisible || m_tooltip.empty()) + { + return; + } ImGui::BeginTooltip(); ImGui::TextUnformatted(m_tooltip.c_str()); ImGui::EndTooltip(); } -void -ui_layer::render_background() { +void ui_layer::render_background() +{ - if( m_background == 0 ) return; + if (m_background == 0) + return; ImVec2 size = ImGui::GetIO().DisplaySize; opengl_texture &tex = GfxRenderer.Texture(m_background); @@ -1244,9 +1236,8 @@ ui_layer::render_background() { ImGui::SetNextWindowPos(ImVec2(0, 0)); ImGui::SetNextWindowSize(size); ImGui::Begin("Logo", nullptr, - ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | - ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | - ImGuiWindowFlags_NoScrollWithMouse | ImGuiWindowFlags_NoBringToFrontOnFocus); - ImGui::Image(reinterpret_cast(tex.id), size, ImVec2(0, 1), ImVec2(1, 0)); + ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse | + ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGui::Image(reinterpret_cast(tex.id), size, ImVec2(0, 1), ImVec2(1, 0)); ImGui::End(); } diff --git a/uilayer.h b/uilayer.h index a5d3253e..7459a266 100644 --- a/uilayer.h +++ b/uilayer.h @@ -2,6 +2,7 @@ #include #include "Texture.h" +#include "map.h" // GuiLayer -- basic user interface class. draws requested information on top of openGL screen @@ -75,6 +76,8 @@ private: ImGuiIO *imgui_io; + std::unique_ptr m_map; + // progress bar config. TODO: put these together into an object float m_progress { 0.0f }; // percentage of filled progres bar, to indicate lengthy operations. float m_subtaskprogress{ 0.0f }; // percentage of filled progres bar, to indicate lengthy operations.