GP: Improve smooth interpolation calc
authorAntonioya <blendergit@gmail.com>
Sun, 9 Sep 2018 14:06:10 +0000 (16:06 +0200)
committerAntonioya <blendergit@gmail.com>
Sun, 9 Sep 2018 14:06:10 +0000 (16:06 +0200)
source/blender/blenkernel/intern/gpencil.c

index 45163de559e0d129e0171fff09edb6b89651fe37..08c490252e5e82e5a6b6601366f840ad2ebd01d2 100644 (file)
@@ -1334,7 +1334,11 @@ bool BKE_gpencil_smooth_stroke_strength(bGPDstroke *gps, int point_index, float
        /* the optimal value is the corresponding to the interpolation of the strength
         * at the distance of point b
         */
-       const float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+       float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+       /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+       if ((fac < 0.0f) || (fac > 1.0f)) {
+               fac = 0.5f;
+       }
        const float optimal = (1.0f - fac) * pta->strength + fac * ptc->strength;
 
        /* Based on influence factor, blend between original and optimal */
@@ -1369,7 +1373,10 @@ bool BKE_gpencil_smooth_stroke_thickness(bGPDstroke *gps, int point_index, float
         * at the distance of point b
         */
        float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
-       CLAMP(fac, 0.0f, 1.0f);
+       /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+       if ((fac < 0.0f) || (fac > 1.0f)) {
+               fac = 0.5f;
+       }
        float optimal = interpf(ptc->pressure, pta->pressure, fac);
 
        /* Based on influence factor, blend between original and optimal */
@@ -1404,6 +1411,10 @@ bool BKE_gpencil_smooth_stroke_uv(bGPDstroke *gps, int point_index, float influe
         * at the distance of point b
         */
        float fac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
+       /* sometimes the factor can be wrong due stroke geometry, so use middle point */
+       if ((fac < 0.0f) || (fac > 1.0f)) {
+               fac = 0.5f;
+       }
        float optimal = interpf(ptc->uv_rot, pta->uv_rot, fac);
 
        /* Based on influence factor, blend between original and optimal */