OpenGL: follow up on mesh wire TODOs

- depth test on (affects scene depth for now)
- color variations
- object outline  does not need GL_BLEND with latest shader
This commit is contained in:
Mike Erwin 2016-10-26 04:18:19 -04:00
parent a394f4e545
commit 2783d5df61
1 changed files with 47 additions and 20 deletions

View File

@ -4267,6 +4267,8 @@ static void draw_mesh_object_outline_new(View3D *v3d, RegionView3D *rv3d, Object
const float outline_color[4];
UI_GetThemeColor4fv(TH_SELECT, outline_color);
/* TODO: use TH_ACTIVE if this is the active object */
#if 1
Batch *fancy_edges = MBC_get_fancy_edges(dm);
@ -4279,7 +4281,6 @@ static void draw_mesh_object_outline_new(View3D *v3d, RegionView3D *rv3d, Object
}
else {
Batch_set_builtin_program(fancy_edges, GPU_SHADER_EDGES_FRONT_BACK_PERSP);
glEnable(GL_BLEND); /* hack until we support geometry shaders on Mac */
}
Batch_Uniform1b(fancy_edges, "drawFront", false);
@ -4289,9 +4290,6 @@ static void draw_mesh_object_outline_new(View3D *v3d, RegionView3D *rv3d, Object
Batch_draw(fancy_edges);
if (rv3d->persp != RV3D_ORTHO) {
glDisable(GL_BLEND); /* hack */
}
#else
Batch *batch = MBC_get_all_edges(dm);
Batch_set_builtin_program(batch, GPU_SHADER_3D_UNIFORM_COLOR);
@ -4680,6 +4678,28 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3
return retval;
}
static void make_color_variations(const unsigned char base_ubyte[4], float low[4], float med[4], float high[4])
{
/* original idea: nice variations (lighter & darker shades) of base color
* current implementation uses input color as high; med & low get closer to background color
*/
float bg[3];
UI_GetThemeColor3fv(TH_BACK, bg);
float base[4];
rgba_uchar_to_float(base, base_ubyte);
interp_v3_v3v3(low, bg, base, 0.333f);
interp_v3_v3v3(med, bg, base, 0.667f);
copy_v3_v3(high, base);
/* use original alpha */
low[3] = base[3];
med[3] = base[3];
high[3] = base[3];
}
static void draw_mesh_fancy_new(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base,
const char dt, const unsigned char ob_wire_col[4], const short dflag)
{
@ -4750,21 +4770,14 @@ static void draw_mesh_fancy_new(Scene *scene, ARegion *ar, View3D *v3d, RegionVi
// TODO: draw smooth round points as a batch
}
else if ((dt == OB_WIRE) || no_faces) {
draw_wire = OBDRAW_WIRE_ON; /* draw wire only, no depth buffer stuff */
draw_wire = OBDRAW_WIRE_ON;
/* TODO: enable depth for wireframes */
/* enable depth for wireframes */
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glLineWidth(1.0f);
float color[4];
rgba_uchar_to_float(color, ob_wire_col);
/* TODO:
* const bool active = (ob == CTX_data_active_object(C));
* const int theme = active ? TH_ACTIVE : (base->flag & SELECT) ? TH_SELECT : TH_WIRE;
* UI_GetThemeColor4fv(theme, color);
*/
#if 0
Batch *fancy_edges = MBC_get_fancy_edges(dm);
@ -4779,14 +4792,23 @@ static void draw_mesh_fancy_new(Scene *scene, ARegion *ar, View3D *v3d, RegionVi
Batch_set_builtin_program(fancy_edges, GPU_SHADER_EDGES_FRONT_BACK_PERSP);
}
/* TODO: nice variations (lighter & darker shades) of base color */
float backColor[4] = { 0.5f, 0.3f, 0.0f, 1.0f };
float outlineColor[4] = { 1.0f, 0.7f, 0.3f, 1.0f };
float frontColor[4];
float backColor[4];
float outlineColor[4];
make_color_variations(ob_wire_col, backColor, frontColor, outlineColor);
Batch_Uniform4fv(fancy_edges, "frontColor", color);
Batch_Uniform4fv(fancy_edges, "frontColor", frontColor);
Batch_Uniform4fv(fancy_edges, "backColor", backColor);
Batch_Uniform1b(fancy_edges, "drawFront", true);
Batch_Uniform1b(fancy_edges, "drawBack", true);
Batch_Uniform1b(fancy_edges, "drawBack", true); /* false here = backface cull */
Batch_Uniform1b(fancy_edges, "drawSilhouette", false);
Batch_draw(fancy_edges);
glLineWidth(2.0f);
Batch_Uniform1b(fancy_edges, "drawFront", false);
Batch_Uniform1b(fancy_edges, "drawBack", false);
Batch_Uniform1b(fancy_edges, "drawSilhouette", true);
Batch_Uniform4fv(fancy_edges, "silhouetteColor", outlineColor);
@ -4794,7 +4816,12 @@ static void draw_mesh_fancy_new(Scene *scene, ARegion *ar, View3D *v3d, RegionVi
#else
Batch *batch = MBC_get_all_edges(dm);
Batch_set_builtin_program(batch, GPU_SHADER_3D_UNIFORM_COLOR);
float color[4];
rgba_uchar_to_float(color, ob_wire_col);
Batch_Uniform4fv(batch, "color", color);
Batch_draw(batch);
#endif
}