4
4
* @licence: MIT
5
5
*/
6
6
7
- #include " OvCore/Resources/Material.h"
7
+ #include < OvCore/Resources/Material.h>
8
8
9
9
void OvCore::Resources::Material::OnSerialize (tinyxml2::XMLDocument & p_doc, tinyxml2::XMLNode * p_node)
10
10
{
@@ -33,49 +33,75 @@ void OvCore::Resources::Material::OnSerialize(tinyxml2::XMLDocument & p_doc, tin
33
33
tinyxml2::XMLNode* uniformsNode = p_doc.NewElement (" uniforms" );
34
34
p_node->InsertEndChild (uniformsNode);
35
35
36
- for (const auto &[name, prop] : m_properties)
36
+ for (const auto & [name, prop] : m_properties)
37
37
{
38
38
auto & value = prop.value ;
39
-
40
39
tinyxml2::XMLNode* uniform = p_doc.NewElement (" uniform" );
41
- uniformsNode->InsertEndChild (uniform); // Instead of p_node, use uniformNode (To create)
40
+ uniformsNode->InsertEndChild (uniform);
42
41
43
42
const auto uniformInfo = m_shader->GetProgram ().GetUniformInfo (name);
44
-
45
43
Serializer::SerializeString (p_doc, uniform, " name" , name);
46
44
47
- if (uniformInfo && value. has_value ( ))
45
+ if (uniformInfo && !std::holds_alternative<std::monostate>(value ))
48
46
{
49
- switch (uniformInfo->type )
50
- {
51
- case EUniformType::BOOL:
52
- if (value.type () == typeid (bool )) Serializer::SerializeInt (p_doc, uniform, " value" , std::any_cast<bool >(value));
53
- break ;
54
-
55
- case EUniformType::INT:
56
- if (value.type () == typeid (int )) Serializer::SerializeInt (p_doc, uniform, " value" , std::any_cast<int >(value));
57
- break ;
58
-
59
- case EUniformType::FLOAT:
60
- if (value.type () == typeid (float )) Serializer::SerializeFloat (p_doc, uniform, " value" , std::any_cast<float >(value));
61
- break ;
62
-
63
- case EUniformType::FLOAT_VEC2:
64
- if (value.type () == typeid (FVector2)) Serializer::SerializeVec2 (p_doc, uniform, " value" , std::any_cast<FVector2>(value));
65
- break ;
47
+ auto visitor = [&](auto && arg) {
48
+ using T = std::decay_t <decltype (arg)>;
49
+ using enum EUniformType;
50
+ const auto type = uniformInfo->type ;
66
51
67
- case EUniformType::FLOAT_VEC3:
68
- if (value.type () == typeid (FVector3)) Serializer::SerializeVec3 (p_doc, uniform, " value" , std::any_cast<FVector3>(value));
69
- break ;
70
-
71
- case EUniformType::FLOAT_VEC4:
72
- if (value.type () == typeid (FVector4)) Serializer::SerializeVec4 (p_doc, uniform, " value" , std::any_cast<FVector4>(value));
73
- break ;
52
+ if constexpr (std::same_as<T, bool >)
53
+ {
54
+ if (type == BOOL)
55
+ {
56
+ Serializer::SerializeInt (p_doc, uniform, " value" , arg);
57
+ }
58
+ }
59
+ else if constexpr (std::same_as<T, int >)
60
+ {
61
+ if (type == INT)
62
+ {
63
+ Serializer::SerializeInt (p_doc, uniform, " value" , arg);
64
+ }
65
+ }
66
+ else if constexpr (std::same_as<T, float >)
67
+ {
68
+ if (type == FLOAT)
69
+ {
70
+ Serializer::SerializeFloat (p_doc, uniform, " value" , arg);
71
+ }
72
+ }
73
+ else if constexpr (std::same_as<T, FVector2>)
74
+ {
75
+ if (type == FLOAT_VEC2)
76
+ {
77
+ Serializer::SerializeVec2 (p_doc, uniform, " value" , arg);
78
+ }
79
+ }
80
+ else if constexpr (std::same_as<T, FVector3>)
81
+ {
82
+ if (type == FLOAT_VEC3)
83
+ {
84
+ Serializer::SerializeVec3 (p_doc, uniform, " value" , arg);
85
+ }
86
+ }
87
+ else if constexpr (std::same_as<T, FVector4>)
88
+ {
89
+ if (type == FLOAT_VEC4)
90
+ {
91
+ Serializer::SerializeVec4 (p_doc, uniform, " value" , arg);
92
+ }
93
+ }
94
+ else if constexpr (std::same_as<T, OvRendering::Resources::Texture*>)
95
+ {
96
+ if (type == SAMPLER_2D)
97
+ {
98
+ Serializer::SerializeTexture (p_doc, uniform, " value" , arg);
99
+ }
100
+ }
101
+ // No need to handle TextureHandle* here as it's not serializable (only texture assets are)
102
+ };
74
103
75
- case EUniformType::SAMPLER_2D:
76
- if (value.type () == typeid (Texture*)) Serializer::SerializeTexture (p_doc, uniform, " value" , std::any_cast<Texture*>(value));
77
- break ;
78
- }
104
+ std::visit (visitor, value);
79
105
}
80
106
}
81
107
}
@@ -130,41 +156,19 @@ void OvCore::Resources::Material::OnDeserialize(tinyxml2::XMLDocument & p_doc, t
130
156
/* Deserialization of the uniform value depending on the uniform type (Deserialization result to std::any) */
131
157
switch (uniformInfo->type )
132
158
{
133
- case OvRendering::Settings::EUniformType::BOOL:
134
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeBoolean (p_doc, uniform, " value" );
135
- break ;
136
-
137
- case OvRendering::Settings::EUniformType::INT:
138
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeInt (p_doc, uniform, " value" );
139
- break ;
140
-
141
- case OvRendering::Settings::EUniformType::FLOAT:
142
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeFloat (p_doc, uniform, " value" );
143
- break ;
144
-
145
- case OvRendering::Settings::EUniformType::FLOAT_VEC2:
146
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeVec2 (p_doc, uniform, " value" );
147
- break ;
148
-
149
- case OvRendering::Settings::EUniformType::FLOAT_VEC3:
150
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeVec3 (p_doc, uniform, " value" );
151
- break ;
152
-
153
- case OvRendering::Settings::EUniformType::FLOAT_VEC4:
154
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeVec4 (p_doc, uniform, " value" );
155
- break ;
156
-
157
- case OvRendering::Settings::EUniformType::FLOAT_MAT4:
158
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeMat4 (p_doc, uniform, " value" );
159
- break ;
160
-
161
- case OvRendering::Settings::EUniformType::SAMPLER_2D:
162
- m_properties[uniformInfo->name ] = OvCore::Helpers::Serializer::DeserializeTexture (p_doc, uniform, " value" );
163
- break ;
159
+ using enum OvRendering::Settings::EUniformType;
160
+ case BOOL: SetProperty (uniformInfo->name , Serializer::DeserializeBoolean (p_doc, uniform, " value" )); break ;
161
+ case INT: SetProperty (uniformInfo->name , Serializer::DeserializeInt (p_doc, uniform, " value" )); break ;
162
+ case FLOAT: SetProperty (uniformInfo->name , Serializer::DeserializeFloat (p_doc, uniform, " value" )); break ;
163
+ case FLOAT_VEC2: SetProperty (uniformInfo->name , Serializer::DeserializeVec2 (p_doc, uniform, " value" )); break ;
164
+ case FLOAT_VEC3: SetProperty (uniformInfo->name , Serializer::DeserializeVec3 (p_doc, uniform, " value" )); break ;
165
+ case FLOAT_VEC4: SetProperty (uniformInfo->name , Serializer::DeserializeVec4 (p_doc, uniform, " value" )); break ;
166
+ case FLOAT_MAT4: SetProperty (uniformInfo->name , Serializer::DeserializeMat4 (p_doc, uniform, " value" )); break ;
167
+ case SAMPLER_2D: SetProperty (uniformInfo->name , Serializer::DeserializeTexture (p_doc, uniform, " value" )); break ;
164
168
}
165
169
}
166
170
}
167
171
}
168
172
}
169
173
}
170
- }
174
+ }
0 commit comments