use std::collections::BTreeMap;
use glium::uniforms::{
UniformValue,
Uniforms,
};
#[derive(Default)]
pub struct UniformMap<'a>(BTreeMap<String, Vec<UniformValue<'a>>>);
impl<'a> UniformMap<'a> {
pub fn new() -> UniformMap<'a> { UniformMap(BTreeMap::new()) }
pub fn add(&mut self, kind: &str, uniform: UniformValue<'a>) -> usize {
if !self.0.contains_key(kind) {
self.0.insert(kind.to_string(), vec![]);
}
let uniforms = self.0.get_mut(kind).unwrap();
uniforms.push(uniform);
uniforms.len() - 1
}
pub fn get(&self, kind: &str, index: usize) -> Option<&UniformValue<'a>> {
self.0.get(kind)?.get(index)
}
pub fn get_kind_all(&self, kind: &str) -> Option<&Vec<UniformValue<'a>>> {
self.0.get(kind)
}
pub fn append(&mut self, other: Self) {
for (key, values) in other.0.into_iter() {
for value in values {
self.add(&key, value);
}
}
}
}
impl<'a> Uniforms for UniformMap<'a> {
fn visit_values<'b, F: FnMut(&str, UniformValue<'b>)>(
&'b self,
mut output: F,
) {
for (kind, uniforms) in self.0.iter() {
if uniforms.len() == 1 {
output(&format!("u_{}", kind), uniforms[0]);
}
for (index, uniform) in uniforms.iter().enumerate() {
output(&format!("u_{}_{}", kind, index), *uniform)
}
}
}
}