92 lines
1.3 KiB
C
Executable File
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
|