Add mechanism to ignore platforms (#63)
CI / build-and-test (push) Successful in 1m30s
CI / production-build (push) Successful in 10m48s

Reviewed-on: #63
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #63.
This commit is contained in:
2026-09-25 21:43:49 +00:00
committed by EIREXE
parent 946bbc4cbd
commit 66a817cd05
6 changed files with 161 additions and 16 deletions
+53
View File
@@ -44,6 +44,7 @@ pub fn air_collide_with_stage(
prev_ecb: &FighterPreviousECB,
ecb: &FighterECB,
stage_collision: &StageCollision,
ignored_polys: &[usize],
) -> Option<AirCollisionWithStageResult> {
let ray_segment = FGSegment2d::new(
prev_translation.0 + prev_ecb.get_bottom_point(),
@@ -54,6 +55,7 @@ pub fn air_collide_with_stage(
.stage_polys
.iter()
.enumerate()
.filter(|(poly_idx, _)| !ignored_polys.contains(poly_idx))
.filter_map(|(poly_idx, poly)| {
poly.intersect_ray(ray_segment).map(|intersect_result| {
(
@@ -76,3 +78,54 @@ pub fn air_collide_with_stage(
.max_by(|(_, a), (_, b)| a.cmp(b))
.map(|(result, _)| result)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::fighter::ecb::{FighterECB, FighterPreviousECB};
use crate::stage::line::{StagePoly, StagePolyLineSegmentType, StagePolyType};
fn horizontal_platform(y: &str) -> StagePoly {
StagePoly::build(
StagePolyType::Platform,
&[
(FGVec2::lit("-2", y), StagePolyLineSegmentType::Floor),
(FGVec2::lit("2", y), StagePolyLineSegmentType::Floor),
],
)
}
#[test]
fn airborne_collision_skips_ignored_polygons() {
let stage_collision = StageCollision {
stage_polys: vec![horizontal_platform("0"), horizontal_platform("1")],
};
let previous_translation = FighterPreviousTranslation(FGVec2::lit("0", "2"));
let translation = FighterTranslation(FGVec2::lit("0", "-1"));
let previous_ecb = FighterPreviousECB {
bottom: FGVec2::ZERO,
top: FGVec2::ZERO,
left: FGVec2::ZERO,
right: FGVec2::ZERO,
};
let ecb = FighterECB {
bottom: FGVec2::ZERO,
top: FGVec2::ZERO,
left: FGVec2::ZERO,
right: FGVec2::ZERO,
};
let collision = air_collide_with_stage(
&previous_translation,
&translation,
&previous_ecb,
&ecb,
&stage_collision,
&[1],
)
.expect("the non-ignored platform should still be collidable");
assert_eq!(collision.line_id.polygon, 0);
assert_eq!(collision.hit_position, FGVec2::lit("0", "0"));
}
}