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::UIFeedback,
authority: AuthorityProfile::VisualOnly,
semantics: SemanticBinding::default(),
shape: SpawnShape::Point,
spawn: SpawnPolicy {
mode: SpawnMode::Burst,
rate_per_sec: 0.0,
burst_count: 10,
max_live: 50,
warmup_seconds: 0.0,
looped: false,
seed: 0,
density_scale_lod: false,
},
initialize: InitPolicy::default(),
simulate: SimPolicy {
mode: SimulationMode::Full,
gravity: [0.0, 0.0, 0.0],
drag: 0.1,
damping: 0.05,
noise: None,
forces: vec![],
lifetime: LifetimePolicy {
seconds: 1.0,
random_range: None,
},
behaviors: vec![],
},
collision: CollisionPolicy {
mode: CollisionMode::None,
..CollisionPolicy::default()
},
render: RenderPolicy {
mode: RenderMode::Billboard,
..RenderPolicy::default()
},
promotion: PromotionPolicy::default(),
budgets: BudgetPolicy {
max_gpu_particles: 50,
importance: "Low".into(),
offscreen_mode: SimulationMode::Culled,
},
replication: ReplicationPolicy {
class: ReplicationClass::None,
},
supported_views: vec![
RepresentationMode::World3D,
RepresentationMode::Sprite2D,
RepresentationMode::TopDown2D,
RepresentationMode::Isometric2D,
],
tags: vec!["ui".into()],
}
}
pub fn catalog() -> Vec<PresetCatalogEntry> {
vec![
{
let mut e = base_entry("ui_select_glow", "Select Glow");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 8.0;
e.simulate.lifetime.seconds = 1.5;
e.simulate.behaviors = vec![BehaviorBlock::Hover];
e.initialize.color = [1.0, 1.0, 0.8, 0.5];
e.tags.push("select".into());
e
},
{
let mut e = base_entry("ui_hover_shimmer", "Hover Shimmer");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 5.0;
e.simulate.lifetime.seconds = 0.8;
e.initialize.color = [0.9, 0.95, 1.0, 0.3];
e.tags.push("hover".into());
e
},
{
let mut e = base_entry("ui_click_burst", "Click Burst");
e.spawn.burst_count = 15;
e.simulate.lifetime.seconds = 0.5;
e.shape = SpawnShape::Sphere { radius: 0.1 };
e.initialize.color = [1.0, 1.0, 1.0, 0.8];
e.tags.push("click".into());
e
},
{
let mut e = base_entry("ui_confirm_sparkle", "Confirm Sparkle");
e.spawn.burst_count = 20;
e.simulate.lifetime.seconds = 0.8;
e.simulate.gravity = [0.0, 0.5, 0.0];
e.initialize.color = [0.3, 1.0, 0.5, 0.9];
e.tags.push("confirm".into());
e
},
{
let mut e = base_entry("ui_cancel_puff", "Cancel Puff");
e.spawn.burst_count = 8;
e.simulate.lifetime.seconds = 0.4;
e.simulate.drag = 0.3;
e.initialize.color = [0.6, 0.6, 0.6, 0.5];
e.tags.push("cancel".into());
e
},
{
let mut e = base_entry("ui_error_shake", "Error Shake");
e.spawn.burst_count = 12;
e.simulate.lifetime.seconds = 0.3;
e.simulate.behaviors = vec![BehaviorBlock::Wobble];
e.initialize.color = [1.0, 0.2, 0.2, 0.8];
e.tags.push("error".into());
e
},
{
let mut e = base_entry("ui_level_up", "Level Up");
e.spawn.burst_count = 40;
e.shape = SpawnShape::Ring {
radius: 0.5,
thickness: 0.1,
};
e.simulate.gravity = [0.0, 2.0, 0.0];
e.simulate.lifetime.seconds = 2.0;
e.initialize.color = [1.0, 0.85, 0.0, 1.0];
e.tags.push("levelup".into());
e
},
{
let mut e = base_entry("ui_achievement", "Achievement");
e.spawn.burst_count = 30;
e.shape = SpawnShape::Sphere { radius: 0.3 };
e.simulate.gravity = [0.0, 1.0, 0.0];
e.simulate.lifetime.seconds = 2.5;
e.initialize.color = [1.0, 0.9, 0.3, 1.0];
e.tags.push("achievement".into());
e
},
{
let mut e = base_entry("ui_damage_number", "Damage Number");
e.spawn.burst_count = 1;
e.simulate.gravity = [0.0, 0.5, 0.0];
e.simulate.lifetime.seconds = 1.5;
e.simulate.drag = 0.15;
e.initialize.color = [1.0, 0.3, 0.2, 1.0];
e.tags.push("damage".into());
e
},
{
let mut e = base_entry("ui_heal_number", "Heal Number");
e.spawn.burst_count = 1;
e.simulate.gravity = [0.0, 0.5, 0.0];
e.simulate.lifetime.seconds = 1.5;
e.simulate.drag = 0.15;
e.initialize.color = [0.2, 1.0, 0.4, 1.0];
e.tags.push("heal".into());
e
},
{
let mut e = base_entry("ui_combo_streak", "Combo Streak");
e.spawn.burst_count = 25;
e.simulate.lifetime.seconds = 0.6;
e.shape = SpawnShape::Sphere { radius: 0.2 };
e.initialize.color = [1.0, 0.6, 0.0, 1.0];
e.tags.push("combo".into());
e
},
{
let mut e = base_entry("ui_cooldown_sweep", "Cooldown Sweep");
e.spawn.mode = SpawnMode::Continuous;
e.spawn.rate_per_sec = 10.0;
e.simulate.lifetime.seconds = 0.5;
e.shape = SpawnShape::Ring {
radius: 0.3,
thickness: 0.05,
};
e.simulate.behaviors = vec![BehaviorBlock::Orbit];
e.initialize.color = [0.5, 0.7, 1.0, 0.5];
e.tags.push("cooldown".into());
e
},
{
let mut e = base_entry("ui_pickup_collect", "Pickup Collect");
e.spawn.burst_count = 15;
e.simulate.gravity = [0.0, 1.0, 0.0];
e.simulate.lifetime.seconds = 0.8;
e.simulate.behaviors = vec![BehaviorBlock::Seek];
e.initialize.color = [1.0, 1.0, 0.5, 0.9];
e.tags.push("pickup".into());
e
},
{
let mut e = base_entry("ui_quest_complete", "Quest Complete");
e.spawn.burst_count = 50;
e.shape = SpawnShape::Ring {
radius: 1.0,
thickness: 0.2,
};
e.simulate.gravity = [0.0, 1.5, 0.0];
e.simulate.lifetime.seconds = 3.0;
e.initialize.color = [1.0, 0.85, 0.0, 1.0];
e.tags.push("quest".into());
e
},
]
}