]> icculus.org git repositories - taylor/freespace2.git/blob - src/graphics/grzbuffer.cpp
Initial revision
[taylor/freespace2.git] / src / graphics / grzbuffer.cpp
1 /*
2  * $Logfile: /Freespace2/code/Graphics/GrZbuffer.cpp $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Code for the software renderer's zbuffer
8  *
9  * $Log$
10  * Revision 1.1  2002/05/03 03:28:09  root
11  * Initial revision
12  *
13  * 
14  * 2     10/07/98 10:53a Dave
15  * Initial checkin.
16  * 
17  * 1     10/07/98 10:49a Dave
18  * 
19  * 1     3/25/98 8:07p John
20  * Split software renderer into Win32 and DirectX
21  *
22  * $NoKeywords: $
23  */
24
25 #include "osapi.h"
26 #include "2d.h"
27 #include "floating.h"
28 #include "grsoft.h"
29 #include "grinternal.h"
30
31 int gr_zcount=GR_Z_COUNT;
32 int gr_zoffset=0;
33
34 uint *gr_zbuffer = NULL;
35 int gr_zbuffer_w = 0;
36 int gr_zbuffer_h = 0;
37
38 int gr_zbuffering = 0;
39 int gr_zbuffering_mode = 0;
40 int gr_global_zbuffering = 0;
41
42 // If mode is FALSE, turn zbuffer off the entire frame,
43 // no matter what people pass to gr_zbuffer_set.
44 void gr8_zbuffer_clear(int mode)
45 {
46         if ( mode )     {
47                 gr_zbuffering = 1;
48                 gr_zbuffering_mode = GR_ZBUFF_FULL;
49                 gr_global_zbuffering = 1;
50
51                 if ( (!gr_zbuffer) || (gr_screen.max_w!=gr_zbuffer_w) || (gr_screen.max_h!=gr_zbuffer_h) )      {
52                         //mprintf(( "Allocating a %d x %d zbuffer\n", gr_screen.max_w, gr_screen.max_h ));
53                         if ( gr_zbuffer )       {
54                                 free(gr_zbuffer);
55                                 gr_zbuffer = NULL;
56                         }
57                         gr_zbuffer_w = gr_screen.max_w;
58                         gr_zbuffer_h = gr_screen.max_h;
59                         gr_zbuffer = (uint *)malloc(gr_zbuffer_w*gr_zbuffer_h*sizeof(uint));
60                         if ( !gr_zbuffer )      {
61                                 Error( LOCATION, "Couldn't allocate zbuffer\n" );
62                                 gr_zbuffering = 0;
63                                 return;
64                         }
65                         memset( gr_zbuffer, 0, gr_zbuffer_w*gr_zbuffer_h*sizeof(uint) );
66                 }
67
68
69                 gr_zcount++;
70                 gr_zoffset += GR_Z_RANGE;
71                 if ( gr_zcount >= (GR_Z_COUNT-16) )     {
72                         //mprintf(( "Bing!\n" ));
73                         memset( gr_zbuffer, 0, gr_zbuffer_w*gr_zbuffer_h*sizeof(uint) );
74                         gr_zcount = 0;
75                         gr_zoffset = GR_Z_RANGE*16;
76                 }
77         } else {
78                 gr_zbuffering = 0;
79                 gr_zbuffering_mode = GR_ZBUFF_NONE;
80                 gr_global_zbuffering = 0;
81         }
82 }
83
84
85 int gr8_zbuffer_get()
86 {
87         if ( !gr_global_zbuffering )    {
88                 return GR_ZBUFF_NONE;
89         }
90         return gr_zbuffering_mode;
91 }
92
93 int gr8_zbuffer_set(int mode)
94 {
95         if ( !gr_global_zbuffering )    {
96                 gr_zbuffering = 0;
97                 return GR_ZBUFF_NONE;
98         }
99
100         int tmp = gr_zbuffering_mode;
101
102         gr_zbuffering_mode = mode;
103
104         if ( gr_zbuffering_mode == GR_ZBUFF_NONE )      {
105                 gr_zbuffering = 0;
106         } else {
107                 gr_zbuffering = 1;
108         }
109         return tmp;
110 }