PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
material_serialization.h
1#pragma once
2
3#include "pixelbullet/graphics/material_types.h"
4#include "pixelbullet/serialization/node.h"
5
6#include <string>
7#include <utility>
8
9namespace pixelbullet
10{
11inline Node& operator<<(Node& node, const MaterialAlphaMode& value)
12{
13 node << std::string(ToString(value));
14 return node;
15}
16
17inline const Node& operator>>(const Node& node, MaterialAlphaMode& value)
18{
19 std::string serialized;
20 node >> serialized;
21 if (serialized == "Mask")
22 {
23 value = MaterialAlphaMode::Mask;
24 }
25 else if (serialized == "Blend")
26 {
27 value = MaterialAlphaMode::Blend;
28 }
29 else
30 {
31 value = MaterialAlphaMode::Opaque;
32 }
33 return node;
34}
35
36inline Node& operator<<(Node& node, const MaterialTextureWrapMode& value)
37{
38 node << std::string(ToString(value));
39 return node;
40}
41
42inline const Node& operator>>(const Node& node, MaterialTextureWrapMode& value)
43{
44 std::string serialized;
45 node >> serialized;
46 if (serialized == "ClampToEdge")
47 {
48 value = MaterialTextureWrapMode::ClampToEdge;
49 }
50 else if (serialized == "MirroredRepeat")
51 {
52 value = MaterialTextureWrapMode::MirroredRepeat;
53 }
54 else
55 {
56 value = MaterialTextureWrapMode::Repeat;
57 }
58 return node;
59}
60
61inline Node& operator<<(Node& node, const MaterialTextureMagFilter& value)
62{
63 node << std::string(ToString(value));
64 return node;
65}
66
67inline const Node& operator>>(const Node& node, MaterialTextureMagFilter& value)
68{
69 std::string serialized;
70 node >> serialized;
71 value = serialized == "Nearest" ? MaterialTextureMagFilter::Nearest : MaterialTextureMagFilter::Linear;
72 return node;
73}
74
75inline Node& operator<<(Node& node, const MaterialTextureMinFilter& value)
76{
77 node << std::string(ToString(value));
78 return node;
79}
80
81inline Node& operator<<(Node& node, const MaterialTextureUvSet& value)
82{
83 node << std::string(ToString(value));
84 return node;
85}
86
87inline const Node& operator>>(const Node& node, MaterialTextureMinFilter& value)
88{
89 std::string serialized;
90 node >> serialized;
91 if (serialized == "Linear")
92 {
93 value = MaterialTextureMinFilter::Linear;
94 }
95 else if (serialized == "Nearest")
96 {
97 value = MaterialTextureMinFilter::Nearest;
98 }
99 else if (serialized == "NearestMipmapNearest")
100 {
101 value = MaterialTextureMinFilter::NearestMipmapNearest;
102 }
103 else if (serialized == "LinearMipmapNearest")
104 {
105 value = MaterialTextureMinFilter::LinearMipmapNearest;
106 }
107 else if (serialized == "NearestMipmapLinear")
108 {
109 value = MaterialTextureMinFilter::NearestMipmapLinear;
110 }
111 else
112 {
113 value = MaterialTextureMinFilter::LinearMipmapLinear;
114 }
115 return node;
116}
117
118inline const Node& operator>>(const Node& node, MaterialTextureUvSet& value)
119{
120 std::string serialized;
121 node >> serialized;
122 value = serialized == "Uv1" ? MaterialTextureUvSet::Uv1 : MaterialTextureUvSet::Uv0;
123 return node;
124}
125
126inline Node& operator<<(Node& node, const MaterialShadingModel& value)
127{
128 node << std::string(ToString(value));
129 return node;
130}
131
132inline const Node& operator>>(const Node& node, MaterialShadingModel& value)
133{
134 std::string serialized;
135 node >> serialized;
136 value = serialized == "Unlit" ? MaterialShadingModel::Unlit : MaterialShadingModel::Lit;
137 return node;
138}
139
140inline Node& operator<<(Node& node, const MaterialTextureSamplerSettings& sampler)
141{
142 node["wrapU"] << sampler.wrap_u;
143 node["wrapV"] << sampler.wrap_v;
144 node["magFilter"] << sampler.mag_filter;
145 node["minFilter"] << sampler.min_filter;
146 return node;
147}
148
149inline const Node& operator>>(const Node& node, MaterialTextureSamplerSettings& sampler)
150{
151 if (node.has_property("wrapU"))
152 {
153 node["wrapU"] >> sampler.wrap_u;
154 }
155 if (node.has_property("wrapV"))
156 {
157 node["wrapV"] >> sampler.wrap_v;
158 }
159 if (node.has_property("magFilter"))
160 {
161 node["magFilter"] >> sampler.mag_filter;
162 }
163 if (node.has_property("minFilter"))
164 {
165 node["minFilter"] >> sampler.min_filter;
166 }
167 return node;
168}
169
170inline Node& operator<<(Node& node, const MaterialTextureTransform& transform)
171{
172 Node offset_node;
173 offset_node.set_type(NodeType::Array);
174 auto& offset_properties = offset_node.properties();
175 offset_properties.clear();
176 for (int index = 0; index < 2; ++index)
177 {
178 Node component_node;
179 component_node << transform.offset[index];
180 offset_properties.emplace_back("", std::move(component_node));
181 }
182 node["offset"] = std::move(offset_node);
183
184 Node scale_node;
185 scale_node.set_type(NodeType::Array);
186 auto& scale_properties = scale_node.properties();
187 scale_properties.clear();
188 for (int index = 0; index < 2; ++index)
189 {
190 Node component_node;
191 component_node << transform.scale[index];
192 scale_properties.emplace_back("", std::move(component_node));
193 }
194 node["scale"] = std::move(scale_node);
195 node["rotationDegrees"] << transform.rotation_degrees;
196 return node;
197}
198
199inline const Node& operator>>(const Node& node, MaterialTextureTransform& transform)
200{
201 if (node.has_property("offset"))
202 {
203 const Node& offset_node = node["offset"];
204 ASSERT(offset_node.type() == NodeType::Array, "material texture transform offset must be an array");
205 const auto& offset_properties = offset_node.properties();
206 ASSERT(offset_properties.size() >= 2, "material texture transform offset requires two components");
207 for (int index = 0; index < 2; ++index)
208 {
209 offset_properties[index].second >> transform.offset[index];
210 }
211 }
212
213 if (node.has_property("scale"))
214 {
215 const Node& scale_node = node["scale"];
216 ASSERT(scale_node.type() == NodeType::Array, "material texture transform scale must be an array");
217 const auto& scale_properties = scale_node.properties();
218 ASSERT(scale_properties.size() >= 2, "material texture transform scale requires two components");
219 for (int index = 0; index < 2; ++index)
220 {
221 scale_properties[index].second >> transform.scale[index];
222 }
223 }
224
225 if (node.has_property("rotationDegrees"))
226 {
227 node["rotationDegrees"] >> transform.rotation_degrees;
228 }
229
230 return node;
231}
232} // namespace pixelbullet
#define ASSERT(condition,...)
Asserts that a condition is true.
Definition assert.h:142
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:49
Definition material_types.h:136
Definition material_types.h:146