mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-08 07:27:41 -06:00
Add a simple subtle outline effect by drawing back faces using wireframe mode (#2934)
* Add a simple subtle outline effect by drawing back faces using wireframe mode * Show outline in white if the model color is too dark * Make the outline algorithm more reliable * Enable cull face, which fix render on Linux * Fix `disable_cullface`
This commit is contained in:
parent
2745575dd2
commit
0cee513416
4 changed files with 46 additions and 8 deletions
|
@ -54,6 +54,11 @@ varying vec4 world_pos;
|
||||||
varying float world_normal_z;
|
varying float world_normal_z;
|
||||||
varying vec3 eye_normal;
|
varying vec3 eye_normal;
|
||||||
|
|
||||||
|
vec3 getBackfaceColor(vec3 fill) {
|
||||||
|
float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b;
|
||||||
|
return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988);
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
if (any(lessThan(clipping_planes_dots, ZERO)))
|
if (any(lessThan(clipping_planes_dots, ZERO)))
|
||||||
|
@ -95,8 +100,11 @@ void main()
|
||||||
}
|
}
|
||||||
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
|
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
|
||||||
|
|
||||||
|
// Orca: add backface outline
|
||||||
|
if (!gl_FrontFacing)
|
||||||
|
gl_FragColor = vec4(getBackfaceColor(color.rgb), 1.0);
|
||||||
//BBS: add outline_color
|
//BBS: add outline_color
|
||||||
if (is_outline)
|
else if (is_outline)
|
||||||
gl_FragColor = uniform_color;
|
gl_FragColor = uniform_color;
|
||||||
#ifdef ENABLE_ENVIRONMENT_MAP
|
#ifdef ENABLE_ENVIRONMENT_MAP
|
||||||
else if (use_environment_tex)
|
else if (use_environment_tex)
|
||||||
|
|
|
@ -56,6 +56,11 @@ in vec3 eye_normal;
|
||||||
|
|
||||||
out vec4 out_color;
|
out vec4 out_color;
|
||||||
|
|
||||||
|
vec3 getBackfaceColor(vec3 fill) {
|
||||||
|
float brightness = 0.2126 * fill.r + 0.7152 * fill.g + 0.0722 * fill.b;
|
||||||
|
return (brightness > 0.75) ? vec3(0.11, 0.165, 0.208) : vec3(0.988, 0.988, 0.988);
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
if (any(lessThan(clipping_planes_dots, ZERO)))
|
if (any(lessThan(clipping_planes_dots, ZERO)))
|
||||||
|
@ -97,8 +102,11 @@ void main()
|
||||||
}
|
}
|
||||||
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
|
color.rgb = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color.rgb, ZERO, 0.3333) : color.rgb;
|
||||||
|
|
||||||
|
// Orca: add backface outline
|
||||||
|
if (!gl_FrontFacing)
|
||||||
|
out_color = vec4(getBackfaceColor(color.rgb), 1.0);
|
||||||
//BBS: add outline_color
|
//BBS: add outline_color
|
||||||
if (is_outline)
|
else if (is_outline)
|
||||||
out_color = uniform_color;
|
out_color = uniform_color;
|
||||||
#ifdef ENABLE_ENVIRONMENT_MAP
|
#ifdef ENABLE_ENVIRONMENT_MAP
|
||||||
else if (use_environment_tex)
|
else if (use_environment_tex)
|
||||||
|
|
|
@ -472,10 +472,6 @@ void GLVolume::render_with_outline(const Transform3d &view_model_matrix)
|
||||||
//BBS add render for simple case
|
//BBS add render for simple case
|
||||||
void GLVolume::simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_objects, std::vector<ColorRGBA> extruder_colors)
|
void GLVolume::simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_objects, std::vector<ColorRGBA> extruder_colors)
|
||||||
{
|
{
|
||||||
if (this->is_left_handed())
|
|
||||||
glFrontFace(GL_CW);
|
|
||||||
glsafe(::glCullFace(GL_BACK));
|
|
||||||
|
|
||||||
bool color_volume = false;
|
bool color_volume = false;
|
||||||
ModelObject* model_object = nullptr;
|
ModelObject* model_object = nullptr;
|
||||||
ModelVolume* model_volume = nullptr;
|
ModelVolume* model_volume = nullptr;
|
||||||
|
@ -504,6 +500,7 @@ void GLVolume::simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_obj
|
||||||
}
|
}
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
|
auto r = [&]() {
|
||||||
if (color_volume && !picking) {
|
if (color_volume && !picking) {
|
||||||
// when force_transparent, we need to keep the alpha
|
// when force_transparent, we need to keep the alpha
|
||||||
if (force_native_color && render_color.is_transparent()) {
|
if (force_native_color && render_color.is_transparent()) {
|
||||||
|
@ -545,6 +542,29 @@ void GLVolume::simple_render(GLShaderProgram* shader, ModelObjectPtrs& model_obj
|
||||||
else
|
else
|
||||||
model.render(this->tverts_range);
|
model.render(this->tverts_range);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (this->is_left_handed())
|
||||||
|
glFrontFace(GL_CW);
|
||||||
|
|
||||||
|
// Render front faces
|
||||||
|
glsafe(::glCullFace(GL_BACK));
|
||||||
|
r();
|
||||||
|
|
||||||
|
// Then render back faces in line mode to add an outline
|
||||||
|
GLboolean cull_face = GL_FALSE;
|
||||||
|
::glGetBooleanv(GL_CULL_FACE, &cull_face);
|
||||||
|
glsafe(::glEnable(GL_CULL_FACE));
|
||||||
|
glsafe(::glCullFace(GL_FRONT));
|
||||||
|
glsafe(::glPolygonMode(GL_BACK, GL_LINE));
|
||||||
|
r();
|
||||||
|
|
||||||
|
// Reset mode
|
||||||
|
glsafe(::glPolygonMode(GL_BACK, GL_FILL));
|
||||||
|
glsafe(::glCullFace(GL_BACK));
|
||||||
|
if (!cull_face)
|
||||||
|
glsafe(::glDisable(GL_CULL_FACE));
|
||||||
|
|
||||||
if (this->is_left_handed())
|
if (this->is_left_handed())
|
||||||
glFrontFace(GL_CCW);
|
glFrontFace(GL_CCW);
|
||||||
}
|
}
|
||||||
|
@ -854,6 +874,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
|
||||||
}
|
}
|
||||||
|
|
||||||
glsafe(::glCullFace(GL_BACK));
|
glsafe(::glCullFace(GL_BACK));
|
||||||
|
glsafe(::glEnable(GL_CULL_FACE));
|
||||||
if (disable_cullface)
|
if (disable_cullface)
|
||||||
glsafe(::glDisable(GL_CULL_FACE));
|
glsafe(::glDisable(GL_CULL_FACE));
|
||||||
|
|
||||||
|
|
|
@ -1247,6 +1247,7 @@ void GCodeViewer::render(int canvas_width, int canvas_height, int right_margin)
|
||||||
|
|
||||||
glsafe(::glEnable(GL_DEPTH_TEST));
|
glsafe(::glEnable(GL_DEPTH_TEST));
|
||||||
render_shells();
|
render_shells();
|
||||||
|
glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); // This makes sure toolpaths are on top of shells
|
||||||
render_toolpaths();
|
render_toolpaths();
|
||||||
float legend_height = 0.0f;
|
float legend_height = 0.0f;
|
||||||
render_legend(legend_height, canvas_width, canvas_height, right_margin);
|
render_legend(legend_height, canvas_width, canvas_height, right_margin);
|
||||||
|
@ -4030,7 +4031,7 @@ void GCodeViewer::render_shells()
|
||||||
if (shader == nullptr)
|
if (shader == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
glsafe(::glDepthMask(GL_FALSE));
|
//glsafe(::glDepthMask(GL_FALSE));
|
||||||
|
|
||||||
shader->start_using();
|
shader->start_using();
|
||||||
shader->set_uniform("emission_factor", 0.1f);
|
shader->set_uniform("emission_factor", 0.1f);
|
||||||
|
@ -4039,7 +4040,7 @@ void GCodeViewer::render_shells()
|
||||||
shader->set_uniform("emission_factor", 0.0f);
|
shader->set_uniform("emission_factor", 0.0f);
|
||||||
shader->stop_using();
|
shader->stop_using();
|
||||||
|
|
||||||
glsafe(::glDepthMask(GL_TRUE));
|
//glsafe(::glDepthMask(GL_TRUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
//BBS
|
//BBS
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue