#ifndef V3F_H #define V3F_H V3F v3f(F32 x, F32 y, F32 z) { V3F result = { x, y, z }; return(result); } V3F v3f_zero() { V3F result = { 0.0f, 0.0f, 0.0f }; return(result); } V3F v3f_one() { V3F result = { 1.0f, 1.0f, 1.0f }; return(result); } V3F v3f_negate(V3F a) { V3F result = { -a.x, -a.y, -a.z }; return(result); } V3F v3f_add(V3F a, V3F b) { V3F result = { a.x+b.x, a.y+b.y, a.z+b.z }; return(result); } V3F v3f_sub(V3F a, V3F b) { V3F result = { a.x-b.x, a.y-b.y, a.z-b.z }; return(result); } V3F v3f_scalef(V3F a, F32 scale) { V3F result = { a.x*scale, a.y*scale, a.z*scale }; return(result); } V3F v3f_scalev(V3F a, V3F scale) { V3F result = { a.x*scale.x, a.y*scale.y, a.z*scale.z }; return(result); } F32 v3f_length2(V3F a) { F32 result = a.x*a.x+a.y*a.y+a.z*a.z; return(result); } F32 v3f_length(V3F a) { F32 result = f32_sqrt(v3f_length2(a)); return(result); } V3F v3f_norm(V3F a) { F32 length = v3f_length(a); V3F result = v3f_zero(); if (length) { result = v3f(a.x/length, a.y/length, a.z/length); } return(result); } V3F v3f_dot(V3F a, V3F b) { V3F result; result.x = a.x*b.x; result.y = a.y*b.y; result.z = a.z*b.z; return(result); } V3F v3f_cross(V3F left, V3F right) { V3F result; result.x = (left.y*right.z-right.y*left.z); result.y = (right.x*left.z-left.x*right.z); result.z = (left.x*right.y-right.x*left.y); return(result); } void v3f_print(V3F a) { printf("[%4.4f\n%4.4f\n%4.4f]\n\n", a.x, a.y, a.z); } #endif /* V3F_H */