Skip to content

Commit

Permalink
Tech ENABLE_GLBEGIN_GLEND_REMOVAL - Background rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
enricoturri1966 committed Jan 28, 2022
1 parent a939d8e commit eda5570
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 3 deletions.
11 changes: 11 additions & 0 deletions resources/shaders/background.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#version 110

uniform vec4 top_color;
uniform vec4 bottom_color;

varying vec2 tex_coord;

void main()
{
gl_FragColor = mix(bottom_color, top_color, tex_coord.y);
}
9 changes: 9 additions & 0 deletions resources/shaders/background.vs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#version 110

varying vec2 tex_coord;

void main()
{
gl_Position = gl_Vertex;
tex_coord = gl_MultiTexCoord0.xy;
}
45 changes: 44 additions & 1 deletion src/slic3r/GUI/GLCanvas3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,17 @@

static constexpr const float TRACKBALLSIZE = 0.8f;

#if ENABLE_GLBEGIN_GLEND_REMOVAL
static const Slic3r::ColorRGBA DEFAULT_BG_DARK_COLOR = { 0.478f, 0.478f, 0.478f, 1.0f };
static const Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.753f, 0.753f, 0.753f, 1.0f };
static const Slic3r::ColorRGBA ERROR_BG_DARK_COLOR = { 0.478f, 0.192f, 0.039f, 1.0f };
static const Slic3r::ColorRGBA ERROR_BG_LIGHT_COLOR = { 0.753f, 0.192f, 0.039f, 1.0f };
#else
static const Slic3r::ColorRGB DEFAULT_BG_DARK_COLOR = { 0.478f, 0.478f, 0.478f };
static const Slic3r::ColorRGB DEFAULT_BG_LIGHT_COLOR = { 0.753f, 0.753f, 0.753f };
static const Slic3r::ColorRGB ERROR_BG_DARK_COLOR = { 0.478f, 0.192f, 0.039f };
static const Slic3r::ColorRGB ERROR_BG_LIGHT_COLOR = { 0.753f, 0.192f, 0.039f };
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL

// Number of floats
static constexpr const size_t MAX_VERTEX_BUFFER_SIZE = 131072 * 6; // 3.15MB
Expand Down Expand Up @@ -5197,7 +5204,7 @@ void GLCanvas3D::_rectangular_selection_picking_pass()
_update_volumes_hover_state();
}

void GLCanvas3D::_render_background() const
void GLCanvas3D::_render_background()
{
bool use_error_color = false;
if (wxGetApp().is_editor()) {
Expand All @@ -5219,6 +5226,41 @@ void GLCanvas3D::_render_background() const
// Draws a bottom to top gradient over the complete screen.
glsafe(::glDisable(GL_DEPTH_TEST));

#if ENABLE_GLBEGIN_GLEND_REMOVAL
const ColorRGBA bottom_color = use_error_color ? ERROR_BG_DARK_COLOR : DEFAULT_BG_DARK_COLOR;

if (!m_background.is_initialized() || m_background.get_color() != bottom_color) {
m_background.reset();

GLModel::Geometry init_data;
init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2, GLModel::Geometry::EIndexType::USHORT };
init_data.color = bottom_color;
init_data.vertices.reserve(4 * GLModel::Geometry::vertex_stride_floats(init_data.format));
init_data.indices.reserve(6 * GLModel::Geometry::index_stride_bytes(init_data.format));

// vertices
init_data.add_vertex(Vec2f(-1.0f, -1.0f), Vec2f(0.0f, 0.0f));
init_data.add_vertex(Vec2f(1.0f, -1.0f), Vec2f(1.0f, 0.0f));
init_data.add_vertex(Vec2f(1.0f, 1.0f), Vec2f(1.0f, 1.0f));
init_data.add_vertex(Vec2f(-1.0f, 1.0f), Vec2f(0.0f, 1.0f));

// indices
init_data.add_ushort_triangle(0, 1, 2);
init_data.add_ushort_triangle(2, 3, 0);

m_background.init_from(std::move(init_data));
}

GLShaderProgram* shader = wxGetApp().get_shader("background");
if (shader != nullptr) {
shader->start_using();
shader->set_uniform("top_color", use_error_color ? ERROR_BG_LIGHT_COLOR : DEFAULT_BG_LIGHT_COLOR);
shader->set_uniform("bottom_color", bottom_color);

m_background.render();
shader->stop_using();
}
#else
::glBegin(GL_QUADS);
::glColor3fv(use_error_color ? ERROR_BG_DARK_COLOR.data(): DEFAULT_BG_DARK_COLOR.data());
::glVertex2f(-1.0f, -1.0f);
Expand All @@ -5228,6 +5270,7 @@ void GLCanvas3D::_render_background() const
::glVertex2f(1.0f, 1.0f);
::glVertex2f(-1.0f, 1.0f);
glsafe(::glEnd());
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL

glsafe(::glEnable(GL_DEPTH_TEST));

Expand Down
3 changes: 2 additions & 1 deletion src/slic3r/GUI/GLCanvas3D.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -621,6 +621,7 @@ class GLCanvas3D

CameraTarget m_camera_target;
#endif // ENABLE_SHOW_CAMERA_TARGET
GLModel m_background;
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL

public:
Expand Down Expand Up @@ -932,7 +933,7 @@ class GLCanvas3D

void _picking_pass();
void _rectangular_selection_picking_pass();
void _render_background() const;
void _render_background();
void _render_bed(bool bottom, bool show_axes);
void _render_bed_for_picking(bool bottom);
void _render_objects(GLVolumeCollection::ERenderType type);
Expand Down
2 changes: 2 additions & 0 deletions src/slic3r/GUI/GLShadersManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ std::pair<bool, std::string> GLShadersManager::init()
#if ENABLE_GLBEGIN_GLEND_REMOVAL
// basic shader, used to render all what was previously rendered using the immediate mode
valid &= append_shader("flat", { "flat.vs", "flat.fs" });
// used to render 3D scene background
valid &= append_shader("background", { "background.vs", "background.fs" });
#endif // ENABLE_GLBEGIN_GLEND_REMOVAL
// used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview
valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" });
Expand Down
2 changes: 1 addition & 1 deletion src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box
shader->start_using();
shader->set_uniform("emission_factor", 0.1f);
#else
const_cast<GLModel*>(&m_cone)->set_color(-1, (!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color);
m_cone.set_color(-1, (!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color);
if (!picking) {
shader->start_using();
shader->set_uniform("emission_factor", 0.1f);
Expand Down

0 comments on commit eda5570

Please sign in to comment.