summaryrefslogtreecommitdiff
path: root/render.c
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2024-07-13 23:46:14 +1000
committerquou <quou@disroot.org>2024-07-13 23:46:31 +1000
commitd7160d62b5d78e9191b4d61d7f491deb728cb478 (patch)
tree0bbb087df0fa32b2e47f00d8fc602f4921eec5a7 /render.c
parenta43eb70ebe7844db0a4ffece47c22ae12384781b (diff)
Model loading and basic lighting.
Diffstat (limited to 'render.c')
-rw-r--r--render.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/render.c b/render.c
index 95fc5d9..710d2e1 100644
--- a/render.c
+++ b/render.c
@@ -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);
+ }
+}
+