mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 12:35:55 +08:00
Follow-up of 8312dc24547df8e622bde814efb1b3e0b15bab40 - Fixed rendering of point on locked features when the object is scaled
This commit is contained in:
parent
6971b72766
commit
bc1e5a0272
@ -317,7 +317,6 @@ void GLGizmoMeasure::on_render()
|
|||||||
(selection.is_single_volume() || selection.is_single_volume_instance())) {
|
(selection.is_single_volume() || selection.is_single_volume_instance())) {
|
||||||
update_if_needed();
|
update_if_needed();
|
||||||
|
|
||||||
m_volume_matrix = selection.get_first_volume()->world_matrix();
|
|
||||||
const Camera& camera = wxGetApp().plater()->get_camera();
|
const Camera& camera = wxGetApp().plater()->get_camera();
|
||||||
const float inv_zoom = (float)camera.get_inv_zoom();
|
const float inv_zoom = (float)camera.get_inv_zoom();
|
||||||
|
|
||||||
@ -397,7 +396,6 @@ void GLGizmoMeasure::on_render()
|
|||||||
Vec3f n;
|
Vec3f n;
|
||||||
const Transform3d& trafo = it->second->get_transform();
|
const Transform3d& trafo = it->second->get_transform();
|
||||||
bool res = it->second->get_raycaster()->closest_hit(m_mouse_pos, trafo, camera, p, n);
|
bool res = it->second->get_raycaster()->closest_hit(m_mouse_pos, trafo, camera, p, n);
|
||||||
assert(res);
|
|
||||||
if (res) {
|
if (res) {
|
||||||
if (callback)
|
if (callback)
|
||||||
p = callback(p);
|
p = callback(p);
|
||||||
@ -472,15 +470,14 @@ void GLGizmoMeasure::on_render()
|
|||||||
};
|
};
|
||||||
|
|
||||||
auto render_feature = [this, set_matrix_uniforms](const Measure::SurfaceFeature& feature, const std::vector<ColorRGBA>& colors,
|
auto render_feature = [this, set_matrix_uniforms](const Measure::SurfaceFeature& feature, const std::vector<ColorRGBA>& colors,
|
||||||
const Transform3d& model_matrix, float inv_zoom, bool update_raycasters) {
|
float inv_zoom, bool update_raycasters) {
|
||||||
const Transform3d model_matrix_scale_inverse = Geometry::Transformation(model_matrix).get_scaling_factor_matrix().inverse();
|
|
||||||
switch (feature.get_type())
|
switch (feature.get_type())
|
||||||
{
|
{
|
||||||
default: { assert(false); break; }
|
default: { assert(false); break; }
|
||||||
case Measure::SurfaceFeatureType::Point:
|
case Measure::SurfaceFeatureType::Point:
|
||||||
{
|
{
|
||||||
const Vec3d& position = feature.get_point();
|
const Vec3d& position = feature.get_point();
|
||||||
const Transform3d feature_matrix = model_matrix * Geometry::translation_transform(position) * model_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
const Transform3d feature_matrix = m_volume_matrix * Geometry::translation_transform(position) * m_volume_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
||||||
set_matrix_uniforms(feature_matrix);
|
set_matrix_uniforms(feature_matrix);
|
||||||
m_sphere.model.set_color(colors.front());
|
m_sphere.model.set_color(colors.front());
|
||||||
m_sphere.model.render();
|
m_sphere.model.render();
|
||||||
@ -495,7 +492,7 @@ void GLGizmoMeasure::on_render()
|
|||||||
{
|
{
|
||||||
const auto& [center, radius, normal] = feature.get_circle();
|
const auto& [center, radius, normal] = feature.get_circle();
|
||||||
// render center
|
// render center
|
||||||
const Transform3d center_matrix = model_matrix * Geometry::translation_transform(center) * model_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
const Transform3d center_matrix = m_volume_matrix * Geometry::translation_transform(center) * m_volume_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
||||||
set_matrix_uniforms(center_matrix);
|
set_matrix_uniforms(center_matrix);
|
||||||
m_sphere.model.set_color(colors.front());
|
m_sphere.model.set_color(colors.front());
|
||||||
m_sphere.model.render();
|
m_sphere.model.render();
|
||||||
@ -505,7 +502,7 @@ void GLGizmoMeasure::on_render()
|
|||||||
it->second->set_transform(center_matrix);
|
it->second->set_transform(center_matrix);
|
||||||
}
|
}
|
||||||
// render circle
|
// render circle
|
||||||
const Transform3d circle_matrix = model_matrix * Geometry::translation_transform(center) * Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), normal);
|
const Transform3d circle_matrix = m_volume_matrix * Geometry::translation_transform(center) * Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), normal);
|
||||||
set_matrix_uniforms(circle_matrix);
|
set_matrix_uniforms(circle_matrix);
|
||||||
m_circle.model.set_color(colors.back());
|
m_circle.model.set_color(colors.back());
|
||||||
m_circle.model.render();
|
m_circle.model.render();
|
||||||
@ -522,7 +519,7 @@ void GLGizmoMeasure::on_render()
|
|||||||
// render extra point
|
// render extra point
|
||||||
const std::optional<Vec3d> extra = feature.get_extra_point();
|
const std::optional<Vec3d> extra = feature.get_extra_point();
|
||||||
if (extra.has_value()) {
|
if (extra.has_value()) {
|
||||||
const Transform3d point_matrix = model_matrix * Geometry::translation_transform(*extra) * model_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
const Transform3d point_matrix = m_volume_matrix * Geometry::translation_transform(*extra) * m_volume_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
||||||
set_matrix_uniforms(point_matrix);
|
set_matrix_uniforms(point_matrix);
|
||||||
m_sphere.model.set_color(colors.front());
|
m_sphere.model.set_color(colors.front());
|
||||||
m_sphere.model.render();
|
m_sphere.model.render();
|
||||||
@ -533,16 +530,16 @@ void GLGizmoMeasure::on_render()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// render edge
|
// render edge
|
||||||
const Transform3d feature_matrix = model_matrix * Geometry::translation_transform(start) *
|
const Transform3d edge_matrix = m_volume_matrix * Geometry::translation_transform(start) *
|
||||||
Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), end - start) *
|
Eigen::Quaternion<double>::FromTwoVectors(Vec3d::UnitZ(), end - start) *
|
||||||
Geometry::scale_transform({ (double)inv_zoom, (double)inv_zoom, (end - start).norm() });
|
Geometry::scale_transform({ (double)inv_zoom, (double)inv_zoom, (end - start).norm() });
|
||||||
set_matrix_uniforms(feature_matrix);
|
set_matrix_uniforms(edge_matrix);
|
||||||
m_cylinder.model.set_color(colors.back());
|
m_cylinder.model.set_color(colors.back());
|
||||||
m_cylinder.model.render();
|
m_cylinder.model.render();
|
||||||
if (update_raycasters) {
|
if (update_raycasters) {
|
||||||
auto it = m_raycasters.find(EDGE_ID);
|
auto it = m_raycasters.find(EDGE_ID);
|
||||||
if (it != m_raycasters.end() && it->second != nullptr)
|
if (it != m_raycasters.end() && it->second != nullptr)
|
||||||
it->second->set_transform(feature_matrix);
|
it->second->set_transform(edge_matrix);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -550,13 +547,13 @@ void GLGizmoMeasure::on_render()
|
|||||||
{
|
{
|
||||||
const auto& [idx, normal, pt] = feature.get_plane();
|
const auto& [idx, normal, pt] = feature.get_plane();
|
||||||
assert(idx < m_plane_models_cache.size());
|
assert(idx < m_plane_models_cache.size());
|
||||||
set_matrix_uniforms(model_matrix);
|
set_matrix_uniforms(m_volume_matrix);
|
||||||
m_plane_models_cache[idx].set_color(colors.front());
|
m_plane_models_cache[idx].set_color(colors.front());
|
||||||
m_plane_models_cache[idx].render();
|
m_plane_models_cache[idx].render();
|
||||||
if (update_raycasters) {
|
if (update_raycasters) {
|
||||||
auto it = m_raycasters.find(PLANE_ID);
|
auto it = m_raycasters.find(PLANE_ID);
|
||||||
if (it != m_raycasters.end() && it->second != nullptr)
|
if (it != m_raycasters.end() && it->second != nullptr)
|
||||||
it->second->set_transform(model_matrix);
|
it->second->set_transform(m_volume_matrix);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -601,13 +598,13 @@ void GLGizmoMeasure::on_render()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render_feature(*m_curr_feature, colors, m_volume_matrix, inv_zoom, true);
|
render_feature(*m_curr_feature, colors, inv_zoom, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_selected_features.first.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.first.feature)) {
|
if (m_selected_features.first.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.first.feature)) {
|
||||||
std::vector<ColorRGBA> colors;
|
std::vector<ColorRGBA> colors;
|
||||||
colors.emplace_back(SELECTED_1ST_COLOR);
|
colors.emplace_back(SELECTED_1ST_COLOR);
|
||||||
render_feature(*m_selected_features.first.feature, colors, m_volume_matrix, inv_zoom, false);
|
render_feature(*m_selected_features.first.feature, colors, inv_zoom, false);
|
||||||
if (m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
if (m_selected_features.first.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
||||||
auto it = std::find_if(m_selection_raycasters.begin(), m_selection_raycasters.end(),
|
auto it = std::find_if(m_selection_raycasters.begin(), m_selection_raycasters.end(),
|
||||||
[](std::shared_ptr<SceneRaycasterItem> item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SELECTION_1_ID; });
|
[](std::shared_ptr<SceneRaycasterItem> item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SELECTION_1_ID; });
|
||||||
@ -618,7 +615,7 @@ void GLGizmoMeasure::on_render()
|
|||||||
if (m_selected_features.second.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.second.feature)) {
|
if (m_selected_features.second.feature.has_value() && (!m_curr_feature.has_value() || *m_curr_feature != *m_selected_features.second.feature)) {
|
||||||
std::vector<ColorRGBA> colors;
|
std::vector<ColorRGBA> colors;
|
||||||
colors.emplace_back(SELECTED_2ND_COLOR);
|
colors.emplace_back(SELECTED_2ND_COLOR);
|
||||||
render_feature(*m_selected_features.second.feature, colors, m_volume_matrix, inv_zoom, false);
|
render_feature(*m_selected_features.second.feature, colors, inv_zoom, false);
|
||||||
if (m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
if (m_selected_features.second.feature->get_type() == Measure::SurfaceFeatureType::Point) {
|
||||||
auto it = std::find_if(m_selection_raycasters.begin(), m_selection_raycasters.end(),
|
auto it = std::find_if(m_selection_raycasters.begin(), m_selection_raycasters.end(),
|
||||||
[](std::shared_ptr<SceneRaycasterItem> item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SELECTION_2_ID; });
|
[](std::shared_ptr<SceneRaycasterItem> item) { return SceneRaycaster::decode_id(SceneRaycaster::EType::Gizmo, item->get_id()) == SELECTION_2_ID; });
|
||||||
@ -629,7 +626,7 @@ void GLGizmoMeasure::on_render()
|
|||||||
|
|
||||||
if (is_hovering_on_locked_feature && m_curr_point_on_feature_position.has_value()) {
|
if (is_hovering_on_locked_feature && m_curr_point_on_feature_position.has_value()) {
|
||||||
if (m_hover_id != POINT_ID) {
|
if (m_hover_id != POINT_ID) {
|
||||||
const Transform3d matrix = m_volume_matrix * Geometry::translation_transform(*m_curr_point_on_feature_position) * Geometry::scale_transform(inv_zoom);
|
const Transform3d matrix = m_volume_matrix * Geometry::translation_transform(*m_curr_point_on_feature_position) * m_volume_matrix_scale_inverse * Geometry::scale_transform(inv_zoom);
|
||||||
set_matrix_uniforms(matrix);
|
set_matrix_uniforms(matrix);
|
||||||
m_sphere.model.set_color(hover_selection_color());
|
m_sphere.model.set_color(hover_selection_color());
|
||||||
m_sphere.model.render();
|
m_sphere.model.render();
|
||||||
@ -675,6 +672,9 @@ void GLGizmoMeasure::update_if_needed()
|
|||||||
}
|
}
|
||||||
m_old_model_object = object;
|
m_old_model_object = object;
|
||||||
m_old_model_volume = volume;
|
m_old_model_volume = volume;
|
||||||
|
|
||||||
|
m_volume_matrix = m_parent.get_selection().get_first_volume()->world_matrix();
|
||||||
|
m_volume_matrix_scale_inverse = Geometry::Transformation(m_volume_matrix).get_scaling_factor_matrix().inverse();
|
||||||
};
|
};
|
||||||
|
|
||||||
const ModelObject* mo = m_c->selection_info()->model_object();
|
const ModelObject* mo = m_c->selection_info()->model_object();
|
||||||
|
@ -87,6 +87,7 @@ class GLGizmoMeasure : public GLGizmoBase
|
|||||||
Dimensioning m_dimensioning;
|
Dimensioning m_dimensioning;
|
||||||
|
|
||||||
Transform3d m_volume_matrix{ Transform3d::Identity() };
|
Transform3d m_volume_matrix{ Transform3d::Identity() };
|
||||||
|
Transform3d m_volume_matrix_scale_inverse{ Transform3d::Identity() };
|
||||||
std::vector<GLModel> m_plane_models_cache;
|
std::vector<GLModel> m_plane_models_cache;
|
||||||
std::map<int, std::shared_ptr<SceneRaycasterItem>> m_raycasters;
|
std::map<int, std::shared_ptr<SceneRaycasterItem>> m_raycasters;
|
||||||
std::vector<std::shared_ptr<SceneRaycasterItem>> m_selection_raycasters;
|
std::vector<std::shared_ptr<SceneRaycasterItem>> m_selection_raycasters;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user