#ifndef osml_vector_h #define osml_vector_h OSML_INLINE vector_t vector3(float x, float y, float z) { vector_t result; result.x = x; result.y = y; result.z = z; #if defined(__GNUC__) && __GNUC__ >= 4 result._padding = x; #endif return result; } OSML_INLINE vector_t vector2(float x, float y) { return vector3(x, y, 0.0f); } OSML_INLINE vector_t vector1(float x) { return vector3(x, 0.0f, 0.0f); } OSML_INLINE vector_t vector0(void) { return vector3(0.0f, 0.0f, 0.0f); } OSML_INLINE vector_t vector_add(vector_t lhs, vector_t rhs) { return vector3(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); } OSML_INLINE vector_t vector_subtract(vector_t lhs, vector_t rhs) { return vector3(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z); } OSML_INLINE vector_t vector_scale(vector_t lhs, float rhs) { return vector3(lhs.x * rhs, lhs.y * rhs, lhs.z * rhs); } OSML_INLINE float vector_dot_product(vector_t lhs, vector_t rhs) { return (lhs.x * rhs.x) + (lhs.y * rhs.y) + (lhs.z * rhs.z); } OSML_INLINE vector_t vector_componentwise_product(vector_t lhs, vector_t rhs) { return vector3(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z); } OSML_INLINE vector_t vector_cross_product(vector_t lhs, vector_t rhs) { return vector3(lhs.y * rhs.z - lhs.z * rhs.y, lhs.z * rhs.x - lhs.x * rhs.z, lhs.x * rhs.y - lhs.y * rhs.x); } OSML_INLINE float vector_norm(vector_t v) { return vector_dot_product(v, v); } OSML_INLINE float vector_length(vector_t v) { return osml_sqrtf(vector_norm(v)); } OSML_INLINE vector_t vector_normalized(vector_t v) { float reciprocal_length = osml_reciprocal_sqrtf(vector_norm(v)); return vector3(v.x * reciprocal_length, v.y * reciprocal_length, v.z * reciprocal_length); } OSML_INLINE vector_t vector_linear_interpolate(vector_t lhs, vector_t rhs, float fraction) { return vector_add(lhs, vector_scale(vector_subtract(rhs, lhs), fraction)); } #endif