Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGermano Cavalcante <germano.costa@ig.com.br>2020-02-20 02:50:23 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-02-20 02:53:07 +0300
commit6f5ef60f1b50fef4737b0530bee5c4770be24403 (patch)
treebd80bf026e60e396a1d9c679f940a3414cd827d3 /source/blender/draw
parent0c01ad93004d6d973aae718e21b88595d6301fd2 (diff)
Fix T65640: Axis of Custom Shape Bones are drawn in a wrong position.
The problem is that Custom Shape Bones can also have a custom size. So the pchan->disp_mat doesn't always consider the actual length of the bone. The proposed solution is to calculate the axes matrix at the drawing pass. Ref T65640 Reviewed By: fclem Differential Revision: http://developer.blender.org/D5049
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/engines/overlay/overlay_armature.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 1d5fb0ea233..1d0a01d8ff8 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -1025,7 +1025,7 @@ static void pchan_draw_data_init(bPoseChannel *pchan)
static void draw_bone_update_disp_matrix_default(EditBone *eBone, bPoseChannel *pchan)
{
- float s[4][4], ebmat[4][4];
+ float ebmat[4][4];
float length;
float(*bone_mat)[4];
float(*disp_mat)[4];
@@ -1050,8 +1050,8 @@ static void draw_bone_update_disp_matrix_default(EditBone *eBone, bPoseChannel *
disp_tail_mat = eBone->disp_tail_mat;
}
- scale_m4_fl(s, length);
- mul_m4_m4m4(disp_mat, bone_mat, s);
+ copy_m4_m4(disp_mat, bone_mat);
+ rescale_m4(disp_mat, (float[3]){length, length, length});
copy_m4_m4(disp_tail_mat, disp_mat);
translate_m4(disp_tail_mat, 0.0f, 1.0f, 0.0f);
}
@@ -1250,7 +1250,6 @@ static void draw_bone_update_disp_matrix_bbone(EditBone *eBone, bPoseChannel *pc
static void draw_bone_update_disp_matrix_custom(bPoseChannel *pchan)
{
- float s[4][4];
float length;
float(*bone_mat)[4];
float(*disp_mat)[4];
@@ -1262,13 +1261,16 @@ static void draw_bone_update_disp_matrix_custom(bPoseChannel *pchan)
disp_mat = pchan->disp_mat;
disp_tail_mat = pchan->disp_tail_mat;
- scale_m4_fl(s, length);
- mul_m4_m4m4(disp_mat, bone_mat, s);
+ copy_m4_m4(disp_mat, bone_mat);
+ rescale_m4(disp_mat, (float[3]){length, length, length});
copy_m4_m4(disp_tail_mat, disp_mat);
translate_m4(disp_tail_mat, 0.0f, 1.0f, 0.0f);
}
-static void draw_axes(ArmatureDrawContext *ctx, EditBone *eBone, bPoseChannel *pchan)
+static void draw_axes(ArmatureDrawContext *ctx,
+ const EditBone *eBone,
+ const bPoseChannel *pchan,
+ const bArmature *arm)
{
float final_col[4];
const float *col = (ctx->const_color) ?
@@ -1278,7 +1280,21 @@ static void draw_axes(ArmatureDrawContext *ctx, EditBone *eBone, bPoseChannel *p
copy_v4_v4(final_col, col);
/* Mix with axes color. */
final_col[3] = (ctx->const_color) ? 1.0 : (BONE_FLAG(eBone, pchan) & BONE_SELECTED) ? 0.1 : 0.65;
- drw_shgroup_bone_axes(ctx, BONE_VAR(eBone, pchan, disp_mat), final_col);
+
+ if (pchan && pchan->custom && !(arm->flag & ARM_NO_CUSTOM)) {
+ /** Special case: Custom bones can have different scale than the bone.
+ * Recompute display matrix without the custom scalling applied. (T65640)
+ **/
+ float axis_mat[4][4];
+ float length = pchan->bone->length;
+ copy_m4_m4(axis_mat, pchan->custom_tx ? pchan->custom_tx->pose_mat : pchan->pose_mat);
+ rescale_m4(axis_mat, (float[3]){length, length, length});
+
+ drw_shgroup_bone_axes(ctx, axis_mat, final_col);
+ }
+ else {
+ drw_shgroup_bone_axes(ctx, BONE_VAR(eBone, pchan, disp_mat), final_col);
+ }
}
static void draw_points(ArmatureDrawContext *ctx,
@@ -1938,7 +1954,7 @@ static void draw_armature_edit(ArmatureDrawContext *ctx)
}
if (arm->flag & ARM_DRAWAXES) {
- draw_axes(ctx, eBone, NULL);
+ draw_axes(ctx, eBone, NULL, arm);
}
}
}
@@ -2083,7 +2099,7 @@ static void draw_armature_pose(ArmatureDrawContext *ctx)
}
if (arm->flag & ARM_DRAWAXES) {
- draw_axes(ctx, NULL, pchan);
+ draw_axes(ctx, NULL, pchan, arm);
}
}
}