// gcc teapot.c -o teapot

#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <stdio.h>
#include <math.h>

#define ABS(x) ((x < 0.0f) ? (-x) : (x))

typedef struct {
	float x, y, z;
} vertex;

typedef struct {
	int a, b, c;
	float A, B, C, D;
} triang;

vertex U, V;

#ifdef TEAPOT_OBJ2C
vertex *verts;
triang *faces;

int vn, fn;
#else


int vn = 270;
int fn = 467;

vertex verts[270] = {
    (vertex){0.000000, 0.000000, 0.000000},
    (vertex){15.308573, 24.703039, 0.397993},
    (vertex){14.584609, 24.703039, 4.995393},
    (vertex){-19.687397, 9.263639, 0.397993},
    (vertex){15.186394, 25.708214, 0.590940},
    (vertex){15.308573, 24.703039, 0.397993},
    (vertex){-24.211769, 20.636595, -0.595426},
    (vertex){0.286213, 31.224264, -3.292825},
    (vertex){14.409667, 25.708248, 5.137502},
    (vertex){-19.555454, 8.910153, -1.183351},
    (vertex){-29.159716, 14.648862, -0.558182},
    (vertex){15.237342, 0.999064, -4.270044},
    (vertex){-0.487924, 27.815170, -1.360265},
    (vertex){-12.482345, 24.703039, 0.397993},
    (vertex){12.560278, 24.703039, 8.956443},
    (vertex){-18.658104, 6.175760, 0.397993},
    (vertex){11.727290, 24.703039, -7.549138},
    (vertex){12.347806, 25.708216, 9.039817},
    (vertex){-28.522068, 17.504829, -1.939436},
    (vertex){13.418306, 24.762407, 9.711091},
    (vertex){9.456917, 24.703039, 12.059804},
    (vertex){-27.084557, 19.310202, -1.035760},
    (vertex){35.398232, 25.462612, 1.513696},
    (vertex){9.228001, 25.708179, 12.074485},
    (vertex){11.292765, 25.589596, -6.741007},
    (vertex){29.333900, 25.160643, 0.992384},
    (vertex){5.495867, 24.703039, 14.084135},
    (vertex){-14.152775, 0.998827, 0.254993},
    (vertex){3.533580, 27.033154, 3.798187},
    (vertex){5.275071, 25.708164, 14.027114},
    (vertex){-10.076599, 4.429996, -14.605502},
    (vertex){-29.949343, 18.588614, -0.568577},
    (vertex){0.898467, 24.703039, 14.808099},
    (vertex){9.640702, 0.056320, -2.328270},
    (vertex){36.130161, 25.471972, 0.388890},
    (vertex){0.709654, 25.708855, 14.684484},
    (vertex){14.279279, 24.703039, 0.397993},
    (vertex){-28.628548, 20.568613, 2.525706},
    (vertex){-4.054657, 24.703039, 14.084135},
    (vertex){-23.625561, 10.233446, 2.732538},
    (vertex){-18.574802, 7.816776, -6.102365},
    (vertex){-3.905013, 25.704441, 13.914754},
    (vertex){-2.792351, 31.224264, 1.010248},
    (vertex){-11.526875, 1.280844, 9.345357},
    (vertex){-8.060172, 24.703039, 12.059804},
    (vertex){-24.785427, 9.641186, 1.415225},
    (vertex){11.727290, 24.703039, 8.345124},
    (vertex){-7.822792, 25.698355, 11.859771},
    (vertex){31.020872, 25.292633, 1.520705},
    (vertex){29.951525, 24.510983, 0.316034},
    (vertex){-11.030136, 24.703039, 8.956443},
    (vertex){29.917774, 24.977470, -1.148027},
    (vertex){2.284858, 27.815170, 2.156251},
    (vertex){-10.837222, 25.696888, 8.733725},
    (vertex){-14.070994, 4.429873, -10.623661},
    (vertex){9.876149, 0.667159, -11.409604},
    (vertex){-12.876606, 24.703039, 4.995393},
    (vertex){18.396454, 13.784294, 3.658794},
    (vertex){35.352322, 25.453707, -0.736777},
    (vertex){-12.749512, 25.701862, 4.772549},
    (vertex){-11.275558, 25.572485, -1.864210},
    (vertex){-14.701873, 22.827045, -1.371137},
    (vertex){-13.511639, 24.703039, 0.397993},
    (vertex){-23.761866, 11.198367, -1.678944},
    (vertex){9.845831, 1.280844, 12.823335},
    (vertex){-13.386852, 25.707102, 0.201030},
    (vertex){8.037468, 25.589596, 10.792291},
    (vertex){-14.646384, 24.759745, 0.296996},
    (vertex){-12.787675, 24.703039, -4.199407},
    (vertex){13.036716, 7.817533, -16.207859},
    (vertex){-15.570226, 20.843189, 0.397993},
    (vertex){-12.612733, 25.708248, -4.341516},
    (vertex){5.167481, 24.703039, -12.310566},
    (vertex){-13.833312, 24.762726, -4.655520},
    (vertex){-10.763344, 24.703039, -8.160457},
    (vertex){-26.385853, 15.909712, 1.338819},
    (vertex){-6.240533, 25.589596, -9.996305},
    (vertex){-10.550872, 25.708216, -8.243831},
    (vertex){15.149900, 0.998987, 5.334896},
    (vertex){-11.621374, 24.762407, -8.915104},
    (vertex){-7.659983, 24.703039, -11.263818},
    (vertex){-27.079737, 21.086561, -1.900306},
    (vertex){1.510721, 31.224264, 4.088810},
    (vertex){-7.431067, 25.708179, -11.278499},
    (vertex){-23.768721, 22.951128, 1.416560},
    (vertex){24.562969, 13.743949, 4.757549},
    (vertex){-3.698933, 24.703039, -13.288149},
    (vertex){-23.450867, 11.668358, 1.371851},
    (vertex){-3.370547, 24.703039, -12.310566},
    (vertex){-3.478137, 25.708164, -13.231129},
    (vertex){13.607026, 24.703039, 4.667007},
    (vertex){-8.813712, 0.303726, 9.393238},
    (vertex){0.898467, 24.703039, -14.012113},
    (vertex){-27.505766, 14.679560, 2.761451},
    (vertex){33.594387, 25.142879, 0.331187},
    (vertex){1.091415, 25.708214, -13.889934},
    (vertex){-1.789450, 32.123760, -1.770989},
    (vertex){0.898467, 32.422737, 0.397993},
    (vertex){5.495867, 24.703039, -13.288149},
    (vertex){-19.566835, 8.925653, 1.932889},
    (vertex){3.151348, 31.218504, -2.691276},
    (vertex){5.637977, 25.708248, -13.113207},
    (vertex){24.209566, 16.195681, 0.427214},
    (vertex){5.951980, 24.762728, -14.333786},
    (vertex){9.456917, 24.703039, -11.263818},
    (vertex){-13.352966, 0.998987, -4.538910},
    (vertex){-1.736646, 27.033154, -3.002200},
    (vertex){9.540291, 25.708216, -11.051346},
    (vertex){17.458567, 7.818063, -11.803377},
    (vertex){10.211564, 24.762407, -12.121848},
    (vertex){12.560278, 24.703039, -8.160457},
    (vertex){-26.836641, 21.844028, 2.565999},
    (vertex){33.391907, 24.755131, 1.101778},
    (vertex){12.574959, 25.708179, -7.931540},
    (vertex){-15.707386, 7.817534, -11.740255},
    (vertex){0.755468, 0.998828, 15.449236},
    (vertex){14.584609, 24.703039, -4.199407},
    (vertex){-11.302903, 7.818063, -16.162107},
    (vertex){13.972562, 4.190048, -12.806547},
    (vertex){14.527589, 25.708164, -3.978611},
    (vertex){13.072493, 25.572485, 2.660197},
    (vertex){-27.741783, 19.735180, 2.614435},
    (vertex){-3.370547, 24.703039, 13.106552},
    (vertex){16.441513, 24.763344, 0.498476},
    (vertex){15.630246, 24.762726, 5.451506},
    (vertex){-16.680397, 4.429650, -5.537058},
    (vertex){25.008593, 11.717937, -4.076744},
    (vertex){21.018616, 13.177718, 0.378352},
    (vertex){20.014006, 13.176908, 6.798604},
    (vertex){-26.648861, 15.782420, -1.074187},
    (vertex){30.152140, 25.166548, 0.078706},
    (vertex){21.389292, 7.817119, 0.359089},
    (vertex){-18.779413, 6.515224, -1.142159},
    (vertex){8.845599, 24.703039, -10.430830},
    (vertex){-1.354414, 31.218504, 3.487261},
    (vertex){17.193016, 13.177141, 12.331882},
    (vertex){0.927274, 4.429695, -18.120056},
    (vertex){24.759346, 8.678206, -1.516963},
    (vertex){10.048528, 24.762648, 13.036239},
    (vertex){8.845598, 24.703039, 11.226816},
    (vertex){12.864099, 13.177726, 16.669273},
    (vertex){-0.270352, 28.844387, -1.243482},
    (vertex){-1.363737, 25.572485, 12.572019},
    (vertex){5.762722, 24.763292, 15.190902},
    (vertex){18.396454, 9.164827, -4.493209},
    (vertex){7.335927, 13.178306, 19.501196},
    (vertex){-28.839756, 21.482195, -0.606129},
    (vertex){20.348240, 7.818026, -6.175669},
    (vertex){0.798094, 24.763391, 15.940992},
    (vertex){0.898467, 24.703039, -12.982819},
    (vertex){0.918108, 13.177718, 20.518141},
    (vertex){13.607026, 24.703039, -3.871021},
    (vertex){24.505007, 10.265581, 4.580316},
    (vertex){-4.153965, 24.755198, 15.134086},
    (vertex){-2.501726, 27.033154, 3.033106},
    (vertex){-5.502144, 13.176908, 19.513531},
    (vertex){-7.048664, 24.703039, -10.430830},
    (vertex){-11.810092, 24.703039, 4.667006},
    (vertex){-8.419059, 24.738796, 12.929359},
    (vertex){18.396454, 7.058893, -2.862808},
    (vertex){-11.035420, 13.177141, 16.692541},
    (vertex){1.041466, 0.998828, -14.653250},
    (vertex){27.288610, 13.994514, 3.884584},
    (vertex){-11.750070, 24.735067, 9.557630},
    (vertex){27.589190, 12.597516, -1.557891},
    (vertex){-15.372813, 13.177732, 12.363623},
    (vertex){24.459751, 15.549461, 3.198292},
    (vertex){18.396454, 6.175760, 0.397993},
    (vertex){-13.902133, 24.747425, 5.264516},
    (vertex){29.880816, 21.548828, -1.598237},
    (vertex){-18.204735, 13.178308, 6.835452},
    (vertex){5.835370, 0.998987, -13.853440},
    (vertex){-11.810092, 24.703039, -3.871022},
    (vertex){18.427711, 9.950730, 5.850832},
    (vertex){3.067450, 32.123760, -2.289924},
    (vertex){-19.221680, 13.177718, 0.417634},
    (vertex){-18.790379, 6.531587, 1.982858},
    (vertex){4.298661, 27.033154, -2.237120},
    (vertex){-4.038436, 0.998987, 14.649426},
    (vertex){0.859563, 7.817119, -20.092831},
    (vertex){-18.217070, 13.176908, -6.002618},
    (vertex){-26.782244, 19.274029, 1.336636},
    (vertex){-28.805573, 14.607297, 1.889120},
    (vertex){5.566503, 0.999064, 14.736868},
    (vertex){24.652000, 15.839551, -2.305961},
    (vertex){-15.396081, 13.177139, -11.535894},
    (vertex){-9.930356, 24.703039, 8.345124},
    (vertex){5.167481, 24.703039, 13.106552},
    (vertex){-8.251594, 24.762650, -12.240252},
    (vertex){27.774500, 22.031509, 2.445615},
    (vertex){-11.067163, 13.177732, -15.873288},
    (vertex){-3.769568, 0.999064, -13.940882},
    (vertex){-1.270514, 32.123760, 3.085910},
    (vertex){-3.965788, 24.763292, -14.394916},
    (vertex){18.396454, 7.058893, 3.658794},
    (vertex){-5.538993, 13.178306, -18.705210},
    (vertex){6.833519, 4.429652, -17.180874},
    (vertex){-7.048665, 24.703039, 11.226816},
    (vertex){0.998950, 24.763344, -15.145051},
    (vertex){24.925549, 14.045557, -3.888389},
    (vertex){0.878826, 13.177718, -19.722155},
    (vertex){4.589285, 31.224264, -0.214263},
    (vertex){-9.495831, 25.589596, 7.536993},
    (vertex){-23.093077, 22.473923, -1.699508},
    (vertex){-8.048897, 1.280844, -12.027349},
    (vertex){7.299078, 13.176908, -18.717545},
    (vertex){13.323809, 1.280844, -8.549371},
    (vertex){-15.409111, 21.175789, 2.167728},
    (vertex){-17.619581, 4.429697, 0.369186},
    (vertex){33.666538, 25.386520, -1.281966},
    (vertex){12.832355, 13.177139, -15.896555},
    (vertex){-14.680813, 22.864044, 2.056845},
    (vertex){-24.692642, 21.117020, 2.492458},
    (vertex){13.536713, 24.762650, -8.752067},
    (vertex){30.715935, 21.254951, 0.364373},
    (vertex){17.169748, 13.177728, -11.567637},
    (vertex){0.898467, 24.703039, 13.778805},
    (vertex){18.396454, 14.667428, 0.397993},
    (vertex){15.691378, 24.763290, -4.466263},
    (vertex){-29.304276, 18.321314, 2.448317},
    (vertex){20.001671, 13.178306, -6.039467},
    (vertex){-9.930356, 24.703039, -7.549139},
    (vertex){20.371738, 7.816775, 6.898350},
    (vertex){18.495201, 4.429935, -5.482947},
    (vertex){30.191095, 24.739544, 1.286483},
    (vertex){19.416515, 4.429694, 0.426799},
    (vertex){18.477335, 4.429652, 6.333045},
    (vertex){3.987736, 31.218504, 2.650873},
    (vertex){-2.190801, 31.218504, -1.854889},
    (vertex){15.949710, 0.998828, 0.540992},
    (vertex){-19.592356, 7.817119, 0.436897},
    (vertex){30.024158, 21.467096, 2.325198},
    (vertex){17.504320, 7.817533, 12.536242},
    (vertex){-4.982473, 4.429935, -17.198740},
    (vertex){14.103006, 4.190049, 13.472091},
    (vertex){2.656726, 27.815170, -0.988397},
    (vertex){13.161079, 1.280760, 9.568958},
    (vertex){13.099837, 7.818063, 16.958094},
    (vertex){-13.440407, 0.999064, 5.066029},
    (vertex){2.539941, 28.844387, -0.770826},
    (vertex){2.067287, 28.844387, 2.039467},
    (vertex){27.169338, 22.874117, -0.377528},
    (vertex){7.472129, 7.818025, 19.847765},
    (vertex){9.893708, 0.303726, 10.110175},
    (vertex){6.779407, 4.429935, 17.994726},
    (vertex){3.586384, 32.123760, 2.566974},
    (vertex){7.398824, 7.816775, -19.075277},
    (vertex){0.937371, 7.817119, 20.888817},
    (vertex){-5.675195, 7.818025, -19.051779},
    (vertex){0.869661, 4.429694, 18.916040},
    (vertex){32.573460, 25.187679, 2.332690},
    (vertex){-11.364145, 1.280760, -8.772972},
    (vertex){-5.601890, 7.816776, 19.871264},
    (vertex){-0.743007, 28.844387, 1.566813},
    (vertex){-5.036585, 4.429652, 17.976860},
    (vertex){3.160670, 25.572485, -11.776032},
    (vertex){-8.096776, 0.303726, -9.314186},
    (vertex){-11.239781, 7.817533, 17.003845},
    (vertex){-15.430189, 21.138636, -1.261730},
    (vertex){-10.123187, 4.429873, 15.367455},
    (vertex){-0.859791, 27.815170, 1.784384},
    (vertex){-8.272498, 1.280760, 12.660605},
    (vertex){-15.661633, 7.818063, 12.599363},
    (vertex){31.946058, 24.673306, -0.900098},
    (vertex){-14.105026, 4.429995, 11.373058},
    (vertex){-25.395615, 10.836358, -1.754431},
    (vertex){-14.540932, 23.159098, 0.397993},
    (vertex){-18.551304, 7.818025, 6.971655},
    (vertex){18.369265, 13.441648, -3.674924},
    (vertex){-16.698263, 4.429934, 6.278933}
};
triang faces[467] = {
    (triang){5, 2, 8, 0, 0, 0, 0},
    (triang){8, 4, 5, 0, 0, 0, 0},
    (triang){91, 243, 115, 0, 0, 0, 0},
    (triang){184, 102, 241, 0, 0, 0, 0},
    (triang){233, 30, 117, 0, 0, 0, 0},
    (triang){266, 61, 203, 0, 0, 0, 0},
    (triang){4, 8, 124, 0, 0, 0, 0},
    (triang){124, 123, 4, 0, 0, 0, 0},
    (triang){54, 30, 204, 0, 0, 0, 0},
    (triang){146, 111, 84, 0, 0, 0, 0},
    (triang){2, 14, 17, 0, 0, 0, 0},
    (triang){17, 8, 2, 0, 0, 0, 0},
    (triang){161, 191, 233, 0, 0, 0, 0},
    (triang){22, 34, 94, 0, 0, 0, 0},
    (triang){87, 63, 129, 0, 0, 0, 0},
    (triang){117, 248, 233, 0, 0, 0, 0},
    (triang){8, 17, 19, 0, 0, 0, 0},
    (triang){19, 124, 8, 0, 0, 0, 0},
    (triang){60, 76, 221, 0, 0, 0, 0},
    (triang){256, 55, 33, 0, 0, 0, 0},
    (triang){14, 20, 23, 0, 0, 0, 0},
    (triang){23, 17, 14, 0, 0, 0, 0},
    (triang){10, 18, 265, 0, 0, 0, 0},
    (triang){7, 100, 239, 0, 0, 0, 0},
    (triang){225, 223, 147, 0, 0, 0, 0},
    (triang){45, 265, 132, 0, 0, 0, 0},
    (triang){17, 23, 138, 0, 0, 0, 0},
    (triang){138, 19, 17, 0, 0, 0, 0},
    (triang){235, 52, 28, 0, 0, 0, 0},
    (triang){126, 164, 137, 0, 0, 0, 0},
    (triang){20, 26, 29, 0, 0, 0, 0},
    (triang){29, 23, 20, 0, 0, 0, 0},
    (triang){146, 81, 18, 0, 0, 0, 0},
    (triang){151, 16, 24, 0, 0, 0, 0},
    (triang){70, 207, 212, 0, 0, 0, 0},
    (triang){55, 171, 196, 0, 0, 0, 0},
    (triang){23, 29, 143, 0, 0, 0, 0},
    (triang){143, 138, 23, 0, 0, 0, 0},
    (triang){206, 55, 118, 0, 0, 0, 0},
    (triang){28, 177, 235, 0, 0, 0, 0},
    (triang){26, 32, 35, 0, 0, 0, 0},
    (triang){35, 29, 26, 0, 0, 0, 0},
    (triang){230, 40, 125, 0, 0, 0, 0},
    (triang){18, 31, 146, 0, 0, 0, 0},
    (triang){260, 52, 240, 0, 0, 0, 0},
    (triang){256, 91, 27, 0, 0, 0, 0},
    (triang){29, 35, 148, 0, 0, 0, 0},
    (triang){148, 143, 29, 0, 0, 0, 0},
    (triang){120, 66, 46, 0, 0, 0, 0},
    (triang){136, 196, 171, 0, 0, 0, 0},
    (triang){32, 38, 41, 0, 0, 0, 0},
    (triang){41, 35, 32, 0, 0, 0, 0},
    (triang){81, 6, 21, 0, 0, 0, 0},
    (triang){6, 81, 258, 0, 0, 0, 0},
    (triang){248, 179, 136, 0, 0, 0, 0},
    (triang){203, 84, 266, 0, 0, 0, 0},
    (triang){35, 41, 153, 0, 0, 0, 0},
    (triang){153, 148, 35, 0, 0, 0, 0},
    (triang){12, 235, 177, 0, 0, 0, 0},
    (triang){46, 90, 120, 0, 0, 0, 0},
    (triang){38, 44, 47, 0, 0, 0, 0},
    (triang){47, 41, 38, 0, 0, 0, 0},
    (triang){264, 259, 257, 0, 0, 0, 0},
    (triang){40, 114, 54, 0, 0, 0, 0},
    (triang){240, 239, 201, 0, 0, 0, 0},
    (triang){134, 82, 192, 0, 0, 0, 0},
    (triang){41, 47, 158, 0, 0, 0, 0},
    (triang){158, 153, 41, 0, 0, 0, 0},
    (triang){209, 51, 130, 0, 0, 0, 0},
    (triang){196, 136, 179, 0, 0, 0, 0},
    (triang){44, 50, 53, 0, 0, 0, 0},
    (triang){53, 47, 44, 0, 0, 0, 0},
    (triang){258, 70, 6, 0, 0, 0, 0},
    (triang){157, 186, 202, 0, 0, 0, 0},
    (triang){7, 228, 96, 0, 0, 0, 0},
    (triang){239, 240, 52, 0, 0, 0, 0},
    (triang){47, 53, 163, 0, 0, 0, 0},
    (triang){163, 158, 47, 0, 0, 0, 0},
    (triang){223, 118, 108, 0, 0, 0, 0},
    (triang){58, 209, 263, 0, 0, 0, 0},
    (triang){50, 56, 59, 0, 0, 0, 0},
    (triang){59, 53, 50, 0, 0, 0, 0},
    (triang){51, 184, 241, 0, 0, 0, 0},
    (triang){34, 58, 94, 0, 0, 0, 0},
    (triang){12, 260, 253, 0, 0, 0, 0},
    (triang){82, 227, 245, 0, 0, 0, 0},
    (triang){53, 59, 168, 0, 0, 0, 0},
    (triang){168, 163, 53, 0, 0, 0, 0},
    (triang){10, 182, 219, 0, 0, 0, 0},
    (triang){55, 256, 161, 0, 0, 0, 0},
    (triang){56, 62, 65, 0, 0, 0, 0},
    (triang){65, 59, 56, 0, 0, 0, 0},
    (triang){224, 49, 130, 0, 0, 0, 0},
    (triang){257, 262, 264, 0, 0, 0, 0},
    (triang){191, 204, 30, 0, 0, 0, 0},
    (triang){87, 39, 99, 0, 0, 0, 0},
    (triang){59, 65, 67, 0, 0, 0, 0},
    (triang){67, 168, 59, 0, 0, 0, 0},
    (triang){227, 201, 245, 0, 0, 0, 0},
    (triang){189, 241, 102, 0, 0, 0, 0},
    (triang){62, 68, 71, 0, 0, 0, 0},
    (triang){71, 65, 62, 0, 0, 0, 0},
    (triang){251, 204, 256, 0, 0, 0, 0},
    (triang){146, 37, 111, 0, 0, 0, 0},
    (triang){184, 51, 199, 0, 0, 0, 0},
    (triang){99, 3, 87, 0, 0, 0, 0},
    (triang){65, 71, 73, 0, 0, 0, 0},
    (triang){73, 67, 65, 0, 0, 0, 0},
    (triang){211, 266, 84, 0, 0, 0, 0},
    (triang){72, 149, 255, 0, 0, 0, 0},
    (triang){68, 74, 77, 0, 0, 0, 0},
    (triang){77, 71, 68, 0, 0, 0, 0},
    (triang){192, 245, 97, 0, 0, 0, 0},
    (triang){202, 60, 13, 0, 0, 0, 0},
    (triang){25, 250, 48, 0, 0, 0, 0},
    (triang){120, 24, 177, 0, 0, 0, 0},
    (triang){71, 77, 79, 0, 0, 0, 0},
    (triang){79, 73, 71, 0, 0, 0, 0},
    (triang){39, 45, 176, 0, 0, 0, 0},
    (triang){90, 36, 120, 0, 0, 0, 0},
    (triang){74, 80, 83, 0, 0, 0, 0},
    (triang){83, 77, 74, 0, 0, 0, 0},
    (triang){84, 203, 146, 0, 0, 0, 0},
    (triang){81, 146, 203, 0, 0, 0, 0},
    (triang){102, 166, 189, 0, 0, 0, 0},
    (triang){42, 134, 192, 0, 0, 0, 0},
    (triang){77, 83, 188, 0, 0, 0, 0},
    (triang){188, 79, 77, 0, 0, 0, 0},
    (triang){93, 182, 45, 0, 0, 0, 0},
    (triang){141, 239, 235, 0, 0, 0, 0},
    (triang){80, 86, 89, 0, 0, 0, 0},
    (triang){89, 83, 80, 0, 0, 0, 0},
    (triang){61, 258, 81, 0, 0, 0, 0},
    (triang){212, 111, 37, 0, 0, 0, 0},
    (triang){130, 48, 224, 0, 0, 0, 0},
    (triang){152, 85, 173, 0, 0, 0, 0},
    (triang){83, 89, 193, 0, 0, 0, 0},
    (triang){193, 188, 83, 0, 0, 0, 0},
    (triang){118, 196, 246, 0, 0, 0, 0},
    (triang){9, 132, 265, 0, 0, 0, 0},
    (triang){86, 92, 95, 0, 0, 0, 0},
    (triang){95, 89, 86, 0, 0, 0, 0},
    (triang){42, 228, 141, 0, 0, 0, 0},
    (triang){81, 203, 61, 0, 0, 0, 0},
    (triang){265, 45, 10, 0, 0, 0, 0},
    (triang){207, 211, 111, 0, 0, 0, 0},
    (triang){89, 95, 198, 0, 0, 0, 0},
    (triang){198, 193, 89, 0, 0, 0, 0},
    (triang){201, 100, 174, 0, 0, 0, 0},
    (triang){172, 13, 60, 0, 0, 0, 0},
    (triang){92, 98, 101, 0, 0, 0, 0},
    (triang){101, 95, 92, 0, 0, 0, 0},
    (triang){191, 161, 256, 0, 0, 0, 0},
    (triang){269, 208, 27, 0, 0, 0, 0},
    (triang){48, 250, 22, 0, 0, 0, 0},
    (triang){178, 261, 91, 0, 0, 0, 0},
    (triang){95, 101, 103, 0, 0, 0, 0},
    (triang){103, 198, 95, 0, 0, 0, 0},
    (triang){227, 82, 240, 0, 0, 0, 0},
    (triang){51, 25, 130, 0, 0, 0, 0},
    (triang){98, 104, 107, 0, 0, 0, 0},
    (triang){107, 101, 98, 0, 0, 0, 0},
    (triang){241, 189, 25, 0, 0, 0, 0},
    (triang){51, 169, 126, 0, 0, 0, 0},
    (triang){91, 256, 33, 0, 0, 0, 0},
    (triang){176, 99, 39, 0, 0, 0, 0},
    (triang){101, 107, 109, 0, 0, 0, 0},
    (triang){109, 103, 101, 0, 0, 0, 0},
    (triang){253, 141, 12, 0, 0, 0, 0},
    (triang){264, 269, 238, 0, 0, 0, 0},
    (triang){104, 110, 113, 0, 0, 0, 0},
    (triang){113, 107, 104, 0, 0, 0, 0},
    (triang){21, 181, 75, 0, 0, 0, 0},
    (triang){49, 263, 209, 0, 0, 0, 0},
    (triang){57, 173, 85, 0, 0, 0, 0},
    (triang){191, 256, 204, 0, 0, 0, 0},
    (triang){107, 113, 213, 0, 0, 0, 0},
    (triang){213, 109, 107, 0, 0, 0, 0},
    (triang){177, 28, 120, 0, 0, 0, 0},
    (triang){204, 251, 54, 0, 0, 0, 0},
    (triang){110, 116, 119, 0, 0, 0, 0},
    (triang){119, 113, 110, 0, 0, 0, 0},
    (triang){18, 129, 63, 0, 0, 0, 0},
    (triang){187, 139, 66, 0, 0, 0, 0},
    (triang){48, 22, 112, 0, 0, 0, 0},
    (triang){11, 229, 33, 0, 0, 0, 0},
    (triang){113, 119, 218, 0, 0, 0, 0},
    (triang){218, 213, 113, 0, 0, 0, 0},
    (triang){114, 117, 30, 0, 0, 0, 0},
    (triang){84, 111, 211, 0, 0, 0, 0},
    (triang){116, 5, 4, 0, 0, 0, 0},
    (triang){4, 119, 116, 0, 0, 0, 0},
    (triang){246, 69, 118, 0, 0, 0, 0},
    (triang){100, 7, 174, 0, 0, 0, 0},
    (triang){212, 6, 70, 0, 0, 0, 0},
    (triang){112, 224, 48, 0, 0, 0, 0},
    (triang){119, 4, 123, 0, 0, 0, 0},
    (triang){123, 218, 119, 0, 0, 0, 0},
    (triang){238, 27, 91, 0, 0, 0, 0},
    (triang){66, 120, 28, 0, 0, 0, 0},
    (triang){88, 156, 76, 0, 0, 0, 0},
    (triang){18, 21, 129, 0, 0, 0, 0},
    (triang){142, 202, 197, 0, 0, 0, 0},
    (triang){125, 54, 251, 0, 0, 0, 0},
    (triang){123, 124, 128, 0, 0, 0, 0},
    (triang){128, 127, 123, 0, 0, 0, 0},
    (triang){121, 37, 219, 0, 0, 0, 0},
    (triang){214, 164, 169, 0, 0, 0, 0},
    (triang){127, 128, 222, 0, 0, 0, 0},
    (triang){222, 131, 127, 0, 0, 0, 0},
    (triang){171, 161, 136, 0, 0, 0, 0},
    (triang){199, 126, 144, 0, 0, 0, 0},
    (triang){18, 10, 31, 0, 0, 0, 0},
    (triang){197, 122, 142, 0, 0, 0, 0},
    (triang){124, 19, 135, 0, 0, 0, 0},
    (triang){135, 128, 124, 0, 0, 0, 0},
    (triang){267, 230, 208, 0, 0, 0, 0},
    (triang){111, 212, 207, 0, 0, 0, 0},
    (triang){128, 135, 232, 0, 0, 0, 0},
    (triang){232, 222, 128, 0, 0, 0, 0},
    (triang){243, 33, 229, 0, 0, 0, 0},
    (triang){229, 78, 243, 0, 0, 0, 0},
    (triang){76, 60, 106, 0, 0, 0, 0},
    (triang){164, 126, 169, 0, 0, 0, 0},
    (triang){19, 138, 140, 0, 0, 0, 0},
    (triang){140, 135, 19, 0, 0, 0, 0},
    (triang){189, 231, 250, 0, 0, 0, 0},
    (triang){133, 72, 255, 0, 0, 0, 0},
    (triang){135, 140, 237, 0, 0, 0, 0},
    (triang){237, 232, 135, 0, 0, 0, 0},
    (triang){260, 12, 106, 0, 0, 0, 0},
    (triang){129, 75, 87, 0, 0, 0, 0},
    (triang){121, 219, 93, 0, 0, 0, 0},
    (triang){142, 66, 28, 0, 0, 0, 0},
    (triang){138, 143, 145, 0, 0, 0, 0},
    (triang){145, 140, 138, 0, 0, 0, 0},
    (triang){152, 137, 164, 0, 0, 0, 0},
    (triang){179, 246, 196, 0, 0, 0, 0},
    (triang){140, 145, 242, 0, 0, 0, 0},
    (triang){242, 237, 140, 0, 0, 0, 0},
    (triang){24, 120, 36, 0, 0, 0, 0},
    (triang){106, 154, 260, 0, 0, 0, 0},
    (triang){263, 94, 58, 0, 0, 0, 0},
    (triang){6, 212, 181, 0, 0, 0, 0},
    (triang){143, 148, 150, 0, 0, 0, 0},
    (triang){150, 145, 143, 0, 0, 0, 0},
    (triang){159, 144, 126, 0, 0, 0, 0},
    (triang){164, 162, 152, 0, 0, 0, 0},
    (triang){145, 150, 247, 0, 0, 0, 0},
    (triang){247, 242, 145, 0, 0, 0, 0},
    (triang){134, 42, 253, 0, 0, 0, 0},
    (triang){36, 151, 24, 0, 0, 0, 0},
    (triang){141, 253, 42, 0, 0, 0, 0},
    (triang){37, 121, 212, 0, 0, 0, 0},
    (triang){148, 153, 155, 0, 0, 0, 0},
    (triang){155, 150, 148, 0, 0, 0, 0},
    (triang){167, 159, 137, 0, 0, 0, 0},
    (triang){126, 137, 159, 0, 0, 0, 0},
    (triang){150, 155, 252, 0, 0, 0, 0},
    (triang){252, 247, 150, 0, 0, 0, 0},
    (triang){136, 233, 248, 0, 0, 0, 0},
    (triang){118, 223, 11, 0, 0, 0, 0},
    (triang){52, 260, 154, 0, 0, 0, 0},
    (triang){229, 11, 223, 0, 0, 0, 0},
    (triang){153, 158, 160, 0, 0, 0, 0},
    (triang){160, 155, 153, 0, 0, 0, 0},
    (triang){173, 194, 152, 0, 0, 0, 0},
    (triang){259, 264, 43, 0, 0, 0, 0},
    (triang){155, 160, 257, 0, 0, 0, 0},
    (triang){257, 252, 155, 0, 0, 0, 0},
    (triang){3, 9, 63, 0, 0, 0, 0},
    (triang){233, 136, 161, 0, 0, 0, 0},
    (triang){13, 157, 202, 0, 0, 0, 0},
    (triang){154, 28, 52, 0, 0, 0, 0},
    (triang){158, 163, 165, 0, 0, 0, 0},
    (triang){165, 160, 158, 0, 0, 0, 0},
    (triang){85, 152, 162, 0, 0, 0, 0},
    (triang){208, 269, 267, 0, 0, 0, 0},
    (triang){160, 165, 262, 0, 0, 0, 0},
    (triang){262, 257, 160, 0, 0, 0, 0},
    (triang){11, 55, 206, 0, 0, 0, 0},
    (triang){183, 115, 243, 0, 0, 0, 0},
    (triang){69, 108, 118, 0, 0, 0, 0},
    (triang){54, 125, 40, 0, 0, 0, 0},
    (triang){163, 168, 170, 0, 0, 0, 0},
    (triang){170, 165, 163, 0, 0, 0, 0},
    (triang){245, 174, 97, 0, 0, 0, 0},
    (triang){30, 233, 191, 0, 0, 0, 0},
    (triang){165, 170, 267, 0, 0, 0, 0},
    (triang){267, 262, 165, 0, 0, 0, 0},
    (triang){11, 206, 118, 0, 0, 0, 0},
    (triang){223, 225, 229, 0, 0, 0, 0},
    (triang){55, 11, 33, 0, 0, 0, 0},
    (triang){132, 15, 45, 0, 0, 0, 0},
    (triang){168, 67, 175, 0, 0, 0, 0},
    (triang){175, 170, 168, 0, 0, 0, 0},
    (triang){182, 10, 45, 0, 0, 0, 0},
    (triang){22, 250, 231, 0, 0, 0, 0},
    (triang){170, 175, 230, 0, 0, 0, 0},
    (triang){230, 267, 170, 0, 0, 0, 0},
    (triang){139, 46, 66, 0, 0, 0, 0},
    (triang){122, 216, 142, 0, 0, 0, 0},
    (triang){156, 221, 76, 0, 0, 0, 0},
    (triang){24, 255, 177, 0, 0, 0, 0},
    (triang){67, 73, 180, 0, 0, 0, 0},
    (triang){180, 175, 67, 0, 0, 0, 0},
    (triang){43, 261, 259, 0, 0, 0, 0},
    (triang){262, 267, 269, 0, 0, 0, 0},
    (triang){175, 180, 40, 0, 0, 0, 0},
    (triang){40, 230, 175, 0, 0, 0, 0},
    (triang){208, 125, 105, 0, 0, 0, 0},
    (triang){177, 106, 12, 0, 0, 0, 0},
    (triang){251, 105, 125, 0, 0, 0, 0},
    (triang){221, 172, 60, 0, 0, 0, 0},
    (triang){73, 79, 185, 0, 0, 0, 0},
    (triang){185, 180, 73, 0, 0, 0, 0},
    (triang){181, 21, 6, 0, 0, 0, 0},
    (triang){269, 264, 262, 0, 0, 0, 0},
    (triang){180, 185, 114, 0, 0, 0, 0},
    (triang){114, 40, 180, 0, 0, 0, 0},
    (triang){27, 105, 256, 0, 0, 0, 0},
    (triang){25, 51, 241, 0, 0, 0, 0},
    (triang){66, 142, 216, 0, 0, 0, 0},
    (triang){181, 121, 93, 0, 0, 0, 0},
    (triang){79, 188, 190, 0, 0, 0, 0},
    (triang){190, 185, 79, 0, 0, 0, 0},
    (triang){85, 162, 231, 0, 0, 0, 0},
    (triang){96, 192, 97, 0, 0, 0, 0},
    (triang){185, 190, 117, 0, 0, 0, 0},
    (triang){117, 114, 185, 0, 0, 0, 0},
    (triang){268, 217, 102, 0, 0, 0, 0},
    (triang){85, 166, 57, 0, 0, 0, 0},
    (triang){174, 96, 97, 0, 0, 0, 0},
    (triang){216, 187, 66, 0, 0, 0, 0},
    (triang){188, 193, 195, 0, 0, 0, 0},
    (triang){195, 190, 188, 0, 0, 0, 0},
    (triang){162, 164, 214, 0, 0, 0, 0},
    (triang){231, 189, 85, 0, 0, 0, 0},
    (triang){190, 195, 248, 0, 0, 0, 0},
    (triang){248, 117, 190, 0, 0, 0, 0},
    (triang){192, 96, 42, 0, 0, 0, 0},
    (triang){63, 87, 3, 0, 0, 0, 0},
    (triang){166, 102, 217, 0, 0, 0, 0},
    (triang){202, 142, 154, 0, 0, 0, 0},
    (triang){193, 198, 200, 0, 0, 0, 0},
    (triang){200, 195, 193, 0, 0, 0, 0},
    (triang){214, 169, 58, 0, 0, 0, 0},
    (triang){214, 231, 162, 0, 0, 0, 0},
    (triang){195, 200, 179, 0, 0, 0, 0},
    (triang){179, 248, 195, 0, 0, 0, 0},
    (triang){51, 209, 169, 0, 0, 0, 0},
    (triang){183, 243, 64, 0, 0, 0, 0},
    (triang){108, 147, 223, 0, 0, 0, 0},
    (triang){186, 197, 202, 0, 0, 0, 0},
    (triang){198, 103, 205, 0, 0, 0, 0},
    (triang){205, 200, 198, 0, 0, 0, 0},
    (triang){231, 214, 34, 0, 0, 0, 0},
    (triang){58, 34, 214, 0, 0, 0, 0},
    (triang){200, 205, 246, 0, 0, 0, 0},
    (triang){246, 179, 200, 0, 0, 0, 0},
    (triang){76, 255, 149, 0, 0, 0, 0},
    (triang){149, 88, 76, 0, 0, 0, 0},
    (triang){28, 154, 142, 0, 0, 0, 0},
    (triang){147, 131, 225, 0, 0, 0, 0},
    (triang){103, 109, 210, 0, 0, 0, 0},
    (triang){210, 205, 103, 0, 0, 0, 0},
    (triang){238, 43, 264, 0, 0, 0, 0},
    (triang){34, 22, 231, 0, 0, 0, 0},
    (triang){205, 210, 69, 0, 0, 0, 0},
    (triang){69, 246, 205, 0, 0, 0, 0},
    (triang){94, 112, 22, 0, 0, 0, 0},
    (triang){60, 202, 154, 0, 0, 0, 0},
    (triang){93, 75, 181, 0, 0, 0, 0},
    (triang){144, 268, 199, 0, 0, 0, 0},
    (triang){109, 213, 215, 0, 0, 0, 0},
    (triang){215, 210, 109, 0, 0, 0, 0},
    (triang){125, 208, 230, 0, 0, 0, 0},
    (triang){15, 176, 45, 0, 0, 0, 0},
    (triang){210, 215, 108, 0, 0, 0, 0},
    (triang){108, 69, 210, 0, 0, 0, 0},
    (triang){126, 199, 51, 0, 0, 0, 0},
    (triang){161, 171, 55, 0, 0, 0, 0},
    (triang){201, 227, 240, 0, 0, 0, 0},
    (triang){52, 235, 239, 0, 0, 0, 0},
    (triang){213, 218, 220, 0, 0, 0, 0},
    (triang){220, 215, 213, 0, 0, 0, 0},
    (triang){194, 167, 137, 0, 0, 0, 0},
    (triang){30, 54, 114, 0, 0, 0, 0},
    (triang){215, 220, 147, 0, 0, 0, 0},
    (triang){147, 108, 215, 0, 0, 0, 0},
    (triang){228, 7, 141, 0, 0, 0, 0},
    (triang){236, 64, 243, 0, 0, 0, 0},
    (triang){31, 219, 37, 0, 0, 0, 0},
    (triang){255, 76, 106, 0, 0, 0, 0},
    (triang){218, 123, 127, 0, 0, 0, 0},
    (triang){127, 220, 218, 0, 0, 0, 0},
    (triang){182, 93, 219, 0, 0, 0, 0},
    (triang){137, 152, 194, 0, 0, 0, 0},
    (triang){220, 127, 131, 0, 0, 0, 0},
    (triang){131, 147, 220, 0, 0, 0, 0},
    (triang){102, 184, 268, 0, 0, 0, 0},
    (triang){240, 253, 260, 0, 0, 0, 0},
    (triang){131, 222, 226, 0, 0, 0, 0},
    (triang){226, 225, 131, 0, 0, 0, 0},
    (triang){217, 57, 166, 0, 0, 0, 0},
    (triang){209, 130, 49, 0, 0, 0, 0},
    (triang){225, 226, 78, 0, 0, 0, 0},
    (triang){78, 229, 225, 0, 0, 0, 0},
    (triang){238, 91, 43, 0, 0, 0, 0},
    (triang){219, 31, 10, 0, 0, 0, 0},
    (triang){75, 129, 21, 0, 0, 0, 0},
    (triang){48, 130, 25, 0, 0, 0, 0},
    (triang){222, 232, 234, 0, 0, 0, 0},
    (triang){234, 226, 222, 0, 0, 0, 0},
    (triang){228, 42, 96, 0, 0, 0, 0},
    (triang){239, 141, 7, 0, 0, 0, 0},
    (triang){226, 234, 236, 0, 0, 0, 0},
    (triang){236, 78, 226, 0, 0, 0, 0},
    (triang){39, 87, 75, 0, 0, 0, 0},
    (triang){16, 133, 24, 0, 0, 0, 0},
    (triang){37, 146, 31, 0, 0, 0, 0},
    (triang){265, 18, 63, 0, 0, 0, 0},
    (triang){232, 237, 234, 0, 0, 0, 0},
    (triang){261, 178, 254, 0, 0, 0, 0},
    (triang){250, 25, 189, 0, 0, 0, 0},
    (triang){96, 174, 7, 0, 0, 0, 0},
    (triang){106, 177, 255, 0, 0, 0, 0},
    (triang){64, 236, 234, 0, 0, 0, 0},
    (triang){82, 134, 253, 0, 0, 0, 0},
    (triang){255, 24, 133, 0, 0, 0, 0},
    (triang){105, 251, 256, 0, 0, 0, 0},
    (triang){243, 91, 33, 0, 0, 0, 0},
    (triang){237, 242, 244, 0, 0, 0, 0},
    (triang){244, 234, 237, 0, 0, 0, 0},
    (triang){166, 85, 189, 0, 0, 0, 0},
    (triang){75, 93, 39, 0, 0, 0, 0},
    (triang){234, 244, 183, 0, 0, 0, 0},
    (triang){183, 64, 234, 0, 0, 0, 0},
    (triang){196, 118, 55, 0, 0, 0, 0},
    (triang){253, 240, 82, 0, 0, 0, 0},
    (triang){154, 106, 60, 0, 0, 0, 0},
    (triang){265, 63, 9, 0, 0, 0, 0},
    (triang){242, 247, 249, 0, 0, 0, 0},
    (triang){249, 244, 242, 0, 0, 0, 0},
    (triang){21, 18, 81, 0, 0, 0, 0},
    (triang){115, 178, 91, 0, 0, 0, 0},
    (triang){244, 249, 115, 0, 0, 0, 0},
    (triang){115, 183, 244, 0, 0, 0, 0},
    (triang){45, 39, 93, 0, 0, 0, 0},
    (triang){261, 43, 91, 0, 0, 0, 0},
    (triang){174, 245, 201, 0, 0, 0, 0},
    (triang){245, 192, 82, 0, 0, 0, 0},
    (triang){247, 252, 254, 0, 0, 0, 0},
    (triang){254, 249, 247, 0, 0, 0, 0},
    (triang){184, 199, 268, 0, 0, 0, 0},
    (triang){121, 181, 212, 0, 0, 0, 0},
    (triang){249, 254, 178, 0, 0, 0, 0},
    (triang){178, 115, 249, 0, 0, 0, 0},
    (triang){209, 58, 169, 0, 0, 0, 0},
    (triang){100, 201, 239, 0, 0, 0, 0},
    (triang){27, 238, 269, 0, 0, 0, 0},
    (triang){235, 12, 141, 0, 0, 0, 0},
    (triang){252, 257, 259, 0, 0, 0, 0},
    (triang){259, 254, 252, 0, 0, 0, 0},
    (triang){78, 236, 243, 0, 0, 0, 0},
    (triang){105, 27, 208, 0, 0, 0, 0},
    (triang){254, 259, 261, 0, 0, 0, 0}
};

#endif

float a, b, c;
int d, e, f;

#ifdef TEAPOT_OBJ2C
FILE *teapot;
#endif

vertex ray_start;
vertex ray_end;

int image_width, antialias, lighting;
float rotation, cos_rot, sin_rot;

const char *ASCII = "  __<jJjrcrg=qpg  __J]J]f(f(4Qpg```_\\)))lLL[hQbg\"\"\"[J]J]FC[[RQDQ";

static struct option longopts[5] = {
	{"antialias", no_argument      , NULL, 'a'},
	{"lighing"  , no_argument      , NULL, 'l'},
	{"width"    , required_argument, NULL, 'w'},
	{"rotate"   , required_argument, NULL, 'r'},
	{NULL       , 0                , NULL, 0  }
};

int ray_trace(float x, float y);
int ray_intersects_triangle(int n);
void normalize__vertex(vertex *v);

void usage()
{
	printf("Usage:\n");
	printf("   --antialias [-a]\n");
	printf("      (toggles antialiasing, on by default)\n");
	printf("   --lighting [-l]\n");
	printf("      (toggles lighting, on by default)\n");
	printf("   --width     [-w] columns\n");
	printf("      (sets width of image)\n");
	printf("   --rotate    [-r] angle\n");
	printf("      (rotate by angle degree's clockwise)\n");
}

int main(int argc, char *argv[])
{
	int x, y;
	int code;
	char c;
	
	antialias = 1;
	lighting = 1;
	image_width = 60;
	rotation = 0;
	
	while((c = getopt_long(argc, argv, "alw:r:", longopts, NULL)) != -1) {
		switch(c) {
			case 'a': {
				antialias = !antialias;
				break;
			}
			case 'l': {
				lighting = !lighting;
				break;
			}
			case 'w': {
				image_width = atoi(optarg);
				break;
			}
			case 'r': {
				rotation = (float)atof(optarg);
				break;
			}
			default: {
				usage();
				return 0;
			}
		}
	}
	
	rotation = - (rotation) * (3.141592653589793/180.0f);
	cos_rot = cos(rotation);
	sin_rot = sin(rotation);
	
	printf("\n");
	
#ifdef TEAPOT_OBJ2C
	vn = 1;
	fn = 1;
	
	teapot = fopen("teapot.obj", "r");
	
	verts = (vertex*)malloc(sizeof(vertex));
	faces = (triang*)malloc(sizeof(triang));
	
	while(fscanf(teapot, "v %f %f %f\n", &a, &b, &c) == 3) {
		vn++;
		verts = (vertex*)realloc(verts, vn*sizeof(vertex));
		
		// (a + ib) * (cos theta + i sin theta) =  a cos theta - b sin theta + i (b cos theta + a sin theta)
		verts[vn-1] = (vertex){a*cos_rot - c*sin_rot, b, c*cos_rot + a*sin_rot};
	}
	
	while(fscanf(teapot, "f %d %d %d\n", &d, &e, &f) == 3) {
		faces = (triang*)realloc(faces, vn*sizeof(triang));
		faces[fn-1] = (triang){d, e, f, 0, 0, 0, 0};
		
		U = (vertex){verts[e].x-verts[d].x, verts[e].y-verts[d].y, verts[e].z-verts[d].z};
		V = (vertex){verts[f].x-verts[d].x, verts[f].y-verts[d].y, verts[f].z-verts[d].z};
		
		faces[fn-1].A = U.y*V.z - U.z*V.y;
		faces[fn-1].B = U.z*V.x - U.x*V.z;
		faces[fn-1].C = U.x*V.y - U.y*V.x;
		
		ray_start = (vertex){faces[fn-1].A, faces[fn-1].B, faces[fn-1].C};
		normalize__vertex(&ray_start);
		
		faces[fn-1].A = ray_start.x;
		faces[fn-1].B = ray_start.y;
		faces[fn-1].C = ray_start.z;
		
		faces[fn-1].D = -(faces[fn-1].A*verts[d].x + faces[fn-1].B*verts[d].y + faces[fn-1].C*verts[d].z);
		
		fn++;
	}
	fn--;
	
	fclose(teapot);
#else
	for(x = 0; x < vn; x++)
		verts[x] = (vertex){verts[x].x*cos_rot - verts[x].z*sin_rot, verts[x].y, verts[x].z*cos_rot + verts[x].x*sin_rot};
	for(x = 0; x < fn; x++) {
		d = faces[x].a;
		e = faces[x].b;
		f = faces[x].c;
		
		U = (vertex){verts[e].x-verts[d].x, verts[e].y-verts[d].y, verts[e].z-verts[d].z};
		V = (vertex){verts[f].x-verts[d].x, verts[f].y-verts[d].y, verts[f].z-verts[d].z};
		
		faces[x].A = U.y*V.z - U.z*V.y;
		faces[x].B = U.z*V.x - U.x*V.z;
		faces[x].C = U.x*V.y - U.y*V.x;
		
		ray_start = (vertex){faces[x].A, faces[x].B, faces[x].C};
		normalize__vertex(&ray_start);
		
		faces[x].A = ray_start.x;
		faces[x].B = ray_start.y;
		faces[x].C = ray_start.z;
		
		faces[x].D = -(faces[x].A*verts[d].x + faces[x].B*verts[d].y + faces[x].C*verts[d].z);
	}
#endif
	
#ifdef TEAPOT_OBJ2C
	printf("int vn = %d;\n", vn);
	printf("int fn = %d;\n", fn);
	
	printf("\n");
	
	printf("vertex verts[%d] = {\n", vn);
	for(x = 0; x < vn; x++) {
		printf("    (vertex){%f, %f, %f}", verts[x].x, verts[x].y, verts[x].z);
		if(x != vn-1)
			printf(",\n");
	}
	printf("\n};\n");
	
	printf("triang faces[%d] = {\n", fn);
	for(x = 0; x < fn; x++) {
		printf("    (triang){%d, %d, %d, 0, 0, 0, 0}", faces[x].a, faces[x].b, faces[x].c);
		if(x != fn-1)
			printf(",\n");
	}
	printf("\n};\n");
	
	return 0;
#else
	for(y = 0; y < image_width/4; y++) {
		for(x = 0; x < image_width; x++) {
			if(antialias) {
				code  =  1*ray_trace((float)(x+0.0f/2.0f+1.0f/4.0f), (float)(y+2.0f/3.0f+1.0f/6.0f));
				code +=  2*ray_trace((float)(x+1.0f/2.0f+1.0f/4.0f), (float)(y+2.0f/3.0f+1.0f/6.0f));
				code +=  4*ray_trace((float)(x+0.0f/2.0f+1.0f/4.0f), (float)(y+1.0f/3.0f+1.0f/6.0f));
				code +=  8*ray_trace((float)(x+1.0f/2.0f+1.0f/4.0f), (float)(y+1.0f/3.0f+1.0f/6.0f));
				code += 16*ray_trace((float)(x+0.0f/2.0f+1.0f/4.0f), (float)(y+0.0f/3.0f+1.0f/6.0f));
				code += 32*ray_trace((float)(x+1.0f/2.0f+1.0f/4.0f), (float)(y+0.0f/3.0f+1.0f/6.0f));
			}
			else {
				code  = (64-1)*ray_trace((float)(x+1.0f/2.0f), (float)(y+2.0f/3.0f));
			}
			
			printf("%c", ASCII[code]);
		}
		printf("\n");
	}
	
	return 0;
#endif
}

vertex intersection;
vertex A, B, C;
float mu;

int ray_trace(float x, float y)
{
	int i;
	
	int min_i;
	float min_mu;
	
	ray_start = (vertex){((x*2)/(float)image_width-1)*40.0, (1-(y*4)/(float)image_width-0.12)*40.0, -1};
	ray_end = (vertex){ray_start.x*1.1, ray_start.y*1.1, 10};
	
	min_i = -1;
	for(i = 0; i < fn; i++) {
		if(ray_intersects_triangle(i)) {
			if(min_i == -1) {
				min_i = i;
				min_mu = mu;
			}
			else {
				if(mu < min_mu) {
					min_i = i;
					min_mu = mu;
				}
			}
		}
	}
	
	if(min_i != -1) {
		if(!lighting)
			return 1;
		
		mu = faces[min_i].A;
		
		if(mu < -0.5)
			return 0;
		if(mu >  0.5)
			return 1;
		
		mu += 0.5;
		mu *= 1000;
		
		return (random()%1000)<((int)mu);
	}
	
	return 0;
}

int ray_intersects_triangle(int n)
{
	mu = 0
		+ faces[n].A*(ray_start.x - ray_end.x)
		+ faces[n].B*(ray_start.y - ray_end.y)
		+ faces[n].C*(ray_start.z - ray_end.z)
	;
	
	if(mu == 0) {
		return 0;
	}
	
	mu = (faces[n].D + faces[n].A * ray_start.x + faces[n].B * ray_start.y + faces[n].C * ray_start.z) / mu;
	
	intersection = (vertex){
		ray_start.x + mu * (ray_end.x - ray_start.x),
		ray_start.y + mu * (ray_end.y - ray_start.y),
		ray_start.z + mu * (ray_end.z - ray_start.z)
	};
	
	A = verts[faces[n].a];
	B = verts[faces[n].b];
	C = verts[faces[n].c];
	
	A.x -= intersection.x; B.x -= intersection.x; C.x -= intersection.x;
	A.y -= intersection.y; B.y -= intersection.y; C.y -= intersection.y;
	A.z -= intersection.z; B.z -= intersection.z; C.z -= intersection.z;
	
	normalize__vertex(&A); normalize__vertex(&B); normalize__vertex(&C);
	
	a = A.x*B.x + A.y*B.y + A.z*B.z;
	b = B.x*C.x + B.y*C.y + B.z*C.z;
	c = C.x*A.x + C.y*A.y + C.z*A.z;
	
	a = acosf(a) + acosf(b) + acosf(c);
	if(ABS(a - 6.282) > 0.001) {
		return 1;
	}
	
	return 0;
}

void normalize__vertex(vertex *_v)
{
	float d;
	vertex v;
	
	v = *_v;
	
	d = 1.0f / sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
	v.x *= d; v.y *= d; v.z *= d;
	
	*_v = v;
}