From 7f1b85339f56c004edbe87dfa7b91924e516a3c1 Mon Sep 17 00:00:00 2001 From: Brad Harding Date: Fri, 28 Jun 2024 19:28:41 +1000 Subject: [PATCH] Experiment with different approach to shake effect on damage --- src/c_cmds.c | 16 +++++++++++++- src/i_video.c | 58 +++++++++++++++++++++++++++++++++++++++++++++------ src/i_video.h | 2 ++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/c_cmds.c b/src/c_cmds.c index bec483d6f..8cef83620 100644 --- a/src/c_cmds.c +++ b/src/c_cmds.c @@ -474,6 +474,7 @@ static void r_randomstartframes_func2(char *cmd, char *parms); static void r_rockettrails_translucency_func2(char *cmd, char *parms); static void r_screensize_func2(char *cmd, char *parms); static void r_shadows_translucency_func2(char *cmd, char *parms); +static void r_shake_damage_func2(char *cmd, char *parms); static void r_sprites_translucency_func2(char *cmd, char *parms); static void r_textures_func2(char *cmd, char *parms); static void r_textures_translucency_func2(char *cmd, char *parms); @@ -912,7 +913,7 @@ consolecmd_t consolecmds[] = "Toggles shaking your view when you are near an exploding barrel."), CVAR_BOOL(r_shake_berserk, "", "", bool_cvars_func1, bool_cvars_func2, CF_NONE, BOOLVALUEALIAS, "Toggles shaking your view when you have a berserk power-up and punch something."), - CVAR_INT(r_shake_damage, "", "", int_cvars_func1, int_cvars_func2, CF_PERCENT, NOVALUEALIAS, + CVAR_INT(r_shake_damage, "", "", int_cvars_func1, r_shake_damage_func2, CF_PERCENT, NOVALUEALIAS, "The amount your view shakes when you take damage (" BOLD("0%") " to " BOLD("100%") ")."), CVAR_BOOL(r_sprites_translucency, "", "", bool_cvars_func1, r_sprites_translucency_func2, CF_NONE, BOOLVALUEALIAS, "Toggles the translucency of certain sprites."), @@ -10660,6 +10661,19 @@ static void r_rockettrails_translucency_func2(char *cmd, char *parms) R_InitColumnFunctions(); } +// +// r_shake_damage CVAR +// +static void r_shake_damage_func2(char *cmd, char *parms) +{ + const int r_shake_damage_old = r_shake_damage; + + int_cvars_func2(cmd, parms); + + if (r_shake_damage != r_shake_damage_old) + shakedamage = (int)(7.0f * r_shake_damage / 100.0f) + 1; +} + // // r_textures CVAR // diff --git a/src/i_video.c b/src/i_video.c index ddc15c2d6..de06d7504 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -66,8 +66,6 @@ void I_InitWindows32(void); #endif -#define SHAKEANGLE ((double)M_BigRandomInt(-1000, 1000) * r_shake_damage / 200000.0) - int SCREENWIDTH; int SCREENHEIGHT = VANILLAHEIGHT * 2; int SCREENAREA; @@ -80,6 +78,8 @@ static int WIDESCREENWIDTH; bool nowidescreen = false; bool vid_widescreen_copy; +int shakedamage; + int MAPWIDTH; int MAPHEIGHT = VANILLAHEIGHT * 2; int MAPAREA; @@ -808,43 +808,79 @@ static void I_Blit_NearestLinear_ShowFPS(void) static void I_Blit_Shake(void) { + int x = dest_rect.x; + int y = dest_rect.y; + UpdateGrab(); SDL_LowerBlit(surface, &src_rect, buffer, &src_rect); SDL_UpdateTexture(texture, NULL, pixels, pitch); SDL_RenderClear(renderer); - SDL_RenderCopyEx(renderer, texture, NULL, &dest_rect, SHAKEANGLE, NULL, SDL_FLIP_NONE); + + dest_rect.x += M_BigRandomInt(-shakedamage, shakedamage); + dest_rect.y += M_BigRandomInt(-shakedamage, shakedamage); + + SDL_RenderCopy(renderer, texture_upscaled, NULL, &dest_rect); + + dest_rect.x = x; + dest_rect.y = y; + SDL_RenderPresent(renderer); } static void I_Blit_NearestLinear_Shake(void) { + int x = dest_rect.x; + int y = dest_rect.y; + UpdateGrab(); SDL_LowerBlit(surface, &src_rect, buffer, &src_rect); SDL_UpdateTexture(texture, NULL, pixels, pitch); SDL_RenderClear(renderer); SDL_SetRenderTarget(renderer, texture_upscaled); - SDL_RenderCopyEx(renderer, texture, NULL, NULL, SHAKEANGLE, NULL, SDL_FLIP_NONE); + SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_SetRenderTarget(renderer, NULL); + + dest_rect.x += M_BigRandomInt(-shakedamage, shakedamage); + dest_rect.y += M_BigRandomInt(-shakedamage, shakedamage); + SDL_RenderCopy(renderer, texture_upscaled, NULL, &dest_rect); + + dest_rect.x = x; + dest_rect.y = y; + SDL_RenderPresent(renderer); } static void I_Blit_ShowFPS_Shake(void) { + int x = dest_rect.x; + int y = dest_rect.y; + UpdateGrab(); CalculateFPS(); SDL_LowerBlit(surface, &src_rect, buffer, &src_rect); SDL_UpdateTexture(texture, NULL, pixels, pitch); SDL_RenderClear(renderer); - SDL_RenderCopyEx(renderer, texture, NULL, &dest_rect, SHAKEANGLE, NULL, SDL_FLIP_NONE); + + dest_rect.x += M_BigRandomInt(-shakedamage, shakedamage); + dest_rect.y += M_BigRandomInt(-shakedamage, shakedamage); + + SDL_RenderCopy(renderer, texture_upscaled, NULL, &dest_rect); + + dest_rect.x = x; + dest_rect.y = y; + SDL_RenderPresent(renderer); } static void I_Blit_NearestLinear_ShowFPS_Shake(void) { + int x = dest_rect.x; + int y = dest_rect.y; + UpdateGrab(); CalculateFPS(); @@ -852,7 +888,15 @@ static void I_Blit_NearestLinear_ShowFPS_Shake(void) SDL_UpdateTexture(texture, NULL, pixels, pitch); SDL_RenderClear(renderer); SDL_SetRenderTarget(renderer, texture_upscaled); - SDL_RenderCopyEx(renderer, texture, NULL, NULL, SHAKEANGLE, NULL, SDL_FLIP_NONE); + + dest_rect.x += M_BigRandomInt(-shakedamage, shakedamage); + dest_rect.y += M_BigRandomInt(-shakedamage, shakedamage); + + SDL_RenderCopy(renderer, texture_upscaled, NULL, &dest_rect); + + dest_rect.x = x; + dest_rect.y = y; + SDL_SetRenderTarget(renderer, NULL); SDL_RenderCopy(renderer, texture_upscaled, NULL, &dest_rect); SDL_RenderPresent(renderer); @@ -1972,6 +2016,8 @@ void I_InitGraphics(void) vid_widescreen_copy = vid_widescreen; vid_widescreen = false; + shakedamage = (int)(7.0f * r_shake_damage / 100.0f) + 1; + I_GetScreenDimensions(); #if defined(_WIN32) diff --git a/src/i_video.h b/src/i_video.h index 0795c47f8..c157de2d5 100644 --- a/src/i_video.h +++ b/src/i_video.h @@ -125,6 +125,8 @@ extern int WIDEFOVDELTA; extern bool nowidescreen; extern bool vid_widescreen_copy; +extern int shakedamage; + extern int MAPWIDTH; extern int MAPHEIGHT; extern int MAPAREA;