/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // r_local.h -- private refresh defs #ifndef GLQUAKE #include "r_shared.h" #define ALIAS_BASE_SIZE_RATIO (1.0 / 11.0) // normalizing factor so player model works out to about // 1 pixel per triangle #define BMODEL_FULLY_CLIPPED 0x10 // value returned by R_BmodelCheckBBox () // if bbox is trivially rejected //=========================================================================== // viewmodel lighting typedef struct { int ambientlight; int shadelight; // new structs //int rgblight[3]; int rlight; int glight; int blight; int ramb; int gamb; int bamb; float *plightvec; float *rlightvec; float *glightvec; float *blightvec; } alight_t; //=========================================================================== // clipped bmodel edges typedef struct bedge_s { mvertex_t *v[2]; struct bedge_s *pnext; } bedge_t; typedef struct { float fv[3]; // viewspace x, y } auxvert_t; //=========================================================================== extern cvar_t *r_draworder; extern cvar_t *r_speeds; extern cvar_t *r_timegraph; extern cvar_t *r_graphheight; extern cvar_t *r_clearcolor; extern cvar_t *r_waterwarp; extern cvar_t *r_fullbright; extern cvar_t *r_drawentities; extern cvar_t *r_aliasstats; extern cvar_t *r_dspeeds; extern cvar_t *r_drawflat; extern cvar_t *r_ambient; extern cvar_t *r_reportsurfout; extern cvar_t *r_maxsurfs; extern cvar_t *r_numsurfs; extern cvar_t *r_reportedgeout; extern cvar_t *r_maxedges; extern cvar_t *r_lerpmodels; extern cvar_t *r_numedges; #define XCENTERING (1.0 / 2.0) #define YCENTERING (1.0 / 2.0) #define CLIP_EPSILON 0.001 #define BACKFACE_EPSILON 0.01 //=========================================================================== #define DIST_NOT_SET 98765 // !!! if this is changed, it must be changed in asm_draw.h too !!! typedef struct clipplane_s { vec3_t normal; float dist; struct clipplane_s *next; byte leftedge; byte rightedge; byte reserved[2]; } clipplane_t; extern clipplane_t view_clipplanes[4]; //============================================================================= void R_RenderWorld (void); //============================================================================= extern mplane_t screenedge[4]; extern vec3_t r_origin; extern vec3_t r_entorigin; extern float screenAspect; extern float verticalFieldOfView; extern float xOrigin, yOrigin; extern int r_visframecount; //============================================================================= extern int vstartscan; void R_ClearPolyList (void); void R_DrawPolyList (void); // // current entity info // extern qboolean insubmodel; extern vec3_t r_worldmodelorg; void R_DrawSprite (void); void R_RenderFace (msurface_t *fa, int clipflags); void R_RenderPoly (msurface_t *fa, int clipflags); void R_RenderBmodelFace (bedge_t *pedges, msurface_t *psurf); void R_TransformPlane (mplane_t *p, float *normal, float *dist); void R_TransformFrustum (void); void R_SetSkyFrame (void); void R_DrawSurfaceBlock16 (void); void R_DrawSurfaceBlock8 (void); texture_t *R_TextureAnimation (texture_t *base); #if id386 void R_DrawSurfaceBlock8_mip0 (void); void R_DrawSurfaceBlock8_mip1 (void); void R_DrawSurfaceBlock8_mip2 (void); void R_DrawSurfaceBlock8_mip3 (void); #endif #ifdef EXPREND void R_DrawSurfaceBlock8D_mip0 (void); void R_DrawSurfaceBlock8D_mip1 (void); void R_DrawSurfaceBlock8D_mip2 (void); void R_DrawSurfaceBlock8D_mip3 (void); void R_DrawSurfaceBlock8S_mip0 (void); void R_DrawSurfaceBlock8S_mip1 (void); void R_DrawSurfaceBlock8S_mip2 (void); void R_DrawSurfaceBlock8S_mip3 (void); #endif // 18-bit version void R_DrawSurfaceBlock8RGBX_mip0 (void); void R_DrawSurfaceBlock8RGBX_mip1 (void); void R_DrawSurfaceBlock8RGBX_mip2 (void); void R_DrawSurfaceBlock8RGBX_mip3 (void); void R_DrawSurfaceBlock8RGBXt_mip0 (void); void R_DrawSurfaceBlock8RGBXt_mip1 (void); void R_DrawSurfaceBlock8RGBXt_mip2 (void); void R_DrawSurfaceBlock8RGBXt_mip3 (void); void R_DrawSurfaceBlock8RGBX (byte mip, byte mif); void R_DrawSurfaceBlock8RGBXD_mip0 (void); void R_DrawSurfaceBlock8RGBXD_mip1 (void); void R_DrawSurfaceBlock8RGBXD_mip2 (void); void R_DrawSurfaceBlock8RGBXD_mip3 (void); void R_DrawSurfaceBlock8RGBXD (int mip, int mif); void R_DrawSurfaceBlock824RGBXD_mip0 (void); void R_DrawSurfaceBlock824RGBXD_mip1 (void); void R_DrawSurfaceBlock824RGBXD_mip2 (void); void R_DrawSurfaceBlock824RGBXD_mip3 (void); void R_DrawSurfaceBlock824RGBXD (int mip, int mif); void R_DrawSurfaceBlock888RGB_mip0 (void); void R_DrawSurfaceBlock888RGB_mip1 (void); void R_DrawSurfaceBlock888RGB_mip2 (void); void R_DrawSurfaceBlock888RGB_mip3 (void); void R_DrawSurfaceBlock888RGB (int mip, int mif); void R_DrawSurfaceBlock824RGBX_mip0 (void); void R_DrawSurfaceBlock824RGBX_mip1 (void); void R_DrawSurfaceBlock824RGBX_mip2 (void); void R_DrawSurfaceBlock824RGBX_mip3 (void); void R_DrawSurfaceBlock824RGBX (int mip, int mif); #if id386rgb // 18-bit version, x86 assembly void R_DrawSurfaceBlock8RGBASM_mip0 (void); void R_DrawSurfaceBlock8RGBASM_mip1 (void); void R_DrawSurfaceBlock8RGBASM_mip2 (void); void R_DrawSurfaceBlock8RGBASM_mip3 (void); #endif void R_DrawSurfaceBlock8RED_mip0 (void); void R_DrawSurfaceBlock8RED_mip1 (void); void R_DrawSurfaceBlock8RED_mip2 (void); void R_DrawSurfaceBlock8RED_mip3 (void); void R_DrawSurfaceBlock8GREEN_mip0 (void); void R_DrawSurfaceBlock8GREEN_mip1 (void); void R_DrawSurfaceBlock8GREEN_mip2 (void); void R_DrawSurfaceBlock8GREEN_mip3 (void); void R_DrawSurfaceBlock8BLUE_mip0 (void); void R_DrawSurfaceBlock8BLUE_mip1 (void); void R_DrawSurfaceBlock8BLUE_mip2 (void); void R_DrawSurfaceBlock8BLUE_mip3 (void); // 15-bit no lightstep version void R_DrawSurfaceBlock8_mip0fast (void); void R_DrawSurfaceBlock8_mip1fast (void); void R_DrawSurfaceBlock8_mip2fast (void); void R_DrawSurfaceBlock8_mip3fast (void); // 24-bit version void R_DrawSurfaceBlock24RGB_mip0 (void); void R_DrawSurfaceBlock24RGB_mip1 (void); void R_DrawSurfaceBlock24RGB_mip2 (void); void R_DrawSurfaceBlock24RGB_mip3 (void); void R_GenSkyTile (void *pdest); void R_GenSkyTile16 (void *pdest); void R_Surf8Patch (void); void R_Surf8FastPatch (void); #ifdef id386rgb void R_Surf8PatchRGB (void); #endif void R_Surf16Patch (void); void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags); void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel); void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel); surf_t *R_GetSurf (void); #ifdef VMTOC void R_AliasDrawModel (alight_t *plighting, qboolean viewmodel); extern qboolean r_fov_greater_than_90; #else void R_AliasDrawModel (alight_t *plighting); #endif void R_BeginEdgeFrame (void); void R_ScanEdges (void); void D_DrawSurfaces (void); void R_InsertNewEdges (edge_t *edgestoadd, edge_t *edgelist); void R_StepActiveU (edge_t *pedge); void R_RemoveEdges (edge_t *pedge); extern void R_Surf8Start (void); extern void R_Surf8End (void); #if id386rgb extern void R_Surf8RGBASMStart (void); extern void R_Surf8RGBASMEnd (void); #endif extern void R_Surf16Start (void); extern void R_Surf16End (void); extern void R_Surf8FastStart (void); extern void R_Surf8FastEnd (void); extern void R_Surf8REDStart (void); extern void R_Surf8REDEnd (void); extern void R_Surf8GREENStart (void); extern void R_Surf8GREENEnd (void); extern void R_Surf8BLUEStart (void); extern void R_Surf8BLUEEnd (void); extern void R_EdgeCodeStart (void); extern void R_EdgeCodeEnd (void); extern cvar_t *r_lowdetail; // deprecated extern cvar_t *r_virtualmode; extern cvar_t *r_shading; extern cvar_t *r_lowworld; extern cvar_t *r_menucolor; extern cvar_t *r_tingecolor; extern cvar_t *r_tinge; extern cvar_t *r_lowmodels; extern cvar_t *r_coloredlights; extern cvar_t *r_truecolor; extern cvar_t *r_overbrightBits; extern cvar_t *r_fullbrights; extern cvar_t *r_overbrightmdl; extern cvar_t *r_coloreddyns; extern cvar_t *r_shift1; extern cvar_t *r_shift2; extern cvar_t *r_alphashift; extern void R_RotateBmodel (void); extern int c_faceclip; extern int r_polycount; extern int r_wholepolycount; extern model_t *cl_worldmodel; extern float viewmatrix[3][4]; extern int *pfrustum_indexes[4]; // !!! if this is changed, it must be changed in asm_draw.h too !!! #define NEAR_CLIP 0.01 extern int ubasestep, errorterm, erroradjustup, erroradjustdown; extern int vstartscan; extern fixed16_t sadjust, tadjust; extern fixed16_t bbextents, bbextentt; extern cvar_t *s_pitchin; #define MAXBVERTINDEXES 1000 // new clipped vertices when clipping bmodels // to the world BSP extern mvertex_t *r_ptverts, *r_ptvertsmax; extern vec3_t sbaseaxis[3], tbaseaxis[3]; extern float entity_rotation[3][3]; extern int reinit_surfcache; extern int r_currentkey; extern int r_currentbkey; typedef struct btofpoly_s { int clipflags; msurface_t *psurf; } btofpoly_t; #define MAX_BTOFPOLYS 5000 // FIXME: tune this extern int numbtofpolys; extern btofpoly_t *pbtofpolys; void R_InitTurb (void); void R_ZDrawSubmodelPolys (model_t *clmodel); //========================================================= // Alias models //========================================================= #ifdef QSB #define MAXALIASVERTS 5000 // not like any qsb demander will reasonably exceed this #else #define MAXALIASVERTS 2000 // TODO: tune this #endif #define ALIAS_Z_CLIP_PLANE 5 extern int numverts; extern int a_skinwidth; extern mtriangle_t *ptriangles; extern int numtriangles; extern aliashdr_t *paliashdr; extern mdl_t *pmdl; extern float leftclip, topclip, rightclip, bottomclip; extern int r_acliptype; extern finalvert_t *pfinalverts; extern auxvert_t *pauxverts; qboolean R_AliasCheckBBox (void); //========================================================= // turbulence stuff #define AMP 8*0x10000 #define AMP2 3 #define SPEED 20 //========================================================= // particle stuff void R_DrawParticles (void); void R_InitParticles (void); void R_ClearParticles (void); void R_DrawFlares (void); void R_InitFlares (void); void R_ClearFlares (void); void R_ReadPointFile_f (void); void R_SurfacePatch (void); extern int r_amodels_drawn; extern edge_t *auxedges; extern int r_numallocatededges; extern edge_t *r_edges, *edge_p, *edge_max; extern edge_t *newedges[MAXHEIGHT]; extern edge_t *removeedges[MAXHEIGHT]; extern int screenwidth; // FIXME: make stack vars when debugging done extern edge_t edge_head; extern edge_t edge_tail; extern edge_t edge_aftertail; extern int r_bmodelactive; extern vrect_t *pconupdate; extern float aliasxscale, aliasyscale, aliasxcenter, aliasycenter; extern float r_aliastransition, r_resfudge; extern int r_outofsurfaces; extern int r_outofedges; extern mvertex_t *r_pcurrentvertbase; extern int r_maxvalidedgeoffset; void R_AliasClipTriangle (mtriangle_t *ptri); extern float r_time1; extern float dp_time1, dp_time2, db_time1, db_time2, rw_time1, rw_time2; extern float se_time1, se_time2, de_time1, de_time2 #ifndef VMTOC , dv_time1, dv_time2 #endif ; extern int r_frustum_indexes[4*6]; extern int r_maxsurfsseen, r_maxedgesseen, r_cnumsurfs; extern qboolean r_surfsonstack; extern cshift_t cshift_water; extern qboolean r_dowarpold, r_viewchanged; extern qboolean inwat; // leilei - for underwater sounds extern qboolean r_docrapold; extern qboolean r_doshrooms; extern mleaf_t *r_viewleaf, *r_oldviewleaf; extern vec3_t r_emins, r_emaxs; extern mnode_t *r_pefragtopnode; extern int r_clipflags; extern int r_dlightframecount; extern int r_shadowframecount; extern qboolean r_fov_greater_than_90; void R_StoreEfrags (efrag_t **ppefrag); void R_TimeRefresh_f (void); void R_TimeGraph (void); void R_PrintAliasStats (void); void R_PrintTimes (void); void R_PrintDSpeeds (void); void R_AnimateLight (void); int R_LightPoint (vec3_t p); void R_SetupFrame (void); #ifdef SPLIT void R_SetupFrameSplit (void); #endif void R_cshift_f (void); void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1); void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip); void R_SplitEntityOnNode2 (mnode_t *node); void R_MarkLights (dlight_t *light, int bit, mnode_t *node); #endif #ifdef INTERPOL7 void R_FinalizeAliasVerts (); #endif extern unsigned int dynlightenabled;