use crate::prelude::*;
use crate::scatter::utils::combine_aabbs;
use bevy_ecs::prelude::*;
use bevy_pbr::StandardMaterial;
use std::marker::PhantomData;
#[cfg(feature = "avian")]
use avian3d::prelude::*;
#[derive(Component, Clone)]
pub struct ScatterAssetCreationRequest<T = StandardMaterial>
where
T: ScatterMaterial,
{
pub properties: ScatterAssetProperties,
pub parts: Vec<ScatterAssetPartEntity<StandardMaterial>>,
#[cfg(feature = "avian")]
pub o_rigid_body: Option<RigidBody>,
pub layer: Entity,
pub _marker: PhantomData<T>,
}
impl<T> ScatterAssetCreationRequest<T>
where
T: ScatterMaterial,
{
pub fn new(
properties: ScatterAssetProperties,
parts: Vec<ScatterAssetPartEntity<StandardMaterial>>,
layer: Entity,
#[cfg(feature = "avian")] rigid_body: Option<RigidBody>,
) -> Self {
Self {
properties,
parts,
layer,
#[cfg(feature = "avian")]
o_rigid_body: rigid_body,
_marker: Default::default(),
}
}
pub fn from_data(
item_of: AssetPartOf,
entity_parts: Vec<ScatterAssetPartEntity<StandardMaterial>>,
wind: Wind,
options: ScatterMaterialOptions,
#[cfg(feature = "avian")] rigid_body: Option<RigidBody>,
) -> ScatterAssetCreationRequest<T> {
let parts: Vec<ScatterAssetPartEntity> = entity_parts.into_iter().collect();
let mut union_aabb = parts[0].part.properties.aabb;
for ScatterAssetPartEntity { part, .. } in &parts[1..] {
union_aabb = combine_aabbs(&union_aabb, &part.properties.aabb);
}
let wind_affected = parts
.iter()
.any(|ScatterAssetPartEntity { part, .. }| part.properties.wind_affected);
ScatterAssetCreationRequest::<T>::new(
ScatterAssetProperties {
wind,
options,
aabb: union_aabb,
name: item_of.name.clone(),
lod: parts
.iter()
.map(|ScatterAssetPartEntity { part, .. }| part.properties.lod)
.min()
.unwrap_or_default(),
#[allow(deprecated)]
wind_affected,
},
parts,
item_of.layer,
#[cfg(feature = "avian")]
rigid_body,
)
}
}