use crate::_bevy::*;
use crate::components::aero_coeff::AeroCoeff;
use super::library::AirfoilLibrary;
use super::types::AirfoilData;
pub trait RegisterAirfoil {
fn register_airfoil(&mut self, name: impl Into<String>, data: AirfoilData) -> &mut Self;
}
impl RegisterAirfoil for App {
fn register_airfoil(&mut self, name: impl Into<String>, data: AirfoilData) -> &mut Self {
self.world_mut()
.resource_mut::<AirfoilLibrary>()
.register(name, data);
self
}
}
pub fn resolve_airfoil_names(
library: Res<AirfoilLibrary>,
mut zones: Query<&mut crate::components::AeroZone, Added<crate::components::AeroZone>>,
) {
for mut zone in &mut zones {
if zone.airfoil_name.is_empty() {
continue;
}
let name = zone.airfoil_name.clone();
let Some(data) = library.lookup(&name) else {
warn_once!(
"AeroZone references unknown airfoil \"{name}\". \
Register it via App::register_airfoil() before spawning zones."
);
continue;
};
if matches!(zone.cl, AeroCoeff::Placeholder) {
zone.cl = data.cl.clone();
}
if matches!(zone.cd, AeroCoeff::Placeholder) {
zone.cd = data.cd.clone();
}
if matches!(zone.cm, AeroCoeff::Placeholder) {
zone.cm = data.cm.clone();
}
}
}