FIX:mesh is not unique After copied

Jira: STUDIO-6643
Change-Id: I3189bd2200fdc98e3565a91c0a34837eae749528
This commit is contained in:
zhou.xu 2024-03-22 14:19:35 +08:00 committed by Lane.Wei
parent a5a944aae4
commit b412cba589
3 changed files with 14 additions and 12 deletions

View File

@ -35,7 +35,7 @@ public:
SurfaceFeature(const SurfaceFeature& sf){ SurfaceFeature(const SurfaceFeature& sf){
this->clone(sf); this->clone(sf);
mesh = sf.mesh; volume = sf.volume;
plane_indices = sf.plane_indices; plane_indices = sf.plane_indices;
world_tran = sf.world_tran; world_tran = sf.world_tran;
world_plane_features = sf.world_plane_features; world_plane_features = sf.world_plane_features;
@ -92,7 +92,7 @@ public:
return !operator == (other); return !operator == (other);
} }
indexed_triangle_set* mesh{nullptr}; void* volume{nullptr};
std::vector<int>* plane_indices{nullptr}; std::vector<int>* plane_indices{nullptr};
Transform3d world_tran; Transform3d world_tran;
std::shared_ptr<std::vector<SurfaceFeature>> world_plane_features{nullptr}; std::shared_ptr<std::vector<SurfaceFeature>> world_plane_features{nullptr};

View File

@ -354,7 +354,7 @@ bool GLGizmoMeasure::on_mouse(const wxMouseEvent &mouse_event)
auto local_pt = m_curr_feature->world_tran.inverse() * (*m_curr_point_on_feature_position); auto local_pt = m_curr_feature->world_tran.inverse() * (*m_curr_point_on_feature_position);
item.feature->origin_surface_feature = std::make_shared<Measure::SurfaceFeature>(local_pt); item.feature->origin_surface_feature = std::make_shared<Measure::SurfaceFeature>(local_pt);
item.feature->world_tran = m_curr_feature->world_tran; item.feature->world_tran = m_curr_feature->world_tran;
item.feature->mesh = m_curr_feature->mesh; item.feature->volume = m_curr_feature->volume;
break; } break; }
} }
} }
@ -627,6 +627,9 @@ void GLGizmoMeasure::init_circle_glmodel(GripperType gripper_type, const Measure
void GLGizmoMeasure::init_plane_glmodel(GripperType gripper_type, const Measure::SurfaceFeature &feature, PlaneGLModel &plane_gl_model) void GLGizmoMeasure::init_plane_glmodel(GripperType gripper_type, const Measure::SurfaceFeature &feature, PlaneGLModel &plane_gl_model)
{ {
if (!m_curr_feature->volume) { return;}
auto volume = static_cast<GLVolume*>(m_curr_feature->volume);
auto mesh = const_cast<TriangleMesh *>(volume->ori_mesh);
const auto &[idx, normal, pt] = feature.get_plane(); const auto &[idx, normal, pt] = feature.get_plane();
if (plane_gl_model.plane_idx != idx) { if (plane_gl_model.plane_idx != idx) {
plane_gl_model.plane.reset(); plane_gl_model.plane.reset();
@ -634,7 +637,7 @@ void GLGizmoMeasure::init_plane_glmodel(GripperType gripper_type, const Measure:
if (!plane_gl_model.plane) { if (!plane_gl_model.plane) {
plane_gl_model.plane_idx = idx; plane_gl_model.plane_idx = idx;
reset_gripper_pick(gripper_type); reset_gripper_pick(gripper_type);
plane_gl_model.plane = init_plane_data(*feature.mesh, *feature.plane_indices); plane_gl_model.plane = init_plane_data(mesh->its, *feature.plane_indices);
if (plane_gl_model.plane) { if (plane_gl_model.plane) {
if (auto mesh = plane_gl_model.plane->mesh) { if (auto mesh = plane_gl_model.plane->mesh) {
m_gripper_id_raycast_map[gripper_type] = std::make_shared<PickRaycaster>(mesh, PLANE_ID); m_gripper_id_raycast_map[gripper_type] = std::make_shared<PickRaycaster>(mesh, PLANE_ID);
@ -770,8 +773,7 @@ void GLGizmoMeasure::on_render()
reset_gripper_pick(GripperType::UNDEFINE, true); reset_gripper_pick(GripperType::UNDEFINE, true);
m_curr_feature = curr_feature; m_curr_feature = curr_feature;
auto mesh = const_cast<TriangleMesh *>(m_last_hit_volume->ori_mesh); m_curr_feature->volume = m_last_hit_volume;
m_curr_feature->mesh = &mesh->its;
m_curr_feature->world_tran = m_mesh_raycaster_map[m_last_hit_volume]->world_tran.get_matrix(); m_curr_feature->world_tran = m_mesh_raycaster_map[m_last_hit_volume]->world_tran.get_matrix();
if (!m_curr_feature.has_value()) if (!m_curr_feature.has_value())
return; return;
@ -2301,12 +2303,10 @@ bool Slic3r::GUI::GLGizmoMeasure::is_two_volume_in_same_model_object()
return false; return false;
} }
Measure::Measuring *GLGizmoMeasure::get_measuring_of_mesh(indexed_triangle_set *mesh, Transform3d &tran) Measure::Measuring *GLGizmoMeasure::get_measuring_of_mesh(GLVolume *v, Transform3d &tran)
{ {
for (auto glvolume:m_hit_order_volumes) { for (auto glvolume:m_hit_order_volumes) {
auto ori_mesh = const_cast<TriangleMesh*>(glvolume->ori_mesh); if (glvolume == v) {
auto ori_triangle_set = const_cast<indexed_triangle_set*>(&ori_mesh->its);
if (ori_triangle_set == mesh) {
tran = m_mesh_raycaster_map[glvolume]->world_tran.get_matrix(); tran = m_mesh_raycaster_map[glvolume]->world_tran.get_matrix();
return m_mesh_measure_map[glvolume].get(); return m_mesh_measure_map[glvolume].get();
} }
@ -2336,7 +2336,9 @@ void GLGizmoMeasure::update_world_plane_features(Measure::Measuring *cur_measuri
void GLGizmoMeasure::update_feature_by_tran(Measure::SurfaceFeature &feature) void GLGizmoMeasure::update_feature_by_tran(Measure::SurfaceFeature &feature)
{ {
Measure::Measuring *cur_measuring = get_measuring_of_mesh(feature.mesh, feature.world_tran); if (!feature.volume) { return; }
auto volume = static_cast<GLVolume *>(feature.volume);
Measure::Measuring *cur_measuring = get_measuring_of_mesh(volume, feature.world_tran);
switch (feature.get_type()) { switch (feature.get_type()) {
case Measure::SurfaceFeatureType::Point: case Measure::SurfaceFeatureType::Point:
case Measure::SurfaceFeatureType::Edge: case Measure::SurfaceFeatureType::Edge:

View File

@ -199,7 +199,7 @@ protected:
void reset_feature1(); void reset_feature1();
void reset_feature2(); void reset_feature2();
bool is_two_volume_in_same_model_object(); bool is_two_volume_in_same_model_object();
Measure::Measuring* get_measuring_of_mesh(indexed_triangle_set *mesh, Transform3d &tran); Measure::Measuring* get_measuring_of_mesh(GLVolume *v, Transform3d &tran);
void update_world_plane_features(Measure::Measuring *cur_measuring, Measure::SurfaceFeature &feautre); void update_world_plane_features(Measure::Measuring *cur_measuring, Measure::SurfaceFeature &feautre);
void update_feature_by_tran(Measure::SurfaceFeature & feature); void update_feature_by_tran(Measure::SurfaceFeature & feature);
private: private: