From 915f0f18139108693e53ff2adc16c5575d780b3d Mon Sep 17 00:00:00 2001 From: jnmartin84 Date: Sun, 13 Apr 2025 13:51:24 -0400 Subject: [PATCH 1/3] reimplement camera shake --- src/wipeout/camera.c | 16 ++++++++++++++++ src/wipeout/camera.h | 7 +++++++ src/wipeout/race.c | 5 ++++- src/wipeout/ship_player.c | 2 +- src/wipeout/weapon.c | 7 ++++--- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/wipeout/camera.c b/src/wipeout/camera.c index 382f151..47b47f2 100755 --- a/src/wipeout/camera.c +++ b/src/wipeout/camera.c @@ -37,6 +37,7 @@ void camera_update(camera_t *camera, ship_t *ship, droid_t *droid) { camera->last_position = camera->position; (camera->update_func)(camera, ship, droid); camera->real_velocity = vec3_mulf(vec3_sub(camera->position, camera->last_position), 1.0/system_tick()); + camera_update_shake(camera); } void camera_update_race_external(camera_t *camera, ship_t *ship, droid_t *droid) { @@ -173,3 +174,18 @@ void camera_update_attract_random(camera_t *camera, ship_t *ship, droid_t *droid (camera->update_func)(camera, ship, droid); } + +void camera_set_shake(camera_t *camera, float duration) { + camera->shake_timer = duration; +} + +void camera_update_shake(camera_t *camera) { + if (camera->shake_timer > 0.0f) { + camera->shake.x = (-(rand_float(0.0f, camera->shake_timer)) + (camera->shake_timer * 0.5f)); + camera->shake.y = (-(rand_float(0.0f, camera->shake_timer)) + (camera->shake_timer * 0.5f)); + camera->shake_timer -= system_tick(); + } + else { + camera->shake.x = camera->shake.y = camera->shake_timer = 0.0f; + } +} diff --git a/src/wipeout/camera.h b/src/wipeout/camera.h index 40d8dc9..a5f2bbc 100755 --- a/src/wipeout/camera.h +++ b/src/wipeout/camera.h @@ -4,6 +4,9 @@ #include "../types.h" #include "droid.h" +#define LONG_SHAKE (20.0f * (1.0f / 30.0f)) +#define SHORT_SHAKE (2.0f * (1.0f / 30.0f)) + typedef struct camera_t { vec3_t position; vec3_t velocity; @@ -15,6 +18,8 @@ typedef struct camera_t { bool has_initial_section; float update_timer; void (*update_func)(struct camera_t *, ship_t *, droid_t *); + vec2_t shake; + float shake_timer; } camera_t; void camera_init(camera_t *camera, section_t *section); @@ -28,5 +33,7 @@ void camera_update_attract_internal(camera_t *, ship_t *camShip, droid_t *); void camera_update_static_follow(camera_t *, ship_t *camShip, droid_t *); void camera_update_attract_random(camera_t *, ship_t *camShip, droid_t *); void camera_update_rescue(camera_t *, ship_t *camShip, droid_t *); +void camera_set_shake(camera_t *, float duration); +void camera_update_shake(camera_t *); #endif diff --git a/src/wipeout/race.c b/src/wipeout/race.c index e3f0fac..9c4b2ae 100755 --- a/src/wipeout/race.c +++ b/src/wipeout/race.c @@ -3,6 +3,7 @@ #include "../platform.h" #include "../system.h" #include "../utils.h" +#include "../render.h" #include "object.h" #include "track.h" @@ -104,9 +105,10 @@ void race_update(void) { // Draw 3D render_set_view(g.camera.position, g.camera.angle); + render_set_screen_position(g.camera.shake); render_set_cull_backface(false); - scene_draw(&g.camera); + scene_draw(&g.camera); track_draw(&g.camera); render_set_cull_backface(true); @@ -116,6 +118,7 @@ void race_update(void) { particles_draw(); // Draw 2d + render_set_screen_position(vec2(0,0)); render_set_view_2d(); if (flags_is(g.ships[g.pilot].flags, SHIP_RACING)) { diff --git a/src/wipeout/ship_player.c b/src/wipeout/ship_player.c index edd2bb4..0dc4b9a 100644 --- a/src/wipeout/ship_player.c +++ b/src/wipeout/ship_player.c @@ -202,7 +202,7 @@ void ship_player_update_race(ship_t *self) { if (self->ebolt_effect_timer > 0.1) { self->ebolt_effect_timer -= 0.1; if (flags_is(self->flags, SHIP_VIEW_INTERNAL)) { - // SetShake(2); // FIXME + camera_set_shake(&g.camera, SHORT_SHAKE); } self->angular_velocity.y += rand_float(-0.5, 0.5); diff --git a/src/wipeout/weapon.c b/src/wipeout/weapon.c index 5107784..ac8078f 100755 --- a/src/wipeout/weapon.c +++ b/src/wipeout/weapon.c @@ -9,6 +9,7 @@ #include "game.h" #include "image.h" #include "particle.h" +#include "camera.h" extern int32_t ctrlNeedTargetIcon; extern int ctrlnearShip; @@ -384,7 +385,7 @@ void weapon_update_mine(weapon_t *self) { if (flags_not(ship->flags, SHIP_SHIELDED)) { if (ship->pilot == g.pilot) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.125)); - // SetShake(20); // FIXME + camera_set_shake(&g.camera, LONG_SHAKE); } else { ship->speed = ship->speed * 0.125; @@ -434,7 +435,7 @@ void weapon_update_missile(weapon_t *self) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.75)); ship->angular_velocity.z += rand_float(-0.1, 0.1); ship->turn_rate_from_hit = rand_float(-0.1, 0.1); - // SetShake(20); // FIXME + camera_set_shake(&g.camera, LONG_SHAKE); } else { ship->speed = ship->speed * 0.03125; @@ -482,7 +483,7 @@ void weapon_update_rocket(weapon_t *self) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.75)); ship->angular_velocity.z += rand_float(-0.1, 0.1);; ship->turn_rate_from_hit = rand_float(-0.1, 0.1);; - // SetShake(20); // FIXME + camera_set_shake(&g.camera, LONG_SHAKE); } else { ship->speed = ship->speed * 0.03125; From f9e031b4eb9c4308e83e266bf864771ae1958091 Mon Sep 17 00:00:00 2001 From: jnmartin84 Date: Sun, 13 Apr 2025 22:10:19 -0400 Subject: [PATCH 2/3] LONG/SHORT_SHAKE -> CAMERA_SHAKE_LONG/SHORT --- src/wipeout/camera.h | 4 ++-- src/wipeout/ship_player.c | 2 +- src/wipeout/weapon.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/wipeout/camera.h b/src/wipeout/camera.h index a5f2bbc..32f32ba 100755 --- a/src/wipeout/camera.h +++ b/src/wipeout/camera.h @@ -4,8 +4,8 @@ #include "../types.h" #include "droid.h" -#define LONG_SHAKE (20.0f * (1.0f / 30.0f)) -#define SHORT_SHAKE (2.0f * (1.0f / 30.0f)) +#define CAMERA_SHAKE_LONG (20.0f * (1.0f / 30.0f)) +#define CAMERA_SHAKE_SHORT (2.0f * (1.0f / 30.0f)) typedef struct camera_t { vec3_t position; diff --git a/src/wipeout/ship_player.c b/src/wipeout/ship_player.c index 0dc4b9a..7a6c126 100644 --- a/src/wipeout/ship_player.c +++ b/src/wipeout/ship_player.c @@ -202,7 +202,7 @@ void ship_player_update_race(ship_t *self) { if (self->ebolt_effect_timer > 0.1) { self->ebolt_effect_timer -= 0.1; if (flags_is(self->flags, SHIP_VIEW_INTERNAL)) { - camera_set_shake(&g.camera, SHORT_SHAKE); + camera_set_shake(&g.camera, CAMERA_SHAKE_SHORT); } self->angular_velocity.y += rand_float(-0.5, 0.5); diff --git a/src/wipeout/weapon.c b/src/wipeout/weapon.c index ac8078f..498b0fb 100755 --- a/src/wipeout/weapon.c +++ b/src/wipeout/weapon.c @@ -385,7 +385,7 @@ void weapon_update_mine(weapon_t *self) { if (flags_not(ship->flags, SHIP_SHIELDED)) { if (ship->pilot == g.pilot) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.125)); - camera_set_shake(&g.camera, LONG_SHAKE); + camera_set_shake(&g.camera, CAMERA_SHAKE_LONG); } else { ship->speed = ship->speed * 0.125; @@ -435,7 +435,7 @@ void weapon_update_missile(weapon_t *self) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.75)); ship->angular_velocity.z += rand_float(-0.1, 0.1); ship->turn_rate_from_hit = rand_float(-0.1, 0.1); - camera_set_shake(&g.camera, LONG_SHAKE); + camera_set_shake(&g.camera, CAMERA_SHAKE_LONG); } else { ship->speed = ship->speed * 0.03125; @@ -483,7 +483,7 @@ void weapon_update_rocket(weapon_t *self) { ship->velocity = vec3_sub(ship->velocity, vec3_mulf(ship->velocity, 0.75)); ship->angular_velocity.z += rand_float(-0.1, 0.1);; ship->turn_rate_from_hit = rand_float(-0.1, 0.1);; - camera_set_shake(&g.camera, LONG_SHAKE); + camera_set_shake(&g.camera, CAMERA_SHAKE_LONG); } else { ship->speed = ship->speed * 0.03125; From 67312c23b1588ae82279474c8e4d55028df99dec Mon Sep 17 00:00:00 2001 From: jnmartin84 Date: Sun, 13 Apr 2025 22:10:40 -0400 Subject: [PATCH 3/3] fix indentation --- src/wipeout/camera.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wipeout/camera.c b/src/wipeout/camera.c index 47b47f2..3f777ea 100755 --- a/src/wipeout/camera.c +++ b/src/wipeout/camera.c @@ -185,7 +185,7 @@ void camera_update_shake(camera_t *camera) { camera->shake.y = (-(rand_float(0.0f, camera->shake_timer)) + (camera->shake_timer * 0.5f)); camera->shake_timer -= system_tick(); } - else { + else { camera->shake.x = camera->shake.y = camera->shake_timer = 0.0f; - } + } }