[Bf-blender-cvs] [ba38206608e] blender2.8: Gizmo: tweaks to dial drawing

Campbell Barton noreply at git.blender.org
Wed Sep 19 09:40:07 CEST 2018


Commit: ba38206608e547d7a46d21386ebdfb4541bdd192
Author: Campbell Barton
Date:   Wed Sep 19 17:47:15 2018 +1000
Branches: blender2.8
https://developer.blender.org/rBba38206608e547d7a46d21386ebdfb4541bdd192

Gizmo: tweaks to dial drawing

- Add Arc-Inner-Factor, to increase the inner arc radius from 0
  (show as a disk).
- When showing an angle value, show the angle-end line thicker
  (since thats whats being adjusted).
- Remove offset used by arc drawing which caused aliasing artifacts.

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

M	source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c

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

diff --git a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
index c9fd19ccc17..ffb043ee01f 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/dial3d_gizmo.c
@@ -106,7 +106,7 @@ typedef struct DialInteraction {
 
 static void dial_geom_draw(
         const wmGizmo *gz, const float color[4], const bool select,
-        float axis_modal_mat[4][4], float clip_plane[4])
+        float axis_modal_mat[4][4], float clip_plane[4], const float arc_inner_factor)
 {
 #ifdef USE_GIZMO_CUSTOM_DIAL
 	UNUSED_VARS(gz, axis_modal_mat, clip_plane);
@@ -137,6 +137,9 @@ static void dial_geom_draw(
 	}
 	else {
 		imm_draw_circle_wire_2d(pos, 0, 0, 1.0, DIAL_RESOLUTION);
+		if (arc_inner_factor != 0.0f) {
+			imm_draw_circle_wire_2d(pos, 0, 0, arc_inner_factor, DIAL_RESOLUTION);
+		}
 	}
 
 	immUnbindProgram();
@@ -148,10 +151,9 @@ static void dial_geom_draw(
 /**
  * Draws a line from (0, 0, 0) to \a co_outer, at \a angle.
  */
-static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[3], const float color[4])
+static void dial_ghostarc_draw_helpline(
+        const float angle, const float co_outer[3], const float color[4])
 {
-	GPU_line_width(1.0f);
-
 	GPU_matrix_push();
 	GPU_matrix_rotate_3f(RAD2DEGF(angle), 0.0f, 0.0f, -1.0f);
 
@@ -162,7 +164,7 @@ static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[
 	immUniformColor4fv(color);
 
 	immBegin(GPU_PRIM_LINE_STRIP, 2);
-	immVertex3f(pos, 0.0f, 0.0f, 0.0f);
+	immVertex3f(pos, 0.0f, 0, 0.0f);
 	immVertex3fv(pos, co_outer);
 	immEnd();
 
@@ -172,16 +174,25 @@ static void dial_ghostarc_draw_helpline(const float angle, const float co_outer[
 }
 
 static void dial_ghostarc_draw(
-        const wmGizmo *gz, const float angle_ofs, const float angle_delta, const float color[4])
+        const float angle_ofs, const float angle_delta,
+        const float arc_inner_factor, const float color[4])
 {
-	const float width_inner = DIAL_WIDTH - gz->line_width * 0.5f / U.gizmo_size;
-
+	const float width_inner = DIAL_WIDTH;
 	GPUVertFormat *format = immVertexFormat();
 	uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
 	immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+
+	if (arc_inner_factor != 0.0) {
+		float color_dark[4] = {0};
+		color_dark[3] = color[3] / 2;
+		immUniformColor4fv(color_dark);
+		imm_draw_disk_partial_fill_2d(
+		        pos, 0, 0, arc_inner_factor, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(M_PI * 2));
+	}
+
 	immUniformColor4fv(color);
 	imm_draw_disk_partial_fill_2d(
-	        pos, 0, 0, 0.0, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(angle_delta));
+	        pos, 0, 0, arc_inner_factor, width_inner, DIAL_RESOLUTION, RAD2DEGF(angle_ofs), RAD2DEGF(angle_delta));
 	immUnbindProgram();
 }
 
@@ -268,16 +279,19 @@ fail:
 	*r_delta = 0.0;
 }
 
-static void dial_ghostarc_draw_with_helplines(wmGizmo *gz, float angle_ofs, float angle_delta, float color_helpline[4])
+static void dial_ghostarc_draw_with_helplines(
+        const float angle_ofs, const float angle_delta,
+        const float arc_inner_factor, const float color_helpline[4], const int draw_options)
 {
 	/* Coordinate at which the arc drawing will be started. */
 	const float co_outer[4] = {0.0f, DIAL_WIDTH, 0.0f};
-	GPU_polygon_smooth(false);
-	dial_ghostarc_draw(gz, angle_ofs, angle_delta, (const float[4]){0.8f, 0.8f, 0.8f, 0.4f});
-	GPU_polygon_smooth(true);
+	dial_ghostarc_draw(angle_ofs, angle_delta, arc_inner_factor, (const float[4]){0.8f, 0.8f, 0.8f, 0.4f});
+	GPU_line_width(1.0f);
 	dial_ghostarc_draw_helpline(angle_ofs, co_outer, color_helpline);
+	if (draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_VALUE) {
+		GPU_line_width(3.0f);
+	}
 	dial_ghostarc_draw_helpline(angle_ofs + angle_delta, co_outer, color_helpline);
-	GPU_polygon_smooth(false);
 }
 
 static void dial_draw_intern(
@@ -307,6 +321,9 @@ static void dial_draw_intern(
 		}
 	}
 
+	GPU_polygon_smooth(false);
+
+	const float arc_inner_factor = RNA_float_get(gz->ptr, "arc_inner_factor");
 	if (select == false) {
 		float angle_ofs = 0.0f;
 		float angle_delta = 0.0f;
@@ -333,16 +350,16 @@ static void dial_draw_intern(
 		}
 
 		if (show_ghostarc) {
-			dial_ghostarc_draw_with_helplines(gz, angle_ofs, angle_delta, color);
+			dial_ghostarc_draw_with_helplines(angle_ofs, angle_delta, arc_inner_factor, color, draw_options);
 			if ((draw_options & ED_GIZMO_DIAL_DRAW_FLAG_ANGLE_MIRROR) != 0) {
 				angle_ofs += M_PI;
-				dial_ghostarc_draw_with_helplines(gz, angle_ofs, angle_delta, color);
+				dial_ghostarc_draw_with_helplines(angle_ofs, angle_delta, arc_inner_factor, color, draw_options);
 			}
 		}
 	}
 
 	/* Draw actual dial gizmo. */
-	dial_geom_draw(gz, color, select, gz->matrix_basis, clip_plane);
+	dial_geom_draw(gz, color, select, gz->matrix_basis, clip_plane, arc_inner_factor);
 
 	GPU_matrix_pop();
 }
@@ -493,6 +510,7 @@ static void GIZMO_GT_dial_3d(wmGizmoType *gzt)
 	};
 	RNA_def_enum_flag(gzt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", "");
 	RNA_def_boolean(gzt->srna, "wrap_angle", true, "Wrap Angle", "");
+	RNA_def_float_factor(gzt->srna, "arc_inner_factor", 0.0f, 0.0f, 1.0f, "Arc Inner Factor", "", 0.0f, 1.0f);
 
 	WM_gizmotype_target_property_def(gzt, "offset", PROP_FLOAT, 1);
 }



More information about the Bf-blender-cvs mailing list