From f584e1d6e6da746509efa35a2aacabbd50f1d951 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 2 Jun 2026 08:45:40 +0300 Subject: [PATCH] Overhaul of rndr::Render class Should be called PostProcess later --- src/CRE/Glitter/effect_inst.cpp | 2 +- src/CRE/auth_3d.cpp | 73 +- src/CRE/camera.cpp | 46 +- src/CRE/camera.hpp | 7 + src/CRE/effect.cpp | 11 +- src/CRE/gl_rend_state.cpp | 2 + src/CRE/light_param.cpp | 28 +- src/CRE/mdl/disp_manager.cpp | 1 + src/CRE/mdl/draw_object.cpp | 1 + src/CRE/object.cpp | 6 +- src/CRE/pv_param.cpp | 26 +- src/CRE/render.cpp | 4458 ++++++++++++----------- src/CRE/render.hpp | 496 +-- src/CRE/render_context.cpp | 38 +- src/CRE/render_context.hpp | 19 +- src/CRE/render_manager.cpp | 133 +- src/CRE/render_manager.hpp | 16 +- src/CRE/renderer/dof.cpp | 2 +- src/CRE/renderer/dof.hpp | 2 +- src/CRE/renderer/transparency.cpp | 3 +- src/CRE/rob/rob.cpp | 43 +- src/CRE/rob/rob.hpp | 14 +- src/CRE/shadow.cpp | 1 + src/CRE/sss.cpp | 34 +- src/CRE/stage.cpp | 32 +- src/CRE/stage_modern.cpp | 14 +- src/KKdLib/database/stage.cpp | 66 +- src/KKdLib/database/stage.hpp | 28 +- src/KKdLib/light_param/glow.cpp | 55 +- src/KKdLib/light_param/glow.hpp | 19 +- src/ReDIVA/app.cpp | 28 +- src/ReDIVA/data_test/rob_osage_test.cpp | 2 +- src/ReDIVA/graphics/post_process.cpp | 384 +- src/ReDIVA/graphics/reflect_refract.cpp | 1 + src/ReDIVA/graphics/shadow.cpp | 1 + src/ReDIVA/input_state.cpp | 16 +- src/ReDIVA/main.cpp | 133 +- src/ReDIVA/mode_advertise.cpp | 1 + src/ReDIVA/mode_data_edit.cpp | 1 + src/ReDIVA/mode_data_test.cpp | 1 + src/ReDIVA/mode_game.cpp | 1 + src/ReDIVA/pv_game/pv_game.cpp | 56 +- src/ReDIVA/pv_game/pv_game_pv_data.cpp | 53 +- src/ReDIVA/pv_game/pv_game_pv_data.hpp | 2 +- src/ReDIVA/system_startup.cpp | 2 + src/ReDIVA/x_pv_game.cpp | 71 +- 46 files changed, 3311 insertions(+), 3118 deletions(-) diff --git a/src/CRE/Glitter/effect_inst.cpp b/src/CRE/Glitter/effect_inst.cpp index 9d2113ac..2da783b8 100644 --- a/src/CRE/Glitter/effect_inst.cpp +++ b/src/CRE/Glitter/effect_inst.cpp @@ -1091,7 +1091,7 @@ namespace Glitter { ext_anim_scale.z = 0.0f; enum_or(flags, EFFECT_INST_EXT_SCALE); - if (rob_chr->check_disp() || !(data.ext_anim_x->flags & EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA)) + if (rob_chr->get_disp() || !(data.ext_anim_x->flags & EFFECT_EXT_ANIM_NO_DRAW_IF_NO_DATA)) set_flags = true; else set_flags = false; diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index 834f621b..e6e0716c 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -22,6 +22,7 @@ #include "effect.hpp" #include "object.hpp" #include "pv_db.hpp" +#include "render.hpp" #include "shadow.hpp" #include "sound.hpp" #include "stage.hpp" @@ -1053,25 +1054,25 @@ namespace auth_3d_detail { // 0x1401CE3E0 void CameraAuxiliary::ctrl(Scene& in_scene, render_context* rctx) { if (has_exposure()) - rctx->render.set_exposure(exposure); + rctx->render->set_exposure(exposure); if (has_gamma()) - rctx->render.set_gamma(gamma); + rctx->render->set_gamma(gamma); if (has_saturate()) - rctx->render.set_saturate_coeff(saturate, 0, false); + rctx->render->set_saturate_coef(saturate, 0, false); if (has_auto_exposure()) - rctx->render.set_auto_exposure(auto_exposure > 0.0f); + rctx->render->set_auto_exposure(auto_exposure > 0.0f); } // 0x1401CFDE0 void CameraAuxiliary::dest(render_context* rctx) { if (has_exposure()) - rctx->render.set_exposure(2.0f); + rctx->render->set_exposure(2.0f); if (has_gamma()) - rctx->render.set_gamma(1.0f); + rctx->render->set_gamma(1.0f); if (has_saturate()) - rctx->render.set_saturate_coeff(1.0f, 0, false); + rctx->render->set_saturate_coef(1.0f, 0, false); if (has_auto_exposure()) - rctx->render.set_auto_exposure(true); + rctx->render->set_auto_exposure(true); init(); } @@ -1623,15 +1624,15 @@ namespace auth_3d_detail { float_t focus = vec3::distance(model_transform.translation, view_point); - rctx->render.set_dof_enable(fabsf(model_transform.rotation.z) > 0.000001f); - rctx->render.set_dof_data(focus, model_transform.scale.x, + rctx->render->enable_dof_set(fabsf(model_transform.rotation.z) > 0.000001f); + rctx->render->set_dof_data(focus, model_transform.scale.x, model_transform.rotation.x, model_transform.rotation.y); } // 0x1401CFE70 void Dof::dest(render_context* rctx) { if (has_dof) - rctx->render.set_dof_enable(false); + rctx->render->enable_dof_set(false); has_dof = false; init(); } @@ -1871,7 +1872,7 @@ namespace auth_3d_detail { return; } - rctx->render.reset_scene_fade(0); + rctx->render->set_fade_color_default(); } // 0x1401D1780 @@ -1893,7 +1894,7 @@ namespace auth_3d_detail { else value.w = 1.0f - t; - rctx->render.set_scene_fade(value, 0); + rctx->render->set_fade_color(&value); } // 0x1401B3AD0 @@ -4196,80 +4197,82 @@ namespace auth_3d_detail { // 0x1401CEF00 void PostProcess::ctrl(Scene& in_scene, render_context* rctx) { if (has_lens()) { - vec3 lens = rctx->render.get_lens(); + float_t flare_coef[3]; + rctx->render->get_flare_coef(flare_coef); if (has_lens_flare()) { if (!(backup_flag & FLAG_LENS_FLARE)) { - backup_lens_flare = lens.x; + backup_lens_flare = flare_coef[0]; backup_flag |= FLAG_LENS_FLARE; } - lens.x = lens_flare; + flare_coef[0] = lens_flare; } if (has_lens_shaft()) { if (!(backup_flag & FLAG_LENS_SHAFT)) { - backup_lens_shaft = lens.y; + backup_lens_shaft = flare_coef[1]; backup_flag |= FLAG_LENS_SHAFT; } - lens.y = lens_shaft; + flare_coef[1] = lens_shaft; } if (has_lens_ghost()) { if (!(backup_flag & FLAG_LENS_GHOST)) { - backup_lens_ghost = lens.z; + backup_lens_ghost = flare_coef[2]; backup_flag |= FLAG_LENS_GHOST; } - lens.z = lens_ghost; + flare_coef[2] = lens_ghost; } - rctx->render.set_lens(lens); + rctx->render->set_fade_color(flare_coef); } if (has_radius()) { if (!(backup_flag & FLAG_RADIUS)) { - *(vec3*)&backup_radius = rctx->render.get_radius(); + rctx->render->get_sigma((float_t*)&backup_radius); backup_flag |= FLAG_RADIUS; } - rctx->render.set_radius(*(vec3*)&radius.color); + rctx->render->set_sigma((float_t*)&radius.color); } if (has_intensity()) { if (!(backup_flag & FLAG_INTENSITY)) { - *(vec3*)&backup_intensity = rctx->render.get_intensity(); + rctx->render->get_intensity((float_t*)&backup_intensity); backup_flag |= FLAG_INTENSITY; } - rctx->render.set_intensity(*(vec3*)&intensity.color); + rctx->render->set_intensity((float_t*)&intensity.color); } if (has_scene_fade()) { if (!(backup_flag & FLAG_SCENE_FADE)) { - backup_scene_fade = rctx->render.get_scene_fade(); + rctx->render->get_fade_color(&backup_scene_fade); backup_flag |= FLAG_SCENE_FADE; } - rctx->render.set_scene_fade(scene_fade.color, 0); + rctx->render->set_fade_color(&scene_fade.color); } } // 0x1401D0050 void PostProcess::dest(render_context* rctx) { if (backup_flag & (FLAG_LENS_FLARE | FLAG_LENS_SHAFT | FLAG_LENS_GHOST)) { - vec3 value = rctx->render.get_lens(); + float_t flare_coef[3]; + rctx->render->get_flare_coef(flare_coef); if (backup_flag & FLAG_LENS_FLARE) - value.x = backup_lens_flare; + flare_coef[0] = backup_lens_flare; if (backup_flag & FLAG_LENS_SHAFT) - value.y = backup_lens_shaft; + flare_coef[1] = backup_lens_shaft; if (backup_flag & FLAG_LENS_GHOST) - value.z = backup_lens_ghost; - rctx->render.set_lens(value); + flare_coef[2] = backup_lens_ghost; + rctx->render->set_fade_color(flare_coef); } if (backup_flag & FLAG_RADIUS) - rctx->render.set_radius(*(vec3*)&backup_radius); + rctx->render->set_sigma((float_t*)&backup_radius); if (backup_flag & FLAG_INTENSITY) - rctx->render.set_intensity(*(vec3*)&backup_intensity); + rctx->render->set_intensity((float_t*)&backup_intensity); if (backup_flag & FLAG_SCENE_FADE) - rctx->render.set_scene_fade(backup_scene_fade, 0); + rctx->render->set_fade_color(&backup_scene_fade); } // 0x1401DF050 diff --git a/src/CRE/camera.cpp b/src/CRE/camera.cpp index c4844944..5a657e31 100644 --- a/src/CRE/camera.cpp +++ b/src/CRE/camera.cpp @@ -4,6 +4,7 @@ */ #include "camera.hpp" +#include "render.hpp" #include "render_context.hpp" #include "screen_param.hpp" @@ -321,7 +322,8 @@ static void camera_calculate_projection(camera* c) { extern render_context* rctx_ptr; vec2 persp_scale = 1.0f; - vec2 persp_offset = rctx_ptr->render.get_taa_offset(); + vec2 persp_offset; + rctx_ptr->render->perspective(persp_offset); mat4_persp_offset(c->fov * DEG_TO_RAD_FLOAT, (float_t)c->aspect, c->min_distance, c->max_distance, &persp_scale, &persp_offset, &c->projection); mat4_invert(&c->projection, &c->inv_projection); @@ -514,3 +516,45 @@ void cam_data::set_up(const vec3& value) { void cam_data::set_view_point(const vec3& value) { view_point = value; } + +// 0x1401F9340 +void project_screen(const mat4* vpmat, float_t fv, + vec2* pos2d, const vec3* pos3d, bool with_render_offset) { + project_screen(vpmat, fv, pos2d, pos3d, 0.0f, with_render_offset); +} + +// 0x1401F92E0 +void project_screen(const mat4* vpmat, float_t fv, + vec2* pos2d, const vec3* pos3d, float_t r, bool with_render_offset) { + vec3 src = *pos3d; + vec3 dst; + calc_screen_pos_r(vpmat, fv, &src, &dst, r, with_render_offset); + *pos2d = vec2(dst.x, dst.y); +} + +// 0x1401F7EE0 +float_t calc_screen_pos_r(const mat4* vpmat, float_t fv, + vec3* dst, const vec3* src, float_t r, bool with_render_offset) { + vec4 v18 = vec4(src->x, src->y, src->z, 1.0f); + mat4_transform_vector(vpmat, &v18, &v18); + if (fabs(v18.w) >= 1.0e-10f) { + float_t v10 = 1.0f / v18.w; + float_t v11 = v18.y * v10; + float_t v12 = v18.x * v10 + 1.0f; + ScreenParam& render_screen_param = get_render_screen_param(); + float_t v14 = (v12 * 0.5f) * (float_t)render_screen_param.width; + float_t v15 = ((1.0f - v11) * 0.5f) * (float_t)render_screen_param.height; + if (with_render_offset) { + ScreenParam& screen_param = get_screen_param(); + v14 += (float_t)render_screen_param.xoffset; + v15 += (float_t)(screen_param.height - render_screen_param.yoffset - render_screen_param.height); + } + dst->x = v14; + dst->y = v15; + dst->z = -v18.w; + return fabsf(v10) * (fv * r); + } + + *dst = 0.0f; + return 0.0f; +} diff --git a/src/CRE/camera.hpp b/src/CRE/camera.hpp index 5bc4dc15..990afdef 100644 --- a/src/CRE/camera.hpp +++ b/src/CRE/camera.hpp @@ -160,3 +160,10 @@ struct cam_data { void set_up(const vec3& value); void set_view_point(const vec3& value); }; + +extern void project_screen(const mat4* vpmat, float_t fv, + vec2* pos2d, const vec3* pos3d, bool with_render_offset); +extern void project_screen(const mat4* vpmat, float_t fv, + vec2* pos2d, const vec3* pos3d, float_t r, bool with_render_offset); +extern float_t calc_screen_pos_r(const mat4* vpmat, float_t fv, + vec3* dst, const vec3* src, float_t r, bool with_render_offset); diff --git a/src/CRE/effect.cpp b/src/CRE/effect.cpp index 65d85eaa..7a5abb6a 100644 --- a/src/CRE/effect.cpp +++ b/src/CRE/effect.cpp @@ -19,9 +19,10 @@ #include "gl_rend_state.hpp" #include "gl_state.hpp" #include "random.hpp" -#include "render_texture.hpp" +#include "render.hpp" #include "render_context.hpp" #include "render_manager.hpp" +#include "render_texture.hpp" #include "shader_ft.hpp" #include "stage.hpp" #include "stage_param.hpp" @@ -1509,8 +1510,8 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) mat4_transpose(&cam.view_mat, &temp); snow_scene.g_view_world_row2 = temp.row2; - snow_scene.g_size_in_projection.x = 1.0f / (float_t)rctx_ptr->render.render_width[0]; - snow_scene.g_size_in_projection.y = 1.0f / (float_t)rctx_ptr->render.render_height[0]; + snow_scene.g_size_in_projection.x = 1.0f / (float_t)rctx_ptr->render->fb_width[0]; + snow_scene.g_size_in_projection.y = 1.0f / (float_t)rctx_ptr->render->fb_height[0]; snow_scene.g_size_in_projection.z = snow_particle_size_min; snow_scene.g_size_in_projection.w = snow_particle_size_max; snow_scene.g_state_point_attenuation = { 0.0f, 0.0f, point_attenuation, 0.0f }; @@ -1528,7 +1529,7 @@ void snow_particle_draw(render_data_context& rend_data_ctx, const cam_data& cam) rend_data_ctx.state.write_uniform_buffer(snow_particle_batch_ubo, snow_batch); rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); - rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render.rend_texture[0].get_depth_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->render->fb_fbo[0].get_depth_texture_glid()); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.shader_flags.arr[U_SNOW_TYPE] = 0; @@ -6451,7 +6452,7 @@ static void snow_particle_init(bool change_stage) { snow_particle_fallen_count = 0; snow_particle_fallen_index = 0; - int32_t render_height = rctx_ptr->render.render_height[0]; + int32_t render_height = rctx_ptr->render->fb_height[0]; float_t snow_particle_size = (float_t)render_height * (float_t)(1.0 / 720.0); snow_particle_size_min = snow_particle_size; snow_particle_size_mid = snow_particle_size * 31.0f; diff --git a/src/CRE/gl_rend_state.cpp b/src/CRE/gl_rend_state.cpp index a9aaf097..25085f65 100644 --- a/src/CRE/gl_rend_state.cpp +++ b/src/CRE/gl_rend_state.cpp @@ -1174,6 +1174,8 @@ inline void gl_rend_state::generate_texture_mipmap(GLuint texture) { } void gl_rend_state::get() { + gl_get_error_all_print(); + glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&program); GLenum active_texture = GL_TEXTURE0; diff --git a/src/CRE/light_param.cpp b/src/CRE/light_param.cpp index 9103f409..4a859972 100644 --- a/src/CRE/light_param.cpp +++ b/src/CRE/light_param.cpp @@ -8,6 +8,7 @@ #include "../KKdLib/hash.hpp" #include "../KKdLib/str_utils.hpp" #include "gl_state.hpp" +#include "render.hpp" #include "render_context.hpp" #include "stage_param.hpp" @@ -472,13 +473,13 @@ void light_param_data::set_fog(const light_param_fog* f) { } void light_param_data::set_glow(const light_param_glow* glow) { - rndr::Render* rend = &rctx_ptr->render; + rndr::Render* rend = rctx_ptr->render; - rend->set_auto_exposure(true); - rend->set_tone_map(TONE_MAP_YCC_EXPONENT); - rend->reset_saturate_coeff(0, false); - rend->reset_scene_fade(0); - rend->reset_tone_trans(0); + rend->set_auto_exposure(1); + rend->set_tone_map_method(0); + rend->set_saturate_coef_default(); + rend->set_fade_color_default(); + rend->set_tone_trans_default(); if (glow->has_exposure) rend->set_exposure(glow->exposure); @@ -490,13 +491,13 @@ void light_param_data::set_glow(const light_param_glow* glow) { rend->set_saturate_power(glow->saturate_power); if (glow->has_saturate_coef) - rend->set_saturate_coeff(glow->saturate_coef, 0, false); + rend->set_saturate_coef(glow->saturate_coef); if (glow->has_flare) - rend->set_lens(glow->flare); + rend->set_flare_coef(glow->flare); if (glow->has_sigma) - rend->set_radius(glow->sigma); + rend->set_sigma(glow->sigma); if (glow->has_intensity) rend->set_intensity(glow->intensity); @@ -505,16 +506,15 @@ void light_param_data::set_glow(const light_param_glow* glow) { rend->set_auto_exposure(glow->auto_exposure); if (glow->has_tone_map_method) - rend->set_tone_map(glow->tone_map_method); + rend->set_tone_map_method(glow->tone_map_method); if (glow->has_fade_color) { - vec4 fade_color = glow->fade_color; - rend->set_scene_fade(fade_color, 0); - rend->set_scene_fade_blend_func(glow->fade_color_blend_func, 0); + rend->set_fade_color(&glow->fade_color); + rend->set_fade_blend_func(glow->fade_color_blend_func); } if (glow->has_tone_transform) - rend->set_tone_trans(glow->tone_transform_start, glow->tone_transform_end, 0); + rend->set_tone_trans(glow->tone_transform_start, glow->tone_transform_end); } void light_param_data::set_ibl(const light_param_ibl* ibl, const light_param_data_storage* storage) { diff --git a/src/CRE/mdl/disp_manager.cpp b/src/CRE/mdl/disp_manager.cpp index 718b30b2..8e24239e 100644 --- a/src/CRE/mdl/disp_manager.cpp +++ b/src/CRE/mdl/disp_manager.cpp @@ -11,6 +11,7 @@ #include "../gl_state.hpp" #include "../ogl_buffer_object.hpp" #include "../render_context.hpp" +#include "../render_manager.hpp" #include "../shader_ft.hpp" #include "draw_object.hpp" diff --git a/src/CRE/mdl/draw_object.cpp b/src/CRE/mdl/draw_object.cpp index bccee1e4..adb806c0 100644 --- a/src/CRE/mdl/draw_object.cpp +++ b/src/CRE/mdl/draw_object.cpp @@ -5,6 +5,7 @@ #include "draw_object.hpp" #include "../light_param/light.hpp" +#include "../render_manager.hpp" #include "../shader_ft.hpp" #include "../static_var.hpp" #include "../texture.hpp" diff --git a/src/CRE/object.cpp b/src/CRE/object.cpp index 5a2fe390..f1b7383a 100644 --- a/src/CRE/object.cpp +++ b/src/CRE/object.cpp @@ -1677,16 +1677,16 @@ inline uint32_t get_objnum_idx2uid(uint32_t objset_index, int32_t obj_index, con inline GLuint get_objset_gen_textures_id(uint32_t objset_index, uint32_t uid) { std::vector* gentex_vec = get_objset_gen_textures_vec(objset_index); if (!gentex_vec) - return 0; + return -1; ObjsetInfo* info = get_objset_info(objset_index); if (!info) - return 0; + return -1; auto elem = info->texidx_map.find(uid); if (elem != info->texidx_map.end()) return (*gentex_vec)[elem->second]; - return 0; + return -1; } // 0x14045A9E0 diff --git a/src/CRE/pv_param.cpp b/src/CRE/pv_param.cpp index 4d3bd032..eac25acf 100644 --- a/src/CRE/pv_param.cpp +++ b/src/CRE/pv_param.cpp @@ -900,7 +900,7 @@ namespace pv_param_task { else value = vec3::lerp(data.data_prev.color, data.data.color, frame / duration); - rctx_ptr->render.set_intensity(value); + rctx_ptr->render->set_intensity((float_t*)&value); frame += get_delta_frame(); if (frame > duration) { @@ -954,16 +954,16 @@ namespace pv_param_task { contrast = lerp_def(data.data_prev.contrast, data.data.contrast, t); } - rctx_ptr->render.set_saturate_coeff(saturation, 1, false); - rctx_ptr->render.set_exposure(exposure * 2.0f); + rctx_ptr->render->set_saturate_coef(saturation, 1, false); + rctx_ptr->render->set_exposure(exposure * 2.0f); - vec3 tone_trans_start; - vec3 tone_trans_end; - CalcToneTrans(contrast + gamma.x, tone_trans_start.x, tone_trans_end.x); - CalcToneTrans(contrast + gamma.y, tone_trans_start.y, tone_trans_end.y); - CalcToneTrans(contrast + gamma.z, tone_trans_start.z, tone_trans_end.z); + float_t tone_trans_start[3]; + float_t tone_trans_end[3]; + CalcToneTrans(contrast + gamma.x, tone_trans_start[0], tone_trans_end[0]); + CalcToneTrans(contrast + gamma.y, tone_trans_start[1], tone_trans_end[1]); + CalcToneTrans(contrast + gamma.z, tone_trans_start[2], tone_trans_end[2]); - rctx_ptr->render.set_tone_trans(tone_trans_start, tone_trans_end, 1); + rctx_ptr->render->set_tone_trans(tone_trans_start, tone_trans_end, 1); frame += get_delta_frame(); if (frame > duration) { @@ -1147,7 +1147,7 @@ namespace pv_param_task { void PostProcessCtrlDof::Set() { bool autofocus = data.data.rob_id != ROB_ID_NULL; if (autofocus) { - if (!rctx_ptr->render.get_dof_update()) + if (!rctx_ptr->render->get_dof_update()) return; vec3 trans = 0.0f; @@ -1167,7 +1167,7 @@ namespace pv_param_task { get_autofocus_data(vec3::distance(trans, view_point), cam->get_fov(), enable, data.data.focus, data.data.focus_range, data.data.fuzzing_range, data.data.ratio); - rctx_ptr->render.set_dof_enable(enable); + rctx_ptr->render->enable_dof_set(enable); } else if (frame < 0.0f) return; @@ -1196,7 +1196,7 @@ namespace pv_param_task { ratio = lerp_def(data.data_prev.ratio, data.data.ratio, t); } - rctx_ptr->render.set_dof_data(focus, focus_range, fuzzing_range, ratio); + rctx_ptr->render->set_dof_data(focus, focus_range, fuzzing_range, ratio); frame += get_delta_frame(); if (frame > duration) { @@ -1212,7 +1212,7 @@ namespace pv_param_task { data.data = *dof; if (fabsf(duration) > 0.000001f) - rctx_ptr->render.get_dof_data(data.data_prev.focus, + rctx_ptr->render->get_dof_data(data.data_prev.focus, data.data_prev.focus_range, data.data_prev.fuzzing_range, data.data_prev.ratio); else data.data_prev = data.data; diff --git a/src/CRE/render.cpp b/src/CRE/render.cpp index ff230f63..4e1b8373 100644 --- a/src/CRE/render.cpp +++ b/src/CRE/render.cpp @@ -11,6 +11,7 @@ #include "gl_state.hpp" #include "reflect_full.hpp" #include "render_context.hpp" +#include "render_manager.hpp" #include "shader_ft.hpp" #include "stage.hpp" #include "stage_modern.hpp" @@ -27,12 +28,9 @@ extern dof_pv dof_pv_data; #define MLAA_GRID_SIDE_LEN (2 * MLAA_MAX_EDGE_DETECTION_LEN + 1) #define MLAA_SIDE_LEN (5 * MLAA_GRID_SIDE_LEN) -#define TONE_MAP_SAT_GAMMA_SAMPLES 32 - namespace rndr { - static void calculate_mlaa_area_texture_data(uint8_t* data, int32_t cross1, int32_t cross2); - static void calculate_mlaa_area_texture_data_inner(float_t* val_left, - float_t* val_right, int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright); + // Added + static void get_sun_transform(mat4& transform, const vec3& position, float_t radius, const cam_data& cam); Render::ExposureCharaData::ExposureCharaData() : spot_weight(), query(), query_data() { reset(); @@ -48,1497 +46,247 @@ namespace rndr { spot_weight = 0.0f; } - Render::FrameTextureData::FrameTextureData() : texture() { - type = FRAME_TEXTURE_MAX; + Render::CaptureData::CaptureData() : txhd() { + type = CAPTURE_MAX; } - Render::FrameTextureData::~FrameTextureData() { + Render::CaptureData::~CaptureData() { } - Render::FrameTexture::FrameTexture() : capture() { + Render::Capture::Capture() : capture() { } - Render::FrameTexture::~FrameTexture() { + Render::Capture::~Capture() { } - Render::Render() : base_downsample(), ss_alpha_mask(), taa_tex(), composite_back_tex(), reduce_tex(), - reduce_tex_draw(), exposure_tex(), exposure_history(), tonemap_lut_texture(), mlaa_area_texture(), - texture_counter(), lens_shaft_query(), lens_flare_query(), lens_shaft_query_data(), - lens_flare_query_data(), lens_flare_query_index(), lens_flare_texture(), lens_shaft_texture(), - lens_ghost_texture(), lens_ghost_count(), width(), height(), inner_width(), inner_height(), - render_width(), render_height(), render_post_width(), render_post_height(), render_post_width_scale(), - render_post_height_scale(), reduce_width(), reduce_height(), taa_texture_selector(), - taa_texture(), reset_exposure(), screen_x_offset(), screen_y_offset(), screen_width(), - screen_height(), saturate_lock(), exposure_history_counter(), exposure_query_index(), - lens_shaft_scale(), lens_flare_power(), field_A10(), lens_flare_appear_power(), - render_textures_data(), movie_textures_data(), composite_back(), dof(), transparency_tex(), - transparency(), saturate_index(), scene_fade_index(), tone_trans_index(), saturate_coeff(), - scene_fade_alpha(), scene_fade_blend_func(), tone_map(), mag_filter(), fade(), update() { - exposure = 2.0f; - exposure_rate = 1.0f; - auto_exposure = 1; - - taa_blend = -1.0f; - - stage_index = -1; - stage_index_prev = -1; - - reset_exposure = true; - - gamma = 1.0; - gamma_rate = 1.0f; - - mag_filter = MAG_FILTER_BILINEAR; - - saturate_power = 1; - - for (int32_t i = 0; i < 2; i++) { - reset_saturate_coeff(i, false); - reset_scene_fade(i); - reset_tone_trans(i); - } - - fade_alpha = -1.0f; - - update_lut = 1; - - lens_shaft_inv_scale = 1.0f; - lens_flare = 1.0f; - lens_shaft = 1.0f; - lens_ghost = 1.0f; - - radius = 2.0f; - intensity = 1.0f; - - for (GLuint& i : lens_shaft_query_data) - i = -1; - - for (GLuint& i : lens_flare_query_data) - i = -1; + // 0x1404AD770 + void Render::draw_quad_simple(render_data_context& rend_data_ctx, float_t trnsl) { + //NOT IMPL! } - Render::~Render() { - if (composite_back_tex) - texture_release(composite_back_tex); - - if (dof) { - delete dof; - dof = 0; - } - - if (transparency) { - delete transparency; - transparency = 0; - } - } - - void Render::apply_post_process(render_data_context& rend_data_ctx, - const cam_data& cam, texture* light_proj_tex, int32_t npr_param) { - render_context* rctx = rctx_ptr; - - for (int32_t i = 0; i < 8; i++) - rend_data_ctx.state.bind_sampler(i, 0); - - dof->apply(rend_data_ctx, &rend_texture[0], &rctx_ptr->render_buffer); - - draw_lens_ghost(rend_data_ctx); - - downsample(rend_data_ctx); - - reduce_tex_draw = 0; - get_blur(rend_data_ctx); - - calc_exposure(rend_data_ctx, cam); - apply_tone_map(rend_data_ctx, light_proj_tex, npr_param); - - apply_mlaa(rend_data_ctx, taa_texture_selector, 2, ss_alpha_mask); - - for (int32_t i = 0; i < 16; i++) { - if (!render_textures_data[i]) - continue; - - render_textures[i].begin_render(rend_data_ctx.state); - - texture* t = render_textures_data[i]; - if (render_width[0] > t->width * 2 || render_height[0] > t->height * 2) - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 1; - else - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; - - rend_data_ctx.state.set_viewport(0, 0, t->width, t->height); - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - - copy_to_frame_texture(rend_data_ctx, rend_texture[0].get_texture_glid(), - render_width[0], render_height[0], taa_tex[taa_texture_selector]->glid); - - if (taa) { - if (taa_blend >= 0.0f) - calc_taa_blend(); - else - taa_blend = 1.0f; - } - - if (taa_blend < 0.0f || taa_blend >= 1.0f) - taa_texture = taa_texture_selector; - else { - rend_data_ctx.state.begin_event("taa_or_blur"); - bool blur; - GLuint sampler; - if (taa_blend > 0.99f) { - blur = true; - sampler = rctx->render_samplers[0]; - } - else { - blur = false; - sampler = rctx->render_samplers[1]; - } - - taa_texture = 2; - taa_buffer[2].begin_render(rend_data_ctx.state); - rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture_selector]->glid); - rend_data_ctx.state.bind_sampler(0, sampler); - - if (blur) { - rend_data_ctx.state.active_bind_texture_2d(2, rend_texture[0].get_depth_texture()->glid); - rend_data_ctx.state.bind_sampler(2, sampler); - - mat4 mat; - mat4_invert(&cam_view_projection, &mat); - mat4_mul(&cam_view_projection_prev, &mat, &mat); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 6; - - camera_blur_shader_data shader_data = {}; - shader_data.g_transform[0] = mat.row0; - shader_data.g_transform[1] = mat.row1; - shader_data.g_transform[2] = mat.row2; - shader_data.g_transform[3] = mat.row3; - rend_data_ctx.state.write_uniform_buffer(rctx->camera_blur_ubo, shader_data); - rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->camera_blur_ubo); - } - else { - int32_t taa_texture_selector = this->taa_texture_selector + 1; - if (taa_texture_selector > taa) - taa_texture_selector = 0; - rend_data_ctx.state.active_bind_texture_2d(1, taa_tex[taa_texture_selector]->glid); - rend_data_ctx.state.bind_sampler(1, sampler); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 5; - } - - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, taa_blend); - rend_data_ctx.state.end_event(); - } - - if (taa) { - int32_t taa_texture_selector = this->taa_texture_selector + 1; - if (taa_texture_selector > taa) - taa_texture_selector = 0; - this->taa_texture_selector = taa_texture_selector; - } - - rctx->screen_buffer.begin_render(rend_data_ctx.state); - rend_data_ctx.state.set_viewport(0, 0, rctx->sprite_width, rctx->sprite_height); - if (ssaa) { - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; - } - else { - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[taa_texture]->glid); - if (mag_filter == MAG_FILTER_NEAREST) - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); - else - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - - switch (mag_filter) { - case MAG_FILTER_NEAREST: - case MAG_FILTER_BILINEAR: - default: - rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 0; - break; - case MAG_FILTER_SHARPEN_5_TAP: - rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 2; - break; - case MAG_FILTER_SHARPEN_4_TAP: - rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 3; - break; - case MAG_FILTER_CONE_4_TAP: - rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 4; - break; - case MAG_FILTER_CONE_2_TAP: - rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 5; - break; - } - - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MAGNIFY); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - shader::unbind(rend_data_ctx.state); - - for (int32_t i = 0; i < 8; i++) - rend_data_ctx.state.bind_sampler(i, 0); - } - - void Render::begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back) { - if (composite_back) { - composite_back_texture.begin_render(p_gl_rend_st); - this->composite_back = 1; - } - else - rend_texture[0].begin_render(p_gl_rend_st); - p_gl_rend_st.set_viewport(0, 0, render_width[0], render_height[0]); - } - - void Render::calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam) { - shader::unbind(rend_data_ctx.state); - - rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - rend_data_ctx.state.set_depth_mask(GL_FALSE); - rend_data_ctx.state.disable_cull_face(); - - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN_NO_TEXTURED); - rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); - - ExposureCharaData* chara_data = exposure_chara_data; - int32_t query_index = (this->exposure_query_index + 1) % 3; - this->exposure_query_index = query_index; - int32_t next_query_index = (query_index + 2) % 3; - for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { - rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); - if (!rob_chr || !rob_chr->check_disp()) - continue; - - float_t max_face_depth = rob_chr->get_face_depth(); - - mat4 mat = mat4_identity; - rob_chr->sub_1405163C0(4, mat); - mat4_mul(&mat, &cam.get_view_mat(), &mat); - mat4_mul_translate(&mat, max_face_depth + 0.1f, 0.0f, -0.06f, &mat); - mat4_clear_rot(&mat, &mat); - mat4_scale_rot(&mat, 0.0035f, &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); - - sun_quad_shader_data shader_data = {}; - mat4_transpose(&mat, &mat); - shader_data.g_transform[0] = mat.row0; - shader_data.g_transform[1] = mat.row1; - shader_data.g_transform[2] = mat.row2; - shader_data.g_transform[3] = mat.row3; - shader_data.g_emission = 0.0f; - rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - - rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, chara_data->query[next_query_index]); - rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); - - if (chara_data->query_data[next_query_index] == -1) - chara_data->query_data[next_query_index] = 0; - - if (chara_data->query_data[query_index] != -1) { - int32_t res = 0; - glGetQueryObjectiv(chara_data->query[query_index], - GL_QUERY_RESULT_AVAILABLE, &res); - if (res) - glGetQueryObjectuiv(chara_data->query[query_index], - GL_QUERY_RESULT, chara_data->query_data); - else - chara_data->query_data[query_index] = 0; - } - } - - rend_data_ctx.state.bind_vertex_array(0); - - rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - rend_data_ctx.state.set_depth_mask(GL_TRUE); - rend_data_ctx.state.enable_cull_face(); - } - - void Render::draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam) { - static float_t flt_1411ACB84 = sinf(0.01365909819f); - static float_t flt_1411ACB8C = tanf(0.01365909819f) * 2.0f * 0.94f; - - if (!lens_flare_texture) - return; - - GLuint tex = get_objset_gen_textures_id(5, 4549); - if (!tex) - return; - - float_t v5 = tanf(cam.get_fov() * 0.5f); - light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; - light_data* data = &set->lights[LIGHT_SUN]; - - vec3 position; - vec4 emission; - if (data->get_type() == LIGHT_PARALLEL) { - data->get_position(position); - data->get_diffuse(emission); - } - else { - set->lights[LIGHT_STAGE].get_position(position); - position = vec3::normalize(position) * 500.0f; - set->lights[LIGHT_STAGE].get_ibl_color0(emission); - data->set_type(LIGHT_PARALLEL); - data->set_position(position); - data->set_diffuse(emission); - } - - vec4 v44; - *(vec3*)&v44 = position; - v44.w = 1.0f; - - mat4_transform_vector(&cam.get_view_proj_mat(), &v44, &v44); - - float_t v13 = 1.0f / v44.w; - float_t v14 = v44.x * v13; - float_t v15 = v44.y * v13; - float_t v16 = (float_t)width * 0.01f / (float_t)height; - v14 = clamp_def(v14, -0.99f, 0.99f); - v15 = clamp_def(v15, v16 - 1.0f, 1.0f - v16); - v44.x = v14 * v44.w; - v44.y = v15 * v44.w; - - mat4 inv_view_proj_mat; - mat4_invert(&cam.get_view_proj_mat(), &inv_view_proj_mat); - mat4_transform_vector(&inv_view_proj_mat, &v44, &v44); - ((pos_scale*)&lens_flare_pos)->get_screen_pos_scale(cam.get_view_proj_mat(), position); - - float_t v17 = lens_flare_pos.x - (float_t)width * 0.5f; - float_t v19 = v5 / ((float_t)height * 0.5f); - float_t v20 = lens_flare_pos.y - (float_t)height * 0.5f; - - float_t v22 = sqrtf((v17 * v19) * (v17 * v19) + (v20 * v19) * (v20 * v19) + 1.0f); - float_t v23 = (v22 * v22 * 0.5f) - * ((float_t)render_width[0] * (flt_1411ACB8C / v5)) - * ((float_t)render_height[0] * (flt_1411ACB8C / v5)); - float_t v24 = vec3::distance(position, view_point) * flt_1411ACB84; - emission *= 1.0f / (1.0f - cosf((float_t)(3.0 * DEG_TO_RAD))); - + // 0x1404AD870 + void Render::draw_quad_sun(render_data_context& rend_data_ctx, const mat4& transform, const vec4& emission) { sun_quad_shader_data shader_data = {}; shader_data.g_emission = emission; - rend_data_ctx.state.active_bind_texture_2d(0, tex); - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN); - - int32_t query_index = (lens_flare_query_index + 1) % 3; - lens_flare_query_index = query_index; - int32_t next_query_index = (query_index + 2) % 3; - - if (lens_shaft_query_data[next_query_index] == -1) - lens_shaft_query_data[next_query_index] = 0; - - if (lens_flare_query_data[next_query_index] == -1) - lens_flare_query_data[next_query_index] = 0; - - rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - rend_data_ctx.state.set_depth_mask(GL_FALSE); - rend_data_ctx.state.disable_cull_face(); - - mat4 mat; - mat4_mul_translate(&cam.get_view_mat(), &position, &mat); - mat4_clear_rot(&mat, &mat); - mat4_scale_rot(&mat, v24 * 0.2f, &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); - - mat4_transpose(&mat, &mat); - shader_data.g_transform[0] = mat.row0; - shader_data.g_transform[1] = mat.row1; - shader_data.g_transform[2] = mat.row2; - shader_data.g_transform[3] = mat.row3; + mat4 tmp; + mat4_transpose(&transform, &tmp); + shader_data.g_transform[0] = tmp.row0; + shader_data.g_transform[1] = tmp.row1; + shader_data.g_transform[2] = tmp.row2; + shader_data.g_transform[3] = tmp.row3; rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, lens_shaft_query[next_query_index]); - rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); - rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); - - mat4_mul_translate(&cam.get_view_mat(), (vec3*)&v44, &mat); - mat4_clear_rot(&mat, &mat); - mat4_scale_rot(&mat, v24 * 2.0f, &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); - - mat4_transpose(&mat, &mat); - shader_data.g_transform[0] = mat.row0; - shader_data.g_transform[1] = mat.row1; - shader_data.g_transform[2] = mat.row2; - shader_data.g_transform[3] = mat.row3; - rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - - rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, lens_flare_query[next_query_index]); - rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); - rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); - - rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - rend_data_ctx.state.set_depth_mask(GL_TRUE); - rend_data_ctx.state.enable_cull_face(); - - if (lens_shaft_query_data[query_index] != -1) { - int32_t res = 0; - glGetQueryObjectiv(lens_shaft_query[query_index], GL_QUERY_RESULT_AVAILABLE, &res); - if (res) - glGetQueryObjectuiv(lens_shaft_query[query_index], GL_QUERY_RESULT, &lens_shaft_query_data[query_index]); - } - - if (lens_flare_query_data[query_index] != -1) { - int32_t res = 0; - glGetQueryObjectiv(lens_flare_query[query_index], GL_QUERY_RESULT_AVAILABLE, &res); - if (res) - glGetQueryObjectuiv(lens_flare_query[query_index], GL_QUERY_RESULT, &lens_flare_query_data[query_index]); - } - - if (emission.x + emission.y + emission.z > 0.0f) { - rend_data_ctx.state.enable_blend(); - rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); - rend_data_ctx.state.set_depth_mask(GL_FALSE); - - mat4_mul_translate(&cam.get_view_mat(), &position, &mat); - mat4_clear_rot(&mat, &mat); - mat4_scale_rot(&mat, v24 * 1.1f, &mat); - mat4_mul(&mat, &cam.get_proj_mat(), &mat); - - mat4_transpose(&mat, &mat); - shader_data.g_transform[0] = mat.row0; - shader_data.g_transform[1] = mat.row1; - shader_data.g_transform[2] = mat.row2; - shader_data.g_transform[3] = mat.row3; - rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); - - rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); - rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); - - rend_data_ctx.state.disable_blend(); - rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); - rend_data_ctx.state.set_depth_mask(GL_TRUE); - } - - rend_data_ctx.state.active_bind_texture_2d(0, 0); - rend_data_ctx.state.bind_vertex_array(0); - - if (lens_flare_appear_power <= 0.01f) - lens_flare_appear_power = 0.0f; - else - lens_flare_appear_power *= 0.93f; - lens_shaft_scale = 100.0f; - lens_flare_power = 0.0f; - - float_t v34 = lens_flare_pos.x; - float_t v35 = lens_flare_pos.y; - float_t v32 = lens_flare_pos.z; - - float_t v33 = 0.0f; - if (v32 >= 0.0f - || v34 < (float_t)-width || v34 >(float_t)(2 * width) - || v35 < (float_t)-height || v35 >(float_t)(2 * height)) - lens_flare_texture = 0; - else { - for (GLuint& i : lens_flare_query_data) - if (i != -1) - v33 += min_def((float_t)i, v23); - v33 /= (v23 * 3.0f); - lens_flare_power = powf(v33, 0.7f); - - if (v33 > 0.0f && lens_shaft_query_data[query_index]) { - float_t v41 = max_def(v33 - 0.4f, 0.005f); - lens_shaft_scale = ((0.6f / v41) * lens_shaft_inv_scale) * (v5 * 3.4f); - } - } - - if (v32 >= 0.0f - || v34 < -12.0f || v34 >(float_t)(width + 12) - || v35 < -12.0f || v35 >(float_t)(height + 12)) { - field_A10 = 0.0f; - } - else if (v34 > -2.0f && v34 < (float_t)(width + 2) - && v35 > -2.0f && v35 < (float_t)(height + 2)) { - if (v33 > 0.4f && field_A10 == 0.0f && lens_flare_appear_power < 0.02f && !reset_exposure) - lens_flare_appear_power = 8.0f; - field_A10 = 1.0f; - } - } - - void Render::draw_quad(render_data_context& rend_data_ctx, - int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, - float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w) { - s0 -= s1; - t0 -= t1; - - const float_t w = (float_t)max_def(width, 1); - const float_t h = (float_t)max_def(height, 1); - quad_shader_data quad = {}; - quad.g_texcoord_modifier = { 0.5f * s0, 0.5f * t0, 0.5f * s0 + s1, 0.5f * t0 + t1 }; // x * 0.5 * y0 + 0.5 * y0 + y1 - quad.g_texel_size = { scale / w, scale / h, w, h }; - quad.g_color = { param_x, param_y, param_z, param_w }; - quad.g_texture_lod = 0.0f; - - rend_data_ctx.state.write_uniform_buffer(rctx_ptr->quad_ubo, quad); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->quad_ubo); rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); } - void Render::draw_sss_contour(render_data_context& rend_data_ctx, const cam_data& cam) { + // 0x1404AD650 + void Render::draw_quad_ghost(int32_t index, float_t opacity, mat4* mat, float_t*& data) { + const float_t x0 = index & 0x01 ? 0.5f : 0.0f; + const float_t x1 = index & 0x01 ? 1.0f : 0.5f; + const float_t y0 = index & 0x02 ? 0.5f : 0.0f; + const float_t y1 = index & 0x02 ? 1.0f : 0.5f; + + vec4 p0 = { -0.5f, -0.5f, x0, y0 }; + vec4 p1 = { 0.5f, -0.5f, x1, y0 }; + vec4 p2 = { -0.5f, 0.5f, x0, y1 }; + vec4 p3 = { 0.5f, 0.5f, x1, y1 }; + mat4_transform_point(mat, (vec2*)&p0, (vec2*)&p0); + mat4_transform_point(mat, (vec2*)&p1, (vec2*)&p1); + mat4_transform_point(mat, (vec2*)&p2, (vec2*)&p2); + mat4_transform_point(mat, (vec2*)&p3, (vec2*)&p3); + + *(vec4*)&data[0] = p0; + data[4] = opacity; + *(vec4*)&data[5] = p1; + data[9] = opacity; + *(vec4*)&data[10] = p2; + data[14] = opacity; + *(vec4*)&data[15] = p2; + data[19] = opacity; + *(vec4*)&data[20] = p1; + data[24] = opacity; + *(vec4*)&data[25] = p3; + data[29] = opacity; + data += 30; + } + + // 0x1404AF2A0 + void Render::measure_exposure(render_data_context& rend_data_ctx, const cam_data& cam) { render_context* rctx = rctx_ptr; - if (reflect_draw) - rctx->reflect_buffer.begin_render(rend_data_ctx.state); - else - sss_contour_texture->begin_render(rend_data_ctx.state); + bool v2 = false; + if (!reset_exposure) { + ExposureCharaData* chara_data = exposure_chara_data; + for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); + if (!rob_chr || !rob_chr->get_disp()) + continue; - rend_data_ctx.state.enable_depth_test(); - rend_data_ctx.state.set_depth_func(GL_ALWAYS); - rend_data_ctx.state.set_depth_mask(GL_TRUE); - if (reflect_draw) { - RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - rend_data_ctx.state.set_viewport(0, 0, refl_tex.get_width(), refl_tex.get_height()); - rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.get_texture_glid()); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); - rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.get_depth_texture_glid()); - rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); + vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; + vec4 v33 = { 1.0f, 0.0f, 0.0f, 0.0f }; + + mat4 v44 = mat4_identity; + rob_chr->sub_1405163C0(4, v44); + + mat4 v42; + mat4 v43; + mat4_mul(&v44, &cam.view_mat, &v42); + mat4_mul(&v42, &cam.proj_mat, &v43); + + vec4 v41; + vec4 v40; + mat4_transform_vector(&v42, &v34, &v41); + mat4_transform_vector(&v43, &v34, &v40); + + float_t v12 = 1.0f / v40.w; + float_t v13 = v40.x * v12; + float_t v14 = v40.y * v12; + if (v41.z >= 0.0f || fabsf(v13) >= 1.0f || fabsf(v14) >= 1.0f) + continue; + + float_t v31 = 0.5f - (fabsf(v14) - 1.0f) * 2.5f; + float_t v32 = 0.5f - (fabsf(v13) - 1.0f) * 2.5f; + + float_t v16 = min_def(min_def(v31, v32), 1.0f); + + vec4 v39; + mat4_transform_vector(&v42, &v33, &v39); + + float_t v17 = (v39.z + 1.0f) * 0.5f; + if (v17 > 0.8f) + v17 = 0.8f; + else if (v17 < 0.2f) + v17 = 0.0f; + + float_t v18 = (float_t)scr_height / (float_t)scr_width; + float_t v20 = tanf(cam.fov * 0.5f * DEG_TO_RAD_FLOAT); + float_t v21 = 0.25f / sqrtf(powf(v20 * 3.4f, 2.0f) * (v41.z * v41.z)); + float_t v22; + if (v21 < 0.055f) + v22 = max_def((v21 - 0.035f) * 50.0f, 0.0f); + else if (v21 > 0.5f) + v22 = max_def(1.0f - (v21 - 0.5f) * 3.3333333f, 0.0f); + else + v22 = 1.0f; + + chara_data->spot_coefficients[0].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[0].y = (v14 + v21 * 0.1f + 1.0f) * 0.5f; + chara_data->spot_coefficients[0].z = 0.0f; + chara_data->spot_coefficients[0].w = 4.0f; + chara_data->spot_coefficients[1].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[1].y = (v14 - v21 * 0.3f + 1.0f) * 0.5f; + chara_data->spot_coefficients[1].z = 0.0f; + chara_data->spot_coefficients[1].w = 4.0f; + chara_data->spot_coefficients[2].x = (v13 + v21 * -0.5f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[2].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; + chara_data->spot_coefficients[2].z = 0.0f; + chara_data->spot_coefficients[2].w = 3.0f; + chara_data->spot_coefficients[3].x = (v13 - v21 * 0.6f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[3].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; + chara_data->spot_coefficients[3].z = 0.0f; + chara_data->spot_coefficients[3].w = 2.0f; + chara_data->spot_coefficients[4].x = (v13 + v21 * 0.6f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[4].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; + chara_data->spot_coefficients[4].z = 0.0f; + chara_data->spot_coefficients[4].w = 2.0f; + chara_data->spot_coefficients[5].x = (v13 + v21 * 0.5f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[5].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; + chara_data->spot_coefficients[5].z = 0.0f; + chara_data->spot_coefficients[5].w = 3.0f; + chara_data->spot_coefficients[6].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; + chara_data->spot_coefficients[6].y = (v14 - v21 * 0.8f + 1.0f) * 0.5f; + chara_data->spot_coefficients[6].z = 0.0f; + chara_data->spot_coefficients[6].w = 3.0f; + chara_data->spot_weight = v16 * 1.6f * v17 * v22; + if (chara_data->spot_weight > 0.0f && !chara_data->query_data[exposure_chara_write_index]) + v2 = true; + } } - else { - rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[0].get_texture_glid()); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); - rend_data_ctx.state.active_bind_texture_2d(1, rend_texture[0].get_depth_texture_glid()); - rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); - } - rend_data_ctx.state.active_texture(0); - float_t v3 = 1.0f / tanf(cam.get_fov() * 0.5f); + if (!v2 || reset_exposure) { + exposure_measure_shader_data exposure_measure = {}; + exposure_measure.g_spot_weight = { + exposure_chara_data[0].spot_weight, + exposure_chara_data[1].spot_weight, + exposure_chara_data[2].spot_weight, + exposure_chara_data[3].spot_weight + }; - vec3 direction = cam.get_interest() - cam.get_view_point(); - float_t length = vec3::length(direction); - float_t v7 = direction.y; - if (length != 0.0f) - v7 /= length; + ExposureCharaData* chara_data = exposure_chara_data; + for (int32_t i = 0; i < 4 && i < ROB_ID_MAX; i++, chara_data++) + for (int32_t j = 0; j < 8; j++) + exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; + rend_data_ctx.state.write_uniform_buffer(rctx->exposure_measure_ubo, exposure_measure); - float_t v9 = fabsf(v7) - 0.1f; - if (v9 < 0.0f) - v9 = 0.0f; + rend_data_ctx.state.set_viewport(0, 0, exposure_tex_width, 1); + work_fbo.begin_render(rend_data_ctx.state); - contour_coef_shader_data shader_data = {}; - shader_data.g_contour = { v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f }; - const double_t max_distance = cam.get_max_distance(); - const double_t min_distance = cam.get_min_distance(); - shader_data.g_near_far = { - (float_t)(max_distance * (1.0 / (max_distance - min_distance))), - (float_t)(-(max_distance * min_distance) * (1.0 / (max_distance - min_distance))), - (float_t)min_distance, (float_t)max_distance - }; - rend_data_ctx.state.write_uniform_buffer(rctx->contour_coef_ubo, shader_data); - - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR); - rend_data_ctx.state.bind_uniform_buffer_base(2, rctx->contour_coef_ubo); - - if (reflect_draw) { - RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); - draw_quad(rend_data_ctx, refl_tex.get_width(), refl_tex.get_height(), - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - else - draw_quad(rend_data_ctx, - render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, + rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->exposure_measure_ubo); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[4]->glid); + rend_data_ctx.state.active_bind_texture_2d(1, blur_txhd[2]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - void Render::end_render(p_gl_rend_state& p_gl_rend_st) { - rend_texture->end_render(p_gl_rend_st); - } - - bool Render::frame_texture_cont_capture_set(bool value) { - frame_texture[0].capture = value; - return true; - } - - void Render::frame_texture_free() { - for (Render::FrameTexture& i : frame_texture) { - for (Render::FrameTextureData& j : i.data) { - j.texture = 0; - j.render_texture.destroy(); - j.type = FRAME_TEXTURE_MAX; - } - - i.capture = false; - } - } - - int32_t Render::frame_texture_load(int32_t slot, Render::FrameTextureType type, texture* tex) { - if (!tex || slot < 0 || slot >= 6) - return -1; - - for (Render::FrameTextureData& i : frame_texture[slot].data) - if (!i.texture) { - i.render_texture.attach_texture(tex->glid); - i.texture = tex; - i.type = type; - return (int32_t)(&i - frame_texture[slot].data); - } - return -1; - } - - void Render::frame_texture_reset() { - for (Render::FrameTexture& i : frame_texture) { - for (Render::FrameTextureData& j : i.data) { - j.texture = 0; - j.type = FRAME_TEXTURE_MAX; - } - - i.capture = false; - } - } - - bool Render::frame_texture_slot_capture_set(int32_t index) { - if (index < 1 || index >= 5) - return false; - - frame_texture[index].capture = true; - return true; - } - - bool Render::frame_texture_unload(int32_t slot, texture* tex) { - if (!tex || slot < 0 || slot >= 6) - return false; - - for (Render::FrameTextureData& i : frame_texture[slot].data) - if (i.texture == tex) { - i.render_texture.destroy(); - i.texture = 0; - i.type = FRAME_TEXTURE_MAX; - return true; - } - return false; - } - - void Render::free() { - if (transparency) { - delete transparency; - transparency = 0; + rend_data_ctx.state.active_bind_texture_2d(0, exposure_txhd->glid); + if (reset_exposure) + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, 0, 0, 0, 0, exposure_tex_width, 1); + else + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, exposure_write_index, 0, 0, 0, 1, 1); + exposure_write_index = (exposure_write_index + 1) % exposure_tex_width; } - for (int32_t i = 0; i < 1; i++) - if (transparency_tex[i]) { - texture_release(transparency_tex[i]); - transparency_tex[i] = 0; - texture_counter--; - } - - if (dof) { - delete dof; - dof = 0; - } - - if (!texture_counter) - return; - - for (int32_t i = 0; i < downsample_max_count; i++) - rend_texture[i].destroy(); - - for (int32_t i = 0; i < 3; i++) { - taa_buffer[i].destroy(); - - if (taa_tex[i]) { - texture_release(taa_tex[i]); - taa_tex[i] = 0; - texture_counter--; - } - } - - composite_back_texture.destroy(); - - if (composite_back_tex) { - texture_release(composite_back_tex); - composite_back_tex = 0; - texture_counter--; - } - - mlaa_buffer.destroy(); - temp_buffer.destroy(); - - sss_contour_texture = 0; - - downsample_texture.destroy(); - field_3E8.destroy(); - - for (int32_t i = 0; i < 5; i++) - reduce_texture->destroy(); - - for (int32_t i = 0; i < 5; i++) - if (reduce_tex[i]) { - texture_release(reduce_tex[i]); - reduce_tex[i] = 0; - texture_counter--; - } - - if (exposure_history) { - texture_release(exposure_history); - exposure_history = 0; - texture_counter--; - } - - exposure_texture.destroy(); - - if (exposure_tex) { - glDeleteTextures(1, &exposure_tex); - exposure_tex = 0; - } - - if (tonemap_lut_texture) { - glDeleteTextures(1, &tonemap_lut_texture); - tonemap_lut_texture = 0; - } - - if (mlaa_area_texture) { - glDeleteTextures(1, &mlaa_area_texture); - mlaa_area_texture = 0; - } - - glDeleteQueries(3, lens_shaft_query); - glDeleteQueries(3, lens_flare_query); - - for (ExposureCharaData& i : exposure_chara_data) { - glDeleteQueries(3, i.query); - i.query[0] = 0; - } + rend_data_ctx.state.set_viewport(0, 0, 1, 1); + exposure_avg_fbo.begin_render(rend_data_ctx.state); + rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 2; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); + rend_data_ctx.state.active_bind_texture_2d(0, exposure_txhd->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - bool Render::get_auto_exposure() { - return auto_exposure; - } - - int32_t Render::get_cam_blur() { - return cam_blur; - } - - void Render::get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio) { - focus = dof_pv_data.f2.focus; - focus_range = dof_pv_data.f2.focus_range; - fuzzing_range = dof_pv_data.f2.fuzzing_range; - ratio = dof_pv_data.f2.ratio; - } - - bool Render::get_dof_enable() { - return dof_pv_data.enable; - } - - bool Render::get_dof_update() { - return dof_pv_data.update; - } - - float_t Render::get_exposure() { - return exposure; - } - - float_t Render::get_exposure_rate() { - return exposure_rate; - } - - float_t Render::get_gamma() { - return gamma; - } - - float_t Render::get_gamma_rate() { - return gamma_rate; - } - - vec3 Render::get_lens() { - vec3 value; - value.x = lens_flare; - value.y = lens_shaft; - value.z = lens_ghost; - return value; - } - - float_t Render::get_lens_flare_appear_power() { - return lens_flare_appear_power; - } - - float_t Render::get_lens_flare_power() { - return lens_flare_power; - } - - vec3 Render::get_intensity() { - return intensity; - } - - Render::MagFilterType Render::get_mag_filter() { - return mag_filter; - } - - int32_t Render::get_mlaa() { - return mlaa; - } - - vec3 Render::get_radius() { - return radius; - } - - void Render::get_render_resolution(float_t* render_width, float_t* render_height, - float_t* render_post_width, float_t* render_post_height) { - if (render_width) - *render_width = (float_t)this->render_width[0]; - if (render_height) - *render_height = (float_t)this->render_height[0]; - if (render_post_width) - *render_post_width = (float_t)this->render_post_width[0]; - if (render_post_height) - *render_post_height = (float_t)this->render_post_height[0]; - } - - float_t Render::get_saturate_coeff() { - return saturate_coeff[0]; - } - - int32_t Render::get_saturate_power() { - return saturate_power; - } - - vec4 Render::get_scene_fade() { - vec4 scene_fade; - *(vec3*)&scene_fade = scene_fade_color[0]; - scene_fade.w = scene_fade_alpha[0]; - return scene_fade; - } - - float_t Render::get_scene_fade_alpha() { - return scene_fade_alpha[0]; - } - - int32_t Render::get_scene_fade_blend_func() { - return scene_fade_blend_func[0]; - } - - vec3 Render::get_scene_fade_color() { - return scene_fade_color[0]; - } - - int32_t Render::get_taa() { - return taa; - } - - vec2 Render::get_taa_offset() { - if (taa) { - float_t offset = taa_texture_selector == 1 ? -0.25f : 0.25f; - return (offset * -2.0f) / vec2((float_t)render_width[0], (float_t)render_height[0]); - } - return 0.0; - } - - tone_map_method Render::get_tone_map() { - return tone_map; - } - - void Render::get_tone_trans(vec3& start, vec3& end) { - start = tone_trans_start[0]; - end = tone_trans_end[0]; - } - - void Render::init_render_buffers(int32_t width, int32_t height, - int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask) { - this->ssaa = ssaa; - this->hd_res = hd_res; - this->ss_alpha_mask = ss_alpha_mask; - - mlaa = 1; - taa = ssaa || ss_alpha_mask ? 0 : 1; - mag_filter = hd_res ? MAG_FILTER_SHARPEN_4_TAP : MAG_FILTER_BILINEAR; - - this->width = width; - this->height = height; - - if (ssaa) { - inner_width = 2 * width; - inner_height = 2 * height; - } - else { - inner_width = width; - inner_height = height; - } - - screen_x_offset = 0; - screen_y_offset = 0; - - screen_width = width; - screen_height = height; - reduce_width[0] = 256; - reduce_height[0] = 144; - reduce_width[1] = 128; - reduce_height[1] = 72; - reduce_width[2] = 64; - reduce_height[2] = 36; - reduce_width[3] = 32; - reduce_height[3] = 18; - reduce_width[4] = 8; - reduce_height[4] = 8; - - update_res(true, 1); - - rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - - gl_state.bind_texture_2d(rend_texture[0].get_texture_glid()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid()); - GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - gl_state.bind_texture_2d(0); - - for (int32_t i = 0; i < 3; i++) { - taa_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), - GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid()); - } - - composite_back_tex = texture_load_tex_2d(texture_id(0x25, texture_counter++), - GL_RGBA8, render_post_width[0], render_post_height[0], 0, 0, 0); - composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid()); - - mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); - temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); - sss_contour_texture = &mlaa_buffer; - - gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid()); - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - gl_state.bind_texture_2d(0); - - for (int32_t i = 1; i < downsample_count; i++) { - rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - - gl_state.bind_texture_2d(rend_texture[i].get_texture_glid()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - gl_state.bind_texture_2d(0); - } - - downsample_texture.create_texture(reduce_width[0], reduce_height[0], 0, GL_RGBA16F, GL_ZERO); - - gl_state.bind_texture_2d(downsample_texture.get_texture_glid()); - const vec4 border_color = 0.0f; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - gl_state.bind_texture_2d(0); - - field_3E8.create_texture(512, 256, 0, GL_RGBA8, GL_ZERO); - - dof = new renderer::DOF3(render_post_width[0], render_post_height[0]); - - for (int32_t i = 0; i < 1; i++) - transparency_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), - GL_RGBA16F, render_post_width[0], render_post_height[0], 0, 0, 0); - - transparency = new renderer::Transparency(transparency_tex[0]->glid, - rend_texture[0].get_depth_texture_glid(), render_post_width[0], render_post_height[0]); - } - - void Render::init_post_process_buffers() { - for (int32_t i = 0; i < 5; i++) { - reduce_tex[i] = texture_load_tex_2d(texture_id(0x25, texture_counter++), - GL_RGBA16F, reduce_width[i], reduce_height[i], 0, 0, 0); - gl_state.bind_texture_2d(reduce_tex[i]->glid); - - const vec4 border_color = 0.0f; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - } - gl_state.bind_texture_2d(0); - - reduce_texture[0].attach_texture(reduce_tex[0]->glid); - - exposure_history = texture_load_tex_2d(texture_id(0x25, texture_counter++), - GL_RGBA16F, 32, 2, 0, 0, 0); - - glGenTextures(1, &exposure_tex); - gl_state.bind_texture_2d(exposure_tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 2, 2, 0, GL_RGBA, GL_FLOAT, 0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - gl_state.bind_texture_2d(0); - - exposure_texture.attach_texture(exposure_tex); - - glGenTextures(1, &tonemap_lut_texture); - gl_state.bind_texture_2d(tonemap_lut_texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, 0, GL_RG, GL_HALF_FLOAT, 0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - const GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - gl_state.bind_texture_2d(0); - - generate_mlaa_area_texture(); - - glGenQueries(3, lens_shaft_query); - glGenQueries(3, lens_flare_query); - - for (GLuint& i : lens_shaft_query_data) - i = -1; - - for (GLuint& i : lens_flare_query_data) - i = -1; - - for (ExposureCharaData& i : exposure_chara_data) { - glGenQueries(3, i.query); - for (GLuint& j : i.query_data) - j = -1; - } - } - - int32_t Render::movie_texture_set(texture* movie_texture) { - if (!movie_texture) - return -1; - - int32_t index = 0; - while (movie_textures_data[index]) - if (++index >= 1) - return -1; - - movie_textures_data[index] = movie_texture; - movie_textures[index].attach_texture(movie_texture->glid); - return index; - } - - void Render::movie_texture_free(texture* movie_texture) { - if (!movie_texture) - return; - - int32_t index = 0; - while (movie_textures_data[index] != movie_texture) - if (++index >= 1) - return; - - movie_textures_data[index] = 0; - movie_textures[index].destroy(); - } - - void Render::post_proc() { - lens_flare_texture = 0; - composite_back = 0; - } - - void Render::pre_proc(render_data_context& rend_data_ctx) { - cam_data& cam = rctx_ptr->render_manager->cam; - - view_point_prev = view_point; - interest_prev = interest; - view_point = cam.get_view_point(); - interest = cam.get_interest(); - - stage_index_prev = stage_index; - if (task_stage_is_modern) - stage_index = (int32_t)task_stage_modern_get_current_stage_hash(); - else - stage_index = task_stage_get_current_stage_index(); - - cam_view_projection_prev = cam_view_projection; - cam_view_projection = cam.get_view_proj_mat(); - - reset_exposure = rctx_ptr->camera->fast_change_hist1 && !rctx_ptr->camera->fast_change_hist0; - if (reset_exposure) { - float_t view_point_dist = vec3::distance(view_point, view_point_prev); - - vec3 dir = vec3::normalize(interest - view_point); - vec3 dir_prev = vec3::normalize(interest_prev - view_point_prev); - - float_t dir_diff_angle = vec3::dot(dir, dir_prev); - if (dir_diff_angle < 0.5f) - dir_diff_angle = 0.0f; - if (view_point_dist < dir_diff_angle * 0.4f) - reset_exposure = false; - } - else if (stage_index != stage_index_prev) - reset_exposure = true; - - if (movie_textures_data[0]) { - extern texture* task_movie_get_texture(int32_t index = 0); - texture* tex = task_movie_get_texture(); - if (tex) { - movie_textures[0].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); - rend_data_ctx.state.set_viewport(0, 0, movie_textures_data[0]->width, movie_textures_data[0]->height); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(rend_data_ctx, tex->width, tex->height, - 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - movie_textures[0].end_render(rend_data_ctx.state); - } - } - - for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { - render_data_context rend_data_ctx((gl_rend_state_index)i); - rend_data_ctx.set_scene_framebuffer_size( - render_width[0], render_height[0], render_width[0], render_height[0]); - } - } - - int32_t Render::render_texture_set(texture* render_texture, bool task_photo) { - if (!render_texture) - return -1; - - int32_t index = 0; - if (task_photo) - index = 15; - else - while (render_textures_data[index]) - if (++index >= 15) - return -1; - - render_textures_data[index] = render_texture; - render_textures[index].attach_texture(render_texture->glid); - return index; - } - - void Render::render_texture_free(texture* render_texture, bool task_photo) { - if (!render_texture) - return; - - int32_t index = 0; - if (task_photo) - index = 15; - else - while (render_textures_data[index] != render_texture) - if (++index >= 15) - return; - - render_textures_data[index] = 0; - render_textures[index].destroy(); - } - - void Render::reset_saturate_coeff(int32_t index, bool lock) { - set_saturate_coeff(1.0f, index, lock); - - if (index == 1) - saturate_index = 0; - } - - void Render::reset_scene_fade(int32_t index) { - scene_fade_color[index] = 0.0f; - scene_fade_alpha[index] = 0.0f; - scene_fade_blend_func[index] = 0; - - if (index == 1) - scene_fade_index = 0; - update = 1; - } - - void Render::reset_tone_trans(int32_t index) { - tone_trans_scale[index] = 1.0f; - tone_trans_offset[index] = 0.0f; - tone_trans_start[index] = 0.0f; - tone_trans_end[index] = 1.0f; - - if (index == 1) - tone_trans_index = 0; - update = 1; - } - - void Render::resize(int32_t width, int32_t height) { - this->width = width; - this->height = height; - - if (ssaa) { - inner_width = 2 * width; - inner_height = 2 * height; - } - else { - inner_width = width; - inner_height = height; - } - - screen_x_offset = 0; - screen_y_offset = 0; - - screen_width = width; - screen_height = height; - - update_res(true, 1); - - rend_texture[0].create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); - - gl_state.bind_texture_2d(rend_texture[0].get_texture_glid()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - - gl_state.bind_texture_2d(rend_texture[0].get_depth_texture_glid()); - GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - - for (int32_t i = 0; i < 3; i++) { - texture_id id = taa_tex[i]->id; - texture_release(taa_tex[i]); - taa_tex[i] = texture_load_tex_2d(id, GL_RGBA8, - render_post_width[0], render_post_height[0], 0, 0, 0); - taa_buffer[i].attach_texture(taa_tex[i]->glid, 0, rend_texture[0].get_depth_texture_glid()); - } - - texture_id composite_back_tex_id = composite_back_tex->id; - texture_release(composite_back_tex); - composite_back_tex = texture_load_tex_2d(composite_back_tex_id, GL_RGBA8, - render_post_width[0], render_post_height[0], 0, 0, 0); - composite_back_texture.attach_texture(composite_back_tex->glid, 0, rend_texture[0].get_depth_texture_glid()); - - mlaa_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); - temp_buffer.create_texture(render_post_width[0], render_post_height[0], 0, GL_RGBA8, GL_ZERO); - sss_contour_texture = &mlaa_buffer; - - gl_state.bind_texture_2d(mlaa_buffer.get_depth_texture_glid()); - glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); - - for (int32_t i = 1; i < downsample_count; i++) { - rend_texture[i].create_texture(render_post_width[i], render_post_height[i], 0, GL_RGBA16F, GL_ZERO); - - gl_state.bind_texture_2d(rend_texture[i].get_texture_glid()); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } - - dof->resize(render_post_width[0], render_post_height[0]); - - for (int32_t i = 0; i < 1; i++) { - texture_id id = transparency_tex[i]->id; - texture_release(transparency_tex[i]); - transparency_tex[i] = texture_load_tex_2d(id, GL_RGBA16F, - render_post_width[0], render_post_height[0], 0, 0, 0); - } - - transparency->resize(transparency_tex[0]->glid, rend_texture[0].get_depth_texture_glid(), - render_post_width[0], render_post_height[0]); - } - - void Render::set_auto_exposure(bool value) { - auto_exposure = value; - update = 1; - } - - void Render::set_cam_blur(int32_t value) { - cam_blur = value; - update = 1; - } - - void Render::set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio) { - dof_pv_data.f2.focus = focus; - dof_pv_data.f2.focus_range = focus_range; - dof_pv_data.f2.ratio = ratio; - dof_pv_data.f2.fuzzing_range = fuzzing_range; - } - - void Render::set_dof_enable(bool value) { - dof_pv_data.enable = value; - } - - void Render::set_dof_update(bool value) { - dof_pv_data.update = value; - } - - void Render::set_exposure(float_t value) { - exposure = value; - update = 1; - } - - void Render::set_exposure_rate(float_t value) { - exposure_rate = value; - update = 1; - } - - void Render::set_gamma(float_t value) { - if (value != gamma) { - gamma = value; - update_lut = 1; - } - } - - void Render::set_gamma_rate(float_t value) { - if (value != gamma_rate) { - gamma_rate = value; - update_lut = 1; - } - } - - void Render::set_intensity(const vec3& value) { - intensity = vec3::clamp(value, 0.0f, 2.0f); - update = 1; - } - - void Render::set_lens(vec3 value) { - lens_flare = value.x; - lens_shaft = value.y; - lens_ghost = value.z; - update = 1; - } - - void Render::set_mag_filter(MagFilterType value) { - mag_filter = value; - update = 1; - } - - void Render::set_mlaa(int32_t value) { - mlaa = value; - update = 1; - } - - void Render::set_radius(const vec3& value) { - radius = vec3::clamp(value, 1.0f, 3.0f); - update = 1; - } - - void Render::set_saturate_coeff(float_t value, int32_t index, bool lock) { - if (saturate_lock) - return; - - saturate_coeff[index] = value; - update_lut = 1; - update = 1; - - if (lock) { - saturate_lock = 1; - saturate_index = 0; - } - else if (index == 1) - saturate_index = 1; - } - - void Render::set_saturate_power(int32_t value) { - if (value != saturate_power) { - saturate_power = value; - update_lut = 1; - } - } - - void Render::set_scene_fade(const vec4& value, int32_t index) { - scene_fade_color[index] = *(vec3*)&value; - scene_fade_alpha[index] = value.w; - - if (index == 1) - scene_fade_index = 1; - update = true; - } - - void Render::set_scene_fade_alpha(float_t value, int32_t index) { - scene_fade_alpha[index] = value; - - if (index == 1) - scene_fade_index = 1; - update = 1; - } - - void Render::set_scene_fade_blend_func(int32_t value, int32_t index) { - if (value < 0 || value > 2) - return; - - scene_fade_blend_func[index] = value; - - if (index == 1) - scene_fade_index = 1; - update = 1; - } - - void Render::set_scene_fade_color(const vec3& value, int32_t index) { - scene_fade_color[index] = value; - - if (index == 1) - scene_fade_index = 1; - update = 1; - } - - void Render::set_screen_res(int32_t x_offset, int32_t y_offset, int32_t width, int32_t height) { - screen_x_offset = x_offset; - screen_y_offset = y_offset; - screen_width = min_def(width, this->width); - screen_height = min_def(height, this->height); - - update_res(false, -1); - update = 1; - } - - void Render::set_taa(int32_t value) { - taa = value; - taa_blend = -1.0f; - update = 1; - } - - void Render::set_tone_map(tone_map_method value) { - tone_map = value; - } - - void Render::set_tone_trans(const vec3& start, const vec3& end, int32_t index) { - for (int32_t i = 0; i < 3; i++) - if (fabsf((&end.x)[i] - (&start.x)[i]) < 0.0001f) { - reset_tone_trans(0); - return; - } - - tone_trans_end[index] = end; - tone_trans_start[index] = start; - - vec3 scale = vec3::rcp(end - start); - tone_trans_scale[index] = scale; - tone_trans_offset[index] = -(scale * start); - - if (index == 1) - tone_trans_index = 1; - update = 1; - } - - void Render::downsample(render_data_context& rend_data_ctx) { + // 0x1404B11F0 + void Render::reduce_texture(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 1; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - for (int32_t i = 1; i < downsample_count - 1; i++) { - rend_texture[i].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[i - 1].get_texture_glid()); + for (int32_t i = 1; i < fb_level - 1; i++) { + fb_fbo[i].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, fb_fbo[i - 1].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - rend_data_ctx.state.set_viewport(0, 0, render_width[i], render_height[i]); + rend_data_ctx.state.set_viewport(0, 0, fb_width[i], fb_height[i]); draw_quad(rend_data_ctx, - render_post_width[i - 1], render_post_height[i - 1], - render_post_width_scale, render_post_height_scale, + fb_tex_width[i - 1], fb_tex_height[i - 1], + fb_tex_width_scale, fb_tex_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 3; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - int32_t downsample = max_def(downsample_count - 2, 0); - rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, rend_texture[downsample].get_texture_glid()); + int32_t downsample = max_def(fb_level - 2, 0); + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[0], fb_work_height[0]); + blur_fbo[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, fb_fbo[downsample].get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); draw_quad(rend_data_ctx, - render_post_width[downsample], render_post_height[downsample], - render_post_width_scale, render_post_height_scale, + fb_tex_width[downsample], fb_tex_height[downsample], + fb_tex_width_scale, fb_tex_height_scale, 0.0f, 0.0f, 1.0f, 1.1f, 1.1f, 1.1f, 0.0f); - downsample_texture.begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid); + work_fbo.begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[0]->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); for (int32_t i = 1; i < 5; i++) { float_t scale; @@ -1554,170 +302,106 @@ namespace rndr { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); } - rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - draw_quad(rend_data_ctx, reduce_width[i - 1], reduce_height[i - 1], + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[i], fb_work_height[i]); + draw_quad(rend_data_ctx, fb_work_width[i - 1], fb_work_height[i - 1], 1.0f, 1.0f, 0.0f, 0.0f, scale, 1.0f, 1.0f, 1.0f, 1.0f); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[i]->glid); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); + 0, 0, 0, 0, 0, fb_work_width[i], fb_work_height[i]); } } - // 0x1404A93B0 - void Render::begin_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt) { - transparency->begin_render(rend_data_ctx, rt->get_texture_glid()); + // 0x1404AEAF0 + void Render::handle_blur_texture(render_data_context& rend_data_ctx) { + render_context* rctx = rctx_ptr; + + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + rend_data_ctx.shader_flags.arr[U_GAUSS] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); + set_gauss_coef(rend_data_ctx, 1.0f, 1.0f, 7, 0.8f, 1.0f); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->gaussian_coef_ubo); + + work_fbo.begin_render(rend_data_ctx.state); + for (int32_t i = 1; i < 4; i++) { + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[i], fb_work_height[i]); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[i]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, fb_work_width[i], fb_work_height[i], + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f); + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, + 0, 0, 0, 0, 0, fb_work_width[i], fb_work_height[i]); + } + + for (int32_t i = 1; i < 4; i++) { + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[i], fb_work_height[i]); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[i]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, fb_work_width[i], fb_work_height[i], + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, + 0, 0, 0, 0, 0, fb_work_width[i], fb_work_height[i]); + } + + rend_data_ctx.shader_flags.arr[U_GAUSS] = 1; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); + + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[0], fb_work_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, blur_txhd[0]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, fb_work_width[0], fb_work_height[0], + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, + filter_inten[0] * 0.5f, filter_inten[1] * 0.5f, filter_inten[2] * 0.5f, 1.0f); + + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 7; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + + rend_data_ctx.state.set_viewport(0, 0, fb_work_width[0], fb_work_height[0]); + blur_fbo[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, work_fbo.get_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(1, blur_txhd[1]->glid); + rend_data_ctx.state.active_bind_texture_2d(2, blur_txhd[2]->glid); + rend_data_ctx.state.active_bind_texture_2d(3, blur_txhd[3]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(2, rctx->render_samplers[2]); + rend_data_ctx.state.bind_sampler(3, rctx->render_samplers[2]); + draw_quad(rend_data_ctx, fb_work_width[3], fb_work_height[3], + 1.0f, 1.0f, 0.0f, 0.0f, 0.25f, 0.15f, 0.25f, 0.25f, 0.25f); + bloom_tex = blur_txhd[0]->glid; } - // 0x1404AE6A0 - void Render::end_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha) { - transparency->end_render(rend_data_ctx, rt, alpha); - } - - void Render::update_res(bool set, int32_t base_downsample) { - int32_t hd_res_widths[4]; - int32_t hd_res_heights[4]; - hd_res_widths[0] = 1280; - hd_res_heights[0] = 720; - hd_res_widths[1] = 1024; - hd_res_heights[1] = 576; - hd_res_widths[2] = 1024; - hd_res_heights[2] = 576; - hd_res_widths[3] = 960; - hd_res_heights[3] = 544; - - base_downsample = min_def(base_downsample, 3); - - if (set) - this->base_downsample = base_downsample; + // 0x1404AFFD0 + static float_t mlaa_calc_area_tex_val(int32_t a1, int32_t a2) { + float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5)); + float_t v3 = (float_t)a1 * v2 + 0.5f; + if (a1 >= a2 - 1) + return (v3 * 0.5f) * 0.5f; else - base_downsample = max_def(base_downsample, this->base_downsample); + return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f; + }; - base_downsample = clamp_def(base_downsample, 0, 3); - - int32_t hd_res_width = hd_res_widths[base_downsample]; - int32_t hd_res_height = hd_res_heights[base_downsample]; - if (hd_res && (screen_width > hd_res_width || screen_height > hd_res_height)) { - render_width[0] = hd_res_width; - render_height[0] = hd_res_height; - - if (set) { - inner_width = render_width[0]; - inner_height = render_height[0]; - } - } - else { - float_t round_val = ssaa ? 1.0f : 16.0f; - render_width[0] = (int32_t)(prj::ceilf((float_t)screen_width - * (float_t)inner_width / (float_t)width * (1.0f / round_val)) * round_val); - render_height[0] = (int32_t)(prj::ceilf((float_t)screen_height - * (float_t)inner_height / (float_t)height * (1.0f / round_val)) * round_val); - } - - int32_t downsample = 1; - for (int32_t i = 0; i < 4; i++) { - int32_t width = (render_width[i] + 1) / 2; - int32_t height = (render_height[i] + 1) / 2; - if (width <= reduce_width[0] && height <= reduce_height[0]) - break; - - render_width[i + 1] = width; - render_height[i + 1] = height; - downsample++; - } - this->downsample_count = downsample; - - if (set) { - downsample_max_count = downsample; - for (int32_t i = 0; i < downsample; i++) { - render_post_width[i] = render_width[i]; - render_post_height[i] = render_height[i]; - } - } - - render_post_width_scale = (float_t)render_width[0] / (float_t)render_post_width[0]; - render_post_height_scale = (float_t)render_height[0] / (float_t)render_post_height[0]; - - for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { - render_data_context rend_data_ctx((gl_rend_state_index)i); - rend_data_ctx.set_scene_framebuffer_size( - render_width[0], render_height[0], render_width[0], render_height[0]); - } - - taa_blend = -1.0f; - } - - void Render::apply_mlaa(render_data_context& rend_data_ctx, - int32_t destination, int32_t source, int32_t ss_alpha_mask) { - rend_data_ctx.state.begin_event("PostProcess::mlaa"); - if (mlaa) { - mlaa_buffer.begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); - rend_data_ctx.shader_flags.arr[U_MLAA] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - temp_buffer.begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, mlaa_buffer.get_texture_glid()); - rend_data_ctx.state.active_bind_texture_2d(1, mlaa_area_texture); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); - rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[3]); - rend_data_ctx.shader_flags.arr[U_MLAA] = 1; - rend_data_ctx.shader_flags.arr[U_MLAA_SEARCH] = 2; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - taa_buffer[destination].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); - rend_data_ctx.state.active_bind_texture_2d(1, temp_buffer.get_texture_glid()); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); - rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[1]); - rend_data_ctx.shader_flags.arr[U_MLAA] = 2; - rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; - rend_data_ctx.state.active_bind_texture_2d(0, 0); - rend_data_ctx.state.active_bind_texture_2d(1, 0); - } - else { - taa_buffer[destination].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, taa_tex[source]->glid); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(rend_data_ctx, render_post_width[0], render_post_height[0], - render_post_width_scale, render_post_height_scale, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - } - rend_data_ctx.state.end_event(); - } - - void Render::apply_tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param) { + // 0x1404B2870 + void Render::tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param) { render_context* rctx = rctx_ptr; rend_data_ctx.state.begin_event("PostProcess::tone_map"); - update_tone_map_lut(rend_data_ctx.state); + set_tone_map_texture(rend_data_ctx.state); - int32_t fade_func = scene_fade_blend_func[scene_fade_index]; + int32_t fade_blend_func = this->fade_blend_func[fade_index]; vec4 fade_color; - *(vec3*)&fade_color = scene_fade_color[scene_fade_index]; - fade_color.w = scene_fade_alpha[scene_fade_index]; + fade_color.x = this->fade_color[fade_index][0]; + fade_color.y = this->fade_color[fade_index][1]; + fade_color.z = this->fade_color[fade_index][2]; + fade_color.w = fade_rate[fade_index]; if (fade_color.w <= 0.01) fade_color.w = 0.0f; - else if (fade_func == 1 || fade_func == 2) + else if (fade_blend_func == 1 || fade_blend_func == 2) *(vec3*)&fade_color *= fade_color.w; - float_t litproj_quality = 1.0; + float_t litproj_quality = 1.0f; GLuint litproj_tex = 0; if (light_proj_tex) @@ -1725,7 +409,7 @@ namespace rndr { GLuint composite_back_tex = 0; if (composite_back) - composite_back_tex = this->composite_back_tex->glid; + composite_back_tex = composite_back_txhd->glid; vec4 exposure; exposure.x = this->exposure * exposure_rate; @@ -1733,27 +417,32 @@ namespace rndr { exposure.z = this->exposure * exposure_rate * 0.5f; exposure.w = auto_exposure ? 1.0f : 0.0f; - float_t lens_flare_coef = (lens_flare * 2.0f) * (lens_flare_appear_power + lens_flare_power); - float_t lens_shaft_coef = lens_shaft * 2.0f; + float_t flare_coef = (this->flare_coef[0] * 2.0f) * (flare_alpha_offset + flare_alpha); + float_t shaft_coef = this->flare_coef[1] * 2.0f; - vec2 lens_flare_pos = *(vec2*)&this->lens_flare_pos; + vec3 tone_trans_scale = vec3(this->tone_trans_scale[tone_trans_index][0], + this->tone_trans_scale[tone_trans_index][1], this->tone_trans_scale[tone_trans_index][2]); + vec3 tone_trans_offset = vec3(this->tone_trans_offset[tone_trans_index][0], + this->tone_trans_offset[tone_trans_index][1], this->tone_trans_offset[tone_trans_index][2]); + vec2 flare_pos = *(vec2*)&this->flare_pos; - apply_tone_map(rend_data_ctx, 0, 0, render_width[0], render_height[0], - rend_texture[0].get_texture_glid(), reduce_tex_draw, composite_back_tex, litproj_tex, litproj_quality, - inner_width, inner_height, render_post_width_scale, render_post_height_scale, - exposure, tone_trans_scale[tone_trans_index], tone_trans_offset[tone_trans_index], fade_func, fade_color, - tone_map, gamma, lens_flare_pos, lens_shaft_scale, lens_flare_coef, lens_shaft_coef, - sss_contour_texture->get_texture_glid(), sss_contour_texture->get_depth_texture_glid(), rend_texture[0].get_depth_texture_glid(), + tone_map(rend_data_ctx, 0, 0, fb_width[0], fb_height[0], + fb_fbo[0].get_texture_glid(), bloom_tex, composite_back_tex, litproj_tex, litproj_quality, + fb_width_org, fb_height_org, fb_tex_width_scale, fb_tex_height_scale, + exposure, tone_trans_scale, tone_trans_offset, fade_blend_func, fade_color, + tone_map_method, gamma, flare_pos, flare_scale, flare_coef, shaft_coef, + contour_fbo->get_texture_glid(), contour_fbo->get_depth_texture_glid(), fb_fbo[0].get_depth_texture_glid(), npr_param == 1, false, rctx->render_manager->npr_mask); rend_data_ctx.state.end_event(); } - void Render::apply_tone_map(render_data_context& rend_data_ctx, int64_t a3, int64_t a4, + // Added + void Render::tone_map(render_data_context& rend_data_ctx, int64_t a3, int64_t a4, int32_t render_width, int32_t render_height, GLuint color_tex, GLuint bloom_tex, GLuint composite_back_tex, GLuint litproj_tex, float_t litproj_quality, int32_t width, int32_t height, float_t s0, float_t t0, const vec4& exposure, const vec3& tone_scale, const vec3& tone_offset, - int32_t fade_func, const vec4& fade_color, int32_t tone_map, float_t gamma, - const vec2& lens_flare_pos, float_t lens_shaft_scale, float_t lens_flare_coef, float_t lens_shaft_coef, + int32_t fade_blend_func, const vec4& fade_color, int32_t tone_map, float_t gamma, + const vec2& flare_pos, float_t flare_scale, float_t flare_coef, float_t shaft_coef, GLuint contour_color_tex, GLuint contour_depth_tex, GLuint scene_depth_tex, bool npr1, bool a31, bool npr_mask) { render_context* rctx = rctx_ptr; @@ -1767,9 +456,9 @@ namespace rndr { rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); rend_data_ctx.state.active_bind_texture_2d(1, bloom_tex); rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); - rend_data_ctx.state.active_bind_texture_2d(2, tonemap_lut_texture); + rend_data_ctx.state.active_bind_texture_2d(2, tone_map_tex); rend_data_ctx.state.bind_sampler(2, rctx->render_samplers[0]); - rend_data_ctx.state.active_bind_texture_2d(3, exposure_tex); + rend_data_ctx.state.active_bind_texture_2d(3, exposure_avg_tex); rend_data_ctx.state.bind_sampler(3, rctx->render_samplers[3]); if (composite_back) { @@ -1812,43 +501,43 @@ namespace rndr { tonemap_texcoord_transforms texcoord_transforms[2]; - if (lens_flare_texture) { + if (flare_textures[0]) { const float_t aspect = (float_t)height * (1.0f / (float_t)width); rend_data_ctx.shader_flags.arr[U_FLARE] = 1; - rend_data_ctx.state.active_bind_texture_2d(4, lens_flare_texture); + rend_data_ctx.state.active_bind_texture_2d(4, flare_textures[0]); rend_data_ctx.state.bind_sampler(4, rctx->render_samplers[2]); mat4 mat; mat4_translate(0.5f, 0.5f, 0.0f, &mat); mat4_scale_rot(&mat, 0.75f, 0.75f, 1.0f, &mat); - mat4_mul_rotate_z(&mat, lens_flare_pos.x * (1.0f / (float_t)width) + mat4_mul_rotate_z(&mat, flare_pos.x * (1.0f / (float_t)width) * (float_t)(25.0 * DEG_TO_RAD_FLOAT), &mat); - mat4_mul_translate(&mat, lens_flare_pos.x * (-1.0f / (float_t)width), - (lens_flare_pos.y - (float_t)height) * (1.0f / (float_t)width), 0.0f, &mat); + mat4_mul_translate(&mat, flare_pos.x * (-1.0f / (float_t)width), + (flare_pos.y - (float_t)height) * (1.0f / (float_t)width), 0.0f, &mat); mat4_scale_rot(&mat, 0.5f, 0.5f * aspect, 1.0f, &mat); mat4_mul_translate(&mat, 1.0f, 1.0f, 0.0f, &mat); texcoord_transforms[0].flare.transform_x = vec3(mat.row0.x, mat.row1.x, mat.row3.x); - texcoord_transforms[0].flare.coef = lens_flare_coef; + texcoord_transforms[0].flare.coef = flare_coef; texcoord_transforms[0].flare.transform_y = vec3(mat.row0.y, mat.row1.y, mat.row3.y); - if (lens_shaft_scale < 50.0f) { + if (flare_scale < 50.0f) { rend_data_ctx.shader_flags.arr[U_FLARE] = 2; - rend_data_ctx.state.active_bind_texture_2d(5, lens_shaft_texture); + rend_data_ctx.state.active_bind_texture_2d(5, flare_textures[1]); rend_data_ctx.state.bind_sampler(5, rctx->render_samplers[2]); mat4_translate(0.5f, 0.5f, 0.0f, &mat); - mat4_scale_rot(&mat, lens_shaft_scale, lens_shaft_scale, 1.0f, &mat); - mat4_mul_rotate_z(&mat, lens_flare_pos.x * (1.0f / (float_t)width) + mat4_scale_rot(&mat, flare_scale, flare_scale, 1.0f, &mat); + mat4_mul_rotate_z(&mat, flare_pos.x * (1.0f / (float_t)width) * (float_t)(60.0 * DEG_TO_RAD_FLOAT), &mat); - mat4_mul_translate(&mat, lens_flare_pos.x * (-1.0f / (float_t)width), - (lens_flare_pos.y - (float_t)height) * (1.0f / (float_t)width), 0.0f, &mat); + mat4_mul_translate(&mat, flare_pos.x * (-1.0f / (float_t)width), + (flare_pos.y - (float_t)height) * (1.0f / (float_t)width), 0.0f, &mat); mat4_scale_rot(&mat, 0.5f, 0.5f * aspect, 1.0f, &mat); mat4_mul_translate(&mat, 1.0f, 1.0f, 0.0f, &mat); texcoord_transforms[1].flare.transform_x = vec3(mat.row0.x, mat.row1.x, mat.row3.x); - texcoord_transforms[1].flare.coef = lens_shaft_coef; + texcoord_transforms[1].flare.coef = shaft_coef; texcoord_transforms[1].flare.transform_y = vec3(mat.row0.y, mat.row1.y, mat.row3.y); } else { @@ -1879,7 +568,7 @@ namespace rndr { shader_data.g_exposure = exposure; shader_data.g_fade_color = fade_color; *(vec3*)&shader_data.g_tone_scale = tone_scale; - shader_data.g_tone_scale.w = (float_t)fade_func; + shader_data.g_tone_scale.w = (float_t)fade_blend_func; *(vec3*)&shader_data.g_tone_offset = tone_offset; shader_data.g_tone_offset.w = gamma > 0.0f ? 2.0f / (gamma * 3.0f) : 0.0f; memcpy(shader_data.g_texcoord_transforms, texcoord_transforms, sizeof(vec4) * 4); @@ -1887,268 +576,1157 @@ namespace rndr { rend_data_ctx.state.write_uniform_buffer(rctx->tone_map_ubo, shader_data); rend_data_ctx.state.set_viewport(0, 0, render_width, render_height); - taa_buffer[2].begin_render(rend_data_ctx.state); + scr_fbo[num_scr_tex - 1].begin_render(rend_data_ctx.state); shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_TONEMAP); rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->tone_map_ubo); draw_quad(rend_data_ctx, width, height, v35, v36, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); rend_data_ctx.state.active_bind_texture_2d(2, 0); } - void Render::calc_exposure(render_data_context& rend_data_ctx, const cam_data& cam) { - render_context* rctx = rctx_ptr; - - bool v2 = false; - if (!reset_exposure) { - ExposureCharaData* chara_data = exposure_chara_data; - for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { - rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); - if (!rob_chr || !rob_chr->check_disp()) - continue; - - vec4 v34 = { 0.05f, 0.0f, -0.04f, 1.0f }; - vec4 v33 = { 1.0f, 0.0f, 0.0f, 0.0f }; - - mat4 v44 = mat4_identity; - rob_chr->sub_1405163C0(4, v44); - - mat4 v42; - mat4 v43; - mat4_mul(&v44, &cam.view_mat, &v42); - mat4_mul(&v42, &cam.proj_mat, &v43); - - vec4 v41; - vec4 v40; - mat4_transform_vector(&v42, &v34, &v41); - mat4_transform_vector(&v43, &v34, &v40); - - float_t v12 = 1.0f / v40.w; - float_t v13 = v40.x * v12; - float_t v14 = v40.y * v12; - if (v41.z >= 0.0f || fabsf(v13) >= 1.0f || fabsf(v14) >= 1.0f) - continue; - - float_t v31 = 0.5f - (fabsf(v14) - 1.0f) * 2.5f; - float_t v32 = 0.5f - (fabsf(v13) - 1.0f) * 2.5f; - - float_t v16 = min_def(min_def(v31, v32), 1.0f); - - vec4 v39; - mat4_transform_vector(&v42, &v33, &v39); - - float_t v17 = (v39.z + 1.0f) * 0.5f; - if (v17 > 0.8f) - v17 = 0.8f; - else if (v17 < 0.2f) - v17 = 0.0f; - - float_t v18 = (float_t)height / (float_t)width; - float_t v20 = tanf(cam.fov * 0.5f * DEG_TO_RAD_FLOAT); - float_t v21 = 0.25f / sqrtf(powf(v20 * 3.4f, 2.0f) * (v41.z * v41.z)); - float_t v22; - if (v21 < 0.055f) - v22 = max_def((v21 - 0.035f) * 50.0f, 0.0f); - else if (v21 > 0.5f) - v22 = max_def(1.0f - (v21 - 0.5f) * 3.3333333f, 0.0f); - else - v22 = 1.0f; - - chara_data->spot_coefficients[0].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[0].y = (v14 + v21 * 0.1f + 1.0f) * 0.5f; - chara_data->spot_coefficients[0].z = 0.0f; - chara_data->spot_coefficients[0].w = 4.0f; - chara_data->spot_coefficients[1].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[1].y = (v14 - v21 * 0.3f + 1.0f) * 0.5f; - chara_data->spot_coefficients[1].z = 0.0f; - chara_data->spot_coefficients[1].w = 4.0f; - chara_data->spot_coefficients[2].x = (v13 + v21 * -0.5f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[2].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; - chara_data->spot_coefficients[2].z = 0.0f; - chara_data->spot_coefficients[2].w = 3.0f; - chara_data->spot_coefficients[3].x = (v13 - v21 * 0.6f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[3].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; - chara_data->spot_coefficients[3].z = 0.0f; - chara_data->spot_coefficients[3].w = 2.0f; - chara_data->spot_coefficients[4].x = (v13 + v21 * 0.6f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[4].y = (v14 - v21 * 0.1f + 1.0f) * 0.5f; - chara_data->spot_coefficients[4].z = 0.0f; - chara_data->spot_coefficients[4].w = 2.0f; - chara_data->spot_coefficients[5].x = (v13 + v21 * 0.5f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[5].y = (v14 + v21 * -0.5f + 1.0f) * 0.5f; - chara_data->spot_coefficients[5].z = 0.0f; - chara_data->spot_coefficients[5].w = 3.0f; - chara_data->spot_coefficients[6].x = (v13 + v21 * 0.0f * v18 + 1.0f) * 0.5f; - chara_data->spot_coefficients[6].y = (v14 - v21 * 0.8f + 1.0f) * 0.5f; - chara_data->spot_coefficients[6].z = 0.0f; - chara_data->spot_coefficients[6].w = 3.0f; - chara_data->spot_weight = v16 * 1.6f * v17 * v22; - if (chara_data->spot_weight > 0.0f && !chara_data->query_data[exposure_query_index]) - v2 = true; + // 0x1404B0110 + void Render::mlaa_calc_area_value(float_t& val_left, float_t& val_right, + int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright) { + int32_t d = dleft + dright + 1; + float_t _val_left = 0.0f; + float_t _val_right = 0.0f; + switch (cross2) { + case 0: + switch (cross1) { + case 1: + _val_right = mlaa_calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); + break; + case 3: + _val_left = mlaa_calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); + break; } + break; + case 1: + switch (cross1) { + case 0: + _val_right = mlaa_calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); + break; + case 1: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_right = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_right = mlaa_calc_area_tex_val(dright, v12); + else + _val_right = mlaa_calc_area_tex_val(v15, v12) * 2.0f; + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft >= v12) + _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 3: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_left = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_right = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 4: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_left = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_right = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + } + break; + case 3: + switch (cross1) { + case 0: + _val_left = mlaa_calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); + break; + case 1: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_right = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_left = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 3: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_left = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_left = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = mlaa_calc_area_tex_val(v15, v12) * 2.0f; + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 4: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_right = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_left = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + } + break; + case 4: + switch (cross1) { + case 1: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_right = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_left = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 3: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_left = mlaa_calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_right = mlaa_calc_area_tex_val(dright, v12); + else + _val_left = _val_right = mlaa_calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + } + break; } - if (!v2 || reset_exposure) { - exposure_measure_shader_data exposure_measure = {}; - exposure_measure.g_spot_weight = { - exposure_chara_data[0].spot_weight, - exposure_chara_data[1].spot_weight, - exposure_chara_data[2].spot_weight, - exposure_chara_data[3].spot_weight - }; - - ExposureCharaData* chara_data = exposure_chara_data; - for (int32_t i = 0; i < 4 && i < ROB_ID_MAX; i++, chara_data++) - for (int32_t j = 0; j < 8; j++) - exposure_measure.g_spot_coefficients[i * 8 + j] = chara_data->spot_coefficients[j]; - rend_data_ctx.state.write_uniform_buffer(rctx->exposure_measure_ubo, exposure_measure); - - rend_data_ctx.state.set_viewport(0, 0, 32, 1); - downsample_texture.begin_render(rend_data_ctx.state); - - rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 1; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); - rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->exposure_measure_ubo); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[4]->glid); - rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[2]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); - rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); - draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - - rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); - if (reset_exposure) - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 32, 1); - else - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, 0, exposure_history_counter, 0, 0, 0, 1, 1); - exposure_history_counter = (exposure_history_counter + 1) % 32; - } - - rend_data_ctx.state.set_viewport(0, 0, 1, 1); - exposure_texture.begin_render(rend_data_ctx.state); - rend_data_ctx.shader_flags.arr[U_EXPOSURE] = 2; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_EXPOSURE); - rend_data_ctx.state.active_bind_texture_2d(0, exposure_history->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); - draw_quad(rend_data_ctx, 1, 1, 1.0f, 1.0f, - 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + val_left = _val_left; + val_right = _val_right; } - void Render::calc_gaussian_blur(render_data_context& rend_data_ctx, float_t start, float_t step, + // 0x1404B0040 + void Render::mlaa_calc_area_texture(uint8_t* data, int32_t cross1, int32_t cross2) { + uint8_t* _data = &data[(MLAA_SIDE_LEN * MLAA_GRID_SIDE_LEN * cross2 + MLAA_GRID_SIDE_LEN * cross1) * 2]; + for (int32_t dright = 0; dright < MLAA_GRID_SIDE_LEN; dright++) { + for (int32_t dleft = 0; dleft < MLAA_GRID_SIDE_LEN; dleft++) { + float_t val_left; + float_t val_right; + mlaa_calc_area_value(val_left, val_right, cross1, cross2, dleft, dright); + _data[0] = (uint8_t)(val_left * 255.9f); + _data[1] = (uint8_t)(val_right * 255.9f); + _data += 2; + } + _data += MLAA_GRID_SIDE_LEN * 4 * 2; + } + } + + // 0x1404B0440 + void Render::mlaa_gen_area_texture() { + uint8_t* data = force_malloc(MLAA_SIDE_LEN * MLAA_SIDE_LEN * 2); + if (!data) + return; + + for (int32_t cross2 = 0; cross2 < 5; cross2++) + for (int32_t cross1 = 0; cross1 < 5; cross1++) + mlaa_calc_area_texture(data, cross1, cross2); + + glGenTextures(1, &mlaa_area_tex); + gl_state.bind_texture_2d(mlaa_area_tex); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, MLAA_SIDE_LEN, MLAA_SIDE_LEN, 0, GL_RG, GL_UNSIGNED_BYTE, data); + gl_state.bind_texture_2d(0); + free_def(data); + } + + // 0x1404AFB30 + void Render::mlaa(render_data_context& rend_data_ctx, + int32_t destination, int32_t source, int32_t ss_alpha_mask) { + rend_data_ctx.state.begin_event("PostProcess::mlaa"); + if (morphological_anti_alias) { + mlaa_fbo.begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[source]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + + user_fbo.begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, mlaa_fbo.get_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(1, mlaa_area_tex); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[3]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 1; + rend_data_ctx.shader_flags.arr[U_MLAA_SEARCH] = 2; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + + scr_fbo[destination].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[source]->glid); + rend_data_ctx.state.active_bind_texture_2d(1, user_fbo.get_texture_glid()); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_MLAA] = 2; + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MLAA); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.active_bind_texture_2d(1, 0); + } + else { + scr_fbo[destination].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[source]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + } + rend_data_ctx.state.end_event(); + } + + // 0x1404B1DD0 + void Render::set_gauss_coef(render_data_context& rend_data_ctx, float_t start, float_t step, int32_t kernel_size, float_t radius_scale, float_t intensity_scale) { auto calculate_gaussian_kernel = [&](float_t* gaussian_kernel, - float_t radius, int32_t stride, int32_t offset) { - float_t first_val = (start - step * 0.5f) * 2.0f; - for (int32_t i = 0; i < kernel_size; i++) - gaussian_kernel[i * stride + offset] = 0.0f; + float_t sigma, int32_t stride, int32_t offset) { + float_t first_val = (start - step * 0.5f) * 2.0f; + for (int32_t i = 0; i < kernel_size; i++) + gaussian_kernel[i * stride + offset] = 0.0f; - float_t temp_gaussian_kernel[20]; - float_t s = radius * radius_scale; - s = 1.0f / (2.0f * s * s); + float_t temp_gaussian_kernel[20]; + float_t s = sigma * radius_scale; + s = 1.0f / (2.0f * s * s); - double_t sum = first_val; - temp_gaussian_kernel[0] = first_val; - float_t val = start; - for (size_t i = 1; i < kernel_size; i++) { - sum += temp_gaussian_kernel[i] = expf(-(val * val * s)) * step; - val += step; - } + double_t sum = first_val; + temp_gaussian_kernel[0] = first_val; + float_t val = start; + for (size_t i = 1; i < kernel_size; i++) { + sum += temp_gaussian_kernel[i] = expf(-(val * val * s)) * step; + val += step; + } - sum = 1.0f / sum; - for (size_t i = 0; i < kernel_size; i++) - gaussian_kernel[i * stride + offset] = (float_t)(temp_gaussian_kernel[i] * sum); + sum = 1.0f / sum; + for (size_t i = 0; i < kernel_size; i++) + gaussian_kernel[i * stride + offset] = (float_t)(temp_gaussian_kernel[i] * sum); }; vec3 gauss[20]; - calculate_gaussian_kernel((float_t*)gauss, radius.x, 3, 0); - calculate_gaussian_kernel((float_t*)gauss, radius.y, 3, 1); - calculate_gaussian_kernel((float_t*)gauss, radius.z, 3, 2); + calculate_gaussian_kernel((float_t*)gauss, sigma[0], 3, 0); + calculate_gaussian_kernel((float_t*)gauss, sigma[1], 3, 1); + calculate_gaussian_kernel((float_t*)gauss, sigma[2], 3, 2); - vec3 intensity = this->intensity * (intensity_scale * 0.5f); + const vec3 inten = vec3(filter_inten[0], filter_inten[1], filter_inten[2]) * (intensity_scale * 0.5f); gaussian_coef_shader_data gaussian_coef = {}; for (int32_t i = 0; i < kernel_size && i < 8; i++) { - *(vec3*)&gaussian_coef.g_coef[i] = gauss[i] * intensity; + *(vec3*)&gaussian_coef.g_coef[i] = gauss[i] * inten; gaussian_coef.g_coef[i].w = 0.0f; } rend_data_ctx.state.write_uniform_buffer(rctx_ptr->gaussian_coef_ubo, gaussian_coef); } - void Render::calc_taa_blend() { - taa_blend = 1.0f; + // 0x1404B23E0 + void Render::set_tone_map_texture(p_gl_rend_state& p_gl_rend_st) { + if (!recalc_tone_map) + return; - float_t view_point_dist = vec3::distance(view_point, view_point_prev); - float_t interest_dist = vec3::distance(interest, interest_prev); - float_t dist = max_def(view_point_dist, interest_dist); + recalc_tone_map = 0; + saturate_lock = 0; + + const float_t tone_map_scale = (float_t)(1.0 / (double_t)TONE_MAP_SAT_GAMMA_SAMPLES); + + vec2 tex_data[16 * TONE_MAP_SAT_GAMMA_SAMPLES]; + float_t gamma_power = gamma * gamma_rate * 1.5f; + int32_t saturate_power = this->saturate_power; + float_t saturate_coef = this->saturate_coef[saturate_index]; + + tex_data[0].x = 0.0f; + tex_data[0].y = 0.0f; + for (int32_t i = 1; i < tone_map_tex_width; i++) { + float_t gamma = powf(1.0f - expf((float_t)-i * tone_map_scale), gamma_power); + float_t saturation = gamma * 2.0f - 1.0f; + for (int32_t j = 0; j < saturate_power; j++) { + saturation *= saturation; + saturation *= saturation; + saturation *= saturation; + saturation *= saturation; + } + + tex_data[i].x = gamma; + tex_data[i].y = gamma * saturate_coef + * ((float_t)TONE_MAP_SAT_GAMMA_SAMPLES / (float_t)i) * (1.0f - saturation); + } + + if (GLAD_GL_VERSION_4_5) + p_gl_rend_st.texture_sub_image_2d(tone_map_tex, 0, 0, 0, + tone_map_tex_width, 1, GL_RG, GL_FLOAT, tex_data); + else { + p_gl_rend_st.bind_texture_2d(tone_map_tex); + p_gl_rend_st.tex_sub_image_2d(GL_TEXTURE_2D, 0, 0, 0, + tone_map_tex_width, 1, GL_RG, GL_FLOAT, tex_data); + } + } + + // 0x1404A8380 + Render::Render() : min_res(), ss_alpha_mask(), scr_txhd(), composite_back_txhd(), blur_txhd(), + bloom_tex(), exposure_avg_tex(), exposure_txhd(), tone_map_tex(), mlaa_area_tex(), + tex_count(), sun_queries_center(), sun_queries_sphere(), sun_pixels_center(), sun_pixels_sphere(), + query_read_index(), flare_textures(), num_ghosts(), scr_width(), scr_height(), fb_width_org(), fb_height_org(), + fb_width(), fb_height(), fb_tex_width(), fb_tex_height(), fb_tex_width_scale(), fb_tex_height_scale(), + fb_work_width(), fb_work_height(), scr_index(), scr_disp_index(), reset_exposure(), + view_x(), view_y(), view_w(), view_h(), saturate_lock(), exposure_write_index(), exposure_chara_write_index(), + flare_scale(), flare_alpha(), flare_alpha_enable(), flare_alpha_offset(), fb_copy_txhd(), + fb_movie_txhd(), composite_back(), dof(), transparency_tex(), transparency(), + saturate_index(), fade_index(), tone_trans_index(), saturate_coef(), + fade_color(), fade_rate(), fade_blend_func(), tone_trans_scale(), tone_trans_offset(), + tone_trans_start(), tone_trans_end(), tone_map_method(), mag_filter(), fade_tex_type(), update() { + exposure = 2.0f; + exposure_rate = 1.0f; + auto_exposure = 1; + + scr_tex_rate = -1.0f; + + stage_num = -1; + prev_stage_num = -1; + + reset_exposure = true; + + gamma = 1.0f; + gamma_rate = 1.0f; + + mag_filter = MAG_FILTER_BILINEAR; + + saturate_power = 1; + + for (int32_t i = 0; i < 2; i++) { + set_saturate_coef_default(i); + set_fade_color_default(i); + set_tone_trans_default(i); + } + + fade_tex_rate = -1.0f; + + recalc_tone_map = 1; + + flare_scale_default = 1.0f; + flare_coef[0] = 1.0f; + flare_coef[1] = 1.0f; + flare_coef[2] = 1.0f; + + sigma[0] = 2.0f; + sigma[1] = 2.0f; + sigma[2] = 2.0f; + filter_inten[0] = 1.0f; + filter_inten[1] = 1.0f; + filter_inten[2] = 1.0f; + + for (GLuint& i : sun_pixels_center) + i = -1; + + for (GLuint& i : sun_pixels_sphere) + i = -1; + } + + // 0x1404A8B20 + Render::~Render() { + if (composite_back_txhd) + texture_release(composite_back_txhd); + + if (dof) { + delete dof; + dof = 0; + } + + if (transparency) { + delete transparency; + transparency = 0; + } + } + + // 0x1404A9790 + void Render::calc_scr_tex_rate() { + scr_tex_rate = 1.0f; + + float_t pos_dist = vec3::distance(cam_pos, prev_cam_pos); + float_t intr_dist = vec3::distance(cam_intr, prev_cam_intr); + float_t dist = max_def(pos_dist, intr_dist); if (!reset_exposure) { if (dist < 0.0001f) - taa_blend = 0.5f; + scr_tex_rate = 0.5f; else if (dist < 0.005f) - taa_blend = 0.75f; + scr_tex_rate = 0.75f; else if (dist < 0.03f) - taa_blend = 0.875f; + scr_tex_rate = 0.875f; else if (dist <= 0.05f && cam_blur) - taa_blend = 0.999f; + scr_tex_rate = 0.999f; } } - void Render::copy_to_frame_texture(render_data_context& rend_data_ctx, - GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex) { - for (Render::FrameTexture& i : frame_texture) { - if (!i.capture) - continue; + // 0x1404AB0C0 + void Render::create_render_buffer(int32_t width, int32_t height, + int32_t aa, int32_t minify, int32_t ss_alpha_mask) { + anti_alias = aa; + min_render = minify; + this->ss_alpha_mask = ss_alpha_mask; - for (auto& j : i.data) { - if (!j.texture || j.render_texture.begin_render(rend_data_ctx.state) < 0) - continue; + morphological_anti_alias = 1; + temporal_anti_alias = aa || ss_alpha_mask ? 0 : 1; + mag_filter = minify ? MAG_FILTER_SHARPEN_4_TAP : MAG_FILTER_BILINEAR; - texture* dst_tex = j.texture; + scr_width = width; + scr_height = height; - rend_data_ctx.state.active_bind_texture_2d(0, j.type == FRAME_TEXTURE_PRE_PP ? pre_pp_tex : post_pp_tex); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); - rend_data_ctx.state.set_viewport(0, 0, dst_tex->width, dst_tex->height); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - draw_quad(rend_data_ctx, dst_tex->width, dst_tex->height, - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - j.render_texture.end_render(rend_data_ctx.state); + if (aa) { + fb_width_org = 2 * width; + fb_height_org = 2 * height; + } + else { + fb_width_org = width; + fb_height_org = height; + } + + view_x = 0; + view_y = 0; + + view_w = width; + view_h = height; + + fb_work_width[0] = 256; + fb_work_height[0] = 144; + fb_work_width[1] = 128; + fb_work_height[1] = 72; + fb_work_width[2] = 64; + fb_work_height[2] = 36; + fb_work_width[3] = 32; + fb_work_height[3] = 18; + fb_work_width[4] = 8; + fb_work_height[4] = 8; + + calc_draw_size(true, 1); + + fb_fbo[0].create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); + + gl_state.bind_texture_2d(fb_fbo[0].get_texture_glid()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + gl_state.bind_texture_2d(fb_fbo[0].get_depth_texture_glid()); + GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + gl_state.bind_texture_2d(0); + + for (int32_t i = 0; i < num_scr_tex; i++) { + scr_txhd[i] = texture_load_tex_2d(texture_id(0x25, tex_count++), + GL_RGBA8, fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + scr_fbo[i].attach_texture(scr_txhd[i]->glid, 0, fb_fbo[0].get_depth_texture_glid()); + } + + composite_back_txhd = texture_load_tex_2d(texture_id(0x25, tex_count++), + GL_RGBA8, fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + composite_back_fbo.attach_texture(composite_back_txhd->glid, 0, fb_fbo[0].get_depth_texture_glid()); + + mlaa_fbo.create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); + user_fbo.create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA8, GL_ZERO); + contour_fbo = &mlaa_fbo; + + gl_state.bind_texture_2d(mlaa_fbo.get_depth_texture_glid()); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + gl_state.bind_texture_2d(0); + + for (int32_t i = 1; i < fb_level; i++) { + fb_fbo[i].create_texture(fb_tex_width[i], fb_tex_height[i], 0, GL_RGBA16F, GL_ZERO); + + gl_state.bind_texture_2d(fb_fbo[i].get_texture_glid()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + gl_state.bind_texture_2d(0); + } + + work_fbo.create_texture(fb_work_width[0], fb_work_height[0], 0, GL_RGBA16F, GL_ZERO); + + gl_state.bind_texture_2d(work_fbo.get_texture_glid()); + const vec4 border_color = 0.0f; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + gl_state.bind_texture_2d(0); + + fade_fbo.create_texture(fade_tex_width, fade_tex_height, 0, GL_RGBA8, GL_ZERO); + + dof = new renderer::DOF3(fb_tex_width[0], fb_tex_height[0]); + + for (int32_t i = 0; i < 1; i++) + transparency_tex[i] = texture_load_tex_2d(texture_id(0x25, tex_count++), + GL_RGBA16F, fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + + transparency = new renderer::Transparency(transparency_tex[0]->glid, + fb_fbo[0].get_depth_texture_glid(), fb_tex_width[0], fb_tex_height[0]); + } + + // 0x1404A9FF0 + void Render::create_other() { + for (int32_t i = 0; i < num_blur_tex; i++) { + blur_txhd[i] = texture_load_tex_2d(texture_id(0x25, tex_count++), + GL_RGBA16F, fb_work_width[i], fb_work_height[i], 0, 0, 0); + gl_state.bind_texture_2d(blur_txhd[i]->glid); + + const vec4 border_color = 0.0f; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (GLfloat*)&border_color); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + } + gl_state.bind_texture_2d(0); + + blur_fbo[0].attach_texture(blur_txhd[0]->glid); + + exposure_txhd = texture_load_tex_2d(texture_id(0x25, tex_count++), + GL_RGBA16F, exposure_tex_width, 2, 0, 0, 0); + + glGenTextures(1, &exposure_avg_tex); + gl_state.bind_texture_2d(exposure_avg_tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 2, 2, 0, GL_RGBA, GL_FLOAT, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + gl_state.bind_texture_2d(0); + + exposure_avg_fbo.attach_texture(exposure_avg_tex); + + glGenTextures(1, &tone_map_tex); + gl_state.bind_texture_2d(tone_map_tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, tone_map_tex_width, 1, 0, GL_RG, GL_HALF_FLOAT, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + const GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_GREEN }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + gl_state.bind_texture_2d(0); + + mlaa_gen_area_texture(); + + glGenQueries(num_queries, sun_queries_center); + glGenQueries(num_queries, sun_queries_sphere); + + for (GLuint& i : sun_pixels_center) + i = -1; + + for (GLuint& i : sun_pixels_sphere) + i = -1; + + for (ExposureCharaData& i : exposure_chara_data) { + glGenQueries(num_queries, i.query); + for (GLuint& j : i.query_data) + j = -1; + } + } + + // 0x1404AB900 + void Render::destroy() { + if (transparency) { + delete transparency; + transparency = 0; + } + + for (int32_t i = 0; i < 1; i++) + if (transparency_tex[i]) { + texture_release(transparency_tex[i]); + transparency_tex[i] = 0; + tex_count--; } - if (&i - frame_texture) - i.capture = false; + if (dof) { + delete dof; + dof = 0; + } + + if (!tex_count) + return; + + for (int32_t i = 0; i < blur_level; i++) + fb_fbo[i].destroy(); + + for (int32_t i = 0; i < num_scr_tex; i++) { + scr_fbo[i].destroy(); + + if (scr_txhd[i]) { + texture_release(scr_txhd[i]); + scr_txhd[i] = 0; + tex_count--; + } + } + + composite_back_fbo.destroy(); + + if (composite_back_txhd) { + texture_release(composite_back_txhd); + composite_back_txhd = 0; + tex_count--; + } + + mlaa_fbo.destroy(); + user_fbo.destroy(); + + contour_fbo = 0; + + work_fbo.destroy(); + fade_fbo.destroy(); + + for (int32_t i = 0; i < num_blur_tex; i++) + blur_fbo[i].destroy(); + + for (int32_t i = 0; i < num_blur_tex; i++) + if (blur_txhd[i]) { + texture_release(blur_txhd[i]); + blur_txhd[i] = 0; + tex_count--; + } + + if (exposure_txhd) { + texture_release(exposure_txhd); + exposure_txhd = 0; + tex_count--; + } + + exposure_avg_fbo.destroy(); + + if (exposure_avg_tex) { + glDeleteTextures(1, &exposure_avg_tex); + exposure_avg_tex = 0; + } + + if (tone_map_tex) { + glDeleteTextures(1, &tone_map_tex); + tone_map_tex = 0; + } + + if (mlaa_area_tex) { + glDeleteTextures(1, &mlaa_area_tex); + mlaa_area_tex = 0; + } + + glDeleteQueries(num_queries, sun_queries_center); + glDeleteQueries(num_queries, sun_queries_sphere); + + for (ExposureCharaData& i : exposure_chara_data) { + glDeleteQueries(num_queries, i.query); + i.query[0] = 0; } } - static void make_ghost_quad(uint8_t flags, float_t opacity, mat4* mat, float_t*& data) { - const float_t x0 = flags & 0x01 ? 0.5f : 0.0f; - const float_t x1 = flags & 0x01 ? 1.0f : 0.5f; - const float_t y0 = flags & 0x02 ? 0.5f : 0.0f; - const float_t y1 = flags & 0x02 ? 1.0f : 0.5f; + // 0x1404A9480 + void Render::calc_draw_size(bool first_time, int32_t min_res) { + const int32_t min_render_widths[4] = { + 1280, 1024, 1024, 960, + }; - vec4 p0 = { -0.5f, -0.5f, x0, y0 }; - vec4 p1 = { 0.5f, -0.5f, x1, y0 }; - vec4 p2 = { -0.5f, 0.5f, x0, y1 }; - vec4 p3 = { 0.5f, 0.5f, x1, y1 }; - mat4_transform_point(mat, (vec2*)&p0, (vec2*)&p0); - mat4_transform_point(mat, (vec2*)&p1, (vec2*)&p1); - mat4_transform_point(mat, (vec2*)&p2, (vec2*)&p2); - mat4_transform_point(mat, (vec2*)&p3, (vec2*)&p3); + const int32_t min_render_heights[4] = { + 720, 576, 576, 544, + }; - *(vec4*)&data[0] = p0; - data[4] = opacity; - *(vec4*)&data[5] = p1; - data[9] = opacity; - *(vec4*)&data[10] = p2; - data[14] = opacity; - *(vec4*)&data[15] = p2; - data[19] = opacity; - *(vec4*)&data[20] = p1; - data[24] = opacity; - *(vec4*)&data[25] = p3; - data[29] = opacity; - data += 30; + min_res = min_def(min_res, 3); + + if (first_time) + this->min_res = min_res; + else + min_res = max_def(min_res, this->min_res); + + min_res = clamp_def(min_res, 0, 3); + + int32_t min_render_width = min_render_widths[min_res]; + int32_t min_render_height = min_render_heights[min_res]; + if (min_render && (view_w > min_render_width || view_h > min_render_height)) { + fb_width[0] = min_render_width; + fb_height[0] = min_render_height; + + if (first_time) { + fb_width_org = fb_width[0]; + fb_height_org = fb_height[0]; + } + } + else { + float_t round_val = anti_alias ? 1.0f : 16.0f; + fb_width[0] = (int32_t)(prj::ceilf((float_t)view_w + * (float_t)fb_width_org / (float_t)scr_width * (1.0f / round_val)) * round_val); + fb_height[0] = (int32_t)(prj::ceilf((float_t)view_h + * (float_t)fb_height_org / (float_t)scr_height * (1.0f / round_val)) * round_val); + } + + int32_t level = 1; + for (int32_t i = 0; i < fb_level_max - 1; i++, level++) { + int32_t width = (fb_width[i] + 1) / 2; + int32_t height = (fb_height[i] + 1) / 2; + if (width <= fb_work_width[0] && height <= fb_work_height[0]) + break; + + fb_width[level] = width; + fb_height[level] = height; + } + fb_level = level; + + if (first_time) { + blur_level = level; + for (int32_t i = 0; i < level; i++) { + fb_tex_width[i] = fb_width[i]; + fb_tex_height[i] = fb_height[i]; + } + } + + fb_tex_width_scale = (float_t)fb_width[0] / (float_t)fb_tex_width[0]; + fb_tex_height_scale = (float_t)fb_height[0] / (float_t)fb_tex_height[0]; + + for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { + render_data_context rend_data_ctx((gl_rend_state_index)i); + rend_data_ctx.set_scene_framebuffer_size(fb_width[0], fb_height[0], fb_width[0], fb_height[0]); + } + + scr_tex_rate = -1.0f; } - void Render::draw_lens_ghost(render_data_context& rend_data_ctx) { + // 0x1404A9350 + void Render::begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back) { + if (composite_back) { + composite_back_fbo.begin_render(p_gl_rend_st); + this->composite_back = 1; + } + else + fb_fbo[0].begin_render(p_gl_rend_st); + p_gl_rend_st.set_viewport(0, 0, fb_width[0], fb_height[0]); + } + + // 0x1404AE680 + void Render::end_render(p_gl_rend_state& p_gl_rend_st) { + fb_fbo->end_render(p_gl_rend_st); + } + + // 0x1404A93B0 + void Render::begin_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt) { + transparency->begin_render(rend_data_ctx, rt->get_texture_glid()); + } + + // 0x1404AE6A0 + void Render::end_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha) { + transparency->end_render(rend_data_ctx, rt, alpha); + } + + // 0x1404B0860 + void Render::pre_proc(render_data_context& rend_data_ctx) { + cam_data& cam = rctx_ptr->render_manager->cam; + + prev_cam_pos = cam_pos; + prev_cam_intr = cam_intr; + cam_pos = cam.get_view_point(); + cam_intr = cam.get_interest(); + + prev_stage_num = stage_num; + if (task_stage_is_modern) + stage_num = (int32_t)task_stage_modern_get_current_stage_hash(); + else + stage_num = task_stage_get_current_stage_index(); + + prev_cam_view_proj = cam_view_proj; + cam_view_proj = cam.get_view_proj_mat(); + + reset_exposure = rctx_ptr->camera->fast_change_hist1 && !rctx_ptr->camera->fast_change_hist0; + if (reset_exposure) { + float_t pos_dist = vec3::distance(cam_pos, prev_cam_pos); + + vec3 dir = vec3::normalize(cam_intr - cam_pos); + vec3 dir_prev = vec3::normalize(prev_cam_intr - prev_cam_pos); + + float_t dir_diff_angle = vec3::dot(dir, dir_prev); + if (dir_diff_angle < 0.5f) + dir_diff_angle = 0.0f; + if (pos_dist < dir_diff_angle * 0.4f) + reset_exposure = false; + } + else if (stage_num != prev_stage_num) + reset_exposure = true; + + if (fb_movie_txhd[0]) { + extern texture* task_movie_get_texture(int32_t index = 0); + texture* tex = task_movie_get_texture(); + if (tex) { + fb_movie_fbo[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.active_bind_texture_2d(0, tex->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.set_viewport(0, 0, fb_movie_txhd[0]->width, fb_movie_txhd[0]->height); + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, tex->width, tex->height, + 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + fb_movie_fbo[0].end_render(rend_data_ctx.state); + } + } + + for (int32_t i = 0; i < GL_REND_STATE_COUNT; i++) { + render_data_context rend_data_ctx((gl_rend_state_index)i); + rend_data_ctx.set_scene_framebuffer_size(fb_width[0], fb_height[0], fb_width[0], fb_height[0]); + } + } + + // 0x1404B0850 + void Render::post_proc() { + flare_textures[0] = 0; + composite_back = 0; + } + + // 0x1404AD3A0 + void Render::draw_quad(render_data_context& rend_data_ctx, + int32_t texel_w, int32_t texel_h, float_t s0, float_t t0, float_t s1, float_t t1, + float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w) { + s0 -= s1; + t0 -= t1; + + const float_t w = (float_t)max_def(texel_w, 1); + const float_t h = (float_t)max_def(texel_h, 1); + quad_shader_data quad = {}; + quad.g_texcoord_modifier = { 0.5f * s0, 0.5f * t0, 0.5f * s0 + s1, 0.5f * t0 + t1 }; // x * 0.5 * y0 + 0.5 * y0 + y1 + quad.g_texel_size = { scale / w, scale / h, w, h }; + quad.g_color = { param_x, param_y, param_z, param_w }; + quad.g_texture_lod = 0.0f; + + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, quad); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + } + + // 0x1404B0F50 + void Render::query_chara_exposure(render_data_context& rend_data_ctx, const cam_data& cam) { + shader::unbind(rend_data_ctx.state); + + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + rend_data_ctx.state.disable_cull_face(); + + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN_NO_TEXTURED); + rend_data_ctx.state.bind_vertex_array(rctx_ptr->common_vao); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sun_quad_ubo); + + ExposureCharaData* chara_data = exposure_chara_data; + int32_t chara_write_index = (exposure_chara_write_index + 1) % num_queries; + exposure_chara_write_index = chara_write_index; + int32_t next_query_index = (chara_write_index + 2) % num_queries; + for (int32_t i = 0; i < ROB_ID_MAX; i++, chara_data++) { + rob_chara* rob_chr = get_rob_management()->get_rob((ROB_ID)i); + if (!rob_chr || !rob_chr->get_disp()) + continue; + + float_t max_face_depth = rob_chr->get_face_depth(); + + mat4 mat = mat4_identity; + rob_chr->sub_1405163C0(4, mat); + mat4_mul(&mat, &cam.get_view_mat(), &mat); + mat4_mul_translate(&mat, max_face_depth + 0.1f, 0.0f, -0.06f, &mat); + mat4_clear_rot(&mat, &mat); + mat4_scale_rot(&mat, 0.0035f, &mat); + mat4_mul(&mat, &cam.get_proj_mat(), &mat); + + sun_quad_shader_data shader_data = {}; + mat4_transpose(&mat, &mat); + shader_data.g_transform[0] = mat.row0; + shader_data.g_transform[1] = mat.row1; + shader_data.g_transform[2] = mat.row2; + shader_data.g_transform[3] = mat.row3; + shader_data.g_emission = 0.0f; + rend_data_ctx.state.write_uniform_buffer(rctx_ptr->sun_quad_ubo, shader_data); + + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, chara_data->query[next_query_index]); + rend_data_ctx.state.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); + + if (chara_data->query_data[next_query_index] == -1) + chara_data->query_data[next_query_index] = 0; + + if (chara_data->query_data[chara_write_index] != -1) { + int32_t res = 0; + glGetQueryObjectiv(chara_data->query[chara_write_index], + GL_QUERY_RESULT_AVAILABLE, &res); + if (res) + glGetQueryObjectuiv(chara_data->query[chara_write_index], + GL_QUERY_RESULT, chara_data->query_data); + else + chara_data->query_data[chara_write_index] = 0; + } + } + + rend_data_ctx.state.bind_vertex_array(0); + + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + rend_data_ctx.state.enable_cull_face(); + } + + // 0x1404AE4B0 + void Render::draw_sun_request(const GLuint* flares, float_t scale, int32_t ghosts) { + flare_textures[0] = 0; + if (flares && flares[0] && flares[0] != -1) { + flare_textures[0] = flares[0]; + flare_textures[1] = flares[1]; + flare_textures[2] = flares[2]; + num_ghosts = 16; //ghosts; + flare_scale_default = scale; + } + } + + // 0x1404AD960 + void Render::draw_sun(render_data_context& rend_data_ctx, const cam_data& cam) { + static float_t flt_1411ACB84 = sinf(0.01365909819f); + static float_t flt_1411ACB8C = tanf(0.01365909819f) * 2.0f * 0.94f; + + if (!flare_textures[0]) + return; + + GLuint tex = get_objset_gen_textures_id(5, 4549); + if (tex == -1) + return; + + float_t v5 = tanf(cam.get_fov() * 0.5f); + light_set* set = &rctx_ptr->light_set[LIGHT_SET_MAIN]; + light_data* data = &set->lights[LIGHT_SUN]; + + vec3 position; + vec4 emission; + if (data->get_type() == LIGHT_PARALLEL) { + data->get_position(position); + data->get_diffuse(emission); + } + else { + set->lights[LIGHT_STAGE].get_position(position); + position = vec3::normalize(position) * 500.0f; + set->lights[LIGHT_STAGE].get_ibl_color0(emission); + data->set_type(LIGHT_PARALLEL); + data->set_position(position); + data->set_diffuse(emission); + } + + vec4 v45; + v45.x = position.x; + v45.y = position.y; + v45.z = position.z; + v45.w = 1.0f; + mat4_transform_vector(&cam.get_view_proj_mat(), &v45, &v45); + + float_t v13 = 1.0f / v45.w; + float_t v14 = v45.x * v13; + float_t v15 = v45.y * v13; + float_t v16 = (float_t)scr_width * 0.01f / (float_t)scr_height; + v14 = clamp_def(v14, -0.99f, 0.99f); + v15 = max_def(v15, v16 - 1.0f); + v15 = min_def(v15, 1.0f - v16); + v45.x = v14 * v45.w; + v45.y = v15 * v45.w; + + mat4 inv_view_proj_mat; + mat4_invert(&cam.get_view_proj_mat(), &inv_view_proj_mat); + mat4_transform_vector(&inv_view_proj_mat, &v45, &v45); + + calc_screen_pos_r(&cam.get_view_proj_mat(), + rctx_ptr->camera->depth, &flare_pos, &position, 0.0f, false); + + float_t v17 = flare_pos.x - (float_t)scr_width * 0.5f; + float_t v19 = v5 / ((float_t)scr_height * 0.5f); + float_t v20 = flare_pos.y - (float_t)scr_height * 0.5f; + + float_t v22 = sqrtf((v17 * v19) * (v17 * v19) + (v20 * v19) * (v20 * v19) + 1.0f); + float_t v23 = (v22 * v22 * 0.5f) + * ((float_t)fb_width[0] * (flt_1411ACB8C / v5)) + * ((float_t)fb_height[0] * (flt_1411ACB8C / v5)); + + float_t sun_radius = vec3::distance(position, cam_pos) * flt_1411ACB84; + *(vec3*)&emission *= 1.0f / (1.0f - cosf((float_t)(3.0 * DEG_TO_RAD))); + + rend_data_ctx.state.active_bind_texture_2d(0, tex); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_SUN); + + int32_t query_index = (query_read_index + 1) % num_queries; + query_read_index = query_index; + int32_t next_query_index = (query_index + 2) % num_queries; + + if (sun_pixels_center[next_query_index] == -1) + sun_pixels_center[next_query_index] = 0; + + if (sun_pixels_sphere[next_query_index] == -1) + sun_pixels_sphere[next_query_index] = 0; + + rend_data_ctx.state.set_color_mask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + + mat4 center_transform; + get_sun_transform(center_transform, position, sun_radius * 0.2f, cam); + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, sun_queries_center[next_query_index]); + draw_quad_sun(rend_data_ctx, center_transform, emission); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); + + mat4 sphere_transform; + get_sun_transform(sphere_transform, *(vec3*)&v45, sun_radius * 2.0f, cam); + rend_data_ctx.state.begin_query(GL_SAMPLES_PASSED, sun_queries_sphere[next_query_index]); + draw_quad_sun(rend_data_ctx, sphere_transform, emission); + rend_data_ctx.state.end_query(GL_SAMPLES_PASSED); + + rend_data_ctx.state.set_color_mask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + + if (sun_pixels_center[query_index] != -1) { + int32_t res = 0; + glGetQueryObjectiv(sun_queries_center[query_index], GL_QUERY_RESULT_AVAILABLE, &res); + if (res) + glGetQueryObjectuiv(sun_queries_center[query_index], GL_QUERY_RESULT, &sun_pixels_center[query_index]); + } + + if (sun_pixels_sphere[query_index] != -1) { + int32_t res = 0; + glGetQueryObjectiv(sun_queries_sphere[query_index], GL_QUERY_RESULT_AVAILABLE, &res); + if (res) + glGetQueryObjectuiv(sun_queries_sphere[query_index], GL_QUERY_RESULT, &sun_pixels_sphere[query_index]); + } + + if (emission.x + emission.y + emission.z > 0.0f) { + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); + rend_data_ctx.state.set_depth_mask(GL_FALSE); + + mat4 sun_transform; + get_sun_transform(sun_transform, position, sun_radius * 1.1f, cam); + draw_quad_sun(rend_data_ctx, sun_transform, emission); + + rend_data_ctx.state.disable_blend(); + rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + } + + rend_data_ctx.state.active_bind_texture_2d(0, 0); + rend_data_ctx.state.bind_vertex_array(0); + + if (flare_alpha_offset <= 0.01f) + flare_alpha_offset = 0.0f; + else + flare_alpha_offset *= 0.93f; + + flare_scale = 100.0f; + flare_alpha = 0.0f; + float_t flare_pixels = 0.0f; + if (flare_pos.z >= 0.0f + || flare_pos.x < (float_t)-scr_width || flare_pos.x > (float_t)(scr_width * 2) + || flare_pos.y < (float_t)-scr_height || flare_pos.y > (float_t)(scr_height * 2)) + flare_textures[0] = 0; + else { + for (GLuint& i : sun_pixels_sphere) + if (i != -1) + flare_pixels += min_def((float_t)i, v23); + flare_pixels /= v23 * 3.0f; + flare_alpha = powf(flare_pixels, 0.7f); + + if (flare_pixels > 0.0f && sun_pixels_center[query_index]) { + float_t v42 = max_def(flare_pixels - 0.4f, 0.005f); + flare_scale = 0.6f / v42 * flare_scale_default * (v5 * 3.4f); + } + } + + if (flare_pos.z >= 0.0f + || flare_pos.x < (float_t)-12 || flare_pos.x > (float_t)(scr_width + 12) + || flare_pos.y < (float_t)-12 || flare_pos.y > (float_t)(scr_height + 12)) + flare_alpha_enable = 0.0f; + else if (flare_pos.x > (float_t)-2 && flare_pos.x < (float_t)(scr_width + 2) + && flare_pos.y > (float_t)-2 && flare_pos.y < (float_t)(scr_height + 2)) { + if (flare_pixels > 0.4f && flare_alpha_enable == 0.0f + && flare_alpha_offset < 0.02f && !reset_exposure) + flare_alpha_offset = 8.0f; + flare_alpha_enable = 1.0f; + } + } + + // 0x1404ACF80 + void Render::draw_ghost(render_data_context& rend_data_ctx) { static const float_t pos_scale_array[16] = { -0.70f, -0.30f, 0.35f, 0.50f, -0.45f, -0.80f, 0.20f, 0.41f, @@ -2170,17 +1748,17 @@ namespace rndr { 0.4f, 0.3f, 0.60f, 0.4f, }; - if (!lens_flare_texture || lens_ghost_count <= 0) + if (!flare_textures[0] || num_ghosts <= 0) return; - if (lens_ghost_count > 16) - lens_ghost_count = 16; + if (num_ghosts > 16) + num_ghosts = 16; - const float_t aspect = (float_t)render_width[0] / (float_t)render_height[0]; + const float_t aspect = (float_t)fb_width[0] / (float_t)fb_height[0]; - const float_t v7 = (lens_flare_pos.x - (float_t)(width / 2)) / (float_t)width; - const float_t v8 = -((lens_flare_pos.y - (float_t)(height / 2)) / (float_t)height); - const float_t v9 = (float_t)((1.1 - sqrtf(v8 * v8 + v7 * v7)) * lens_flare_power); + const float_t v7 = (flare_pos.x - (float_t)(scr_width / 2)) / (float_t)scr_width; + const float_t v8 = -((flare_pos.y - (float_t)(scr_height / 2)) / (float_t)scr_height); + const float_t v9 = (float_t)((1.1 - sqrtf(v8 * v8 + v7 * v7)) * flare_alpha); if (v9 < 0.001f) return; @@ -2194,9 +1772,9 @@ namespace rndr { if (!data) return; - const float_t lens_ghost = this->lens_ghost; - const int32_t lens_ghost_count = this->lens_ghost_count; - for (int32_t i = 0; i < lens_ghost_count; i++) { + const float_t lens_ghost = flare_coef[2]; + const int32_t num_ghosts = this->num_ghosts; + for (int32_t i = 0; i < num_ghosts; i++) { float_t opacity = v9 * opacity_array[i] * lens_ghost; float_t scale = (v9a * 0.03f + 0.02f) * scale_array[i]; @@ -2205,367 +1783,927 @@ namespace rndr { mat4_translate(pos_scale_array[i] * v7 + 0.5f, pos_scale_array[i] * v8 + 0.5f, 0.0f, &mat); mat4_scale_rot(&mat, scale, scale * aspect, 1.0f, &mat); mat4_mul_rotate_z(&mat, angle_sin, angle_cos, &mat); - make_ghost_quad((uint8_t)(i & 0x03), opacity, &mat, data); + draw_quad_ghost(i & 0x03, opacity, &mat, data); } rend_data_ctx.state.unmap_array_buffer(rctx_ptr->lens_ghost_vbo); - rend_data_ctx.state.set_viewport(0, 0, render_width[0], render_height[0]); - rend_texture[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, fb_width[0], fb_height[0]); + fb_fbo[0].begin_render(rend_data_ctx.state); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.set_blend_func(GL_ONE, GL_ONE); rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 4; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - rend_data_ctx.state.active_bind_texture_2d(0, lens_ghost_texture); + rend_data_ctx.state.active_bind_texture_2d(0, flare_textures[2]); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); rend_data_ctx.state.bind_vertex_array(rctx_ptr->lens_ghost_vao); - rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(lens_ghost_count * 6LL)); + rend_data_ctx.state.draw_arrays(GL_TRIANGLES, 0, (GLsizei)(num_ghosts * 6LL)); rend_data_ctx.state.bind_vertex_array(0); rend_data_ctx.state.disable_blend(); rend_data_ctx.state.set_blend_func(GL_ONE, GL_ZERO); } - void Render::generate_mlaa_area_texture() { - uint8_t* data = force_malloc(MLAA_SIDE_LEN * MLAA_SIDE_LEN * 2); - if (!data) - return; - - for (int32_t cross2 = 0; cross2 < 5; cross2++) - for (int32_t cross1 = 0; cross1 < 5; cross1++) - calculate_mlaa_area_texture_data(data, cross1, cross2); - - glGenTextures(1, &mlaa_area_texture); - gl_state.bind_texture_2d(mlaa_area_texture); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, MLAA_SIDE_LEN, MLAA_SIDE_LEN, 0, GL_RG, GL_UNSIGNED_BYTE, data); - gl_state.bind_texture_2d(0); - free_def(data); - } - - void Render::get_blur(render_data_context& rend_data_ctx) { + // 0x1404AC270 + void Render::draw_flare(render_data_context& rend_data_ctx, + const cam_data& cam, texture* light_proj_tex, int32_t npr_param) { render_context* rctx = rctx_ptr; - rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; - rend_data_ctx.shader_flags.arr[U_GAUSS] = 0; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); - calc_gaussian_blur(rend_data_ctx, 1.0f, 1.0f, 7, 0.8f, 1.0f); - rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->gaussian_coef_ubo); + for (int32_t i = 0; i < 8; i++) + rend_data_ctx.state.bind_sampler(i, 0); - downsample_texture.begin_render(rend_data_ctx.state); - for (int32_t i = 1; i < 4; i++) { - rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(rend_data_ctx, reduce_width[i], reduce_height[i], - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f); - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); + dof->apply(rend_data_ctx, &fb_fbo[0], &rctx_ptr->render_buffer); + + draw_ghost(rend_data_ctx); + + reduce_texture(rend_data_ctx); + + bloom_tex = 0; + handle_blur_texture(rend_data_ctx); + + measure_exposure(rend_data_ctx, cam); + tone_map(rend_data_ctx, light_proj_tex, npr_param); + + mlaa(rend_data_ctx, scr_index, num_scr_tex - 1, ss_alpha_mask); + + for (int32_t i = 0; i < num_fb_copy; i++) { + if (!fb_copy_txhd[i]) + continue; + + fb_copy_fbo[i].begin_render(rend_data_ctx.state); + + const texture* t = fb_copy_txhd[i]; + if (fb_width[0] > t->width * 2 || fb_height[0] > t->height * 2) + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 1; + else + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; + + rend_data_ctx.state.set_viewport(0, 0, t->width, t->height); + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[scr_index]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } - for (int32_t i = 1; i < 4; i++) { - rend_data_ctx.state.set_viewport(0, 0, reduce_width[i], reduce_height[i]); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[i]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(rend_data_ctx, reduce_width[i], reduce_height[i], - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f); - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, 0, 0, 0, 0, reduce_width[i], reduce_height[i]); + process_capture(rend_data_ctx, fb_fbo[0].get_texture_glid(), + fb_width[0], fb_height[0], scr_txhd[scr_index]->glid); + + if (temporal_anti_alias) { + if (scr_tex_rate >= 0.0f) + calc_scr_tex_rate(); + else + scr_tex_rate = 1.0f; } - rend_data_ctx.shader_flags.arr[U_GAUSS] = 1; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_GAUSS); + if (scr_tex_rate < 0.0f || scr_tex_rate >= 1.0f) + scr_disp_index = scr_index; + else { + rend_data_ctx.state.begin_event("taa_or_blur"); + bool blur; + GLuint sampler; + if (scr_tex_rate > 0.99f) { + blur = true; + sampler = rctx->render_samplers[0]; + } + else { + blur = false; + sampler = rctx->render_samplers[1]; + } - rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - rend_data_ctx.state.active_bind_texture_2d(0, reduce_tex[0]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); - draw_quad(rend_data_ctx, reduce_width[0], reduce_height[0], - 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - intensity.x * 0.5f, intensity.y * 0.5f, intensity.z * 0.5f, 1.0f); + scr_disp_index = num_scr_tex - 1; + scr_fbo[num_scr_tex - 1].begin_render(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, fb_width[0], fb_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[scr_index]->glid); + rend_data_ctx.state.bind_sampler(0, sampler); - rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 7; - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + if (blur) { + rend_data_ctx.state.active_bind_texture_2d(2, fb_fbo[0].get_depth_texture()->glid); + rend_data_ctx.state.bind_sampler(2, sampler); - rend_data_ctx.state.set_viewport(0, 0, reduce_width[0], reduce_height[0]); - reduce_texture[0].begin_render(rend_data_ctx.state); - rend_data_ctx.state.active_bind_texture_2d(0, downsample_texture.get_texture_glid()); - rend_data_ctx.state.active_bind_texture_2d(1, reduce_tex[1]->glid); - rend_data_ctx.state.active_bind_texture_2d(2, reduce_tex[2]->glid); - rend_data_ctx.state.active_bind_texture_2d(3, reduce_tex[3]->glid); - rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[2]); - rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[2]); - rend_data_ctx.state.bind_sampler(2, rctx->render_samplers[2]); - rend_data_ctx.state.bind_sampler(3, rctx->render_samplers[2]); - draw_quad(rend_data_ctx, reduce_width[3], reduce_height[3], - 1.0f, 1.0f, 0.0f, 0.0f, 0.25f, 0.15f, 0.25f, 0.25f, 0.25f); - reduce_tex_draw = reduce_tex[0]->glid; + mat4 mat; + mat4_invert(&cam_view_proj, &mat); + mat4_mul(&prev_cam_view_proj, &mat, &mat); + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 6; + + camera_blur_shader_data shader_data = {}; + shader_data.g_transform[0] = mat.row0; + shader_data.g_transform[1] = mat.row1; + shader_data.g_transform[2] = mat.row2; + shader_data.g_transform[3] = mat.row3; + rend_data_ctx.state.write_uniform_buffer(rctx->camera_blur_ubo, shader_data); + rend_data_ctx.state.bind_uniform_buffer_base(1, rctx->camera_blur_ubo); + } + else { + int32_t scr_index = this->scr_index + 1; + if (scr_index > temporal_anti_alias) + scr_index = 0; + rend_data_ctx.state.active_bind_texture_2d(1, scr_txhd[scr_index]->glid); + rend_data_ctx.state.bind_sampler(1, sampler); + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 5; + } + + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, scr_tex_rate); + rend_data_ctx.state.end_event(); + } + + if (temporal_anti_alias) { + int32_t scr_index = this->scr_index + 1; + if (scr_index > temporal_anti_alias) + scr_index = 0; + this->scr_index = scr_index; + } + + rctx->screen_buffer.begin_render(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, rctx->view_w, rctx->view_h); + if (anti_alias) { + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[scr_disp_index]->glid); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = ss_alpha_mask ? 1 : 0; + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; + } + else { + rend_data_ctx.state.active_bind_texture_2d(0, scr_txhd[scr_disp_index]->glid); + if (mag_filter == MAG_FILTER_NEAREST) + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + else + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); + + switch (mag_filter) { + case MAG_FILTER_NEAREST: + case MAG_FILTER_BILINEAR: + default: + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 0; + break; + case MAG_FILTER_SHARPEN_5_TAP: + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 2; + break; + case MAG_FILTER_SHARPEN_4_TAP: + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 3; + break; + case MAG_FILTER_CONE_4_TAP: + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 4; + break; + case MAG_FILTER_CONE_2_TAP: + rend_data_ctx.shader_flags.arr[U_MAGNIFY] = 5; + break; + } + + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_MAGNIFY); + draw_quad(rend_data_ctx, fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + } + shader::unbind(rend_data_ctx.state); + + for (int32_t i = 0; i < 8; i++) + rend_data_ctx.state.bind_sampler(i, 0); } - void Render::update_tone_map_lut(p_gl_rend_state& p_gl_rend_st) { - if (!update_lut) + // 0x1404ABDA0 + void Render::draw_contour(render_data_context& rend_data_ctx, const cam_data& cam) { + render_context* rctx = rctx_ptr; + + if (reflect_draw) + rctx->reflect_buffer.begin_render(rend_data_ctx.state); + else + contour_fbo->begin_render(rend_data_ctx.state); + + rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_ALWAYS); + rend_data_ctx.state.set_depth_mask(GL_TRUE); + if (reflect_draw) { + RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); + rend_data_ctx.state.set_viewport(0, 0, refl_tex.get_width(), refl_tex.get_height()); + rend_data_ctx.state.active_bind_texture_2d(0, refl_tex.get_texture_glid()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, refl_tex.get_depth_texture_glid()); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); + } + else { + rend_data_ctx.state.set_viewport(0, 0, fb_width[0], fb_height[0]); + rend_data_ctx.state.active_bind_texture_2d(0, fb_fbo[0].get_texture_glid()); + rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[1]); + rend_data_ctx.state.active_bind_texture_2d(1, fb_fbo[0].get_depth_texture_glid()); + rend_data_ctx.state.bind_sampler(1, rctx->render_samplers[1]); + } + rend_data_ctx.state.active_texture(0); + + float_t v3 = 1.0f / tanf(cam.get_fov() * 0.5f); + + vec3 direction = cam.get_interest() - cam.get_view_point(); + float_t length = vec3::length(direction); + float_t v7 = direction.y; + if (length != 0.0f) + v7 /= length; + + float_t v9 = fabsf(v7) - 0.1f; + if (v9 < 0.0f) + v9 = 0.0f; + + contour_coef_shader_data shader_data = {}; + shader_data.g_contour = { v9 * 0.004f + 0.0027f, 0.003f, v3 * 0.35f, 0.0008f }; + const double_t max_distance = cam.get_max_distance(); + const double_t min_distance = cam.get_min_distance(); + shader_data.g_near_far = { + (float_t)(max_distance * (1.0 / (max_distance - min_distance))), + (float_t)(-(max_distance * min_distance) * (1.0 / (max_distance - min_distance))), + (float_t)min_distance, (float_t)max_distance + }; + rend_data_ctx.state.write_uniform_buffer(rctx->contour_coef_ubo, shader_data); + + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR); + rend_data_ctx.state.bind_uniform_buffer_base(2, rctx->contour_coef_ubo); + + if (reflect_draw) { + RenderTexture& refl_tex = rctx->render_manager->get_render_texture(0); + draw_quad(rend_data_ctx, refl_tex.get_width(), refl_tex.get_height(), + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + } + else + draw_quad(rend_data_ctx, + fb_tex_width[0], fb_tex_height[0], + fb_tex_width_scale, fb_tex_height_scale, + 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + } + + // 0x1404B1560 + int32_t Render::register_fb_copy(const texture* txhd, bool task_photo) { + if (!txhd) + return -1; + + int32_t index = 0; + if (task_photo) + index = num_fb_copy - 1; + else + while (fb_copy_txhd[index]) + if (++index >= num_fb_copy - 1) + return -1; + + fb_copy_txhd[index] = txhd; + fb_copy_fbo[index].attach_texture(txhd->glid); + return index; + } + + // 0x1404B1880 + void Render::remove_fb_copy(const texture* txhd, bool task_photo) { + if (!txhd) return; - update_lut = 0; - saturate_lock = 0; - - const float_t tone_map_scale = (float_t)(1.0 / (double_t)TONE_MAP_SAT_GAMMA_SAMPLES); - const int32_t tone_map_size = 16 * TONE_MAP_SAT_GAMMA_SAMPLES; - - vec2 tex_data[16 * TONE_MAP_SAT_GAMMA_SAMPLES]; - float_t gamma_power = gamma * gamma_rate * 1.5f; - int32_t saturate_power = this->saturate_power; - float_t saturate_coeff = this->saturate_coeff[saturate_index]; - - tex_data[0].x = 0.0f; - tex_data[0].y = 0.0f; - for (int32_t i = 1; i < tone_map_size; i++) { - float_t gamma = powf(1.0f - expf((float_t)-i * tone_map_scale), gamma_power); - float_t saturation = gamma * 2.0f - 1.0f; - for (int32_t j = 0; j < saturate_power; j++) { - saturation *= saturation; - saturation *= saturation; - saturation *= saturation; - saturation *= saturation; - } - - tex_data[i].x = gamma; - tex_data[i].y = gamma * saturate_coeff - * ((float_t)TONE_MAP_SAT_GAMMA_SAMPLES / (float_t)i) * (1.0f - saturation); - } - - if (GLAD_GL_VERSION_4_5) - p_gl_rend_st.texture_sub_image_2d(tonemap_lut_texture, 0, 0, 0, - 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); - else { - p_gl_rend_st.bind_texture_2d(tonemap_lut_texture); - p_gl_rend_st.tex_sub_image_2d(GL_TEXTURE_2D, 0, 0, 0, - 16 * TONE_MAP_SAT_GAMMA_SAMPLES, 1, GL_RG, GL_FLOAT, tex_data); - } - } - - static void calculate_mlaa_area_texture_data(uint8_t* data, int32_t cross1, int32_t cross2) { - uint8_t* _data = &data[(MLAA_SIDE_LEN * MLAA_GRID_SIDE_LEN * cross2 + MLAA_GRID_SIDE_LEN * cross1) * 2]; - for (int32_t dright = 0; dright < MLAA_GRID_SIDE_LEN; dright++) { - for (int32_t dleft = 0; dleft < MLAA_GRID_SIDE_LEN; dleft++) { - float_t val_left = 0.0f; - float_t val_right = 0.0f; - calculate_mlaa_area_texture_data_inner(&val_left, &val_right, cross1, cross2, dleft, dright); - _data[0] = (uint8_t)(val_left * 255.9f); - _data[1] = (uint8_t)(val_right * 255.9f); - _data += 2; - } - _data += MLAA_GRID_SIDE_LEN * 4 * 2; - } - } - - static float_t calc_area_tex_val(int32_t a1, int32_t a2) { - float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5)); - float_t v3 = (float_t)a1 * v2 + 0.5f; - if (a1 >= a2 - 1) - return (v3 * 0.5f) * 0.5f; + int32_t index = 0; + if (task_photo) + index = num_fb_copy - 1; else - return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f; - }; + while (fb_copy_txhd[index] != txhd) + if (++index >= num_fb_copy - 1) + return; - static void calculate_mlaa_area_texture_data_inner(float_t* val_left, - float_t* val_right, int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright) { - int32_t d = dleft + dright + 1; - float_t _val_left = 0.0f; - float_t _val_right = 0.0f; - switch (cross2) { - case 0: - switch (cross1) { - case 1: - _val_right = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); - break; - case 3: - _val_left = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); - break; + fb_copy_txhd[index] = 0; + fb_copy_fbo[index].destroy(); + } + + // 0x1404B16A0 + int32_t Render::register_fb_movie(const texture* txhd) { + if (!txhd) + return -1; + + int32_t index = 0; + while (fb_movie_txhd[index]) + if (++index >= num_fb_movie) + return -1; + + fb_movie_txhd[index] = txhd; + fb_movie_fbo[index].attach_texture(txhd->glid); + return index; + } + + // 0x1404B18F0 + void Render::remove_fb_movie(const texture* txhd) { + if (!txhd) + return; + + int32_t index = 0; + while (fb_movie_txhd[index] != txhd) + if (++index >= num_fb_movie) + return; + + fb_movie_txhd[index] = 0; + fb_movie_fbo[index].destroy(); + } + + // 0x1404B05C0 + void Render::perspective(vec2& offset, float_t scale) const { + if (temporal_anti_alias) { + const float_t taa_offset = scr_index == 1 ? -0.25f : 0.25f; + const float_t _offset = taa_offset * scale * -2.0f; + offset = _offset / vec2((float_t)fb_width[0], (float_t)fb_height[0]); + } + else + offset = 0.0f; + } + + // 0x1404AF200 + void Render::init_capture() { + for (Render::Capture& i : capture) { + for (Render::CaptureData& j : i.data) { + j.txhd = 0; + j.type = CAPTURE_MAX; } - break; - case 1: - switch (cross1) { - case 0: - _val_right = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); - break; - case 1: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_right = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_right = calc_area_tex_val(dright, v12); - else - _val_right = calc_area_tex_val(v15, v12) * 2.0f; - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft >= v12) - _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; - case 3: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_left = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_right = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; - case 4: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_left = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_right = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; + + i.capture = false; + } + } + + // 0x1404AE6C0 + void Render::free_capture() { + for (Render::Capture& i : capture) { + for (Render::CaptureData& j : i.data) { + j.txhd = 0; + j.fbo.destroy(); + j.type = CAPTURE_MAX; } - break; - case 3: - switch (cross1) { - case 0: - _val_left = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); - break; - case 1: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_right = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_left = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; - case 3: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_left = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_left = calc_area_tex_val(dright, v12); - else - _val_left = calc_area_tex_val(v15, v12) * 2.0f; - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; - case 4: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_right = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_left = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; + + i.capture = false; + } + } + + // 0x1404B1600 + int32_t Render::register_fb_man_cap(CaptureSlot slot, Render::CaptureType type, texture* txhd) { + if (!txhd || slot < 0 || slot >= CAPTURE_SLOT_MAX) + return -1; + + for (Render::CaptureData& i : capture[slot].data) + if (!i.txhd) { + i.fbo.attach_texture(txhd->glid); + i.txhd = txhd; + i.type = type; + return (int32_t)(&i - capture[slot].data); } - break; - case 4: - switch (cross1) { - case 1: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_right = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_left = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; - case 3: - if (d % 2) { - int32_t v12 = d / 2 + 1; - int32_t v15 = d / 2; - if (dleft < v15) - _val_left = calc_area_tex_val(dleft, v12); - else if (dright < v15) - _val_right = calc_area_tex_val(dright, v12); - else - _val_left = _val_right = calc_area_tex_val(v15, v12); - } - else { - int32_t v12 = d / 2; - float_t v14 = -0.5f / (float_t)v12; - if (dleft < v12) - _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; - else - _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; - } - break; + return -1; + } + + // 0x1404B30A0 + bool Render::unregister_fb_man_cap(CaptureSlot slot, texture* txhd) { + if (!txhd || slot < 0 || slot >= CAPTURE_SLOT_MAX) + return false; + + for (Render::CaptureData& i : capture[slot].data) + if (i.txhd == txhd) { + i.fbo.destroy(); + i.txhd = 0; + i.type = CAPTURE_MAX; + return true; } - break; + return false; + } + + // 0x1404AF260 + bool Render::is_fb_man_cap() { + for (int32_t i = CAPTURE_SLOT_A; i < CAPTURE_SLOT_MAX; i++) + if (capture[i].capture) + return true; + return false; + } + + // 0x1404B1DA0 + bool Render::set_frame_texture_aoto_cap(bool value) { + capture[0].capture = value; + return true; + } + + // 0x1404A9C00 + bool Render::capture_slot_enable(CaptureSlot slot) { + if (slot < CAPTURE_SLOT_A || slot >= CAPTURE_SLOT_MAX) + return false; + + capture[slot].capture = true; + return true; + } + + // 0x1404B0D40 + void Render::process_capture(render_data_context& rend_data_ctx, + GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex) { + for (Render::Capture& i : capture) { + if (!i.capture) + continue; + + for (auto& j : i.data) { + if (!j.txhd || j.fbo.begin_render(rend_data_ctx.state) < 0) + continue; + + texture* txhd = j.txhd; + + rend_data_ctx.state.active_bind_texture_2d(0, j.type == CAPTURE_PRE_PP ? pre_pp_tex : post_pp_tex); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[0]); + rend_data_ctx.state.set_viewport(0, 0, txhd->width, txhd->height); + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); + draw_quad(rend_data_ctx, txhd->width, txhd->height, + 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + j.fbo.end_render(rend_data_ctx.state); + } + + if (&i - capture) + i.capture = false; + } + } + + // 0x1404B23C0 + void Render::set_tone_map_method(int32_t value) { + tone_map_method = (ToneMapMethod)value; + update = 1; + } + + // 0x1404B1BC0 + void Render::set_exposure(float_t value) { + exposure = value; + update = 1; + } + + // Missing + void Render::set_exposure_rate(float_t value) { + exposure_rate = value; + update = 1; + } + + // 0x1404B1B10 + void Render::set_auto_exposure(int32_t value) { + auto_exposure = value; + update = 1; + } + + // 0x1404B1DB0 + void Render::set_gamma(float_t value) { + gamma = value; + recalc_tone_map = 1; + update = 1; + } + + // Missing + void Render::set_gamma_rate(float_t value) { + gamma_rate = value; + recalc_tone_map = 1; + update = 1; + } + + // 0x1404B2350 + void Render::set_saturate_power(int32_t value) { + saturate_power = value; + recalc_tone_map = 1; + update = 1; + } + + // 0x1404B22B0 + void Render::set_saturate_coef(float_t value, int32_t index, bool lock) { + if (saturate_lock) + return; + + saturate_coef[index] = value; + recalc_tone_map = 1; + update = 1; + + if (lock) { + saturate_lock = 1; + saturate_index = 0; + } + else if (index == 1) + saturate_index = 1; + } + + // 0x1404B2310 + void Render::set_saturate_coef_default(int32_t index, bool lock) { + set_saturate_coef(1.0f, index, lock); + if (index == 1) + saturate_index = 0; + } + + // 0x1404B21F0 + void Render::set_mag_filter(int32_t value) { + mag_filter = (MagFilterType)value; + update = 1; + } + + // 0x1404B23A0 + void Render::set_temporal_aa(int32_t value) { + temporal_anti_alias = value; + scr_tex_rate = -1.0f; + update = 1; + } + + // 0x1404B2210 + void Render::set_morphological_aa(int32_t value) { + morphological_anti_alias = value; + update = 1; + } + + // 0x1404B1B30 + void Render::set_cam_blur(int32_t value) { + cam_blur = value; + update = 1; + } + + // 0x1404B1C10 + void Render::set_fade_color(const vec4* in_value, int32_t index) { + fade_color[index][0] = in_value->x; + fade_color[index][1] = in_value->y; + fade_color[index][2] = in_value->z; + fade_rate[index] = in_value->w; + + update = 1; + if (index == 1) + fade_index = 1; + } + + // 0x1404B1C60 + void Render::set_fade_color(const float_t* value, int32_t index) { + fade_color[index][0] = value[0]; + fade_color[index][1] = value[1]; + fade_color[index][2] = value[2]; + + update = 1; + if (index == 1) + fade_index = 1; + } + + // 0x1404B1D00 + void Render::set_fade_rate(float_t value, int32_t index) { + fade_rate[index] = value; + + update = 1; + if (index == 1) + fade_index = 1; + } + + // 0x1404B1CB0 + void Render::set_fade_color_default(int32_t index) { + fade_color[index][0] = 0.0f; + fade_color[index][1] = 0.0f; + fade_color[index][2] = 0.0f; + fade_rate[index] = 0.0f; + fade_blend_func[index] = 0; + + update = 1; + if (index == 1) + fade_index = 0; + } + + // 0x1404B1BE0 + void Render::set_fade_blend_func(int32_t value, int32_t index) { + if (value < 0 || value > 2) + return; + + fade_blend_func[index] = value; + + update = 1; + if (index == 1) + fade_index = 1; + } + + // 0x1404B2690 + void Render::set_tone_trans(const float_t* start, const float_t* end, int32_t index) { + for (int32_t i = 0; i < 3; i++) { + tone_trans_start[index][i] = start[i]; + tone_trans_end[index][i] = end[i]; + + float_t range = end[i] - start[i]; + if (fabsf(range) < 0.0001f) { + set_tone_trans_default(0); + return; + } + + float_t scale = 1.0f / range; + tone_trans_scale[index][i] = 1.0f; + tone_trans_offset[index][i] = -(scale * start[i]); } - *val_left = _val_left; - *val_right = _val_right; - return; + update = 1; + if (index == 1) + tone_trans_index = 1; + } + + // 0x1404B2780 + void Render::set_tone_trans_default(int32_t index) { + for (int32_t i = 0; i < 3; i++) { + tone_trans_scale[index][i] = 1.0f; + tone_trans_offset[index][i] = 0.0f; + tone_trans_start[index][i] = 0.0f; + tone_trans_end[index][i] = 1.0f; + } + + update = 1; + if (index == 1) + tone_trans_index = 0; + } + + // 0x1404B1D30 + void Render::set_fade_tex_rate(float_t value) { + fade_tex_rate = value; + update = 1; + } + + // 0x1404B1D50 + void Render::set_fade_tex_type(int32_t value) { + if (value < 0 || value > 5) + value = 0; + + fade_tex_type = value; + update = 1; + } + + // 0x1404B1D70 + void Render::set_flare_coef(const float_t* value) { + flare_coef[0] = value[0]; + flare_coef[1] = value[1]; + flare_coef[2] = value[2]; + update = 1; + } + + // 0x1404B2370 + void Render::set_sigma(const float_t* value) { + sigma[0] = value[0]; + sigma[1] = value[1]; + sigma[2] = value[2]; + update = 1; + } + + // 0x1404B21C0 + void Render::set_intensity(const float_t* value) { + filter_inten[0] = value[0]; + filter_inten[1] = value[1]; + filter_inten[2] = value[2]; + update = 1; + } + + // 0x1404B27E0 + void Render::set_viewport(int32_t x, int32_t y, int32_t w, int32_t h) { + view_x = x; + view_y = y; + view_w = min_def(w, scr_width); + view_h = min_def(h, scr_height); + + calc_draw_size(false, -1); + update = 1; + } + + // 0x1404AEA90 + void Render::get_tone_map_method(int32_t* value) const { + *value = tone_map_method; + } + + // 0x1404AE7D0 + void Render::get_exposure(float_t* value) const { + *value = exposure; + } + + // Missing + void Render::get_exposure_rate(float_t* value) const { + *value = exposure_rate; + } + + // 0x1404AE750 + void Render::get_auto_exposure(int32_t* value) const { + *value = auto_exposure; + } + + // 0x1404AE870 + void Render::get_gamma(float_t* value) const { + *value = gamma; + } + + // Missing + void Render::get_gamma_rate(float_t* value) const { + *value = gamma_rate; + } + + // 0x1404AEA50 + void Render::get_saturate_power(int32_t* value) const { + *value = saturate_power; + } + + // 0x1404AEA40 + void Render::get_saturate_coef(float_t* value) const { + *value = saturate_coef[0]; + } + + // 0x1404AE9B0 + void Render::get_mag_filter(int32_t* value) const { + *value = mag_filter; + } + + // 0x1404AEA80 + void Render::get_temporal_aa(int32_t* value) const { + *value = temporal_anti_alias; + } + + // 0x1404AE9C0 + void Render::get_morphological_aa(int32_t* value) const { + *value = morphological_anti_alias; + } + + // 0x1404AE760 + void Render::get_cam_blur(int32_t* value) const { + *value = cam_blur; + } + + // 0x1404AE7F0 + void Render::get_fade_color(vec4* value) const { + value->x = fade_color[0][0]; + value->y = fade_color[0][1]; + value->z = fade_color[0][2]; + value->w = fade_rate[0]; + } + + // 0x1404AE820 + void Render::get_fade_color(float_t* value) const { + value[0] = fade_color[0][0]; + value[1] = fade_color[0][1]; + value[2] = fade_color[0][2]; + } + + // 0x1404AE840 + void Render::get_fade_rate(float_t* value) const { + *value = fade_rate[0]; + } + + // 0x1404AE7E0 + void Render::get_fade_blend_func(int32_t* value) const { + *value = fade_blend_func[0]; + } + + // 0x1404AEAA0 + void Render::get_tone_trans(float_t* start_arg, float_t* end_arg) const { + start_arg[0] = tone_trans_start[0][0]; + end_arg[0] = tone_trans_end[0][0]; + start_arg[1] = tone_trans_start[0][1]; + end_arg[1] = tone_trans_end[0][1]; + start_arg[2] = tone_trans_start[0][2]; + end_arg[2] = tone_trans_end[0][2]; + } + + // 0x1404AE850 + void Render::get_flare_coef(float_t* value) const { + value[0] = flare_coef[0]; + value[1] = flare_coef[1]; + value[2] = flare_coef[2]; + } + + // 0x1404AEA60 + void Render::get_sigma(float_t* value) const { + value[0] = sigma[0]; + value[1] = sigma[1]; + value[2] = sigma[2]; + } + + // 0x1404AE990 + void Render::get_intensity(float_t* value) const { + value[0] = filter_inten[0]; + value[1] = filter_inten[1]; + value[2] = filter_inten[2]; + } + + // 0x1404AE9E0 + void Render::get_render_param(float_t* fb_width_arg, float_t* fb_height_arg, + float_t* fb_tex_width_arg, float_t* fb_tex_height_arg) const { + if (fb_width_arg) + *fb_width_arg = (float_t)fb_width[0]; + if (fb_height_arg) + *fb_height_arg = (float_t)fb_height[0]; + if (fb_tex_width_arg) + *fb_tex_width_arg = (float_t)fb_tex_width[0]; + if (fb_tex_height_arg) + *fb_tex_height_arg = (float_t)fb_tex_height[0]; + } + + // 0x1404AE530 + void Render::enable_dof_set(bool value) { + dof_pv_data.enable = value; + } + + // Added + void Render::update_dof_set(bool value) { + dof_pv_data.update = value; + } + + // Inlined + bool Render::get_dof_enable() { + return dof_pv_data.enable; + } + + // Inlined, Added + bool Render::get_dof_update() { + return dof_pv_data.update; + } + + // 0x1404AE780 + void Render::get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio) { + focus = dof_pv_data.f2.focus; + focus_range = dof_pv_data.f2.focus_range; + fuzzing_range = dof_pv_data.f2.fuzzing_range; + ratio = dof_pv_data.f2.ratio; + } + + // 0x1404B1B40 + void Render::set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio) { + dof_pv_data.f2.focus = focus; + dof_pv_data.f2.focus_range = focus_range; + dof_pv_data.f2.ratio = ratio; + dof_pv_data.f2.fuzzing_range = fuzzing_range; + } + + // Added + void Render::resize(int32_t width, int32_t height) { + scr_width = width; + scr_height = height; + + if (anti_alias) { + fb_width_org = 2 * width; + fb_height_org = 2 * height; + } + else { + fb_width_org = width; + fb_height_org = height; + } + + view_x = 0; + view_y = 0; + + view_w = width; + view_h = height; + + calc_draw_size(true, 1); + + fb_fbo[0].create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA16F, GL_DEPTH_COMPONENT24); + + gl_state.bind_texture_2d(fb_fbo[0].get_texture_glid()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + gl_state.bind_texture_2d(fb_fbo[0].get_depth_texture_glid()); + GLint swizzle[] = { GL_RED, GL_RED, GL_RED, GL_ONE }; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + + for (int32_t i = 0; i < num_scr_tex; i++) { + texture_id id = scr_txhd[i]->id; + texture_release(scr_txhd[i]); + scr_txhd[i] = texture_load_tex_2d(id, GL_RGBA8, + fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + scr_fbo[i].attach_texture(scr_txhd[i]->glid, 0, fb_fbo[0].get_depth_texture_glid()); + } + + texture_id composite_back_tex_id = composite_back_txhd->id; + texture_release(composite_back_txhd); + composite_back_txhd = texture_load_tex_2d(composite_back_tex_id, GL_RGBA8, + fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + composite_back_fbo.attach_texture(composite_back_txhd->glid, 0, fb_fbo[0].get_depth_texture_glid()); + + mlaa_fbo.create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA8, GL_DEPTH_COMPONENT24); + user_fbo.create_texture(fb_tex_width[0], fb_tex_height[0], 0, GL_RGBA8, GL_ZERO); + contour_fbo = &mlaa_fbo; + + gl_state.bind_texture_2d(mlaa_fbo.get_depth_texture_glid()); + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + + for (int32_t i = 1; i < fb_level; i++) { + fb_fbo[i].create_texture(fb_tex_width[i], fb_tex_height[i], 0, GL_RGBA16F, GL_ZERO); + + gl_state.bind_texture_2d(fb_fbo[i].get_texture_glid()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + dof->resize(fb_tex_width[0], fb_tex_height[0]); + + for (int32_t i = 0; i < 1; i++) { + texture_id id = transparency_tex[i]->id; + texture_release(transparency_tex[i]); + transparency_tex[i] = texture_load_tex_2d(id, GL_RGBA16F, + fb_tex_width[0], fb_tex_height[0], 0, 0, 0); + } + + transparency->resize(transparency_tex[0]->glid, fb_fbo[0].get_depth_texture_glid(), + fb_tex_width[0], fb_tex_height[0]); + } + + // Added + static void get_sun_transform(mat4& transform, const vec3& position, float_t radius, const cam_data& cam) { + /*mat4_mul_translate(&cam.get_view_mat(), &position, &transform); + mat4_clear_rot(&transform, &transform); + mat4_scale_rot(&transform, radius, &transform); + mat4_mul(&transform, &cam.get_proj_mat(), &transform);*/ + + mat4 mat; + mat4_invert_rotation_fast(&cam.get_view_mat(), &mat); + mat4_scale_rot(&mat, radius, &mat); + mat4_set_translation(&mat, &position); + mat4_mul(&mat, &cam.get_view_proj_mat(), &transform); } } diff --git a/src/CRE/render.hpp b/src/CRE/render.hpp index f4b2716f..be57761c 100644 --- a/src/CRE/render.hpp +++ b/src/CRE/render.hpp @@ -12,6 +12,25 @@ #include "camera.hpp" #include "render_texture.hpp" +#define TONE_MAP_SAT_GAMMA_SAMPLES 32 + +enum MagFilterType { + MAG_FILTER_NEAREST = 0, + MAG_FILTER_BILINEAR, + MAG_FILTER_SHARPEN_5_TAP, + MAG_FILTER_SHARPEN_4_TAP, + MAG_FILTER_CONE_4_TAP, + MAG_FILTER_CONE_2_TAP, + MAG_FILTER_MAX, +}; + +enum ToneMapMethod { + TONE_MAP_YCC_EXPONENT = 0, + TONE_MAP_RGB_LINEAR, + TONE_MAP_RGB_LINEAR2, + TONE_MAP_MAX, +}; + struct cam_data; struct p_gl_rend_state; struct render_data_context; @@ -22,29 +41,44 @@ namespace renderer { }; namespace rndr { - struct Render { - enum MagFilterType { - MAG_FILTER_NEAREST = 0, - MAG_FILTER_BILINEAR, - MAG_FILTER_SHARPEN_5_TAP, - MAG_FILTER_SHARPEN_4_TAP, - MAG_FILTER_CONE_4_TAP, - MAG_FILTER_CONE_2_TAP, - MAG_FILTER_MAX, + class Render { + public: + enum CaptureSlot { + CAPTURE_SLOT_CONT = 0, + CAPTURE_SLOT_A, + CAPTURE_SLOT_B, + CAPTURE_SLOT_C, + CAPTURE_SLOT_D, + CAPTURE_SLOT_E, + CAPTURE_SLOT_MAX, }; - enum FrameTextureType { - FRAME_TEXTURE_PRE_PP = 0, - FRAME_TEXTURE_POST_PP, - FRAME_TEXTURE_FB, - FRAME_TEXTURE_MAX, + enum CaptureType { + CAPTURE_PRE_PP = 0, + CAPTURE_POST_PP, + CAPTURE_FB, + CAPTURE_MAX, }; + static const int32_t fb_level_max = 5; + static const int32_t num_scr_tex = 3; + static const int32_t num_blur_tex = 5; + static const int32_t num_fb_copy = 16; + static const int32_t num_fb_movie = 1; + static const int32_t exposure_tex_width = 32; + static const int32_t tone_map_tex_width = 16 * TONE_MAP_SAT_GAMMA_SAMPLES; + static const int32_t mag_filter_tex_width = 256; + static const int32_t refract_tex_width = 512; + static const int32_t refract_tex_height = 256; + static const int32_t fade_tex_width = 512; + static const int32_t fade_tex_height = 256; + static const int32_t num_queries = 3; + struct ExposureCharaData { vec4 spot_coefficients[8]; float_t spot_weight; - GLuint query[3]; - GLuint query_data[3]; + GLuint query[num_queries]; + GLuint query_data[num_queries]; ExposureCharaData(); ~ExposureCharaData(); @@ -52,121 +86,119 @@ namespace rndr { void reset(); }; - struct FrameTextureData { - texture* texture; - RenderTexture render_texture; - FrameTextureType type; + struct CaptureData { + texture* txhd; + RenderTexture fbo; + CaptureType type; - FrameTextureData(); - ~FrameTextureData(); + CaptureData(); + ~CaptureData(); }; - struct FrameTexture { - FrameTextureData data[4]; + struct Capture { + CaptureData data[4]; bool capture; - FrameTexture(); - ~FrameTexture(); + Capture(); + ~Capture(); }; - int32_t downsample_count; - int32_t downsample_max_count; - int32_t ssaa; - int32_t taa; - int32_t mlaa; + int32_t fb_level; + int32_t blur_level; + int32_t anti_alias; + int32_t temporal_anti_alias; + int32_t morphological_anti_alias; int32_t cam_blur; - int32_t hd_res; - int32_t base_downsample; + int32_t min_render; + int32_t min_res; int32_t ss_alpha_mask; - RenderTexture rend_texture[5]; - RenderTexture taa_buffer[3]; - texture* taa_tex[3]; - RenderTexture composite_back_texture; - texture* composite_back_tex; - RenderTexture downsample_texture; - RenderTexture reduce_texture[5]; - texture* reduce_tex[5]; - RenderTexture field_340; - GLuint reduce_tex_draw; - RenderTexture exposure_texture; - GLuint exposure_tex; - texture* exposure_history; - RenderTexture field_3B8; - RenderTexture field_3E8; - GLuint tonemap_lut_texture; - RenderTexture mlaa_buffer; - RenderTexture temp_buffer; - GLuint mlaa_area_texture; - RenderTexture* sss_contour_texture; - int32_t texture_counter; - GLuint lens_shaft_query[3]; - GLuint lens_flare_query[3]; - GLuint lens_shaft_query_data[3]; - GLuint lens_flare_query_data[3]; - int32_t lens_flare_query_index; - GLuint lens_flare_texture; - GLuint lens_shaft_texture; - GLuint lens_ghost_texture; - int32_t lens_ghost_count; - int32_t width; - int32_t height; - int32_t inner_width; - int32_t inner_height; - int32_t render_width[5]; - int32_t render_height[5]; - int32_t render_post_width[5]; - int32_t render_post_height[5]; - float_t render_post_width_scale; - float_t render_post_height_scale; - int32_t reduce_width[5]; - int32_t reduce_height[5]; - int32_t taa_texture_selector; - int32_t taa_texture; - float_t taa_blend; - vec3 view_point; - vec3 interest; - vec3 view_point_prev; - vec3 interest_prev; - mat4 cam_view_projection; - mat4 cam_view_projection_prev; - int32_t stage_index; - int32_t stage_index_prev; + RenderTexture fb_fbo[fb_level_max]; + RenderTexture scr_fbo[num_scr_tex]; + texture* scr_txhd[num_scr_tex]; + RenderTexture composite_back_fbo; + texture* composite_back_txhd; + RenderTexture work_fbo; + RenderTexture blur_fbo[5]; + texture* blur_txhd[5]; + RenderTexture bloom_fbo; + GLuint bloom_tex; + RenderTexture exposure_avg_fbo; + GLuint exposure_avg_tex; + texture* exposure_txhd; + RenderTexture refract_fbo; + RenderTexture fade_fbo; + GLuint tone_map_tex; + RenderTexture mlaa_fbo; + RenderTexture user_fbo; + GLuint mlaa_area_tex; + RenderTexture* contour_fbo; + int32_t tex_count; + GLuint sun_queries_center[num_queries]; + GLuint sun_queries_sphere[num_queries]; + GLuint sun_pixels_center[num_queries]; + GLuint sun_pixels_sphere[num_queries]; + int32_t query_read_index; + GLuint flare_textures[3]; + int32_t num_ghosts; + int32_t scr_width; + int32_t scr_height; + int32_t fb_width_org; + int32_t fb_height_org; + int32_t fb_width[5]; + int32_t fb_height[5]; + int32_t fb_tex_width[5]; + int32_t fb_tex_height[5]; + float_t fb_tex_width_scale; + float_t fb_tex_height_scale; + int32_t fb_work_width[5]; + int32_t fb_work_height[5]; + int32_t scr_index; + int32_t scr_disp_index; + float_t scr_tex_rate; + vec3 cam_pos; + vec3 cam_intr; + vec3 prev_cam_pos; + vec3 prev_cam_intr; + mat4 cam_view_proj; + mat4 prev_cam_view_proj; + int32_t stage_num; + int32_t prev_stage_num; bool reset_exposure; - int32_t screen_x_offset; - int32_t screen_y_offset; - int32_t screen_width; - int32_t screen_height; - int32_t update_lut; + int32_t view_x; + int32_t view_y; + int32_t view_w; + int32_t view_h; + int32_t recalc_tone_map; int32_t saturate_lock; ExposureCharaData exposure_chara_data[6]; - int32_t exposure_history_counter; - int32_t exposure_query_index; - vec3 lens_flare_pos; - float_t lens_shaft_scale; - float_t lens_shaft_inv_scale; - float_t lens_flare_power; - float_t field_A10; - float_t lens_flare_appear_power; - texture* render_textures_data[16]; - RenderTexture render_textures[16]; - texture* movie_textures_data[1]; - RenderTexture movie_textures[1]; + int32_t exposure_write_index; + int32_t exposure_chara_write_index; + vec3 flare_pos; + float_t flare_scale; + float_t flare_scale_default; + float_t flare_alpha; + float_t flare_alpha_enable; + float_t flare_alpha_offset; + const texture* fb_copy_txhd[num_fb_copy]; + RenderTexture fb_copy_fbo[num_fb_copy]; + const texture* fb_movie_txhd[num_fb_movie]; + RenderTexture fb_movie_fbo[num_fb_movie]; int32_t composite_back; renderer::DOF3* dof; texture* transparency_tex[1]; renderer::Transparency* transparency; int32_t saturate_index; - int32_t scene_fade_index; + int32_t fade_index; int32_t tone_trans_index; - float_t saturate_coeff[2]; - vec3 scene_fade_color[2]; - float_t scene_fade_alpha[2]; - int32_t scene_fade_blend_func[2]; - vec3 tone_trans_scale[2]; - vec3 tone_trans_offset[2]; - vec3 tone_trans_start[2]; - vec3 tone_trans_end[2]; - tone_map_method tone_map; + float_t saturate_coef[2]; + float_t fade_color[2][3]; + float_t fade_rate[2]; + int32_t fade_blend_func[2]; + float_t tone_trans_scale[2][3]; + float_t tone_trans_offset[2][3]; + float_t tone_trans_start[2][3]; + float_t tone_trans_end[2][3]; + ToneMapMethod tone_map_method; float_t exposure; float_t exposure_rate; int32_t auto_exposure; @@ -174,128 +206,140 @@ namespace rndr { float_t gamma_rate; int32_t saturate_power; MagFilterType mag_filter; - float_t fade_alpha; - int32_t fade; - float_t lens_flare; - float_t lens_shaft; - float_t lens_ghost; - vec3 radius; - vec3 intensity; + float_t fade_tex_rate; + int32_t fade_tex_type; + float_t flare_coef[3]; + float_t sigma[3]; + float_t filter_inten[3]; int32_t update; - FrameTexture frame_texture[6]; - - Render(); - ~Render(); - - void apply_post_process(render_data_context& rend_data_ctx, - const cam_data& cam, texture* light_proj_tex, int32_t npr_param); - void begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back = false); - void calc_exposure_chara_data(render_data_context& rend_data_ctx, const cam_data& cam); - void draw_lens_flare(render_data_context& rend_data_ctx, const cam_data& cam); - void draw_quad(render_data_context& rend_data_ctx, - int32_t width, int32_t height, float_t s0, float_t t0, float_t s1, float_t t1, - float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w); - void draw_sss_contour(render_data_context& rend_data_ctx, const cam_data& cam); - void end_render(p_gl_rend_state& p_gl_rend_st); - bool frame_texture_cont_capture_set(bool value); - void frame_texture_free(); - int32_t frame_texture_load(int32_t slot, FrameTextureType type, texture* tex); - void frame_texture_reset(); - bool frame_texture_slot_capture_set(int32_t index); - bool frame_texture_unload(int32_t slot, texture* tex); - void free(); - bool get_auto_exposure(); - int32_t get_cam_blur(); - void get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio); - bool get_dof_enable(); - bool get_dof_update(); - float_t get_exposure(); - float_t get_exposure_rate(); - float_t get_gamma(); - float_t get_gamma_rate(); - vec3 get_intensity(); - vec3 get_lens(); - float_t get_lens_flare_appear_power(); - float_t get_lens_flare_power(); - MagFilterType get_mag_filter(); - int32_t get_mlaa(); - vec3 get_radius(); - void get_render_resolution(float_t* render_width, float_t* render_height, - float_t* render_post_width, float_t* render_post_height); - float_t get_saturate_coeff(); - int32_t get_saturate_power(); - vec4 get_scene_fade(); - float_t get_scene_fade_alpha(); - int32_t get_scene_fade_blend_func(); - vec3 get_scene_fade_color(); - int32_t get_taa(); - vec2 get_taa_offset(); - tone_map_method get_tone_map(); - void get_tone_trans(vec3& start, vec3& end); - void init_render_buffers(int32_t width, int32_t height, - int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask); - void init_post_process_buffers(); - int32_t movie_texture_set(texture* movie_texture); - void movie_texture_free(texture* movie_texture); - void post_proc(); - void pre_proc(render_data_context& rend_data_ctx); - int32_t render_texture_set(texture* render_texture, bool task_photo); - void render_texture_free(texture* render_texture, bool task_photo); - void reset_saturate_coeff(int32_t index, bool lock); - void reset_scene_fade(int32_t index); - void reset_tone_trans(int32_t index); - void resize(int32_t width, int32_t height); - void set_auto_exposure(bool value); - void set_cam_blur(int32_t value); - void set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio); - void set_dof_enable(bool value); - void set_dof_update(bool value); - void set_exposure(float_t value); - void set_exposure_rate(float_t value); - void set_gamma(float_t value); - void set_gamma_rate(float_t value); - void set_intensity(const vec3& value); - void set_lens(vec3 value); - void set_mag_filter(MagFilterType value); - void set_mlaa(int32_t value); - void set_radius(const vec3& value); - void set_saturate_coeff(float_t value, int32_t index, bool lock); - void set_saturate_power(int32_t value); - void set_scene_fade(const vec4& value, int32_t index); - void set_scene_fade_alpha(float_t value, int32_t index); - void set_scene_fade_blend_func(int32_t value, int32_t index); - void set_scene_fade_color(const vec3& value, int32_t index); - void set_screen_res(int32_t x_offset, int32_t y_offset, int32_t width, int32_t height); - void set_taa(int32_t value); - void set_tone_map(tone_map_method value); - void set_tone_trans(const vec3& start, const vec3& end, int32_t index); - void begin_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt); - void end_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha); - void update_res(bool set, int32_t base_downsample); + Capture capture[6]; private: - void apply_mlaa(render_data_context& rend_data_ctx, - int32_t destination, int32_t source, int32_t ss_alpha_mask); - void apply_tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param); - void apply_tone_map(render_data_context& rend_data_ctx, int64_t a3, int64_t a4, + void draw_quad_simple(render_data_context& rend_data_ctx, float_t trnsl); + void draw_quad_sun(render_data_context& rend_data_ctx, const mat4& transform, const vec4& emission); + void draw_quad_ghost(int32_t index, float_t opacity, mat4* mat, float_t*& data); + void measure_exposure(render_data_context& rend_data_ctx, const cam_data& cam); + void reduce_texture(render_data_context& rend_data_ctx); + void handle_blur_texture(render_data_context& rend_data_ctx); + void tone_map(render_data_context& rend_data_ctx, texture* light_proj_tex, int32_t npr_param); + void tone_map(render_data_context& rend_data_ctx, int64_t a3, int64_t a4, int32_t render_width, int32_t render_height, GLuint color_tex, GLuint bloom_tex, GLuint composite_back_tex, GLuint litproj_tex, float_t litproj_quality, int32_t width, int32_t height, float_t s0, float_t t0, const vec4& exposure, const vec3& tone_scale, const vec3& tone_offset, - int32_t fade_func, const vec4& fade_color, int32_t tone_map, float_t gamma, - const vec2& lens_flare_pos, float_t lens_shaft_scale, float_t lens_flare_coef, float_t lens_shaft_coef, + int32_t fade_blend_func, const vec4& fade_color, int32_t tone_map, float_t gamma, + const vec2& flare_pos, float_t flare_scale, float_t flare_coef, float_t shaft_coef, GLuint contour_color_tex, GLuint contour_depth_tex, GLuint scene_depth_tex, - bool npr1, bool a31, bool npr_mask); - void calc_exposure(render_data_context& rend_data_ctx, const cam_data& cam); - void calc_gaussian_blur(render_data_context& rend_data_ctx, float_t start, float_t step, + bool npr1, bool a31, bool npr_mask); // Added + void mlaa_calc_area_value(float_t& val_left, float_t& val_right, + int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright); + void mlaa_calc_area_texture(uint8_t* data, int32_t cross1, int32_t cross2); + void mlaa_gen_area_texture(); + void mlaa(render_data_context& rend_data_ctx, + int32_t destination, int32_t source, int32_t ss_alpha_mask); + void set_gauss_coef(render_data_context& rend_data_ctx, float_t start, float_t step, int32_t kernel_size, float_t radius_scale, float_t intensity_scale); - void calc_taa_blend(); - void copy_to_frame_texture(render_data_context& rend_data_ctx, + void set_tone_map_texture(p_gl_rend_state& p_gl_rend_st); + void calc_scr_tex_rate(); + + public: + Render(); + ~Render(); + + void create_render_buffer(int32_t width, int32_t height, + int32_t aa, int32_t minify, int32_t ss_alpha_mask); + void create_other(); + void destroy(); + void calc_draw_size(bool first_time, int32_t min_res); + void begin_render(p_gl_rend_state& p_gl_rend_st, bool composite_back = false); + void end_render(p_gl_rend_state& p_gl_rend_st); + void begin_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt); + void end_render_transparency(render_data_context& rend_data_ctx, RenderTexture* rt, float_t alpha); + void pre_proc(render_data_context& rend_data_ctx); + void post_proc(); + void draw_quad(render_data_context& rend_data_ctx, + int32_t texel_w, int32_t texel_h, float_t s0, float_t t0, float_t s1, float_t t1, + float_t scale, float_t param_x, float_t param_y, float_t param_z, float_t param_w); + void query_chara_exposure(render_data_context& rend_data_ctx, const cam_data& cam); + void draw_sun_request(const GLuint* flares, float_t scale, int32_t ghosts); + void draw_sun(render_data_context& rend_data_ctx, const cam_data& cam); + void draw_ghost(render_data_context& rend_data_ctx); + void draw_flare(render_data_context& rend_data_ctx, + const cam_data& cam, texture* light_proj_tex, int32_t npr_param); + void draw_contour(render_data_context& rend_data_ctx, const cam_data& cam); + int32_t register_fb_copy(const texture* txhd, bool task_photo = false); + void remove_fb_copy(const texture* txhd, bool task_photo = false); + int32_t register_fb_movie(const texture* txhd); + void remove_fb_movie(const texture* txhd); + GLuint get_scr_tex(); + void perspective(vec2& offset, float_t scale = 1.0f) const; + + void init_capture(); + void free_capture(); + int32_t register_fb_man_cap(CaptureSlot slot, CaptureType type, texture* txhd); + bool unregister_fb_man_cap(CaptureSlot slot, texture* txhd); + bool is_fb_man_cap(); + bool set_frame_texture_aoto_cap(bool value); + bool capture_slot_enable(CaptureSlot slot); + void process_capture(render_data_context& rend_data_ctx, GLuint pre_pp_tex, int32_t wight, int32_t height, GLuint post_pp_tex); - void draw_lens_ghost(render_data_context& rend_data_ctx); - void downsample(render_data_context& rend_data_ctx); - void generate_mlaa_area_texture(); - void get_blur(render_data_context& rend_data_ctx); - void update_tone_map_lut(p_gl_rend_state& p_gl_rend_st); + + void set_tone_map_method(int32_t value); + void set_exposure(float_t value); + void set_exposure_rate(float_t value); + void set_auto_exposure(int32_t value); + void set_gamma(float_t value); + void set_gamma_rate(float_t value); + void set_saturate_power(int32_t value); + void set_saturate_coef(float_t value, int32_t index = 0, bool lock = false); + void set_saturate_coef_default(int32_t index = 0, bool lock = false); + void set_mag_filter(int32_t value); + void set_temporal_aa(int32_t value); + void set_morphological_aa(int32_t value); + void set_cam_blur(int32_t value); + void set_fade_color(const vec4* in_value, int32_t index = 0); + void set_fade_color(const float_t* value, int32_t index = 0); + void set_fade_rate(float_t value, int32_t index = 0); + void set_fade_color_default(int32_t index = 0); + void set_fade_blend_func(int32_t value, int32_t index = 0); + void set_tone_trans(const float_t* start, const float_t* end, int32_t index = 0); + void set_tone_trans_default(int32_t index = 0); + void set_fade_tex_rate(float_t value); + void set_fade_tex_type(int32_t value); + void set_flare_coef(const float_t* value); + void set_sigma(const float_t* value); + void set_intensity(const float_t* value); + void set_viewport(int32_t x, int32_t y, int32_t w, int32_t h); + void get_tone_map_method(int32_t* value) const; + void get_exposure(float_t* value) const; + void get_exposure_rate(float_t* value) const; + void get_auto_exposure(int32_t* value) const; + void get_gamma(float_t* value) const; + void get_gamma_rate(float_t* value) const; + void get_saturate_power(int32_t* value) const; + void get_saturate_coef(float_t* value) const; + void get_mag_filter(int32_t* value) const; + void get_temporal_aa(int32_t* value) const; + void get_morphological_aa(int32_t* value) const; + void get_cam_blur(int32_t* value) const; + void get_fade_color(vec4* value) const; + void get_fade_color(float_t* value) const; + void get_fade_rate(float_t* value) const; + void get_fade_blend_func(int32_t* value) const; + void get_tone_trans(float_t* start_arg, float_t* end_arg) const; + void get_flare_coef(float_t* value) const; + void get_sigma(float_t* value) const; + void get_intensity(float_t* value) const; + void get_render_param(float_t* fb_width_arg, float_t* fb_height_arg, + float_t* fb_tex_width_arg, float_t* fb_tex_height_arg) const; + + void enable_dof_set(bool value); + void update_dof_set(bool value); // Added + bool get_dof_enable(); + bool get_dof_update(); // Added + void get_dof_data(float_t& focus, float_t& focus_range, float_t& fuzzing_range, float_t& ratio); + void set_dof_data(float_t focus, float_t focus_range, float_t fuzzing_range, float_t ratio); + + void resize(int32_t width, int32_t height); // Added }; } diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 7a54efd9..fba46dbc 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -7,6 +7,8 @@ #include "app_system_detail.hpp" #include "gl_rend_state.hpp" #include "gl_state.hpp" +#include "render.hpp" +#include "render_manager.hpp" #include "shader_ft.hpp" #include "shadow.hpp" #include "sound.hpp" @@ -1050,11 +1052,12 @@ vec2i render_context::texture_skinning_buffer::fill_data(const void* data, int32 render_context::render_context() : litproj(), chara_reflect(), chara_refract(), box_vao(), lens_ghost_vao(), common_vao(), empty_texture_2d(), empty_texture_cube_map(), samplers(), render_samplers(), sprite_samplers(), -sprite_width(), sprite_height(), screen_x_offset(), screen_y_offset(), screen_width(), screen_height() { +view_w(), view_h(), view_x(), view_y(), screen_width(), screen_height() { camera = new ::camera; draw_state = new ::draw_state; disp_manager = new mdl::DispManager; etc_obj_manager = new mdl::EtcObjManager; + render = new rndr::Render; render_manager = new rndr::RenderManager; sss_data = new ::sss_data; @@ -1347,6 +1350,11 @@ render_context::~render_context() { render_manager = 0; } + if (render) { + delete render; + render = 0; + } + if (etc_obj_manager) { delete etc_obj_manager; etc_obj_manager = 0; @@ -1445,46 +1453,44 @@ void render_context::init() { src.get_depth_texture() ? src.get_depth_texture()->internal_format : GL_ZERO); }; - RenderTexture& render_buffer = render.rend_texture[0]; + RenderTexture& render_buffer = render->fb_fbo[0]; RenderTexture& reflect_buffer = render_manager->get_render_texture(0); RenderTexture& shadow_buffer = get_shadow()->get_rtex(1); init_copy_buffer(reflect_buffer, this->reflect_buffer); init_copy_buffer(render_buffer, this->render_buffer); init_copy_buffer(shadow_buffer, this->shadow_buffer); - screen_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0); - screen_overlay_buffer.create_texture(sprite_width, sprite_height, 0, GL_RGBA8, 0); + screen_buffer.create_texture(view_w, view_h, 0, GL_RGBA8, 0); + screen_overlay_buffer.create_texture(view_w, view_h, 0, GL_RGBA8, 0); } void render_context::resize(int32_t render_width, int32_t render_height, - int32_t sprite_width, int32_t sprite_height, - int32_t screen_width, int32_t screen_height) { - bool render_res_change = render.inner_width != render_width || render.inner_height != render_height; - bool sprite_res_change = this->sprite_width != sprite_width || this->sprite_height != sprite_height; + int32_t view_w, int32_t view_h, int32_t screen_width, int32_t screen_height) { + bool render_res_change = render->fb_width_org != render_width || render->fb_height_org != render_height; + bool sprite_res_change = this->view_w != view_w || this->view_h != view_h; bool screen_res_change = this->screen_width != screen_width || this->screen_height != screen_height; if (!render_res_change && !sprite_res_change && !screen_res_change) return; - this->sprite_width = sprite_width; - this->sprite_height = sprite_height; + this->view_w = view_w; + this->view_h = view_h; - screen_x_offset = (screen_width - sprite_width) / 2 + (screen_width - sprite_width) % 2; - screen_y_offset = (screen_height - sprite_height) / 2 + (screen_height - sprite_height) % 2; + view_x = (screen_width - view_w) / 2 + (screen_width - view_w) % 2; + view_y = (screen_height - view_h) / 2 + (screen_height - view_h) % 2; this->screen_width = screen_width; this->screen_height = screen_height; if (render_res_change) - render.resize(render_width, render_height); + render->resize(render_width, render_height); if (sprite_res_change) - render_manager->resize(sprite_width, sprite_height); + render_manager->resize(view_w, view_h); if (render_res_change) litproj->resize(render_width, render_height); - sprite_manager_set_res((double_t)sprite_width / (double_t)sprite_height, - sprite_width, sprite_height); + sprite_manager_set_res((double_t)view_w / (double_t)view_h, view_w, view_h); if (render_res_change) { free(); diff --git a/src/CRE/render_context.hpp b/src/CRE/render_context.hpp index a9fbf182..e51ad965 100644 --- a/src/CRE/render_context.hpp +++ b/src/CRE/render_context.hpp @@ -18,8 +18,6 @@ #include "mdl/disp_manager.hpp" #include "camera.hpp" #include "gl_rend_state.hpp" -#include "render.hpp" -#include "render_manager.hpp" #include "render_texture.hpp" #include "sss.hpp" #include @@ -429,6 +427,11 @@ struct render_data { void set_shader(uint32_t index); }; +namespace rndr { + class Render; + class RenderManager; +} + struct render_data_context { struct fog_params { vec4 depth_color; @@ -552,6 +555,7 @@ struct render_context { draw_state* draw_state; mdl::DispManager* disp_manager; mdl::EtcObjManager* etc_obj_manager; + rndr::Render* render; rndr::RenderManager* render_manager; sss_data* sss_data; @@ -560,7 +564,6 @@ struct render_context { light_proj* litproj; light_set light_set[LIGHT_SET_MAX]; - rndr::Render render; bool chara_reflect; bool chara_refract; @@ -607,10 +610,10 @@ struct render_context { GLuint render_samplers[4]; GLuint sprite_samplers[3]; - int32_t sprite_width; - int32_t sprite_height; - int32_t screen_x_offset; - int32_t screen_y_offset; + int32_t view_w; + int32_t view_h; + int32_t view_x; + int32_t view_y; int32_t screen_width; int32_t screen_height; @@ -632,7 +635,7 @@ struct render_context { void free(); void init(); void resize(int32_t render_width, int32_t render_height, - int32_t sprite_width, int32_t sprite_height, + int32_t view_w, int32_t view_h, int32_t screen_width, int32_t screen_height); void add_shared_storage_uniform_buffer_data(size_t index, diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index 11e8297d..c520f9ba 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -57,8 +57,8 @@ static void draw_pass_reflect_full(render_data_context& rend_data_ctx, rndr::Ren void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderTexture* dst, RenderTexture* src, ImgfBoxSampl filter, const vec2 res_scale, const vec4 scale, const vec4 offset); -static void render_manager_free_render_textures(); -static void render_manager_init_render_textures(int32_t multisample); +static void rndpass_create_render_texture(int32_t multisample); +static void rndpass_free_render_texture(); static void set_reflect_mat(render_data_context& rend_data_ctx, cam_data& cam); @@ -102,7 +102,7 @@ namespace rndr { silhouette_high(), show_ref_map(), reflect_type(), clear(), tex_index(), width(), height(), multisample_framebuffer(), multisample_renderbuffer(), multisample(), check_state(), show_vector_flags(), show_vector_length(), show_vector_z_offset(), show_stage_shadow(), effect_texture(), npr_param(), - npr_mask(), reflect_texture_mask(), reflect_tone_curve(), field_31F(), light_stage_ambient(), npr() { + npr_mask(), reflect_texture_mask(), reflect_tone_curve(), field_31F(), light_stage_ambient(), ss4x() { for (bool& i : pass_sw) i = true; @@ -232,7 +232,7 @@ namespace rndr { multisample_renderbuffer = 0; multisample = false;//true; - npr = false; + ss4x = false; } void RenderManager::resize(int32_t width, int32_t height) { @@ -582,21 +582,22 @@ namespace rndr { if (npr_param == 1) { if (sss->enable && sss->downsample) { rend_data_ctx.shader_flags.arr[U_NPR] = 1; - rend->draw_sss_contour(rend_data_ctx, reflect_cam); + rend->draw_contour(rend_data_ctx, reflect_cam); } - else if (npr) { + else if (ss4x) { refl_tex.begin_render(rend_data_ctx.state); refl_tex.set_viewport(rend_data_ctx.state); rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); rend_data_ctx.state.set_depth_mask(GL_TRUE); rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, reflect_cam); rend_data_ctx.state.disable_depth_test(); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; refl_tex.end_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_NPR] = 1; - rend->draw_sss_contour(rend_data_ctx, reflect_cam); + rend->draw_contour(rend_data_ctx, reflect_cam); } } @@ -633,21 +634,22 @@ namespace rndr { if (npr_param == 1) { if (sss->enable && sss->downsample) { rend_data_ctx.shader_flags.arr[U_NPR] = 1; - rend->draw_sss_contour(rend_data_ctx, cam); + rend->draw_contour(rend_data_ctx, cam); } - else if (npr) { - rend->rend_texture[0].begin_render(rend_data_ctx.state); - rend->rend_texture[0].set_viewport(rend_data_ctx.state); + else if (ss4x) { + rend->fb_fbo[0].begin_render(rend_data_ctx.state); + rend->fb_fbo[0].set_viewport(rend_data_ctx.state); rend_data_ctx.state.clear(GL_DEPTH_BUFFER_BIT); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = SHADER_FT_SSS_SKIN; rend_data_ctx.state.enable_depth_test(); + rend_data_ctx.state.set_depth_func(GL_LEQUAL); rend_data_ctx.state.set_depth_mask(GL_TRUE); rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SSS, cam); rend_data_ctx.state.disable_depth_test(); rctx->draw_state->rend_data[rend_data_ctx.index].shader_index = -1; - rend->rend_texture[0].end_render(rend_data_ctx.state); + rend->fb_fbo[0].end_render(rend_data_ctx.state); rend_data_ctx.shader_flags.arr[U_NPR] = 1; - rend->draw_sss_contour(rend_data_ctx, cam); + rend->draw_contour(rend_data_ctx, cam); } } @@ -916,7 +918,7 @@ namespace rndr { rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); spr::flush(rend_data_ctx, spr::SPR_TARGET_BACK, true, - rend->temp_buffer.get_texture(), + rend->user_fbo.get_texture(), rctx->camera->view_projection_aet_3d); rend_data_ctx.state.enable_cull_face(); rend_data_ctx.state.disable_blend(); @@ -1014,12 +1016,12 @@ namespace rndr { if (silhouette_high) rctx->disp_manager->draw(rend_data_ctx, mdl::OBJ_TYPE_SILHOUETTE_HIGH, cam); - render->calc_exposure_chara_data(rend_data_ctx, cam); + render->query_chara_exposure(rend_data_ctx, cam); if (npr_param == 1) pass_3d_contour(rend_data_ctx); - render->draw_lens_flare(rend_data_ctx, cam); + render->draw_sun(rend_data_ctx, cam); star_catalog_draw(rend_data_ctx, cam); draw_pass_3d_translucent(rend_data_ctx, rctx, @@ -1082,7 +1084,10 @@ namespace rndr { cam_data screen_cam = cam; screen_cam.set_fov(32.2673416137695f * DEG_TO_RAD_FLOAT); - screen_cam.calc_persp_proj_mat_offset(1.0f, rctx->render.get_taa_offset()); + vec2 persp_scale = 1.0f; + vec2 persp_offset; + rctx->render->perspective(persp_offset); + screen_cam.calc_persp_proj_mat_offset(persp_scale, persp_offset); screen_cam.calc_view_proj_mat(); rend_data_ctx.set_batch_scene_camera(screen_cam); @@ -1153,7 +1158,7 @@ namespace rndr { light_proj_tex = litproj->draw_texture.get_texture(); } - render->apply_post_process(rend_data_ctx, cam, light_proj_tex, npr_param); + render->draw_flare(rend_data_ctx, cam, light_proj_tex, npr_param); rend_data_ctx.state.end_event(); } @@ -1207,14 +1212,14 @@ namespace rndr { void RenderManager::pass_3d_contour(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; RenderTexture* rt; - RenderTexture* contour_rt; + RenderTexture* contour_fbo; if (reflect_draw) { rt = &get_render_texture(0); - contour_rt = &rctx->reflect_buffer; + contour_fbo = &rctx->reflect_buffer; } else { - rt = &render->rend_texture[0]; - contour_rt = render->sss_contour_texture; + rt = &render->fb_fbo[0]; + contour_fbo = render->contour_fbo; } rend_data_ctx.state.begin_event("`anonymous-namespace'::draw_npr_frame"); @@ -1240,8 +1245,8 @@ namespace rndr { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_CONTOUR_NPR); rend_data_ctx.state.active_bind_texture_2d(14, rt->get_depth_texture_glid()); - rend_data_ctx.state.active_bind_texture_2d(16, contour_rt->get_texture_glid()); - rend_data_ctx.state.active_bind_texture_2d(17, contour_rt->get_depth_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(16, contour_fbo->get_texture_glid()); + rend_data_ctx.state.active_bind_texture_2d(17, contour_fbo->get_depth_texture_glid()); rend_data_ctx.state.bind_sampler(14, rctx->render_samplers[1]); rend_data_ctx.state.bind_sampler(16, rctx->render_samplers[1]); rend_data_ctx.state.bind_sampler(17, rctx->render_samplers[1]); @@ -1273,7 +1278,7 @@ namespace rndr { rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT_3D_SURF, true, - rend->temp_buffer.get_texture(), + rend->user_fbo.get_texture(), rctx->camera->view_projection_aet_2d); } } @@ -1312,24 +1317,25 @@ void image_filter_scale(render_data_context& rend_data_ctx, rend_data_ctx.state.end_event(); } -void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask, bool npr) { +// 0x140502A10 +void rndpass_init(int32_t anti_alias, int32_t min_render, int32_t ss_alpha_mask, bool ss4x) { rndr::RenderManager& render_manager = *rctx_ptr->render_manager; render_manager.reset(); - render_manager.npr = npr; + render_manager.ss4x = ss4x; RenderTexture::init(); ScreenParam& screen_param = get_screen_param(); ScreenParam& render_screen_param = get_render_screen_param(); - render_manager.render = &rctx_ptr->render; - render_manager.render->init_render_buffers(render_screen_param.width, - render_screen_param.height, ssaa, hd_res, ss_alpha_mask); - render_manager.render->set_screen_res(render_screen_param.xoffset, + render_manager.render = rctx_ptr->render; + render_manager.render->create_render_buffer(render_screen_param.width, + render_screen_param.height, anti_alias, min_render, ss_alpha_mask); + render_manager.render->set_viewport(render_screen_param.xoffset, render_screen_param.yoffset, render_screen_param.width, render_screen_param.height); render_manager.width = screen_param.width; render_manager.height = screen_param.height; - render_manager_init_render_textures(1); - render_manager.render->init_post_process_buffers(); + rndpass_create_render_texture(1); + render_manager.render->create_other(); init_shadow(); render_manager.shadow_ptr = get_shadow(); @@ -1339,11 +1345,12 @@ void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mas gl_get_error_print(); } -void render_manager_free_data() { +// 0x140502770 +void rndpass_finish() { rndr::RenderManager& render_manager = *rctx_ptr->render_manager; - render_manager_free_render_textures(); - render_manager.render->free(); + rndpass_free_render_texture(); + render_manager.render->destroy(); finish_shadow(); rctx_ptr->sss_data->free(); } @@ -1513,10 +1520,10 @@ static void draw_pass_3d_translucent(render_data_context& rend_data_ctx, && rctx->disp_manager->get_obj_count(translucent) < 1) return; - rndr::Render* rend = &rctx->render; + rndr::Render* rend = rctx->render; RenderTexture& rt = reflect_draw - ? rctx->render_manager->get_render_texture(0) : rend->rend_texture[0]; + ? rctx->render_manager->get_render_texture(0) : rend->fb_fbo[0]; int32_t alpha_array[256]; int32_t count = draw_pass_3d_translucent_count_layers(rctx, @@ -1548,10 +1555,10 @@ static void draw_pass_3d_translucent(render_data_context& rend_data_ctx, && rctx->disp_manager->get_obj_count(translucent) < 1) return; - rndr::Render* rend = &rctx->render; + rndr::Render* rend = rctx->render; RenderTexture& rt = reflect_draw - ? rctx->render_manager->get_render_texture(0) : rend->rend_texture[0]; + ? rctx->render_manager->get_render_texture(0) : rend->fb_fbo[0]; int32_t alpha_array[256]; int32_t count = draw_pass_3d_translucent_count_layers(rctx, @@ -1854,28 +1861,8 @@ void apply_blur_filter_sub(render_data_context& rend_data_ctx, RenderTexture* ds rend_data_ctx.state.end_event(); } -static void render_manager_free_render_textures() { - rndr::RenderManager& render_manager = *rctx_ptr->render_manager; - -#ifdef USE_OPENGL - if (!Vulkan::use) { - if (render_manager.multisample_renderbuffer) { - glDeleteRenderbuffers(1, &render_manager.multisample_renderbuffer); - render_manager.multisample_renderbuffer = 0; - } - - if (render_manager.multisample_framebuffer) { - glDeleteFramebuffers(1, &render_manager.multisample_framebuffer); - render_manager.multisample_framebuffer = 0; - } - } -#endif - - for (RenderTexture& i : render_manager.render_textures) - i.destroy(); -} - -static void render_manager_init_render_textures(int32_t multisample) { +// 0x140502560 +static void rndpass_create_render_texture(int32_t multisample) { rndr::RenderManager& render_manager = *rctx_ptr->render_manager; #ifdef USE_OPENGL @@ -1918,6 +1905,28 @@ static void render_manager_init_render_textures(int32_t multisample) { gl_state.bind_framebuffer(0); } +// 0x1405027A0 +static void rndpass_free_render_texture() { + rndr::RenderManager& render_manager = *rctx_ptr->render_manager; + +#ifdef USE_OPENGL + if (!Vulkan::use) { + if (render_manager.multisample_renderbuffer) { + glDeleteRenderbuffers(1, &render_manager.multisample_renderbuffer); + render_manager.multisample_renderbuffer = 0; + } + + if (render_manager.multisample_framebuffer) { + glDeleteFramebuffers(1, &render_manager.multisample_framebuffer); + render_manager.multisample_framebuffer = 0; + } + } +#endif + + for (RenderTexture& i : render_manager.render_textures) + i.destroy(); +} + static void set_reflect_mat(render_data_context& rend_data_ctx, cam_data& cam) { const vec3 clip_plane = *(vec3*)&rend_data_ctx.data.buffer_scene_data.g_clip_plane; const vec4 temp = 2.0f * rend_data_ctx.data.buffer_scene_data.g_clip_plane; diff --git a/src/CRE/render_manager.hpp b/src/CRE/render_manager.hpp index 4391b36d..721721de 100644 --- a/src/CRE/render_manager.hpp +++ b/src/CRE/render_manager.hpp @@ -6,10 +6,13 @@ #pragma once #include "../KKdLib/default.hpp" +#include "../KKdLib/image.hpp" #include "../KKdLib/time.hpp" #include "../KKdLib/vec.hpp" +#include "camera.hpp" #include "gl.hpp" -#include "render.hpp" +#include "render_texture.hpp" +#include "static_var.hpp" #include enum reflect_refract_resolution_mode { @@ -49,7 +52,10 @@ namespace rndr { RND_PASSID_NUM, }; - struct RenderManager { + class Render; + + class RenderManager { + public: bool pass_sw[RND_PASSID_NUM]; Shadow* shadow_ptr; bool reflect; @@ -91,7 +97,7 @@ namespace rndr { bool reflect_tone_curve; bool field_31F; bool light_stage_ambient; - bool npr; + bool ss4x; cam_data cam; RenderManager(); @@ -148,5 +154,5 @@ namespace rndr { extern void image_filter_scale(render_data_context& rend_data_ctx, RenderTexture* dst, texture* src, const vec4& scale = 1.0f); -extern void render_manager_init_data(int32_t ssaa, int32_t hd_res, int32_t ss_alpha_mask, bool npr); -extern void render_manager_free_data(); +extern void rndpass_init(int32_t anti_alias, int32_t min_render, int32_t ss_alpha_mask, bool ss4x); +extern void rndpass_finish(); diff --git a/src/CRE/renderer/dof.cpp b/src/CRE/renderer/dof.cpp index e553fafa..cac57b48 100644 --- a/src/CRE/renderer/dof.cpp +++ b/src/CRE/renderer/dof.cpp @@ -86,7 +86,7 @@ namespace renderer { size_t rob_num = rob_man->get_rob_num(); for (int32_t i = 0; i < rob_num; i++) { rob_chara* rob_chr = rob_man->get_rob((ROB_ID)i); - if (!rob_chr || !rob_chr->check_disp()) + if (!rob_chr || !rob_chr->get_disp()) continue; mat4 mat = mat4_identity; diff --git a/src/CRE/renderer/dof.hpp b/src/CRE/renderer/dof.hpp index 3813e78f..0c40e601 100644 --- a/src/CRE/renderer/dof.hpp +++ b/src/CRE/renderer/dof.hpp @@ -34,7 +34,7 @@ struct dof_debug { struct dof_pv { bool enable; - bool update; + bool update; // Added dof_f2 f2; }; diff --git a/src/CRE/renderer/transparency.cpp b/src/CRE/renderer/transparency.cpp index b5263e31..54b317f2 100644 --- a/src/CRE/renderer/transparency.cpp +++ b/src/CRE/renderer/transparency.cpp @@ -6,6 +6,7 @@ #include "transparency.hpp" #include "../../KKdLib/str_utils.hpp" #include "../gl_rend_state.hpp" +#include "../render.hpp" #include "../render_context.hpp" #include "../shader_ft.hpp" @@ -56,7 +57,7 @@ namespace renderer { shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); rend_data_ctx.state.active_bind_texture_2d(0, texture); rend_data_ctx.state.bind_sampler(0, rctx_ptr->render_samplers[1]); - rctx_ptr->render.draw_quad(rend_data_ctx, m_fbo.get_width(), m_fbo.get_height(), + rctx_ptr->render->draw_quad(rend_data_ctx, m_fbo.get_width(), m_fbo.get_height(), 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); rend_data_ctx.state.enable_depth_test(); } diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index 18f2bb1b..bb37b89d 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -23,6 +23,7 @@ #include "../pv_db.hpp" #include "../pv_expression.hpp" #include "../random.hpp" +#include "../render_manager.hpp" #include "../screen_param.hpp" #include "../shadow.hpp" #include "../stage.hpp" @@ -5182,7 +5183,7 @@ void rob_chara::set_rob_motion(uint32_t motnum, bool mirror, float_t frame, // 0x140516890 void rob_chara::set_rob_motion_external(uint32_t motnum) { - if (check_disp()) + if (get_disp()) set_rob_sys_command(ROB_ACT_MOTION, motnum, 0, false); } @@ -5826,7 +5827,7 @@ bool RobManagement::get_colli_check_on() const { // 0x140531F50 bool RobManagement::get_disp_on(ROB_ID id) const { if (is_init(id)) - return rob_impl[id].check_disp(); + return rob_impl[id].get_disp(); return false; } @@ -15561,40 +15562,6 @@ prj::BallCollision::BallCollision() : sink(), colli_ball_mask(), org_rad() { } -pos_scale::pos_scale() : scale() { - -} - -float_t pos_scale::get_screen_pos_scale(const mat4& mat, - const vec3& pos, float_t scale, bool apply_offset) { - vec4 v19; - *(vec3*)&v19 = pos; - v19.w = 1.0f; - mat4_transform_vector(&mat, &v19, &v19); - - if (fabsf(v19.w) >= 1.0e-10f) { - float_t v11 = v19.y * (1.0f / v19.w); - float_t v12 = v19.x * (1.0f / v19.w) + 1.0f; - ScreenParam& render_screen_param = get_render_screen_param(); - float_t v14 = (float_t)(v12 * 0.5f) * (float_t)render_screen_param.width; - float_t v15 = (float_t)((1.0f - v11) * 0.5f) * (float_t)render_screen_param.height; - if (apply_offset) { - ScreenParam& screen_param = get_screen_param(); - v14 += (float_t)render_screen_param.xoffset; - v15 += (float_t)(screen_param.height - render_screen_param.yoffset - render_screen_param.height); - } - this->pos.x = v14; - this->pos.y = v15; - this->scale = -v19.w; - return fabsf(1.0f / v19.w) * (rctx_ptr->camera->depth * scale); - } - else { - this->pos = 0.0f; - this->scale = 0.0f; - return 0.0f; - } -} - RobColliWall::RobColliWall() : wdist(), wheight() { } @@ -15670,7 +15637,7 @@ void RobCollision::init() { for (prj::BallCollision& i : cb_stg) i = {}; - for (pos_scale& i : field_1AA0) + for (vec3& i : field_1AA0) i = {}; for (float_t& i : field_1BE4) @@ -19630,7 +19597,7 @@ void TaskRobDisp::disp() { if (!i || pv_osage_manager_array_get_disp((ROB_ID)i->idnm)) continue; - if (i->check_disp() && !i->check_zero_disp()) + if (i->get_disp() && !i->check_zero_disp()) i->disp_rob_disp_main(); } } diff --git a/src/CRE/rob/rob.hpp b/src/CRE/rob/rob.hpp index 91e3155a..50fa28e3 100644 --- a/src/CRE/rob/rob.hpp +++ b/src/CRE/rob/rob.hpp @@ -4800,16 +4800,6 @@ namespace prj { }; } -struct pos_scale { - vec2 pos; - float_t scale; - - pos_scale(); - - float_t get_screen_pos_scale(const mat4& mat, - const vec3& pos, float_t scale = 0.0f, bool apply_offset = false); -}; - struct RobColliWall { float_t wdist; RobAngle wang; @@ -4856,7 +4846,7 @@ struct RobCollision { prj::BallCollision cb_hit[CB_NUM]; prj::BallCollision cb_rob[CB_NUM]; prj::BallCollision cb_stg[CB_NUM]; - pos_scale field_1AA0[CB_NUM]; + vec3 field_1AA0[CB_NUM]; float_t field_1BE4[CB_NUM]; prj::vector_pair field_1C50; int64_t field_1C68; @@ -5158,7 +5148,7 @@ public: void ControlMotionFrameStep(); void UpdateMotionFrame(); - inline bool check_disp() { + inline bool get_disp() { return rob_base.flag.bit.disp; } diff --git a/src/CRE/shadow.cpp b/src/CRE/shadow.cpp index bec4861c..93ab1168 100644 --- a/src/CRE/shadow.cpp +++ b/src/CRE/shadow.cpp @@ -6,6 +6,7 @@ #include "shadow.hpp" #include "gl_state.hpp" #include "render_context.hpp" +#include "render_manager.hpp" #include "shader_ft.hpp" #define MIN_SHADOW_RANGE (1.2f) diff --git a/src/CRE/sss.cpp b/src/CRE/sss.cpp index ae09eb2e..90d50281 100644 --- a/src/CRE/sss.cpp +++ b/src/CRE/sss.cpp @@ -7,7 +7,9 @@ #include "rob/rob.hpp" #include "camera.hpp" #include "reflect_full.hpp" +#include "render.hpp" #include "render_context.hpp" +#include "render_manager.hpp" #include "shader_ft.hpp" extern render_context* rctx_ptr; @@ -46,22 +48,22 @@ void sss_data::apply_filter(struct render_data_context& rend_data_ctx) { rend_data_ctx.state.active_texture(0); if (downsample) { textures[0].begin_render(rend_data_ctx.state); - rndr::Render* rend = &rctx->render; - float_t render_width; - float_t render_height; - float_t render_post_width; - float_t render_post_height; - rend->get_render_resolution(&render_width, &render_height, &render_post_width, &render_post_height); + rndr::Render* rend = rctx->render; + float_t fb_width; + float_t fb_height; + float_t fb_tex_width; + float_t fb_tex_height; + rend->get_render_param(&fb_width, &fb_height, &fb_tex_width, &fb_tex_height); rend_data_ctx.state.set_viewport(0, 0, 640, 360); rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); RenderTexture& rt = reflect_draw ? rctx->render_manager->get_render_texture(0) - : rend->rend_texture[0]; + : rend->fb_fbo[0]; rend_data_ctx.state.bind_texture_2d(rt.get_texture_glid()); rend_data_ctx.state.bind_sampler(0, rctx->render_samplers[0]); sss_draw_quad(rend_data_ctx, rt.get_width(), rt.get_height(), - render_width / render_post_width, render_height / render_post_height, 1.0f, 1.0f, 1.0f, 1.0f); + fb_width / fb_tex_width, fb_height / fb_tex_height, 1.0f, 1.0f, 1.0f, 1.0f); } textures[2].begin_render(rend_data_ctx.state); @@ -186,18 +188,18 @@ bool sss_data::set(struct render_data_context& rend_data_ctx) { return false; } - rndr::Render* rend = &rctx_ptr->render; - float_t render_width; - float_t render_height; - rend->get_render_resolution(&render_width, &render_height, 0, 0); + rndr::Render* rend = rctx_ptr->render; + float_t fb_width; + float_t fb_height; + rend->get_render_param(&fb_width, &fb_height, 0, 0); - if (render_width > 1280.0f) + if (fb_width > 1280.0f) downsample = false; downsample = true; // Added if (downsample) { - rend->rend_texture[0].begin_render(rend_data_ctx.state); - rend_data_ctx.state.set_viewport(0, 0, (int32_t)render_width, (int32_t)render_height); + rend->fb_fbo[0].begin_render(rend_data_ctx.state); + rend_data_ctx.state.set_viewport(0, 0, (int32_t)fb_width, (int32_t)fb_height); } else { textures[0].begin_render(rend_data_ctx.state); @@ -286,6 +288,6 @@ static void sss_calc_coef(const double_t step, const int32_t size, static void sss_draw_quad(render_data_context& rend_data_ctx, int32_t width, int32_t height, float_t s, float_t t, float_t param_x, float_t param_y, float_t param_z, float_t param_w) { - rctx_ptr->render.draw_quad(rend_data_ctx, width, height, + rctx_ptr->render->draw_quad(rend_data_ctx, width, height, s, t, 0.0f, 0.0f, 1.0f, param_x, param_y, param_z, param_w); } diff --git a/src/CRE/stage.cpp b/src/CRE/stage.cpp index d34846c4..29378930 100644 --- a/src/CRE/stage.cpp +++ b/src/CRE/stage.cpp @@ -11,7 +11,9 @@ #include "effect.hpp" #include "light_param.hpp" #include "stage_param.hpp" +#include "render.hpp" #include "render_context.hpp" +#include "render_manager.hpp" #include "shadow.hpp" namespace stage_detail { @@ -550,19 +552,13 @@ static void stage_disp(stage* s) { disp_manager.entry_obj_by_object_info(t, s->stage_data->object_sky); } - if (s->stage_data->lens_flare_texture != -1 && s->lens_flare) { + if (s->stage_data->tex_flare != -1 && s->lens_flare) { int32_t object_set_id = s->stage_data->object_set_id; - rndr::Render* rend = &rctx_ptr->render; - rend->lens_flare_texture = get_objset_gen_textures_id( - object_set_id, s->stage_data->lens_flare_texture); - if (rend->lens_flare_texture) { - rend->lens_shaft_texture = get_objset_gen_textures_id( - object_set_id, s->stage_data->lens_shaft_texture); - rend->lens_ghost_texture = get_objset_gen_textures_id( - object_set_id, s->stage_data->lens_ghost_texture); - rend->lens_ghost_count = 16; - rend->lens_shaft_inv_scale = s->stage_data->lens_shaft_inv_scale; - } + GLuint flares[3]; + flares[0] = get_objset_gen_textures_id(object_set_id, s->stage_data->tex_flare); + flares[1] = get_objset_gen_textures_id(object_set_id, s->stage_data->tex_shaft); + flares[2] = get_objset_gen_textures_id(object_set_id, s->stage_data->tex_ghost); + rctx_ptr->render->draw_sun_request(flares, s->stage_data->shaft_scale, s->stage_data->num_ghosts); } } @@ -603,15 +599,15 @@ static void stage_free(stage* s) { rndr::RenderManager* render_manager = rctx_ptr->render_manager; if (s->stage_data->render_texture != -1) - rctx_ptr->render.render_texture_free( + rctx_ptr->render->remove_fb_copy( texture_manager_get_texture(s->stage_data->render_texture), 0); if (s->stage_data->movie_texture != -1) - rctx_ptr->render.movie_texture_free( + rctx_ptr->render->remove_fb_movie( texture_manager_get_texture(s->stage_data->movie_texture)); render_manager->set_shadow_true(); - rctx_ptr->render.set_cam_blur(0); + rctx_ptr->render->set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; render_manager->reflect_texture_mask = false; render_manager->reflect_tone_curve = false; @@ -663,11 +659,11 @@ static void stage_load(stage* s) { return; if (s->stage_data->render_texture != -1) - rctx_ptr->render.render_texture_set( + rctx_ptr->render->register_fb_copy( texture_manager_get_texture(s->stage_data->render_texture), 0); if (s->stage_data->movie_texture != -1) - rctx_ptr->render.movie_texture_set( + rctx_ptr->render->register_fb_movie( texture_manager_get_texture(s->stage_data->movie_texture)); s->state = 6; } @@ -706,7 +702,7 @@ static void stage_set(stage* s, stage* other) { render_manager->field_31F = false; render_manager->light_stage_ambient = false; render_manager->set_shadow_true(); - rctx_ptr->render.set_cam_blur(0); + rctx_ptr->render->set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; render_manager->set_npr_param(0); light_chara_ambient = false; diff --git a/src/CRE/stage_modern.cpp b/src/CRE/stage_modern.cpp index 96043af0..3407a8c2 100644 --- a/src/CRE/stage_modern.cpp +++ b/src/CRE/stage_modern.cpp @@ -10,7 +10,9 @@ #include "rob/rob.hpp" #include "effect.hpp" #include "light_param.hpp" +#include "render.hpp" #include "render_context.hpp" +#include "render_manager.hpp" #include "shadow.hpp" namespace stage_detail { @@ -521,15 +523,15 @@ static void stage_modern_free(stage_modern* s) { rndr::RenderManager* render_manager = rctx_ptr->render_manager; if (s->stage_data->render_texture != -1 && s->stage_data->render_texture != hash_murmurhash_empty) - rctx_ptr->render.render_texture_free( + rctx_ptr->render->remove_fb_copy( texture_manager_get_texture(s->stage_data->render_texture), 0); if (s->stage_data->movie_texture != -1 && s->stage_data->movie_texture != hash_murmurhash_empty) - rctx_ptr->render.movie_texture_free( + rctx_ptr->render->remove_fb_movie( texture_manager_get_texture(s->stage_data->movie_texture)); render_manager->set_shadow_true(); - rctx_ptr->render.set_cam_blur(0); + rctx_ptr->render->set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; render_manager->reflect_texture_mask = false; render_manager->reflect_tone_curve = false; @@ -576,11 +578,11 @@ static void stage_modern_load(stage_modern* s, void* data, object_database* obj_ return; if (s->stage_data->render_texture != -1 && s->stage_data->render_texture != hash_murmurhash_empty) - rctx_ptr->render.render_texture_set( + rctx_ptr->render->register_fb_copy( texture_manager_get_texture(s->stage_data->render_texture), 0); if (s->stage_data->movie_texture != -1 && s->stage_data->movie_texture != hash_murmurhash_empty) - rctx_ptr->render.movie_texture_set( + rctx_ptr->render->register_fb_movie( texture_manager_get_texture(s->stage_data->movie_texture)); s->state = 6; } @@ -617,7 +619,7 @@ static void stage_modern_set(stage_modern* s, stage_modern* other) { render_manager->field_31F = false; render_manager->light_stage_ambient = false; render_manager->set_shadow_true(); - rctx_ptr->render.set_cam_blur(0); + rctx_ptr->render->set_cam_blur(0); npr_cloth_spec_color.w = 1.0f; render_manager->set_npr_param(0); light_chara_ambient = false; diff --git a/src/KKdLib/database/stage.cpp b/src/KKdLib/database/stage.cpp index d976207a..9f6cdbcb 100644 --- a/src/KKdLib/database/stage.cpp +++ b/src/KKdLib/database/stage.cpp @@ -32,50 +32,50 @@ stage_effects_modern::stage_effects_modern() { field_20[0] = -1; } -stage_data_file::stage_data_file() : id(), object_set_id(), lens_flare_texture(), lens_shaft_texture(), -lens_ghost_texture(), unknown(), render_texture(), movie_texture(), reflect_type(), refract_enable(), +stage_data_file::stage_data_file() : id(), object_set_id(), tex_flare(), tex_shaft(), tex_ghost(), +num_ghosts(), render_texture(), movie_texture(), reflect_type(), refract_enable(), reflect(), reflect_data(), refract(), refract_data(), flags(), rect_x(), rect_y(), rect_width(), rect_height(), ring_height(), out_height(), effects_init() { - lens_shaft_inv_scale = 1.0f; + shaft_scale = 1.0f; } stage_data_file::~stage_data_file() { } -stage_data_modern_file::stage_data_modern_file() : unknown(), render_texture(), -render_texture_flag(), movie_texture(), movie_texture_flag(), field_04(), field_04_flag(), field_05(), -field_05_flag(), field_06(), field_06_flag(), field_07(), field_07_flag(), field_08(), field_09(), +stage_data_modern_file::stage_data_modern_file() : num_ghosts(), render_texture(), render_texture_flag(), +movie_texture(), movie_texture_flag(), field_04(), field_04_flag(), field_05(), field_05_flag(), +field_06(), field_06_flag(), field_07(), field_07_flag(), field_08(), field_09(), field_10(), field_11(), field_12(), rect_x(), rect_y(), rect_width(), rect_height(), ring_height(), out_height(), field_13(), effects_init() { hash = hash_murmurhash_empty; - lens_shaft_inv_scale = 1.0f; + shaft_scale = 1.0f; } stage_data_modern_file::~stage_data_modern_file() { } -stage_data::stage_data() : id(), object_set_id(), lens_flare_texture(), lens_shaft_texture(), -lens_ghost_texture(), unknown(), render_texture(), movie_texture(), reflect_type(), refract_enable(), +stage_data::stage_data() : id(), object_set_id(), tex_flare(), tex_shaft(), tex_ghost(), +num_ghosts(), render_texture(), movie_texture(), reflect_type(), refract_enable(), reflect(), reflect_data(), refract(), refract_data(), flags(), rect_x(), rect_y(), rect_width(), rect_height(), ring_height(), out_height(), effects_init() { name_hash = hash_murmurhash_empty; - lens_shaft_inv_scale = 1.0f; + shaft_scale = 1.0f; } stage_data::~stage_data() { } -stage_data_modern::stage_data_modern() : unknown(), render_texture(), -render_texture_flag(), movie_texture(), movie_texture_flag(), field_04(), field_04_flag(), field_05(), -field_05_flag(), field_06(), field_06_flag(), field_07(), field_07_flag(), field_08(), field_09(), +stage_data_modern::stage_data_modern() : num_ghosts(), render_texture(), render_texture_flag(), +movie_texture(), movie_texture_flag(), field_04(), field_04_flag(), field_05(), field_05_flag(), +field_06(), field_06_flag(), field_07(), field_07_flag(), field_08(), field_09(), field_10(), field_11(), field_12(), rect_x(), rect_y(), rect_width(), rect_height(), ring_height(), out_height(), field_13(), effects_init() { hash = hash_murmurhash_empty; auth_3d_name_hash = hash_murmurhash_empty; - lens_shaft_inv_scale = 1.0f; + shaft_scale = 1.0f; } stage_data_modern::~stage_data_modern() { @@ -322,11 +322,11 @@ void stage_database::add(stage_database_file* stage_data_file) { data->object_shadow = i.object_shadow; data->object_reflect = i.object_reflect; data->object_refract = i.object_refract; - data->lens_flare_texture = i.lens_flare_texture; - data->lens_shaft_texture = i.lens_shaft_texture; - data->lens_ghost_texture = i.lens_ghost_texture; - data->lens_shaft_inv_scale = i.lens_shaft_inv_scale; - data->unknown = i.unknown; + data->tex_flare = i.tex_flare; + data->tex_shaft = i.tex_shaft; + data->tex_ghost = i.tex_ghost; + data->shaft_scale = i.shaft_scale; + data->num_ghosts = i.num_ghosts; data->render_texture = i.render_texture; data->movie_texture = i.movie_texture; data->collision_file_path = i.collision_file_path; @@ -372,8 +372,8 @@ void stage_database::add(stage_database_file* stage_data_file) { data->object_shadow = i.object_shadow; data->object_reflect = i.object_reflect; data->object_refract = i.object_refract; - data->lens_shaft_inv_scale = i.lens_shaft_inv_scale; - data->unknown = i.unknown; + data->shaft_scale = i.shaft_scale; + data->num_ghosts = i.num_ghosts; data->render_texture = i.render_texture; data->render_texture_flag = i.render_texture_flag; data->movie_texture = i.movie_texture; @@ -511,11 +511,11 @@ static void stage_database_file_classic_read_inner(stage_database_file* stage_da stage->object_reflect.set_id = s.read_uint16_t(); stage->object_refract.id = s.read_uint16_t(); stage->object_refract.set_id = s.read_uint16_t(); - stage->lens_flare_texture = s.read_uint32_t(); - stage->lens_shaft_texture = s.read_uint32_t(); - stage->lens_ghost_texture = s.read_uint32_t(); - stage->lens_shaft_inv_scale = s.read_float_t(); - stage->unknown = s.read_uint32_t(); + stage->tex_flare = s.read_uint32_t(); + stage->tex_shaft = s.read_uint32_t(); + stage->tex_ghost = s.read_uint32_t(); + stage->shaft_scale = s.read_float_t(); + stage->num_ghosts = s.read_uint32_t(); stage->render_texture = s.read_uint32_t(); if (stage_data->format > STAGE_DATA_AC) @@ -776,11 +776,11 @@ static void stage_database_file_classic_write_inner(stage_database_file* stage_d s.write_uint16_t((uint16_t)stage->object_reflect.set_id); s.write_uint16_t((uint16_t)stage->object_refract.id); s.write_uint16_t((uint16_t)stage->object_refract.set_id); - s.write_uint32_t(stage->lens_flare_texture); - s.write_uint32_t(stage->lens_shaft_texture); - s.write_uint32_t(stage->lens_ghost_texture); - s.write_float_t(stage->lens_shaft_inv_scale); - s.write_uint32_t(stage->unknown); + s.write_uint32_t(stage->tex_flare); + s.write_uint32_t(stage->tex_shaft); + s.write_uint32_t(stage->tex_ghost); + s.write_float_t(stage->shaft_scale); + s.write_uint32_t(stage->num_ghosts); s.write_uint32_t(stage->render_texture); if (stage_data->format > STAGE_DATA_AC) @@ -877,8 +877,8 @@ static void stage_database_file_modern_read_inner(stage_database_file* stage_dat stage->object_reflect.set_id = s.read_uint32_t_reverse_endianness(); stage->object_refract.id = s.read_uint32_t_reverse_endianness(); stage->object_refract.set_id = s.read_uint32_t_reverse_endianness(); - stage->lens_shaft_inv_scale = s.read_float_t_reverse_endianness(); - stage->unknown = s.read_uint32_t_reverse_endianness(); + stage->shaft_scale = s.read_float_t_reverse_endianness(); + stage->num_ghosts = s.read_uint32_t_reverse_endianness(); stage->render_texture = s.read_uint32_t_reverse_endianness(); stage->render_texture_flag = s.read_uint32_t_reverse_endianness(); stage->movie_texture = s.read_uint32_t_reverse_endianness(); diff --git a/src/KKdLib/database/stage.hpp b/src/KKdLib/database/stage.hpp index b3c1f523..986db79f 100644 --- a/src/KKdLib/database/stage.hpp +++ b/src/KKdLib/database/stage.hpp @@ -79,11 +79,11 @@ struct stage_data_file { object_info object_shadow; object_info object_reflect; object_info object_refract; - uint32_t lens_flare_texture; - uint32_t lens_shaft_texture; - uint32_t lens_ghost_texture; - float_t lens_shaft_inv_scale; - uint32_t unknown; + uint32_t tex_flare; + uint32_t tex_shaft; + uint32_t tex_ghost; + float_t shaft_scale; + int32_t num_ghosts; uint32_t render_texture; uint32_t movie_texture; std::string collision_file_path; @@ -117,8 +117,8 @@ struct stage_data_modern_file { object_info object_shadow; object_info object_reflect; object_info object_refract; - float_t lens_shaft_inv_scale; - uint32_t unknown; + float_t shaft_scale; + int32_t num_ghosts; uint32_t render_texture; uint32_t render_texture_flag; uint32_t movie_texture; @@ -163,11 +163,11 @@ struct stage_data { object_info object_shadow; object_info object_reflect; object_info object_refract; - uint32_t lens_flare_texture; - uint32_t lens_shaft_texture; - uint32_t lens_ghost_texture; - float_t lens_shaft_inv_scale; - uint32_t unknown; + uint32_t tex_flare; + uint32_t tex_shaft; + uint32_t tex_ghost; + float_t shaft_scale; + int32_t num_ghosts; uint32_t render_texture; uint32_t movie_texture; std::string collision_file_path; @@ -202,8 +202,8 @@ struct stage_data_modern { object_info object_shadow; object_info object_reflect; object_info object_refract; - float_t lens_shaft_inv_scale; - uint32_t unknown; + float_t shaft_scale; + int32_t num_ghosts; uint32_t render_texture; uint32_t render_texture_flag; uint32_t movie_texture; diff --git a/src/KKdLib/light_param/glow.cpp b/src/KKdLib/light_param/glow.cpp index 09ae750b..00c4ae03 100644 --- a/src/KKdLib/light_param/glow.cpp +++ b/src/KKdLib/light_param/glow.cpp @@ -149,25 +149,22 @@ static void light_param_glow_read_inner(light_param_glow* glow, stream& s) { glow->has_saturate_coef = true; } else if (!str_utils_compare_length(buf, sizeof(buf), "flare", 5)) { - vec3& flare = glow->flare; if (buf[5] != ' ' || sscanf_s(buf + 6, "%f %f %f", - &flare.x, &flare.y, &flare.z) != 3) + &glow->flare[0], &glow->flare[1], &glow->flare[2]) != 3) goto End; glow->has_flare = true; } else if (!str_utils_compare_length(buf, sizeof(buf), "sigma", 5)) { - vec3& sigma = glow->sigma; if (buf[5] != ' ' || sscanf_s(buf + 6, "%f %f %f", - &sigma.x, &sigma.y, &sigma.z) != 3) + &glow->sigma[0], &glow->sigma[1], &glow->sigma[2]) != 3) goto End; glow->has_sigma = true; } else if (!str_utils_compare_length(buf, sizeof(buf), "intensity", 9)) { - vec3& intensity = glow->intensity; if (buf[9] != ' ' || sscanf_s(buf + 10, "%f %f %f", - &intensity.x, &intensity.y, &intensity.z) != 3) + &glow->intensity[0], &glow->intensity[1], &glow->intensity[2]) != 3) goto End; glow->has_intensity = true; @@ -181,7 +178,7 @@ static void light_param_glow_read_inner(light_param_glow* glow, stream& s) { glow->has_auto_exposure = true; } else if (!str_utils_compare_length(buf, sizeof(buf), "tone_map_method", 15)) { - if (buf[15] != ' ' || sscanf_s(buf + 16, "%d", (int32_t*)&glow->tone_map_method) != 1) + if (buf[15] != ' ' || sscanf_s(buf + 16, "%d", &glow->tone_map_method) != 1) goto End; glow->has_tone_map_method = true; @@ -196,10 +193,11 @@ static void light_param_glow_read_inner(light_param_glow* glow, stream& s) { glow->has_fade_color = true; } else if (!str_utils_compare_length(buf, sizeof(buf), "tone_transform", 14)) { - vec3& start = glow->tone_transform_start; - vec3& end = glow->tone_transform_end; + float_t* tone_transform_start = glow->tone_transform_start; + float_t* tone_transform_end = glow->tone_transform_end; if (buf[14] != ' ' || sscanf_s(buf + 15, "%f %f %f %f %f %f", - &start.x, &start.y, &start.z, &end.x, &end.y, &end.z) != 6) + &tone_transform_start[0], &tone_transform_start[1], &tone_transform_start[2], + &tone_transform_end[0], &tone_transform_end[1], &tone_transform_end[2]) != 6) goto End; glow->has_tone_transform = true; @@ -242,29 +240,26 @@ static void light_param_glow_write_inner(light_param_glow* glow, stream& s) { } if (glow->has_flare) { - vec3& flare = glow->flare; s.write("flare", 5); - light_param_write_float_t(s, buf, sizeof(buf), flare.x); - light_param_write_float_t(s, buf, sizeof(buf), flare.y); - light_param_write_float_t(s, buf, sizeof(buf), flare.z); + light_param_write_float_t(s, buf, sizeof(buf), glow->flare[0]); + light_param_write_float_t(s, buf, sizeof(buf), glow->flare[1]); + light_param_write_float_t(s, buf, sizeof(buf), glow->flare[2]); s.write_char('\n'); } if (glow->has_sigma) { - vec3& sigma = glow->sigma; s.write("sigma", 5); - light_param_write_float_t(s, buf, sizeof(buf), sigma.x); - light_param_write_float_t(s, buf, sizeof(buf), sigma.y); - light_param_write_float_t(s, buf, sizeof(buf), sigma.z); + light_param_write_float_t(s, buf, sizeof(buf), glow->sigma[0]); + light_param_write_float_t(s, buf, sizeof(buf), glow->sigma[1]); + light_param_write_float_t(s, buf, sizeof(buf), glow->sigma[2]); s.write_char('\n'); } if (glow->has_intensity) { - vec3& intensity = glow->intensity; s.write("intensity", 9); - light_param_write_float_t(s, buf, sizeof(buf), intensity.x); - light_param_write_float_t(s, buf, sizeof(buf), intensity.y); - light_param_write_float_t(s, buf, sizeof(buf), intensity.z); + light_param_write_float_t(s, buf, sizeof(buf), glow->intensity[0]); + light_param_write_float_t(s, buf, sizeof(buf), glow->intensity[1]); + light_param_write_float_t(s, buf, sizeof(buf), glow->intensity[2]); s.write_char('\n'); } @@ -276,7 +271,7 @@ static void light_param_glow_write_inner(light_param_glow* glow, stream& s) { if (glow->has_tone_map_method) { s.write("tone_map_method", 15); - light_param_write_int32_t(s, buf, sizeof(buf), (int32_t)glow->tone_map_method); + light_param_write_int32_t(s, buf, sizeof(buf), glow->tone_map_method); s.write_char('\n'); } @@ -293,15 +288,13 @@ static void light_param_glow_write_inner(light_param_glow* glow, stream& s) { } if (glow->has_tone_transform) { - vec3& start = glow->tone_transform_start; - vec3& end = glow->tone_transform_end; s.write("tone_transform", 14); - light_param_write_float_t(s, buf, sizeof(buf), start.x); - light_param_write_float_t(s, buf, sizeof(buf), start.y); - light_param_write_float_t(s, buf, sizeof(buf), start.z); - light_param_write_float_t(s, buf, sizeof(buf), end.x); - light_param_write_float_t(s, buf, sizeof(buf), end.y); - light_param_write_float_t(s, buf, sizeof(buf), end.z); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_start[0]); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_start[1]); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_start[2]); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_end[0]); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_end[1]); + light_param_write_float_t(s, buf, sizeof(buf), glow->tone_transform_end[2]); s.write_char('\n'); } diff --git a/src/KKdLib/light_param/glow.hpp b/src/KKdLib/light_param/glow.hpp index 70c4adaa..129397fa 100644 --- a/src/KKdLib/light_param/glow.hpp +++ b/src/KKdLib/light_param/glow.hpp @@ -8,13 +8,6 @@ #include "../default.hpp" #include "../vec.hpp" -enum tone_map_method { - TONE_MAP_YCC_EXPONENT = 0, - TONE_MAP_RGB_LINEAR = 1, - TONE_MAP_RGB_LINEAR2 = 2, - TONE_MAP_MAX = 3, -}; - struct light_param_glow { bool ready; @@ -27,21 +20,21 @@ struct light_param_glow { bool has_saturate_coef; float_t saturate_coef; bool has_flare; - vec3 flare; + float_t flare[3]; bool has_sigma; - vec3 sigma; + float_t sigma[3]; bool has_intensity; - vec3 intensity; + float_t intensity[3]; bool has_auto_exposure; bool auto_exposure; bool has_tone_map_method; - tone_map_method tone_map_method; + int32_t tone_map_method; bool has_fade_color; vec4 fade_color; int32_t fade_color_blend_func; bool has_tone_transform; - vec3 tone_transform_start; - vec3 tone_transform_end; + float_t tone_transform_start[3]; + float_t tone_transform_end[3]; light_param_glow(); ~light_param_glow(); diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index c15e620d..26dc838b 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -810,12 +810,12 @@ static render_context* render_context_load(const wchar_t* config_path) { init_mode(MODE_STARTUP, MODE_SUB_MAX); - render_manager_init_data(0, 0, 0, false); - /*render_manager_init_data( - stru_140EDA5B0.ssaa, - stru_140EDA5B0.hd_res, - stru_140EDA5B0.ss_alpha_mask, - stru_140EDA5B0.screen_shot_4x == 1);*/ + rndpass_init(0, 0, 0, false); + /*rndpass_init( + s_main_info.anti_alias, + s_main_info.min_render, + s_main_info.ss_alpha_mask, + s_main_info.ss_mode == SS_MODE_SIZE_4X);*/ objset_info_storage_init(aft_obj_db); stage_param_data_init(); @@ -1267,8 +1267,8 @@ static void render_context_disp(render_context* rctx) { #if BAKE_PNG || BAKE_VIDEO post_rend_data_ctx.state.set_viewport(0, 0, rctx->screen_width, rctx->screen_height); #else - post_rend_data_ctx.state.set_viewport(rctx->screen_x_offset, rctx->screen_y_offset, - rctx->sprite_width, rctx->sprite_height); + post_rend_data_ctx.state.set_viewport(rctx->view_x, rctx->view_y, + rctx->view_w, rctx->view_h); #endif post_rend_data_ctx.state.bind_framebuffer(0); @@ -1276,20 +1276,20 @@ static void render_context_disp(render_context* rctx) { post_rend_data_ctx.shader_flags.arr[U_ALPHA_MASK] = 0; post_rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; shaders_ft.set(post_rend_data_ctx.state, post_rend_data_ctx.shader_flags, SHADER_FT_REDUCE); - rctx->render.draw_quad(post_rend_data_ctx, rctx->sprite_width, rctx->sprite_height, + rctx->render->draw_quad(post_rend_data_ctx, rctx->view_w, rctx->view_h, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } #ifdef USE_OPENGL else { #if BAKE_PNG || BAKE_VIDEO fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0, - 0, 0, rctx->sprite_width, rctx->sprite_height, + 0, 0, rctx->view_w, rctx->view_h, 0, 0, rctx->screen_width, rctx->screen_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); #else fbo_blit(post_rend_data_ctx.state, rctx->screen_buffer.get_fb(), 0, - 0, 0, rctx->sprite_width, rctx->sprite_height, - rctx->screen_x_offset, rctx->screen_y_offset, - rctx->sprite_width, rctx->sprite_height, GL_COLOR_BUFFER_BIT, GL_LINEAR); + 0, 0, rctx->view_w, rctx->view_h, + rctx->view_x, rctx->view_y, + rctx->view_w, rctx->view_h, GL_COLOR_BUFFER_BIT, GL_LINEAR); #endif } #endif @@ -1437,7 +1437,7 @@ static void render_context_dispose(render_context* rctx) { data_test_sel_free(); data_edit_sel_free(); - render_manager_free_data(); + rndpass_finish(); dw_free(); diff --git a/src/ReDIVA/data_test/rob_osage_test.cpp b/src/ReDIVA/data_test/rob_osage_test.cpp index a86bde9b..17cb520f 100644 --- a/src/ReDIVA/data_test/rob_osage_test.cpp +++ b/src/ReDIVA/data_test/rob_osage_test.cpp @@ -888,7 +888,7 @@ void RobOsageTest::disp() { rob_chara* rob_chr = get_rob_management()->get_rob(rob_id); if (rob_chr && !pv_osage_manager_array_get_disp(rob_id) - && rob_chr->check_disp() && !rob_chr->check_zero_disp()) { + && rob_chr->get_disp() && !rob_chr->check_zero_disp()) { disp_coli(); disp_line(); } diff --git a/src/ReDIVA/graphics/post_process.cpp b/src/ReDIVA/graphics/post_process.cpp index 4efc58cd..e2c847eb 100644 --- a/src/ReDIVA/graphics/post_process.cpp +++ b/src/ReDIVA/graphics/post_process.cpp @@ -6,6 +6,7 @@ #include "post_process.hpp" #include "../../CRE/renderer/dof.hpp" #include "../../CRE/light_param.hpp" +#include "../../CRE/render.hpp" #include "../../CRE/render_context.hpp" #include "../../CRE/stage.hpp" #include "../dw.hpp" @@ -18,7 +19,7 @@ public: dw::Slider* exposure_slider; dw::Slider* gamma_slider; dw::Slider* saturate_power_slider; - dw::Slider* saturate_coeff_slider; + dw::Slider* saturate_coef_slider; dw::ListBox* mag_filter_list; dw::Button* taa_button; dw::Button* mlaa_button; @@ -42,19 +43,19 @@ public: dw::Button* dof_enable_physical_dof; dw::Button* dof_auto_focus; dw::Button* show_face_query_button; - tone_map_method tone_map; + int32_t tone_map_method; float_t exposure; int32_t auto_exposure; float_t gamma; int32_t saturate_power; - float_t saturate_coeff; - int32_t taa; - int32_t mlaa; - rndr::Render::MagFilterType mag_filter; + float_t saturate_coef; + int32_t temporal_anti_alias; + int32_t morphological_anti_alias; + int32_t mag_filter; bool set_for_each_cut; - vec3 lens; - vec3 radius; - vec3 intensity; + float_t flare_coef[3]; + float_t sigma[3]; + float_t intensity[3]; rndr::Render* rend; dwPostProcess(); @@ -69,14 +70,14 @@ public: static void AutoExposureCallback(dw::Widget* data); static void DofCallback(dw::Widget* data); static void ExposureCallback(dw::Widget* data); + static void FlareCallback(dw::Widget* data); static void GammaCallback(dw::Widget* data); static void IntensityCallback(dw::Widget* data); - static void LensCallback(dw::Widget* data); static void LoadCallback(dw::Widget* data); static void MagFilterCallback(dw::Widget* data); static void MorphologicalAACallback(dw::Widget* data); static void RadiusCallback(dw::Widget* data); - static void SaturateCoeffCallback(dw::Widget* data); + static void SaturateCoefCallback(dw::Widget* data); static void SaturatePowerCallback(dw::Widget* data); static void SaveCallback(dw::Widget* data); static void SetForEachCutCallback(dw::Widget* data); @@ -89,7 +90,7 @@ public: dw::Slider* color_slider[3]; dw::Slider* alpha_slider; dw::ListBox* blend_func_list; - vec3 color; + float_t color[3]; float_t alpha; int32_t blend_func; rndr::Render* rend; @@ -112,8 +113,8 @@ class dwToneTrans : public dw::Shell { public: dw::Slider* start_slider[3]; dw::Slider* end_slider[3]; - vec3 start; - vec3 end; + float_t start[3]; + float_t end[3]; rndr::Render* rend; dwToneTrans(); @@ -148,20 +149,20 @@ void dw_post_process_init() { dwPostProcess::dwPostProcess() { data = 0; - rend = &rctx_ptr->render; + rend = rctx_ptr->render; - tone_map = rend->get_tone_map(); - exposure = rend->get_exposure(); - auto_exposure = rend->get_auto_exposure(); - gamma = rend->get_gamma(); - saturate_power = rend->get_saturate_power(); - saturate_coeff = rend->get_saturate_coeff(); - taa = rend->get_taa(); - mlaa = rend->get_mlaa(); - mag_filter = rend->get_mag_filter(); - lens = rend->get_lens(); - radius = rend->get_radius(); - intensity = rend->get_intensity(); + rend->get_tone_map_method(&tone_map_method); + rend->get_exposure(&exposure); + rend->get_auto_exposure(&auto_exposure); + rend->get_gamma(&gamma); + rend->get_saturate_power(&saturate_power); + rend->get_saturate_coef(&saturate_coef); + rend->get_temporal_aa(&temporal_anti_alias); + rend->get_morphological_aa(&morphological_anti_alias); + rend->get_mag_filter(&mag_filter); + rend->get_flare_coef(flare_coef); + rend->get_sigma(sigma); + rend->get_intensity(intensity); set_for_each_cut = false; SetText("POST PROCESS"); @@ -186,12 +187,12 @@ dwPostProcess::dwPostProcess() { taa_button = new dw::Button(this, dw::CHECKBOX); taa_button->SetText("Temporal AA"); - taa_button->SetValue(!!taa); + taa_button->SetValue(!!temporal_anti_alias); taa_button->callback = dwPostProcess::TemporalAACallback; mlaa_button = new dw::Button(this, dw::CHECKBOX); mlaa_button->SetText("Morphological AA"); - mlaa_button->SetValue(!!mlaa); + mlaa_button->SetValue(!!morphological_anti_alias); mlaa_button->callback = dwPostProcess::MorphologicalAACallback; const char* set_for_each_cut_text; @@ -225,7 +226,7 @@ dwPostProcess::dwPostProcess() { tone_map_list->AddItem("YCC EXPONENT"); tone_map_list->AddItem("RGB LINEAR"); tone_map_list->AddItem("RGB LINEAR2"); - tone_map_list->SetItemIndex(tone_map); + tone_map_list->SetItemIndex(tone_map_method); tone_map_list->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::ToneMapCallback)); exposure_slider = dw::Slider::Create(glow_param_group, @@ -260,78 +261,60 @@ dwPostProcess::dwPostProcess() { saturate_power_slider->format = "%3.1f"; saturate_power_slider->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::SaturatePowerCallback)); - saturate_coeff_slider = dw::Slider::Create(glow_param_group, + saturate_coef_slider = dw::Slider::Create(glow_param_group, dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Saturate2"); - saturate_coeff_slider->SetParams(saturate_coeff, 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); - saturate_coeff_slider->format = "%4.2f"; - saturate_coeff_slider->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::SaturateCoeffCallback)); + saturate_coef_slider->SetParams(saturate_coef, 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); + saturate_coef_slider->format = "%4.2f"; + saturate_coef_slider->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::SaturateCoefCallback)); (new dw::Label(glow_param_group))->SetText("FLARE"); - lens_sliders[0] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Flare A"); - lens_sliders[0]->SetParams(lens.x, 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); - lens_sliders[0]->format = "%4.2f"; - lens_sliders[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::LensCallback)); - lens_sliders[0]->callback_data.i64 = 0; + for (int32_t i = 0; i < 3; i++) { + static const char* flare_name[] = { + "Flare A", + "Shaft A", + "Ghost A", + }; - lens_sliders[1] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Shaft A"); - lens_sliders[1]->SetParams(lens.y, 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); - lens_sliders[1]->format = "%4.2f"; - lens_sliders[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::LensCallback)); - lens_sliders[1]->callback_data.i64 = 1; - - lens_sliders[2] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Ghost A"); - lens_sliders[2]->SetParams(lens.z, 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); - lens_sliders[2]->format = "%4.2f"; - lens_sliders[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::LensCallback)); - lens_sliders[2]->callback_data.i64 = 2; + lens_sliders[i] = dw::Slider::Create(glow_param_group, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, flare_name[i]); + lens_sliders[i]->SetParams(flare_coef[i], 0.0f, 1.0f, 0.2f, 0.01f, 0.1f); + lens_sliders[i]->format = "%4.2f"; + lens_sliders[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::FlareCallback)); + lens_sliders[i]->callback_data.i64 = i; + } (new dw::Label(glow_param_group))->SetText("GLARE"); - radius_sliders[0] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Radius R"); - radius_sliders[0]->SetParams(radius.x, 1.0f, 3.0f, 0.5f, 0.1f, 0.1f); - radius_sliders[0]->format = "%4.2f"; - radius_sliders[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::RadiusCallback)); - radius_sliders[0]->callback_data.i64 = 0; + for (int32_t i = 0; i < 3; i++) { + static const char* radius_name[] = { + "Radius R", + "Radius G", + "Radius B", + }; - radius_sliders[1] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Radius G"); - radius_sliders[1]->SetParams(radius.y, 1.0f, 3.0f, 0.5f, 0.1f, 0.1f); - radius_sliders[1]->format = "%4.2f"; - radius_sliders[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::RadiusCallback)); - radius_sliders[1]->callback_data.i64 = 1; + radius_sliders[i] = dw::Slider::Create(glow_param_group, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, radius_name[i]); + radius_sliders[i]->SetParams(sigma[i], 1.0f, 3.0f, 0.5f, 0.1f, 0.1f); + radius_sliders[i]->format = "%4.2f"; + radius_sliders[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::RadiusCallback)); + radius_sliders[i]->callback_data.i64 = i; + } - radius_sliders[2] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Radius B"); - radius_sliders[2]->SetParams(radius.z, 1.0f, 3.0f, 0.5f, 0.1f, 0.1f); - radius_sliders[2]->format = "%4.2f"; - radius_sliders[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::RadiusCallback)); - radius_sliders[2]->callback_data.i64 = 2; + for (int32_t i = 0; i < 3; i++) { + static const char* intensity_name[] = { + "Inten R", + "Inten G", + "Inten B", + }; - intensity_sliders[0] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Inten R"); - intensity_sliders[0]->SetParams(intensity.x, 0.0f, 2.0f, 0.5f, 0.05f, 0.1f); - intensity_sliders[0]->format = "%4.2f"; - intensity_sliders[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::IntensityCallback)); - intensity_sliders[0]->callback_data.i64 = 0; - - intensity_sliders[1] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Inten G"); - intensity_sliders[1]->SetParams(intensity.y, 0.0f, 2.0f, 0.5f, 0.05f, 0.1f); - intensity_sliders[1]->format = "%4.2f"; - intensity_sliders[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::IntensityCallback)); - intensity_sliders[1]->callback_data.i64 = 1; - - intensity_sliders[2] = dw::Slider::Create(glow_param_group, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, "Inten B"); - intensity_sliders[2]->SetParams(intensity.z, 0.0f, 2.0f, 0.5f, 0.05f, 0.1f); - intensity_sliders[2]->format = "%4.2f"; - intensity_sliders[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::IntensityCallback)); - intensity_sliders[2]->callback_data.i64 = 2; + intensity_sliders[i] = dw::Slider::Create(glow_param_group, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 192.0f, glyph_size.y, intensity_name[i]); + intensity_sliders[i]->SetParams(intensity[i], 0.0f, 2.0f, 0.5f, 0.05f, 0.1f); + intensity_sliders[i]->format = "%4.2f"; + intensity_sliders[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwPostProcess::IntensityCallback)); + intensity_sliders[i]->callback_data.i64 = i; + } (new dw::Label(glow_param_group))->SetText("DOF"); @@ -456,31 +439,31 @@ void dwPostProcess::Hide() { } void dwPostProcess::ResetData() { - rend = &rctx_ptr->render; + rend = rctx_ptr->render; - exposure = rend->get_exposure(); - auto_exposure = rend->get_auto_exposure(); - gamma = rend->get_gamma(); - saturate_power = rend->get_saturate_power(); - saturate_coeff = rend->get_saturate_coeff(); - lens = rend->get_lens(); - radius = rend->get_radius(); - intensity = rend->get_intensity(); + rend->get_exposure(&exposure); + rend->get_auto_exposure(&auto_exposure); + rend->get_gamma(&gamma); + rend->get_saturate_power(&saturate_power); + rend->get_saturate_coef(&saturate_coef); + rend->get_flare_coef(flare_coef); + rend->get_sigma(sigma); + rend->get_intensity(intensity); exposure_slider->SetValue(exposure); auto_exposure_button->SetValue(auto_exposure != 0); gamma_slider->SetValue(gamma); saturate_power_slider->SetValue((float_t)saturate_power); - saturate_coeff_slider->SetValue(saturate_coeff); + saturate_coef_slider->SetValue(saturate_coef); for (int32_t i = 0; i < 3; i++) - lens_sliders[i]->SetValue(((float_t*)&lens)[i]); + lens_sliders[i]->SetValue(flare_coef[i]); for (int32_t i = 0; i < 3; i++) - radius_sliders[i]->SetValue(((float_t*)&radius)[i]); + radius_sliders[i]->SetValue(sigma[i]); for (int32_t i = 0; i < 3; i++) - intensity_sliders[i]->SetValue(((float_t*)&intensity)[i]); + intensity_sliders[i]->SetValue(intensity[i]); DofReset(); } @@ -534,18 +517,18 @@ void dwPostProcess::DofCallback(dw::Widget* data) { dof_debug_set(&debug); const bool enable_dof = dw_post_process->dof_use_ui_params->value; - const bool dof_enable_physical_dof = dw_post_process->dof_enable_physical_dof->value; + const bool enable_physical_dof = dw_post_process->dof_enable_physical_dof->value; dw_post_process->dof_enable_dof->SetEnabled(enable_dof); dw_post_process->dof_enable_physical_dof->SetEnabled(enable_dof); - dw_post_process->dof_auto_focus->SetEnabled(enable_dof && dof_enable_physical_dof); - dw_post_process->dof_distance_to_focus->SetEnabled(enable_dof && dof_enable_physical_dof); - dw_post_process->dof_focal_length->SetEnabled(enable_dof && dof_enable_physical_dof); - dw_post_process->dof_f_number->SetEnabled(enable_dof && dof_enable_physical_dof); - dw_post_process->dof_f2_distance_to_focus->SetEnabled(enable_dof && !dof_enable_physical_dof); - dw_post_process->dof_f2_focus_range->SetEnabled(enable_dof && !dof_enable_physical_dof); - dw_post_process->dof_f2_fuzzing_range->SetEnabled(enable_dof && !dof_enable_physical_dof); - dw_post_process->dof_f2_ratio->SetEnabled(enable_dof && !dof_enable_physical_dof); + dw_post_process->dof_auto_focus->SetEnabled(enable_dof && enable_physical_dof); + dw_post_process->dof_distance_to_focus->SetEnabled(enable_dof && enable_physical_dof); + dw_post_process->dof_focal_length->SetEnabled(enable_dof && enable_physical_dof); + dw_post_process->dof_f_number->SetEnabled(enable_dof && enable_physical_dof); + dw_post_process->dof_f2_distance_to_focus->SetEnabled(enable_dof && !enable_physical_dof); + dw_post_process->dof_f2_focus_range->SetEnabled(enable_dof && !enable_physical_dof); + dw_post_process->dof_f2_fuzzing_range->SetEnabled(enable_dof && !enable_physical_dof); + dw_post_process->dof_f2_ratio->SetEnabled(enable_dof && !enable_physical_dof); show_face_query_set(dw_post_process->show_face_query_button->value); } @@ -557,6 +540,14 @@ void dwPostProcess::ExposureCallback(dw::Widget* data) { } } +void dwPostProcess::FlareCallback(dw::Widget* data) { + dw::Slider* slider = dynamic_cast(data); + if (slider) { + dw_post_process->flare_coef[slider->callback_data.i32] = slider->GetValue(); + dw_post_process->rend->set_flare_coef(dw_post_process->flare_coef); + } +} + void dwPostProcess::GammaCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { @@ -568,19 +559,11 @@ void dwPostProcess::GammaCallback(dw::Widget* data) { void dwPostProcess::IntensityCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - ((float_t*)&dw_post_process->intensity)[slider->callback_data.i32] = slider->GetValue(); + dw_post_process->intensity[slider->callback_data.i32] = slider->GetValue(); dw_post_process->rend->set_intensity(dw_post_process->intensity); } } -void dwPostProcess::LensCallback(dw::Widget* data) { - dw::Slider* slider = dynamic_cast(data); - if (slider) { - ((float_t*)&dw_post_process->lens)[slider->callback_data.i32] = slider->GetValue(); - dw_post_process->rend->set_lens(dw_post_process->lens); - } -} - void dwPostProcess::LoadCallback(dw::Widget* data) { } @@ -588,7 +571,7 @@ void dwPostProcess::LoadCallback(dw::Widget* data) { void dwPostProcess::MagFilterCallback(dw::Widget* data) { dw::ListBox* list_box = dynamic_cast(data); if (list_box) { - dw_post_process->mag_filter = (rndr::Render::MagFilterType)(int32_t)list_box->list->selected_item; + dw_post_process->mag_filter = (int32_t)list_box->list->selected_item; dw_post_process->rend->set_mag_filter(dw_post_process->mag_filter); } } @@ -596,24 +579,24 @@ void dwPostProcess::MagFilterCallback(dw::Widget* data) { void dwPostProcess::MorphologicalAACallback(dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) { - dw_post_process->mlaa = button->value ? 1 : 0; - dw_post_process->rend->set_mlaa(dw_post_process->mlaa); + dw_post_process->morphological_anti_alias = button->value ? 1 : 0; + dw_post_process->rend->set_morphological_aa(dw_post_process->morphological_anti_alias); } } void dwPostProcess::RadiusCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - ((float_t*)&dw_post_process->radius)[slider->callback_data.i32] = slider->GetValue(); - dw_post_process->rend->set_radius(dw_post_process->radius); + dw_post_process->sigma[slider->callback_data.i32] = slider->GetValue(); + dw_post_process->rend->set_sigma(dw_post_process->sigma); } } -void dwPostProcess::SaturateCoeffCallback(dw::Widget* data) { +void dwPostProcess::SaturateCoefCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) { - dw_post_process->saturate_coeff = slider->GetValue(); - dw_post_process->rend->set_saturate_coeff(dw_post_process->saturate_coeff, 0, false); + dw_post_process->saturate_coef = slider->GetValue(); + dw_post_process->rend->set_saturate_coef(dw_post_process->saturate_coef, 0, false); } } @@ -638,21 +621,21 @@ void dwPostProcess::SetForEachCutCallback(dw::Widget* data) { void dwPostProcess::TemporalAACallback(dw::Widget* data) { dw::Button* button = dynamic_cast(data); if (button) { - dw_post_process->taa = button->value ? 1 : 0; - dw_post_process->rend->set_taa(dw_post_process->taa); + dw_post_process->temporal_anti_alias = button->value ? 1 : 0; + dw_post_process->rend->set_temporal_aa(dw_post_process->temporal_anti_alias); } } void dwPostProcess::ToneMapCallback(dw::Widget* data) { dw::ListBox* list_box = dynamic_cast(data); if (list_box) { - dw_post_process->tone_map = (tone_map_method)(int32_t)list_box->list->selected_item; - dw_post_process->rend->set_tone_map(dw_post_process->tone_map); + dw_post_process->tone_map_method = (int32_t)list_box->list->selected_item; + dw_post_process->rend->set_tone_map_method(dw_post_process->tone_map_method); } } dwSceneFade::dwSceneFade() { - rend = &rctx_ptr->render; + rend = rctx_ptr->render; SetText("SCENE FADE"); @@ -672,26 +655,20 @@ dwSceneFade::dwSceneFade() { (new dw::Label(color_comp))->SetText("COLOR "); - color_slider[0] = dw::Slider::Create(color_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " R "); - color_slider[0]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - color_slider[0]->format = "%4.2f"; - color_slider[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwSceneFade::ColorCallback)); - color_slider[0]->callback_data.i64 = 0; + for (int32_t i = 0; i < 3; i++) { + static const char* color_name[] = { + " R ", + " G ", + " B ", + }; - color_slider[1] = dw::Slider::Create(color_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " G "); - color_slider[1]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - color_slider[1]->format = "%4.2f"; - color_slider[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwSceneFade::ColorCallback)); - color_slider[1]->callback_data.i64 = 1; - - color_slider[2] = dw::Slider::Create(color_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " B "); - color_slider[2]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - color_slider[2]->format = "%4.2f"; - color_slider[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwSceneFade::ColorCallback)); - color_slider[2]->callback_data.i64 = 2; + color_slider[i] = dw::Slider::Create(color_comp, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, color_name[i]); + color_slider[i]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); + color_slider[i]->format = "%4.2f"; + color_slider[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwSceneFade::ColorCallback)); + color_slider[i]->callback_data.i64 = i; + } dw::Composite* blend_func_comp = new dw::Composite(this); blend_func_comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); @@ -725,21 +702,20 @@ void dwSceneFade::Hide() { } void dwSceneFade::ResetData() { - color = rend->get_scene_fade_color(); - alpha = rend->get_scene_fade_alpha(); - blend_func = rend->get_scene_fade_blend_func(); + rend->get_fade_color(color); + rend->get_fade_rate(&alpha); + rend->get_fade_blend_func(&blend_func); for (int32_t i = 0; i < 3; i++) - color_slider[i]->SetValue(((float_t*)&color)[i]); - + color_slider[i]->SetValue(color[i]); alpha_slider->SetValue(alpha); blend_func_list->SetItemIndex(blend_func); } void dwSceneFade::SetData() { - rend->set_scene_fade_alpha(alpha, 0); - rend->set_scene_fade_color(color, 0); - rend->set_scene_fade_blend_func(blend_func, 0); + rend->set_fade_rate(alpha); + rend->set_fade_color(color); + rend->set_fade_blend_func(blend_func); } void dwSceneFade::AlphaCallback(dw::Widget* data) { @@ -759,17 +735,17 @@ void dwSceneFade::BlendFuncCallback(dw::Widget* data) { void dwSceneFade::ColorCallback(dw::Widget* data) { dw::Slider* slider = dynamic_cast(data); if (slider) - ((float_t*)&dw_scene_fade->color)[slider->callback_data.i32] = slider->GetValue(); + dw_scene_fade->color[slider->callback_data.i32] = slider->GetValue(); dw_scene_fade->SetData(); } void dwSceneFade::ResetCallback(dw::Widget* data) { - rctx_ptr->render.reset_scene_fade(0); + rctx_ptr->render->set_fade_color_default(); dw_scene_fade->ResetData(); } dwToneTrans::dwToneTrans() { - rend = &rctx_ptr->render; + rend = rctx_ptr->render; SetText("TONE TRANS"); @@ -780,52 +756,40 @@ dwToneTrans::dwToneTrans() { (new dw::Label(start_comp))->SetText("START "); - start_slider[0] = dw::Slider::Create(start_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " R "); - start_slider[0]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - start_slider[0]->format = "%4.2f"; - start_slider[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::StartCallback)); - start_slider[0]->callback_data.i64 = 0; + for (int32_t i = 0; i < 3; i++) { + static const char* start_name[] = { + " R ", + " G ", + " B ", + }; - start_slider[1] = dw::Slider::Create(start_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " G "); - start_slider[1]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - start_slider[1]->format = "%4.2f"; - start_slider[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::StartCallback)); - start_slider[1]->callback_data.i64 = 1; - - start_slider[2] = dw::Slider::Create(start_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " B "); - start_slider[2]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - start_slider[2]->format = "%4.2f"; - start_slider[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::StartCallback)); - start_slider[2]->callback_data.i64 = 2; + start_slider[i] = dw::Slider::Create(start_comp, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, start_name[i]); + start_slider[i]->SetParams(0.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); + start_slider[i]->format = "%4.2f"; + start_slider[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::StartCallback)); + start_slider[i]->callback_data.i64 = i; + } dw::Composite* end_comp = new dw::Composite(this); end_comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); (new dw::Label(end_comp))->SetText("END "); - end_slider[0] = dw::Slider::Create(end_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " R "); - end_slider[0]->SetParams(1.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - end_slider[0]->format = "%4.2f"; - end_slider[0]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::EndCallback)); - end_slider[0]->callback_data.i64 = 0; + for (int32_t i = 0; i < 3; i++) { + static const char* end_name[] = { + " R ", + " G ", + " B ", + }; - end_slider[1] = dw::Slider::Create(end_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " G "); - end_slider[1]->SetParams(1.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - end_slider[1]->format = "%4.2f"; - end_slider[1]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::EndCallback)); - end_slider[1]->callback_data.i64 = 1; - - end_slider[2] = dw::Slider::Create(end_comp, - dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, " B "); - end_slider[2]->SetParams(1.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); - end_slider[2]->format = "%4.2f"; - end_slider[2]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::EndCallback)); - end_slider[2]->callback_data.i64 = 2; + end_slider[i] = dw::Slider::Create(end_comp, + dw::Flags(dw::FLAG_800 | dw::HORIZONTAL), 0.0f, 0.0f, 100.0f, glyph_size.y, end_name[i]); + end_slider[i]->SetParams(1.0f, 0.0f, 1.0f, 0.1f, 0.01f, 0.1f); + end_slider[i]->format = "%4.2f"; + end_slider[i]->AddSelectionListener(new dw::SelectionListenerOnHook(dwToneTrans::EndCallback)); + end_slider[i]->callback_data.i64 = i; + } dw::Composite* reset_comp = new dw::Composite(this); reset_comp->SetLayout(new dw::RowLayout(dw::HORIZONTAL)); @@ -850,8 +814,8 @@ void dwToneTrans::ResetData() { rend->get_tone_trans(start, end); for (int32_t i = 0; i < 3; i++) { - start_slider[i]->SetValue(((float_t*)&start)[i]); - end_slider[i]->SetValue(((float_t*)&end)[i]); + start_slider[i]->SetValue(start[i]); + end_slider[i]->SetValue(end[i]); } } @@ -864,14 +828,14 @@ void dwToneTrans::EndCallback(dw::Widget* data) { if (slider) { float_t value = slider->GetValue(); int32_t index = slider->callback_data.i32; - if (((float_t*)&dw_tone_trans->start)[index] != value) - ((float_t*)&dw_tone_trans->end)[index] = value; + if (dw_tone_trans->start[index] != value) + dw_tone_trans->end[index] = value; } dw_tone_trans->SetData(); } void dwToneTrans::ResetCallback(dw::Widget* data) { - rctx_ptr->render.reset_tone_trans(0); + rctx_ptr->render->set_tone_trans_default(); dw_tone_trans->ResetData(); } @@ -880,8 +844,8 @@ void dwToneTrans::StartCallback(dw::Widget* data) { if (slider) { float_t value = slider->GetValue(); int32_t index = slider->callback_data.i32; - if (((float_t*)&dw_tone_trans->end)[index] != value) - ((float_t*)&dw_tone_trans->start)[index] = value; + if (dw_tone_trans->end[index] != value) + dw_tone_trans->start[index] = value; } dw_tone_trans->SetData(); } diff --git a/src/ReDIVA/graphics/reflect_refract.cpp b/src/ReDIVA/graphics/reflect_refract.cpp index a81de307..1f3cb0a3 100644 --- a/src/ReDIVA/graphics/reflect_refract.cpp +++ b/src/ReDIVA/graphics/reflect_refract.cpp @@ -7,6 +7,7 @@ #include "../../CRE/light_param/face.hpp" #include "../../CRE/light_param.hpp" #include "../../CRE/render_context.hpp" +#include "../../CRE/render_manager.hpp" #include "../dw.hpp" extern render_context* rctx_ptr; diff --git a/src/ReDIVA/graphics/shadow.cpp b/src/ReDIVA/graphics/shadow.cpp index 85124833..8afab10d 100644 --- a/src/ReDIVA/graphics/shadow.cpp +++ b/src/ReDIVA/graphics/shadow.cpp @@ -5,6 +5,7 @@ #include "shadow.hpp" #include "../../CRE/render_context.hpp" +#include "../../CRE/render_manager.hpp" #include "../../CRE/shadow.hpp" #include "../dw.hpp" diff --git a/src/ReDIVA/input_state.cpp b/src/ReDIVA/input_state.cpp index f6c9e898..346b100d 100644 --- a/src/ReDIVA/input_state.cpp +++ b/src/ReDIVA/input_state.cpp @@ -1033,19 +1033,19 @@ void glut_motion_cb(int32_t x, int32_t y) { ScreenParam screen_param = get_screen_param(); #if BAKE_PNG || BAKE_VIDEO - int32_t x_offset = 0; - int32_t y_offset = 0; + int32_t view_x = 0; + int32_t view_y = 0; float_t x_scale = 1280.0f / (float_t)BAKE_BASE_WIDTH; float_t y_scale = 720.0f / (float_t)BAKE_BASE_HEIGHT; #else - int32_t x_offset = rctx_ptr->screen_x_offset; - int32_t y_offset = rctx_ptr->screen_y_offset; - float_t x_scale = 1280.0f / (float_t)rctx_ptr->sprite_width; - float_t y_scale = 720.0f / (float_t)rctx_ptr->sprite_height; + int32_t view_x = rctx_ptr->view_x; + int32_t view_y = rctx_ptr->view_y; + float_t x_scale = 1280.0f / (float_t)rctx_ptr->view_w; + float_t y_scale = 720.0f / (float_t)rctx_ptr->view_h; #endif - x = (int32_t)(((float_t)x - x_offset) * x_scale); - y = (int32_t)(((float_t)y - y_offset) * y_scale); + x = (int32_t)(((float_t)x - view_x) * x_scale); + y = (int32_t)(((float_t)y - view_y) * y_scale); glut_input.motion_x = x; glut_input.motion_y = y; diff --git a/src/ReDIVA/main.cpp b/src/ReDIVA/main.cpp index ca69831e..a99e556f 100644 --- a/src/ReDIVA/main.cpp +++ b/src/ReDIVA/main.cpp @@ -16,7 +16,7 @@ bool cpu_caps_avx; bool cpu_caps_f16c; bool cpu_caps_avx2; -/*void scan_arguments(int32_t argc, wchar_t** argv) { +/*void read_arg(int32_t argc, wchar_t** argv) { std::vector arguments; arguments.assign(argv + 1, argv + argc); @@ -30,106 +30,106 @@ bool cpu_caps_avx2; if (!i->compare(L"--help")) show_help = true; else if (!i->compare(L"-debug")) - stru_140EDA5B0.debug = 1; + s_main_info.debug_mode = 1; else if (!i->compare(L"-t")) sys_am_set_test_mode_starting(true); else if (!i->compare(L"-m")) { if (++i == i_end) break; - stru_140EDA5B0.mode = _wtoi(i->c_str()); + s_main_info.start_mode = _wtoi(i->c_str()); } else if (!i->compare(L"-s")) { if (++i == i_end) break; - stru_140EDA5B0.sub_mode = _wtoi(i->c_str()); + s_main_info.start_mode_sub = _wtoi(i->c_str()); } else if (!i->compare(L"-sm") || !i->compare(L"--start-up-mode")) { if (++i == i_end) break; if (i->compare(L"server")) - stru_140EDA5B0.start_up_mode = 0; + s_main_info.start_up_mode = START_UP_MODE_SERVER; else - stru_140EDA5B0.start_up_mode = 1; + s_main_info.start_up_mode = START_UP_MODE_SATELLITE; } else if (!i->compare(L"-ve")) - stru_140EDA5B0.vsync_emulation = 1; + s_main_info.vsync_emu = 1; else if (!i->compare(L"-fs") || !i->compare(L"-f")) - stru_140EDA5B0.full_screen = 1; + s_main_info.full_screen = 1; else if (!i->compare(L"-w")) - stru_140EDA5B0.full_screen = 0; + s_main_info.full_screen = 0; else if (!i->compare(L"-aa")) - stru_140EDA5B0.ssaa = 1; + s_main_info.anti_alias = 1; else if (!i->compare(L"-qvga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_QVGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_QVGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-vga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_VGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_VGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-wvga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_WVGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_WVGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-svga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_SVGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_SVGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-xga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_XGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_XGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-wxga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_WXGA; - stru_140EDA5B0.hd_res = 1; + s_main_info.screen_mode = SCREEN_MODE_WXGA; + s_main_info.min_render = 1; } else if (!i->compare(L"-wxga_dbd")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_WXGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_WXGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-uxga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_UXGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_UXGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-wuxga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_WUXGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_WUXGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-wqxga")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_WQXGA; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_WQXGA; + s_main_info.min_render = 0; } else if (!i->compare(L"-hdtv720")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_HD; - stru_140EDA5B0.hd_res = 1; + s_main_info.screen_mode = SCREEN_MODE_HD; + s_main_info.min_render = 1; } else if (!i->compare(L"-hdtv720_dbd")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_HD; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_HD; + s_main_info.min_render = 0; } else if (!i->compare(L"-hdtv1080")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_FHD; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_FHD; + s_main_info.min_render = 0; } else if (!i->compare(L"-wqhd")) { - stru_140EDA5B0.res_launch = SCREEN_MODE_QHD; - stru_140EDA5B0.hd_res = 0; + s_main_info.screen_mode = SCREEN_MODE_QHD; + s_main_info.min_render = 0; } else if (!i->compare(L"-ss")) { if (++i == i_end) break; - stru_140EDA5B0.screen_shot = 1; - stru_140EDA5B0.field_80 = 0; - stru_140EDA5B0.field_40.assign(*i); - stru_140EDA5B0.field_60.assign(stru_140EDA5B0.field_40); - stru_140EDA5B0.ssaa = 1; + s_main_info.ss_flag = 1; + s_main_info.field_80 = 0; + s_main_info.field_40.assign(*i); + s_main_info.field_60.assign(s_main_info.field_40); + s_main_info.anti_alias = 1; } else if (!i->compare(L"-no_aa")) { - stru_140EDA5B0.ssaa = 0; + s_main_info.anti_alias = 0; continue; } else if (!i->compare(L"-ssformat")) { @@ -137,47 +137,48 @@ bool cpu_caps_avx2; break; if (!i->compare(L"ppm")) - stru_140EDA5B0.ss_format = 0; + s_main_info.ss_suffix = SS_SUFFIX_PPM; else if (!i->compare(L"bmp")) - stru_140EDA5B0.ss_format = 1; + s_main_info.ss_suffix = SS_SUFFIX_BMP; else if (!i->compare(L"tga")) - stru_140EDA5B0.ss_format = 2; + s_main_info.ss_suffix = SS_SUFFIX_TGA; else if (!i->compare(L"yuy2")) - stru_140EDA5B0.ss_format = 3; + s_main_info.ss_suffix = SS_SUFFIX_YUY2; else if (!i->compare(L"jpg")) - stru_140EDA5B0.ss_format = 4; + s_main_info.ss_suffix = SS_SUFFIX_JPEG; } else if (!i->compare(L"-ss4x")) { if (++i == i_end) break; - stru_140EDA5B0.screen_shot = 1; - stru_140EDA5B0.field_80 = 0; - stru_140EDA5B0.field_40.assign(*i); - stru_140EDA5B0.field_60.assign(stru_140EDA5B0.field_40); - stru_140EDA5B0.screen_shot_4x = 1; - stru_140EDA5B0.ssaa = 1; + s_main_info.ss_flag = 1; + s_main_info.field_80 = 0; + s_main_info.field_40.assign(*i); + s_main_info.field_60.assign(s_main_info.field_40); + s_main_info.ss_mode = SS_MODE_SIZE_4X; + s_main_info.anti_alias = 1; } else if (!i->compare(L"-ss36x")); else if (i->compare(L"-ssalphamask")) - stru_140EDA5B0.ss_alpha_mask = 1; + s_main_info.ss_alpha_mask = 1; else if (!i->compare(L"-fix_pv_timer")) - stru_140EDA5B0.fix_pv_timer = 1; + s_main_info.fix_pv_timer = 1; else if (!i->compare(L"-ps3")) - stru_140EDA5B0.ps3 = 1; + s_main_info.ps3 = 1; else if (!i->compare(L"-dev_rom")) - stru_140EDA5B0.dev_rom = 1; + s_main_info.dev_rom = 1; else if (!i->compare(L"-pv_full_open")) - stru_140EDA5B0.pv_full_open = 1; + s_main_info.pv_full_open = 1; else if (!i->compare(L"-no_local_rom")) - stru_140EDA5B0.local_rom = 0; + s_main_info.local_rom = 0; else if (!i->compare(L"-pcv")) - stru_140EDA5B0.pcv = 1; + s_main_info.pcv = 1; } - sub_140558EB0(screen_shot_impl_ptr, stru_140EDA5B0.ss_format); - if (stru_140EDA5B0.ssaa || stru_140EDA5B0.screen_shot) - stru_140EDA5B0.hd_res = 0; + screen_shot_impl_ptr->set_format(s_main_info.ss_suffix); + + if (s_main_info.anti_alias || s_main_info.ss_flag) + s_main_info.min_render = 0; if (show_help) { printf("Usage: %ls [option]...\n", *argv); @@ -212,7 +213,7 @@ int32_t wmain(int32_t argc, wchar_t** argv) { return 0; } - int32_t max_minor_ver = 2; + int32_t max_minor_ver = 6; bool vulkan = false; const wchar_t* config_path = 0; if (argc >= 2) diff --git a/src/ReDIVA/mode_advertise.cpp b/src/ReDIVA/mode_advertise.cpp index b5423087..05c57e92 100644 --- a/src/ReDIVA/mode_advertise.cpp +++ b/src/ReDIVA/mode_advertise.cpp @@ -8,6 +8,7 @@ #include "../CRE/data.hpp" #include "../CRE/module_table.hpp" #include "../CRE/render_context.hpp" +#include "../CRE/render_manager.hpp" #include "../CRE/sound.hpp" #include "pv_game/pv_game.hpp" #include "am_data.hpp" diff --git a/src/ReDIVA/mode_data_edit.cpp b/src/ReDIVA/mode_data_edit.cpp index e3dc9d53..38fa47da 100644 --- a/src/ReDIVA/mode_data_edit.cpp +++ b/src/ReDIVA/mode_data_edit.cpp @@ -5,6 +5,7 @@ #include "mode_data_edit.hpp" #include "../CRE/render_context.hpp" +#include "../CRE/render_manager.hpp" #include "data_edit/face_anim.hpp" #include "data_edit/glitter_editor.hpp" #include "data_edit/selector.hpp" diff --git a/src/ReDIVA/mode_data_test.cpp b/src/ReDIVA/mode_data_test.cpp index e9922213..27a4ab74 100644 --- a/src/ReDIVA/mode_data_test.cpp +++ b/src/ReDIVA/mode_data_test.cpp @@ -6,6 +6,7 @@ #include "mode_data_test.hpp" #include "../CRE/clear_color.hpp" #include "../CRE/render_context.hpp" +#include "../CRE/render_manager.hpp" #include "../CRE/stage.hpp" #include "data_edit/rob_chara_adjust.hpp" #include "data_test/auth_2d_test.hpp" diff --git a/src/ReDIVA/mode_game.cpp b/src/ReDIVA/mode_game.cpp index b83e3558..74fd18e8 100644 --- a/src/ReDIVA/mode_game.cpp +++ b/src/ReDIVA/mode_game.cpp @@ -5,6 +5,7 @@ #include "mode_game.hpp" #include "../CRE/render_context.hpp" +#include "../CRE/render_manager.hpp" #include "pv_game/player_data.hpp" #include "pv_game/pv_game.hpp" #include "mask_screen.hpp" diff --git a/src/ReDIVA/pv_game/pv_game.cpp b/src/ReDIVA/pv_game/pv_game.cpp index 9c4bdb4a..6c607cb1 100644 --- a/src/ReDIVA/pv_game/pv_game.cpp +++ b/src/ReDIVA/pv_game/pv_game.cpp @@ -12,9 +12,12 @@ #include "../../CRE/customize_item_table.hpp" #include "../../CRE/effect.hpp" #include "../../CRE/hand_item.hpp" -#include "../../CRE/random.hpp" #include "../../CRE/pv_expression.hpp" #include "../../CRE/pv_param.hpp" +#include "../../CRE/random.hpp" +#include "../../CRE/render.hpp" +#include "../../CRE/render_context.hpp" +#include "../../CRE/render_manager.hpp" #include "../../CRE/shadow.hpp" #include "../../CRE/sound.hpp" #include "../../CRE/stage_param.hpp" @@ -1204,7 +1207,7 @@ void pv_game::change_field(size_t field, ssize_t dsc_time, ssize_t curr_time) { light_param_data_storage_data_set_pv_cut((int32_t)field); rctx_ptr->render_manager->set_npr_param(next_field_data.npr_type); - rctx_ptr->render.set_cam_blur(next_field_data.cam_blur); + rctx_ptr->render->set_cam_blur(next_field_data.cam_blur); if (next_field_data.sdw_off) rctx_ptr->render_manager->set_shadow_false(); @@ -1823,7 +1826,7 @@ int32_t pv_game::ctrl_end(float_t delta_time) { task_mask_screen_fade_out(0.75f, 0); } - rctx_ptr->render.set_exposure(0.0f); + rctx_ptr->render->set_exposure(0.0f); if (data.play_data.get_aet_next_info_disp()) return 0; @@ -2750,9 +2753,9 @@ bool pv_game::load() { } if (data.pv->get_performer_count() < 2) - rctx_ptr->render.update_res(false, 1); + rctx_ptr->render->calc_draw_size(false, 1); else - rctx_ptr->render.update_res(false, 2); + rctx_ptr->render->calc_draw_size(false, 2); rctx_ptr->render_manager->set_effect_texture(0); } return false; case 3: { @@ -3247,7 +3250,7 @@ bool pv_game::load() { for (const pv_db_pv_frame_texture& i : get_pv_db_pv()->frame_texture) if (i.data.size()) { data.has_frame_texture = true; - rctx_ptr->render.frame_texture_reset(); + rctx_ptr->render->init_capture(); break; } } @@ -3562,13 +3565,14 @@ bool pv_game::load() { state = 12; } break; case 12: { - rndr::Render& rend = rctx_ptr->render; - int32_t frame_texture_slot = 0; + rndr::Render* rend = rctx_ptr->render; + int32_t slot = 0; for (const pv_db_pv_frame_texture& i : data.pv->frame_texture) { - texture* tex = texture_manager_get_texture(aft_tex_db->get_texture_id(i.data.c_str())); - if (tex) - rend.frame_texture_load(frame_texture_slot, (rndr::Render::FrameTextureType)i.type, tex); - frame_texture_slot++; + texture* txhd = texture_manager_get_texture(aft_tex_db->get_texture_id(i.data.c_str())); + if (txhd) + rend->register_fb_man_cap((rndr::Render::CaptureSlot)slot, + (rndr::Render::CaptureType)i.type, txhd); + slot++; } /*if (sel_main_get()->check_alive()) @@ -4601,7 +4605,7 @@ bool pv_game::set_pv_param_post_process_color_correction_data(bool set, int32_t } bool pv_game::set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration) { - rctx_ptr->render.set_dof_enable(set); + rctx_ptr->render->enable_dof_set(set); pv_param::dof& dof = pv_param::post_process_data_get_dof_data(id); if (set) @@ -4690,19 +4694,19 @@ bool pv_game::unload() { data.field_2CF30 = 4; - rndr::Render& rend = rctx_ptr->render; - int32_t frame_texture_slot = 0; + rndr::Render* rend = rctx_ptr->render; + int32_t slot = 0; for (const pv_db_pv_frame_texture& i : data.pv->frame_texture) { if (i.data.size()) { - texture* tex = texture_manager_get_texture(aft_tex_db->get_texture_id(i.data.c_str())); - if (tex) - rend.frame_texture_unload(frame_texture_slot, tex); + texture* txhd = texture_manager_get_texture(aft_tex_db->get_texture_id(i.data.c_str())); + if (txhd) + rend->unregister_fb_man_cap((rndr::Render::CaptureSlot)slot, txhd); } - frame_texture_slot++; + slot++; } if (data.has_frame_texture) { - rend.frame_texture_free(); + rend->free_capture(); data.has_frame_texture = false; } @@ -4891,13 +4895,13 @@ bool pv_game::unload() { light_param_data_storage_data_reset(); - rndr::Render& rend = rctx_ptr->render; - rend.reset_saturate_coeff(0, true); - rend.set_dof_enable(false); - rend.reset_scene_fade(0); + rndr::Render* rend = rctx_ptr->render; + rend->set_saturate_coef_default(0, true); + rend->enable_dof_set(false); + rend->set_fade_color_default(); if (!false/*sub_140192E20()*/) - rend.set_taa(1); - rend.update_res(0, -1); + rend->set_temporal_aa(1); + rend->calc_draw_size(0, -1); rctx_ptr->disp_manager->object_culling = true; get_shadow()->set_shadow_range(1.0f); diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.cpp b/src/ReDIVA/pv_game/pv_game_pv_data.cpp index fbc6fab7..185c41c0 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.cpp @@ -8,6 +8,9 @@ #include "../../CRE/app_system_detail.hpp" #include "../../CRE/pv_expression.hpp" #include "../../CRE/pv_param.hpp" +#include "../../CRE/render.hpp" +#include "../../CRE/render_context.hpp" +#include "../../CRE/render_manager.hpp" #include "../../CRE/shadow.hpp" #include "../information/dw_console.hpp" #include "../mask_screen.hpp" @@ -238,7 +241,7 @@ pv_data_camera::pv_data_camera() : enable(), time() { index = -1; } -pv_scene_fade::pv_scene_fade() : enable(), time(), duration(), start_alpha(), end_alpha() { +pv_scene_fade::pv_scene_fade() : enable(), time(), duration(), start_alpha(), end_alpha(), color() { } @@ -259,8 +262,8 @@ void pv_scene_fade::ctrl(float_t delta_time) { end = false; } - rctx_ptr->render.set_scene_fade_color(color, 1); - rctx_ptr->render.set_scene_fade_alpha(alpha, 1); + rctx_ptr->render->set_fade_color(color, 1); + rctx_ptr->render->set_fade_rate(alpha, 1); if (end) reset(); @@ -272,7 +275,9 @@ void pv_scene_fade::reset() { duration = 0.0f; start_alpha = 0.0f; end_alpha = 0.0f; - color = 0.0f; + color[0] = 0.0f; + color[1] = 0.0f; + color[2] = 0.0f; } pv_dsc_target::pv_dsc_target() : amplitude(), frequency(), slide_chain_start(), @@ -1538,36 +1543,36 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, scene_fade.duration = (float_t)data[0] * 0.001f; scene_fade.start_alpha = (float_t)data[1] * 0.001f; scene_fade.end_alpha = (float_t)data[2] * 0.001f; - scene_fade.color.x = (float_t)data[3] * 0.001f; - scene_fade.color.y = (float_t)data[4] * 0.001f; - scene_fade.color.z = (float_t)data[5] * 0.001f; + scene_fade.color[0] = (float_t)data[3] * 0.001f; + scene_fade.color[1] = (float_t)data[4] * 0.001f; + scene_fade.color[2] = (float_t)data[5] * 0.001f; scene_fade.enable = true; scene_fade.time = 0.0f; scene_fade_ctrl(0.0f); } break; case DSC_FT_TONE_TRANS: { - vec3 start; - start.x = (float_t)data[0] * 0.001f; - start.y = (float_t)data[1] * 0.001f; - start.z = (float_t)data[2] * 0.001f; + float_t start[3]; + start[0] = (float_t)data[0] * 0.001f; + start[1] = (float_t)data[1] * 0.001f; + start[2] = (float_t)data[2] * 0.001f; - vec3 end; - end.x = (float_t)data[3] * 0.001f; - end.y = (float_t)data[4] * 0.001f; - end.z = (float_t)data[5] * 0.001f; + float_t end[3]; + end[0] = (float_t)data[3] * 0.001f; + end[1] = (float_t)data[4] * 0.001f; + end[2] = (float_t)data[5] * 0.001f; - rctx_ptr->render.set_tone_trans(start, end, 1); + rctx_ptr->render->set_tone_trans(start, end, 1); } break; case DSC_FT_SATURATE: { - float_t saturate_coeff = (float_t)data[0] * 0.001f; + float_t saturate_coef = (float_t)data[0] * 0.001f; - rctx_ptr->render.set_saturate_coeff(saturate_coeff, 1, false); + rctx_ptr->render->set_saturate_coef(saturate_coef, 1, false); } break; case DSC_FT_FADE_MODE: { int32_t blend_func = data[0]; - rctx_ptr->render.set_scene_fade_blend_func(blend_func, 1); + rctx_ptr->render->set_fade_blend_func(blend_func, 1); } break; case DSC_FT_AUTO_BLINK: { rob_id = (ROB_ID)data[0]; @@ -1960,13 +1965,13 @@ bool pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, int32_t enable = data[0]; if (pv_game->data.pv) - rctx_ptr->render.frame_texture_cont_capture_set(enable == 1); + rctx_ptr->render->set_frame_texture_aoto_cap(enable == 1); } break; case DSC_FT_MAN_CAP: { int32_t slot = data[0]; if (pv_game->data.pv && slot >= 0 && slot <= 4) - rctx_ptr->render.frame_texture_slot_capture_set(slot + 1); + rctx_ptr->render->capture_slot_enable((rndr::Render::CaptureSlot)(1 + slot)); } break; case DSC_FT_TOON: { int32_t npr_param = data[0]; @@ -2562,9 +2567,9 @@ void pv_game_pv_data::reset_camera_post_process() { cam->set_ignore_fov(false); cam->set_fov(32.2673416137695f); - rctx_ptr->render.reset_scene_fade(1); - rctx_ptr->render.reset_tone_trans(1); - rctx_ptr->render.reset_saturate_coeff(1, 1); + rctx_ptr->render->set_fade_color_default(1); + rctx_ptr->render->set_tone_trans_default(1); + rctx_ptr->render->set_saturate_coef_default(1, true); Shadow* shad = get_shadow(); if (shad) diff --git a/src/ReDIVA/pv_game/pv_game_pv_data.hpp b/src/ReDIVA/pv_game/pv_game_pv_data.hpp index 2f5e3ca7..2ca6ee44 100644 --- a/src/ReDIVA/pv_game/pv_game_pv_data.hpp +++ b/src/ReDIVA/pv_game/pv_game_pv_data.hpp @@ -199,7 +199,7 @@ struct pv_scene_fade { float_t duration; float_t start_alpha; float_t end_alpha; - vec3 color; + float_t color[3]; pv_scene_fade(); diff --git a/src/ReDIVA/system_startup.cpp b/src/ReDIVA/system_startup.cpp index 00aa8d2c..1d5ce7b7 100644 --- a/src/ReDIVA/system_startup.cpp +++ b/src/ReDIVA/system_startup.cpp @@ -7,6 +7,8 @@ #include "../CRE/app_system_detail.hpp" #include "../CRE/auth_2d.hpp" #include "../CRE/mdata_manager.hpp" +#include "../CRE/render_context.hpp" +#include "../CRE/render_manager.hpp" #include "../CRE/sprite.hpp" #include "../KKdLib/io/path.hpp" #include "pv_game/pv_game.hpp" diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 34ff60b7..5124a233 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -18,6 +18,8 @@ #include "../CRE/pv_expression.hpp" #include "../CRE/pv_param.hpp" #include "../CRE/random.hpp" +#include "../CRE/render.hpp" +#include "../CRE/render_manager.hpp" #include "../CRE/shader_ft.hpp" #include "../CRE/shadow.hpp" #include "../CRE/sound.hpp" @@ -3409,27 +3411,27 @@ bool x_pv_game_pv_data::dsc_ctrl(float_t delta_time, int64_t curr_time, } break; case DSC_X_TONE_TRANS: { - vec3 start; - start.x = (float_t)data[0] * 0.001f; - start.y = (float_t)data[1] * 0.001f; - start.z = (float_t)data[2] * 0.001f; + float_t start[3]; + start[0] = (float_t)data[0] * 0.001f; + start[1] = (float_t)data[1] * 0.001f; + start[2] = (float_t)data[2] * 0.001f; - vec3 end; - end.x = (float_t)data[3] * 0.001f; - end.y = (float_t)data[4] * 0.001f; - end.z = (float_t)data[5] * 0.001f; + float_t end[3]; + end[0] = (float_t)data[3] * 0.001f; + end[1] = (float_t)data[4] * 0.001f; + end[2] = (float_t)data[5] * 0.001f; - rctx_ptr->render.set_tone_trans(start, end, 1); + rctx_ptr->render->set_tone_trans(start, end, 1); } break; case DSC_X_SATURATE: { - float_t saturate_coeff = (float_t)data[0] * 0.001f; + float_t saturate_coef = (float_t)data[0] * 0.001f; - rctx_ptr->render.set_saturate_coeff(saturate_coeff, 1, false); + rctx_ptr->render->set_saturate_coef(saturate_coef, 1, false); } break; case DSC_X_FADE_MODE: { int32_t blend_func = data[0]; - rctx_ptr->render.set_scene_fade_blend_func(blend_func, 1); + rctx_ptr->render->set_fade_blend_func(blend_func, 1); } break; case DSC_X_AUTO_BLINK: { @@ -4322,8 +4324,8 @@ bool x_pv_game_pv_data::set_pv_param_post_process_color_correction_data(bool set } bool x_pv_game_pv_data::set_pv_param_post_process_dof_data(bool set, int32_t id, float_t duration) { - rctx_ptr->render.set_dof_enable(set); - rctx_ptr->render.set_dof_update(set); + rctx_ptr->render->enable_dof_set(set); + rctx_ptr->render->update_dof_set(set); pv_param::dof& dof = pv_param::post_process_data_get_dof_data(id); if (set) @@ -6491,9 +6493,9 @@ bool x_pv_game::ctrl() { } if (pv_data.play_param->chara.size() < 2) - rctx_ptr->render.update_res(false, 1); + rctx_ptr->render->calc_draw_size(false, 1); else - rctx_ptr->render.update_res(false, 2); + rctx_ptr->render->calc_draw_size(false, 2); #if BAKE_PV826 if (pv_data.pv_id == 826) @@ -7995,14 +7997,14 @@ void x_pv_game::post() { rend_data_ctx.state.set_viewport(0, 0, width, height); if (nvenc_rgb) { - rend_data_ctx.shader_flags.arr[U_REDUCE] = 0; + rend_data_ctx.shader_flags.arr[U_REDUCE_TEX] = 0; shaders_dev.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_FT_REDUCE); } else shaders_dev.set(rend_data_ctx.state, rend_data_ctx.shader_flags, SHADER_DEV_CONVERT_ALPHA); - rctx_ptr->render.draw_quad(rend_data_ctx, width, height, + rctx_ptr->render->draw_quad(rend_data_ctx, width, height, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); if (nvenc_rgb) @@ -8021,14 +8023,14 @@ void x_pv_game::post() { if (dof_cam_data.frame != frame) { camera* cam = rctx_ptr->camera; - bool enable = rctx_ptr->render.get_dof_enable(); + bool enable = rctx_ptr->render->get_dof_enable(); float_t focus; float_t focus_range; float_t fuzzing_range; float_t ratio; - rctx_ptr->render.get_dof_data(focus, focus_range, fuzzing_range, ratio); - ratio *= rctx_ptr->render.get_dof_enable() ? 1.0f : 0.0f; + rctx_ptr->render->get_dof_data(focus, focus_range, fuzzing_range, ratio); + ratio *= rctx_ptr->render->get_dof_enable() ? 1.0f : 0.0f; vec3 interest; vec3 view_point; @@ -8280,14 +8282,14 @@ bool x_pv_game::unload() { light_param_data_storage_data_reset(); - rndr::Render& rend = rctx_ptr->render; - rend.reset_saturate_coeff(0, true); - rend.set_dof_enable(false); - rend.set_dof_update(false); - rend.reset_scene_fade(0); + rndr::Render* rend = rctx_ptr->render; + rend->set_saturate_coef_default(0, true); + rend->enable_dof_set(false); + rend->update_dof_set(false); + rend->set_fade_color_default(); - rend.set_taa(1); - rend.update_res(0, -1); + rend->set_temporal_aa(1); + rend->calc_draw_size(false, -1); rctx_ptr->disp_manager->object_culling = true; get_shadow()->set_shadow_range(1.0f); @@ -9277,8 +9279,7 @@ void obj_set_reflect::pack_file(void** data, size_t* size, bool mmp, for (uint32_t i = 0; i < 0x10; i += sizeof(uint32_t)) *(uint32_t*)(iv + i) = Random(RANDOM_TYPE_GLOBAL); - - prj::Rijndael rijndael(prj::Rijndael_Nb, prj::Rijndael_Nk128, key); + prj::Rijndael rijndael(prj::Rijndael_Nb, prj::Rijndael_Nk256, key); uint8_t _iv[prj::Rijndael_Nlen]; memcpy(_iv, iv, prj::Rijndael_Nlen); @@ -13432,11 +13433,11 @@ static void x_pv_game_write_stage_data(int32_t stage_id, const auth_3d_database* stage_data->object_shadow = replace_object_info(i.object_shadow, x_stage_obj_db, x_pack_obj_db); stage_data->object_reflect = replace_object_info(i.object_reflect, x_stage_obj_db, x_pack_obj_db); stage_data->object_refract = replace_object_info(i.object_refract, x_stage_obj_db, x_pack_obj_db); - stage_data->lens_flare_texture = -1; - stage_data->lens_shaft_texture = -1; - stage_data->lens_ghost_texture = -1; - stage_data->lens_shaft_inv_scale = 1.0f; - stage_data->unknown = 0; + stage_data->tex_flare = -1; + stage_data->tex_shaft = -1; + stage_data->tex_ghost = -1; + stage_data->shaft_scale = 1.0f; + stage_data->num_ghosts = 0; stage_data->render_texture = replace_texture_id(i.render_texture, x_stage_tex_db, x_pack_tex_db); if (stage_data->render_texture == -1) {