3#include "pixelbullet/graphics/material_types.h"
4#include "pixelbullet/serialization/node.h"
5#include "pixelbullet/serialization/node_reader.h"
12inline Node& operator<<(
Node& node,
const MaterialAlphaMode& value)
14 node << std::string(ToString(value));
18inline const Node& operator>>(
const Node& node, MaterialAlphaMode& value)
20 std::string serialized;
22 if (serialized ==
"Mask")
24 value = MaterialAlphaMode::Mask;
26 else if (serialized ==
"Blend")
28 value = MaterialAlphaMode::Blend;
32 value = MaterialAlphaMode::Opaque;
39 std::string serialized;
40 if (!serialization::TryReadNode(node, serialized, reader))
44 if (serialized ==
"Opaque")
46 value = MaterialAlphaMode::Opaque;
48 else if (serialized ==
"Mask")
50 value = MaterialAlphaMode::Mask;
52 else if (serialized ==
"Blend")
54 value = MaterialAlphaMode::Blend;
58 return reader.Fail(
"Unknown MaterialAlphaMode token '" + serialized +
"'.");
63inline Node& operator<<(
Node& node,
const MaterialTextureWrapMode& value)
65 node << std::string(ToString(value));
69inline const Node& operator>>(
const Node& node, MaterialTextureWrapMode& value)
71 std::string serialized;
73 if (serialized ==
"ClampToEdge")
75 value = MaterialTextureWrapMode::ClampToEdge;
77 else if (serialized ==
"MirroredRepeat")
79 value = MaterialTextureWrapMode::MirroredRepeat;
83 value = MaterialTextureWrapMode::Repeat;
90 std::string serialized;
91 if (!serialization::TryReadNode(node, serialized, reader))
95 if (serialized ==
"Repeat")
97 value = MaterialTextureWrapMode::Repeat;
99 else if (serialized ==
"ClampToEdge")
101 value = MaterialTextureWrapMode::ClampToEdge;
103 else if (serialized ==
"MirroredRepeat")
105 value = MaterialTextureWrapMode::MirroredRepeat;
109 return reader.Fail(
"Unknown MaterialTextureWrapMode token '" + serialized +
"'.");
114inline Node& operator<<(
Node& node,
const MaterialTextureMagFilter& value)
116 node << std::string(ToString(value));
120inline const Node& operator>>(
const Node& node, MaterialTextureMagFilter& value)
122 std::string serialized;
124 value = serialized ==
"Nearest" ? MaterialTextureMagFilter::Nearest : MaterialTextureMagFilter::Linear;
130 std::string serialized;
131 if (!serialization::TryReadNode(node, serialized, reader))
135 if (serialized ==
"Linear")
137 value = MaterialTextureMagFilter::Linear;
139 else if (serialized ==
"Nearest")
141 value = MaterialTextureMagFilter::Nearest;
145 return reader.Fail(
"Unknown MaterialTextureMagFilter token '" + serialized +
"'.");
150inline Node& operator<<(
Node& node,
const MaterialTextureMinFilter& value)
152 node << std::string(ToString(value));
156inline Node& operator<<(
Node& node,
const MaterialTextureUvSet& value)
158 node << std::string(ToString(value));
162inline const Node& operator>>(
const Node& node, MaterialTextureMinFilter& value)
164 std::string serialized;
166 if (serialized ==
"Linear")
168 value = MaterialTextureMinFilter::Linear;
170 else if (serialized ==
"Nearest")
172 value = MaterialTextureMinFilter::Nearest;
174 else if (serialized ==
"NearestMipmapNearest")
176 value = MaterialTextureMinFilter::NearestMipmapNearest;
178 else if (serialized ==
"LinearMipmapNearest")
180 value = MaterialTextureMinFilter::LinearMipmapNearest;
182 else if (serialized ==
"NearestMipmapLinear")
184 value = MaterialTextureMinFilter::NearestMipmapLinear;
188 value = MaterialTextureMinFilter::LinearMipmapLinear;
195 std::string serialized;
196 if (!serialization::TryReadNode(node, serialized, reader))
200 if (serialized ==
"Linear")
202 value = MaterialTextureMinFilter::Linear;
204 else if (serialized ==
"Nearest")
206 value = MaterialTextureMinFilter::Nearest;
208 else if (serialized ==
"NearestMipmapNearest")
210 value = MaterialTextureMinFilter::NearestMipmapNearest;
212 else if (serialized ==
"LinearMipmapNearest")
214 value = MaterialTextureMinFilter::LinearMipmapNearest;
216 else if (serialized ==
"NearestMipmapLinear")
218 value = MaterialTextureMinFilter::NearestMipmapLinear;
220 else if (serialized ==
"LinearMipmapLinear")
222 value = MaterialTextureMinFilter::LinearMipmapLinear;
226 return reader.Fail(
"Unknown MaterialTextureMinFilter token '" + serialized +
"'.");
231inline const Node& operator>>(
const Node& node, MaterialTextureUvSet& value)
233 std::string serialized;
235 value = serialized ==
"Uv1" ? MaterialTextureUvSet::Uv1 : MaterialTextureUvSet::Uv0;
241 std::string serialized;
242 if (!serialization::TryReadNode(node, serialized, reader))
246 if (serialized ==
"Uv0")
248 value = MaterialTextureUvSet::Uv0;
250 else if (serialized ==
"Uv1")
252 value = MaterialTextureUvSet::Uv1;
256 return reader.Fail(
"Unknown MaterialTextureUvSet token '" + serialized +
"'.");
261inline Node& operator<<(
Node& node,
const MaterialShadingModel& value)
263 node << std::string(ToString(value));
267inline const Node& operator>>(
const Node& node, MaterialShadingModel& value)
269 std::string serialized;
271 value = serialized ==
"Unlit" ? MaterialShadingModel::Unlit : MaterialShadingModel::Lit;
277 std::string serialized;
278 if (!serialization::TryReadNode(node, serialized, reader))
282 if (serialized ==
"Lit")
284 value = MaterialShadingModel::Lit;
286 else if (serialized ==
"Unlit")
288 value = MaterialShadingModel::Unlit;
292 return reader.Fail(
"Unknown MaterialShadingModel token '" + serialized +
"'.");
299 node[
"wrapU"] << sampler.wrap_u;
300 node[
"wrapV"] << sampler.wrap_v;
301 node[
"magFilter"] << sampler.mag_filter;
302 node[
"minFilter"] << sampler.min_filter;
308 if (node.has_property(
"wrapU"))
310 node[
"wrapU"] >> sampler.wrap_u;
312 if (node.has_property(
"wrapV"))
314 node[
"wrapV"] >> sampler.wrap_v;
316 if (node.has_property(
"magFilter"))
318 node[
"magFilter"] >> sampler.mag_filter;
320 if (node.has_property(
"minFilter"))
322 node[
"minFilter"] >> sampler.min_filter;
330 ok &= serialization::TryReadOptionalProperty(node,
"wrapU", sampler.wrap_u, reader);
331 ok &= serialization::TryReadOptionalProperty(node,
"wrapV", sampler.wrap_v, reader);
332 ok &= serialization::TryReadOptionalProperty(node,
"magFilter", sampler.mag_filter, reader);
333 ok &= serialization::TryReadOptionalProperty(node,
"minFilter", sampler.min_filter, reader);
340 offset_node.set_type(NodeType::Array);
341 auto& offset_properties = offset_node.properties();
342 offset_properties.clear();
343 for (
int index = 0; index < 2; ++index)
346 component_node << transform.offset[index];
347 offset_properties.emplace_back(
"", std::move(component_node));
349 node[
"offset"] = std::move(offset_node);
352 scale_node.set_type(NodeType::Array);
353 auto& scale_properties = scale_node.properties();
354 scale_properties.clear();
355 for (
int index = 0; index < 2; ++index)
358 component_node << transform.scale[index];
359 scale_properties.emplace_back(
"", std::move(component_node));
361 node[
"scale"] = std::move(scale_node);
362 node[
"rotationDegrees"] << transform.rotation_degrees;
368 if (node.has_property(
"offset"))
370 const Node& offset_node = node[
"offset"];
371 ASSERT(offset_node.type() == NodeType::Array,
"material texture transform offset must be an array");
372 const auto& offset_properties = offset_node.properties();
373 ASSERT(offset_properties.size() >= 2,
"material texture transform offset requires two components");
374 for (
int index = 0; index < 2; ++index)
376 offset_properties[index].second >> transform.offset[index];
380 if (node.has_property(
"scale"))
382 const Node& scale_node = node[
"scale"];
383 ASSERT(scale_node.type() == NodeType::Array,
"material texture transform scale must be an array");
384 const auto& scale_properties = scale_node.properties();
385 ASSERT(scale_properties.size() >= 2,
"material texture transform scale requires two components");
386 for (
int index = 0; index < 2; ++index)
388 scale_properties[index].second >> transform.scale[index];
392 if (node.has_property(
"rotationDegrees"))
394 node[
"rotationDegrees"] >> transform.rotation_degrees;
403 ok &= serialization::TryReadOptionalProperty(node,
"offset", transform.offset, reader);
404 ok &= serialization::TryReadOptionalProperty(node,
"scale", transform.scale, reader);
405 ok &= serialization::TryReadOptionalProperty(node,
"rotationDegrees", transform.rotation_degrees, reader);
#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 node_reader.h:48
Definition material_types.h:136
Definition material_types.h:146