85 entt::meta_factory<skylight_component::sky_mode>{}
96 .data<skylight_component::sky_mode::perez>(
"perez"_hs)
101 .data<skylight_component::sky_mode::skybox>(
"skybox"_hs)
108 entt::meta_factory<skylight_component::irradiance_quality>{}
109 .type(
"irradiance_quality"_hs)
114 .data<skylight_component::irradiance_quality::flat>(
"flat"_hs)
118 entt::attribute{
"tooltip",
"Flat ambient (L0 only): same color for every surface normal."},
120 .data<skylight_component::irradiance_quality::directional>(
"directional"_hs)
124 entt::attribute{
"tooltip",
"Directional ambient (L0-L2 spherical harmonics): varies with the surface normal."},
127 entt::meta_factory<skylight_component::cloud_mode>{}
128 .type(
"cloud_mode"_hs)
133 .data<skylight_component::cloud_mode::none>(
"none"_hs)
139 .data<skylight_component::cloud_mode::flat>(
"flat"_hs)
143 entt::attribute{
"tooltip",
"Flat projected clouds. Cheap single-sample scattering on a dome plane."},
145 .data<skylight_component::cloud_mode::volumetric>(
"volumetric"_hs)
149 entt::attribute{
"tooltip",
"Volumetric raymarched clouds. Full scattering at half resolution with temporal blending."},
153 entt::meta_factory<skylight_component>{}
154 .type(
"skylight_component"_hs)
170 .data<&skylight_component::set_sky_brightness, &skylight_component::get_sky_brightness>(
"sky_brightness"_hs)
177 entt::attribute{
"tooltip",
"Brightness multiplier for sky and irradiance (1.0 = neutral)."},
179 .data<&skylight_component::set_turbidity, &skylight_component::get_turbidity>(
"turbidity"_hs)
185 entt::attribute{
"tooltip",
"Adjusts the clarity of the atmosphere. Lower values (1.9) result in a clear, blue sky, while higher values (up to 10) create a hazy, diffused appearance with more scattering of light.."},
188 .data<&skylight_component::set_cloud_mode, &skylight_component::get_cloud_mode>(
"cloud_mode"_hs)
193 entt::attribute{
"tooltip",
"Cloud rendering mode. None disables clouds, Flat uses cheap projected clouds, Volumetric uses full raymarched clouds."},
196 .data<&skylight_component::set_cloud_coverage, &skylight_component::get_cloud_coverage>(
"cloud_coverage"_hs)
203 entt::attribute{
"tooltip",
"Controls cloud density. 0.0 = clear sky, 1.0 = overcast. Higher values create more clouds by lowering the density threshold."},
206 .data<&skylight_component::set_cloud_base_altitude, &skylight_component::get_cloud_base_altitude>(
"cloud_base_altitude"_hs)
214 entt::attribute{
"tooltip",
"Cloud layer base altitude in world units. Volumetric: slab bottom. Flat: projection height."},
217 .data<&skylight_component::set_cloud_top_altitude, &skylight_component::get_cloud_top_altitude>(
"cloud_top_altitude"_hs)
225 entt::attribute{
"tooltip",
"Cloud layer top altitude in world units. Only used by volumetric clouds (slab top). Flat clouds ignore this."},
229 .data<&skylight_component::set_cloud_speed, &skylight_component::get_cloud_speed>(
"cloud_speed"_hs)
237 entt::attribute{
"tooltip",
"Cloud wind speed in km/h. ~10 = gentle drift, ~50 = strong wind, ~100+ = storm."},
240 .data<&skylight_component::set_cloud_density, &skylight_component::get_cloud_density>(
"cloud_density"_hs)
248 entt::attribute{
"tooltip",
"Cloud opacity multiplier. Higher values make clouds more opaque and visible."},
251 .data<&skylight_component::set_cloud_absorption, &skylight_component::get_cloud_absorption>(
"cloud_absorption"_hs)
259 entt::attribute{
"tooltip",
"Beer-Lambert extinction coefficient. Controls how quickly light is absorbed passing through the cloud. Higher = more opaque."},
262 .data<&skylight_component::set_cloud_light_absorption, &skylight_component::get_cloud_light_absorption>(
"cloud_light_absorption"_hs)
270 entt::attribute{
"tooltip",
"Self-shadow strength. Controls how much light is absorbed along the sun-facing direction. Higher = darker shadow side."},
273 .data<&skylight_component::set_cloud_vol_uv_scale, &skylight_component::get_cloud_vol_uv_scale>(
"cloud_vol_uv_scale"_hs)
281 entt::attribute{
"tooltip",
"World-to-noise scale; lower values produce larger cloud features."},
284 .data<&skylight_component::set_cloud_vol_edge_width, &skylight_component::get_cloud_vol_edge_width>(
"cloud_vol_edge_width"_hs)
292 entt::attribute{
"tooltip",
"Width of the density ramp; lower = sharper cloud silhouettes."},
295 .data<&skylight_component::set_cloud_vol_shape_power, &skylight_component::get_cloud_vol_shape_power>(
"cloud_vol_shape_power"_hs)
303 entt::attribute{
"tooltip",
"Contrast on the density mask; higher thins wispy regions."},
306 .data<&skylight_component::set_cloud_vol_detail_erode, &skylight_component::get_cloud_vol_detail_erode>(
"cloud_vol_detail_erode"_hs)
314 entt::attribute{
"tooltip",
"Worley detail subtraction; higher adds more holes and wisps."},
317 .data<&skylight_component::set_cloud_vol_macro_strength, &skylight_component::get_cloud_vol_macro_strength>(
"cloud_vol_macro_strength"_hs)
325 entt::attribute{
"tooltip",
"Strength of large-scale threshold jitter (clearings vs uniform sheet)."},
328 .data<&skylight_component::set_cloud_vol_coarse_scale, &skylight_component::get_cloud_vol_coarse_scale>(
"cloud_vol_coarse_scale"_hs)
336 entt::attribute{
"tooltip",
"Scale of the coarse noise sample (lower = larger masses)."},
339 .data<&skylight_component::set_cloud_vol_base_mix, &skylight_component::get_cloud_vol_base_mix>(
"cloud_vol_base_mix"_hs)
347 entt::attribute{
"tooltip",
"Blend between coarse and fine base noise (0 = coarse, 1 = fine)."},
350 .data<&skylight_component::set_cloud_vol_sun_intensity, &skylight_component::get_cloud_vol_sun_intensity>(
"cloud_vol_sun_intensity"_hs)
358 entt::attribute{
"tooltip",
"Multiplier for direct sun scattering in the cloud integrator."},
361 .data<&skylight_component::set_irradiance_intensity, &skylight_component::get_irradiance_intensity>(
"irradiance_intensity"_hs)
369 entt::attribute{
"tooltip",
"Strength of indirect diffuse lighting from the sky."},
371 .data<&skylight_component::set_irradiance_tint, &skylight_component::get_irradiance_tint>(
"irradiance_tint"_hs)
376 entt::attribute{
"tooltip",
"Optional tint override for irradiance (white = use sky-derived color)."},
378 .data<&skylight_component::set_irradiance_quality, &skylight_component::get_irradiance_quality>(
"irradiance_quality"_hs)
383 entt::attribute{
"tooltip",
"Directional variation of the ambient: Flat (L0 only) or Directional (full spherical harmonics)."},
385 .data<&skylight_component::set_irradiance_use_sky, &skylight_component::get_irradiance_use_sky>(
"irradiance_use_sky"_hs)
390 entt::attribute{
"tooltip",
"When on, the ambient is tinted by the sky/environment color. When off, only the irradiance tint is used as a flat artist-defined ambient (sky ignored)."},
392 .data<&skylight_component::set_cubemap, &skylight_component::get_cubemap>(
"cubemap"_hs)
402 try_save(ar, ser20::make_nvp(
"mode", obj.get_mode()));
403 try_save(ar, ser20::make_nvp(
"sky_brightness", obj.get_sky_brightness()));
404 try_save(ar, ser20::make_nvp(
"turbidity", obj.get_turbidity()));
405 try_save(ar, ser20::make_nvp(
"cloud_mode", obj.get_cloud_mode()));
406 try_save(ar, ser20::make_nvp(
"cloud_coverage", obj.get_cloud_coverage()));
407 try_save(ar, ser20::make_nvp(
"cloud_base_altitude", obj.get_cloud_base_altitude()));
408 try_save(ar, ser20::make_nvp(
"cloud_top_altitude", obj.get_cloud_top_altitude()));
409 try_save(ar, ser20::make_nvp(
"cloud_speed", obj.get_cloud_speed()));
410 try_save(ar, ser20::make_nvp(
"cloud_density", obj.get_cloud_density()));
411 try_save(ar, ser20::make_nvp(
"cloud_absorption", obj.get_cloud_absorption()));
412 try_save(ar, ser20::make_nvp(
"cloud_light_absorption", obj.get_cloud_light_absorption()));
413 try_save(ar, ser20::make_nvp(
"cloud_vol_uv_scale", obj.get_cloud_vol_uv_scale()));
414 try_save(ar, ser20::make_nvp(
"cloud_vol_edge_width", obj.get_cloud_vol_edge_width()));
415 try_save(ar, ser20::make_nvp(
"cloud_vol_shape_power", obj.get_cloud_vol_shape_power()));
416 try_save(ar, ser20::make_nvp(
"cloud_vol_detail_erode", obj.get_cloud_vol_detail_erode()));
417 try_save(ar, ser20::make_nvp(
"cloud_vol_macro_strength", obj.get_cloud_vol_macro_strength()));
418 try_save(ar, ser20::make_nvp(
"cloud_vol_coarse_scale", obj.get_cloud_vol_coarse_scale()));
419 try_save(ar, ser20::make_nvp(
"cloud_vol_base_mix", obj.get_cloud_vol_base_mix()));
420 try_save(ar, ser20::make_nvp(
"cloud_vol_sun_intensity", obj.get_cloud_vol_sun_intensity()));
421 try_save(ar, ser20::make_nvp(
"irradiance_intensity", obj.get_irradiance_intensity()));
422 try_save(ar, ser20::make_nvp(
"irradiance_tint", obj.get_irradiance_tint()));
423 try_save(ar, ser20::make_nvp(
"irradiance_quality", obj.get_irradiance_quality()));
424 try_save(ar, ser20::make_nvp(
"irradiance_use_sky", obj.get_irradiance_use_sky()));
425 try_save(ar, ser20::make_nvp(
"cubemap", obj.get_cubemap()));
433 if(
try_load(ar, ser20::make_nvp(
"mode", mode)))
438 float sky_brightness{1.0f};
439 if(
try_load(ar, ser20::make_nvp(
"sky_brightness", sky_brightness)))
441 obj.set_sky_brightness(sky_brightness);
445 if(
try_load(ar, ser20::make_nvp(
"turbidity", turbidity)))
447 obj.set_turbidity(turbidity);
451 if(
try_load(ar, ser20::make_nvp(
"cloud_mode", cloud_mode)))
453 obj.set_cloud_mode(cloud_mode);
456 float cloud_coverage{};
457 if(
try_load(ar, ser20::make_nvp(
"cloud_coverage", cloud_coverage)))
459 obj.set_cloud_coverage(cloud_coverage);
462 float cloud_base_altitude{};
463 if(
try_load(ar, ser20::make_nvp(
"cloud_base_altitude", cloud_base_altitude)))
465 obj.set_cloud_base_altitude(cloud_base_altitude);
468 float cloud_top_altitude{};
469 if(
try_load(ar, ser20::make_nvp(
"cloud_top_altitude", cloud_top_altitude)))
471 obj.set_cloud_top_altitude(cloud_top_altitude);
475 if(
try_load(ar, ser20::make_nvp(
"cloud_speed", cloud_speed)))
477 obj.set_cloud_speed(cloud_speed);
480 float cloud_density{};
481 if(
try_load(ar, ser20::make_nvp(
"cloud_density", cloud_density)))
483 obj.set_cloud_density(cloud_density);
486 float cloud_absorption{};
487 if(
try_load(ar, ser20::make_nvp(
"cloud_absorption", cloud_absorption)))
489 obj.set_cloud_absorption(cloud_absorption);
492 float cloud_light_absorption{};
493 if(
try_load(ar, ser20::make_nvp(
"cloud_light_absorption", cloud_light_absorption)))
495 obj.set_cloud_light_absorption(cloud_light_absorption);
498 float cloud_vol_uv_scale{};
499 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_uv_scale", cloud_vol_uv_scale)))
501 obj.set_cloud_vol_uv_scale(cloud_vol_uv_scale);
504 float cloud_vol_edge_width{};
505 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_edge_width", cloud_vol_edge_width)))
507 obj.set_cloud_vol_edge_width(cloud_vol_edge_width);
510 float cloud_vol_shape_power{};
511 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_shape_power", cloud_vol_shape_power)))
513 obj.set_cloud_vol_shape_power(cloud_vol_shape_power);
516 float cloud_vol_detail_erode{};
517 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_detail_erode", cloud_vol_detail_erode)))
519 obj.set_cloud_vol_detail_erode(cloud_vol_detail_erode);
522 float cloud_vol_macro_strength{};
523 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_macro_strength", cloud_vol_macro_strength)))
525 obj.set_cloud_vol_macro_strength(cloud_vol_macro_strength);
528 float cloud_vol_coarse_scale{};
529 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_coarse_scale", cloud_vol_coarse_scale)))
531 obj.set_cloud_vol_coarse_scale(cloud_vol_coarse_scale);
534 float cloud_vol_base_mix{};
535 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_base_mix", cloud_vol_base_mix)))
537 obj.set_cloud_vol_base_mix(cloud_vol_base_mix);
540 float cloud_vol_sun_intensity{};
541 if(
try_load(ar, ser20::make_nvp(
"cloud_vol_sun_intensity", cloud_vol_sun_intensity)))
543 obj.set_cloud_vol_sun_intensity(cloud_vol_sun_intensity);
546 float irradiance_intensity{};
547 if(
try_load(ar, ser20::make_nvp(
"irradiance_intensity", irradiance_intensity)))
549 obj.set_irradiance_intensity(irradiance_intensity);
553 if(
try_load(ar, ser20::make_nvp(
"irradiance_tint", irradiance_tint)))
555 obj.set_irradiance_tint(irradiance_tint);
559 if(
try_load(ar, ser20::make_nvp(
"irradiance_quality", irradiance_quality)))
561 obj.set_irradiance_quality(irradiance_quality);
564 bool irradiance_use_sky{
true};
565 if(
try_load(ar, ser20::make_nvp(
"irradiance_use_sky", irradiance_use_sky)))
567 obj.set_irradiance_use_sky(irradiance_use_sky);
571 if(
try_load(ar, ser20::make_nvp(
"cubemap", cubemap)))
573 obj.set_cubemap(cubemap);