pub use gfx_core::shade::{ConstFormat, Formatted};
use gfx_core::shade::{CreateShaderError, CreateProgramError,
ShaderModel, UniformValue};
#[allow(missing_docs)]
pub trait ToUniform: Copy {
fn convert(self) -> UniformValue;
}
macro_rules! impl_uniforms {
{ $( $ty_src:ty = $ty_dst:ident ,)* } => {
$(
impl ToUniform for $ty_src {
fn convert(self) -> UniformValue {
UniformValue::$ty_dst(self)
}
}
)*
}
}
impl_uniforms!{
i32 = I32,
f32 = F32,
[i32; 2] = I32Vector2,
[i32; 3] = I32Vector3,
[i32; 4] = I32Vector4,
[f32; 2] = F32Vector2,
[f32; 3] = F32Vector3,
[f32; 4] = F32Vector4,
[[f32; 2]; 2] = F32Matrix2,
[[f32; 3]; 3] = F32Matrix3,
[[f32; 4]; 4] = F32Matrix4,
}
#[derive(Clone, PartialEq, Debug)]
pub enum ProgramError {
Vertex(CreateShaderError),
Pixel(CreateShaderError),
Link(CreateProgramError),
}
#[allow(missing_docs)]
#[derive(Copy, Clone, PartialEq, Debug)]
pub struct ShaderSource<'a> {
pub glsl_120: Option<&'a [u8]>,
pub glsl_130: Option<&'a [u8]>,
pub glsl_140: Option<&'a [u8]>,
pub glsl_150: Option<&'a [u8]>,
pub glsl_430: Option<&'a [u8]>,
pub targets: &'a [&'a str],
}
impl<'a> ShaderSource<'a> {
pub fn empty() -> ShaderSource<'a> {
ShaderSource {
glsl_120: None,
glsl_130: None,
glsl_140: None,
glsl_150: None,
glsl_430: None,
targets: &[],
}
}
pub fn choose(&self, model: ShaderModel) -> Result<&'a [u8], ()> {
let version = model.to_number();
Ok(match *self {
ShaderSource { glsl_430: Some(s), .. } if version >= 50 => s,
ShaderSource { glsl_150: Some(s), .. } if version >= 40 => s,
ShaderSource { glsl_140: Some(s), .. } if version >= 40 => s,
ShaderSource { glsl_130: Some(s), .. } if version >= 30 => s,
ShaderSource { glsl_120: Some(s), .. } if version >= 20 => s,
_ => return Err(()),
})
}
}