gled_model/asset/animation/argument/
variables.rs1use 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}