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) -
- -