Skip to content

Commit

Permalink
refactored shader properties to support defaults
Browse files Browse the repository at this point in the history
- adds proper default value support for shader properties, it is especially useful for 4x4 matrices where default value is an array of 16 numbers
  • Loading branch information
mrDIMAS committed Feb 16, 2025
1 parent fecda61 commit 45ff3e3
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 90 deletions.
20 changes: 10 additions & 10 deletions editor/src/plugins/material/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -480,25 +480,25 @@ impl MaterialEditor {
.map(|property| {
use ShaderPropertyKind as Kind;
let item = match &property.kind {
Kind::Float(value) => value.make_view(ctx),
Kind::Float { value } => value.make_view(ctx),
Kind::FloatArray { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Int(value) => value.make_view(ctx),
Kind::Int { value } => value.make_view(ctx),
Kind::IntArray { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::UInt(value) => value.make_view(ctx),
Kind::UInt { value } => value.make_view(ctx),
Kind::UIntArray { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Vector2(value) => value.make_view(ctx),
Kind::Vector2 { value } => value.make_view(ctx),
Kind::Vector2Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Vector3(value) => value.make_view(ctx),
Kind::Vector3 { value } => value.make_view(ctx),
Kind::Vector3Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Vector4(value) => value.make_view(ctx),
Kind::Vector4 { value } => value.make_view(ctx),
Kind::Vector4Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Matrix2(value) => value.make_view(ctx),
Kind::Matrix2 { value } => value.make_view(ctx),
Kind::Matrix2Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Matrix3(value) => value.make_view(ctx),
Kind::Matrix3 { value } => value.make_view(ctx),
Kind::Matrix3Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Matrix4(value) => value.make_view(ctx),
Kind::Matrix4 { value } => value.make_view(ctx),
Kind::Matrix4Array { value, max_len } => make_array_view(ctx, value, *max_len),
Kind::Bool(value) => value.make_view(ctx),
Kind::Bool { value } => value.make_view(ctx),
Kind::Color { r, g, b, a } => ColorFieldBuilder::new(WidgetBuilder::new())
.with_color(Color::from_rgba(*r, *g, *b, *a))
.build(ctx),
Expand Down
20 changes: 10 additions & 10 deletions fyrox-graphics/src/gl/program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,58 +221,58 @@ impl GlProgram {
for field in fields {
let field_name = &field.name;
match field.kind {
ShaderPropertyKind::Float(_) => {
ShaderPropertyKind::Float { .. } => {
block += &format!("\tfloat {field_name};\n");
}
ShaderPropertyKind::FloatArray { max_len, .. } => {
block += &format!("\tfloat {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Int(_) => {
ShaderPropertyKind::Int { .. } => {
block += &format!("\tint {field_name};\n");
}
ShaderPropertyKind::IntArray { max_len, .. } => {
block += &format!("\tint {field_name}[{max_len}];\n");
}
ShaderPropertyKind::UInt(_) => {
ShaderPropertyKind::UInt { .. } => {
block += &format!("\tuint {field_name};\n");
}
ShaderPropertyKind::UIntArray { max_len, .. } => {
block += &format!("\tuint {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Bool(_) => {
ShaderPropertyKind::Bool { .. } => {
block += &format!("\tbool {field_name};\n");
}
ShaderPropertyKind::Vector2(_) => {
ShaderPropertyKind::Vector2 { .. } => {
block += &format!("\tvec2 {field_name};\n");
}
ShaderPropertyKind::Vector2Array { max_len, .. } => {
block += &format!("\tvec2 {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Vector3(_) => {
ShaderPropertyKind::Vector3 { .. } => {
block += &format!("\tvec3 {field_name};\n");
}
ShaderPropertyKind::Vector3Array { max_len, .. } => {
block += &format!("\tvec3 {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Vector4(_) => {
ShaderPropertyKind::Vector4 { .. } => {
block += &format!("\tvec4 {field_name};\n");
}
ShaderPropertyKind::Vector4Array { max_len, .. } => {
block += &format!("\tvec4 {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Matrix2(_) => {
ShaderPropertyKind::Matrix2 { .. } => {
block += &format!("\tmat2 {field_name};\n");
}
ShaderPropertyKind::Matrix2Array { max_len, .. } => {
block += &format!("\tmat2 {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Matrix3(_) => {
ShaderPropertyKind::Matrix3 { .. } => {
block += &format!("\tmat3 {field_name};\n");
}
ShaderPropertyKind::Matrix3Array { max_len, .. } => {
block += &format!("\tmat3 {field_name}[{max_len}];\n");
}
ShaderPropertyKind::Matrix4(_) => {
ShaderPropertyKind::Matrix4 { .. } => {
block += &format!("\tmat4 {field_name};\n");
}
ShaderPropertyKind::Matrix4Array { max_len, .. } => {
Expand Down
60 changes: 49 additions & 11 deletions fyrox-graphics/src/gpu_program.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,10 @@ pub enum ShaderResourceKind {
#[derive(Serialize, Deserialize, Debug, PartialEq, Reflect, Visit)]
pub enum ShaderPropertyKind {
/// Real number.
Float(f32),
Float {
#[serde(default)]
value: f32,
},

/// Real number array.
FloatArray {
Expand All @@ -142,7 +145,10 @@ pub enum ShaderPropertyKind {
},

/// Integer number.
Int(i32),
Int {
#[serde(default)]
value: i32,
},

/// Integer number array.
IntArray {
Expand All @@ -152,7 +158,10 @@ pub enum ShaderPropertyKind {
},

/// Natural number.
UInt(u32),
UInt {
#[serde(default)]
value: u32,
},

/// Natural number array.
UIntArray {
Expand All @@ -162,10 +171,16 @@ pub enum ShaderPropertyKind {
},

/// Boolean value.
Bool(bool),
Bool {
#[serde(default)]
value: bool,
},

/// Two-dimensional vector.
Vector2(Vector2<f32>),
Vector2 {
#[serde(default)]
value: Vector2<f32>,
},

/// Two-dimensional vector array.
Vector2Array {
Expand All @@ -175,7 +190,10 @@ pub enum ShaderPropertyKind {
},

/// Three-dimensional vector.
Vector3(Vector3<f32>),
Vector3 {
#[serde(default)]
value: Vector3<f32>,
},

/// Three-dimensional vector array.
Vector3Array {
Expand All @@ -185,7 +203,10 @@ pub enum ShaderPropertyKind {
},

/// Four-dimensional vector.
Vector4(Vector4<f32>),
Vector4 {
#[serde(default)]
value: Vector4<f32>,
},

/// Four-dimensional vector array.
Vector4Array {
Expand All @@ -195,7 +216,10 @@ pub enum ShaderPropertyKind {
},

/// 2x2 Matrix.
Matrix2(Matrix2<f32>),
Matrix2 {
#[serde(default)]
value: Matrix2<f32>,
},

/// 2x2 Matrix array.
Matrix2Array {
Expand All @@ -205,7 +229,10 @@ pub enum ShaderPropertyKind {
},

/// 3x3 Matrix.
Matrix3(Matrix3<f32>),
Matrix3 {
#[serde(default)]
value: Matrix3<f32>,
},

/// 3x3 Matrix array.
Matrix3Array {
Expand All @@ -215,7 +242,10 @@ pub enum ShaderPropertyKind {
},

/// 4x4 Matrix.
Matrix4(Matrix4<f32>),
Matrix4 {
#[serde(default)]
value: Matrix4<f32>,
},

/// 4x4 Matrix array.
Matrix4Array {
Expand All @@ -234,19 +264,27 @@ pub enum ShaderPropertyKind {
/// before it passed to shader.
Color {
/// Default Red.
#[serde(default = "default_color_component")]
r: u8,

/// Default Green.
#[serde(default = "default_color_component")]
g: u8,

/// Default Blue.
#[serde(default = "default_color_component")]
b: u8,

/// Default Alpha.
#[serde(default = "default_color_component")]
a: u8,
},
}

fn default_color_component() -> u8 {
255
}

#[derive(Serialize, Deserialize, Debug, PartialEq, Reflect, Visit, Default)]
pub struct ShaderProperty {
pub name: ImmutableString,
Expand All @@ -264,7 +302,7 @@ impl ShaderProperty {

impl Default for ShaderPropertyKind {
fn default() -> Self {
Self::Float(0.0)
Self::Float { value: 0.0 }
}
}

Expand Down
67 changes: 51 additions & 16 deletions fyrox-impl/src/material/shader/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@
//! kind: PropertyGroup([
//! (
//! name: "texCoordScale",
//! kind: Vector2((1.0, 1.0)),
//! kind: Vector2(value: (1.0, 1.0)),
//! ),
//! (
//! name: "diffuseColor",
Expand Down Expand Up @@ -623,31 +623,58 @@ impl ShaderDefinition {
properties.extend([
ShaderProperty::new(
"viewProjectionMatrix",
Matrix4(algebra::Matrix4::identity()),
Matrix4 {
value: algebra::Matrix4::identity(),
},
),
ShaderProperty::new(
"position",
Vector3 {
value: Default::default(),
},
),
ShaderProperty::new(
"upVector",
Vector3 {
value: Default::default(),
},
),
ShaderProperty::new(
"sideVector",
Vector3 {
value: Default::default(),
},
),
ShaderProperty::new("position", Vector3(Default::default())),
ShaderProperty::new("upVector", Vector3(Default::default())),
ShaderProperty::new("sideVector", Vector3(Default::default())),
ShaderProperty::new("zNear", Float(0.0)),
ShaderProperty::new("zFar", Float(0.0)),
ShaderProperty::new("zRange", Float(0.0)),
ShaderProperty::new("zNear", Float { value: 0.0 }),
ShaderProperty::new("zFar", Float { value: 0.0 }),
ShaderProperty::new("zRange", Float { value: 0.0 }),
]);
}
"fyrox_lightData" => {
properties.clear();
properties.extend([
ShaderProperty::new("lightPosition", Vector3(Default::default())),
ShaderProperty::new("ambientLightColor", Vector4(Default::default())),
ShaderProperty::new(
"lightPosition",
Vector3 {
value: Default::default(),
},
),
ShaderProperty::new(
"ambientLightColor",
Vector4 {
value: Default::default(),
},
),
]);
}
"fyrox_graphicsSettings" => {
properties.clear();
properties.extend([ShaderProperty::new("usePOM", Bool(false))]);
properties.extend([ShaderProperty::new("usePOM", Bool { value: false })]);
}
"fyrox_lightsBlock" => {
properties.clear();
properties.extend([
ShaderProperty::new("lightCount", Int(0)),
ShaderProperty::new("lightCount", Int { value: 0 }),
ShaderProperty::new(
"lightsColorRadius",
Vector4Array {
Expand Down Expand Up @@ -681,13 +708,20 @@ impl ShaderDefinition {
"fyrox_instanceData" => {
properties.clear();
properties.extend([
ShaderProperty::new("worldMatrix", Matrix4(algebra::Matrix4::identity())),
ShaderProperty::new(
"worldMatrix",
Matrix4 {
value: algebra::Matrix4::identity(),
},
),
ShaderProperty::new(
"worldViewProjection",
Matrix4(algebra::Matrix4::identity()),
Matrix4 {
value: algebra::Matrix4::identity(),
},
),
ShaderProperty::new("blendShapesCount", Int(0)),
ShaderProperty::new("useSkeletalAnimation", Bool(false)),
ShaderProperty::new("blendShapesCount", Int { value: 0 }),
ShaderProperty::new("useSkeletalAnimation", Bool { value: false }),
ShaderProperty::new(
"blendShapesWeights",
Vector4Array {
Expand Down Expand Up @@ -1008,6 +1042,7 @@ mod test {
vertex_shader: "<CODE>".to_string(),
fragment_shader: "<CODE>".to_string(),
}],
disabled_passes: vec![],
};

assert_eq!(data.definition, reference_definition);
Expand Down
Loading

0 comments on commit 45ff3e3

Please sign in to comment.