mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-16 14:05:53 +08:00
Not use shared raycasters
This commit is contained in:
parent
f163e6a2ee
commit
4e559daece
@ -121,30 +121,17 @@ void GLGizmoEmboss::create_volume(ModelVolumeType volume_type, const Vec2d& mous
|
|||||||
set_default_configuration();
|
set_default_configuration();
|
||||||
|
|
||||||
// By position of cursor create transformation to put text on surface of model
|
// By position of cursor create transformation to put text on surface of model
|
||||||
Transform3d transformation = Transform3d::Identity();
|
Transform3d transformation;
|
||||||
|
const ModelObjectPtrs &objects = wxGetApp().plater()->model().objects;
|
||||||
|
m_raycast_manager.actualize(objects);
|
||||||
|
auto hit = m_raycast_manager.unproject(mouse_pos);
|
||||||
|
if (hit.has_value()) {
|
||||||
|
transformation = Emboss::create_transformation_onto_surface(hit->position, hit->normal);
|
||||||
|
} else {
|
||||||
|
// there is no hit with object
|
||||||
// TODO: calculate X,Y offset position for lay on platter by mouse position
|
// TODO: calculate X,Y offset position for lay on platter by mouse position
|
||||||
|
transformation = Transform3d::Identity();
|
||||||
CommonGizmosDataObjects::Raycaster *raycaster = m_c->raycaster();
|
}
|
||||||
if (raycaster == nullptr) return;
|
|
||||||
const std::vector<const MeshRaycaster *> &raycasters = raycaster->raycasters();
|
|
||||||
|
|
||||||
const ModelObject *mo = m_c->selection_info()->model_object();
|
|
||||||
if (mo == nullptr) return;
|
|
||||||
assert(mo->volumes.size() == raycasters.size());
|
|
||||||
|
|
||||||
int instance_idx = selection.get_instance_idx();
|
|
||||||
if (instance_idx < 0) return;
|
|
||||||
assert(static_cast<size_t>(instance_idx) < mo->instances.size());
|
|
||||||
|
|
||||||
const ModelInstance *mi = mo->instances[instance_idx];
|
|
||||||
const Transform3d instance_trafo = mi->get_transformation().get_matrix();
|
|
||||||
std::vector<Transform3d> raycasters_tr;
|
|
||||||
raycasters_tr.reserve(raycasters.size());
|
|
||||||
for (const auto &mv : mo->volumes)
|
|
||||||
raycasters_tr.emplace_back(instance_trafo * mv->get_matrix());
|
|
||||||
|
|
||||||
std::optional<Transform3d> tr = transform_on_surface(mouse_pos, raycasters, raycasters_tr);
|
|
||||||
if (tr.has_value()) transformation = *tr;
|
|
||||||
|
|
||||||
create_emboss_volume(create_mesh(), transformation, create_volume_name(),
|
create_emboss_volume(create_mesh(), transformation, create_volume_name(),
|
||||||
create_configuration(), volume_type,
|
create_configuration(), volume_type,
|
||||||
@ -389,12 +376,6 @@ void GLGizmoEmboss::on_set_state()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommonGizmosDataID GLGizmoEmboss::on_get_requirements() const
|
|
||||||
{
|
|
||||||
return CommonGizmosDataID((int) CommonGizmosDataID::Raycaster |
|
|
||||||
(int) CommonGizmosDataID::SelectionInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); }
|
void GLGizmoEmboss::on_start_dragging() { m_rotate_gizmo.start_dragging(); }
|
||||||
void GLGizmoEmboss::on_stop_dragging()
|
void GLGizmoEmboss::on_stop_dragging()
|
||||||
{
|
{
|
||||||
@ -643,47 +624,6 @@ void GLGizmoEmboss::draw_window()
|
|||||||
m_imgui->disabled_end();
|
m_imgui->disabled_end();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<Transform3d> GLGizmoEmboss::transform_on_surface(
|
|
||||||
const Vec2d &mouse_pos,
|
|
||||||
const std::vector<const MeshRaycaster *> &raycasters,
|
|
||||||
const std::vector<Transform3d> &raycasters_tr)
|
|
||||||
{
|
|
||||||
assert(raycasters.size() == raycasters_tr.size());
|
|
||||||
// in object coordinate
|
|
||||||
struct Hit
|
|
||||||
{
|
|
||||||
Vec3f position = Vec3f::Zero();
|
|
||||||
Vec3f normal = Vec3f::UnitZ();
|
|
||||||
double squared_distance = std::numeric_limits<double>::max();
|
|
||||||
|
|
||||||
Hit()=default;
|
|
||||||
};
|
|
||||||
std::optional<Hit> closest;
|
|
||||||
|
|
||||||
const Camera &camera = wxGetApp().plater()->get_camera();
|
|
||||||
|
|
||||||
// Cast a ray on meshes, pick the closest hit
|
|
||||||
int count_mesh = raycasters.size();
|
|
||||||
for (int volume_in_object = 0; volume_in_object < count_mesh; ++volume_in_object) {
|
|
||||||
const MeshRaycaster *raycaster = raycasters[volume_in_object];
|
|
||||||
const Transform3d & trafo = raycasters_tr[volume_in_object];
|
|
||||||
Hit act_hit;
|
|
||||||
if (!raycaster->unproject_on_mesh(mouse_pos, trafo, camera, act_hit.position, act_hit.normal))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Vec3d act_hit_tr = trafo * act_hit.position.cast<double>();
|
|
||||||
act_hit.squared_distance = (camera.get_position() - act_hit_tr).squaredNorm();
|
|
||||||
if (closest.has_value() &&
|
|
||||||
closest->squared_distance < act_hit.squared_distance)
|
|
||||||
continue;
|
|
||||||
closest = act_hit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check exist hit
|
|
||||||
if (!closest.has_value()) return {};
|
|
||||||
return Emboss::create_transformation_onto_surface(closest->position, closest->normal);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLGizmoEmboss::draw_font_list()
|
void GLGizmoEmboss::draw_font_list()
|
||||||
{
|
{
|
||||||
const float & max_width = m_gui_cfg->max_font_name_width;
|
const float & max_width = m_gui_cfg->max_font_name_width;
|
||||||
|
@ -69,7 +69,6 @@ protected:
|
|||||||
void on_enable_grabber(unsigned int id) override { m_rotate_gizmo.enable_grabber(0); }
|
void on_enable_grabber(unsigned int id) override { m_rotate_gizmo.enable_grabber(0); }
|
||||||
void on_disable_grabber(unsigned int id) override { m_rotate_gizmo.disable_grabber(0); }
|
void on_disable_grabber(unsigned int id) override { m_rotate_gizmo.disable_grabber(0); }
|
||||||
void on_update(const UpdateData &data) override { m_rotate_gizmo.update(data); }
|
void on_update(const UpdateData &data) override { m_rotate_gizmo.update(data); }
|
||||||
CommonGizmosDataID on_get_requirements() const override;
|
|
||||||
void on_start_dragging() override;
|
void on_start_dragging() override;
|
||||||
void on_stop_dragging() override;
|
void on_stop_dragging() override;
|
||||||
|
|
||||||
@ -130,11 +129,6 @@ private:
|
|||||||
|
|
||||||
std::string create_volume_name();
|
std::string create_volume_name();
|
||||||
|
|
||||||
std::optional<Transform3d> transform_on_surface(const Vec2d &mouse_pos,
|
|
||||||
const std::vector<const MeshRaycaster *> &raycasters,
|
|
||||||
const std::vector<Transform3d> & raycasters_tr
|
|
||||||
);
|
|
||||||
|
|
||||||
// This configs holds GUI layout size given by translated texts.
|
// This configs holds GUI layout size given by translated texts.
|
||||||
// etc. When language changes, GUI is recreated and this class constructed again,
|
// etc. When language changes, GUI is recreated and this class constructed again,
|
||||||
// so the change takes effect. (info by GLGizmoFdmSupports.hpp)
|
// so the change takes effect. (info by GLGizmoFdmSupports.hpp)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user