void tmain(void) { size_t start, stop, t; char c; start = stop = 0; if (field(in.v, 1, &start, &stop)) tdraw(in.v, in.pmemb, start, stop); else twrite(in.v, in.pmemb); for (;;) { if (read(tty.in, &c, 1) < 0) perror("read"); switch (c) { case '\n': sel.nmemb = stop - start + 1; sel.v = in.v + start; /* FALLTHROUGH */ case CONTROL('C'): case CONTROL('D'): return; case CONTROL('A'): t = 0; /* FALLTHROUGH */ if (0) { case CONTROL('N'): t = stop + rune(in.v, stop, 1); } if (!field(in.v, 1, &t, &stop)) continue; start = t; break; case CONTROL('E'): t = in.pmemb - 1; /* FALLTHROUGH */ if (0) { case CONTROL('P'): t = start + rune(in.v, start, -1); } if (!field(in.v, -1, &t, &start)) continue; stop = t; break; default: continue; } if (in.nlines) tprintf(T_CURSOR_UP, in.nlines); tprintf(T_COLUMN_ADDRESS, 1); tdraw(in.v, in.pmemb, start, stop); } }
int main(int argc, char* argv[]) { puts("args: path/to/obj path/to/bmp"); FILE* const fobj = oload(argc == 3 ? argv[1] : "model/salesman.obj"); SDL_Surface* const fdif = sload(argc == 3 ? argv[2] : "model/salesman.bmp"); const Obj obj = oparse(fobj); const Triangles tv = tvgen(obj); // Triangle Vertices. const Triangles tt = ttgen(obj); // Triangle Textures. const Triangles tn = tngen(obj); // Triangle Normals. const Sdl sdl = ssetup(800, 600); float* const zbuff = (float*) malloc(sizeof(float) * sdl.xres * sdl.yres); for(Input input = iinit(); !input.done; input = ipump(input)) { uint32_t* const pixel = slock(sdl); reset(zbuff, pixel, sdl.xres * sdl.yres); const Vertex center = { 0.0f, 0.0f, 0.0f }; const Vertex upward = { 0.0f, 1.0f, 0.0f }; const Vertex eye = { sinf(input.xt), sinf(input.yt), cosf(input.xt) }; const Vertex z = vunit(vsub(eye, center)); const Vertex x = vunit(vcross(upward, z)); const Vertex y = vcross(z, x); for(int i = 0; i < tv.count; i++) { const Triangle nrm = tviewnrm(tn.triangle[i], x, y, z); const Triangle tex = tt.triangle[i]; const Triangle tri = tviewtri(tv.triangle[i], x, y, z, eye); const Triangle per = tperspective(tri); const Triangle vew = tviewport(per, sdl); const Target target = { vew, nrm, tex, fdif }; tdraw(sdl.yres, pixel, zbuff, target); } sunlock(sdl); schurn(sdl); spresent(sdl); } // Let the OS free hoisted memory for a quick exit. return 0; }