use color;
use color::Color;
use render::BasicPipelineState;
use texture::Texture;
use util;
#[doc(inline)]
pub use self::basic::Basic;
pub mod basic {
use super::*;
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Basic {
pub color: Color,
pub map: Option<Texture<[f32; 4]>>,
}
impl Default for Basic {
fn default() -> Self {
Self {
color: color::WHITE,
map: None,
}
}
}
#[derive(Clone, Debug, PartialEq, Hash)]
pub struct Custom {
pub color: Color,
pub map: Option<Texture<[f32; 4]>>,
pub pipeline: BasicPipelineState,
}
impl Eq for Custom {}
}
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Lambert {
pub color: Color,
pub flat: bool,
}
impl Default for Lambert {
fn default() -> Self {
Self {
color: color::WHITE,
flat: false,
}
}
}
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Line {
pub color: Color,
}
impl Default for Line {
fn default() -> Self {
Self {
color: color::WHITE,
}
}
}
#[derive(Derivative)]
#[derivative(Clone, Debug, PartialEq, Hash, Eq)]
pub struct Pbr {
pub base_color_factor: Color,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub base_color_alpha: f32,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub metallic_factor: f32,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub roughness_factor: f32,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub occlusion_strength: f32,
pub emissive_factor: Color,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub normal_scale: f32,
pub base_color_map: Option<Texture<[f32; 4]>>,
pub normal_map: Option<Texture<[f32; 4]>>,
pub emissive_map: Option<Texture<[f32; 4]>>,
pub metallic_roughness_map: Option<Texture<[f32; 4]>>,
pub occlusion_map: Option<Texture<[f32; 4]>>,
}
impl Default for Pbr {
fn default() -> Self {
Self {
base_color_factor: color::WHITE,
base_color_alpha: 1.0,
metallic_factor: 1.0,
roughness_factor: 1.0,
occlusion_strength: 1.0,
emissive_factor: color::BLACK,
normal_scale: 1.0,
base_color_map: None,
normal_map: None,
emissive_map: None,
metallic_roughness_map: None,
occlusion_map: None,
}
}
}
#[derive(Derivative)]
#[derivative(Clone, Debug, PartialEq, Hash, Eq)]
pub struct Phong {
pub color: Color,
#[derivative(Hash(hash_with = "util::hash_f32"))]
pub glossiness: f32,
}
impl Default for Phong {
fn default() -> Self {
Self {
color: color::WHITE,
glossiness: 30.0,
}
}
}
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Sprite {
pub map: Texture<[f32; 4]>,
}
#[derive(Clone, Hash, Debug, PartialEq, Eq)]
pub struct Wireframe {
pub color: Color,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq)]
pub enum Material {
Basic(Basic),
CustomBasic(basic::Custom),
Line(Line),
Lambert(Lambert),
Phong(Phong),
Pbr(Pbr),
Sprite(Sprite),
Wireframe(Wireframe),
}
impl From<Basic> for Material {
fn from(params: Basic) -> Self {
Material::Basic(params)
}
}
impl From<basic::Custom> for Material {
fn from(params: basic::Custom) -> Self {
Material::CustomBasic(params)
}
}
impl From<Lambert> for Material {
fn from(params: Lambert) -> Self {
Material::Lambert(params)
}
}
impl From<Line> for Material {
fn from(params: Line) -> Self {
Material::Line(params)
}
}
impl From<Phong> for Material {
fn from(params: Phong) -> Self {
Material::Phong(params)
}
}
impl From<Pbr> for Material {
fn from(params: Pbr) -> Self {
Material::Pbr(params)
}
}
impl From<Sprite> for Material {
fn from(params: Sprite) -> Self {
Material::Sprite(params)
}
}
impl From<Wireframe> for Material {
fn from(params: Wireframe) -> Self {
Material::Wireframe(params)
}
}