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::{PromotionAuthority, PromotionPolicy, PromotionTarget};
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::Destruction,
        authority: AuthorityProfile::PromotionCapable,
        semantics: SemanticBinding {
            trait_tags: vec!["isDestructible".into(), "isDebris".into()],
            ..SemanticBinding::default()
        },
        shape: SpawnShape::Sphere { radius: 0.3 },
        spawn: SpawnPolicy {
            mode: SpawnMode::Burst,
            rate_per_sec: 0.0,
            burst_count: 40,
            max_live: 200,
            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.03,
            damping: 0.02,
            noise: None,
            forces: vec![],
            lifetime: LifetimePolicy {
                seconds: 4.0,
                random_range: None,
            },
            behaviors: vec![],
        },
        collision: CollisionPolicy {
            mode: CollisionMode::Plane,
            response: CollisionResponse::Bounce,
            restitution: 0.3,
            friction: 0.5,
            ..CollisionPolicy::default()
        },
        render: RenderPolicy {
            mode: RenderMode::ShardInstance,
            lit: true,
            cast_shadows: true,
            ..RenderPolicy::default()
        },
        promotion: PromotionPolicy {
            enabled: true,
            target: PromotionTarget::PersistentDebris,
            authority: PromotionAuthority::ClientSuggestsServerConfirms,
            ..PromotionPolicy::default()
        },
        budgets: BudgetPolicy {
            max_gpu_particles: 500,
            importance: "High".into(),
            offscreen_mode: SimulationMode::Simplified,
        },
        replication: ReplicationPolicy {
            class: ReplicationClass::SeedReconstructable,
        },
        supported_views: vec![RepresentationMode::World3D, RepresentationMode::Sprite2D],
        tags: vec!["destruction".into()],
    }
}

pub fn catalog() -> Vec<PresetCatalogEntry> {
    vec![
        {
            let mut e = base_entry("destruct_wood_splinter", "Wood Splinter");
            e.initialize.color = [0.55, 0.35, 0.15, 1.0];
            e.semantics.trait_tags = vec!["isWood".into(), "isFlammable".into(), "isDebris".into()];
            e.tags.push("wood".into());
            e
        },
        {
            let mut e = base_entry("destruct_stone_rubble", "Stone Rubble");
            e.spawn.burst_count = 30;
            e.initialize.color = [0.6, 0.58, 0.52, 1.0];
            e.semantics.trait_tags = vec!["isStone".into(), "isDebris".into()];
            e.tags.push("stone".into());
            e
        },
        {
            let mut e = base_entry("destruct_metal_shrapnel", "Metal Shrapnel");
            e.spawn.burst_count = 25;
            e.initialize.color = [0.7, 0.7, 0.72, 1.0];
            e.collision.restitution = 0.6;
            e.semantics.trait_tags = vec!["isMetal".into(), "isDebris".into()];
            e.tags.push("metal".into());
            e
        },
        {
            let mut e = base_entry("destruct_glass_shatter", "Glass Shatter");
            e.spawn.burst_count = 60;
            e.initialize.color = [0.85, 0.9, 0.95, 0.8];
            e.collision.restitution = 0.2;
            e.semantics.trait_tags = vec!["isGlass".into(), "isDebris".into()];
            e.tags.push("glass".into());
            e
        },
        {
            let mut e = base_entry("destruct_wall_collapse", "Wall Collapse");
            e.spawn.burst_count = 80;
            e.simulate.lifetime.seconds = 5.0;
            e.tags.push("wall".into());
            e
        },
        {
            let mut e = base_entry("destruct_floor_break", "Floor Break");
            e.spawn.burst_count = 60;
            e.simulate.lifetime.seconds = 4.0;
            e.tags.push("floor".into());
            e
        },
        {
            let mut e = base_entry("destruct_ceiling_fall", "Ceiling Fall");
            e.spawn.burst_count = 70;
            e.simulate.lifetime.seconds = 3.0;
            e.tags.push("ceiling".into());
            e
        },
        {
            let mut e = base_entry("destruct_pillar_topple", "Pillar Topple");
            e.spawn.burst_count = 50;
            e.simulate.lifetime.seconds = 5.0;
            e.render.mode = RenderMode::MeshInstance;
            e.tags.push("pillar".into());
            e
        },
        {
            let mut e = base_entry("destruct_bridge_snap", "Bridge Snap");
            e.spawn.burst_count = 90;
            e.simulate.lifetime.seconds = 6.0;
            e.tags.push("bridge".into());
            e
        },
        {
            let mut e = base_entry("destruct_door_breach", "Door Breach");
            e.spawn.burst_count = 35;
            e.tags.push("door".into());
            e
        },
        {
            let mut e = base_entry("destruct_window_smash", "Window Smash");
            e.spawn.burst_count = 50;
            e.initialize.color = [0.85, 0.9, 0.95, 0.7];
            e.semantics.trait_tags = vec!["isGlass".into(), "isDebris".into()];
            e.tags.push("window".into());
            e
        },
        {
            let mut e = base_entry("destruct_crate_burst", "Crate Burst");
            e.spawn.burst_count = 45;
            e.initialize.color = [0.55, 0.4, 0.2, 1.0];
            e.semantics.trait_tags = vec!["isWood".into(), "isDebris".into()];
            e.tags.push("crate".into());
            e
        },
        {
            let mut e = base_entry("destruct_barrel_explode", "Barrel Explode");
            e.spawn.burst_count = 55;
            e.semantics.trait_tags = vec!["isWood".into(), "isExplosive".into(), "isDebris".into()];
            e.tags.push("barrel".into());
            e
        },
        {
            let mut e = base_entry("destruct_chain_break", "Chain Break");
            e.spawn.burst_count = 15;
            e.render.mode = RenderMode::MeshInstance;
            e.semantics.trait_tags = vec!["isMetal".into(), "isDebris".into()];
            e.tags.push("chain".into());
            e
        },
        {
            let mut e = base_entry("destruct_rope_snap", "Rope Snap");
            e.spawn.burst_count = 10;
            e.render.mode = RenderMode::Ribbon;
            e.semantics.trait_tags = vec!["isOrganic".into(), "isDebris".into()];
            e.tags.push("rope".into());
            e
        },
        {
            let mut e = base_entry("destruct_crystal_fracture", "Crystal Fracture");
            e.spawn.burst_count = 45;
            e.initialize.color = [0.7, 0.4, 1.0, 0.9];
            e.tags.push("crystal".into());
            e
        },
        {
            let mut e = base_entry("destruct_bone_shatter", "Bone Shatter");
            e.spawn.burst_count = 25;
            e.initialize.color = [0.9, 0.88, 0.8, 1.0];
            e.semantics.trait_tags = vec!["isOrganic".into(), "isDebris".into()];
            e.tags.push("bone".into());
            e
        },
        {
            let mut e = base_entry("destruct_armor_crack", "Armor Crack");
            e.spawn.burst_count = 30;
            e.initialize.color = [0.6, 0.6, 0.65, 1.0];
            e.semantics.trait_tags = vec!["isMetal".into(), "isDebris".into()];
            e.tags.push("armor".into());
            e
        },
        {
            let mut e = base_entry("destruct_weapon_break", "Weapon Break");
            e.spawn.burst_count = 20;
            e.render.mode = RenderMode::MeshInstance;
            e.tags.push("weapon".into());
            e
        },
        {
            let mut e = base_entry("destruct_vehicle_wreck", "Vehicle Wreck");
            e.spawn.burst_count = 120;
            e.simulate.lifetime.seconds = 8.0;
            e.budgets.max_gpu_particles = 1000;
            e.tags.push("vehicle".into());
            e
        },
        {
            let mut e = base_entry("destruct_building_collapse", "Building Collapse");
            e.spawn.burst_count = 200;
            e.simulate.lifetime.seconds = 10.0;
            e.budgets.max_gpu_particles = 2000;
            e.tags.push("building".into());
            e
        },
        {
            let mut e = base_entry("destruct_terrain_crack", "Terrain Crack");
            e.spawn.burst_count = 60;
            e.collision.response = CollisionResponse::Stick;
            e.simulate.lifetime.seconds = 8.0;
            e.tags.push("terrain".into());
            e
        },
        {
            let mut e = base_entry("destruct_ice_shatter", "Ice Shatter");
            e.spawn.burst_count = 50;
            e.initialize.color = [0.7, 0.85, 1.0, 0.8];
            e.semantics.trait_tags = vec!["isFrozen".into(), "isDebris".into()];
            e.tags.push("ice".into());
            e
        },
        {
            let mut e = base_entry("destruct_explosion_debris", "Explosion Debris");
            e.spawn.burst_count = 100;
            e.shape = SpawnShape::Sphere { radius: 1.0 };
            e.simulate.lifetime.seconds = 5.0;
            e.semantics.trait_tags = vec!["isExplosive".into(), "isDebris".into()];
            e.tags.push("explosion".into());
            e
        },
    ]
}