9ray/vec3.h

92 lines
1.3 KiB
C
Executable File

#ifndef VEC3_H
#define VEC3_H
#include <u.h>
#include <libc.h>
typedef struct vec3 vec3;
struct vec3
{
double e[3];
};
inline double
length_sq(vec3 v)
{
return v.e[0]*v.e[0] + v.e[1]*v.e[1] + v.e[2]*v.e[2];
}
inline double
length(vec3 v)
{
return sqrt(length_sq(v));
}
inline vec3
vecscale(double t, vec3 v)
{
vec3 o = {t*v.e[0], t*v.e[1], t*v.e[2]};
return o;
}
inline vec3
vecadd(vec3 v1, vec3 v2)
{
vec3 o = {v1.e[0] + v2.e[0], v1.e[1] + v2.e[1], v1.e[2] + v2.e[2]};
return o;
}
inline vec3
vecsub(vec3 v1, vec3 v2)
{
vec3 o = {v1.e[0] - v2.e[0], v1.e[1] - v2.e[1], v1.e[2] - v2.e[2]};
return o;
}
inline vec3
vecmul(vec3 v1, vec3 v2)
{
vec3 o = {v1.e[0] * v2.e[0], v1.e[1] * v2.e[1], v1.e[2] * v2.e[2]};
return o;
}
inline double
dot(vec3 u, vec3 v)
{
return u.e[0] * v.e[0] + u.e[1] * v.e[1] + u.e[2] * v.e[2];
}
inline vec3
cross(vec3 u, vec3 v)
{
vec3 o = {(u.e[1] * v.e[2] - u.e[2] * v.e[1]),
(u.e[2] * v.e[0] - u.e[0] * v.e[2]),
(u.e[0] * v.e[1] - u.e[1] * v.e[0])};
return o;
}
inline vec3
unit_vector(vec3 v)
{
double len = length(v);
return vecscale((1/len), v);
}
inline vec3
color(double r, double g, double b)
{
vec3 o = {r, g, b};
return o;
}
inline vec3
point3(double x, double y, double z)
{
vec3 o = color(x, y, z);
return o;
}
#endif