diff --git a/engine/engine.plg b/engine/engine.plg
deleted file mode 100644
index 45d2c2f7..00000000
--- a/engine/engine.plg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-Build Log
-
---------------------Configuration: engine - Win32 Debug--------------------
-
-Command Lines
-
-
-
-Results
-engine.dll - 0 error(s), 0 warning(s)
-
-
-
diff --git a/physic/cm_model.c b/physic/cm_model.c
index 802f05a6..c091942a 100644
--- a/physic/cm_model.c
+++ b/physic/cm_model.c
@@ -511,11 +511,12 @@ void IBSP_LoadBrushSides( lump_t *l )
}
}
-void RBSP_LoadBrushSides( lump_t *l )
+static void RBSP_LoadBrushSides( lump_t *l, bool raven_bsp )
{
dbrushsider_t *in;
cbrushside_t *out;
- int i, j, num,count;
+ csurface_t *surf;
+ int i, j, shadernum, count;
in = (void *)(cms.base + l->fileofs);
if( l->filelen % sizeof( *in )) Host_Error( "BSP_LoadBrushSides: funny lump size\n" );
@@ -526,14 +527,28 @@ void RBSP_LoadBrushSides( lump_t *l )
for ( i = 0; i < count; i++, in++, out++)
{
- num = LittleLong( in->planenum );
- out->plane = cm.planes + num;
- j = LittleLong( in->shadernum );
- j = bound( 0, j, cm.numshaders - 1 );
- out->shader = cm.shaders + j;
- j = LittleLong( in->surfacenum );
- j = bound( 0, j, cm.numsurfaces - 1 );
- out->surface = cm.surfaces + j;
+ out->plane = cm.planes + LittleLong( in->planenum );
+ shadernum = bound( 0, LittleLong( in->shadernum ), cm.numshaders - 1 );
+ out->shader = cm.shaders + shadernum;
+
+ if( raven_bsp )
+ {
+ j = LittleLong( in->surfacenum );
+ j = bound( 0, j, cm.numsurfaces - 1 );
+ out->surface = cm.surfaces + j;
+ }
+ else
+ {
+ for( j = 0, surf = cm.surfaces; j < cm.numsurfaces; j++, surf++ )
+ {
+ if( surf->shadernum == shadernum )
+ {
+ // HACKHACK: only name matched, not vertices
+ out->surface = surf;
+ break;
+ }
+ }
+ }
}
}
@@ -1257,7 +1272,7 @@ cmodel_t *CM_BeginRegistration( const char *name, bool clientload, uint *checksu
else Host_Error( "CM_LoadMap: %s has wrong version number (%i should be %i)\n", name, hdr->version, RFIDBSP_VERSION );
break;
case IDBSPMODHEADER:
- if( hdr->version == Q3IDBSP_VERSION || hdr->version == RTCWBSP_VERSION )
+ if( hdr->version == Q3IDBSP_VERSION || hdr->version == RTCWBSP_VERSION || hdr->version == IGIDBSP_VERSION )
extended = false;
else Host_Error( "CM_LoadMap: %s has wrong version number (%i should be %i)\n", name, hdr->version, Q3IDBSP_VERSION );
break;
@@ -1276,13 +1291,16 @@ cmodel_t *CM_BeginRegistration( const char *name, bool clientload, uint *checksu
{
RBSP_LoadVertexes( &hdr->lumps[LUMP_VERTEXES] );
RBSP_LoadSurfaces( &hdr->lumps[LUMP_SURFACES] ); // used only for generate NewtonCollisionTree
- RBSP_LoadBrushSides( &hdr->lumps[LUMP_BRUSHSIDES] );
+ RBSP_LoadBrushSides( &hdr->lumps[LUMP_BRUSHSIDES], true );
}
else
{
IBSP_LoadVertexes( &hdr->lumps[LUMP_VERTEXES] );
IBSP_LoadSurfaces( &hdr->lumps[LUMP_SURFACES] ); // used only for generate NewtonCollisionTree
- IBSP_LoadBrushSides( &hdr->lumps[LUMP_BRUSHSIDES] );
+
+ if( hdr->version == IGIDBSP_VERSION )
+ RBSP_LoadBrushSides( &hdr->lumps[LUMP_BRUSHSIDES], false );
+ else IBSP_LoadBrushSides( &hdr->lumps[LUMP_BRUSHSIDES] );
}
BSP_LoadBrushes( &hdr->lumps[LUMP_BRUSHES] );
BSP_LoadLeafBrushes( &hdr->lumps[LUMP_LEAFBRUSHES] );
diff --git a/public/qfiles_ref.h b/public/qfiles_ref.h
index 8c1cbe18..a38acd69 100644
--- a/public/qfiles_ref.h
+++ b/public/qfiles_ref.h
@@ -165,6 +165,7 @@ BRUSH MODELS
// header
#define Q3IDBSP_VERSION 46
#define RTCWBSP_VERSION 47
+#define IGIDBSP_VERSION 48 // extended brushides
#define RFIDBSP_VERSION 1 // both raven bsp and qfusion bsp
#define IDBSPMODHEADER (('P'<<24)+('S'<<16)+('B'<<8)+'I') // little-endian "IBSP"
@@ -364,7 +365,12 @@ typedef struct
{
int planenum; // facing out of the leaf
int shadernum; // surface description
- int surfacenum;
+
+ union
+ {
+ int surfacenum;
+ int surfaceflags;
+ };
} dbrushsider_t;
typedef struct
diff --git a/render/r_alias.c b/render/r_alias.c
index 17ee6948..f0918667 100644
--- a/render/r_alias.c
+++ b/render/r_alias.c
@@ -783,10 +783,8 @@ static void R_DrawAliasFrameLerp( const meshbuffer_t *mb, float backlerp )
{
if( ( features & MF_SVECTORS ) || r_shownormals->integer )
features |= MF_NORMALS;
-#ifdef HARDWARE_OUTLINES
if( e->outlineHeight )
features |= MF_NORMALS|(GL_Support( R_SHADER_GLSL100_EXT ) ? MF_ENABLENORMALS : 0);
-#endif
}
calcNormals = calcSTVectors = false;
diff --git a/render/r_backend.c b/render/r_backend.c
index 9af7a735..d0c08861 100644
--- a/render/r_backend.c
+++ b/render/r_backend.c
@@ -88,12 +88,8 @@ static const mfog_t *r_texFog, *r_colorFog;
static ref_stage_t r_dlightsPass, r_fogPass;
static float r_lightmapPassesArgs[MAX_TEXTURE_UNITS+1][3];
static ref_stage_t r_lightmapPasses[MAX_TEXTURE_UNITS+1];
-
static ref_stage_t r_GLSLpasses[4]; // dlights and base
-
-#ifdef HARDWARE_OUTLINES
static ref_stage_t r_GLSLpassOutline;
-#endif
static ref_stage_t *r_accumPasses[MAX_TEXTURE_UNITS];
static int r_numAccumPasses;
@@ -170,55 +166,59 @@ void R_BackendInit( void )
// init dynamic lights pass
memset( &r_dlightsPass, 0, sizeof( ref_stage_t ) );
- r_dlightsPass.flags = SHADERSTAGE_DLIGHT|GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_DST_COLOR|GLSTATE_DSTBLEND_ONE;
+ r_dlightsPass.flags = SHADERSTAGE_DLIGHT;
+ r_dlightsPass.glState = GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_DST_COLOR|GLSTATE_DSTBLEND_ONE;
// init fog pass
memset( &r_fogPass, 0, sizeof( ref_stage_t ) );
r_fogPass.tcgen = TCGEN_FOG;
- r_fogPass.rgbgen.type = RGBGEN_FOG;
- r_fogPass.alphagen.type = ALPHAGEN_IDENTITY;
- r_fogPass.flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_DECAL|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ r_fogPass.rgbGen.type = RGBGEN_FOG;
+ r_fogPass.alphaGen.type = ALPHAGEN_IDENTITY;
+ r_fogPass.flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_DECAL;
+ r_fogPass.glState = GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
// the very first lightmap pass is reserved for GL_REPLACE or GL_MODULATE
- memset( r_lightmapPasses, 0, sizeof( r_lightmapPasses ) );
- r_lightmapPasses[0].rgbgen.args = r_lightmapPassesArgs[0];
+ Mem_Set( r_lightmapPasses, 0, sizeof( r_lightmapPasses ));
+ r_lightmapPasses[0].rgbGen.args = r_lightmapPassesArgs[0];
// the rest are GL_ADD
for( i = 1; i < MAX_TEXTURE_UNITS+1; i++ )
{
- r_lightmapPasses[i].flags = SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|GLSTATE_DEPTHFUNC_EQ
- |SHADERSTAGE_BLEND_ADD|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ r_lightmapPasses[i].flags = SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_ADD;
+ r_lightmapPasses[i].glState = GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
r_lightmapPasses[i].tcgen = TCGEN_LIGHTMAP;
- r_lightmapPasses[i].alphagen.type = ALPHAGEN_IDENTITY;
- r_lightmapPasses[i].rgbgen.args = r_lightmapPassesArgs[i];
+ r_lightmapPasses[i].alphaGen.type = ALPHAGEN_IDENTITY;
+ r_lightmapPasses[i].rgbGen.args = r_lightmapPassesArgs[i];
}
// init optional GLSL program passes
memset( r_GLSLpasses, 0, sizeof( r_GLSLpasses ) );
- r_GLSLpasses[0].flags = SHADERSTAGE_DLIGHT|GLSTATE_DEPTHFUNC_EQ|SHADERSTAGE_BLEND_ADD|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ r_GLSLpasses[0].flags = SHADERSTAGE_DLIGHT|SHADERSTAGE_BLEND_ADD;
+ r_GLSLpasses[0].glState = GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
- r_GLSLpasses[1].flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ r_GLSLpasses[1].flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ r_GLSLpasses[1].glState = GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
r_GLSLpasses[1].tcgen = TCGEN_BASE;
- r_GLSLpasses[1].rgbgen.type = RGBGEN_IDENTITY;
- r_GLSLpasses[1].alphagen.type = ALPHAGEN_IDENTITY;
- memcpy( &r_GLSLpasses[2], &r_GLSLpasses[1], sizeof( ref_stage_t ) );
+ r_GLSLpasses[1].rgbGen.type = RGBGEN_IDENTITY;
+ r_GLSLpasses[1].alphaGen.type = ALPHAGEN_IDENTITY;
+ Mem_Copy( &r_GLSLpasses[2], &r_GLSLpasses[1], sizeof( ref_stage_t ) );
- r_GLSLpasses[3].flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE|GLSTATE_DEPTHFUNC_EQ /*|GLSTATE_OFFSET_FILL*/|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ r_GLSLpasses[3].flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ r_GLSLpasses[3].glState = GLSTATE_DEPTHFUNC_EQ /*|GLSTATE_OFFSET_FILL*/|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
r_GLSLpasses[3].tcgen = TCGEN_PROJECTION_SHADOW;
- r_GLSLpasses[3].rgbgen.type = RGBGEN_IDENTITY;
- r_GLSLpasses[3].alphagen.type = ALPHAGEN_IDENTITY;
+ r_GLSLpasses[3].rgbGen.type = RGBGEN_IDENTITY;
+ r_GLSLpasses[3].alphaGen.type = ALPHAGEN_IDENTITY;
r_GLSLpasses[3].program = DEFAULT_GLSL_SHADOWMAP_PROGRAM;
r_GLSLpasses[3].program_type = PROGRAM_TYPE_SHADOWMAP;
-#ifdef HARDWARE_OUTLINES
- memset( &r_GLSLpassOutline, 0, sizeof( r_GLSLpassOutline ) );
- r_GLSLpassOutline.flags = SHADERSTAGE_NOCOLORARRAY|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO|SHADERSTAGE_BLEND_MODULATE|GLSTATE_DEPTHWRITE;
- r_GLSLpassOutline.rgbgen.type = RGBGEN_OUTLINE;
- r_GLSLpassOutline.alphagen.type = ALPHAGEN_OUTLINE;
+ Mem_Set( &r_GLSLpassOutline, 0, sizeof( r_GLSLpassOutline ) );
+ r_GLSLpassOutline.flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ r_GLSLpassOutline.glState = GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO|GLSTATE_DEPTHWRITE;
+ r_GLSLpassOutline.rgbGen.type = RGBGEN_OUTLINE;
+ r_GLSLpassOutline.alphaGen.type = ALPHAGEN_OUTLINE;
r_GLSLpassOutline.tcgen = TCGEN_NONE;
r_GLSLpassOutline.program = DEFAULT_GLSL_OUTLINE_PROGRAM;
r_GLSLpassOutline.program_type = PROGRAM_TYPE_OUTLINE;
-#endif
}
/*
@@ -567,15 +567,15 @@ R_DeformVertices
*/
void R_DeformVertices( void )
{
- unsigned int i, j, k;
- double args[4], temp;
- float deflect, *quad[4];
- const float *table;
- const deformv_t *deformv;
- vec3_t tv, rot_centre;
+ uint i, j, k;
+ double args[4], temp;
+ float deflect, *quad[4];
+ const float *table;
+ const deform_t *deformv;
+ vec3_t tv, rot_centre;
deformv = &r_currentShader->deforms[0];
- for( i = 0; i < r_currentShader->numdeforms; i++, deformv++ )
+ for( i = 0; i < r_currentShader->numDeforms; i++, deformv++ )
{
switch( deformv->type )
{
@@ -904,16 +904,12 @@ void R_DeformVertices( void )
}
}
break;
-
-#ifdef HARDWARE_OUTLINES
case DEFORM_OUTLINE:
// Deflect vertex along its normal by outline amount
deflect = RI.currententity->outlineHeight * r_outlines_scale->value;
for( j = 0; j < r_backacc.numVerts; j++ )
VectorMA( inVertsArray[j], deflect, inNormalsArray[j], inVertsArray[j] );
break;
-#endif
-
default:
break;
}
@@ -1185,13 +1181,13 @@ R_ApplyTCMods
*/
static void R_ApplyTCMods( const ref_stage_t *pass, mat4x4_t result )
{
- int i;
- const float *table;
- double t1, t2, sint, cost;
- mat4x4_t m1, m2;
- const tcmod_t *tcmod;
+ int i;
+ const float *table;
+ double t1, t2, sint, cost;
+ mat4x4_t m1, m2;
+ const tcMod_t *tcmod;
- for( i = 0, tcmod = pass->tcmods; i < pass->numtcmods; i++, tcmod++ )
+ for( i = 0, tcmod = pass->tcMods; i < pass->numtcMods; i++, tcmod++ )
{
switch( tcmod->type )
{
@@ -1278,7 +1274,7 @@ static void R_BindShaderpass( const ref_stage_t *pass, texture_t *tex, int unit
identityMatrix = R_VertexTCBase( pass, unit, result );
- if( pass->numtcmods )
+ if( pass->numtcMods )
{
identityMatrix = false;
R_ApplyTCMods( pass, result );
@@ -1306,14 +1302,14 @@ R_ModifyColor
*/
void R_ModifyColor( const ref_stage_t *pass )
{
- unsigned int i;
- int c, bits;
- double temp;
- float *table, a;
- vec3_t t, v, style;
- byte *bArray, *inArray, rgba[4] = { 255, 255, 255, 255 };
- bool noArray, identityAlpha, entityAlpha;
- const waveFunc_t *rgbgenfunc, *alphagenfunc;
+ uint i;
+ int c, bits;
+ double temp;
+ float *table, a;
+ vec3_t t, v, style;
+ byte *bArray, *inArray, rgba[4] = { 255, 255, 255, 255 };
+ bool noArray, identityAlpha, entityAlpha;
+ const waveFunc_t *rgbgenfunc, *alphagenfunc;
noArray = ( pass->flags & SHADERSTAGE_NOCOLORARRAY ) && !r_colorFog;
r_backacc.numColors = noArray ? 1 : r_backacc.numVerts;
@@ -1322,12 +1318,12 @@ void R_ModifyColor( const ref_stage_t *pass )
bArray = colorArray[0];
inArray = inColorsArray[0][0];
- if( pass->rgbgen.type == RGBGEN_IDENTITY_LIGHTING )
+ if( pass->rgbGen.type == RGBGEN_IDENTITY_LIGHTING )
{
entityAlpha = identityAlpha = false;
memset( bArray, r_identityLighting, sizeof( rgba_t ) * r_backacc.numColors );
}
- else if( pass->rgbgen.type == RGBGEN_EXACT_VERTEX )
+ else if( pass->rgbGen.type == RGBGEN_EXACT_VERTEX )
{
entityAlpha = identityAlpha = false;
memcpy( bArray, inArray, sizeof( rgba_t ) * r_backacc.numColors );
@@ -1338,20 +1334,20 @@ void R_ModifyColor( const ref_stage_t *pass )
identityAlpha = true;
memset( bArray, 255, sizeof( rgba_t ) * r_backacc.numColors );
- switch( pass->rgbgen.type )
+ switch( pass->rgbGen.type )
{
case RGBGEN_IDENTITY:
break;
case RGBGEN_CONST:
- rgba[0] = R_FloatToByte( pass->rgbgen.args[0] );
- rgba[1] = R_FloatToByte( pass->rgbgen.args[1] );
- rgba[2] = R_FloatToByte( pass->rgbgen.args[2] );
+ rgba[0] = R_FloatToByte( pass->rgbGen.args[0] );
+ rgba[1] = R_FloatToByte( pass->rgbGen.args[1] );
+ rgba[2] = R_FloatToByte( pass->rgbGen.args[2] );
for( i = 0, c = *(int *)rgba; i < r_backacc.numColors; i++, bArray += 4 )
*(int *)bArray = c;
break;
case RGBGEN_WAVE:
- rgbgenfunc = pass->rgbgen.func;
+ rgbgenfunc = pass->rgbGen.func;
if( rgbgenfunc->type == WAVEFORM_NOISE )
{
temp = R_BackendGetNoiseValue( 0, 0, 0, ( r_currentShaderTime + rgbgenfunc->args[2] ) * rgbgenfunc->args[3] );
@@ -1364,9 +1360,9 @@ void R_ModifyColor( const ref_stage_t *pass )
}
temp = temp * rgbgenfunc->args[1] + rgbgenfunc->args[0];
- a = pass->rgbgen.args[0] * temp; rgba[0] = a <= 0 ? 0 : R_FloatToByte( a );
- a = pass->rgbgen.args[1] * temp; rgba[1] = a <= 0 ? 0 : R_FloatToByte( a );
- a = pass->rgbgen.args[2] * temp; rgba[2] = a <= 0 ? 0 : R_FloatToByte( a );
+ a = pass->rgbGen.args[0] * temp; rgba[0] = a <= 0 ? 0 : R_FloatToByte( a );
+ a = pass->rgbGen.args[1] * temp; rgba[1] = a <= 0 ? 0 : R_FloatToByte( a );
+ a = pass->rgbGen.args[2] * temp; rgba[2] = a <= 0 ? 0 : R_FloatToByte( a );
for( i = 0, c = *(int *)rgba; i < r_backacc.numColors; i++, bArray += 4 )
*(int *)bArray = c;
@@ -1378,14 +1374,12 @@ void R_ModifyColor( const ref_stage_t *pass )
for( i = 0, c = *(int *)RI.currententity->color; i < r_backacc.numColors; i++, bArray += 4 )
*(int *)bArray = c;
break;
-#ifdef HARDWARE_OUTLINES
case RGBGEN_OUTLINE:
identityAlpha = ( RI.currententity->outlineColor[3] == 255 );
for( i = 0, c = *(int *)RI.currententity->outlineColor; i < r_backacc.numColors; i++, bArray += 4 )
*(int *)bArray = c;
break;
-#endif
case RGBGEN_ONE_MINUS_ENTITY:
rgba[0] = 255 - RI.currententity->color[0];
rgba[1] = 255 - RI.currententity->color[1];
@@ -1497,7 +1491,7 @@ void R_ModifyColor( const ref_stage_t *pass )
*(int *)bArray = c;
break;
case RGBGEN_CUSTOM:
- c = (int)pass->rgbgen.args[0];
+ c = (int)pass->rgbGen.args[0];
for( i = 0, c = R_GetCustomColor( c ); i < r_backacc.numColors; i++, bArray += 4 )
*(int *)bArray = c;
break;
@@ -1513,7 +1507,7 @@ void R_ModifyColor( const ref_stage_t *pass )
bArray = colorArray[0];
inArray = inColorsArray[0][0];
- switch( pass->alphagen.type )
+ switch( pass->alphaGen.type )
{
case ALPHAGEN_IDENTITY:
if( identityAlpha )
@@ -1522,12 +1516,12 @@ void R_ModifyColor( const ref_stage_t *pass )
bArray[3] = 255;
break;
case ALPHAGEN_CONST:
- c = R_FloatToByte( pass->alphagen.args[0] );
+ c = R_FloatToByte( pass->alphaGen.args[0] );
for( i = 0; i < r_backacc.numColors; i++, bArray += 4 )
bArray[3] = c;
break;
case ALPHAGEN_WAVE:
- alphagenfunc = pass->alphagen.func;
+ alphagenfunc = pass->alphaGen.func;
if( alphagenfunc->type == WAVEFORM_NOISE )
{
a = R_BackendGetNoiseValue( 0, 0, 0, ( r_currentShaderTime + alphagenfunc->args[2] ) * alphagenfunc->args[3] );
@@ -1548,7 +1542,7 @@ void R_ModifyColor( const ref_stage_t *pass )
case ALPHAGEN_PORTAL:
VectorAdd( vertsArray[0], RI.currententity->origin, v );
VectorSubtract( RI.viewOrigin, v, t );
- a = VectorLength( t ) * pass->alphagen.args[0];
+ a = VectorLength( t ) * pass->alphaGen.args[0];
a = bound( 0.0f, a, 1.0f );
c = R_FloatToByte( a );
@@ -1569,12 +1563,10 @@ void R_ModifyColor( const ref_stage_t *pass )
for( i = 0; i < r_backacc.numColors; i++, bArray += 4 )
bArray[3] = RI.currententity->color[3];
break;
-#ifdef HARDWARE_OUTLINES
case ALPHAGEN_OUTLINE:
for( i = 0; i < r_backacc.numColors; i++, bArray += 4 )
bArray[3] = RI.currententity->outlineColor[3];
break;
-#endif
case ALPHAGEN_SPECULAR:
VectorSubtract( RI.viewOrigin, RI.currententity->origin, t );
if( !Matrix_Compare( RI.currententity->axis, axis_identity ) )
@@ -1587,7 +1579,7 @@ void R_ModifyColor( const ref_stage_t *pass )
VectorSubtract( v, vertsArray[i], t );
c = VectorLength( t );
a = DotProduct( t, normalsArray[i] ) / max( 0.1, c );
- a = pow( a, pass->alphagen.args[0] );
+ a = pow( a, pass->alphaGen.args[0] );
bArray[3] = a <= 0 ? 0 : R_FloatToByte( a );
}
break;
@@ -1600,7 +1592,7 @@ void R_ModifyColor( const ref_stage_t *pass )
for( i = 0; i < r_backacc.numColors; i++, bArray += 4 )
{
a = DotProduct( v, inNormalsArray[i] ); if( a < 0 ) a = -a;
- bArray[3] = R_FloatToByte( bound( pass->alphagen.args[0], a, pass->alphagen.args[1] ) );
+ bArray[3] = R_FloatToByte( bound( pass->alphaGen.args[0], a, pass->alphaGen.args[1] ) );
}
break;
case ALPHAGEN_ONE_MINUS_DOT:
@@ -1612,7 +1604,7 @@ void R_ModifyColor( const ref_stage_t *pass )
for( i = 0; i < r_backacc.numColors; i++, bArray += 4 )
{
a = DotProduct( v, inNormalsArray[i] ); if( a < 0 ) a = -a;a = 1.0f - a;
- bArray[3] = R_FloatToByte( bound( pass->alphagen.args[0], a, pass->alphagen.args[1] ) );
+ bArray[3] = R_FloatToByte( bound( pass->alphaGen.args[0], a, pass->alphaGen.args[1] ) );
}
default:
break;
@@ -1629,13 +1621,11 @@ void R_ModifyColor( const ref_stage_t *pass )
bool alphaFog;
int blendsrc, blenddst;
- blendsrc = pass->flags & GLSTATE_SRCBLEND_MASK;
- blenddst = pass->flags & GLSTATE_DSTBLEND_MASK;
- if( ( blendsrc != GLSTATE_SRCBLEND_SRC_ALPHA && blenddst != GLSTATE_DSTBLEND_SRC_ALPHA ) &&
- ( blendsrc != GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA && blenddst != GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA ) )
+ blendsrc = pass->glState & GLSTATE_SRCBLEND_MASK;
+ blenddst = pass->glState & GLSTATE_DSTBLEND_MASK;
+ if(( blendsrc != GLSTATE_SRCBLEND_SRC_ALPHA && blenddst != GLSTATE_DSTBLEND_SRC_ALPHA ) && ( blendsrc != GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA && blenddst != GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA ))
alphaFog = false;
- else
- alphaFog = true;
+ else alphaFog = true;
fogPlane = r_colorFog->visibleplane;
fogShaderDistScale = 1.0 / (r_colorFog->shader->fog_dist - r_colorFog->shader->fog_clearDist);
@@ -1740,17 +1730,16 @@ R_SetShaderState
*/
static void R_SetShaderState( void )
{
- int state;
+ int state;
// Face culling
- if( !gl_cull->integer || ( r_features & MF_NOCULL ) )
+ if( !gl_cull->integer || ( r_features & MF_NOCULL ))
GL_Cull( 0 );
else if( r_currentShader->flags & SHADER_CULL_FRONT )
GL_Cull( GL_FRONT );
else if( r_currentShader->flags & SHADER_CULL_BACK )
GL_Cull( GL_BACK );
- else
- GL_Cull( 0 );
+ else GL_Cull( 0 );
state = 0;
if( r_currentShader->flags & SHADER_POLYGONOFFSET || RI.params & RP_SHADOWMAPVIEW )
@@ -1776,7 +1765,7 @@ void R_RenderMeshGeneric( void )
GL_TexEnv( GL_REPLACE );
else
GL_TexEnv( GL_MODULATE );
- GL_SetState( r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) );
+ GL_SetState( r_currentShaderState | ( pass->glState & r_currentShaderPassMask ));
R_FlushArrays();
}
@@ -1788,14 +1777,14 @@ R_RenderMeshMultitextured
*/
void R_RenderMeshMultitextured( void )
{
- int i;
- const ref_stage_t *pass = r_accumPasses[0];
+ int i;
+ const ref_stage_t *pass = r_accumPasses[0];
R_BindShaderpass( pass, NULL, 0 );
R_ModifyColor( pass );
GL_TexEnv( GL_MODULATE );
- GL_SetState( r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX );
+ GL_SetState( r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX );
for( i = 1; i < r_numAccumPasses; i++ )
{
@@ -1821,14 +1810,14 @@ void R_RenderMeshCombined( void )
R_ModifyColor( pass );
GL_TexEnv( GL_MODULATE );
- GL_SetState( r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX );
+ GL_SetState( r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX );
for( i = 1; i < r_numAccumPasses; i++ )
{
pass = r_accumPasses[i];
R_BindShaderpass( pass, NULL, i );
- if( pass->flags & ( SHADERSTAGE_BLEND_REPLACE|SHADERSTAGE_BLEND_MODULATE ) )
+ if( pass->flags & ( SHADERSTAGE_BLEND_REPLACE|SHADERSTAGE_BLEND_MODULATE ))
{
GL_TexEnv( GL_MODULATE );
}
@@ -1909,9 +1898,12 @@ static void R_RenderMeshGLSL_Material( void )
programFeatures |= PROGRAM_APPLY_CLIPPING;
if( r_currentMeshBuffer->infokey > 0 )
- { // world surface
- int srcAlpha = (pass->flags & (SHADERSTAGE_BLEND_DECAL|GLSTATE_ALPHAFUNC
- |GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA|GLSTATE_DSTBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA));
+ {
+ // world surface
+ int srcAlpha = (pass->flags & SHADERSTAGE_BLEND_DECAL);
+
+ // CHECKTHIS: this is right ?
+ srcAlpha |= (pass->glState & (GLSTATE_ALPHAFUNC|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_SRCBLEND_ONE_MINUS_SRC_ALPHA|GLSTATE_DSTBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA));
if( !( r_offsetmapping->integer & 1 ) )
offsetmappingScale = 0;
@@ -1930,18 +1922,18 @@ static void R_RenderMeshGLSL_Material( void )
{
breakIntoPasses = true;
r_GLSLpasses[1] = *pass;
- r_GLSLpasses[1].flags = ( pass->flags & SHADERSTAGE_NOCOLORARRAY )|((pass->flags & GLSTATE_ALPHAFUNC) ? GLSTATE_DEPTHFUNC_EQ : 0)
- |SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ r_GLSLpasses[1].flags = ( pass->flags & SHADERSTAGE_NOCOLORARRAY )|SHADERSTAGE_BLEND_MODULATE;
+ r_GLSLpasses[1].glState = GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR|((pass->glState & GLSTATE_ALPHAFUNC) ? GLSTATE_DEPTHFUNC_EQ : 0);
// decal
if( decalmap )
{
- r_GLSLpasses[1].rgbgen.type = RGBGEN_IDENTITY;
- r_GLSLpasses[1].alphagen.type = ALPHAGEN_IDENTITY;
+ r_GLSLpasses[1].rgbGen.type = RGBGEN_IDENTITY;
+ r_GLSLpasses[1].alphaGen.type = ALPHAGEN_IDENTITY;
r_GLSLpasses[2] = *pass;
- r_GLSLpasses[2].flags = ( pass->flags & SHADERSTAGE_NOCOLORARRAY )|((pass->flags & GLSTATE_ALPHAFUNC) ? GLSTATE_DEPTHFUNC_EQ : 0)
- |SHADERSTAGE_BLEND_DECAL|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ r_GLSLpasses[2].flags = ( pass->flags & SHADERSTAGE_NOCOLORARRAY )|SHADERSTAGE_BLEND_DECAL;
+ r_GLSLpasses[2].glState = GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA|((pass->glState & GLSTATE_ALPHAFUNC) ? GLSTATE_DEPTHFUNC_EQ : 0);
r_GLSLpasses[2].textures[0] = decalmap;
}
@@ -1954,7 +1946,7 @@ static void R_RenderMeshGLSL_Material( void )
{
r_GLSLpasses[1].textures[2] = r_GLSLpasses[2].textures[2] = NULL; // no specular
r_GLSLpasses[1].textures[3] = r_GLSLpasses[2].textures[3] = NULL; // no decal
- r_GLSLpasses[1].textures[6] = r_GLSLpasses[6].textures[2] = ((texture_t *)1); // no ambient (HACK HACK HACK)
+ r_GLSLpasses[1].textures[6] = r_GLSLpasses[6].textures[2] = ((texture_t *)1); // HACKHACK no ambient
}
}
}
@@ -1976,7 +1968,8 @@ static void R_RenderMeshGLSL_Material( void )
pass->tcgen = TCGEN_BASE;
R_BindShaderpass( pass, base, 0 );
if( !breakIntoPasses )
- { // calculate the fragment color
+ {
+ // calculate the fragment color
R_ModifyColor( pass );
}
else
@@ -1986,7 +1979,7 @@ static void R_RenderMeshGLSL_Material( void )
}
// set shaderpass state (blending, depthwrite, etc)
- state = r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
+ state = r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
GL_SetState( state );
// don't waste time on processing GLSL programs with zero colormask
@@ -2177,12 +2170,12 @@ static void R_RenderMeshGLSL_Distortion( void )
if( frontPlane )
{
- if( pass->alphagen.type != ALPHAGEN_IDENTITY )
+ if( pass->alphaGen.type != ALPHAGEN_IDENTITY )
programFeatures |= PROGRAM_APPLY_DISTORTION_ALPHA;
}
// set shaderpass state (blending, depthwrite, etc)
- state = r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
+ state = r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
GL_SetState( state );
if( pass->textures[1] /* && ( RI.params & RP_PORTALCAPTURED )*/ )
@@ -2255,7 +2248,7 @@ static void R_RenderMeshGLSL_Shadowmap( void )
R_ModifyColor( pass );
// set shaderpass state (blending, depthwrite, etc)
- state = r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
+ state = r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
GL_SetState( state );
pglUseProgramObjectARB( object );
@@ -2272,7 +2265,6 @@ static void R_RenderMeshGLSL_Shadowmap( void )
}
}
-#ifdef HARDWARE_OUTLINES
/*
================
R_RenderMeshGLSL_Outline
@@ -2305,7 +2297,7 @@ static void R_RenderMeshGLSL_Outline( void )
R_ModifyColor( pass );
// set shaderpass state (blending, depthwrite, etc)
- state = r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
+ state = r_currentShaderState | ( pass->glState & r_currentShaderPassMask ) | GLSTATE_BLEND_MTEX;
GL_SetState( state );
pglUseProgramObjectARB( object );
@@ -2319,7 +2311,6 @@ static void R_RenderMeshGLSL_Outline( void )
GL_Cull( faceCull );
}
-#endif
/*
================
@@ -2342,9 +2333,7 @@ static void R_RenderMeshGLSLProgrammed( void )
R_RenderMeshGLSL_Shadowmap();
break;
case PROGRAM_TYPE_OUTLINE:
-#ifdef HARDWARE_OUTLINES
R_RenderMeshGLSL_Outline ();
-#endif
break;
default:
MsgDev( D_WARN, "Unknown GLSL program type %i\n", pass->program_type );
@@ -2372,13 +2361,13 @@ static void R_RenderAccumulatedPasses( void )
if( pass->flags & SHADERSTAGE_DLIGHT )
{
r_numAccumPasses = 0;
- R_AddDynamicLights( r_currentDlightBits, r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) );
+ R_AddDynamicLights( r_currentDlightBits, r_currentShaderState | ( pass->glState & r_currentShaderPassMask ));
return;
}
if( pass->flags & SHADERSTAGE_STENCILSHADOW )
{
r_numAccumPasses = 0;
- R_PlanarShadowPass( r_currentShaderState | ( pass->flags & r_currentShaderPassMask ) );
+ R_PlanarShadowPass( r_currentShaderState | ( pass->glState & r_currentShaderPassMask ));
return;
}
@@ -2403,7 +2392,7 @@ static void R_AccumulatePass( ref_stage_t *pass )
const ref_stage_t *prevPass;
// for depth texture we render light's view to, ignore passes that do not write into depth buffer
- if( ( RI.params & RP_SHADOWMAPVIEW ) && !( pass->flags & GLSTATE_DEPTHWRITE ) )
+ if( ( RI.params & RP_SHADOWMAPVIEW ) && !( pass->glState & GLSTATE_DEPTHWRITE ))
return;
// see if there are any free texture units
@@ -2423,11 +2412,11 @@ static void R_AccumulatePass( ref_stage_t *pass )
// see if depthfuncs and colors are good
if(
- ( ( prevPass->flags ^ pass->flags ) & GLSTATE_DEPTHFUNC_EQ ) ||
- ( pass->flags & GLSTATE_ALPHAFUNC ) ||
- ( pass->rgbgen.type != RGBGEN_IDENTITY ) ||
- ( pass->alphagen.type != ALPHAGEN_IDENTITY ) ||
- ( ( prevPass->flags & GLSTATE_ALPHAFUNC ) && !( pass->flags & GLSTATE_DEPTHFUNC_EQ ) )
+ (( prevPass->glState ^ pass->glState ) & GLSTATE_DEPTHFUNC_EQ ) ||
+ ( pass->glState & GLSTATE_ALPHAFUNC ) ||
+ ( pass->rgbGen.type != RGBGEN_IDENTITY ) ||
+ ( pass->alphaGen.type != ALPHAGEN_IDENTITY ) ||
+ ( ( prevPass->glState & GLSTATE_ALPHAFUNC ) && !( pass->glState & GLSTATE_DEPTHFUNC_EQ ))
)
accumulate = false;
@@ -2491,12 +2480,13 @@ R_SetupLightmapMode
void R_SetupLightmapMode( void )
{
r_lightmapPasses[0].tcgen = TCGEN_LIGHTMAP;
- r_lightmapPasses[0].rgbgen.type = RGBGEN_IDENTITY;
- r_lightmapPasses[0].alphagen.type = ALPHAGEN_IDENTITY;
- r_lightmapPasses[0].flags &= ~( SHADERSTAGE_BLENDMODE|SHADERSTAGE_DELUXEMAP|GLSTATE_ALPHAFUNC|GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK|GLSTATE_DEPTHFUNC_EQ );
- r_lightmapPasses[0].flags |= SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE /*|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO*/;
- if( r_lightmap->integer )
- r_lightmapPasses[0].flags |= GLSTATE_DEPTHWRITE;
+ r_lightmapPasses[0].rgbGen.type = RGBGEN_IDENTITY;
+ r_lightmapPasses[0].alphaGen.type = ALPHAGEN_IDENTITY;
+ r_lightmapPasses[0].flags &= ~SHADERSTAGE_BLENDMODE;
+ r_lightmapPasses[0].glState &= ~( GLSTATE_ALPHAFUNC|GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK|GLSTATE_DEPTHFUNC_EQ );
+ r_lightmapPasses[0].flags |= SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+// r_lightmapPasses[0].glState |= GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO;
+ if( r_lightmap->integer ) r_lightmapPasses[0].glState |= GLSTATE_DEPTHWRITE;
}
/*
@@ -2543,7 +2533,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
if( !r_triangleOutlines )
R_SetShaderState();
- if( r_currentShader->numdeforms )
+ if( r_currentShader->numDeforms )
R_DeformVertices();
if( r_features & MF_KEEPLOCK )
@@ -2574,7 +2564,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
// can we fog the geometry with alpha texture?
r_texFog = ( fog && ( ( r_currentShader->sort <= SORT_ALPHATEST &&
- ( r_currentShader->flags & ( SHADER_DEPTHWRITE|SHADER_SKYPARMS ) ) ) || r_currentShader->fog_dist ) ) ? fog : NULL;
+ ( r_currentShader->flags & (SHADER_DEPTHWRITE|SHADER_SKYPARMS))) || r_currentShader->fog_dist ) ) ? fog : NULL;
// check if the fog volume is present but we can't use alpha texture
r_colorFog = ( fog && !r_texFog ) ? fog : NULL;
@@ -2589,7 +2579,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
R_LockArrays( r_backacc.numVerts );
// accumulate passes for dynamic merging
- for( i = 0, pass = r_currentShader->passes; i < r_currentShader->numpasses; i++, pass++ )
+ for( i = 0, pass = r_currentShader->stages; i < r_currentShader->num_stages; i++, pass++ )
{
if( !pass->program )
{
@@ -2602,7 +2592,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
continue;
// try to apply lightstyles
- if( ( !( pass->flags & ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK ) ) || ( pass->flags & SHADERSTAGE_BLEND_MODULATE ) ) && ( pass->rgbgen.type == RGBGEN_IDENTITY ) && ( pass->alphagen.type == ALPHAGEN_IDENTITY ) )
+ if(( !( pass->glState & (GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK)) || ( pass->flags & SHADERSTAGE_BLEND_MODULATE )) && ( pass->rgbGen.type == RGBGEN_IDENTITY ) && ( pass->alphaGen.type == ALPHAGEN_IDENTITY ))
{
vec3_t colorSum, color;
@@ -2634,7 +2624,7 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
if( VectorCompare( color, colorWhite ) )
{
- r_lightmapPasses[u].rgbgen.type = RGBGEN_IDENTITY;
+ r_lightmapPasses[u].rgbGen.type = RGBGEN_IDENTITY;
}
else
{
@@ -2643,8 +2633,8 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
r_lightmapPasses[0].flags &= ~SHADERSTAGE_BLENDMODE;
r_lightmapPasses[0].flags |= SHADERSTAGE_BLEND_MODULATE;
}
- r_lightmapPasses[u].rgbgen.type = RGBGEN_CONST;
- VectorCopy( color, r_lightmapPasses[u].rgbgen.args );
+ r_lightmapPasses[u].rgbGen.type = RGBGEN_CONST;
+ VectorCopy( color, r_lightmapPasses[u].rgbGen.args );
}
if( r_lightmap->integer && !l )
@@ -2666,13 +2656,13 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
}
continue;
}
- else if( r_lightmap->integer && ( r_currentShader->flags & SHADER_LIGHTMAP ) )
+ else if( r_lightmap->integer && ( r_currentShader->flags & SHADER_HASLIGHTMAP ))
continue;
- if( ( pass->flags & SHADERSTAGE_PORTALMAP ) && !( RI.params & RP_PORTALCAPTURED ) )
+ if(( pass->flags & SHADERSTAGE_PORTALMAP ) && !( RI.params & RP_PORTALCAPTURED ))
continue;
- if( ( pass->flags & SHADERSTAGE_DETAIL ) && !r_detailtextures->integer )
+ if(( pass->flags & SHADERSTAGE_DETAIL ) && !r_detailtextures->integer )
continue;
- if( ( pass->flags & SHADERSTAGE_DLIGHT ) && !r_currentDlightBits )
+ if(( pass->flags & SHADERSTAGE_DLIGHT ) && !r_currentDlightBits )
continue;
}
@@ -2680,29 +2670,25 @@ void R_RenderMeshBuffer( const meshbuffer_t *mb )
}
// accumulate dynamic lights pass and fog pass if any
- if( r_currentDlightBits && !( r_currentShader->flags & SHADER_NO_MODULATIVE_DLIGHTS ) )
+ if( r_currentDlightBits && !( r_currentShader->flags & SHADER_NO_MODULATIVE_DLIGHTS ))
{
- if( !r_lightmap->integer || !( r_currentShader->flags & SHADER_LIGHTMAP ) )
+ if( !r_lightmap->integer || !( r_currentShader->flags & SHADER_HASLIGHTMAP ))
R_AccumulatePass( &r_dlightsPass );
}
- if( r_currentShadowBits && ( r_currentShader->sort >= SORT_OPAQUE )
- && ( r_currentShader->sort <= SORT_ALPHATEST ) )
+ if( r_currentShadowBits && ( r_currentShader->sort >= SORT_OPAQUE ) && ( r_currentShader->sort <= SORT_ALPHATEST ))
R_AccumulatePass( &r_GLSLpasses[3] );
-#ifdef HARDWARE_OUTLINES
if( GL_Support( R_SHADER_GLSL100_EXT ) && RI.currententity && RI.currententity->outlineHeight && r_outlines_scale->value > 0
&& ( r_currentShader->sort == SORT_OPAQUE ) && ( r_currentShader->flags & SHADER_CULL_FRONT ) )
R_AccumulatePass( &r_GLSLpassOutline );
-#endif
if( r_texFog && r_texFog->shader )
{
r_fogPass.textures[0] = tr.fogTexture;
- if( !r_currentShader->numpasses || r_currentShader->fog_dist || ( r_currentShader->flags & SHADER_SKYPARMS ) )
- r_fogPass.flags &= ~GLSTATE_DEPTHFUNC_EQ;
- else
- r_fogPass.flags |= GLSTATE_DEPTHFUNC_EQ;
+ if( !r_currentShader->num_stages || r_currentShader->fog_dist || ( r_currentShader->flags & SHADER_SKYPARMS ) )
+ r_fogPass.glState &= ~GLSTATE_DEPTHFUNC_EQ;
+ else r_fogPass.glState |= GLSTATE_DEPTHFUNC_EQ;
R_AccumulatePass( &r_fogPass );
}
diff --git a/render/r_draw.c b/render/r_draw.c
index adb99bb9..c4570753 100644
--- a/render/r_draw.c
+++ b/render/r_draw.c
@@ -114,34 +114,34 @@ void R_DrawGetParms( int *w, int *h, int *f, int frame, shader_t handle )
if( handle < 0 || handle > MAX_SHADERS || !(shader = &r_shaders[handle]))
return;
- if( !shader->numpasses || !shader->passes[0].textures[0] )
+ if( !shader->num_stages || !shader->stages[0].textures[0] )
return;
- if( shader->passes[0].textures[0] && shader->passes[0].num_textures && frame > 0 )
- cur = bound( 0, frame, shader->passes[0].num_textures );
+ if( shader->stages[0].textures[0] && shader->stages[0].num_textures && frame > 0 )
+ cur = bound( 0, frame, shader->stages[0].num_textures );
- if( w ) *w = (int)shader->passes[0].textures[cur]->srcWidth;
- if( h ) *h = (int)shader->passes[0].textures[cur]->srcHeight;
- if( f ) *f = (int)shader->passes[0].num_textures;
+ if( w ) *w = (int)shader->stages[0].textures[cur]->srcWidth;
+ if( h ) *h = (int)shader->stages[0].textures[cur]->srcHeight;
+ if( f ) *f = (int)shader->stages[0].num_textures;
}
void R_DrawSetParms( shader_t handle, kRenderMode_t rendermode, int frame )
{
ref_shader_t *shader;
- if( handle < 0 || handle > MAX_SHADERS || !(shader = &r_shaders[handle]) || !shader->numpasses )
+ if( handle < 0 || handle > MAX_SHADERS || !(shader = &r_shaders[handle]) || !shader->num_stages )
return;
glState.draw_rendermode = rendermode;
- if( !shader->passes[0].num_textures )
+ if( !shader->stages[0].num_textures )
return;
// change frame if need
-// if( shader->passes[0].flags & SHADERSTAGE_FRAMES )
+ if( shader->stages[0].flags & SHADERSTAGE_FRAMES )
{
// make sure what frame inbound
- glState.draw_frame = bound( 0, frame, shader->passes[0].num_textures - 1 );
+ glState.draw_frame = bound( 0, frame, shader->stages[0].num_textures - 1 );
}
}
diff --git a/render/r_light.c b/render/r_light.c
index 2ed9f88b..4330d403 100644
--- a/render/r_light.c
+++ b/render/r_light.c
@@ -46,7 +46,7 @@ bool R_SurfPotentiallyLit( msurface_t *surf )
return false;
shader = surf->shader;
- if( shader->flags & SHADER_SKYPARMS || shader->type == SHADER_FLARE || !shader->numpasses )
+ if( shader->flags & SHADER_SKYPARMS || shader->type == SHADER_FLARE || !shader->num_stages )
return false;
return ( surf->mesh && ( surf->facetype != MST_FLARE ) /* && (surf->facetype != MST_TRISURF)*/ );
@@ -117,7 +117,7 @@ void R_AddDynamicLights( unsigned int dlightbits, int state )
if( !GL_Support( R_TEXTURE_3D_EXT ) && !GL_Support( R_ARB_MULTITEXTURE ))
return;
- for( i = 0; i < (unsigned)( GL_Support( R_TEXTURE_3D_EXT ) ? 1 : 2 ); i++ )
+ for( i = 0; i < (uint)( GL_Support( R_TEXTURE_3D_EXT ) ? 1 : 2 ); i++ )
{
GL_SelectTexture( i );
GL_TexEnv( GL_MODULATE );
diff --git a/render/r_local.h b/render/r_local.h
index 55bc88d4..618deeb1 100644
--- a/render/r_local.h
+++ b/render/r_local.h
@@ -21,8 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef __R_LOCAL_H__
#define __R_LOCAL_H__
-#define HARDWARE_OUTLINES
-
#include
#include "launch_api.h"
#include "qfiles_ref.h"
@@ -361,12 +359,9 @@ extern cvar_t *r_bloom_intensity;
extern cvar_t *r_bloom_darken;
extern cvar_t *r_bloom_sample_size;
extern cvar_t *r_bloom_fast_sample;
-
-#ifdef HARDWARE_OUTLINES
extern cvar_t *r_outlines_world;
extern cvar_t *r_outlines_scale;
extern cvar_t *r_outlines_cutoff;
-#endif
extern cvar_t *r_lodbias;
extern cvar_t *r_lodscale;
@@ -462,8 +457,8 @@ enum
#define OCCLUSION_QUERIES_ENABLED( RI ) ( GL_Support( R_OCCLUSION_QUERIES_EXT ) && r_occlusion_queries->integer && r_drawentities->integer \
&& !((RI).params & RP_NONVIEWERREF) && !((RI).refdef.rdflags & RDF_NOWORLDMODEL) \
&& OCCLUSION_QUERIES_CVAR_HACK( RI ) )
-#define OCCLUSION_OPAQUE_SHADER( s ) ( ((s)->sort == SORT_OPAQUE ) && ((s)->flags & SHADER_DEPTHWRITE ) && !(s)->numdeforms )
-#define OCCLUSION_TEST_ENTITY( e ) ( ((e)->flags & (RF_OCCLUSIONTEST|RF_WEAPONMODEL)) == RF_OCCLUSIONTEST )
+#define OCCLUSION_OPAQUE_SHADER( s ) (((s)->sort == SORT_OPAQUE ) && ((s)->flags & SHADER_DEPTHWRITE ) && !(s)->numDeforms )
+#define OCCLUSION_TEST_ENTITY( e ) (((e)->flags & (RF_OCCLUSIONTEST|RF_WEAPONMODEL)) == RF_OCCLUSIONTEST )
void R_InitOcclusionQueries( void );
void R_BeginOcclusionPass( void );
@@ -573,12 +568,10 @@ bool R_PushSpritePoly( const meshbuffer_t *mb );
#define NUM_CUSTOMCOLORS 16
void R_InitCustomColors( void );
void R_SetCustomColor( int num, int r, int g, int b );
-int R_GetCustomColor( int num );
+int R_GetCustomColor( int num );
-#ifdef HARDWARE_OUTLINES
void R_InitOutlines( void );
void R_AddModelMeshOutline( unsigned int modhandle, mfog_t *fog, int meshnum );
-#endif
msurface_t *R_TraceLine( trace_t *tr, const vec3_t start, const vec3_t end, int surfumask );
@@ -781,12 +774,10 @@ enum
typedef struct
{
- int pow2MapOvrbr;
+ int pow2MapOvrbr;
- float ambient[3];
-#ifdef HARDWARE_OUTLINES
+ float ambient[3];
rgba_t outlineColor;
-#endif
rgba_t environmentColor;
bool lightmapsPacking;
diff --git a/render/r_main.c b/render/r_main.c
index 4eade633..b2b859c2 100644
--- a/render/r_main.c
+++ b/render/r_main.c
@@ -953,11 +953,7 @@ static void R_ApplySoftwareGamma( void )
}
//=============================================================================
-
-#ifdef HARDWARE_OUTLINES
-
static ref_shader_t *r_outlineShader;
-
/*
===============
R_InitOutlines
@@ -976,11 +972,8 @@ R_AddModelMeshOutline
void R_AddModelMeshOutline( unsigned int modhandle, mfog_t *fog, int meshnum )
{
meshbuffer_t *mb = R_AddMeshToList( MB_MODEL, fog, r_outlineShader, -( meshnum+1 ) );
- if( mb )
- mb->LODModelHandle = modhandle;
+ if( mb ) mb->LODModelHandle = modhandle;
}
-#endif
-
//=======================================================================
/*
diff --git a/render/r_mesh.c b/render/r_mesh.c
index 050e8db6..7e47eec6 100644
--- a/render/r_mesh.c
+++ b/render/r_mesh.c
@@ -273,13 +273,11 @@ void R_AddModelMeshToList( unsigned int modhandle, mfog_t *fog, ref_shader_t *sh
if( mb )
mb->LODModelHandle = modhandle;
-#ifdef HARDWARE_OUTLINES
if( !GL_Support( R_SHADER_GLSL100_EXT ) && RI.currententity->outlineHeight/* && !(RI.params & RP_SHADOWMAPVIEW)*/ )
{
- if( ( shader->sort == SORT_OPAQUE ) && ( shader->flags & SHADER_CULL_FRONT ) )
+ if(( shader->sort == SORT_OPAQUE ) && ( shader->flags & SHADER_CULL_FRONT ))
R_AddModelMeshOutline( modhandle, fog, meshnum );
}
-#endif
}
/*
@@ -329,10 +327,8 @@ static void R_BatchMeshBuffer( const meshbuffer_t *mb, const meshbuffer_t *nextm
features = shader->features;
if( r_shownormals->integer )
features |= MF_NORMALS;
-#ifdef HARDWARE_OUTLINES
if( ent->outlineHeight )
features |= (MF_NORMALS|MF_ENABLENORMALS);
-#endif
features |= r_superLightStyles[surf->superLightStyle].features;
if( features & MF_NONBATCHED )
@@ -760,11 +756,11 @@ static bool R_AddPortalSurface( const meshbuffer_t *mb )
// check if we are too far away and the portal view is obscured
// by an alphagen portal stage
- for( i = 0; i < shader->numpasses; i++ )
+ for( i = 0; i < shader->num_stages; i++ )
{
- if( shader->passes[i].alphagen.type == ALPHAGEN_PORTAL )
+ if( shader->stages[i].alphaGen.type == ALPHAGEN_PORTAL )
{
- if( dist > ( 1.0/shader->passes[i].alphagen.args[0] ) )
+ if( dist > ( 1.0f / shader->stages[i].alphaGen.args[0] ) )
return true; // completely alpha'ed out
}
}
@@ -857,13 +853,13 @@ static bool R_DrawPortalSurface( void )
captureTexture = &tr.portaltexture1;
captureTextureID = 1;
- for( i = 0, pass = shader->passes; i < shader->numpasses; i++, pass++ )
+ for( i = 0, pass = shader->stages; i < shader->num_stages; i++, pass++ )
{
if( pass->program && pass->program_type == PROGRAM_TYPE_DISTORTION )
{
- if( ( pass->alphagen.type == ALPHAGEN_CONST && pass->alphagen.args[0] == 1 ) )
+ if( ( pass->alphaGen.type == ALPHAGEN_CONST && pass->alphaGen.args[0] == 1 ) )
doRefraction = false;
- else if( ( pass->alphagen.type == ALPHAGEN_CONST && pass->alphagen.args[0] == 0 ) )
+ else if( ( pass->alphaGen.type == ALPHAGEN_CONST && pass->alphaGen.args[0] == 0 ) )
doReflection = false;
break;
}
diff --git a/render/r_mesh.h b/render/r_mesh.h
index e9126d59..4352ae31 100644
--- a/render/r_mesh.h
+++ b/render/r_mesh.h
@@ -72,7 +72,7 @@ typedef struct mesh_s
#define MB_NUM2FOG( num, fog ) ( (fog) = r_worldbrushmodel->fogs+(((num)>>2) & 0xFF), (fog) = ( (fog) == r_worldbrushmodel->fogs ? NULL : (fog)-1 ) )
#define MB_ENTITY2NUM( ent ) ((int)((ent)-r_entities)<<20 )
-#define MB_NUM2ENTITY( num, ent ) ( ent = r_entities+(((num)>>20)&1023))
+#define MB_NUM2ENTITY( num, ent ) ( ent = r_entities+(((num)>>20)&MAX_ENTITIES-1))
#define MB_SHADER2NUM( s ) ( (s)->sort << 26 ) | ((s) - r_shaders )
#define MB_NUM2SHADER( num, s ) ( (s) = r_shaders + ((num) & 0xFFF) )
diff --git a/render/r_model.c b/render/r_model.c
index 988f7d7d..a8215d84 100644
--- a/render/r_model.c
+++ b/render/r_model.c
@@ -33,6 +33,7 @@ enum
{
BSP_IDBSP = 0,
BSP_RAVEN,
+BSP_IGBSP,
};
typedef struct
@@ -48,6 +49,7 @@ bspFormatDesc_t bspFormats[] =
{
{ QFBSPMODHEADER, RFIDBSP_VERSION, 512, 512, BSP_RAVEN },
{ IDBSPMODHEADER, Q3IDBSP_VERSION, 128, 128, BSP_IDBSP },
+{ IDBSPMODHEADER, IGIDBSP_VERSION, 128, 128, BSP_IGBSP },
{ IDBSPMODHEADER, RTCWBSP_VERSION, 128, 128, BSP_IDBSP },
{ RBBSPMODHEADER, RFIDBSP_VERSION, 128, 128, BSP_RAVEN }
};
@@ -1110,8 +1112,8 @@ static _inline void Mod_LoadFaceCommon( const dsurfacer_t *in, msurface_t *out )
{
// some q3a maps specify a lightmap shader for surfaces that do not have a lightmap,
// workaround that... see pukka3tourney2 for example
- if( ( shaderType == SHADER_VERTEX && ( shaderref->shader->flags & SHADER_LIGHTMAP ) &&
- ( shaderref->shader->passes[0].flags & SHADERSTAGE_LIGHTMAP ) ) )
+ if( ( shaderType == SHADER_VERTEX && ( shaderref->shader->flags & SHADER_HASLIGHTMAP ) &&
+ ( shaderref->shader->stages[0].flags & SHADERSTAGE_LIGHTMAP )))
out->shader = R_LoadShader( shaderref->name, shaderType, false, 0, shaderref->shader->type );
else
out->shader = shaderref->shader;
@@ -1287,7 +1289,7 @@ static void Mod_LoadFogs( const lump_t *l, const lump_t *brLump, const lump_t *b
if( brLump->filelen % sizeof( *inbrushes ) )
Host_Error( "Mod_LoadBrushes: funny lump size in %s\n", loadmodel->name );
- if( mod_bspFormat->flags & BSP_RAVEN )
+ if( mod_bspFormat->flags & (BSP_RAVEN|BSP_IGBSP))
{
inrbrushsides = ( void * )( mod_base + brSidesLump->fileofs );
if( brSidesLump->filelen % sizeof( *inrbrushsides ) )
@@ -1324,28 +1326,27 @@ static void Mod_LoadFogs( const lump_t *l, const lump_t *brLump, const lump_t *b
continue;
}
- if( mod_bspFormat->flags & BSP_RAVEN )
+ if( mod_bspFormat->flags & (BSP_RAVEN|BSP_IGBSP))
rbrushside = inrbrushsides + p;
- else
- brushside = inbrushsides + p;
+ else brushside = inbrushsides + p;
p = LittleLong( in->visibleside );
out->numplanes = LittleLong( brush->numsides );
out->planes = Mod_Malloc( loadmodel, out->numplanes * sizeof( cplane_t ) );
- if( mod_bspFormat->flags & BSP_RAVEN )
+ if( mod_bspFormat->flags & (BSP_RAVEN|BSP_IGBSP))
{
if( p != -1 )
out->visibleplane = loadbmodel->planes + LittleLong( rbrushside[p].planenum );
for( j = 0; j < out->numplanes; j++ )
- out->planes[j] = *( loadbmodel->planes + LittleLong( rbrushside[j].planenum ) );
+ out->planes[j] = *( loadbmodel->planes + LittleLong( rbrushside[j].planenum ));
}
else
{
if( p != -1 )
out->visibleplane = loadbmodel->planes + LittleLong( brushside[p].planenum );
for( j = 0; j < out->numplanes; j++ )
- out->planes[j] = *( loadbmodel->planes + LittleLong( brushside[j].planenum ) );
+ out->planes[j] = *( loadbmodel->planes + LittleLong( brushside[j].planenum ));
}
}
}
@@ -1660,25 +1661,20 @@ static void Mod_LoadEntities( const lump_t *l, vec3_t gridSize, vec3_t ambient,
{
int n;
bool isworld;
+ float celcolorf[3] = { 0, 0, 0 };
float gridsizef[3] = { 0, 0, 0 }, colorf[3] = { 0, 0, 0 }, ambientf = 0;
char key[MAX_KEY], value[MAX_VALUE];
token_t token;
script_t *ents;
-#ifdef HARDWARE_OUTLINES
- float celcolorf[3] = { 0, 0, 0 };
-#endif
Com_Assert( gridSize == NULL );
Com_Assert( ambient == NULL );
-#ifdef HARDWARE_OUTLINES
Com_Assert( outline == NULL );
-#endif
VectorClear( gridSize );
VectorClear( ambient );
-#ifdef HARDWARE_OUTLINES
VectorClear( outline );
-#endif
+
ents = Com_OpenScript( LUMP_ENTITIES, (char *)mod_base + l->fileofs, l->filelen );
if( !ents ) return;
@@ -1738,7 +1734,6 @@ static void Mod_LoadEntities( const lump_t *l, vec3_t gridSize, vec3_t ambient,
VectorCopy( colori, colorf );
}
}
-#ifdef HARDWARE_OUTLINES
else if( !com.strcmp( key, "_outlinecolor" ) )
{
n = sscanf( value, "%f %f %f", &celcolorf[0], &celcolorf[1], &celcolorf[2] );
@@ -1749,7 +1744,6 @@ static void Mod_LoadEntities( const lump_t *l, vec3_t gridSize, vec3_t ambient,
VectorCopy( celcolori, celcolorf );
}
}
-#endif
}
if( isworld )
@@ -1759,11 +1753,10 @@ static void Mod_LoadEntities( const lump_t *l, vec3_t gridSize, vec3_t ambient,
if( VectorCompare( colorf, vec3_origin ))
VectorSet( colorf, 1.0, 1.0, 1.0 );
VectorScale( colorf, ambientf, ambient );
-#ifdef HARDWARE_OUTLINES
+
if( max( celcolorf[0], max( celcolorf[1], celcolorf[2] ) ) > 1.0f )
VectorScale( celcolorf, 1.0f / 255.0f, celcolorf ); // [0..1] RGB -> [0..255] RGB
VectorCopy( celcolorf, outline );
-#endif
break;
}
}
@@ -1860,11 +1853,9 @@ static void Mod_Finish( const lump_t *faces, const lump_t *light, vec3_t gridSiz
for( i = 0; i < 3; i++ )
mapConfig.ambient[i] = bound( 0, ambient[i]*( (float)( 1 << mapConfig.pow2MapOvrbr )/255.0f ), 1 );
-#ifdef HARDWARE_OUTLINES
for( i = 0; i < 3; i++ )
mapConfig.outlineColor[i] = (byte)(bound( 0, outline[i]*255.0f, 255 ));
mapConfig.outlineColor[3] = 255;
-#endif
R_SortSuperLightStyles();
@@ -1992,27 +1983,23 @@ void Mod_LoadBrushModel( ref_model_t *mod, ref_model_t *parent, void *buffer )
Mod_LoadEntities( &header->lumps[LUMP_ENTITIES], gridSize, ambient, outline );
if( mod_bspFormat->flags & BSP_RAVEN )
Mod_LoadVertexes_RBSP( &header->lumps[LUMP_VERTEXES] );
- else
- Mod_LoadVertexes( &header->lumps[LUMP_VERTEXES] );
+ else Mod_LoadVertexes( &header->lumps[LUMP_VERTEXES] );
Mod_LoadElems( &header->lumps[LUMP_ELEMENTS] );
Mod_LoadLighting( &header->lumps[LUMP_LIGHTING], &header->lumps[LUMP_SURFACES] );
if( mod_bspFormat->flags & BSP_RAVEN )
Mod_LoadLightgrid_RBSP( &header->lumps[LUMP_LIGHTGRID] );
- else
- Mod_LoadLightgrid( &header->lumps[LUMP_LIGHTGRID] );
+ else Mod_LoadLightgrid( &header->lumps[LUMP_LIGHTGRID] );
Mod_LoadShaderrefs( &header->lumps[LUMP_SHADERS] );
Mod_LoadPlanes( &header->lumps[LUMP_PLANES] );
Mod_LoadFogs( &header->lumps[LUMP_FOGS], &header->lumps[LUMP_BRUSHES], &header->lumps[LUMP_BRUSHSIDES] );
- if( mod_bspFormat->flags & BSP_RAVEN )
+ if( mod_bspFormat->flags & (BSP_RAVEN|BSP_IGBSP))
Mod_LoadFaces_RBSP( &header->lumps[LUMP_SURFACES] );
- else
- Mod_LoadFaces( &header->lumps[LUMP_SURFACES] );
+ else Mod_LoadFaces( &header->lumps[LUMP_SURFACES] );
Mod_LoadLeafs( &header->lumps[LUMP_LEAFS], &header->lumps[LUMP_LEAFSURFACES] );
Mod_LoadNodes( &header->lumps[LUMP_NODES] );
if( mod_bspFormat->flags & BSP_RAVEN )
Mod_LoadLightArray_RBSP( &header->lumps[LUMP_LIGHTARRAY] );
- else
- Mod_LoadLightArray();
+ else Mod_LoadLightArray();
Mod_Finish( &header->lumps[LUMP_SURFACES], &header->lumps[LUMP_LIGHTING], gridSize, ambient, outline );
@@ -2027,7 +2014,7 @@ void Mod_LoadBrushModel( ref_model_t *mod, ref_model_t *parent, void *buffer )
bmodel = ( mbrushmodel_t * )starmod->extradata;
memcpy( starmod, mod, sizeof( ref_model_t ) );
- memcpy( bmodel, mod->extradata, sizeof( mbrushmodel_t ) );
+ memcpy( bmodel, mod->extradata, sizeof( mbrushmodel_t ));
bmodel->firstmodelsurface = bmodel->surfaces + bm->firstface;
bmodel->nummodelsurfaces = bm->numfaces;
@@ -2118,9 +2105,7 @@ void R_BeginRegistration( const char *mapname, const dvis_t *visData )
mapConfig.deluxeMappingEnabled = false;
VectorClear( mapConfig.ambient );
-#ifdef HARDWARE_OUTLINES
VectorClear( mapConfig.outlineColor );
-#endif
com.sprintf( fullname, "maps/%s.bsp", mapname );
@@ -2131,7 +2116,7 @@ void R_BeginRegistration( const char *mapname, const dvis_t *visData )
mapConfig.lightmapsPacking = true;
- com.strncpy( lightmapsPath, fullname, sizeof( lightmapsPath ) );
+ com.strncpy( lightmapsPath, fullname, sizeof( lightmapsPath ));
p = com.strrchr( lightmapsPath, '.' );
if( p )
{
diff --git a/render/r_program.c b/render/r_program.c
index 312310ce..b646fc0d 100644
--- a/render/r_program.c
+++ b/render/r_program.c
@@ -34,36 +34,30 @@ typedef struct
typedef struct
{
- char *name;
- unsigned int features;
- const char *string;
+ char *name;
+ uint features;
+ const char *string;
- int object;
- int vertexShader;
- int fragmentShader;
+ int object;
+ int vertexShader;
+ int fragmentShader;
- int locEyeOrigin,
- locLightDir,
- locLightOrigin,
- locLightAmbient,
- locLightDiffuse,
-
- locGlossIntensity,
- locGlossExponent,
-
- locOffsetMappingScale,
-#ifdef HARDWARE_OUTLINES
- locOutlineHeight,
- locOutlineCutOff,
-#endif
- locFrontPlane,
- locTextureWidth,
- locTextureHeight,
- locProjDistance,
-
- locDeluxemapOffset[LM_STYLES],
- loclsColor[LM_STYLES]
- ;
+ int locEyeOrigin;
+ int locLightDir;
+ int locLightOrigin;
+ int locLightAmbient;
+ int locLightDiffuse;
+ int locGlossIntensity;
+ int locGlossExponent;
+ int locOffsetMappingScale;
+ int locOutlineHeight;
+ int locOutlineCutOff;
+ int locFrontPlane;
+ int locTextureWidth;
+ int locTextureHeight;
+ int locProjDistance;
+ int locDeluxemapOffset[LM_STYLES];
+ int loclsColor[LM_STYLES];
} glsl_program_t;
static glsl_program_t r_glslprograms[MAX_GLSL_PROGRAMS];
@@ -74,9 +68,7 @@ static void R_GetProgramUniformLocations( glsl_program_t *program );
static const char *r_defaultGLSLProgram;
static const char *r_defaultDistortionGLSLProgram;
static const char *r_defaultShadowmapGLSLProgram;
-#ifdef HARDWARE_OUTLINES
static const char *r_defaultOutlineGLSLProgram;
-#endif
/*
================
@@ -114,9 +106,7 @@ void R_InitGLSLPrograms( void )
R_RegisterGLSLProgram( DEFAULT_GLSL_SHADOWMAP_PROGRAM, r_defaultShadowmapGLSLProgram, 0|features );
-#ifdef HARDWARE_OUTLINES
R_RegisterGLSLProgram( DEFAULT_GLSL_OUTLINE_PROGRAM, r_defaultOutlineGLSLProgram, 0|features );
-#endif
}
/*
@@ -788,7 +778,6 @@ static const char *r_defaultShadowmapGLSLProgram =
"#endif // FRAGMENT_SHADER\n"
"\n";
-#ifdef HARDWARE_OUTLINES
static const char *r_defaultOutlineGLSLProgram =
"// " APPLICATION " GLSL shader\n"
"\n"
@@ -837,7 +826,6 @@ static const char *r_defaultOutlineGLSLProgram =
"\n"
"#endif // FRAGMENT_SHADER\n"
"\n";
-#endif
/*
================
@@ -1050,9 +1038,7 @@ void R_ProgramDump_f( void )
DUMP_PROGRAM( defaultGLSLProgram );
DUMP_PROGRAM( defaultDistortionGLSLProgram );
DUMP_PROGRAM( defaultShadowmapGLSLProgram );
-#ifdef HARDWARE_OUTLINES
DUMP_PROGRAM( defaultOutlineGLSLProgram );
-#endif
}
#undef DUMP_PROGRAM
@@ -1061,10 +1047,8 @@ void R_ProgramDump_f( void )
R_UpdateProgramUniforms
================
*/
-void R_UpdateProgramUniforms( int elem, vec3_t eyeOrigin,
- vec3_t lightOrigin, vec3_t lightDir, vec4_t ambient, vec4_t diffuse,
- superLightStyle_t *superLightStyle, bool frontPlane, int TexWidth, int TexHeight,
- float projDistance, float offsetmappingScale )
+void R_UpdateProgramUniforms( int elem, vec3_t eyeOrigin, vec3_t lightOrigin, vec3_t lightDir, vec4_t ambient, vec4_t diffuse,
+ superLightStyle_t *superLightStyle, bool frontPlane, int TexWidth, int TexHeight, float projDistance, float offsetmappingScale )
{
glsl_program_t *program = r_glslprograms + elem - 1;
@@ -1089,12 +1073,10 @@ void R_UpdateProgramUniforms( int elem, vec3_t eyeOrigin,
if( program->locOffsetMappingScale >= 0 )
pglUniform1fARB( program->locOffsetMappingScale, offsetmappingScale );
-#ifdef HARDWARE_OUTLINES
if( program->locOutlineHeight >= 0 )
pglUniform1fARB( program->locOutlineHeight, projDistance );
if( program->locOutlineCutOff >= 0 )
pglUniform1fARB( program->locOutlineCutOff, max( 0, r_outlines_cutoff->value ) );
-#endif
if( program->locFrontPlane >= 0 )
pglUniform1fARB( program->locFrontPlane, frontPlane ? 1 : -1 );
@@ -1109,7 +1091,7 @@ void R_UpdateProgramUniforms( int elem, vec3_t eyeOrigin,
if( superLightStyle )
{
- int i;
+ int i;
for( i = 0; i < LM_STYLES && superLightStyle->lightmapStyles[i] != 255; i++ )
{
@@ -1182,10 +1164,8 @@ static void R_GetProgramUniformLocations( glsl_program_t *program )
program->locOffsetMappingScale = pglGetUniformLocationARB( program->object, "OffsetMappingScale" );
-#ifdef HARDWARE_OUTLINES
program->locOutlineHeight = pglGetUniformLocationARB( program->object, "OutlineHeight" );
program->locOutlineCutOff = pglGetUniformLocationARB( program->object, "OutlineCutOff" );
-#endif
program->locFrontPlane = pglGetUniformLocationARB( program->object, "FrontPlane" );
diff --git a/render/r_public.h b/render/r_public.h
index 602c6dad..787bc314 100644
--- a/render/r_public.h
+++ b/render/r_public.h
@@ -160,14 +160,12 @@ typedef struct entity_s
float radius; // used as RT_SPRITE's radius
float rotation;
-#ifdef HARDWARE_OUTLINES
float outlineHeight;
union
{
rgba_t outlineColor;
rgba_t outlineRGBA;
};
-#endif
} ref_entity_t;
void R_ModelBounds( const struct ref_model_s *model, vec3_t mins, vec3_t maxs );
diff --git a/render/r_register.c b/render/r_register.c
index 9bba8937..c9c35064 100644
--- a/render/r_register.c
+++ b/render/r_register.c
@@ -582,11 +582,9 @@ void GL_InitCommands( void )
r_shadows_pcf = Cvar_Get( "r_shadows_pcf", "0", CVAR_ARCHIVE, "allow pcf filtration" );
r_shadows_self_shadow = Cvar_Get( "r_shadows_self_shadow", "0", CVAR_ARCHIVE, "allow self-shadowing" );
-#ifdef HARDWARE_OUTLINES
r_outlines_world = Cvar_Get( "r_outlines_world", "1.8", CVAR_ARCHIVE, "cel-shading world outline thinkness" );
r_outlines_scale = Cvar_Get( "r_outlines_scale", "1", CVAR_ARCHIVE, "outilines scale" );
r_outlines_cutoff = Cvar_Get( "r_outlines_cutoff", "712", CVAR_ARCHIVE, "cutoff factor" );
-#endif
r_lodbias = Cvar_Get( "r_lodbias", "0", CVAR_ARCHIVE, "md3 or skm lod bias" );
r_lodscale = Cvar_Get( "r_lodscale", "5.0", CVAR_ARCHIVE, "md3 or skm LOD scale factor" );
@@ -1053,16 +1051,14 @@ static void R_InitMedia( void )
R_InitGLSLPrograms();
R_InitImages();
R_InitCinematics ();
- R_InitShaders((glw_state.developer <= 3));
+ R_InitShaders();
R_InitModels();
R_InitSkinFiles();
R_InitCoronas();
R_InitShadows();
R_InitOcclusionQueries();
R_InitCustomColors ();
-#ifdef HARDWARE_OUTLINES
R_InitOutlines ();
-#endif
GL_SetDefaultTexState ();
diff --git a/render/r_shader.c b/render/r_shader.c
index 763c6061..380b97a8 100644
--- a/render/r_shader.c
+++ b/render/r_shader.c
@@ -24,8 +24,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "r_local.h"
#include "mathlib.h"
-#define SHADERS_HASH_SIZE 128
-#define SHADERCACHE_HASH_SIZE 128
+typedef struct ref_script_s
+{
+ char *name;
+ int type;
+ uint surfaceParm;
+ char *source;
+ int line;
+ char *buffer;
+ size_t size;
+ struct ref_script_s *nextHash;
+} ref_script_t;
+
+static byte *r_shaderpool;
+static table_t *r_tablesHashTable[TABLES_HASH_SIZE];
+static ref_script_t *r_shaderCacheHash[SHADERS_HASH_SIZE];
+static ref_shader_t *r_shadersHash[SHADERS_HASH_SIZE];
+static table_t *r_tables[MAX_TABLES];
+static int r_numTables;
+ref_shader_t r_shaders[MAX_SHADERS];
+static int r_numShaders = 0;
typedef struct
{
@@ -42,21 +60,19 @@ typedef struct shadercache_s
struct shadercache_s *hash_next;
} shadercache_t;
-ref_shader_t r_shaders[MAX_SHADERS];
-int r_numShaders;
skydome_t *r_skydomes[MAX_SHADERS];
static char *shaderPaths;
static ref_shader_t *shaders_hash[SHADERS_HASH_SIZE];
-static shadercache_t *shadercache_hash[SHADERCACHE_HASH_SIZE];
+static shadercache_t *shadercache_hash[SHADERS_HASH_SIZE];
-static deformv_t r_currentDeforms[MAX_SHADER_DEFORMS];
-static ref_stage_t r_currentPasses[MAX_SHADER_STAGES];
-static float r_currentRGBgenArgs[MAX_SHADER_STAGES][3], r_currentAlphagenArgs[MAX_SHADER_STAGES][2];
-static waveFunc_t r_currentRGBgenFuncs[MAX_SHADER_STAGES], r_currentAlphagenFuncs[MAX_SHADER_STAGES];
-static tcmod_t r_currentTcmods[MAX_SHADER_STAGES][MAX_SHADER_TCMODS];
-static vec4_t r_currentTcGen[MAX_SHADER_STAGES][2];
-const char *r_skyBoxSuffix[6] = { "rt", "bk", "lf", "ft", "up", "dn" }; // FIXME: remove it
+static deform_t r_currentDeforms[MAX_SHADER_DEFORMS];
+static ref_stage_t r_currentPasses[MAX_SHADER_STAGES];
+static float r_currentRGBgenArgs[MAX_SHADER_STAGES][3], r_currentAlphagenArgs[MAX_SHADER_STAGES][2];
+static waveFunc_t r_currentRGBgenFuncs[MAX_SHADER_STAGES], r_currentAlphagenFuncs[MAX_SHADER_STAGES];
+static tcMod_t r_currentTcmods[MAX_SHADER_STAGES][MAX_SHADER_TCMODS];
+static vec4_t r_currentTcGen[MAX_SHADER_STAGES][2];
+const char *r_skyBoxSuffix[6] = { "rt", "bk", "lf", "ft", "up", "dn" }; // FIXME: get rid of this
static bool r_shaderNoMipMaps;
static bool r_shaderNoPicMip;
@@ -66,9 +82,9 @@ static bool r_shaderHasDlightPass;
byte *r_shadersmempool;
static bool Shader_Parsetok( ref_shader_t *shader, ref_stage_t *pass, const shaderkey_t *keys, const char *token, const char **ptr );
-static void Shader_MakeCache( bool silent, const char *filename );
+static void Shader_MakeCache( const char *filename );
static unsigned int Shader_GetCache( const char *name, shadercache_t **cache );
-#define Shader_FreePassCinematics(pass) if( (pass)->cin ) { R_FreeCinematics( (pass)->cin ); (pass)->cin = 0; }
+#define Shader_FreePassCinematics(pass) if( (pass)->cinHandle ) { R_FreeCinematics( (pass)->cinHandle ); (pass)->cinHandle = 0; }
//===========================================================================
// COM_Compress and Com_ParseExt it's temporary stuff
@@ -765,17 +781,17 @@ static void Shader_shaderNoCompress( ref_shader_t *shader, ref_stage_t *pass, co
static void Shader_DeformVertexes( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
{
- char *token;
- deformv_t *deformv;
+ char *token;
+ deform_t *deformv;
- if( shader->numdeforms == MAX_SHADER_DEFORMS )
+ if( shader->numDeforms == MAX_SHADER_DEFORMS )
{
MsgDev( D_WARN, "shader %s has too many deforms\n", shader->name );
Shader_SkipLine( ptr );
return;
}
- deformv = &r_currentDeforms[shader->numdeforms];
+ deformv = &r_currentDeforms[shader->numDeforms];
token = Shader_ParseString( ptr );
if( !strcmp( token, "wave" ) )
@@ -820,17 +836,16 @@ static void Shader_DeformVertexes( ref_shader_t *shader, ref_stage_t *pass, cons
deformv->type = DEFORM_PROJECTION_SHADOW;
else if( !strcmp( token, "autoparticle" ) )
deformv->type = DEFORM_AUTOPARTICLE;
-#ifdef HARDWARE_OUTLINES
+
else if( !strcmp( token, "outline" ) )
deformv->type = DEFORM_OUTLINE;
-#endif
else
{
Shader_SkipLine( ptr );
return;
}
- shader->numdeforms++;
+ shader->numDeforms++;
}
static void Shader_SkyParms( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
@@ -1180,7 +1195,7 @@ static void Shaderpass_VideoMap( ref_shader_t *shader, ref_stage_t *pass, const
token = Shader_ParseString( ptr );
- pass->cin = R_StartCinematics( token );
+ pass->cinHandle = R_StartCinematics( token );
pass->tcgen = TCGEN_BASE;
pass->animFrequency = 0;
pass->flags &= ~(SHADERSTAGE_LIGHTMAP|SHADERSTAGE_DLIGHT|SHADERSTAGE_PORTALMAP);
@@ -1392,10 +1407,10 @@ static void Shaderpass_Distortion( ref_shader_t *shader, ref_stage_t *pass, cons
}
}
- if( pass->rgbgen.type == RGBGEN_UNKNOWN )
+ if( pass->rgbGen.type == RGBGEN_UNKNOWN )
{
- pass->rgbgen.type = RGBGEN_CONST;
- VectorClear( pass->rgbgen.args );
+ pass->rgbGen.type = RGBGEN_CONST;
+ VectorClear( pass->rgbGen.args );
}
shader->flags |= SHADER_PORTAL|SHADER_PORTAL_CAPTURE;
@@ -1407,39 +1422,39 @@ static void Shaderpass_RGBGen( ref_shader_t *shader, ref_stage_t *pass, const ch
token = Shader_ParseString( ptr );
if( !strcmp( token, "identitylighting" ) )
- pass->rgbgen.type = RGBGEN_IDENTITY_LIGHTING;
+ pass->rgbGen.type = RGBGEN_IDENTITY_LIGHTING;
else if( !strcmp( token, "identity" ) )
- pass->rgbgen.type = RGBGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
else if( !strcmp( token, "wave" ) )
{
- pass->rgbgen.type = RGBGEN_WAVE;
- pass->rgbgen.args[0] = 1.0f;
- pass->rgbgen.args[1] = 1.0f;
- pass->rgbgen.args[2] = 1.0f;
- Shader_ParseFunc( ptr, pass->rgbgen.func );
+ pass->rgbGen.type = RGBGEN_WAVE;
+ pass->rgbGen.args[0] = 1.0f;
+ pass->rgbGen.args[1] = 1.0f;
+ pass->rgbGen.args[2] = 1.0f;
+ Shader_ParseFunc( ptr, pass->rgbGen.func );
}
else if( !strcmp( token, "colorwave" ) )
{
- pass->rgbgen.type = RGBGEN_WAVE;
- Shader_ParseVector( ptr, pass->rgbgen.args, 3 );
- Shader_ParseFunc( ptr, pass->rgbgen.func );
+ pass->rgbGen.type = RGBGEN_WAVE;
+ Shader_ParseVector( ptr, pass->rgbGen.args, 3 );
+ Shader_ParseFunc( ptr, pass->rgbGen.func );
}
else if( !strcmp( token, "entity" ) )
- pass->rgbgen.type = RGBGEN_ENTITY;
+ pass->rgbGen.type = RGBGEN_ENTITY;
else if( !strcmp( token, "oneminusentity" ) )
- pass->rgbgen.type = RGBGEN_ONE_MINUS_ENTITY;
+ pass->rgbGen.type = RGBGEN_ONE_MINUS_ENTITY;
else if( !strcmp( token, "vertex" ) )
- pass->rgbgen.type = RGBGEN_VERTEX;
+ pass->rgbGen.type = RGBGEN_VERTEX;
else if( !strcmp( token, "oneminusvertex" ) )
- pass->rgbgen.type = RGBGEN_ONE_MINUS_VERTEX;
+ pass->rgbGen.type = RGBGEN_ONE_MINUS_VERTEX;
else if( !strcmp( token, "lightingdiffuse" ) )
- pass->rgbgen.type = RGBGEN_LIGHTING_DIFFUSE;
+ pass->rgbGen.type = RGBGEN_LIGHTING_DIFFUSE;
else if( !strcmp( token, "lightingdiffuseonly" ) )
- pass->rgbgen.type = RGBGEN_LIGHTING_DIFFUSE_ONLY;
+ pass->rgbGen.type = RGBGEN_LIGHTING_DIFFUSE_ONLY;
else if( !strcmp( token, "lightingambientonly" ) )
- pass->rgbgen.type = RGBGEN_LIGHTING_AMBIENT_ONLY;
+ pass->rgbGen.type = RGBGEN_LIGHTING_AMBIENT_ONLY;
else if( !strcmp( token, "exactvertex" ) )
- pass->rgbgen.type = RGBGEN_EXACT_VERTEX;
+ pass->rgbGen.type = RGBGEN_EXACT_VERTEX;
else if( !strcmp( token, "const" ) || !strcmp( token, "constant" ) )
{
float div;
@@ -1450,18 +1465,18 @@ static void Shaderpass_RGBGen( ref_shader_t *shader, ref_stage_t *pass, const ch
else
div = 1.0f;
- pass->rgbgen.type = RGBGEN_CONST;
+ pass->rgbGen.type = RGBGEN_CONST;
Shader_ParseVector( ptr, color, 3 );
- ColorNormalize( color, pass->rgbgen.args );
- VectorScale( pass->rgbgen.args, div, pass->rgbgen.args );
+ ColorNormalize( color, pass->rgbGen.args );
+ VectorScale( pass->rgbGen.args, div, pass->rgbGen.args );
}
else if( !strcmp( token, "custom" ) || !strcmp( token, "teamcolor" ) )
{
// the "teamcolor" thing comes from warsow
- pass->rgbgen.type = RGBGEN_CUSTOM;
- pass->rgbgen.args[0] = (int)Shader_ParseFloat( ptr );
- if( pass->rgbgen.args[0] < 0 || pass->rgbgen.args[0] >= NUM_CUSTOMCOLORS )
- pass->rgbgen.args[0] = 0;
+ pass->rgbGen.type = RGBGEN_CUSTOM;
+ pass->rgbGen.args[0] = (int)Shader_ParseFloat( ptr );
+ if( pass->rgbGen.args[0] < 0 || pass->rgbGen.args[0] >= NUM_CUSTOMCOLORS )
+ pass->rgbGen.args[0] = 0;
}
}
@@ -1472,50 +1487,50 @@ static void Shaderpass_AlphaGen( ref_shader_t *shader, ref_stage_t *pass, const
token = Shader_ParseString( ptr );
if( !strcmp( token, "portal" ) )
{
- pass->alphagen.type = ALPHAGEN_PORTAL;
- pass->alphagen.args[0] = fabs( Shader_ParseFloat( ptr ) );
- if( !pass->alphagen.args[0] )
- pass->alphagen.args[0] = 256;
- pass->alphagen.args[0] = 1.0f / pass->alphagen.args[0];
+ pass->alphaGen.type = ALPHAGEN_PORTAL;
+ pass->alphaGen.args[0] = fabs( Shader_ParseFloat( ptr ) );
+ if( !pass->alphaGen.args[0] )
+ pass->alphaGen.args[0] = 256;
+ pass->alphaGen.args[0] = 1.0f / pass->alphaGen.args[0];
}
else if( !strcmp( token, "vertex" ) )
- pass->alphagen.type = ALPHAGEN_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_VERTEX;
else if( !strcmp( token, "oneminusvertex" ) )
- pass->alphagen.type = ALPHAGEN_ONE_MINUS_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_ONE_MINUS_VERTEX;
else if( !strcmp( token, "entity" ) )
- pass->alphagen.type = ALPHAGEN_ENTITY;
+ pass->alphaGen.type = ALPHAGEN_ENTITY;
else if( !strcmp( token, "wave" ) )
{
- pass->alphagen.type = ALPHAGEN_WAVE;
- Shader_ParseFunc( ptr, pass->alphagen.func );
+ pass->alphaGen.type = ALPHAGEN_WAVE;
+ Shader_ParseFunc( ptr, pass->alphaGen.func );
}
else if( !strcmp( token, "lightingspecular" ) )
{
- pass->alphagen.type = ALPHAGEN_SPECULAR;
- pass->alphagen.args[0] = fabs( Shader_ParseFloat( ptr ) );
- if( !pass->alphagen.args[0] )
- pass->alphagen.args[0] = 5.0f;
+ pass->alphaGen.type = ALPHAGEN_SPECULAR;
+ pass->alphaGen.args[0] = fabs( Shader_ParseFloat( ptr ) );
+ if( !pass->alphaGen.args[0] )
+ pass->alphaGen.args[0] = 5.0f;
}
else if( !strcmp( token, "const" ) || !strcmp( token, "constant" ) )
{
- pass->alphagen.type = ALPHAGEN_CONST;
- pass->alphagen.args[0] = fabs( Shader_ParseFloat( ptr ) );
+ pass->alphaGen.type = ALPHAGEN_CONST;
+ pass->alphaGen.args[0] = fabs( Shader_ParseFloat( ptr ) );
}
else if( !strcmp( token, "dot" ) )
{
- pass->alphagen.type = ALPHAGEN_DOT;
- pass->alphagen.args[0] = fabs( Shader_ParseFloat( ptr ) );
- pass->alphagen.args[1] = fabs( Shader_ParseFloat( ptr ) );
- if( !pass->alphagen.args[1] )
- pass->alphagen.args[1] = 1.0f;
+ pass->alphaGen.type = ALPHAGEN_DOT;
+ pass->alphaGen.args[0] = fabs( Shader_ParseFloat( ptr ) );
+ pass->alphaGen.args[1] = fabs( Shader_ParseFloat( ptr ) );
+ if( !pass->alphaGen.args[1] )
+ pass->alphaGen.args[1] = 1.0f;
}
else if( !strcmp( token, "oneminusdot" ) )
{
- pass->alphagen.type = ALPHAGEN_ONE_MINUS_DOT;
- pass->alphagen.args[0] = fabs( Shader_ParseFloat( ptr ) );
- pass->alphagen.args[1] = fabs( Shader_ParseFloat( ptr ) );
- if( !pass->alphagen.args[1] )
- pass->alphagen.args[1] = 1.0f;
+ pass->alphaGen.type = ALPHAGEN_ONE_MINUS_DOT;
+ pass->alphaGen.args[0] = fabs( Shader_ParseFloat( ptr ) );
+ pass->alphaGen.args[1] = fabs( Shader_ParseFloat( ptr ) );
+ if( !pass->alphaGen.args[1] )
+ pass->alphaGen.args[1] = 1.0f;
}
}
@@ -1567,17 +1582,17 @@ static void Shaderpass_BlendFunc( ref_shader_t *shader, ref_stage_t *pass, const
token = Shader_ParseString( ptr );
- pass->flags &= ~(GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK);
- if( !strcmp( token, "blend" ) )
- pass->flags |= GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ pass->glState &= ~(GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK);
+ if( !strcmp( token, "blend" ))
+ pass->glState |= GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
else if( !strcmp( token, "filter" ) )
- pass->flags |= GLSTATE_SRCBLEND_DST_COLOR|GLSTATE_DSTBLEND_ZERO;
+ pass->glState |= GLSTATE_SRCBLEND_DST_COLOR|GLSTATE_DSTBLEND_ZERO;
else if( !strcmp( token, "add" ) )
- pass->flags |= GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ pass->glState |= GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
else
{
- pass->flags |= Shaderpass_SrcBlendBits( token );
- pass->flags |= Shaderpass_DstBlendBits( Shader_ParseString( ptr ) );
+ pass->glState |= Shaderpass_SrcBlendBits( token );
+ pass->glState |= Shaderpass_DstBlendBits( Shader_ParseString( ptr ));
}
}
@@ -1587,13 +1602,13 @@ static void Shaderpass_AlphaFunc( ref_shader_t *shader, ref_stage_t *pass, const
token = Shader_ParseString( ptr );
- pass->flags &= ~(GLSTATE_ALPHAFUNC);
+ pass->glState &= ~(GLSTATE_ALPHAFUNC);
if( !strcmp( token, "gt0" ) )
- pass->flags |= GLSTATE_AFUNC_GT0;
+ pass->glState |= GLSTATE_AFUNC_GT0;
else if( !strcmp( token, "lt128" ) )
- pass->flags |= GLSTATE_AFUNC_LT128;
+ pass->glState |= GLSTATE_AFUNC_LT128;
else if( !strcmp( token, "ge128" ) )
- pass->flags |= GLSTATE_AFUNC_GE128;
+ pass->glState |= GLSTATE_AFUNC_GE128;
}
static void Shaderpass_DepthFunc( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
@@ -1602,31 +1617,31 @@ static void Shaderpass_DepthFunc( ref_shader_t *shader, ref_stage_t *pass, const
token = Shader_ParseString( ptr );
- pass->flags &= ~GLSTATE_DEPTHFUNC_EQ;
- if( !strcmp( token, "equal" ) )
- pass->flags |= GLSTATE_DEPTHFUNC_EQ;
+ pass->glState &= ~GLSTATE_DEPTHFUNC_EQ;
+ if( !strcmp( token, "equal" ))
+ pass->glState |= GLSTATE_DEPTHFUNC_EQ;
}
static void Shaderpass_DepthWrite( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
{
shader->flags |= SHADER_DEPTHWRITE;
- pass->flags |= GLSTATE_DEPTHWRITE;
+ pass->glState |= GLSTATE_DEPTHWRITE;
}
static void Shaderpass_TcMod( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
{
- int i;
- tcmod_t *tcmod;
- char *token;
+ int i;
+ tcMod_t *tcmod;
+ char *token;
- if( pass->numtcmods == MAX_SHADER_TCMODS )
+ if( pass->numtcMods == MAX_SHADER_TCMODS )
{
MsgDev( D_WARN, "shader %s has too many tcmods\n", shader->name );
Shader_SkipLine( ptr );
return;
}
- tcmod = &pass->tcmods[pass->numtcmods];
+ tcmod = &pass->tcMods[pass->numtcMods];
token = Shader_ParseString( ptr );
if( !strcmp( token, "rotate" ) )
@@ -1675,7 +1690,7 @@ static void Shaderpass_TcMod( ref_shader_t *shader, ref_stage_t *pass, const cha
return;
}
- r_currentPasses[shader->numpasses].numtcmods++;
+ r_currentPasses[shader->num_stages].numtcMods++;
}
static void Shaderpass_TcGen( ref_shader_t *shader, ref_stage_t *pass, const char **ptr )
@@ -1750,7 +1765,7 @@ void R_ShaderList_f( void )
Msg( "------------------\n" );
for( i = 0, shader = r_shaders; i < r_numShaders; i++, shader++ )
- Msg( " %2i %2i: %s\n", shader->numpasses, shader->sort, shader->name );
+ Msg( " %2i %2i: %s\n", shader->num_stages, shader->sort, shader->name );
Msg( "%i shaders total\n", r_numShaders );
}
@@ -1797,14 +1812,11 @@ void R_ShaderDump_f( void )
cache->buffer[ptr - cache->buffer] = backup;
}
-void R_InitShaders( bool silent )
+void R_InitShaders( void )
{
search_t *t;
int i;
- if( !silent )
- Msg( "Initializing Shaders:\n" );
-
r_shadersmempool = Mem_AllocPool( "Shaders" );
t = FS_Search( "scripts/*.shader", true );
@@ -1814,16 +1826,15 @@ void R_InitShaders( bool silent )
Host_Error( "Could not find any shaders!\n" );
}
- Mem_Set( shadercache_hash, 0, sizeof( shadercache_t * )*SHADERCACHE_HASH_SIZE );
+ Mem_Set( shadercache_hash, 0, sizeof( shadercache_t * )*SHADERS_HASH_SIZE );
for( i = 0; i < t->numfilenames; i++ )
- Shader_MakeCache( silent, t->filenames[i] );
+ Shader_MakeCache( t->filenames[i] );
- if( !silent ) Msg( "--------------------------------------\n\n" );
if( t ) Mem_Free( t );
}
-static void Shader_MakeCache( bool silent, const char *filename )
+static void Shader_MakeCache( const char *filename )
{
int size;
uint key;
@@ -1833,9 +1844,6 @@ static void Shader_MakeCache( bool silent, const char *filename )
byte *cacheMemBuf;
size_t cacheMemSize;
- if( !silent )
- Msg( "...loading '%s'\n", filename );
-
temp = FS_LoadFile( filename, &size );
if( !temp || size <= 0 ) goto done;
@@ -1902,7 +1910,7 @@ static unsigned int Shader_GetCache( const char *name, shadercache_t **cache )
*cache = NULL;
- key = Com_HashKey( name, SHADERCACHE_HASH_SIZE );
+ key = Com_HashKey( name, SHADERS_HASH_SIZE );
for( c = shadercache_hash[key]; c; c = c->hash_next )
{
if( !com.stricmp( c->name, name ) )
@@ -1930,10 +1938,9 @@ void Shader_FreeShader( ref_shader_t *shader )
if( shader->flags & SHADER_VIDEOMAP )
{
- for( i = 0, pass = shader->passes; i < shader->numpasses; i++, pass++ )
+ for( i = 0, pass = shader->stages; i < shader->num_stages; i++, pass++ )
Shader_FreePassCinematics( pass );
}
-
Shader_Free( shader->name );
}
@@ -1964,24 +1971,23 @@ void Shader_SetBlendmode( ref_stage_t *pass )
if( pass->flags & SHADERSTAGE_BLENDMODE )
return;
- if( !pass->textures[0] && !( pass->flags & ( SHADERSTAGE_LIGHTMAP|SHADERSTAGE_DLIGHT ) ) )
+ if( !pass->textures[0] && !( pass->flags & ( SHADERSTAGE_LIGHTMAP|SHADERSTAGE_DLIGHT )))
return;
- if( !( pass->flags & ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK ) ) )
+ if(!( pass->glState & (GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK)))
{
- if( ( pass->rgbgen.type == RGBGEN_IDENTITY ) && ( pass->alphagen.type == ALPHAGEN_IDENTITY ) )
+ if(( pass->rgbGen.type == RGBGEN_IDENTITY ) && ( pass->alphaGen.type == ALPHAGEN_IDENTITY ))
pass->flags |= SHADERSTAGE_BLEND_REPLACE;
- else
- pass->flags |= SHADERSTAGE_BLEND_MODULATE;
+ else pass->flags |= SHADERSTAGE_BLEND_MODULATE;
return;
}
- blendsrc = pass->flags & GLSTATE_SRCBLEND_MASK;
- blenddst = pass->flags & GLSTATE_DSTBLEND_MASK;
+ blendsrc = pass->glState & GLSTATE_SRCBLEND_MASK;
+ blenddst = pass->glState & GLSTATE_DSTBLEND_MASK;
if( blendsrc == GLSTATE_SRCBLEND_ONE && blenddst == GLSTATE_DSTBLEND_ZERO )
pass->flags |= SHADERSTAGE_BLEND_MODULATE;
- else if( ( blendsrc == GLSTATE_SRCBLEND_ZERO && blenddst == GLSTATE_DSTBLEND_SRC_COLOR ) || ( blendsrc == GLSTATE_SRCBLEND_DST_COLOR && blenddst == GLSTATE_DSTBLEND_ZERO ) )
+ else if(( blendsrc == GLSTATE_SRCBLEND_ZERO && blenddst == GLSTATE_DSTBLEND_SRC_COLOR ) || ( blendsrc == GLSTATE_SRCBLEND_DST_COLOR && blenddst == GLSTATE_DSTBLEND_ZERO ))
pass->flags |= SHADERSTAGE_BLEND_MODULATE;
else if( blendsrc == GLSTATE_SRCBLEND_ONE && blenddst == GLSTATE_DSTBLEND_ONE )
pass->flags |= SHADERSTAGE_BLEND_ADD;
@@ -1991,7 +1997,7 @@ void Shader_SetBlendmode( ref_stage_t *pass )
static void Shader_Readpass( ref_shader_t *shader, const char **ptr )
{
- int n = shader->numpasses;
+ int n = shader->num_stages;
const char *token;
ref_stage_t *pass;
@@ -2011,15 +2017,15 @@ static void Shader_Readpass( ref_shader_t *shader, const char **ptr )
// Set defaults
pass = &r_currentPasses[n];
memset( pass, 0, sizeof( ref_stage_t ) );
- pass->rgbgen.type = RGBGEN_UNKNOWN;
- pass->rgbgen.args = r_currentRGBgenArgs[n];
- pass->rgbgen.func = &r_currentRGBgenFuncs[n];
- pass->alphagen.type = ALPHAGEN_UNKNOWN;
- pass->alphagen.args = r_currentAlphagenArgs[n];
- pass->alphagen.func = &r_currentAlphagenFuncs[n];
+ pass->rgbGen.type = RGBGEN_UNKNOWN;
+ pass->rgbGen.args = r_currentRGBgenArgs[n];
+ pass->rgbGen.func = &r_currentRGBgenFuncs[n];
+ pass->alphaGen.type = ALPHAGEN_UNKNOWN;
+ pass->alphaGen.args = r_currentAlphagenArgs[n];
+ pass->alphaGen.func = &r_currentAlphagenFuncs[n];
pass->tcgenVec = r_currentTcGen[n][0];
pass->tcgen = TCGEN_BASE;
- pass->tcmods = r_currentTcmods[n];
+ pass->tcMods = r_currentTcmods[n];
while( ptr )
{
@@ -2033,19 +2039,18 @@ static void Shader_Readpass( ref_shader_t *shader, const char **ptr )
break;
}
- if( ( ( pass->flags & GLSTATE_SRCBLEND_MASK ) == GLSTATE_SRCBLEND_ONE )
- && ( ( pass->flags & GLSTATE_DSTBLEND_MASK ) == GLSTATE_DSTBLEND_ZERO ) )
+ if((( pass->glState & GLSTATE_SRCBLEND_MASK ) == GLSTATE_SRCBLEND_ONE ) && (( pass->glState & GLSTATE_DSTBLEND_MASK ) == GLSTATE_DSTBLEND_ZERO ))
{
- pass->flags &= ~( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK );
+ pass->glState &= ~(GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK);
pass->flags |= SHADERSTAGE_BLEND_MODULATE;
}
- if( !( pass->flags & ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK ) ) )
- pass->flags |= GLSTATE_DEPTHWRITE;
- if( pass->flags & GLSTATE_DEPTHWRITE )
+ if(!( pass->glState & (GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK)))
+ pass->glState |= GLSTATE_DEPTHWRITE;
+ if( pass->glState & GLSTATE_DEPTHWRITE )
shader->flags |= SHADER_DEPTHWRITE;
- switch( pass->rgbgen.type )
+ switch( pass->rgbGen.type )
{
case RGBGEN_IDENTITY_LIGHTING:
case RGBGEN_IDENTITY:
@@ -2056,20 +2061,16 @@ static void Shader_Readpass( ref_shader_t *shader, const char **ptr )
case RGBGEN_LIGHTING_DIFFUSE_ONLY:
case RGBGEN_LIGHTING_AMBIENT_ONLY:
case RGBGEN_CUSTOM:
-#ifdef HARDWARE_OUTLINES
case RGBGEN_OUTLINE:
-#endif
case RGBGEN_UNKNOWN: // assume RGBGEN_IDENTITY or RGBGEN_IDENTITY_LIGHTING
- switch( pass->alphagen.type )
+ switch( pass->alphaGen.type )
{
case ALPHAGEN_UNKNOWN:
case ALPHAGEN_IDENTITY:
case ALPHAGEN_CONST:
case ALPHAGEN_WAVE:
case ALPHAGEN_ENTITY:
-#ifdef HARDWARE_OUTLINES
case ALPHAGEN_OUTLINE:
-#endif
pass->flags |= SHADERSTAGE_NOCOLORARRAY;
break;
default:
@@ -2081,13 +2082,12 @@ static void Shader_Readpass( ref_shader_t *shader, const char **ptr )
break;
}
- if( ( shader->flags & SHADER_SKYPARMS ) && ( shader->flags & SHADER_DEPTHWRITE ) )
+ if(( shader->flags & SHADER_SKYPARMS ) && ( shader->flags & SHADER_DEPTHWRITE ))
{
- if( pass->flags & GLSTATE_DEPTHWRITE )
- pass->flags &= ~GLSTATE_DEPTHWRITE;
+ if( pass->glState & GLSTATE_DEPTHWRITE )
+ pass->glState &= ~GLSTATE_DEPTHWRITE;
}
-
- shader->numpasses++;
+ shader->num_stages++;
}
static bool Shader_Parsetok( ref_shader_t *shader, ref_stage_t *pass, const shaderkey_t *keys, const char *token, const char **ptr )
@@ -2119,12 +2119,12 @@ void Shader_SetFeatures( ref_shader_t *s )
int i;
ref_stage_t *pass;
- if( s->numdeforms )
+ if( s->numDeforms )
s->features |= MF_DEFORMVS;
if( s->flags & SHADER_AUTOSPRITE )
s->features |= MF_NOCULL;
- for( i = 0; i < s->numdeforms; i++ )
+ for( i = 0; i < s->numDeforms; i++ )
{
switch( s->deforms[i].type )
{
@@ -2141,12 +2141,12 @@ void Shader_SetFeatures( ref_shader_t *s )
}
}
- for( i = 0, pass = s->passes; i < s->numpasses; i++, pass++ )
+ for( i = 0, pass = s->stages; i < s->num_stages; i++, pass++ )
{
if( pass->program && ( pass->program_type == PROGRAM_TYPE_MATERIAL || pass->program_type == PROGRAM_TYPE_DISTORTION ) )
s->features |= MF_NORMALS|MF_SVECTORS|MF_LMCOORDS|MF_ENABLENORMALS;
- switch( pass->rgbgen.type )
+ switch( pass->rgbGen.type )
{
case RGBGEN_LIGHTING_DIFFUSE:
s->features |= MF_NORMALS;
@@ -2158,7 +2158,7 @@ void Shader_SetFeatures( ref_shader_t *s )
break;
}
- switch( pass->alphagen.type )
+ switch( pass->alphaGen.type )
{
case ALPHAGEN_SPECULAR:
case ALPHAGEN_DOT:
@@ -2192,55 +2192,54 @@ void Shader_SetFeatures( ref_shader_t *s )
void Shader_Finish( ref_shader_t *s )
{
- int i, j;
- const char *oldname = s->name;
- size_t size = strlen( oldname ) + 1;
- ref_stage_t *pass;
- byte *buffer;
+ int i, j;
+ const char *oldname = s->name;
+ size_t size = com.strlen( oldname ) + 1;
+ ref_stage_t *pass;
+ byte *buffer;
// if the portal capture texture hasn't been initialized yet, do that
- if( ( s->flags & SHADER_PORTAL_CAPTURE1 ) && !tr.portaltexture1 )
+ if(( s->flags & SHADER_PORTAL_CAPTURE1 ) && !tr.portaltexture1 )
R_InitPortalTexture( &tr.portaltexture1, 1, glState.width, glState.height );
- if( ( s->flags & SHADER_PORTAL_CAPTURE2 ) && !tr.portaltexture2 )
+ if(( s->flags & SHADER_PORTAL_CAPTURE2 ) && !tr.portaltexture2 )
R_InitPortalTexture( &tr.portaltexture2, 2, glState.width, glState.height );
- if( !s->numpasses && !s->sort )
+ if( !s->num_stages && !s->sort )
{
- if( s->numdeforms )
+ if( s->numDeforms )
{
- s->deforms = Shader_Malloc( s->numdeforms * sizeof( deformv_t ) );
- memcpy( s->deforms, r_currentDeforms, s->numdeforms * sizeof( deformv_t ) );
+ s->deforms = Shader_Malloc( s->numDeforms * sizeof( deform_t ));
+ memcpy( s->deforms, r_currentDeforms, s->numDeforms * sizeof( deform_t ));
}
if( s->flags & SHADER_PORTAL )
s->sort = SORT_PORTAL;
- else
- s->sort = SORT_ADDITIVE;
+ else s->sort = SORT_ADDITIVE;
}
if( ( s->flags & SHADER_POLYGONOFFSET ) && !s->sort )
s->sort = SORT_DECAL;
- size += s->numdeforms * sizeof( deformv_t ) + s->numpasses * sizeof( ref_stage_t );
- for( i = 0, pass = r_currentPasses; i < s->numpasses; i++, pass++ )
+ size += s->numDeforms * sizeof( deform_t ) + s->num_stages * sizeof( ref_stage_t );
+ for( i = 0, pass = r_currentPasses; i < s->num_stages; i++, pass++ )
{
// rgbgen args
- if( pass->rgbgen.type == RGBGEN_WAVE ||
- pass->rgbgen.type == RGBGEN_CONST ||
- pass->rgbgen.type == RGBGEN_CUSTOM )
+ if( pass->rgbGen.type == RGBGEN_WAVE ||
+ pass->rgbGen.type == RGBGEN_CONST ||
+ pass->rgbGen.type == RGBGEN_CUSTOM )
size += sizeof( float ) * 3;
// alphagen args
- if( pass->alphagen.type == ALPHAGEN_PORTAL ||
- pass->alphagen.type == ALPHAGEN_SPECULAR ||
- pass->alphagen.type == ALPHAGEN_CONST ||
- pass->alphagen.type == ALPHAGEN_DOT || pass->alphagen.type == ALPHAGEN_ONE_MINUS_DOT )
+ if( pass->alphaGen.type == ALPHAGEN_PORTAL ||
+ pass->alphaGen.type == ALPHAGEN_SPECULAR ||
+ pass->alphaGen.type == ALPHAGEN_CONST ||
+ pass->alphaGen.type == ALPHAGEN_DOT || pass->alphaGen.type == ALPHAGEN_ONE_MINUS_DOT )
size += sizeof( float ) * 2;
- if( pass->rgbgen.type == RGBGEN_WAVE )
+ if( pass->rgbGen.type == RGBGEN_WAVE )
size += sizeof( waveFunc_t );
- if( pass->alphagen.type == ALPHAGEN_WAVE )
+ if( pass->alphaGen.type == ALPHAGEN_WAVE )
size += sizeof( waveFunc_t );
- size += pass->numtcmods * sizeof( tcmod_t );
+ size += pass->numtcMods * sizeof( tcMod_t );
if( pass->tcgen == TCGEN_VECTOR )
size += sizeof( vec4_t ) * 2;
}
@@ -2248,55 +2247,55 @@ void Shader_Finish( ref_shader_t *s )
buffer = Shader_Malloc( size );
s->name = ( char * )buffer; buffer += strlen( oldname ) + 1;
- s->passes = ( ref_stage_t * )buffer; buffer += s->numpasses * sizeof( ref_stage_t );
+ s->stages = ( ref_stage_t * )buffer; buffer += s->num_stages * sizeof( ref_stage_t );
strcpy( s->name, oldname );
- memcpy( s->passes, r_currentPasses, s->numpasses * sizeof( ref_stage_t ) );
+ memcpy( s->stages, r_currentPasses, s->num_stages * sizeof( ref_stage_t ) );
- for( i = 0, pass = s->passes; i < s->numpasses; i++, pass++ )
+ for( i = 0, pass = s->stages; i < s->num_stages; i++, pass++ )
{
- if( pass->rgbgen.type == RGBGEN_WAVE ||
- pass->rgbgen.type == RGBGEN_CONST ||
- pass->rgbgen.type == RGBGEN_CUSTOM )
+ if( pass->rgbGen.type == RGBGEN_WAVE ||
+ pass->rgbGen.type == RGBGEN_CONST ||
+ pass->rgbGen.type == RGBGEN_CUSTOM )
{
- pass->rgbgen.args = ( float * )buffer; buffer += sizeof( float ) * 3;
- memcpy( pass->rgbgen.args, r_currentPasses[i].rgbgen.args, sizeof( float ) * 3 );
+ pass->rgbGen.args = ( float * )buffer; buffer += sizeof( float ) * 3;
+ memcpy( pass->rgbGen.args, r_currentPasses[i].rgbGen.args, sizeof( float ) * 3 );
}
- if( pass->alphagen.type == ALPHAGEN_PORTAL ||
- pass->alphagen.type == ALPHAGEN_SPECULAR ||
- pass->alphagen.type == ALPHAGEN_CONST ||
- pass->alphagen.type == ALPHAGEN_DOT || pass->alphagen.type == ALPHAGEN_ONE_MINUS_DOT )
+ if( pass->alphaGen.type == ALPHAGEN_PORTAL ||
+ pass->alphaGen.type == ALPHAGEN_SPECULAR ||
+ pass->alphaGen.type == ALPHAGEN_CONST ||
+ pass->alphaGen.type == ALPHAGEN_DOT || pass->alphaGen.type == ALPHAGEN_ONE_MINUS_DOT )
{
- pass->alphagen.args = ( float * )buffer; buffer += sizeof( float ) * 2;
- memcpy( pass->alphagen.args, r_currentPasses[i].alphagen.args, sizeof( float ) * 2 );
+ pass->alphaGen.args = ( float * )buffer; buffer += sizeof( float ) * 2;
+ memcpy( pass->alphaGen.args, r_currentPasses[i].alphaGen.args, sizeof( float ) * 2 );
}
- if( pass->rgbgen.type == RGBGEN_WAVE )
+ if( pass->rgbGen.type == RGBGEN_WAVE )
{
- pass->rgbgen.func = ( waveFunc_t * )buffer; buffer += sizeof( waveFunc_t );
- memcpy( pass->rgbgen.func, r_currentPasses[i].rgbgen.func, sizeof( waveFunc_t ) );
+ pass->rgbGen.func = ( waveFunc_t * )buffer; buffer += sizeof( waveFunc_t );
+ memcpy( pass->rgbGen.func, r_currentPasses[i].rgbGen.func, sizeof( waveFunc_t ) );
}
else
{
- pass->rgbgen.func = NULL;
+ pass->rgbGen.func = NULL;
}
- if( pass->alphagen.type == ALPHAGEN_WAVE )
+ if( pass->alphaGen.type == ALPHAGEN_WAVE )
{
- pass->alphagen.func = ( waveFunc_t * )buffer; buffer += sizeof( waveFunc_t );
- memcpy( pass->alphagen.func, r_currentPasses[i].alphagen.func, sizeof( waveFunc_t ) );
+ pass->alphaGen.func = ( waveFunc_t * )buffer; buffer += sizeof( waveFunc_t );
+ memcpy( pass->alphaGen.func, r_currentPasses[i].alphaGen.func, sizeof( waveFunc_t ) );
}
else
{
- pass->alphagen.func = NULL;
+ pass->alphaGen.func = NULL;
}
- if( pass->numtcmods )
+ if( pass->numtcMods )
{
- pass->tcmods = ( tcmod_t * )buffer; buffer += r_currentPasses[i].numtcmods * sizeof( tcmod_t );
- pass->numtcmods = r_currentPasses[i].numtcmods;
- memcpy( pass->tcmods, r_currentPasses[i].tcmods, r_currentPasses[i].numtcmods * sizeof( tcmod_t ) );
+ pass->tcMods = ( tcMod_t * )buffer; buffer += r_currentPasses[i].numtcMods * sizeof( tcMod_t );
+ pass->numtcMods = r_currentPasses[i].numtcMods;
+ Mem_Copy( pass->tcMods, r_currentPasses[i].tcMods, r_currentPasses[i].numtcMods * sizeof( tcMod_t ) );
}
if( pass->tcgen == TCGEN_VECTOR )
@@ -2307,10 +2306,10 @@ void Shader_Finish( ref_shader_t *s )
}
}
- if( s->numdeforms )
+ if( s->numDeforms )
{
- s->deforms = ( deformv_t * )buffer;
- memcpy( s->deforms, r_currentDeforms, s->numdeforms * sizeof( deformv_t ) );
+ s->deforms = ( deform_t * )buffer;
+ Mem_Copy( s->deforms, r_currentDeforms, s->numDeforms * sizeof( deform_t ));
}
if( s->flags & SHADER_AUTOSPRITE )
@@ -2318,108 +2317,103 @@ void Shader_Finish( ref_shader_t *s )
if( r_shaderHasDlightPass )
s->flags |= SHADER_NO_MODULATIVE_DLIGHTS;
- for( i = 0, pass = s->passes; i < s->numpasses; i++, pass++ )
+ for( i = 0, pass = s->stages; i < s->num_stages; i++, pass++ )
{
- if( pass->cin )
+ if( pass->cinHandle )
s->flags |= SHADER_VIDEOMAP;
if( pass->flags & SHADERSTAGE_LIGHTMAP )
- s->flags |= SHADER_LIGHTMAP;
+ s->flags |= SHADER_HASLIGHTMAP;
if( pass->program )
{
s->flags |= SHADER_NO_MODULATIVE_DLIGHTS;
if( pass->program_type == PROGRAM_TYPE_MATERIAL )
s->flags |= SHADER_MATERIAL;
if( r_shaderHasDlightPass )
- pass->textures[5] = ( (texture_t *)1 ); // no dlights (HACK HACK HACK)
+ pass->textures[5] = ( (texture_t *)1); // HACKHACK no dlights
}
Shader_SetBlendmode( pass );
}
- for( i = 0, pass = s->passes; i < s->numpasses; i++, pass++ )
+ for( i = 0, pass = s->stages; i < s->num_stages; i++, pass++ )
{
- if( !( pass->flags & ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK ) ) )
+ if( !( pass->glState & ( GLSTATE_SRCBLEND_MASK|GLSTATE_DSTBLEND_MASK )))
break;
}
// all passes have blendfuncs
- if( i == s->numpasses )
+ if( i == s->num_stages )
{
int opaque;
opaque = -1;
- for( i = 0, pass = s->passes; i < s->numpasses; i++, pass++ )
+ for( i = 0, pass = s->stages; i < s->num_stages; i++, pass++ )
{
- if( ( ( pass->flags & GLSTATE_SRCBLEND_MASK ) == GLSTATE_SRCBLEND_ONE )
- && ( ( pass->flags & GLSTATE_DSTBLEND_MASK ) == GLSTATE_DSTBLEND_ZERO ) )
+ if((( pass->glState & GLSTATE_SRCBLEND_MASK ) == GLSTATE_SRCBLEND_ONE ) && (( pass->glState & GLSTATE_DSTBLEND_MASK ) == GLSTATE_DSTBLEND_ZERO ))
opaque = i;
- if( pass->rgbgen.type == RGBGEN_UNKNOWN )
+ if( pass->rgbGen.type == RGBGEN_UNKNOWN )
{
- if( !s->fog_dist && !( pass->flags & SHADERSTAGE_LIGHTMAP ) )
- pass->rgbgen.type = RGBGEN_IDENTITY_LIGHTING;
- else
- pass->rgbgen.type = RGBGEN_IDENTITY;
+ if( !s->fog_dist && !( pass->flags & SHADERSTAGE_LIGHTMAP ))
+ pass->rgbGen.type = RGBGEN_IDENTITY_LIGHTING;
+ else pass->rgbGen.type = RGBGEN_IDENTITY;
}
- if( pass->alphagen.type == ALPHAGEN_UNKNOWN )
+ if( pass->alphaGen.type == ALPHAGEN_UNKNOWN )
{
- if( pass->rgbgen.type == RGBGEN_VERTEX /* || pass->rgbgen.type == RGBGEN_EXACT_VERTEX*/ )
- pass->alphagen.type = ALPHAGEN_VERTEX;
+ if( pass->rgbGen.type == RGBGEN_VERTEX /* || pass->rgbGen.type == RGBGEN_EXACT_VERTEX*/ )
+ pass->alphaGen.type = ALPHAGEN_VERTEX;
else
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
}
}
- if( !( s->flags & SHADER_SKYPARMS ) && !s->sort )
+ if(!( s->flags & SHADER_SKYPARMS ) && !s->sort )
{
- if( s->flags & SHADER_DEPTHWRITE || ( opaque != -1 && s->passes[opaque].flags & GLSTATE_ALPHAFUNC ) )
+ if( s->flags & SHADER_DEPTHWRITE || ( opaque != -1 && s->stages[opaque].glState & GLSTATE_ALPHAFUNC ))
s->sort = SORT_ALPHATEST;
else if( opaque == -1 )
s->sort = SORT_ADDITIVE;
- else
- s->sort = SORT_OPAQUE;
+ else s->sort = SORT_OPAQUE;
}
}
else
{
ref_stage_t *sp;
- for( j = 0, sp = s->passes; j < s->numpasses; j++, sp++ )
+ for( j = 0, sp = s->stages; j < s->num_stages; j++, sp++ )
{
- if( sp->rgbgen.type == RGBGEN_UNKNOWN )
+ if( sp->rgbGen.type == RGBGEN_UNKNOWN )
{
- if( sp->flags & GLSTATE_ALPHAFUNC && !( j && s->passes[j-1].flags & SHADERSTAGE_LIGHTMAP ) ) // FIXME!
- sp->rgbgen.type = RGBGEN_IDENTITY_LIGHTING;
- else
- sp->rgbgen.type = RGBGEN_IDENTITY;
+ if( sp->glState & GLSTATE_ALPHAFUNC && !( j && s->stages[j-1].flags & SHADERSTAGE_LIGHTMAP )) // FIXME!
+ sp->rgbGen.type = RGBGEN_IDENTITY_LIGHTING;
+ else sp->rgbGen.type = RGBGEN_IDENTITY;
}
- if( sp->alphagen.type == ALPHAGEN_UNKNOWN )
+ if( sp->alphaGen.type == ALPHAGEN_UNKNOWN )
{
- if( sp->rgbgen.type == RGBGEN_VERTEX /* || sp->rgbgen.type == RGBGEN_EXACT_VERTEX*/ )
- sp->alphagen.type = ALPHAGEN_VERTEX;
+ if( sp->rgbGen.type == RGBGEN_VERTEX /* || sp->rgbGen.type == RGBGEN_EXACT_VERTEX*/ )
+ sp->alphaGen.type = ALPHAGEN_VERTEX;
else
- sp->alphagen.type = ALPHAGEN_IDENTITY;
+ sp->alphaGen.type = ALPHAGEN_IDENTITY;
}
}
if( !s->sort )
{
- if( pass->flags & GLSTATE_ALPHAFUNC )
+ if( pass->glState & GLSTATE_ALPHAFUNC )
s->sort = SORT_ALPHATEST;
}
- if( !( pass->flags & GLSTATE_DEPTHWRITE ) && !( s->flags & SHADER_SKYPARMS ) )
+ if( !( pass->glState & GLSTATE_DEPTHWRITE ) && !( s->flags & SHADER_SKYPARMS ))
{
- pass->flags |= GLSTATE_DEPTHWRITE;
+ pass->glState |= GLSTATE_DEPTHWRITE;
s->flags |= SHADER_DEPTHWRITE;
}
}
- if( !s->sort )
- s->sort = SORT_OPAQUE;
+ if( !s->sort ) s->sort = SORT_OPAQUE;
- if( ( s->flags & SHADER_SKYPARMS ) && ( s->flags & SHADER_DEPTHWRITE ) )
+ if(( s->flags & SHADER_SKYPARMS ) && ( s->flags & SHADER_DEPTHWRITE ))
s->flags &= ~SHADER_DEPTHWRITE;
Shader_SetFeatures( s );
@@ -2431,10 +2425,10 @@ void R_UploadCinematicShader( const ref_shader_t *shader )
ref_stage_t *pass;
// upload cinematics
- for( j = 0, pass = shader->passes; j < shader->numpasses; j++, pass++ )
+ for( j = 0, pass = shader->stages; j < shader->num_stages; j++, pass++ )
{
- if( pass->cin )
- pass->textures[0] = R_UploadCinematics( pass->cin );
+ if( pass->cinHandle )
+ pass->textures[0] = R_UploadCinematics( pass->cinHandle );
}
}
@@ -2444,7 +2438,7 @@ void R_DeformvBBoxForShader( const ref_shader_t *shader, vec3_t ebbox )
if( !shader )
return;
- for( dv = 0; dv < shader->numdeforms; dv++ )
+ for( dv = 0; dv < shader->numDeforms; dv++ )
{
switch( shader->deforms[dv].type )
{
@@ -2462,7 +2456,7 @@ void R_DeformvBBoxForShader( const ref_shader_t *shader, vec3_t ebbox )
ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int addFlags, int ignoreType )
{
int i;
- unsigned int key, length;
+ uint key, length;
string shortname;
ref_shader_t *s;
shadercache_t *cache;
@@ -2488,7 +2482,7 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
// test if already loaded
key = Com_HashKey( shortname, SHADERS_HASH_SIZE );
- for( s = shaders_hash[key]; s; s = s->hash_next )
+ for( s = shaders_hash[key]; s; s = s->nextHash )
{
if( !strcmp( s->name, shortname ) && ( s->type != ignoreType ))
return s;
@@ -2555,39 +2549,43 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS;
s->features = MF_STCOORDS|MF_COLORS;
s->sort = SORT_OPAQUE;
- s->numpasses = 3;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 3;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
pass->textures[0] = tr.whiteTexture;
- pass->flags = GLSTATE_DEPTHWRITE|SHADERSTAGE_BLEND_MODULATE /*|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO*/;
+ pass->flags = SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_DEPTHWRITE/*|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO*/;
pass->tcgen = TCGEN_BASE;
- pass->rgbgen.type = RGBGEN_VERTEX;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
- pass = &s->passes[1];
- pass->flags = SHADERSTAGE_DLIGHT|GLSTATE_DEPTHFUNC_EQ|SHADERSTAGE_BLEND_ADD|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ pass->rgbGen.type = RGBGEN_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
+ pass = &s->stages[1];
+ pass->flags = SHADERSTAGE_DLIGHT|SHADERSTAGE_BLEND_ADD;
+ pass->glState = GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
pass->tcgen = TCGEN_BASE;
- pass = &s->passes[2];
- pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ pass = &s->stages[2];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
pass->tcgen = TCGEN_BASE;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
break;
case SHADER_FLARE:
s->type = SHADER_FLARE;
s->features = MF_STCOORDS|MF_COLORS;
s->sort = SORT_ADDITIVE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_BLEND_ADD|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_BLEND_ADD;
+ pass->glState = GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
- pass->rgbgen.type = RGBGEN_VERTEX;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_BASE;
break;
case SHADER_MD3:
@@ -2595,14 +2593,15 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT;
s->features = MF_STCOORDS|MF_NORMALS;
s->sort = SORT_OPAQUE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = GLSTATE_DEPTHWRITE|SHADERSTAGE_BLEND_MODULATE;
- pass->rgbgen.type = RGBGEN_LIGHTING_DIFFUSE;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_DEPTHWRITE;
+ pass->rgbGen.type = RGBGEN_LIGHTING_DIFFUSE;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_BASE;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
@@ -2610,7 +2609,7 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
if( ( r_lighting_models_followdeluxe->integer ? mapConfig.deluxeMappingEnabled : GL_Support( R_SHADER_GLSL100_EXT ))
&& Shaderpass_LoadMaterial( &materialImages[0], &materialImages[1], &materialImages[2], shortname, addFlags, 1 ) )
{
- pass->rgbgen.type = RGBGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
pass->program = DEFAULT_GLSL_PROGRAM;
pass->program_type = PROGRAM_TYPE_MATERIAL;
pass->textures[1] = materialImages[0]; // normalmap
@@ -2624,12 +2623,13 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
s->type = SHADER_FONT;
s->features = MF_STCOORDS|MF_COLORS;
s->sort = SORT_ADDITIVE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )(( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ s->stages = ( ref_stage_t * )(( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
pass->textures[0] = R_FindTexture( shortname, NULL, 0, addFlags|TF_CLAMP|TF_NOMIPMAP|TF_NOPICMIP );
if( !pass->textures[0] )
{
@@ -2637,20 +2637,21 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
MsgDev( D_WARN, "couldn't find texture for shader '%s', using default...\n", s->name );
pass->textures[0] = tr.defaultConchars;
}
- pass->rgbgen.type = RGBGEN_VERTEX;
- pass->alphagen.type = ALPHAGEN_VERTEX;
+ pass->rgbGen.type = RGBGEN_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_VERTEX;
pass->tcgen = TCGEN_BASE;
break;
case SHADER_NOMIP:
s->type = SHADER_NOMIP;
s->features = MF_STCOORDS|MF_COLORS;
s->sort = SORT_ADDITIVE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA /* | SHADERSTAGE_NOCOLORARRAY*/;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_BLEND_MODULATE/*|SHADERSTAGE_NOCOLORARRAY*/;
+ pass->glState = GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
if( s->name[0] == '#' )
{
// search for internal resource
@@ -2664,8 +2665,8 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
MsgDev( D_WARN, "couldn't find texture for shader '%s', using default...\n", s->name );
pass->textures[0] = tr.defaultTexture;
}
- pass->rgbgen.type = RGBGEN_VERTEX;
- pass->alphagen.type = ALPHAGEN_VERTEX;
+ pass->rgbGen.type = RGBGEN_VERTEX;
+ pass->alphaGen.type = ALPHAGEN_VERTEX;
pass->tcgen = TCGEN_BASE;
break;
case SHADER_FARBOX:
@@ -2673,31 +2674,33 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
s->features = MF_STCOORDS;
s->sort = SORT_SKY;
s->flags = SHADER_SKYPARMS;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE /*|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO*/;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+// pass->glState = GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO;
pass->textures[0] = R_FindTexture( shortname, NULL, 0, addFlags|TF_CLAMP|TF_NOMIPMAP );
- pass->rgbgen.type = RGBGEN_IDENTITY_LIGHTING;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY_LIGHTING;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_BASE;
break;
case SHADER_NEARBOX:
s->type = SHADER_NEARBOX;
s->features = MF_STCOORDS;
s->sort = SORT_SKY;
- s->numpasses = 1;
+ s->num_stages = 1;
s->flags = SHADER_SKYPARMS;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = GLSTATE_ALPHAFUNC|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_DECAL|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_DECAL;
+ pass->glState = GLSTATE_ALPHAFUNC|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
pass->textures[0] = R_FindTexture( shortname, NULL, 0, addFlags|TF_CLAMP|TF_NOMIPMAP );
- pass->rgbgen.type = RGBGEN_IDENTITY_LIGHTING;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY_LIGHTING;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_BASE;
break;
case SHADER_PLANAR_SHADOW:
@@ -2705,104 +2708,109 @@ ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int a
s->features = MF_DEFORMVS;
s->sort = SORT_DECAL;
s->flags = 0;
- s->numdeforms = 1;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + s->numdeforms * sizeof( deformv_t ) + sizeof( ref_stage_t ) * s->numpasses );
+ s->numDeforms = 1;
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + s->numDeforms * sizeof( deform_t ) + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->deforms = ( deformv_t * )( ( byte * )s->name + length + 1 );
+ s->deforms = ( deform_t * )( ( byte * )s->name + length + 1 );
s->deforms[0].type = DEFORM_PROJECTION_SHADOW;
- s->passes = ( ref_stage_t * )( ( byte * )s->deforms + s->numdeforms * sizeof( deformv_t ) );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_STENCILSHADOW|SHADERSTAGE_BLEND_DECAL|GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ s->stages = ( ref_stage_t * )( ( byte * )s->deforms + s->numDeforms * sizeof( deform_t ) );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_STENCILSHADOW|SHADERSTAGE_BLEND_DECAL;
+ pass->glState = GLSTATE_SRCBLEND_SRC_ALPHA|GLSTATE_DSTBLEND_ONE_MINUS_SRC_ALPHA;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_NONE;
break;
case SHADER_OPAQUE_OCCLUDER:
s->type = SHADER_OPAQUE_OCCLUDER;
s->sort = SORT_OPAQUE;
s->flags = SHADER_CULL_FRONT|SHADER_DEPTHWRITE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses + 3 * sizeof( float ) );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages + 3 * sizeof( float ) );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
pass->textures[0] = tr.whiteTexture;
- pass->flags = SHADERSTAGE_NOCOLORARRAY|GLSTATE_DEPTHWRITE;
- pass->rgbgen.type = RGBGEN_ENVIRONMENT;
- pass->rgbgen.args = ( float * )( ( byte * )s->passes + sizeof( ref_stage_t ) * s->numpasses );
- VectorClear( pass->rgbgen.args );
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->flags = SHADERSTAGE_NOCOLORARRAY;
+ pass->glState = GLSTATE_DEPTHWRITE;
+ pass->rgbGen.type = RGBGEN_ENVIRONMENT;
+ pass->rgbGen.args = ( float * )( ( byte * )s->stages + sizeof( ref_stage_t ) * s->num_stages );
+ VectorClear( pass->rgbGen.args );
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->tcgen = TCGEN_NONE;
break;
-#ifdef HARDWARE_OUTLINES
case SHADER_OUTLINE:
s->type = SHADER_OUTLINE;
s->features = MF_NORMALS|MF_DEFORMVS;
s->sort = SORT_OPAQUE;
s->flags = SHADER_CULL_BACK|SHADER_DEPTHWRITE;
- s->numdeforms = 1;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + s->numdeforms * sizeof( deformv_t ) + sizeof( ref_stage_t ) * s->numpasses );
+ s->numDeforms = 1;
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + s->numDeforms * sizeof( deform_t ) + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->deforms = ( deformv_t * )( ( byte * )s->name + length + 1 );
+ s->deforms = ( deform_t * )( ( byte * )s->name + length + 1 );
s->deforms[0].type = DEFORM_OUTLINE;
- s->passes = ( ref_stage_t * )( ( byte * )s->deforms + s->numdeforms * sizeof( deformv_t ) );
- pass = &s->passes[0];
+ s->stages = ( ref_stage_t * )( ( byte * )s->deforms + s->numDeforms * sizeof( deform_t ) );
+ pass = &s->stages[0];
pass->textures[0] = tr.whiteTexture;
- pass->flags = SHADERSTAGE_NOCOLORARRAY|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO|SHADERSTAGE_BLEND_MODULATE|GLSTATE_DEPTHWRITE;
- pass->rgbgen.type = RGBGEN_OUTLINE;
- pass->alphagen.type = ALPHAGEN_OUTLINE;
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ZERO|GLSTATE_DEPTHWRITE;
+ pass->rgbGen.type = RGBGEN_OUTLINE;
+ pass->alphaGen.type = ALPHAGEN_OUTLINE;
pass->tcgen = TCGEN_NONE;
break;
-#endif
case SHADER_TEXTURE:
if( mapConfig.deluxeMappingEnabled && Shaderpass_LoadMaterial( &materialImages[0], &materialImages[1], &materialImages[2], shortname, addFlags, 1 ) )
{
s->type = SHADER_TEXTURE;
- s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS|SHADER_LIGHTMAP|SHADER_MATERIAL;
+ s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS|SHADER_HASLIGHTMAP|SHADER_MATERIAL;
s->features = MF_STCOORDS|MF_LMCOORDS|MF_NORMALS|MF_SVECTORS|MF_ENABLENORMALS;
s->sort = SORT_OPAQUE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_LIGHTMAP|SHADERSTAGE_DELUXEMAP|GLSTATE_DEPTHWRITE|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_REPLACE;
+ s->stages = (ref_stage_t *)(( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_REPLACE;
+ pass->glState = GLSTATE_DEPTHWRITE;
pass->tcgen = TCGEN_BASE;
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
pass->program = DEFAULT_GLSL_PROGRAM;
pass->program_type = PROGRAM_TYPE_MATERIAL;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
- pass->textures[1] = materialImages[0]; // normalmap
- pass->textures[2] = materialImages[1]; // glossmap
- pass->textures[3] = materialImages[2]; // glossmap
+ pass->textures[1] = materialImages[0]; // normalmap
+ pass->textures[2] = materialImages[1]; // glossmap
+ pass->textures[3] = materialImages[2]; // decalmap
}
else
{
s->type = SHADER_TEXTURE;
- s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS|SHADER_LIGHTMAP;
+ s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS|SHADER_HASLIGHTMAP;
s->features = MF_STCOORDS|MF_LMCOORDS;
s->sort = SORT_OPAQUE;
- s->numpasses = 3;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 3;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_LIGHTMAP|GLSTATE_DEPTHWRITE|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_REPLACE;
+ s->stages = ( ref_stage_t * )( ( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_LIGHTMAP|SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_REPLACE;
+ pass->glState = GLSTATE_DEPTHWRITE;
pass->tcgen = TCGEN_LIGHTMAP;
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
- pass = &s->passes[1];
- pass->flags = SHADERSTAGE_DLIGHT|GLSTATE_DEPTHFUNC_EQ|SHADERSTAGE_BLEND_ADD|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
+ pass = &s->stages[1];
+ pass->flags = SHADERSTAGE_DLIGHT|SHADERSTAGE_BLEND_ADD;
+ pass->glState = GLSTATE_DEPTHFUNC_EQ|GLSTATE_SRCBLEND_ONE|GLSTATE_DSTBLEND_ONE;
pass->tcgen = TCGEN_BASE;
- pass = &s->passes[2];
- pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ pass = &s->stages[2];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
pass->tcgen = TCGEN_BASE;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
}
break;
create_default:
@@ -2812,16 +2820,17 @@ create_default:
s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT|SHADER_NO_MODULATIVE_DLIGHTS;
s->features = MF_STCOORDS;
s->sort = SORT_OPAQUE;
- s->numpasses = 1;
- s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->numpasses );
+ s->num_stages = 1;
+ s->name = Shader_Malloc( length + 1 + sizeof( ref_stage_t ) * s->num_stages );
strcpy( s->name, shortname );
- s->passes = ( ref_stage_t * )(( byte * )s->name + length + 1 );
- pass = &s->passes[0];
- pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE|GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
+ s->stages = ( ref_stage_t * )(( byte * )s->name + length + 1 );
+ pass = &s->stages[0];
+ pass->flags = SHADERSTAGE_NOCOLORARRAY|SHADERSTAGE_BLEND_MODULATE;
+ pass->glState = GLSTATE_SRCBLEND_ZERO|GLSTATE_DSTBLEND_SRC_COLOR;
pass->tcgen = TCGEN_BASE;
pass->textures[0] = Shader_FindImage( s, shortname, addFlags );
- pass->rgbgen.type = RGBGEN_IDENTITY;
- pass->alphagen.type = ALPHAGEN_IDENTITY;
+ pass->rgbGen.type = RGBGEN_IDENTITY;
+ pass->alphaGen.type = ALPHAGEN_IDENTITY;
break;
}
}
@@ -2830,7 +2839,7 @@ create_default:
s->sortkey = Shader_Sortkey( s, s->sort );
// add to hash table
- s->hash_next = shaders_hash[key];
+ s->nextHash = shaders_hash[key];
shaders_hash[key] = s;
return s;
diff --git a/render/r_shader.h b/render/r_shader.h
index 52d57bfd..fd2c7646 100644
--- a/render/r_shader.h
+++ b/render/r_shader.h
@@ -21,11 +21,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define __R_SHADER_H__
#define MAX_SHADERS 4096
+#define SHADERS_HASH_SIZE 256
+#define MAX_STAGE_TEXTURES 256 // same as MAX_SPRITE_FRAMES
#define MAX_SHADER_STAGES 8
#define MAX_SHADER_DEFORMS 8
-#define MAX_STAGE_TEXTURES 256
#define MAX_SHADER_TCMODS 8
+#define MAX_TABLES 4096
+#define TABLES_HASH_SIZE 1024
+
// shader types
#define SHADER_INVALID -1
#define SHADER_UNKNOWN 0
@@ -41,33 +45,55 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define SHADER_NEARBOX 10
#define SHADER_PLANAR_SHADOW 11
#define SHADER_OPAQUE_OCCLUDER 12
-#ifdef HARDWARE_OUTLINES
#define SHADER_OUTLINE 13
-#endif
// shader flags
+typedef enum
+{
+ SHADER_STATIC = BIT(0), // never freed by R_ShaderFreeUnused
+ SHADER_DEPTHWRITE = BIT(1),
+ SHADER_SKYPARMS = BIT(2),
+ SHADER_SURFACEPARM = BIT(3), // shader has surface and contents parms
+ SHADER_POLYGONOFFSET = BIT(4),
+ SHADER_CULL_FRONT = BIT(5),
+ SHADER_CULL_BACK = BIT(6),
+ SHADER_VIDEOMAP = BIT(7),
+ SHADER_MATERIAL = BIT(8),
+ SHADER_DEFORM_NORMAL = BIT(9),
+ SHADER_ENTITY_MERGABLE = BIT(10),
+ SHADER_AUTOSPRITE = BIT(11),
+ SHADER_NO_MODULATIVE_DLIGHTS = BIT(12),
+ SHADER_HASLIGHTMAP = BIT(13),
+ SHADER_PORTAL = BIT(14),
+ SHADER_PORTAL_CAPTURE1 = BIT(15),
+ SHADER_PORTAL_CAPTURE2 = BIT(16),
+ SHADER_RENDERMODE = BIT(17),
+ SHADER_PORTAL_CAPTURE = (SHADER_PORTAL_CAPTURE1|SHADER_PORTAL_CAPTURE1),
+ SHADER_CULL = (SHADER_CULL_FRONT|SHADER_CULL_BACK)
+} shaderFlags_t;
+
+// shaderstage flags
enum
{
- SHADER_DEPTHWRITE = BIT(0),
- SHADER_SKYPARMS = BIT(1),
- SHADER_POLYGONOFFSET = BIT(2),
- SHADER_CULL_FRONT = BIT(3),
- SHADER_CULL_BACK = BIT(4),
- SHADER_VIDEOMAP = BIT(5),
- SHADER_MATERIAL = BIT(6),
- SHADER_DEFORM_NORMAL = BIT(7),
- SHADER_ENTITY_MERGABLE = BIT(8),
- SHADER_AUTOSPRITE = BIT(9),
- SHADER_NO_MODULATIVE_DLIGHTS = BIT(10),
- SHADER_LIGHTMAP = BIT(11),
- SHADER_PORTAL = BIT(12),
- SHADER_PORTAL_CAPTURE1 = BIT(13),
- SHADER_PORTAL_CAPTURE2 = BIT(14),
- SHADER_PORTAL_CAPTURE = SHADER_PORTAL_CAPTURE1|SHADER_PORTAL_CAPTURE1,
-};
+ SHADERSTAGE_ANIMFREQUENCY = BIT(0), // auto-animate value
+ SHADERSTAGE_FRAMES = BIT(1), // bundle have anim frames, thats can be switching manually
+ SHADERSTAGE_ANGLEDMAP = BIT(2), // doom1 eight angle-aligned ( 360 / 8 ) textures
+ SHADERSTAGE_LIGHTMAP = BIT(3),
+ SHADERSTAGE_DETAIL = BIT(4),
+ SHADERSTAGE_NOCOLORARRAY = BIT(5),
+ SHADERSTAGE_DLIGHT = BIT(6),
+ SHADERSTAGE_PORTALMAP = BIT(7),
+ SHADERSTAGE_STENCILSHADOW = BIT(8),
+ SHADERSTAGE_BLEND_REPLACE = BIT(9),
+ SHADERSTAGE_BLEND_MODULATE = BIT(10),
+ SHADERSTAGE_BLEND_ADD = BIT(11),
+ SHADERSTAGE_BLEND_DECAL = BIT(12)
+} stageFlags_t;
+
+#define SHADERSTAGE_BLENDMODE (SHADERSTAGE_BLEND_REPLACE|SHADERSTAGE_BLEND_MODULATE|SHADERSTAGE_BLEND_ADD|SHADERSTAGE_BLEND_DECAL)
// sorting
-enum
+typedef enum
{
SORT_NONE = 0,
SORT_PORTAL = 1,
@@ -76,51 +102,34 @@ enum
SORT_DECAL = 4,
SORT_ALPHATEST = 5,
SORT_BANNER = 6,
- SORT_UNDERWATER = 8,
+ SORT_UNDERWATER = 7,
+ SORT_WATER = 8,
SORT_ADDITIVE = 9,
SORT_NEAREST = 16
-};
-
-// shaderpass flags
-#define SHADERSTAGE_MARK_BEGIN 0x10000 // same as GLSTATE_MARK_END
-enum
-{
- SHADERSTAGE_LIGHTMAP = SHADERSTAGE_MARK_BEGIN,
- SHADERSTAGE_DETAIL = SHADERSTAGE_MARK_BEGIN << 1,
- SHADERSTAGE_NOCOLORARRAY = SHADERSTAGE_MARK_BEGIN << 2,
- SHADERSTAGE_DLIGHT = SHADERSTAGE_MARK_BEGIN << 3,
- SHADERSTAGE_DELUXEMAP = SHADERSTAGE_MARK_BEGIN << 4,
- SHADERSTAGE_PORTALMAP = SHADERSTAGE_MARK_BEGIN << 5,
- SHADERSTAGE_STENCILSHADOW = SHADERSTAGE_MARK_BEGIN << 6,
-
- SHADERSTAGE_BLEND_REPLACE = SHADERSTAGE_MARK_BEGIN << 7,
- SHADERSTAGE_BLEND_MODULATE = SHADERSTAGE_MARK_BEGIN << 8,
- SHADERSTAGE_BLEND_ADD = SHADERSTAGE_MARK_BEGIN << 9,
- SHADERSTAGE_BLEND_DECAL = SHADERSTAGE_MARK_BEGIN << 10
-};
-
-#define SHADERSTAGE_BLENDMODE (SHADERSTAGE_BLEND_REPLACE|SHADERSTAGE_BLEND_MODULATE|SHADERSTAGE_BLEND_ADD|SHADERSTAGE_BLEND_DECAL)
+} sort_t;
// transform functions
typedef enum
{
- WAVEFORM_SIN = 1,
- WAVEFORM_TRIANGLE = 2,
- WAVEFORM_SQUARE = 3,
- WAVEFORM_SAWTOOTH = 4,
- WAVEFORM_INVERSESAWTOOTH = 5,
- WAVEFORM_NOISE = 6,
- WAVEFORM_CONSTANT = 7
+ WAVEFORM_NONE = 0,
+ WAVEFORM_SIN,
+ WAVEFORM_TRIANGLE,
+ WAVEFORM_SQUARE,
+ WAVEFORM_SAWTOOTH,
+ WAVEFORM_INVERSESAWTOOTH,
+ WAVEFORM_NOISE,
+ WAVEFORM_CONSTANT
} waveForm_t;
// RGB colors generation
-enum
+typedef enum
{
- RGBGEN_UNKNOWN,
+ RGBGEN_UNKNOWN = 0,
RGBGEN_IDENTITY,
RGBGEN_IDENTITY_LIGHTING,
RGBGEN_CONST,
RGBGEN_WAVE,
+ RGBGEN_COLORWAVE,
RGBGEN_ENTITY,
RGBGEN_ONE_MINUS_ENTITY,
RGBGEN_VERTEX,
@@ -131,63 +140,69 @@ enum
RGBGEN_LIGHTING_AMBIENT_ONLY,
RGBGEN_FOG,
RGBGEN_CUSTOM,
-#ifdef HARDWARE_OUTLINES
RGBGEN_OUTLINE,
-#endif
- RGBGEN_ENVIRONMENT,
-};
+ RGBGEN_ENVIRONMENT
+} rgbGenType_t;
// alpha channel generation
-enum
+typedef enum
{
- ALPHAGEN_UNKNOWN,
+ ALPHAGEN_UNKNOWN = 0,
ALPHAGEN_IDENTITY,
ALPHAGEN_CONST,
ALPHAGEN_PORTAL,
ALPHAGEN_VERTEX,
ALPHAGEN_ONE_MINUS_VERTEX,
ALPHAGEN_ENTITY,
+ ALPHAGEN_ONE_MINUS_ENTITY,
ALPHAGEN_SPECULAR,
ALPHAGEN_WAVE,
+ ALPHAGEN_ALPHAWAVE,
+ ALPHAGEN_FADE, // same as portal but for other things
+ ALPHAGEN_ONE_MINUS_FADE,
ALPHAGEN_DOT,
ALPHAGEN_ONE_MINUS_DOT,
-#ifdef HARDWARE_OUTLINES
ALPHAGEN_OUTLINE
-#endif
-};
+} alphaGenType_t;
// texture coordinates generation
-enum
+typedef enum
{
- TCGEN_NONE,
+ TCGEN_NONE = 0,
TCGEN_BASE,
TCGEN_LIGHTMAP,
TCGEN_ENVIRONMENT,
TCGEN_VECTOR,
+ TCGEN_LIGHTVECTOR,
+ TCGEN_HALFANGLE,
+ TCGEN_WARP,
TCGEN_REFLECTION,
TCGEN_FOG,
TCGEN_REFLECTION_CELLSHADE,
TCGEN_SVECTORS,
TCGEN_PROJECTION,
- TCGEN_PROJECTION_SHADOW
-};
+ TCGEN_PROJECTION_SHADOW,
+ TCGEN_NORMAL
+} tcGenType_t;
// tcmod functions
-enum
+typedef enum
{
- TCMOD_NONE,
+ TCMOD_NONE = 0,
+ TCMOD_TRANSLATE,
TCMOD_SCALE,
TCMOD_SCROLL,
TCMOD_ROTATE,
+ TCMOD_STRETCH,
TCMOD_TRANSFORM,
TCMOD_TURB,
- TCMOD_STRETCH
-};
+ TCMOD_CONVEYOR // same as TCMOD_SCROLL, but can be controlled by entity
+} tcModType_t;
// vertices deformation
-enum
+typedef enum
{
- DEFORM_NONE,
+ DEFORM_NONE = 0,
DEFORM_WAVE,
DEFORM_NORMAL,
DEFORM_BULGE,
@@ -196,10 +211,25 @@ enum
DEFORM_AUTOSPRITE2,
DEFORM_PROJECTION_SHADOW,
DEFORM_AUTOPARTICLE,
-#ifdef HARDWARE_OUTLINES
DEFORM_OUTLINE
-#endif
-};
+} deformType_t;
+
+typedef enum
+{
+ TABLE_SNAP = BIT(0),
+ TABLE_CLAMP = BIT(1)
+} tableFlags_t;
+
+typedef struct table_s
+{
+ char *name; // table name
+ int index;
+ tableFlags_t flags;
+
+ int size;
+ float *values; // float[]
+ struct table_s *nextHash;
+} table_t;
typedef struct
{
@@ -209,40 +239,47 @@ typedef struct
typedef struct
{
- word type;
+ tcModType_t type;
float args[6];
-} tcmod_t;
+} tcMod_t;
typedef struct
{
- word type;
+ rgbGenType_t type;
float *args;
waveFunc_t *func;
-} colorgen_t;
+} rgbGen_t;
typedef struct
{
- word type;
+ alphaGenType_t type;
+ float *args;
+ waveFunc_t *func;
+} alphaGen_t;
+
+typedef struct
+{
+ deformType_t type;
float args[4];
waveFunc_t func;
-} deformv_t;
+} deform_t;
// Per-pass rendering state information
typedef struct ref_stage_s
{
uint flags;
- uint glstate; // GLSTATE_ flags
+ uint glState; // GLSTATE_ flags
- colorgen_t rgbgen;
- colorgen_t alphagen;
+ rgbGen_t rgbGen;
+ alphaGen_t alphaGen;
word tcgen;
vec_t *tcgenVec;
- word numtcmods;
- tcmod_t *tcmods;
+ word numtcMods;
+ tcMod_t *tcMods;
- uint cin;
+ uint cinHandle;
const char *program;
word program_type;
@@ -256,53 +293,48 @@ typedef struct ref_stage_s
typedef struct ref_shader_s
{
char *name;
-
- word flags;
+ word type;
+
+ uint flags;
word features;
- uint sort;
+ sort_t sort;
+ sort_t realsort; // member original sort type until rendermode is reset
uint sortkey;
+ uint touchFrame; // 0 = free
- int type;
+ word num_stages;
+ ref_stage_t *stages;
- word numpasses;
- ref_stage_t *passes;
-
- word numdeforms;
- deformv_t *deforms;
+ word numDeforms;
+ deform_t *deforms;
+ skydome_t *skyParms;
rgba_t fog_color;
- float fog_dist, fog_clearDist;
+ float fog_dist;
+ float fog_clearDist;
float offsetmapping_scale;
- struct ref_shader_s *hash_next;
+ struct ref_shader_s *nextHash;
} ref_shader_t;
// memory management
-extern byte *r_shadersmempool;
-
+extern byte *r_shadersmempool;
extern ref_shader_t r_shaders[MAX_SHADERS];
-extern int r_numShaders;
-extern skydome_t *r_skydomes[MAX_SHADERS];
+extern skydome_t *r_skydomes[MAX_SHADERS];
-#define Shader_Malloc( size ) Mem_Alloc( r_shadersmempool, size )
-#define Shader_Free( data ) Mem_Free( data )
-#define Shader_Sortkey( shader, sort ) ( ( ( sort )<<26 )|( shader-r_shaders ) )
+#define Shader_Sortkey( shader, sort ) ((( sort )<<26 )|( shader - r_shaders ))
+#define Shader_Malloc( size ) Mem_Alloc( r_shadersmempool, size )
+#define Shader_Free( data ) Mem_Free( data )
-void R_InitShaders( bool silent );
-void R_ShutdownShaders( void );
-void R_UploadCinematicShader( const ref_shader_t *shader );
+void R_InitShaders( void );
+void R_ShutdownShaders( void );
+void R_UploadCinematicShader( const ref_shader_t *shader );
+void R_DeformvBBoxForShader( const ref_shader_t *shader, vec3_t ebbox );
+void R_ShaderList_f( void );
+void R_ShaderDump_f( void );
+ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int addFlags, int ignoreType );
-void R_DeformvBBoxForShader( const ref_shader_t *shader, vec3_t ebbox );
-
-ref_shader_t *R_LoadShader( const char *name, int type, bool forceDefault, int addFlags, int ignoreType );
-
-ref_shader_t *R_RegisterPic( const char *name );
-ref_shader_t *R_RegisterShader( const char *name );
-ref_shader_t *R_RegisterSkin( const char *name );
-
-void R_ShaderList_f( void );
-void R_ShaderDump_f( void );
#endif /*__R_SHADER_H__*/
diff --git a/render/r_skm.c b/render/r_skm.c
index bae2aae4..f2bd53be 100644
--- a/render/r_skm.c
+++ b/render/r_skm.c
@@ -1072,10 +1072,8 @@ static void R_DrawBonesFrameLerp( const meshbuffer_t *mb, float backlerp )
{
if( ( features & MF_SVECTORS ) || r_shownormals->integer )
features |= MF_NORMALS;
-#ifdef HARDWARE_OUTLINES
if( e->outlineHeight )
features |= MF_NORMALS|(GL_Support( R_SHADER_GLSL100_EXT ) ? MF_ENABLENORMALS : 0);
-#endif
}
// not sure if it's really needed
diff --git a/render/r_sky.c b/render/r_sky.c
index 00a4a85e..3b58037d 100644
--- a/render/r_sky.c
+++ b/render/r_sky.c
@@ -265,12 +265,11 @@ static void R_DrawBlackBottom( skydome_t *skydome )
if( r_shownormals->integer )
features |= MF_NORMALS;
- // HACK HACK HACK
- // skies ought not to write to depth buffer
+ // HACKHACK skies ought not to write to depth buffer
shader->flags &= ~SHADER_DEPTHWRITE;
- shader->passes[0].flags &= ~GLSTATE_DEPTHWRITE;
+ shader->stages[0].glState &= ~GLSTATE_DEPTHWRITE;
R_DrawSkySide( skydome, 5, shader, features );
- shader->passes[0].flags |= GLSTATE_DEPTHWRITE;
+ shader->stages[0].glState |= GLSTATE_DEPTHWRITE;
shader->flags |= SHADER_DEPTHWRITE;
}
@@ -365,7 +364,7 @@ void R_DrawSky( ref_shader_t *shader )
else
R_DrawBlackBottom( skydome );
- if( shader->numpasses )
+ if( shader->num_stages )
{
bool flush = false;
int features = shader->features;
diff --git a/render/r_surf.c b/render/r_surf.c
index ce7173a1..61ee974a 100644
--- a/render/r_surf.c
+++ b/render/r_surf.c
@@ -97,19 +97,16 @@ bool R_CullSurface( msurface_t *surf, unsigned int clipflags )
return true;
}
- if( surf->facetype == MST_PLANAR && r_faceplanecull->integer
-#ifdef HARDWARE_OUTLINES
- && !RI.currententity->outlineHeight
-#endif
- && ( shader->flags & ( SHADER_CULL_FRONT|SHADER_CULL_BACK ) ) )
+ if( surf->facetype == MST_PLANAR && r_faceplanecull->integer &&
+ !RI.currententity->outlineHeight && ( shader->flags & (SHADER_CULL_FRONT|SHADER_CULL_BACK)))
{
// Vic: I hate q3map2. I really do.
- if( !VectorCompare( surf->plane->normal, vec3_origin ) )
+ if( !VectorCompare( surf->plane->normal, vec3_origin ))
{
float dist;
dist = PlaneDiff( modelorg, surf->plane );
- if( ( shader->flags & SHADER_CULL_FRONT ) || ( RI.params & RP_MIRRORVIEW ) )
+ if( ( shader->flags & SHADER_CULL_FRONT ) || ( RI.params & RP_MIRRORVIEW ))
{
if( dist <= BACKFACE_EPSILON )
return true;
@@ -121,8 +118,7 @@ bool R_CullSurface( msurface_t *surf, unsigned int clipflags )
}
}
}
-
- return ( clipflags && R_CullBox( surf->mins, surf->maxs, clipflags ) );
+ return ( clipflags && R_CullBox( surf->mins, surf->maxs, clipflags ));
}
/*
@@ -224,18 +220,16 @@ R_AddBrushModelToList
*/
void R_AddBrushModelToList( ref_entity_t *e )
{
- unsigned int i;
- bool rotated;
+ uint i;
+ bool rotated;
ref_model_t *model = e->model;
- mbrushmodel_t *bmodel = ( mbrushmodel_t * )model->extradata;
- msurface_t *psurf;
- unsigned int dlightbits;
- meshbuffer_t *mb;
+ mbrushmodel_t *bmodel = ( mbrushmodel_t * )model->extradata;
+ msurface_t *psurf;
+ uint dlightbits;
+ meshbuffer_t *mb;
-#ifdef HARDWARE_OUTLINES
e->outlineHeight = r_worldent->outlineHeight;
Vector4Copy( r_worldent->outlineRGBA, e->outlineColor );
-#endif
rotated = !Matrix_Compare( e->axis, axis_identity );
VectorSubtract( RI.refdef.vieworg, e->origin, modelorg );
@@ -577,18 +571,16 @@ void R_DrawWorld( void )
RI.previousentity = NULL;
RI.currententity = r_worldent;
RI.currentmodel = RI.currententity->model;
-#ifdef HARDWARE_OUTLINES
- if( (RI.refdef.rdflags & RDF_WORLDOUTLINES) && (r_viewcluster != -1) )
+
+ if( (RI.refdef.rdflags & RDF_WORLDOUTLINES) && (r_viewcluster != -1))
RI.currententity->outlineHeight = max( 0.0f, r_outlines_world->value );
- else
- RI.currententity->outlineHeight = 0.0f;
+ else RI.currententity->outlineHeight = 0.0f;
Vector4Copy( mapConfig.outlineColor, RI.currententity->outlineColor );
-#endif
if( !( RI.params & RP_SHADOWMAPVIEW ) )
{
R_AllocMeshbufPointers( &RI );
- memset( RI.surfmbuffers, 0, r_worldbrushmodel->numsurfaces * sizeof( meshbuffer_t * ) );
+ Mem_Set( RI.surfmbuffers, 0, r_worldbrushmodel->numsurfaces * sizeof( meshbuffer_t * ));
R_CalcDistancesToFogVolumes();
}
diff --git a/render/render.plg b/render/render.plg
index c5158a88..565b3161 100644
--- a/render/render.plg
+++ b/render/render.plg
@@ -6,6 +6,52 @@
--------------------Configuration: render - Win32 Debug--------------------
Command Lines
+Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39A.tmp" with contents
+[
+/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\render\!debug/" /Fo"..\temp\render\!debug/" /Fd"..\temp\render\!debug/" /FD /c
+"D:\Xash3D\src_main\render\r_shader.c"
+]
+Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39A.tmp"
+Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39B.tmp" with contents
+[
+msvcrtd.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\render\!debug/render.pdb" /debug /machine:I386 /nodefaultlib:"msvcrt.lib" /out:"..\temp\render\!debug/render.dll" /implib:"..\temp\render\!debug/render.lib" /pdbtype:sept
+"\Xash3D\src_main\temp\render\!debug\cin.obj"
+"\Xash3D\src_main\temp\render\!debug\r_alias.obj"
+"\Xash3D\src_main\temp\render\!debug\r_backend.obj"
+"\Xash3D\src_main\temp\render\!debug\r_bloom.obj"
+"\Xash3D\src_main\temp\render\!debug\r_cin.obj"
+"\Xash3D\src_main\temp\render\!debug\r_cull.obj"
+"\Xash3D\src_main\temp\render\!debug\r_draw.obj"
+"\Xash3D\src_main\temp\render\!debug\r_image.obj"
+"\Xash3D\src_main\temp\render\!debug\r_light.obj"
+"\Xash3D\src_main\temp\render\!debug\r_main.obj"
+"\Xash3D\src_main\temp\render\!debug\r_math.obj"
+"\Xash3D\src_main\temp\render\!debug\r_mesh.obj"
+"\Xash3D\src_main\temp\render\!debug\r_model.obj"
+"\Xash3D\src_main\temp\render\!debug\r_opengl.obj"
+"\Xash3D\src_main\temp\render\!debug\r_poly.obj"
+"\Xash3D\src_main\temp\render\!debug\r_program.obj"
+"\Xash3D\src_main\temp\render\!debug\r_register.obj"
+"\Xash3D\src_main\temp\render\!debug\r_shader.obj"
+"\Xash3D\src_main\temp\render\!debug\r_shadow.obj"
+"\Xash3D\src_main\temp\render\!debug\r_skin.obj"
+"\Xash3D\src_main\temp\render\!debug\r_skm.obj"
+"\Xash3D\src_main\temp\render\!debug\r_sky.obj"
+"\Xash3D\src_main\temp\render\!debug\r_surf.obj"
+]
+Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39B.tmp"
+Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39C.bat" with contents
+[
+@echo off
+copy \Xash3D\src_main\temp\render\!debug\render.dll "D:\Xash3D\bin\render.dll"
+]
+Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP39C.bat"
+Compiling...
+r_shader.c
+Linking...
+Output Window
+Performing Custom Build Step on \Xash3D\src_main\temp\render\!debug\render.dll
+Скопировано файлов: 1.
diff --git a/server/server.plg b/server/server.plg
deleted file mode 100644
index 5afeb1a7..00000000
--- a/server/server.plg
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-Build Log
-
---------------------Configuration: server - Win32 Debug--------------------
-
-Command Lines
-Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP271.tmp" with contents
-[
-/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "ents" /I "game" /I "global" /I "monsters" /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\server\!debug/" /Fo"..\temp\server\!debug/" /Fd"..\temp\server\!debug/" /FD /c
-"D:\Xash3D\src_main\server\monsters\player.cpp"
-]
-Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP271.tmp"
-Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP272.tmp" with contents
-[
-msvcrtd.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\server\!debug/server.pdb" /debug /machine:I386 /nodefaultlib:"libc.lib" /def:".\server.def" /out:"..\temp\server\!debug/server.dll" /implib:"..\temp\server\!debug/server.lib" /pdbtype:sept
-"\Xash3D\src_main\temp\server\!debug\ai_sound.obj"
-"\Xash3D\src_main\temp\server\!debug\animating.obj"
-"\Xash3D\src_main\temp\server\!debug\animation.obj"
-"\Xash3D\src_main\temp\server\!debug\apache.obj"
-"\Xash3D\src_main\temp\server\!debug\barnacle.obj"
-"\Xash3D\src_main\temp\server\!debug\barney.obj"
-"\Xash3D\src_main\temp\server\!debug\basebrush.obj"
-"\Xash3D\src_main\temp\server\!debug\baseentity.obj"
-"\Xash3D\src_main\temp\server\!debug\basefunc.obj"
-"\Xash3D\src_main\temp\server\!debug\basefx.obj"
-"\Xash3D\src_main\temp\server\!debug\baseinfo.obj"
-"\Xash3D\src_main\temp\server\!debug\baseitem.obj"
-"\Xash3D\src_main\temp\server\!debug\baselogic.obj"
-"\Xash3D\src_main\temp\server\!debug\basemonster.obj"
-"\Xash3D\src_main\temp\server\!debug\basemover.obj"
-"\Xash3D\src_main\temp\server\!debug\baseother.obj"
-"\Xash3D\src_main\temp\server\!debug\basepath.obj"
-"\Xash3D\src_main\temp\server\!debug\basephys.obj"
-"\Xash3D\src_main\temp\server\!debug\baserockets.obj"
-"\Xash3D\src_main\temp\server\!debug\basetank.obj"
-"\Xash3D\src_main\temp\server\!debug\basetrigger.obj"
-"\Xash3D\src_main\temp\server\!debug\baseutil.obj"
-"\Xash3D\src_main\temp\server\!debug\baseweapon.obj"
-"\Xash3D\src_main\temp\server\!debug\baseworld.obj"
-"\Xash3D\src_main\temp\server\!debug\client.obj"
-"\Xash3D\src_main\temp\server\!debug\combat.obj"
-"\Xash3D\src_main\temp\server\!debug\decals.obj"
-"\Xash3D\src_main\temp\server\!debug\defaultai.obj"
-"\Xash3D\src_main\temp\server\!debug\dll_int.obj"
-"\Xash3D\src_main\temp\server\!debug\flyingmonster.obj"
-"\Xash3D\src_main\temp\server\!debug\game.obj"
-"\Xash3D\src_main\temp\server\!debug\gamerules.obj"
-"\Xash3D\src_main\temp\server\!debug\generic.obj"
-"\Xash3D\src_main\temp\server\!debug\globals.obj"
-"\Xash3D\src_main\temp\server\!debug\gman.obj"
-"\Xash3D\src_main\temp\server\!debug\hassassin.obj"
-"\Xash3D\src_main\temp\server\!debug\headcrab.obj"
-"\Xash3D\src_main\temp\server\!debug\hgrunt.obj"
-"\Xash3D\src_main\temp\server\!debug\leech.obj"
-"\Xash3D\src_main\temp\server\!debug\legacy.obj"
-"\Xash3D\src_main\temp\server\!debug\lights.obj"
-"\Xash3D\src_main\temp\server\!debug\multiplay_gamerules.obj"
-"\Xash3D\src_main\temp\server\!debug\nodes.obj"
-"\Xash3D\src_main\temp\server\!debug\osprey.obj"
-"\Xash3D\src_main\temp\server\!debug\parent.obj"
-"\Xash3D\src_main\temp\server\!debug\player.obj"
-"\Xash3D\src_main\temp\server\!debug\rat.obj"
-"\Xash3D\src_main\temp\server\!debug\roach.obj"
-"\Xash3D\src_main\temp\server\!debug\saverestore.obj"
-"\Xash3D\src_main\temp\server\!debug\scientist.obj"
-"\Xash3D\src_main\temp\server\!debug\scripted.obj"
-"\Xash3D\src_main\temp\server\!debug\sfx.obj"
-"\Xash3D\src_main\temp\server\!debug\singleplay_gamerules.obj"
-"\Xash3D\src_main\temp\server\!debug\sound.obj"
-"\Xash3D\src_main\temp\server\!debug\squadmonster.obj"
-"\Xash3D\src_main\temp\server\!debug\talkmonster.obj"
-"\Xash3D\src_main\temp\server\!debug\teamplay_gamerules.obj"
-"\Xash3D\src_main\temp\server\!debug\turret.obj"
-"\Xash3D\src_main\temp\server\!debug\utils.obj"
-"\Xash3D\src_main\temp\server\!debug\weapon_generic.obj"
-"\Xash3D\src_main\temp\server\!debug\zombie.obj"
-]
-Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP272.tmp"
-Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP273.bat" with contents
-[
-@echo off
-copy \Xash3D\src_main\temp\server\!debug\server.dll "D:\Xash3D\bin\server.dll"
-]
-Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP273.bat"
-Compiling...
-player.cpp
-Linking...
-Output Window
-Performing Custom Build Step on \Xash3D\src_main\temp\server\!debug\server.dll
-Скопировано файлов: 1.
-
-
-
-Results
-server.dll - 0 error(s), 0 warning(s)
-
-
-