use std::collections::HashSet;
pub trait GlslItem: core::fmt::Debug {
fn name(&self) -> &'static str;
fn dependencies(&self) -> Vec<Box<dyn GlslItem>>;
fn definition(&self) -> &'static str;
fn with_dependencies(&self) -> String {
let mut items = HashSet::new();
let mut code = String::new();
self.with_dependencies_impl(&mut items, &mut code);
code
}
fn with_dependencies_impl(&self, items: &mut HashSet<&'static str>, code: &mut String) {
if items.contains(self.name()) {
return;
}
items.insert(self.name());
for dep in self.dependencies() {
dep.with_dependencies_impl(items, code);
}
if code.len() > 0 && self.definition().len() > 0 {
*code += "\n\n";
}
*code += self.definition();
}
}
pub mod prelude {
pub use crate::macros::*;
pub use crate::traits::*;
pub use crate::types::*;
}
pub mod traits {
pub use super::GlslItem;
::rs2glsl_macros::make_traits!();
}
pub mod macros {
#[allow(unused_imports)]
use super::prelude::*;
pub use ::rs2glsl_macros::glsl;
pub use ::rs2glsl_macros::glsl_native;
}
pub mod types {
use core::ops::*;
use crate::traits::*;
::rs2glsl_macros::make_types!();
fn dist_squared<T: Add<Output=T> + Sub<Output=T> + Mul<Output=T> + Div<Output=T> + Copy>(a: T, b: T) -> T {
let d = a - b;
d * d
}
fn lerp<T: Add<Output=T> + Sub<Output=T> + Mul<Output=T> + Div<Output=T> + Copy>(x: T, y: T, a: T) -> T {
x - x * a + y * a
}
}