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))
/*
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.
*/
}
+/*
+ * 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_