diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-05-17 15:33:34 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-05-17 15:33:34 +0300 |
commit | d0ceb1821bb202fdd0ebd82539abc7ae7a395b02 (patch) | |
tree | 64003d4972fe62174de9b4a1501a2b886a662ef1 /source/blender/draw/intern/draw_armature.c | |
parent | 3c799ba8013405142430d7e20c272fe92457852d (diff) |
DwM: Armature: fix bone distance outline drawing.
This indeed needed its own draw pass, thank to @fclem for the hints!
Also fixes a stupid mistake in bones head/tail coloring.
Diffstat (limited to 'source/blender/draw/intern/draw_armature.c')
-rw-r--r-- | source/blender/draw/intern/draw_armature.c | 78 |
1 files changed, 34 insertions, 44 deletions
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c index 1e6315d6749..d7ec210b728 100644 --- a/source/blender/draw/intern/draw_armature.c +++ b/source/blender/draw/intern/draw_armature.c @@ -86,8 +86,9 @@ static struct { DRWShadingGroup *bone_axes; DRWShadingGroup *relationship_lines; - DRWPass *bone_solid; - DRWPass *bone_wire; + DRWPass *pass_bone_solid; + DRWPass *pass_bone_wire; + DRWPass *pass_bone_envelope; } g_data = {NULL}; /* -------------------------------------------------------------------- */ @@ -100,7 +101,7 @@ static void DRW_shgroup_bone_octahedral_solid(const float (*bone_mat)[4], const { if (g_data.bone_octahedral_solid == NULL) { struct Batch *geom = DRW_cache_bone_octahedral_get(); - g_data.bone_octahedral_solid = shgroup_instance_objspace_solid(g_data.bone_solid, geom, g_data.ob->obmat); + g_data.bone_octahedral_solid = shgroup_instance_objspace_solid(g_data.pass_bone_solid, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_solid, bone_mat, color); @@ -110,7 +111,7 @@ static void DRW_shgroup_bone_octahedral_wire(const float (*bone_mat)[4], const f { if (g_data.bone_octahedral_wire == NULL) { struct Batch *geom = DRW_cache_bone_octahedral_wire_outline_get(); - g_data.bone_octahedral_wire = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_octahedral_wire = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_wire, bone_mat, color); @@ -121,7 +122,7 @@ static void DRW_shgroup_bone_box_solid(const float (*bone_mat)[4], const float c { if (g_data.bone_box_solid == NULL) { struct Batch *geom = DRW_cache_bone_box_get(); - g_data.bone_box_solid = shgroup_instance_objspace_solid(g_data.bone_solid, geom, g_data.ob->obmat); + g_data.bone_box_solid = shgroup_instance_objspace_solid(g_data.pass_bone_solid, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_box_solid, bone_mat, color); @@ -131,7 +132,7 @@ static void DRW_shgroup_bone_box_wire(const float (*bone_mat)[4], const float co { if (g_data.bone_box_wire == NULL) { struct Batch *geom = DRW_cache_bone_box_wire_outline_get(); - g_data.bone_box_wire = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_box_wire = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_box_wire, bone_mat, color); @@ -142,7 +143,7 @@ static void DRW_shgroup_bone_wire_wire(const float (*bone_mat)[4], const float c { if (g_data.bone_wire_wire == NULL) { struct Batch *geom = DRW_cache_bone_wire_wire_outline_get(); - g_data.bone_wire_wire = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_wire_wire = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_wire_wire, bone_mat, color); @@ -153,13 +154,15 @@ static void DRW_shgroup_bone_envelope_distance( const float (*bone_mat)[4], const float color[4], const float *radius_head, const float *radius_tail, const float *distance) { - if (g_data.bone_envelope_distance == NULL) { - struct Batch *geom = DRW_cache_bone_envelope_distance_outline_get(); - /* Note: bone_wire draw pass is not really working, think we need another one here? */ - g_data.bone_envelope_distance = shgroup_instance_bone_envelope(g_data.bone_wire, geom, g_data.ob->obmat); - } + if (g_data.pass_bone_envelope != NULL) { + if (g_data.bone_envelope_distance == NULL) { + struct Batch *geom = DRW_cache_bone_envelope_distance_outline_get(); + /* Note: bone_wire draw pass is not really working, think we need another one here? */ + g_data.bone_envelope_distance = shgroup_instance_bone_envelope(g_data.pass_bone_envelope, geom, g_data.ob->obmat); + } - DRW_shgroup_call_dynamic_add(g_data.bone_envelope_distance, bone_mat, color, radius_head, radius_tail, distance); + DRW_shgroup_call_dynamic_add(g_data.bone_envelope_distance, bone_mat, color, radius_head, radius_tail, distance); + } } static void DRW_shgroup_bone_envelope_wire( @@ -168,7 +171,7 @@ static void DRW_shgroup_bone_envelope_wire( { if (g_data.bone_envelope_wire == NULL) { struct Batch *geom = DRW_cache_bone_envelope_wire_outline_get(); - g_data.bone_envelope_wire = shgroup_instance_bone_envelope(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_envelope_wire = shgroup_instance_bone_envelope(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_envelope_wire, bone_mat, color, radius_head, radius_tail, distance); @@ -180,7 +183,7 @@ static void DRW_shgroup_bone_envelope_head_wire( { if (g_data.bone_envelope_head_wire == NULL) { struct Batch *geom = DRW_cache_bone_envelope_head_wire_outline_get(); - g_data.bone_envelope_head_wire = shgroup_instance_bone_envelope(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_envelope_head_wire = shgroup_instance_bone_envelope(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_envelope_head_wire, bone_mat, color, radius_head, radius_tail, distance); @@ -193,7 +196,7 @@ static void DRW_shgroup_bone_custom_solid(const float (*bone_mat)[4], const floa /* grr, not re-using instances! */ struct Batch *geom = DRW_cache_object_surface_get(custom); if (geom) { - DRWShadingGroup *shgrp_geom_solid = shgroup_instance_objspace_solid(g_data.bone_solid, geom, g_data.ob->obmat); + DRWShadingGroup *shgrp_geom_solid = shgroup_instance_objspace_solid(g_data.pass_bone_solid, geom, g_data.ob->obmat); DRW_shgroup_call_dynamic_add(shgrp_geom_solid, bone_mat, color); } } @@ -203,7 +206,7 @@ static void DRW_shgroup_bone_custom_wire(const float (*bone_mat)[4], const float /* grr, not re-using instances! */ struct Batch *geom = DRW_cache_object_wire_outline_get(custom); if (geom) { - DRWShadingGroup *shgrp_geom_wire = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + DRWShadingGroup *shgrp_geom_wire = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); DRW_shgroup_call_dynamic_add(shgrp_geom_wire, bone_mat, color); } } @@ -213,7 +216,7 @@ static void DRW_shgroup_bone_point_solid(const float (*bone_mat)[4], const float { if (g_data.bone_point_solid == NULL) { struct Batch *geom = DRW_cache_bone_point_get(); - g_data.bone_point_solid = shgroup_instance_objspace_solid(g_data.bone_solid, geom, g_data.ob->obmat); + g_data.bone_point_solid = shgroup_instance_objspace_solid(g_data.pass_bone_solid, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_point_solid, bone_mat, color); @@ -223,7 +226,7 @@ static void DRW_shgroup_bone_point_wire(const float (*bone_mat)[4], const float { if (g_data.bone_point_wire == NULL) { struct Batch *geom = DRW_cache_bone_point_wire_outline_get(); - g_data.bone_point_wire = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_point_wire = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_point_wire, bone_mat, color); @@ -234,7 +237,7 @@ static void DRW_shgroup_bone_axes(const float (*bone_mat)[4], const float color[ { if (g_data.bone_axes == NULL) { struct Batch *geom = DRW_cache_bone_arrows_get(); - g_data.bone_axes = shgroup_instance_objspace_wire(g_data.bone_wire, geom, g_data.ob->obmat); + g_data.bone_axes = shgroup_instance_objspace_wire(g_data.pass_bone_wire, geom, g_data.ob->obmat); } DRW_shgroup_call_dynamic_add(g_data.bone_axes, bone_mat, color); @@ -962,7 +965,7 @@ static void draw_points( dist = &pchan->bone->dist; } DRW_shgroup_bone_envelope_head_wire( - BONE_VAR(eBone, pchan, disp_tail_mat), col_wire_root, rad_tail, rad_tail, dist); + BONE_VAR(eBone, pchan, disp_tail_mat), col_wire_tail, rad_tail, rad_tail, dist); } else { DRW_shgroup_bone_point_solid(BONE_VAR(eBone, pchan, disp_tail_mat), col_solid_tail); @@ -1008,9 +1011,6 @@ static void draw_bone_envelope( const int boneflag, const short constflag, const int select_id) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - View3D *v3d = draw_ctx->v3d; - // const float *col_solid = get_bone_solid_color(eBone, pchan, arm, boneflag, constflag); const float *col_wire = get_bone_wire_color(eBone, pchan, arm, boneflag, constflag); @@ -1028,21 +1028,10 @@ static void draw_bone_envelope( rad_head = (pchan->parent && (boneflag & BONE_CONNECTED)) ? &pchan->parent->bone->rad_tail : &pchan->bone->rad_head; } - /* Not working! Probably needs its own drawpass... */ - glEnable(GL_BLEND); - if (v3d->zbuf) { - glDisable(GL_DEPTH_TEST); - } - if (boneflag & BONE_SELECTED) { DRW_shgroup_bone_envelope_distance(BONE_VAR(eBone, pchan, disp_mat), col_white, rad_head, rad_tail, distance); } - if (v3d->zbuf) { - glEnable(GL_DEPTH_TEST); - } - glDisable(GL_BLEND); - if (select_id != -1) { DRW_select_load_id(select_id | BONESEL_BONE); } @@ -1363,43 +1352,44 @@ static void draw_armature_pose(Object *ob, const float const_color[4]) * This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls. */ static void DRW_shgroup_armature( - Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, + Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope, DRWShadingGroup *shgrp_relationship_lines) { memset(&g_data, 0x0, sizeof(g_data)); g_data.ob = ob; - g_data.bone_solid = pass_bone_solid; - g_data.bone_wire = pass_bone_wire; + g_data.pass_bone_solid = pass_bone_solid; + g_data.pass_bone_wire = pass_bone_wire; + g_data.pass_bone_envelope = pass_bone_envelope; g_data.relationship_lines = shgrp_relationship_lines; memset(&g_color, 0x0, sizeof(g_color)); } void DRW_shgroup_armature_object( - Object *ob, SceneLayer *sl, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, + Object *ob, SceneLayer *sl, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *UNUSED(pass_bone_envelope), DRWShadingGroup *shgrp_relationship_lines) { float *color; DRW_object_wire_theme_get(ob, sl, &color); - DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, shgrp_relationship_lines); + DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, NULL, shgrp_relationship_lines); draw_armature_pose(ob, color); } void DRW_shgroup_armature_pose( - Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, + Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope, DRWShadingGroup *shgrp_relationship_lines) { - DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, shgrp_relationship_lines); + DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines); draw_armature_pose(ob, NULL); } void DRW_shgroup_armature_edit( - Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, + Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope, DRWShadingGroup *shgrp_relationship_lines) { - DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, shgrp_relationship_lines); + DRW_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines); draw_armature_edit(ob); } |