18 Oct 2008
This commit is contained in:
parent
92c5a0e536
commit
5773b3c2e4
|
@ -22,10 +22,12 @@ typedef unsigned short word;
|
|||
typedef unsigned long dword;
|
||||
typedef unsigned int uint;
|
||||
typedef signed __int64 int64;
|
||||
typedef uint elem_t;
|
||||
typedef int func_t;
|
||||
typedef int sound_t;
|
||||
typedef int model_t;
|
||||
typedef int video_t;
|
||||
typedef int shader_t;
|
||||
typedef int string_t;
|
||||
typedef float vec_t;
|
||||
typedef vec_t vec2_t[2];
|
||||
|
|
|
@ -792,7 +792,12 @@ typedef struct
|
|||
int flags;
|
||||
int width;
|
||||
int height;
|
||||
int index;
|
||||
|
||||
union
|
||||
{
|
||||
int index; // disk: buffer index
|
||||
shader_t shader; // mem: shader number
|
||||
};
|
||||
} dstudiotexture_t;
|
||||
|
||||
// skin families
|
||||
|
|
|
@ -405,7 +405,7 @@ static float *RB_TableForFunc( const waveFunc_t *func )
|
|||
{
|
||||
switch( func->type )
|
||||
{
|
||||
case WAVEFORM_SIN:
|
||||
case WAVEFORM_SINE:
|
||||
return rb_sinTable;
|
||||
case WAVEFORM_TRIANGLE:
|
||||
return rb_triangleTable;
|
||||
|
@ -870,8 +870,8 @@ RB_DeformVertexes
|
|||
*/
|
||||
static void RB_DeformVertexes( void )
|
||||
{
|
||||
deformVerts_t *deformVertexes = Ref.m_pCurrentShader->deformVertexes;
|
||||
uint deformVertexesNum = Ref.m_pCurrentShader->deformVertexesNum;
|
||||
deformVerts_t *deformVertexes = Ref.m_pCurrentShader->deformVerts;
|
||||
uint deformVertexesNum = Ref.m_pCurrentShader->deformVertsNum;
|
||||
float deflect, *quad[4];
|
||||
double temp, params[4];
|
||||
vec3_t tv, rot_centre;
|
||||
|
@ -1395,7 +1395,6 @@ static void RB_CalcVertexColors( const shaderStage_t *stage )
|
|||
fArray[3] = a;
|
||||
break;
|
||||
case ALPHAGEN_FADE:
|
||||
case ALPHAGEN_PORTAL:
|
||||
VectorAdd( vertexArray[0], Ref.m_pCurrentEntity->origin, v );
|
||||
VectorSubtract( Ref.vieworg, v, t );
|
||||
a = VectorLength( t ) * alphaGen->func.params[0];
|
||||
|
@ -1404,6 +1403,8 @@ static void RB_CalcVertexColors( const shaderStage_t *stage )
|
|||
for( i = 0; i < r_stats.numColors; i++, fArray += 4 )
|
||||
fArray[3] = a;
|
||||
break;
|
||||
case ALPHAGEN_ONEMINUSFADE:
|
||||
break;
|
||||
case ALPHAGEN_VERTEX:
|
||||
for( i = 0; i < r_stats.numColors; i++, fArray += 4, inArray += 4 )
|
||||
fArray[3] = inArray[3];
|
||||
|
@ -1483,10 +1484,10 @@ static void RB_CalcVertexColors( const shaderStage_t *stage )
|
|||
else alphaFog = true;
|
||||
|
||||
fogPlane = r_colorFog->visible;
|
||||
fogShaderDistScale = 1.0 / (r_colorFog->shader->fog_dist - r_colorFog->shader->fogClearDist);
|
||||
fogShaderDistScale = 1.0 / (r_colorFog->shader->fogDist - r_colorFog->shader->fogClearDist);
|
||||
dist = Ref.fog_dist_to_eye[r_colorFog - r_worldBrushModel->fogs];
|
||||
|
||||
if( Ref.m_pCurrentShader->flags & SHADER_SKY )
|
||||
if( Ref.m_pCurrentShader->flags & SHADER_SKYPARMS )
|
||||
{
|
||||
if( dist > 0 ) VectorScale( fogPlane->normal, -dist, viewtofog );
|
||||
else VectorClear( viewtofog );
|
||||
|
@ -1574,6 +1575,7 @@ static bool RB_CalcTextureCoords( const stageBundle_t *bundle, uint unit, matrix
|
|||
|
||||
switch( tcGen->type )
|
||||
{
|
||||
default:
|
||||
case TCGEN_BASE:
|
||||
RB_DisableTexGen();
|
||||
|
||||
|
@ -1704,17 +1706,17 @@ static bool RB_CalcTextureCoords( const stageBundle_t *bundle, uint unit, matrix
|
|||
return true;
|
||||
case TCGEN_FOG:
|
||||
{
|
||||
int fogPtype;
|
||||
cplane_t *fogPlane;
|
||||
shader_t *fogShader;
|
||||
vec3_t viewtofog;
|
||||
float fogNormal[3], vpnNormal[3];
|
||||
float dist, vdist, fogDist, vpnDist;
|
||||
int fogPtype;
|
||||
cplane_t *fogPlane;
|
||||
ref_shader_t *fogShader;
|
||||
vec3_t viewtofog;
|
||||
float fogNormal[3], vpnNormal[3];
|
||||
float dist, vdist, fogDist, vpnDist;
|
||||
|
||||
fogPlane = r_texFog->visible;
|
||||
fogShader = r_texFog->shader;
|
||||
|
||||
matrix[0][0] = matrix[1][1] = 1.0f / ( fogShader->fog_dist - fogShader->fogClearDist );
|
||||
matrix[0][0] = matrix[1][1] = 1.0f / ( fogShader->fogDist - fogShader->fogClearDist );
|
||||
// FIXME: HACK
|
||||
#ifdef OPENGL_STYLE
|
||||
matrix[3][1] = 1.5f / (float)FOG_TEXTURE_HEIGHT;
|
||||
|
@ -1724,7 +1726,7 @@ static bool RB_CalcTextureCoords( const stageBundle_t *bundle, uint unit, matrix
|
|||
// distance to fog
|
||||
dist = Ref.fog_dist_to_eye[r_texFog - r_worldBrushModel->fogs];
|
||||
|
||||
if( Ref.m_pCurrentShader->flags & SHADER_SKY )
|
||||
if( Ref.m_pCurrentShader->flags & SHADER_SKYPARMS )
|
||||
{
|
||||
if( dist > 0 ) VectorMA( Ref.vieworg, -dist, fogPlane->normal, viewtofog );
|
||||
else VectorCopy( Ref.vieworg, viewtofog );
|
||||
|
@ -1793,7 +1795,6 @@ static bool RB_CalcTextureCoords( const stageBundle_t *bundle, uint unit, matrix
|
|||
RB_DisableTexGen();
|
||||
Matrix4x4_Concat( matrix, r_currentCastGroup->worldProjectionMatrix, Ref.entityMatrix );
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
return identityMatrix;
|
||||
|
@ -2005,7 +2006,7 @@ static void RB_SetupTextureUnit( const shaderStage_t *stage, const stageBundle_t
|
|||
//CIN_RunCinematic( bundle->cinematicHandle );
|
||||
//CIN_DrawCinematic( bundle->cinematicHandle );
|
||||
break;
|
||||
case TEX_PORTAL:
|
||||
case TEX_RENDERVIEW:
|
||||
image = r_portaltexture;
|
||||
break;
|
||||
case TEX_DLIGHT:
|
||||
|
@ -2113,7 +2114,7 @@ static void RB_RenderMeshGeneric( void )
|
|||
GL_TexEnv( GL_MODULATE );
|
||||
GL_SetState( r_currentShaderState|( stage->flags & r_currentShaderPassMask ));
|
||||
|
||||
/*for( i = 0; i < rb_numAccumStages; i++ )
|
||||
for( i = 0; i < rb_numAccumStages; i++ )
|
||||
{
|
||||
stage = Ref.m_pCurrentShader->stages[i];
|
||||
|
||||
|
@ -2130,7 +2131,7 @@ static void RB_RenderMeshGeneric( void )
|
|||
bundle = stage->bundles[j];
|
||||
RB_CleanupTextureUnit( bundle, j );
|
||||
}
|
||||
}*/
|
||||
}
|
||||
R_FlushArrays();
|
||||
}
|
||||
|
||||
|
@ -2275,7 +2276,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
|
|||
else r_superLightStyle = NULL;
|
||||
m_pRenderMeshBuffer = mb;
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, Ref.m_pCurrentShader );
|
||||
Shader_ForKey( mb->shaderKey, Ref.m_pCurrentShader );
|
||||
|
||||
if( gl_state.orthogonal )
|
||||
{
|
||||
|
@ -2293,7 +2294,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
|
|||
|
||||
if( !r_triangleOutlines ) RB_SetShaderState();
|
||||
|
||||
if( Ref.m_pCurrentShader->deformVertexesNum )
|
||||
if( Ref.m_pCurrentShader->deformVertsNum )
|
||||
RB_DeformVertexes();
|
||||
|
||||
if( r_features & MF_KEEPLOCK )
|
||||
|
@ -2320,7 +2321,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
|
|||
if( fog && !fog->shader ) fog = NULL;
|
||||
|
||||
// can we fog the geometry with alpha texture?
|
||||
r_texFog = ( fog && (( Ref.m_pCurrentShader->sort <= SORT_ALPHATEST && ( Ref.m_pCurrentShader->flags & ( SHADER_DEPTHWRITE|SHADER_SKY ))) || Ref.m_pCurrentShader->fog_dist )) ? fog : NULL;
|
||||
r_texFog = ( fog && (( Ref.m_pCurrentShader->sort <= SORT_ALPHATEST && ( Ref.m_pCurrentShader->flags & ( SHADER_SKYPARMS ))) || Ref.m_pCurrentShader->fogDist )) ? fog : NULL;
|
||||
|
||||
// check if the fog volume is present but we can't use alpha texture
|
||||
r_colorFog = ( fog && !r_texFog ) ? fog : NULL;
|
||||
|
@ -2404,7 +2405,7 @@ meshbuffer_t pic_mbuffer;
|
|||
RB_DrawStretchPic
|
||||
===============
|
||||
*/
|
||||
void RB_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, shader_t *shader )
|
||||
void RB_DrawStretchPic( float x, float y, float w, float h, float s1, float t1, float s2, float t2, ref_shader_t *shader )
|
||||
{
|
||||
if( !shader ) return;
|
||||
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
//=======================================================================
|
||||
// Copyright XashXT Group 2008 ©
|
||||
// r_backend.h - rendering backend
|
||||
//=======================================================================
|
||||
|
||||
#ifndef R_BACKEND_H
|
||||
#define R_BACKEND_H
|
||||
|
||||
#define MAX_VERTEXES 4096
|
||||
#define MAX_ELEMENTS MAX_VERTEXES * 6 // quad
|
||||
#define MAX_TRIANGLES MAX_ELEMENTS / 3
|
||||
#define MAX_NEIGHBORS MAX_TRIANGLES *3
|
||||
|
||||
typedef struct
|
||||
{
|
||||
vec3_t xyz;
|
||||
vec3_t normal;
|
||||
vec3_t tangents[2];
|
||||
vec2_t st;
|
||||
vec3_t color;
|
||||
float alpha;
|
||||
} vertexArray_t;
|
||||
|
||||
typedef struct ref_backend_s
|
||||
{
|
||||
// src arrays
|
||||
vec4_t *inColors[LM_STYLES]; // RGBA[4]
|
||||
vec2_t *inTexCoords;
|
||||
elem_t *inIndices;
|
||||
vec2_t *inLMCoords;
|
||||
vec3_t *inNormals;
|
||||
vec3_t *inSVectors;
|
||||
vec3_t *inTVectors;
|
||||
vec3_t *inVertices;
|
||||
|
||||
// dst arrays
|
||||
elem_t indexArray[MAX_ELEMENTS]; // vertsArray[num]
|
||||
vec3_t vertsArray[MAX_VERTEXES]; // XYZ point
|
||||
vec3_t normalArray[MAX_VERTEXES]; // R point
|
||||
vec3_t tangentArray[MAX_VERTEXES]; // S point
|
||||
vec3_t binormalArray[MAX_VERTEXES]; // T point
|
||||
vec3_t texCoordArray[MAX_TEXTURE_UNITS][MAX_VERTEXES]; // STR (tangent, binormal, normal)
|
||||
vec2_t lmsCoordArray[LM_STYLES][MAX_VERTEXES]; // ST for all lightmaps
|
||||
vec4_t ColorArray[MAX_VERTEXES]; // sum of all lightstyles
|
||||
} ref_backend_t;
|
||||
|
||||
#endif//R_BACKEND_H
|
|
@ -224,7 +224,7 @@ static byte r_queriesBits[MAX_OQ_TOTAL/8];
|
|||
static GLuint r_occlusionQueries[MAX_OQ_TOTAL];
|
||||
|
||||
static meshbuffer_t r_occluderMB;
|
||||
static shader_t *r_occlusionShader;
|
||||
static ref_shader_t *r_occlusionShader;
|
||||
static bool r_occludersQueued;
|
||||
static ref_entity_t *r_occlusionEntity;
|
||||
|
||||
|
@ -240,7 +240,7 @@ void R_InitOcclusionQueries( void )
|
|||
meshbuffer_t *meshbuf = &r_occluderMB;
|
||||
|
||||
if( !r_occlusionShader )
|
||||
r_occlusionShader = R_FindShader( "***r_occlusion***", SHADER_OPAQUE_OCCLUDER, 0 );
|
||||
r_occlusionShader = R_FindShader( "***r_occlusion***", SHADER_GENERIC, 0 );
|
||||
|
||||
if( !GL_Support( R_OCCLUSION_QUERY ))
|
||||
return;
|
||||
|
@ -317,7 +317,7 @@ static void R_RenderOccludingSurfaces( void )
|
|||
R_OcclusionShader
|
||||
===============
|
||||
*/
|
||||
shader_t *R_OcclusionShader( void )
|
||||
ref_shader_t *R_OcclusionShader( void )
|
||||
{
|
||||
return r_occlusionShader;
|
||||
}
|
||||
|
@ -327,7 +327,7 @@ shader_t *R_OcclusionShader( void )
|
|||
R_AddOccludingSurface
|
||||
===============
|
||||
*/
|
||||
void R_AddOccludingSurface( msurface_t *surf, shader_t *shader )
|
||||
void R_AddOccludingSurface( msurface_t *surf, ref_shader_t *shader )
|
||||
{
|
||||
int diff = shader->flags ^ r_occlusionShader->flags;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ this is needed by some client drawing functions
|
|||
*/
|
||||
void R_GetPicSize( int *w, int *h, const char *pic )
|
||||
{
|
||||
shader_t *shader = R_RegisterShaderNoMip(va( "gfx/%s", pic ));
|
||||
ref_shader_t *shader = R_RegisterShaderNoMip(va( "gfx/%s", pic ));
|
||||
*w = (int)shader->stages[0]->bundles[0]->textures[0]->width;
|
||||
*h = (int)shader->stages[0]->bundles[0]->textures[0]->height;
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ Call RB_RenderMesh to flush.
|
|||
*/
|
||||
void R_DrawStretchPic( float x, float y, float w, float h, float sl, float tl, float sh, float th, const char *name )
|
||||
{
|
||||
shader_t *shader = R_RegisterShaderNoMip(va( "gfx/%s", name ));
|
||||
ref_shader_t *shader = R_RegisterShaderNoMip(va( "gfx/%s", name ));
|
||||
RB_DrawStretchPic( x, y, w, h, sl, tl, sh, th, shader );
|
||||
}
|
||||
|
||||
|
|
|
@ -23,13 +23,13 @@ R_SurfPotentiallyLit
|
|||
*/
|
||||
bool R_SurfPotentiallyLit( msurface_t *surf )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
if( surf->flags & ( SURF_SKY|SURF_NODLIGHT|SURF_NODRAW ))
|
||||
return false;
|
||||
|
||||
shader = surf->shader;
|
||||
if(( shader->flags & ( SHADER_SKY|SHADER_FLARE )) || !shader->numStages )
|
||||
if(( shader->flags & ( SHADER_SKYPARMS|SHADER_FLARE )) || !shader->numStages )
|
||||
return false;
|
||||
return ( surf->mesh && ( surf->faceType != MST_FLARE ));
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ void R_AddDynamicLights( uint dlightbits, int state )
|
|||
uint i, j, numTempIndices;
|
||||
bool cullAway;
|
||||
const dlight_t *light;
|
||||
const shader_t *shader;
|
||||
const ref_shader_t *shader;
|
||||
vec3_t tvec, dlorigin, normal;
|
||||
uint tempIndexArray[MAX_ARRAY_ELEMENTS];
|
||||
float inverseIntensity, *v1, *v2, *v3, dist;
|
||||
|
@ -219,7 +219,7 @@ void R_AddDynamicLights( uint dlightbits, int state )
|
|||
|
||||
//===================================================================
|
||||
|
||||
static shader_t *r_coronaShader;
|
||||
static ref_shader_t *r_coronaShader;
|
||||
|
||||
/*
|
||||
=================
|
||||
|
|
481
render/r_local.h
481
render/r_local.h
|
@ -20,7 +20,6 @@ extern byte *r_shaderpool;
|
|||
// limits
|
||||
#define MAX_TEXTURE_UNITS 8
|
||||
#define MAX_LIGHTMAPS 128
|
||||
#define MAX_SHADERS 1024
|
||||
#define MAX_ENTITIES 1024
|
||||
#define MAX_VERTEX_BUFFERS 2048
|
||||
#define MAX_TEXTURES 4096
|
||||
|
@ -140,8 +139,8 @@ void R_ImageFreeUnused( void );
|
|||
#define RP_ENVVIEW (1<<2) // render only bmodels (for envshots)
|
||||
#define RP_NOSKY (1<<3)
|
||||
#define RP_SKYPORTALVIEW (1<<4) // view from sky pass
|
||||
#define RP_PORTALCAPTURED (1<<5) // base portal image
|
||||
#define RP_PORTALCAPTURED2 (1<<6) // refracted portal image ?
|
||||
#define RP_REFLECTED (1<<5) // base portal image
|
||||
#define RP_REFRACTED (1<<6) // refracted portal image ?
|
||||
#define RP_OLDVIEWCLUSTER (1<<7)
|
||||
#define RP_SHADOWMAPVIEW (1<<8) // shadowmap pass
|
||||
#define RP_FLIPFRONTFACE (1<<9)
|
||||
|
@ -161,8 +160,38 @@ void R_ImageFreeUnused( void );
|
|||
#define R_EDICTNUM( ent ) ((int)((ent) - r_entities)<<20 )
|
||||
#define R_EDICT_FOR_KEY( num, ent ) ( ent = r_entities + (((num)>>20) & (MAX_ENTITIES-1)))
|
||||
|
||||
#define R_SHADERNUM( s ) ((s)->sort << 26 ) | ((s)->shaderNum )
|
||||
#define R_SHADER_FOR_KEY( num, s ) ((s) = r_shaders[((num) & 0xFFF)])
|
||||
// GLSTATE machine flags
|
||||
#define GLSTATE_DEFAULT 0 // reset state to default
|
||||
#define GLSTATE_SRCBLEND_ZERO (1<<0)
|
||||
#define GLSTATE_SRCBLEND_ONE (1<<1)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR (1<<2)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_DST_ALPHA (1<<3)
|
||||
#define GLSTATE_DSTBLEND_ZERO (1<<4)
|
||||
#define GLSTATE_DSTBLEND_ONE (1<<5)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR (1<<6)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_DST_ALPHA (1<<7)
|
||||
#define GLSTATE_AFUNC_GT0 (1<<8)
|
||||
#define GLSTATE_AFUNC_LT128 (1<<9)
|
||||
#define GLSTATE_AFUNC_GE128 (1<<10)
|
||||
#define GLSTATE_DEPTHWRITE (1<<11)
|
||||
#define GLSTATE_DEPTHFUNC_EQ (1<<12)
|
||||
#define GLSTATE_OFFSET_FILL (1<<13)
|
||||
#define GLSTATE_NO_DEPTH_TEST (1<<14)
|
||||
#define GLSTATE_BLEND_MTEX (1<<15)
|
||||
|
||||
// GLSTATE masks
|
||||
#define GLSTATE_MASK ((1<<16) - 1 )
|
||||
#define GLSTATE_SRCBLEND_DST_COLOR (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE)
|
||||
#define GLSTATE_SRCBLEND_SRC_ALPHA (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA (GLSTATE_SRCBLEND_ONE|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_SRCBLEND_DST_ALPHA (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_DSTBLEND_SRC_COLOR (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE)
|
||||
#define GLSTATE_DSTBLEND_SRC_ALPHA (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA (GLSTATE_DSTBLEND_ONE|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_DSTBLEND_DST_ALPHA (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_ALPHAFUNC (GLSTATE_AFUNC_GT0|GLSTATE_AFUNC_LT128|GLSTATE_AFUNC_GE128)
|
||||
#define GLSTATE_SRCBLEND_MASK (((GLSTATE_SRCBLEND_DST_ALPHA)<<1)-GLSTATE_SRCBLEND_ZERO)
|
||||
#define GLSTATE_DSTBLEND_MASK (((GLSTATE_DSTBLEND_DST_ALPHA)<<1)-GLSTATE_DSTBLEND_ZERO)
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -185,8 +214,8 @@ enum
|
|||
&& r_drawentities->integer && !((ri).params & RP_NONVIEWERREF) \
|
||||
&& !((Ref).refdef.rdflags & RDF_NOWORLDMODEL) \
|
||||
&& OCCLUSION_QUERIES_CVAR_HACK( Ref ))
|
||||
#define OCCLUSION_OPAQUE_SHADER( s ) (((s)->sort == SORT_OPAQUE ) && ((s)->flags & SHADER_DEPTHWRITE ) \
|
||||
&& !(s)->deformVertexesNum )
|
||||
#define OCCLUSION_OPAQUE_SHADER( s ) (((s)->sort == SORT_OPAQUE ) && ((s)->stages[0]->flags & SHADERSTAGE_DEPTHWRITE ) \
|
||||
&& !(s)->deformVertsNum )
|
||||
#define OCCLUSION_TEST_ENTITY( e ) (((e)->flags & (RF_OCCLUSIONTEST|RF_WEAPONMODEL)) == RF_OCCLUSIONTEST )
|
||||
|
||||
/*
|
||||
|
@ -252,397 +281,7 @@ void R_ShutdownPrograms( void );
|
|||
void R_ProgramList_f( void );
|
||||
void R_ProgramDump_f( void );
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
||||
SHADERS
|
||||
|
||||
=======================================================================
|
||||
*/
|
||||
#define SHADER_MAX_EXPRESSIONS 16
|
||||
#define SHADER_MAX_STAGES 8
|
||||
#define SHADER_MAX_DEFORMVERTEXES 8
|
||||
#define SHADER_MAX_TEXTURES 16
|
||||
#define SHADER_MAX_TCMOD 8
|
||||
|
||||
// Shader types used for shader loading
|
||||
typedef enum
|
||||
{
|
||||
SHADER_INVALID = -1, // invalid shaders
|
||||
SHADER_GENERIC,
|
||||
SHADER_SURFACE, // bsp surface
|
||||
SHADER_VERTEX, // vertex manipulation (lighting, deform etc)
|
||||
SHADER_FLARE, // light flares
|
||||
SHADER_STUDIO, // studio meshes
|
||||
SHADER_SPRITE, // sprite frames
|
||||
SHADER_NOMIP, // 2d images
|
||||
SHADER_FONT, // speical case for displayed fonts
|
||||
SHADER_FARBOX, // sky farbox
|
||||
SHADER_NEARBOX, // sky nearbox
|
||||
SHADER_PLANAR_SHADOW, // customizable shadow
|
||||
SHADER_OPAQUE_OCCLUDER // occluder controls
|
||||
} shaderType_t;
|
||||
|
||||
// shader flags
|
||||
#define SHADER_DEPTHWRITE (1<<0)
|
||||
#define SHADER_SKYPARMS (1<<1)
|
||||
#define SHADER_POLYGONOFFSET (1<<2)
|
||||
#define SHADER_CULL (1<<3)
|
||||
#define SHADER_SORT (1<<4)
|
||||
#define SHADER_VIDEOMAP (1<<5)
|
||||
#define SHADER_MATERIAL (1<<6)
|
||||
#define SHADER_DEFORMVERTEXES (1<<7)
|
||||
#define SHADER_ENTITYMERGABLE (1<<8)
|
||||
#define SHADER_FLARE (1<<9)
|
||||
#define SHADER_AUTOSPRITE (1<<10)
|
||||
#define SHADER_NO_MODULATIVE_DLIGHTS (1<<11)
|
||||
#define SHADER_LIGHTMAP (1<<12)
|
||||
#define SHADER_PORTAL (1<<13)
|
||||
#define SHADER_PORTAL_CAPTURE (1<<14)
|
||||
#define SHADER_PORTAL_CAPTURE2 (1<<15)
|
||||
#define SHADER_SKY (1<<16)
|
||||
|
||||
// glstats presets
|
||||
#define GLSTATE_NONE 0
|
||||
#define GLSTATE_SRCBLEND_ZERO (1<<0)
|
||||
#define GLSTATE_SRCBLEND_ONE (1<<1)
|
||||
#define GLSTATE_SRCBLEND_DST_COLOR (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR (1<<2)
|
||||
#define GLSTATE_SRCBLEND_SRC_ALPHA (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA (GLSTATE_SRCBLEND_ONE|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_SRCBLEND_DST_ALPHA (GLSTATE_SRCBLEND_ZERO|GLSTATE_SRCBLEND_ONE|GLSTATE_SRCBLEND_ONE_MINUS_DST_COLOR)
|
||||
#define GLSTATE_SRCBLEND_ONE_MINUS_DST_ALPHA (1<<4)
|
||||
#define GLSTATE_DSTBLEND_ZERO (1<<5)
|
||||
#define GLSTATE_DSTBLEND_ONE (1<<6)
|
||||
#define GLSTATE_DSTBLEND_SRC_COLOR (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR (1<<7)
|
||||
#define GLSTATE_DSTBLEND_SRC_ALPHA (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA (GLSTATE_DSTBLEND_ONE|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_DSTBLEND_DST_ALPHA (GLSTATE_DSTBLEND_ZERO|GLSTATE_DSTBLEND_ONE|GLSTATE_DSTBLEND_ONE_MINUS_SRC_COLOR)
|
||||
#define GLSTATE_DSTBLEND_ONE_MINUS_DST_ALPHA (1<<8)
|
||||
#define GLSTATE_AFUNC_GT0 (1<<9)
|
||||
#define GLSTATE_AFUNC_LT128 (1<<10)
|
||||
#define GLSTATE_AFUNC_GE128 (1<<11)
|
||||
#define GLSTATE_ALPHAFUNC (GLSTATE_AFUNC_GT0|GLSTATE_AFUNC_LT128|GLSTATE_AFUNC_GE128)
|
||||
#define GLSTATE_DEPTHWRITE (1<<12)
|
||||
#define GLSTATE_DEPTHFUNC_EQ (1<<13)
|
||||
#define GLSTATE_OFFSET_FILL (1<<14)
|
||||
#define GLSTATE_NO_DEPTH_TEST (1<<15)
|
||||
#define GLSTATE_BLEND_MTEX (1<<16) // FIXME: remove ?
|
||||
|
||||
#define GLSTATE_MARK_END 0x10000 // STAGEBUNDLE_MARK_BEGIN
|
||||
|
||||
#define GLSTATE_MASK ( GLSTATE_MARK_END-1 )
|
||||
#define GLSTATE_SRCBLEND_MASK 0xF
|
||||
#define GLSTATE_DSTBLEND_MASK 0xF0
|
||||
|
||||
|
||||
// shader stage flags
|
||||
#define SHADERSTAGE_NEXTBUNDLE (1<<0)
|
||||
#define SHADERSTAGE_ALPHAFUNC (1<<1)
|
||||
#define SHADERSTAGE_BLENDFUNC (1<<2)
|
||||
#define SHADERSTAGE_DEPTHFUNC (1<<3)
|
||||
#define SHADERSTAGE_DEPTHWRITE (1<<4)
|
||||
#define SHADERSTAGE_DETAIL (1<<5) // detail textures
|
||||
#define SHADERSTAGE_RGBGEN (1<<6)
|
||||
#define SHADERSTAGE_ALPHAGEN (1<<7)
|
||||
#define SHADERSTAGE_NOCOLORARRAY (1<<8)
|
||||
#define SHADERSTAGE_DLIGHT (1<<9)
|
||||
#define SHADERSTAGE_BLENDDECAL (1<<10)
|
||||
#define SHADERSTAGE_STENCILSHADOW (1<<11)
|
||||
|
||||
// translate to TF_* flags
|
||||
#define STAGEBUNDLE_NOMIPMAPS (GLSTATE_MARK_END<<0)
|
||||
#define STAGEBUNDLE_NOPICMIP (GLSTATE_MARK_END<<1)
|
||||
#define STAGEBUNDLE_NOCOMPRESS (GLSTATE_MARK_END<<2)
|
||||
#define STAGEBUNDLE_CLAMPTEXCOORDS (GLSTATE_MARK_END<<3)
|
||||
// STAGEBUNDLE_* flags
|
||||
#define STAGEBUNDLE_ANIMFREQUENCY (GLSTATE_MARK_END<<4)
|
||||
#define STAGEBUNDLE_MAP (GLSTATE_MARK_END<<5)
|
||||
#define STAGEBUNDLE_BUMPMAP (GLSTATE_MARK_END<<6)
|
||||
#define STAGEBUNDLE_CUBEMAP (GLSTATE_MARK_END<<7)
|
||||
#define STAGEBUNDLE_VIDEOMAP (GLSTATE_MARK_END<<8)
|
||||
#define STAGEBUNDLE_TEXENVCOMBINE (GLSTATE_MARK_END<<9)
|
||||
#define STAGEBUNDLE_TCGEN (GLSTATE_MARK_END<<10)
|
||||
#define STAGEBUNDLE_TCMOD (GLSTATE_MARK_END<<11)
|
||||
#define STAGEBUNDLE_STENCILSHADOW (GLSTATE_MARK_END<<14)
|
||||
|
||||
typedef enum
|
||||
{
|
||||
WAVEFORM_SIN,
|
||||
WAVEFORM_TRIANGLE,
|
||||
WAVEFORM_SQUARE,
|
||||
WAVEFORM_SAWTOOTH,
|
||||
WAVEFORM_INVERSESAWTOOTH,
|
||||
WAVEFORM_NOISE,
|
||||
WAVEFORM_CONSTANT
|
||||
} waveForm_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SORT_NONE = 0,
|
||||
SORT_PORTAL,
|
||||
SORT_SKY,
|
||||
SORT_OPAQUE,
|
||||
SORT_DECAL,
|
||||
SORT_ALPHATEST,
|
||||
SORT_BANNER,
|
||||
SORT_UNDERWATER = 8,
|
||||
SORT_ADDITIVE,
|
||||
SORT_NEAREST = 16
|
||||
} sort_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DEFORMVERTEXES_NONE = 0,
|
||||
DEFORMVERTEXES_WAVE,
|
||||
DEFORMVERTEXES_MOVE,
|
||||
DEFORMVERTEXES_NORMAL,
|
||||
DEFORMVERTEXES_BULGE,
|
||||
DEFORMVERTEXES_AUTOSPRITE, // same as SPR_VP_PARALLEL
|
||||
DEFORMVERTEXES_AUTOSPRITE2,
|
||||
DEFORMVERTEXES_PROJECTION_SHADOW,
|
||||
DEFORMVERTEXES_AUTOPARTICLE
|
||||
} deformVertsType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TCGEN_BASE,
|
||||
TCGEN_LIGHTMAP,
|
||||
TCGEN_ENVIRONMENT,
|
||||
TCGEN_VECTOR,
|
||||
TCGEN_FOG,
|
||||
TCGEN_WARP, // q1/q2 warp surfaces (water, slime, lava)
|
||||
TCGEN_LIGHTVECTOR,
|
||||
TCGEN_HALFANGLE,
|
||||
TCGEN_REFLECTION,
|
||||
TCGEN_SVECTORS,
|
||||
TCGEN_PROJECTION,
|
||||
TCGEN_PROJECTION_SHADOW,
|
||||
TCGEN_NORMAL
|
||||
} tcGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TCMOD_TRANSLATE,
|
||||
TCMOD_SCALE,
|
||||
TCMOD_SCROLL,
|
||||
TCMOD_ROTATE,
|
||||
TCMOD_STRETCH,
|
||||
TCMOD_TURB,
|
||||
TCMOD_TRANSFORM
|
||||
} tcModType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RGBGEN_IDENTITY,
|
||||
RGBGEN_IDENTITYLIGHTING,
|
||||
RGBGEN_CONST,
|
||||
RGBGEN_WAVE,
|
||||
RGBGEN_ENTITY,
|
||||
RGBGEN_ONEMINUSENTITY,
|
||||
RGBGEN_VERTEX,
|
||||
RGBGEN_EXACTVERTEX,
|
||||
RGBGEN_ONEMINUSVERTEX,
|
||||
RGBGEN_LIGHTINGAMBIENT,
|
||||
RGBGEN_LIGHTINGDIFFUSE,
|
||||
RGBGEN_LIGHTINGDIFFUSE_ONLY,
|
||||
RGBGEN_LIGHTINGAMBIENT_ONLY,
|
||||
RGBGEN_FOG,
|
||||
RGBGEN_ENVIRONMENT
|
||||
} rgbGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ALPHAGEN_IDENTITY,
|
||||
ALPHAGEN_CONST,
|
||||
ALPHAGEN_WAVE,
|
||||
ALPHAGEN_PORTAL,
|
||||
ALPHAGEN_VERTEX,
|
||||
ALPHAGEN_ONEMINUSVERTEX,
|
||||
ALPHAGEN_ENTITY,
|
||||
ALPHAGEN_ONEMINUSENTITY,
|
||||
ALPHAGEN_SPECULAR,
|
||||
ALPHAGEN_DOT,
|
||||
ALPHAGEN_ONEMINUSDOT,
|
||||
ALPHAGEN_FADE,
|
||||
ALPHAGEN_ONEMINUSFADE,
|
||||
|
||||
} alphaGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TEX_GENERIC = 0,
|
||||
TEX_LIGHTMAP,
|
||||
TEX_CINEMATIC,
|
||||
TEX_PORTAL,
|
||||
TEX_DLIGHT
|
||||
} texType_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
waveForm_t type;
|
||||
float params[4];
|
||||
} waveFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum mode;
|
||||
} cull_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
texture_t *farBox[6];
|
||||
float cloudHeight;
|
||||
texture_t *nearBox[6];
|
||||
} skyParms_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
deformVertsType_t type;
|
||||
waveFunc_t func;
|
||||
float params[3];
|
||||
} deformVerts_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLint rgbCombine;
|
||||
GLint rgbSource[3];
|
||||
GLint rgbOperand[3];
|
||||
GLint rgbScale;
|
||||
|
||||
GLint alphaCombine;
|
||||
GLint alphaSource[3];
|
||||
GLint alphaOperand[3];
|
||||
GLint alphaScale;
|
||||
|
||||
GLfloat constColor[4];
|
||||
} texEnvCombine_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tcGenType_t type;
|
||||
float params[8];
|
||||
} tcGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tcModType_t type;
|
||||
waveFunc_t func;
|
||||
float params[6];
|
||||
} tcMod_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum func;
|
||||
GLclampf ref;
|
||||
} alphaFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum func; // GL_MODULATE, GL_ADD etc
|
||||
GLenum src;
|
||||
GLenum dst;
|
||||
} blendFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum func;
|
||||
} depthFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
rgbGenType_t type;
|
||||
waveFunc_t func;
|
||||
float params[4];
|
||||
} rgbGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
alphaGenType_t type;
|
||||
waveFunc_t func;
|
||||
float params[3];
|
||||
} alphaGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
texType_t texType;
|
||||
uint flags;
|
||||
|
||||
texture_t *textures[SHADER_MAX_TEXTURES];
|
||||
uint numTextures;
|
||||
|
||||
float animFrequency;
|
||||
video_t cinematicHandle;
|
||||
|
||||
GLint texEnv;
|
||||
texEnvCombine_t texEnvCombine;
|
||||
|
||||
tcGen_t tcGen;
|
||||
tcMod_t tcMod[SHADER_MAX_TCMOD];
|
||||
uint tcModNum;
|
||||
} stageBundle_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool ignore;
|
||||
uint flags;
|
||||
|
||||
stageBundle_t *bundles[MAX_TEXTURE_UNITS];
|
||||
uint numBundles;
|
||||
|
||||
// glsl
|
||||
const char *program;
|
||||
progType_t progType;
|
||||
|
||||
alphaFunc_t alphaFunc;
|
||||
blendFunc_t blendFunc;
|
||||
depthFunc_t depthFunc;
|
||||
|
||||
rgbGen_t rgbGen;
|
||||
alphaGen_t alphaGen;
|
||||
} shaderStage_t;
|
||||
|
||||
typedef struct shader_s
|
||||
{
|
||||
string name;
|
||||
int shaderNum;
|
||||
shaderType_t shaderType;
|
||||
uint surfaceParm;
|
||||
uint contentFlags;
|
||||
uint features;
|
||||
uint flags;
|
||||
|
||||
cull_t cull;
|
||||
sort_t sort;
|
||||
uint sortKey;
|
||||
skyParms_t skyParms;
|
||||
deformVerts_t deformVertexes[SHADER_MAX_DEFORMVERTEXES];
|
||||
|
||||
vec4_t fogColor;
|
||||
float fog_dist;
|
||||
float fogClearDist;
|
||||
|
||||
float offsetMapping_scale;
|
||||
uint deformVertexesNum;
|
||||
shaderStage_t *stages[SHADER_MAX_STAGES];
|
||||
uint numStages;
|
||||
struct shader_s *nextHash;
|
||||
} shader_t;
|
||||
|
||||
extern shader_t *r_shaders[MAX_SHADERS];
|
||||
extern int r_numShaders;
|
||||
extern shader_t *r_defaultShader;
|
||||
extern shader_t *r_lightmapShader;
|
||||
extern shader_t *r_waterCausticsShader;
|
||||
extern shader_t *r_slimeCausticsShader;
|
||||
extern shader_t *r_lavaCausticsShader;
|
||||
|
||||
shader_t *R_FindShader( const char *name, shaderType_t shaderType, uint surfaceParm );
|
||||
void R_SetInternalMap( texture_t *mipTex ); // internal textures (skins, spriteframes, etc)
|
||||
void R_ShaderList_f( void );
|
||||
void R_InitShaders( void );
|
||||
void R_ShutdownShaders (void);
|
||||
#include "r_shader.h"
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
@ -665,7 +304,7 @@ typedef struct dlight_s
|
|||
vec3_t mins;
|
||||
vec3_t maxs;
|
||||
float intensity;
|
||||
const shader_t *shader; // for some effects
|
||||
const ref_shader_t *shader; // for some effects
|
||||
} dlight_t;
|
||||
|
||||
typedef struct lightstyle_s
|
||||
|
@ -676,7 +315,7 @@ typedef struct lightstyle_s
|
|||
|
||||
typedef struct particle_s
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
vec3_t origin;
|
||||
vec3_t old_origin;
|
||||
float radius;
|
||||
|
@ -745,8 +384,8 @@ typedef struct
|
|||
rb_mesh_t *meshes;
|
||||
vec2_t *sphereStCoords[5]; // sky dome coords
|
||||
vec2_t *linearStCoords[6];
|
||||
shader_t *farboxShaders[6];
|
||||
shader_t *nearboxShaders[6];
|
||||
ref_shader_t *farboxShaders[6];
|
||||
ref_shader_t *nearboxShaders[6];
|
||||
} skydome_t;
|
||||
|
||||
typedef struct
|
||||
|
@ -765,7 +404,7 @@ typedef struct
|
|||
vec3_t *verts;
|
||||
vec2_t *st;
|
||||
vec4_t *colors;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
int fognum;
|
||||
vec3_t normal;
|
||||
} poly_t;
|
||||
|
@ -780,7 +419,7 @@ BRUSH MODELS
|
|||
*/
|
||||
typedef struct
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
cplane_t *visible;
|
||||
|
||||
int numplanes;
|
||||
|
@ -793,7 +432,7 @@ typedef struct msurface_s
|
|||
dmst_t faceType;
|
||||
int flags;
|
||||
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
rb_mesh_t *mesh;
|
||||
mfog_t *fog;
|
||||
cplane_t *plane;
|
||||
|
@ -939,7 +578,7 @@ typedef struct
|
|||
mstudioneighbor_t *neighbors;
|
||||
mstudiopoint_t *points;
|
||||
mstudiost_t *st;
|
||||
shader_t *shaders;
|
||||
ref_shader_t *shaders;
|
||||
|
||||
int numTriangles;
|
||||
int numVertices;
|
||||
|
@ -966,7 +605,7 @@ typedef struct mspriteframe_s
|
|||
int height;
|
||||
float up, down, left, right;
|
||||
float radius;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
texture_t *texture;
|
||||
} mspriteframe_t;
|
||||
|
||||
|
@ -1014,7 +653,7 @@ typedef struct rmodel_s
|
|||
float radius;
|
||||
|
||||
int numShaders;
|
||||
shader_t *shaders[MAX_SHADERS];
|
||||
ref_shader_t *shaders[MAX_SHADERS];
|
||||
|
||||
// memory representation pointer
|
||||
void *extradata; // mbrushmodel_t\mstudiomodel_t\mspritemodel_t
|
||||
|
@ -1100,7 +739,7 @@ typedef struct ref_entity_s
|
|||
float gaityaw; // local value
|
||||
|
||||
// shader information
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
float shaderTime; // subtracted from refdef time to control effect start times
|
||||
float radius; // bbox approximate radius
|
||||
float rotation; // what the hell ???
|
||||
|
@ -1141,7 +780,7 @@ typedef struct ref_state_s
|
|||
ref_entity_t *m_pCurrentEntity;
|
||||
rmodel_t *m_pCurrentModel;
|
||||
ref_entity_t *m_pPrevEntity;
|
||||
shader_t *m_pCurrentShader;
|
||||
ref_shader_t *m_pCurrentShader;
|
||||
|
||||
//
|
||||
// view origin
|
||||
|
@ -1452,7 +1091,7 @@ void RB_ShowTextures( void );
|
|||
void RB_DebugGraphics( void );
|
||||
void RB_CheckMeshOverflow( int numIndices, int numVertices );
|
||||
void RB_RenderMesh( void );
|
||||
void RB_DrawStretchPic( float x, float y, float w, float h, float sl, float tl, float sh, float th, shader_t *shader );
|
||||
void RB_DrawStretchPic( float x, float y, float w, float h, float sl, float tl, float sh, float th, ref_shader_t *shader );
|
||||
void RB_DrawTriangleOutlines( bool showTris, bool showNormals );
|
||||
void RB_BeginTriangleOutlines( void );
|
||||
void RB_EndTriangleOutlines( void );
|
||||
|
@ -1572,19 +1211,19 @@ bool R_CompletelyFogged( mfog_t *fog, vec3_t origin, float radius );
|
|||
void R_TranslateForEntity( ref_entity_t *ent );
|
||||
void R_RotateForEntity( ref_entity_t *entity );
|
||||
void R_CleanUpTextureUnits( void );
|
||||
shader_t *R_OcclusionShader( void );
|
||||
ref_shader_t *R_OcclusionShader( void );
|
||||
void R_SurfIssueOcclusionQueries( void );
|
||||
void R_ClearSurfOcclusionQueryKeys( void );
|
||||
int R_GetOcclusionQueryNum( int type, int key );
|
||||
void R_AddOccludingSurface( msurface_t *surf, shader_t *shader );
|
||||
void R_AddOccludingSurface( msurface_t *surf, ref_shader_t *shader );
|
||||
int R_IssueOcclusionQuery( int query, ref_entity_t *e, vec3_t mins, vec3_t maxs );
|
||||
int R_SurfOcclusionQueryKey( ref_entity_t *e, msurface_t *surf );
|
||||
bool R_GetOcclusionQueryResultBool( int type, int key, bool wait );
|
||||
void R_BeginOcclusionPass( void );
|
||||
void R_EndOcclusionPass( void );
|
||||
meshbuffer_t *R_AddMeshToList( meshType_t meshType, mfog_t *fog, shader_t *shader, int infoKey );
|
||||
meshbuffer_t *R_AddMeshToList( meshType_t meshType, mfog_t *fog, ref_shader_t *shader, int infoKey );
|
||||
void R_RenderMeshBuffer( const meshbuffer_t *mb );
|
||||
void R_AddModelMeshToList( mfog_t *fog, shader_t *shader, int meshnum );
|
||||
void R_AddModelMeshToList( mfog_t *fog, ref_shader_t *shader, int meshnum );
|
||||
void R_MarkLeaves( void );
|
||||
void R_DrawWorld( void );
|
||||
void R_DrawSprite( void );
|
||||
|
@ -1598,7 +1237,7 @@ void R_AddShadowToList( ref_entity_t *entity );
|
|||
void R_RenderShadows( void );
|
||||
void R_BloomBlend ( const refdef_t *fd );
|
||||
bool R_AddSkySurface( msurface_t *fa );
|
||||
void R_DrawSky( shader_t *shader );
|
||||
void R_DrawSky( ref_shader_t *shader );
|
||||
void R_ClearSky( void );
|
||||
void R_ClipSkySurface( msurface_t *surf );
|
||||
void R_AddSkyToList( void );
|
||||
|
@ -1635,11 +1274,11 @@ void R_BeginRegistration( const char *map );
|
|||
rmodel_t *R_RegisterModel( const char *name );
|
||||
void R_SetupSky( const char *name, float rotate, const vec3_t axis );
|
||||
void R_EndRegistration( void );
|
||||
void R_ShaderRegisterImages( shader_t *shader ); // prolonge registration
|
||||
shader_t *R_RegisterShader( const char *name );
|
||||
shader_t *R_RegisterShaderSkin( const char *name );
|
||||
shader_t *R_RegisterShaderNoMip( const char *name );
|
||||
void R_DeformVertexesBBoxForShader( const shader_t *shader, vec3_t ebbox );
|
||||
void R_ShaderRegisterImages( ref_shader_t *shader ); // prolonge registration
|
||||
ref_shader_t *R_RegisterShader( const char *name );
|
||||
ref_shader_t *R_RegisterShaderSkin( const char *name );
|
||||
ref_shader_t *R_RegisterShaderNoMip( const char *name );
|
||||
void R_DeformVertexesBBoxForShader( const ref_shader_t *shader, vec3_t ebbox );
|
||||
bool VID_ScreenShot( const char *filename, bool levelshot );
|
||||
void R_DrawFill( float x, float y, float w, float h );
|
||||
void R_DrawStretchRaw( int x, int y, int w, int h, int width, int height, const byte *raw, bool dirty );
|
||||
|
|
|
@ -301,7 +301,7 @@ bool R_CompletelyFogged( mfog_t *fog, vec3_t origin, float radius )
|
|||
if( fog && fog->shader && Ref.fog_dist_to_eye[fog - r_worldBrushModel->fogs] < 0 )
|
||||
{
|
||||
float vpnDist = (( Ref.vieworg[0] - origin[0] ) * Ref.forward[0] + ( Ref.vieworg[1] - origin[1] ) * Ref.forward[1] + ( Ref.vieworg[2] - origin[2] ) * Ref.forward[2] );
|
||||
return (( vpnDist + radius ) / fog->shader->fog_dist ) < -1;
|
||||
return (( vpnDist + radius ) / fog->shader->fogDist ) < -1;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -346,7 +346,7 @@ static bool R_PushSprite( const meshbuffer_t *mb, float rotation, float right, f
|
|||
vec3_t point;
|
||||
vec3_t v_right, v_up;
|
||||
ref_entity_t *e = Ref.m_pCurrentEntity;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
if( rotation )
|
||||
{
|
||||
|
@ -373,7 +373,7 @@ static bool R_PushSprite( const meshbuffer_t *mb, float rotation, float right, f
|
|||
VectorScale( spr_points[i], e->scale, spr_points[i] );
|
||||
}
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
// the code below is disgusting, but some q3a shaders use 'rgbgen vertex'
|
||||
// and 'alphagen vertex' for effects instead of 'rgbgen entity' and 'alphagen entity'
|
||||
|
@ -412,7 +412,7 @@ static void R_PushFlareSurf( const meshbuffer_t *mb )
|
|||
float up = radius, down = -radius, left = -radius, right = radius;
|
||||
mbrushmodel_t *bmodel = ( mbrushmodel_t * )Ref.m_pCurrentModel->extradata;
|
||||
msurface_t *surf = &bmodel->surfaces[mb->infoKey - 1];
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
if( Ref.m_pCurrentModel != r_worldModel )
|
||||
{
|
||||
|
@ -450,7 +450,7 @@ static void R_PushFlareSurf( const meshbuffer_t *mb )
|
|||
for( i = 0; i < 4; i++ )
|
||||
Vector4Copy( color, spr_color[i] );
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
R_PushMesh( &spr_mesh, MF_NOCULL|MF_TRIFAN|shader->features );
|
||||
}
|
||||
|
@ -471,7 +471,7 @@ static void R_PushCorona( const meshbuffer_t *mb )
|
|||
float down = -radius;
|
||||
float left = -radius;
|
||||
float right = radius;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
VectorCopy( light->origin, origin );
|
||||
|
||||
|
@ -491,7 +491,7 @@ static void R_PushCorona( const meshbuffer_t *mb )
|
|||
for( i = 0; i < 4; i++ )
|
||||
Vector4Copy( color, spr_color[i] );
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
R_PushMesh( &spr_mesh, MF_NOCULL|MF_TRIFAN|shader->features );
|
||||
}
|
||||
|
||||
|
@ -821,7 +821,7 @@ static float R_SetFarClip( void )
|
|||
|
||||
if( r_worldBrushModel->globalfog )
|
||||
{
|
||||
float fogdist = r_worldBrushModel->globalfog->shader->fog_dist;
|
||||
float fogdist = r_worldBrushModel->globalfog->shader->fogDist;
|
||||
if( farDist > fogdist ) farDist = fogdist;
|
||||
else Ref.clipFlags &= ~16;
|
||||
}
|
||||
|
@ -1798,7 +1798,7 @@ void R_RenderScene( refdef_t *fd )
|
|||
|
||||
if( r_worldModel && !( Ref.refdef.rdflags & RDF_NOWORLDMODEL ) && r_worldBrushModel->globalfog )
|
||||
{
|
||||
Ref.farClip = r_worldBrushModel->globalfog->shader->fog_dist;
|
||||
Ref.farClip = r_worldBrushModel->globalfog->shader->fogDist;
|
||||
Ref.farClip = max( r_farclip_min, Ref.farClip ) + r_farclip_bias;
|
||||
Ref.clipFlags |= 16;
|
||||
}
|
||||
|
|
|
@ -191,7 +191,7 @@ Calculate sortkey and store info used for batching and sorting.
|
|||
All 3D-geometry passes this function.
|
||||
=================
|
||||
*/
|
||||
meshbuffer_t *R_AddMeshToList( int type, mfog_t *fog, shader_t *shader, int infokey )
|
||||
meshbuffer_t *R_AddMeshToList( int type, mfog_t *fog, ref_shader_t *shader, int infokey )
|
||||
{
|
||||
meshlist_t *list;
|
||||
meshbuffer_t *meshbuf;
|
||||
|
@ -244,7 +244,7 @@ meshbuffer_t *R_AddMeshToList( int type, mfog_t *fog, shader_t *shader, int info
|
|||
R_AddMeshToList
|
||||
=================
|
||||
*/
|
||||
void R_AddModelMeshToList( mfog_t *fog, shader_t *shader, int meshnum )
|
||||
void R_AddModelMeshToList( mfog_t *fog, ref_shader_t *shader, int meshnum )
|
||||
{
|
||||
meshbuffer_t *mb;
|
||||
|
||||
|
@ -263,7 +263,7 @@ static void R_BatchMeshBuffer( const meshbuffer_t *mb, const meshbuffer_t *nextm
|
|||
int type, features;
|
||||
bool nonMergable;
|
||||
ref_entity_t *ent;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
msurface_t *surf, *nextSurf;
|
||||
|
||||
R_EDICT_FOR_KEY( mb->sortKey, ent );
|
||||
|
@ -284,11 +284,12 @@ static void R_BatchMeshBuffer( const meshbuffer_t *mb, const meshbuffer_t *nextm
|
|||
{
|
||||
case mod_world:
|
||||
case mod_brush:
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
if( shader->flags & SHADER_SKY )
|
||||
{ // draw sky
|
||||
if( !( Ref.params & RP_NOSKY ) )
|
||||
if( shader->flags & SHADER_SKYPARMS )
|
||||
{
|
||||
// draw sky
|
||||
if( !( Ref.params & RP_NOSKY ))
|
||||
R_DrawSky( shader );
|
||||
return;
|
||||
}
|
||||
|
@ -400,7 +401,7 @@ void R_DrawPortals( void )
|
|||
{
|
||||
int i, trynum, num_meshes, total_meshes;
|
||||
meshbuffer_t *mb;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
if( r_viewCluster == -1 )
|
||||
return;
|
||||
|
@ -434,13 +435,13 @@ void R_DrawPortals( void )
|
|||
|
||||
for( i = 0; i < total_meshes && num_meshes; i++, mb++ )
|
||||
{
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
if( shader->flags & SHADER_PORTAL )
|
||||
{
|
||||
num_meshes--;
|
||||
|
||||
if( r_fastsky->integer && !( shader->flags & (SHADER_PORTAL_CAPTURE|SHADER_PORTAL_CAPTURE2)))
|
||||
if( r_fastsky->integer && !( shader->flags & (SHADER_REFLECTION|SHADER_REFRACTION)))
|
||||
continue;
|
||||
|
||||
if( !R_AddPortalSurface( mb ))
|
||||
|
@ -463,9 +464,9 @@ void R_DrawPortals( void )
|
|||
{
|
||||
for( i = 0, mb = Ref.meshlist->meshbuffer_opaque; i < Ref.meshlist->num_opaque_meshes; i++, mb++ )
|
||||
{
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
if( shader->flags & SHADER_SKY )
|
||||
if( shader->flags & SHADER_SKYPARMS )
|
||||
{
|
||||
R_DrawSky( shader );
|
||||
Ref.params |= RP_NOSKY;
|
||||
|
@ -639,7 +640,7 @@ R_AddPortalSurface
|
|||
*/
|
||||
static ref_entity_t *r_portal_ent;
|
||||
static cplane_t r_portal_plane, r_original_portal_plane;
|
||||
static shader_t *r_portal_shader;
|
||||
static ref_shader_t *r_portal_shader;
|
||||
static vec3_t r_portal_mins, r_portal_maxs, r_portal_centre;
|
||||
|
||||
static bool R_AddPortalSurface( const meshbuffer_t *mb )
|
||||
|
@ -647,7 +648,7 @@ static bool R_AddPortalSurface( const meshbuffer_t *mb )
|
|||
int i;
|
||||
float dist;
|
||||
ref_entity_t *ent;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
msurface_t *surf;
|
||||
cplane_t plane, oplane;
|
||||
rb_mesh_t *mesh;
|
||||
|
@ -670,7 +671,7 @@ static bool R_AddPortalSurface( const meshbuffer_t *mb )
|
|||
if( !surf || !( mesh = surf->mesh ) || !mesh->points )
|
||||
return false;
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
VectorCopy( mesh->points[mesh->indexes[0]], v[0] );
|
||||
VectorCopy( mesh->points[mesh->indexes[1]], v[1] );
|
||||
|
@ -696,7 +697,7 @@ static bool R_AddPortalSurface( const meshbuffer_t *mb )
|
|||
|
||||
if(( dist = PlaneDiff( Ref.vieworg, &plane )) <= BACKFACE_EPSILON )
|
||||
{
|
||||
if(!( shader->flags & SHADER_PORTAL_CAPTURE2 ))
|
||||
if(!( shader->flags & SHADER_REFRACTION ))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -704,9 +705,9 @@ static bool R_AddPortalSurface( const meshbuffer_t *mb )
|
|||
// by an alphagen portal stage
|
||||
for( i = 0; i < shader->numStages; i++ )
|
||||
{
|
||||
if( shader->stages[i]->alphaGen.type == ALPHAGEN_PORTAL )
|
||||
if( shader->stages[i]->alphaGen.type == ALPHAGEN_ONEMINUSFADE )
|
||||
{
|
||||
if( dist > ( 1.0 / shader->stages[i]->alphaGen.params[0] ))
|
||||
if( dist > ( 1.0f / shader->stages[i]->alphaGen.params[0] ))
|
||||
return true; // completely alpha'ed out
|
||||
}
|
||||
}
|
||||
|
@ -781,7 +782,7 @@ static bool R_DrawPortalSurface( void )
|
|||
vec3_t origin, angles;
|
||||
ref_entity_t *ent;
|
||||
cplane_t *portal_plane = &r_portal_plane, *original_plane = &r_original_portal_plane;
|
||||
shader_t *shader = r_portal_shader;
|
||||
ref_shader_t *shader = r_portal_shader;
|
||||
bool mirror, refraction = false;
|
||||
texture_t **captureTexture;
|
||||
int captureTextureID;
|
||||
|
@ -790,7 +791,7 @@ static bool R_DrawPortalSurface( void )
|
|||
if( !r_portal_shader ) return false;
|
||||
|
||||
doReflection = doRefraction = true;
|
||||
if( shader->flags & SHADER_PORTAL_CAPTURE )
|
||||
if( shader->flags & SHADER_REFLECTION )
|
||||
{
|
||||
shaderStage_t *stage;
|
||||
|
||||
|
@ -821,7 +822,7 @@ static bool R_DrawPortalSurface( void )
|
|||
|
||||
if(( dist = PlaneDiff( Ref.vieworg, portal_plane )) <= BACKFACE_EPSILON || !doReflection )
|
||||
{
|
||||
if(!( shader->flags & SHADER_PORTAL_CAPTURE2 ) || !doRefraction )
|
||||
if(!( shader->flags & SHADER_REFRACTION ) || !doRefraction )
|
||||
return false;
|
||||
|
||||
// even if we're behind the portal, we still need to capture
|
||||
|
@ -1002,10 +1003,10 @@ setup_and_render:
|
|||
GL_SelectTexture( GL_TEXTURE0 );
|
||||
GL_BindTexture( *captureTexture );
|
||||
pglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, Ref.refdef.rect.x, Ref.refdef.rect.y, (*captureTexture)->width, (*captureTexture)->height );
|
||||
Ref.params |= ( refraction ? RP_PORTALCAPTURED2 : RP_PORTALCAPTURED );
|
||||
Ref.params |= ( refraction ? RP_REFRACTED : RP_REFLECTED );
|
||||
}
|
||||
|
||||
if( doRefraction && !refraction && ( shader->flags & SHADER_PORTAL_CAPTURE2 ))
|
||||
if( doRefraction && !refraction && ( shader->flags & RP_REFRACTED ))
|
||||
{
|
||||
refraction = true;
|
||||
captureTexture = &r_portaltexture2;
|
||||
|
@ -1035,7 +1036,7 @@ void R_DrawSkyPortal( skyportal_t *skyportal, vec3_t mins, vec3_t maxs )
|
|||
Mem_Copy( &saveRef, &oldRef, sizeof( ref_state_t ));
|
||||
Mem_Copy( &oldRef, &Ref, sizeof( ref_state_t ));
|
||||
|
||||
Ref.params = ( Ref.params | RP_SKYPORTALVIEW ) & ~(RP_OLDVIEWCLUSTER|RP_PORTALCAPTURED|RP_PORTALCAPTURED2);
|
||||
Ref.params = ( Ref.params | RP_SKYPORTALVIEW ) & ~(RP_OLDVIEWCLUSTER|RP_REFLECTED|RP_REFRACTED);
|
||||
VectorCopy( skyportal->vieworg, Ref.pvsOrigin );
|
||||
|
||||
Ref.clipFlags = 15;
|
||||
|
|
|
@ -12,10 +12,10 @@
|
|||
|
||||
typedef struct
|
||||
{
|
||||
string name;
|
||||
int flags;
|
||||
int shaderType;
|
||||
shader_t *shader;
|
||||
string name;
|
||||
int flags;
|
||||
int shaderType;
|
||||
ref_shader_t *shader;
|
||||
} mipRef_t;
|
||||
|
||||
typedef struct loadmodel_s
|
||||
|
@ -608,7 +608,7 @@ static rb_mesh_t *Mod_CreateMeshForSurface( const dsurface_t *in, msurface_t *ou
|
|||
byte *buffer;
|
||||
size_t bufSize;
|
||||
|
||||
if(( mapConfig.deluxeMappingEnabled && !(LittleLong( in->lmapNum[0] ) < 0 || in->lStyles[0] == 255) ) || ( out->shader->flags & SHADER_PORTAL_CAPTURE2 ))
|
||||
if(( mapConfig.deluxeMappingEnabled && !(LittleLong( in->lmapNum[0] ) < 0 || in->lStyles[0] == 255) ) || ( out->shader->flags & SHADER_REFRACTION ))
|
||||
createSTverts = true;
|
||||
else createSTverts = false;
|
||||
|
||||
|
@ -904,7 +904,7 @@ static void Mod_LoadSurfaceCommon( const dsurface_t *in, msurface_t *out )
|
|||
if( fognum != -1 && ( fognum < m_pLoadBmodel->numFogs ))
|
||||
{
|
||||
fog = m_pLoadBmodel->fogs + fognum;
|
||||
if( fog->shader && fog->shader->fog_dist )
|
||||
if( fog->shader && fog->shader->fogDist )
|
||||
out->fog = fog;
|
||||
}
|
||||
|
||||
|
@ -1368,7 +1368,7 @@ static void Mod_Finish( const lump_t *faces, vec3_t gridSize, vec3_t ambient )
|
|||
{
|
||||
if( globalFog && surf->mesh && surf->fog != testFog )
|
||||
{
|
||||
if(!( surf->shader->flags & SHADER_SKY ) && !surf->shader->fog_dist )
|
||||
if(!( surf->shader->flags & SHADER_SKYPARMS ) && !surf->shader->fogDist )
|
||||
globalFog = false;
|
||||
}
|
||||
|
||||
|
@ -1452,7 +1452,7 @@ needs only for more smooth moving of "loading" progress bar
|
|||
bool Mod_RegisterShader( const char *unused, int index )
|
||||
{
|
||||
mipRef_t *in;
|
||||
shader_t *out;
|
||||
ref_shader_t *out;
|
||||
|
||||
// nothing to load
|
||||
//if( !r_worldBrushModel )
|
||||
|
|
|
@ -150,7 +150,7 @@ bool R_SetPixelformat( void )
|
|||
savedGamma = FS_LoadFile( "config/gamma.rc", &gamma_size );
|
||||
if( !savedGamma || gamma_size != sizeof( gl_state.stateRamp ))
|
||||
{
|
||||
// saved gamma not found or correupted file
|
||||
// saved gamma not found or corrupted file
|
||||
FS_WriteFile( "config/gamma.rc", gl_state.stateRamp, sizeof(gl_state.stateRamp));
|
||||
Msg( "gamma.rc initialized\n" );
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ bool R_SetPixelformat( void )
|
|||
}
|
||||
else
|
||||
{
|
||||
// current gamma unset by other application, we can restore it here
|
||||
// current gamma broken by other application, we can restore it here
|
||||
MsgDev( D_NOTE, "R_SetPixelformat: restore original gamma after crash\n" );
|
||||
Mem_Copy( gl_state.stateRamp, savedGamma, sizeof( gl_state.gammaRamp ));
|
||||
}
|
||||
|
|
|
@ -1060,7 +1060,7 @@ BOOL ( WINAPI * pwglSwapIntervalEXT)( int interval );
|
|||
BOOL ( WINAPI * pwglGetDeviceGammaRampEXT ) ( unsigned char *pRed, unsigned char *pGreen, unsigned char *pBlue );
|
||||
BOOL ( WINAPI * pwglSetDeviceGammaRampEXT ) ( const unsigned char *pRed, const unsigned char *pGreen, const unsigned char *pBlue );
|
||||
|
||||
|
||||
// XashGL defines
|
||||
#define GL_TEXTURE0 0
|
||||
#define GL_TEXTURE1 1
|
||||
#define GL_TEXTURE2 2
|
||||
|
|
|
@ -20,10 +20,10 @@ void R_PushPoly( const meshbuffer_t *mb )
|
|||
{
|
||||
int i, j;
|
||||
poly_t *p;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
int features;
|
||||
|
||||
R_SHADER_FOR_KEY( mb->shaderKey, shader );
|
||||
Shader_ForKey( mb->shaderKey, shader );
|
||||
|
||||
features = shader->features|MF_TRIFAN;
|
||||
|
||||
|
@ -55,7 +55,7 @@ void R_AddPolysToList( void )
|
|||
poly_t *p;
|
||||
mfog_t *fog, *lastFog = NULL;
|
||||
meshbuffer_t *mb = NULL;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
vec3_t lastNormal = { 0, 0, 0 };
|
||||
|
||||
Ref.m_pCurrentEntity = r_worldEntity;
|
||||
|
@ -74,8 +74,7 @@ void R_AddPolysToList( void )
|
|||
else fog = r_worldBrushModel->fogs + fognum - 1;
|
||||
|
||||
// we ignore SHADER_ENTITY_MERGABLE here because polys are just regular trifans
|
||||
if( !mb || mb->shaderKey != (int)shader->sortKey || lastFog != fog || nverts + p->numverts > MAX_ARRAY_VERTS
|
||||
|| (( shader->flags & SHADER_MATERIAL ) && !VectorCompare( p->normal, lastNormal )))
|
||||
if( !mb || mb->shaderKey != (int)shader->sortKey || lastFog != fog || nverts + p->numverts > MAX_ARRAY_VERTS )
|
||||
{
|
||||
nverts = 0;
|
||||
lastFog = fog;
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
#define SHADERS_HASHSIZE 256
|
||||
#define Shader_Malloc( size ) Mem_Alloc( r_shaderpool, size )
|
||||
#define Shader_Free( data ) Mem_Free( data )
|
||||
#define Shader_Sortkey( shader, sort ) ((( sort )<<26 )|((shader)->shaderNum))
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -29,15 +28,15 @@ typedef struct shaderScript_s
|
|||
char script[1]; // variable sized
|
||||
} shaderScript_t;
|
||||
|
||||
static shader_t r_parseShader;
|
||||
static ref_shader_t r_parseShader;
|
||||
static shaderStage_t r_parseShaderStages[SHADER_MAX_STAGES];
|
||||
static stageBundle_t r_parseStageTMU[SHADER_MAX_STAGES][MAX_TEXTURE_UNITS];
|
||||
|
||||
static shaderScript_t *r_shaderScriptsHash[SHADERS_HASHSIZE];
|
||||
static shader_t *r_shadersHash[SHADERS_HASHSIZE];
|
||||
static ref_shader_t *r_shadersHash[SHADERS_HASHSIZE];
|
||||
static texture_t *r_internalMiptex;
|
||||
|
||||
shader_t *r_shaders[MAX_SHADERS];
|
||||
ref_shader_t *r_shaders[MAX_SHADERS];
|
||||
skydome_t *r_skydomes[MAX_SHADERS];
|
||||
int r_numShaders = 0;
|
||||
byte *r_shaderpool;
|
||||
|
@ -47,11 +46,11 @@ static bool r_shaderNoCompress;
|
|||
static bool r_shaderHasDlightPass;
|
||||
|
||||
// builtin shaders
|
||||
shader_t *r_defaultShader;
|
||||
shader_t *r_lightmapShader;
|
||||
shader_t *r_waterCausticsShader;
|
||||
shader_t *r_slimeCausticsShader;
|
||||
shader_t *r_lavaCausticsShader;
|
||||
ref_shader_t *r_defaultShader;
|
||||
ref_shader_t *r_lightmapShader;
|
||||
ref_shader_t *r_waterCausticsShader;
|
||||
ref_shader_t *r_slimeCausticsShader;
|
||||
ref_shader_t *r_lavaCausticsShader;
|
||||
|
||||
shaderParm_t infoParms[] =
|
||||
{
|
||||
|
@ -109,7 +108,7 @@ SHADER PARSING
|
|||
R_ParseWaveFunc
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseWaveFunc( shader_t *shader, waveFunc_t *func, char **script )
|
||||
static bool R_ParseWaveFunc( ref_shader_t *shader, waveFunc_t *func, char **script )
|
||||
{
|
||||
char *tok;
|
||||
int i;
|
||||
|
@ -118,7 +117,7 @@ static bool R_ParseWaveFunc( shader_t *shader, waveFunc_t *func, char **script )
|
|||
if( !tok[0] )
|
||||
return false;
|
||||
|
||||
if(Com_MatchToken( "sin" )) func->type = WAVEFORM_SIN;
|
||||
if(Com_MatchToken( "sin" )) func->type = WAVEFORM_SINE;
|
||||
else if(Com_MatchToken( "triangle" )) func->type = WAVEFORM_TRIANGLE;
|
||||
else if(Com_MatchToken( "square" )) func->type = WAVEFORM_SQUARE;
|
||||
else if(Com_MatchToken( "sawtooth" )) func->type = WAVEFORM_SAWTOOTH;
|
||||
|
@ -127,7 +126,7 @@ static bool R_ParseWaveFunc( shader_t *shader, waveFunc_t *func, char **script )
|
|||
else
|
||||
{
|
||||
MsgDev( D_WARN, "unknown waveform '%s' in shader '%s', defaulting to sin\n", tok, shader->name );
|
||||
func->type = WAVEFORM_SIN;
|
||||
func->type = WAVEFORM_SINE;
|
||||
}
|
||||
|
||||
for( i = 0; i < 4; i++ )
|
||||
|
@ -144,7 +143,7 @@ static bool R_ParseWaveFunc( shader_t *shader, waveFunc_t *func, char **script )
|
|||
R_ParseHeightToNormal
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseHeightToNormal( shader_t *shader, char *heightMap, int heightMapLen, float *bumpScale, char **script )
|
||||
static bool R_ParseHeightToNormal( ref_shader_t *shader, char *heightMap, int heightMapLen, float *bumpScale, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -192,7 +191,7 @@ static bool R_ParseHeightToNormal( shader_t *shader, char *heightMap, int height
|
|||
R_ParseGeneralSurfaceParm
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralSurfaceParm( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralSurfaceParm( ref_shader_t *shader, char **script )
|
||||
{
|
||||
char *tok;
|
||||
int i, numInfoParms = sizeof(infoParms) / sizeof(infoParms[0]);
|
||||
|
@ -238,7 +237,7 @@ static bool R_ParseGeneralSurfaceParm( shader_t *shader, char **script )
|
|||
R_ParseGeneralNoMipmaps
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralNoMipmaps( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralNoMipmaps( ref_shader_t *shader, char **script )
|
||||
{
|
||||
r_shaderNoMipMaps = r_shaderNoPicMip = true;
|
||||
return true;
|
||||
|
@ -249,7 +248,7 @@ static bool R_ParseGeneralNoMipmaps( shader_t *shader, char **script )
|
|||
R_ParseGeneralNoPicmip
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralNoPicmip( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralNoPicmip( ref_shader_t *shader, char **script )
|
||||
{
|
||||
r_shaderNoPicMip = true;
|
||||
return true;
|
||||
|
@ -260,7 +259,7 @@ static bool R_ParseGeneralNoPicmip( shader_t *shader, char **script )
|
|||
R_ParseGeneralNoCompress
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralNoCompress( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralNoCompress( ref_shader_t *shader, char **script )
|
||||
{
|
||||
r_shaderNoCompress = true;
|
||||
return true;
|
||||
|
@ -271,7 +270,7 @@ static bool R_ParseGeneralNoCompress( shader_t *shader, char **script )
|
|||
R_ParseGeneralEntityMergable
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralEntityMergable( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralEntityMergable( ref_shader_t *shader, char **script )
|
||||
{
|
||||
shader->flags |= SHADER_ENTITYMERGABLE;
|
||||
return true;
|
||||
|
@ -282,7 +281,7 @@ static bool R_ParseGeneralEntityMergable( shader_t *shader, char **script )
|
|||
R_ParseGeneralPolygonOffset
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralPolygonOffset( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralPolygonOffset( ref_shader_t *shader, char **script )
|
||||
{
|
||||
shader->flags |= SHADER_POLYGONOFFSET;
|
||||
return true;
|
||||
|
@ -293,7 +292,7 @@ static bool R_ParseGeneralPolygonOffset( shader_t *shader, char **script )
|
|||
R_ParseGeneralCull
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralCull( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralCull( ref_shader_t *shader, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -321,7 +320,7 @@ static bool R_ParseGeneralCull( shader_t *shader, char **script )
|
|||
R_ParseGeneralSort
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralSort( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralSort( ref_shader_t *shader, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -360,13 +359,13 @@ static bool R_ParseGeneralSort( shader_t *shader, char **script )
|
|||
R_ParseGeneralSkyParms
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralSkyParms( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralSkyParms( ref_shader_t *shader, char **script )
|
||||
{
|
||||
string name;
|
||||
char *tok;
|
||||
int i;
|
||||
|
||||
if( shader->shaderType != SHADER_SKY )
|
||||
if( shader->shaderType != SHADER_SKYDOME )
|
||||
{
|
||||
MsgDev( D_WARN, "'skyParms' not allowed in shader '%s'\n", shader->name );
|
||||
return false;
|
||||
|
@ -444,18 +443,18 @@ static bool R_ParseGeneralSkyParms( shader_t *shader, char **script )
|
|||
R_ParseGeneralDeformVertexes
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseGeneralDeformVertexes( shader_t *shader, char **script )
|
||||
static bool R_ParseGeneralDeformVertexes( ref_shader_t *shader, char **script )
|
||||
{
|
||||
deformVerts_t *deformVertexes;
|
||||
char *tok;
|
||||
int i;
|
||||
|
||||
if( shader->deformVertexesNum == SHADER_MAX_DEFORMVERTEXES )
|
||||
if( shader->deformVertsNum == SHADER_MAX_DEFORMVERTS )
|
||||
{
|
||||
MsgDev( D_WARN, "SHADER_MAX_DEFORMVERTEXES hit in shader '%s'\n", shader->name );
|
||||
MsgDev( D_WARN, "SHADER_MAX_DEFORMVERTS hit in shader '%s'\n", shader->name );
|
||||
return false;
|
||||
}
|
||||
deformVertexes = &shader->deformVertexes[shader->deformVertexesNum++];
|
||||
deformVertexes = &shader->deformVerts[shader->deformVertsNum++];
|
||||
|
||||
tok = Com_ParseToken( script, false );
|
||||
if( !tok[0] )
|
||||
|
@ -537,7 +536,7 @@ static bool R_ParseGeneralDeformVertexes( shader_t *shader, char **script )
|
|||
R_ParseStageRequires
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageRequires( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageRequires( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
MsgDev( D_WARN, "'requires' is not the first command in the stage in shader '%s'\n", shader->name );
|
||||
return false;
|
||||
|
@ -548,10 +547,10 @@ static bool R_ParseStageRequires( shader_t *shader, shaderStage_t *stage, char *
|
|||
R_ParseStageNoMipmaps
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageNoMipmaps( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageNoMipmaps( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
bundle->flags |= (STAGEBUNDLE_NOMIPMAPS|STAGEBUNDLE_NOPICMIP);
|
||||
bundle->texFlags |= (TF_NOMIPMAP|TF_NOPICMIP);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -560,10 +559,10 @@ static bool R_ParseStageNoMipmaps( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageNoPicmip
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageNoPicmip( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageNoPicmip( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
bundle->flags |= STAGEBUNDLE_NOPICMIP;
|
||||
bundle->flags |= TF_NOPICMIP;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -572,10 +571,10 @@ static bool R_ParseStageNoPicmip( shader_t *shader, shaderStage_t *stage, char *
|
|||
R_ParseStageNoCompress
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageNoCompress( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageNoCompress( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
bundle->flags |= STAGEBUNDLE_NOCOMPRESS;
|
||||
bundle->texFlags &= ~TF_COMPRESS;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -584,10 +583,10 @@ static bool R_ParseStageNoCompress( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageClampTexCoords
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageClampTexCoords( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageClampTexCoords( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
bundle->flags |= STAGEBUNDLE_CLAMPTEXCOORDS;
|
||||
bundle->texFlags |= TF_CLAMP;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -596,7 +595,7 @@ static bool R_ParseStageClampTexCoords( shader_t *shader, shaderStage_t *stage,
|
|||
R_ParseStageAnimFrequency
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageAnimFrequency( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageAnimFrequency( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
char *tok;
|
||||
|
@ -619,10 +618,9 @@ static bool R_ParseStageAnimFrequency( shader_t *shader, shaderStage_t *stage, c
|
|||
R_ParseStageMap
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageMap( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageMap( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
unsigned flags = 0;
|
||||
char *tok;
|
||||
|
||||
if( bundle->numTextures )
|
||||
|
@ -699,12 +697,12 @@ static bool R_ParseStageMap( shader_t *shader, shaderStage_t *stage, char **scri
|
|||
return false;
|
||||
}
|
||||
|
||||
bundle->texType = TEX_PORTAL;
|
||||
bundle->texType = TEX_RENDERVIEW;
|
||||
bundle->tcGen.type = TCGEN_PROJECTION;
|
||||
bundle->flags |= STAGEBUNDLE_MAP;
|
||||
if(( shader->flags & SHADER_PORTAL ) && ( shader->sort == SORT_PORTAL ))
|
||||
shader->sort = 0; // reset sorting so we can figure it out later. FIXME?
|
||||
shader->flags |= SHADER_PORTAL|( r_portalmaps->integer ? SHADER_PORTAL_CAPTURE : 0 );
|
||||
shader->flags |= SHADER_PORTAL|( r_portalmaps->integer ? RP_REFLECTED : 0 );
|
||||
return true;
|
||||
}
|
||||
if( Com_MatchToken( "$white" )) bundle->textures[bundle->numTextures++] = r_whiteTexture;
|
||||
|
@ -712,17 +710,12 @@ static bool R_ParseStageMap( shader_t *shader, shaderStage_t *stage, char **scri
|
|||
else if( Com_MatchToken( "$internal")) bundle->textures[bundle->numTextures++] = r_internalMiptex;
|
||||
else
|
||||
{
|
||||
if( r_shaderNoMipMaps || bundle->flags & STAGEBUNDLE_NOMIPMAPS )
|
||||
flags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip || bundle->flags & STAGEBUNDLE_NOPICMIP )
|
||||
flags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress && !(bundle->flags & STAGEBUNDLE_NOCOMPRESS))
|
||||
flags |= TF_COMPRESS;
|
||||
// apply global shader texflags
|
||||
if( r_shaderNoMipMaps ) bundle->texFlags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip ) bundle->texFlags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress ) bundle->texFlags |= TF_COMPRESS;
|
||||
|
||||
if( bundle->flags & STAGEBUNDLE_CLAMPTEXCOORDS )
|
||||
flags |= TF_CLAMP;
|
||||
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture( tok, NULL, 0, flags, 0 );
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture( tok, NULL, 0, bundle->texFlags, 0 );
|
||||
if( !bundle->textures[bundle->numTextures])
|
||||
{
|
||||
MsgDev( D_WARN, "couldn't find texture '%s' in shader '%s'\n", tok, shader->name );
|
||||
|
@ -741,10 +734,9 @@ static bool R_ParseStageMap( shader_t *shader, shaderStage_t *stage, char **scri
|
|||
R_ParseStageBumpMap
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageBumpMap( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageBumpMap( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
uint flags = TF_NORMALMAP;
|
||||
char heightMap[MAX_QPATH];
|
||||
float bumpScale;
|
||||
char *tok;
|
||||
|
@ -781,22 +773,18 @@ static bool R_ParseStageBumpMap( shader_t *shader, shaderStage_t *stage, char **
|
|||
return false;
|
||||
}
|
||||
|
||||
if( r_shaderNoMipMaps || bundle->flags & STAGEBUNDLE_NOMIPMAPS )
|
||||
flags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip || bundle->flags & STAGEBUNDLE_NOPICMIP )
|
||||
flags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress && !( bundle->flags & STAGEBUNDLE_NOCOMPRESS ))
|
||||
flags |= TF_COMPRESS;
|
||||
|
||||
if(bundle->flags & STAGEBUNDLE_CLAMPTEXCOORDS)
|
||||
flags |= TF_CLAMP;
|
||||
// apply texflags
|
||||
bundle->texFlags |= TF_NORMALMAP;
|
||||
if( r_shaderNoMipMaps ) bundle->texFlags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip ) bundle->texFlags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress ) bundle->texFlags |= TF_COMPRESS;
|
||||
|
||||
if(Com_MatchToken( "heightToNormal"))
|
||||
{
|
||||
if(!R_ParseHeightToNormal( shader, heightMap, sizeof(heightMap), &bumpScale, script ))
|
||||
return false;
|
||||
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture(heightMap, NULL, 0, flags|TF_HEIGHTMAP, bumpScale );
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture(heightMap, NULL, 0, bundle->texFlags|TF_HEIGHTMAP, bumpScale );
|
||||
if( !bundle->textures[bundle->numTextures] )
|
||||
{
|
||||
MsgDev( D_WARN, "couldn't find texture '%s' in shader '%s'\n", heightMap, shader->name );
|
||||
|
@ -806,7 +794,7 @@ static bool R_ParseStageBumpMap( shader_t *shader, shaderStage_t *stage, char **
|
|||
}
|
||||
else
|
||||
{
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture( tok, NULL, 0, flags, 0 );
|
||||
bundle->textures[bundle->numTextures] = R_FindTexture( tok, NULL, 0, bundle->texFlags, 0 );
|
||||
if( !bundle->textures[bundle->numTextures] )
|
||||
{
|
||||
MsgDev( D_WARN, "couldn't find texture '%s' in shader '%s'\n", tok, shader->name );
|
||||
|
@ -825,11 +813,10 @@ static bool R_ParseStageBumpMap( shader_t *shader, shaderStage_t *stage, char **
|
|||
R_ParseStageCubeMap
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageCubeMap( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageCubeMap( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
unsigned flags = TF_CLAMP | TF_CUBEMAP;
|
||||
char *tok;
|
||||
char *tok;
|
||||
|
||||
if( !GL_Support( R_TEXTURECUBEMAP_EXT ))
|
||||
{
|
||||
|
@ -881,17 +868,13 @@ static bool R_ParseStageCubeMap( shader_t *shader, shaderStage_t *stage, char **
|
|||
}
|
||||
else
|
||||
{
|
||||
if( r_shaderNoMipMaps || bundle->flags & STAGEBUNDLE_NOMIPMAPS )
|
||||
flags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip || bundle->flags & STAGEBUNDLE_NOPICMIP )
|
||||
flags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress && !(bundle->flags & STAGEBUNDLE_NOCOMPRESS))
|
||||
flags |= TF_COMPRESS;
|
||||
// apply texFlags
|
||||
bundle->texFlags |= TF_CLAMP|TF_CUBEMAP;
|
||||
if( r_shaderNoMipMaps ) bundle->texFlags |= TF_NOMIPMAP;
|
||||
if( r_shaderNoPicMip ) bundle->texFlags |= TF_NOPICMIP;
|
||||
if( !r_shaderNoCompress ) bundle->texFlags |= TF_COMPRESS;
|
||||
|
||||
if(bundle->flags & STAGEBUNDLE_CLAMPTEXCOORDS)
|
||||
flags |= TF_CLAMP;
|
||||
|
||||
bundle->textures[bundle->numTextures] = R_FindCubeMapTexture( tok, flags, 0 );
|
||||
bundle->textures[bundle->numTextures] = R_FindCubeMapTexture( tok, bundle->texFlags, 0 );
|
||||
if( !bundle->textures[bundle->numTextures] )
|
||||
{
|
||||
MsgDev( D_WARN, "couldn't find texture '%s' in shader '%s'\n", tok, shader->name );
|
||||
|
@ -910,7 +893,7 @@ static bool R_ParseStageCubeMap( shader_t *shader, shaderStage_t *stage, char **
|
|||
R_ParseStageVideoMap
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageVideoMap( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageVideoMap( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
char *tok;
|
||||
|
@ -952,7 +935,7 @@ static bool R_ParseStageVideoMap( shader_t *shader, shaderStage_t *stage, char *
|
|||
R_ParseStageTexEnvCombine
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageTexEnvCombine( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageTexEnvCombine( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
int numArgs;
|
||||
|
@ -1488,7 +1471,7 @@ static bool R_ParseStageTexEnvCombine( shader_t *shader, shaderStage_t *stage, c
|
|||
R_ParseStageTcGen
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageTcGen( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageTcGen( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
char *tok;
|
||||
|
@ -1573,7 +1556,7 @@ static bool R_ParseStageTcGen( shader_t *shader, shaderStage_t *stage, char **sc
|
|||
R_ParseStageTcMod
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageTcMod( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageTcMod( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle = stage->bundles[stage->numBundles - 1];
|
||||
tcMod_t *tcMod;
|
||||
|
@ -1658,7 +1641,7 @@ static bool R_ParseStageTcMod( shader_t *shader, shaderStage_t *stage, char **sc
|
|||
}
|
||||
else if (Com_MatchToken( "turb" ))
|
||||
{
|
||||
tcMod->func.type = WAVEFORM_SIN;
|
||||
tcMod->func.type = WAVEFORM_SINE;
|
||||
|
||||
for( i = 0; i < 4; i++ )
|
||||
{
|
||||
|
@ -1701,7 +1684,7 @@ static bool R_ParseStageTcMod( shader_t *shader, shaderStage_t *stage, char **sc
|
|||
R_ParseStageNextBundle
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageNextBundle( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageNextBundle( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
stageBundle_t *bundle;
|
||||
char *tok;
|
||||
|
@ -1846,7 +1829,7 @@ static bool R_ParseStageNextBundle( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageAlphaFunc
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageAlphaFunc( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageAlphaFunc( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -1920,7 +1903,7 @@ static bool R_ParseStageAlphaFunc( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageBlendFunc
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageBlendFunc( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageBlendFunc( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -2017,7 +2000,7 @@ static bool R_ParseStageBlendFunc( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageDepthFunc
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageDepthFunc( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageDepthFunc( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -2053,7 +2036,7 @@ static bool R_ParseStageDepthFunc( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageDepthWrite
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageDepthWrite( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageDepthWrite( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
if( stage->flags & SHADERSTAGE_NEXTBUNDLE )
|
||||
{
|
||||
|
@ -2069,7 +2052,7 @@ static bool R_ParseStageDepthWrite( shader_t *shader, shaderStage_t *stage, char
|
|||
R_ParseStageDetail
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageDetail( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageDetail( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
if( stage->flags & SHADERSTAGE_NEXTBUNDLE )
|
||||
{
|
||||
|
@ -2086,7 +2069,7 @@ static bool R_ParseStageDetail( shader_t *shader, shaderStage_t *stage, char **s
|
|||
R_ParseStageRgbGen
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageRgbGen( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageRgbGen( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
char *tok;
|
||||
int i;
|
||||
|
@ -2158,7 +2141,7 @@ static bool R_ParseStageRgbGen( shader_t *shader, shaderStage_t *stage, char **s
|
|||
R_ParseStageAlphaGen
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseStageAlphaGen( shader_t *shader, shaderStage_t *stage, char **script )
|
||||
static bool R_ParseStageAlphaGen( ref_shader_t *shader, shaderStage_t *stage, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -2331,13 +2314,13 @@ static bool R_ParseStageAlphaGen( shader_t *shader, shaderStage_t *stage, char *
|
|||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
bool (*parseFunc)( shader_t *shader, char **script );
|
||||
bool (*parseFunc)( ref_shader_t *shader, char **script );
|
||||
} shaderGeneralCmd_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char *name;
|
||||
bool (*parseFunc)( shader_t *shader, shaderStage_t *stage, char **script );
|
||||
bool (*parseFunc)( ref_shader_t *shader, shaderStage_t *stage, char **script );
|
||||
} shaderStageCmd_t;
|
||||
|
||||
static shaderGeneralCmd_t r_shaderGeneralCmds[] =
|
||||
|
@ -2386,7 +2369,7 @@ static shaderStageCmd_t r_shaderStageCmds[] =
|
|||
R_ParseShaderCommand
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseShaderCommand( shader_t *shader, char **script, char *command )
|
||||
static bool R_ParseShaderCommand( ref_shader_t *shader, char **script, char *command )
|
||||
{
|
||||
shaderGeneralCmd_t *cmd;
|
||||
|
||||
|
@ -2407,7 +2390,7 @@ static bool R_ParseShaderCommand( shader_t *shader, char **script, char *command
|
|||
R_ParseShaderStageCommand
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseShaderStageCommand( shader_t *shader, shaderStage_t *stage, char **script, char *command )
|
||||
static bool R_ParseShaderStageCommand( ref_shader_t *shader, shaderStage_t *stage, char **script, char *command )
|
||||
{
|
||||
shaderStageCmd_t *cmd;
|
||||
|
||||
|
@ -2425,7 +2408,7 @@ static bool R_ParseShaderStageCommand( shader_t *shader, shaderStage_t *stage, c
|
|||
R_EvaluateRequires
|
||||
=================
|
||||
*/
|
||||
static bool R_EvaluateRequires( shader_t *shader, char **script )
|
||||
static bool R_EvaluateRequires( ref_shader_t *shader, char **script )
|
||||
{
|
||||
bool results[SHADER_MAX_EXPRESSIONS];
|
||||
bool logicAnd = false, logicOr = false;
|
||||
|
@ -2595,7 +2578,7 @@ static bool R_EvaluateRequires( shader_t *shader, char **script )
|
|||
R_SkipShaderStage
|
||||
=================
|
||||
*/
|
||||
static bool R_SkipShaderStage( shader_t *shader, char **script )
|
||||
static bool R_SkipShaderStage( ref_shader_t *shader, char **script )
|
||||
{
|
||||
char *tok;
|
||||
|
||||
|
@ -2624,7 +2607,7 @@ static bool R_SkipShaderStage( shader_t *shader, char **script )
|
|||
R_ParseShader
|
||||
=================
|
||||
*/
|
||||
static bool R_ParseShader( shader_t *shader, char *script )
|
||||
static bool R_ParseShader( ref_shader_t *shader, char *script )
|
||||
{
|
||||
shaderStage_t *stage;
|
||||
char *tok;
|
||||
|
@ -2790,13 +2773,13 @@ static void R_ParseShaderFile( char *buffer, int size )
|
|||
R_NewShader
|
||||
=================
|
||||
*/
|
||||
static shader_t *R_NewShader( void )
|
||||
static ref_shader_t *R_NewShader( void )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
int i, j;
|
||||
|
||||
shader = &r_parseShader;
|
||||
memset( shader, 0, sizeof( shader_t ));
|
||||
memset( shader, 0, sizeof( ref_shader_t ));
|
||||
|
||||
for( i = 0; i < SHADER_MAX_STAGES; i++ )
|
||||
{
|
||||
|
@ -2817,9 +2800,9 @@ static shader_t *R_NewShader( void )
|
|||
R_CreateShader
|
||||
=================
|
||||
*/
|
||||
static shader_t *R_CreateShader( const char *name, shaderType_t shaderType, uint surfaceParm, char *script )
|
||||
static ref_shader_t *R_CreateShader( const char *name, shaderType_t shaderType, uint surfaceParm, char *script )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
shaderStage_t *stage;
|
||||
stageBundle_t *bundle;
|
||||
int i, j;
|
||||
|
@ -2885,9 +2868,9 @@ static shader_t *R_CreateShader( const char *name, shaderType_t shaderType, uint
|
|||
R_CreateDefaultShader
|
||||
=================
|
||||
*/
|
||||
static shader_t *R_CreateDefaultShader( const char *name, shaderType_t shaderType, uint surfaceParm )
|
||||
static ref_shader_t *R_CreateDefaultShader( const char *name, shaderType_t shaderType, uint surfaceParm )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
const byte *buffer = NULL; // default image buffer
|
||||
size_t bufsize = 0;
|
||||
int i;
|
||||
|
@ -2903,7 +2886,7 @@ static shader_t *R_CreateDefaultShader( const char *name, shaderType_t shaderTyp
|
|||
|
||||
switch( shader->shaderType )
|
||||
{
|
||||
case SHADER_SKY:
|
||||
case SHADER_SKYDOME:
|
||||
shader->flags |= SHADER_SKYPARMS;
|
||||
|
||||
for( i = 0; i < 6; i++ )
|
||||
|
@ -3071,7 +3054,7 @@ static shader_t *R_CreateDefaultShader( const char *name, shaderType_t shaderTyp
|
|||
R_FinishShader
|
||||
=================
|
||||
*/
|
||||
static void R_FinishShader( shader_t *shader )
|
||||
static void R_FinishShader( ref_shader_t *shader )
|
||||
{
|
||||
shaderStage_t *stage;
|
||||
stageBundle_t *bundle;
|
||||
|
@ -3106,7 +3089,7 @@ static void R_FinishShader( shader_t *shader )
|
|||
}
|
||||
|
||||
// make sure sky shaders have a cloudHeight value
|
||||
if( shader->shaderType == SHADER_SKY )
|
||||
if( shader->shaderType == SHADER_SKYDOME )
|
||||
{
|
||||
if(!(shader->flags & SHADER_SKYPARMS))
|
||||
{
|
||||
|
@ -3121,9 +3104,9 @@ static void R_FinishShader( shader_t *shader )
|
|||
if( shader->flags & SHADER_DEFORMVERTEXES )
|
||||
{
|
||||
shader->flags &= ~SHADER_DEFORMVERTEXES;
|
||||
for( i = 0; i < shader->deformVertexesNum; i++ )
|
||||
memset( &shader->deformVertexes[i], 0, sizeof( deformVerts_t ));
|
||||
shader->deformVertexesNum = 0;
|
||||
for( i = 0; i < shader->deformVertsNum; i++ )
|
||||
Mem_Set( &shader->deformVerts[i], 0, sizeof( deformVerts_t ));
|
||||
shader->deformVertsNum = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3213,7 +3196,7 @@ static void R_FinishShader( shader_t *shader )
|
|||
stage->flags |= SHADERSTAGE_DEPTHWRITE;
|
||||
|
||||
// remove depthWrite from sky and 2D shaders
|
||||
if( shader->shaderType == SHADER_SKY || shader->shaderType == SHADER_NOMIP )
|
||||
if( shader->shaderType == SHADER_SKYDOME || shader->shaderType == SHADER_NOMIP )
|
||||
stage->flags &= ~SHADERSTAGE_DEPTHWRITE;
|
||||
|
||||
// ignore detail stages if detail textures are disabled
|
||||
|
@ -3228,7 +3211,7 @@ static void R_FinishShader( shader_t *shader )
|
|||
{
|
||||
switch( shader->shaderType )
|
||||
{
|
||||
case SHADER_SKY:
|
||||
case SHADER_SKYDOME:
|
||||
stage->rgbGen.type = RGBGEN_IDENTITY;
|
||||
break;
|
||||
case SHADER_SURFACE:
|
||||
|
@ -3260,7 +3243,7 @@ static void R_FinishShader( shader_t *shader )
|
|||
{
|
||||
switch( shader->shaderType )
|
||||
{
|
||||
case SHADER_SKY:
|
||||
case SHADER_SKYDOME:
|
||||
stage->alphaGen.type = ALPHAGEN_IDENTITY;
|
||||
break;
|
||||
case SHADER_SURFACE:
|
||||
|
@ -3354,7 +3337,7 @@ static void R_FinishShader( shader_t *shader )
|
|||
// set sort if unset
|
||||
if( !(shader->flags & SHADER_SORT ))
|
||||
{
|
||||
if( shader->shaderType == SHADER_SKY )
|
||||
if( shader->shaderType == SHADER_SKYDOME )
|
||||
shader->sort = SORT_SKY;
|
||||
else
|
||||
{
|
||||
|
@ -3436,7 +3419,7 @@ static bool R_MergeShaderStages( shaderStage_t *stage1, shaderStage_t *stage2 )
|
|||
R_OptimizeShader
|
||||
=================
|
||||
*/
|
||||
static void R_OptimizeShader( shader_t *shader )
|
||||
static void R_OptimizeShader( ref_shader_t *shader )
|
||||
{
|
||||
shaderStage_t *curStage, *prevStage = NULL;
|
||||
int i;
|
||||
|
@ -3478,18 +3461,18 @@ static void R_OptimizeShader( shader_t *shader )
|
|||
}
|
||||
}
|
||||
|
||||
void R_DeformVertexesBBoxForShader( const shader_t *shader, vec3_t ebbox )
|
||||
void R_DeformVertexesBBoxForShader( const ref_shader_t *shader, vec3_t ebbox )
|
||||
{
|
||||
int dv;
|
||||
float dvmax;
|
||||
|
||||
if( !shader ) return;
|
||||
for( dv = 0; dv < shader->deformVertexesNum; dv++ )
|
||||
for( dv = 0; dv < shader->deformVertsNum; dv++ )
|
||||
{
|
||||
switch( shader->deformVertexes[dv].type )
|
||||
switch( shader->deformVerts[dv].type )
|
||||
{
|
||||
case DEFORMVERTEXES_WAVE:
|
||||
dvmax = fabs( shader->deformVertexes[dv].func.params[1] ) + shader->deformVertexes[dv].func.params[0];
|
||||
dvmax = fabs( shader->deformVerts[dv].func.params[1] ) + shader->deformVerts[dv].func.params[0];
|
||||
ebbox[0] = max( ebbox[0], dvmax );
|
||||
ebbox[1] = ebbox[0];
|
||||
ebbox[2] = ebbox[0];
|
||||
|
@ -3505,16 +3488,16 @@ void R_DeformVertexesBBoxForShader( const shader_t *shader, vec3_t ebbox )
|
|||
R_LoadShader
|
||||
=================
|
||||
*/
|
||||
shader_t *R_LoadShader( shader_t *newShader )
|
||||
ref_shader_t *R_LoadShader( ref_shader_t *newShader )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
uint hashKey;
|
||||
int i, j;
|
||||
|
||||
if( r_numShaders == MAX_SHADERS )
|
||||
Host_Error( "R_LoadShader: MAX_SHADERS limit exceeded\n" );
|
||||
|
||||
r_shaders[r_numShaders++] = shader = Shader_Malloc( sizeof( shader_t ));
|
||||
r_shaders[r_numShaders++] = shader = Shader_Malloc( sizeof( ref_shader_t ));
|
||||
|
||||
// make sure the shader is valid and set all the unset parameters
|
||||
R_FinishShader( newShader );
|
||||
|
@ -3523,7 +3506,7 @@ shader_t *R_LoadShader( shader_t *newShader )
|
|||
R_OptimizeShader( newShader );
|
||||
|
||||
// copy the shader
|
||||
Mem_Copy( shader, newShader, sizeof( shader_t ));
|
||||
Mem_Copy( shader, newShader, sizeof( ref_shader_t ));
|
||||
shader->numStages = 0;
|
||||
|
||||
// allocate and copy the stages
|
||||
|
@ -3560,9 +3543,9 @@ shader_t *R_LoadShader( shader_t *newShader )
|
|||
R_FindShader
|
||||
=================
|
||||
*/
|
||||
shader_t *R_FindShader( const char *name, shaderType_t shaderType, uint surfaceParm )
|
||||
ref_shader_t *R_FindShader( const char *name, shaderType_t shaderType, uint surfaceParm )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
shaderScript_t *shaderScript;
|
||||
char *script = NULL;
|
||||
uint hashKey;
|
||||
|
@ -3618,7 +3601,7 @@ void R_SetInternalMap( texture_t *mipTex )
|
|||
R_RegisterShader
|
||||
=================
|
||||
*/
|
||||
shader_t *R_RegisterShader( const char *name )
|
||||
ref_shader_t *R_RegisterShader( const char *name )
|
||||
{
|
||||
return R_FindShader( name, SHADER_GENERIC, 0 );
|
||||
}
|
||||
|
@ -3628,7 +3611,7 @@ shader_t *R_RegisterShader( const char *name )
|
|||
R_RegisterShaderSkin
|
||||
=================
|
||||
*/
|
||||
shader_t *R_RegisterShaderSkin( const char *name )
|
||||
ref_shader_t *R_RegisterShaderSkin( const char *name )
|
||||
{
|
||||
return R_FindShader( name, SHADER_STUDIO, 0 );
|
||||
}
|
||||
|
@ -3638,7 +3621,7 @@ shader_t *R_RegisterShaderSkin( const char *name )
|
|||
R_RegisterShaderNoMip
|
||||
=================
|
||||
*/
|
||||
shader_t *R_RegisterShaderNoMip( const char *name )
|
||||
ref_shader_t *R_RegisterShaderNoMip( const char *name )
|
||||
{
|
||||
return R_FindShader( name, SHADER_NOMIP, 0 );
|
||||
}
|
||||
|
@ -3650,7 +3633,7 @@ R_ShaderRegisterImages
|
|||
many many included cycles ...
|
||||
=================
|
||||
*/
|
||||
void R_ShaderRegisterImages( shader_t *shader )
|
||||
void R_ShaderRegisterImages( ref_shader_t *shader )
|
||||
{
|
||||
int i, j, k;
|
||||
shaderStage_t *stage;
|
||||
|
@ -3684,7 +3667,7 @@ R_CreateBuiltInShaders
|
|||
*/
|
||||
static void R_CreateBuiltInShaders( void )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
// default shader
|
||||
shader = R_NewShader();
|
||||
|
@ -3721,7 +3704,7 @@ R_ShaderList_f
|
|||
*/
|
||||
void R_ShaderList_f( void )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
int i, j;
|
||||
int passes;
|
||||
|
||||
|
@ -3738,7 +3721,7 @@ void R_ShaderList_f( void )
|
|||
|
||||
switch( shader->shaderType )
|
||||
{
|
||||
case SHADER_SKY:
|
||||
case SHADER_SKYDOME:
|
||||
Msg( "sky " );
|
||||
break;
|
||||
case SHADER_SURFACE:
|
||||
|
@ -3816,7 +3799,7 @@ R_ShutdownShaders
|
|||
*/
|
||||
void R_ShutdownShaders( void )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
shaderStage_t *stage;
|
||||
stageBundle_t *bundle;
|
||||
int i, j, k;
|
||||
|
|
|
@ -0,0 +1,392 @@
|
|||
//=======================================================================
|
||||
// Copyright XashXT Group 2008 ©
|
||||
// r_shader.h - render shader language
|
||||
//=======================================================================
|
||||
|
||||
#ifndef R_SHADER_H
|
||||
#define R_SHADER_H
|
||||
|
||||
#define MAX_SHADERS 1024 // can be blindly increased
|
||||
|
||||
#define Shader_ForKey( num, s ) ((s) = r_shaders[((num) & 0xFFF)]) // returns shader ptr
|
||||
#define Shader_Sortkey( shader, sort ) ((( sort )<<26 )|((shader)->shaderNum)) // returns shader->sortKey
|
||||
|
||||
|
||||
/*
|
||||
=======================================================================
|
||||
|
||||
SHADERS
|
||||
|
||||
=======================================================================
|
||||
*/
|
||||
#define SHADER_MAX_EXPRESSIONS 32
|
||||
#define SHADER_MAX_STAGES 8
|
||||
#define SHADER_MAX_TEXTURES 16 // max animation frames (increase if need)
|
||||
#define SHADER_MAX_DEFORMVERTS 8
|
||||
#define SHADER_MAX_TCMOD 8
|
||||
|
||||
// shader types used for shader loading
|
||||
typedef enum
|
||||
{
|
||||
SHADER_GENERIC = 0, // internal system shader
|
||||
SHADER_SURFACE, // lightmapped bsp surface
|
||||
SHADER_VERTEX,
|
||||
SHADER_SKYDOME, // skydome or skybox shader
|
||||
SHADER_STUDIO, // studio meshes
|
||||
SHADER_SPRITE, // sprites
|
||||
SHADER_NOMIP, // 2d images
|
||||
} shaderType_t;
|
||||
|
||||
// shader global flags
|
||||
#define SHADER_EXTERNAL (1<<0) // shader have external script
|
||||
#define SHADER_LIGHTMAP (1<<1) // shaderType should be equal SHADER_SURFACE
|
||||
#define SHADER_NOSHADOWS (1<<2) // ignore shadows for this surface
|
||||
#define SHADER_NODLIGHTS (1<<3) // ignore dynamic lights for this surface
|
||||
#define SHADER_NOMARKS (1<<4) // ignore decals for this surface
|
||||
#define SHADER_ENTITYMERGABLE (1<<5) // cl.entity can change color, alpha and frame
|
||||
#define SHADER_POLYGONOFFSET (1<<6) // surface using POLYGON_OFFSET_FILL
|
||||
#define SHADER_CULL (1<<7) // set GL_CullFace
|
||||
#define SHADER_SORT (1<<8) // sort surface in 3d-mode
|
||||
#define SHADER_AMMODISPLAY (1<<9) // special case for draw ammo counters on viewmodel
|
||||
#define SHADER_TESSSIZE (1<<10) // patches custom subdivision level only
|
||||
#define SHADER_DEFORMVERTEXES (1<<11) // CPU realtime vertex deformation
|
||||
#define SHADER_SKYPARMS (1<<12) // shaderType should be equal SHADER_SKYDOME
|
||||
#define SHADER_AUTOSPRITE (1<<13) // autosprites draw both faces
|
||||
#define SHADER_FLARE (1<<14) // specail case for flare shaders
|
||||
#define SHADER_PORTAL (1<<15) // shader rendering portal effects (portal, screen, mirror etc)
|
||||
#define SHADER_REFLECTION (1<<16) // do reflection (glsl using)
|
||||
#define SHADER_REFRACTION (1<<17) // do refraction (glsl using)
|
||||
|
||||
// shader stage flags
|
||||
#define SHADERSTAGE_NEXTBUNDLE (1<<0) // for two stages blended with GL_TEXENV_COMBINE
|
||||
#define SHADERSTAGE_PROGRAM (1<<1) // stage have a glsl program
|
||||
#define SHADERSTAGE_ALPHAFUNC (1<<2) // stage have glAlphaFunc
|
||||
#define SHADERSTAGE_BLENDFUNC (1<<3) // stage have glBlendFunc
|
||||
#define SHADERSTAGE_DEPTHFUNC (1<<4) // stage have glDepthFunc
|
||||
#define SHADERSTAGE_DEPTHWRITE (1<<5) // write depth
|
||||
#define SHADERSTAGE_RGBGEN (1<<6) // generate color
|
||||
#define SHADERSTAGE_ALPHAGEN (1<<7) // generate alpha
|
||||
#define SHADERSTAGE_DETAIL (1<<8) // currently not used
|
||||
|
||||
// KILLME
|
||||
#define SHADERSTAGE_NOCOLORARRAY (1<<9)
|
||||
#define SHADERSTAGE_DLIGHT (1<<10)
|
||||
#define SHADERSTAGE_STENCILSHADOW (1<<11)
|
||||
|
||||
// stage bundle flags
|
||||
#define STAGEBUNDLE_ANIMFREQUENCY (1<<0) // if not set and have bit ENTITYMERGABLE can switch frames manually
|
||||
#define STAGEBUNDLE_TEXENVCOMBINE (1<<1) // if set bit NEXTBUNDLE blends previous and surrent frames
|
||||
#define STAGEBUNDLE_TCGEN (1<<2) // generate texCoords
|
||||
#define STAGEBUNDLE_TCMOD (1<<3) // rotate, move, deform texCoords
|
||||
#define STAGEBUNDLE_MAP (1<<4) // "map"
|
||||
#define STAGEBUNDLE_BUMPMAP (1<<5) // "bumpMap"
|
||||
#define STAGEBUNDLE_CUBEMAP (1<<6) // "cubeMap"
|
||||
#define STAGEBUNDLE_VIDEOMAP (1<<7) // "videoMap"
|
||||
#define STAGEBUNDLE_ANGLEMAP (1<<8) // frame = ((viewangles[1] - ent->angles[1]) / 360 * 8 + 0.5 - 4) & 7;
|
||||
#define STAGEBUNDLE_NORMALMAP (1<<9) // currently not used
|
||||
|
||||
typedef enum
|
||||
{
|
||||
WAVEFORM_NONE = 0, // --------
|
||||
WAVEFORM_SINE,
|
||||
WAVEFORM_TRIANGLE, // triangle approximation "Super Sand Castle"
|
||||
WAVEFORM_SQUARE, // pure meander
|
||||
WAVEFORM_SAWTOOTH,
|
||||
WAVEFORM_INVERSESAWTOOTH,
|
||||
WAVEFORM_NOISE,
|
||||
WAVEFORM_CONSTANT
|
||||
} waveForm_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SORT_NONE = 0,
|
||||
SORT_PORTAL,
|
||||
SORT_SKY,
|
||||
SORT_OPAQUE,
|
||||
SORT_DECAL,
|
||||
SORT_ALPHATEST,
|
||||
SORT_BANNER,
|
||||
SORT_UNDERWATER,
|
||||
SORT_WATER,
|
||||
SORT_INNERBLEND,
|
||||
SORT_BLEND1,
|
||||
SORT_BLEND2,
|
||||
SORT_BLEND3,
|
||||
SORT_BLEND4,
|
||||
SORT_OUTERBLEND,
|
||||
SORT_ADDITIVE,
|
||||
SORT_NEAREST
|
||||
} sort_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AMMODISPLAY_DIGIT1,
|
||||
AMMODISPLAY_DIGIT2,
|
||||
AMMODISPLAY_DIGIT3,
|
||||
AMMODISPLAY_WARNING
|
||||
} ammoDisplayType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DEFORMVERTEXES_NONE = 0,
|
||||
DEFORMVERTEXES_WAVE, // using waveForm_t
|
||||
DEFORMVERTEXES_MOVE,
|
||||
DEFORMVERTEXES_BULGE,
|
||||
DEFORMVERTEXES_NORMAL,
|
||||
DEFORMVERTEXES_AUTOSPRITE,
|
||||
DEFORMVERTEXES_AUTOSPRITE2,
|
||||
DEFORMVERTEXES_AUTOPARTICLE, // used for particelShader
|
||||
DEFORMVERTEXES_PROJECTION_SHADOW // currently not used
|
||||
} deformVertsType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TCGEN_BASE = 0, // use original texCoords as default
|
||||
TCGEN_LIGHTMAP, // use lightMap texCoords (for TEX_LIGHTMAP)
|
||||
TCGEN_ENVIRONMENT, // simple EnvMapping
|
||||
TCGEN_FOG,
|
||||
TCGEN_VECTOR, // const vector specified in shader
|
||||
TCGEN_LIGHTVECTOR, // vector == LightDir
|
||||
TCGEN_WARP, // q1/q2 warp surfaces (water, slime, lava)
|
||||
TCGEN_HALFANGLE, // halfAngle = lightVector + eyeVector;
|
||||
TCGEN_REFLECTION, // enable GL_REFLECTION_MAP_ARB
|
||||
TCGEN_PROJECTION, // project view onto plane (PORTAL used)
|
||||
TCGEN_NORMAL,
|
||||
TCGEN_SVECTORS, // using sVectors array instead texCoordArray
|
||||
TCGEN_PROJECTION_SHADOW // currently not used
|
||||
} tcGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TCMOD_NONE = 0,
|
||||
TCMOD_TRANSLATE, // same as glTranslate
|
||||
TCMOD_SCALE, // same as glScale
|
||||
TCMOD_SCROLL,
|
||||
TCMOD_ROTATE, // same as glRotate
|
||||
TCMOD_STRETCH, // proporcional scaling
|
||||
TCMOD_TURB, // warp tubulence
|
||||
TCMOD_TRANSFORM
|
||||
} tcModType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
RGBGEN_IDENTITY = 0, // glColor( 1.0, 1.0f, 1.0f )
|
||||
RGBGEN_IDENTITYLIGHTING, // rgb = 1.0f / pow( 2.0f, max( 0, floor( r_overbrightbits )))
|
||||
RGBGEN_WAVE, // using waveForm_t
|
||||
RGBGEN_CONST, // RGB values from shader
|
||||
RGBGEN_COLORWAVE, // normalize RGBwave with RGB values from shader
|
||||
RGBGEN_VERTEX, // get color from bsp vertexes or deformVertexes
|
||||
RGBGEN_EXACTVERTEX,
|
||||
RGBGEN_ONEMINUSVERTEX, // 1.0 - vertexColor
|
||||
RGBGEN_ENTITY, // ent->renderColor (need ENTITYMERGABLE bit)
|
||||
RGBGEN_ONEMINUSENTITY, // 1.0 - ent->renderColor (need ENTITYMERGABLE bit)
|
||||
RGBGEN_LIGHTINGAMBIENT, // ambient LightColor
|
||||
RGBGEN_LIGHTINGDIFFUSE, // diffuse LightColor
|
||||
RGBGEN_LIGHTINGDIFFUSE_ONLY, // ignore ambientColor
|
||||
RGBGEN_LIGHTINGAMBIENT_ONLY, // ignore diffuseColor
|
||||
RGBGEN_ENVIRONMENT, // simple EnvColorMapping
|
||||
RGBGEN_FOG
|
||||
} rgbGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ALPHAGEN_IDENTITY = 0, // glAlpha( 1.0 )
|
||||
ALPHAGEN_CONST, // get alpha from shader
|
||||
ALPHAGEN_WAVE, // using waveForm_t
|
||||
ALPHAGEN_ALPHAWAVE, // normalize alphawave with alpha value from shader
|
||||
ALPHAGEN_VERTEX, // get alpha from bsp vertexes or deformVerts
|
||||
ALPHAGEN_ONEMINUSVERTEX, // 1.0 - vertexAlpha
|
||||
ALPHAGEN_ENTITY, // ent->renderAmt (need ENTITYMERGABLE bit)
|
||||
ALPHAGEN_ONEMINUSENTITY, // 1.0 - ent->renderAmt (need ENTITYMERGABLE bit)
|
||||
ALPHAGEN_SPECULAR, // p = (vieworg - ent->origin) - vertex
|
||||
ALPHAGEN_DOT, // v = DotProduct( vforward, normal )
|
||||
ALPHAGEN_ONEMINUSDOT, // v = 1.0 - DotProduct( vforward, normal )
|
||||
ALPHAGEN_FADE, // alpha = dist( ent->origin, vieworg ) * maxDist
|
||||
ALPHAGEN_ONEMINUSFADE, // alpha = (1.0 - ALPHAGEN_FADE) (another name - ALPHAGEN_PORTAL)
|
||||
} alphaGenType_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TEX_GENERIC, // vertexArray, texCoordArray
|
||||
TEX_LIGHTMAP, // vertexArray, lmCoordArray
|
||||
TEX_CINEMATIC, // RoQ frame
|
||||
TEX_RENDERVIEW, // scene from another point (portals, mirrors etc)
|
||||
TEX_DLIGHT // currently not used
|
||||
} texType_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
waveForm_t type;
|
||||
float params[4];
|
||||
} waveFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum mode;
|
||||
} cullFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ammoDisplayType_t type;
|
||||
int lowAmmo; // threshold before change color of digits
|
||||
string shader[3]; // remap shaders
|
||||
} ammoDisplay_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
texture_t *farBox[6];
|
||||
float cloudHeight;
|
||||
texture_t *nearBox[6];
|
||||
} skyParms_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
deformVertsType_t type;
|
||||
waveFunc_t func;
|
||||
float params[3];
|
||||
} deformVerts_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLint rgbCombine;
|
||||
GLint rgbSource[3];
|
||||
GLint rgbOperand[3];
|
||||
GLint rgbScale;
|
||||
|
||||
GLint alphaCombine;
|
||||
GLint alphaSource[3];
|
||||
GLint alphaOperand[3];
|
||||
GLint alphaScale;
|
||||
|
||||
GLfloat constColor[4];
|
||||
} texEnvCombine_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tcGenType_t type;
|
||||
float params[8];
|
||||
} tcGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
tcModType_t type;
|
||||
waveFunc_t func;
|
||||
float params[6];
|
||||
} tcMod_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum func;
|
||||
GLclampf ref;
|
||||
} alphaFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum src;
|
||||
GLenum dst;
|
||||
} blendFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GLenum func;
|
||||
} depthFunc_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
rgbGenType_t type;
|
||||
waveFunc_t func;
|
||||
float params[4];
|
||||
} rgbGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
alphaGenType_t type;
|
||||
waveFunc_t func;
|
||||
float params[3];
|
||||
} alphaGen_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
texType_t texType;
|
||||
uint texFlags; // TF_* flags
|
||||
uint flags;
|
||||
|
||||
texture_t *textures[SHADER_MAX_TEXTURES];
|
||||
uint numTextures;
|
||||
|
||||
float animFrequency;
|
||||
video_t cinematicHandle;
|
||||
|
||||
GLint texEnv;
|
||||
texEnvCombine_t texEnvCombine;
|
||||
|
||||
tcGen_t tcGen;
|
||||
tcMod_t tcMod[SHADER_MAX_TCMOD];
|
||||
uint tcModNum;
|
||||
} stageBundle_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool ignore; // this stage ignored for some reasons (disabled, not needed etc)
|
||||
uint flags;
|
||||
|
||||
stageBundle_t *bundles[MAX_TEXTURE_UNITS];
|
||||
uint numBundles;
|
||||
|
||||
const char *program; // GLSL program
|
||||
progType_t progType;
|
||||
|
||||
alphaFunc_t alphaFunc;
|
||||
blendFunc_t blendFunc;
|
||||
depthFunc_t depthFunc;
|
||||
|
||||
rgbGen_t rgbGen;
|
||||
alphaGen_t alphaGen;
|
||||
} shaderStage_t;
|
||||
|
||||
typedef struct ref_shader_s
|
||||
{
|
||||
string name;
|
||||
int shaderNum; // shader_t handle
|
||||
shaderType_t shaderType;
|
||||
uint surfaceParm; // dshader->surfaceFlags
|
||||
uint contentFlags; // dshader->contentFlags
|
||||
uint features; // renderMesh flags
|
||||
uint flags; // shader flags
|
||||
|
||||
cullFunc_t cull;
|
||||
sort_t sort;
|
||||
ammoDisplay_t ammoDisplay; // only for SHADER_STUDIO type
|
||||
uint tessSize; // bsp patch subdivision level
|
||||
skyParms_t skyParms; // for realtime change sky
|
||||
|
||||
float fogDist; // generic fog stuff
|
||||
float fogClearDist;
|
||||
vec4_t fogColor;
|
||||
|
||||
deformVerts_t deformVerts[SHADER_MAX_DEFORMVERTS];
|
||||
uint deformVertsNum;
|
||||
|
||||
shaderStage_t *stages[SHADER_MAX_STAGES];
|
||||
uint numStages;
|
||||
|
||||
// link stuff
|
||||
uint sortKey;
|
||||
struct ref_shader_s *nextHash;
|
||||
} ref_shader_t;
|
||||
|
||||
extern ref_shader_t *r_shaders[MAX_SHADERS];
|
||||
extern int r_numShaders;
|
||||
|
||||
// built-in shaders
|
||||
extern ref_shader_t *r_defaultShader;
|
||||
extern ref_shader_t *r_lightmapShader;
|
||||
|
||||
ref_shader_t *R_FindShader( const char *name, shaderType_t shaderType, uint surfaceParm );
|
||||
void R_SetInternalMap( texture_t *mipTex ); // internal textures (skins, spriteframes, etc)
|
||||
void R_ShaderList_f( void );
|
||||
void R_InitShaders( void );
|
||||
void R_ShutdownShaders (void);
|
||||
|
||||
#endif//R_SHADER_H
|
|
@ -81,7 +81,7 @@ static void Gen_Box( skydome_t *skydome, float skyheight );
|
|||
R_CreateSkydome
|
||||
==============
|
||||
*/
|
||||
skydome_t *R_CreateSkydome( float skyheight, shader_t **farboxShaders, shader_t **nearboxShaders )
|
||||
skydome_t *R_CreateSkydome( float skyheight, ref_shader_t **farboxShaders, ref_shader_t **nearboxShaders )
|
||||
{
|
||||
int i, size;
|
||||
rb_mesh_t *mesh;
|
||||
|
@ -93,8 +93,8 @@ skydome_t *R_CreateSkydome( float skyheight, shader_t **farboxShaders, shader_t
|
|||
buffer = Mem_Alloc( r_shaderpool, size );
|
||||
|
||||
skydome = ( skydome_t * )buffer;
|
||||
Mem_Copy( skydome->farboxShaders, farboxShaders, sizeof(shader_t *) * 6 );
|
||||
Mem_Copy( skydome->nearboxShaders, nearboxShaders, sizeof(shader_t *) * 6 );
|
||||
Mem_Copy( skydome->farboxShaders, farboxShaders, sizeof(ref_shader_t *) * 6 );
|
||||
Mem_Copy( skydome->nearboxShaders, nearboxShaders, sizeof(ref_shader_t *) * 6 );
|
||||
buffer += sizeof( skydome_t );
|
||||
|
||||
skydome->meshes = ( rb_mesh_t * )buffer;
|
||||
|
@ -255,7 +255,7 @@ static void Gen_BoxSide( skydome_t *skydome, int side, vec3_t orig, vec3_t drow,
|
|||
R_DrawSkySide
|
||||
==============
|
||||
*/
|
||||
static void R_DrawSkySide( skydome_t *skydome, int side, shader_t *shader, int features )
|
||||
static void R_DrawSkySide( skydome_t *skydome, int side, ref_shader_t *shader, int features )
|
||||
{
|
||||
meshbuffer_t *mbuffer = &r_skydome_mbuffer;
|
||||
|
||||
|
@ -276,7 +276,7 @@ static void R_DrawSkySide( skydome_t *skydome, int side, shader_t *shader, int f
|
|||
R_DrawSkyBox
|
||||
==============
|
||||
*/
|
||||
static void R_DrawSkyBox( skydome_t *skydome, shader_t **shaders )
|
||||
static void R_DrawSkyBox( skydome_t *skydome, ref_shader_t **shaders )
|
||||
{
|
||||
int i, features;
|
||||
|
||||
|
@ -298,7 +298,7 @@ Draw dummy skybox side to prevent the HOM effect
|
|||
static void R_DrawBlackBottom( skydome_t *skydome )
|
||||
{
|
||||
int features;
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
|
||||
// FIXME: register another shader instead maybe?
|
||||
shader = R_OcclusionShader();
|
||||
|
@ -306,13 +306,8 @@ static void R_DrawBlackBottom( skydome_t *skydome )
|
|||
features = shader->features;
|
||||
if( r_shownormals->integer ) features |= MF_NORMALS;
|
||||
|
||||
// HACK HACK HACK
|
||||
// skies ought not to write to depth buffer
|
||||
shader->flags &= ~SHADER_DEPTHWRITE;
|
||||
shader->stages[0]->flags &= ~SHADERSTAGE_DEPTHWRITE;
|
||||
R_DrawSkySide( skydome, 5, shader, features );
|
||||
shader->stages[0]->flags |= SHADERSTAGE_DEPTHWRITE;
|
||||
shader->flags |= SHADER_DEPTHWRITE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -320,7 +315,7 @@ static void R_DrawBlackBottom( skydome_t *skydome )
|
|||
R_DrawSky
|
||||
==============
|
||||
*/
|
||||
void R_DrawSky( shader_t *shader )
|
||||
void R_DrawSky( ref_shader_t *shader )
|
||||
{
|
||||
vec3_t mins, maxs;
|
||||
matrix4x4 m, oldm;
|
||||
|
|
|
@ -19,7 +19,7 @@ string frame_prefix;
|
|||
byte *spr_palette;
|
||||
static byte pal[256][4];
|
||||
uint surfaceParm;
|
||||
shader_t *frames;
|
||||
ref_shader_t *frames;
|
||||
|
||||
/*
|
||||
====================
|
||||
|
@ -35,7 +35,7 @@ dframetype_t *R_SpriteLoadFrame( rmodel_t *mod, void *pin, mspriteframe_t **ppfr
|
|||
rgbdata_t *spr_frame;
|
||||
texture_t *image;
|
||||
string name;
|
||||
shader_t *out;
|
||||
ref_shader_t *out;
|
||||
|
||||
pinframe = (dframe_t *)pin;
|
||||
|
||||
|
|
|
@ -218,7 +218,8 @@ dstudiohdr_t *R_StudioLoadHeader( rmodel_t *mod, const uint *buffer )
|
|||
{
|
||||
R_SetInternalMap( R_StudioLoadTexture( mod, &ptexture[i], pin ));
|
||||
mod->shaders[i] = R_FindShader( ptexture[i].name, SHADER_STUDIO, surfaceParm );
|
||||
ptexture[i].index = mod->numShaders++; // internal shader index, not gl_texturenum
|
||||
ptexture[i].shader = mod->shaders[i]->shaderNum;
|
||||
mod->numShaders++;
|
||||
}
|
||||
}
|
||||
return (dstudiohdr_t *)buffer;
|
||||
|
@ -1419,7 +1420,7 @@ void R_StudioDrawMeshes( dstudiotexture_t * ptexture, short *pskinref, int pass
|
|||
|
||||
//GL_BindTexture( Ref.m_pCurrentModel->textures[ptexture[pskinref[pmesh->skinref]].index].image );
|
||||
// FIXME: test
|
||||
Ref.m_pCurrentShader = Ref.m_pCurrentModel->shaders[ptexture[pskinref[pmesh->skinref]].index];
|
||||
Ref.m_pCurrentShader = r_shaders[ptexture[pskinref[pmesh->skinref]].shader];
|
||||
|
||||
while( i = *(ptricmds++))
|
||||
{
|
||||
|
|
|
@ -55,9 +55,9 @@ R_CullSurface
|
|||
*/
|
||||
bool R_CullSurface( msurface_t *surf, uint clipflags )
|
||||
{
|
||||
shader_t *shader = surf->shader;
|
||||
ref_shader_t *shader = surf->shader;
|
||||
|
||||
if(( shader->flags & SHADER_SKY ) && r_fastsky->integer )
|
||||
if(( shader->flags & SHADER_SKYPARMS ) && r_fastsky->integer )
|
||||
return true;
|
||||
if( r_nocull->integer )
|
||||
return false;
|
||||
|
@ -124,14 +124,14 @@ R_AddSurfaceToList
|
|||
*/
|
||||
static meshbuffer_t *R_AddSurfaceToList( msurface_t *surf, uint clipflags )
|
||||
{
|
||||
shader_t *shader;
|
||||
ref_shader_t *shader;
|
||||
meshbuffer_t *mb;
|
||||
|
||||
if( R_CullSurface( surf, clipflags ))
|
||||
return NULL;
|
||||
|
||||
shader = ((r_drawworld->integer == 2) ? R_OcclusionShader() : surf->shader);
|
||||
if( shader->flags & SHADER_SKY )
|
||||
if( shader->flags & SHADER_SKYPARMS )
|
||||
{
|
||||
bool vis = R_AddSkySurface( surf );
|
||||
if( ( Ref.params & RP_NOSKY ) && vis )
|
||||
|
|
Reference in New Issue