14 entt::meta_factory<assao_pass::settings>{}
15 .type(
"assao_pass::settings"_hs)
20 .data<&settings::radius>(
"radius"_hs)
24 entt::attribute{
"tooltip",
"World (view) space size of the occlusion sphere.\nRange: [0.0, ∞)"},
26 .data<&settings::shadow_multiplier>(
"shadow_multiplier"_hs)
32 entt::attribute{
"tooltip",
"Effect strength linear multiplier.\nRange: [0.0, 5.0]"},
34 .data<&settings::shadow_power>(
"shadow_power"_hs)
40 entt::attribute{
"tooltip",
"Effect strength power modifier.\nRange: [0.5, 5.0]"},
42 .data<&settings::shadow_clamp>(
"shadow_clamp"_hs)
48 entt::attribute{
"tooltip",
"Effect max limit (applied after multiplier but before blur).\nRange: [0.0, 1.0]"},
50 .data<&settings::horizon_angle_threshold>(
"horizon_angle_threshold"_hs)
56 entt::attribute{
"tooltip",
"Limits self-shadowing. Makes sampling cone narrower to avoid artifacts.\nRange: [0.0, 0.2]"},
58 .data<&settings::fade_out_from>(
"fade_out_from"_hs)
62 entt::attribute{
"tooltip",
"Distance to start fading out the effect.\nRange: [0.0, ∞)"},
64 .data<&settings::fade_out_to>(
"fade_out_to"_hs)
68 entt::attribute{
"tooltip",
"Distance at which the effect is fully faded out.\nRange: [0.0, ∞)"},
70 .data<&settings::quality_level>(
"quality_level"_hs)
76 entt::attribute{
"tooltip",
"-1: Lowest (low, half-res checkerboard)\n 0: Low\n 1: Medium\n 2: High\n 3: Very High / Adaptive\nRange: [-1, 3]"},
78 .data<&settings::adaptive_quality_limit>(
"adaptive_quality_limit"_hs)
84 entt::attribute{
"tooltip",
"Adaptive quality limit (only for Quality Level 3).\nRange: [0.0, 1.0]"},
86 .data<&settings::blur_pass_count>(
"blur_pass_count"_hs)
92 entt::attribute{
"tooltip",
"Number of edge-sensitive blur passes.\nQuality 0 uses a single 'dumb' blur pass instead of smart passes.\nRange: [0, 6]"},
94 .data<&settings::sharpness>(
"sharpness"_hs)
100 entt::attribute{
"tooltip",
"Sharpness (bleed over edges):\n 1.0 = Not at all\n 0.5 = Half-half\n 0.0 = Ignore edges entirely\nRange: [0.0, 1.0]"},
102 .data<&settings::temporal_supersampling_angle_offset>(
"temporal_supersampling_angle_offset"_hs)
108 entt::attribute{
"tooltip",
"Rotate sampling kernel. If using temporal AA/supersampling, recommended:\n ((frame % 3) / 3.0 * π) or similar.\nRange: [0.0, π]"},
110 .data<&settings::temporal_supersampling_radius_offset>(
"temporal_supersampling_radius_offset"_hs)
116 entt::attribute{
"tooltip",
"Scale sampling kernel. If using temporal AA/supersampling, recommended:\n (1.0 + (((frame % 3) - 1.0) / 3.0) * 0.1) or similar.\nRange: [0.0, 2.0]"},
118 .data<&settings::detail_shadow_strength>(
"detail_shadow_strength"_hs)
124 entt::attribute{
"tooltip",
"High-res detail AO using neighboring depth pixels.\nAdds detail but reduces temporal stability (adds aliasing).\nRange: [0.0, 5.0]"},
126 .data<&settings::generate_normals>(
"generate_normals"_hs)
130 entt::attribute{
"tooltip",
"If true, normals are generated from depth. Disable if precomputed normals are available."},
136 try_save(ar, ser20::make_nvp(
"radius", obj.radius));
137 try_save(ar, ser20::make_nvp(
"shadow_multiplier", obj.shadow_multiplier));
138 try_save(ar, ser20::make_nvp(
"shadow_power", obj.shadow_power));
139 try_save(ar, ser20::make_nvp(
"shadow_clamp", obj.shadow_clamp));
140 try_save(ar, ser20::make_nvp(
"horizon_angle_threshold", obj.horizon_angle_threshold));
141 try_save(ar, ser20::make_nvp(
"fade_out_from", obj.fade_out_from));
142 try_save(ar, ser20::make_nvp(
"fade_out_to", obj.fade_out_to));
143 try_save(ar, ser20::make_nvp(
"quality_level", obj.quality_level));
144 try_save(ar, ser20::make_nvp(
"adaptive_quality_limit", obj.adaptive_quality_limit));
145 try_save(ar, ser20::make_nvp(
"blur_pass_count", obj.blur_pass_count));
146 try_save(ar, ser20::make_nvp(
"sharpness", obj.sharpness));
147 try_save(ar, ser20::make_nvp(
"temporal_supersampling_angle_offset", obj.temporal_supersampling_angle_offset));
148 try_save(ar, ser20::make_nvp(
"temporal_supersampling_radius_offset", obj.temporal_supersampling_radius_offset));
149 try_save(ar, ser20::make_nvp(
"detail_shadow_strength", obj.detail_shadow_strength));
150 try_save(ar, ser20::make_nvp(
"generate_normals", obj.generate_normals));
157 try_load(ar, ser20::make_nvp(
"radius", obj.radius));
158 try_load(ar, ser20::make_nvp(
"shadow_multiplier", obj.shadow_multiplier));
159 try_load(ar, ser20::make_nvp(
"shadow_power", obj.shadow_power));
160 try_load(ar, ser20::make_nvp(
"shadow_clamp", obj.shadow_clamp));
161 try_load(ar, ser20::make_nvp(
"horizon_angle_threshold", obj.horizon_angle_threshold));
162 try_load(ar, ser20::make_nvp(
"fade_out_from", obj.fade_out_from));
163 try_load(ar, ser20::make_nvp(
"fade_out_to", obj.fade_out_to));
164 try_load(ar, ser20::make_nvp(
"quality_level", obj.quality_level));
165 try_load(ar, ser20::make_nvp(
"adaptive_quality_limit", obj.adaptive_quality_limit));
166 try_load(ar, ser20::make_nvp(
"blur_pass_count", obj.blur_pass_count));
167 try_load(ar, ser20::make_nvp(
"sharpness", obj.sharpness));
168 try_load(ar, ser20::make_nvp(
"temporal_supersampling_angle_offset", obj.temporal_supersampling_angle_offset));
169 try_load(ar, ser20::make_nvp(
"temporal_supersampling_radius_offset", obj.temporal_supersampling_radius_offset));
170 try_load(ar, ser20::make_nvp(
"detail_shadow_strength", obj.detail_shadow_strength));
171 try_load(ar, ser20::make_nvp(
"generate_normals", obj.generate_normals));