mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-07-13 03:21:49 +08:00
On rayCast miss add part simillar way as right panel do.
Fix: https://github.com/prusa3d/PrusaSlicer/issues/9611
This commit is contained in:
parent
d6eea1de42
commit
c1b480e57f
@ -229,13 +229,17 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mous
|
|||||||
|
|
||||||
GLVolume *gl_volume = priv::get_hovered_gl_volume(m_parent);
|
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);
|
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 (gl_volume != nullptr) {
|
||||||
if (priv::start_create_volume_on_surface_job(emboss_data, volume_type, mouse_pos, gl_volume, m_raycast_manager))
|
// Try to cast ray into scene and find object for add volume
|
||||||
// object found
|
if (!priv::start_create_volume_on_surface_job(emboss_data, volume_type, mouse_pos, gl_volume, m_raycast_manager)) {
|
||||||
return;
|
// When model is broken. It could appear that hit miss the object.
|
||||||
|
// So add part near by in simmilar manner as right panel do
|
||||||
// object is not under mouse position soo create object on plater
|
create_volume(volume_type);
|
||||||
priv::start_create_object_job(emboss_data, mouse_pos);
|
}
|
||||||
|
} 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
|
// 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 GLVolume *vol = nullptr;
|
||||||
const Camera &camera = wxGetApp().plater()->get_camera();
|
const Camera &camera = wxGetApp().plater()->get_camera();
|
||||||
priv::find_closest_volume(selection, screen_center, camera, objects, &coor, &vol);
|
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)) {
|
if (vol == nullptr) {
|
||||||
assert(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
|
// in centroid of convex hull is not hit with object
|
||||||
// soo create transfomation on border of 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(
|
bool priv::start_create_volume_on_surface_job(
|
||||||
DataBase &emboss_data, ModelVolumeType volume_type, const Vec2d &screen_coor, const GLVolume *gl_volume, RaycastManager &raycaster)
|
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;
|
if (gl_volume == nullptr) return false;
|
||||||
|
|
||||||
Plater *plater = wxGetApp().plater();
|
Plater *plater = wxGetApp().plater();
|
||||||
const ModelObjectPtrs &objects = plater->model().objects;
|
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
|
// 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
|
// 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
|
// 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_object_trmat = raycaster.get_transformation(hit->tr_key);
|
||||||
Transform3d hit_instance_trmat = gl_volume->get_instance_transformation().get_matrix();
|
Transform3d hit_instance_trmat = gl_volume->get_instance_transformation().get_matrix();
|
||||||
|
@ -124,7 +124,7 @@ public:
|
|||||||
std::optional<Hit> closest(const Vec3d &point, const ISkip *skip = nullptr) const;
|
std::optional<Hit> closest(const Vec3d &point, const ISkip *skip = nullptr) const;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Getter on transformation
|
/// Getter on transformation from hitted volume to world
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="tr_key">Define transformation</param>
|
/// <param name="tr_key">Define transformation</param>
|
||||||
/// <returns>Transformation for key</returns>
|
/// <returns>Transformation for key</returns>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user