Modified gizmo rotate rendering

This commit is contained in:
Enrico Turri 2018-11-29 15:10:11 +01:00
parent d7f9e86400
commit 42b70c4933
3 changed files with 54 additions and 3 deletions

View file

@ -7,6 +7,8 @@
#include "GLToolbar.hpp"
#include "Event.hpp"
#include <float.h>
#include <wx/timer.h>
class wxWindow;

View file

@ -435,6 +435,7 @@ void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const
render_angle();
render_grabber(box);
render_grabber_extension(box, false);
::glPopMatrix();
}
@ -446,7 +447,10 @@ void GLGizmoRotate::on_render_for_picking(const GLCanvas3D::Selection& selection
::glPushMatrix();
transform_to_local();
render_grabbers_for_picking(selection.get_bounding_box());
const BoundingBoxf3& box = selection.get_bounding_box();
render_grabbers_for_picking(box);
render_grabber_extension(box, true);
::glPopMatrix();
}
@ -559,6 +563,50 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const
render_grabbers(box);
}
void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const
{
float size = m_dragging ? m_grabbers[0].get_dragging_half_size((float)box.max_size()) : m_grabbers[0].get_half_size((float)box.max_size());
float color[3];
::memcpy((void*)color, (const void*)m_grabbers[0].color, 3 * sizeof(float));
if (!picking && (m_hover_id != -1))
{
color[0] = 1.0f - color[0];
color[1] = 1.0f - color[1];
color[2] = 1.0f - color[2];
}
if (!picking)
::glEnable(GL_LIGHTING);
::glColor3fv(color);
GLUquadricObj* quadric = ::gluNewQuadric();
::gluQuadricDrawStyle(quadric, GLU_FILL);
::glPushMatrix();
::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2));
::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0);
::glRotated(90.0, 1.0, 0.0, 0.0);
::glTranslated(0.0, 0.0, 2.0 * size);
::gluCylinder(quadric, 0.75f * size, 0.0f, 3.0f * size, 36, 1);
::gluQuadricOrientation(quadric, GLU_INSIDE);
::gluDisk(quadric, 0.0f, 0.75f * size, 36, 1);
::glPopMatrix();
::glPushMatrix();
::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2));
::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0);
::glRotated(-90.0, 1.0, 0.0, 0.0);
::glTranslated(0.0, 0.0, 2.0 * size);
::gluQuadricOrientation(quadric, GLU_OUTSIDE);
::gluCylinder(quadric, 0.75f * size, 0.0f, 3.0f * size, 36, 1);
::gluQuadricOrientation(quadric, GLU_INSIDE);
::gluDisk(quadric, 0.0f, 0.75f * size, 36, 1);
::glPopMatrix();
::gluDeleteQuadric(quadric);
if (!picking)
::glDisable(GL_LIGHTING);
}
void GLGizmoRotate::transform_to_local() const
{
::glTranslated(m_center(0), m_center(1), m_center(2));
@ -574,7 +622,7 @@ void GLGizmoRotate::transform_to_local() const
case Y:
{
::glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
::glRotatef(180.0f, 0.0f, 0.0f, 1.0f);
::glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
break;
}
default:
@ -602,7 +650,7 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) cons
}
case Y:
{
m.rotate(Eigen::AngleAxisd(-(double)PI, Vec3d::UnitZ()));
m.rotate(Eigen::AngleAxisd(-half_pi, Vec3d::UnitZ()));
m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitX()));
break;
}

View file

@ -240,6 +240,7 @@ private:
void render_reference_radius() const;
void render_angle() const;
void render_grabber(const BoundingBoxf3& box) const;
void render_grabber_extension(const BoundingBoxf3& box, bool picking) const;
void transform_to_local() const;
// returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate