#![allow(missing_docs)]
use std::fmt;
pub type Dimension = u8;
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum IsArray { Array, NoArray }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum IsShadow { Shadow, NoShadow }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum IsMultiSample { MultiSample, NoMultiSample }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum IsRect { Rect, NoRect }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum MatrixFormat { ColumnMajor, RowMajor }
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum SamplerType {
SamplerBuffer,
Sampler1D(IsArray, IsShadow),
Sampler2D(IsArray, IsShadow, IsMultiSample, IsRect),
Sampler3D,
SamplerCube(IsShadow),
}
#[allow(missing_docs)]
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum BaseType {
F32,
F64,
I32,
U32,
Bool,
}
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum ContainerType {
Single,
Vector(Dimension),
Matrix(MatrixFormat, Dimension, Dimension),
}
#[allow(missing_docs)]
#[derive(Copy, Clone, Debug, Hash, PartialEq)]
#[repr(u8)]
pub enum Stage {
Vertex,
Geometry,
Fragment,
}
pub type Location = usize;
#[allow(missing_docs)]
#[derive(Copy)]
pub enum UniformValue {
I32(i32),
F32(f32),
I32Vector2([i32; 2]),
I32Vector3([i32; 3]),
I32Vector4([i32; 4]),
F32Vector2([f32; 2]),
F32Vector3([f32; 3]),
F32Vector4([f32; 4]),
F32Matrix2([[f32; 2]; 2]),
F32Matrix3([[f32; 3]; 3]),
F32Matrix4([[f32; 4]; 4]),
}
impl UniformValue {
pub fn is_same_type(&self, other: &UniformValue) -> bool {
match (*self, *other) {
(UniformValue::I32(_), UniformValue::I32(_)) => true,
(UniformValue::F32(_), UniformValue::F32(_)) => true,
(UniformValue::I32Vector2(_), UniformValue::I32Vector2(_)) => true,
(UniformValue::I32Vector3(_), UniformValue::I32Vector3(_)) => true,
(UniformValue::I32Vector4(_), UniformValue::I32Vector4(_)) => true,
(UniformValue::F32Vector2(_), UniformValue::F32Vector2(_)) => true,
(UniformValue::F32Vector3(_), UniformValue::F32Vector3(_)) => true,
(UniformValue::F32Vector4(_), UniformValue::F32Vector4(_)) => true,
(UniformValue::F32Matrix2(_), UniformValue::F32Matrix2(_)) => true,
(UniformValue::F32Matrix3(_), UniformValue::F32Matrix3(_)) => true,
(UniformValue::F32Matrix4(_), UniformValue::F32Matrix4(_)) => true,
_ => false,
}
}
}
impl Clone for UniformValue {
fn clone(&self) -> UniformValue {
match *self {
UniformValue::I32(val) => UniformValue::I32(val),
UniformValue::F32(val) => UniformValue::F32(val),
UniformValue::I32Vector2(v) => UniformValue::I32Vector2(v),
UniformValue::I32Vector3(v) => UniformValue::I32Vector3(v),
UniformValue::I32Vector4(v) => UniformValue::I32Vector4(v),
UniformValue::F32Vector2(v) => UniformValue::F32Vector2(v),
UniformValue::F32Vector3(v) => UniformValue::F32Vector3(v),
UniformValue::F32Vector4(v) => UniformValue::F32Vector4(v),
UniformValue::F32Matrix2(m) => UniformValue::F32Matrix2(m),
UniformValue::F32Matrix3(m) => UniformValue::F32Matrix3(m),
UniformValue::F32Matrix4(m) => UniformValue::F32Matrix4(m),
}
}
}
impl fmt::Debug for UniformValue {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
UniformValue::I32(x) => write!(f, "ValueI32({:?})", x),
UniformValue::F32(x) => write!(f, "ValueF32({:?})", x),
UniformValue::I32Vector2(ref v) => write!(f, "ValueI32Vector2({:?})", &v[..]),
UniformValue::I32Vector3(ref v) => write!(f, "ValueI32Vector3({:?})", &v[..]),
UniformValue::I32Vector4(ref v) => write!(f, "ValueI32Vector4({:?})", &v[..]),
UniformValue::F32Vector2(ref v) => write!(f, "ValueF32Vector2({:?})", &v[..]),
UniformValue::F32Vector3(ref v) => write!(f, "ValueF32Vector3({:?})", &v[..]),
UniformValue::F32Vector4(ref v) => write!(f, "ValueF32Vector4({:?})", &v[..]),
UniformValue::F32Matrix2(ref m) => {
try!(write!(f, "ValueF32Matrix2("));
for v in m.iter() {
try!(write!(f, "{:?}", &v[..]));
}
write!(f, ")")
},
UniformValue::F32Matrix3(ref m) => {
try!(write!(f, "ValueF32Matrix3("));
for v in m.iter() {
try!(write!(f, "{:?}", &v[..]));
}
write!(f, ")")
},
UniformValue::F32Matrix4(ref m) => {
try!(write!(f, "ValueF32Matrix4("));
for v in m.iter() {
try!(write!(f, "{:?}", &v[..]));
}
write!(f, ")")
},
}
}
}
#[derive(Clone, PartialEq, Debug)]
pub struct Attribute {
pub name: String,
pub location: usize,
pub count: usize,
pub base_type: BaseType,
pub container: ContainerType,
}
#[derive(Clone, PartialEq, Debug)]
pub struct UniformVar {
pub name: String,
pub location: Location,
pub count: usize,
pub base_type: BaseType,
pub container: ContainerType,
}
#[derive(Clone, PartialEq, Debug)]
pub struct BlockVar {
pub name: String,
pub size: usize,
pub usage: u8,
}
#[derive(Clone, PartialEq, Debug)]
pub struct SamplerVar {
pub name: String,
pub location: Location,
pub base_type: BaseType,
pub sampler_type: SamplerType,
}
#[derive(Clone, PartialEq, Debug)]
pub struct ProgramInfo {
pub attributes: Vec<Attribute>,
pub uniforms: Vec<UniformVar>,
pub blocks: Vec<BlockVar>,
pub textures: Vec<SamplerVar>,
}
#[derive(Clone, Copy, Debug)]
pub enum CompatibilityError {
ErrorArraySize,
ErrorBaseType,
ErrorContainer,
}
impl UniformVar {
pub fn is_compatible(&self, value: &UniformValue) -> Result<(), CompatibilityError> {
if self.count != 1 {
return Err(CompatibilityError::ErrorArraySize)
}
match (self.base_type, self.container, *value) {
(BaseType::I32, ContainerType::Single, UniformValue::I32(_)) => Ok(()),
(BaseType::F32, ContainerType::Single, UniformValue::F32(_)) => Ok(()),
(BaseType::F32, ContainerType::Vector(2), UniformValue::F32Vector2(_)) => Ok(()),
(BaseType::F32, ContainerType::Vector(3), UniformValue::F32Vector3(_)) => Ok(()),
(BaseType::F32, ContainerType::Vector(4), UniformValue::F32Vector4(_)) => Ok(()),
(BaseType::I32, ContainerType::Vector(2), UniformValue::I32Vector2(_)) => Ok(()),
(BaseType::I32, ContainerType::Vector(3), UniformValue::I32Vector3(_)) => Ok(()),
(BaseType::I32, ContainerType::Vector(4), UniformValue::I32Vector4(_)) => Ok(()),
(BaseType::F32, ContainerType::Matrix(_, 2,2), UniformValue::F32Matrix2(_)) => Ok(()),
(BaseType::F32, ContainerType::Matrix(_, 3,3), UniformValue::F32Matrix3(_)) => Ok(()),
(BaseType::F32, ContainerType::Matrix(_, 4,4), UniformValue::F32Matrix4(_)) => Ok(()),
_ => Err(CompatibilityError::ErrorBaseType)
}
}
}
#[derive(Clone, PartialEq, Debug)]
pub enum CreateShaderError {
ModelNotSupported,
ShaderCompilationFailed(String)
}
#[derive(Clone, PartialEq, Debug)]
pub enum CreateProgramError {
LinkFail(String),
TargetMismatch(Vec<String>),
}
#[allow(missing_docs)]
#[derive(Copy, Clone, PartialEq, PartialOrd, Debug)]
pub enum ShaderModel {
Unsupported,
Version30,
Version40,
Version41,
Version50,
}
impl ShaderModel {
pub fn to_number(&self) -> u8 {
match *self {
ShaderModel::Unsupported => 0, ShaderModel::Version30 => 30,
ShaderModel::Version40 => 40,
ShaderModel::Version41 => 41,
ShaderModel::Version50 => 50,
}
}
}