alerter fixes, removing obstacles, python config changes

This commit is contained in:
milek7
2019-03-16 12:43:34 +01:00
parent 608af111a2
commit 8b642205eb
12 changed files with 105 additions and 28 deletions

View File

@@ -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

View File

@@ -1714,19 +1714,18 @@ 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 );
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 );
if (Train->mvOccupied->TrainType == dt_EZT || Train->mvOccupied->ActiveDir != 0)
Train->mvOccupied->SecuritySystem.acknowledge_release();
}
}

View File

@@ -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<editor_ui*>( m_userinterface.get() )->set_node(nullptr);
simulation::Region->erase(model);
simulation::Instances.purge(model);
simulation::State.delete_model(model);
break;
}

View File

@@ -1711,13 +1711,22 @@ void basic_region::create_map_geometry()
s->create_map_geometry(m_map_geometrybank);
}
std::vector<gfx::basic_vertex> 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();
}
void basic_region::update_poi_geometry()
{
std::vector<gfx::basic_vertex> 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(poi_vertices, poibank, GL_POINTS);
m_map_poipoints = GfxRenderer.Insert(vertices, poibank, GL_POINTS);
}
else {
GfxRenderer.Replace(vertices, m_map_poipoints, GL_POINTS);
}
}
} // scene

View File

@@ -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

View File

@@ -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() {

View File

@@ -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

View File

@@ -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",

View File

@@ -97,6 +97,7 @@ enum string {
map_straight,
map_divert,
map_obstacle_insert,
map_obstacle_remove,
vehicleparams_window,

View File

@@ -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<obstacle_window>(*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<obstacle_insert_window>(*this, std::move(nearest)));
}
}
else if (!objects.empty())
@@ -288,6 +289,10 @@ void ui::handle_map_object_click(ui_panel &parent, std::shared_ptr<map::map_obje
{
parent.register_popup(std::make_unique<switch_window>(parent, std::move(track)));
}
else if (auto obstacle = std::dynamic_pointer_cast<map::obstacle>(obj))
{
parent.register_popup(std::make_unique<obstacle_remove_window>(parent, std::move(obstacle)));
}
}
void ui::handle_map_object_hover(std::shared_ptr<map::map_object> &obj)
@@ -323,7 +328,7 @@ void ui::handle_map_object_hover(std::shared_ptr<map::map_object> &obj)
ImGui::PopID();
}
}
else if (auto sw = std::dynamic_pointer_cast<map::track_switch>(obj))
else if (auto sw = std::dynamic_pointer_cast<map::map_object>(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<map::obstacle>();
obstacle->name = entry.first;
obstacle->location = m_position;
obstacle->model = cloned;
map::Objects.entries.push_back(std::move(obstacle));
std::vector<gfx::basic_vertex> 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<map::obstacle> &&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();
}
}

View File

@@ -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<std::pair<std::string, std::string>> 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<map::obstacle> m_obstacle;
public:
obstacle_remove_window(ui_panel &panel, std::shared_ptr<map::obstacle> &&obstacle);
virtual void render_content() override;
};

View File

@@ -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<std::shared_ptr<map_object>> entries;