mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-15 02:37:51 -06:00
Tech ENABLE_RAYCAST_PICKING - Raytraced picking of Move, Rotate and Scale Gizmo
This commit is contained in:
parent
6a40d3af16
commit
29be4cc9a3
7 changed files with 41 additions and 8 deletions
|
@ -117,7 +117,7 @@ void GLGizmoBase::Grabber::unregister_raycasters_for_picking()
|
||||||
elements_registered_for_picking = false;
|
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();
|
GLShaderProgram* shader = wxGetApp().get_current_shader();
|
||||||
if (shader == nullptr)
|
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);
|
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) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "slic3r/GUI/I18N.hpp"
|
#include "slic3r/GUI/I18N.hpp"
|
||||||
#include "slic3r/GUI/GLModel.hpp"
|
#include "slic3r/GUI/GLModel.hpp"
|
||||||
#include "slic3r/GUI/MeshUtils.hpp"
|
#include "slic3r/GUI/MeshUtils.hpp"
|
||||||
|
#include "slic3r/GUI/SceneRaycaster.hpp"
|
||||||
|
|
||||||
#include <cereal/archives/binary.hpp>
|
#include <cereal/archives/binary.hpp>
|
||||||
|
|
||||||
|
@ -91,7 +92,7 @@ protected:
|
||||||
Grabber() = default;
|
Grabber() = default;
|
||||||
~Grabber();
|
~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_half_size(float size) const;
|
||||||
float get_dragging_half_size(float size) const;
|
float get_dragging_half_size(float size) const;
|
||||||
|
@ -101,7 +102,7 @@ protected:
|
||||||
void unregister_raycasters_for_picking();
|
void unregister_raycasters_for_picking();
|
||||||
|
|
||||||
private:
|
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_cube;
|
||||||
static PickingModel s_cone;
|
static PickingModel s_cone;
|
||||||
|
@ -211,7 +212,7 @@ public:
|
||||||
int get_count() { return ++count; }
|
int get_count() { return ++count; }
|
||||||
std::string get_gizmo_name() { return on_get_name(); }
|
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(); }
|
void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -237,7 +238,7 @@ protected:
|
||||||
void GizmoImguiEnd();
|
void GizmoImguiEnd();
|
||||||
void GizmoImguiSetNextWIndowPos(float &x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f);
|
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();
|
void unregister_grabbers_for_picking();
|
||||||
virtual void on_register_raycasters_for_picking() {}
|
virtual void on_register_raycasters_for_picking() {}
|
||||||
virtual void on_unregister_raycasters_for_picking() {}
|
virtual void on_unregister_raycasters_for_picking() {}
|
||||||
|
|
|
@ -184,7 +184,7 @@ void GLGizmoMove3D::on_render()
|
||||||
|
|
||||||
void GLGizmoMove3D::on_register_raycasters_for_picking()
|
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);
|
m_parent.set_raycaster_gizmos_on_top(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -510,6 +510,23 @@ void GLGizmoRotate3D::on_render()
|
||||||
m_gizmos[Z].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,
|
GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui,
|
||||||
State & state,
|
State & state,
|
||||||
const Alignment &alignment)
|
const Alignment &alignment)
|
||||||
|
|
|
@ -149,6 +149,8 @@ protected:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void on_render() override;
|
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;
|
void on_render_input_window(float x, float y, float bottom_limit) override;
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,17 @@ void GLGizmoScale3D::on_render()
|
||||||
render_grabbers(grabber_mean_size);
|
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)
|
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) {
|
auto grabber_connection = [this](unsigned int id_1, unsigned int id_2) {
|
||||||
|
|
|
@ -72,6 +72,8 @@ protected:
|
||||||
virtual void on_start_dragging() override;
|
virtual void on_start_dragging() override;
|
||||||
virtual void on_update(const UpdateData& data) override;
|
virtual void on_update(const UpdateData& data) override;
|
||||||
virtual void on_render() 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
|
//BBS: GUI refactor: add object manipulation
|
||||||
virtual void on_render_input_window(float x, float y, float bottom_limit);
|
virtual void on_render_input_window(float x, float y, float bottom_limit);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue