added crappy polygon filler
[dosdemo] / src / polytest.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "screen.h"
5 #include "demo.h"
6 #include "3dgfx.h"
7
8 struct mesh {
9         int prim;
10         struct g3d_vertex *varr;
11         unsigned int *iarr;
12         int vcount, icount;
13 };
14
15 static int init(void);
16 static void destroy(void);
17 static void start(long trans_time);
18 static void draw(void);
19 static void draw_mesh(struct mesh *mesh);
20 static int gen_cube(struct mesh *mesh, float sz);
21
22 static struct screen scr = {
23         "polytest",
24         init,
25         destroy,
26         start, 0,
27         draw
28 };
29
30 static struct mesh cube;
31
32 struct screen *polytest_screen(void)
33 {
34         return &scr;
35 }
36
37 static int init(void)
38 {
39         gen_cube(&cube, 1.0);
40         return 0;
41 }
42
43 static void destroy(void)
44 {
45         free(cube.varr);
46 }
47
48 static void start(long trans_time)
49 {
50         g3d_matrix_mode(G3D_PROJECTION);
51         g3d_load_identity();
52         g3d_perspective(50.0, 1.3333333, 0.5, 100.0);
53
54         g3d_enable(G3D_CULL_FACE);
55 }
56
57 static void draw(void)
58 {
59         static int prev_mx, prev_my;
60         static float theta, phi = 25;
61
62         int dx = mouse_x - prev_mx;
63         int dy = mouse_y - prev_my;
64         prev_mx = mouse_x;
65         prev_my = mouse_y;
66
67         if(dx || dy) {
68                 theta += dx * 2.0;
69                 phi += dy * 2.0;
70
71                 if(phi < -90) phi = -90;
72                 if(phi > 90) phi = 90;
73         }
74
75         /*float angle = (float)time_msec / 50.0;*/
76
77         memset(fb_pixels, 0, fb_width * fb_height * 2);
78
79         g3d_matrix_mode(G3D_MODELVIEW);
80         g3d_load_identity();
81         g3d_translate(0, 0, -5);
82         g3d_rotate(phi, 1, 0, 0);
83         g3d_rotate(theta, 0, 1, 0);
84
85         draw_mesh(&cube);
86 }
87
88 static void draw_mesh(struct mesh *mesh)
89 {
90         if(mesh->iarr) {
91                 /*g3d_draw_indexed(mesh->prim, mesh->iarr, mesh->icount, mesh->varr);*/
92         } else {
93                 g3d_draw(mesh->prim, mesh->varr, mesh->vcount);
94         }
95 }
96
97 #define NORMAL(vp, x, y, z) do { vp->nx = x; vp->ny = y; vp->nz = z; } while(0)
98 #define COLOR(vp, cr, cg, cb) do { vp->r = cr; vp->g = cg; vp->b = cb; } while(0)
99 #define TEXCOORD(vp, tu, tv) do { vp->u = tu; vp->v = tv; } while(0)
100 #define VERTEX(vp, vx, vy, vz) \
101         do { \
102                 vp->x = vx; vp->y = vy; vp->z = vz; vp->w = 1.0f; \
103                 ++vp; \
104         } while(0)
105
106 static int gen_cube(struct mesh *mesh, float sz)
107 {
108         struct g3d_vertex *vptr;
109         float hsz = sz / 2.0;
110
111         mesh->prim = G3D_QUADS;
112         mesh->iarr = 0;
113         mesh->icount = 0;
114
115         mesh->vcount = 24;
116         if(!(mesh->varr = malloc(mesh->vcount * sizeof *mesh->varr))) {
117                 return -1;
118         }
119         vptr = mesh->varr;
120
121         /* -Z */
122         NORMAL(vptr, 0, 0, -1);
123         COLOR(vptr, 255, 0, 255);
124         VERTEX(vptr, hsz, -hsz, -hsz);
125         VERTEX(vptr, -hsz, -hsz, -hsz);
126         VERTEX(vptr, -hsz, hsz, -hsz);
127         VERTEX(vptr, hsz, hsz, -hsz);
128         /* -Y */
129         NORMAL(vptr, 0, -1, 0);
130         COLOR(vptr, 0, 255, 255);
131         VERTEX(vptr, -hsz, -hsz, -hsz);
132         VERTEX(vptr, hsz, -hsz, -hsz);
133         VERTEX(vptr, hsz, -hsz, hsz);
134         VERTEX(vptr, -hsz, -hsz, hsz);
135         /* -X */
136         NORMAL(vptr, -1, 0, 0);
137         COLOR(vptr, 255, 255, 0);
138         VERTEX(vptr, -hsz, -hsz, -hsz);
139         VERTEX(vptr, -hsz, -hsz, hsz);
140         VERTEX(vptr, -hsz, hsz, hsz);
141         VERTEX(vptr, -hsz, hsz, -hsz);
142         /* +X */
143         NORMAL(vptr, 1, 0, 0);
144         COLOR(vptr, 255, 0, 0);
145         VERTEX(vptr, hsz, -hsz, hsz);
146         VERTEX(vptr, hsz, -hsz, -hsz);
147         VERTEX(vptr, hsz, hsz, -hsz);
148         VERTEX(vptr, hsz, hsz, hsz);
149         /* +Y */
150         NORMAL(vptr, 0, 1, 0);
151         COLOR(vptr, 0, 255, 0);
152         VERTEX(vptr, -hsz, hsz, hsz);
153         VERTEX(vptr, hsz, hsz, hsz);
154         VERTEX(vptr, hsz, hsz, -hsz);
155         VERTEX(vptr, -hsz, hsz, -hsz);
156         /* +Z */
157         NORMAL(vptr, 0, 0, 1);
158         COLOR(vptr, 0, 0, 255);
159         VERTEX(vptr, -hsz, -hsz, hsz);
160         VERTEX(vptr, hsz, -hsz, hsz);
161         VERTEX(vptr, hsz, hsz, hsz);
162         VERTEX(vptr, -hsz, hsz, hsz);
163
164         return 0;
165 }