use crate::{
core::{
algebra::{Matrix2, Matrix3, Matrix4, Vector2, Vector3, Vector4},
reflect::prelude::*,
sstorage::ImmutableString,
type_traits::prelude::*,
visitor::prelude::*,
},
define_shared_wrapper,
};
use fyrox_core::define_as_any_trait;
use serde::{Deserialize, Serialize};
use strum_macros::{AsRefStr, EnumString, VariantNames};
define_as_any_trait!(GpuProgramAsAny => GpuProgramTrait);
pub trait GpuProgramTrait: GpuProgramAsAny {}
define_shared_wrapper!(GpuProgram<dyn GpuProgramTrait>);
pub enum ShaderKind {
Vertex,
Fragment,
}
define_as_any_trait!(GpuShaderAsAny => GpuShaderTrait);
pub trait GpuShaderTrait: GpuShaderAsAny {}
define_shared_wrapper!(GpuShader<dyn GpuShaderTrait>);
#[derive(
Serialize,
Deserialize,
Default,
Debug,
PartialEq,
Clone,
Copy,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
TypeUuidProvider,
)]
#[type_uuid(id = "791b333c-eb3f-4279-97fe-cf2ba45c6d78")]
pub enum SamplerFallback {
#[default]
White,
Normal,
Black,
Volume,
}
#[derive(
Serialize,
Deserialize,
Default,
Debug,
PartialEq,
Clone,
Copy,
Visit,
Eq,
Reflect,
AsRefStr,
EnumString,
VariantNames,
TypeUuidProvider,
)]
#[type_uuid(id = "50dc9197-f7f7-4a7d-9b64-9f0868785f56")]
pub enum SamplerKind {
Sampler1D,
#[default]
Sampler2D,
Sampler3D,
SamplerCube,
USampler1D,
USampler2D,
USampler3D,
USamplerCube,
}
#[derive(
Serialize,
Deserialize,
Debug,
PartialEq,
Reflect,
Visit,
Clone,
TypeUuidProvider,
AsRefStr,
EnumString,
VariantNames,
)]
#[type_uuid(id = "13896a77-dae6-481e-9c76-808a3d4c3ff0")]
pub enum ShaderResourceKind {
Texture {
kind: SamplerKind,
fallback: SamplerFallback,
},
PropertyGroup(Vec<ShaderProperty>),
}
#[derive(
Serialize,
Deserialize,
Debug,
PartialEq,
Clone,
Reflect,
Visit,
TypeUuidProvider,
AsRefStr,
EnumString,
VariantNames,
)]
#[type_uuid(id = "0053de9a-0911-4d26-8f8e-8a4f65e1b0a7")]
pub enum ShaderPropertyKind {
Float {
#[serde(default)]
value: f32,
},
FloatArray {
value: Vec<f32>,
max_len: usize,
},
Int {
#[serde(default)]
value: i32,
},
IntArray {
value: Vec<i32>,
max_len: usize,
},
UInt {
#[serde(default)]
value: u32,
},
UIntArray {
value: Vec<u32>,
max_len: usize,
},
Bool {
#[serde(default)]
value: bool,
},
Vector2 {
#[serde(default)]
value: Vector2<f32>,
},
Vector2Array {
value: Vec<Vector2<f32>>,
max_len: usize,
},
Vector3 {
#[serde(default)]
value: Vector3<f32>,
},
Vector3Array {
value: Vec<Vector3<f32>>,
max_len: usize,
},
Vector4 {
#[serde(default)]
value: Vector4<f32>,
},
Vector4Array {
value: Vec<Vector4<f32>>,
max_len: usize,
},
Matrix2 {
#[serde(default)]
value: Matrix2<f32>,
},
Matrix2Array {
value: Vec<Matrix2<f32>>,
max_len: usize,
},
Matrix3 {
#[serde(default)]
value: Matrix3<f32>,
},
Matrix3Array {
value: Vec<Matrix3<f32>>,
max_len: usize,
},
Matrix4 {
#[serde(default)]
value: Matrix4<f32>,
},
Matrix4Array {
value: Vec<Matrix4<f32>>,
max_len: usize,
},
Color {
#[serde(default = "default_color_component")]
r: u8,
#[serde(default = "default_color_component")]
g: u8,
#[serde(default = "default_color_component")]
b: u8,
#[serde(default = "default_color_component")]
a: u8,
},
}
fn default_color_component() -> u8 {
255
}
#[derive(
Serialize, Deserialize, Debug, PartialEq, Reflect, Visit, Clone, Default, TypeUuidProvider,
)]
#[type_uuid(id = "078b9f26-8fae-4f2f-99d9-9e882c439ebc")]
pub struct ShaderProperty {
pub name: ImmutableString,
pub kind: ShaderPropertyKind,
}
impl ShaderProperty {
pub fn new(name: impl Into<ImmutableString>, kind: ShaderPropertyKind) -> Self {
Self {
name: name.into(),
kind,
}
}
pub fn new_matrix2(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Matrix2 {
value: Matrix2::identity(),
},
)
}
pub fn new_matrix3(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Matrix3 {
value: Matrix3::identity(),
},
)
}
pub fn new_matrix4(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Matrix4 {
value: Matrix4::identity(),
},
)
}
pub fn new_vector2(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector2 {
value: Default::default(),
},
)
}
pub fn new_vector3(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector3 {
value: Default::default(),
},
)
}
pub fn new_vector4(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector4 {
value: Default::default(),
},
)
}
pub fn new_float(name: impl Into<ImmutableString>) -> Self {
Self::new(name, ShaderPropertyKind::Float { value: 0.0 })
}
pub fn new_bool(name: impl Into<ImmutableString>) -> Self {
Self::new(name, ShaderPropertyKind::Bool { value: false })
}
pub fn new_int(name: impl Into<ImmutableString>) -> Self {
Self::new(name, ShaderPropertyKind::Int { value: 0 })
}
pub fn new_color(name: impl Into<ImmutableString>) -> Self {
Self::new(
name,
ShaderPropertyKind::Color {
r: 255,
g: 255,
b: 255,
a: 255,
},
)
}
pub fn new_mat4_f32_array(name: impl Into<ImmutableString>, max_len: usize) -> Self {
Self::new(
name,
ShaderPropertyKind::Matrix4Array {
value: Default::default(),
max_len,
},
)
}
pub fn new_f32_array(name: impl Into<ImmutableString>, max_len: usize) -> Self {
Self::new(
name,
ShaderPropertyKind::FloatArray {
value: Default::default(),
max_len,
},
)
}
pub fn new_vec4_f32_array(name: impl Into<ImmutableString>, max_len: usize) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector4Array {
value: Default::default(),
max_len,
},
)
}
pub fn new_vec3_f32_array(name: impl Into<ImmutableString>, max_len: usize) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector3Array {
value: Default::default(),
max_len,
},
)
}
pub fn new_vec2_f32_array(name: impl Into<ImmutableString>, max_len: usize) -> Self {
Self::new(
name,
ShaderPropertyKind::Vector2Array {
value: Default::default(),
max_len,
},
)
}
}
impl Default for ShaderPropertyKind {
fn default() -> Self {
Self::Float { value: 0.0 }
}
}
impl Default for ShaderResourceKind {
fn default() -> Self {
Self::PropertyGroup(Default::default())
}
}
#[derive(
Default, Serialize, Deserialize, Clone, Debug, PartialEq, Reflect, Visit, TypeUuidProvider,
)]
#[type_uuid(id = "281df21d-ec95-42c7-a17e-a3eb4724dfc9")]
pub struct ShaderResourceDefinition {
pub name: ImmutableString,
pub kind: ShaderResourceKind,
pub binding: usize,
}
impl ShaderResourceDefinition {
pub fn is_built_in(&self) -> bool {
self.name.starts_with("fyrox_")
}
}