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
+9 -5
View File
@@ -5,7 +5,7 @@ use bevy_ggrs::GgrsFrameTiming;
use crate::{
debug_tools::DebugSettings,
fighter::{manifest::FighterManifest, motion::sample_presentation_translation},
fighter::{manifest::FighterManifest, motion::{sample_presentation_translation_with_snap, FighterPresentationSnap}},
stage::manifest::StageCameraProfile,
};
@@ -313,6 +313,7 @@ fn update_match_camera(
&crate::fighter::motion::FighterPreviousTranslation,
&crate::fighter::Fighter,
&crate::fighter::FighterFacingDirection,
&FighterPresentationSnap,
&mut FighterCameraExtents,
),
With<crate::player::Player>,
@@ -329,16 +330,17 @@ fn update_match_camera(
let subjects = fighters
.iter_mut()
.map(
|(translation, previous_translation, fighter, facing, mut extents)| {
|(translation, previous_translation, fighter, facing, presentation_snap, mut extents)| {
let manifest = manifests
.get(&fighter.manifest)
.expect("Fighter manifest should be valid");
fighter_subject_bounds(
sample_presentation_translation(
sample_presentation_translation_with_snap(
*previous_translation,
*translation,
timing.overstep_fraction(),
debug_settings.motion_sampling,
*presentation_snap,
),
manifest.camera,
*facing,
@@ -465,6 +467,7 @@ fn debug_draw_camera(
&crate::fighter::motion::FighterPreviousTranslation,
&crate::fighter::Fighter,
&crate::fighter::FighterFacingDirection,
&FighterPresentationSnap,
&FighterCameraExtents,
),
With<crate::player::Player>,
@@ -486,15 +489,16 @@ fn debug_draw_camera(
Color::srgb(1.0, 0.5, 0.0),
);
draw_rectangle(&mut gizmos, camera.frame, Color::srgb(1.0, 1.0, 0.0));
for (translation, previous_translation, fighter, _facing, extents) in &fighters {
for (translation, previous_translation, fighter, _facing, presentation_snap, extents) in &fighters {
let manifest = manifests
.get(&fighter.manifest)
.expect("Fighter manifest should be valid");
let center = sample_presentation_translation(
let center = sample_presentation_translation_with_snap(
*previous_translation,
*translation,
timing.overstep_fraction(),
debug_settings.motion_sampling,
*presentation_snap,
) + Vec2::Y * manifest.camera.vertical_origin_offset.to_num::<f32>();
draw_rectangle(
&mut gizmos,