Implement filled gizmos (#70)
CI / production-build (push) Canceled after 0s
CI / build-and-test (push) Canceled after 1m57s

Reviewed-on: #70
Co-authored-by: Álex Román Núñez <eirexe@eirteam.moe>
This commit was merged in pull request #70.
This commit is contained in:
2026-09-26 17:55:35 +00:00
committed by EIREXE
parent 90412fa80d
commit 0d1b98d406
4 changed files with 492 additions and 23 deletions
+41 -23
View File
@@ -1,10 +1,9 @@
//! Fighter debug views: gizmos and the egui inspector window.
use std::sync::OnceLock;
use bevy::color::palettes::css::ORANGE;
use bevy::{color::palettes::css::YELLOW, prelude::*};
use bevy_egui::{EguiContexts, egui};
use bevy::color::palettes::css::{ORANGE, ORANGE_RED, WHITE};
use bevy::prelude::*;
use bevy_egui::{egui, EguiContexts};
use crate::debug_tools::{DebugSettings, FighterDebugRowKind};
use crate::fighter::animation::FighterAnimationFrame;
@@ -15,14 +14,14 @@ use crate::fighter::attack::{
use crate::fighter::baked_animation::{BakedFighterAnimations, FighterBoneMatrices};
use crate::fighter::ecb::FighterPreviousECB;
use crate::fighter::errors::FighterErrors;
use crate::fighter::hurtbox::FixedAffineCapsule;
use crate::fighter::manifest::FighterManifest;
use crate::fighter::state::{FighterState, air};
use crate::fighter::state::{air, FighterState};
use crate::fighter::visual::FighterAnimations;
use crate::fighter::{
Fighter, FighterECB, FighterFacingDirection, FighterHitboxes, FighterPreviousTranslation,
FighterTranslation, FighterVelocity,
};
use crate::filled_gizmos::FilledGizmos;
use crate::game_settings::GameSettings;
use crate::input::FighterInput;
use crate::math::int::FGi32;
@@ -38,6 +37,7 @@ pub fn debug_draw_ecb(
&FighterPreviousTranslation,
)>,
mut gizmos: Gizmos,
mut filled_gizmos: FilledGizmos,
) {
for (ecb, trf, ecb_prev, trf_prev) in ecbs {
gizmos.cross(
@@ -46,15 +46,18 @@ pub fn debug_draw_ecb(
bevy::color::palettes::css::BLUE,
);
let prev_transformed = ecb_prev.to_3d_lineloop(Transform::from_xyz(
trf_prev.x.to_num::<f32>(),
trf_prev.y.to_num(),
0.0,
));
filled_gizmos.polygon(&prev_transformed, ORANGE_RED);
let transformed =
ecb.to_3d_lineloop(Transform::from_xyz(trf.x.to_num(), trf.y.to_num(), 0.0));
gizmos.lineloop(transformed, YELLOW);
let prev_transformed = ecb_prev.to_3d_lineloop(Transform::from_xyz(
trf_prev.x.to_num(),
trf_prev.y.to_num(),
-0.1,
));
gizmos.lineloop(prev_transformed, ORANGE);
filled_gizmos.polygon(&transformed, ORANGE);
gizmos.lineloop(transformed, WHITE);
}
}
pub fn fighter_debug(
@@ -183,15 +186,23 @@ pub fn animation_debug(
}
}
pub fn hurtbox_debug(query: Query<&FighterSolvedHurtboxes>, mut gizmos: Gizmos) {
pub fn hurtbox_debug(
query: Query<&FighterSolvedHurtboxes>,
mut filled_gizmos: FilledGizmos,
) {
for hurtboxes in &query {
for hurtbox in &hurtboxes.0 {
draw_affine_capsule(&mut gizmos, hurtbox.capsule, YELLOW);
filled_gizmos.affine_capsule(
hurtbox.capsule.transform.to_mat4(),
hurtbox.capsule.radius.to_num(),
hurtbox.capsule.half_length.to_num(),
Color::srgba(1.0, 1.0, 0.0, 0.75),
);
}
}
}
fn draw_affine_capsule(
/*fn draw_affine_capsule(
gizmos: &mut Gizmos,
capsule: FixedAffineCapsule,
color: impl Into<Color> + Copy,
@@ -213,9 +224,9 @@ fn draw_affine_capsule(
for &(start, end) in &wireframe.lines {
gizmos.line(vertices[start], vertices[end], color);
}
}
}*/
struct CapsuleWireVertex {
/*struct CapsuleWireVertex {
direction: Vec3,
center_sign: f32,
}
@@ -223,9 +234,9 @@ struct CapsuleWireVertex {
struct CapsuleWireframe {
vertices: Vec<CapsuleWireVertex>,
lines: Vec<(usize, usize)>,
}
}*/
fn capsule_wireframe() -> &'static CapsuleWireframe {
/*fn capsule_wireframe() -> &'static CapsuleWireframe {
const RESOLUTION: usize = 16;
const HEMISPHERE_STEPS: usize = 4;
static WIREFRAME: OnceLock<CapsuleWireframe> = OnceLock::new();
@@ -306,7 +317,7 @@ fn capsule_wireframe() -> &'static CapsuleWireframe {
CapsuleWireframe { vertices, lines }
})
}
}*/
#[cfg(test)]
mod capsule_debug_tests {
@@ -326,7 +337,7 @@ mod capsule_debug_tests {
assert!(marker.abs_diff_eq(Vec3::new(3.0, 4.0, 3.0), 1e-5));
}
#[test]
/*#[test]
fn capsule_wireframe_caps_extend_in_opposite_directions() {
let wireframe = capsule_wireframe();
let lower: Vec<_> = wireframe
@@ -344,7 +355,7 @@ mod capsule_debug_tests {
assert!(upper.iter().all(|vertex| vertex.direction.y >= 0.0));
assert!(lower.iter().any(|vertex| vertex.direction == Vec3::NEG_Y));
assert!(upper.iter().any(|vertex| vertex.direction == Vec3::Y));
}
}*/
}
pub fn attack_debug(
@@ -356,6 +367,7 @@ pub fn attack_debug(
&FighterAnimationFrame,
)>,
mut gizmos: Gizmos,
mut filled_gizmos: FilledGizmos,
) {
for (hitboxes, _matrices, _translation, _facing_direction, _frame) in query {
if let Some(active_attack) = &hitboxes.0 {
@@ -382,6 +394,12 @@ pub fn attack_debug(
capsule_draw_trf.to_isometry(),
bevy::color::palettes::css::RED,
);
filled_gizmos.capsule(
capsule_draw_trf.to_isometry(),
solved_hitbox.capsule.radius.to_num(),
length * 0.5,
Color::srgba(1.0, 0.0, 0.0, 0.18),
);
gizmos.cross(start, 1.0, bevy::color::palettes::css::GREEN);
gizmos.cross(end, 1.0, bevy::color::palettes::css::GREEN);