44 auto data = obj.try_cast<fidelityfx_settings>();
45 return data->enable_cone_tracing;
50 if(
auto data = obj.try_cast<fidelityfx_settings>())
52 return data->enable_temporal_accumulation;
59 if(
auto data = obj.try_cast<fidelityfx_settings>())
61 return data->enable_spatial_denoise;
66 entt::meta_factory<cone_tracing_settings>{}
67 .type(
"ssr_pass::fidelityfx_ssr_settings::cone_tracing_settings"_hs)
69 entt::attribute{
"name",
"ssr_pass::fidelityfx_ssr_settings::cone_tracing_settings"},
72 .data<&cone_tracing_settings::cone_angle_bias>(
"cone_angle_bias"_hs)
78 entt::attribute{
"tooltip",
"Controls cone growth rate for glossy reflections"},
80 .data<&cone_tracing_settings::max_mip_level>(
"max_mip_level"_hs)
88 .data<&cone_tracing_settings::blur_base_sigma>(
"blur_base_sigma"_hs)
94 entt::attribute{
"tooltip",
"Base blur sigma for mip generation (CPU-side only)"},
101 entt::meta_factory<temporal_settings>{}
102 .type(
"ssr_pass::fidelityfx_ssr_settings::temporal_settings"_hs)
104 entt::attribute{
"name",
"ssr_pass::fidelityfx_ssr_settings::temporal_settings"},
107 .data<&temporal_settings::history_strength>(
"history_strength"_hs)
113 entt::attribute{
"tooltip",
"Controls how long reflections keep history.\n0 = real-time only · 1 = maximum denoise"},
115 .data<&temporal_settings::depth_threshold>(
"depth_threshold"_hs)
121 entt::attribute{
"tooltip",
"Depth difference allowed before history is discarded.\nLower = crisper edges, higher = smoother but risk of bleed"},
123 .data<&temporal_settings::roughness_sensitivity>(
"roughness_sensitivity"_hs)
129 entt::attribute{
"tooltip",
"How strongly rough surfaces shorten history.\n0 = same for every material · 1 = glossy keeps more history"},
131 .data<&temporal_settings::motion_scale_pixels>(
"motion_scale_pixels"_hs)
139 .data<&temporal_settings::normal_dot_threshold>(
"normal_dot_threshold"_hs)
145 entt::attribute{
"tooltip",
"Normal dot threshold for motion detection"},
147 .data<&temporal_settings::max_accum_frames>(
"max_accum_frames"_hs)
159 entt::meta_factory<spatial_denoise_settings>{}
160 .type(
"ssr_pass::fidelityfx_ssr_settings::spatial_denoise_settings"_hs)
162 entt::attribute{
"name",
"ssr_pass::fidelityfx_ssr_settings::spatial_denoise_settings"},
165 .data<&spatial_denoise_settings::depth_sigma>(
"depth_sigma"_hs)
171 entt::attribute{
"tooltip",
"Depth edge-stopping threshold. Lower = stricter edges, higher = looser"},
173 .data<&spatial_denoise_settings::normal_power>(
"normal_power"_hs)
179 entt::attribute{
"tooltip",
"Normal edge-stopping exponent. Higher = stricter edges"},
181 .data<&spatial_denoise_settings::luma_sigma>(
"luma_sigma"_hs)
187 entt::attribute{
"tooltip",
"Luminance edge-stopping threshold. Lower = sharper, higher = smoother"},
189 .data<&spatial_denoise_settings::passes>(
"passes"_hs)
195 entt::attribute{
"tooltip",
"Number of a-trous filter passes. More passes = wider blur reach but higher cost"},
198 entt::meta_factory<fidelityfx_settings>{}
199 .type(
"ssr_pass::fidelityfx_ssr_settings"_hs)
204 .data<&fidelityfx_settings::max_rays>(
"max_rays"_hs)
210 entt::attribute{
"tooltip",
"Maximum rays for rough surfaces (future: cone tracing)"},
212 .data<&fidelityfx_settings::max_steps>(
"max_steps"_hs)
218 entt::attribute{
"tooltip",
"Maximum ray marching steps for hierarchical traversal"},
220 .data<&fidelityfx_settings::depth_tolerance>(
"depth_tolerance"_hs)
228 .data<&fidelityfx_settings::brightness>(
"brightness"_hs)
236 .data<&fidelityfx_settings::facing_reflections_fading>(
"facing_reflections_fading"_hs)
242 entt::attribute{
"tooltip",
"Fade factor for camera-facing reflections"},
244 .data<&fidelityfx_settings::roughness_depth_tolerance>(
"roughness_depth_tolerance"_hs)
250 entt::attribute{
"tooltip",
"Additional depth tolerance for rough surfaces"},
252 .data<&fidelityfx_settings::fade_in_start>(
"fade_in_start"_hs)
260 .data<&fidelityfx_settings::fade_in_end>(
"fade_in_end"_hs)
268 .data<&fidelityfx_settings::resolution>(
"resolution"_hs)
272 entt::attribute{
"tooltip",
"Downscale divisor for SSR trace buffers.\nSSR is capped at Half at runtime - Quarter degrades Hi-Z traversal, temporal clamp and the denoiser severely."},
288 .data<&fidelityfx_settings::enable_spatial_denoise>(
"enable_spatial_denoise"_hs)
292 entt::attribute{
"tooltip",
"Enable spatial denoising (a-trous wavelet) before temporal resolve"},
294 .data<&fidelityfx_settings::spatial_denoise>(
"spatial_denoise"_hs)
299 entt::attribute{
"tooltip",
"Spatial denoise settings (edge-preserving a-trous filter)"},
302 .data<&fidelityfx_settings::enable_temporal_accumulation>(
"enable_temporal_accumulation"_hs)
306 entt::attribute{
"tooltip",
"Enable temporal accumulation to reduce noise over multiple frames"},
308 .data<&fidelityfx_settings::temporal>(
"temporal"_hs)
362 try_save(ar, ser20::make_nvp(
"history_strength", obj.history_strength));
363 try_save(ar, ser20::make_nvp(
"depth_threshold", obj.depth_threshold));
364 try_save(ar, ser20::make_nvp(
"roughness_sensitivity", obj.roughness_sensitivity));
365 try_save(ar, ser20::make_nvp(
"motion_scale_pixels", obj.motion_scale_pixels));
366 try_save(ar, ser20::make_nvp(
"normal_dot_threshold", obj.normal_dot_threshold));
367 try_save(ar, ser20::make_nvp(
"max_accum_frames", obj.max_accum_frames));
374 try_load(ar, ser20::make_nvp(
"history_strength", obj.history_strength));
375 try_load(ar, ser20::make_nvp(
"depth_threshold", obj.depth_threshold));
376 try_load(ar, ser20::make_nvp(
"roughness_sensitivity", obj.roughness_sensitivity));
377 try_load(ar, ser20::make_nvp(
"motion_scale_pixels", obj.motion_scale_pixels));
378 try_load(ar, ser20::make_nvp(
"normal_dot_threshold", obj.normal_dot_threshold));
379 try_load(ar, ser20::make_nvp(
"max_accum_frames", obj.max_accum_frames));
408 try_save(ar, ser20::make_nvp(
"max_steps", obj.max_steps));
409 try_save(ar, ser20::make_nvp(
"max_rays", obj.max_rays));
410 try_save(ar, ser20::make_nvp(
"depth_tolerance", obj.depth_tolerance));
411 try_save(ar, ser20::make_nvp(
"brightness", obj.brightness));
412 try_save(ar, ser20::make_nvp(
"facing_reflections_fading", obj.facing_reflections_fading));
413 try_save(ar, ser20::make_nvp(
"roughness_depth_tolerance", obj.roughness_depth_tolerance));
414 try_save(ar, ser20::make_nvp(
"fade_in_start", obj.fade_in_start));
415 try_save(ar, ser20::make_nvp(
"fade_in_end", obj.fade_in_end));
416 try_save(ar, ser20::make_nvp(
"resolution", obj.resolution));
417 try_save(ar, ser20::make_nvp(
"enable_cone_tracing", obj.enable_cone_tracing));
418 try_save(ar, ser20::make_nvp(
"cone_tracing", obj.cone_tracing));
419 try_save(ar, ser20::make_nvp(
"enable_temporal_accumulation", obj.enable_temporal_accumulation));
420 try_save(ar, ser20::make_nvp(
"temporal", obj.temporal));
421 try_save(ar, ser20::make_nvp(
"enable_spatial_denoise", obj.enable_spatial_denoise));
422 try_save(ar, ser20::make_nvp(
"spatial_denoise", obj.spatial_denoise));
429 try_load(ar, ser20::make_nvp(
"max_steps", obj.max_steps));
430 try_load(ar, ser20::make_nvp(
"max_rays", obj.max_rays));
431 try_load(ar, ser20::make_nvp(
"depth_tolerance", obj.depth_tolerance));
432 try_load(ar, ser20::make_nvp(
"brightness", obj.brightness));
433 try_load(ar, ser20::make_nvp(
"facing_reflections_fading", obj.facing_reflections_fading));
434 try_load(ar, ser20::make_nvp(
"roughness_depth_tolerance", obj.roughness_depth_tolerance));
435 try_load(ar, ser20::make_nvp(
"fade_in_start", obj.fade_in_start));
436 try_load(ar, ser20::make_nvp(
"fade_in_end", obj.fade_in_end));
439 if(!
try_load(ar, ser20::make_nvp(
"resolution", obj.resolution)))
441 bool legacy_half_res =
false;
442 if(
try_load(ar, ser20::make_nvp(
"enable_half_res", legacy_half_res)))
447 try_load(ar, ser20::make_nvp(
"enable_cone_tracing", obj.enable_cone_tracing));
448 try_load(ar, ser20::make_nvp(
"cone_tracing", obj.cone_tracing));
449 try_load(ar, ser20::make_nvp(
"enable_temporal_accumulation", obj.enable_temporal_accumulation));
450 try_load(ar, ser20::make_nvp(
"temporal", obj.temporal));
451 try_load(ar, ser20::make_nvp(
"enable_spatial_denoise", obj.enable_spatial_denoise));
452 try_load(ar, ser20::make_nvp(
"spatial_denoise", obj.spatial_denoise));