Skip to main content

gled_model/asset/animation/argument/
variables.rs

1use serde::{Deserialize, Serialize};
2use std::ops::AddAssign;
3
4#[derive(Default, Debug, Clone, Copy, Serialize, Deserialize)]
5pub struct VariablesCount {
6    pub u32: usize,
7    pub f32: usize,
8}
9
10impl AddAssign for VariablesCount {
11    fn add_assign(&mut self, rhs: Self) {
12        self.u32 += rhs.u32;
13        self.f32 += rhs.f32;
14    }
15}
16
17impl VariablesCount {
18    pub fn possible(&self) -> bool {
19        self.u32 <= 3 && self.f32 <= 6
20    }
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
24pub enum Variables {
25    U32,
26    F32,
27    Vec2F32,
28}
29
30impl Variables {
31    pub fn count(&self) -> VariablesCount {
32        match self {
33            Self::U32 => VariablesCount { u32: 1, f32: 0 },
34            Self::F32 => VariablesCount { u32: 0, f32: 1 },
35            Self::Vec2F32 => VariablesCount { u32: 0, f32: 2 },
36        }
37    }
38
39    pub(crate) fn function(&self, name: &str) -> String {
40        match self {
41            Self::U32 => format!("fn {name}() -> u32;"),
42            Self::F32 => format!("fn {name}() -> f32;"),
43            Self::Vec2F32 => format!("fn {name}() -> vec2<f32>;"),
44        }
45    }
46
47    pub(crate) fn shader_code_for_getter(&self, name: &str, count: VariablesCount) -> String {
48        match self {
49            Self::U32 => format!(
50                r#"
51                    fn {name}() -> u32 {{
52                        return uniforms.u32_{};
53                    }}
54                "#,
55                count.u32,
56            ),
57            Self::F32 => format!(
58                r#"
59                    fn {name}() -> f32 {{
60                        return uniforms.f32_{};
61                    }}
62                "#,
63                count.f32
64            ),
65            Self::Vec2F32 => {
66                format!(
67                    r#"
68                        fn {name}() -> vec2<f32> {{
69                            return vec2<f32>(uniforms.f32_{}, uniforms.f32_{});
70                        }}
71                    "#,
72                    count.f32,
73                    count.f32 + 1
74                )
75            }
76        }
77    }
78}