basic z-buffering

This commit is contained in:
opfez 2021-11-23 16:13:34 +01:00
parent 315808a012
commit 438ac43ff5
6 changed files with 4042 additions and 203 deletions

View File

@ -1,44 +0,0 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
o Cube
v 1.000000 1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 1.000000
vt 0.875000 0.500000
vt 0.625000 0.750000
vt 0.625000 0.500000
vt 0.375000 1.000000
vt 0.375000 0.750000
vt 0.625000 0.000000
vt 0.375000 0.250000
vt 0.375000 0.000000
vt 0.375000 0.500000
vt 0.125000 0.750000
vt 0.125000 0.500000
vt 0.625000 0.250000
vt 0.875000 0.750000
vt 0.625000 1.000000
vn 0.0000 1.0000 0.0000
vn 0.0000 0.0000 1.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 -1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn 0.0000 0.0000 -1.0000
s off
f 5/1/1 3/2/1 1/3/1
f 3/2/2 8/4/2 4/5/2
f 7/6/3 6/7/3 8/8/3
f 2/9/4 8/10/4 6/11/4
f 1/3/5 4/5/5 2/9/5
f 5/12/6 2/9/6 6/7/6
f 5/1/1 7/13/1 3/2/1
f 3/2/2 7/14/2 8/4/2
f 7/6/3 5/12/3 6/7/3
f 2/9/4 4/5/4 8/10/4
f 1/3/5 3/2/5 4/5/5
f 5/12/6 1/3/6 2/9/6

264
main.c
View File

@ -17,6 +17,15 @@
#define H 600
#define PI 3.14159265358979323844
int oddframe = 1;
typedef struct {
int bit;
int32_t value;
} zval;
zval zbuffer[W*H] = {0};
int wireframe = 1;
void
@ -39,14 +48,6 @@ typedef struct {
rgb *canvas;
} sdl_state;
typedef struct {
vec2 a, b, c;
} triangle2;
typedef struct {
vec3 a, b, c;
} triangle3;
typedef struct {
uint32_t vertex_num;
uint32_t tri_num; /* for loops */
@ -55,8 +56,9 @@ typedef struct {
uint32_t *indices;
} mesh;
camera
new_camera(double znear, vec3 pos, vec3 up, double yaw, double pitch)
new_camera(scalar znear, vec3 pos, vec3 up, scalar yaw, scalar pitch)
{
camera ret = {
.znear = znear,
@ -154,9 +156,9 @@ void free_mesh(mesh mesh) { free(mesh.vertices); free(mesh.indices); }
#define clamp(x, min, max) (((x) >= (min)) ? ((x) <= (max)) ? (x) : (max) : (min))
void
swapd(double *a, double *b)
swapd(scalar *a, scalar *b)
{
double tmp = *a;
scalar tmp = *a;
*a = *b;
*b = tmp;
}
@ -313,15 +315,44 @@ draw_line(rgb canvas[], rgb c, vec2 p0, vec2 p1)
}
void
draw_horizontal_line(rgb canvas[], rgb c, int32_t x0, int32_t x1, int32_t y)
draw_horizontal_line(
rgb canvas[],
rgb c,
int32_t x0,
int32_t x1,
int32_t z0,
int32_t z1,
int32_t y
)
{
if (y < 0) return;
if (x0 < 0) x0 = 0;
if (x1 >= W) x1 = W - 1;
if (y >= H) return;
for (int32_t x = x0; x <= x1; x++)
canvas[x + y * W] = c;
int32_t z = z0;
int32_t dz = abs(z0 - z1);
int32_t dx = abs(x0 - x1);
int32_t z_change = z0 < z1 ? 1 : -1;
int32_t eps = 0;
if (dx < 1) return;
for (int32_t x = x0; x <= x1; x++) {
eps += dz;
while (eps > 0) {
eps -= dx;
z += z_change;
}
size_t i = x + y * W;
if (zbuffer[i].bit != oddframe || zbuffer[i].value < z) {
canvas[i] = c;
zbuffer[i].value = z;
zbuffer[i].bit = oddframe;
}
}
}
void
@ -333,7 +364,7 @@ draw_triangle(rgb canvas[], rgb col, triangle2 tri)
}
void
fill_bottom_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
fill_bottom_flat_triangle(rgb canvas[], rgb c, triangle3 tri)
{
if (tri.b.x > tri.c.x)
swapd(&tri.b.x, &tri.c.x);
@ -349,7 +380,10 @@ fill_bottom_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
cx = (int32_t)tri.c.x,
ay = (int32_t)tri.a.y,
by = (int32_t)tri.b.y,
cy = (int32_t)tri.c.y;
cy = (int32_t)tri.c.y,
az = (int32_t)tri.a.z,
bz = (int32_t)tri.b.z,
cz = (int32_t)tri.c.z;
assert(ay <= cy);
assert(ay <= by);
@ -358,34 +392,52 @@ fill_bottom_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
int32_t dx_right = abs(cx - ax);
int32_t dy_right = abs(cy - ay);
int32_t dz_right = abs(cz - az);
int32_t dx_left = abs(bx - ax);
int32_t dy_left = abs(by - ay);
int32_t dz_left = abs(bz - az);
int32_t eps_r = 0;
int32_t eps_l = 0;
int32_t eps_rx = 0;
int32_t eps_lx = 0;
int32_t eps_rz = 0;
int32_t eps_lz = 0;
int32_t xr = ax;
int32_t xl = ax;
int32_t zr = az;
int32_t zl = az;
int32_t xr_change = ax < cx ? 1 : -1;
int32_t xl_change = ax < bx ? 1 : -1;
int32_t zr_change = az < cz ? 1 : -1;
int32_t zl_change = az < bz ? 1 : -1;
for (int32_t y = ay; y < by; y++) {
eps_r += dx_right;
eps_l += dx_left;
while (eps_r > 0) {
eps_r -= dy_right;
eps_rx += dx_right;
eps_lx += dx_left;
eps_rz += dz_right;
eps_lz += dz_left;
while (eps_rx > 0) {
eps_rx -= dy_right;
xr += xr_change;
}
while (eps_l > 0) {
eps_l -= dy_left;
while (eps_lx > 0) {
eps_lx -= dy_left;
xl += xl_change;
}
draw_horizontal_line(canvas, c, xl, xr, y);
while (eps_rz > 0) {
eps_rz -= dy_right;
zr += zr_change;
}
while (eps_lz > 0) {
eps_lz -= dy_left;
zl += zl_change;
}
draw_horizontal_line(canvas, c, xl, xr, zl, zr, y);
}
}
void
fill_top_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
fill_top_flat_triangle(rgb canvas[], rgb c, triangle3 tri)
{
if (tri.a.x > tri.b.x)
swapd(&tri.a.x, &tri.b.x);
@ -401,7 +453,10 @@ fill_top_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
cx = (int32_t)tri.c.x,
ay = (int32_t)tri.a.y,
by = (int32_t)tri.b.y,
cy = (int32_t)tri.c.y;
cy = (int32_t)tri.c.y,
az = (int32_t)tri.a.z,
bz = (int32_t)tri.b.z,
cz = (int32_t)tri.c.z;
assert(cy >= ay);
assert(cy >= by);
@ -410,41 +465,59 @@ fill_top_flat_triangle(rgb canvas[], rgb c, triangle2 tri)
int32_t dx_right = abs(cx - bx);
int32_t dy_right = abs(cy - by);
int32_t dz_right = abs(cz - bz);
int32_t dx_left = abs(cx - ax);
int32_t dy_left = abs(cy - ay);
int32_t dz_left = abs(cz - az);
int32_t eps_r = 0;
int32_t eps_l = 0;
int32_t eps_rx = 0;
int32_t eps_lx = 0;
int32_t eps_rz = 0;
int32_t eps_lz = 0;
int32_t xr = cx;
int32_t xl = cx;
int32_t zr = cz;
int32_t zl = cz;
int32_t xr_change = cx < bx ? 1 : -1;
int32_t xl_change = cx < ax ? 1 : -1;
int32_t zr_change = cx < bz ? 1 : -1;
int32_t zl_change = cx < az ? 1 : -1;
int32_t y;
for (y = cy-1; y > by; y--) {
eps_r += dx_right;
eps_l += dx_left;
while (eps_r > 0) {
eps_r -= dy_right;
eps_rx += dx_right;
eps_lx += dx_left;
eps_rz += dz_right;
eps_lz += dz_left;
while (eps_rx > 0) {
eps_rx -= dy_right;
xr += xr_change;
}
while (eps_l > 0) {
eps_l -= dy_left;
while (eps_lx > 0) {
eps_lx -= dy_left;
xl += xl_change;
}
draw_horizontal_line(canvas, c, xl, xr, y);
while (eps_rz > 0) {
eps_rz -= dy_right;
zr += zr_change;
}
while (eps_lz > 0) {
eps_lz -= dy_left;
zl += zl_change;
}
draw_horizontal_line(canvas, c, xl, xr, zl, zr, y);
}
/* We're missing one line, but setting the loop conditional to be y >= by
* messes up the drawing.
*/
draw_horizontal_line(canvas, c, xl, xr, y);
draw_horizontal_line(canvas, c, xl, xr, zl, zr, y);
}
/* http://www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html */
void
fill_triangle(rgb canvas[], rgb c, triangle2 tri)
fill_triangle(rgb canvas[], rgb c, triangle3 tri)
{
/* tri.a <= tri.b <= tri.c */
if (tri.b.y < tri.a.y) {
@ -468,19 +541,20 @@ fill_triangle(rgb canvas[], rgb c, triangle2 tri)
fill_top_flat_triangle(canvas, c, tri);
}
else {
vec2 trid = {
vec3 trid = {
(tri.a.x + (tri.b.y - tri.a.y) / (tri.c.y - tri.a.y) * (tri.c.x - tri.a.x)),
tri.b.y};
tri.b.y,
tri.b.z};
if (tri.a.y > tri.b.y) {
swapd(&tri.a.y, &tri.b.y);
swapd(&tri.a.x, &tri.b.x);
}
fill_top_flat_triangle(canvas, c, (triangle2) {
fill_top_flat_triangle(canvas, c, (triangle3) {
tri.b, trid, tri.c
});
fill_bottom_flat_triangle(canvas, c, (triangle2) {
fill_bottom_flat_triangle(canvas, c, (triangle3) {
tri.a, tri.b, trid
});
}
@ -506,18 +580,22 @@ view_matricize(camera c, vec3 v)
vec2
project(camera c, vec3 u)
{
double r = c.znear / (u.z);
scalar r = c.znear / (u.z);
return (vec2){(W / 2) * (u.x * r + 1), (H / 2) * (r * (-u.y) + 1) * (800.0 / 600.0)};
}
triangle2
project_triangle(camera c, triangle3 tri)
triangle3
project_triangle(camera cam, triangle3 tri)
{
return (triangle2) {
.a = project(c, tri.a),
.b = project(c, tri.b),
.c = project(c, tri.c),
vec2 a = project(cam, tri.a);
vec2 b = project(cam, tri.b);
vec2 c = project(cam, tri.c);
return (triangle3) {
.a = (vec3){a.x,a.y,tri.a.z},
.b = (vec3){b.x,b.y,tri.b.z},
.c = (vec3){c.x,c.y,tri.c.z},
};
}
@ -545,13 +623,13 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
{
for (uint32_t i = 0; i < mesh.tri_num; i++) {
vec3 v0 = mesh.vertices[mesh.indices[3*i ]],
v1 = mesh.vertices[mesh.indices[3*i+1]],
v2 = mesh.vertices[mesh.indices[3*i+2]];
v1 = mesh.vertices[mesh.indices[3*i+1]],
v2 = mesh.vertices[mesh.indices[3*i+2]];
vec3 norm = vec3_normalize(
vec3_cross(vec3_sub(v1, v0), vec3_sub(v2, v0))
);
double x = vec3_dot(vec3_sub(v0, c.pos), norm);
scalar x = vec3_dot(vec3_sub(v0, c.pos), norm);
vec3 us[3] = {view_matricize(c, v0), view_matricize(c, v1), view_matricize(c, v2)};
int skip_triangle = 0;
@ -562,27 +640,22 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
if (!skip_triangle) {
if (wireframe) {
if (x < 0)
draw_triangle(canvas, col, project_triangle(c, (triangle3) {
us[0], us[1], us[2]
}));
/* else */
/* draw_triangle(canvas, */
/* (rgb) { */
/* .r = col.r * 0.2, */
/* .g = col.g * 0.2, */
/* .b = col.b * 0.2, */
/* .a = col.a */
/* }, */
/* project_triangle(c, (triangle3) { */
/* v0, v1, v2 */
/* })); */
if (x < 0) {
triangle3 projected = project_triangle(c, (triangle3) {
us[0], us[1], us[2]
});
draw_triangle(canvas, col, (triangle2){
(vec2){projected.a.x,projected.a.y},
(vec2){projected.b.x,projected.b.y},
(vec2){projected.c.x,projected.c.y}});
}
}
else {
if (x < 0) {
double col_mod = clamp(
scalar col_mod = clamp(
vec3_dot(norm, vec3_normalize((vec3){2,2,2})),
0.0, 1.0);
0.0, 1.0
);
fill_triangle(canvas,
(rgb) {
.r = col.r * col_mod,
@ -598,14 +671,14 @@ draw_mesh(rgb canvas[], rgb col, camera c, mesh mesh)
}
}
double
to_deg(double deg)
scalar
to_deg(scalar deg)
{
return deg * 2 * PI / 360.0;
}
mat3x3
x_rotation(double deg)
x_rotation(scalar deg)
{
return (mat3x3) {
.nums =
@ -616,7 +689,7 @@ x_rotation(double deg)
}
mat3x3
y_rotation(double deg)
y_rotation(scalar deg)
{
return (mat3x3) {
.nums =
@ -627,7 +700,7 @@ y_rotation(double deg)
}
mat3x3
z_rotation(double deg)
z_rotation(scalar deg)
{
return (mat3x3) {
.nums =
@ -637,27 +710,28 @@ z_rotation(double deg)
};
}
#include "other.h"
/* #include "other.h" */
int
main(void)
{
sdl_state state = init_sdl();
camera cam = new_camera(-1.0, (vec3){0, 1, 30}, UP, PI/2, 0.0);
print_camera(cam);
camera cam = new_camera(-1.0, (vec3){0, 1, 30}, UP, PI, 0.0);
SDL_Event event;
const mesh iso = load_mesh("iso.mod");
mesh iso_copy = copy_mesh(iso);
const mesh plane = load_mesh("plane.mod");
mesh plane_copy = copy_mesh(plane);
/* const mesh iso = load_mesh("resources/iso.mod"); */
/* mesh iso_copy = copy_mesh(iso); */
/* const mesh plane = load_mesh("resources/plane.mod"); */
/* mesh plane_copy = copy_mesh(plane); */
const mesh monkey = load_mesh("resources/monkey.mod");
mesh monkey_copy = copy_mesh(monkey);
uint64_t t = 0;
double rot_speed = 0.6;
scalar rot_speed = 0.6;
for (;;) {
double elapsed, start = SDL_GetPerformanceCounter();
scalar elapsed, start = SDL_GetPerformanceCounter();
mat3x3 rotation = mat3x3_mul(
mat3x3_mul(
@ -667,18 +741,19 @@ main(void)
clear_canvas(state.canvas, (rgb){7, 7, 7, 255});
for (size_t i = 0; i < iso.vertex_num; i++) {
iso_copy.vertices[i] = vec3_mat3x3_mul(iso.vertices[i], rotation);
}
/* for (size_t i = 0; i < iso.vertex_num; i++) { */
/* iso_copy.vertices[i] = vec3_mat3x3_mul(iso.vertices[i], rotation); */
/* } */
draw_mesh(state.canvas, WHITE, cam, plane_copy);
draw_mesh(state.canvas, WHITE, cam, iso_copy);
/* draw_mesh(state.canvas, WHITE, cam, plane_copy); */
/* draw_mesh(state.canvas, WHITE, cam, iso_copy); */
draw_mesh(state.canvas, WHITE, cam, monkey_copy);
render(state);
/* continuous keyboard events */
const uint8_t *keyboard = SDL_GetKeyboardState(NULL);
double velocity = 0.1;
scalar velocity = 0.1;
if (keyboard[SDL_SCANCODE_W]) {
cam.pos = vec3_sub(cam.pos, vec3_scalar_mul(cam.front, velocity));
}
@ -722,12 +797,15 @@ main(void)
SDL_Delay(clamp(16.666f - elapsed, 0, 1000));
t++;
oddframe = !oddframe;
}
quit:
free_mesh(iso);
free_mesh(iso_copy);
free_mesh(plane);
free_mesh(plane_copy);
/* free_mesh(iso); */
/* free_mesh(iso_copy); */
/* free_mesh(plane); */
/* free_mesh(plane_copy); */
free_mesh(monkey);
free_mesh(monkey_copy);
free_sdl(state);
}

View File

@ -1,48 +1,48 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
o Icosphere_Icosphere.001
v 0.000000 -1.000000 0.000000
v 0.723607 -0.447220 0.525725
v -0.276388 -0.447220 0.850649
v -0.894426 -0.447216 0.000000
v -0.276388 -0.447220 -0.850649
v 0.723607 -0.447220 -0.525725
v 0.276388 0.447220 0.850649
v -0.723607 0.447220 0.525725
v -0.723607 0.447220 -0.525725
v 0.276388 0.447220 -0.850649
v 0.894426 0.447216 0.000000
o Icosphere_Icosphere.002
v 0.000000 1.000000 0.000000
v -0.162456 -0.850654 0.499995
v 0.425323 -0.850654 0.309011
v 0.262869 -0.525738 0.809012
v 0.850648 -0.525736 0.000000
v 0.425323 -0.850654 -0.309011
v -0.525730 -0.850652 0.000000
v -0.688189 -0.525736 0.499997
v -0.162456 -0.850654 -0.499995
v -0.688189 -0.525736 -0.499997
v 0.262869 -0.525738 -0.809012
v 0.951058 0.000000 0.309013
v 0.951058 0.000000 -0.309013
v 0.000000 0.000000 1.000000
v 0.587786 0.000000 0.809017
v -0.951058 0.000000 0.309013
v -0.587786 0.000000 0.809017
v -0.587786 0.000000 -0.809017
v -0.951058 0.000000 -0.309013
v 0.587786 0.000000 -0.809017
v 0.000000 0.000000 -1.000000
v 0.688189 0.525736 0.499997
v -0.262869 0.525738 0.809012
v -0.850648 0.525736 0.000000
v -0.262869 0.525738 -0.809012
v 0.688189 0.525736 -0.499997
v 0.162456 0.850654 0.499995
v 0.525730 0.850652 0.000000
v -0.425323 0.850654 0.309011
v -0.425323 0.850654 -0.309011
v 0.162456 0.850654 -0.499995
v 0.723607 1.552781 0.525725
v -0.276388 1.552780 0.850649
v -0.894426 1.552784 0.000000
v -0.276388 1.552780 -0.850649
v 0.723607 1.552781 -0.525725
v 0.276388 2.447220 0.850649
v -0.723607 2.447220 0.525725
v -0.723607 2.447220 -0.525725
v 0.276388 2.447220 -0.850649
v 0.894426 2.447216 0.000000
v 0.000000 3.000000 0.000000
v -0.162456 1.149346 0.499995
v 0.425323 1.149346 0.309011
v 0.262869 1.474262 0.809012
v 0.850648 1.474264 0.000000
v 0.425323 1.149346 -0.309011
v -0.525730 1.149348 0.000000
v -0.688189 1.474264 0.499997
v -0.162456 1.149346 -0.499995
v -0.688189 1.474264 -0.499997
v 0.262869 1.474262 -0.809012
v 0.951058 2.000000 0.309013
v 0.951058 2.000000 -0.309013
v 0.000000 2.000000 1.000000
v 0.587786 2.000000 0.809017
v -0.951058 2.000000 0.309013
v -0.587786 2.000000 0.809017
v -0.587786 2.000000 -0.809017
v -0.951058 2.000000 -0.309013
v 0.587786 2.000000 -0.809017
v 0.000000 2.000000 -1.000000
v 0.688189 2.525736 0.499997
v -0.262869 2.525738 0.809012
v -0.850648 2.525736 0.000000
v -0.262869 2.525738 -0.809012
v 0.688189 2.525736 -0.499997
v 0.162456 2.850654 0.499995
v 0.525730 2.850652 0.000000
v -0.425323 2.850654 0.309011
v -0.425323 2.850654 -0.309011
v 0.162456 2.850654 -0.499995
vt 0.181819 0.000000
vt 0.227273 0.078731
vt 0.136365 0.078731

2977
resources/monkey.obj Normal file

File diff suppressed because it is too large Load Diff

815
resources/plane.obj Normal file
View File

@ -0,0 +1,815 @@
# Blender v2.93.5 OBJ File: ''
# www.blender.org
o Plane
v -15.000000 -0.000001 17.000000
v -17.000000 -0.000001 15.000000
v -17.000000 -0.000001 17.000000
v -11.000000 -0.000001 17.000000
v -13.000000 -0.000001 15.000000
v -13.000000 -0.000001 17.000000
v -7.000000 -0.000001 17.000000
v -9.000000 -0.000001 15.000000
v -9.000000 -0.000001 17.000000
v -3.000000 -0.000001 17.000000
v -5.000000 -0.000001 15.000000
v -5.000000 -0.000001 17.000000
v 1.000000 -0.000001 17.000000
v -1.000000 -0.000001 15.000000
v -1.000000 -0.000001 17.000000
v 5.000000 -0.000001 17.000000
v 3.000000 -0.000001 15.000000
v 3.000000 -0.000001 17.000000
v 9.000000 -0.000001 17.000000
v 7.000000 -0.000001 15.000000
v 7.000000 -0.000001 17.000000
v 13.000000 -0.000001 17.000000
v 11.000000 -0.000001 15.000000
v 11.000000 -0.000001 17.000000
v 17.000000 -0.000001 17.000000
v 15.000000 -0.000001 15.000000
v 15.000000 -0.000001 17.000000
v -15.000000 -0.000001 13.000000
v -17.000000 -0.000000 11.000000
v -17.000000 -0.000001 13.000000
v -11.000000 -0.000001 13.000000
v -13.000000 -0.000000 11.000000
v -13.000000 -0.000001 13.000000
v -7.000000 -0.000001 13.000000
v -9.000000 -0.000000 11.000000
v -9.000000 -0.000001 13.000000
v -3.000000 -0.000001 13.000000
v -5.000000 -0.000000 11.000000
v -5.000000 -0.000001 13.000000
v 1.000000 -0.000001 13.000000
v -1.000000 -0.000000 11.000000
v -1.000000 -0.000001 13.000000
v 5.000000 -0.000001 13.000000
v 3.000000 -0.000000 11.000000
v 3.000000 -0.000001 13.000000
v 9.000000 -0.000001 13.000000
v 7.000000 -0.000000 11.000000
v 7.000000 -0.000001 13.000000
v 13.000000 -0.000001 13.000000
v 11.000000 -0.000000 11.000000
v 11.000000 -0.000001 13.000000
v 17.000000 -0.000001 13.000000
v 15.000000 -0.000000 11.000000
v 15.000000 -0.000001 13.000000
v -15.000000 -0.000000 9.000000
v -17.000000 -0.000000 7.000000
v -17.000000 -0.000000 9.000000
v -11.000000 -0.000000 9.000000
v -13.000000 -0.000000 7.000000
v -13.000000 -0.000000 9.000000
v -7.000000 -0.000000 9.000000
v -9.000000 -0.000000 7.000000
v -9.000000 -0.000000 9.000000
v -3.000000 -0.000000 9.000000
v -5.000000 -0.000000 7.000000
v -5.000000 -0.000000 9.000000
v 1.000000 -0.000000 9.000000
v -1.000000 -0.000000 7.000000
v -1.000000 -0.000000 9.000000
v 5.000000 -0.000000 9.000000
v 3.000000 -0.000000 7.000000
v 3.000000 -0.000000 9.000000
v 9.000000 -0.000000 9.000000
v 7.000000 -0.000000 7.000000
v 7.000000 -0.000000 9.000000
v 13.000000 -0.000000 9.000000
v 11.000000 -0.000000 7.000000
v 11.000000 -0.000000 9.000000
v 17.000000 -0.000000 9.000000
v 15.000000 -0.000000 7.000000
v 15.000000 -0.000000 9.000000
v -15.000000 -0.000000 5.000000
v -17.000000 -0.000000 3.000000
v -17.000000 -0.000000 5.000000
v -11.000000 -0.000000 5.000000
v -13.000000 -0.000000 3.000000
v -13.000000 -0.000000 5.000000
v -7.000000 -0.000000 5.000000
v -9.000000 -0.000000 3.000000
v -9.000000 -0.000000 5.000000
v -3.000000 -0.000000 5.000000
v -5.000000 -0.000000 3.000000
v -5.000000 -0.000000 5.000000
v 1.000000 -0.000000 5.000000
v -1.000000 -0.000000 3.000000
v -1.000000 -0.000000 5.000000
v 5.000000 -0.000000 5.000000
v 3.000000 -0.000000 3.000000
v 3.000000 -0.000000 5.000000
v 9.000000 -0.000000 5.000000
v 7.000000 -0.000000 3.000000
v 7.000000 -0.000000 5.000000
v 13.000000 -0.000000 5.000000
v 11.000000 -0.000000 3.000000
v 11.000000 -0.000000 5.000000
v 17.000000 -0.000000 5.000000
v 15.000000 -0.000000 3.000000
v 15.000000 -0.000000 5.000000
v -15.000000 -0.000000 1.000000
v -17.000000 0.000000 -1.000000
v -17.000000 -0.000000 1.000000
v -11.000000 -0.000000 1.000000
v -13.000000 0.000000 -1.000000
v -13.000000 -0.000000 1.000000
v -7.000000 -0.000000 1.000000
v -9.000000 0.000000 -1.000000
v -9.000000 -0.000000 1.000000
v -3.000000 -0.000000 1.000000
v -5.000000 0.000000 -1.000000
v -5.000000 -0.000000 1.000000
v 1.000000 -0.000000 1.000000
v -1.000000 0.000000 -1.000000
v -1.000000 -0.000000 1.000000
v 5.000000 -0.000000 1.000000
v 3.000000 0.000000 -1.000000
v 3.000000 -0.000000 1.000000
v 9.000000 -0.000000 1.000000
v 7.000000 0.000000 -1.000000
v 7.000000 -0.000000 1.000000
v 13.000000 -0.000000 1.000000
v 11.000000 0.000000 -1.000000
v 11.000000 -0.000000 1.000000
v 17.000000 -0.000000 1.000000
v 15.000000 0.000000 -1.000000
v 15.000000 -0.000000 1.000000
v -15.000000 0.000000 -3.000000
v -17.000000 0.000000 -5.000000
v -17.000000 0.000000 -3.000000
v -11.000000 0.000000 -3.000000
v -13.000000 0.000000 -5.000000
v -13.000000 0.000000 -3.000000
v -7.000000 0.000000 -3.000000
v -9.000000 0.000000 -5.000000
v -9.000000 0.000000 -3.000000
v -3.000000 0.000000 -3.000000
v -5.000000 0.000000 -5.000000
v -5.000000 0.000000 -3.000000
v 1.000000 0.000000 -3.000000
v -1.000000 0.000000 -5.000000
v -1.000000 0.000000 -3.000000
v 5.000000 0.000000 -3.000000
v 3.000000 0.000000 -5.000000
v 3.000000 0.000000 -3.000000
v 9.000000 0.000000 -3.000000
v 7.000000 0.000000 -5.000000
v 7.000000 0.000000 -3.000000
v 13.000000 0.000000 -3.000000
v 11.000000 0.000000 -5.000000
v 11.000000 0.000000 -3.000000
v 17.000000 0.000000 -3.000000
v 15.000000 0.000000 -5.000000
v 15.000000 0.000000 -3.000000
v -15.000000 0.000000 -7.000000
v -17.000000 0.000000 -9.000000
v -17.000000 0.000000 -7.000000
v -11.000000 0.000000 -7.000000
v -13.000000 0.000000 -9.000000
v -13.000000 0.000000 -7.000000
v -7.000000 0.000000 -7.000000
v -9.000000 0.000000 -9.000000
v -9.000000 0.000000 -7.000000
v -3.000000 0.000000 -7.000000
v -5.000000 0.000000 -9.000000
v -5.000000 0.000000 -7.000000
v 1.000000 0.000000 -7.000000
v -1.000000 0.000000 -9.000000
v -1.000000 0.000000 -7.000000
v 5.000000 0.000000 -7.000000
v 3.000000 0.000000 -9.000000
v 3.000000 0.000000 -7.000000
v 9.000000 0.000000 -7.000000
v 7.000000 0.000000 -9.000000
v 7.000000 0.000000 -7.000000
v 13.000000 0.000000 -7.000000
v 11.000000 0.000000 -9.000000
v 11.000000 0.000000 -7.000000
v 17.000000 0.000000 -7.000000
v 15.000000 0.000000 -9.000000
v 15.000000 0.000000 -7.000000
v -15.000000 0.000000 -11.000000
v -17.000000 0.000001 -13.000000
v -17.000000 0.000000 -11.000000
v -11.000000 0.000000 -11.000000
v -13.000000 0.000001 -13.000000
v -13.000000 0.000000 -11.000000
v -7.000000 0.000000 -11.000000
v -9.000000 0.000001 -13.000000
v -9.000000 0.000000 -11.000000
v -3.000000 0.000000 -11.000000
v -5.000000 0.000001 -13.000000
v -5.000000 0.000000 -11.000000
v 1.000000 0.000000 -11.000000
v -1.000000 0.000001 -13.000000
v -1.000000 0.000000 -11.000000
v 5.000000 0.000000 -11.000000
v 3.000000 0.000001 -13.000000
v 3.000000 0.000000 -11.000000
v 9.000000 0.000000 -11.000000
v 7.000000 0.000001 -13.000000
v 7.000000 0.000000 -11.000000
v 13.000000 0.000000 -11.000000
v 11.000000 0.000001 -13.000000
v 11.000000 0.000000 -11.000000
v 17.000000 0.000000 -11.000000
v 15.000000 0.000001 -13.000000
v 15.000000 0.000000 -11.000000
v -15.000000 0.000001 -15.000000
v -17.000000 0.000001 -17.000000
v -17.000000 0.000001 -15.000000
v -11.000000 0.000001 -15.000000
v -13.000000 0.000001 -17.000000
v -13.000000 0.000001 -15.000000
v -7.000000 0.000001 -15.000000
v -9.000000 0.000001 -17.000000
v -9.000000 0.000001 -15.000000
v -3.000000 0.000001 -15.000000
v -5.000000 0.000001 -17.000000
v -5.000000 0.000001 -15.000000
v 1.000000 0.000001 -15.000000
v -1.000000 0.000001 -17.000000
v -1.000000 0.000001 -15.000000
v 5.000000 0.000001 -15.000000
v 3.000000 0.000001 -17.000000
v 3.000000 0.000001 -15.000000
v 9.000000 0.000001 -15.000000
v 7.000000 0.000001 -17.000000
v 7.000000 0.000001 -15.000000
v 13.000000 0.000001 -15.000000
v 11.000000 0.000001 -17.000000
v 11.000000 0.000001 -15.000000
v 17.000000 0.000001 -15.000000
v 15.000000 0.000001 -17.000000
v 15.000000 0.000001 -15.000000
v -15.000000 -0.000001 15.000000
v -11.000000 -0.000001 15.000000
v -7.000000 -0.000001 15.000000
v -3.000000 -0.000001 15.000000
v 1.000000 -0.000001 15.000000
v 5.000000 -0.000001 15.000000
v 9.000000 -0.000001 15.000000
v 13.000000 -0.000001 15.000000
v 17.000000 -0.000001 15.000000
v -15.000000 -0.000000 11.000000
v -11.000000 -0.000000 11.000000
v -7.000000 -0.000000 11.000000
v -3.000000 -0.000000 11.000000
v 1.000000 -0.000000 11.000000
v 5.000000 -0.000000 11.000000
v 9.000000 -0.000000 11.000000
v 13.000000 -0.000000 11.000000
v 17.000000 -0.000000 11.000000
v -15.000000 -0.000000 7.000000
v -11.000000 -0.000000 7.000000
v -7.000000 -0.000000 7.000000
v -3.000000 -0.000000 7.000000
v 1.000000 -0.000000 7.000000
v 5.000000 -0.000000 7.000000
v 9.000000 -0.000000 7.000000
v 13.000000 -0.000000 7.000000
v 17.000000 -0.000000 7.000000
v -15.000000 -0.000000 3.000000
v -11.000000 -0.000000 3.000000
v -7.000000 -0.000000 3.000000
v -3.000000 -0.000000 3.000000
v 1.000000 -0.000000 3.000000
v 5.000000 -0.000000 3.000000
v 9.000000 -0.000000 3.000000
v 13.000000 -0.000000 3.000000
v 17.000000 -0.000000 3.000000
v -15.000000 0.000000 -1.000000
v -11.000000 0.000000 -1.000000
v -7.000000 0.000000 -1.000000
v -3.000000 0.000000 -1.000000
v 1.000000 0.000000 -1.000000
v 5.000000 0.000000 -1.000000
v 9.000000 0.000000 -1.000000
v 13.000000 0.000000 -1.000000
v 17.000000 0.000000 -1.000000
v -15.000000 0.000000 -5.000000
v -11.000000 0.000000 -5.000000
v -7.000000 0.000000 -5.000000
v -3.000000 0.000000 -5.000000
v 1.000000 0.000000 -5.000000
v 5.000000 0.000000 -5.000000
v 9.000000 0.000000 -5.000000
v 13.000000 0.000000 -5.000000
v 17.000000 0.000000 -5.000000
v -15.000000 0.000000 -9.000000
v -11.000000 0.000000 -9.000000
v -7.000000 0.000000 -9.000000
v -3.000000 0.000000 -9.000000
v 1.000000 0.000000 -9.000000
v 5.000000 0.000000 -9.000000
v 9.000000 0.000000 -9.000000
v 13.000000 0.000000 -9.000000
v 17.000000 0.000000 -9.000000
v -15.000000 0.000001 -13.000000
v -11.000000 0.000001 -13.000000
v -7.000000 0.000001 -13.000000
v -3.000000 0.000001 -13.000000
v 1.000000 0.000001 -13.000000
v 5.000000 0.000001 -13.000000
v 9.000000 0.000001 -13.000000
v 13.000000 0.000001 -13.000000
v 17.000000 0.000001 -13.000000
v -15.000000 0.000001 -17.000000
v -11.000000 0.000001 -17.000000
v -7.000000 0.000001 -17.000000
v -3.000000 0.000001 -17.000000
v 1.000000 0.000001 -17.000000
v 5.000000 0.000001 -17.000000
v 9.000000 0.000001 -17.000000
v 13.000000 0.000001 -17.000000
v 17.000000 0.000001 -17.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vt 1.000000 1.000000
vn 0.0000 1.0000 0.0000
s 1
f 1/1/1 2/2/1 3/3/1
f 4/4/1 5/5/1 6/6/1
f 7/7/1 8/8/1 9/9/1
f 10/10/1 11/11/1 12/12/1
f 13/13/1 14/14/1 15/15/1
f 16/16/1 17/17/1 18/18/1
f 19/19/1 20/20/1 21/21/1
f 22/22/1 23/23/1 24/24/1
f 25/25/1 26/26/1 27/27/1
f 28/28/1 29/29/1 30/30/1
f 31/31/1 32/32/1 33/33/1
f 34/34/1 35/35/1 36/36/1
f 37/37/1 38/38/1 39/39/1
f 40/40/1 41/41/1 42/42/1
f 43/43/1 44/44/1 45/45/1
f 46/46/1 47/47/1 48/48/1
f 49/49/1 50/50/1 51/51/1
f 52/52/1 53/53/1 54/54/1
f 55/55/1 56/56/1 57/57/1
f 58/58/1 59/59/1 60/60/1
f 61/61/1 62/62/1 63/63/1
f 64/64/1 65/65/1 66/66/1
f 67/67/1 68/68/1 69/69/1
f 70/70/1 71/71/1 72/72/1
f 73/73/1 74/74/1 75/75/1
f 76/76/1 77/77/1 78/78/1
f 79/79/1 80/80/1 81/81/1
f 82/82/1 83/83/1 84/84/1
f 85/85/1 86/86/1 87/87/1
f 88/88/1 89/89/1 90/90/1
f 91/91/1 92/92/1 93/93/1
f 94/94/1 95/95/1 96/96/1
f 97/97/1 98/98/1 99/99/1
f 100/100/1 101/101/1 102/102/1
f 103/103/1 104/104/1 105/105/1
f 106/106/1 107/107/1 108/108/1
f 109/109/1 110/110/1 111/111/1
f 112/112/1 113/113/1 114/114/1
f 115/115/1 116/116/1 117/117/1
f 118/118/1 119/119/1 120/120/1
f 121/121/1 122/122/1 123/123/1
f 124/124/1 125/125/1 126/126/1
f 127/127/1 128/128/1 129/129/1
f 130/130/1 131/131/1 132/132/1
f 133/133/1 134/134/1 135/135/1
f 136/136/1 137/137/1 138/138/1
f 139/139/1 140/140/1 141/141/1
f 142/142/1 143/143/1 144/144/1
f 145/145/1 146/146/1 147/147/1
f 148/148/1 149/149/1 150/150/1
f 151/151/1 152/152/1 153/153/1
f 154/154/1 155/155/1 156/156/1
f 157/157/1 158/158/1 159/159/1
f 160/160/1 161/161/1 162/162/1
f 163/163/1 164/164/1 165/165/1
f 166/166/1 167/167/1 168/168/1
f 169/169/1 170/170/1 171/171/1
f 172/172/1 173/173/1 174/174/1
f 175/175/1 176/176/1 177/177/1
f 178/178/1 179/179/1 180/180/1
f 181/181/1 182/182/1 183/183/1
f 184/184/1 185/185/1 186/186/1
f 187/187/1 188/188/1 189/189/1
f 190/190/1 191/191/1 192/192/1
f 193/193/1 194/194/1 195/195/1
f 196/196/1 197/197/1 198/198/1
f 199/199/1 200/200/1 201/201/1
f 202/202/1 203/203/1 204/204/1
f 205/205/1 206/206/1 207/207/1
f 208/208/1 209/209/1 210/210/1
f 211/211/1 212/212/1 213/213/1
f 214/214/1 215/215/1 216/216/1
f 217/217/1 218/218/1 219/219/1
f 220/220/1 221/221/1 222/222/1
f 223/223/1 224/224/1 225/225/1
f 226/226/1 227/227/1 228/228/1
f 229/229/1 230/230/1 231/231/1
f 232/232/1 233/233/1 234/234/1
f 235/235/1 236/236/1 237/237/1
f 238/238/1 239/239/1 240/240/1
f 241/241/1 242/242/1 243/243/1
f 1/1/1 244/244/1 2/2/1
f 4/4/1 245/245/1 5/5/1
f 7/7/1 246/246/1 8/8/1
f 10/10/1 247/247/1 11/11/1
f 13/13/1 248/248/1 14/14/1
f 16/16/1 249/249/1 17/17/1
f 19/19/1 250/250/1 20/20/1
f 22/22/1 251/251/1 23/23/1
f 25/25/1 252/252/1 26/26/1
f 28/28/1 253/253/1 29/29/1
f 31/31/1 254/254/1 32/32/1
f 34/34/1 255/255/1 35/35/1
f 37/37/1 256/256/1 38/38/1
f 40/40/1 257/257/1 41/41/1
f 43/43/1 258/258/1 44/44/1
f 46/46/1 259/259/1 47/47/1
f 49/49/1 260/260/1 50/50/1
f 52/52/1 261/261/1 53/53/1
f 55/55/1 262/262/1 56/56/1
f 58/58/1 263/263/1 59/59/1
f 61/61/1 264/264/1 62/62/1
f 64/64/1 265/265/1 65/65/1
f 67/67/1 266/266/1 68/68/1
f 70/70/1 267/267/1 71/71/1
f 73/73/1 268/268/1 74/74/1
f 76/76/1 269/269/1 77/77/1
f 79/79/1 270/270/1 80/80/1
f 82/82/1 271/271/1 83/83/1
f 85/85/1 272/272/1 86/86/1
f 88/88/1 273/273/1 89/89/1
f 91/91/1 274/274/1 92/92/1
f 94/94/1 275/275/1 95/95/1
f 97/97/1 276/276/1 98/98/1
f 100/100/1 277/277/1 101/101/1
f 103/103/1 278/278/1 104/104/1
f 106/106/1 279/279/1 107/107/1
f 109/109/1 280/280/1 110/110/1
f 112/112/1 281/281/1 113/113/1
f 115/115/1 282/282/1 116/116/1
f 118/118/1 283/283/1 119/119/1
f 121/121/1 284/284/1 122/122/1
f 124/124/1 285/285/1 125/125/1
f 127/127/1 286/286/1 128/128/1
f 130/130/1 287/287/1 131/131/1
f 133/133/1 288/288/1 134/134/1
f 136/136/1 289/289/1 137/137/1
f 139/139/1 290/290/1 140/140/1
f 142/142/1 291/291/1 143/143/1
f 145/145/1 292/292/1 146/146/1
f 148/148/1 293/293/1 149/149/1
f 151/151/1 294/294/1 152/152/1
f 154/154/1 295/295/1 155/155/1
f 157/157/1 296/296/1 158/158/1
f 160/160/1 297/297/1 161/161/1
f 163/163/1 298/298/1 164/164/1
f 166/166/1 299/299/1 167/167/1
f 169/169/1 300/300/1 170/170/1
f 172/172/1 301/301/1 173/173/1
f 175/175/1 302/302/1 176/176/1
f 178/178/1 303/303/1 179/179/1
f 181/181/1 304/304/1 182/182/1
f 184/184/1 305/305/1 185/185/1
f 187/187/1 306/306/1 188/188/1
f 190/190/1 307/307/1 191/191/1
f 193/193/1 308/308/1 194/194/1
f 196/196/1 309/309/1 197/197/1
f 199/199/1 310/310/1 200/200/1
f 202/202/1 311/311/1 203/203/1
f 205/205/1 312/312/1 206/206/1
f 208/208/1 313/313/1 209/209/1
f 211/211/1 314/314/1 212/212/1
f 214/214/1 315/315/1 215/215/1
f 217/217/1 316/316/1 218/218/1
f 220/220/1 317/317/1 221/221/1
f 223/223/1 318/318/1 224/224/1
f 226/226/1 319/319/1 227/227/1
f 229/229/1 320/320/1 230/230/1
f 232/232/1 321/321/1 233/233/1
f 235/235/1 322/322/1 236/236/1
f 238/238/1 323/323/1 239/239/1
f 241/241/1 324/324/1 242/242/1

61
types.h
View File

@ -1,9 +1,10 @@
#ifndef TYPEDEFS
#define TYPEDEFS
typedef double scalar;
typedef unsigned char byte;
typedef double grid3x3[3][3];
typedef double grid4x4[4][4];
typedef scalar grid3x3[3][3];
typedef scalar grid4x4[4][4];
#endif /* TYPEDEFS */
@ -18,21 +19,21 @@ STRUCT(rgb)
END_STRUCT
STRUCT(vec2)
FIELD(x, double)
FIELD(y, double)
FIELD(x, scalar)
FIELD(y, scalar)
END_STRUCT
STRUCT(vec3)
FIELD(x, double)
FIELD(y, double)
FIELD(z, double)
FIELD(x, scalar)
FIELD(y, scalar)
FIELD(z, scalar)
END_STRUCT
STRUCT(vec4)
FIELD(x, double)
FIELD(y, double)
FIELD(z, double)
FIELD(w, double)
FIELD(x, scalar)
FIELD(y, scalar)
FIELD(z, scalar)
FIELD(w, scalar)
END_STRUCT
STRUCT(mat3x3)
@ -44,13 +45,25 @@ STRUCT(mat4x4)
END_STRUCT
STRUCT(camera)
FIELD(znear, double)
FIELD(znear, scalar)
FIELD(pos, vec3)
FIELD(front, vec3)
FIELD(up, vec3)
FIELD(right, vec3)
FIELD(yaw, double)
FIELD(pitch, double)
FIELD(yaw, scalar)
FIELD(pitch, scalar)
END_STRUCT
STRUCT(triangle2)
FIELD(a, vec2)
FIELD(b, vec2)
FIELD(c, vec2)
END_STRUCT
STRUCT(triangle3)
FIELD(a, vec3)
FIELD(b, vec3)
FIELD(c, vec3)
END_STRUCT
#else
@ -70,7 +83,7 @@ END_STRUCT
#ifdef TYPES_IMPL
void
print_grid(size_t y_sz, size_t x_sz, double grid[y_sz][x_sz])
print_grid(size_t y_sz, size_t x_sz, scalar grid[y_sz][x_sz])
{
printf("\n");
for (size_t y = 0; y < y_sz; y++) {
@ -81,7 +94,7 @@ print_grid(size_t y_sz, size_t x_sz, double grid[y_sz][x_sz])
}
}
void print_double(double d) { printf(" %f ", d); }
void print_scalar(scalar d) { printf(" %f ", d); }
void print_byte(byte b) { printf(" %d ", b); }
void print_grid3x3(grid3x3 grid) { print_grid(3, 3, grid); }
void print_grid4x4(grid4x4 grid) { print_grid(4, 4, grid); }
@ -124,7 +137,7 @@ vec3_sub(vec3 u, vec3 v)
}
vec3
vec3_scalar_mul(vec3 v, double s)
vec3_scalar_mul(vec3 v, scalar s)
{
return (vec3) {
.x = v.x * s,
@ -143,7 +156,7 @@ vec3_cross(vec3 u, vec3 v)
};
}
double
scalar
vec3_dot(vec3 u, vec3 v)
{
return u.x * v.x + u.y * v.y + u.z * v.z;
@ -152,7 +165,7 @@ vec3_dot(vec3 u, vec3 v)
vec3
vec3_normalize(vec3 u)
{
double len = sqrt(u.x*u.x + u.y*u.y + u.z*u.z);
scalar len = sqrt(u.x*u.x + u.y*u.y + u.z*u.z);
return (vec3) {
.x = u.x / len,
.y = u.y / len,
@ -189,7 +202,7 @@ vec4_sub(vec4 u, vec4 v)
}
void
mat_mul(size_t dim, double m1[dim][dim], double m2[dim][dim], double out[dim][dim])
mat_mul(size_t dim, scalar m1[dim][dim], scalar m2[dim][dim], scalar out[dim][dim])
{
for (size_t i = 0; i < dim; i++) {
for (size_t j = 0; j < dim; j++) {
@ -261,10 +274,10 @@ lookat(camera cam)
void
update_camera(camera *cam)
{
double α = cos(cam->pitch);
double β = sin(cam->pitch);
double x = cos(cam->yaw);
double y = sin(cam->yaw);
scalar α = cos(cam->pitch);
scalar β = sin(cam->pitch);
scalar x = cos(cam->yaw);
scalar y = sin(cam->yaw);
vec3 front = {
.x = α * y,