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::classes::{ReplicationClass, SimulationMode};
use crate::physics::collision::{CollisionMode, CollisionPolicy, CollisionResponse};
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::Impact,
        authority: AuthorityProfile::EventReconstructable,
        semantics: SemanticBinding::default(),
        shape: SpawnShape::Point,
        spawn: SpawnPolicy {
            mode: SpawnMode::Burst,
            rate_per_sec: 0.0,
            burst_count: 25,
            max_live: 100,
            warmup_seconds: 0.0,
            looped: false,
            seed: 0,
            density_scale_lod: false,
        },
        initialize: InitPolicy::default(),
        simulate: SimPolicy {
            mode: SimulationMode::Full,
            gravity: [0.0, -9.81, 0.0],
            drag: 0.05,
            damping: 0.02,
            noise: None,
            forces: vec![],
            lifetime: LifetimePolicy {
                seconds: 1.0,
                random_range: None,
            },
            behaviors: vec![],
        },
        collision: CollisionPolicy {
            mode: CollisionMode::Plane,
            response: CollisionResponse::Bounce,
            ..CollisionPolicy::default()
        },
        render: RenderPolicy {
            mode: RenderMode::Billboard,
            ..RenderPolicy::default()
        },
        promotion: PromotionPolicy::default(),
        budgets: BudgetPolicy {
            max_gpu_particles: 300,
            importance: "Normal".into(),
            offscreen_mode: SimulationMode::Culled,
        },
        replication: ReplicationPolicy {
            class: ReplicationClass::EventOnly,
        },
        supported_views: vec![RepresentationMode::World3D, RepresentationMode::Sprite2D],
        tags: vec!["impact".into()],
    }
}

pub fn catalog() -> Vec<PresetCatalogEntry> {
    vec![
        {
            let mut e = base_entry("impact_sparks_metal", "Metal Sparks");
            e.spawn.burst_count = 30;
            e.simulate.lifetime.seconds = 0.8;
            e.initialize.color = [1.0, 0.8, 0.3, 1.0];
            e.semantics.trait_tags = vec!["isMetal".into()];
            e.tags.push("metal".into());
            e
        },
        {
            let mut e = base_entry("impact_sparks_stone", "Stone Sparks");
            e.spawn.burst_count = 20;
            e.simulate.lifetime.seconds = 0.6;
            e.initialize.color = [0.7, 0.65, 0.5, 1.0];
            e.semantics.trait_tags = vec!["isStone".into()];
            e.tags.push("stone".into());
            e
        },
        {
            let mut e = base_entry("impact_sparks_wood", "Wood Sparks");
            e.spawn.burst_count = 15;
            e.simulate.lifetime.seconds = 0.5;
            e.initialize.color = [0.6, 0.4, 0.2, 1.0];
            e.semantics.trait_tags = vec!["isWood".into()];
            e.tags.push("wood".into());
            e
        },
        {
            let mut e = base_entry("impact_dust_puff", "Dust Puff");
            e.spawn.burst_count = 20;
            e.simulate.gravity = [0.0, 0.2, 0.0];
            e.simulate.lifetime.seconds = 1.5;
            e.simulate.drag = 0.2;
            e.initialize.color = [0.7, 0.65, 0.55, 0.6];
            e.collision.mode = CollisionMode::None;
            e.tags.push("dust".into());
            e
        },
        {
            let mut e = base_entry("impact_water_splash", "Water Splash");
            e.spawn.burst_count = 35;
            e.simulate.lifetime.seconds = 0.8;
            e.initialize.color = [0.4, 0.6, 0.9, 0.7];
            e.semantics.trait_tags = vec!["isLiquid".into()];
            e.tags.push("water".into());
            e
        },
        {
            let mut e = base_entry("impact_glass_crack", "Glass Crack");
            e.spawn.burst_count = 40;
            e.simulate.lifetime.seconds = 1.2;
            e.render.mode = RenderMode::ShardInstance;
            e.render.lit = true;
            e.initialize.color = [0.85, 0.9, 0.95, 0.8];
            e.semantics.trait_tags = vec!["isGlass".into()];
            e.tags.push("glass".into());
            e
        },
        {
            let mut e = base_entry("impact_flesh_hit", "Flesh Hit");
            e.spawn.burst_count = 20;
            e.simulate.lifetime.seconds = 0.6;
            e.initialize.color = [0.8, 0.15, 0.1, 0.9];
            e.semantics.trait_tags = vec!["isOrganic".into()];
            e.tags.push("flesh".into());
            e
        },
        {
            let mut e = base_entry("impact_energy_ripple", "Energy Ripple");
            e.spawn.burst_count = 15;
            e.shape = SpawnShape::Ring {
                radius: 0.5,
                thickness: 0.1,
            };
            e.simulate.gravity = [0.0, 0.0, 0.0];
            e.simulate.lifetime.seconds = 0.5;
            e.collision.mode = CollisionMode::None;
            e.initialize.color = [0.5, 0.8, 1.0, 0.9];
            e.tags.push("energy".into());
            e
        },
        {
            let mut e = base_entry("impact_ground_crater", "Ground Crater");
            e.spawn.burst_count = 50;
            e.simulate.lifetime.seconds = 2.0;
            e.collision.response = CollisionResponse::Stick;
            e.tags.push("crater".into());
            e
        },
        {
            let mut e = base_entry("impact_bounce_ring", "Bounce Ring");
            e.spawn.burst_count = 20;
            e.shape = SpawnShape::Ring {
                radius: 0.3,
                thickness: 0.05,
            };
            e.simulate.gravity = [0.0, 0.0, 0.0];
            e.simulate.lifetime.seconds = 0.4;
            e.collision.mode = CollisionMode::None;
            e.tags.push("bounce".into());
            e
        },
        {
            let mut e = base_entry("impact_slide_sparks", "Slide Sparks");
            e.spawn.mode = SpawnMode::Continuous;
            e.spawn.rate_per_sec = 40.0;
            e.simulate.lifetime.seconds = 0.4;
            e.initialize.color = [1.0, 0.7, 0.2, 1.0];
            e.tags.push("slide".into());
            e
        },
        {
            let mut e = base_entry("impact_embed_glow", "Embed Glow");
            e.spawn.burst_count = 5;
            e.simulate.gravity = [0.0, 0.0, 0.0];
            e.simulate.lifetime.seconds = 3.0;
            e.collision.mode = CollisionMode::None;
            e.initialize.color = [1.0, 0.5, 0.1, 0.8];
            e.tags.push("embed".into());
            e
        },
        {
            let mut e = base_entry("impact_shockwave", "Shockwave");
            e.spawn.burst_count = 30;
            e.shape = SpawnShape::Ring {
                radius: 0.1,
                thickness: 0.05,
            };
            e.simulate.gravity = [0.0, 0.0, 0.0];
            e.simulate.lifetime.seconds = 0.5;
            e.collision.mode = CollisionMode::None;
            e.tags.push("shockwave".into());
            e
        },
    ]
}