From e6f8a3356a91e0304e9965c7b8bfc2f06a2b79cc Mon Sep 17 00:00:00 2001 From: quou Date: Sat, 6 Jul 2024 17:55:46 +1000 Subject: Triangle fill. --- 3de.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to '3de.c') diff --git a/3de.c b/3de.c index 6bf9e33..8af3d18 100644 --- a/3de.c +++ b/3de.c @@ -20,29 +20,42 @@ void draw_torus(Renderer* r, Colour c) { static int a = 0; const int pc = sizeof torus_points / sizeof *torus_points; int asp = (r->clip.w << fbits) / r->clip.h; - int p[4] = { 0, 0, 5 << fbits, f1 }; - int i; + int p[4 * 3] = { 0, 0, 5 << fbits, f1, 0, 0, 0, f1, 0, 0, 0, f1 }, * wp; + int i, j; mtx_push_trans(p); mtx_push_rot_x(a); mtx_push_rot_y(a); mtx_push_rot_z(a); - for (i = 0; i < pc; i += 3) { - vec_cpy(p, &torus_points[i], 3); - mtx_apply(mtx_peek(), p); - persp(p, asp); - ndc2clip((int*)&r->clip, p); - ren_point(r, c, p[0], p[1]); + for (i = 0; i < pc; i += 9) { + for (j = 0; j < 3; j++) { + wp = &p[j * 4]; + vec_cpy(wp, &torus_points[i + j * 3], 3); + mtx_apply(mtx_peek(), wp); + persp(wp, asp); + ndc2clip((int*)&r->clip, wp); + } + ren_tri(r, c, &p[0], &p[4], &p[8], tri_mode_flat); } mtx_popn(4); a += 3; } +void draw_tri(Renderer* r, Colour c, int x, int y) { + int v0[] = { 100, 100 }; + int v1[] = { 0, 0 }; + int v2[] = { 150, 300 }; + v1[0] = x; + v1[1] = y; + ren_tri(r, c, v0, v1, v2, tri_mode_flat); +} + int entrypoint(int argc, const char** argv, Arena* a) { App* app; - Renderer r; + Renderer r = { 0 }; Heap h; FPS f; char buf[32]; + int* depth = 0; Colour blue = make_aliceblue(); (void)argc; (void)argv; @@ -55,12 +68,18 @@ int entrypoint(int argc, const char** argv, Arena* a) { app = new_app(&h, 640, 480, "3D Engine"); if (!app) return app->err; init_fps(&f, 20); + depth = heap_alloc(&h, 3000 * 3000 * sizeof *depth); + if (!depth) { + print_err("Out of memory.\n"); + return error_out_of_memory; + } while (app->o) { fps_begin(&f); while (f.now >= f.next) { app_begin(app); - ren_begin(&r, app->fb, app->w, app->h); + ren_begin(&r, app->fb, depth, app->w, app->h); ren_clear(&r); + ren_cleard(&r, f1 * 300); sprintf(buf, "FPS: %d", app->fps); ren_text(&r, blue, 3, 3, buf); sprintf(buf, "CAP: %d", f.fps); -- cgit v1.2.3-54-g00ecf