16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-18 00:49:19 +02:00

vehicle params window, aware system rewrite, sifa

This commit is contained in:
milek7
2019-03-16 01:21:59 +01:00
parent f1c8c8f1cd
commit 3556a2d0e6
24 changed files with 622 additions and 451 deletions

View File

@@ -10,8 +10,8 @@
ui::map_panel::map_panel() : ui_panel(LOC_STR(ui_map), false)
{
size_min = { 200, 200 };
size_max = { fb_size, fb_size };
size_min = {200, 200};
size_max = {fb_size, fb_size};
window_flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse;
gl::shader vert("map.vert");
@@ -57,13 +57,14 @@ ui::map_panel::map_panel() : ui_panel(LOC_STR(ui_map), false)
float ui::map_panel::get_vehicle_rotation()
{
const TDynamicObject *vehicle = simulation::Train->Dynamic();
glm::vec3 front = glm::dvec3(vehicle->VectorFront()) * (vehicle->DirectionGet() > 0 ? 1.0 : -1.0);
glm::vec2 north_ptr(0.0f, 1.0f);
const TDynamicObject *vehicle = simulation::Train->Dynamic();
glm::vec3 front = glm::dvec3(vehicle->VectorFront()) * (vehicle->DirectionGet() > 0 ? 1.0 : -1.0);
glm::vec2 north_ptr(0.0f, 1.0f);
return glm::atan(front.z, front.x) - glm::atan(north_ptr.y, north_ptr.x);
}
void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_size) {
void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_size)
{
cFrustum frustum;
frustum.calculate(transform, glm::mat4());
@@ -78,7 +79,8 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si
if (section && frustum.sphere_inside(section->area().center, section->area().radius) > 0.f)
{
const gfx::geometrybank_handle handle = section->get_map_geometry();
if (handle != null_handle) {
if (handle != null_handle)
{
m_section_handles.push_back(handle);
section->get_map_active_switches(m_switch_handles);
}
@@ -130,7 +132,8 @@ void ui::map_panel::render_map_texture(glm::mat4 transform, glm::vec2 surface_si
void ui::map_panel::render_labels(glm::mat4 transform, ImVec2 origin, glm::vec2 surface_size)
{
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.7f, 1.0f, 0.7f, 1.0f));
for (TDynamicObject *vehicle : simulation::Vehicles.sequence()) {
for (TDynamicObject *vehicle : simulation::Vehicles.sequence())
{
if (vehicle->Prev() || !vehicle->Mechanik)
continue;
@@ -147,14 +150,13 @@ void ui::map_panel::render_labels(glm::mat4 transform, ImVec2 origin, glm::vec2
TDynamicObject *veh = vehicle;
ImVec2 textsize = ImGui::CalcTextSize(label.c_str());
ImGui::SetCursorPos(ImVec2(origin.x + gui_pos.x - textsize.x / 2.0f,
origin.y + gui_pos.y - textsize.y / 2.0f));
ImGui::SetCursorPos(ImVec2(origin.x + gui_pos.x - textsize.x / 2.0f, origin.y + gui_pos.y - textsize.y / 2.0f));
ImGui::TextUnformatted(label.c_str());
}
ImGui::PopStyleColor();
if (zoom > 0.005f) {
if (zoom > 0.005f)
{
}
}
@@ -179,15 +181,13 @@ void ui::map_panel::render_contents()
glm::mat4 transform;
transform[0][0] = -1.0f;
static enum {
MODE_MANUAL = 0,
MODE_CAMERA,
MODE_VEHICLE
} mode = MODE_MANUAL;
static enum { MODE_MANUAL = 0, MODE_CAMERA, MODE_VEHICLE } mode = MODE_MANUAL;
ImGui::RadioButton("manual", (int*)&mode, 0); ImGui::SameLine();
ImGui::RadioButton("cam", (int*)&mode, 1); ImGui::SameLine();
ImGui::RadioButton("vehicle", (int*)&mode, 2);
ImGui::RadioButton("manual", (int *)&mode, 0);
ImGui::SameLine();
ImGui::RadioButton("cam", (int *)&mode, 1);
ImGui::SameLine();
ImGui::RadioButton("vehicle", (int *)&mode, 2);
ImVec2 surface_size_im = ImGui::GetContentRegionAvail();
glm::vec2 surface_size(surface_size_im.x, surface_size_im.y);
@@ -231,11 +231,12 @@ void ui::map_panel::render_contents()
ImVec2 window_origin = ImGui::GetCursorPos();
ImVec2 screen_origin = ImGui::GetCursorScreenPos();
ImGui::ImageButton(reinterpret_cast<void*>(m_tex->id), surface_size_im, ImVec2(0, surface_size.y / fb_size), ImVec2(surface_size.x / fb_size, 0), 0);
ImGui::ImageButton(reinterpret_cast<void *>(m_tex->id), surface_size_im, ImVec2(0, surface_size.y / fb_size), ImVec2(surface_size.x / fb_size, 0), 0);
if (ImGui::IsItemHovered())
{
if (mode == 0 && ImGui::IsMouseDragging(0)) {
if (mode == 0 && ImGui::IsMouseDragging(0))
{
ImVec2 delta_im = ImGui::GetMouseDragDelta();
ImGui::ResetMouseDragDelta();
@@ -245,27 +246,30 @@ void ui::map_panel::render_contents()
translate -= delta * 2.0f;
}
else {
else
{
ImVec2 screen_pos = ImGui::GetMousePos();
glm::vec2 surface_pos(screen_pos.x - screen_origin.x, screen_pos.y - screen_origin.y);
glm::vec2 ndc_pos = surface_pos / surface_size * 2.0f - 1.0f;
glm::vec3 world_pos = glm::inverse(transform) * glm::vec4(ndc_pos.x, 0.0f, -ndc_pos.y, 1.0f);
map::sorted_object_list objects =
map::Objects.find_in_range(glm::vec3(world_pos.x, NAN, world_pos.z), 0.03f / zoom);
map::sorted_object_list objects = map::Objects.find_in_range(glm::vec3(world_pos.x, NAN, world_pos.z), 0.03f / zoom);
if (ImGui::IsMouseClicked(1)) {
if (ImGui::IsMouseClicked(1))
{
if (objects.size() > 1)
register_popup(std::make_unique<ui::disambiguation_popup>(*this, std::move(objects)));
else if (objects.size() == 1)
handle_map_object_click(*this, objects.begin()->second);
else {
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)));
}
}
else if (!objects.empty()) {
else if (!objects.empty())
{
handle_map_object_hover(objects.begin()->second);
}
}
@@ -276,10 +280,12 @@ void ui::map_panel::render_contents()
void ui::handle_map_object_click(ui_panel &parent, std::shared_ptr<map::map_object> &obj)
{
if (auto sem = std::dynamic_pointer_cast<map::semaphore>(obj)) {
if (auto sem = std::dynamic_pointer_cast<map::semaphore>(obj))
{
parent.register_popup(std::make_unique<semaphore_window>(parent, std::move(sem)));
}
else if (auto track = std::dynamic_pointer_cast<map::track_switch>(obj)) {
else if (auto track = std::dynamic_pointer_cast<map::track_switch>(obj))
{
parent.register_popup(std::make_unique<switch_window>(parent, std::move(track)));
}
}
@@ -288,12 +294,15 @@ void ui::handle_map_object_hover(std::shared_ptr<map::map_object> &obj)
{
ImGui::BeginTooltip();
if (auto sem = std::dynamic_pointer_cast<map::semaphore>(obj)) {
for (auto &model : sem->models) {
if (auto sem = std::dynamic_pointer_cast<map::semaphore>(obj))
{
for (auto &model : sem->models)
{
ImGui::PushID(model);
ImGui::TextUnformatted(model->name().c_str());
for (int i = 0; i < iMaxNumLights; i++) {
for (int i = 0; i < iMaxNumLights; i++)
{
GfxRenderer.Update_AnimModel(model); // update lamp opacities
auto state = model->LightGet(i);
if (!state)
@@ -314,20 +323,22 @@ 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::track_switch>(obj))
{
ImGui::TextUnformatted(sw->name.c_str());
}
ImGui::EndTooltip();
}
ui::disambiguation_popup::disambiguation_popup(ui_panel &panel, map::sorted_object_list &&list)
: popup(panel), m_list(list) { }
ui::disambiguation_popup::disambiguation_popup(ui_panel &panel, map::sorted_object_list &&list) : popup(panel), m_list(list) {}
void ui::disambiguation_popup::render_content()
{
for (auto &item : m_list) {
if (ImGui::Button(item.second->name.c_str())) {
for (auto &item : m_list)
{
if (ImGui::Button(item.second->name.c_str()))
{
ImGui::CloseCurrentPopup();
handle_map_object_click(m_parent, item.second);
@@ -335,16 +346,17 @@ void ui::disambiguation_popup::render_content()
}
}
ui::semaphore_window::semaphore_window(ui_panel &panel, std::shared_ptr<map::semaphore> &&sem)
: popup(panel), m_sem(sem) { }
ui::semaphore_window::semaphore_window(ui_panel &panel, std::shared_ptr<map::semaphore> &&sem) : popup(panel), m_sem(sem) {}
void ui::semaphore_window::render_content()
{
for (auto &model : m_sem->models) {
for (auto &model : m_sem->models)
{
ImGui::PushID(model);
ImGui::TextUnformatted(model->name().c_str());
for (int i = 0; i < iMaxNumLights; i++) {
for (int i = 0; i < iMaxNumLights; i++)
{
GfxRenderer.Update_AnimModel(model); // update lamp opacities
auto state = model->LightGet(i);
if (!state)
@@ -361,7 +373,8 @@ void ui::semaphore_window::render_content()
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(current_color.x, current_color.y, current_color.z, 1.0f));
std::string res = " ##" + std::to_string(i);
if (ImGui::Button(res.c_str())) {
if (ImGui::Button(res.c_str()))
{
level += 1.0f;
if (level >= 3.0f)
level = 0.0f;
@@ -378,7 +391,8 @@ void ui::semaphore_window::render_content()
ImGui::Separator();
for (auto &item : m_sem->events) {
for (auto &item : m_sem->events)
{
std::string displayname = item->name().substr(m_sem->name.size());
if (displayname.size() < 2)
@@ -386,38 +400,40 @@ void ui::semaphore_window::render_content()
displayname[1] = std::toupper(displayname[1]);
if (ImGui::Button(displayname.c_str())) {
if (ImGui::Button(displayname.c_str()))
{
m_relay.post(user_command::queueevent, (double)simulation::Events.GetEventId(item), 0.0, GLFW_PRESS, 0);
}
}
}
ui::switch_window::switch_window(ui_panel &panel, std::shared_ptr<map::track_switch> &&sw)
: popup(panel), m_switch(sw) { }
ui::switch_window::switch_window(ui_panel &panel, std::shared_ptr<map::track_switch> &&sw) : popup(panel), m_switch(sw) {}
void ui::switch_window::render_content()
{
ImGui::TextUnformatted(m_switch->name.c_str());
if (ImGui::Button(LOC_STR(map_straight))) {
if (ImGui::Button(LOC_STR(map_straight)))
{
m_relay.post(user_command::queueevent, (double)simulation::Events.GetEventId(m_switch->straight_event), 0.0, GLFW_PRESS, 0);
ImGui::CloseCurrentPopup();
}
if (ImGui::Button(LOC_STR(map_divert))) {
if (ImGui::Button(LOC_STR(map_divert)))
{
m_relay.post(user_command::queueevent, (double)simulation::Events.GetEventId(m_switch->divert_event), 0.0, GLFW_PRESS, 0);
ImGui::CloseCurrentPopup();
}
}
ui::obstacle_window::obstacle_window(ui_panel &panel, glm::dvec3 const &pos)
: popup(panel), m_position(pos)
ui::obstacle_window::obstacle_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);
std::string line;
while (std::getline(file, line)) {
while (std::getline(file, line))
{
std::istringstream entry(line);
std::string name;
@@ -432,8 +448,10 @@ ui::obstacle_window::obstacle_window(ui_panel &panel, glm::dvec3 const &pos)
void ui::obstacle_window::render_content()
{
ImGui::TextUnformatted(LOC_STR(map_obstacle_insert));
for (auto const &entry : m_obstacles) {
if (ImGui::Button(entry.first.c_str())) {
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);
ImGui::CloseCurrentPopup();

View File

@@ -7,66 +7,72 @@
#include "widgets/map_objects.h"
#include "widgets/popup.h"
namespace ui {
namespace ui
{
class disambiguation_popup : public popup {
class disambiguation_popup : public popup
{
map::sorted_object_list m_list;
public:
public:
disambiguation_popup(ui_panel &panel, map::sorted_object_list &&list);
virtual void render_content() override;
};
class semaphore_window : public popup {
class semaphore_window : public popup
{
std::shared_ptr<map::semaphore> m_sem;
command_relay m_relay;
public:
public:
semaphore_window(ui_panel &panel, std::shared_ptr<map::semaphore> &&sem);
virtual void render_content() override;
};
class switch_window : public popup {
class switch_window : public popup
{
std::shared_ptr<map::track_switch> m_switch;
command_relay m_relay;
public:
public:
switch_window(ui_panel &panel, std::shared_ptr<map::track_switch> &&sw);
virtual void render_content() override;
};
class obstacle_window : public popup {
class obstacle_window : public popup
{
glm::dvec3 m_position;
std::vector<std::pair<std::string, std::string>> m_obstacles;
public:
public:
obstacle_window(ui_panel &panel, glm::dvec3 const &pos);
virtual void render_content() override;
};
class map_panel : public ui_panel {
class map_panel : public ui_panel
{
std::unique_ptr<gl::program> m_shader;
std::unique_ptr<gl::framebuffer> m_msaa_fb;
std::unique_ptr<gl::framebuffer> m_msaa_fb;
std::unique_ptr<gl::renderbuffer> m_msaa_rb;
std::unique_ptr<gl::framebuffer> m_fb;
std::unique_ptr<opengl_texture> m_tex;
std::unique_ptr<gl::framebuffer> m_fb;
std::unique_ptr<opengl_texture> m_tex;
std::unique_ptr<gl::ubo> scene_ubo;
gl::scene_ubs scene_ubs;
std::unique_ptr<gl::ubo> scene_ubo;
gl::scene_ubs scene_ubs;
std::vector<gfx::geometrybank_handle> m_section_handles;
std::vector<gfx::geometrybank_handle> m_section_handles;
std::vector<gfx::geometrybank_handle> m_switch_handles;
const int fb_size = 1024;
const int fb_size = 1024;
glm::vec2 translate;
float zoom = 1.0f / 1000.0f;
float get_vehicle_rotation();
glm::vec2 translate;
float zoom = 1.0f / 1000.0f;
float get_vehicle_rotation();
void render_map_texture(glm::mat4 transform, glm::vec2 surface_size);
void render_labels(glm::mat4 transform, ImVec2 origin, glm::vec2 surface_size);
@@ -74,11 +80,11 @@ class map_panel : public ui_panel {
std::optional<map::semaphore> active;
public:
public:
map_panel();
void render_contents() override;
};
void handle_map_object_click(ui_panel &parent, std::shared_ptr<map::map_object> &obj);
void handle_map_object_hover(std::shared_ptr<map::map_object> &obj);
}
} // namespace ui

View File

@@ -8,17 +8,20 @@ map::sorted_object_list map::objects::find_in_range(glm::vec3 from, float distan
float max_distance2 = distance * distance;
for (auto const entry : entries) {
for (auto const entry : entries)
{
glm::vec3 entry_location = entry->location;
glm::vec3 search_point = from;
if (glm::isnan(from.y)) {
if (glm::isnan(from.y))
{
entry_location.y = 0.0f;
search_point.y = 0.0f;
}
float dist = glm::distance2(entry_location, search_point);
if (dist < max_distance2) {
if (dist < max_distance2)
{
items.emplace(dist, std::move(entry));
}
}

View File

@@ -4,37 +4,42 @@
#include "Event.h"
#include "scene.h"
namespace map {
namespace map
{
struct map_object {
std::string name;
glm::vec3 location;
struct map_object
{
std::string name;
glm::vec3 location;
virtual ~map_object() = default;
};
virtual ~map_object() = default;
};
using object_list = std::vector<std::shared_ptr<map::map_object>>;
using sorted_object_list = std::map<float, std::shared_ptr<map::map_object>>;
using object_list = std::vector<std::shared_ptr<map::map_object>>;
using sorted_object_list = std::map<float, std::shared_ptr<map::map_object>>;
// semaphore description (only for minimap purposes)
struct semaphore : public map_object {
std::vector<TAnimModel *> models;
// semaphore description (only for minimap purposes)
struct semaphore : public map_object
{
std::vector<TAnimModel *> models;
std::vector<basic_event *> events;
};
std::vector<basic_event *> events;
};
// switch description (only for minimap purposes)
struct track_switch : public map_object {
basic_event *straight_event = nullptr;
basic_event *divert_event = nullptr;
};
// switch description (only for minimap purposes)
struct track_switch : public map_object
{
basic_event *straight_event = nullptr;
basic_event *divert_event = nullptr;
};
struct objects {
std::vector<std::shared_ptr<map_object>> entries;
struct objects
{
std::vector<std::shared_ptr<map_object>> entries;
// returns objects in range from vec3, NaN in Y ignores it
sorted_object_list find_in_range(glm::vec3 from, float distance);
};
// returns objects in range from vec3, NaN in Y ignores it
sorted_object_list find_in_range(glm::vec3 from, float distance);
};
extern objects Objects;
}
extern objects Objects;
} // namespace map

View File

@@ -1,17 +1,13 @@
#include "widgets/popup.h"
ui::popup::popup(ui_panel &panel)
: m_parent(panel)
{
}
ui::popup::popup(ui_panel &panel) : m_parent(panel) {}
ui::popup::~popup()
{
}
ui::popup::~popup() {}
bool ui::popup::render()
{
if (!m_id.size()) {
if (!m_id.size())
{
m_id = "popup:" + std::to_string(id++);
ImGui::OpenPopup(m_id.c_str());
}

View File

@@ -2,21 +2,23 @@
class ui_panel;
namespace ui {
namespace ui
{
class popup {
class popup
{
std::string m_id;
static int id;
public:
public:
popup(ui_panel &panel);
~popup();
bool render();
protected:
protected:
ui_panel &m_parent;
virtual void render_content() = 0;
};
}
} // namespace ui

View File

@@ -3,8 +3,7 @@
#include "simulationtime.h"
#include "Globals.h"
ui::time_panel::time_panel()
: ui_panel(LOC_STR(time_window), false)
ui::time_panel::time_panel() : ui_panel(LOC_STR(time_window), false)
{
size.x = 450;
}
@@ -17,7 +16,8 @@ void ui::time_panel::render_contents()
ImGui::SliderFloat(LOC_STR(time_weather), &overcast, 0.0f, 2.0f, "%.1f");
ImGui::SliderFloat(LOC_STR(time_temperature), &temperature, -20.0f, 40.0f, "%.0f");
if (ImGui::Button(LOC_STR(time_apply))) {
if (ImGui::Button(LOC_STR(time_apply)))
{
m_relay.post(user_command::setdatetime, (double)yearday, time, 1, 0);
m_relay.post(user_command::setweather, fog, overcast, 1, 0);
m_relay.post(user_command::settemperature, temperature, 0.0, 1, 0);

View File

@@ -2,20 +2,22 @@
#include "translation.h"
#include "command.h"
namespace ui {
class time_panel : public ui_panel {
command_relay m_relay;
namespace ui
{
class time_panel : public ui_panel
{
command_relay m_relay;
float time;
int yearday;
float fog;
float overcast;
float temperature;
float time;
int yearday;
float fog;
float overcast;
float temperature;
public:
time_panel();
public:
time_panel();
void render_contents() override;
void open();
};
}
void render_contents() override;
void open();
};
} // namespace ui

View File

@@ -3,8 +3,10 @@
#include "simulation.h"
#include "Driver.h"
void ui::vehiclelist_panel::render_contents() {
for (TDynamicObject* vehicle : simulation::Vehicles.sequence()) {
void ui::vehiclelist_panel::render_contents()
{
for (TDynamicObject *vehicle : simulation::Vehicles.sequence())
{
if (vehicle->Prev())
continue;
@@ -17,9 +19,11 @@ void ui::vehiclelist_panel::render_contents() {
std::string label = std::string(name + ", " + timetable + std::to_string(speed) + " km/h");
if (!vehicle->Next())
ImGui::TextUnformatted(label.c_str());
else if (ImGui::TreeNode(vehicle, label.c_str())) {
else if (ImGui::TreeNode(vehicle, label.c_str()))
{
vehicle = vehicle->Next();
while (vehicle) {
while (vehicle)
{
ImGui::TextUnformatted(vehicle->name().c_str());
vehicle = vehicle->Next();
}
@@ -27,5 +31,5 @@ void ui::vehiclelist_panel::render_contents() {
}
}
//ImGui::ShowDemoWindow();
// ImGui::ShowDemoWindow();
}

View File

@@ -1,10 +1,12 @@
#include "uilayer.h"
namespace ui {
class vehiclelist_panel : public ui_panel {
public:
vehiclelist_panel() : ui_panel("Vehicle list", true) {}
namespace ui
{
class vehiclelist_panel : public ui_panel
{
public:
vehiclelist_panel() : ui_panel("Vehicle list", true) {}
void render_contents() override;
};
}
void render_contents() override;
};
} // namespace ui

189
widgets/vehicleparams.cpp Normal file
View File

@@ -0,0 +1,189 @@
#include "stdafx.h"
#include "widgets/vehicleparams.h"
#include "simulation.h"
#include "driveruipanels.h"
#include "Driver.h"
#include "Train.h"
ui::vehicleparams_panel::vehicleparams_panel()
: ui_panel(LOC_STR(vehicleparams_window), false)
{
}
void ui::vehicleparams_panel::render_contents()
{
if (m_vehicle_name.empty())
m_vehicle_name = simulation::Vehicles.sequence()[0]->name();
TDynamicObject *vehicle_ptr = simulation::Vehicles.find(m_vehicle_name);
if (!vehicle_ptr) {
is_open = false;
return;
}
TTrain *train_ptr = simulation::Trains.find(m_vehicle_name);
if (train_ptr) {
const TTrain::screen_map &screens = train_ptr->get_screens();
for (const auto &viewport : Global.python_viewports) {
for (auto const &entry : screens) {
if (std::get<std::string>(entry) != viewport.surface)
continue;
float aspect = (float)viewport.size.y / viewport.size.x;
glm::mat3 proj = glm::translate(glm::scale(glm::mat3(), 1.0f / viewport.scale), viewport.offset);
glm::vec2 uv0 = glm::vec2(proj * glm::vec3(0.0f, 1.0f, 1.0f));
glm::vec2 uv1 = glm::vec2(proj * glm::vec3(1.0f, 0.0f, 1.0f));
ImGui::Image(reinterpret_cast<void*>(std::get<GLuint>(entry)), ImVec2(500, 500 * aspect), ImVec2(uv0.x, uv0.y), ImVec2(uv1.x, uv1.y));
}
}
}
TDynamicObject &vehicle = *vehicle_ptr;
TMoverParameters &mover = *vehicle.MoverParameters;
std::vector<text_line> lines;
std::array<char, 1024> buffer;
auto const isdieselenginepowered { ( mover.EngineType == TEngineType::DieselElectric ) || ( mover.EngineType == TEngineType::DieselEngine ) };
auto const isdieselinshuntmode { mover.ShuntMode && mover.EngineType == TEngineType::DieselElectric };
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_devicespower ].c_str(),
// devices
( mover.Battery ? 'B' : '.' ),
( mover.Mains ? 'M' : '.' ),
( mover.FuseFlag ? '!' : '.' ),
( mover.PantRearUp ? ( mover.PantRearVolt > 0.0 ? 'O' : 'o' ) : '.' ),
( mover.PantFrontUp ? ( mover.PantFrontVolt > 0.0 ? 'P' : 'p' ) : '.' ),
( mover.PantPressLockActive ? '!' : ( mover.PantPressSwitchActive ? '*' : '.' ) ),
( mover.WaterPump.is_active ? 'W' : ( false == mover.WaterPump.breaker ? '-' : ( mover.WaterPump.is_enabled ? 'w' : '.' ) ) ),
( true == mover.WaterHeater.is_damaged ? '!' : ( mover.WaterHeater.is_active ? 'H' : ( false == mover.WaterHeater.breaker ? '-' : ( mover.WaterHeater.is_enabled ? 'h' : '.' ) ) ) ),
( mover.FuelPump.is_active ? 'F' : ( mover.FuelPump.is_enabled ? 'f' : '.' ) ),
( mover.OilPump.is_active ? 'O' : ( mover.OilPump.is_enabled ? 'o' : '.' ) ),
( false == mover.ConverterAllowLocal ? '-' : ( mover.ConverterAllow ? ( mover.ConverterFlag ? 'X' : 'x' ) : '.' ) ),
( mover.ConvOvldFlag ? '!' : '.' ),
( mover.CompressorFlag ? 'C' : ( false == mover.CompressorAllowLocal ? '-' : ( ( mover.CompressorAllow || mover.CompressorStart == start_t::automatic ) ? 'c' : '.' ) ) ),
( mover.CompressorGovernorLock ? '!' : '.' ),
"",
std::string( isdieselenginepowered ? locale::strings[ locale::string::debug_vehicle_oilpressure ] + to_string( mover.OilPump.pressure, 2 ) : "" ).c_str(),
// power transfers
mover.Couplers[ end::front ].power_high.voltage,
mover.Couplers[ end::front ].power_high.current,
std::string( mover.Couplers[ end::front ].power_high.local ? "" : "-" ).c_str(),
std::string( vehicle.DirectionGet() ? ":<<:" : ":>>:" ).c_str(),
std::string( mover.Couplers[ end::rear ].power_high.local ? "" : "-" ).c_str(),
mover.Couplers[ end::rear ].power_high.voltage,
mover.Couplers[ end::rear ].power_high.current );
ImGui::TextUnformatted(buffer.data());
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_controllersenginerevolutions ].c_str(),
// controllers
mover.MainCtrlPos,
mover.MainCtrlActualPos,
std::string( isdieselinshuntmode ? to_string( mover.AnPos, 2 ) + locale::strings[ locale::string::debug_vehicle_shuntmode ] : std::to_string( mover.ScndCtrlPos ) + "(" + std::to_string( mover.ScndCtrlActualPos ) + ")" ).c_str(),
// engine
mover.EnginePower,
std::abs( mover.TrainType == dt_EZT ? mover.ShowCurrent( 0 ) : mover.Im ),
// revolutions
std::abs( mover.enrot ) * 60,
std::abs( mover.nrot ) * mover.Transmision.Ratio * 60,
mover.RventRot * 60,
std::abs( mover.MotorBlowers[end::front].revolutions ),
std::abs( mover.MotorBlowers[end::rear].revolutions ),
mover.dizel_heat.rpmw,
mover.dizel_heat.rpmw2 );
ImGui::TextUnformatted(buffer.data());
if( isdieselenginepowered ) {
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_temperatures ].c_str(),
mover.dizel_heat.Ts,
mover.dizel_heat.To,
mover.dizel_heat.temperatura1,
( mover.WaterCircuitsLink ? '-' : '|' ),
mover.dizel_heat.temperatura2 );
ImGui::TextUnformatted(buffer.data());
}
std::string brakedelay;
{
std::vector<std::pair<int, std::string>> delays {
{ bdelay_G, "G" },
{ bdelay_P, "P" },
{ bdelay_R, "R" },
{ bdelay_M, "+Mg" } };
for( auto const &delay : delays ) {
if( ( mover.BrakeDelayFlag & delay.first ) == delay.first ) {
brakedelay += delay.second;
}
}
}
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_brakespressures ].c_str(),
// brakes
mover.fBrakeCtrlPos,
mover.LocalBrakePosA,
mover.BrakeOpModeFlag,
brakedelay.c_str(),
mover.LoadFlag,
// cylinders
mover.BrakePress,
mover.LocBrakePress,
mover.Hamulec->GetBrakeStatus(),
// pipes
mover.PipePress,
mover.BrakeCtrlPos2,
mover.ScndPipePress,
mover.CntrlPipePress,
// tanks
mover.Hamulec->GetBRP(),
mover.Compressor,
mover.Hamulec->GetCRP() );
ImGui::TextUnformatted(buffer.data());
if( mover.EnginePowerSource.SourceType == TPowerSource::CurrentCollector ) {
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_pantograph ].c_str(),
mover.PantPress,
( mover.bPantKurek3 ? '-' : '|' ) );
ImGui::TextUnformatted(buffer.data());
}
std::snprintf(
buffer.data(), buffer.size(),
locale::strings[ locale::string::debug_vehicle_forcesaccelerationvelocityposition ].c_str(),
// forces
mover.Ft * 0.001f * ( mover.ActiveCab ? mover.ActiveCab : vehicle.ctOwner ? vehicle.ctOwner->Controlling()->ActiveCab : 1 ) + 0.001f,
mover.Fb * 0.001f,
mover.Adhesive( mover.RunningTrack.friction ),
( mover.SlippingWheels ? " (!)" : "" ),
// acceleration
mover.AccSVBased,
mover.AccN + 0.001f,
std::string( std::abs( mover.RunningShape.R ) > 10000.0 ? "~0" : to_string( mover.RunningShape.R, 0 ) ).c_str(),
// velocity
vehicle.GetVelocity(),
mover.DistCounter,
// position
vehicle.GetPosition().x,
vehicle.GetPosition().y,
vehicle.GetPosition().z );
ImGui::TextUnformatted(buffer.data());
}

16
widgets/vehicleparams.h Normal file
View File

@@ -0,0 +1,16 @@
#include "uilayer.h"
#include "translation.h"
#include "command.h"
namespace ui
{
class vehicleparams_panel : public ui_panel
{
std::string m_vehicle_name;
public:
vehicleparams_panel();
void render_contents() override;
};
} // namespace ui