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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to