From 691f0f28b29931e5c94f4d2f78226c9f63639446 Mon Sep 17 00:00:00 2001 From: milek7 Date: Tue, 2 Apr 2019 13:10:36 +0200 Subject: [PATCH] changed map colors --- Globals.cpp | 4 ++++ Globals.h | 2 ++ Track.cpp | 36 +++++++++++++++++++++++++++++++----- Track.h | 4 +++- shaders/map.frag | 9 +-------- widgets/map.cpp | 19 +++++++++++++------ 6 files changed, 54 insertions(+), 20 deletions(-) diff --git a/Globals.cpp b/Globals.cpp index 16b55254..6aa419ae 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -878,6 +878,10 @@ global_settings::ConfigParse(cParser &Parser) { extra_viewports.push_back(conf); } + else if (token == "map.highlightdistance") { + Parser.getTokens(1); + Parser >> map_highlight_distance; + } } 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 a1ab13df..9a657a6d 100644 --- a/Globals.h +++ b/Globals.h @@ -207,6 +207,8 @@ struct global_settings { bool gfx_shadergamma = false; bool gfx_usegles = false; + float map_highlight_distance = 3000.0f; + struct extraviewport_config { std::string monitor; int width, height; diff --git a/Track.cpp b/Track.cpp index fdb99cf7..2b0737c9 100644 --- a/Track.cpp +++ b/Track.cpp @@ -1188,6 +1188,18 @@ TTrack *TTrack::Next(TTrack *visitor) { return nullptr; } +double TTrack::ActiveLength() { + if (eType == tt_Normal) { + return Segment->GetLength(); + } else if (eType == tt_Switch) { + if (GetSwitchState() == 0) + return SwitchExtension->Segments[0]->GetLength(); + else + return SwitchExtension->Segments[1]->GetLength(); + } + return 1.0f; +} + void TTrack::get_map_active_paths(map_colored_paths &handles) { if (iCategoryFlag != 1) @@ -1199,34 +1211,48 @@ void TTrack::get_map_active_paths(map_colored_paths &handles) else handles.switches.push_back(SwitchExtension->map_geometry[1]); } +} + +void TTrack::get_map_future_paths(map_colored_paths &handles) { + if (iCategoryFlag != 1) + return; if (!Dynamics.empty()) { - handles.occupied.push_back(extra_map_geometry); + if (eType == tt_Switch) { + if (GetSwitchState() == 0) + handles.occupied.push_back(SwitchExtension->map_geometry[0]); + else + handles.occupied.push_back(SwitchExtension->map_geometry[1]); + } else if (eType == tt_Normal) { + handles.occupied.push_back(extra_map_geometry); + } static int stamp = 0; stamp++; - int limit = 15; + float distance = Global.map_highlight_distance; TTrack *track = trPrev; TTrack *visitor = this; - while (limit-- > 0 && track && track->iterate_stamp != stamp) { + while (distance > 0.0f && track && track->iterate_stamp != stamp) { handles.future.push_back(track->extra_map_geometry); track->iterate_stamp = stamp; + distance -= track->ActiveLength(); TTrack *tmp = track; track = track->Next(visitor); visitor = tmp; } - limit = 15; + distance = Global.map_highlight_distance; stamp++; track = trNext; visitor = this; - while (limit-- > 0 && track && track->iterate_stamp != stamp) { + while (distance > 0.0f && track && track->iterate_stamp != stamp) { handles.future.push_back(track->extra_map_geometry); track->iterate_stamp = stamp; + distance -= track->ActiveLength(); TTrack *tmp = track; track = track->Next(visitor); diff --git a/Track.h b/Track.h index fa32af9f..15244391 100644 --- a/Track.h +++ b/Track.h @@ -279,10 +279,12 @@ public: gfx::geometrybank_handle extra_map_geometry; // handle for map highlighting TTrack *Next(TTrack *visitor); + double ActiveLength(); - void create_geometry( gfx::geometrybank_handle const &Bank ); // wypełnianie VBO + void create_geometry( gfx::geometrybank_handle const &Bank ); // wypełnianie VBO void create_map_geometry(std::vector &Bank, const gfx::geometrybank_handle Extra); void get_map_active_paths(map_colored_paths &handles); + void get_map_future_paths(map_colored_paths &handles); glm::vec3 get_nearest_point(const glm::dvec3 &point) const; void RenderDynSounds(); // odtwarzanie dźwięków pojazdów jest niezależne od ich wyświetlania diff --git a/shaders/map.frag b/shaders/map.frag index fd981f21..3e73e714 100644 --- a/shaders/map.frag +++ b/shaders/map.frag @@ -2,14 +2,7 @@ layout(location = 0) out vec4 out_color; -vec3 hsv2rgb(vec3 c) -{ - vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); - vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); - return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -} - void main() { - out_color = vec4(hsv2rgb(vec3(time, 1.0, 1.0)), 1.0f); + out_color = vec4(scene_extra, 1.0f); } diff --git a/widgets/map.cpp b/widgets/map.cpp index f101ba31..8d1ba27e 100644 --- a/widgets/map.cpp +++ b/widgets/map.cpp @@ -96,6 +96,10 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si } } + for (TTrack *track : simulation::Paths.sequence()) { + track->get_map_future_paths(m_colored_paths); + } + glDisable(GL_DEPTH_TEST); if (Global.iMultisampling) { @@ -113,19 +117,23 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si glViewport(0, 0, surface_size.x, surface_size.y); scene_ubs.projection = transform; - scene_ubs.time = 0.5f; // color is stuffed in time variable + scene_ubs.scene_extra = glm::vec3(0.5f); scene_ubo->update(scene_ubs); scene_ubo->bind_uniform(); GfxRenderer.Draw_Geometry(m_section_handles.begin(), m_section_handles.end()); - glLineWidth(2.0f); + scene_ubs.scene_extra = glm::vec3(0.7f, 0.7f, 0.0f); + scene_ubo->update(scene_ubs); + GfxRenderer.Draw_Geometry(m_colored_paths.future.begin(), m_colored_paths.future.end()); - scene_ubs.time = 0.27f; // color is stuffed in time variable + glLineWidth(3.0f); + scene_ubs.scene_extra = glm::vec3(0.0f, 1.0f, 0.0f); scene_ubo->update(scene_ubs); GfxRenderer.Draw_Geometry(m_colored_paths.switches.begin(), m_colored_paths.switches.end()); - GfxRenderer.Draw_Geometry(m_colored_paths.future.begin(), m_colored_paths.future.end()); - scene_ubs.time = 1.0f; // color is stuffed in time variable + + glLineWidth(1.5f); + scene_ubs.scene_extra = glm::vec3(1.0f, 0.0f, 0.0f); scene_ubo->update(scene_ubs); GfxRenderer.Draw_Geometry(m_colored_paths.occupied.begin(), m_colored_paths.occupied.end()); @@ -135,7 +143,6 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si scene_ubs.scene_extra = glm::vec3(1.0f / (surface_size / 200.0f), 1.0f); } - scene_ubs.time = 1.0f; scene_ubo->update(scene_ubs); GfxRenderer.Draw_Geometry(simulation::Region->get_map_poi_geometry());