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