]> icculus.org git repositories - taylor/freespace2.git/blob - src/graphics/grzbuffer.cpp
Screenshot function filled, will output into ~/.freespace(2)/Data
[taylor/freespace2.git] / src / graphics / grzbuffer.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/Graphics/GrZbuffer.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * Code for the software renderer's zbuffer
16  *
17  * $Log$
18  * Revision 1.3  2002/06/09 04:41:18  relnev
19  * added copyright header
20  *
21  * Revision 1.2  2002/05/07 03:16:45  theoddone33
22  * The Great Newline Fix
23  *
24  * Revision 1.1.1.1  2002/05/03 03:28:09  root
25  * Initial import.
26  *
27  * 
28  * 2     10/07/98 10:53a Dave
29  * Initial checkin.
30  * 
31  * 1     10/07/98 10:49a Dave
32  * 
33  * 1     3/25/98 8:07p John
34  * Split software renderer into Win32 and DirectX
35  *
36  * $NoKeywords: $
37  */
38
39 #include "osapi.h"
40 #include "2d.h"
41 #include "floating.h"
42 #include "grsoft.h"
43 #include "grinternal.h"
44
45 int gr_zcount=GR_Z_COUNT;
46 int gr_zoffset=0;
47
48 uint *gr_zbuffer = NULL;
49 int gr_zbuffer_w = 0;
50 int gr_zbuffer_h = 0;
51
52 int gr_zbuffering = 0;
53 int gr_zbuffering_mode = 0;
54 int gr_global_zbuffering = 0;
55
56 // If mode is FALSE, turn zbuffer off the entire frame,
57 // no matter what people pass to gr_zbuffer_set.
58 void gr8_zbuffer_clear(int mode)
59 {
60         if ( mode )     {
61                 gr_zbuffering = 1;
62                 gr_zbuffering_mode = GR_ZBUFF_FULL;
63                 gr_global_zbuffering = 1;
64
65                 if ( (!gr_zbuffer) || (gr_screen.max_w!=gr_zbuffer_w) || (gr_screen.max_h!=gr_zbuffer_h) )      {
66                         //mprintf(( "Allocating a %d x %d zbuffer\n", gr_screen.max_w, gr_screen.max_h ));
67                         if ( gr_zbuffer )       {
68                                 free(gr_zbuffer);
69                                 gr_zbuffer = NULL;
70                         }
71                         gr_zbuffer_w = gr_screen.max_w;
72                         gr_zbuffer_h = gr_screen.max_h;
73                         gr_zbuffer = (uint *)malloc(gr_zbuffer_w*gr_zbuffer_h*sizeof(uint));
74                         if ( !gr_zbuffer )      {
75                                 Error( LOCATION, "Couldn't allocate zbuffer\n" );
76                                 gr_zbuffering = 0;
77                                 return;
78                         }
79                         memset( gr_zbuffer, 0, gr_zbuffer_w*gr_zbuffer_h*sizeof(uint) );
80                 }
81
82
83                 gr_zcount++;
84                 gr_zoffset += GR_Z_RANGE;
85                 if ( gr_zcount >= (GR_Z_COUNT-16) )     {
86                         //mprintf(( "Bing!\n" ));
87                         memset( gr_zbuffer, 0, gr_zbuffer_w*gr_zbuffer_h*sizeof(uint) );
88                         gr_zcount = 0;
89                         gr_zoffset = GR_Z_RANGE*16;
90                 }
91         } else {
92                 gr_zbuffering = 0;
93                 gr_zbuffering_mode = GR_ZBUFF_NONE;
94                 gr_global_zbuffering = 0;
95         }
96 }
97
98
99 int gr8_zbuffer_get()
100 {
101         if ( !gr_global_zbuffering )    {
102                 return GR_ZBUFF_NONE;
103         }
104         return gr_zbuffering_mode;
105 }
106
107 int gr8_zbuffer_set(int mode)
108 {
109         if ( !gr_global_zbuffering )    {
110                 gr_zbuffering = 0;
111                 return GR_ZBUFF_NONE;
112         }
113
114         int tmp = gr_zbuffering_mode;
115
116         gr_zbuffering_mode = mode;
117
118         if ( gr_zbuffering_mode == GR_ZBUFF_NONE )      {
119                 gr_zbuffering = 0;
120         } else {
121                 gr_zbuffering = 1;
122         }
123         return tmp;
124 }
125