/* 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 #define FIXED_POINT_PARTICLES 1 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; // !!! if this is changed, it must be changed in d_ifacea.h too !!! typedef struct particle_s { // driver-usable fields #if !FIXED_POINT_PARTICLES vec3_t org; float color; #else fixed16_t rgf16_org[ 3 ]; fixed16_t f16_color; #endif // drivers never touch the following fields struct particle_s *next; #if !FIXED_POINT_PARTICLES vec3_t vel; float ramp; float die; #else fixed16_t rgf16_vel[ 3 ]; fixed16_t f16_ramp; fixed16_t f16_die; #endif 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; typedef struct { fixed32_t f32_sdivzstepu, f32_tdivzstepu, f32_zistepu; fixed32_t f32_sdivzstepv, f32_tdivzstepv, f32_zistepv; fixed32_t f32_sdivzorigin, f32_tdivzorigin, f32_ziorigin; } fixed_spans8_var_package_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; extern fixed16_t r_pright_fixed[ 3 ], r_pup_fixed[ 3 ], r_ppn_fixed[ 3 ], r_porigin_fixed[3], pxcenter_fixed, pycenter_fixed; 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;