diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-30 20:34:54 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-30 20:34:54 +0300 |
commit | 846056de6b272d1da087c5ad133f612eecc722af (patch) | |
tree | eb3e8d247d7827ab001a676fc1dbf46899f05065 /source/blender/draw/intern/draw_armature.c | |
parent | 493eaaf213dac66cb22b2c1c0b5400295afee6c3 (diff) |
Fix T64510 Armature: Empty Not Visible as Bone custom shape
Diffstat (limited to 'source/blender/draw/intern/draw_armature.c')
-rw-r--r-- | source/blender/draw/intern/draw_armature.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c index 3f651b27dd0..4f387de16a8 100644 --- a/source/blender/draw/intern/draw_armature.c +++ b/source/blender/draw/intern/draw_armature.c @@ -80,6 +80,8 @@ static struct { DRWCallBuffer *lines_ik_no_target; DRWCallBuffer *lines_ik_spline; + DRWEmptiesBufferList empties; + DRWArmaturePasses passes; bool transparent; @@ -435,6 +437,50 @@ static void drw_shgroup_bone_custom_wire(const float (*bone_mat)[4], } } +static void drw_shgroup_bone_custom_empty(const float (*bone_mat)[4], + const float color[4], + const eGPUShaderConfig sh_cfg, + Object *custom) +{ + DRWEmptiesBufferList *buffers = &g_data.empties; + const float *draw_size = &custom->empty_drawsize; + + if (g_data.empties.plain_axes == NULL) { + empties_callbuffers_create(g_data.passes.bone_wire, buffers, sh_cfg); + } + + float final_color[4] = {color[0], color[1], color[2], 1.0f}; + float final_bonemat[4][4]; + mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat); + + switch (custom->empty_drawtype) { + case OB_PLAINAXES: + DRW_buffer_add_entry(buffers->plain_axes, final_color, draw_size, final_bonemat); + break; + case OB_SINGLE_ARROW: + DRW_buffer_add_entry(buffers->single_arrow, final_color, draw_size, final_bonemat); + DRW_buffer_add_entry(buffers->single_arrow_line, final_color, draw_size, final_bonemat); + break; + case OB_CUBE: + DRW_buffer_add_entry(buffers->cube, final_color, draw_size, final_bonemat); + break; + case OB_CIRCLE: + DRW_buffer_add_entry(buffers->circle, final_color, draw_size, final_bonemat); + break; + case OB_EMPTY_SPHERE: + DRW_buffer_add_entry(buffers->sphere, final_color, draw_size, final_bonemat); + break; + case OB_EMPTY_CONE: + DRW_buffer_add_entry(buffers->cone, final_color, draw_size, final_bonemat); + break; + case OB_ARROWS: + DRW_buffer_add_entry(buffers->empty_axes, final_color, draw_size, final_bonemat); + break; + case OB_EMPTY_IMAGE: + break; + } +} + /* Head and tail sphere */ static void drw_shgroup_bone_point(const float (*bone_mat)[4], const float bone_color[4], @@ -1394,6 +1440,12 @@ static void draw_bone_custom_shape(EditBone *eBone, DRW_select_load_id(select_id | BONESEL_BONE); } + if (pchan->custom->type == OB_EMPTY) { + Object *ob = pchan->custom; + if (ob->empty_drawtype != OB_EMPTY_IMAGE) { + drw_shgroup_bone_custom_empty(disp_mat, col_wire, sh_cfg, pchan->custom); + } + } if ((boneflag & BONE_DRAWWIRE) == 0) { drw_shgroup_bone_custom_solid(disp_mat, col_solid, col_hint, col_wire, sh_cfg, pchan->custom); } |