[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