X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=vec.h;fp=vec.h;h=2634de621fc590366e61e3a109188eb817de3e54;hp=48635238202c5de1a437161028112bf1085352c1;hb=3955aa40277c4b86a43b21e78d55d2fea7b643ce;hpb=95850b98f73ad7033af60a30e324e9c3cda55389 diff --git a/vec.h b/vec.h index 4863523..2634de6 100644 --- a/vec.h +++ b/vec.h @@ -260,6 +260,24 @@ vec_t vec_interp(vec_t v1, vec_t v2, vec_t v3, scal_t b[3]) v1.z * b[0] + v2.z * b[1] + v3.z * b[2]); } +/* + * Interpolate smoothly between three texture coordinates with barycentric + * coordinates and perspective correction. + */ +INLINE_MAYBE +vec_t vec_tinterp(vec_t v1, vec_t v2, vec_t v3, scal_t b[3]) +{ + scal_t denom = (S(1.0) / v1.w) * b[0] + + (S(1.0) / v2.w) * b[1] + + (S(1.0) / v3.w) * b[2]; + return vec_new(scal_clamp(((v1.x / v1.w) * b[0] + + (v2.x / v2.w) * b[1] + + (v3.x / v3.w) * b[2]) / denom, S(0.0), S(1.0)), + scal_clamp(((v1.y / v1.w) * b[0] + + (v2.y / v2.w) * b[1] + + (v3.y / v3.w) * b[2]) / denom, S(0.0), S(1.0)), + S(0.0)); +} #endif // _VEC_H_