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::Dream,
authority: AuthorityProfile::EventReconstructable,
semantics: SemanticBinding {
trait_tags: vec!["isDreammatter".into()],
..SemanticBinding::default()
},
shape: SpawnShape::Sphere { radius: 0.5 },
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: false,
},
initialize: InitPolicy::default(),
simulate: SimPolicy {
mode: SimulationMode::Full,
gravity: [0.0, 0.0, 0.0],
drag: 0.03,
damping: 0.01,
noise: None,
forces: vec![],
lifetime: LifetimePolicy {
seconds: 5.0,
random_range: None,
},
behaviors: vec![BehaviorBlock::Wobble, BehaviorBlock::Drift],
},
collision: CollisionPolicy {
mode: CollisionMode::None,
..CollisionPolicy::default()
},
render: RenderPolicy {
mode: RenderMode::Billboard,
..RenderPolicy::default()
},
promotion: PromotionPolicy::default(),
budgets: BudgetPolicy {
max_gpu_particles: 400,
importance: "Normal".into(),
offscreen_mode: SimulationMode::Simplified,
},
replication: ReplicationPolicy {
class: ReplicationClass::EventOnly,
},
supported_views: vec![RepresentationMode::World3D, RepresentationMode::Sprite2D],
tags: vec!["dream".into()],
}
}
pub fn catalog() -> Vec<PresetCatalogEntry> {
vec![
{
let mut e = base_entry("dream_dreammatter_bloom", "Dreammatter Bloom");
e.spawn.rate_per_sec = 15.0;
e.simulate.behaviors = vec![BehaviorBlock::Hover, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 6.0;
e.initialize.color = [0.5, 0.3, 1.0, 0.7];
e.tags.push("dreammatter".into());
e.tags.push("bloom".into());
e
},
{
let mut e = base_entry("dream_dreammatter_cascade", "Dreammatter Cascade");
e.spawn.rate_per_sec = 25.0;
e.simulate.gravity = [0.0, -1.0, 0.0];
e.simulate.lifetime.seconds = 4.0;
e.render.mode = RenderMode::Ribbon;
e.initialize.color = [0.6, 0.2, 1.0, 0.8];
e.tags.push("dreammatter".into());
e.tags.push("cascade".into());
e
},
{
let mut e = base_entry("dream_dreammatter_vortex", "Dreammatter Vortex");
e.spawn.rate_per_sec = 20.0;
e.simulate.behaviors = vec![BehaviorBlock::Orbit, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 5.0;
e.initialize.color = [0.7, 0.3, 1.0, 0.9];
e.tags.push("dreammatter".into());
e.tags.push("vortex".into());
e
},
{
let mut e = base_entry("dream_dreammatter_crystallize", "Dreammatter Crystallize");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 30;
e.spawn.rate_per_sec = 0.0;
e.simulate.behaviors = vec![BehaviorBlock::Settle];
e.simulate.lifetime.seconds = 8.0;
e.render.mode = RenderMode::ShardInstance;
e.render.lit = true;
e.initialize.color = [0.8, 0.5, 1.0, 1.0];
e.tags.push("dreammatter".into());
e.tags.push("crystal".into());
e
},
{
let mut e = base_entry("dream_corruption_motes", "Corruption Motes");
e.spawn.rate_per_sec = 12.0;
e.simulate.behaviors = vec![BehaviorBlock::Drift, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 6.0;
e.initialize.color = [0.4, 0.0, 0.5, 0.6];
e.semantics.trait_tags = vec!["isVoidTouched".into(), "isCorruptible".into()];
e.tags.push("corruption".into());
e
},
{
let mut e = base_entry("dream_corruption_tendrils", "Corruption Tendrils");
e.spawn.rate_per_sec = 8.0;
e.render.mode = RenderMode::Ribbon;
e.simulate.behaviors = vec![BehaviorBlock::Seek, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 4.0;
e.initialize.color = [0.3, 0.0, 0.4, 0.8];
e.semantics.trait_tags = vec!["isVoidTouched".into()];
e.tags.push("corruption".into());
e.tags.push("tendril".into());
e
},
{
let mut e = base_entry("dream_corruption_pulse", "Corruption Pulse");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 40;
e.spawn.rate_per_sec = 0.0;
e.shape = SpawnShape::Ring {
radius: 0.3,
thickness: 0.1,
};
e.simulate.lifetime.seconds = 1.5;
e.initialize.color = [0.5, 0.0, 0.6, 0.9];
e.semantics.trait_tags = vec!["isVoidTouched".into()];
e.tags.push("corruption".into());
e.tags.push("pulse".into());
e
},
{
let mut e = base_entry("dream_corruption_shatter", "Corruption Shatter");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 50;
e.spawn.rate_per_sec = 0.0;
e.simulate.gravity = [0.0, -3.0, 0.0];
e.simulate.lifetime.seconds = 3.0;
e.render.mode = RenderMode::ShardInstance;
e.initialize.color = [0.35, 0.0, 0.45, 1.0];
e.semantics.trait_tags = vec!["isVoidTouched".into(), "isDestructible".into()];
e.tags.push("corruption".into());
e.tags.push("shatter".into());
e
},
{
let mut e = base_entry("dream_void_rift", "Void Rift");
e.spawn.rate_per_sec = 18.0;
e.simulate.behaviors = vec![BehaviorBlock::Orbit, BehaviorBlock::Seek];
e.simulate.lifetime.seconds = 4.0;
e.initialize.color = [0.05, 0.0, 0.1, 0.95];
e.semantics.trait_tags = vec!["isVoidTouched".into(), "isDreammatter".into()];
e.tags.push("void".into());
e.tags.push("rift".into());
e
},
{
let mut e = base_entry("dream_void_consume", "Void Consume");
e.spawn.rate_per_sec = 25.0;
e.shape = SpawnShape::Sphere { radius: 1.0 };
e.simulate.behaviors = vec![BehaviorBlock::Seek];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [0.0, 0.0, 0.05, 0.9];
e.semantics.trait_tags = vec!["isVoidTouched".into()];
e.tags.push("void".into());
e.tags.push("consume".into());
e
},
{
let mut e = base_entry("dream_void_echo", "Void Echo");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 20;
e.spawn.rate_per_sec = 0.0;
e.shape = SpawnShape::Ring {
radius: 1.0,
thickness: 0.2,
};
e.simulate.lifetime.seconds = 2.5;
e.initialize.color = [0.1, 0.0, 0.15, 0.5];
e.semantics.trait_tags = vec!["isVoidTouched".into()];
e.tags.push("void".into());
e.tags.push("echo".into());
e
},
{
let mut e = base_entry("dream_void_bloom", "Void Bloom");
e.spawn.rate_per_sec = 8.0;
e.simulate.behaviors = vec![BehaviorBlock::Hover, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 8.0;
e.initialize.color = [0.15, 0.0, 0.25, 0.7];
e.semantics.trait_tags = vec!["isVoidTouched".into(), "isDreammatter".into()];
e.tags.push("void".into());
e.tags.push("bloom".into());
e
},
{
let mut e = base_entry("dream_memory_wisps", "Memory Wisps");
e.spawn.rate_per_sec = 6.0;
e.simulate.behaviors = vec![BehaviorBlock::Hover, BehaviorBlock::Drift];
e.simulate.lifetime.seconds = 10.0;
e.render.mode = RenderMode::PointCloud;
e.initialize.color = [0.8, 0.9, 1.0, 0.4];
e.tags.push("memory".into());
e
},
{
let mut e = base_entry("dream_memory_echo", "Memory Echo");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 15;
e.spawn.rate_per_sec = 0.0;
e.simulate.lifetime.seconds = 3.0;
e.simulate.behaviors = vec![BehaviorBlock::Drift];
e.initialize.color = [0.7, 0.8, 1.0, 0.3];
e.tags.push("memory".into());
e.tags.push("echo".into());
e
},
{
let mut e = base_entry("dream_signal_pulse", "Signal Pulse");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 25;
e.spawn.rate_per_sec = 0.0;
e.shape = SpawnShape::Ring {
radius: 0.2,
thickness: 0.05,
};
e.simulate.lifetime.seconds = 1.0;
e.initialize.color = [0.6, 0.8, 1.0, 0.8];
e.tags.push("signal".into());
e
},
{
let mut e = base_entry("dream_signal_cascade", "Signal Cascade");
e.spawn.rate_per_sec = 30.0;
e.simulate.behaviors = vec![BehaviorBlock::Seek, BehaviorBlock::Drift];
e.simulate.lifetime.seconds = 2.0;
e.render.mode = RenderMode::Ribbon;
e.initialize.color = [0.5, 0.7, 1.0, 0.7];
e.tags.push("signal".into());
e.tags.push("cascade".into());
e
},
{
let mut e = base_entry("dream_attestation_seal", "Attestation Seal");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 20;
e.spawn.rate_per_sec = 0.0;
e.shape = SpawnShape::Ring {
radius: 0.5,
thickness: 0.1,
};
e.simulate.lifetime.seconds = 3.0;
e.simulate.behaviors = vec![BehaviorBlock::Orbit];
e.initialize.color = [1.0, 0.85, 0.0, 0.9];
e.tags.push("attestation".into());
e
},
{
let mut e = base_entry("dream_attestation_verify", "Attestation Verify");
e.spawn.mode = SpawnMode::Burst;
e.spawn.burst_count = 30;
e.spawn.rate_per_sec = 0.0;
e.simulate.gravity = [0.0, 0.5, 0.0];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [0.3, 1.0, 0.5, 0.9];
e.tags.push("attestation".into());
e.tags.push("verify".into());
e
},
{
let mut e = base_entry("dream_strange_life", "Strange Life");
e.spawn.rate_per_sec = 5.0;
e.simulate.behaviors = vec![BehaviorBlock::ParticleLite, BehaviorBlock::Wobble, BehaviorBlock::Hover];
e.simulate.lifetime.seconds = 12.0;
e.render.mode = RenderMode::MeshInstance;
e.initialize.color = [0.6, 1.0, 0.8, 0.8];
e.semantics.trait_tags = vec!["isDreammatter".into(), "isOrganic".into()];
e.tags.push("life".into());
e
},
{
let mut e = base_entry("dream_ambient_dream", "Ambient Dream");
e.spawn.rate_per_sec = 4.0;
e.simulate.behaviors = vec![BehaviorBlock::Hover, BehaviorBlock::Drift, BehaviorBlock::Wobble];
e.simulate.lifetime.seconds = 15.0;
e.initialize.color = [0.5, 0.4, 0.9, 0.3];
e.tags.push("ambient".into());
e
},
]
}