librashader_presets/
preset.rs1use crate::error::ParsePresetError;
2use librashader_common::map::ShortString;
3use librashader_common::{FilterMode, ImageFormat, WrapMode};
4use std::ops::Mul;
5use std::path::PathBuf;
6use std::str::FromStr;
7
8pub use librashader_common::shader_features::ShaderFeatures;
9
10pub type PassConfig = PathReference<PassMeta>;
12
13pub type TextureConfig = PathReference<TextureMeta>;
15
16#[derive(Debug, Clone)]
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19pub struct PathReference<M> {
20 pub path: PathBuf,
22 pub meta: M,
24}
25
26#[derive(Debug, Clone)]
28#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29pub struct PassMeta {
30 pub id: i32,
32 pub alias: Option<ShortString>,
34 pub filter: FilterMode,
36 pub wrap_mode: WrapMode,
38 pub frame_count_mod: u32,
40 pub srgb_framebuffer: bool,
42 pub float_framebuffer: bool,
44 pub mipmap_input: bool,
46 pub scaling: Scale2D,
48}
49
50impl PassMeta {
51 #[inline(always)]
54 pub fn get_format_override(&self) -> Option<ImageFormat> {
55 if self.srgb_framebuffer {
56 return Some(ImageFormat::R8G8B8A8Srgb);
57 } else if self.float_framebuffer {
58 return Some(ImageFormat::R16G16B16A16Sfloat);
59 }
60 None
61 }
62
63 #[inline(always)]
64 pub fn get_frame_count(&self, count: usize) -> u32 {
65 (if self.frame_count_mod > 0 {
66 count % self.frame_count_mod as usize
67 } else {
68 count
69 }) as u32
70 }
71}
72
73#[repr(i32)]
74#[derive(Default, Copy, Clone, Debug)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76pub enum ScaleType {
78 #[default]
79 Input = 0,
81 Absolute,
83 Viewport,
85 Original,
87}
88
89#[derive(Copy, Clone, Debug)]
91#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
92pub enum ScaleFactor {
93 Float(f32),
95 Absolute(i32),
97}
98
99impl Default for ScaleFactor {
100 fn default() -> Self {
101 ScaleFactor::Float(1.0f32)
102 }
103}
104
105impl From<ScaleFactor> for f32 {
106 fn from(value: ScaleFactor) -> Self {
107 match value {
108 ScaleFactor::Float(f) => f,
109 ScaleFactor::Absolute(f) => f as f32,
110 }
111 }
112}
113
114impl Mul<ScaleFactor> for f32 {
115 type Output = f32;
116
117 fn mul(self, rhs: ScaleFactor) -> Self::Output {
118 match rhs {
119 ScaleFactor::Float(f) => f * self,
120 ScaleFactor::Absolute(f) => f as f32 * self,
121 }
122 }
123}
124
125impl Mul<ScaleFactor> for u32 {
126 type Output = f32;
127
128 fn mul(self, rhs: ScaleFactor) -> Self::Output {
129 match rhs {
130 ScaleFactor::Float(f) => f * self as f32,
131 ScaleFactor::Absolute(f) => (f as u32 * self) as f32,
132 }
133 }
134}
135
136impl FromStr for ScaleType {
137 type Err = ParsePresetError;
138
139 fn from_str(s: &str) -> Result<Self, Self::Err> {
140 match s {
141 "source" => Ok(ScaleType::Input),
142 "viewport" => Ok(ScaleType::Viewport),
143 "absolute" => Ok(ScaleType::Absolute),
144 "original" => Ok(ScaleType::Original),
145 _ => Err(ParsePresetError::InvalidScaleType(s.to_string())),
146 }
147 }
148}
149
150#[derive(Debug, Clone)]
152#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
153pub struct Scaling {
154 pub scale_type: ScaleType,
156 pub factor: ScaleFactor,
158}
159
160#[derive(Debug, Clone)]
162#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
163pub struct Scale2D {
164 pub valid: bool,
166 pub x: Scaling,
168 pub y: Scaling,
170}
171
172#[derive(Debug, Clone)]
174#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
175pub struct TextureMeta {
176 pub name: ShortString,
178 pub wrap_mode: WrapMode,
180 pub filter_mode: FilterMode,
182 pub mipmap: bool,
184}
185
186#[derive(Debug, Clone)]
188#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
189pub struct ParameterMeta {
190 pub name: ShortString,
192 pub value: f32,
194}
195
196#[derive(Debug, Clone)]
201#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
202pub struct ShaderPreset {
203 #[cfg(feature = "parse_legacy_glsl")]
206 pub feedback_pass: i32,
207
208 pub pass_count: i32,
210 pub passes: Vec<PassConfig>,
213
214 pub textures: Vec<TextureConfig>,
216
217 pub parameters: Vec<ParameterMeta>,
219
220 pub features: ShaderFeatures,
222}