mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-12 10:11:50 +08:00
Measuring: Gizmo measure shows dimensioning for distance point-plane
This commit is contained in:
parent
5825e85012
commit
55209dba4b
@ -758,34 +758,32 @@ void GLGizmoMeasure::render_dimensioning()
|
|||||||
};
|
};
|
||||||
|
|
||||||
auto point_edge = [this, shader, point_point](const Vec3d& v, const std::pair<Vec3d, Vec3d>& e) {
|
auto point_edge = [this, shader, point_point](const Vec3d& v, const std::pair<Vec3d, Vec3d>& e) {
|
||||||
const Vec3d e1v = v - e.first;
|
|
||||||
const Vec3d e1e2 = e.second - e.first;
|
const Vec3d e1e2 = e.second - e.first;
|
||||||
const Vec3d e1e2_unit = e1e2.normalized();
|
const Vec3d e1e2_unit = e1e2.normalized();
|
||||||
const Vec3d v_proj_on_e1e2 = e.first + e1v.dot(e1e2_unit) * e1e2_unit;
|
const Vec3d v_proj = e.first + e1e2_unit.dot(v - e.first) * e1e2_unit;
|
||||||
point_point(v, v_proj_on_e1e2);
|
point_point(v, v_proj);
|
||||||
|
|
||||||
const Vec3d v_proj_on_e1e2e1 = v_proj_on_e1e2 - e.first;
|
const Vec3d v_proje1 = v_proj - e.first;
|
||||||
bool on_e1_side = v_proj_on_e1e2e1.dot(e1e2) < 0.0;
|
bool on_e1_side = v_proje1.dot(e1e2) < 0.0;
|
||||||
bool on_e2_side = v_proj_on_e1e2e1.norm() > e1e2.norm();
|
bool on_e2_side = v_proje1.norm() > e1e2.norm();
|
||||||
if (on_e1_side || on_e2_side) {
|
if (on_e1_side || on_e2_side) {
|
||||||
const Camera& camera = wxGetApp().plater()->get_camera();
|
const Camera& camera = wxGetApp().plater()->get_camera();
|
||||||
const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix();
|
const Matrix4d projection_view_matrix = camera.get_projection_matrix().matrix() * camera.get_view_matrix().matrix();
|
||||||
const std::array<int, 4>& viewport = camera.get_viewport();
|
const std::array<int, 4>& viewport = camera.get_viewport();
|
||||||
const Transform3d ss_to_ndc_matrix = DimensioningHelper::ndc_to_ss_matrix_inverse(viewport);
|
const Transform3d ss_to_ndc_matrix = DimensioningHelper::ndc_to_ss_matrix_inverse(viewport);
|
||||||
|
|
||||||
shader->set_uniform("projection_matrix", Transform3d::Identity());
|
const Vec2d v_projss = DimensioningHelper::model_to_ss(v_proj, m_volume_matrix, projection_view_matrix, viewport);
|
||||||
|
auto render_extension = [this, &v_projss, &projection_view_matrix, &viewport, &ss_to_ndc_matrix, shader](const Vec3d& p) {
|
||||||
const Vec2d v_proj_on_e1e2ss = DimensioningHelper::model_to_ss(v_proj_on_e1e2, m_volume_matrix, projection_view_matrix, viewport);
|
|
||||||
auto render_extension = [this, &v_proj_on_e1e2ss, &projection_view_matrix, &viewport, &ss_to_ndc_matrix, shader](const Vec3d& p) {
|
|
||||||
const Vec2d pss = DimensioningHelper::model_to_ss(p, m_volume_matrix, projection_view_matrix, viewport);
|
const Vec2d pss = DimensioningHelper::model_to_ss(p, m_volume_matrix, projection_view_matrix, viewport);
|
||||||
if (!pss.isApprox(v_proj_on_e1e2ss)) {
|
if (!pss.isApprox(v_projss)) {
|
||||||
const Vec2d pv_proj_on_e1e2ss = v_proj_on_e1e2ss - pss;
|
const Vec2d pv_projss = v_projss - pss;
|
||||||
const double pv_proj_on_e1e2ss_len = pv_proj_on_e1e2ss.norm();
|
const double pv_projss_len = pv_projss.norm();
|
||||||
|
|
||||||
const auto q = Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitX(), Vec3d(pv_proj_on_e1e2ss.x(), pv_proj_on_e1e2ss.y(), 0.0));
|
const auto q = Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitX(), Vec3d(pv_projss.x(), pv_projss.y(), 0.0));
|
||||||
|
|
||||||
|
shader->set_uniform("projection_matrix", Transform3d::Identity());
|
||||||
shader->set_uniform("view_model_matrix", ss_to_ndc_matrix * Geometry::translation_transform({ pss.x(), pss.y(), 0.0 }) * q *
|
shader->set_uniform("view_model_matrix", ss_to_ndc_matrix * Geometry::translation_transform({ pss.x(), pss.y(), 0.0 }) * q *
|
||||||
Geometry::scale_transform({ pv_proj_on_e1e2ss_len, 1.0f, 1.0f }));
|
Geometry::scale_transform({ pv_projss_len, 1.0f, 1.0f }));
|
||||||
m_dimensioning.line.render();
|
m_dimensioning.line.render();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -794,6 +792,15 @@ void GLGizmoMeasure::render_dimensioning()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
auto point_plane = [this, shader, point_point](const Vec3d& v, const std::tuple<int, Vec3d, Vec3d>& p) {
|
||||||
|
const auto& [idx, normal, origin] = p;
|
||||||
|
const double distance = normal.dot(v - origin);
|
||||||
|
if (std::abs(distance) < EPSILON)
|
||||||
|
return;
|
||||||
|
|
||||||
|
point_point(v, v - distance * normal);
|
||||||
|
};
|
||||||
|
|
||||||
shader->start_using();
|
shader->start_using();
|
||||||
|
|
||||||
if (!m_dimensioning.line.is_initialized()) {
|
if (!m_dimensioning.line.is_initialized()) {
|
||||||
@ -845,6 +852,14 @@ void GLGizmoMeasure::render_dimensioning()
|
|||||||
m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
||||||
point_edge(m_selected_features.second.feature->get_point(), m_selected_features.first.feature->get_edge());
|
point_edge(m_selected_features.second.feature->get_point(), m_selected_features.first.feature->get_edge());
|
||||||
}
|
}
|
||||||
|
else if (m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Point &&
|
||||||
|
m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Plane) {
|
||||||
|
point_plane(m_selected_features.first.feature->get_point(), m_selected_features.second.feature->get_plane());
|
||||||
|
}
|
||||||
|
else if (m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Plane &&
|
||||||
|
m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
||||||
|
point_plane(m_selected_features.second.feature->get_point(), m_selected_features.first.feature->get_plane());
|
||||||
|
}
|
||||||
|
|
||||||
glsafe(::glEnable(GL_DEPTH_TEST));
|
glsafe(::glEnable(GL_DEPTH_TEST));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user