Tech ENABLE_RAYCAST_PICKING - Raytraced picking of Move, Rotate and Scale Gizmo

This commit is contained in:
enricoturri1966 2023-10-28 23:15:24 +08:00 committed by Noisyfox
parent 6a40d3af16
commit 29be4cc9a3
7 changed files with 41 additions and 8 deletions

View file

@ -117,7 +117,7 @@ void GLGizmoBase::Grabber::unregister_raycasters_for_picking()
elements_registered_for_picking = false;
}
void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking)
void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color)
{
GLShaderProgram* shader = wxGetApp().get_current_shader();
if (shader == nullptr)
@ -299,10 +299,10 @@ void GLGizmoBase::GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float
m_imgui->set_next_window_pos(x, y, flag, pivot_x, pivot_y);
}
void GLGizmoBase::register_grabbers_for_picking()
void GLGizmoBase::register_grabbers_for_picking(bool use_group_id)
{
for (size_t i = 0; i < m_grabbers.size(); ++i) {
m_grabbers[i].register_raycasters_for_picking(i);
m_grabbers[i].register_raycasters_for_picking(use_group_id ? m_group_id : i);
}
}

View file

@ -7,6 +7,7 @@
#include "slic3r/GUI/I18N.hpp"
#include "slic3r/GUI/GLModel.hpp"
#include "slic3r/GUI/MeshUtils.hpp"
#include "slic3r/GUI/SceneRaycaster.hpp"
#include <cereal/archives/binary.hpp>
@ -91,7 +92,7 @@ protected:
Grabber() = default;
~Grabber();
void render(bool hover, float size) { render(size, hover ? hover_color : color, false); }
void render(bool hover, float size) { render(size, hover ? hover_color : color); }
float get_half_size(float size) const;
float get_dragging_half_size(float size) const;
@ -101,7 +102,7 @@ protected:
void unregister_raycasters_for_picking();
private:
void render(float size, const ColorRGBA& render_color, bool picking);
void render(float size, const ColorRGBA& render_color);
static PickingModel s_cube;
static PickingModel s_cone;
@ -211,7 +212,7 @@ public:
int get_count() { return ++count; }
std::string get_gizmo_name() { return on_get_name(); }
void register_raycasters_for_picking() { register_grabbers_for_picking(); on_register_raycasters_for_picking(); }
void register_raycasters_for_picking(bool use_group_id = false) { register_grabbers_for_picking(use_group_id); on_register_raycasters_for_picking(); }
void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); }
protected:
@ -237,7 +238,7 @@ protected:
void GizmoImguiEnd();
void GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f);
void register_grabbers_for_picking();
void register_grabbers_for_picking(bool use_group_id = false);
void unregister_grabbers_for_picking();
virtual void on_register_raycasters_for_picking() {}
virtual void on_unregister_raycasters_for_picking() {}

View file

@ -184,7 +184,7 @@ void GLGizmoMove3D::on_render()
void GLGizmoMove3D::on_register_raycasters_for_picking()
{
// this gizmo is rendered on top of the scene, so the raytraced picker should take it into account
// the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account
m_parent.set_raycaster_gizmos_on_top(true);
}

View file

@ -510,6 +510,23 @@ void GLGizmoRotate3D::on_render()
m_gizmos[Z].render();
}
void GLGizmoRotate3D::on_register_raycasters_for_picking()
{
// the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account
m_parent.set_raycaster_gizmos_on_top(true);
for (GLGizmoRotate& g : m_gizmos) {
g.register_raycasters_for_picking(true);
}
}
void GLGizmoRotate3D::on_unregister_raycasters_for_picking()
{
for (GLGizmoRotate& g : m_gizmos) {
g.unregister_raycasters_for_picking();
}
m_parent.set_raycaster_gizmos_on_top(false);
}
GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui,
State & state,
const Alignment &alignment)

View file

@ -149,6 +149,8 @@ protected:
}
}
void on_render() override;
virtual void on_register_raycasters_for_picking() override;
virtual void on_unregister_raycasters_for_picking() override;
void on_render_input_window(float x, float y, float bottom_limit) override;

View file

@ -255,6 +255,17 @@ void GLGizmoScale3D::on_render()
render_grabbers(grabber_mean_size);
}
void GLGizmoScale3D::on_register_raycasters_for_picking()
{
// the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account
m_parent.set_raycaster_gizmos_on_top(true);
}
void GLGizmoScale3D::on_unregister_raycasters_for_picking()
{
m_parent.set_raycaster_gizmos_on_top(false);
}
void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color)
{
auto grabber_connection = [this](unsigned int id_1, unsigned int id_2) {

View file

@ -72,6 +72,8 @@ protected:
virtual void on_start_dragging() override;
virtual void on_update(const UpdateData& data) override;
virtual void on_render() override;
virtual void on_register_raycasters_for_picking() override;
virtual void on_unregister_raycasters_for_picking() override;
//BBS: GUI refactor: add object manipulation
virtual void on_render_input_window(float x, float y, float bottom_limit);