Skip to content

Commit

Permalink
Experiment with different approach to shake effect on damage
Browse files Browse the repository at this point in the history
  • Loading branch information
bradharding committed Jun 28, 2024
1 parent e017926 commit 7f1b853
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 7 deletions.
16 changes: 15 additions & 1 deletion src/c_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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."),
Expand Down Expand Up @@ -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
//
Expand Down
58 changes: 52 additions & 6 deletions src/i_video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -80,6 +78,8 @@ static int WIDESCREENWIDTH;
bool nowidescreen = false;
bool vid_widescreen_copy;

int shakedamage;

int MAPWIDTH;
int MAPHEIGHT = VANILLAHEIGHT * 2;
int MAPAREA;
Expand Down Expand Up @@ -808,51 +808,95 @@ 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();

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

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);
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/i_video.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 7f1b853

Please sign in to comment.