Fix fighter visuals after landing snap (#67)
CI / build-and-test (push) Successful in 1m47s
CI / production-build (push) Successful in 11m8s

## Summary

- Mark landing position corrections as presentation discontinuities.
- Render and frame fighters from the current position for the snap frame.
- Keep previous translation history unchanged for gameplay collision and attack logic.

Reviewed-on: #67
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #67.
This commit is contained in:
2026-09-26 15:54:25 +00:00
committed by EIREXE
parent 62aa598324
commit 94e292026e
6 changed files with 69 additions and 8 deletions
+1
View File
@@ -123,6 +123,7 @@ pub fn collision_interrupt(
ctx.ecb.left -= diff;
ctx.ecb.right -= diff;
ctx.translation.0 = res.hit_position;
ctx.presentation_snap.0 = true;
ctx.surface.land(res.line_id);
Some(FighterState::Land(LandingState::create(landing_type)))
}
+4
View File
@@ -376,6 +376,7 @@ mod tests {
right: FGVec2::lit("0.5", "0.0"),
};
let previous_ecb = FighterPreviousECB::from(ecb);
let mut presentation_snap = crate::fighter::FighterPresentationSnap::default();
let mut context = CollisionContext {
translation: &mut translation,
prev_translation: &previous_translation,
@@ -386,6 +387,7 @@ mod tests {
prev_ecb: &previous_ecb,
stage_collision: &stage_collision,
leave_ground_ecb_lock_duration: 10,
presentation_snap: &mut presentation_snap,
downward_stick_threshold: FGi32::ONE,
};
@@ -429,6 +431,7 @@ mod tests {
right: FGVec2::lit("0.5", "0.0"),
};
let previous_ecb = FighterPreviousECB::from(ecb);
let mut presentation_snap = crate::fighter::FighterPresentationSnap::default();
let mut context = CollisionContext {
translation: &mut translation,
prev_translation: &previous_translation,
@@ -439,6 +442,7 @@ mod tests {
prev_ecb: &previous_ecb,
stage_collision: &stage_collision,
leave_ground_ecb_lock_duration: 10,
presentation_snap: &mut presentation_snap,
downward_stick_threshold: FGi32::ONE,
};
+4
View File
@@ -20,6 +20,7 @@ use crate::fighter::{
Fighter, FighterECB, FighterFacingDirection, FighterHitboxes, FighterHitstop,
FighterHitstopShake, FighterHitstopShakeKind, FighterHitstopShakeRole,
FighterPreviousTranslation, FighterSurfaceState, FighterTranslation, FighterVelocity,
FighterPresentationSnap,
};
use crate::fighter::surface::EcbLockPolicy;
use crate::game_settings::GameSettings;
@@ -200,6 +201,7 @@ pub struct CollisionContext<'a> {
pub prev_ecb: &'a FighterPreviousECB,
pub stage_collision: &'a StageCollision,
pub leave_ground_ecb_lock_duration: u32,
pub presentation_snap: &'a mut FighterPresentationSnap,
pub downward_stick_threshold: FGi32,
}
@@ -244,6 +246,7 @@ fighter_states! {
pub struct FighterFrameQuery {
pub translation: &'static mut FighterTranslation,
pub prev_translation: &'static mut FighterPreviousTranslation,
pub presentation_snap: &'static mut FighterPresentationSnap,
pub input: &'static mut FighterInput,
pub hitboxes: &'static mut FighterHitboxes,
pub velocity: &'static mut FighterVelocity,
@@ -354,6 +357,7 @@ impl<'w, 's> FighterFrameQueryItem<'w, 's> {
CollisionContext {
translation: &mut self.translation,
prev_translation: &self.prev_translation,
presentation_snap: &mut self.presentation_snap,
input: &self.input,
velocity: &mut self.velocity,
surface: &mut self.surface,