ad2d5b3bf7d23135593f5cb5e37887534f0ede91
[retroray] / src / gaw / polyfill.h
1 #ifndef POLYFILL_H_
2 #define POLYFILL_H_
3
4 #include "../util.h"
5 #include "gaw.h"
6
7 #define POLYFILL_MODE_MASK      0x03
8 #define POLYFILL_TEX_BIT        0x04
9 #define POLYFILL_ALPHA_BIT      0x08
10 #define POLYFILL_ADD_BIT        0x10
11 #define POLYFILL_ZBUF_BIT       0x20
12
13 enum {
14         POLYFILL_WIRE                   = 0,
15         POLYFILL_FLAT,
16         POLYFILL_GOURAUD,
17
18         POLYFILL_TEX_WIRE               = 4,
19         POLYFILL_TEX_FLAT,
20         POLYFILL_TEX_GOURAUD,
21
22         POLYFILL_ALPHA_WIRE             = 8,
23         POLYFILL_ALPHA_FLAT,
24         POLYFILL_ALPHA_GOURAUD,
25
26         POLYFILL_ALPHA_TEX_WIRE = 12,
27         POLYFILL_ALPHA_TEX_FLAT,
28         POLYFILL_ALPHA_TEX_GOURAUD,
29
30         POLYFILL_ADD_WIRE               = 16,
31         POLYFILL_ADD_FLAT,
32         POLYFILL_ADD_GOURAUD,
33
34         POLYFILL_ADD_TEX_WIRE   = 20,
35         POLYFILL_ADD_TEX_FLAT,
36         POLYFILL_ADD_TEX_GOURAUD,
37
38
39         POLYFILL_WIRE_ZBUF                      = 32,
40         POLYFILL_FLAT_ZBUF,
41         POLYFILL_GOURAUD_ZBUF,
42
43         POLYFILL_TEX_WIRE_ZBUF          = 36,
44         POLYFILL_TEX_FLAT_ZBUF,
45         POLYFILL_TEX_GOURAUD_ZBUF,
46
47         POLYFILL_ALPHA_WIRE_ZBUF        = 40,
48         POLYFILL_ALPHA_FLAT_ZBUF,
49         POLYFILL_ALPHA_GOURAUD_ZBUF,
50
51         POLYFILL_ALPHA_TEX_WIRE_ZBUF = 44,
52         POLYFILL_ALPHA_TEX_FLAT_ZBUF,
53         POLYFILL_ALPHA_TEX_GOURAUD_ZBUF,
54
55         POLYFILL_ADD_WIRE_ZBUF          = 48,
56         POLYFILL_ADD_FLAT_ZBUF,
57         POLYFILL_ADD_GOURAUD_ZBUF,
58
59         POLYFILL_ADD_TEX_WIRE_ZBUF      = 52,
60         POLYFILL_ADD_TEX_FLAT_ZBUF,
61         POLYFILL_ADD_TEX_GOURAUD_ZBUF
62 };
63
64 typedef uint32_t gaw_pixel;
65
66 #define PACK_RGB(r, g, b) \
67         (((r) << 16) | ((g) << 8) | (b))
68 #define PACK_RGBA(r, g, b, a) \
69         (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
70 #define UNPACK_R(pix)   ((pix) & 0xff)
71 #define UNPACK_G(pix)   (((pix) >> 8) & 0xff)
72 #define UNPACK_B(pix)   (((pix) >> 16) & 0xff)
73 #define UNPACK_A(pix)   ((pix) >> 24)
74
75 struct vertex {
76         float x, y, z, w;
77         float nx, ny, nz;
78         float u, v;
79         int r, g, b, a;
80 };
81
82 /* projected vertices for the rasterizer */
83 struct pvertex {
84         int32_t x, y; /* 24.8 fixed point */
85         int32_t u, v; /* 16.16 fixed point */
86         int32_t r, g, b, a;  /* int 0-255 */
87         int32_t z;      /* 0-65535 */
88 };
89
90 struct pimage {
91         gaw_pixel *pixels;
92         int width, height;
93
94         int xshift, yshift;
95         unsigned int xmask, ymask;
96 };
97
98 extern struct pimage pfill_fb;
99 extern struct pimage pfill_tex;
100 extern uint32_t *pfill_zbuf;
101
102 void polyfill_fbheight(int height);
103
104 void polyfill(int mode, struct pvertex *verts, int nverts);
105
106 void polyfill_wire(struct pvertex *verts, int nverts);
107 void polyfill_flat(struct pvertex *verts, int nverts);
108 void polyfill_gouraud(struct pvertex *verts, int nverts);
109 void polyfill_tex_wire(struct pvertex *verts, int nverts);
110 void polyfill_tex_flat(struct pvertex *verts, int nverts);
111 void polyfill_tex_gouraud(struct pvertex *verts, int nverts);
112 void polyfill_alpha_wire(struct pvertex *verts, int nverts);
113 void polyfill_alpha_flat(struct pvertex *verts, int nverts);
114 void polyfill_alpha_gouraud(struct pvertex *verts, int nverts);
115 void polyfill_alpha_tex_wire(struct pvertex *verts, int nverts);
116 void polyfill_alpha_tex_flat(struct pvertex *verts, int nverts);
117 void polyfill_alpha_tex_gouraud(struct pvertex *verts, int nverts);
118 void polyfill_add_wire(struct pvertex *verts, int nverts);
119 void polyfill_add_flat(struct pvertex *verts, int nverts);
120 void polyfill_add_gouraud(struct pvertex *verts, int nverts);
121 void polyfill_add_tex_wire(struct pvertex *verts, int nverts);
122 void polyfill_add_tex_flat(struct pvertex *verts, int nverts);
123 void polyfill_add_tex_gouraud(struct pvertex *verts, int nverts);
124 void polyfill_flat_zbuf(struct pvertex *verts, int nverts);
125 void polyfill_gouraud_zbuf(struct pvertex *verts, int nverts);
126 void polyfill_tex_flat_zbuf(struct pvertex *verts, int nverts);
127 void polyfill_tex_gouraud_zbuf(struct pvertex *verts, int nverts);
128 void polyfill_alpha_flat_zbuf(struct pvertex *verts, int nverts);
129 void polyfill_alpha_gouraud_zbuf(struct pvertex *verts, int nverts);
130 void polyfill_alpha_tex_flat_zbuf(struct pvertex *verts, int nverts);
131 void polyfill_alpha_tex_gouraud_zbuf(struct pvertex *verts, int nverts);
132 void polyfill_add_flat_zbuf(struct pvertex *verts, int nverts);
133 void polyfill_add_gouraud_zbuf(struct pvertex *verts, int nverts);
134 void polyfill_add_tex_flat_zbuf(struct pvertex *verts, int nverts);
135 void polyfill_add_tex_gouraud_zbuf(struct pvertex *verts, int nverts);
136
137 #endif  /* POLYFILL_H_ */