1/* 2Copyright (C) 1996-1997 Id Software, Inc. 3 4This program is free software; you can redistribute it and/or 5modify it under the terms of the GNU General Public License 6as published by the Free Software Foundation; either version 2 7of the License, or (at your option) any later version. 8 9This program is distributed in the hope that it will be useful, 10but WITHOUT ANY WARRANTY; without even the implied warranty of 11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13See the GNU General Public License for more details. 14 15You should have received a copy of the GNU General Public License 16along with this program; if not, write to the Free Software 17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19*/ 20// r_local.h -- private refresh defs 21 22#ifndef GLQUAKE 23#include "r_shared.h" 24 25#define ALIAS_BASE_SIZE_RATIO (1.0 / 11.0) 26 // normalizing factor so player model works out to about 27 // 1 pixel per triangle 28 29#define BMODEL_FULLY_CLIPPED 0x10 // value returned by R_BmodelCheckBBox () 30 // if bbox is trivially rejected 31 32//=========================================================================== 33// viewmodel lighting 34 35typedef struct { 36 int ambientlight; 37 int shadelight; 38 float *plightvec; 39} alight_t; 40 41//=========================================================================== 42// clipped bmodel edges 43 44typedef struct bedge_s 45{ 46 mvertex_t *v[2]; 47 struct bedge_s *pnext; 48} bedge_t; 49 50typedef struct { 51 float fv[3]; // viewspace x, y 52} auxvert_t; 53 54//=========================================================================== 55 56extern cvar_t r_draworder; 57extern cvar_t r_speeds; 58extern cvar_t r_timegraph; 59extern cvar_t r_graphheight; 60extern cvar_t r_clearcolor; 61extern cvar_t r_waterwarp; 62extern cvar_t r_fullbright; 63extern cvar_t r_drawentities; 64extern cvar_t r_aliasstats; 65extern cvar_t r_dspeeds; 66extern cvar_t r_drawflat; 67extern cvar_t r_ambient; 68extern cvar_t r_reportsurfout; 69extern cvar_t r_maxsurfs; 70extern cvar_t r_numsurfs; 71extern cvar_t r_reportedgeout; 72extern cvar_t r_maxedges; 73extern cvar_t r_numedges; 74 75#define XCENTERING (1.0 / 2.0) 76#define YCENTERING (1.0 / 2.0) 77 78#define CLIP_EPSILON 0.001 79 80#define BACKFACE_EPSILON 0.01 81 82//=========================================================================== 83 84#define DIST_NOT_SET 98765 85 86// !!! if this is changed, it must be changed in asm_draw.h too !!! 87typedef struct clipplane_s 88{ 89 vec3_t normal; 90 float dist; 91 struct clipplane_s *next; 92 byte leftedge; 93 byte rightedge; 94 byte reserved[2]; 95} clipplane_t; 96 97extern clipplane_t view_clipplanes[4]; 98 99//============================================================================= 100 101void R_RenderWorld (void); 102 103//============================================================================= 104 105extern mplane_t screenedge[4]; 106 107extern vec3_t r_origin; 108 109extern vec3_t r_entorigin; 110 111extern float screenAspect; 112extern float verticalFieldOfView; 113extern float xOrigin, yOrigin; 114 115extern int r_visframecount; 116 117//============================================================================= 118 119extern int vstartscan; 120 121 122void R_ClearPolyList (void); 123void R_DrawPolyList (void); 124 125// 126// current entity info 127// 128extern qboolean insubmodel; 129extern vec3_t r_worldmodelorg; 130 131 132void R_DrawSprite (void); 133void R_RenderFace (msurface_t *fa, int clipflags); 134void R_RenderPoly (msurface_t *fa, int clipflags); 135void R_RenderBmodelFace (bedge_t *pedges, msurface_t *psurf); 136void R_TransformPlane (mplane_t *p, float *normal, float *dist); 137void R_TransformFrustum (void); 138void R_SetSkyFrame (void); 139void R_DrawSurfaceBlock16 (void); 140void R_DrawSurfaceBlock8 (void); 141texture_t *R_TextureAnimation (texture_t *base); 142 143#if id386 144 145void R_DrawSurfaceBlock8_mip0 (void); 146void R_DrawSurfaceBlock8_mip1 (void); 147void R_DrawSurfaceBlock8_mip2 (void); 148void R_DrawSurfaceBlock8_mip3 (void); 149 150#endif 151 152void R_GenSkyTile (void *pdest); 153void R_GenSkyTile16 (void *pdest); 154void R_Surf8Patch (void); 155void R_Surf16Patch (void); 156void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags); 157void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel); 158 159void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel); 160surf_t *R_GetSurf (void); 161void R_AliasDrawModel (alight_t *plighting); 162void R_BeginEdgeFrame (void); 163void R_ScanEdges (void); 164void D_DrawSurfaces (void); 165void R_InsertNewEdges (edge_t *edgestoadd, edge_t *edgelist); 166void R_StepActiveU (edge_t *pedge); 167void R_RemoveEdges (edge_t *pedge); 168 169extern void R_Surf8Start (void); 170extern void R_Surf8End (void); 171extern void R_Surf16Start (void); 172extern void R_Surf16End (void); 173extern void R_EdgeCodeStart (void); 174extern void R_EdgeCodeEnd (void); 175 176extern void R_RotateBmodel (void); 177 178extern int c_faceclip; 179extern int r_polycount; 180extern int r_wholepolycount; 181 182extern model_t *cl_worldmodel; 183 184extern int *pfrustum_indexes[4]; 185 186// !!! if this is changed, it must be changed in asm_draw.h too !!! 187#define NEAR_CLIP 0.01 188 189extern int ubasestep, errorterm, erroradjustup, erroradjustdown; 190extern int vstartscan; 191 192extern fixed16_t sadjust, tadjust; 193extern fixed16_t bbextents, bbextentt; 194 195#define MAXBVERTINDEXES 1000 // new clipped vertices when clipping bmodels 196 // to the world BSP 197extern mvertex_t *r_ptverts, *r_ptvertsmax; 198 199extern vec3_t sbaseaxis[3], tbaseaxis[3]; 200extern float entity_rotation[3][3]; 201 202extern int reinit_surfcache; 203 204extern int r_currentkey; 205extern int r_currentbkey; 206 207typedef struct btofpoly_s { 208 int clipflags; 209 msurface_t *psurf; 210} btofpoly_t; 211 212#define MAX_BTOFPOLYS 5000 // FIXME: tune this 213 214extern int numbtofpolys; 215extern btofpoly_t *pbtofpolys; 216 217void R_InitTurb (void); 218void R_ZDrawSubmodelPolys (model_t *clmodel); 219 220//========================================================= 221// Alias models 222//========================================================= 223 224#define MAXALIASVERTS 2000 // TODO: tune this 225#define ALIAS_Z_CLIP_PLANE 5 226 227extern int numverts; 228extern int a_skinwidth; 229extern mtriangle_t *ptriangles; 230extern int numtriangles; 231extern aliashdr_t *paliashdr; 232extern mdl_t *pmdl; 233extern float leftclip, topclip, rightclip, bottomclip; 234extern int r_acliptype; 235extern finalvert_t *pfinalverts; 236extern auxvert_t *pauxverts; 237 238qboolean R_AliasCheckBBox (void); 239 240//========================================================= 241// turbulence stuff 242 243#define AMP 8*0x10000 244#define AMP2 3 245#define SPEED 20 246 247//========================================================= 248// particle stuff 249 250void R_DrawParticles (void); 251void R_InitParticles (void); 252void R_ClearParticles (void); 253void R_ReadPointFile_f (void); 254void R_SurfacePatch (void); 255 256extern int r_amodels_drawn; 257extern edge_t *auxedges; 258extern int r_numallocatededges; 259extern edge_t *r_edges, *edge_p, *edge_max; 260 261extern edge_t *newedges[MAXHEIGHT]; 262extern edge_t *removeedges[MAXHEIGHT]; 263 264extern int screenwidth; 265 266// FIXME: make stack vars when debugging done 267extern edge_t edge_head; 268extern edge_t edge_tail; 269extern edge_t edge_aftertail; 270extern int r_bmodelactive; 271extern vrect_t *pconupdate; 272 273extern float aliasxscale, aliasyscale, aliasxcenter, aliasycenter; 274extern float r_aliastransition, r_resfudge; 275 276extern int r_outofsurfaces; 277extern int r_outofedges; 278 279extern mvertex_t *r_pcurrentvertbase; 280extern int r_maxvalidedgeoffset; 281 282void R_AliasClipTriangle (mtriangle_t *ptri); 283 284extern float r_time1; 285extern float dp_time1, dp_time2, db_time1, db_time2, rw_time1, rw_time2; 286extern float se_time1, se_time2, de_time1, de_time2, dv_time1, dv_time2; 287extern int r_frustum_indexes[4*6]; 288extern int r_maxsurfsseen, r_maxedgesseen, r_cnumsurfs; 289extern qboolean r_surfsonstack; 290extern cshift_t cshift_water; 291extern qboolean r_dowarpold, r_viewchanged; 292 293extern mleaf_t *r_viewleaf, *r_oldviewleaf; 294 295extern vec3_t r_emins, r_emaxs; 296extern mnode_t *r_pefragtopnode; 297extern int r_clipflags; 298extern int r_dlightframecount; 299extern qboolean r_fov_greater_than_90; 300 301void R_StoreEfrags (efrag_t **ppefrag); 302void R_TimeRefresh_f (void); 303void R_TimeGraph (void); 304void R_PrintAliasStats (void); 305void R_PrintTimes (void); 306void R_PrintDSpeeds (void); 307void R_AnimateLight (void); 308int R_LightPoint (vec3_t p); 309void R_SetupFrame (void); 310void R_cshift_f (void); 311void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1); 312void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip); 313void R_SplitEntityOnNode2 (mnode_t *node); 314void R_MarkLights (dlight_t *light, int bit, mnode_t *node); 315 316#endif 317