Axes rendering
This commit is contained in:
parent
40f74fe6eb
commit
985cd17265
@ -617,42 +617,71 @@ bool GLCanvas3D::Bed::_are_equal(const Pointfs& bed_1, const Pointfs& bed_2)
|
||||
return true;
|
||||
}
|
||||
|
||||
const double GLCanvas3D::Axes::Radius = 0.5;
|
||||
const double GLCanvas3D::Axes::ArrowBaseRadius = 2.5 * GLCanvas3D::Axes::Radius;
|
||||
const double GLCanvas3D::Axes::ArrowLength = 5.0;
|
||||
|
||||
GLCanvas3D::Axes::Axes()
|
||||
: origin(Vec3d::Zero())
|
||||
, length(0.0f)
|
||||
, length(Vec3d::Zero())
|
||||
{
|
||||
m_quadric = ::gluNewQuadric();
|
||||
if (m_quadric != nullptr)
|
||||
::gluQuadricDrawStyle(m_quadric, GLU_FILL);
|
||||
}
|
||||
|
||||
void GLCanvas3D::Axes::render(bool depth_test) const
|
||||
GLCanvas3D::Axes::~Axes()
|
||||
{
|
||||
if (depth_test)
|
||||
::glEnable(GL_DEPTH_TEST);
|
||||
else
|
||||
::glDisable(GL_DEPTH_TEST);
|
||||
if (m_quadric != nullptr)
|
||||
::gluDeleteQuadric(m_quadric);
|
||||
}
|
||||
|
||||
::glLineWidth(2.0f);
|
||||
::glBegin(GL_LINES);
|
||||
// draw line for x axis
|
||||
void GLCanvas3D::Axes::render() const
|
||||
{
|
||||
if (m_quadric == nullptr)
|
||||
return;
|
||||
|
||||
::glEnable(GL_DEPTH_TEST);
|
||||
::glEnable(GL_LIGHTING);
|
||||
|
||||
// x axis
|
||||
::glColor3f(1.0f, 0.0f, 0.0f);
|
||||
::glVertex3dv(origin.data());
|
||||
::glVertex3f((GLfloat)origin(0) + length, (GLfloat)origin(1), (GLfloat)origin(2));
|
||||
// draw line for y axis
|
||||
::glColor3f(0.0f, 1.0f, 0.0f);
|
||||
::glVertex3dv(origin.data());
|
||||
::glVertex3f((GLfloat)origin(0), (GLfloat)origin(1) + length, (GLfloat)origin(2));
|
||||
::glEnd();
|
||||
// draw line for Z axis
|
||||
// (re-enable depth test so that axis is correctly shown when objects are behind it)
|
||||
if (!depth_test)
|
||||
::glEnable(GL_DEPTH_TEST);
|
||||
::glPushMatrix();
|
||||
::glTranslated(origin(0), origin(1), origin(2));
|
||||
::glRotated(90.0, 0.0, 1.0, 0.0);
|
||||
render_axis(length(0));
|
||||
::glPopMatrix();
|
||||
|
||||
::glBegin(GL_LINES);
|
||||
// y axis
|
||||
::glColor3f(0.0f, 1.0f, 0.0f);
|
||||
::glPushMatrix();
|
||||
::glTranslated(origin(0), origin(1), origin(2));
|
||||
::glRotated(-90.0, 1.0, 0.0, 0.0);
|
||||
render_axis(length(1));
|
||||
::glPopMatrix();
|
||||
|
||||
// z axis
|
||||
::glColor3f(0.0f, 0.0f, 1.0f);
|
||||
::glVertex3dv(origin.data());
|
||||
::glVertex3f((GLfloat)origin(0), (GLfloat)origin(1), (GLfloat)origin(2) + length);
|
||||
::glEnd();
|
||||
::glPushMatrix();
|
||||
::glTranslated(origin(0), origin(1), origin(2));
|
||||
render_axis(length(2));
|
||||
::glPopMatrix();
|
||||
|
||||
::glDisable(GL_LIGHTING);
|
||||
}
|
||||
|
||||
void GLCanvas3D::Axes::render_axis(double length) const
|
||||
{
|
||||
::gluQuadricOrientation(m_quadric, GLU_OUTSIDE);
|
||||
::gluCylinder(m_quadric, Radius, Radius, length, 32, 1);
|
||||
::gluQuadricOrientation(m_quadric, GLU_INSIDE);
|
||||
::gluDisk(m_quadric, 0.0, Radius, 32, 1);
|
||||
::glTranslated(0.0, 0.0, length);
|
||||
::gluQuadricOrientation(m_quadric, GLU_OUTSIDE);
|
||||
::gluCylinder(m_quadric, ArrowBaseRadius, 0.0, ArrowLength, 32, 1);
|
||||
::gluQuadricOrientation(m_quadric, GLU_INSIDE);
|
||||
::gluDisk(m_quadric, 0.0, ArrowBaseRadius, 32, 1);
|
||||
}
|
||||
|
||||
GLCanvas3D::Shader::Shader()
|
||||
: m_shader(nullptr)
|
||||
@ -3781,7 +3810,7 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape)
|
||||
|
||||
// Set the origin and size for painting of the coordinate system axes.
|
||||
m_axes.origin = Vec3d(0.0, 0.0, (double)GROUND_Z);
|
||||
set_axes_length(0.3f * (float)m_bed.get_bounding_box().max_size());
|
||||
set_bed_axes_length(0.1 * m_bed.get_bounding_box().max_size());
|
||||
|
||||
if (new_shape)
|
||||
zoom_to_bed();
|
||||
@ -3789,9 +3818,9 @@ void GLCanvas3D::set_bed_shape(const Pointfs& shape)
|
||||
m_dirty = true;
|
||||
}
|
||||
|
||||
void GLCanvas3D::set_axes_length(float length)
|
||||
void GLCanvas3D::set_bed_axes_length(double length)
|
||||
{
|
||||
m_axes.length = length;
|
||||
m_axes.length = length * Vec3d::Ones();
|
||||
}
|
||||
|
||||
void GLCanvas3D::set_color_by(const std::string& value)
|
||||
@ -4051,21 +4080,16 @@ void GLCanvas3D::render()
|
||||
_render_background();
|
||||
|
||||
if (is_custom_bed) // untextured bed needs to be rendered before objects
|
||||
{
|
||||
_render_bed(theta);
|
||||
// disable depth testing so that axes are not covered by ground
|
||||
_render_axes(false);
|
||||
}
|
||||
|
||||
_render_objects();
|
||||
_render_sla_slices();
|
||||
_render_selection();
|
||||
|
||||
_render_axes();
|
||||
|
||||
if (!is_custom_bed) // textured bed needs to be rendered after objects
|
||||
{
|
||||
_render_axes(true);
|
||||
_render_bed(theta);
|
||||
}
|
||||
|
||||
// we need to set the mouse's scene position here because the depth buffer
|
||||
// could be invalidated by the following gizmo render methods
|
||||
@ -6019,9 +6043,9 @@ void GLCanvas3D::_render_bed(float theta) const
|
||||
m_bed.render(theta);
|
||||
}
|
||||
|
||||
void GLCanvas3D::_render_axes(bool depth_test) const
|
||||
void GLCanvas3D::_render_axes() const
|
||||
{
|
||||
m_axes.render(depth_test);
|
||||
m_axes.render();
|
||||
}
|
||||
|
||||
void GLCanvas3D::_render_objects() const
|
||||
|
@ -20,6 +20,8 @@ class wxTimerEvent;
|
||||
class wxPaintEvent;
|
||||
class wxGLCanvas;
|
||||
|
||||
class GLUquadric;
|
||||
typedef class GLUquadric GLUquadricObj;
|
||||
|
||||
namespace Slic3r {
|
||||
|
||||
@ -231,12 +233,20 @@ class GLCanvas3D
|
||||
|
||||
struct Axes
|
||||
{
|
||||
static const double Radius;
|
||||
static const double ArrowBaseRadius;
|
||||
static const double ArrowLength;
|
||||
Vec3d origin;
|
||||
float length;
|
||||
Vec3d length;
|
||||
GLUquadricObj* m_quadric;
|
||||
|
||||
Axes();
|
||||
~Axes();
|
||||
|
||||
void render(bool depth_test) const;
|
||||
void render() const;
|
||||
|
||||
private:
|
||||
void render_axis(double length) const;
|
||||
};
|
||||
|
||||
class Shader
|
||||
@ -870,8 +880,7 @@ public:
|
||||
// fills the m_bed.m_grid_lines and sets m_bed.m_origin.
|
||||
// Sets m_bed.m_polygon to limit the object placement.
|
||||
void set_bed_shape(const Pointfs& shape);
|
||||
|
||||
void set_axes_length(float length);
|
||||
void set_bed_axes_length(double length);
|
||||
|
||||
void set_clipping_plane(unsigned int id, const ClippingPlane& plane)
|
||||
{
|
||||
@ -1011,7 +1020,7 @@ private:
|
||||
void _picking_pass() const;
|
||||
void _render_background() const;
|
||||
void _render_bed(float theta) const;
|
||||
void _render_axes(bool depth_test) const;
|
||||
void _render_axes() const;
|
||||
void _render_objects() const;
|
||||
void _render_selection() const;
|
||||
void _render_warning_texture() const;
|
||||
|
Loading…
Reference in New Issue
Block a user