514{
515
517 if (gl_volume_ptr == nullptr)
518 return false;
519 const GLVolume &gl_volume = *gl_volume_ptr;
520
521
524 return false;
525 else if (auto hovered_idx_ = static_cast<size_t>(hovered_idx);
526 hovered_idx_ >= gl_volumes.size() || gl_volumes[hovered_idx_] != gl_volume_ptr)
527 return false;
528
531 assert(object != nullptr);
532 if (object == nullptr)
533 return false;
534
537 assert(instance != nullptr && volume != nullptr);
538 if (object == nullptr || instance == nullptr || volume == nullptr)
539 return false;
540
541
543 return false;
544
547
548
549
550 raycast_manager.
actualize(*instance, &condition, &meshes);
551
552
554
555
556 Vec3d volume_center = to_world.translation();
557
559 Vec2d mouse_offset = coor.cast<
double>() - mouse_pos;
560 Vec2d mouse_offset_without_sla_shift = mouse_offset;
564 to_world_without_sla_move = to_world_without_sla_move * (*volume->
emboss_shape->fix_3mf_tr);
565
566 volume_center = to_world_without_sla_move.translation();
567
569 mouse_offset_without_sla_shift = coor.cast<double>() - mouse_pos;
570 }
571
573
574
575 if (
const std::optional<EmbossShape> &es_opt = volume->
emboss_shape; es_opt.has_value()) {
576 const std::optional<Slic3r::Transform3d> &fix = es_opt->fix_3mf_tr;
577 if (fix.has_value())
578 volume_tr = volume_tr * fix->inverse();
579 }
580
582 Transform3d instance_tr_inv = instance_tr.inverse();
584 std::optional<float> start_angle;
585 if (up_limit.has_value()) {
588 start_angle = -(*start_angle);
589 }
590
591 std::optional<float> start_distance;
594 surface_drag = SurfaceDrag{mouse_offset, world_tr, instance_tr_inv,
595 gl_volume_ptr, condition, start_angle,
596 start_distance, true, mouse_offset_without_sla_shift};
597
598
601 return true;
602}
double get_sla_shift_z() const
Definition 3DScene.hpp:334
const Geometry::Transformation & get_volume_transformation() const
Definition 3DScene.hpp:306
static Points project(const Camera &camera, const std::vector< Vec3d > &points)
Project point throw camera to 2d coordinate into imgui window.
Definition CameraUtils.cpp:23
void enable_picking(bool enable)
Definition GLCanvas3D.hpp:1086
int get_first_hover_volume_idx() const
Definition GLCanvas3D.hpp:1333
void enable_moving(bool enable)
Definition GLCanvas3D.hpp:1094
Definition RaycastManager.hpp:106
void actualize(const ModelObject &object, const ISkip *skip=nullptr, Meshes *meshes=nullptr)
Actualize raycasters + transformation Detection of removed object Detection of removed instance Detec...
Definition RaycastManager.cpp:38
std::vector< Mesh > Meshes
Definition RaycastManager.hpp:29
Definition Model.hpp:1421
const Transform3d & get_matrix() const
Definition Model.hpp:1511
ModelVolumePtrs volumes
Definition Model.hpp:393
const Transform3d & get_matrix() const
Definition Model.hpp:1139
bool is_the_only_one_part() const
Definition Model.cpp:2128
ObjectID id() const
Definition ObjectID.hpp:69
std::optional< float > calc_up(const Transform3d &tr, double up_limit=0.9)
By transformation calculate angle between suggested and actual up vector.
Definition Emboss.cpp:1768
ModelObject * get_model_object(const GLVolume &gl_volume, const Model &model)
Definition GLCanvas3D.cpp:13015
RaycastManager::Meshes create_meshes(GLCanvas3D &canvas, const RaycastManager::AllowVolumes &condition)
Use scene Raycasters and prepare data for actualize RaycasterManager.
Definition RaycastManager.cpp:330
std::optional< float > calc_distance(const GLVolume &gl_volume, RaycastManager &raycaster, GLCanvas3D &canvas)
Calculate distance by ray to surface of object in emboss direction.
Definition SurfaceDrag.cpp:198
Transform3d world_matrix_fixed(const GLVolume &gl_volume, const ModelObjectPtrs &objects)
Get transformation to world.
Definition SurfaceDrag.cpp:278
RaycastManager::AllowVolumes create_condition(const ModelVolumePtrs &volumes, const ObjectID &disallowed_volume_id)
Create condition to allowe only parts from volumes without one given.
Definition RaycastManager.cpp:376
ModelInstance * get_model_instance(const GLVolume &gl_volume, const Model &model)
Definition GLCanvas3D.cpp:13028
constexpr bool is_approx(Number value, Number test_value, Number precision=EPSILON)
Definition libslic3r.h:320
std::vector< GLVolume * > GLVolumePtrs
Definition 3DScene.hpp:412
bool has_reflection(const Transform3d &transform)
Check whether transformation matrix contains odd number of mirroring. NOTE: In code is sometime funct...
Definition Point.hpp:179
std::vector< ModelObject * > ModelObjectPtrs
Definition CutUtils.hpp:13