/* | |
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. | |
*/ | |
// d_iface.h: interface header file for rasterization driver modules | |
#define WARP_WIDTH 320 | |
#define WARP_HEIGHT 200 | |
#define MAX_LBM_HEIGHT 480 | |
typedef struct | |
{ | |
float u, v; | |
float s, t; | |
float zi; | |
} emitpoint_t; | |
typedef enum { | |
pt_static, pt_grav, pt_slowgrav, pt_fire, pt_explode, pt_explode2, pt_blob, pt_blob2, | |
ptype_t_max = 1 << 30 | |
} ptype_t; | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
typedef struct particle_s | |
{ | |
// driver-usable fields | |
vec3_t org; | |
float color; | |
// drivers never touch the following fields | |
struct particle_s *next; | |
vec3_t vel; | |
float ramp; | |
float die; | |
ptype_t type; | |
} particle_t; | |
#define PARTICLE_Z_CLIP 8.0 | |
typedef struct polyvert_s { | |
float u, v, zi, s, t; | |
} polyvert_t; | |
typedef struct polydesc_s { | |
int numverts; | |
float nearzi; | |
msurface_t *pcurrentface; | |
polyvert_t *pverts; | |
} polydesc_t; | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
typedef struct finalvert_s { | |
int v[6]; // u, v, s, t, l, 1/z | |
int flags; | |
float reserved; | |
} finalvert_t; | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
typedef struct | |
{ | |
void *pskin; | |
maliasskindesc_t *pskindesc; | |
int skinwidth; | |
int skinheight; | |
mtriangle_t *ptriangles; | |
finalvert_t *pfinalverts; | |
int numtriangles; | |
int drawtype; | |
int seamfixupX16; | |
} affinetridesc_t; | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
typedef struct { | |
float u, v, zi, color; | |
} screenpart_t; | |
typedef struct | |
{ | |
int nump; | |
emitpoint_t *pverts; // there's room for an extra element at [nump], | |
// if the driver wants to duplicate element [0] at | |
// element [nump] to avoid dealing with wrapping | |
mspriteframe_t *pspriteframe; | |
vec3_t vup, vright, vpn; // in worldspace | |
float nearzi; | |
} spritedesc_t; | |
typedef struct | |
{ | |
int u, v; | |
float zi; | |
int color; | |
} zpointdesc_t; | |
extern cvar_t r_drawflat; | |
extern int d_spanpixcount; | |
extern int r_framecount; // sequence # of current frame since Quake | |
// started | |
extern qboolean r_drawpolys; // 1 if driver wants clipped polygons | |
// rather than a span list | |
extern qboolean r_drawculledpolys; // 1 if driver wants clipped polygons that | |
// have been culled by the edge list | |
extern qboolean r_worldpolysbacktofront; // 1 if driver wants polygons | |
// delivered back to front rather | |
// than front to back | |
extern qboolean r_recursiveaffinetriangles; // true if a driver wants to use | |
// recursive triangular subdivison | |
// and vertex drawing via | |
// D_PolysetDrawFinalVerts() past | |
// a certain distance (normally | |
// only used by the software | |
// driver) | |
extern float r_aliasuvscale; // scale-up factor for screen u and v | |
// on Alias vertices passed to driver | |
extern int r_pixbytes; | |
extern qboolean r_dowarp; | |
extern affinetridesc_t r_affinetridesc; | |
extern spritedesc_t r_spritedesc; | |
extern zpointdesc_t r_zpointdesc; | |
extern polydesc_t r_polydesc; | |
extern int d_con_indirect; // if 0, Quake will draw console directly | |
// to vid.buffer; if 1, Quake will | |
// draw console via D_DrawRect. Must be | |
// defined by driver | |
extern vec3_t r_pright, r_pup, r_ppn; | |
void D_Aff8Patch (void *pcolormap); | |
void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height); | |
void D_DisableBackBufferAccess (void); | |
void D_EndDirectRect (int x, int y, int width, int height); | |
void D_PolysetDraw (void); | |
void D_PolysetDrawFinalVerts (finalvert_t *fv, int numverts); | |
void D_DrawParticle (particle_t *pparticle); | |
void D_DrawPoly (void); | |
void D_DrawSprite (void); | |
void D_DrawSurfaces (void); | |
void D_DrawZPoint (void); | |
void D_EnableBackBufferAccess (void); | |
void D_EndParticles (void); | |
void D_Init (void); | |
void D_ViewChanged (void); | |
void D_SetupFrame (void); | |
void D_StartParticles (void); | |
void D_TurnZOn (void); | |
void D_WarpScreen (void); | |
void D_FillRect (vrect_t *vrect, int color); | |
void D_DrawRect (void); | |
void D_UpdateRects (vrect_t *prect); | |
// currently for internal use only, and should be a do-nothing function in | |
// hardware drivers | |
// FIXME: this should go away | |
void D_PolysetUpdateTables (void); | |
// these are currently for internal use only, and should not be used by drivers | |
extern int r_skydirect; | |
extern byte *r_skysource; | |
// transparency types for D_DrawRect () | |
#define DR_SOLID 0 | |
#define DR_TRANSPARENT 1 | |
// !!! must be kept the same as in quakeasm.h !!! | |
#define TRANSPARENT_COLOR 0xFF | |
extern void *acolormap; // FIXME: should go away | |
//=======================================================================// | |
// callbacks to Quake | |
typedef struct | |
{ | |
pixel_t *surfdat; // destination for generated surface | |
int rowbytes; // destination logical width in bytes | |
msurface_t *surf; // description for surface to generate | |
fixed8_t lightadj[MAXLIGHTMAPS]; | |
// adjust for lightmap levels for dynamic lighting | |
texture_t *texture; // corrected for animating textures | |
int surfmip; // mipmapped ratio of surface texels / world pixels | |
int surfwidth; // in mipmapped texels | |
int surfheight; // in mipmapped texels | |
} drawsurf_t; | |
extern drawsurf_t r_drawsurf; | |
void R_DrawSurface (void); | |
void R_GenTile (msurface_t *psurf, void *pdest); | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
#define TURB_TEX_SIZE 64 // base turbulent texture size | |
// !!! if this is changed, it must be changed in d_ifacea.h too !!! | |
#define CYCLE 128 // turbulent cycle size | |
#define TILE_SIZE 128 // size of textures generated by R_GenTiledSurf | |
#define SKYSHIFT 7 | |
#define SKYSIZE (1 << SKYSHIFT) | |
#define SKYMASK (SKYSIZE - 1) | |
extern float skyspeed, skyspeed2; | |
extern float skytime; | |
extern int c_surf; | |
extern vrect_t scr_vrect; | |
extern byte *r_warpbuffer; | |