use core::marker::PhantomData;
use crate::{global::GlobalRng, seed::RngSeed, traits::SeedSource};
use bevy_app::{App, Plugin};
use bevy_prng::{EntropySeed, EntropySource};
pub struct EntropyPlugin<Rng: EntropySource + 'static> {
seed: Option<Rng::Seed>,
}
impl<Rng: EntropySource + 'static> EntropyPlugin<Rng> {
#[inline]
#[must_use]
pub fn new() -> Self {
Self { seed: None }
}
#[inline]
pub fn with_seed(seed: Rng::Seed) -> Self {
Self { seed: Some(seed) }
}
}
impl<Rng: EntropySource + 'static> Default for EntropyPlugin<Rng> {
fn default() -> Self {
Self::new()
}
}
impl<Rng: EntropySource + 'static> Plugin for EntropyPlugin<Rng>
where
Rng::Seed: EntropySeed,
{
fn build(&self, app: &mut App) {
#[cfg(feature = "bevy_reflect")]
app.register_type::<Rng>()
.register_type::<RngSeed<Rng>>()
.register_type::<Rng::Seed>();
#[cfg(feature = "bevy_reflect")]
app.register_type_data::<Rng, bevy_prng::ReflectRemoteRng>();
let world = app.world_mut();
world.spawn((
self.seed
.clone()
.map_or_else(RngSeed::<Rng>::default, RngSeed::<Rng>::from_seed),
GlobalRng,
));
world.add_observer(crate::observers::seed_from_global::<Rng, Rng>);
world.add_observer(crate::observers::seed_from_parent::<Rng, Rng>);
world.add_observer(crate::observers::seed_linked::<Rng, Rng>);
world.add_observer(crate::observers::trigger_seed_linked::<Rng, Rng>);
world.flush();
}
}
pub struct EntropyRelationsPlugin<Source, Target> {
_source: PhantomData<Source>,
_target: PhantomData<Target>,
}
impl<Source: EntropySource, Target: EntropySource> Default
for EntropyRelationsPlugin<Source, Target>
{
fn default() -> Self {
Self {
_source: PhantomData,
_target: PhantomData,
}
}
}
impl<Source: EntropySource, Target: EntropySource> Plugin
for EntropyRelationsPlugin<Source, Target>
{
fn build(&self, app: &mut App) {
let world = app.world_mut();
world.add_observer(crate::observers::seed_from_global::<Source, Target>);
world.add_observer(crate::observers::seed_from_parent::<Source, Target>);
world.add_observer(crate::observers::seed_linked::<Source, Target>);
world.add_observer(crate::observers::trigger_seed_linked::<Source, Target>);
world.flush();
}
}