mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 12:41:20 -06:00 
			
		
		
		
	Merge branch 'lm_libglu_eradication_rebased'
This commit is contained in:
		
						commit
						3cb8232e81
					
				
					 24 changed files with 360 additions and 441 deletions
				
			
		|  | @ -1,11 +1,12 @@ | ||||||
| #version 110 | #version 110 | ||||||
| 
 | 
 | ||||||
| uniform vec4 uniform_color; | uniform vec4 uniform_color; | ||||||
|  | uniform float emission_factor; | ||||||
| 
 | 
 | ||||||
| // x = tainted, y = specular; | // x = tainted, y = specular; | ||||||
| varying vec2 intensity; | varying vec2 intensity; | ||||||
| 
 | 
 | ||||||
| void main() | void main() | ||||||
| { | { | ||||||
|     gl_FragColor = vec4(vec3(intensity.y, intensity.y, intensity.y) + uniform_color.rgb * intensity.x, uniform_color.a); |     gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ using Vec2crd = Eigen::Matrix<coord_t,  2, 1, Eigen::DontAlign>; | ||||||
| using Vec3crd = Eigen::Matrix<coord_t,  3, 1, Eigen::DontAlign>; | using Vec3crd = Eigen::Matrix<coord_t,  3, 1, Eigen::DontAlign>; | ||||||
| using Vec2i   = Eigen::Matrix<int,      2, 1, Eigen::DontAlign>; | using Vec2i   = Eigen::Matrix<int,      2, 1, Eigen::DontAlign>; | ||||||
| using Vec3i   = Eigen::Matrix<int,      3, 1, Eigen::DontAlign>; | using Vec3i   = Eigen::Matrix<int,      3, 1, Eigen::DontAlign>; | ||||||
|  | using Vec4i   = Eigen::Matrix<int,      4, 1, Eigen::DontAlign>; | ||||||
| using Vec2i32 = Eigen::Matrix<int32_t,  2, 1, Eigen::DontAlign>; | using Vec2i32 = Eigen::Matrix<int32_t,  2, 1, Eigen::DontAlign>; | ||||||
| using Vec2i64 = Eigen::Matrix<int64_t,  2, 1, Eigen::DontAlign>; | using Vec2i64 = Eigen::Matrix<int64_t,  2, 1, Eigen::DontAlign>; | ||||||
| using Vec3i32 = Eigen::Matrix<int32_t,  3, 1, Eigen::DontAlign>; | using Vec3i32 = Eigen::Matrix<int32_t,  3, 1, Eigen::DontAlign>; | ||||||
|  | @ -50,12 +51,15 @@ using Matrix2f       = Eigen::Matrix<float,  2, 2, Eigen::DontAlign>; | ||||||
| using Matrix2d       = Eigen::Matrix<double, 2, 2, Eigen::DontAlign>; | using Matrix2d       = Eigen::Matrix<double, 2, 2, Eigen::DontAlign>; | ||||||
| using Matrix3f       = Eigen::Matrix<float,  3, 3, Eigen::DontAlign>; | using Matrix3f       = Eigen::Matrix<float,  3, 3, Eigen::DontAlign>; | ||||||
| using Matrix3d       = Eigen::Matrix<double, 3, 3, Eigen::DontAlign>; | using Matrix3d       = Eigen::Matrix<double, 3, 3, Eigen::DontAlign>; | ||||||
|  | using Matrix4f       = Eigen::Matrix<float,  4, 4, Eigen::DontAlign>; | ||||||
|  | using Matrix4d       = Eigen::Matrix<double, 4, 4, Eigen::DontAlign>; | ||||||
| 
 | 
 | ||||||
| using Transform2f    = Eigen::Transform<float,  2, Eigen::Affine, Eigen::DontAlign>; | using Transform2f    = Eigen::Transform<float,  2, Eigen::Affine, Eigen::DontAlign>; | ||||||
| using Transform2d    = Eigen::Transform<double, 2, Eigen::Affine, Eigen::DontAlign>; | using Transform2d    = Eigen::Transform<double, 2, Eigen::Affine, Eigen::DontAlign>; | ||||||
| using Transform3f    = Eigen::Transform<float,  3, Eigen::Affine, Eigen::DontAlign>; | using Transform3f    = Eigen::Transform<float,  3, Eigen::Affine, Eigen::DontAlign>; | ||||||
| using Transform3d    = Eigen::Transform<double, 3, Eigen::Affine, Eigen::DontAlign>; | using Transform3d    = Eigen::Transform<double, 3, Eigen::Affine, Eigen::DontAlign>; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs(0) < rhs(0) || (lhs(0) == rhs(0) && lhs(1) < rhs(1)); } | inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs(0) < rhs(0) || (lhs(0) == rhs(0) && lhs(1) < rhs(1)); } | ||||||
| 
 | 
 | ||||||
| template<int Options> | template<int Options> | ||||||
|  |  | ||||||
|  | @ -1014,6 +1014,33 @@ TriangleMesh make_cylinder(double r, double h, double fa) | ||||||
|     return mesh; |     return mesh; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | TriangleMesh make_cone(double r, double h, double fa) | ||||||
|  | { | ||||||
|  |     Pointf3s vertices; | ||||||
|  |     std::vector<Vec3i>	facets; | ||||||
|  |     vertices.reserve(3+size_t(2*PI/fa)); | ||||||
|  |     vertices.reserve(3+2*size_t(2*PI/fa)); | ||||||
|  | 
 | ||||||
|  |     vertices = { Vec3d::Zero(), Vec3d(0., 0., h) }; // base center and top vertex
 | ||||||
|  |     size_t i = 0; | ||||||
|  |     for (double angle=0; angle<2*PI; angle+=fa) { | ||||||
|  |         vertices.emplace_back(r*std::cos(angle), r*std::sin(angle), 0.); | ||||||
|  |         if (angle > 0.) { | ||||||
|  |             facets.emplace_back(0, i+2, i+1); | ||||||
|  |             facets.emplace_back(1, i+1, i+2); | ||||||
|  |         } | ||||||
|  |         ++i; | ||||||
|  |     } | ||||||
|  |     facets.emplace_back(0, 2, i+1); // close the shape
 | ||||||
|  |     facets.emplace_back(1, i+1, 2); | ||||||
|  | 
 | ||||||
|  |     TriangleMesh mesh(std::move(vertices), std::move(facets)); | ||||||
|  |     mesh.repair(); | ||||||
|  |     return mesh; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // Generates mesh for a sphere centered about the origin, using the generated angle
 | // Generates mesh for a sphere centered about the origin, using the generated angle
 | ||||||
| // to determine the granularity. 
 | // to determine the granularity. 
 | ||||||
| // Default angle is 1 degree.
 | // Default angle is 1 degree.
 | ||||||
|  |  | ||||||
|  | @ -122,10 +122,8 @@ Polygon its_convex_hull_2d_above(const indexed_triangle_set &its, const Matrix3f | ||||||
| Polygon its_convex_hull_2d_above(const indexed_triangle_set &its, const Transform3f &t, const float z); | Polygon its_convex_hull_2d_above(const indexed_triangle_set &its, const Transform3f &t, const float z); | ||||||
| 
 | 
 | ||||||
| TriangleMesh make_cube(double x, double y, double z); | TriangleMesh make_cube(double x, double y, double z); | ||||||
| 
 |  | ||||||
| // Generate a TriangleMesh of a cylinder
 |  | ||||||
| TriangleMesh make_cylinder(double r, double h, double fa=(2*PI/360)); | TriangleMesh make_cylinder(double r, double h, double fa=(2*PI/360)); | ||||||
| 
 | TriangleMesh make_cone(double r, double h, double fa=(2*PI/360)); | ||||||
| TriangleMesh make_sphere(double rho, double fa=(2*PI/360)); | TriangleMesh make_sphere(double rho, double fa=(2*PI/360)); | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -240,7 +240,7 @@ add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) | ||||||
| 
 | 
 | ||||||
| encoding_check(libslic3r_gui) | encoding_check(libslic3r_gui) | ||||||
| 
 | 
 | ||||||
| target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi libcurl ${wxWidgets_LIBRARIES}) | target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL hidapi libcurl ${wxWidgets_LIBRARIES}) | ||||||
| 
 | 
 | ||||||
| if (CMAKE_SYSTEM_NAME STREQUAL "Linux") | if (CMAKE_SYSTEM_NAME STREQUAL "Linux") | ||||||
|     target_link_libraries(libslic3r_gui ${DBUS_LIBRARIES})  |     target_link_libraries(libslic3r_gui ${DBUS_LIBRARIES})  | ||||||
|  |  | ||||||
|  | @ -122,6 +122,7 @@ void Bed3D::Axes::render() const | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     glsafe(::glEnable(GL_DEPTH_TEST)); | ||||||
| 
 | 
 | ||||||
|     shader->start_using(); |     shader->start_using(); | ||||||
|  |     shader->set_uniform("emission_factor", 0.0); | ||||||
| 
 | 
 | ||||||
|     // x axis
 |     // x axis
 | ||||||
|     std::array<float, 4> color = { 0.75f, 0.0f, 0.0f, 1.0f }; |     std::array<float, 4> color = { 0.75f, 0.0f, 0.0f, 1.0f }; | ||||||
|  | @ -489,6 +490,7 @@ void Bed3D::render_model() const | ||||||
|         if (shader != nullptr) { |         if (shader != nullptr) { | ||||||
|             shader->start_using(); |             shader->start_using(); | ||||||
|             shader->set_uniform("uniform_color", m_model_color); |             shader->set_uniform("uniform_color", m_model_color); | ||||||
|  |             shader->set_uniform("emission_factor", 0.0); | ||||||
|             ::glPushMatrix(); |             ::glPushMatrix(); | ||||||
|             ::glTranslated(m_model_offset(0), m_model_offset(1), m_model_offset(2)); |             ::glTranslated(m_model_offset(0), m_model_offset(1), m_model_offset(2)); | ||||||
|             model->render(); |             model->render(); | ||||||
|  |  | ||||||
|  | @ -227,6 +227,7 @@ void GCodeViewer::SequentialView::Marker::render() const | ||||||
| 
 | 
 | ||||||
|     shader->start_using(); |     shader->start_using(); | ||||||
|     shader->set_uniform("uniform_color", m_color); |     shader->set_uniform("uniform_color", m_color); | ||||||
|  |     shader->set_uniform("emission_factor", 0.0); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glMultMatrixf(m_world_transform.data())); |     glsafe(::glMultMatrixf(m_world_transform.data())); | ||||||
|  |  | ||||||
|  | @ -1,6 +1,8 @@ | ||||||
| #include "libslic3r/libslic3r.h" | #include "libslic3r/libslic3r.h" | ||||||
| #include "GLCanvas3D.hpp" | #include "GLCanvas3D.hpp" | ||||||
| 
 | 
 | ||||||
|  | #include <igl/unproject.h> | ||||||
|  | 
 | ||||||
| #include "libslic3r/ClipperUtils.hpp" | #include "libslic3r/ClipperUtils.hpp" | ||||||
| #include "libslic3r/PrintConfig.hpp" | #include "libslic3r/PrintConfig.hpp" | ||||||
| #include "libslic3r/GCode/ThumbnailData.hpp" | #include "libslic3r/GCode/ThumbnailData.hpp" | ||||||
|  | @ -3916,7 +3918,7 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     glsafe(::glEnable(GL_DEPTH_TEST)); | ||||||
| 
 | 
 | ||||||
|     shader->start_using(); |     shader->start_using(); | ||||||
|     shader->set_uniform("print_box.volume_detection", 0); |     shader->set_uniform("emission_factor", 0.0); | ||||||
| 
 | 
 | ||||||
|     for (GLVolume* vol : visible_volumes) { |     for (GLVolume* vol : visible_volumes) { | ||||||
|         shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? orange : gray); |         shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? orange : gray); | ||||||
|  | @ -5391,9 +5393,9 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) | ||||||
|         return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); |         return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); | ||||||
| 
 | 
 | ||||||
|     const Camera& camera = wxGetApp().plater()->get_camera(); |     const Camera& camera = wxGetApp().plater()->get_camera(); | ||||||
|     const std::array<int, 4>& viewport = camera.get_viewport(); |     Matrix4d modelview = camera.get_view_matrix().matrix(); | ||||||
|     const Transform3d& modelview_matrix = camera.get_view_matrix(); |     Matrix4d projection= camera.get_projection_matrix().matrix(); | ||||||
|     const Transform3d& projection_matrix = camera.get_projection_matrix(); |     Vec4i viewport(camera.get_viewport().data()); | ||||||
| 
 | 
 | ||||||
|     GLint y = viewport[3] - (GLint)mouse_pos(1); |     GLint y = viewport[3] - (GLint)mouse_pos(1); | ||||||
|     GLfloat mouse_z; |     GLfloat mouse_z; | ||||||
|  | @ -5402,9 +5404,9 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) | ||||||
|     else |     else | ||||||
|         mouse_z = *z; |         mouse_z = *z; | ||||||
| 
 | 
 | ||||||
|     GLdouble out_x, out_y, out_z; |     Vec3d out; | ||||||
|     ::gluUnProject((GLdouble)mouse_pos(0), (GLdouble)y, (GLdouble)mouse_z, (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z); |     igl::unproject(Vec3d(mouse_pos(0), y, mouse_z), modelview, projection, viewport, out); | ||||||
|     return Vec3d((double)out_x, (double)out_y, (double)out_z); |     return out; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) | Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ | ||||||
| #include "GLCanvas3D.hpp" | #include "GLCanvas3D.hpp" | ||||||
| #include "GUI_App.hpp" | #include "GUI_App.hpp" | ||||||
| #include "Plater.hpp" | #include "Plater.hpp" | ||||||
|  | #include <igl/project.h> | ||||||
| 
 | 
 | ||||||
| #include <GL/glew.h> | #include <GL/glew.h> | ||||||
| 
 | 
 | ||||||
|  | @ -38,23 +39,26 @@ namespace GUI { | ||||||
|         m_state = Off; |         m_state = Off; | ||||||
| 
 | 
 | ||||||
|         const Camera& camera = wxGetApp().plater()->get_camera(); |         const Camera& camera = wxGetApp().plater()->get_camera(); | ||||||
|         const std::array<int, 4>& viewport = camera.get_viewport(); |         Matrix4d modelview = camera.get_view_matrix().matrix(); | ||||||
|         const Transform3d& modelview_matrix = camera.get_view_matrix(); |         Matrix4d projection= camera.get_projection_matrix().matrix(); | ||||||
|         const Transform3d& projection_matrix = camera.get_projection_matrix(); |         Vec4i viewport(camera.get_viewport().data()); | ||||||
|  | 
 | ||||||
|  |         // Convert our std::vector to Eigen dynamic matrix.
 | ||||||
|  |         Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::DontAlign> pts(points.size(), 3); | ||||||
|  |         for (size_t i=0; i<points.size(); ++i) | ||||||
|  |             pts.block<1, 3>(i, 0) = points[i]; | ||||||
|  | 
 | ||||||
|  |         // Get the projections.
 | ||||||
|  |         Eigen::Matrix<double, Eigen::Dynamic, 3, Eigen::DontAlign> projections; | ||||||
|  |         igl::project(pts, modelview, projection, viewport, projections); | ||||||
| 
 | 
 | ||||||
|         // bounding box created from the rectangle corners - will take care of order of the corners
 |         // bounding box created from the rectangle corners - will take care of order of the corners
 | ||||||
|         BoundingBox rectangle(Points{ Point(m_start_corner.cast<coord_t>()), Point(m_end_corner.cast<coord_t>()) }); |         BoundingBox rectangle(Points{ Point(m_start_corner.cast<coord_t>()), Point(m_end_corner.cast<coord_t>()) }); | ||||||
| 
 | 
 | ||||||
|         // Iterate over all points and determine whether they're in the rectangle.
 |         // Iterate over all points and determine whether they're in the rectangle.
 | ||||||
|         for (unsigned int i = 0; i<points.size(); ++i) { |         for (int i = 0; i<projections.rows(); ++i) | ||||||
|             const Vec3d& point = points[i]; |             if (rectangle.contains(Point(projections(i, 0), canvas.get_canvas_size().get_height() - projections(i, 1)))) | ||||||
|             GLdouble out_x, out_y, out_z; |  | ||||||
|             ::gluProject((GLdouble)point(0), (GLdouble)point(1), (GLdouble)point(2), (GLdouble*)modelview_matrix.data(), (GLdouble*)projection_matrix.data(), (GLint*)viewport.data(), &out_x, &out_y, &out_z); |  | ||||||
|             out_y = canvas.get_canvas_size().get_height() - out_y; |  | ||||||
| 
 |  | ||||||
|             if (rectangle.contains(Point(out_x, out_y))) |  | ||||||
|                 out.push_back(i); |                 out.push_back(i); | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         return out; |         return out; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -20,26 +20,22 @@ GLGizmoBase::Grabber::Grabber() | ||||||
|     , dragging(false) |     , dragging(false) | ||||||
|     , enabled(true) |     , enabled(true) | ||||||
| { | { | ||||||
|     color[0] = 1.0f; |     color = { 1.0f, 1.0f, 1.0f, 1.0f }; | ||||||
|     color[1] = 1.0f; |  | ||||||
|     color[2] = 1.0f; |  | ||||||
|     color[3] = 1.0f; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::Grabber::render(bool hover, float size) const | void GLGizmoBase::Grabber::render(bool hover, float size) const | ||||||
| { | { | ||||||
|     float render_color[4]; |     std::array<float, 4> render_color; | ||||||
|     if (hover) |     if (hover) { | ||||||
|     { |         render_color[0] = (1.0f - color[0]); | ||||||
|         render_color[0] = 1.0f - color[0]; |         render_color[1] = (1.0f - color[1]); | ||||||
|         render_color[1] = 1.0f - color[1]; |         render_color[2] = (1.0f - color[2]); | ||||||
|         render_color[2] = 1.0f - color[2]; |  | ||||||
|         render_color[3] = color[3]; |         render_color[3] = color[3]; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|         ::memcpy((void*)render_color, (const void*)color, 4 * sizeof(float)); |         render_color = color; | ||||||
| 
 | 
 | ||||||
|     render(size, render_color, true); |     render(size, render_color, false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| float GLGizmoBase::Grabber::get_half_size(float size) const | float GLGizmoBase::Grabber::get_half_size(float size) const | ||||||
|  | @ -52,80 +48,33 @@ float GLGizmoBase::Grabber::get_dragging_half_size(float size) const | ||||||
|     return get_half_size(size) * DraggingScaleFactor; |     return get_half_size(size) * DraggingScaleFactor; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::Grabber::render(float size, const float* render_color, bool use_lighting) const | void GLGizmoBase::Grabber::render(float size, const std::array<float, 4>& render_color, bool picking) const | ||||||
| { | { | ||||||
|     float half_size = dragging ? get_dragging_half_size(size) : get_half_size(size); |     if (! cube_initialized) { | ||||||
|  |         // This cannot be done in constructor, OpenGL is not yet
 | ||||||
|  |         // initialized at that point (on Linux at least).
 | ||||||
|  |         TriangleMesh mesh = make_cube(1., 1., 1.); | ||||||
|  |         mesh.translate(Vec3f(-0.5, -0.5, -0.5)); | ||||||
|  |         const_cast<GLModel&>(cube).init_from(mesh); | ||||||
|  |         const_cast<bool&>(cube_initialized) = true; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     if (use_lighting) |     float fullsize = 2 * (dragging ? get_dragging_half_size(size) : get_half_size(size)); | ||||||
|         glsafe(::glEnable(GL_LIGHTING)); |  | ||||||
| 
 | 
 | ||||||
|     glsafe(::glColor4fv(render_color)); |     GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_current_shader(); | ||||||
|  |     if (shader != nullptr) | ||||||
|  |         shader->set_uniform("uniform_color", render_color); | ||||||
|  |     else | ||||||
|  |         glsafe(::glColor4fv(render_color.data())); // picking
 | ||||||
| 
 | 
 | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glTranslated(center(0), center(1), center(2))); |     glsafe(::glTranslated(center(0), center(1), center(2))); | ||||||
| 
 |  | ||||||
|     glsafe(::glRotated(Geometry::rad2deg(angles(2)), 0.0, 0.0, 1.0)); |     glsafe(::glRotated(Geometry::rad2deg(angles(2)), 0.0, 0.0, 1.0)); | ||||||
|     glsafe(::glRotated(Geometry::rad2deg(angles(1)), 0.0, 1.0, 0.0)); |     glsafe(::glRotated(Geometry::rad2deg(angles(1)), 0.0, 1.0, 0.0)); | ||||||
|     glsafe(::glRotated(Geometry::rad2deg(angles(0)), 1.0, 0.0, 0.0)); |     glsafe(::glRotated(Geometry::rad2deg(angles(0)), 1.0, 0.0, 0.0)); | ||||||
| 
 |     glsafe(::glScaled(fullsize, fullsize, fullsize)); | ||||||
|     // face min x
 |     cube.render(); | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef(-(GLfloat)half_size, 0.0f, 0.0f)); |  | ||||||
|     glsafe(::glRotatef(-90.0f, 0.0f, 1.0f, 0.0f)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| 
 |  | ||||||
|     // face max x
 |  | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef((GLfloat)half_size, 0.0f, 0.0f)); |  | ||||||
|     glsafe(::glRotatef(90.0f, 0.0f, 1.0f, 0.0f)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     // face min y
 |  | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef(0.0f, -(GLfloat)half_size, 0.0f)); |  | ||||||
|     glsafe(::glRotatef(90.0f, 1.0f, 0.0f, 0.0f)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     // face max y
 |  | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef(0.0f, (GLfloat)half_size, 0.0f)); |  | ||||||
|     glsafe(::glRotatef(-90.0f, 1.0f, 0.0f, 0.0f)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     // face min z
 |  | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef(0.0f, 0.0f, -(GLfloat)half_size)); |  | ||||||
|     glsafe(::glRotatef(180.0f, 1.0f, 0.0f, 0.0f)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     // face max z
 |  | ||||||
|     glsafe(::glPushMatrix()); |  | ||||||
|     glsafe(::glTranslatef(0.0f, 0.0f, (GLfloat)half_size)); |  | ||||||
|     render_face(half_size); |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     glsafe(::glPopMatrix()); |  | ||||||
| 
 |  | ||||||
|     if (use_lighting) |  | ||||||
|         glsafe(::glDisable(GL_LIGHTING)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void GLGizmoBase::Grabber::render_face(float half_size) const |  | ||||||
| { |  | ||||||
|     ::glBegin(GL_TRIANGLES); |  | ||||||
|     ::glNormal3f(0.0f, 0.0f, 1.0f); |  | ||||||
|     ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); |  | ||||||
|     ::glVertex3f((GLfloat)half_size, -(GLfloat)half_size, 0.0f); |  | ||||||
|     ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); |  | ||||||
|     ::glVertex3f((GLfloat)half_size, (GLfloat)half_size, 0.0f); |  | ||||||
|     ::glVertex3f(-(GLfloat)half_size, (GLfloat)half_size, 0.0f); |  | ||||||
|     ::glVertex3f(-(GLfloat)half_size, -(GLfloat)half_size, 0.0f); |  | ||||||
|     glsafe(::glEnd()); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -141,9 +90,12 @@ GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, u | ||||||
|     , m_imgui(wxGetApp().imgui()) |     , m_imgui(wxGetApp().imgui()) | ||||||
|     , m_first_input_window_render(true) |     , m_first_input_window_render(true) | ||||||
| { | { | ||||||
|     ::memcpy((void*)m_base_color, (const void*)DEFAULT_BASE_COLOR, 4 * sizeof(float)); |     m_base_color = DEFAULT_BASE_COLOR; | ||||||
|     ::memcpy((void*)m_drag_color, (const void*)DEFAULT_DRAG_COLOR, 4 * sizeof(float)); |     m_drag_color = DEFAULT_DRAG_COLOR; | ||||||
|     ::memcpy((void*)m_highlight_color, (const void*)DEFAULT_HIGHLIGHT_COLOR, 4 * sizeof(float)); |     m_highlight_color = DEFAULT_HIGHLIGHT_COLOR; | ||||||
|  |     m_cone.init_from(make_cone(1., 1., 2 * PI / 24)); | ||||||
|  |     m_sphere.init_from(make_sphere(1., (2 * M_PI) / 24.)); | ||||||
|  |     m_cylinder.init_from(make_cylinder(1., 1., 2 * PI / 24.)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::set_hover_id(int id) | void GLGizmoBase::set_hover_id(int id) | ||||||
|  | @ -155,10 +107,9 @@ void GLGizmoBase::set_hover_id(int id) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::set_highlight_color(const float* color) | void GLGizmoBase::set_highlight_color(const std::array<float, 4>& color) | ||||||
| { | { | ||||||
|     if (color != nullptr) |     m_highlight_color = color; | ||||||
|         ::memcpy((void*)m_highlight_color, (const void*)color, 4 * sizeof(float)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::enable_grabber(unsigned int id) | void GLGizmoBase::enable_grabber(unsigned int id) | ||||||
|  | @ -227,31 +178,31 @@ std::array<float, 4> GLGizmoBase::picking_color_component(unsigned int id) const | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const | void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const | ||||||
| { | { | ||||||
|     render_grabbers((float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0)); |     render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::render_grabbers(float size) const | void GLGizmoBase::render_grabbers(float size) const | ||||||
| { | { | ||||||
|     for (int i = 0; i < (int)m_grabbers.size(); ++i) |     GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); | ||||||
|     { |     if (shader == nullptr) | ||||||
|  |         return; | ||||||
|  |     shader->start_using(); | ||||||
|  |     shader->set_uniform("emission_factor", 0.1); | ||||||
|  |     for (int i = 0; i < (int)m_grabbers.size(); ++i) { | ||||||
|         if (m_grabbers[i].enabled) |         if (m_grabbers[i].enabled) | ||||||
|             m_grabbers[i].render((m_hover_id == i), size); |             m_grabbers[i].render(m_hover_id == i, size); | ||||||
|     } |     } | ||||||
|  |     shader->stop_using(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const | void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const | ||||||
| { | { | ||||||
|     float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); |     float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); | ||||||
| 
 | 
 | ||||||
|     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) { | ||||||
|         if (m_grabbers[i].enabled) |  | ||||||
|         { |  | ||||||
|             std::array<float, 4> color = picking_color_component(i); |             std::array<float, 4> color = picking_color_component(i); | ||||||
|             m_grabbers[i].color[0] = color[0]; |             m_grabbers[i].color = color; | ||||||
|             m_grabbers[i].color[1] = color[1]; |  | ||||||
|             m_grabbers[i].color[2] = color[2]; |  | ||||||
|             m_grabbers[i].color[3] = color[3]; |  | ||||||
|             m_grabbers[i].render_for_picking(mean_size); |             m_grabbers[i].render_for_picking(mean_size); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -265,8 +216,7 @@ std::string GLGizmoBase::format(float value, unsigned int decimals) const | ||||||
| void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) | void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) | ||||||
| { | { | ||||||
|     on_render_input_window(x, y, bottom_limit); |     on_render_input_window(x, y, bottom_limit); | ||||||
|     if (m_first_input_window_render) |     if (m_first_input_window_render) { | ||||||
|     { |  | ||||||
|         // for some reason, the imgui dialogs are not shown on screen in the 1st frame where they are rendered, but show up only with the 2nd rendered frame
 |         // for some reason, the imgui dialogs are not shown on screen in the 1st frame where they are rendered, but show up only with the 2nd rendered frame
 | ||||||
|         // so, we forces another frame rendering the first time the imgui window is shown
 |         // so, we forces another frame rendering the first time the imgui window is shown
 | ||||||
|         m_parent.set_as_dirty(); |         m_parent.set_as_dirty(); | ||||||
|  |  | ||||||
|  | @ -4,13 +4,11 @@ | ||||||
| #include "libslic3r/Point.hpp" | #include "libslic3r/Point.hpp" | ||||||
| 
 | 
 | ||||||
| #include "slic3r/GUI/I18N.hpp" | #include "slic3r/GUI/I18N.hpp" | ||||||
|  | #include "slic3r/GUI/GLModel.hpp" | ||||||
| 
 | 
 | ||||||
| #include <cereal/archives/binary.hpp> | #include <cereal/archives/binary.hpp> | ||||||
| 
 | 
 | ||||||
| class wxWindow; | class wxWindow; | ||||||
| class GLUquadric; |  | ||||||
| typedef class GLUquadric GLUquadricObj; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| namespace Slic3r { | namespace Slic3r { | ||||||
| 
 | 
 | ||||||
|  | @ -20,13 +18,15 @@ class ModelObject; | ||||||
| 
 | 
 | ||||||
| namespace GUI { | namespace GUI { | ||||||
| 
 | 
 | ||||||
| static const float DEFAULT_BASE_COLOR[4] = { 0.625f, 0.625f, 0.625f, 1.0f }; | static const std::array<float, 4> DEFAULT_BASE_COLOR = { 0.625f, 0.625f, 0.625f, 1.0f }; | ||||||
| static const float DEFAULT_DRAG_COLOR[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; | static const std::array<float, 4> DEFAULT_DRAG_COLOR = { 1.0f, 1.0f, 1.0f, 1.0f }; | ||||||
| static const float DEFAULT_HIGHLIGHT_COLOR[4] = { 1.0f, 0.38f, 0.0f, 1.0f }; | static const std::array<float, 4> DEFAULT_HIGHLIGHT_COLOR = { 1.0f, 0.38f, 0.0f, 1.0f }; | ||||||
| static const float AXES_COLOR[][4] = { { 0.75f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.75f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.75f, 1.0f } }; | static const std::array<std::array<float, 4>, 3> AXES_COLOR = {{ | ||||||
| static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; |                                                                 { 0.75f, 0.0f, 0.0f, 1.0f }, | ||||||
| 
 |                                                                 { 0.0f, 0.75f, 0.0f, 1.0f }, | ||||||
| 
 |                                                                 { 0.0f, 0.0f, 0.75f, 1.0f } | ||||||
|  |                                                               }}; | ||||||
|  | static const std::array<float, 4> CONSTRAINED_COLOR = { 0.5f, 0.5f, 0.5f, 1.0f }; | ||||||
| 
 | 
 | ||||||
| class ImGuiWrapper; | class ImGuiWrapper; | ||||||
| class GLCanvas3D; | class GLCanvas3D; | ||||||
|  | @ -50,21 +50,23 @@ protected: | ||||||
| 
 | 
 | ||||||
|         Vec3d center; |         Vec3d center; | ||||||
|         Vec3d angles; |         Vec3d angles; | ||||||
|         float color[4]; |         std::array<float, 4> color; | ||||||
|         bool enabled; |         bool enabled; | ||||||
|         bool dragging; |         bool dragging; | ||||||
| 
 | 
 | ||||||
|         Grabber(); |         Grabber(); | ||||||
| 
 | 
 | ||||||
|         void render(bool hover, float size) const; |         void render(bool hover, float size) const; | ||||||
|         void render_for_picking(float size) const { render(size, color, false); } |         void render_for_picking(float size) const { render(size, color, true); } | ||||||
| 
 | 
 | ||||||
|         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; | ||||||
| 
 | 
 | ||||||
|     private: |     private: | ||||||
|         void render(float size, const float* render_color, bool use_lighting) const; |         void render(float size, const std::array<float, 4>& render_color, bool picking) const; | ||||||
|         void render_face(float half_size) const; | 
 | ||||||
|  |         GLModel cube; | ||||||
|  |         bool cube_initialized = false; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  | @ -95,14 +97,17 @@ protected: | ||||||
|     unsigned int m_sprite_id; |     unsigned int m_sprite_id; | ||||||
|     int m_hover_id; |     int m_hover_id; | ||||||
|     bool m_dragging; |     bool m_dragging; | ||||||
|     float m_base_color[4]; |     std::array<float, 4> m_base_color; | ||||||
|     float m_drag_color[4]; |     std::array<float, 4> m_drag_color; | ||||||
|     float m_highlight_color[4]; |     std::array<float, 4> m_highlight_color; | ||||||
|     mutable std::vector<Grabber> m_grabbers; |     mutable std::vector<Grabber> m_grabbers; | ||||||
|     ImGuiWrapper* m_imgui; |     ImGuiWrapper* m_imgui; | ||||||
|     bool m_first_input_window_render; |     bool m_first_input_window_render; | ||||||
|     mutable std::string m_tooltip; |     mutable std::string m_tooltip; | ||||||
|     CommonGizmosDataPool* m_c; |     CommonGizmosDataPool* m_c; | ||||||
|  |     GLModel m_cone; | ||||||
|  |     GLModel m_cylinder; | ||||||
|  |     GLModel m_sphere; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     GLGizmoBase(GLCanvas3D& parent, |     GLGizmoBase(GLCanvas3D& parent, | ||||||
|  | @ -137,7 +142,7 @@ public: | ||||||
|     int get_hover_id() const { return m_hover_id; } |     int get_hover_id() const { return m_hover_id; } | ||||||
|     void set_hover_id(int id); |     void set_hover_id(int id); | ||||||
|      |      | ||||||
|     void set_highlight_color(const float* color); |     void set_highlight_color(const std::array<float, 4>& color); | ||||||
| 
 | 
 | ||||||
|     void enable_grabber(unsigned int id); |     void enable_grabber(unsigned int id); | ||||||
|     void disable_grabber(unsigned int id); |     void disable_grabber(unsigned int id); | ||||||
|  |  | ||||||
|  | @ -51,7 +51,7 @@ bool GLGizmoCut::on_init() | ||||||
| 
 | 
 | ||||||
| std::string GLGizmoCut::on_get_name() const | std::string GLGizmoCut::on_get_name() const | ||||||
| { | { | ||||||
|     return (_(L("Cut")) + " [C]").ToUTF8().data(); |     return (_L("Cut") + " [C]").ToUTF8().data(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoCut::on_set_state() | void GLGizmoCut::on_set_state() | ||||||
|  | @ -96,12 +96,12 @@ void GLGizmoCut::on_render() const | ||||||
| 
 | 
 | ||||||
|     const BoundingBoxf3& box = selection.get_bounding_box(); |     const BoundingBoxf3& box = selection.get_bounding_box(); | ||||||
|     Vec3d plane_center = box.center(); |     Vec3d plane_center = box.center(); | ||||||
|     plane_center(2) = m_cut_z; |     plane_center.z() = m_cut_z; | ||||||
| 
 | 
 | ||||||
|     const float min_x = box.min(0) - Margin; |     const float min_x = box.min.x() - Margin; | ||||||
|     const float max_x = box.max(0) + Margin; |     const float max_x = box.max.x() + Margin; | ||||||
|     const float min_y = box.min(1) - Margin; |     const float min_y = box.min.y() - Margin; | ||||||
|     const float max_y = box.max(1) + Margin; |     const float max_y = box.max.y() + Margin; | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     glsafe(::glEnable(GL_DEPTH_TEST)); | ||||||
|     glsafe(::glDisable(GL_CULL_FACE)); |     glsafe(::glDisable(GL_CULL_FACE)); | ||||||
|     glsafe(::glEnable(GL_BLEND)); |     glsafe(::glEnable(GL_BLEND)); | ||||||
|  | @ -110,10 +110,10 @@ void GLGizmoCut::on_render() const | ||||||
|     // Draw the cutting plane
 |     // Draw the cutting plane
 | ||||||
|     ::glBegin(GL_QUADS); |     ::glBegin(GL_QUADS); | ||||||
|     ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); |     ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); | ||||||
|     ::glVertex3f(min_x, min_y, plane_center(2)); |     ::glVertex3f(min_x, min_y, plane_center.z()); | ||||||
|     ::glVertex3f(max_x, min_y, plane_center(2)); |     ::glVertex3f(max_x, min_y, plane_center.z()); | ||||||
|     ::glVertex3f(max_x, max_y, plane_center(2)); |     ::glVertex3f(max_x, max_y, plane_center.z()); | ||||||
|     ::glVertex3f(min_x, max_y, plane_center(2)); |     ::glVertex3f(min_x, max_y, plane_center.z()); | ||||||
|     glsafe(::glEnd()); |     glsafe(::glEnd()); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glEnable(GL_CULL_FACE)); |     glsafe(::glEnable(GL_CULL_FACE)); | ||||||
|  | @ -123,9 +123,10 @@ void GLGizmoCut::on_render() const | ||||||
| 
 | 
 | ||||||
|     // Draw the grabber and the connecting line
 |     // Draw the grabber and the connecting line
 | ||||||
|     m_grabbers[0].center = plane_center; |     m_grabbers[0].center = plane_center; | ||||||
|     m_grabbers[0].center(2) = plane_center(2) + Offset; |     m_grabbers[0].center.z() = plane_center.z() + Offset; | ||||||
|  | 
 | ||||||
|  |     glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glDisable(GL_DEPTH_TEST)); |  | ||||||
|     glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); |     glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); | ||||||
|     glsafe(::glColor3f(1.0, 1.0, 0.0)); |     glsafe(::glColor3f(1.0, 1.0, 0.0)); | ||||||
|     ::glBegin(GL_LINES); |     ::glBegin(GL_LINES); | ||||||
|  | @ -133,8 +134,16 @@ void GLGizmoCut::on_render() const | ||||||
|     ::glVertex3dv(m_grabbers[0].center.data()); |     ::glVertex3dv(m_grabbers[0].center.data()); | ||||||
|     glsafe(::glEnd()); |     glsafe(::glEnd()); | ||||||
| 
 | 
 | ||||||
|     std::copy(std::begin(GrabberColor), std::end(GrabberColor), m_grabbers[0].color); |     GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); | ||||||
|     m_grabbers[0].render(m_hover_id == 0, (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0)); |     if (shader == nullptr) | ||||||
|  |         return; | ||||||
|  |     shader->start_using(); | ||||||
|  |     shader->set_uniform("emission_factor", 0.1); | ||||||
|  | 
 | ||||||
|  |     m_grabbers[0].color = GrabberColor; | ||||||
|  |     m_grabbers[0].render(m_hover_id == 0, (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); | ||||||
|  | 
 | ||||||
|  |     shader->stop_using(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoCut::on_render_for_picking() const | void GLGizmoCut::on_render_for_picking() const | ||||||
|  |  | ||||||
|  | @ -19,20 +19,10 @@ namespace GUI { | ||||||
| 
 | 
 | ||||||
| GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) |     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||||
|     , m_quadric(nullptr) |  | ||||||
| { | { | ||||||
|     m_quadric = ::gluNewQuadric(); |     m_vbo_cylinder.init_from(make_cylinder(1., 1.)); | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         // using GLU_FILL does not work when the instance's transformation
 |  | ||||||
|         // contains mirroring (normals are reverted)
 |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GLGizmoHollow::~GLGizmoHollow() |  | ||||||
| { |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluDeleteQuadric(m_quadric); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| bool GLGizmoHollow::on_init() | bool GLGizmoHollow::on_init() | ||||||
| { | { | ||||||
|  | @ -87,7 +77,7 @@ void GLGizmoHollow::on_render() const | ||||||
|     glsafe(::glEnable(GL_BLEND)); |     glsafe(::glEnable(GL_BLEND)); | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     glsafe(::glEnable(GL_DEPTH_TEST)); | ||||||
| 
 | 
 | ||||||
|     if (m_quadric != nullptr && selection.is_from_single_instance()) |     if (selection.is_from_single_instance()) | ||||||
|         render_points(selection, false); |         render_points(selection, false); | ||||||
| 
 | 
 | ||||||
|     m_selection_rectangle.render(m_parent); |     m_selection_rectangle.render(m_parent); | ||||||
|  | @ -111,8 +101,10 @@ void GLGizmoHollow::on_render_for_picking() const | ||||||
| 
 | 
 | ||||||
| void GLGizmoHollow::render_points(const Selection& selection, bool picking) const | void GLGizmoHollow::render_points(const Selection& selection, bool picking) const | ||||||
| { | { | ||||||
|     if (!picking) |     GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); | ||||||
|         glsafe(::glEnable(GL_LIGHTING)); |     if (shader) | ||||||
|  |         shader->start_using(); | ||||||
|  |     ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); | ||||||
| 
 | 
 | ||||||
|     const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); |     const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); | ||||||
|     const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); |     const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); | ||||||
|  | @ -150,16 +142,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons | ||||||
|             } |             } | ||||||
|             else { // neigher hover nor picking
 |             else { // neigher hover nor picking
 | ||||||
| 
 | 
 | ||||||
|                 render_color[0] = point_selected ? 1.0f : 0.7f; |                 render_color[0] = point_selected ? 1.0f : 1.f; | ||||||
|                 render_color[1] = point_selected ? 0.3f : 0.7f; |                 render_color[1] = point_selected ? 0.3f : 1.f; | ||||||
|                 render_color[2] = point_selected ? 0.3f : 0.7f; |                 render_color[2] = point_selected ? 0.3f : 1.f; | ||||||
|                 render_color[3] = 0.5f; |                 render_color[3] = 0.5f; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         glsafe(::glColor4fv(render_color.data())); |         if (shader && ! picking) | ||||||
|         float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; |             shader->set_uniform("uniform_color", render_color); | ||||||
|         glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); |         else // picking
 | ||||||
|  |             glsafe(::glColor4fv(render_color.data())); | ||||||
| 
 | 
 | ||||||
|         // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
 |         // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
 | ||||||
|         glsafe(::glPushMatrix()); |         glsafe(::glPushMatrix()); | ||||||
|  | @ -176,12 +169,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons | ||||||
|         glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); |         glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); | ||||||
|         glsafe(::glPushMatrix()); |         glsafe(::glPushMatrix()); | ||||||
|         glsafe(::glTranslated(0., 0., -drain_hole.height)); |         glsafe(::glTranslated(0., 0., -drain_hole.height)); | ||||||
|         ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength, 24, 1); |         glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); | ||||||
|         glsafe(::glTranslated(0., 0., drain_hole.height + sla::HoleStickOutLength)); |         m_vbo_cylinder.render(); | ||||||
|         ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); |  | ||||||
|         glsafe(::glTranslated(0., 0., -drain_hole.height - sla::HoleStickOutLength)); |  | ||||||
|         glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); |  | ||||||
|         ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); |  | ||||||
|         glsafe(::glPopMatrix()); |         glsafe(::glPopMatrix()); | ||||||
| 
 | 
 | ||||||
|         if (vol->is_left_handed()) |         if (vol->is_left_handed()) | ||||||
|  | @ -189,15 +178,6 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons | ||||||
|         glsafe(::glPopMatrix()); |         glsafe(::glPopMatrix()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     { |  | ||||||
|         // Reset emissive component to zero (the default value)
 |  | ||||||
|         float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; |  | ||||||
|         glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     if (!picking) |  | ||||||
|         glsafe(::glDisable(GL_LIGHTING)); |  | ||||||
| 
 |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,12 +25,10 @@ class GLGizmoHollow : public GLGizmoBase | ||||||
| private: | private: | ||||||
|     bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal); |     bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal); | ||||||
| 
 | 
 | ||||||
|     GLUquadricObj* m_quadric; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); |     GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||||
|     ~GLGizmoHollow() override; |     virtual ~GLGizmoHollow() = default; | ||||||
|     void set_sla_support_data(ModelObject* model_object, const Selection& selection); |     void set_sla_support_data(ModelObject* model_object, const Selection& selection); | ||||||
|     bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); |     bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); | ||||||
|     void delete_selected_points();     |     void delete_selected_points();     | ||||||
|  | @ -50,7 +48,7 @@ private: | ||||||
| 
 | 
 | ||||||
|     ObjectID m_old_mo_id = -1; |     ObjectID m_old_mo_id = -1; | ||||||
| 
 | 
 | ||||||
|     // bool  m_show_supports = true;
 |     GLModel m_vbo_cylinder; | ||||||
|     float m_new_hole_radius = 2.f;        // Size of a new hole.
 |     float m_new_hole_radius = 2.f;        // Size of a new hole.
 | ||||||
|     float m_new_hole_height = 6.f; |     float m_new_hole_height = 6.f; | ||||||
|     mutable std::vector<bool> m_selected; // which holes are currently selected
 |     mutable std::vector<bool> m_selected; // which holes are currently selected
 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,7 @@ | ||||||
| // Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
 | // Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
 | ||||||
| #include "GLGizmoMove.hpp" | #include "GLGizmoMove.hpp" | ||||||
| #include "slic3r/GUI/GLCanvas3D.hpp" | #include "slic3r/GUI/GLCanvas3D.hpp" | ||||||
|  | #include "slic3r/GUI/GUI_App.hpp" | ||||||
| 
 | 
 | ||||||
| #include <GL/glew.h> | #include <GL/glew.h> | ||||||
| 
 | 
 | ||||||
|  | @ -18,17 +19,8 @@ GLGizmoMove3D::GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filenam | ||||||
|     , m_starting_drag_position(Vec3d::Zero()) |     , m_starting_drag_position(Vec3d::Zero()) | ||||||
|     , m_starting_box_center(Vec3d::Zero()) |     , m_starting_box_center(Vec3d::Zero()) | ||||||
|     , m_starting_box_bottom_center(Vec3d::Zero()) |     , m_starting_box_bottom_center(Vec3d::Zero()) | ||||||
|     , m_quadric(nullptr) |  | ||||||
| { | { | ||||||
|     m_quadric = ::gluNewQuadric(); |     m_vbo_cone.init_from(make_cone(1., 1., 2*PI/36)); | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| GLGizmoMove3D::~GLGizmoMove3D() |  | ||||||
| { |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluDeleteQuadric(m_quadric); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| std::string GLGizmoMove3D::get_tooltip() const | std::string GLGizmoMove3D::get_tooltip() const | ||||||
|  | @ -49,8 +41,7 @@ std::string GLGizmoMove3D::get_tooltip() const | ||||||
| 
 | 
 | ||||||
| bool GLGizmoMove3D::on_init() | bool GLGizmoMove3D::on_init() | ||||||
| { | { | ||||||
|     for (int i = 0; i < 3; ++i) |     for (int i = 0; i < 3; ++i) { | ||||||
|     { |  | ||||||
|         m_grabbers.push_back(Grabber()); |         m_grabbers.push_back(Grabber()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -61,7 +52,7 @@ bool GLGizmoMove3D::on_init() | ||||||
| 
 | 
 | ||||||
| std::string GLGizmoMove3D::on_get_name() const | std::string GLGizmoMove3D::on_get_name() const | ||||||
| { | { | ||||||
|     return (_(L("Move")) + " [M]").ToUTF8().data(); |     return (_L("Move") + " [M]").ToUTF8().data(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool GLGizmoMove3D::on_is_activable() const | bool GLGizmoMove3D::on_is_activable() const | ||||||
|  | @ -71,8 +62,7 @@ bool GLGizmoMove3D::on_is_activable() const | ||||||
| 
 | 
 | ||||||
| void GLGizmoMove3D::on_start_dragging() | void GLGizmoMove3D::on_start_dragging() | ||||||
| { | { | ||||||
|     if (m_hover_id != -1) |     if (m_hover_id != -1) { | ||||||
|     { |  | ||||||
|         m_displacement = Vec3d::Zero(); |         m_displacement = Vec3d::Zero(); | ||||||
|         const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); |         const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); | ||||||
|         m_starting_drag_position = m_grabbers[m_hover_id].center; |         m_starting_drag_position = m_grabbers[m_hover_id].center; | ||||||
|  | @ -108,27 +98,24 @@ void GLGizmoMove3D::on_render() const | ||||||
|     const Vec3d& center = box.center(); |     const Vec3d& center = box.center(); | ||||||
| 
 | 
 | ||||||
|     // x axis
 |     // x axis
 | ||||||
|     m_grabbers[0].center = Vec3d(box.max(0) + Offset, center(1), center(2)); |     m_grabbers[0].center = Vec3d(box.max.x() + Offset, center.y(), center.z()); | ||||||
|     ::memcpy((void*)m_grabbers[0].color, (const void*)&AXES_COLOR[0], 4 * sizeof(float)); |     m_grabbers[0].color = AXES_COLOR[0]; | ||||||
| 
 | 
 | ||||||
|     // y axis
 |     // y axis
 | ||||||
|     m_grabbers[1].center = Vec3d(center(0), box.max(1) + Offset, center(2)); |     m_grabbers[1].center = Vec3d(center.x(), box.max.y() + Offset, center.z()); | ||||||
|     ::memcpy((void*)m_grabbers[1].color, (const void*)&AXES_COLOR[1], 4 * sizeof(float)); |     m_grabbers[1].color = AXES_COLOR[1]; | ||||||
| 
 | 
 | ||||||
|     // z axis
 |     // z axis
 | ||||||
|     m_grabbers[2].center = Vec3d(center(0), center(1), box.max(2) + Offset); |     m_grabbers[2].center = Vec3d(center.x(), center.y(), box.max.z() + Offset); | ||||||
|     ::memcpy((void*)m_grabbers[2].color, (const void*)&AXES_COLOR[2], 4 * sizeof(float)); |     m_grabbers[2].color = AXES_COLOR[2]; | ||||||
| 
 | 
 | ||||||
|     glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); |     glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); | ||||||
| 
 | 
 | ||||||
|     if (m_hover_id == -1) |     if (m_hover_id == -1) { | ||||||
|     { |  | ||||||
|         // 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) { | ||||||
|             if (m_grabbers[i].enabled) |                 glsafe(::glColor4fv(AXES_COLOR[i].data())); | ||||||
|             { |  | ||||||
|                 glsafe(::glColor4fv(AXES_COLOR[i])); |  | ||||||
|                 ::glBegin(GL_LINES); |                 ::glBegin(GL_LINES); | ||||||
|                 ::glVertex3dv(center.data()); |                 ::glVertex3dv(center.data()); | ||||||
|                 ::glVertex3dv(m_grabbers[i].center.data()); |                 ::glVertex3dv(m_grabbers[i].center.data()); | ||||||
|  | @ -138,23 +125,21 @@ void GLGizmoMove3D::on_render() const | ||||||
| 
 | 
 | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         render_grabbers(box); |         render_grabbers(box); | ||||||
|         for (unsigned int i = 0; i < 3; ++i) |         for (unsigned int i = 0; i < 3; ++i) { | ||||||
|         { |  | ||||||
|             if (m_grabbers[i].enabled) |             if (m_grabbers[i].enabled) | ||||||
|                 render_grabber_extension((Axis)i, box, false); |                 render_grabber_extension((Axis)i, box, false); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else |     else { | ||||||
|     { |  | ||||||
|         // draw axis
 |         // draw axis
 | ||||||
|         glsafe(::glColor4fv(AXES_COLOR[m_hover_id])); |         glsafe(::glColor4fv(AXES_COLOR[m_hover_id].data())); | ||||||
|         ::glBegin(GL_LINES); |         ::glBegin(GL_LINES); | ||||||
|         ::glVertex3dv(center.data()); |         ::glVertex3dv(center.data()); | ||||||
|         ::glVertex3dv(m_grabbers[m_hover_id].center.data()); |         ::glVertex3dv(m_grabbers[m_hover_id].center.data()); | ||||||
|         glsafe(::glEnd()); |         glsafe(::glEnd()); | ||||||
| 
 | 
 | ||||||
|         // draw grabber
 |         // draw grabber
 | ||||||
|         float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); |         float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); | ||||||
|         m_grabbers[m_hover_id].render(true, mean_size); |         m_grabbers[m_hover_id].render(true, mean_size); | ||||||
|         render_grabber_extension((Axis)m_hover_id, box, false); |         render_grabber_extension((Axis)m_hover_id, box, false); | ||||||
|     } |     } | ||||||
|  | @ -177,8 +162,7 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const | ||||||
| 
 | 
 | ||||||
|     Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; |     Vec3d starting_vec = m_starting_drag_position - m_starting_box_center; | ||||||
|     double len_starting_vec = starting_vec.norm(); |     double len_starting_vec = starting_vec.norm(); | ||||||
|     if (len_starting_vec != 0.0) |     if (len_starting_vec != 0.0) { | ||||||
|     { |  | ||||||
|         Vec3d mouse_dir = data.mouse_ray.unit_vector(); |         Vec3d mouse_dir = data.mouse_ray.unit_vector(); | ||||||
|         // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position
 |         // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position
 | ||||||
|         // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form
 |         // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form
 | ||||||
|  | @ -200,42 +184,42 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const | ||||||
| 
 | 
 | ||||||
| void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const | void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) const | ||||||
| { | { | ||||||
|     if (m_quadric == nullptr) |     float mean_size = (float)((box.size().x() + box.size().y() + box.size().z()) / 3.0); | ||||||
|         return; |  | ||||||
| 
 |  | ||||||
|     float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); |  | ||||||
|     double size = m_dragging ? (double)m_grabbers[axis].get_dragging_half_size(mean_size) : (double)m_grabbers[axis].get_half_size(mean_size); |     double size = m_dragging ? (double)m_grabbers[axis].get_dragging_half_size(mean_size) : (double)m_grabbers[axis].get_half_size(mean_size); | ||||||
| 
 | 
 | ||||||
|     float color[4]; |     std::array<float, 4> color = m_grabbers[axis].color; | ||||||
|     ::memcpy((void*)color, (const void*)m_grabbers[axis].color, 4 * sizeof(float)); |     if (!picking && m_hover_id != -1) { | ||||||
|     if (!picking && (m_hover_id != -1)) |  | ||||||
|     { |  | ||||||
|         color[0] = 1.0f - color[0]; |         color[0] = 1.0f - color[0]; | ||||||
|         color[1] = 1.0f - color[1]; |         color[1] = 1.0f - color[1]; | ||||||
|         color[2] = 1.0f - color[2]; |         color[2] = 1.0f - color[2]; | ||||||
|         color[3] = color[3]; |         color[3] = color[3]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!picking) |     GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); | ||||||
|         glsafe(::glEnable(GL_LIGHTING)); |     if (shader == nullptr) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (! picking) { | ||||||
|  |         shader->start_using(); | ||||||
|  |         shader->set_uniform("emission_factor", 0.1); | ||||||
|  |         shader->set_uniform("uniform_color", color); | ||||||
|  |     } else | ||||||
|  |         glsafe(::glColor4fv(color.data())); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glColor4fv(color)); |  | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glTranslated(m_grabbers[axis].center(0), m_grabbers[axis].center(1), m_grabbers[axis].center(2))); |     glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); | ||||||
|     if (axis == X) |     if (axis == X) | ||||||
|         glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); |         glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); | ||||||
|     else if (axis == Y) |     else if (axis == Y) | ||||||
|         glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); |         glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); |     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); |     glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); | ||||||
|     ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); |     m_vbo_cone.render(); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_INSIDE); |  | ||||||
|     ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| 
 | 
 | ||||||
|     if (!picking) |     if (! picking) | ||||||
|         glsafe(::glDisable(GL_LIGHTING)); |         shader->stop_using(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,11 +19,11 @@ class GLGizmoMove3D : public GLGizmoBase | ||||||
|     Vec3d m_starting_box_center; |     Vec3d m_starting_box_center; | ||||||
|     Vec3d m_starting_box_bottom_center; |     Vec3d m_starting_box_bottom_center; | ||||||
| 
 | 
 | ||||||
|     GLUquadricObj* m_quadric; |     GLModel m_vbo_cone; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); |     GLGizmoMove3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||||
|     virtual ~GLGizmoMove3D(); |     virtual ~GLGizmoMove3D() = default; | ||||||
| 
 | 
 | ||||||
|     double get_snap_step(double step) const { return m_snap_step; } |     double get_snap_step(double step) const { return m_snap_step; } | ||||||
|     void set_snap_step(double step) { m_snap_step = step; } |     void set_snap_step(double step) { m_snap_step = step; } | ||||||
|  |  | ||||||
|  | @ -30,7 +30,6 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) | ||||||
|     : GLGizmoBase(parent, "", -1) |     : GLGizmoBase(parent, "", -1) | ||||||
|     , m_axis(axis) |     , m_axis(axis) | ||||||
|     , m_angle(0.0) |     , m_angle(0.0) | ||||||
|     , m_quadric(nullptr) |  | ||||||
|     , m_center(0.0, 0.0, 0.0) |     , m_center(0.0, 0.0, 0.0) | ||||||
|     , m_radius(0.0f) |     , m_radius(0.0f) | ||||||
|     , m_snap_coarse_in_radius(0.0f) |     , m_snap_coarse_in_radius(0.0f) | ||||||
|  | @ -38,16 +37,12 @@ GLGizmoRotate::GLGizmoRotate(GLCanvas3D& parent, GLGizmoRotate::Axis axis) | ||||||
|     , m_snap_fine_in_radius(0.0f) |     , m_snap_fine_in_radius(0.0f) | ||||||
|     , m_snap_fine_out_radius(0.0f) |     , m_snap_fine_out_radius(0.0f) | ||||||
| { | { | ||||||
|     m_quadric = ::gluNewQuadric(); |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) | GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) | ||||||
|     : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) |     : GLGizmoBase(other.m_parent, other.m_icon_filename, other.m_sprite_id) | ||||||
|     , m_axis(other.m_axis) |     , m_axis(other.m_axis) | ||||||
|     , m_angle(other.m_angle) |     , m_angle(other.m_angle) | ||||||
|     , m_quadric(nullptr) |  | ||||||
|     , m_center(other.m_center) |     , m_center(other.m_center) | ||||||
|     , m_radius(other.m_radius) |     , m_radius(other.m_radius) | ||||||
|     , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius) |     , m_snap_coarse_in_radius(other.m_snap_coarse_in_radius) | ||||||
|  | @ -55,16 +50,8 @@ GLGizmoRotate::GLGizmoRotate(const GLGizmoRotate& other) | ||||||
|     , m_snap_fine_in_radius(other.m_snap_fine_in_radius) |     , m_snap_fine_in_radius(other.m_snap_fine_in_radius) | ||||||
|     , m_snap_fine_out_radius(other.m_snap_fine_out_radius) |     , m_snap_fine_out_radius(other.m_snap_fine_out_radius) | ||||||
| { | { | ||||||
|     m_quadric = ::gluNewQuadric(); |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GLGizmoRotate::~GLGizmoRotate() |  | ||||||
| { |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluDeleteQuadric(m_quadric); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void GLGizmoRotate::set_angle(double angle) | void GLGizmoRotate::set_angle(double angle) | ||||||
| { | { | ||||||
|  | @ -146,8 +133,7 @@ void GLGizmoRotate::on_render() const | ||||||
|     const Selection& selection = m_parent.get_selection(); |     const Selection& selection = m_parent.get_selection(); | ||||||
|     const BoundingBoxf3& box = selection.get_bounding_box(); |     const BoundingBoxf3& box = selection.get_bounding_box(); | ||||||
| 
 | 
 | ||||||
|     if (m_hover_id != 0 && !m_grabbers[0].dragging) |     if (m_hover_id != 0 && !m_grabbers[0].dragging) { | ||||||
|     { |  | ||||||
|         m_center = box.center(); |         m_center = box.center(); | ||||||
|         m_radius = Offset + box.radius(); |         m_radius = Offset + box.radius(); | ||||||
|         m_snap_coarse_in_radius = m_radius / 3.0f; |         m_snap_coarse_in_radius = m_radius / 3.0f; | ||||||
|  | @ -162,18 +148,17 @@ void GLGizmoRotate::on_render() const | ||||||
|     transform_to_local(selection); |     transform_to_local(selection); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); |     glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); | ||||||
|     glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color : m_highlight_color)); |     glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color.data() : m_highlight_color.data())); | ||||||
| 
 | 
 | ||||||
|     render_circle(); |     render_circle(); | ||||||
| 
 | 
 | ||||||
|     if (m_hover_id != -1) |     if (m_hover_id != -1) { | ||||||
|     { |  | ||||||
|         render_scale(); |         render_scale(); | ||||||
|         render_snap_radii(); |         render_snap_radii(); | ||||||
|         render_reference_radius(); |         render_reference_radius(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     glsafe(::glColor4fv(m_highlight_color)); |     glsafe(::glColor4fv(m_highlight_color.data())); | ||||||
| 
 | 
 | ||||||
|     if (m_hover_id != -1) |     if (m_hover_id != -1) | ||||||
|         render_angle(); |         render_angle(); | ||||||
|  | @ -324,69 +309,66 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) const | ||||||
|     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); | ||||||
|     m_grabbers[0].angles(2) = m_angle; |     m_grabbers[0].angles(2) = m_angle; | ||||||
| 
 | 
 | ||||||
|     glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color : m_highlight_color)); |     glsafe(::glColor4fv((m_hover_id != -1) ? m_drag_color.data() : m_highlight_color.data())); | ||||||
| 
 | 
 | ||||||
|     ::glBegin(GL_LINES); |     ::glBegin(GL_LINES); | ||||||
|     ::glVertex3f(0.0f, 0.0f, 0.0f); |     ::glVertex3f(0.0f, 0.0f, 0.0f); | ||||||
|     ::glVertex3dv(m_grabbers[0].center.data()); |     ::glVertex3dv(m_grabbers[0].center.data()); | ||||||
|     glsafe(::glEnd()); |     glsafe(::glEnd()); | ||||||
| 
 | 
 | ||||||
|     ::memcpy((void*)m_grabbers[0].color, (const void*)m_highlight_color, 4 * sizeof(float)); |     m_grabbers[0].color = m_highlight_color; | ||||||
|     render_grabbers(box); |     render_grabbers(box); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const | void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) const | ||||||
| { | { | ||||||
|     if (m_quadric == nullptr) |  | ||||||
|         return; |  | ||||||
| 
 |  | ||||||
|     float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); |     float mean_size = (float)((box.size()(0) + box.size()(1) + box.size()(2)) / 3.0); | ||||||
|     double size = m_dragging ? (double)m_grabbers[0].get_dragging_half_size(mean_size) : (double)m_grabbers[0].get_half_size(mean_size); |     double size = m_dragging ? (double)m_grabbers[0].get_dragging_half_size(mean_size) : (double)m_grabbers[0].get_half_size(mean_size); | ||||||
| 
 | 
 | ||||||
|     float color[4]; |     std::array<float, 4> color = m_grabbers[0].color; | ||||||
|     ::memcpy((void*)color, (const void*)m_grabbers[0].color, 4 * sizeof(float)); |     if (!picking && m_hover_id != -1) { | ||||||
|     if (!picking && (m_hover_id != -1)) |  | ||||||
|     { |  | ||||||
|         color[0] = 1.0f - color[0]; |         color[0] = 1.0f - color[0]; | ||||||
|         color[1] = 1.0f - color[1]; |         color[1] = 1.0f - color[1]; | ||||||
|         color[2] = 1.0f - color[2]; |         color[2] = 1.0f - color[2]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!picking) |     GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); | ||||||
|         glsafe(::glEnable(GL_LIGHTING)); |     if (shader == nullptr) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     if (! picking) { | ||||||
|  |         shader->start_using(); | ||||||
|  |         shader->set_uniform("emission_factor", 0.1); | ||||||
|  |         shader->set_uniform("uniform_color", color); | ||||||
|  |     } else | ||||||
|  |         glsafe(::glColor4fv(color.data())); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glColor4fv(color)); |  | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2))); |     glsafe(::glTranslated(m_grabbers[0].center.x(), m_grabbers[0].center.y(), m_grabbers[0].center.z())); | ||||||
|     glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); |     glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); | ||||||
|     glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); |     glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); | ||||||
|     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); |     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); |     glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); | ||||||
|     ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); |     m_cone.render(); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_INSIDE); |  | ||||||
|     ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glTranslated(m_grabbers[0].center(0), m_grabbers[0].center(1), m_grabbers[0].center(2))); |     glsafe(::glTranslated(m_grabbers[0].center.x(), m_grabbers[0].center.y(), m_grabbers[0].center.z())); | ||||||
|     glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); |     glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); | ||||||
|     glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); |     glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); | ||||||
|     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); |     glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE); |     glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); | ||||||
|     ::gluCylinder(m_quadric, 0.75 * size, 0.0, 3.0 * size, 36, 1); |     m_cone.render(); | ||||||
|     ::gluQuadricOrientation(m_quadric, GLU_INSIDE); |  | ||||||
|     ::gluDisk(m_quadric, 0.0, 0.75 * size, 36, 1); |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| 
 | 
 | ||||||
|     if (!picking) |     if (! picking) | ||||||
|         glsafe(::glDisable(GL_LIGHTING)); |         shader->stop_using(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoRotate::transform_to_local(const Selection& selection) const | void GLGizmoRotate::transform_to_local(const Selection& selection) const | ||||||
| { | { | ||||||
|     glsafe(::glTranslated(m_center(0), m_center(1), m_center(2))); |     glsafe(::glTranslated(m_center(0), m_center(1), m_center(2))); | ||||||
| 
 | 
 | ||||||
|     if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) |     if (selection.is_single_volume() || selection.is_single_modifier() || selection.requires_local_axes()) { | ||||||
|     { |  | ||||||
|         Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); |         Transform3d orient_matrix = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(true, false, true, true); | ||||||
|         glsafe(::glMultMatrixd(orient_matrix.data())); |         glsafe(::glMultMatrixd(orient_matrix.data())); | ||||||
|     } |     } | ||||||
|  | @ -457,8 +439,7 @@ GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_fil | ||||||
|     m_gizmos.emplace_back(parent, GLGizmoRotate::Y); |     m_gizmos.emplace_back(parent, GLGizmoRotate::Y); | ||||||
|     m_gizmos.emplace_back(parent, GLGizmoRotate::Z); |     m_gizmos.emplace_back(parent, GLGizmoRotate::Z); | ||||||
| 
 | 
 | ||||||
|     for (unsigned int i = 0; i < 3; ++i) |     for (unsigned int i = 0; i < 3; ++i) { | ||||||
|     { |  | ||||||
|         m_gizmos[i].set_group_id(i); |         m_gizmos[i].set_group_id(i); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -467,14 +448,12 @@ GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_fil | ||||||
| 
 | 
 | ||||||
| bool GLGizmoRotate3D::on_init() | bool GLGizmoRotate3D::on_init() | ||||||
| { | { | ||||||
|     for (GLGizmoRotate& g : m_gizmos) |     for (GLGizmoRotate& g : m_gizmos) { | ||||||
|     { |  | ||||||
|         if (!g.init()) |         if (!g.init()) | ||||||
|             return false; |             return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (unsigned int i = 0; i < 3; ++i) |     for (unsigned int i = 0; i < 3; ++i) { | ||||||
|     { |  | ||||||
|         m_gizmos[i].set_highlight_color(AXES_COLOR[i]); |         m_gizmos[i].set_highlight_color(AXES_COLOR[i]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -485,7 +464,7 @@ bool GLGizmoRotate3D::on_init() | ||||||
| 
 | 
 | ||||||
| std::string GLGizmoRotate3D::on_get_name() const | std::string GLGizmoRotate3D::on_get_name() const | ||||||
| { | { | ||||||
|     return (_(L("Rotate")) + " [R]").ToUTF8().data(); |     return (_L("Rotate") + " [R]").ToUTF8().data(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool GLGizmoRotate3D::on_is_activable() const | bool GLGizmoRotate3D::on_is_activable() const | ||||||
|  |  | ||||||
|  | @ -32,8 +32,6 @@ private: | ||||||
|     Axis m_axis; |     Axis m_axis; | ||||||
|     double m_angle; |     double m_angle; | ||||||
| 
 | 
 | ||||||
|     GLUquadricObj* m_quadric; |  | ||||||
| 
 |  | ||||||
|     mutable Vec3d m_center; |     mutable Vec3d m_center; | ||||||
|     mutable float m_radius; |     mutable float m_radius; | ||||||
| 
 | 
 | ||||||
|  | @ -45,7 +43,7 @@ private: | ||||||
| public: | public: | ||||||
|     GLGizmoRotate(GLCanvas3D& parent, Axis axis); |     GLGizmoRotate(GLCanvas3D& parent, Axis axis); | ||||||
|     GLGizmoRotate(const GLGizmoRotate& other); |     GLGizmoRotate(const GLGizmoRotate& other); | ||||||
|     virtual ~GLGizmoRotate(); |     virtual ~GLGizmoRotate() = default; | ||||||
| 
 | 
 | ||||||
|     double get_angle() const { return m_angle; } |     double get_angle() const { return m_angle; } | ||||||
|     void set_angle(double angle); |     void set_angle(double angle); | ||||||
|  |  | ||||||
|  | @ -173,34 +173,32 @@ void GLGizmoScale3D::on_render() const | ||||||
|     // x axis
 |     // x axis
 | ||||||
|     m_grabbers[0].center = m_transform * Vec3d(m_box.min(0), center(1), center(2)) - offset_x; |     m_grabbers[0].center = m_transform * Vec3d(m_box.min(0), center(1), center(2)) - offset_x; | ||||||
|     m_grabbers[1].center = m_transform * Vec3d(m_box.max(0), center(1), center(2)) + offset_x; |     m_grabbers[1].center = m_transform * Vec3d(m_box.max(0), center(1), center(2)) + offset_x; | ||||||
|     ::memcpy((void*)m_grabbers[0].color, (ctrl_down && (m_hover_id == 1)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[0], 4 * sizeof(float)); |     m_grabbers[0].color = (ctrl_down && (m_hover_id == 1)) ? CONSTRAINED_COLOR : AXES_COLOR[0]; | ||||||
|     ::memcpy((void*)m_grabbers[1].color, (ctrl_down && (m_hover_id == 0)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[0], 4 * sizeof(float)); |     m_grabbers[1].color = (ctrl_down && (m_hover_id == 0)) ? CONSTRAINED_COLOR : AXES_COLOR[0]; | ||||||
| 
 | 
 | ||||||
|     // y axis
 |     // y axis
 | ||||||
|     m_grabbers[2].center = m_transform * Vec3d(center(0), m_box.min(1), center(2)) - offset_y; |     m_grabbers[2].center = m_transform * Vec3d(center(0), m_box.min(1), center(2)) - offset_y; | ||||||
|     m_grabbers[3].center = m_transform * Vec3d(center(0), m_box.max(1), center(2)) + offset_y; |     m_grabbers[3].center = m_transform * Vec3d(center(0), m_box.max(1), center(2)) + offset_y; | ||||||
|     ::memcpy((void*)m_grabbers[2].color, (ctrl_down && (m_hover_id == 3)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[1], 4 * sizeof(float)); |     m_grabbers[2].color = (ctrl_down && (m_hover_id == 3)) ? CONSTRAINED_COLOR : AXES_COLOR[1]; | ||||||
|     ::memcpy((void*)m_grabbers[3].color, (ctrl_down && (m_hover_id == 2)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[1], 4 * sizeof(float)); |     m_grabbers[3].color = (ctrl_down && (m_hover_id == 2)) ? CONSTRAINED_COLOR : AXES_COLOR[1]; | ||||||
| 
 | 
 | ||||||
|     // z axis
 |     // z axis
 | ||||||
|     m_grabbers[4].center = m_transform * Vec3d(center(0), center(1), m_box.min(2)) - offset_z; |     m_grabbers[4].center = m_transform * Vec3d(center(0), center(1), m_box.min(2)) - offset_z; | ||||||
|     m_grabbers[5].center = m_transform * Vec3d(center(0), center(1), m_box.max(2)) + offset_z; |     m_grabbers[5].center = m_transform * Vec3d(center(0), center(1), m_box.max(2)) + offset_z; | ||||||
|     ::memcpy((void*)m_grabbers[4].color, (ctrl_down && (m_hover_id == 5)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[2], 4 * sizeof(float)); |     m_grabbers[4].color = (ctrl_down && (m_hover_id == 5)) ? CONSTRAINED_COLOR : AXES_COLOR[2]; | ||||||
|     ::memcpy((void*)m_grabbers[5].color, (ctrl_down && (m_hover_id == 4)) ? (const void*)CONSTRAINED_COLOR : (const void*)&AXES_COLOR[2], 4 * sizeof(float)); |     m_grabbers[5].color = (ctrl_down && (m_hover_id == 4)) ? CONSTRAINED_COLOR : AXES_COLOR[2]; | ||||||
| 
 | 
 | ||||||
|     // uniform
 |     // uniform
 | ||||||
|     m_grabbers[6].center = m_transform * Vec3d(m_box.min(0), m_box.min(1), center(2)) - offset_x - offset_y; |     m_grabbers[6].center = m_transform * Vec3d(m_box.min(0), m_box.min(1), center(2)) - offset_x - offset_y; | ||||||
|     m_grabbers[7].center = m_transform * Vec3d(m_box.max(0), m_box.min(1), center(2)) + offset_x - offset_y; |     m_grabbers[7].center = m_transform * Vec3d(m_box.max(0), m_box.min(1), center(2)) + offset_x - offset_y; | ||||||
|     m_grabbers[8].center = m_transform * Vec3d(m_box.max(0), m_box.max(1), center(2)) + offset_x + offset_y; |     m_grabbers[8].center = m_transform * Vec3d(m_box.max(0), m_box.max(1), center(2)) + offset_x + offset_y; | ||||||
|     m_grabbers[9].center = m_transform * Vec3d(m_box.min(0), m_box.max(1), center(2)) - offset_x + offset_y; |     m_grabbers[9].center = m_transform * Vec3d(m_box.min(0), m_box.max(1), center(2)) - offset_x + offset_y; | ||||||
|     for (int i = 6; i < 10; ++i) |     for (int i = 6; i < 10; ++i) { | ||||||
|     { |         m_grabbers[i].color = m_highlight_color; | ||||||
|         ::memcpy((void*)m_grabbers[i].color, (const void*)m_highlight_color, 4 * sizeof(float)); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // sets grabbers orientation
 |     // sets grabbers orientation
 | ||||||
|     for (int i = 0; i < 10; ++i) |     for (int i = 0; i < 10; ++i) { | ||||||
|     { |  | ||||||
|         m_grabbers[i].angles = angles; |         m_grabbers[i].angles = angles; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -210,25 +208,21 @@ void GLGizmoScale3D::on_render() const | ||||||
| 
 | 
 | ||||||
|     float grabber_mean_size = (float)((selection_box.size()(0) + selection_box.size()(1) + selection_box.size()(2)) / 3.0); |     float grabber_mean_size = (float)((selection_box.size()(0) + selection_box.size()(1) + selection_box.size()(2)) / 3.0); | ||||||
| 
 | 
 | ||||||
|     if (m_hover_id == -1) |     if (m_hover_id == -1) { | ||||||
|     { |  | ||||||
|         // draw connections
 |         // draw connections
 | ||||||
|         if (m_grabbers[0].enabled && m_grabbers[1].enabled) |         if (m_grabbers[0].enabled && m_grabbers[1].enabled) { | ||||||
|         { |             glsafe(::glColor4fv(m_grabbers[0].color.data())); | ||||||
|             glsafe(::glColor4fv(m_grabbers[0].color)); |  | ||||||
|             render_grabbers_connection(0, 1); |             render_grabbers_connection(0, 1); | ||||||
|         } |         } | ||||||
|         if (m_grabbers[2].enabled && m_grabbers[3].enabled) |         if (m_grabbers[2].enabled && m_grabbers[3].enabled) { | ||||||
|         { |             glsafe(::glColor4fv(m_grabbers[2].color.data())); | ||||||
|             glsafe(::glColor4fv(m_grabbers[2].color)); |  | ||||||
|             render_grabbers_connection(2, 3); |             render_grabbers_connection(2, 3); | ||||||
|         } |         } | ||||||
|         if (m_grabbers[4].enabled && m_grabbers[5].enabled) |         if (m_grabbers[4].enabled && m_grabbers[5].enabled) { | ||||||
|         { |             glsafe(::glColor4fv(m_grabbers[4].color.data())); | ||||||
|             glsafe(::glColor4fv(m_grabbers[4].color)); |  | ||||||
|             render_grabbers_connection(4, 5); |             render_grabbers_connection(4, 5); | ||||||
|         } |         } | ||||||
|         glsafe(::glColor4fv(m_base_color)); |         glsafe(::glColor4fv(m_base_color.data())); | ||||||
|         render_grabbers_connection(6, 7); |         render_grabbers_connection(6, 7); | ||||||
|         render_grabbers_connection(7, 8); |         render_grabbers_connection(7, 8); | ||||||
|         render_grabbers_connection(8, 9); |         render_grabbers_connection(8, 9); | ||||||
|  | @ -236,44 +230,39 @@ void GLGizmoScale3D::on_render() const | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         render_grabbers(grabber_mean_size); |         render_grabbers(grabber_mean_size); | ||||||
|     } |     } | ||||||
|     else if ((m_hover_id == 0) || (m_hover_id == 1)) |     else if (m_hover_id == 0 || m_hover_id == 1) { | ||||||
|     { |  | ||||||
|         // draw connection
 |         // draw connection
 | ||||||
|         glsafe(::glColor4fv(m_grabbers[0].color)); |         glsafe(::glColor4fv(m_grabbers[0].color.data())); | ||||||
|         render_grabbers_connection(0, 1); |         render_grabbers_connection(0, 1); | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         m_grabbers[0].render(true, grabber_mean_size); |         m_grabbers[0].render(true, grabber_mean_size); | ||||||
|         m_grabbers[1].render(true, grabber_mean_size); |         m_grabbers[1].render(true, grabber_mean_size); | ||||||
|     } |     } | ||||||
|     else if ((m_hover_id == 2) || (m_hover_id == 3)) |     else if (m_hover_id == 2 || m_hover_id == 3) { | ||||||
|     { |  | ||||||
|         // draw connection
 |         // draw connection
 | ||||||
|         glsafe(::glColor4fv(m_grabbers[2].color)); |         glsafe(::glColor4fv(m_grabbers[2].color.data())); | ||||||
|         render_grabbers_connection(2, 3); |         render_grabbers_connection(2, 3); | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         m_grabbers[2].render(true, grabber_mean_size); |         m_grabbers[2].render(true, grabber_mean_size); | ||||||
|         m_grabbers[3].render(true, grabber_mean_size); |         m_grabbers[3].render(true, grabber_mean_size); | ||||||
|     } |     } | ||||||
|     else if ((m_hover_id == 4) || (m_hover_id == 5)) |     else if (m_hover_id == 4 || m_hover_id == 5) { | ||||||
|     { |  | ||||||
|         // draw connection
 |         // draw connection
 | ||||||
|         glsafe(::glColor4fv(m_grabbers[4].color)); |         glsafe(::glColor4fv(m_grabbers[4].color.data())); | ||||||
|         render_grabbers_connection(4, 5); |         render_grabbers_connection(4, 5); | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         m_grabbers[4].render(true, grabber_mean_size); |         m_grabbers[4].render(true, grabber_mean_size); | ||||||
|         m_grabbers[5].render(true, grabber_mean_size); |         m_grabbers[5].render(true, grabber_mean_size); | ||||||
|     } |     } | ||||||
|     else if (m_hover_id >= 6) |     else if (m_hover_id >= 6) { | ||||||
|     { |  | ||||||
|         // draw connection
 |         // draw connection
 | ||||||
|         glsafe(::glColor4fv(m_drag_color)); |         glsafe(::glColor4fv(m_drag_color.data())); | ||||||
|         render_grabbers_connection(6, 7); |         render_grabbers_connection(6, 7); | ||||||
|         render_grabbers_connection(7, 8); |         render_grabbers_connection(7, 8); | ||||||
|         render_grabbers_connection(8, 9); |         render_grabbers_connection(8, 9); | ||||||
|         render_grabbers_connection(9, 6); |         render_grabbers_connection(9, 6); | ||||||
|         // draw grabbers
 |         // draw grabbers
 | ||||||
|         for (int i = 6; i < 10; ++i) |         for (int i = 6; i < 10; ++i) { | ||||||
|         { |  | ||||||
|             m_grabbers[i].render(true, grabber_mean_size); |             m_grabbers[i].render(true, grabber_mean_size); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -26,20 +26,9 @@ namespace GUI { | ||||||
| 
 | 
 | ||||||
| GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) | ||||||
|     : GLGizmoBase(parent, icon_filename, sprite_id) |     : GLGizmoBase(parent, icon_filename, sprite_id) | ||||||
|     , m_quadric(nullptr) |  | ||||||
| { | { | ||||||
|     m_quadric = ::gluNewQuadric(); |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         // using GLU_FILL does not work when the instance's transformation
 |  | ||||||
|         // contains mirroring (normals are reverted)
 |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GLGizmoSlaSupports::~GLGizmoSlaSupports() |  | ||||||
| { |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluDeleteQuadric(m_quadric); |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| bool GLGizmoSlaSupports::on_init() | bool GLGizmoSlaSupports::on_init() | ||||||
| { | { | ||||||
|  | @ -100,7 +89,7 @@ void GLGizmoSlaSupports::on_render() const | ||||||
|     glsafe(::glEnable(GL_BLEND)); |     glsafe(::glEnable(GL_BLEND)); | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     glsafe(::glEnable(GL_DEPTH_TEST)); | ||||||
| 
 | 
 | ||||||
|     if (m_quadric != nullptr && selection.is_from_single_instance()) |     if (selection.is_from_single_instance()) | ||||||
|         render_points(selection, false); |         render_points(selection, false); | ||||||
| 
 | 
 | ||||||
|     m_selection_rectangle.render(m_parent); |     m_selection_rectangle.render(m_parent); | ||||||
|  | @ -114,14 +103,28 @@ void GLGizmoSlaSupports::on_render() const | ||||||
| void GLGizmoSlaSupports::on_render_for_picking() const | void GLGizmoSlaSupports::on_render_for_picking() const | ||||||
| { | { | ||||||
|     const Selection& selection = m_parent.get_selection(); |     const Selection& selection = m_parent.get_selection(); | ||||||
|     glsafe(::glEnable(GL_DEPTH_TEST)); |     //glsafe(::glEnable(GL_DEPTH_TEST));
 | ||||||
|     render_points(selection, true); |     render_points(selection, true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const | void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const | ||||||
| { | { | ||||||
|     if (!picking) |     size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); | ||||||
|         glsafe(::glEnable(GL_LIGHTING)); | 
 | ||||||
|  |     bool has_points = (cache_size != 0); | ||||||
|  |     bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() | ||||||
|  |                    && ! m_c->selection_info()->model_object()->sla_drain_holes.empty()); | ||||||
|  | 
 | ||||||
|  |     if (! has_points && ! has_holes) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); | ||||||
|  |     if (shader != nullptr) | ||||||
|  |         shader->start_using(); | ||||||
|  |     ScopeGuard guard([shader]() { | ||||||
|  |         if (shader != nullptr) | ||||||
|  |             shader->stop_using(); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); |     const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin()); | ||||||
|     const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); |     const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); | ||||||
|  | @ -132,8 +135,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) | ||||||
|     glsafe(::glTranslated(0.0, 0.0, z_shift)); |     glsafe(::glTranslated(0.0, 0.0, z_shift)); | ||||||
|     glsafe(::glMultMatrixd(instance_matrix.data())); |     glsafe(::glMultMatrixd(instance_matrix.data())); | ||||||
| 
 | 
 | ||||||
|     float render_color[4]; |     std::array<float, 4> render_color; | ||||||
|     size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); |  | ||||||
|     for (size_t i = 0; i < cache_size; ++i) |     for (size_t i = 0; i < cache_size; ++i) | ||||||
|     { |     { | ||||||
|         const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; |         const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; | ||||||
|  | @ -143,34 +145,33 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) | ||||||
|             continue; |             continue; | ||||||
| 
 | 
 | ||||||
|         // First decide about the color of the point.
 |         // First decide about the color of the point.
 | ||||||
|         if (picking) { |         if (picking) | ||||||
|             std::array<float, 4> color = picking_color_component(i); |             render_color = picking_color_component(i); | ||||||
|             render_color[0] = color[0]; |  | ||||||
|             render_color[1] = color[1]; |  | ||||||
|             render_color[2] = color[2]; |  | ||||||
| 	        render_color[3] = color[3]; |  | ||||||
|         } |  | ||||||
|         else { |         else { | ||||||
|             render_color[3] = 1.f; |             if ((size_t(m_hover_id) == i && m_editing_mode)) // ignore hover state unless editing mode is active
 | ||||||
|             if ((size_t(m_hover_id) == i && m_editing_mode)) { // ignore hover state unless editing mode is active
 |                 render_color = { 0.f, 1.f, 1.f, 1.f }; | ||||||
|                 render_color[0] = 0.f; |  | ||||||
|                 render_color[1] = 1.0f; |  | ||||||
|                 render_color[2] = 1.0f; |  | ||||||
|             } |  | ||||||
|             else { // neigher hover nor picking
 |             else { // neigher hover nor picking
 | ||||||
|                 bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; |                 bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; | ||||||
|                 if (m_editing_mode) { |                 if (m_editing_mode) { | ||||||
|                     render_color[0] = point_selected ? 1.0f : (supports_new_island ? 0.3f : 0.7f); |                     if (point_selected) | ||||||
|                     render_color[1] = point_selected ? 0.3f : (supports_new_island ? 0.3f : 0.7f); |                         render_color = { 1.f, 0.3f, 0.3f, 1.f}; | ||||||
|                     render_color[2] = point_selected ? 0.3f : (supports_new_island ? 1.0f : 0.7f); |                     else | ||||||
|  |                         if (supports_new_island) | ||||||
|  |                             render_color = { 0.3f, 0.3f, 1.f, 1.f }; | ||||||
|  |                         else | ||||||
|  |                             render_color = { 0.7f, 0.7f, 0.7f, 1.f }; | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
|                     for (unsigned char i=0; i<3; ++i) render_color[i] = 0.5f; |                     render_color = { 0.5f, 0.5f, 0.5f, 1.f }; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         glsafe(::glColor4fv(render_color)); |         if (shader && ! picking) { | ||||||
|         float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; |             shader->set_uniform("uniform_color", render_color); | ||||||
|         glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); |             shader->set_uniform("emission_factor", 0.5); | ||||||
|  |         } | ||||||
|  |         else // picking
 | ||||||
|  |             glsafe(::glColor4fv(render_color.data())); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
 |         // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
 | ||||||
|         glsafe(::glPushMatrix()); |         glsafe(::glPushMatrix()); | ||||||
|  | @ -195,33 +196,38 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) | ||||||
|             const double cone_radius = 0.25; // mm
 |             const double cone_radius = 0.25; // mm
 | ||||||
|             const double cone_height = 0.75; |             const double cone_height = 0.75; | ||||||
|             glsafe(::glPushMatrix()); |             glsafe(::glPushMatrix()); | ||||||
|             glsafe(::glTranslatef(0.f, 0.f, support_point.head_front_radius * RenderPointScale)); |             glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); | ||||||
|             ::gluCylinder(m_quadric, 0., cone_radius, cone_height, 24, 1); |             glsafe(::glPushMatrix()); | ||||||
|  |             glsafe(::glRotated(180., 1., 0., 0.)); | ||||||
|  |             glsafe(::glScaled(cone_radius, cone_radius, cone_height)); | ||||||
|  |             m_cone.render(); | ||||||
|  |             glsafe(::glPopMatrix()); | ||||||
|             glsafe(::glTranslatef(0.f, 0.f, cone_height)); |             glsafe(::glTranslatef(0.f, 0.f, cone_height)); | ||||||
|             ::gluDisk(m_quadric, 0.0, cone_radius, 24, 1); |  | ||||||
|             glsafe(::glPopMatrix()); |             glsafe(::glPopMatrix()); | ||||||
|         } |         } | ||||||
|         ::gluSphere(m_quadric, (double)support_point.head_front_radius * RenderPointScale, 24, 12); | 
 | ||||||
|  |         glsafe(::glPushMatrix()); | ||||||
|  |         double radius = (double)support_point.head_front_radius * RenderPointScale; | ||||||
|  |         glsafe(::glScaled(radius, radius, radius)); | ||||||
|  |         m_sphere.render(); | ||||||
|  |         glsafe(::glPopMatrix()); | ||||||
|  | 
 | ||||||
|         if (vol->is_left_handed()) |         if (vol->is_left_handed()) | ||||||
|             glFrontFace(GL_CCW); |             glFrontFace(GL_CCW); | ||||||
| 
 | 
 | ||||||
|         glsafe(::glPopMatrix()); |         glsafe(::glPopMatrix()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     { |  | ||||||
|         // Reset emissive component to zero (the default value)
 |  | ||||||
|         float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; |  | ||||||
|         glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Now render the drain holes:
 |     // Now render the drain holes:
 | ||||||
|     //if (! m_c->has_drilled_mesh()) {
 |     if (has_holes && ! picking) { | ||||||
|     if (! m_c->hollowed_mesh()->get_hollowed_mesh()) { |  | ||||||
|         render_color[0] = 0.7f; |         render_color[0] = 0.7f; | ||||||
|         render_color[1] = 0.7f; |         render_color[1] = 0.7f; | ||||||
|         render_color[2] = 0.7f; |         render_color[2] = 0.7f; | ||||||
|         render_color[3] = 0.7f; |         render_color[3] = 0.7f; | ||||||
|         glsafe(::glColor4fv(render_color)); |         if (shader) { | ||||||
|  |             shader->set_uniform("uniform_color", render_color); | ||||||
|  |             shader->set_uniform("emission_factor", 0.5); | ||||||
|  |         } | ||||||
|         for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { |         for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) { | ||||||
|             if (is_mesh_point_clipped(drain_hole.pos.cast<double>())) |             if (is_mesh_point_clipped(drain_hole.pos.cast<double>())) | ||||||
|                 continue; |                 continue; | ||||||
|  | @ -242,12 +248,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) | ||||||
|             glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); |             glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2))); | ||||||
|             glsafe(::glPushMatrix()); |             glsafe(::glPushMatrix()); | ||||||
|             glsafe(::glTranslated(0., 0., -drain_hole.height)); |             glsafe(::glTranslated(0., 0., -drain_hole.height)); | ||||||
|             ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength, 24, 1); |             glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); | ||||||
|             glsafe(::glTranslated(0., 0., drain_hole.height + sla::HoleStickOutLength)); |             m_cylinder.render(); | ||||||
|             ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); |  | ||||||
|             glsafe(::glTranslated(0., 0., -drain_hole.height - sla::HoleStickOutLength)); |  | ||||||
|             glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); |  | ||||||
|             ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); |  | ||||||
|             glsafe(::glPopMatrix()); |             glsafe(::glPopMatrix()); | ||||||
| 
 | 
 | ||||||
|             if (vol->is_left_handed()) |             if (vol->is_left_handed()) | ||||||
|  | @ -256,9 +258,6 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (!picking) |  | ||||||
|         glsafe(::glDisable(GL_LIGHTING)); |  | ||||||
| 
 |  | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -27,8 +27,6 @@ private: | ||||||
| 
 | 
 | ||||||
|     const float RenderPointScale = 1.f; |     const float RenderPointScale = 1.f; | ||||||
| 
 | 
 | ||||||
|     GLUquadricObj* m_quadric; |  | ||||||
| 
 |  | ||||||
|     class CacheEntry { |     class CacheEntry { | ||||||
|     public: |     public: | ||||||
|         CacheEntry() : |         CacheEntry() : | ||||||
|  | @ -58,7 +56,7 @@ private: | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); |     GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); | ||||||
|     ~GLGizmoSlaSupports() override; |     virtual ~GLGizmoSlaSupports() = default; | ||||||
|     void set_sla_support_data(ModelObject* model_object, const Selection& selection); |     void set_sla_support_data(ModelObject* model_object, const Selection& selection); | ||||||
|     bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); |     bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down); | ||||||
|     void delete_selected_points(bool force = false); |     void delete_selected_points(bool force = false); | ||||||
|  |  | ||||||
|  | @ -9,6 +9,8 @@ | ||||||
| 
 | 
 | ||||||
| #include <GL/glew.h> | #include <GL/glew.h> | ||||||
| 
 | 
 | ||||||
|  | #include <igl/unproject.h> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| namespace Slic3r { | namespace Slic3r { | ||||||
| namespace GUI { | namespace GUI { | ||||||
|  | @ -122,14 +124,16 @@ Vec3f MeshRaycaster::get_triangle_normal(size_t facet_idx) const | ||||||
| void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, | void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, | ||||||
|                                         Vec3d& point, Vec3d& direction) const |                                         Vec3d& point, Vec3d& direction) const | ||||||
| { | { | ||||||
|     const std::array<int, 4>& viewport = camera.get_viewport(); |     Matrix4d modelview = camera.get_view_matrix().matrix(); | ||||||
|     const Transform3d& model_mat = camera.get_view_matrix(); |     Matrix4d projection= camera.get_projection_matrix().matrix(); | ||||||
|     const Transform3d& proj_mat = camera.get_projection_matrix(); |     Vec4i viewport(camera.get_viewport().data()); | ||||||
| 
 | 
 | ||||||
|     Vec3d pt1; |     Vec3d pt1; | ||||||
|     Vec3d pt2; |     Vec3d pt2; | ||||||
|     ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 0., model_mat.data(), proj_mat.data(), viewport.data(), &pt1(0), &pt1(1), &pt1(2)); |     igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 0.), | ||||||
|     ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 1., model_mat.data(), proj_mat.data(), viewport.data(), &pt2(0), &pt2(1), &pt2(2)); |                    modelview, projection, viewport, pt1); | ||||||
|  |     igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 1.), | ||||||
|  |                    modelview, projection, viewport, pt2); | ||||||
| 
 | 
 | ||||||
|     Transform3d inv = trafo.inverse(); |     Transform3d inv = trafo.inverse(); | ||||||
|     pt1 = inv * pt1; |     pt1 = inv * pt1; | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ | ||||||
| #include <boost/algorithm/string/predicate.hpp> | #include <boost/algorithm/string/predicate.hpp> | ||||||
| #include <boost/log/trivial.hpp> | #include <boost/log/trivial.hpp> | ||||||
| 
 | 
 | ||||||
| static const float UNIFORM_SCALE_COLOR[4] = { 0.923f, 0.504f, 0.264f, 1.0f }; | static const std::array<float, 4> UNIFORM_SCALE_COLOR = { 0.923f, 0.504f, 0.264f, 1.0f }; | ||||||
| 
 | 
 | ||||||
| namespace Slic3r { | namespace Slic3r { | ||||||
| namespace GUI { | namespace GUI { | ||||||
|  | @ -115,20 +115,8 @@ Selection::Selection() | ||||||
|     , m_scale_factor(1.0f) |     , m_scale_factor(1.0f) | ||||||
| { | { | ||||||
|     this->set_bounding_boxes_dirty(); |     this->set_bounding_boxes_dirty(); | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER |  | ||||||
|     m_quadric = ::gluNewQuadric(); |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluQuadricDrawStyle(m_quadric, GLU_FILL); |  | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER |  | ||||||
| Selection::~Selection() |  | ||||||
| { |  | ||||||
|     if (m_quadric != nullptr) |  | ||||||
|         ::gluDeleteQuadric(m_quadric); |  | ||||||
| } |  | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 |  | ||||||
| 
 | 
 | ||||||
| void Selection::set_volumes(GLVolumePtrs* volumes) | void Selection::set_volumes(GLVolumePtrs* volumes) | ||||||
| { | { | ||||||
|  | @ -141,6 +129,11 @@ bool Selection::init() | ||||||
| { | { | ||||||
|     m_arrow.init_from(straight_arrow(10.0f, 5.0f, 5.0f, 10.0f, 1.0f)); |     m_arrow.init_from(straight_arrow(10.0f, 5.0f, 5.0f, 10.0f, 1.0f)); | ||||||
|     m_curved_arrow.init_from(circular_arrow(16, 10.0f, 5.0f, 10.0f, 5.0f, 1.0f)); |     m_curved_arrow.init_from(circular_arrow(16, 10.0f, 5.0f, 10.0f, 5.0f, 1.0f)); | ||||||
|  | 
 | ||||||
|  | #if ENABLE_RENDER_SELECTION_CENTER | ||||||
|  |     m_vbo_sphere.init_from(make_sphere(0.75, 2*PI/24)); | ||||||
|  | #endif // ENABLE_RENDER_SELECTION_CENTER
 | ||||||
|  | 
 | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1176,22 +1169,18 @@ void Selection::render(float scale_factor) const | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER | #if ENABLE_RENDER_SELECTION_CENTER | ||||||
| void Selection::render_center(bool gizmo_is_dragging) const | void Selection::render_center(bool gizmo_is_dragging) const | ||||||
| { | { | ||||||
|     if (!m_valid || is_empty() || m_quadric == nullptr) |     if (!m_valid || is_empty()) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|     const Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center(); |     const Vec3d center = gizmo_is_dragging ? m_cache.dragging_center : get_bounding_box().center(); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glDisable(GL_DEPTH_TEST)); |     glsafe(::glDisable(GL_DEPTH_TEST)); | ||||||
| 
 | 
 | ||||||
|     glsafe(::glEnable(GL_LIGHTING)); |  | ||||||
| 
 |  | ||||||
|     glsafe(::glColor3f(1.0f, 1.0f, 1.0f)); |     glsafe(::glColor3f(1.0f, 1.0f, 1.0f)); | ||||||
|     glsafe(::glPushMatrix()); |     glsafe(::glPushMatrix()); | ||||||
|     glsafe(::glTranslated(center(0), center(1), center(2))); |     glsafe(::glTranslated(center(0), center(1), center(2))); | ||||||
|     glsafe(::gluSphere(m_quadric, 0.75, 32, 32)); |     m_vbo_sphere.render(); | ||||||
|     glsafe(::glPopMatrix()); |     glsafe(::glPopMatrix()); | ||||||
| 
 |  | ||||||
|     glsafe(::glDisable(GL_LIGHTING)); |  | ||||||
| } | } | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 | #endif // ENABLE_RENDER_SELECTION_CENTER
 | ||||||
| 
 | 
 | ||||||
|  | @ -1833,8 +1822,10 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field) | ||||||
| { | { | ||||||
|     auto set_color = [](Axis axis) { |     auto set_color = [](Axis axis) { | ||||||
|         GLShaderProgram* shader = wxGetApp().get_current_shader(); |         GLShaderProgram* shader = wxGetApp().get_current_shader(); | ||||||
|         if (shader != nullptr) |         if (shader != nullptr) { | ||||||
|             shader->set_uniform("uniform_color", AXES_COLOR[axis], 4); |             shader->set_uniform("uniform_color", AXES_COLOR[axis]); | ||||||
|  |             shader->set_uniform("emission_factor", 0.0); | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     if (boost::ends_with(sidebar_field, "x")) { |     if (boost::ends_with(sidebar_field, "x")) { | ||||||
|  | @ -1855,8 +1846,10 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) | ||||||
| { | { | ||||||
|     auto set_color = [](Axis axis) { |     auto set_color = [](Axis axis) { | ||||||
|         GLShaderProgram* shader = wxGetApp().get_current_shader(); |         GLShaderProgram* shader = wxGetApp().get_current_shader(); | ||||||
|         if (shader != nullptr) |         if (shader != nullptr) { | ||||||
|             shader->set_uniform("uniform_color", AXES_COLOR[axis], 4); |             shader->set_uniform("uniform_color", AXES_COLOR[axis]); | ||||||
|  |             shader->set_uniform("emission_factor", 0.0); | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     auto render_sidebar_rotation_hint = [this]() { |     auto render_sidebar_rotation_hint = [this]() { | ||||||
|  | @ -1885,8 +1878,10 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) con | ||||||
| 
 | 
 | ||||||
|     auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { |     auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { | ||||||
|         GLShaderProgram* shader = wxGetApp().get_current_shader(); |         GLShaderProgram* shader = wxGetApp().get_current_shader(); | ||||||
|         if (shader != nullptr) |         if (shader != nullptr) { | ||||||
|             shader->set_uniform("uniform_color", uniform_scale ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis], 4); |             shader->set_uniform("uniform_color", uniform_scale ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis]); | ||||||
|  |             shader->set_uniform("emission_factor", 0.0); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         glsafe(::glTranslated(0.0, 5.0, 0.0)); |         glsafe(::glTranslated(0.0, 5.0, 0.0)); | ||||||
|         m_arrow.render(); |         m_arrow.render(); | ||||||
|  |  | ||||||
|  | @ -5,11 +5,6 @@ | ||||||
| #include "libslic3r/Geometry.hpp" | #include "libslic3r/Geometry.hpp" | ||||||
| #include "GLModel.hpp" | #include "GLModel.hpp" | ||||||
| 
 | 
 | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER |  | ||||||
| class GLUquadric; |  | ||||||
| typedef class GLUquadric GLUquadricObj; |  | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 |  | ||||||
| 
 |  | ||||||
| namespace Slic3r { | namespace Slic3r { | ||||||
| 
 | 
 | ||||||
| class Shader; | class Shader; | ||||||
|  | @ -216,7 +211,7 @@ private: | ||||||
|     bool m_scaled_instance_bounding_box_dirty; |     bool m_scaled_instance_bounding_box_dirty; | ||||||
| 
 | 
 | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER | #if ENABLE_RENDER_SELECTION_CENTER | ||||||
|     GLUquadricObj* m_quadric; |     GLModel m_vbo_sphere; | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 | #endif // ENABLE_RENDER_SELECTION_CENTER
 | ||||||
| 
 | 
 | ||||||
|     GLModel m_arrow; |     GLModel m_arrow; | ||||||
|  | @ -226,9 +221,6 @@ private: | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     Selection(); |     Selection(); | ||||||
| #if ENABLE_RENDER_SELECTION_CENTER |  | ||||||
|     ~Selection(); |  | ||||||
| #endif // ENABLE_RENDER_SELECTION_CENTER
 |  | ||||||
| 
 | 
 | ||||||
|     void set_volumes(GLVolumePtrs* volumes); |     void set_volumes(GLVolumePtrs* volumes); | ||||||
|     bool init(); |     bool init(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lukas Matena
						Lukas Matena