From 14fc691b36fffd6a37d943a2fa3cdb3ffad58207 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Mon, 3 Oct 2022 12:54:22 +0200 Subject: [PATCH] Measuring - Gizmo measure shows arrows at endpoints of angle dimensioning --- src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp | 35 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp index 8a4cd17d94..f55874071d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMeasure.cpp @@ -929,13 +929,30 @@ void GLGizmoMeasure::render_dimensioning() m_dimensioning.arc.init_from(std::move(init_data)); } - // render arc + // arc const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_volume_matrix * Geometry::translation_transform(center)); m_dimensioning.arc.render(); - // render edge 1 extension + // arrows + auto render_arrow = [this, shader, &camera, &normal, ¢er, &e1_unit, draw_radius, step, resolution](unsigned int endpoint_id) { + const double angle = (endpoint_id == 1) ? 0.0 : step * double(resolution); + const Vec3d position_model = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(angle, normal)) * e1_unit)); + const Vec3d direction_model = (endpoint_id == 1) ? -normal.cross(position_model - center).normalized() : normal.cross(position_model - center).normalized(); + const Transform3d view_model_matrix = camera.get_view_matrix() * m_volume_matrix * Geometry::translation_transform(position_model) * + Eigen::Quaternion::FromTwoVectors(Vec3d::UnitX(), direction_model) * Eigen::Quaternion::FromTwoVectors(Vec3d::UnitZ(), normal) * + Geometry::scale_transform(camera.get_inv_zoom()); + shader->set_uniform("view_model_matrix", view_model_matrix); + m_dimensioning.triangle.render(); + }; + + glsafe(::glDisable(GL_CULL_FACE)); + render_arrow(1); + render_arrow(2); + glsafe(::glEnable(GL_CULL_FACE)); + + // edge 1 extension const Vec3d e11e12 = e1.second - e1.first; const Vec3d e11center = center - e1.first; const double e11center_len = e11center.norm(); @@ -946,7 +963,7 @@ void GLGizmoMeasure::render_dimensioning() m_dimensioning.line.render(); } - // render edge 2 extension + // edge 2 extension const Vec3d e21center = center - e2.first; const double e21center_len = e21center.norm(); if (e21center_len > EPSILON) { @@ -956,12 +973,13 @@ void GLGizmoMeasure::render_dimensioning() m_dimensioning.line.render(); } - // world coordinates - const Vec3d label_position_world = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(step * 0.5 * double(resolution), normal)) * e1_unit)); + // label + // label model coordinates + const Vec3d label_position_model = Geometry::translation_transform(center) * (draw_radius * (Eigen::Quaternion(Eigen::AngleAxisd(step * 0.5 * double(resolution), normal)) * e1_unit)); - // screen coordinates + // label screen coordinates const std::array& viewport = camera.get_viewport(); - const Vec2d label_position_ss = DimensioningHelper::model_to_ss(label_position_world, m_volume_matrix, + const Vec2d label_position_ss = DimensioningHelper::model_to_ss(label_position_model, m_volume_matrix, camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix(), viewport); m_imgui->set_next_window_pos(label_position_ss.x(), viewport[3] - label_position_ss.y(), ImGuiCond_Always, 0.0f, 1.0f); @@ -969,8 +987,7 @@ void GLGizmoMeasure::render_dimensioning() ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); m_imgui->begin(_L("##angle"), ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); - std::string txt = format_double(Geometry::rad2deg(angle)) + "°"; - m_imgui->text(txt); + m_imgui->text(format_double(Geometry::rad2deg(angle)) + "°"); m_imgui->end(); ImGui::PopStyleVar(); };