From 31013fb6df9f975a5255f35022dd5356a12b6039 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 4 Mar 2022 08:54:23 +0100 Subject: [PATCH] Tech ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Use vertex attributes and matrices in shaders. Refactoring of flat vertex shader --- resources/shaders/flat_attr.vs | 5 ++-- src/slic3r/GUI/3DBed.cpp | 4 ++- src/slic3r/GUI/3DScene.cpp | 10 ++++--- src/slic3r/GUI/Camera.hpp | 3 -- src/slic3r/GUI/GLCanvas3D.cpp | 30 +++++++++++++------- src/slic3r/GUI/GLSelectionRectangle.cpp | 3 +- src/slic3r/GUI/Gizmos/GLGizmoBase.cpp | 4 +-- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 9 ++++-- src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp | 18 ++++++++---- src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp | 3 -- src/slic3r/GUI/Gizmos/GLGizmoMove.cpp | 21 +++++++++----- src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp | 14 ++++++--- src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp | 25 ++++++++++------ src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 20 +++++++++---- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 6 ---- src/slic3r/GUI/MeshUtils.cpp | 4 ++- src/slic3r/GUI/Selection.cpp | 15 +++++++--- 17 files changed, 122 insertions(+), 72 deletions(-) diff --git a/resources/shaders/flat_attr.vs b/resources/shaders/flat_attr.vs index 1b00886757..370eedb72d 100644 --- a/resources/shaders/flat_attr.vs +++ b/resources/shaders/flat_attr.vs @@ -2,9 +2,10 @@ attribute vec3 v_position; -uniform mat4 projection_view_model_matrix; +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; void main() { - gl_Position = projection_view_model_matrix * vec4(v_position, 1.0); + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); } diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index e0f0bc024e..2fb5752f62 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -784,7 +784,9 @@ void Bed3D::render_default(bool bottom, bool picking) shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 330371e005..31639c0653 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -306,8 +306,9 @@ void GLVolume::SinkingContours::render() if (shader == nullptr) return; - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_shift); - shader->set_uniform("projection_view_model_matrix", matrix); + const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::assemble_transform(m_shift)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z())); @@ -394,8 +395,9 @@ void GLVolume::NonManifoldEdges::render() if (shader == nullptr) return; - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_parent.world_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_parent.world_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index 6a0158e6df..a61eb44ec5 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -78,9 +78,6 @@ public: const std::array& get_viewport() const { return m_viewport; } const Transform3d& get_view_matrix() const { return m_view_matrix; } const Transform3d& get_projection_matrix() const { return m_projection_matrix; } -#if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - Transform3d get_projection_view_matrix() const { return m_projection_matrix * m_view_matrix; } -#endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES Vec3d get_dir_right() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(0); } Vec3d get_dir_up() const { return m_view_matrix.matrix().block(0, 0, 3, 3).row(1); } diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index ab750cee45..00ad99af62 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -509,7 +509,8 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_profile.baseline.render(); m_profile.profile.render(); @@ -1024,7 +1025,9 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); @@ -5761,8 +5764,9 @@ void GLCanvas3D::_render_volumes_for_picking() const glsafe(::glColor4fv(picking_decode(id).data())); #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * volume.first->world_matrix(); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix() * volume.first->world_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL @@ -5942,7 +5946,9 @@ void GLCanvas3D::_render_camera_target() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); @@ -6131,12 +6137,14 @@ void GLCanvas3D::_render_sla_slices() for (const SLAPrintObject::Instance& inst : obj->instances()) { #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), - Vec3d(0.0, 0.0, inst.rotation), - Vec3d::Ones(), - obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), + inst.rotation * Vec3d::UnitZ(), Vec3d::Ones(), + obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0)); diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 828c7c6a4d..0dc6de9364 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -169,7 +169,8 @@ namespace GUI { } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_rectangle.set_color(ColorRGBA((m_state == Select) ? 0.3f : 1.0f, (m_state == Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index afcebb9869..a6d33d8065 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -65,12 +65,10 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); const Transform3d& projection_matrix = camera.get_projection_matrix(); - // normal render + shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", projection_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 6051d8c098..a6d7f5f232 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -145,7 +145,9 @@ void GLGizmoCut::on_render() } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_plane.render(); @@ -229,8 +231,9 @@ void GLGizmoCut::on_render() shader->start_using(); #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_cut_contours.shift); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index c071a491a9..1a7fc5a5af 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -124,9 +124,12 @@ void GLGizmoFlatten::on_render() if (selection.is_single_full_instance()) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); @@ -179,9 +182,12 @@ void GLGizmoFlatten::on_render_for_picking() if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * - Geometry::assemble_transform(Vec3d(0.0, 0.0, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())) * m; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z() * Vec3d::UnitZ()) * m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z())); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 2bebbccd37..b8c4ecd41e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -192,11 +192,8 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); glsafe(::glTranslated(0., 0., -drain_hole.height)); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index e8028f39f5..c3fe80a38b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -164,7 +164,9 @@ void GLGizmoMove3D::on_render() #endif // ENABLE_GLBEGIN_GLEND_REMOVAL #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES // draw axes @@ -206,7 +208,9 @@ void GLGizmoMove3D::on_render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabber_connection(m_hover_id); @@ -311,13 +315,16 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(m_grabbers[axis].center); if (axis == X) - matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); else if (axis == Y) - matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); - matrix = matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", matrix); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); + view_model_matrix = view_model_matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index b849617a3e..a6d970dc95 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -242,7 +242,8 @@ void GLGizmoPainterBase::render_cursor_circle() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", Transform3d::Identity()); + shader->set_uniform("view_model_matrix", Transform3d::Identity()); + shader->set_uniform("projection_matrix", Transform3d::Identity()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_circle.render(); shader->stop_using(); @@ -307,10 +308,13 @@ void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * trafo * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * trafo * Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones()); - shader->set_uniform("projection_view_model_matrix", matrix); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES assert(s_sphere != nullptr); @@ -1267,7 +1271,9 @@ void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui) shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES #endif // ENABLE_GLINDEXEDVERTEXARRAY_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 81dfeff3fd..8268bd8b9c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -181,8 +181,11 @@ void GLGizmoRotate::on_render() shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix; - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; @@ -605,10 +608,13 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", trafo); + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES @@ -624,10 +630,13 @@ void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool pick m_cone.render(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (use_attributes) { - const Transform3d trafo = wxGetApp().plater()->get_camera().get_projection_view_matrix() * m_grabbers.front().matrix * + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix * Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(Vec3d(0.0, 0.0, 2.0 * size), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - shader->set_uniform("projection_view_model_matrix", trafo); + Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); } else { #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 15b59d5ea4..62239508d2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -273,7 +273,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); @@ -322,7 +324,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); @@ -361,7 +365,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); @@ -400,7 +406,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); @@ -439,7 +447,9 @@ void GLGizmoScale3D::on_render() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 739796b0f4..925f8d30de 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -239,11 +239,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); @@ -262,11 +259,8 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); - // normal render shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); - // picking render - shader->set_uniform("projection_view_model_matrix", projection_matrix * view_model_matrix); #else glsafe(::glPushMatrix()); glsafe(::glScaled(radius, radius, radius)); diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 787110ad78..f84d69da9e 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -97,7 +97,9 @@ void MeshClipper::render_cut() if (shader != nullptr) { shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 1ea0cf2a17..30bebe8bab 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1291,8 +1291,11 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glDisable(GL_DEPTH_TEST)); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - const Transform3d matrix = GUI::wxGetApp().plater()->get_camera().get_projection_view_matrix() * Geometry::assemble_transform(center); - shader->set_uniform("projection_view_model_matrix", matrix); + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(center); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); @@ -2006,7 +2009,9 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con shader->start_using(); #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_box.set_color(to_rgba(color)); m_box.render(); @@ -2283,7 +2288,9 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) } #if ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES - shader->set_uniform("projection_view_model_matrix", wxGetApp().plater()->get_camera().get_projection_view_matrix()); + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); #endif // ENABLE_GLBEGIN_GLEND_SHADERS_ATTRIBUTES m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR);