Skip to main content

qualia_client_core/
activity_signals.rs

1//! Cross-crate activity flags for ambient telemetry (ontology jobs, inference, …).
2
3use std::sync::atomic::{AtomicU32, Ordering};
4
5static ONTOLOGY_JOBS_RUNNING: AtomicU32 = AtomicU32::new(0);
6static ONTOLOGY_JOB_PULSE: AtomicU32 = AtomicU32::new(0);
7
8/// Mark an ontology / cold-path job as active (increment running count).
9pub fn begin_ontology_job() {
10    ONTOLOGY_JOBS_RUNNING.fetch_add(1, Ordering::Relaxed);
11    ONTOLOGY_JOB_PULSE.fetch_add(1, Ordering::Relaxed);
12}
13
14/// Mark an ontology job finished.
15pub fn end_ontology_job() {
16    ONTOLOGY_JOBS_RUNNING
17        .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| {
18            Some(n.saturating_sub(1))
19        })
20        .ok();
21}
22
23/// Normalized baking pressure for ambient shaders (0.0–1.0).
24pub fn ontology_baking_pressure() -> f32 {
25    let running = ONTOLOGY_JOBS_RUNNING.load(Ordering::Relaxed);
26    let pulse = ONTOLOGY_JOB_PULSE.load(Ordering::Relaxed);
27    if running > 0 {
28        return 1.0;
29    }
30    if pulse == 0 {
31        return 0.0;
32    }
33    // Decay visual after job completes.
34    let decayed = (pulse as f32 * 0.92).max(0.0) as u32;
35    ONTOLOGY_JOB_PULSE.store(decayed, Ordering::Relaxed);
36    (decayed as f32 / 64.0).min(1.0)
37}