Skip to content

Commit b74bd1e

Browse files
committed
Add sun shadow controls to graphics menu
- Added "Sun Shadows" and "Shadow Quality" options to the Graphics menu. - Wired both options into menu state tracking and Apply-button change detection. - Initialized UI values from renderer CVars (r_sunShadows, r_shadowMapSize). - Applied shadow settings on save: - Low -> r_shadowFilter 0, r_shadowMapSize 512 - Medium -> r_shadowFilter 1, r_shadowMapSize 1024 - High -> r_shadowFilter 2, r_shadowMapSize 2048 - Kept options disabled when extensions are off or shadows are disabled. - several small fixes
1 parent 8e73464 commit b74bd1e

File tree

17 files changed

+510
-30
lines changed

17 files changed

+510
-30
lines changed

baseq3r/gfx/hud/derby_panel.png

10.5 KB
Loading

baseq3r/gfx/hud/derby_vehicle.png

132 KB
Loading

baseq3r/gfx/hud/derby_warning.png

6.5 KB
Loading

engine/code/botlib/be_ai_weap.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,10 @@ static weaponconfig_t *weaponconfig;
131131
// global gametype variable declared in be_ai_goal.c
132132
extern int g_gametype;
133133

134-
// Q3Rally specific game type not defined in botlib headers
134+
// Q3Rally specific game type not defined in botlib headers.
135+
// Keep this value aligned with gametype_t in game/bg_public.h.
135136
#ifndef GT_DERBY
136-
#define GT_DERBY 3
137+
#define GT_DERBY 4
137138
#endif
138139

139140
//========================================================================
@@ -540,4 +541,3 @@ void BotShutdownWeaponAI(void)
540541
} //end if
541542
} //end for
542543
} //end of the function BotShutdownWeaponAI
543-

engine/code/cgame/cg_draw.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,11 @@ static void CG_DrawLowerLeft( void ) {
20312031
y = CG_DrawTeamOverlay( y, qfalse, qfalse );
20322032
}
20332033

2034+
/* Derby: vehicle state panel sits at bottom-left (y=376);
2035+
move pickup overlay above it so they don't overlap. */
2036+
if ( cgs.gametype == GT_DERBY && y > 376 ) {
2037+
y = 376;
2038+
}
20342039

20352040
CG_DrawPickupItem( y );
20362041
}
@@ -3143,7 +3148,6 @@ static qboolean CG_DrawScoreboard( void ) {
31433148
}
31443149

31453150
/*
3146-
===================
31473151
CG_DrawIntermission
31483152
===================
31493153
*/

engine/code/cgame/cg_event.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,10 @@ void CG_EntityEvent( centity_t *cent, vec3_t position ) {
976976
}
977977
#endif
978978
} else {
979-
trap_S_StartSound (NULL, es->number, CHAN_AUTO, trap_S_RegisterSound( item->pickup_sound, qfalse ) );
979+
if ( item->pickup_sound ) {
980+
trap_S_StartSound( NULL, es->number, CHAN_AUTO,
981+
trap_S_RegisterSound( item->pickup_sound, qfalse ) );
982+
}
980983
}
981984

982985
// show icon and name on status bar
@@ -1685,4 +1688,3 @@ void CG_CheckEvents( centity_t *cent ) {
16851688

16861689
CG_EntityEvent( cent, cent->lerpOrigin );
16871690
}
1688-

engine/code/cgame/cg_local.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,11 @@ typedef struct {
826826
// blend blobs
827827
float damageTime;
828828
float damageX, damageY, damageValue;
829+
int derbyHitFxTime;
830+
int derbyHitFxLevel;
831+
int derbyHitFxDamage;
832+
int derbyHitFxDir; /* 0=front 1=left 2=right 3=rear */
833+
int derbyLastDamageTaken; /* previous STAT_DAMAGE_TAKEN for delta detection */
829834

830835
// status bar head
831836
float headYaw;
@@ -1092,6 +1097,9 @@ typedef struct {
10921097
qhandle_t SMSnowShader;
10931098
qhandle_t SMIceShader;
10941099
qhandle_t checkpointArrow;
1100+
qhandle_t derbyHudPanelShader;
1101+
qhandle_t derbyHudVehicleShader;
1102+
qhandle_t derbyHudWarningShader;
10951103

10961104

10971105
// weapon effect models
@@ -1596,6 +1604,15 @@ extern vmCvar_t cg_fuelWarningLevel;
15961604
extern vmCvar_t cg_drawBotPaths;
15971605
extern vmCvar_t cg_jukeboxShuffle;
15981606
extern vmCvar_t cg_jukeboxRepeatMode;
1607+
extern vmCvar_t cg_derbyHitFxEnable;
1608+
extern vmCvar_t cg_derbyHitShakeScale;
1609+
extern vmCvar_t cg_derbyHitSoundEnable;
1610+
extern vmCvar_t cg_derbyHitOverlayScale;
1611+
extern vmCvar_t cg_derbyHitOverlayTime;
1612+
extern vmCvar_t cg_derbyVehicleHudX;
1613+
extern vmCvar_t cg_derbyVehicleHudY;
1614+
extern vmCvar_t cg_derbyVehicleHudScale;
1615+
extern vmCvar_t cg_derbyVehicleHudRoof;
15991616
// Q3Rally Code END
16001617

16011618
//
@@ -2304,4 +2321,3 @@ void CG_ParticleMisc (qhandle_t pshader, vec3_t origin, int size, int duration,
23042321
void CG_ParticleExplosion (char *animStr, vec3_t origin, vec3_t vel, int duration, int sizeStart, int sizeEnd);
23052322
extern qboolean initparticles;
23062323
int CG_NewParticleArea ( int num );
2307-

engine/code/cgame/cg_main.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,15 @@ vmCvar_t cg_fuelWarningLevel;
287287
vmCvar_t cg_drawBotPaths;
288288
vmCvar_t cg_jukeboxShuffle;
289289
vmCvar_t cg_jukeboxRepeatMode;
290+
vmCvar_t cg_derbyHitFxEnable;
291+
vmCvar_t cg_derbyHitShakeScale;
292+
vmCvar_t cg_derbyHitSoundEnable;
293+
vmCvar_t cg_derbyHitOverlayScale;
294+
vmCvar_t cg_derbyHitOverlayTime;
295+
vmCvar_t cg_derbyVehicleHudX;
296+
vmCvar_t cg_derbyVehicleHudY;
297+
vmCvar_t cg_derbyVehicleHudScale;
298+
vmCvar_t cg_derbyVehicleHudRoof;
290299

291300

292301
// Q3Rally Code END
@@ -381,6 +390,16 @@ static cvarTable_t cvarTable[] = {
381390
{ &cg_distanceFormat, "cg_distanceFormat", "0", CVAR_ARCHIVE },
382391
{ &cg_jukeboxShuffle, "cg_jukeboxShuffle", "0", CVAR_ARCHIVE },
383392
{ &cg_jukeboxRepeatMode, "cg_jukeboxRepeatMode", "off", CVAR_ARCHIVE },
393+
// Derby hit effects defaults: enabled(1), shake scale(1.0), additional staged sound(1)
394+
{ &cg_derbyHitFxEnable, "cg_derbyHitFxEnable", "1", CVAR_ARCHIVE },
395+
{ &cg_derbyHitShakeScale, "cg_derbyHitShakeScale", "1.0", CVAR_ARCHIVE },
396+
{ &cg_derbyHitSoundEnable, "cg_derbyHitSoundEnable", "1", CVAR_ARCHIVE },
397+
{ &cg_derbyHitOverlayScale, "cg_derbyHitOverlayScale", "1.6", CVAR_ARCHIVE },
398+
{ &cg_derbyHitOverlayTime, "cg_derbyHitOverlayTime", "360", CVAR_ARCHIVE },
399+
{ &cg_derbyVehicleHudX, "cg_derbyVehicleHudX", "8", CVAR_ARCHIVE },
400+
{ &cg_derbyVehicleHudY, "cg_derbyVehicleHudY", "24", 0 },
401+
{ &cg_derbyVehicleHudScale, "cg_derbyVehicleHudScale", "1.0", CVAR_ARCHIVE },
402+
{ &cg_derbyVehicleHudRoof, "cg_derbyVehicleHudRoof", "1", CVAR_ARCHIVE },
384403

385404
{ &cg_developer, "developer", "0", 0 },
386405

@@ -1130,6 +1149,9 @@ static void CG_RegisterGraphics( void ) {
11301149
cgs.media.checkpointArrow = trap_R_RegisterModel("gfx/hud/arrow.md3");
11311150
cgs.media.gaugeImperial = trap_R_RegisterShaderNoMip("gfx/hud/gauge01" );
11321151
cgs.media.gaugeMetric = trap_R_RegisterShaderNoMip("gfx/hud/gauge_metric" );
1152+
cgs.media.derbyHudPanelShader = trap_R_RegisterShaderNoMip("gfx/hud/derby_panel");
1153+
cgs.media.derbyHudVehicleShader = trap_R_RegisterShaderNoMip("gfx/hud/derby_vehicle");
1154+
cgs.media.derbyHudWarningShader = trap_R_RegisterShaderNoMip("gfx/hud/derby_warning");
11331155
// Q3Rally Code END
11341156

11351157
// powerup shaders

engine/code/cgame/cg_playerstate.c

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,67 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2424

2525
#include "cg_local.h"
2626

27+
28+
typedef enum {
29+
DERBY_HIT_LIGHT = 0,
30+
DERBY_HIT_MEDIUM,
31+
DERBY_HIT_HEAVY
32+
} derbyHitIntensity_t;
33+
34+
#define DERBY_HIT_MEDIUM_THRESHOLD 12
35+
#define DERBY_HIT_HEAVY_THRESHOLD 25
36+
37+
static derbyHitIntensity_t CG_DerbyHitIntensityForDamage( int damage ) {
38+
if ( damage > DERBY_HIT_HEAVY_THRESHOLD ) {
39+
return DERBY_HIT_HEAVY;
40+
}
41+
if ( damage > DERBY_HIT_MEDIUM_THRESHOLD ) {
42+
return DERBY_HIT_MEDIUM;
43+
}
44+
return DERBY_HIT_LIGHT;
45+
}
46+
47+
static void CG_ApplyDerbyHitImpact( int damage ) {
48+
float shakeScale;
49+
derbyHitIntensity_t intensity;
50+
51+
if ( cgs.gametype != GT_DERBY || !cg_derbyHitFxEnable.integer ) {
52+
return;
53+
}
54+
55+
intensity = CG_DerbyHitIntensityForDamage( damage );
56+
cg.derbyHitFxTime = cg.time;
57+
cg.derbyHitFxDamage = damage;
58+
cg.derbyHitFxLevel = intensity;
59+
60+
shakeScale = cg_derbyHitShakeScale.value;
61+
if ( shakeScale < 0.0f ) {
62+
shakeScale = 0.0f;
63+
}
64+
65+
if ( shakeScale > 0.0f ) {
66+
67+
static const float kickByIntensity[] = { 4.0f, 7.5f, 11.0f };
68+
69+
float kick = kickByIntensity[intensity] * shakeScale;
70+
cg.v_dmg_roll += crandom() * kick;
71+
cg.v_dmg_pitch -= kick;
72+
cg.v_dmg_time = cg.time + DAMAGE_TIME;
73+
}
74+
75+
if ( cg_derbyHitSoundEnable.integer ) {
76+
if ( intensity == DERBY_HIT_HEAVY ) {
77+
78+
trap_S_StartLocalSound( cgs.media.damage75[(int)(random() * 2)], CHAN_LOCAL_SOUND );
79+
} else if ( intensity == DERBY_HIT_MEDIUM ) {
80+
trap_S_StartLocalSound( cgs.media.damage50[(int)(random() * 2)], CHAN_LOCAL_SOUND );
81+
} else {
82+
trap_S_StartLocalSound( cgs.media.damage25[(int)(random() * 2)], CHAN_LOCAL_SOUND );
83+
}
84+
85+
}
86+
}
87+
2788
/*
2889
==============
2990
CG_CheckAmmo
@@ -521,14 +582,10 @@ void CG_TransitionPlayerState( playerState_t *ps, playerState_t *ops ) {
521582
cg.car.fuel = ps->stats[STAT_FUEL];
522583

523584
// damage events (player is getting wounded)
524-
// STONELANCE using damagePitch and Yaw for view
525-
/*
526585
if ( ps->damageEvent != ops->damageEvent && ps->damageCount ) {
527-
// CG_DamageFeedback( ps->damageYaw, ps->damagePitch, ps->damageCount );
528-
CG_DamageFeedback( 0, 0, ps->damageCount );
586+
587+
CG_ApplyDerbyHitImpact( ps->damageCount );
529588
}
530-
*/
531-
// END
532589

533590
// respawning
534591
if ( ps->persistant[PERS_SPAWN_COUNT] != ops->persistant[PERS_SPAWN_COUNT] ) {

0 commit comments

Comments
 (0)