use lactea_audio::AudioFrame;
use lactea_eel::Context;
use lactea_render::PassRandom;
use std::collections::BTreeMap;
#[derive(Clone, Debug, Default)]
pub struct ForcedFrame {
pub vars: BTreeMap<String, f64>,
pub prev_main: Option<Vec<u8>>,
pub comp_main: Option<Vec<u8>>,
}
impl ForcedFrame {
pub(crate) fn override_audio(&self, a: &mut AudioFrame) {
let get = |k: &str| self.vars.get(k).map(|v| *v as f32);
if let Some(v) = get("audio.bass") {
a.bass = v;
}
if let Some(v) = get("audio.mid") {
a.mid = v;
}
if let Some(v) = get("audio.treb") {
a.treb = v;
}
if let Some(v) = get("audio.vol") {
a.vol = v;
}
if let Some(v) = get("audio.bass_att") {
a.bass_att = v;
}
if let Some(v) = get("audio.mid_att") {
a.mid_att = v;
}
if let Some(v) = get("audio.treb_att") {
a.treb_att = v;
}
if let Some(v) = get("audio.vol_att") {
a.vol_att = v;
}
}
pub(crate) fn apply_vars(&self, ctx: &mut Context) {
for (name, value) in &self.vars {
if name.contains('.') {
continue;
}
if let Some(v) = ctx.find_var(name) {
ctx.set(v, *value);
}
}
}
pub(crate) fn hue_offsets(&self) -> Option<[f32; 4]> {
let mut h = [0.0f32; 4];
for (i, slot) in h.iter_mut().enumerate() {
*slot = *self.vars.get(&format!("hue_offset.{i}"))? as f32;
}
Some(h)
}
pub(crate) fn pass_random(&self, prefix: &str) -> Option<PassRandom> {
let xyzw = ['x', 'y', 'z', 'w'];
let mut rand_frame = [0.0f32; 4];
let mut rand_preset = [0.0f32; 4];
for k in 0..4 {
rand_frame[k] = *self.vars.get(&format!("{prefix}rand_frame.{}", xyzw[k]))? as f32;
rand_preset[k] = *self.vars.get(&format!("{prefix}rand_preset.{}", xyzw[k]))? as f32;
}
let names = [
"rot_s1",
"rot_s2",
"rot_s3",
"rot_s4",
"rot_d1",
"rot_d2",
"rot_d3",
"rot_d4",
"rot_f1",
"rot_f2",
"rot_f3",
"rot_f4",
"rot_vf1",
"rot_vf2",
"rot_vf3",
"rot_vf4",
"rot_uf1",
"rot_uf2",
"rot_uf3",
"rot_uf4",
"rot_rand1",
"rot_rand2",
"rot_rand3",
"rot_rand4",
];
let mut rot = Box::new([[[0.0f32; 4]; 3]; 24]);
let mut complete = true;
for (m, name) in names.iter().enumerate() {
for col in 0..3 {
for row in 0..4 {
match self.vars.get(&format!("{prefix}{name}.{}", col * 4 + row)) {
Some(v) => rot[m][col][row] = *v as f32,
None => complete = false,
}
}
}
}
Some(PassRandom {
rand_frame,
rand_preset,
rot: complete.then_some(rot),
})
}
}