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
This commit is contained in:
parent
7163a83450
commit
25533ac22d
Notes:
blender-bot
2023-02-14 04:20:36 +01:00
Referenced by issue #100749, Blender LTS: Maintenance Task 3.3 Referenced by issue #101517, GPencil: All strokes snap to origin in a Scale value is on 0
|
@ -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;
|
||||
|
|
|
@ -632,6 +632,7 @@ void gpencil_world_to_object_space(Depsgraph *depsgraph,
|
|||
float inverse_diff_mat[4][4];
|
||||
|
||||
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++) {
|
||||
|
@ -650,6 +651,7 @@ void gpencil_world_to_object_space_point(Depsgraph *depsgraph,
|
|||
float inverse_diff_mat[4][4];
|
||||
|
||||
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_m4_v3(inverse_diff_mat, &pt->x);
|
||||
|
@ -930,6 +932,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 */
|
||||
|
@ -1046,6 +1049,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];
|
||||
|
|
Loading…
Reference in New Issue