diff options
author | Antonio Vazquez <blendergit@gmail.com> | 2022-10-06 14:29:56 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2022-10-17 16:47:01 +0300 |
commit | 8725bb5108ccab455c61a98f0da7d05dc0972660 (patch) | |
tree | 3a7959b3a8837a9cecc42dc317791eb4d89c4123 /source/blender/editors/gpencil | |
parent | e2beed6ae2223cb56f64cc6e01bd284ae53fd968 (diff) |
Fix T101517: GPencil strokes snap to origin in a Scale value is on 0
The problem was the conversion to object space converted the
points to zero.
Now, the new function `zero_axis_bias_m4` is used in order to add
a small bias in the inverse matrix and avoid the zero points.
A known math issue is the stroke can be offsetted if the scale is set to 1
again. In this case apply the scale to reset to 1.
Differential Revision: https://developer.blender.org/D16162
Diffstat (limited to 'source/blender/editors/gpencil')
-rw-r--r-- | source/blender/editors/gpencil/gpencil_sculpt_paint.c | 11 | ||||
-rw-r--r-- | source/blender/editors/gpencil/gpencil_utils.c | 4 |
2 files changed, 12 insertions, 3 deletions
diff --git a/source/blender/editors/gpencil/gpencil_sculpt_paint.c b/source/blender/editors/gpencil/gpencil_sculpt_paint.c index e27cd255217..424544c8085 100644 --- a/source/blender/editors/gpencil/gpencil_sculpt_paint.c +++ b/source/blender/editors/gpencil/gpencil_sculpt_paint.c @@ -544,8 +544,10 @@ static void gpencil_brush_grab_apply_cached(tGP_BrushEditData *gso, return; } - float inverse_diff_mat[4][4]; - invert_m4_m4(inverse_diff_mat, diff_mat); + float matrix[4][4], inverse_diff_mat[4][4]; + copy_m4_m4(matrix, diff_mat); + zero_axis_bias_m4(matrix); + invert_m4_m4(inverse_diff_mat, matrix); /* Apply dvec to all of the stored points */ for (int i = 0; i < data->size; i++) { @@ -1169,7 +1171,10 @@ static bool gpencil_sculpt_brush_init(bContext *C, wmOperator *op) gso->scene = scene; gso->object = ob; if (ob) { - invert_m4_m4(gso->inv_mat, ob->obmat); + float matrix[4][4]; + copy_m4_m4(matrix, ob->obmat); + zero_axis_bias_m4(matrix); + invert_m4_m4(gso->inv_mat, matrix); gso->vrgroup = gso->gpd->vertex_group_active_index - 1; if (!BLI_findlink(&gso->gpd->vertex_group_names, gso->vrgroup)) { gso->vrgroup = -1; diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c index 7b659511aaa..b554c81ab00 100644 --- a/source/blender/editors/gpencil/gpencil_utils.c +++ b/source/blender/editors/gpencil/gpencil_utils.c @@ -633,6 +633,7 @@ void gpencil_apply_parent(Depsgraph *depsgraph, Object *obact, bGPDlayer *gpl, b float fpt[3]; BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat); + zero_axis_bias_m4(diff_mat); invert_m4_m4(inverse_diff_mat, diff_mat); for (i = 0; i < gps->totpoints; i++) { @@ -653,6 +654,7 @@ void gpencil_apply_parent_point(Depsgraph *depsgraph, float fpt[3]; BKE_gpencil_layer_transform_matrix_get(depsgraph, obact, gpl, diff_mat); + zero_axis_bias_m4(diff_mat); invert_m4_m4(inverse_diff_mat, diff_mat); mul_v3_m4v3(fpt, inverse_diff_mat, &pt->x); @@ -935,6 +937,7 @@ void ED_gpencil_project_stroke_to_view(bContext *C, bGPDlayer *gpl, bGPDstroke * gpencil_point_conversion_init(C, &gsc); BKE_gpencil_layer_transform_matrix_get(depsgraph, ob, gpl, diff_mat); + zero_axis_bias_m4(diff_mat); invert_m4_m4(inverse_diff_mat, diff_mat); /* Adjust each point */ @@ -1050,6 +1053,7 @@ void ED_gpencil_stroke_reproject(Depsgraph *depsgraph, float diff_mat[4][4], inverse_diff_mat[4][4]; BKE_gpencil_layer_transform_matrix_get(depsgraph, gsc->ob, gpl, diff_mat); + zero_axis_bias_m4(diff_mat); invert_m4_m4(inverse_diff_mat, diff_mat); float origin[3]; |