text: /*
  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;
  	float		*plightvec;
  } 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_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
  
  void R_GenSkyTile (void *pdest);
  void R_GenSkyTile16 (void *pdest);
  void R_Surf8Patch (void);
  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);
  void R_AliasDrawModel (alight_t *plighting);
  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);
  extern void R_Surf16Start (void);
  extern void R_Surf16End (void);
  extern void R_EdgeCodeStart (void);
  extern void R_EdgeCodeEnd (void);
  
  extern void R_RotateBmodel (void);
  
  extern int	c_faceclip;
  extern int	r_polycount;
  extern int	r_wholepolycount;
  
  extern	model_t		*cl_worldmodel;
  
  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;
  
  #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
  //=========================================================
  
  #define MAXALIASVERTS		2000	// TODO: tune this
  #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_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, dv_time1, dv_time2;
  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 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 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);
  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
  