Commit: 5855c23a6452e59762cccafb7d94f62ce2206e30
Author: Antonio Vazquez
Date:   Fri Mar 2 11:26:04 2018 +0100
Branches: greasepencil-object
https://developer.blender.org/rB5855c23a6452e59762cccafb7d94f62ce2206e30

Tweak missing event algorithm for extreme zoom

Due int number limitations, when the zoom factor is extreme, the points are 
captured with gaps. This change try to minimize this effect, but it's 
impossible to solve this issue completely.

The problem is the mouse position is always defined by a pair of int number, so 
the maximum precision is limited to that, so when project the point in 3D 
space, there are small precission erros.

===================================================================

M       source/blender/editors/gpencil/gpencil_paint.c

===================================================================

diff --git a/source/blender/editors/gpencil/gpencil_paint.c 
b/source/blender/editors/gpencil/gpencil_paint.c
index 38ed0aa20bf..e9f2f1c5155 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -2666,22 +2666,31 @@ static void gpencil_add_missing_events(bContext *C, 
wmOperator *op, const wmEven
        else {
                scale = defaultpixsize;
        }
+
+       /* The thickness of the brush is reduced at 30 % of thickness to get 
overlap dots */ 
        float factor = ((thickness * 0.30f) / scale) * samples;
 
-       /* get distance to generate new points. The thickness of the brush is 
reduced at 30% of
-        * thickness to get overlap dots */
        copy_v2fl_v2i(a, p->mvalo);
        b[0] = event->mval[0] + 1;
        b[1] = event->mval[1] + 1;
 
+       /* get distance in pixels */
        float dist = len_v2v2(a, b);
-       if (dist >= factor) {
+
+       /* for very small distances, add a half way point */
+       if (dist < 2.0f) {
+               interp_v2_v2v2(pt, a, b, 0.5f);
+               sub_v2_v2v2(pt, b, pt);
+               /* create fake event */
+               gpencil_draw_apply_event(C, op, event, CTX_data_depsgraph(C),
+                       (int)pt[0], (int)pt[1]);
+       }
+       else if (dist >= factor) {
                int slices = 2 + (int)((dist - 1.0) / factor);
                float n = 1.0f / slices;
                for (int i = 1; i < slices; i++) {
                        interp_v2_v2v2(pt, a, b, n * i);
                        sub_v2_v2v2(pt, b, pt);
-
                        /* create fake event */
                        gpencil_draw_apply_event(C, op, event, 
CTX_data_depsgraph(C),
                                                                        
(int)pt[0], (int)pt[1]);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to