This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/vid_gl/r_local.h

874 lines
27 KiB
C

/*
Copyright (C) 1997-2001 Id Software, Inc.
Copyright (C) 2002-2007 Victor Luchits
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.
*/
#ifndef __R_LOCAL_H__
#define __R_LOCAL_H__
#include <windows.h>
#include "launch_api.h"
#include "engine_api.h"
#include "render_api.h"
#include "pmtrace.h"
#include "entity_types.h"
#if defined( _MSC_VER ) && ( _MSC_VER >= 1400 )
# define ALIGN(x) __declspec(align(16))
#else
# define ALIGN(x)
#endif
#include "r_opengl.h"
extern stdlib_api_t com; // engine toolbox
extern render_imp_t ri;
extern byte *r_temppool;
#define Host_Error com.error
typedef unsigned int elem_t;
typedef enum { RT_NONE, RT_MODEL, RT_PORTALSURFACE, NUM_RTYPES } refEntityType_t;
/*
skins will be outline flood filled and mip mapped
pics and sprites with alpha will be outline flood filled
pic won't be mip mapped
model skin
sprite frame
wall texture
pic
*/
typedef enum
{
TEX_UNKNOWN = 0, // not passed with R_GetPixelFormat, ignore it
TEX_SYSTEM, // generated by engine
TEX_NOMIP, // hud pics, menu etc
TEX_GENERIC, // models, sprites etc
TEX_LIGHTMAP, // lightmap textures
TEX_ALPHA, // with alpha-channel
TEX_SKYBOX, // skybox textures
} texType_t;
typedef enum
{
TF_STATIC = BIT(0), // don't free until Shader_FreeUnused()
TF_NOPICMIP = BIT(1), // ignore r_picmip resample rules
TF_UNCOMPRESSED = BIT(2), // don't compress texture in video memory
TF_CUBEMAP = BIT(3), // it's cubemap texture
TF_NORMALMAP = BIT(4), // needs to be merged with depthmap
TF_DEPTHMAP = BIT(5), // custom texture filter used
TF_INTENSITY = BIT(6),
TF_ALPHA = BIT(7),
TF_SKYSIDE = BIT(8),
TF_CLAMP = BIT(9),
TF_NOMIPMAP = BIT(10),
TF_NEAREST = BIT(11), // disable texfilter
TF_LIGHTMAP = BIT(12), // no resample etc
} texFlags_t;
#define TF_PORTALMAP ( TF_NOMIPMAP|TF_UNCOMPRESSED|TF_NOPICMIP|TF_CLAMP )
#define TF_SHADOWMAP ( TF_NOMIPMAP|TF_UNCOMPRESSED|TF_NOPICMIP|TF_CLAMP|TF_DEPTHMAP )
typedef struct texture_s
{
string name; // game path, including extension
int srcWidth; // source dims, used for mipmap loading
int srcHeight;
int srcFlags; // rgbdata flags
int width; // upload width\height
int height;
texType_t texType; // just for debug
texFlags_t flags;
size_t size; // upload size for debug targets
GLint format; // PFDesc[type].glType
GLuint target; // glTarget
GLuint texnum; // gl texture binding
GLint samples; // gl samples
int touchFrame; // 0 = free
struct texture_s *nextHash;
} texture_t;
enum
{
TEXTURE_UNIT0,
TEXTURE_UNIT1,
TEXTURE_UNIT2,
TEXTURE_UNIT3,
TEXTURE_UNIT4,
TEXTURE_UNIT5,
TEXTURE_UNIT6,
TEXTURE_UNIT7,
MAX_TEXTURE_UNITS
};
#define FOG_TEXTURE_WIDTH 256
#define FOG_TEXTURE_HEIGHT 32
#define LIGHTMAP_TEXTURE_WIDTH 256
#define LIGHTMAP_TEXTURE_HEIGHT 256
#define VID_DEFAULTMODE "3"
#define SHADOW_PLANAR 1
#define SHADOW_MAPPING 2
#define LM_STYLES 4 // MAXLIGHTMAPS
#define MAX_ENTITIES 2048 // per one frame
#define MAX_POLY_VERTS 3000
#define MAX_POLYS 2048
typedef struct mplane_s
{
vec3_t normal;
float dist;
short type; // for fast side tests
short signbits; // signx + (signy<<1) + (signz<<1)
} mplane_t;
//===================================================================
#include "r_math.h"
#include "r_mesh.h"
#include "r_shader.h"
#include "r_backend.h"
#include "r_shadow.h"
#include "r_model.h"
#define BACKFACE_EPSILON 0.01
#define Z_NEAR 4
#define SIDE_FRONT 0
#define SIDE_BACK 1
#define SIDE_ON 2
// renderer flags
#define RDF_PORTALINVIEW BIT( 0 ) // draw portal pass
#define RDF_SKYPORTALINVIEW BIT( 1 ) // draw skyportal instead of regular sky
#define RP_NONE 0x0
#define RP_MIRRORVIEW 0x1 // lock pvs at vieworg
#define RP_PORTALVIEW 0x2
#define RP_ENVVIEW 0x4
#define RP_NOSKY 0x8
#define RP_SKYPORTALVIEW 0x10
#define RP_PORTALCAPTURED 0x20
#define RP_PORTALCAPTURED2 0x40
#define RP_OLDVIEWLEAF 0x80
#define RP_SHADOWMAPVIEW 0x100
#define RP_FLIPFRONTFACE 0x200
#define RP_WORLDSURFVISIBLE 0x400
#define RP_CLIPPLANE 0x800
#define RP_TRISOUTLINES 0x1000
#define RP_SHOWNORMALS 0x2000
#define RP_NONVIEWERREF ( RP_PORTALVIEW|RP_MIRRORVIEW|RP_ENVVIEW|RP_SKYPORTALVIEW|RP_SHADOWMAPVIEW )
#define RP_LOCALCLIENT(e) (ri.GetLocalPlayer() && ((e)->index == ri.GetLocalPlayer()->index && e->lerp->player ))
#define RP_FOLLOWENTITY(e) (((e)->movetype == MOVETYPE_FOLLOW && (e)->parent))
#define MOD_ALLOWBUMP() (r_lighting_models_followdeluxe->integer ? mapConfig.deluxeMappingEnabled : GL_Support( R_SHADER_GLSL100_EXT ))
//====================================================
typedef struct
{
vec3_t origin;
vec3_t color; // dlight color
float intensity; // cdlight->radius
vec3_t mins, maxs;
ref_shader_t *shader;
int flags; // misc flags
} ref_dlight_t;
typedef struct
{
vec3_t rgb; // 0.0 - 2.0
float white; // highest of RGB
} lightstyle_t;
// FIXME: compress this as much as possible
typedef struct ref_entity_s
{
uint ent_type; // entity type
uint m_nCachedFrameCount;// keep current render frame
int index; // viewmodel has entindex -1
refEntityType_t rtype;
qboolean doOcclusionTest; // check this entity for occlusion
struct ref_model_s *model; // opaque type outside refresh
struct ref_entity_s *parent; // link to parent entity (FOLLOW or weaponmodel)
struct cl_entity_s *lerp; // pointer to client entity
float framerate; // custom framerate
float frame;
int body;
int skin;
int movetype; // entity moving type
float scale;
byte *mempool; // studio mempool
void *extradata; // studiomodel bones, etc
// misc
rgb_t rendercolor; // hl1 rendercolor
byte renderamt; // hl1 alphavalues
int rendermode; // hl1 rendermode
int renderfx; // server will be translate hl1 values into flags
int colormap; // q1 and hl1 model colormap (can applied for sprites)
int flags; // q1 effect flags, EF_LIGHT, EF_DIMLIGHT etc
// client gait sequence (local stuff)
int gaitsequence; // client->sequence + yaw
// most recent data
vec3_t axis[3];
vec3_t angles;
vec3_t movedir; // forward vector that computed on a server
vec3_t origin, origin2;
vec3_t lightingOrigin;
float waveHeight;
// RT_SPRITE stuff
struct ref_shader_s *customShader; // client drawing stuff
float radius; // used as RT_SPRITE's radius
} ref_entity_t;
typedef struct skyportal_s
{
float fov;
float scale;
vec3_t vieworg;
vec3_t viewangles;
} skyportal_t;
typedef struct
{
int params; // rendering parameters
int rdflags; // actual rendering flags
ref_params_t refdef;
int scissor[4];
int viewport[4];
float lerpFrac; // lerpfraction
qboolean drawWorld; // ignore world for drawing PlayerModel
qboolean thirdPerson; // thirdperson camera is enabled
meshlist_t *meshlist; // meshes to be rendered
meshbuffer_t **surfmbuffers; // pointers to meshbuffers of world surfaces
uint shadowBits;
shadowGroup_t *shadowGroup;
ref_entity_t *currententity;
ref_model_t *currentmodel;
ref_entity_t *previousentity;
//
// view origin
//
vec3_t viewOrigin;
vec3_t viewAxis[3];
vec_t *vup, *vpn, *vright;
mplane_t frustum[6];
float farClip;
uint clipFlags;
vec3_t visMins, visMaxs;
matrix4x4 objectMatrix;
matrix4x4 worldviewMatrix;
matrix4x4 modelviewMatrix; // worldviewMatrix * objectMatrix
matrix4x4 projectionMatrix;
matrix4x4 worldviewProjectionMatrix; // worldviewMatrix * projectionMatrix
float skyMins[2][6];
float skyMaxs[2][6];
skyportal_t skyportal; // skyportal params
float fog_dist_to_eye[256]; // MAX_MAP_FOGS
vec3_t pvsOrigin;
mplane_t clipPlane;
mplane_t portalPlane;
} refinst_t;
//====================================================
extern int r_pvsframecount;
extern int r_framecount;
extern int r_framecount2;
extern int c_brush_polys, c_world_leafs;
extern double r_mark_leaves, r_world_node;
extern double r_add_polys, r_add_entities;
extern double r_sort_meshes, r_draw_meshes;
extern msurface_t *r_debug_surface;
extern const char *r_debug_hitbox;
extern int gl_filter_min, gl_filter_max;
#define MAX_RSPEEDSMSGSIZE 1024
extern char r_speeds_msg[MAX_RSPEEDSMSGSIZE];
extern ref_model_t *cl_models[MAX_MODELS];
extern float gldepthmin, gldepthmax;
//
// screen size info
//
extern uint r_numEntities;
extern ref_entity_t r_entities[MAX_ENTITIES];
extern uint r_numDlights;
extern ref_dlight_t r_dlights[MAX_DLIGHTS];
extern uint r_numPolys;
extern poly_t r_polys[MAX_POLYS];
extern lightstyle_t r_lightStyles[MAX_LIGHTSTYLES];
extern ref_params_t r_lastRefdef;
extern mleaf_t *r_viewleaf, *r_oldviewleaf;
extern mleaf_t *r_viewleaf2, *r_oldviewleaf2;
extern float r_farclip_min, r_farclip_bias;
extern ref_entity_t *r_worldent;
extern ref_model_t *r_worldmodel;
extern mbrushmodel_t *r_worldbrushmodel;
extern convar_t *r_colorbits;
extern convar_t *r_depthbits;
extern convar_t *r_stencilbits;
extern convar_t *r_norefresh;
extern convar_t *r_drawentities;
extern convar_t *r_drawworld;
extern convar_t *r_speeds;
extern convar_t *r_drawelements;
extern convar_t *r_fullbright;
extern convar_t *r_lightmap;
extern convar_t *r_novis;
extern convar_t *r_nocull;
extern convar_t *r_ignorehwgamma;
extern convar_t *r_overbrightbits;
extern convar_t *r_vertexbuffers;
extern convar_t *r_lefthand;
extern convar_t *r_physbdebug;
extern convar_t *r_check_errors;
extern convar_t *r_allow_software;
extern convar_t *r_frontbuffer;
extern convar_t *r_adjust_fov;
extern convar_t *r_width;
extern convar_t *r_height;
extern convar_t *r_flares;
extern convar_t *r_flaresize;
extern convar_t *r_flarefade;
extern convar_t *r_spriteflares;
extern convar_t *r_cullflares;
extern convar_t *r_dynamiclight;
extern convar_t *r_coronascale;
extern convar_t *r_detailtextures;
extern convar_t *r_subdivisions;
extern convar_t *r_faceplanecull;
extern convar_t *gl_wireframe;
extern convar_t *r_shownormals;
extern convar_t *r_showtextures;
extern convar_t *r_draworder;
extern convar_t *r_fastsky;
extern convar_t *r_portalonly;
extern convar_t *r_portalmaps;
extern convar_t *r_portalmaps_maxtexsize;
extern convar_t *r_lighting_bumpscale;
extern convar_t *r_lighting_deluxemapping;
extern convar_t *r_lighting_diffuse2heightmap;
extern convar_t *r_lighting_specular;
extern convar_t *r_lighting_glossintensity;
extern convar_t *r_lighting_glossexponent;
extern convar_t *r_lighting_models_followdeluxe;
extern convar_t *r_lighting_ambientscale;
extern convar_t *r_lighting_directedscale;
extern convar_t *r_lighting_modulate;
extern convar_t *r_offsetmapping;
extern convar_t *r_offsetmapping_scale;
extern convar_t *r_offsetmapping_reliefmapping;
extern convar_t *r_occlusion_queries;
extern convar_t *r_occlusion_queries_finish;
extern convar_t *r_shadows;
extern convar_t *r_shadows_alpha;
extern convar_t *r_shadows_nudge;
extern convar_t *r_shadows_projection_distance;
extern convar_t *r_shadows_maxtexsize;
extern convar_t *r_shadows_pcf;
extern convar_t *r_shadows_self_shadow;
extern convar_t *r_bloom_alpha;
extern convar_t *r_bloom_diamond_size;
extern convar_t *r_bloom_intensity;
extern convar_t *r_bloom_darken;
extern convar_t *r_bloom_sample_size;
extern convar_t *r_bloom_fast_sample;
extern convar_t *r_himodels;
extern convar_t *r_environment_color;
extern convar_t *r_gamma;
extern convar_t *r_texturebits;
extern convar_t *gl_texturemode;
extern convar_t *gl_texture_anisotropy;
extern convar_t *gl_texture_lodbias;
extern convar_t *gl_round_down;
extern convar_t *gl_compress_textures;
extern convar_t *r_decals;
extern convar_t *r_mode;
extern convar_t *r_nobind;
extern convar_t *r_picmip;
extern convar_t *r_skymip;
extern convar_t *gl_clear;
extern convar_t *r_lockpvs;
extern convar_t *r_swapInterval;
extern convar_t *gl_finish;
extern convar_t *gl_delayfinish;
extern convar_t *gl_cull;
extern convar_t *gl_extensions;
extern convar_t *vid_fullscreen;
extern convar_t *vid_multiscreen_head;
extern convar_t *vid_displayfrequency;
//====================================================================
static _inline byte R_FloatToByte( float x )
{
union {
float f;
unsigned int i;
} f2i;
// shift float to have 8bit fraction at base of number
f2i.f = x + 32768.0f;
f2i.i &= 0x7FFFFF;
// then read as integer and kill float bits...
return ( byte )min( f2i.i, 255 );
}
float R_FastSin( float t );
void R_LatLongToNorm( const byte latlong[2], vec3_t out );
void NormToLatLong( const vec3_t normal, byte latlong[2] );
void ColorToBytes( const float *color, byte *colorBytes );
//====================================================================
//
// r_bloom.c
//
void R_InitBloomTextures( void );
void R_BloomBlend( const ref_params_t *fd );
//
// r_cull.c
//
enum
{
OQ_NONE = -1,
OQ_ENTITY,
OQ_PLANARSHADOW,
OQ_SHADOWGROUP,
OQ_CUSTOM
};
#define OCCLUSION_QUERIES_CVAR_HACK( RI ) ( !(r_occlusion_queries->integer == 2 && r_shadows->integer != SHADOW_MAPPING) \
|| ((RI).rdflags & RDF_PORTALINVIEW) )
#define OCCLUSION_QUERIES_ENABLED( RI ) ( GL_Support( R_OCCLUSION_QUERIES_EXT ) && r_occlusion_queries->integer && r_drawentities->integer \
&& !((RI).params & RP_NONVIEWERREF) && ((RI).drawWorld) \
&& OCCLUSION_QUERIES_CVAR_HACK( RI ) )
#define OCCLUSION_OPAQUE_SHADER( s ) (((s)->sort == SORT_OPAQUE ) && ((s)->flags & SHADER_DEPTHWRITE ) && !(s)->numDeforms )
#define OCCLUSION_TEST_ENTITY( e ) (((e)->doOcclusionTest ) || ((e)->ent_type == ET_VIEWENTITY ))
void R_InitOcclusionQueries( void );
void R_BeginOcclusionPass( void );
ref_shader_t *R_OcclusionShader( void );
void R_AddOccludingSurface( msurface_t *surf, ref_shader_t *shader );
int R_GetOcclusionQueryNum( int type, int key );
int R_IssueOcclusionQuery( int query, ref_entity_t *e, vec3_t mins, vec3_t maxs );
qboolean R_OcclusionQueryIssued( int query );
uint R_GetOcclusionQueryResult( int query, qboolean wait );
qboolean R_GetOcclusionQueryResultBool( int type, int key, qboolean wait );
void R_EndOcclusionPass( void );
void R_ShutdownOcclusionQueries( void );
//
// r_draw.c
//
void R_Set2DMode( qboolean enable );
void R_DrawSetColor( const void *data );
void R_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, shader_t shadernum );
void R_DrawStretchRaw( float x, float y, float w, float h, int cols, int rows, const byte *data, qboolean redraw );
void R_DrawSetParms( shader_t handle, int rendermode, int frame );
void R_DrawGetParms( int *w, int *h, int *f, int frame, shader_t shader );
void Tri_RenderMode( const int mode );
void Tri_Normal3f( const float x, const float y, const float z );
void Tri_Vertex3f( const float x, const float y, const float z );
void Tri_Color4ub( const byte r, const byte g, const byte b, const byte a );
void Tri_Fog( float flFogColor[3], float flStart, float flEnd, int bOn );
void Tri_TexCoord2f( const float u, const float v );
void Tri_Bind( shader_t shader, int frame );
void Tri_RenderCallback( int fTrans );
void Tri_CullFace( int mode );
void Tri_Begin( int mode );
void Tri_End( void );
//
// r_image.c
//
void GL_SelectTexture( GLenum tmu );
void GL_Bind( GLenum tmu, texture_t *tex );
void GL_TexEnv( GLenum mode );
void GL_LoadMatrix( const matrix4x4 source );
void GL_LoadTexMatrix( const matrix4x4 m );
void GL_LoadIdentityTexMatrix( void );
void GL_EnableTexGen( int coord, int mode );
void GL_SetTexCoordArrayMode( int mode );
void GL_TexFilter( texture_t *tex );
void R_InitImages( void );
void R_ShutdownImages( void );
void R_InitPortalTexture( texture_t **texture, int id, int screenWidth, int screenHeight );
void R_InitShadowmapTexture( texture_t **texture, int id, int screenWidth, int screenHeight );
void R_FreeImage( texture_t *image );
void R_TextureList_f( void );
void R_SetTextureParameters( void );
void R_ShowTextures( void );
texture_t *R_LoadTexture( const char *name, rgbdata_t *pic, int samples, texFlags_t flags );
texture_t *R_FindTexture( const char *name, const byte *buf, size_t size, texFlags_t flags );
qboolean VID_ScreenShot( const char *filename, int shot_type );
qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qboolean skyshot );
//
// r_light.c
//
void R_BeginBuildingLightmaps( void );
void R_BuildSurfaceLightmap( msurface_t *surf );
void R_EndBuildingLightmaps( void );
void R_UpdateSurfaceLightmap( msurface_t *surf );
void R_LightBounds( const vec3_t origin, float intensity, vec3_t mins, vec3_t maxs );
qboolean R_SurfPotentiallyLit( msurface_t *surf );
uint R_AddSurfDlighbits( msurface_t *surf, uint dlightbits );
void R_AddDynamicLights( uint dlightbits, int state );
void R_LightForEntity( ref_entity_t *e, byte *bArray );
void R_LightForOrigin( const vec3_t origin, vec3_t dir, vec4_t ambient, vec4_t diffuse, float radius );
void R_LightForPoint( const vec3_t point, vec3_t ambientLight );
void R_LightDir( const vec3_t origin, vec3_t lightDir, float radius );
int R_AddSuperLightStyle( const int lightmapNum, const byte *lightmapStyles );
void R_BuildLightGrid( mbrushmodel_t *world );
void R_InitCoronas( void );
void R_DrawCoronas( void );
//
// r_main.c
//
void GL_Cull( int cull );
void GL_SetState( int state );
void GL_FrontFace( int front );
void R_BeginFrame( qboolean clearScene );
void R_EndFrame( void );
void R_RenderScene( const ref_params_t *fd, qboolean drawWorld );
void R_RenderView( const ref_params_t *fd );
void R_ClearScene( void );
qboolean R_CullBox( const vec3_t mins, const vec3_t maxs, const uint clipflags );
qboolean R_CullSphere( const vec3_t centre, const float radius, const uint clipflags );
qboolean R_VisCullBox( const vec3_t mins, const vec3_t maxs );
qboolean R_VisCullSphere( const vec3_t origin, float radius );
int R_CullModel( ref_entity_t *e, vec3_t mins, vec3_t maxs, float radius );
mfog_t *R_FogForSphere( const vec3_t centre, const float radius );
qboolean R_CompletelyFogged( mfog_t *fog, vec3_t origin, float radius );
void R_LoadIdentity( void );
void R_RotateForEntity( ref_entity_t *e );
void R_TranslateForEntity( ref_entity_t *e );
qboolean R_TransformToScreen_Vec3( const vec3_t in, vec3_t out );
void R_TransformVectorToScreen( const ref_params_t *rd, const vec3_t in, vec2_t out );
void R_TransformEntityBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs, vec3_t bbox[8], qboolean local );
qboolean R_SpriteOverflow( void );
qboolean R_PushSpritePoly( const meshbuffer_t *mb );
qboolean R_PushSprite( const meshbuffer_t *mb, int type, float right, float left, float up, float down );
#define NUM_CUSTOMCOLORS 16
void R_InitCustomColors( void );
void R_SetCustomColor( int num, int r, int g, int b );
int R_GetCustomColor( int num );
msurface_t *R_TraceLine( pmtrace_t *tr, const vec3_t start, const vec3_t end, int flags );
//
// r_mesh.c
//
extern meshlist_t r_worldlist, r_shadowlist;
void R_InitMeshLists( void );
void R_FreeMeshLists( void );
void R_ClearMeshList( meshlist_t *meshlist );
int R_ReAllocMeshList( meshbuffer_t **mb, int minMeshes, int maxMeshes );
meshbuffer_t *R_AddMeshToList( int type, mfog_t *fog, ref_shader_t *shader, int infokey );
void R_AddModelMeshToList( unsigned int modhandle, mfog_t *fog, ref_shader_t *shader, int meshnum );
void R_AllocMeshbufPointers( refinst_t *RI );
void R_SortMeshes( void );
void R_DrawMeshes( void );
void R_DrawTriangleOutlines( qboolean showTris, qboolean showNormals );
void R_DrawPortals( void );
void R_DrawCubemapView( const vec3_t origin, const vec3_t angles, int size );
void R_DrawSkyPortal( skyportal_t *skyportal, vec3_t mins, vec3_t maxs );
void R_BuildTangentVectors( int numVertexes, vec4_t *xyzArray, vec4_t *normalsArray, vec2_t *stArray, int numTris, elem_t *elems, vec4_t *sVectorsArray );
//
// r_program.c
//
#define DEFAULT_GLSL_PROGRAM "*r_defaultProgram"
#define DEFAULT_GLSL_DISTORTION_PROGRAM "*r_defaultDistortionProgram"
#define DEFAULT_GLSL_SHADOWMAP_PROGRAM "*r_defaultShadowmapProgram"
enum
{
PROGRAM_TYPE_NONE,
PROGRAM_TYPE_MATERIAL,
PROGRAM_TYPE_DISTORTION,
PROGRAM_TYPE_SHADOWMAP,
};
enum
{
PROGRAM_APPLY_LIGHTSTYLE0 = 1 << 0,
PROGRAM_APPLY_LIGHTSTYLE1 = 1 << 1,
PROGRAM_APPLY_LIGHTSTYLE2 = 1 << 2,
PROGRAM_APPLY_LIGHTSTYLE3 = 1 << 3,
PROGRAM_APPLY_SPECULAR = 1 << 4,
PROGRAM_APPLY_DIRECTIONAL_LIGHT = 1 << 5,
PROGRAM_APPLY_FB_LIGHTMAP = 1 << 6,
PROGRAM_APPLY_OFFSETMAPPING = 1 << 7,
PROGRAM_APPLY_RELIEFMAPPING = 1 << 8,
PROGRAM_APPLY_AMBIENT_COMPENSATION = 1 << 9,
PROGRAM_APPLY_DECAL = 1 << 10,
PROGRAM_APPLY_BASETEX_ALPHA_ONLY = 1 << 11,
PROGRAM_APPLY_EYEDOT = 1 << 12,
PROGRAM_APPLY_DISTORTION_ALPHA = 1 << 13,
PROGRAM_APPLY_PCF2x2 = 1 << 14,
PROGRAM_APPLY_PCF3x3 = 1 << 15,
PROGRAM_APPLY_BRANCHING = 1 << 16,
PROGRAM_APPLY_CLIPPING = 1 << 17,
PROGRAM_APPLY_NO_HALF_TYPES = 1 << 18
};
void R_InitGLSLPrograms( void );
int R_FindGLSLProgram( const char *name );
int R_RegisterGLSLProgram( const char *name, const char *string, unsigned int features );
int R_GetProgramObject( int elem );
void R_UpdateProgramUniforms( int elem, vec3_t eyeOrigin, vec3_t lightOrigin, vec3_t lightDir,
vec4_t ambient, vec4_t diffuse, ref_style_t *lightStyle, qboolean frontPlane, int TexWidth, int TexHeight,
float projDistance, float offsetmappingScale );
void R_ShutdownGLSLPrograms( void );
void R_ProgramList_f( void );
void R_ProgramDump_f( void );
//
// r_decals.c
//
void R_InitDecals( void );
void R_ClearDecals( void );
void R_ShutdownDecals( void );
qboolean R_DecalShoot( shader_t texture, int entity, int modelIndex, vec3_t pos, vec3_t saxis, int flags, rgba_t color, float fadeTime, float fadeDuration );
decal_t *R_DecalFromMeshbuf( const meshbuffer_t *mb );
int R_CreateDecalList( decallist_t *pList, qboolean changelevel );
void R_AddSurfaceDecals( msurface_t *surf );
void R_PushDecal( const meshbuffer_t *mb );
void R_DecalRemoveAll( shader_t shader );
//
// r_poly.c
//
void R_PushPoly( const meshbuffer_t *mb );
void R_AddPolysToList( void );
msurface_t *R_TransformedTraceLine( pmtrace_t *tr, const vec3_t start, const vec3_t end, ref_entity_t *test, int flags );
//
// r_sprite.c
//
void R_SpriteInit( void );
mspriteframe_t *R_GetSpriteFrame( ref_model_t *pModel, int frame, float yawAngle );
ref_shader_t *CL_LoadSprite( const char *szSpriteName );
void R_DrawSpriteModel( const meshbuffer_t *mb );
qboolean R_SpriteOccluded( ref_entity_t *e );
qboolean R_CullSpriteModel( ref_entity_t *e );
void R_SpriteDrawDebug( void );
//
// r_studio.c
//
void R_AddStudioModelToList( ref_entity_t *e );
void R_DrawStudioModel( const meshbuffer_t *mb );
void R_StudioModelBBox( ref_entity_t *e, vec3_t mins, vec3_t maxs );
qboolean R_CullStudioModel( ref_entity_t *e );
void R_StudioRunEvents( ref_entity_t *e );
void R_StudioDrawHitbox( ref_entity_t *e, int iHitbox );
void R_StudioDrawDebug( void );
void R_StudioInit( void );
qboolean R_StudioTrace( ref_entity_t *e, const vec3_t start, const vec3_t end, pmtrace_t *tr );
void R_StudioAllocExtradata( struct cl_entity_s *in, ref_entity_t *e );
void R_StudioFreeAllExtradata( void );
void R_StudioShutdown( void );
//
//
// r_register.c
//
void R_NewMap( void );
qboolean R_Init( qboolean full );
void R_Shutdown( qboolean full );
//
// r_opengl.c
//
void R_RestoreGamma( void );
void R_CheckForErrors_( const char *filename, const int fileline );
#define R_CheckForErrors() R_CheckForErrors_( __FILE__, __LINE__ )
//
// r_surf.c
//
#define MAX_SURF_QUERIES 0x1E0
void R_MarkLeaves( void );
void R_DrawWorld( void );
void R_BmodelDrawDebug( void );
qboolean R_SurfPotentiallyVisible( msurface_t *surf );
qboolean R_CullBrushModel( ref_entity_t *e );
void R_AddBrushModelToList( ref_entity_t *e );
void R_ClearSurfOcclusionQueryKeys( void );
int R_SurfOcclusionQueryKey( ref_entity_t *e, msurface_t *surf );
void R_SurfIssueOcclusionQueries( void );
//
// r_sky.c
//
skydome_t *R_CreateSkydome( byte *mempool, float skyheight, ref_shader_t **farboxShaders, ref_shader_t **nearboxShaders );
void R_FreeSkydome( skydome_t *skydome );
void R_ClearSkyBox( void );
void R_DrawSky( ref_shader_t *shader );
qboolean R_AddSkySurface( msurface_t *fa );
void R_SetupSky( const char *name );
void R_FreeSky( void );
//====================================================================
enum
{
GLSTATE_NONE = 0,
//
// glBlendFunc args
//
GLSTATE_SRCBLEND_ZERO = 1,
GLSTATE_SRCBLEND_ONE = 2,
GLSTATE_SRCBLEND_DST_COLOR = 1|2,
GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR = 4,
GLSTATE_SRCBLEND_SRC_ALPHA = 1|4,
GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA = 2|4,
GLSTATE_SRCBLEND_DST_ALPHA = 1|2|4,
GLSTATE_SRCBLEND_ONE_MINUS_DST_ALPHA = 8,
GLSTATE_DSTBLEND_ZERO = 16,
GLSTATE_DSTBLEND_ONE = 32,
GLSTATE_DSTBLEND_SRC_COLOR = 16|32,
GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR = 64,
GLSTATE_DSTBLEND_SRC_ALPHA = 16|64,
GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA = 32|64,
GLSTATE_DSTBLEND_DST_ALPHA = 16|32|64,
GLSTATE_DSTBLEND_ONE_MINUS_DST_ALPHA = 128,
GLSTATE_BLEND_MTEX = 0x100,
GLSTATE_AFUNC_GT0 = 0x200,
GLSTATE_AFUNC_LT128 = 0x400,
GLSTATE_AFUNC_GE128 = 0x800,
GLSTATE_DEPTHWRITE = 0x1000,
GLSTATE_DEPTHFUNC_EQ = 0x2000,
GLSTATE_OFFSET_FILL = 0x4000,
GLSTATE_NO_DEPTH_TEST = 0x8000,
GLSTATE_MARK_END = 0x10000 // SHADERPASS_MARK_BEGIN
};
#define GLSTATE_MASK ( GLSTATE_MARK_END-1 )
// #define SHADERPASS_SRCBLEND_MASK (((GLSTATE_SRCBLEND_DST_ALPHA)<<1)-GLSTATE_SRCBLEND_ZERO)
#define GLSTATE_SRCBLEND_MASK 0xF
// #define SHADERPASS_DSTBLEND_MASK (((GLSTATE_DSTBLEND_DST_ALPHA)<<1)-GLSTATE_DSTBLEND_ZERO)
#define GLSTATE_DSTBLEND_MASK 0xF0
#define GLSTATE_BLENDFUNC ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK )
#define GLSTATE_ALPHAFUNC ( GLSTATE_AFUNC_GT0|GLSTATE_AFUNC_LT128|GLSTATE_AFUNC_GE128 )
typedef struct
{
float ambient[3];
rgba_t environmentColor;
qboolean deluxeMappingEnabled; // true if deluxeMaps is true and r_lighting_deluxemaps->integer != 0
} mapconfig_t;
extern mapconfig_t mapConfig;
extern refinst_t RI, prevRI;
#endif /*__R_LOCAL_H__*/