Merge remote-tracking branch 'origin/dev' into new_main_page_ui
This commit is contained in:
commit
6d499525ee
@ -1140,6 +1140,9 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent)
|
|||||||
if (!gizmo->init())
|
if (!gizmo->init())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// temporary disable z grabber
|
||||||
|
gizmo->disable_grabber(2);
|
||||||
|
|
||||||
m_gizmos.insert(GizmosMap::value_type(Move, gizmo));
|
m_gizmos.insert(GizmosMap::value_type(Move, gizmo));
|
||||||
|
|
||||||
gizmo = new GLGizmoScale3D(parent);
|
gizmo = new GLGizmoScale3D(parent);
|
||||||
@ -1149,6 +1152,16 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent)
|
|||||||
if (!gizmo->init())
|
if (!gizmo->init())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// temporary disable x grabbers
|
||||||
|
gizmo->disable_grabber(0);
|
||||||
|
gizmo->disable_grabber(1);
|
||||||
|
// temporary disable y grabbers
|
||||||
|
gizmo->disable_grabber(2);
|
||||||
|
gizmo->disable_grabber(3);
|
||||||
|
// temporary disable z grabbers
|
||||||
|
gizmo->disable_grabber(4);
|
||||||
|
gizmo->disable_grabber(5);
|
||||||
|
|
||||||
m_gizmos.insert(GizmosMap::value_type(Scale, gizmo));
|
m_gizmos.insert(GizmosMap::value_type(Scale, gizmo));
|
||||||
|
|
||||||
gizmo = new GLGizmoRotate3D(parent);
|
gizmo = new GLGizmoRotate3D(parent);
|
||||||
@ -1164,6 +1177,10 @@ bool GLCanvas3D::Gizmos::init(GLCanvas3D& parent)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// temporary disable x and y grabbers
|
||||||
|
gizmo->disable_grabber(0);
|
||||||
|
gizmo->disable_grabber(1);
|
||||||
|
|
||||||
m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo));
|
m_gizmos.insert(GizmosMap::value_type(Rotate, gizmo));
|
||||||
|
|
||||||
gizmo = new GLGizmoFlatten(parent);
|
gizmo = new GLGizmoFlatten(parent);
|
||||||
|
@ -20,47 +20,47 @@ static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
// returns the intersection of the given ray with the plane parallel to plane XY and passing through the given center
|
// returns the intersection of the given ray with the plane parallel to plane XY and passing through the given center
|
||||||
// coordinates are local to the plane
|
// coordinates are local to the plane
|
||||||
Vec3d intersection_on_plane_xy(const Linef3& ray, const Vec3d& center)
|
Vec3d intersection_on_plane_xy(const Linef3& ray, const Vec3d& center)
|
||||||
{
|
{
|
||||||
Transform3d m = Transform3d::Identity();
|
Transform3d m = Transform3d::Identity();
|
||||||
m.translate(-center);
|
m.translate(-center);
|
||||||
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
||||||
return Vec3d(mouse_pos_2d(0), mouse_pos_2d(1), 0.0);
|
return Vec3d(mouse_pos_2d(0), mouse_pos_2d(1), 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the intersection of the given ray with the plane parallel to plane XZ and passing through the given center
|
// returns the intersection of the given ray with the plane parallel to plane XZ and passing through the given center
|
||||||
// coordinates are local to the plane
|
// coordinates are local to the plane
|
||||||
Vec3d intersection_on_plane_xz(const Linef3& ray, const Vec3d& center)
|
Vec3d intersection_on_plane_xz(const Linef3& ray, const Vec3d& center)
|
||||||
{
|
{
|
||||||
Transform3d m = Transform3d::Identity();
|
Transform3d m = Transform3d::Identity();
|
||||||
m.rotate(Eigen::AngleAxisd(-0.5 * (double)PI, Vec3d::UnitX()));
|
m.rotate(Eigen::AngleAxisd(-0.5 * (double)PI, Vec3d::UnitX()));
|
||||||
m.translate(-center);
|
m.translate(-center);
|
||||||
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
||||||
return Vec3d(mouse_pos_2d(0), 0.0, mouse_pos_2d(1));
|
return Vec3d(mouse_pos_2d(0), 0.0, mouse_pos_2d(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the intersection of the given ray with the plane parallel to plane YZ and passing through the given center
|
// returns the intersection of the given ray with the plane parallel to plane YZ and passing through the given center
|
||||||
// coordinates are local to the plane
|
// coordinates are local to the plane
|
||||||
Vec3d intersection_on_plane_yz(const Linef3& ray, const Vec3d& center)
|
Vec3d intersection_on_plane_yz(const Linef3& ray, const Vec3d& center)
|
||||||
{
|
{
|
||||||
Transform3d m = Transform3d::Identity();
|
Transform3d m = Transform3d::Identity();
|
||||||
m.rotate(Eigen::AngleAxisd(-0.5f * (double)PI, Vec3d::UnitY()));
|
m.rotate(Eigen::AngleAxisd(-0.5f * (double)PI, Vec3d::UnitY()));
|
||||||
m.translate(-center);
|
m.translate(-center);
|
||||||
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
Vec2d mouse_pos_2d = to_2d(transform(ray, m).intersect_plane(0.0));
|
||||||
|
|
||||||
return Vec3d(0.0, mouse_pos_2d(1), -mouse_pos_2d(0));
|
return Vec3d(0.0, mouse_pos_2d(1), -mouse_pos_2d(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// return an index:
|
// return an index:
|
||||||
// 0 for plane XY
|
// 0 for plane XY
|
||||||
// 1 for plane XZ
|
// 1 for plane XZ
|
||||||
// 2 for plane YZ
|
// 2 for plane YZ
|
||||||
// which indicates which plane is best suited for intersecting the given unit vector
|
// which indicates which plane is best suited for intersecting the given unit vector
|
||||||
// giving precedence to the plane with the given index
|
// giving precedence to the plane with the given index
|
||||||
unsigned int select_best_plane(const Vec3d& unit_vector, unsigned int preferred_plane)
|
unsigned int select_best_plane(const Vec3d& unit_vector, unsigned int preferred_plane)
|
||||||
{
|
{
|
||||||
unsigned int ret = preferred_plane;
|
unsigned int ret = preferred_plane;
|
||||||
|
|
||||||
// 1st checks if the given vector is not parallel to the given preferred plane
|
// 1st checks if the given vector is not parallel to the given preferred plane
|
||||||
@ -101,22 +101,24 @@ namespace GUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float GLGizmoBase::Grabber::HalfSize = 2.0f;
|
const float GLGizmoBase::Grabber::SizeFactor = 0.025f;
|
||||||
|
const float GLGizmoBase::Grabber::MinHalfSize = 1.5f;
|
||||||
const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f;
|
const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f;
|
||||||
|
|
||||||
GLGizmoBase::Grabber::Grabber()
|
GLGizmoBase::Grabber::Grabber()
|
||||||
: center(Vec3d::Zero())
|
: center(Vec3d::Zero())
|
||||||
, angles(Vec3d::Zero())
|
, angles(Vec3d::Zero())
|
||||||
, dragging(false)
|
, dragging(false)
|
||||||
|
, enabled(true)
|
||||||
{
|
{
|
||||||
color[0] = 1.0f;
|
color[0] = 1.0f;
|
||||||
color[1] = 1.0f;
|
color[1] = 1.0f;
|
||||||
color[2] = 1.0f;
|
color[2] = 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoBase::Grabber::render(bool hover) const
|
void GLGizmoBase::Grabber::render(bool hover, const BoundingBoxf3& box) const
|
||||||
{
|
{
|
||||||
float render_color[3];
|
float render_color[3];
|
||||||
if (hover)
|
if (hover)
|
||||||
@ -128,12 +130,15 @@ void GLGizmoBase::Grabber::render(bool hover) const
|
|||||||
else
|
else
|
||||||
::memcpy((void*)render_color, (const void*)color, 3 * sizeof(float));
|
::memcpy((void*)render_color, (const void*)color, 3 * sizeof(float));
|
||||||
|
|
||||||
render(render_color, true);
|
render(box, render_color, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoBase::Grabber::render(const float* render_color, bool use_lighting) const
|
void GLGizmoBase::Grabber::render(const BoundingBoxf3& box, const float* render_color, bool use_lighting) const
|
||||||
{
|
{
|
||||||
float half_size = dragging ? HalfSize * DraggingScaleFactor : HalfSize;
|
float max_size = (float)box.max_size();
|
||||||
|
float half_size = dragging ? max_size * SizeFactor * DraggingScaleFactor : max_size * SizeFactor;
|
||||||
|
half_size = std::max(half_size, MinHalfSize);
|
||||||
|
|
||||||
if (use_lighting)
|
if (use_lighting)
|
||||||
::glEnable(GL_LIGHTING);
|
::glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
@ -234,6 +239,22 @@ void GLGizmoBase::set_highlight_color(const float* color)
|
|||||||
::memcpy((void*)m_highlight_color, (const void*)color, 3 * sizeof(float));
|
::memcpy((void*)m_highlight_color, (const void*)color, 3 * sizeof(float));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLGizmoBase::enable_grabber(unsigned int id)
|
||||||
|
{
|
||||||
|
if ((0 <= id) && (id < (unsigned int)m_grabbers.size()))
|
||||||
|
m_grabbers[id].enabled = true;
|
||||||
|
|
||||||
|
on_enable_grabber(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLGizmoBase::disable_grabber(unsigned int id)
|
||||||
|
{
|
||||||
|
if ((0 <= id) && (id < (unsigned int)m_grabbers.size()))
|
||||||
|
m_grabbers[id].enabled = false;
|
||||||
|
|
||||||
|
on_disable_grabber(id);
|
||||||
|
}
|
||||||
|
|
||||||
void GLGizmoBase::start_dragging(const BoundingBoxf3& box)
|
void GLGizmoBase::start_dragging(const BoundingBoxf3& box)
|
||||||
{
|
{
|
||||||
m_dragging = true;
|
m_dragging = true;
|
||||||
@ -274,22 +295,26 @@ float GLGizmoBase::picking_color_component(unsigned int id) const
|
|||||||
return (float)color / 255.0f;
|
return (float)color / 255.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoBase::render_grabbers() const
|
void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const
|
||||||
{
|
{
|
||||||
for (int i = 0; i < (int)m_grabbers.size(); ++i)
|
for (int i = 0; i < (int)m_grabbers.size(); ++i)
|
||||||
{
|
{
|
||||||
m_grabbers[i].render(m_hover_id == i);
|
if (m_grabbers[i].enabled)
|
||||||
|
m_grabbers[i].render((m_hover_id == i), box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoBase::render_grabbers_for_picking() const
|
void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const
|
||||||
{
|
{
|
||||||
for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i)
|
for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i)
|
||||||
|
{
|
||||||
|
if (m_grabbers[i].enabled)
|
||||||
{
|
{
|
||||||
m_grabbers[i].color[0] = 1.0f;
|
m_grabbers[i].color[0] = 1.0f;
|
||||||
m_grabbers[i].color[1] = 1.0f;
|
m_grabbers[i].color[1] = 1.0f;
|
||||||
m_grabbers[i].color[2] = picking_color_component(i);
|
m_grabbers[i].color[2] = picking_color_component(i);
|
||||||
m_grabbers[i].render_for_picking();
|
m_grabbers[i].render_for_picking(box);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -386,6 +411,9 @@ void GLGizmoRotate::on_update(const Linef3& mouse_ray)
|
|||||||
|
|
||||||
void GLGizmoRotate::on_render(const BoundingBoxf3& box) const
|
void GLGizmoRotate::on_render(const BoundingBoxf3& box) const
|
||||||
{
|
{
|
||||||
|
if (!m_grabbers[0].enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
if (m_dragging)
|
if (m_dragging)
|
||||||
set_tooltip(format(m_angle * 180.0f / (float)PI, 4));
|
set_tooltip(format(m_angle * 180.0f / (float)PI, 4));
|
||||||
else
|
else
|
||||||
@ -416,7 +444,7 @@ void GLGizmoRotate::on_render(const BoundingBoxf3& box) const
|
|||||||
if (m_hover_id != -1)
|
if (m_hover_id != -1)
|
||||||
render_angle();
|
render_angle();
|
||||||
|
|
||||||
render_grabber();
|
render_grabber(box);
|
||||||
|
|
||||||
::glPopMatrix();
|
::glPopMatrix();
|
||||||
}
|
}
|
||||||
@ -428,7 +456,7 @@ void GLGizmoRotate::on_render_for_picking(const BoundingBoxf3& box) const
|
|||||||
::glPushMatrix();
|
::glPushMatrix();
|
||||||
|
|
||||||
transform_to_local();
|
transform_to_local();
|
||||||
render_grabbers_for_picking();
|
render_grabbers_for_picking(box);
|
||||||
|
|
||||||
::glPopMatrix();
|
::glPopMatrix();
|
||||||
}
|
}
|
||||||
@ -520,7 +548,7 @@ void GLGizmoRotate::render_angle() const
|
|||||||
::glEnd();
|
::glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoRotate::render_grabber() const
|
void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const
|
||||||
{
|
{
|
||||||
double grabber_radius = (double)(m_radius + GrabberOffset);
|
double grabber_radius = (double)(m_radius + GrabberOffset);
|
||||||
m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0);
|
m_grabbers[0].center = Vec3d(::cos(m_angle) * grabber_radius, ::sin(m_angle) * grabber_radius, 0.0);
|
||||||
@ -534,7 +562,7 @@ void GLGizmoRotate::render_grabber() const
|
|||||||
::glEnd();
|
::glEnd();
|
||||||
|
|
||||||
::memcpy((void*)m_grabbers[0].color, (const void*)m_highlight_color, 3 * sizeof(float));
|
::memcpy((void*)m_grabbers[0].color, (const void*)m_highlight_color, 3 * sizeof(float));
|
||||||
render_grabbers();
|
render_grabbers(box);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoRotate::transform_to_local() const
|
void GLGizmoRotate::transform_to_local() const
|
||||||
@ -665,6 +693,7 @@ void GLGizmoRotate3D::on_render(const BoundingBoxf3& box) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
const float GLGizmoScale3D::Offset = 5.0f;
|
const float GLGizmoScale3D::Offset = 5.0f;
|
||||||
|
const Vec3d GLGizmoScale3D::OffsetVec = (double)GLGizmoScale3D::Offset * Vec3d::Ones();
|
||||||
|
|
||||||
GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent)
|
GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent)
|
||||||
: GLGizmoBase(parent)
|
: GLGizmoBase(parent)
|
||||||
@ -714,7 +743,7 @@ void GLGizmoScale3D::on_start_dragging(const BoundingBoxf3& box)
|
|||||||
{
|
{
|
||||||
m_starting_drag_position = m_grabbers[m_hover_id].center;
|
m_starting_drag_position = m_grabbers[m_hover_id].center;
|
||||||
m_show_starting_box = true;
|
m_show_starting_box = true;
|
||||||
m_starting_box = box;
|
m_starting_box = BoundingBoxf3(box.min - OffsetVec, box.max + OffsetVec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -748,9 +777,7 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
|
|
||||||
::glEnable(GL_DEPTH_TEST);
|
::glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
Vec3d offset_vec = (double)Offset * Vec3d::Ones();
|
m_box = BoundingBoxf3(box.min - OffsetVec, box.max + OffsetVec);
|
||||||
|
|
||||||
m_box = BoundingBoxf3(box.min - offset_vec, box.max + offset_vec);
|
|
||||||
const Vec3d& center = m_box.center();
|
const Vec3d& center = m_box.center();
|
||||||
|
|
||||||
// x axis
|
// x axis
|
||||||
@ -789,14 +816,23 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glColor3fv(m_base_color);
|
::glColor3fv(m_base_color);
|
||||||
render_box(m_box);
|
render_box(m_box);
|
||||||
// draw connections
|
// draw connections
|
||||||
|
if (m_grabbers[0].enabled && m_grabbers[1].enabled)
|
||||||
|
{
|
||||||
::glColor3fv(m_grabbers[0].color);
|
::glColor3fv(m_grabbers[0].color);
|
||||||
render_grabbers_connection(0, 1);
|
render_grabbers_connection(0, 1);
|
||||||
|
}
|
||||||
|
if (m_grabbers[2].enabled && m_grabbers[3].enabled)
|
||||||
|
{
|
||||||
::glColor3fv(m_grabbers[2].color);
|
::glColor3fv(m_grabbers[2].color);
|
||||||
render_grabbers_connection(2, 3);
|
render_grabbers_connection(2, 3);
|
||||||
|
}
|
||||||
|
if (m_grabbers[4].enabled && m_grabbers[5].enabled)
|
||||||
|
{
|
||||||
::glColor3fv(m_grabbers[4].color);
|
::glColor3fv(m_grabbers[4].color);
|
||||||
render_grabbers_connection(4, 5);
|
render_grabbers_connection(4, 5);
|
||||||
|
}
|
||||||
// draw grabbers
|
// draw grabbers
|
||||||
render_grabbers();
|
render_grabbers(m_box);
|
||||||
}
|
}
|
||||||
else if ((m_hover_id == 0) || (m_hover_id == 1))
|
else if ((m_hover_id == 0) || (m_hover_id == 1))
|
||||||
{
|
{
|
||||||
@ -813,8 +849,8 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glColor3fv(m_grabbers[0].color);
|
::glColor3fv(m_grabbers[0].color);
|
||||||
render_grabbers_connection(0, 1);
|
render_grabbers_connection(0, 1);
|
||||||
// draw grabbers
|
// draw grabbers
|
||||||
m_grabbers[0].render(true);
|
m_grabbers[0].render(true, m_box);
|
||||||
m_grabbers[1].render(true);
|
m_grabbers[1].render(true, m_box);
|
||||||
}
|
}
|
||||||
else if ((m_hover_id == 2) || (m_hover_id == 3))
|
else if ((m_hover_id == 2) || (m_hover_id == 3))
|
||||||
{
|
{
|
||||||
@ -831,8 +867,8 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glColor3fv(m_grabbers[2].color);
|
::glColor3fv(m_grabbers[2].color);
|
||||||
render_grabbers_connection(2, 3);
|
render_grabbers_connection(2, 3);
|
||||||
// draw grabbers
|
// draw grabbers
|
||||||
m_grabbers[2].render(true);
|
m_grabbers[2].render(true, m_box);
|
||||||
m_grabbers[3].render(true);
|
m_grabbers[3].render(true, m_box);
|
||||||
}
|
}
|
||||||
else if ((m_hover_id == 4) || (m_hover_id == 5))
|
else if ((m_hover_id == 4) || (m_hover_id == 5))
|
||||||
{
|
{
|
||||||
@ -849,8 +885,8 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glColor3fv(m_grabbers[4].color);
|
::glColor3fv(m_grabbers[4].color);
|
||||||
render_grabbers_connection(4, 5);
|
render_grabbers_connection(4, 5);
|
||||||
// draw grabbers
|
// draw grabbers
|
||||||
m_grabbers[4].render(true);
|
m_grabbers[4].render(true, m_box);
|
||||||
m_grabbers[5].render(true);
|
m_grabbers[5].render(true, m_box);
|
||||||
}
|
}
|
||||||
else if (m_hover_id >= 6)
|
else if (m_hover_id >= 6)
|
||||||
{
|
{
|
||||||
@ -866,7 +902,7 @@ void GLGizmoScale3D::on_render(const BoundingBoxf3& box) const
|
|||||||
// draw grabbers
|
// draw grabbers
|
||||||
for (int i = 6; i < 10; ++i)
|
for (int i = 6; i < 10; ++i)
|
||||||
{
|
{
|
||||||
m_grabbers[i].render(true);
|
m_grabbers[i].render(true, m_box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -875,7 +911,7 @@ void GLGizmoScale3D::on_render_for_picking(const BoundingBoxf3& box) const
|
|||||||
{
|
{
|
||||||
::glDisable(GL_DEPTH_TEST);
|
::glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
render_grabbers_for_picking();
|
render_grabbers_for_picking(box);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLGizmoScale3D::render_box(const BoundingBoxf3& box) const
|
void GLGizmoScale3D::render_box(const BoundingBoxf3& box) const
|
||||||
@ -1073,6 +1109,8 @@ void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const
|
|||||||
{
|
{
|
||||||
// draw axes
|
// draw axes
|
||||||
for (unsigned int i = 0; i < 3; ++i)
|
for (unsigned int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
if (m_grabbers[i].enabled)
|
||||||
{
|
{
|
||||||
::glColor3fv(AXES_COLOR[i]);
|
::glColor3fv(AXES_COLOR[i]);
|
||||||
::glBegin(GL_LINES);
|
::glBegin(GL_LINES);
|
||||||
@ -1080,9 +1118,10 @@ void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glVertex3f((GLfloat)m_grabbers[i].center(0), (GLfloat)m_grabbers[i].center(1), (GLfloat)m_grabbers[i].center(2));
|
::glVertex3f((GLfloat)m_grabbers[i].center(0), (GLfloat)m_grabbers[i].center(1), (GLfloat)m_grabbers[i].center(2));
|
||||||
::glEnd();
|
::glEnd();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// draw grabbers
|
// draw grabbers
|
||||||
render_grabbers();
|
render_grabbers(box);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1094,7 +1133,7 @@ void GLGizmoMove3D::on_render(const BoundingBoxf3& box) const
|
|||||||
::glEnd();
|
::glEnd();
|
||||||
|
|
||||||
// draw grabber
|
// draw grabber
|
||||||
m_grabbers[m_hover_id].render(true);
|
m_grabbers[m_hover_id].render(true, box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1102,7 +1141,7 @@ void GLGizmoMove3D::on_render_for_picking(const BoundingBoxf3& box) const
|
|||||||
{
|
{
|
||||||
::glDisable(GL_DEPTH_TEST);
|
::glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
render_grabbers_for_picking();
|
render_grabbers_for_picking(box);
|
||||||
}
|
}
|
||||||
|
|
||||||
double GLGizmoMove3D::calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const
|
double GLGizmoMove3D::calc_displacement(unsigned int preferred_plane_id, const Linef3& mouse_ray) const
|
||||||
|
@ -22,21 +22,23 @@ class GLGizmoBase
|
|||||||
protected:
|
protected:
|
||||||
struct Grabber
|
struct Grabber
|
||||||
{
|
{
|
||||||
static const float HalfSize;
|
static const float SizeFactor;
|
||||||
|
static const float MinHalfSize;
|
||||||
static const float DraggingScaleFactor;
|
static const float DraggingScaleFactor;
|
||||||
|
|
||||||
Vec3d center;
|
Vec3d center;
|
||||||
Vec3d angles;
|
Vec3d angles;
|
||||||
float color[3];
|
float color[3];
|
||||||
|
bool enabled;
|
||||||
bool dragging;
|
bool dragging;
|
||||||
|
|
||||||
Grabber();
|
Grabber();
|
||||||
|
|
||||||
void render(bool hover) const;
|
void render(bool hover, const BoundingBoxf3& box) const;
|
||||||
void render_for_picking() const { render(color, false); }
|
void render_for_picking(const BoundingBoxf3& box) const { render(box, color, false); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void render(const float* render_color, bool use_lighting) const;
|
void render(const BoundingBoxf3& box, const float* render_color, bool use_lighting) const;
|
||||||
void render_face(float half_size) const;
|
void render_face(float half_size) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -83,6 +85,9 @@ public:
|
|||||||
|
|
||||||
void set_highlight_color(const float* color);
|
void set_highlight_color(const float* color);
|
||||||
|
|
||||||
|
void enable_grabber(unsigned int id);
|
||||||
|
void disable_grabber(unsigned int id);
|
||||||
|
|
||||||
void start_dragging(const BoundingBoxf3& box);
|
void start_dragging(const BoundingBoxf3& box);
|
||||||
void stop_dragging();
|
void stop_dragging();
|
||||||
bool is_dragging() const { return m_dragging; }
|
bool is_dragging() const { return m_dragging; }
|
||||||
@ -96,6 +101,8 @@ protected:
|
|||||||
virtual bool on_init() = 0;
|
virtual bool on_init() = 0;
|
||||||
virtual void on_set_state() {}
|
virtual void on_set_state() {}
|
||||||
virtual void on_set_hover_id() {}
|
virtual void on_set_hover_id() {}
|
||||||
|
virtual void on_enable_grabber(unsigned int id) {}
|
||||||
|
virtual void on_disable_grabber(unsigned int id) {}
|
||||||
virtual void on_start_dragging(const BoundingBoxf3& box) {}
|
virtual void on_start_dragging(const BoundingBoxf3& box) {}
|
||||||
virtual void on_stop_dragging() {}
|
virtual void on_stop_dragging() {}
|
||||||
virtual void on_update(const Linef3& mouse_ray) = 0;
|
virtual void on_update(const Linef3& mouse_ray) = 0;
|
||||||
@ -103,8 +110,8 @@ protected:
|
|||||||
virtual void on_render_for_picking(const BoundingBoxf3& box) const = 0;
|
virtual void on_render_for_picking(const BoundingBoxf3& box) const = 0;
|
||||||
|
|
||||||
float picking_color_component(unsigned int id) const;
|
float picking_color_component(unsigned int id) const;
|
||||||
void render_grabbers() const;
|
void render_grabbers(const BoundingBoxf3& box) const;
|
||||||
void render_grabbers_for_picking() const;
|
void render_grabbers_for_picking(const BoundingBoxf3& box) const;
|
||||||
|
|
||||||
void set_tooltip(const std::string& tooltip) const;
|
void set_tooltip(const std::string& tooltip) const;
|
||||||
std::string format(float value, unsigned int decimals) const;
|
std::string format(float value, unsigned int decimals) const;
|
||||||
@ -157,7 +164,7 @@ private:
|
|||||||
void render_snap_radii() const;
|
void render_snap_radii() const;
|
||||||
void render_reference_radius() const;
|
void render_reference_radius() const;
|
||||||
void render_angle() const;
|
void render_angle() const;
|
||||||
void render_grabber() const;
|
void render_grabber(const BoundingBoxf3& box) 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
|
||||||
@ -196,6 +203,16 @@ protected:
|
|||||||
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
|
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
virtual void on_enable_grabber(unsigned int id)
|
||||||
|
{
|
||||||
|
if ((0 <= id) && (id < 3))
|
||||||
|
m_gizmos[id].enable_grabber(0);
|
||||||
|
}
|
||||||
|
virtual void on_disable_grabber(unsigned int id)
|
||||||
|
{
|
||||||
|
if ((0 <= id) && (id < 3))
|
||||||
|
m_gizmos[id].disable_grabber(0);
|
||||||
|
}
|
||||||
virtual void on_start_dragging(const BoundingBoxf3& box);
|
virtual void on_start_dragging(const BoundingBoxf3& box);
|
||||||
virtual void on_stop_dragging();
|
virtual void on_stop_dragging();
|
||||||
virtual void on_update(const Linef3& mouse_ray)
|
virtual void on_update(const Linef3& mouse_ray)
|
||||||
@ -218,6 +235,7 @@ protected:
|
|||||||
class GLGizmoScale3D : public GLGizmoBase
|
class GLGizmoScale3D : public GLGizmoBase
|
||||||
{
|
{
|
||||||
static const float Offset;
|
static const float Offset;
|
||||||
|
static const Vec3d OffsetVec;
|
||||||
|
|
||||||
mutable BoundingBoxf3 m_box;
|
mutable BoundingBoxf3 m_box;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user