On rayCast miss add part simillar way as right panel do.

Fix: https://github.com/prusa3d/PrusaSlicer/issues/9611
This commit is contained in:
Filip Sykala - NTB T15p 2023-02-07 12:10:40 +01:00
parent d6eea1de42
commit c1b480e57f
2 changed files with 19 additions and 11 deletions

View file

@ -229,13 +229,17 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mous
GLVolume *gl_volume = priv::get_hovered_gl_volume(m_parent);
DataBase emboss_data = priv::create_emboss_data_base(m_text, m_style_manager, m_job_cancel);
// Try to cast ray into scene and find object for add volume
if (priv::start_create_volume_on_surface_job(emboss_data, volume_type, mouse_pos, gl_volume, m_raycast_manager))
// object found
return;
// object is not under mouse position soo create object on plater
priv::start_create_object_job(emboss_data, mouse_pos);
if (gl_volume != nullptr) {
// Try to cast ray into scene and find object for add volume
if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, mouse_pos, gl_volume, m_raycast_manager)) {
// When model is broken. It could appear that hit miss the object.
// So add part near by in simmilar manner as right panel do
create_volume(volume_type);
}
} else {
// object is not under mouse position soo create object on plater
priv::start_create_object_job(emboss_data, mouse_pos);
}
}
// Designed for create volume without information of mouse in scene
@ -266,8 +270,9 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type)
const GLVolume *vol = nullptr;
const Camera &camera = wxGetApp().plater()->get_camera();
priv::find_closest_volume(selection, screen_center, camera, objects, &coor, &vol);
if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, coor, vol, m_raycast_manager)) {
assert(vol != nullptr);
if (vol == nullptr) {
priv::start_create_object_job(emboss_data, screen_center);
} else if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, coor, vol, m_raycast_manager)) {
// in centroid of convex hull is not hit with object
// soo create transfomation on border of object
@ -3924,7 +3929,9 @@ GLVolume * priv::get_hovered_gl_volume(const GLCanvas3D &canvas) {
bool priv::start_create_volume_on_surface_job(
DataBase &emboss_data, ModelVolumeType volume_type, const Vec2d &screen_coor, const GLVolume *gl_volume, RaycastManager &raycaster)
{
assert(gl_volume != nullptr);
if (gl_volume == nullptr) return false;
Plater *plater = wxGetApp().plater();
const ModelObjectPtrs &objects = plater->model().objects;
@ -3941,7 +3948,8 @@ bool priv::start_create_volume_on_surface_job(
// context menu for add text could be open only by right click on an
// object. After right click, object is selected and object_idx is set
// also hit must exist. But there is options to add text by object list
if (!hit.has_value()) return false;
if (!hit.has_value())
return false;
Transform3d hit_object_trmat = raycaster.get_transformation(hit->tr_key);
Transform3d hit_instance_trmat = gl_volume->get_instance_transformation().get_matrix();

View file

@ -124,7 +124,7 @@ public:
std::optional<Hit> closest(const Vec3d &point, const ISkip *skip = nullptr) const;
/// <summary>
/// Getter on transformation
/// Getter on transformation from hitted volume to world
/// </summary>
/// <param name="tr_key">Define transformation</param>
/// <returns>Transformation for key</returns>