#![allow(dead_code)]
pub mod body;
#[cfg(not(target_arch = "wasm32"))]
pub mod recorder;
use bevy::prelude::*;
use bevy_carnage::{
BloodSettings, Stain, StainShape, Wound, blood, droplets, impact_at_plane, landing, stain_shape,
stains,
};
pub fn arg(flag: &str) -> Option<String> {
let mut args = std::env::args().skip(1);
while let Some(a) = args.next() {
if a == flag {
match args.next() {
Some(v) => return Some(v),
None => {
warn!("capture: {flag} given with no value; ignoring it");
return None;
}
}
}
}
None
}
pub fn light_and_floor(world: &mut World) {
world.insert_resource(GlobalAmbientLight {
color: Color::srgb(0.62, 0.66, 0.78),
brightness: 900.0,
..default()
});
world.spawn((
DirectionalLight { illuminance: 9_000.0, shadow_maps_enabled: true, ..default() },
Transform::from_xyz(4.0, 8.0, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
));
let floor = world
.resource_mut::<Assets<Mesh>>()
.add(Mesh::from(Plane3d::default().mesh().size(14.0, 14.0)));
let dark = world.resource_mut::<Assets<StandardMaterial>>().add(StandardMaterial {
base_color: Color::srgb(0.16, 0.16, 0.18),
perceptual_roughness: 0.95,
..default()
});
world.spawn((Mesh3d(floor), MeshMaterial3d(dark)));
}
pub fn material(world: &mut World, color: Color, roughness: f32) -> Handle<StandardMaterial> {
world.resource_mut::<Assets<StandardMaterial>>().add(StandardMaterial {
base_color: color,
perceptual_roughness: roughness,
..default()
})
}
pub fn blood_wound(w: &Wound) -> blood::Wound {
blood::Wound {
at: [w.at.x, w.at.y, w.at.z],
normal: [w.normal.x, w.normal.y, w.normal.z],
area: w.area,
severity: w.severity,
kind: w.kind,
}
}
pub fn v3(v: [f32; 3]) -> Vec3 {
Vec3::new(v[0], v[1], v[2])
}
pub fn stains_with_shapes(
w: &blood::Wound,
s: &BloodSettings,
plane_y: f32,
) -> Vec<(Stain, StainShape)> {
let landed = droplets(w, s)
.into_iter()
.filter(|d| landing(w.at, d, s.gravity, plane_y).is_some());
stains(w, s, plane_y)
.into_iter()
.zip(landed)
.map(|(stain, d)| {
let impact = impact_at_plane(&d, w.at, plane_y, s);
(stain, stain_shape(&impact, s, stain.seed))
})
.collect()
}