4
4
* @licence: MIT
5
5
*/
6
6
7
- #include " OvCore/Resources/Material.h"
7
+ #include < OvCore/Resources/Material.h>
8
8
9
- void OvCore::Resources::Material::OnSerialize (tinyxml2::XMLDocument & p_doc, tinyxml2::XMLNode * p_node)
9
+ void OvCore::Resources::Material::OnSerialize (tinyxml2::XMLDocument& p_doc, tinyxml2::XMLNode* p_node)
10
10
{
11
11
using namespace OvCore ::Helpers;
12
12
using namespace OvRendering ::Settings;
13
- using namespace OvRendering ::Resources;
14
13
using namespace OvMaths ;
15
14
16
15
Serializer::SerializeShader (p_doc, p_node, " shader" , m_shader);
@@ -33,54 +32,80 @@ void OvCore::Resources::Material::OnSerialize(tinyxml2::XMLDocument & p_doc, tin
33
32
tinyxml2::XMLNode* uniformsNode = p_doc.NewElement (" uniforms" );
34
33
p_node->InsertEndChild (uniformsNode);
35
34
36
- for (const auto &[name, prop] : m_properties)
35
+ for (const auto & [name, prop] : m_properties)
37
36
{
38
37
auto & value = prop.value ;
39
-
40
38
tinyxml2::XMLNode* uniform = p_doc.NewElement (" uniform" );
41
- uniformsNode->InsertEndChild (uniform); // Instead of p_node, use uniformNode (To create)
39
+ uniformsNode->InsertEndChild (uniform);
42
40
43
41
const auto uniformInfo = m_shader->GetProgram ().GetUniformInfo (name);
44
-
45
42
Serializer::SerializeString (p_doc, uniform, " name" , name);
46
43
47
- if (uniformInfo && value. has_value ( ))
44
+ if (uniformInfo && !std::holds_alternative<std::monostate>(value ))
48
45
{
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 ;
46
+ auto visitor = [&](auto && arg) {
47
+ using T = std::decay_t <decltype (arg)>;
48
+ using enum EUniformType;
49
+ const auto type = uniformInfo->type ;
66
50
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 ;
51
+ if constexpr (std::same_as<T, bool >)
52
+ {
53
+ if (type == BOOL)
54
+ {
55
+ Serializer::SerializeInt (p_doc, uniform, " value" , arg);
56
+ }
57
+ }
58
+ else if constexpr (std::same_as<T, int >)
59
+ {
60
+ if (type == INT)
61
+ {
62
+ Serializer::SerializeInt (p_doc, uniform, " value" , arg);
63
+ }
64
+ }
65
+ else if constexpr (std::same_as<T, float >)
66
+ {
67
+ if (type == FLOAT)
68
+ {
69
+ Serializer::SerializeFloat (p_doc, uniform, " value" , arg);
70
+ }
71
+ }
72
+ else if constexpr (std::same_as<T, FVector2>)
73
+ {
74
+ if (type == FLOAT_VEC2)
75
+ {
76
+ Serializer::SerializeVec2 (p_doc, uniform, " value" , arg);
77
+ }
78
+ }
79
+ else if constexpr (std::same_as<T, FVector3>)
80
+ {
81
+ if (type == FLOAT_VEC3)
82
+ {
83
+ Serializer::SerializeVec3 (p_doc, uniform, " value" , arg);
84
+ }
85
+ }
86
+ else if constexpr (std::same_as<T, FVector4>)
87
+ {
88
+ if (type == FLOAT_VEC4)
89
+ {
90
+ Serializer::SerializeVec4 (p_doc, uniform, " value" , arg);
91
+ }
92
+ }
93
+ else if constexpr (std::same_as<T, OvRendering::Resources::Texture*>)
94
+ {
95
+ if (type == SAMPLER_2D)
96
+ {
97
+ Serializer::SerializeTexture (p_doc, uniform, " value" , arg);
98
+ }
99
+ }
100
+ // No need to handle TextureHandle* here as it's not serializable (only texture assets are)
101
+ };
74
102
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
- }
103
+ std::visit (visitor, value);
79
104
}
80
105
}
81
106
}
82
107
83
- void OvCore::Resources::Material::OnDeserialize (tinyxml2::XMLDocument & p_doc, tinyxml2::XMLNode * p_node)
108
+ void OvCore::Resources::Material::OnDeserialize (tinyxml2::XMLDocument& p_doc, tinyxml2::XMLNode* p_node)
84
109
{
85
110
using namespace OvCore ::Helpers;
86
111
@@ -101,13 +126,13 @@ void OvCore::Resources::Material::OnDeserialize(tinyxml2::XMLDocument & p_doc, t
101
126
}
102
127
103
128
/* We get the shader with Deserialize method */
104
- OvRendering::Resources::Shader* deserializedShader = OvCore::Helpers:: Serializer::DeserializeShader (p_doc, p_node, " shader" );
129
+ const auto shader = Serializer::DeserializeShader (p_doc, p_node, " shader" );
105
130
106
131
/* We verify that the shader is valid (Not null) */
107
- if (deserializedShader )
132
+ if (shader )
108
133
{
109
134
/* If the shader is valid, we set it to the material (Modify m_shader pointer + Query + FillUniforms) */
110
- SetShader (deserializedShader );
135
+ SetShader (shader );
111
136
112
137
tinyxml2::XMLNode* uniformsNode = p_node->FirstChildElement (" uniforms" ); // Access to "Uniforms" (Every uniform will be attached to "Uniforms")
113
138
@@ -130,41 +155,19 @@ void OvCore::Resources::Material::OnDeserialize(tinyxml2::XMLDocument & p_doc, t
130
155
/* Deserialization of the uniform value depending on the uniform type (Deserialization result to std::any) */
131
156
switch (uniformInfo->type )
132
157
{
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 ;
158
+ using enum OvRendering::Settings::EUniformType;
159
+ case BOOL: SetProperty (uniformInfo->name , Serializer::DeserializeBoolean (p_doc, uniform, " value" )); break ;
160
+ case INT: SetProperty (uniformInfo->name , Serializer::DeserializeInt (p_doc, uniform, " value" )); break ;
161
+ case FLOAT: SetProperty (uniformInfo->name , Serializer::DeserializeFloat (p_doc, uniform, " value" )); break ;
162
+ case FLOAT_VEC2: SetProperty (uniformInfo->name , Serializer::DeserializeVec2 (p_doc, uniform, " value" )); break ;
163
+ case FLOAT_VEC3: SetProperty (uniformInfo->name , Serializer::DeserializeVec3 (p_doc, uniform, " value" )); break ;
164
+ case FLOAT_VEC4: SetProperty (uniformInfo->name , Serializer::DeserializeVec4 (p_doc, uniform, " value" )); break ;
165
+ case FLOAT_MAT4: SetProperty (uniformInfo->name , Serializer::DeserializeMat4 (p_doc, uniform, " value" )); break ;
166
+ case SAMPLER_2D: SetProperty (uniformInfo->name , Serializer::DeserializeTexture (p_doc, uniform, " value" )); break ;
164
167
}
165
168
}
166
169
}
167
170
}
168
171
}
169
172
}
170
- }
173
+ }
0 commit comments