From a6911f18e46e829a378c1909998796a14ca747b7 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Tue, 26 Dec 2023 16:23:40 +0300 Subject: [PATCH] Fixed incorrect sprite rendering --- src/DivaGL/Glitter/render_scene.cpp | 12 ++++---- src/DivaGL/camera.cpp | 44 ++++++++++++-------------- src/DivaGL/camera.hpp | 16 +++++----- src/DivaGL/mdl/disp_manager.cpp | 22 ++++++------- src/DivaGL/render.cpp | 48 ++++++++++++++--------------- src/DivaGL/render_manager.cpp | 6 ++-- src/DivaGL/renderer/dof.cpp | 11 +++---- src/DivaGL/rob/rob.cpp | 2 +- src/DivaGL/sprite.cpp | 4 +-- src/DivaGL/stage.cpp | 6 ++-- 10 files changed, 81 insertions(+), 90 deletions(-) diff --git a/src/DivaGL/Glitter/render_scene.cpp b/src/DivaGL/Glitter/render_scene.cpp index 6d03e8b..7386cfe 100644 --- a/src/DivaGL/Glitter/render_scene.cpp +++ b/src/DivaGL/Glitter/render_scene.cpp @@ -167,8 +167,8 @@ namespace Glitter { mat4 cam_view; mat4 cam_inv_view; - mat4_transpose(&camera_data->view_matrix, &cam_view); - mat4_transpose(&camera_data->inv_view_matrix, &cam_inv_view); + mat4_transpose(&camera_data->view, &cam_view); + mat4_transpose(&camera_data->inv_view, &cam_inv_view); vec3 x_vec = { 1.0f, 0.0f, 0.0f }; if (rend_group->flags & PARTICLE_LOCAL) { @@ -310,8 +310,8 @@ namespace Glitter { mat4 cam_view; mat4 cam_inv_view; - mat4_transpose(&camera_data->view_matrix, &cam_view); - mat4_transpose(&camera_data->inv_view_matrix, &cam_inv_view); + mat4_transpose(&camera_data->view, &cam_view); + mat4_transpose(&camera_data->inv_view, &cam_inv_view); mat4 model_mat; mat4 view_mat; @@ -744,8 +744,8 @@ namespace Glitter { mat4 cam_view; mat4 cam_projection; - mat4_transpose(&camera_data->view_matrix, &cam_view); - mat4_transpose(&camera_data->projection_matrix, &cam_projection); + mat4_transpose(&camera_data->view, &cam_view); + mat4_transpose(&camera_data->projection, &cam_projection); mat4 mat; mat4_transpose(&rend_group->mat_draw, &mat); diff --git a/src/DivaGL/camera.cpp b/src/DivaGL/camera.cpp index d41aa06..56c2254 100644 --- a/src/DivaGL/camera.cpp +++ b/src/DivaGL/camera.cpp @@ -22,20 +22,15 @@ HOOK(void, FASTCALL, camera_data_update_projection, 0x00000001401F8E90) { float_t render_half_width = (float_t)res_wind_int->width * 0.5f; float_t render_half_height = (float_t)res_wind_int->height * 0.5f; - static float_t field_20 = tanf(atanf(tanf(0.34557518363f) * 0.75f)); + float_t aet_depth = camera_data->aet_depth; - float_t aet_depth = sprite_half_height / field_20; - camera_data->aet_depth = aet_depth; - - float_t fov_correct_height = sprite_half_height / tanf(camera_data->fov * 0.5f * DEG_TO_RAD_FLOAT); - camera_data->fov_correct_height = fov_correct_height; - - float_t v8 = (float_t)camera_data->min_distance / aet_depth; - float_t v8a = v8 * sprite_half_width; - float_t v8b = v8 * sprite_half_height; + float_t spr_2d_range = camera_data->min_distance / aet_depth; + float_t spr_2d_range_x = spr_2d_range * sprite_half_width; + float_t spr_2d_range_y = spr_2d_range * sprite_half_height; mat4 spr_2d_proj; - mat4_frustrum(-v8a, v8a, v8b, -v8b, camera_data->min_distance, 3000.0, &spr_2d_proj); + mat4_frustrum(-spr_2d_range_x, spr_2d_range_x, spr_2d_range_y, -spr_2d_range_y, + camera_data->min_distance, 3000.0f, &spr_2d_proj); vec3 spr_2d_viewpoint = { sprite_half_width, sprite_half_height, aet_depth }; vec3 spr_2d_interest = { sprite_half_width, sprite_half_height, 0.0f }; @@ -43,31 +38,30 @@ HOOK(void, FASTCALL, camera_data_update_projection, 0x00000001401F8E90) { mat4 spr_2d_view; mat4_look_at(&spr_2d_viewpoint, &spr_2d_interest, &spr_2d_up, &spr_2d_view); - mat4_mul(&spr_2d_view, &spr_2d_proj, &camera_data->view_projection_aet_2d_matrix); - mat4_transpose(&camera_data->view_projection_aet_2d_matrix, - &camera_data->view_projection_aet_2d_matrix); + mat4_mul(&spr_2d_view, &spr_2d_proj, &spr_2d_proj); + mat4_transpose(&spr_2d_proj, &camera_data->view_projection_aet_2d); - float_t v13c = render_half_height / tanf(camera_data->fov * 0.5f * DEG_TO_RAD_FLOAT); + float_t aet_3d_depth = render_half_height / tanf(camera_data->aet_fov * 0.5f * DEG_TO_RAD_FLOAT); - float_t v13 = (float_t)camera_data->min_distance / v13c; - float_t v13a = v13 * render_half_width; - float_t v13b = v13 * render_half_height; + float_t spr_3d_range = camera_data->min_distance / aet_3d_depth; + float_t spr_3d_range_x = spr_3d_range * render_half_width; + float_t spr_3d_range_y = spr_3d_range * render_half_height; mat4 spr_3d_proj; - mat4_frustrum(-v13a, v13a, v13b, -v13b, camera_data->min_distance, 3000.0, &spr_3d_proj); + mat4_frustrum(-spr_3d_range_x, spr_3d_range_x, spr_3d_range_y, -spr_3d_range_y, + camera_data->min_distance, 3000.0f, &spr_3d_proj); - vec3 spr_3d_viewpoint = { render_half_width, render_half_height, v13c }; + vec3 spr_3d_viewpoint = { render_half_width, render_half_height, aet_3d_depth }; vec3 spr_3d_interest = { render_half_width, render_half_height, 0.0f }; vec3 spr_3d_up = { 0.0f, 1.0f, 0.0f }; mat4 spr_3d_view; mat4_look_at(&spr_3d_viewpoint, &spr_3d_interest, &spr_3d_up, &spr_3d_view); - mat4_mul(&spr_3d_view, &spr_3d_proj, &camera_data->view_projection_aet_3d_matrix); - mat4_transpose(&camera_data->view_projection_aet_3d_matrix, - &camera_data->view_projection_aet_3d_matrix); + mat4_mul(&spr_3d_view, &spr_3d_proj, &spr_3d_proj); + mat4_transpose(&spr_3d_proj, &camera_data->view_projection_aet_3d); - render->calc_projection_matrix(&camera_data->projection_matrix, - camera_data->fov, (float_t)camera_data->aspect, camera_data->min_distance, camera_data->max_distance, + render->calc_projection_matrix(&camera_data->projection, camera_data->fov, + (float_t)camera_data->aspect, camera_data->min_distance, camera_data->max_distance, camera_data->projection_scale.x, camera_data->projection_scale.y, camera_data->projection_scale.z, camera_data->projection_scale.w); camera_data->fov_horizontal_rad = tanf(camera_data->fov * 0.5f * DEG_TO_RAD_FLOAT); diff --git a/src/DivaGL/camera.hpp b/src/DivaGL/camera.hpp index a3b0911..f7c8dce 100644 --- a/src/DivaGL/camera.hpp +++ b/src/DivaGL/camera.hpp @@ -14,7 +14,7 @@ struct camera_struct { vec3 interest; float_t roll; float_t fov; - float_t field_20; + float_t aet_fov; int32_t field_24; double_t aspect; float_t min_distance; @@ -29,13 +29,13 @@ struct camera_struct { bool ignore_min_dist; char field_5A; char field_5B; - mat4 view_matrix; - mat4 inv_view_matrix; - mat4 projection_matrix; - mat4 view_projection_matrix; - mat4 view_projection_aet_2d_matrix; - mat4 view_projection_aet_3d_matrix; - float_t fov_correct_height; + mat4 view; + mat4 inv_view; + mat4 projection; + mat4 view_projection; + mat4 view_projection_aet_2d; + mat4 view_projection_aet_3d; + float_t depth; float_t aet_depth; vec3 field_1E4; vec3 field_1F0; diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index f476d67..06ab018 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -1599,17 +1599,17 @@ namespace mdl { static int32_t obj_axis_aligned_bounding_box_check_visibility( obj_axis_aligned_bounding_box* aabb, const mat4* mat) { vec3 points[8]; - points[0] = aabb->center + (aabb->size ^ vec3(0.0f, 0.0f, 0.0f)); + points[0] = aabb->center + (aabb->size ^ vec3( 0.0f, 0.0f, 0.0f)); points[1] = aabb->center + (aabb->size ^ vec3(-0.0f, -0.0f, -0.0f)); - points[2] = aabb->center + (aabb->size ^ vec3(-0.0f, 0.0f, 0.0f)); - points[3] = aabb->center + (aabb->size ^ vec3(0.0f, -0.0f, -0.0f)); - points[4] = aabb->center + (aabb->size ^ vec3(0.0f, -0.0f, 0.0f)); - points[5] = aabb->center + (aabb->size ^ vec3(-0.0f, 0.0f, -0.0f)); - points[6] = aabb->center + (aabb->size ^ vec3(0.0f, 0.0f, -0.0f)); - points[7] = aabb->center + (aabb->size ^ vec3(-0.0f, -0.0f, 0.0f)); + points[2] = aabb->center + (aabb->size ^ vec3(-0.0f, 0.0f, 0.0f)); + points[3] = aabb->center + (aabb->size ^ vec3( 0.0f, -0.0f, -0.0f)); + points[4] = aabb->center + (aabb->size ^ vec3( 0.0f, -0.0f, 0.0f)); + points[5] = aabb->center + (aabb->size ^ vec3(-0.0f, 0.0f, -0.0f)); + points[6] = aabb->center + (aabb->size ^ vec3( 0.0f, 0.0f, -0.0f)); + points[7] = aabb->center + (aabb->size ^ vec3(-0.0f, -0.0f, 0.0f)); mat4 view_mat; - mat4_mul(&camera_data->view_matrix, mat, &view_mat); + mat4_mul(&camera_data->view, mat, &view_mat); mat4_transpose(&view_mat, &view_mat); for (int32_t i = 0; i < 8; i++) @@ -1617,7 +1617,7 @@ namespace mdl { vec4 v2[6]; *(vec3*)&v2[0] = { 0.0f, 0.0f, -1.0f }; - v2[0].w = (float_t)-camera_data->min_distance; + v2[0].w = -camera_data->min_distance; *(vec3*)&v2[1] = camera_data->field_1E4; v2[1].w = 0.0f; *(vec3*)&v2[2] = camera_data->field_1F0; @@ -1627,7 +1627,7 @@ namespace mdl { *(vec3*)&v2[4] = camera_data->field_208; v2[4].w = 0.0f; *(vec3*)&v2[5] = { 0.0f, 0.0f, 1.0f }; - v2[5].w = (float_t)camera_data->max_distance; + v2[5].w = camera_data->max_distance; for (int32_t i = 0; i < 6; i++) for (int32_t j = 0; j < 8; j++) { @@ -1652,7 +1652,7 @@ namespace mdl { mat4_transform_point(&_mat, &sphere->center, ¢er); float_t radius = mat4_get_max_scale(&_mat) * sphere->radius; - mat4_transpose(&camera_data->view_matrix, &_mat); + mat4_transpose(&camera_data->view, &_mat); mat4_transform_point(&_mat, ¢er, ¢er); double_t min_depth = (double_t)center.z - (double_t)radius; diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index 879da6b..e1a349b 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -217,10 +217,10 @@ namespace rndr { gl_state_bind_vertex_array(rctx->common_vao); rctx->sun_quad_ubo.Bind(0); - mat4 view_matrix; - mat4_transpose(&camera_data->view_matrix, &view_matrix); - mat4 projection_matrix; - mat4_transpose(&camera_data->projection_matrix, &projection_matrix); + mat4 view; + mat4_transpose(&camera_data->view, &view); + mat4 projection; + mat4_transpose(&camera_data->projection, &projection); ExposureCharaData* chara_data = exposure_chara_data; int32_t query_index = (this->exposure_query_index + 1) % 3; @@ -236,11 +236,11 @@ namespace rndr { mat4 mat = mat4_identity; sub_1405163C0(rob_chr, 4, &mat); - mat4_mul(&mat, &view_matrix, &mat); + mat4_mul(&mat, &view, &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, &projection_matrix, &mat); + mat4_mul(&mat, &projection, &mat); sun_quad_shader_data shader_data = {}; mat4_transpose(&mat, &mat); @@ -279,7 +279,7 @@ namespace rndr { void Render::calc_projection_matrix(mat4* mat, float_t fov, float_t aspect, float_t z_near, float_t z_far, float_t left_scale, float_t right_scale, float_t bottom_scale, float_t top_scale) { - float_t tan_fov = tanf(fov * DEG_TO_RAD_FLOAT * 0.5f) * z_near; + float_t tan_fov = (float_t)tan(fov * M_PI * (1.0 / 360.0)) * z_near; float_t left = -tan_fov * aspect + tan_fov * aspect * left_scale; float_t right = tan_fov * aspect + tan_fov * aspect * right_scale; float_t bottom = -tan_fov + tan_fov * bottom_scale; @@ -312,7 +312,7 @@ namespace rndr { stage_index = task_stage_get_current_stage_index(); cam_view_projection_prev = cam_view_projection; - cam_view_projection = camera_data->view_projection_matrix; + cam_view_projection = camera_data->view_projection; reset_exposure = camera_data->fast_change_hist1 && !camera_data->fast_change_hist0; if (reset_exposure) { @@ -382,15 +382,15 @@ namespace rndr { if (!tex) return; - mat4 view_matrix; - mat4_transpose(&camera_data->view_matrix, &view_matrix); - mat4 projection_matrix; - mat4_transpose(&camera_data->projection_matrix, &projection_matrix); + mat4 view; + mat4_transpose(&camera_data->view, &view); + mat4 projection; + mat4_transpose(&camera_data->projection, &projection); - mat4 view_projection_matrix; + mat4 view_projection; mat4 inverse_view_projection_matrix; - mat4_transpose(&camera_data->view_projection_matrix, &view_projection_matrix); - mat4_invert(&view_projection_matrix, &inverse_view_projection_matrix); + mat4_transpose(&camera_data->view_projection, &view_projection); + mat4_invert(&view_projection, &inverse_view_projection_matrix); float_t v5 = tanf(camera_data->fov * 0.5f * DEG_TO_RAD_FLOAT); light_set* set = &light_set_data[LIGHT_SET_MAIN]; @@ -415,7 +415,7 @@ namespace rndr { *(vec3*)&v44 = position; v44.w = 1.0f; - mat4_transform_vector(&view_projection_matrix, &v44, &v44); + mat4_transform_vector(&view_projection, &v44, &v44); float_t v13 = 1.0f / v44.w; float_t v14 = v44.x * v13; @@ -465,10 +465,10 @@ namespace rndr { gl_state_disable_cull_face(); mat4 mat; - mat4_mul_translate(&view_matrix, &position, &mat); + mat4_mul_translate(&view, &position, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 0.2f, &mat); - mat4_mul(&mat, &projection_matrix, &mat); + mat4_mul(&mat, &projection, &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; @@ -481,10 +481,10 @@ namespace rndr { shaders_ft.draw_arrays(GL_TRIANGLE_STRIP, 0, 4); glEndQuery(GL_SAMPLES_PASSED); - mat4_mul_translate(&view_matrix, (vec3*)&v44, &mat); + mat4_mul_translate(&view, (vec3*)&v44, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 2.0f, &mat); - mat4_mul(&mat, &projection_matrix, &mat); + mat4_mul(&mat, &projection, &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; @@ -520,10 +520,10 @@ namespace rndr { gl_state_set_blend_func(GL_ONE, GL_ONE); gl_state_set_depth_mask(GL_FALSE); - mat4_mul_translate(&view_matrix, &position, &mat); + mat4_mul_translate(&view, &position, &mat); mat4_clear_rot(&mat, &mat); mat4_scale_rot(&mat, v24 * 1.1f, &mat); - mat4_mul(&mat, &projection_matrix, &mat); + mat4_mul(&mat, &projection, &mat); mat4_transpose(&mat, &mat); shader_data.g_transform[0] = mat.row0; @@ -1346,8 +1346,8 @@ namespace rndr { mat4 v42; mat4 v43; - mat4_mul(&camera_data->view_matrix, &v44, &v42); - mat4_mul(&camera_data->projection_matrix, &v42, &v43); + mat4_mul(&camera_data->view, &v44, &v42); + mat4_mul(&camera_data->projection, &v42, &v43); mat4_transpose(&v42, &v42); mat4_transpose(&v43, &v43); diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index 00752e9..84ef50f 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -1019,9 +1019,9 @@ void image_filter_scale(GLuint dst, GLuint src, const vec4 scale) { void draw_pass_set_camera() { camera_struct::update_data(); - mat4_transpose(&camera_data->view_matrix, &rctx->view_mat); - mat4_transpose(&camera_data->projection_matrix, &rctx->proj_mat); - mat4_transpose(&camera_data->view_projection_matrix, &rctx->vp_mat); + mat4_transpose(&camera_data->view, &rctx->view_mat); + mat4_transpose(&camera_data->projection, &rctx->proj_mat); + mat4_transpose(&camera_data->view_projection, &rctx->vp_mat); rctx->obj_scene.set_projection_view(rctx->view_mat, rctx->proj_mat); camera_data->get_view_point(rctx->obj_scene.g_view_position); rctx->obj_scene.g_view_position.w = 0.0f; diff --git a/src/DivaGL/renderer/dof.cpp b/src/DivaGL/renderer/dof.cpp index 5233cce..e9d9558 100644 --- a/src/DivaGL/renderer/dof.cpp +++ b/src/DivaGL/renderer/dof.cpp @@ -42,10 +42,9 @@ namespace renderer { vec3 chara_trans = 0.0f; mat4_get_translation(&mat, &chara_trans); - mat4 view_transpose; - mat4_transpose(&camera_data->view_matrix, &view_transpose); - focus = -vec3::dot(*(vec3*)&view_transpose.row2, chara_trans) - - view_transpose.row2.w - 0.1f; + mat4 view; + mat4_transpose(&camera_data->view, &view); + focus = -vec3::dot(*(vec3*)&view.row2, chara_trans) - view.row2.w - 0.1f; break; } } @@ -59,9 +58,7 @@ namespace renderer { } else { float_t fuzzing_range = max_def(dof_debug_data->f2.fuzzing_range, 0.01f); - apply_f2(rt, - rt->GetColorTex(), - rt->GetDepthTex(), + apply_f2(rt, rt->GetColorTex(), rt->GetDepthTex(), camera_data->min_distance, camera_data->max_distance, camera_data->fov * DEG_TO_RAD_FLOAT, dof_debug_data->f2.focus, dof_debug_data->f2.focus_range, diff --git a/src/DivaGL/rob/rob.cpp b/src/DivaGL/rob/rob.cpp index d0dac03..c138048 100644 --- a/src/DivaGL/rob/rob.cpp +++ b/src/DivaGL/rob/rob.cpp @@ -518,7 +518,7 @@ void rob_patch() { static void rob_chara_age_age_disp(rob_chara_age_age* arr, int32_t chara_id, bool reflect, bool chara_color) { bool npr = !!render_manager->npr_param; - mat4& view = camera_data->view_matrix; + mat4& view = camera_data->view; vec3 v11 = *(vec3*)&view.row2; arr[chara_id * 3 + 0].disp(chara_id, npr, reflect, v11, chara_color); arr[chara_id * 3 + 1].disp(chara_id, npr, reflect, v11, chara_color); diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index 157f350..2755eb5 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -1209,8 +1209,8 @@ void sprite_manager_set_res(double_t aspect, int32_t width, int32_t height) { void sprite_manager_set_view_projection(bool aet_3d) { view_projection_aet = aet_3d - ? camera_data->view_projection_aet_3d_matrix - : camera_data->view_projection_aet_2d_matrix; + ? camera_data->view_projection_aet_3d + : camera_data->view_projection_aet_2d; } void sprite_manager_free() { diff --git a/src/DivaGL/stage.cpp b/src/DivaGL/stage.cpp index 3e3dc97..52797d7 100644 --- a/src/DivaGL/stage.cpp +++ b/src/DivaGL/stage.cpp @@ -172,12 +172,12 @@ void stage_patch() { } static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* sphere, mat4* mat) { - mat4 view_matrix; - mat4_transpose(&camera_data->view_matrix, &view_matrix); + mat4 view; + mat4_transpose(&camera_data->view, &view); vec3 center; mat4_transform_point(mat, &sphere->center, ¢er); - mat4_transform_point(&view_matrix, ¢er, ¢er); + mat4_transform_point(&view, ¢er, ¢er); float_t radius = sphere->radius; Shadow* shad = shadow_ptr_get();