e7aabc235efd44ab1b4fe3ee2e9f5e535f6a29ec
[dosdemo] / src / 3dgfx.c
1 #include <string.h>
2 #include "3dgfx.h"
3
4 #define STACK_SIZE      8
5 typedef float g3d_matrix[16];
6
7 struct g3d_state {
8         unsigned int opt;
9
10         g3d_matrix mat[G3D_NUM_MATRICES][STACK_SIZE];
11         int mtop[G3D_NUM_MATRICES];
12
13         int width, height;
14         void *pixels;
15 };
16
17 static struct g3d_state st;
18
19 void g3d_init(void)
20 {
21         int i;
22
23         memset(&st, 0, sizeof st);
24
25         for(i=0; i<G3D_NUM_MATRICES; i++) {
26                 g3d_set_matrix(i, 0);
27         }
28 }
29
30 void g3d_framebuffer(int width, int height, void *pixels)
31 {
32         st.width = width;
33         st.height = height;
34         st.pixels = pixels;
35 }
36
37 void g3d_enable(unsigned int opt)
38 {
39         st.opt |= opt;
40 }
41
42 void g3d_disable(unsigned int opt)
43 {
44         st.opt &= ~opt;
45 }
46
47 void g3d_setopt(unsigned int opt, unsigned int mask)
48 {
49         st.opt = (st.opt & ~mask) | (opt & mask);
50 }
51
52 unsigned int g3d_getopt(unsigned int mask)
53 {
54         return st.opt & mask;
55 }
56
57 void g3d_set_matrix(int which, const float *m)
58 {
59         int top = st.mtop[which];
60         memcpy(st.mat[which][top], m, 16 * sizeof(float));
61 }
62
63 #define M(i,j)  (((i) << 2) + (j))
64 void g3d_mult_matrix(int which, const float *m2)
65 {
66         int i, j, top = st.mtop[which];
67         float m1[16];
68         float *dest = st.mat[which][top];
69
70         memcpy(m1, dest, sizeof m1);
71
72         for(i=0; i<4; i++) {
73                 for(j=0; j<4; j++) {
74                         *dest++ = m1[M(0,j)] * m2[M(i,0)] +
75                                 m1[M(1,j)] * m2[M(i,1)] +
76                                 m1[M(2,j)] * m2[M(i,2)] +
77                                 m1[M(3,j)] * m2[M(i,3)];
78                 }
79         }
80 }
81 /* TODO continue ... */