From 8b642205eb101a4f5601e268a9969a30b5a3968a Mon Sep 17 00:00:00 2001 From: milek7 Date: Sat, 16 Mar 2019 12:43:34 +0100 Subject: [PATCH] alerter fixes, removing obstacles, python config changes --- Globals.cpp | 10 ++------ Train.cpp | 9 +++---- editormode.cpp | 3 +-- scene.cpp | 21 +++++++++++----- scene.h | 2 ++ simulation.cpp | 5 ++++ simulation.h | 3 +++ translation.cpp | 2 ++ translation.h | 1 + widgets/map.cpp | 57 +++++++++++++++++++++++++++++++++++++++---- widgets/map.h | 14 +++++++++-- widgets/map_objects.h | 6 +++++ 12 files changed, 105 insertions(+), 28 deletions(-) diff --git a/Globals.cpp b/Globals.cpp index 5f7c1e1d..49066e6b 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -592,16 +592,10 @@ global_settings::ConfigParse(cParser &Parser) { Parser.getTokens(1, false); Parser >> asLang; } - else if( token == "pyscreenrendererpriority" ) + else if( token == "python.updatetime" ) { - // old variable, repurposed as update rate of python screen renderer Parser.getTokens(); - Parser >> token; - auto const priority { ToLower( token ) }; - PythonScreenUpdateRate = ( - priority == "lower" ? 500 : - priority == "lowest" ? 1000 : - 200 ); + Parser >> PythonScreenUpdateRate; } else if( token == "uitextcolor" ) { // color of the ui text. NOTE: will be obsolete once the real ui is in place diff --git a/Train.cpp b/Train.cpp index 94c348aa..88557a92 100644 --- a/Train.cpp +++ b/Train.cpp @@ -1714,20 +1714,19 @@ void TTrain::OnCommand_reverserbackward( TTrain *Train, command_data const &Comm } void TTrain::OnCommand_alerteracknowledge( TTrain *Train, command_data const &Command ) { - if (Train->mvOccupied->TrainType != dt_EZT && Train->mvOccupied->ActiveDir == 0) - return; // Ra 2014-03: w EZT nie trzeba ustawiać kierunku - if( Command.action == GLFW_PRESS ) { // visual feedback Train->ggSecurityResetButton.UpdateValue( 1.0, Train->dsbSwitch ); - Train->mvOccupied->SecuritySystem.acknowledge_press(); + if (Train->mvOccupied->TrainType == dt_EZT || Train->mvOccupied->ActiveDir != 0) + Train->mvOccupied->SecuritySystem.acknowledge_press(); } else if( Command.action == GLFW_RELEASE ) { // visual feedback Train->ggSecurityResetButton.UpdateValue( 0.0 ); - Train->mvOccupied->SecuritySystem.acknowledge_release(); + if (Train->mvOccupied->TrainType == dt_EZT || Train->mvOccupied->ActiveDir != 0) + Train->mvOccupied->SecuritySystem.acknowledge_release(); } } diff --git a/editormode.cpp b/editormode.cpp index b7161ecc..bab21c51 100644 --- a/editormode.cpp +++ b/editormode.cpp @@ -190,8 +190,7 @@ editor_mode::on_key( int const Key, int const Scancode, int const Action, int co Application.set_cursor( GLFW_CURSOR_NORMAL ); static_cast( m_userinterface.get() )->set_node(nullptr); - simulation::Region->erase(model); - simulation::Instances.purge(model); + simulation::State.delete_model(model); break; } diff --git a/scene.cpp b/scene.cpp index 4dd64df6..51b484b3 100644 --- a/scene.cpp +++ b/scene.cpp @@ -1711,13 +1711,22 @@ void basic_region::create_map_geometry() s->create_map_geometry(m_map_geometrybank); } - std::vector poi_vertices; - for (const auto sem : map::Objects.entries) { - poi_vertices.push_back(gfx::basic_vertex(sem->location, glm::vec3(), glm::vec3())); - } + update_poi_geometry(); +} - gfx::geometrybank_handle poibank = GfxRenderer.Create_Bank(); - m_map_poipoints = GfxRenderer.Insert(poi_vertices, poibank, GL_POINTS); +void basic_region::update_poi_geometry() +{ + std::vector vertices; + for (const auto sem : map::Objects.entries) + vertices.push_back(gfx::basic_vertex(sem->location, glm::vec3(), glm::vec3())); + + if (!m_map_poipoints) { + gfx::geometrybank_handle poibank = GfxRenderer.Create_Bank(); + m_map_poipoints = GfxRenderer.Insert(vertices, poibank, GL_POINTS); + } + else { + GfxRenderer.Replace(vertices, m_map_poipoints, GL_POINTS); + } } } // scene diff --git a/scene.h b/scene.h index 2eafc3d7..2fbb23f0 100644 --- a/scene.h +++ b/scene.h @@ -406,6 +406,8 @@ public: sections( glm::dvec3 const &Point, float const Radius ); void create_map_geometry(); + void + update_poi_geometry(); basic_section* get_section(size_t section) { return m_sections[section]; } gfx::geometrybank_handle diff --git a/simulation.cpp b/simulation.cpp index 31933f2b..7ac89291 100644 --- a/simulation.cpp +++ b/simulation.cpp @@ -179,6 +179,11 @@ TAnimModel * state_manager::create_model(const std::string &src, const std::stri return m_serializer.create_model(src, name, position); } +void state_manager::delete_model(TAnimModel *model) { + Region->erase(model); + Instances.purge(model); +} + void state_manager::update_clocks() { diff --git a/simulation.h b/simulation.h index 268bc9a8..88aaa093 100644 --- a/simulation.h +++ b/simulation.h @@ -41,6 +41,9 @@ public: // create model from node string TAnimModel * create_model(const std::string &src, const std::string &name, const glm::dvec3 &position); + // delete TAnimModel instance + void + delete_model(TAnimModel *model); private: // members diff --git a/translation.cpp b/translation.cpp index 2c6e08ab..86b6bdc6 100644 --- a/translation.cpp +++ b/translation.cpp @@ -108,6 +108,7 @@ init() { "Straight |", "Divert /", "Insert obstacle:", + "Delete obstacle", "Vehicle parameters", @@ -304,6 +305,7 @@ init() { u8"Prosto |", u8"W bok /", u8"Wstaw przeszkodę:", + u8"Usuń przeszkodę", u8"Parametry pojazdu", diff --git a/translation.h b/translation.h index f64d5830..b2f02e28 100644 --- a/translation.h +++ b/translation.h @@ -97,6 +97,7 @@ enum string { map_straight, map_divert, map_obstacle_insert, + map_obstacle_remove, vehicleparams_window, diff --git a/widgets/map.cpp b/widgets/map.cpp index b9fa9d97..4269cae6 100644 --- a/widgets/map.cpp +++ b/widgets/map.cpp @@ -264,8 +264,9 @@ void ui::map_panel::render_contents() else { glm::vec3 nearest = simulation::Region->find_nearest_track_point(world_pos); - if (!glm::isnan(nearest.x) && glm::distance(world_pos, nearest) < (0.03f / zoom)) - register_popup(std::make_unique(*this, std::move(nearest))); + if (!glm::isnan(nearest.x) + && glm::distance(glm::vec2(world_pos.x, world_pos.z), glm::vec2(nearest.x, nearest.z)) < 60.0f) + register_popup(std::make_unique(*this, std::move(nearest))); } } else if (!objects.empty()) @@ -288,6 +289,10 @@ void ui::handle_map_object_click(ui_panel &parent, std::shared_ptr(parent, std::move(track))); } + else if (auto obstacle = std::dynamic_pointer_cast(obj)) + { + parent.register_popup(std::make_unique(parent, std::move(obstacle))); + } } void ui::handle_map_object_hover(std::shared_ptr &obj) @@ -323,7 +328,7 @@ void ui::handle_map_object_hover(std::shared_ptr &obj) ImGui::PopID(); } } - else if (auto sw = std::dynamic_pointer_cast(obj)) + else if (auto sw = std::dynamic_pointer_cast(obj)) { ImGui::TextUnformatted(sw->name.c_str()); } @@ -426,11 +431,14 @@ void ui::switch_window::render_content() } } -ui::obstacle_window::obstacle_window(ui_panel &panel, glm::dvec3 const &pos) : popup(panel), m_position(pos) +ui::obstacle_insert_window::obstacle_insert_window(ui_panel &panel, glm::dvec3 const &pos) : popup(panel), m_position(pos) { std::ifstream file; file.open("obstaclebank.txt", std::ios_base::in | std::ios_base::binary); + if (!file.is_open()) + return; + std::string line; while (std::getline(file, line)) { @@ -445,16 +453,55 @@ ui::obstacle_window::obstacle_window(ui_panel &panel, glm::dvec3 const &pos) : p } } -void ui::obstacle_window::render_content() +void ui::obstacle_insert_window::render_content() { + if (m_obstacles.empty()) { + ImGui::CloseCurrentPopup(); + return; + } + ImGui::TextUnformatted(LOC_STR(map_obstacle_insert)); for (auto const &entry : m_obstacles) { if (ImGui::Button(entry.first.c_str())) { std::string name("obstacle_" + std::to_string(LocalRandom(0.0, 100000.0))); + TAnimModel *cloned = simulation::State.create_model(entry.second, name, m_position); + + auto obstacle = std::make_shared(); + obstacle->name = entry.first; + obstacle->location = m_position; + obstacle->model = cloned; + map::Objects.entries.push_back(std::move(obstacle)); + + std::vector vertices; + vertices.emplace_back((glm::vec3)m_position, glm::vec3(), glm::vec3()); + GfxRenderer.Append(vertices, simulation::Region->get_map_poi_geometry(), GL_POINTS); + ImGui::CloseCurrentPopup(); } } } + +ui::obstacle_remove_window::obstacle_remove_window(ui_panel &panel, std::shared_ptr &&obstacle) + : popup(panel), m_obstacle(obstacle) { } + +void ui::obstacle_remove_window::render_content() +{ + if (ImGui::Button(LOC_STR(map_obstacle_remove))) { + simulation::State.delete_model(m_obstacle->model); + + auto &entries = map::Objects.entries; + for (auto it = entries.rbegin(); it != entries.rend(); it++) { + if (*it == m_obstacle) { + entries.erase(std::next(it).base()); + break; + } + } + + simulation::Region->update_poi_geometry(); + + ImGui::CloseCurrentPopup(); + } +} diff --git a/widgets/map.h b/widgets/map.h index 4eed12fe..d323203a 100644 --- a/widgets/map.h +++ b/widgets/map.h @@ -42,13 +42,23 @@ class switch_window : public popup virtual void render_content() override; }; -class obstacle_window : public popup +class obstacle_insert_window : public popup { glm::dvec3 m_position; std::vector> m_obstacles; public: - obstacle_window(ui_panel &panel, glm::dvec3 const &pos); + obstacle_insert_window(ui_panel &panel, glm::dvec3 const &pos); + + virtual void render_content() override; +}; + +class obstacle_remove_window : public popup +{ + std::shared_ptr m_obstacle; + + public: + obstacle_remove_window(ui_panel &panel, std::shared_ptr &&obstacle); virtual void render_content() override; }; diff --git a/widgets/map_objects.h b/widgets/map_objects.h index 95ca0f3a..0f27b8a7 100644 --- a/widgets/map_objects.h +++ b/widgets/map_objects.h @@ -33,6 +33,12 @@ struct track_switch : public map_object basic_event *divert_event = nullptr; }; +// training obstacle description +struct obstacle : public map_object +{ + TAnimModel *model; +}; + struct objects { std::vector> entries;