use super::*;
use crate::physics::behaviors::BehaviorBlock;
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::Environment,
authority: AuthorityProfile::VisualOnly,
semantics: SemanticBinding::default(),
shape: SpawnShape::Box {
extents: [5.0, 3.0, 5.0],
},
spawn: SpawnPolicy {
mode: SpawnMode::Continuous,
rate_per_sec: 10.0,
burst_count: 0,
max_live: 200,
warmup_seconds: 0.0,
looped: true,
seed: 0,
density_scale_lod: true,
},
initialize: InitPolicy::default(),
simulate: SimPolicy {
mode: SimulationMode::Full,
gravity: [0.0, -1.0, 0.0],
drag: 0.1,
damping: 0.02,
noise: None,
forces: vec![],
lifetime: LifetimePolicy {
seconds: 6.0,
random_range: None,
},
behaviors: vec![BehaviorBlock::Drift],
},
collision: CollisionPolicy {
mode: CollisionMode::None,
..CollisionPolicy::default()
},
render: RenderPolicy {
mode: RenderMode::Billboard,
..RenderPolicy::default()
},
promotion: PromotionPolicy::default(),
budgets: BudgetPolicy {
max_gpu_particles: 300,
importance: "Low".into(),
offscreen_mode: SimulationMode::Culled,
},
replication: ReplicationPolicy {
class: ReplicationClass::None,
},
supported_views: vec![
RepresentationMode::World3D,
RepresentationMode::Sprite2D,
RepresentationMode::Isometric2D,
],
tags: vec!["environment".into()],
}
}
pub fn catalog() -> Vec<PresetCatalogEntry> {
vec![
{
let mut e = base_entry("env_leaf_fall", "Leaf Fall");
e.simulate.gravity = [0.0, -0.8, 0.0];
e.simulate.behaviors = vec![BehaviorBlock::Wobble, BehaviorBlock::Drift];
e.initialize.color = [0.4, 0.6, 0.15, 0.9];
e.tags.push("leaf".into());
e
},
{
let mut e = base_entry("env_pollen_drift", "Pollen Drift");
e.spawn.rate_per_sec = 5.0;
e.simulate.gravity = [0.0, 0.1, 0.0];
e.simulate.drag = 0.3;
e.simulate.lifetime.seconds = 10.0;
e.initialize.color = [1.0, 0.95, 0.5, 0.4];
e.tags.push("pollen".into());
e
},
{
let mut e = base_entry("env_dust_motes", "Dust Motes");
e.spawn.rate_per_sec = 8.0;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.lifetime.seconds = 8.0;
e.initialize.color = [0.8, 0.75, 0.65, 0.3];
e.tags.push("dust".into());
e
},
{
let mut e = base_entry("env_firefly_glow", "Firefly Glow");
e.spawn.rate_per_sec = 3.0;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.behaviors = vec![BehaviorBlock::Wobble, BehaviorBlock::Hover];
e.simulate.lifetime.seconds = 5.0;
e.initialize.color = [0.8, 1.0, 0.3, 0.9];
e.render.mode = RenderMode::PointCloud;
e.tags.push("firefly".into());
e
},
{
let mut e = base_entry("env_campfire_sparks", "Campfire Sparks");
e.spawn.rate_per_sec = 15.0;
e.shape = SpawnShape::Cone {
radius: 0.2,
angle_radians: 0.3,
};
e.simulate.gravity = [0.0, 1.5, 0.0];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [1.0, 0.6, 0.1, 1.0];
e.semantics.trait_tags = vec!["isFlammable".into()];
e.tags.push("fire".into());
e
},
{
let mut e = base_entry("env_torch_flame", "Torch Flame");
e.spawn.rate_per_sec = 30.0;
e.shape = SpawnShape::Cone {
radius: 0.05,
angle_radians: 0.2,
};
e.simulate.gravity = [0.0, 2.0, 0.0];
e.simulate.lifetime.seconds = 0.5;
e.initialize.color = [1.0, 0.5, 0.0, 0.9];
e.tags.push("fire".into());
e
},
{
let mut e = base_entry("env_candle_flicker", "Candle Flicker");
e.spawn.rate_per_sec = 10.0;
e.shape = SpawnShape::Point;
e.simulate.gravity = [0.0, 0.8, 0.0];
e.simulate.lifetime.seconds = 0.3;
e.initialize.color = [1.0, 0.7, 0.2, 0.8];
e.tags.push("fire".into());
e
},
{
let mut e = base_entry("env_waterfall_mist", "Waterfall Mist");
e.spawn.rate_per_sec = 25.0;
e.shape = SpawnShape::Line { length: 3.0 };
e.simulate.gravity = [0.0, 0.3, 0.0];
e.simulate.drag = 0.2;
e.simulate.lifetime.seconds = 4.0;
e.initialize.color = [0.8, 0.9, 1.0, 0.3];
e.semantics.trait_tags = vec!["isLiquid".into()];
e.tags.push("water".into());
e
},
{
let mut e = base_entry("env_steam_vent", "Steam Vent");
e.spawn.rate_per_sec = 20.0;
e.shape = SpawnShape::Cone {
radius: 0.3,
angle_radians: 0.4,
};
e.simulate.gravity = [0.0, 1.0, 0.0];
e.simulate.drag = 0.15;
e.simulate.lifetime.seconds = 3.0;
e.initialize.color = [0.9, 0.9, 0.9, 0.4];
e.tags.push("steam".into());
e
},
{
let mut e = base_entry("env_volcanic_ash", "Volcanic Ash");
e.spawn.rate_per_sec = 15.0;
e.simulate.gravity = [0.0, -0.5, 0.0];
e.simulate.lifetime.seconds = 8.0;
e.initialize.color = [0.3, 0.28, 0.25, 0.6];
e.semantics.trait_tags = vec!["isHazard".into()];
e.tags.push("volcanic".into());
e
},
{
let mut e = base_entry("env_sand_wind", "Sand Wind");
e.spawn.rate_per_sec = 30.0;
e.simulate.gravity = [0.0, -0.2, 0.0];
e.simulate.lifetime.seconds = 3.0;
e.initialize.color = [0.85, 0.75, 0.5, 0.5];
e.tags.push("sand".into());
e
},
{
let mut e = base_entry("env_snow_settle", "Snow Settle");
e.spawn.rate_per_sec = 12.0;
e.simulate.gravity = [0.0, -0.5, 0.0];
e.simulate.behaviors = vec![BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 6.0;
e.initialize.color = [0.95, 0.97, 1.0, 0.8];
e.collision.mode = CollisionMode::Plane;
e.collision.response = CollisionResponse::Stick;
e.tags.push("snow".into());
e
},
{
let mut e = base_entry("env_flower_petals", "Flower Petals");
e.spawn.rate_per_sec = 4.0;
e.simulate.gravity = [0.0, -0.4, 0.0];
e.simulate.behaviors = vec![BehaviorBlock::Wobble, BehaviorBlock::Drift];
e.simulate.lifetime.seconds = 8.0;
e.initialize.color = [1.0, 0.6, 0.7, 0.9];
e.tags.push("petals".into());
e
},
{
let mut e = base_entry("env_spore_release", "Spore Release");
e.spawn.rate_per_sec = 8.0;
e.shape = SpawnShape::Sphere { radius: 0.2 };
e.simulate.gravity = [0.0, 0.3, 0.0];
e.simulate.lifetime.seconds = 5.0;
e.initialize.color = [0.5, 0.7, 0.3, 0.5];
e.semantics.trait_tags = vec!["isOrganic".into()];
e.tags.push("spore".into());
e
},
{
let mut e = base_entry("env_aurora_wisp", "Aurora Wisp");
e.spawn.rate_per_sec = 6.0;
e.simulate.gravity = [0.0, 0.0, 0.0];
e.simulate.behaviors = vec![BehaviorBlock::Wobble, BehaviorBlock::Drift];
e.simulate.lifetime.seconds = 10.0;
e.render.mode = RenderMode::Ribbon;
e.initialize.color = [0.3, 1.0, 0.5, 0.6];
e.tags.push("aurora".into());
e
},
]
}