Modified gizmo rotate rendering
This commit is contained in:
parent
d7f9e86400
commit
42b70c4933
3 changed files with 54 additions and 3 deletions
|
@ -7,6 +7,8 @@
|
||||||
#include "GLToolbar.hpp"
|
#include "GLToolbar.hpp"
|
||||||
#include "Event.hpp"
|
#include "Event.hpp"
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#include <wx/timer.h>
|
#include <wx/timer.h>
|
||||||
|
|
||||||
class wxWindow;
|
class wxWindow;
|
||||||
|
|
|
@ -435,6 +435,7 @@ void GLGizmoRotate::on_render(const GLCanvas3D::Selection& selection) const
|
||||||
render_angle();
|
render_angle();
|
||||||
|
|
||||||
render_grabber(box);
|
render_grabber(box);
|
||||||
|
render_grabber_extension(box, false);
|
||||||
|
|
||||||
::glPopMatrix();
|
::glPopMatrix();
|
||||||
}
|
}
|
||||||
|
@ -446,7 +447,10 @@ void GLGizmoRotate::on_render_for_picking(const GLCanvas3D::Selection& selection
|
||||||
::glPushMatrix();
|
::glPushMatrix();
|
||||||
|
|
||||||
transform_to_local();
|
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();
|
::glPopMatrix();
|
||||||
}
|
}
|
||||||
|
@ -559,6 +563,50 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const
|
||||||
render_grabbers(box);
|
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
|
void GLGizmoRotate::transform_to_local() const
|
||||||
{
|
{
|
||||||
::glTranslated(m_center(0), m_center(1), m_center(2));
|
::glTranslated(m_center(0), m_center(1), m_center(2));
|
||||||
|
@ -574,7 +622,7 @@ void GLGizmoRotate::transform_to_local() const
|
||||||
case Y:
|
case Y:
|
||||||
{
|
{
|
||||||
::glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
|
::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;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -602,7 +650,7 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) cons
|
||||||
}
|
}
|
||||||
case Y:
|
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()));
|
m.rotate(Eigen::AngleAxisd(half_pi, Vec3d::UnitX()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,6 +240,7 @@ private:
|
||||||
void render_reference_radius() const;
|
void render_reference_radius() const;
|
||||||
void render_angle() const;
|
void render_angle() const;
|
||||||
void render_grabber(const BoundingBoxf3& box) const;
|
void render_grabber(const BoundingBoxf3& box) const;
|
||||||
|
void render_grabber_extension(const BoundingBoxf3& box, bool picking) const;
|
||||||
|
|
||||||
void transform_to_local() const;
|
void transform_to_local() const;
|
||||||
// returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate
|
// returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate
|
||||||
|
|
Loading…
Reference in a new issue