summaryrefslogtreecommitdiff
path: root/3de.c
diff options
context:
space:
mode:
Diffstat (limited to '3de.c')
-rw-r--r--3de.c39
1 files changed, 29 insertions, 10 deletions
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);