diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 13fe2fb6..9c39d748 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -28,7 +28,9 @@ extern render_context* rctx_ptr; bool reflect_draw = false; mat4 reflect_mat = mat4_identity; + vec4 sss_param = 0.0f; +vec4 sss_param_reflect = 0.0f; static void draw_pass_shadow_begin_make_shadowmap(Shadow* shad, render_data_context& rend_data_ctx, cam_data& cam, int32_t index, int32_t a3); @@ -530,6 +532,7 @@ namespace rndr { ::sss_data* sss = rctx->sss_data; if (!sss->init_data || !sss->enable) { sss_param = 0.0f; + sss_param_reflect = 0.0f; return; } @@ -1677,39 +1680,37 @@ static void draw_pass_sss_contour(render_data_context& rend_data_ctx, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } -static void draw_pass_sss_filter_calc_coef(double_t step, int32_t size, double_t a3, int32_t iterations, - const double_t* a5, const double_t* a6, const double_t* a7, const double_t* a8, vec4 a9[64]) { +static void draw_pass_sss_filter_calc_coef(const double_t step, const int32_t size, + const double_t inverse_scale, const int32_t iterations, const double_t* weights, + const double_t* r_radius, const double_t* g_radius, const double_t* b_radius, vec4 coef[64]) { if (size > 8) return; - for (int32_t i = 0; i < iterations; i++) { - const double_t v18 = a5[i]; - double_t v56[3]; - v56[0] = a6[i]; - v56[1] = a7[i]; - v56[2] = a8[i]; + for (int32_t it = 0; it < iterations; it++) { + const double_t it_weight = weights[it]; + const double_t ch_radius[] = { r_radius[it], g_radius[it], b_radius[it] }; - for (int32_t j = 0; j < 3; j++) { - double_t v22 = 0.0; - double_t v23 = 0.0; - double_t v54[8]; - double_t v24 = 1.0 / (a3 * v56[j]); + for (int32_t ch = 0; ch < 3; ch++) { + double_t kernel[8]; + double_t pos = 0.0; + double_t kernel_sum = 0.0; + double_t scale = 1.0 / (inverse_scale * ch_radius[ch]); for (int32_t k = 0; k < size; k++) { - double_t v25 = exp(-0.5 * (v24 * v23) * (v24 * v23)); - v54[k] = v25; - v23 += step; - v22 += v25; + double_t weight = exp(-0.5 * (scale * pos) * (scale * pos)); + kernel[k] = weight; + pos += step; + kernel_sum += weight; } - double_t v27 = 1.0 / v22; + double_t inv_sum = 1.0 / kernel_sum; for (int32_t k = 0; k < size; k++) - v54[k] *= v27; + kernel[k] *= inv_sum; - float_t* v35 = (float_t*)a9 + j; + float_t* ptr = (float_t*)coef + ch; for (int32_t k = 0; k < size; k++) for (size_t l = 0; l < size; l++) { - *v35 = (float_t)(v54[k] * v18 * v54[l] + *v35); - v35 += 4; + *ptr = (float_t)(kernel[k] * it_weight * kernel[l] + *ptr); + ptr += 4; } } } @@ -1746,13 +1747,16 @@ static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_cont if (length > 1.25f) interest = closest_chara_position; - float_t v29 = max_def(vec3::distance(view_point, interest), 0.25f); - float_t v31 = max_def(tanf(rctx->camera->fov * 0.5f * DEG_TO_RAD_FLOAT) * 5.0f, 0.25f); - float_t v33 = 0.6f; - float_t v34 = (float_t)(1.0 / clamp_def(v31 * v29, 0.25f, 100.0f)); - if (v34 < 0.145f) - v33 = max_def(v34 - 0.02f, 0.0f) * 8.0f * 0.6f; - sss_param = { v33, 0.0f, 0.0f, 0.0f }; + float_t distance_to_interest = max_def(vec3::distance(view_point, interest), 0.25f); + float_t fov_scale = max_def(tanf(rctx->camera->fov * 0.5f * DEG_TO_RAD_FLOAT) * 5.0f, 0.25f); + float_t sss_strength = 0.6f; + float_t inverse_scale = (float_t)(1.0 / clamp_def(fov_scale * distance_to_interest, 0.25f, 100.0f)); + if (inverse_scale < 0.145f) + sss_strength = max_def(inverse_scale - 0.02f, 0.0f) * 8.0f * 0.6f; + if (reflect_draw) + sss_param_reflect = { sss_strength, 0.0f, 0.0f, 0.0f }; + else + sss_param = { sss_strength, 0.0f, 0.0f, 0.0f }; rend_data_ctx.state.active_texture(0); if (sss->npr_contour) { @@ -1781,11 +1785,12 @@ static void draw_pass_sss_filter(render_data_context& rend_data_ctx, render_cont sss_filter_gaussian_coef_shader_data shader_data = {}; shader_data.g_param = { (float_t)(sss_count - 1), 0.0f, 1.0f, 1.0f }; - const double_t a5[] = { 0.4, 0.3, 0.3 }; - const double_t a6[] = { 1.0, 2.0, 5.0 }; - const double_t a7[] = { 0.2, 0.4, 1.2 }; - const double_t a8[] = { 0.3, 0.7, 2.0 }; - draw_pass_sss_filter_calc_coef(1.0, sss_count, v34, 3, a5, a6, a7, a8, shader_data.g_coef); + const double_t weights[] = { 0.4, 0.3, 0.3 }; + const double_t r_radius[] = { 1.0, 2.0, 5.0 }; + const double_t g_radius[] = { 0.2, 0.4, 1.2 }; + const double_t b_radius[] = { 0.3, 0.7, 2.0 }; + draw_pass_sss_filter_calc_coef(1.0, sss_count, inverse_scale, + 3, weights, r_radius, g_radius, b_radius, shader_data.g_coef); rctx->sss_filter_gaussian_coef_ubo.WriteMemory(rend_data_ctx.state, shader_data); sss->textures[reflect_draw ? 3 : 1].Bind(rend_data_ctx.state); @@ -2125,7 +2130,7 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren rctx->sss_data->set_texture(rend_data_ctx.state, 3); rend_data_ctx.set_npr(render_manager); - rend_data_ctx.set_batch_sss_param(sss_param); + rend_data_ctx.set_batch_sss_param(sss_param_reflect); rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[0]); rend_data_ctx.state.bind_sampler(15, rctx->render_samplers[0]);