X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=vec.h;h=2634de621fc590366e61e3a109188eb817de3e54;hp=614e31dfec4c0e68bdbcb5b08ae0be7399ef4ef7;hb=3955aa40277c4b86a43b21e78d55d2fea7b643ce;hpb=b0a8ea303e942930350bf85c860afc969442c7a4 diff --git a/vec.h b/vec.h index 614e31d..2634de6 100644 --- a/vec.h +++ b/vec.h @@ -57,10 +57,11 @@ vec_t vec_new(scal_t x, scal_t y, scal_t z) return vec_new2(x, y, z, S(1.0)); } -#define VEC_ZERO vec_new(S(0.0), S(0.0), S(0.0)) -#define VEC_ORTHO_X vec_new(S(1.0), S(0.0), S(0.0)) -#define VEC_ORTHO_Y vec_new(S(0.0), S(1.0), S(0.0)) -#define VEC_ORTHO_Z vec_new(S(0.0), S(0.0), S(1.0)) +#define VEC_ZERO vec_new(S(0.0), S(0.0), S(0.0)) +#define VEC_ORTHO_X vec_new(S(1.0), S(0.0), S(0.0)) +#define VEC_ORTHO_Y vec_new(S(0.0), S(1.0), S(0.0)) +#define VEC_ORTHO_Z vec_new(S(0.0), S(0.0), S(1.0)) +#define VEC_ZERO_FREE vec_new2(S(0.0), S(0.0), S(0.0), S(0.0)) /* @@ -155,6 +156,15 @@ vec_t vec_add(vec_t a, vec_t b) return a; } +/* + * Add three vectors together. + */ +INLINE_MAYBE +vec_t vec_add2(vec_t a, vec_t b, vec_t c) +{ + return vec_add(vec_add(a, b), c); +} + /* * Subtract a vector from another vector. */ @@ -239,5 +249,36 @@ vec_t vec_homodiv(vec_t v) } +/* + * Interpolate smoothly between three vectors with barycentric coordinates. + */ +INLINE_MAYBE +vec_t vec_interp(vec_t v1, vec_t v2, vec_t v3, scal_t b[3]) +{ + return vec_new(v1.x * b[0] + v2.x * b[1] + v3.x * b[2], + v1.y * b[0] + v2.y * b[1] + v3.y * b[2], + 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_