[Bf-blender-cvs] [2783d5d] blender2.8: OpenGL: follow up on mesh wire TODOs

Mike Erwin noreply at git.blender.org
Wed Oct 26 10:19:19 CEST 2016


Commit: 2783d5df619e6275c459b025e982a45c4e281800
Author: Mike Erwin
Date:   Wed Oct 26 04:18:19 2016 -0400
Branches: blender2.8
https://developer.blender.org/rB2783d5df619e6275c459b025e982a45c4e281800

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

===================================================================

M	source/blender/editors/space_view3d/drawobject.c

===================================================================

diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 8df1007..459f17d 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -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
 	}




More information about the Bf-blender-cvs mailing list