Fixed positioning of gizmos' imgui dialogs

This commit is contained in:
Enrico Turri 2019-12-12 13:38:08 +01:00
parent 03fee19fef
commit f2b8607d11
6 changed files with 44 additions and 23 deletions

View file

@ -191,7 +191,6 @@ Bed3D::Bed3D()
: m_type(Custom) : m_type(Custom)
, m_custom_texture("") , m_custom_texture("")
, m_custom_model("") , m_custom_model("")
, m_requires_canvas_update(false)
, m_vbo_id(0) , m_vbo_id(0)
, m_scale_factor(1.0f) , m_scale_factor(1.0f)
{ {
@ -438,6 +437,7 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D&
render_default(bottom); render_default(bottom);
return; return;
} }
canvas.request_extra_frame();
} }
// starts generating the main texture, compression will run asynchronously // starts generating the main texture, compression will run asynchronously
@ -457,6 +457,7 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D&
render_default(bottom); render_default(bottom);
return; return;
} }
canvas.request_extra_frame();
} }
// starts generating the main texture, compression will run asynchronously // starts generating the main texture, compression will run asynchronously
@ -481,13 +482,9 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D&
if (m_temp_texture.get_id() != 0) if (m_temp_texture.get_id() != 0)
m_temp_texture.reset(); m_temp_texture.reset();
m_requires_canvas_update = true; canvas.request_extra_frame();
}
else if (m_requires_canvas_update && m_texture.all_compressed_data_sent_to_gpu())
m_requires_canvas_update = false;
if (m_texture.all_compressed_data_sent_to_gpu() && canvas.is_keeping_dirty()) }
canvas.stop_keeping_dirty();
if (m_triangles.get_vertices_count() > 0) if (m_triangles.get_vertices_count() > 0)
{ {

View file

@ -86,8 +86,6 @@ private:
mutable GLTexture m_texture; mutable GLTexture m_texture;
// temporary texture shown until the main texture has still no levels compressed // temporary texture shown until the main texture has still no levels compressed
mutable GLTexture m_temp_texture; mutable GLTexture m_temp_texture;
// used to trigger 3D scene update once all compressed textures have been sent to GPU
mutable bool m_requires_canvas_update;
mutable Shader m_shader; mutable Shader m_shader;
mutable unsigned int m_vbo_id; mutable unsigned int m_vbo_id;
mutable GLBed m_model; mutable GLBed m_model;

View file

@ -1398,7 +1398,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar
, m_gizmos(*this) , m_gizmos(*this)
, m_use_clipping_planes(false) , m_use_clipping_planes(false)
, m_sidebar_field("") , m_sidebar_field("")
, m_keep_dirty(false) , m_extra_frame_requested(false)
, m_config(nullptr) , m_config(nullptr)
, m_process(nullptr) , m_process(nullptr)
, m_model(nullptr) , m_model(nullptr)
@ -1636,8 +1636,6 @@ void GLCanvas3D::bed_shape_changed()
refresh_camera_scene_box(); refresh_camera_scene_box();
m_camera.requires_zoom_to_bed = true; m_camera.requires_zoom_to_bed = true;
m_dirty = true; m_dirty = true;
if (m_bed.is_prusa())
start_keeping_dirty();
} }
void GLCanvas3D::set_color_by(const std::string& value) void GLCanvas3D::set_color_by(const std::string& value)
@ -2632,10 +2630,11 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt)
_refresh_if_shown_on_screen(); _refresh_if_shown_on_screen();
if (m_keep_dirty || mouse3d_controller_applied) if (m_extra_frame_requested || mouse3d_controller_applied)
{ {
m_dirty = true; m_dirty = true;
evt.RequestMore(); evt.RequestMore();
m_extra_frame_requested = false;
} }
else else
m_dirty = false; m_dirty = false;

View file

@ -436,7 +436,9 @@ private:
bool m_use_clipping_planes; bool m_use_clipping_planes;
mutable SlaCap m_sla_caps[2]; mutable SlaCap m_sla_caps[2];
std::string m_sidebar_field; std::string m_sidebar_field;
bool m_keep_dirty; // when true renders an extra frame by not resetting m_dirty to false
// see request_extra_frame()
bool m_extra_frame_requested;
mutable GLVolumeCollection m_volumes; mutable GLVolumeCollection m_volumes;
Selection m_selection; Selection m_selection;
@ -664,9 +666,7 @@ public:
void set_cursor(ECursorType type); void set_cursor(ECursorType type);
void msw_rescale(); void msw_rescale();
bool is_keeping_dirty() const { return m_keep_dirty; } void request_extra_frame() { m_extra_frame_requested = true; }
void start_keeping_dirty() { m_keep_dirty = true; }
void stop_keeping_dirty() { m_keep_dirty = false; }
int get_main_toolbar_item_id(const std::string& name) const { return m_main_toolbar.get_item_id(name); } int get_main_toolbar_item_id(const std::string& name) const { return m_main_toolbar.get_item_id(name); }
void force_main_toolbar_left_action(int item_id) { m_main_toolbar.force_left_action(item_id, *this); } void force_main_toolbar_left_action(int item_id) { m_main_toolbar.force_left_action(item_id, *this); }

View file

@ -136,12 +136,25 @@ void GLGizmoCut::on_render_for_picking() const
void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit) void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit)
{ {
const float approx_height = m_imgui->scaled(11.0f); static float last_y = 0.0f;
y = std::min(y, bottom_limit - approx_height); static float last_h = 0.0f;
m_imgui->set_next_window_pos(x, y, ImGuiCond_Always);
m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
// adjust window position to avoid overlap the view toolbar
float win_h = ImGui::GetWindowHeight();
y = std::min(y, bottom_limit - win_h);
ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always);
if ((last_h != win_h) || (last_y != y))
{
// ask canvas for another frame to render the window in the correct position
m_parent.request_extra_frame();
if (last_h != win_h)
last_h = win_h;
if (last_y != y)
last_y = y;
}
ImGui::AlignTextToFramePadding(); ImGui::AlignTextToFramePadding();
m_imgui->text("Z"); m_imgui->text("Z");
ImGui::SameLine(); ImGui::SameLine();

View file

@ -686,6 +686,9 @@ void GLGizmoSlaSupports::make_line_segments() const
void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit) void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit)
{ {
static float last_y = 0.0f;
static float last_h = 0.0f;
if (!m_model_object) if (!m_model_object)
return; return;
@ -697,11 +700,22 @@ RENDER_AGAIN:
//ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) ));
//ImGui::SetNextWindowSize(ImVec2(window_size)); //ImGui::SetNextWindowSize(ImVec2(window_size));
const float approx_height = m_imgui->scaled(18.0f);
y = std::min(y, bottom_limit - approx_height);
m_imgui->set_next_window_pos(x, y, ImGuiCond_Always);
m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
// adjust window position to avoid overlap the view toolbar
float win_h = ImGui::GetWindowHeight();
y = std::min(y, bottom_limit - win_h);
ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always);
if ((last_h != win_h) || (last_y != y))
{
// ask canvas for another frame to render the window in the correct position
m_parent.request_extra_frame();
if (last_h != win_h)
last_h = win_h;
if (last_y != y)
last_y = y;
}
// First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that: // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that:
const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); const float settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f);