dreamwell-engine 1.0.0

Dreamwell pure-logic engine library — transforms, hierarchy, canon pipeline, spatial math, hashing, tile rules, validation, waymark schema, material/lighting descriptors. No SpacetimeDB dependency.
Documentation
use super::*;
use crate::physics::behaviors::BehaviorBlock;
use crate::physics::classes::{ReplicationClass, SimulationMode};
use crate::physics::collision::{CollisionMode, CollisionPolicy};
use crate::physics::emitter::*;
use crate::physics::promotion::PromotionPolicy;
use crate::physics::render_mode::{RenderMode, RepresentationMode};
use crate::physics::render_policy::RenderPolicy;
use crate::physics::semantic_binding::SemanticBinding;

fn base_entry(id: &str, name: &str) -> PresetCatalogEntry {
    PresetCatalogEntry {
        id: id.into(),
        name: name.into(),
        family: PresetFamily::Particle,
        authority: AuthorityProfile::VisualOnly,
        semantics: SemanticBinding::default(),
        shape: SpawnShape::Sphere { radius: 1.0 },
        spawn: SpawnPolicy {
            mode: SpawnMode::Continuous,
            rate_per_sec: 20.0,
            burst_count: 0,
            max_live: 300,
            warmup_seconds: 0.5,
            looped: true,
            seed: 0,
            density_scale_lod: true,
        },
        initialize: InitPolicy::default(),
        simulate: SimPolicy {
            mode: SimulationMode::Full,
            gravity: [0.0, 0.0, 0.0],
            drag: 0.05,
            damping: 0.02,
            noise: None,
            forces: vec![],
            lifetime: LifetimePolicy {
                seconds: 8.0,
                random_range: None,
            },
            behaviors: vec![BehaviorBlock::ParticleLite],
        },
        collision: CollisionPolicy {
            mode: CollisionMode::None,
            ..CollisionPolicy::default()
        },
        render: RenderPolicy {
            mode: RenderMode::Billboard,
            ..RenderPolicy::default()
        },
        promotion: PromotionPolicy::default(),
        budgets: BudgetPolicy {
            max_gpu_particles: 500,
            importance: "Normal".into(),
            offscreen_mode: SimulationMode::Simplified,
        },
        replication: ReplicationPolicy {
            class: ReplicationClass::None,
        },
        supported_views: vec![RepresentationMode::World3D, RepresentationMode::Sprite2D],
        tags: vec!["particle".into()],
    }
}

pub fn catalog() -> Vec<PresetCatalogEntry> {
    vec![
        {
            let mut e = base_entry("particle_insect_cloud", "Insect Cloud");
            e.spawn.rate_per_sec = 15.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Wobble];
            e.initialize.color = [0.2, 0.2, 0.15, 0.8];
            e.tags.push("insect".into());
            e
        },
        {
            let mut e = base_entry("particle_bat_flock", "Bat Flock");
            e.spawn.rate_per_sec = 10.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Seek];
            e.render.mode = RenderMode::MeshInstance;
            e.initialize.color = [0.15, 0.1, 0.1, 0.9];
            e.tags.push("bat".into());
            e
        },
        {
            let mut e = base_entry("particle_fish_school", "Fish School");
            e.spawn.rate_per_sec = 12.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::AlignToVelocity];
            e.render.mode = RenderMode::MeshInstance;
            e.initialize.color = [0.4, 0.6, 0.8, 0.9];
            e.tags.push("fish".into());
            e
        },
        {
            let mut e = base_entry("particle_bird_murmuration", "Bird Murmuration");
            e.spawn.rate_per_sec = 25.0;
            e.spawn.max_live = 500;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::AlignToVelocity];
            e.render.mode = RenderMode::MeshInstance;
            e.initialize.color = [0.2, 0.2, 0.25, 0.9];
            e.budgets.max_gpu_particles = 800;
            e.tags.push("bird".into());
            e
        },
        {
            let mut e = base_entry("particle_nanite_cloud", "Nanite Cloud");
            e.spawn.rate_per_sec = 40.0;
            e.spawn.max_live = 500;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Seek];
            e.render.mode = RenderMode::PointCloud;
            e.initialize.color = [0.5, 0.7, 1.0, 0.7];
            e.tags.push("nanite".into());
            e
        },
        {
            let mut e = base_entry("particle_spirit_wisps", "Spirit Wisps");
            e.spawn.rate_per_sec = 8.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Hover, BehaviorBlock::Wobble];
            e.simulate.lifetime.seconds = 10.0;
            e.initialize.color = [0.6, 0.8, 1.0, 0.5];
            e.tags.push("spirit".into());
            e
        },
        {
            let mut e = base_entry("particle_firefly_dance", "Firefly Dance");
            e.spawn.rate_per_sec = 6.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Wobble, BehaviorBlock::Hover];
            e.simulate.lifetime.seconds = 6.0;
            e.render.mode = RenderMode::PointCloud;
            e.initialize.color = [0.8, 1.0, 0.3, 0.9];
            e.tags.push("firefly".into());
            e
        },
        {
            let mut e = base_entry("particle_spore_cloud", "Spore Cloud");
            e.spawn.rate_per_sec = 10.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Drift];
            e.simulate.gravity = [0.0, 0.1, 0.0];
            e.simulate.lifetime.seconds = 12.0;
            e.initialize.color = [0.5, 0.7, 0.3, 0.4];
            e.semantics.trait_tags = vec!["isOrganic".into()];
            e.tags.push("spore".into());
            e
        },
        {
            let mut e = base_entry("particle_debris_orbit", "Debris Orbit");
            e.spawn.rate_per_sec = 5.0;
            e.simulate.behaviors = vec![BehaviorBlock::Orbit];
            e.render.mode = RenderMode::ShardInstance;
            e.render.lit = true;
            e.simulate.lifetime.seconds = 15.0;
            e.tags.push("debris".into());
            e
        },
        {
            let mut e = base_entry("particle_magic_motes", "Magic Motes");
            e.spawn.rate_per_sec = 12.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Hover];
            e.simulate.lifetime.seconds = 8.0;
            e.initialize.color = [0.7, 0.3, 1.0, 0.7];
            e.semantics.trait_tags = vec!["isDreammatter".into()];
            e.tags.push("magic".into());
            e
        },
        {
            let mut e = base_entry("particle_void_particles", "Void Particles");
            e.spawn.rate_per_sec = 15.0;
            e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Orbit];
            e.simulate.lifetime.seconds = 6.0;
            e.initialize.color = [0.1, 0.0, 0.15, 0.9];
            e.semantics.trait_tags = vec!["isVoidTouched".into()];
            e.tags.push("void".into());
            e
        },
        {
            let mut e = base_entry("particle_crystal_shards", "Crystal Shards");
            e.spawn.rate_per_sec = 8.0;
            e.simulate.behaviors = vec![BehaviorBlock::Orbit, BehaviorBlock::Hover];
            e.render.mode = RenderMode::ShardInstance;
            e.render.lit = true;
            e.simulate.lifetime.seconds = 10.0;
            e.initialize.color = [0.6, 0.8, 1.0, 0.9];
            e.tags.push("crystal".into());
            e
        },
        {
            let mut e = base_entry("particle_leaf_tornado", "Leaf Tornado");
            e.spawn.rate_per_sec = 20.0;
            e.simulate.behaviors = vec![BehaviorBlock::Orbit, BehaviorBlock::Wobble];
            e.simulate.gravity = [0.0, 0.5, 0.0];
            e.simulate.lifetime.seconds = 5.0;
            e.initialize.color = [0.5, 0.6, 0.2, 0.8];
            e.tags.push("leaf".into());
            e
        },
        {
            let mut e = base_entry("particle_sand_vortex", "Sand Vortex");
            e.spawn.rate_per_sec = 30.0;
            e.spawn.max_live = 500;
            e.simulate.behaviors = vec![BehaviorBlock::Orbit];
            e.simulate.lifetime.seconds = 4.0;
            e.initialize.color = [0.85, 0.75, 0.5, 0.6];
            e.budgets.max_gpu_particles = 800;
            e.tags.push("sand".into());
            e
        },
    ]
}