Merge branch 'master' (early part) into sdl2

This commit is contained in:
Zack Middleton 2014-03-24 17:51:57 -05:00
commit 73aa7ef2c7
28 changed files with 96 additions and 79 deletions

View file

@ -640,7 +640,7 @@ void CG_GibPlayer( vec3_t playerOrigin ) {
/* /*
================== ==================
CG_LaunchGib CG_LaunchExplode
================== ==================
*/ */
void CG_LaunchExplode( vec3_t origin, vec3_t velocity, qhandle_t hModel ) { void CG_LaunchExplode( vec3_t origin, vec3_t velocity, qhandle_t hModel ) {
@ -673,7 +673,7 @@ void CG_LaunchExplode( vec3_t origin, vec3_t velocity, qhandle_t hModel ) {
#define EXP_JUMP 150 #define EXP_JUMP 150
/* /*
=================== ===================
CG_GibPlayer CG_BigExplode
Generated a bunch of gibs launching out from the bodies location Generated a bunch of gibs launching out from the bodies location
=================== ===================

View file

@ -74,7 +74,7 @@ void CG_FreeLocalEntity( localEntity_t *le ) {
=================== ===================
CG_AllocLocalEntity CG_AllocLocalEntity
Will allways succeed, even if it requires freeing an old active entity Will always succeed, even if it requires freeing an old active entity
=================== ===================
*/ */
localEntity_t *CG_AllocLocalEntity( void ) { localEntity_t *CG_AllocLocalEntity( void ) {

View file

@ -83,7 +83,7 @@ CLIENT INFO
====================== ======================
CG_ParseAnimationFile CG_ParseAnimationFile
Read a configuration file containing animation coutns and rates Read a configuration file containing animation counts and rates
models/players/visor/animation.cfg, etc models/players/visor/animation.cfg, etc
====================== ======================
*/ */

View file

@ -385,7 +385,7 @@ void CG_CheckLocalSounds( playerState_t *ps, playerState_t *ops ) {
#endif #endif
pushReward(sfx, cgs.media.medalGauntlet, ps->persistant[PERS_GAUNTLET_FRAG_COUNT]); pushReward(sfx, cgs.media.medalGauntlet, ps->persistant[PERS_GAUNTLET_FRAG_COUNT]);
reward = qtrue; reward = qtrue;
//Com_Printf("guantlet frag\n"); //Com_Printf("gauntlet frag\n");
} }
if (ps->persistant[PERS_DEFEND_COUNT] != ops->persistant[PERS_DEFEND_COUNT]) { if (ps->persistant[PERS_DEFEND_COUNT] != ops->persistant[PERS_DEFEND_COUNT]) {
pushReward(cgs.media.defendSound, cgs.media.medalDefend, ps->persistant[PERS_DEFEND_COUNT]); pushReward(cgs.media.defendSound, cgs.media.medalDefend, ps->persistant[PERS_DEFEND_COUNT]);

View file

@ -269,7 +269,7 @@ static void CG_OffsetThirdPersonView( void ) {
VectorCopy( trace.endpos, view ); VectorCopy( trace.endpos, view );
view[2] += (1.0 - trace.fraction) * 32; view[2] += (1.0 - trace.fraction) * 32;
// try another trace to this position, because a tunnel may have the ceiling // try another trace to this position, because a tunnel may have the ceiling
// close enogh that this is poking out // close enough that this is poking out
CG_Trace( &trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID ); CG_Trace( &trace, cg.refdef.vieworg, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID );
VectorCopy( trace.endpos, view ); VectorCopy( trace.endpos, view );

View file

@ -460,7 +460,7 @@ static void CG_NailTrail( centity_t *ent, const weaponInfo_t *wi ) {
/* /*
========================== ==========================
CG_NailTrail CG_PlasmaTrail
========================== ==========================
*/ */
static void CG_PlasmaTrail( centity_t *cent, const weaponInfo_t *wi ) { static void CG_PlasmaTrail( centity_t *cent, const weaponInfo_t *wi ) {

View file

@ -711,6 +711,10 @@ void S_PaintChannels( int endtime ) {
ltime = s_paintedtime; ltime = s_paintedtime;
sc = ch->thesfx; sc = ch->thesfx;
if (sc->soundData==NULL || sc->soundLength==0) {
continue;
}
sampleOffset = ltime - ch->startSample; sampleOffset = ltime - ch->startSample;
count = end - ltime; count = end - ltime;
if ( sampleOffset + count > sc->soundLength ) { if ( sampleOffset + count > sc->soundLength ) {

View file

@ -841,7 +841,7 @@ static void S_AL_SrcSetup(srcHandle_t src, sfxHandle_t sfx, alSrcPriority_t prio
/* /*
================= =================
S_AL_NewLoopMaster S_AL_SaveLoopPos
Remove given source as loop master if it is the master and hand off master status to another source in this case. Remove given source as loop master if it is the master and hand off master status to another source in this case.
================= =================
*/ */

View file

@ -1280,7 +1280,7 @@ int BotAIShutdownClient(int client, qboolean restart) {
} }
trap_BotFreeMoveState(bs->ms); trap_BotFreeMoveState(bs->ms);
//free the goal state` //free the goal state
trap_BotFreeGoalState(bs->gs); trap_BotFreeGoalState(bs->gs);
//free the chat file //free the chat file
trap_BotFreeChatState(bs->cs); trap_BotFreeChatState(bs->cs);

View file

@ -1790,7 +1790,7 @@ static void PM_DropTimers( void ) {
PM_UpdateViewAngles PM_UpdateViewAngles
This can be used as another entry point when only the viewangles This can be used as another entry point when only the viewangles
are being updated isntead of a full move are being updated instead of a full move
================ ================
*/ */
void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ) { void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd ) {

View file

@ -630,7 +630,7 @@ static void ForceClientSkin( gclient_t *client, char *model, const char *skin )
/* /*
=========== ===========
ClientCheckName ClientCleanName
============ ============
*/ */
static void ClientCleanName(const char *in, char *out, int outSize) static void ClientCleanName(const char *in, char *out, int outSize)

View file

@ -476,7 +476,7 @@ void Cmd_Kill_f( gentity_t *ent ) {
/* /*
================= =================
BroadCastTeamChange BroadcastTeamChange
Let everyone know about a team change Let everyone know about a team change
================= =================
@ -1348,7 +1348,7 @@ void Cmd_CallVote_f( gentity_t *ent ) {
trap_SendServerCommand( -1, va("print \"%s called a vote.\n\"", ent->client->pers.netname ) ); trap_SendServerCommand( -1, va("print \"%s called a vote.\n\"", ent->client->pers.netname ) );
// start the voting, the caller autoamtically votes yes // start the voting, the caller automatically votes yes
level.voteTime = level.time; level.voteTime = level.time;
level.voteYes = 1; level.voteYes = 1;
level.voteNo = 0; level.voteNo = 0;
@ -1513,7 +1513,7 @@ void Cmd_CallTeamVote_f( gentity_t *ent ) {
trap_SendServerCommand( i, va("print \"%s called a team vote.\n\"", ent->client->pers.netname ) ); trap_SendServerCommand( i, va("print \"%s called a team vote.\n\"", ent->client->pers.netname ) );
} }
// start the voting, the caller autoamtically votes yes // start the voting, the caller automatically votes yes
level.teamVoteTime[cs_offset] = level.time; level.teamVoteTime[cs_offset] = level.time;
level.teamVoteYes[cs_offset] = 1; level.teamVoteYes[cs_offset] = 1;
level.teamVoteNo[cs_offset] = 0; level.teamVoteNo[cs_offset] = 0;

View file

@ -778,7 +778,7 @@ int G_InvulnerabilityEffect( gentity_t *targ, vec3_t dir, vec3_t point, vec3_t i
#endif #endif
/* /*
============ ============
T_Damage G_Damage
targ entity that is being damaged targ entity that is being damaged
inflictor entity that is causing the damage inflictor entity that is causing the damage

View file

@ -660,7 +660,7 @@ void FinishSpawningItem( gentity_t *ent ) {
ent->r.contents = CONTENTS_TRIGGER; ent->r.contents = CONTENTS_TRIGGER;
ent->touch = Touch_Item; ent->touch = Touch_Item;
// useing an item causes it to respawn // using an item causes it to respawn
ent->use = Use_Item; ent->use = Use_Item;
if ( ent->spawnflags & 1 ) { if ( ent->spawnflags & 1 ) {

View file

@ -1519,7 +1519,7 @@ void Hunk_SmallLog( void) {
/* /*
================= =================
Com_InitZoneMemory Com_InitHunkZoneMemory
================= =================
*/ */
void Com_InitHunkMemory( void ) { void Com_InitHunkMemory( void ) {
@ -3539,7 +3539,7 @@ void Field_AutoComplete( field_t *field )
================== ==================
Com_RandomBytes Com_RandomBytes
fills string array with len radom bytes, peferably from the OS randomizer fills string array with len random bytes, preferably from the OS randomizer
================== ==================
*/ */
void Com_RandomBytes( byte *string, int len ) void Com_RandomBytes( byte *string, int len )

View file

@ -1326,6 +1326,7 @@ long FS_FOpenFileReadDir(const char *filename, searchpath_t *search, fileHandle_
return FS_fplength(filep); return FS_fplength(filep);
} }
*file = 0;
return -1; return -1;
} }

View file

@ -562,7 +562,7 @@ typedef struct {
#define Byte4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3]) #define Byte4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3])
#define SnapVector(v) {v[0]=((int)(v[0]));v[1]=((int)(v[1]));v[2]=((int)(v[2]));} #define SnapVector(v) {v[0]=((int)(v[0]));v[1]=((int)(v[1]));v[2]=((int)(v[2]));}
// just in case you do't want to use the macros // just in case you don't want to use the macros
vec_t _DotProduct( const vec3_t v1, const vec3_t v2 ); vec_t _DotProduct( const vec3_t v1, const vec3_t v2 );
void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out ); void _VectorSubtract( const vec3_t veca, const vec3_t vecb, vec3_t out );
void _VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out ); void _VectorAdd( const vec3_t veca, const vec3_t vecb, vec3_t out );

View file

@ -53,6 +53,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#define RF_SHADOW_PLANE 0x0100 // use refEntity->shadowPlane #define RF_SHADOW_PLANE 0x0100 // use refEntity->shadowPlane
#define RF_WRAP_FRAMES 0x0200 // mod the model frames by the maxframes to allow continuous #define RF_WRAP_FRAMES 0x0200 // mod the model frames by the maxframes to allow continuous
// animation without needing to know the frame count
// refdef flags // refdef flags
#define RDF_NOWORLDMODEL 0x0001 // used for player configuration screen #define RDF_NOWORLDMODEL 0x0001 // used for player configuration screen

View file

@ -1550,7 +1550,7 @@ static void R_LoadFogs( lump_t *l, lump_t *brushesLump, lump_t *sidesLump ) {
} }
count = l->filelen / sizeof(*fogs); count = l->filelen / sizeof(*fogs);
// create fog strucutres for them // create fog structures for them
s_worldData.numfogs = count + 1; s_worldData.numfogs = count + 1;
s_worldData.fogs = ri.Hunk_Alloc ( s_worldData.numfogs*sizeof(*out), h_low); s_worldData.fogs = ri.Hunk_Alloc ( s_worldData.numfogs*sizeof(*out), h_low);
out = s_worldData.fogs + 1; out = s_worldData.fogs + 1;
@ -1776,7 +1776,7 @@ qboolean R_GetEntityToken( char *buffer, int size ) {
s = COM_Parse( &s_worldData.entityParsePoint ); s = COM_Parse( &s_worldData.entityParsePoint );
Q_strncpyz( buffer, s, size ); Q_strncpyz( buffer, s, size );
if ( !s_worldData.entityParsePoint || !s[0] ) { if ( !s_worldData.entityParsePoint && !s[0] ) {
s_worldData.entityParsePoint = s_worldData.entityString; s_worldData.entityParsePoint = s_worldData.entityString;
return qfalse; return qfalse;
} else { } else {

View file

@ -690,7 +690,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
token = COM_ParseExt( text, qfalse ); token = COM_ParseExt( text, qfalse );
if ( !token[0] ) if ( !token[0] )
{ {
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'animMmap' keyword in shader '%s'\n", shader.name ); ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'animMap' keyword in shader '%s'\n", shader.name );
return qfalse; return qfalse;
} }
stage->bundle[0].imageAnimationSpeed = atof( token ); stage->bundle[0].imageAnimationSpeed = atof( token );
@ -728,7 +728,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
token = COM_ParseExt( text, qfalse ); token = COM_ParseExt( text, qfalse );
if ( !token[0] ) if ( !token[0] )
{ {
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'videoMmap' keyword in shader '%s'\n", shader.name ); ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'videoMap' keyword in shader '%s'\n", shader.name );
return qfalse; return qfalse;
} }
stage->bundle[0].videoMapHandle = ri.CIN_PlayCinematic( token, 0, 0, 256, 256, (CIN_loop | CIN_silent | CIN_shader)); stage->bundle[0].videoMapHandle = ri.CIN_PlayCinematic( token, 0, 0, 256, 256, (CIN_loop | CIN_silent | CIN_shader));
@ -1476,7 +1476,7 @@ static qboolean ParseShader( char **text )
continue; continue;
} }
// sun parms // sun parms
else if ( !Q_stricmp( token, "q3map_sun" ) ) { else if ( !Q_stricmp( token, "q3map_sun" ) || !Q_stricmp( token, "q3map_sunExt" ) ) {
float a, b; float a, b;
token = COM_ParseExt( text, qfalse ); token = COM_ParseExt( text, qfalse );
@ -1503,6 +1503,9 @@ static qboolean ParseShader( char **text )
tr.sunDirection[0] = cos( a ) * cos( b ); tr.sunDirection[0] = cos( a ) * cos( b );
tr.sunDirection[1] = sin( a ) * cos( b ); tr.sunDirection[1] = sin( a ) * cos( b );
tr.sunDirection[2] = sin( b ); tr.sunDirection[2] = sin( b );
SkipRestOfLine( text );
continue;
} }
else if ( !Q_stricmp( token, "deformVertexes" ) ) { else if ( !Q_stricmp( token, "deformVertexes" ) ) {
ParseDeform( text ); ParseDeform( text );

View file

@ -44,6 +44,12 @@ uniform vec4 u_NormalScale;
uniform vec4 u_SpecularScale; uniform vec4 u_SpecularScale;
#endif #endif
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
#if defined(USE_CUBEMAP)
uniform vec4 u_CubeMapInfo;
#endif
#endif
varying vec4 var_TexCoords; varying vec4 var_TexCoords;
varying vec4 var_Color; varying vec4 var_Color;
@ -323,19 +329,20 @@ mat3 cotangent_frame( vec3 N, vec3 p, vec2 uv )
void main() void main()
{ {
vec3 viewDir;
vec3 L, N, E, H; vec3 L, N, E, H;
float NL, NH, NE, EH; float NL, NH, NE, EH;
#if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT) #if defined(USE_LIGHT) && !defined(USE_FAST_LIGHT)
#if defined(USE_VERT_TANGENT_SPACE) #if defined(USE_VERT_TANGENT_SPACE)
mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, var_Normal.xyz); mat3 tangentToWorld = mat3(var_Tangent.xyz, var_Bitangent.xyz, var_Normal.xyz);
E = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w); viewDir = vec3(var_Normal.w, var_Tangent.w, var_Bitangent.w);
#else #else
mat3 tangentToWorld = cotangent_frame(var_Normal, -var_ViewDir, var_TexCoords.xy); mat3 tangentToWorld = cotangent_frame(var_Normal, -var_ViewDir, var_TexCoords.xy);
E = var_ViewDir; viewDir = var_ViewDir;
#endif #endif
E = normalize(E); E = normalize(viewDir);
L = var_LightDir.xyz; L = var_LightDir.xyz;
#if defined(USE_DELUXEMAP) #if defined(USE_DELUXEMAP)
@ -497,6 +504,10 @@ void main()
vec3 R = reflect(E, N); vec3 R = reflect(E, N);
// parallax corrected cubemap (cheaper trick)
// from http://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/
R += u_CubeMapInfo.xyz + u_CubeMapInfo.w * viewDir;
vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w; vec3 cubeLightColor = textureCubeLod(u_CubeMap, R, 7.0 - gloss * 7.0).rgb * u_EnableTextures.w;
#if defined(USE_LIGHTMAP) #if defined(USE_LIGHTMAP)

View file

@ -600,8 +600,6 @@ static void R_LoadVisibility( lump_t *l ) {
byte *buf; byte *buf;
len = ( s_worldData.numClusters + 63 ) & ~63; len = ( s_worldData.numClusters + 63 ) & ~63;
s_worldData.novis = ri.Hunk_Alloc( len, h_low );
Com_Memset( s_worldData.novis, 0xff, len );
len = l->filelen; len = l->filelen;
if ( !len ) { if ( !len ) {
@ -2722,7 +2720,7 @@ qboolean R_GetEntityToken( char *buffer, int size ) {
s = COM_Parse( &s_worldData.entityParsePoint ); s = COM_Parse( &s_worldData.entityParsePoint );
Q_strncpyz( buffer, s, size ); Q_strncpyz( buffer, s, size );
if ( !s_worldData.entityParsePoint || !s[0] ) { if ( !s_worldData.entityParsePoint && !s[0] ) {
s_worldData.entityParsePoint = s_worldData.entityString; s_worldData.entityParsePoint = s_worldData.entityString;
return qfalse; return qfalse;
} else { } else {
@ -2749,7 +2747,8 @@ qboolean R_ParseSpawnVars( char *spawnVarChars, int maxSpawnVarChars, int *numSp
return qfalse; return qfalse;
} }
if ( com_token[0] != '{' ) { if ( com_token[0] != '{' ) {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: found %s when expecting {",com_token ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: found %s when expecting {\n",com_token );
return qfalse;
} }
// go through all the key / value pairs // go through all the key / value pairs
@ -2758,7 +2757,8 @@ qboolean R_ParseSpawnVars( char *spawnVarChars, int maxSpawnVarChars, int *numSp
// parse key // parse key
if ( !R_GetEntityToken( keyname, sizeof( keyname ) ) ) { if ( !R_GetEntityToken( keyname, sizeof( keyname ) ) ) {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: EOF without closing brace" ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: EOF without closing brace\n" );
return qfalse;
} }
if ( keyname[0] == '}' ) { if ( keyname[0] == '}' ) {
@ -2767,18 +2767,18 @@ qboolean R_ParseSpawnVars( char *spawnVarChars, int maxSpawnVarChars, int *numSp
// parse value // parse value
if ( !R_GetEntityToken( com_token, sizeof( com_token ) ) ) { if ( !R_GetEntityToken( com_token, sizeof( com_token ) ) ) {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: EOF without closing brace" ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: EOF without closing brace\n" );
break; return qfalse;
} }
if ( com_token[0] == '}' ) { if ( com_token[0] == '}' ) {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: closing brace without data" ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: closing brace without data\n" );
break; return qfalse;
} }
if ( *numSpawnVars == MAX_SPAWN_VARS ) { if ( *numSpawnVars == MAX_SPAWN_VARS ) {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: MAX_SPAWN_VARS" ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: MAX_SPAWN_VARS\n" );
break; return qfalse;
} }
keyLength = strlen(keyname) + 1; keyLength = strlen(keyname) + 1;
@ -2786,8 +2786,8 @@ qboolean R_ParseSpawnVars( char *spawnVarChars, int maxSpawnVarChars, int *numSp
if (numSpawnVarChars + keyLength + tokenLength > maxSpawnVarChars) if (numSpawnVarChars + keyLength + tokenLength > maxSpawnVarChars)
{ {
ri.Printf( PRINT_ALL, "R_ParseSpawnVars: MAX_SPAWN_VAR_CHARS" ); ri.Printf( PRINT_ALL, "R_ParseSpawnVars: MAX_SPAWN_VAR_CHARS\n" );
break; return qfalse;
} }
strcpy(spawnVarChars + numSpawnVarChars, keyname); strcpy(spawnVarChars + numSpawnVarChars, keyname);

View file

@ -142,7 +142,9 @@ static uniformInfo_t uniformsInfo[] =
{ "u_PrimaryLightOrigin", GLSL_VEC4 }, { "u_PrimaryLightOrigin", GLSL_VEC4 },
{ "u_PrimaryLightColor", GLSL_VEC3 }, { "u_PrimaryLightColor", GLSL_VEC3 },
{ "u_PrimaryLightAmbient", GLSL_VEC3 }, { "u_PrimaryLightAmbient", GLSL_VEC3 },
{ "u_PrimaryLightRadius", GLSL_FLOAT } { "u_PrimaryLightRadius", GLSL_FLOAT },
{ "u_CubeMapInfo", GLSL_VEC4 },
}; };

View file

@ -698,6 +698,8 @@ typedef enum
UNIFORM_PRIMARYLIGHTAMBIENT, UNIFORM_PRIMARYLIGHTAMBIENT,
UNIFORM_PRIMARYLIGHTRADIUS, UNIFORM_PRIMARYLIGHTRADIUS,
UNIFORM_CUBEMAPINFO,
UNIFORM_COUNT UNIFORM_COUNT
} uniform_t; } uniform_t;
@ -1179,8 +1181,6 @@ typedef struct {
int clusterBytes; int clusterBytes;
const byte *vis; // may be passed in by CM_LoadMap to save space const byte *vis; // may be passed in by CM_LoadMap to save space
byte *novis; // clusterBytes of 0xff
char *entityString; char *entityString;
char *entityParsePoint; char *entityParsePoint;
} world_t; } world_t;

View file

@ -2863,7 +2863,8 @@ void R_RenderCubemapSide( int cubemapIndex, int cubemapSide, qboolean subscene )
vec3_t ambient, directed, lightDir; vec3_t ambient, directed, lightDir;
R_LightForPoint(tr.refdef.vieworg, ambient, directed, lightDir); R_LightForPoint(tr.refdef.vieworg, ambient, directed, lightDir);
tr.refdef.colorScale = 766.0f / (directed[0] + directed[1] + directed[2] + 1.0f); tr.refdef.colorScale = 766.0f / (directed[0] + directed[1] + directed[2] + 1.0f);
if (directed[0] + directed[1] + directed[2] == 0) // only print message for first side
if (directed[0] + directed[1] + directed[2] == 0 && cubemapSide == 0)
{ {
ri.Printf(PRINT_ALL, "cubemap %d (%f, %f, %f) is outside the lightgrid!\n", cubemapIndex, tr.refdef.vieworg[0], tr.refdef.vieworg[1], tr.refdef.vieworg[2]); ri.Printf(PRINT_ALL, "cubemap %d (%f, %f, %f) is outside the lightgrid!\n", cubemapIndex, tr.refdef.vieworg[0], tr.refdef.vieworg[1], tr.refdef.vieworg[2]);
} }

View file

@ -1378,8 +1378,21 @@ static void RB_IterateStagesGeneric( shaderCommands_t *input )
// testing cube map // testing cube map
// //
if (!(tr.viewParms.flags & VPF_NOCUBEMAPS) && input->cubemapIndex && r_cubeMapping->integer) if (!(tr.viewParms.flags & VPF_NOCUBEMAPS) && input->cubemapIndex && r_cubeMapping->integer)
{
vec4_t vec;
GL_BindToTMU( tr.cubemaps[input->cubemapIndex - 1], TB_CUBEMAP); GL_BindToTMU( tr.cubemaps[input->cubemapIndex - 1], TB_CUBEMAP);
vec[0] = tr.cubemapOrigins[input->cubemapIndex - 1][0] - backEnd.viewParms.or.origin[0];
vec[1] = tr.cubemapOrigins[input->cubemapIndex - 1][1] - backEnd.viewParms.or.origin[1];
vec[2] = tr.cubemapOrigins[input->cubemapIndex - 1][2] - backEnd.viewParms.or.origin[2];
vec[3] = 1.0f;
VectorScale4(vec, 1.0f / 1000.0f, vec);
GLSL_SetUniformVec4(sp, UNIFORM_CUBEMAPINFO, vec);
}
// //
// draw // draw
// //

View file

@ -753,7 +753,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
token = COM_ParseExt( text, qfalse ); token = COM_ParseExt( text, qfalse );
if ( !token[0] ) if ( !token[0] )
{ {
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'animMmap' keyword in shader '%s'\n", shader.name ); ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'animMap' keyword in shader '%s'\n", shader.name );
return qfalse; return qfalse;
} }
stage->bundle[0].imageAnimationSpeed = atof( token ); stage->bundle[0].imageAnimationSpeed = atof( token );
@ -794,7 +794,7 @@ static qboolean ParseStage( shaderStage_t *stage, char **text )
token = COM_ParseExt( text, qfalse ); token = COM_ParseExt( text, qfalse );
if ( !token[0] ) if ( !token[0] )
{ {
ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'videoMmap' keyword in shader '%s'\n", shader.name ); ri.Printf( PRINT_WARNING, "WARNING: missing parameter for 'videoMap' keyword in shader '%s'\n", shader.name );
return qfalse; return qfalse;
} }
stage->bundle[0].videoMapHandle = ri.CIN_PlayCinematic( token, 0, 0, 256, 256, (CIN_loop | CIN_silent | CIN_shader)); stage->bundle[0].videoMapHandle = ri.CIN_PlayCinematic( token, 0, 0, 256, 256, (CIN_loop | CIN_silent | CIN_shader));

View file

@ -644,7 +644,7 @@ R_ClusterPVS
*/ */
static const byte *R_ClusterPVS (int cluster) { static const byte *R_ClusterPVS (int cluster) {
if (!tr.world->vis || cluster < 0 || cluster >= tr.world->numClusters ) { if (!tr.world->vis || cluster < 0 || cluster >= tr.world->numClusters ) {
return tr.world->novis; return NULL;
} }
return tr.world->vis + cluster * tr.world->clusterBytes; return tr.world->vis + cluster * tr.world->clusterBytes;
@ -698,15 +698,13 @@ static void R_MarkLeaves (void) {
for(i = 0; i < MAX_VISCOUNTS; i++) for(i = 0; i < MAX_VISCOUNTS; i++)
{ {
if(tr.visClusters[i] == cluster) // if the areamask or r_showcluster was modified, invalidate all visclusters
// this caused doors to open into undrawn areas
if (tr.refdef.areamaskModified || r_showcluster->modified)
{ {
//tr.visIndex = i; tr.visClusters[i] = -2;
break;
} }
} else if(tr.visClusters[i] == cluster)
// if r_showcluster was just turned on, remark everything
if(i != MAX_VISCOUNTS && !tr.refdef.areamaskModified && !r_showcluster->modified)// && !r_dynamicBspOcclusionCulling->modified)
{ {
if(tr.visClusters[i] != tr.visClusters[tr.visIndex] && r_showcluster->integer) if(tr.visClusters[i] != tr.visClusters[tr.visIndex] && r_showcluster->integer)
{ {
@ -715,12 +713,6 @@ static void R_MarkLeaves (void) {
tr.visIndex = i; tr.visIndex = i;
return; return;
} }
// if the areamask was modified, invalidate all visclusters
// this caused doors to open into undrawn areas
if (tr.refdef.areamaskModified)
{
memset(tr.visClusters, -2, sizeof(tr.visClusters));
} }
tr.visIndex = (tr.visIndex + 1) % MAX_VISCOUNTS; tr.visIndex = (tr.visIndex + 1) % MAX_VISCOUNTS;
@ -734,17 +726,6 @@ static void R_MarkLeaves (void) {
} }
} }
// set all nodes to visible if there is no vis
// this caused some levels to simply not render
if (r_novis->integer || !tr.world->vis || tr.visClusters[tr.visIndex] == -1) {
for (i=0 ; i<tr.world->numnodes ; i++) {
if (tr.world->nodes[i].contents != CONTENTS_SOLID) {
tr.world->nodes[i].visCounts[tr.visIndex] = tr.visCounts[tr.visIndex];
}
}
return;
}
vis = R_ClusterPVS(tr.visClusters[tr.visIndex]); vis = R_ClusterPVS(tr.visClusters[tr.visIndex]);
for (i=0,leaf=tr.world->nodes ; i<tr.world->numnodes ; i++, leaf++) { for (i=0,leaf=tr.world->nodes ; i<tr.world->numnodes ; i++, leaf++) {
@ -754,7 +735,7 @@ static void R_MarkLeaves (void) {
} }
// check general pvs // check general pvs
if ( !(vis[cluster>>3] & (1<<(cluster&7))) ) { if ( vis && !(vis[cluster>>3] & (1<<(cluster&7))) ) {
continue; continue;
} }