PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
material.h
1#pragma once
2
3#include "pixelbullet/filesystem/virtual_path.h"
4#include "pixelbullet/filesystem/virtual_path_serialization.h"
5#include "pixelbullet/graphics/material_serialization.h"
6#include "pixelbullet/serialization/serialization_result.h"
7
8#include <glm/glm.hpp>
9
10#include <utility>
11
12namespace pixelbullet
13{
14class Filesystem;
15
16class Material
17{
18public:
19 Material() = default;
20 Material(const Filesystem& filesystem, const VirtualPath& asset_path)
21 {
22 Load(filesystem, asset_path);
23 }
24
25 bool Load(const Filesystem& filesystem, const VirtualPath& asset_path);
26 [[nodiscard]] SerializationResult TrySaveToFile(const Filesystem& filesystem, const VirtualPath& asset_path) const;
27
28 const VirtualPath& GetFilename() const
29 {
30 return filename_;
31 }
32
33 VirtualPath base_color_texture;
34 VirtualPath normal_texture;
35 VirtualPath orm_texture;
36 VirtualPath emissive_texture;
37 VirtualPath transmission_texture;
38 VirtualPath volume_thickness_texture;
39 VirtualPath specular_texture;
40 VirtualPath specular_color_texture;
41 VirtualPath clearcoat_texture;
42 VirtualPath clearcoat_roughness_texture;
43 VirtualPath clearcoat_normal_texture;
44 VirtualPath sheen_color_texture;
45 VirtualPath sheen_roughness_texture;
46 VirtualPath iridescence_texture;
47 VirtualPath iridescence_thickness_texture;
48 MaterialTextureSamplerSettings base_color_sampler;
49 MaterialTextureSamplerSettings normal_sampler;
51 MaterialTextureSamplerSettings emissive_sampler;
52 MaterialTextureSamplerSettings transmission_sampler;
53 MaterialTextureSamplerSettings volume_thickness_sampler;
54 MaterialTextureSamplerSettings specular_sampler;
55 MaterialTextureSamplerSettings specular_color_sampler;
56 MaterialTextureSamplerSettings clearcoat_sampler;
57 MaterialTextureSamplerSettings clearcoat_roughness_sampler;
58 MaterialTextureSamplerSettings clearcoat_normal_sampler;
59 MaterialTextureSamplerSettings sheen_color_sampler;
60 MaterialTextureSamplerSettings sheen_roughness_sampler;
61 MaterialTextureSamplerSettings iridescence_sampler;
62 MaterialTextureSamplerSettings iridescence_thickness_sampler;
63 MaterialTextureUvSet base_color_uv_set = MaterialTextureUvSet::Uv0;
64 MaterialTextureUvSet normal_uv_set = MaterialTextureUvSet::Uv0;
65 MaterialTextureUvSet orm_uv_set = MaterialTextureUvSet::Uv0;
66 MaterialTextureUvSet emissive_uv_set = MaterialTextureUvSet::Uv0;
67 MaterialTextureUvSet transmission_uv_set = MaterialTextureUvSet::Uv0;
68 MaterialTextureUvSet volume_thickness_uv_set = MaterialTextureUvSet::Uv0;
69 MaterialTextureUvSet specular_uv_set = MaterialTextureUvSet::Uv0;
70 MaterialTextureUvSet specular_color_uv_set = MaterialTextureUvSet::Uv0;
71 MaterialTextureUvSet clearcoat_uv_set = MaterialTextureUvSet::Uv0;
72 MaterialTextureUvSet clearcoat_roughness_uv_set = MaterialTextureUvSet::Uv0;
73 MaterialTextureUvSet clearcoat_normal_uv_set = MaterialTextureUvSet::Uv0;
74 MaterialTextureUvSet sheen_color_uv_set = MaterialTextureUvSet::Uv0;
75 MaterialTextureUvSet sheen_roughness_uv_set = MaterialTextureUvSet::Uv0;
76 MaterialTextureUvSet iridescence_uv_set = MaterialTextureUvSet::Uv0;
77 MaterialTextureUvSet iridescence_thickness_uv_set = MaterialTextureUvSet::Uv0;
78 MaterialTextureTransform base_color_uv_transform;
79 MaterialTextureTransform normal_uv_transform;
80 MaterialTextureTransform orm_uv_transform;
81 MaterialTextureTransform emissive_uv_transform;
82 MaterialTextureTransform transmission_uv_transform;
83 MaterialTextureTransform volume_thickness_uv_transform;
84 MaterialTextureTransform specular_uv_transform;
85 MaterialTextureTransform specular_color_uv_transform;
86 MaterialTextureTransform clearcoat_uv_transform;
87 MaterialTextureTransform clearcoat_roughness_uv_transform;
88 MaterialTextureTransform clearcoat_normal_uv_transform;
89 MaterialTextureTransform sheen_color_uv_transform;
90 MaterialTextureTransform sheen_roughness_uv_transform;
91 MaterialTextureTransform iridescence_uv_transform;
92 MaterialTextureTransform iridescence_thickness_uv_transform;
93 glm::vec4 base_color_factor = glm::vec4(1.0f);
94 float metallic_factor = 0.0f;
95 float roughness_factor = 1.0f;
96 float normal_scale = 1.0f;
97 float occlusion_strength = 1.0f;
98 float ior = 1.5f;
99 float transmission_factor = 0.0f;
100 float volume_thickness_factor = 0.0f;
101 float volume_attenuation_distance = 0.0f;
102 glm::vec3 emissive_factor = glm::vec3(0.0f);
103 float emissive_strength = 1.0f;
104 glm::vec3 volume_attenuation_color = glm::vec3(1.0f);
105 float specular_factor = 1.0f;
106 glm::vec3 specular_color_factor = glm::vec3(1.0f);
107 float clearcoat_factor = 0.0f;
108 float clearcoat_roughness_factor = 0.0f;
109 float clearcoat_normal_scale = 1.0f;
110 glm::vec3 sheen_color_factor = glm::vec3(0.0f);
111 float sheen_roughness_factor = 0.0f;
112 float iridescence_factor = 0.0f;
113 float iridescence_ior = 1.3f;
114 float iridescence_thickness_minimum = 100.0f;
115 float iridescence_thickness_maximum = 400.0f;
116 MaterialAlphaMode alpha_mode = MaterialAlphaMode::Opaque;
117 float alpha_cutoff = 0.5f;
118 bool double_sided = false;
119 MaterialShadingModel shading_model = MaterialShadingModel::Lit;
120
121 friend Node& operator<<(Node& node, const Material& material)
122 {
123 node["baseColorTexture"] << material.base_color_texture;
124 node["normalTexture"] << material.normal_texture;
125 node["ormTexture"] << material.orm_texture;
126 node["emissiveTexture"] << material.emissive_texture;
127 node["transmissionTexture"] << material.transmission_texture;
128 node["volumeThicknessTexture"] << material.volume_thickness_texture;
129 node["specularTexture"] << material.specular_texture;
130 node["specularColorTexture"] << material.specular_color_texture;
131 node["clearcoatTexture"] << material.clearcoat_texture;
132 node["clearcoatRoughnessTexture"] << material.clearcoat_roughness_texture;
133 node["clearcoatNormalTexture"] << material.clearcoat_normal_texture;
134 node["sheenColorTexture"] << material.sheen_color_texture;
135 node["sheenRoughnessTexture"] << material.sheen_roughness_texture;
136 node["iridescenceTexture"] << material.iridescence_texture;
137 node["iridescenceThicknessTexture"] << material.iridescence_thickness_texture;
138 node["baseColorSampler"] << material.base_color_sampler;
139 node["normalSampler"] << material.normal_sampler;
140 node["ormSampler"] << material.orm_sampler;
141 node["emissiveSampler"] << material.emissive_sampler;
142 node["transmissionSampler"] << material.transmission_sampler;
143 node["volumeThicknessSampler"] << material.volume_thickness_sampler;
144 node["specularSampler"] << material.specular_sampler;
145 node["specularColorSampler"] << material.specular_color_sampler;
146 node["clearcoatSampler"] << material.clearcoat_sampler;
147 node["clearcoatRoughnessSampler"] << material.clearcoat_roughness_sampler;
148 node["clearcoatNormalSampler"] << material.clearcoat_normal_sampler;
149 node["sheenColorSampler"] << material.sheen_color_sampler;
150 node["sheenRoughnessSampler"] << material.sheen_roughness_sampler;
151 node["iridescenceSampler"] << material.iridescence_sampler;
152 node["iridescenceThicknessSampler"] << material.iridescence_thickness_sampler;
153 node["baseColorUvSet"] << material.base_color_uv_set;
154 node["normalUvSet"] << material.normal_uv_set;
155 node["ormUvSet"] << material.orm_uv_set;
156 node["emissiveUvSet"] << material.emissive_uv_set;
157 node["transmissionUvSet"] << material.transmission_uv_set;
158 node["volumeThicknessUvSet"] << material.volume_thickness_uv_set;
159 node["specularUvSet"] << material.specular_uv_set;
160 node["specularColorUvSet"] << material.specular_color_uv_set;
161 node["clearcoatUvSet"] << material.clearcoat_uv_set;
162 node["clearcoatRoughnessUvSet"] << material.clearcoat_roughness_uv_set;
163 node["clearcoatNormalUvSet"] << material.clearcoat_normal_uv_set;
164 node["sheenColorUvSet"] << material.sheen_color_uv_set;
165 node["sheenRoughnessUvSet"] << material.sheen_roughness_uv_set;
166 node["iridescenceUvSet"] << material.iridescence_uv_set;
167 node["iridescenceThicknessUvSet"] << material.iridescence_thickness_uv_set;
168 node["baseColorUvTransform"] << material.base_color_uv_transform;
169 node["normalUvTransform"] << material.normal_uv_transform;
170 node["ormUvTransform"] << material.orm_uv_transform;
171 node["emissiveUvTransform"] << material.emissive_uv_transform;
172 node["transmissionUvTransform"] << material.transmission_uv_transform;
173 node["volumeThicknessUvTransform"] << material.volume_thickness_uv_transform;
174 node["specularUvTransform"] << material.specular_uv_transform;
175 node["specularColorUvTransform"] << material.specular_color_uv_transform;
176 node["clearcoatUvTransform"] << material.clearcoat_uv_transform;
177 node["clearcoatRoughnessUvTransform"] << material.clearcoat_roughness_uv_transform;
178 node["clearcoatNormalUvTransform"] << material.clearcoat_normal_uv_transform;
179 node["sheenColorUvTransform"] << material.sheen_color_uv_transform;
180 node["sheenRoughnessUvTransform"] << material.sheen_roughness_uv_transform;
181 node["iridescenceUvTransform"] << material.iridescence_uv_transform;
182 node["iridescenceThicknessUvTransform"] << material.iridescence_thickness_uv_transform;
183
184 Node factorNode;
185 factorNode.set_type(NodeType::Array);
186 auto& factorProperties = factorNode.properties();
187 factorProperties.clear();
188 for (int index = 0; index < 4; ++index)
189 {
190 Node componentNode;
191 componentNode << material.base_color_factor[index];
192 factorProperties.emplace_back("", std::move(componentNode));
193 }
194 node["baseColorFactor"] = std::move(factorNode);
195 node["metallicFactor"] << material.metallic_factor;
196 node["roughnessFactor"] << material.roughness_factor;
197 node["normalScale"] << material.normal_scale;
198 node["occlusionStrength"] << material.occlusion_strength;
199 node["ior"] << material.ior;
200 node["transmissionFactor"] << material.transmission_factor;
201 node["volumeThicknessFactor"] << material.volume_thickness_factor;
202 node["volumeAttenuationDistance"] << material.volume_attenuation_distance;
203 node["specularFactor"] << material.specular_factor;
204 node["clearcoatFactor"] << material.clearcoat_factor;
205 node["clearcoatRoughnessFactor"] << material.clearcoat_roughness_factor;
206 node["clearcoatNormalScale"] << material.clearcoat_normal_scale;
207 node["sheenRoughnessFactor"] << material.sheen_roughness_factor;
208 node["iridescenceFactor"] << material.iridescence_factor;
209 node["iridescenceIor"] << material.iridescence_ior;
210 node["iridescenceThicknessMinimum"] << material.iridescence_thickness_minimum;
211 node["iridescenceThicknessMaximum"] << material.iridescence_thickness_maximum;
212 node["alphaMode"] << material.alpha_mode;
213 node["alphaCutoff"] << material.alpha_cutoff;
214 node["doubleSided"] << material.double_sided;
215 node["shadingModel"] << material.shading_model;
216
217 Node emissiveNode;
218 emissiveNode.set_type(NodeType::Array);
219 auto& emissiveProperties = emissiveNode.properties();
220 emissiveProperties.clear();
221 for (int index = 0; index < 3; ++index)
222 {
223 Node componentNode;
224 componentNode << material.emissive_factor[index];
225 emissiveProperties.emplace_back("", std::move(componentNode));
226 }
227 node["emissiveFactor"] = std::move(emissiveNode);
228 node["emissiveStrength"] << material.emissive_strength;
229
230 Node volumeAttenuationColorNode;
231 volumeAttenuationColorNode.set_type(NodeType::Array);
232 auto& volumeAttenuationColorProperties = volumeAttenuationColorNode.properties();
233 volumeAttenuationColorProperties.clear();
234 for (int index = 0; index < 3; ++index)
235 {
236 Node componentNode;
237 componentNode << material.volume_attenuation_color[index];
238 volumeAttenuationColorProperties.emplace_back("", std::move(componentNode));
239 }
240 node["volumeAttenuationColor"] = std::move(volumeAttenuationColorNode);
241
242 Node specularColorNode;
243 specularColorNode.set_type(NodeType::Array);
244 auto& specularColorProperties = specularColorNode.properties();
245 specularColorProperties.clear();
246 for (int index = 0; index < 3; ++index)
247 {
248 Node componentNode;
249 componentNode << material.specular_color_factor[index];
250 specularColorProperties.emplace_back("", std::move(componentNode));
251 }
252 node["specularColorFactor"] = std::move(specularColorNode);
253
254 Node sheenColorNode;
255 sheenColorNode.set_type(NodeType::Array);
256 auto& sheenColorProperties = sheenColorNode.properties();
257 sheenColorProperties.clear();
258 for (int index = 0; index < 3; ++index)
259 {
260 Node componentNode;
261 componentNode << material.sheen_color_factor[index];
262 sheenColorProperties.emplace_back("", std::move(componentNode));
263 }
264 node["sheenColorFactor"] = std::move(sheenColorNode);
265 return node;
266 }
267
268 friend const Node& operator>>(const Node& node, Material& material)
269 {
270 if (node.has_property("baseColorTexture"))
271 {
272 node["baseColorTexture"] >> material.base_color_texture;
273 }
274
275 if (node.has_property("normalTexture"))
276 {
277 node["normalTexture"] >> material.normal_texture;
278 }
279
280 if (node.has_property("ormTexture"))
281 {
282 node["ormTexture"] >> material.orm_texture;
283 }
284
285 if (node.has_property("emissiveTexture"))
286 {
287 node["emissiveTexture"] >> material.emissive_texture;
288 }
289
290 if (node.has_property("transmissionTexture"))
291 {
292 node["transmissionTexture"] >> material.transmission_texture;
293 }
294
295 if (node.has_property("volumeThicknessTexture"))
296 {
297 node["volumeThicknessTexture"] >> material.volume_thickness_texture;
298 }
299
300 if (node.has_property("specularTexture"))
301 {
302 node["specularTexture"] >> material.specular_texture;
303 }
304
305 if (node.has_property("specularColorTexture"))
306 {
307 node["specularColorTexture"] >> material.specular_color_texture;
308 }
309
310 if (node.has_property("clearcoatTexture"))
311 {
312 node["clearcoatTexture"] >> material.clearcoat_texture;
313 }
314
315 if (node.has_property("clearcoatRoughnessTexture"))
316 {
317 node["clearcoatRoughnessTexture"] >> material.clearcoat_roughness_texture;
318 }
319
320 if (node.has_property("clearcoatNormalTexture"))
321 {
322 node["clearcoatNormalTexture"] >> material.clearcoat_normal_texture;
323 }
324
325 if (node.has_property("sheenColorTexture"))
326 {
327 node["sheenColorTexture"] >> material.sheen_color_texture;
328 }
329
330 if (node.has_property("sheenRoughnessTexture"))
331 {
332 node["sheenRoughnessTexture"] >> material.sheen_roughness_texture;
333 }
334
335 if (node.has_property("iridescenceTexture"))
336 {
337 node["iridescenceTexture"] >> material.iridescence_texture;
338 }
339
340 if (node.has_property("iridescenceThicknessTexture"))
341 {
342 node["iridescenceThicknessTexture"] >> material.iridescence_thickness_texture;
343 }
344
345 if (node.has_property("baseColorSampler"))
346 {
347 node["baseColorSampler"] >> material.base_color_sampler;
348 }
349
350 if (node.has_property("normalSampler"))
351 {
352 node["normalSampler"] >> material.normal_sampler;
353 }
354
355 if (node.has_property("ormSampler"))
356 {
357 node["ormSampler"] >> material.orm_sampler;
358 }
359
360 if (node.has_property("emissiveSampler"))
361 {
362 node["emissiveSampler"] >> material.emissive_sampler;
363 }
364
365 if (node.has_property("transmissionSampler"))
366 {
367 node["transmissionSampler"] >> material.transmission_sampler;
368 }
369
370 if (node.has_property("volumeThicknessSampler"))
371 {
372 node["volumeThicknessSampler"] >> material.volume_thickness_sampler;
373 }
374
375 if (node.has_property("specularSampler"))
376 {
377 node["specularSampler"] >> material.specular_sampler;
378 }
379
380 if (node.has_property("specularColorSampler"))
381 {
382 node["specularColorSampler"] >> material.specular_color_sampler;
383 }
384
385 if (node.has_property("clearcoatSampler"))
386 {
387 node["clearcoatSampler"] >> material.clearcoat_sampler;
388 }
389
390 if (node.has_property("clearcoatRoughnessSampler"))
391 {
392 node["clearcoatRoughnessSampler"] >> material.clearcoat_roughness_sampler;
393 }
394
395 if (node.has_property("clearcoatNormalSampler"))
396 {
397 node["clearcoatNormalSampler"] >> material.clearcoat_normal_sampler;
398 }
399
400 if (node.has_property("sheenColorSampler"))
401 {
402 node["sheenColorSampler"] >> material.sheen_color_sampler;
403 }
404
405 if (node.has_property("sheenRoughnessSampler"))
406 {
407 node["sheenRoughnessSampler"] >> material.sheen_roughness_sampler;
408 }
409
410 if (node.has_property("iridescenceSampler"))
411 {
412 node["iridescenceSampler"] >> material.iridescence_sampler;
413 }
414
415 if (node.has_property("iridescenceThicknessSampler"))
416 {
417 node["iridescenceThicknessSampler"] >> material.iridescence_thickness_sampler;
418 }
419
420 if (node.has_property("baseColorUvSet"))
421 {
422 node["baseColorUvSet"] >> material.base_color_uv_set;
423 }
424
425 if (node.has_property("normalUvSet"))
426 {
427 node["normalUvSet"] >> material.normal_uv_set;
428 }
429
430 if (node.has_property("ormUvSet"))
431 {
432 node["ormUvSet"] >> material.orm_uv_set;
433 }
434
435 if (node.has_property("emissiveUvSet"))
436 {
437 node["emissiveUvSet"] >> material.emissive_uv_set;
438 }
439
440 if (node.has_property("transmissionUvSet"))
441 {
442 node["transmissionUvSet"] >> material.transmission_uv_set;
443 }
444
445 if (node.has_property("volumeThicknessUvSet"))
446 {
447 node["volumeThicknessUvSet"] >> material.volume_thickness_uv_set;
448 }
449
450 if (node.has_property("specularUvSet"))
451 {
452 node["specularUvSet"] >> material.specular_uv_set;
453 }
454
455 if (node.has_property("specularColorUvSet"))
456 {
457 node["specularColorUvSet"] >> material.specular_color_uv_set;
458 }
459
460 if (node.has_property("clearcoatUvSet"))
461 {
462 node["clearcoatUvSet"] >> material.clearcoat_uv_set;
463 }
464
465 if (node.has_property("clearcoatRoughnessUvSet"))
466 {
467 node["clearcoatRoughnessUvSet"] >> material.clearcoat_roughness_uv_set;
468 }
469
470 if (node.has_property("clearcoatNormalUvSet"))
471 {
472 node["clearcoatNormalUvSet"] >> material.clearcoat_normal_uv_set;
473 }
474
475 if (node.has_property("sheenColorUvSet"))
476 {
477 node["sheenColorUvSet"] >> material.sheen_color_uv_set;
478 }
479
480 if (node.has_property("sheenRoughnessUvSet"))
481 {
482 node["sheenRoughnessUvSet"] >> material.sheen_roughness_uv_set;
483 }
484
485 if (node.has_property("iridescenceUvSet"))
486 {
487 node["iridescenceUvSet"] >> material.iridescence_uv_set;
488 }
489
490 if (node.has_property("iridescenceThicknessUvSet"))
491 {
492 node["iridescenceThicknessUvSet"] >> material.iridescence_thickness_uv_set;
493 }
494
495 if (node.has_property("baseColorUvTransform"))
496 {
497 node["baseColorUvTransform"] >> material.base_color_uv_transform;
498 }
499
500 if (node.has_property("normalUvTransform"))
501 {
502 node["normalUvTransform"] >> material.normal_uv_transform;
503 }
504
505 if (node.has_property("ormUvTransform"))
506 {
507 node["ormUvTransform"] >> material.orm_uv_transform;
508 }
509
510 if (node.has_property("emissiveUvTransform"))
511 {
512 node["emissiveUvTransform"] >> material.emissive_uv_transform;
513 }
514
515 if (node.has_property("transmissionUvTransform"))
516 {
517 node["transmissionUvTransform"] >> material.transmission_uv_transform;
518 }
519
520 if (node.has_property("volumeThicknessUvTransform"))
521 {
522 node["volumeThicknessUvTransform"] >> material.volume_thickness_uv_transform;
523 }
524
525 if (node.has_property("specularUvTransform"))
526 {
527 node["specularUvTransform"] >> material.specular_uv_transform;
528 }
529
530 if (node.has_property("specularColorUvTransform"))
531 {
532 node["specularColorUvTransform"] >> material.specular_color_uv_transform;
533 }
534
535 if (node.has_property("clearcoatUvTransform"))
536 {
537 node["clearcoatUvTransform"] >> material.clearcoat_uv_transform;
538 }
539
540 if (node.has_property("clearcoatRoughnessUvTransform"))
541 {
542 node["clearcoatRoughnessUvTransform"] >> material.clearcoat_roughness_uv_transform;
543 }
544
545 if (node.has_property("clearcoatNormalUvTransform"))
546 {
547 node["clearcoatNormalUvTransform"] >> material.clearcoat_normal_uv_transform;
548 }
549
550 if (node.has_property("sheenColorUvTransform"))
551 {
552 node["sheenColorUvTransform"] >> material.sheen_color_uv_transform;
553 }
554
555 if (node.has_property("sheenRoughnessUvTransform"))
556 {
557 node["sheenRoughnessUvTransform"] >> material.sheen_roughness_uv_transform;
558 }
559
560 if (node.has_property("iridescenceUvTransform"))
561 {
562 node["iridescenceUvTransform"] >> material.iridescence_uv_transform;
563 }
564
565 if (node.has_property("iridescenceThicknessUvTransform"))
566 {
567 node["iridescenceThicknessUvTransform"] >> material.iridescence_thickness_uv_transform;
568 }
569
570 if (node.has_property("baseColorFactor"))
571 {
572 const Node& factorNode = node["baseColorFactor"];
573 ASSERT(factorNode.type() == NodeType::Array, "material baseColorFactor must be an array");
574 const auto& factorProperties = factorNode.properties();
575 ASSERT(factorProperties.size() >= 4, "material baseColorFactor requires four components");
576 for (int index = 0; index < 4; ++index)
577 {
578 factorProperties[index].second >> material.base_color_factor[index];
579 }
580 }
581
582 if (node.has_property("metallicFactor"))
583 {
584 node["metallicFactor"] >> material.metallic_factor;
585 }
586
587 if (node.has_property("roughnessFactor"))
588 {
589 node["roughnessFactor"] >> material.roughness_factor;
590 }
591
592 if (node.has_property("normalScale"))
593 {
594 node["normalScale"] >> material.normal_scale;
595 }
596
597 if (node.has_property("occlusionStrength"))
598 {
599 node["occlusionStrength"] >> material.occlusion_strength;
600 }
601
602 if (node.has_property("ior"))
603 {
604 node["ior"] >> material.ior;
605 }
606
607 if (node.has_property("transmissionFactor"))
608 {
609 node["transmissionFactor"] >> material.transmission_factor;
610 }
611
612 if (node.has_property("volumeThicknessFactor"))
613 {
614 node["volumeThicknessFactor"] >> material.volume_thickness_factor;
615 }
616
617 if (node.has_property("volumeAttenuationDistance"))
618 {
619 node["volumeAttenuationDistance"] >> material.volume_attenuation_distance;
620 }
621
622 if (node.has_property("specularFactor"))
623 {
624 node["specularFactor"] >> material.specular_factor;
625 }
626
627 if (node.has_property("clearcoatFactor"))
628 {
629 node["clearcoatFactor"] >> material.clearcoat_factor;
630 }
631
632 if (node.has_property("clearcoatRoughnessFactor"))
633 {
634 node["clearcoatRoughnessFactor"] >> material.clearcoat_roughness_factor;
635 }
636
637 if (node.has_property("clearcoatNormalScale"))
638 {
639 node["clearcoatNormalScale"] >> material.clearcoat_normal_scale;
640 }
641
642 if (node.has_property("sheenRoughnessFactor"))
643 {
644 node["sheenRoughnessFactor"] >> material.sheen_roughness_factor;
645 }
646
647 if (node.has_property("iridescenceFactor"))
648 {
649 node["iridescenceFactor"] >> material.iridescence_factor;
650 }
651
652 if (node.has_property("iridescenceIor"))
653 {
654 node["iridescenceIor"] >> material.iridescence_ior;
655 }
656
657 if (node.has_property("iridescenceThicknessMinimum"))
658 {
659 node["iridescenceThicknessMinimum"] >> material.iridescence_thickness_minimum;
660 }
661
662 if (node.has_property("iridescenceThicknessMaximum"))
663 {
664 node["iridescenceThicknessMaximum"] >> material.iridescence_thickness_maximum;
665 }
666
667 if (node.has_property("alphaMode"))
668 {
669 node["alphaMode"] >> material.alpha_mode;
670 }
671
672 if (node.has_property("alphaCutoff"))
673 {
674 node["alphaCutoff"] >> material.alpha_cutoff;
675 }
676
677 if (node.has_property("doubleSided"))
678 {
679 node["doubleSided"] >> material.double_sided;
680 }
681
682 if (node.has_property("shadingModel"))
683 {
684 node["shadingModel"] >> material.shading_model;
685 }
686
687 if (node.has_property("emissiveFactor"))
688 {
689 const Node& emissiveNode = node["emissiveFactor"];
690 ASSERT(emissiveNode.type() == NodeType::Array, "material emissiveFactor must be an array");
691 const auto& emissiveProperties = emissiveNode.properties();
692 ASSERT(emissiveProperties.size() >= 3, "material emissiveFactor requires three components");
693 for (int index = 0; index < 3; ++index)
694 {
695 emissiveProperties[index].second >> material.emissive_factor[index];
696 }
697 }
698
699 if (node.has_property("emissiveStrength"))
700 {
701 node["emissiveStrength"] >> material.emissive_strength;
702 }
703
704 if (node.has_property("volumeAttenuationColor"))
705 {
706 const Node& volume_attenuation_color_node = node["volumeAttenuationColor"];
707 ASSERT(volume_attenuation_color_node.type() == NodeType::Array, "material volumeAttenuationColor must be an array");
708 const auto& volume_attenuation_color_properties = volume_attenuation_color_node.properties();
709 ASSERT(volume_attenuation_color_properties.size() >= 3, "material volumeAttenuationColor requires three components");
710 for (int index = 0; index < 3; ++index)
711 {
712 volume_attenuation_color_properties[index].second >> material.volume_attenuation_color[index];
713 }
714 }
715
716 if (node.has_property("specularColorFactor"))
717 {
718 const Node& specular_color_node = node["specularColorFactor"];
719 ASSERT(specular_color_node.type() == NodeType::Array, "material specularColorFactor must be an array");
720 const auto& specular_color_properties = specular_color_node.properties();
721 ASSERT(specular_color_properties.size() >= 3, "material specularColorFactor requires three components");
722 for (int index = 0; index < 3; ++index)
723 {
724 specular_color_properties[index].second >> material.specular_color_factor[index];
725 }
726 }
727
728 if (node.has_property("sheenColorFactor"))
729 {
730 const Node& sheen_color_node = node["sheenColorFactor"];
731 ASSERT(sheen_color_node.type() == NodeType::Array, "material sheenColorFactor must be an array");
732 const auto& sheen_color_properties = sheen_color_node.properties();
733 ASSERT(sheen_color_properties.size() >= 3, "material sheenColorFactor requires three components");
734 for (int index = 0; index < 3; ++index)
735 {
736 sheen_color_properties[index].second >> material.sheen_color_factor[index];
737 }
738 }
739
740 return node;
741 }
742
743private:
744 VirtualPath filename_;
745};
746} // namespace pixelbullet
#define ASSERT(condition,...)
Asserts that a condition is true.
Definition assert.h:142
Definition filesystem.h:19
Represents a hierarchical node capable of storing various data types and supporting YAML serializatio...
Definition node.h:49
Definition virtual_path.h:10
Definition material_types.h:136
Definition material_types.h:146
Definition serialization_result.h:8