diff options
author | quou <quou@disroot.org> | 2024-07-13 23:46:14 +1000 |
---|---|---|
committer | quou <quou@disroot.org> | 2024-07-13 23:46:31 +1000 |
commit | d7160d62b5d78e9191b4d61d7f491deb728cb478 (patch) | |
tree | 0bbb087df0fa32b2e47f00d8fc602f4921eec5a7 /render.c | |
parent | a43eb70ebe7844db0a4ffece47c22ae12384781b (diff) |
Model loading and basic lighting.
Diffstat (limited to 'render.c')
-rw-r--r-- | render.c | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -141,6 +141,7 @@ void ren_begin(Renderer* r, Colour* t, int* d, int w, int h) { r->clip.y = 0; r->clip.w = w; r->clip.h = h; + r->asp = (w << fbits) / h; } void ren_end(Renderer* r) { @@ -424,3 +425,51 @@ void ren_tri( #undef ec } +void ren_mesh( + Renderer* r, + const Mesh* m, + const Bitmap* tex +) { + int vc = m->vc; + int tri[8 * 3]; + int n[4]; + int i, asp = r->asp; + for (i = 0; i < vc; i += 3) { + int j; + for (j = 0; j < 3; j++) { + Mesh_Vert v = m->verts[i + j]; + int* wv = &tri[j * 8]; + wv[0] = m->p[v.p * 3 + 0]; + wv[1] = m->p[v.p * 3 + 1]; + wv[2] = m->p[v.p * 3 + 2]; + wv[3] = f1; + mtx_apply(mtx_peek(), wv); + persp(wv, asp); + ndc2clip((int*)&r->clip, wv); + n[0] = m->n[v.n * 3 + 0]; + n[1] = m->n[v.n * 3 + 1]; + n[2] = m->n[v.n * 3 + 2]; + n[3] = 0; + mtx_apply(mtx_peek(), n); + wv[3] = m->t[v.t * 2 + 0]; + wv[4] = m->t[v.t * 2 + 1]; + { + /* todo proper lighting */ + int ld[] = { f1/2, f1/2, -f1/2 }; + int nd[] = { f1/2, f1/2, f1/2 }; + int vd[] = { 0, 0, -f1 }; + int rd[4]; + int d = maxi(0, vec_dot(n, ld, 3)), s, l; + int a = 60; + vec_ref(rd, nd, vd, 3); + s = fpow(maxi(0, vec_dot(n, rd, 3)), 7) * 4; + l = mini(d + s + a, f1); + wv[5] = l; + wv[6] = l; + wv[7] = l; + } + } + ren_tri(r, &tri[0], &tri[8], &tri[16], tex); + } +} + |