[Bf-blender-cvs] [759ff83e881] blender2.8: Armature: Change Bone drawing.

Clément Foucault noreply at git.blender.org
Sat May 5 21:14:02 CEST 2018


Commit: 759ff83e881795b434c4119cbab277092145cf2b
Author: Clément Foucault
Date:   Sat May 5 21:00:31 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB759ff83e881795b434c4119cbab277092145cf2b

Armature: Change Bone drawing.

This makes a few changes:
- Remove the old "overlay" wires.
- Add constraints colors to bones.
- Specify a a new "hint" color per bone. Making selection/Active state
  more obvious.
- Unify Octahedral/B-Bones/Envelope shading and colors.
- Change outline size depending on the selection/active state of the bone.

Note that thoses changes are not final and needs review.

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

M	source/blender/draw/intern/draw_armature.c

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

diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index 9a293d28c81..256c85e32e6 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -96,64 +96,51 @@ static struct {
 	DRWPass *pass_bone_envelope;
 } g_data = {NULL};
 
-/* Prototype */
-static void drw_shgroup_bone_point_solid(const float (*bone_mat)[4], const float color[4]);
-
 /* -------------------------------------------------------------------- */
 
 /** \name Shader Groups (DRW_shgroup)
  * \{ */
 
 /* Octahedral */
-static void drw_shgroup_bone_octahedral_solid(const float (*bone_mat)[4], const float color[4])
+static void drw_shgroup_bone_octahedral(
+        const float (*bone_mat)[4],
+        const float bone_color[4], const float hint_color[4], const float outline_color[4])
 {
+	if (g_data.bone_octahedral_outline == NULL) {
+		struct Gwn_Batch *geom = DRW_cache_bone_octahedral_get();
+		g_data.bone_octahedral_outline = shgroup_instance_bone_shape_outline(g_data.pass_bone_outline, geom);
+	}
 	if (g_data.bone_octahedral_solid == NULL) {
 		struct Gwn_Batch *geom = DRW_cache_bone_octahedral_get();
-		g_data.bone_octahedral_solid = shgroup_instance_solid(g_data.pass_bone_solid, geom);
+		g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.pass_bone_solid, geom);
 	}
 	float final_bonemat[4][4];
 	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
-	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_solid, final_bonemat, color);
-}
-
-static void drw_shgroup_bone_octahedral_wire(const float (*bone_mat)[4], const float color[4])
-{
-	if (g_data.bone_octahedral_wire == NULL) {
-		struct Gwn_Batch *geom = DRW_cache_bone_octahedral_wire_outline_get();
-		g_data.bone_octahedral_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
-		geom = DRW_cache_bone_octahedral_get();
-		g_data.bone_octahedral_outline = shgroup_instance_bone_shape_outline(g_data.pass_bone_outline, geom);
+	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_solid, final_bonemat, bone_color, hint_color);
+	if (outline_color[3] > 0.0f) {
+		DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_outline, final_bonemat, outline_color);
 	}
-	float final_bonemat[4][4];
-	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
-	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_wire, final_bonemat, color);
-	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_outline, final_bonemat, color);
 }
 
 /* Box / B-Bone */
-static void drw_shgroup_bone_box_solid(const float (*bone_mat)[4], const float color[4])
+static void drw_shgroup_bone_box(
+        const float (*bone_mat)[4],
+        const float bone_color[4], const float hint_color[4], const float outline_color[4])
 {
+	if (g_data.bone_box_wire == NULL) {
+		struct Gwn_Batch *geom = DRW_cache_bone_box_get();
+		g_data.bone_box_outline = shgroup_instance_bone_shape_outline(g_data.pass_bone_outline, geom);
+	}
 	if (g_data.bone_box_solid == NULL) {
 		struct Gwn_Batch *geom = DRW_cache_bone_box_get();
-		g_data.bone_box_solid = shgroup_instance_solid(g_data.pass_bone_solid, geom);
+		g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.pass_bone_solid, geom);
 	}
 	float final_bonemat[4][4];
 	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
-	DRW_shgroup_call_dynamic_add(g_data.bone_box_solid, final_bonemat, color);
-}
-
-static void drw_shgroup_bone_box_wire(const float (*bone_mat)[4], const float color[4])
-{
-	if (g_data.bone_box_wire == NULL) {
-		struct Gwn_Batch *geom = DRW_cache_bone_box_wire_outline_get();
-		g_data.bone_box_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
-		geom = DRW_cache_bone_box_get();
-		g_data.bone_box_outline = shgroup_instance_bone_shape_outline(g_data.pass_bone_outline, geom);
+	DRW_shgroup_call_dynamic_add(g_data.bone_box_solid, final_bonemat, bone_color, hint_color);
+	if (outline_color[3] > 0.0f) {
+		DRW_shgroup_call_dynamic_add(g_data.bone_box_outline, final_bonemat, outline_color);
 	}
-	float final_bonemat[4][4];
-	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
-	DRW_shgroup_call_dynamic_add(g_data.bone_box_wire, final_bonemat, color);
-	DRW_shgroup_call_dynamic_add(g_data.bone_box_outline, final_bonemat, color);
 }
 
 /* Wire */
@@ -170,7 +157,7 @@ static void drw_shgroup_bone_wire_wire(const float (*bone_mat)[4], const float c
 
 /* Envelope */
 static void drw_shgroup_bone_envelope_distance(
-        const float (*bone_mat)[4], const float color[4],
+        const float (*bone_mat)[4],
         const float *radius_head, const float *radius_tail, const float *distance)
 {
 	if (g_data.pass_bone_envelope != NULL) {
@@ -189,15 +176,31 @@ static void drw_shgroup_bone_envelope_distance(
 		head_sphere[3] += *distance;
 		tail_sphere[3]  = *radius_tail;
 		tail_sphere[3] += *distance;
-		DRW_shgroup_call_dynamic_add(g_data.bone_envelope_distance, head_sphere, tail_sphere, color, final_bonemat[0]);
+		DRW_shgroup_call_dynamic_add(g_data.bone_envelope_distance, head_sphere, tail_sphere, final_bonemat[0]);
 	}
 }
 
 static void drw_shgroup_bone_envelope(
-        DRWShadingGroup *point, DRWShadingGroup *capsule,
-        const float (*bone_mat)[4], const float color[4],
+        const float (*bone_mat)[4],
+        const float bone_color[4], const float hint_color[4], const float outline_color[4],
         const float *radius_head, const float *radius_tail)
 {
+	if (g_data.bone_point_wire == NULL) {
+		g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.pass_bone_wire);
+	}
+	if (g_data.bone_point_solid == NULL) {
+		g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.pass_bone_solid);
+	}
+	if (g_data.bone_envelope_wire == NULL) {
+		g_data.bone_envelope_wire = shgroup_instance_bone_envelope_outline(g_data.pass_bone_wire);
+	}
+	if (g_data.bone_envelope_solid == NULL) {
+		g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.pass_bone_solid);
+		/* We can have a lot of overdraw if we don't do this. Also envelope are not subject to
+		 * inverted matrix. */
+		DRW_shgroup_state_enable(g_data.bone_envelope_solid, DRW_STATE_CULL_BACK);
+	}
+
 	float head_sphere[4] = {0.0f, 0.0f, 0.0f, 1.0f}, tail_sphere[4] = {0.0f, 1.0f, 0.0f, 1.0f};
 	float final_bonemat[4][4];
 	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
@@ -212,7 +215,10 @@ static void drw_shgroup_bone_envelope(
 		tmp[0][0] = tmp[1][1] = tmp[2][2] = tail_sphere[3] / PT_DEFAULT_RAD;
 		tmp[3][3] = 1.0f;
 		copy_v3_v3(tmp[3], tail_sphere);
-		DRW_shgroup_call_dynamic_add(point, tmp, color);
+		DRW_shgroup_call_dynamic_add(g_data.bone_point_solid, tmp, bone_color, hint_color);
+		if (outline_color[3] > 0.0f) {
+			DRW_shgroup_call_dynamic_add(g_data.bone_point_wire, tmp, outline_color);
+		}
 	}
 	else if (tail_sphere[3] < 0.0f) {
 		/* Draw Head only */
@@ -220,7 +226,10 @@ static void drw_shgroup_bone_envelope(
 		tmp[0][0] = tmp[1][1] = tmp[2][2] = head_sphere[3] / PT_DEFAULT_RAD;
 		tmp[3][3] = 1.0f;
 		copy_v3_v3(tmp[3], head_sphere);
-		DRW_shgroup_call_dynamic_add(point, tmp, color);
+		DRW_shgroup_call_dynamic_add(g_data.bone_point_solid, tmp, bone_color, hint_color);
+		if (outline_color[3] > 0.0f) {
+			DRW_shgroup_call_dynamic_add(g_data.bone_point_wire, tmp, outline_color);
+		}
 	}
 	else {
 		/* Draw Body */
@@ -235,7 +244,12 @@ static void drw_shgroup_bone_envelope(
 			copy_v4_v4(tmp_sphere, head_sphere);
 			interp_v4_v4v4(head_sphere, tail_sphere, head_sphere, fac_head);
 			interp_v4_v4v4(tail_sphere, tmp_sphere,  tail_sphere, fac_tail);
-			DRW_shgroup_call_dynamic_add(capsule, head_sphere, tail_sphere, color, final_bonemat[0]);
+			DRW_shgroup_call_dynamic_add(
+			        g_data.bone_envelope_solid, head_sphere, tail_sphere, bone_color, hint_color, final_bonemat[0]);
+			if (outline_color[3] > 0.0f) {
+				DRW_shgroup_call_dynamic_add(
+				        g_data.bone_envelope_wire, head_sphere, tail_sphere, outline_color, final_bonemat[0]);
+			}
 		}
 		else {
 			float tmp[4][4] = {{0.0f}};
@@ -244,82 +258,14 @@ static void drw_shgroup_bone_envelope(
 			tmp[0][0] = tmp[1][1] = tmp[2][2] = tmp_sphere[3] / PT_DEFAULT_RAD;
 			tmp[3][3] = 1.0f;
 			copy_v3_v3(tmp[3], tmp_sphere);
-			DRW_shgroup_call_dynamic_add(point, tmp, color);
+			DRW_shgroup_call_dynamic_add(g_data.bone_point_solid, tmp, bone_color, hint_color);
+			if (outline_color[3] > 0.0f) {
+				DRW_shgroup_call_dynamic_add(g_data.bone_point_wire, tmp, outline_color);
+			}
 		}
 	}
 }
 
-static void drw_shgroup_bone_envelope_solid(
-        const float (*bone_mat)[4], const float color[4],
-        const float *radius_head, const float *radius_tail)
-{
-	if (g_data.bone_envelope_solid == NULL) {
-		g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.pass_bone_solid);
-		/* We can have a lot of overdraw if we don't do this. Also envelope are not subject to
-		 * inverted matrix. */
-		DRW_shgroup_state_enable(g_data.bone_envelope_solid, DRW_STATE_CULL_BACK);
-	}
-	if (g_data.bone_point_solid == NULL) {
-		g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.pass_bone_solid);
-	}
-
-	drw_shgroup_bone_envelope(g_data.bone_point_solid,
-	                          g_data.bone_envelope_solid,
-	                          bone_mat, color,
-	                          radius_head, radius_tail);
-}
-
-static void drw_shgroup_bone_envelope_wire(
-        const float (*bone_mat)[4], const float color[4],
-        const float *radius_head, const float *radius_tail, const float *UNUSED(distance))
-{
-	if (g_data.bone_envelope_wire == NULL) {
-		g_data.bone_envelope_wire = shgroup_instance_bone_envelope_outline(g_data.pass_bone_wire);
-	}
-	if (g_data.bone_point_wire == NULL) {
-		g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.pass_bone_wire);
-	}
-
-	drw_shgroup_bone_envelope(g_data.bone_point_wire,
-	                          g_data.bone_envelope_wire,
-	                          bone_mat, color,
-	                          radius_head, radius_tail);
-}
-
-static void drw_shgroup_bone_envelope_head_wire(
-        const float (*bone_mat)[4], const float color[4],
-        const float *radius_head, const float *radius_tail, const float

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list