- if (line->state == IN) i = 1-i;
- i = i * i;
- if (line->state == IN) i = 1-i;
-
- line->color[0] = sc->color[0] * (line->state == IN ? i : 1-i);
- line->color[1] = sc->color[1] * (line->state == IN ? i : 1-i);
- line->color[2] = sc->color[2] * (line->state == IN ? i : 1-i);
- line->color[3] = sc->color[3] * (line->state == IN ? i : 1-i);
-
- line->current.x = line->from.x + (i * (line->to.x - line->from.x));
- line->current.y = line->from.y + (i * (line->to.y - line->from.y));
- line->current.z = line->from.z + (i * (line->to.z - line->from.z));
- line->cth = line->fth + (i * (line->tth - line->fth));
+
+ /* Move along the path exponentially, slow side towards the middle. */
+ if (line->state == OUT)
+ ii = i * i;
+ else
+ ii = 1 - ((1-i) * (1-i));
+
+ line->current.x = line->from.x + (ii * (line->to.x - line->from.x));
+ line->current.y = line->from.y + (ii * (line->to.y - line->from.y));
+ line->current.z = line->from.z + (ii * (line->to.z - line->from.z));
+ line->cth = line->fth + (ii * (line->tth - line->fth));
+
+ if (line->state == OUT) ii = 1-ii;
+ line->color[3] = sc->color[3] * ii;