X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=vec.h;h=48635238202c5de1a437161028112bf1085352c1;hp=2c1269dccc88eb567e1962ecbcda2d8e5d082f56;hb=95850b98f73ad7033af60a30e324e9c3cda55389;hpb=c875478cdd823c7df8fdc859941bd9e5948c9315 diff --git a/vec.h b/vec.h index 2c1269d..4863523 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)) /* @@ -106,6 +107,21 @@ bool vec_isequal(vec_t a, vec_t b) return (a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w); } +/* + * Determine whether or not two vectors are mostly equal. + */ +INLINE_MAYBE +bool vec_isequal2(vec_t a, vec_t b, scal_t epsilon) +{ + return scal_isequal2(a.x, b.x, epsilon) && + scal_isequal2(a.y, b.y, epsilon) && + scal_isequal2(a.z, b.z, epsilon) && + scal_isequal2(a.w, b.w, epsilon); +} + +/* + * Determine if one vector is "less than" another, for purposes of sorting. + */ INLINE_MAYBE int vec_compare(vec_t a, vec_t b) { @@ -140,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. */ @@ -224,5 +249,18 @@ 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]); +} + + + #endif // _VEC_H_