18 entt::meta_factory<pbr_material>{}
19 .type(
"pbr_material"_hs)
26 .func<&pbr_material::get_static_meta_type>(
"get_static_meta_type"_hs)
28 .data<&pbr_material::set_base_color, &pbr_material::get_base_color>(
"base_color"_hs)
33 .data<&pbr_material::set_subsurface_color, &pbr_material::get_subsurface_color>(
"subsurface_color"_hs)
38 .data<&pbr_material::set_emissive_color, &pbr_material::get_emissive_color>(
"emissive_color"_hs)
43 .data<&pbr_material::set_emissive_intensity, &pbr_material::get_emissive_intensity>(
"emissive_intensity"_hs)
50 .data<&pbr_material::set_roughness, &pbr_material::get_roughness>(
"roughness"_hs)
57 .data<&pbr_material::set_metalness, &pbr_material::get_metalness>(
"metalness"_hs)
64 .data<&pbr_material::set_bumpiness, &pbr_material::get_bumpiness>(
"bumpiness"_hs)
71 .data<&pbr_material::set_alpha_mode, &pbr_material::get_alpha_mode>(
"alpha_mode"_hs)
76 .data<&pbr_material::set_alpha_cutoff, &pbr_material::get_alpha_cutoff>(
"alpha_cutoff"_hs)
83 .data<&pbr_material::set_tiling, &pbr_material::get_tiling>(
"tiling"_hs)
88 .data<&pbr_material::set_dither_threshold, &pbr_material::get_dither_threshold>(
"dither_threshold"_hs)
93 .data<&pbr_material::set_color_map, &pbr_material::get_color_map>(
"color_map"_hs)
98 .data<&pbr_material::set_normal_map, &pbr_material::get_normal_map>(
"normal_map"_hs)
103 .data<&pbr_material::set_roughness_map, &pbr_material::get_roughness_map>(
"roughness_map"_hs)
107 entt::attribute{
"tooltip",
"Red Channel (R): Contains the roughness values.\nWhen Metalness and Roughness maps are the same.\nAs per glTF 2.0 specification:\nGreen Channel (G): Contains the roughness values.\nBlue Channel (B): Contains the metalness values."},
109 .data<&pbr_material::set_metalness_map, &pbr_material::get_metalness_map>(
"metalness_map"_hs)
113 entt::attribute{
"tooltip",
"Red Channel (R): Contains the metalness values.\nWhen Metalness and Roughness maps are the same.\nAs per glTF 2.0 specification:\nGreen Channel (G): Contains the roughness values.\nBlue Channel (B): Contains the metalness values."},
115 .data<&pbr_material::set_emissive_map, &pbr_material::get_emissive_map>(
"emissive_map"_hs)
121 .data<&pbr_material::set_ao_map, &pbr_material::get_ao_map>(
"ao_map"_hs)
131 try_save(ar, ser20::make_nvp(
"base_type", ser20::base_class<material>(&obj)));
132 try_save(ar, ser20::make_nvp(
"base_color", obj.base_color_));
133 try_save(ar, ser20::make_nvp(
"subsurface_color", obj.subsurface_color_));
134 try_save(ar, ser20::make_nvp(
"emissive_color", obj.emissive_color_));
135 try_save(ar, ser20::make_nvp(
"emissive_intensity", obj.emissive_intensity_));
137 float roughness = obj.get_roughness();
138 float metalness = obj.get_metalness();
139 float bumpiness = obj.get_bumpiness();
140 try_save(ar, ser20::make_nvp(
"roughness", roughness));
141 try_save(ar, ser20::make_nvp(
"metalness", metalness));
142 try_save(ar, ser20::make_nvp(
"bumpiness", bumpiness));
144 try_save(ar, ser20::make_nvp(
"alpha_mode", obj.alpha_mode_));
145 try_save(ar, ser20::make_nvp(
"alpha_cutoff", obj.alpha_cutoff_));
147 try_save(ar, ser20::make_nvp(
"tiling", obj.tiling_));
148 try_save(ar, ser20::make_nvp(
"dither_threshold", obj.dither_threshold_));
150 try_save(ar, ser20::make_nvp(
"color_map", obj.color_map_));
151 try_save(ar, ser20::make_nvp(
"normal_map", obj.normal_map_));
152 try_save(ar, ser20::make_nvp(
"roughness_map", obj.roughness_map_));
153 try_save(ar, ser20::make_nvp(
"metalness_map", obj.metalness_map_));
154 try_save(ar, ser20::make_nvp(
"emissive_map", obj.emissive_map_));
155 try_save(ar, ser20::make_nvp(
"ao_map", obj.ao_map_));
165 try_load(ar, ser20::make_nvp(
"base_type", ser20::base_class<material>(&obj)));
166 try_load(ar, ser20::make_nvp(
"base_color", obj.base_color_));
167 try_load(ar, ser20::make_nvp(
"subsurface_color", obj.subsurface_color_));
168 try_load(ar, ser20::make_nvp(
"emissive_color", obj.emissive_color_));
169 try_load(ar, ser20::make_nvp(
"emissive_intensity", obj.emissive_intensity_));
173 float roughness = obj.get_roughness();
174 float metalness = obj.get_metalness();
175 float bumpiness = obj.get_bumpiness();
176 try_load(ar, ser20::make_nvp(
"roughness", roughness));
177 try_load(ar, ser20::make_nvp(
"metalness", metalness));
178 try_load(ar, ser20::make_nvp(
"bumpiness", bumpiness));
179 obj.set_roughness(roughness);
180 obj.set_metalness(metalness);
181 obj.set_bumpiness(bumpiness);
183 try_load(ar, ser20::make_nvp(
"alpha_mode", obj.alpha_mode_));
185 float alpha_cutoff = obj.alpha_cutoff_;
186 try_load(ar, ser20::make_nvp(
"alpha_cutoff", alpha_cutoff));
187 obj.set_alpha_cutoff(alpha_cutoff);
191 const bool has_alpha_mode =
try_load(ar, ser20::make_nvp(
"alpha_mode", obj.alpha_mode_));
193 float alpha_cutoff = obj.alpha_cutoff_;
194 const bool has_alpha_cutoff =
try_load(ar, ser20::make_nvp(
"alpha_cutoff", alpha_cutoff));
196 math::vec4 surface_data{};
197 if(
try_load(ar, ser20::make_nvp(
"surface_data", surface_data)))
199 obj.surface_data_ = surface_data;
200 if(!has_alpha_cutoff)
202 alpha_cutoff = surface_data.w;
207 float roughness = obj.get_roughness();
208 if(
try_load(ar, ser20::make_nvp(
"roughness", roughness)))
210 obj.set_roughness(roughness);
213 float metalness = obj.get_metalness();
214 if(
try_load(ar, ser20::make_nvp(
"metalness", metalness)))
216 obj.set_metalness(metalness);
219 float bumpiness = obj.get_bumpiness();
220 if(
try_load(ar, ser20::make_nvp(
"bumpiness", bumpiness)))
222 obj.set_bumpiness(bumpiness);
226 if(!has_alpha_cutoff)
228 float legacy_alpha_test = alpha_cutoff;
229 if(
try_load(ar, ser20::make_nvp(
"alpha_test_value", legacy_alpha_test)))
231 alpha_cutoff = legacy_alpha_test;
235 obj.alpha_cutoff_ = alpha_cutoff;
239 obj.infer_alpha_mode_from_legacy_cutoff();
243 obj.set_alpha_cutoff(alpha_cutoff);
247 try_load(ar, ser20::make_nvp(
"tiling", obj.tiling_));
248 try_load(ar, ser20::make_nvp(
"dither_threshold", obj.dither_threshold_));
250 try_load(ar, ser20::make_nvp(
"color_map", obj.color_map_));
251 try_load(ar, ser20::make_nvp(
"normal_map", obj.normal_map_));
252 try_load(ar, ser20::make_nvp(
"roughness_map", obj.roughness_map_));
253 try_load(ar, ser20::make_nvp(
"metalness_map", obj.metalness_map_));
254 try_load(ar, ser20::make_nvp(
"emissive_map", obj.emissive_map_));
255 try_load(ar, ser20::make_nvp(
"ao_map", obj.ao_map_));