GP: Improve smooth interpolation calc
[blender.git] / 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 */