bevy_collider_gen 0.5.0

a library for generating colliders, for bevy apps, from images with transparency
Documentation
use bevy::{asset::LoadState, prelude::*};

use crate::prelude::AbstractCollider;
pub use components::DynamicCollider;
use systems::update_colliders;

pub mod components;
mod systems;
pub(crate) mod utils;

#[derive(Debug, Default)]
pub struct DynamicColliderPlugin<Target>(std::marker::PhantomData<Target>)
where
    Target: Component;

impl<Target> DynamicColliderPlugin<Target>
where
    Target: Component,
{
    #[must_use]
    pub fn new() -> DynamicColliderPlugin<Target> {
        DynamicColliderPlugin(std::marker::PhantomData)
    }
}

impl<TargetCollider> bevy::prelude::Plugin for DynamicColliderPlugin<TargetCollider>
where
    AbstractCollider: Into<Option<TargetCollider>>,
    TargetCollider: Component,
{
    fn build(&self, app: &mut App) {
        app.add_systems(
            Last,
            update_colliders::<TargetCollider>.run_if(assets_loaded),
        );
    }
}

fn assets_loaded(
    asset_server: Res<AssetServer>,
    targets: Query<(&DynamicCollider, Option<&Sprite>)>,
) -> bool {
    targets
        .iter()
        .map(|(source, sprite)| source.image.as_ref().or(sprite.map(|sprite| &sprite.image)))
        .all(|handle| {
            handle.is_some_and(|handle| {
                asset_server
                    .get_load_state(handle)
                    .is_some_and(|state| matches!(state, LoadState::Loaded))
            })
        })
}