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