1 /*
2 * Copyright(c) 1997-2001 Id Software, Inc.
3 * Copyright(c) 2002 The Quakeforge Project.
4 * Copyright(c) 2006 Quetoo.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or(at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 *
15 * See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 */
21 
22 #ifndef __VIDEO_H__
23 #define __VIDEO_H__
24 
25 #include <stdio.h>
26 #include <math.h>
27 
28 #include "qgl.h"
29 
30 #define PITCH 0
31 #define YAW 1
32 #define ROLL 2
33 
34 typedef unsigned char pixel_t;
35 
36 typedef struct vrect_s {
37 	int x, y, width, height;
38 	struct vrect_s *pnext;
39 } vrect_t;
40 
41 typedef struct {
42 	pixel_t *buffer;				// invisible buffer
43 	pixel_t *colormap;				// 256 * VID_GRADES size
44 	pixel_t *alphamap;				// 256 * 256 translucency map
45 	int rowbytes;					// may be > width if displayed in a window
46 									// can be negative for stupid dibs
47 	unsigned int width, height;
48 } viddef_t;
49 
50 extern viddef_t viddef;
51 
52 #define MAX_ENTITIES		128
53 #define MAX_PARTICLES		4096
54 
55 #define POWERSUIT_SCALE		4.0F
56 
57 #define SHELL_RED_COLOR		0xF2
58 #define SHELL_GREEN_COLOR	0xD0
59 #define SHELL_BLUE_COLOR	0xF3
60 
61 #define SHELL_RG_COLOR		0xDC
62 #define SHELL_RB_COLOR		0x68
63 #define SHELL_BG_COLOR		0x78
64 #define SHELL_WHITE_COLOR	0xD7
65 
66 typedef struct entity_s {
67 	struct model_s *model;  // opaque type outside view
68 	float angles[3];
69 
70 	// most recent data
71 	float origin[3];  // also used as RF_BEAM's "from"
72 	int frame;  // also used as RF_BEAM's diameter
73 
74 	// previous data for lerping
75 	float oldorigin[3];  // also used as RF_BEAM's "to"
76 	int oldframe;
77 
78 	// misc
79 	float backlerp;  // 0.0 = current, 1.0 = old
80 	int skinnum;  // also used as RF_BEAM's palette index
81 
82 	int lightstyle;  // for flashing entities
83 	float alpha;  // ignore if RF_TRANSLUCENT isn't set
84 
85 	struct image_s *skin;  // NULL for inline skin
86 	int flags;
87 } entity_t;
88 
89 #define ENTITY_FLAGS  68
90 
91 typedef struct {
92 	vec3_t origin;
93 	int color;
94 	float alpha;
95 } particle_t;
96 
97 typedef struct {
98 	int x, y, width, height; // in virtual screen coordinates
99 	float fov_x, fov_y;
100 	float vieworg[3];
101 	float viewangles[3];
102 	float time;  // time is uesed to auto animate
103 	int rdflags;  // RDF_UNDERWATER, etc
104 
105 	byte *areabits;  // if not NULL, only areas with set bits will be drawn
106 
107 	int num_entities;
108 	entity_t *entities;
109 
110 	int num_particles;
111 	particle_t *particles;
112 } viewdef_t;
113 
114 extern byte color_white[4];
115 extern byte color_black[4];
116 
117 typedef struct {
118 	void *OpenGLLib;  // instance of opengl library
119 	FILE *log_fp;
120 } glwstate_t;
121 
122 extern glwstate_t glw_state;
123 
124 /*
125   skins will be outline flood filled and mip mapped
126   pics and sprites with alpha will be outline flood filled
127   pic won't be mip mapped
128 
129   model skin
130   sprite frame
131   wall texture
132   pic
133 */
134 
135 typedef enum {
136 	it_skin,
137 	it_sprite,
138 	it_wall,
139 	it_pic,
140 	it_sky
141 } imagetype_t;
142 
143 typedef struct image_s {
144 	char name[MAX_QPATH];  // game path, including extension
145 	imagetype_t type;
146 	int width, height;  // source image
147 	int upload_width, upload_height;  // after power of two and picmip
148 	int registration_sequence;  // 0 = free
149 	struct msurface_s *texturechain;  // for sort-by-texture world drawing
150 	GLuint texnum;  // gl texture binding
151 	float sl, tl, sh, th;  // 0,0 - 1,1 unless part of the scrap
152 	qboolean scrap;
153 	qboolean has_alpha;
154 } image_t;
155 
156 #define TEXNUM_LIGHTMAPS	1024
157 #define TEXNUM_SCRAPS		1152
158 #define TEXNUM_IMAGES		1153
159 
160 #define MAX_GLTEXTURES	1024
161 
162 #include "gl_model.h"
163 
164 void GL_BeginRendering(int *x, int *y, int *width, int *height);
165 void GL_EndRendering(void);
166 
167 void GL_SetDefaultState(void);
168 void GL_UpdateSwapInterval(void);
169 
170 extern float gldepthmin, gldepthmax;
171 
172 typedef struct {
173 	float x, y, z;
174 	float s, t;
175 	float r, g, b;
176 } glvert_t;
177 
178 
179 #define MAX_LBM_HEIGHT		480
180 
181 #define BACKFACE_EPSILON	0.01
182 
183 
184 extern image_t gltextures[MAX_GLTEXTURES];
185 extern int numgltextures;
186 
187 extern image_t *r_notexture;
188 extern image_t *r_particletexture;
189 extern entity_t *currententity;
190 extern model_t *currentmodel;
191 extern int r_visframecount;
192 extern int r_framecount;
193 extern cplane_t frustum[4];
194 extern int c_brush_polys, c_alias_polys;
195 extern int gl_filter_min, gl_filter_max;
196 
197 // view origin
198 extern vec3_t vup;
199 extern vec3_t vpn;
200 extern vec3_t vright;
201 extern vec3_t r_origin;
202 
203 // screen size info
204 extern viewdef_t r_viewdef;
205 extern int r_viewcluster, r_viewcluster2, r_oldviewcluster, r_oldviewcluster2;
206 
207 extern cvar_t *r_drawentities;
208 extern cvar_t *r_speeds;
209 extern cvar_t *r_fullbright;
210 extern cvar_t *r_novis;
211 extern cvar_t *r_nocull;
212 extern cvar_t *r_lerpmodels;
213 
214 extern cvar_t *gl_vertex_arrays;
215 extern cvar_t *gl_ext_multitexture;
216 extern cvar_t *gl_ext_compiled_vertex_array;
217 
218 extern cvar_t *gl_log;
219 extern cvar_t *gl_lightmap;
220 extern cvar_t *gl_monolightmap;
221 extern cvar_t *gl_rounddown;
222 extern cvar_t *gl_picmip;
223 extern cvar_t *gl_skymip;
224 extern cvar_t *gl_wireframe;
225 extern cvar_t *gl_finish;
226 extern cvar_t *gl_ztrick;
227 extern cvar_t *gl_clear;
228 extern cvar_t *gl_cull;
229 extern cvar_t *gl_modulate;
230 extern cvar_t *gl_intensity;
231 extern cvar_t *gl_playermip;
232 extern cvar_t *gl_drawbuffer;
233 extern cvar_t *gl_driver;
234 extern cvar_t *gl_texturemode;
235 extern cvar_t *gl_texturealphamode;
236 extern cvar_t *gl_texturesolidmode;
237 extern cvar_t *gl_lockpvs;
238 
239 extern cvar_t *vid_width;
240 extern cvar_t *vid_height;
241 extern cvar_t *vid_fullscreen;
242 extern cvar_t *vid_gamma;
243 
244 extern cvar_t *intensity;
245 
246 extern int gl_lightmap_format;
247 extern int gl_solid_format;
248 extern int gl_alpha_format;
249 extern int gl_tex_solid_format;
250 extern int gl_tex_alpha_format;
251 
252 extern int c_visible_lightmaps;
253 extern int c_visible_textures;
254 
255 extern cvar_t *skydistance; /* skybox size change */
256 
257 extern float r_world_matrix[16];
258 
259 void GL_TranslatePlayerSkin(int playernum);
260 void GL_Bind(int texnum);
261 void GL_MBind(GLenum target, int texnum);
262 void GL_TexEnv(GLenum value);
263 void GL_EnableMultitexture(qboolean enable);
264 void GL_SelectTexture(GLenum);
265 
266 void GL_LightPoint(vec3_t p, vec3_t color);
267 
268 extern model_t *r_worldmodel;
269 
270 extern unsigned d_8to24table[256];
271 
272 extern int registration_sequence;
273 
274 void GL_Init(void);
275 void GL_Shutdown(void);
276 void GL_Register(void);
277 void GL_BeginRegistration(char *model);
278 void GL_EndRegistration(void);
279 void GL_RenderFrame(viewdef_t *fd);
280 void GL_BeginFrame(void);
281 void GL_EndFrame(void);
282 void GL_Clear(void);
283 void GL_SetGL2D(void);
284 qboolean GL_SetMode(void);
285 qboolean GL_InitGraphics(int width, int height, qboolean fullscreen);
286 void GL_ShutdownGraphics(void);
287 void GL_EnableLogging(qboolean enable);
288 void GL_LogNewFrame(void);
289 void GL_Screenshot_f(void);
290 void GL_DrawAliasModel(entity_t *e);
291 void GL_DrawBrushModel(entity_t *e);
292 void GL_DrawSpriteModel(entity_t *e);
293 void GL_DrawBeam(entity_t *e);
294 void GL_DrawWorld(void);
295 void GL_DrawAlphaSurfaces(void);
296 void GL_RenderBrushPoly(msurface_t *fa);
297 void GL_InitParticleTexture(void);
298 void GL_InitNoTexture(void);
299 void Draw_InitLocal(void);
300 void GL_SubdivideSurface(msurface_t *fa);
301 qboolean GL_CullBox(vec3_t mins, vec3_t maxs);
302 void GL_RotateForEntity(entity_t *e);
303 void GL_MarkLeafs(void);
304 
305 void VID_Restart_f(void);
306 
307 glpoly_t *WaterWarpPolyVerts(glpoly_t *p);
308 void EmitWaterPolys(msurface_t *fa);
309 void GL_AddSkySurface(msurface_t *fa);
310 void GL_ClearSkyBox(void);
311 void GL_DrawSkyBox(void);
312 void GL_SetSky(char *name);
313 
314 void COM_StripExtension(char *in, char *out);
315 
316 image_t *Draw_FindPic(char *name);
317 void Draw_GetPicSize(int *w, int *h, char *name);
318 void Draw_Pic(int x, int y, char *name);
319 void Draw_Char(int x, int y, int c);
320 void Draw_Fill(int x, int y, int w, int h, int c);
321 
322 void GL_BeginFrame(void);
323 void GL_SwapBuffers(int);
324 
325 int Draw_GetPalette(void);
326 
327 void GL_ResampleTexture(unsigned *in, int inwidth, int inheight, unsigned *out, int outwidth, int outheight);
328 
329 struct image_s *GL_RegisterSkin(char *name);
330 struct model_s *GL_RegisterModel(char *name);
331 
332 image_t *GL_LoadPic(char *name, byte *pic, int width, int height, imagetype_t type, int bits);
333 image_t *GL_FindImage(char *name, imagetype_t type);
334 void GL_TextureMode(char *string);
335 void GL_ImageList_f(void);
336 
337 void GL_InitImages(void);
338 void GL_ShutdownImages(void);
339 
340 void GL_FreeUnusedImages(void);
341 
342 void GL_TextureAlphaMode(char *string);
343 void GL_TextureSolidMode(char *string);
344 
345 /*
346 GL config stuff
347 */
348 
349 typedef struct {
350 	const char *renderer_string;
351 	const char *vendor_string;
352 	const char *version_string;
353 	const char *extensions_string;
354 } glconfig_t;
355 
356 typedef struct {
357 	float inverse_intensity;
358 	qboolean fullscreen;
359 
360 	int prev_width;
361 	int prev_height;
362 
363 	int lightmap_textures;
364 
365 	int currenttextures[2];
366 	int currenttmu;
367 } glstate_t;
368 
369 extern glconfig_t gl_config;
370 extern glstate_t gl_state;
371 
372 #endif /*__VIDEO_H__*/
373