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:
126
widgets/map.cpp
126
widgets/map.cpp
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
189
widgets/vehicleparams.cpp
Normal 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
16
widgets/vehicleparams.h
Normal 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
|
||||
Reference in New Issue
Block a user