From 5e83b67648ee0e7ad072b02f3437a30d16c8f55d Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 3 Aug 2024 08:45:16 +0300 Subject: [PATCH] Adapted new findings --- src/DivaGL/auth_3d.cpp | 8 ++++-- src/DivaGL/camera.cpp | 4 +-- src/DivaGL/camera.hpp | 5 +++- src/DivaGL/canonical_properties.cpp | 4 +-- src/DivaGL/canonical_properties.hpp | 4 +-- src/DivaGL/common.asm | 44 ++++++++++++++++++----------- src/DivaGL/item_table.hpp | 2 ++ src/DivaGL/mdl/disp_manager.cpp | 4 +-- src/DivaGL/mdl/disp_manager.hpp | 4 +-- src/DivaGL/pv_game/pv_game.cpp | 29 +++++++++---------- src/DivaGL/render.cpp | 14 ++++----- src/DivaGL/render.hpp | 2 +- src/DivaGL/rob/rob.cpp | 1 - src/DivaGL/sprite.hpp | 2 +- 14 files changed, 70 insertions(+), 57 deletions(-) diff --git a/src/DivaGL/auth_3d.cpp b/src/DivaGL/auth_3d.cpp index 7e1af4f..65b1645 100644 --- a/src/DivaGL/auth_3d.cpp +++ b/src/DivaGL/auth_3d.cpp @@ -517,8 +517,6 @@ struct struc_8 { size_t data_size; bool field_18; CanonicalProperties CanProp; - bool field_58; - int32_t field_5C; int32_t field_60; int32_t field_64; int64_t field_68; @@ -981,7 +979,7 @@ HOOK(void, FASTCALL, auth_3d_curve_array_free, 0x00000001401C2E30, auth_3d_material_list* ml = (auth_3d_material_list*)begin->curve.keys; auth_3d_rgba__free(&ml->blend_color); auth_3d_rgba__free(&ml->emission); - delete ml; + _operator_delete(ml); } else { if (((kft3**)&begin->curve.keys_vec)[0]) { @@ -1290,13 +1288,17 @@ HOOK(bool, FASTCALL, auth_3d_curve_parse, 0x00000001401DA230, } void auth_3d_patch() { + // Move both auth_3d_curve's value and type WRITE_MEMORY_STRING(0x00000001401A3DBE, "\x48\x8B" "\x43\x60\x48\x83\xC3\x70\x48\x83\xC7\x70\x48\x89\x47\xF8\x48\x8D" "\x43\xF8\x48\x3B\xC6\x75\x8B\x48\x8B\x5C\x24\x30\x48\x8B\xC7\x48" "\x8B\x74\x24\x38\x48\x83\xC4\x20\x5F\xC3", 0x2C); + // Null both auth_3d_curve's value and type WRITE_MEMORY_STRING(0x00000001401A72FF, "\x4C\x89\x40\x38", 0x04); + // Move both auth_3d_curve's value and type WRITE_MEMORY_STRING(0x00000001401B316A, "\x48\x8B\x43\x68\x48\x89" "\x47\x68\x48\x8B\xC7\x48\x8B\x5C\x24\x48\x48\x83\xC4\x30\x5F\xC3", 0x16); + // Null both auth_3d's shadow and chara_item WRITE_MEMORY_STRING(0x00000001401D7A78, "\x44\x89\xBF\x98\x00\x00\x00", 0x07); INSTALL_HOOK(auth_3d_curve_array_free); diff --git a/src/DivaGL/camera.cpp b/src/DivaGL/camera.cpp index 6212de2..8547ff2 100644 --- a/src/DivaGL/camera.cpp +++ b/src/DivaGL/camera.cpp @@ -62,8 +62,8 @@ HOOK(void, FASTCALL, camera_data_update_projection, 0x00000001401F8E90) { render_get()->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->proj_left_offset, camera_data->proj_right_offset, + camera_data->proj_bottom_offset, camera_data->proj_top_offset); 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 f7c8dce..39cc5c6 100644 --- a/src/DivaGL/camera.hpp +++ b/src/DivaGL/camera.hpp @@ -19,7 +19,10 @@ struct camera_struct { double_t aspect; float_t min_distance; float_t max_distance; - vec4 projection_scale; + float_t proj_left_offset; + float_t proj_right_offset; + float_t proj_bottom_offset; + float_t proj_top_offset; bool use_up; char field_49; char field_4A; diff --git a/src/DivaGL/canonical_properties.cpp b/src/DivaGL/canonical_properties.cpp index 06eec0c..4ed339e 100644 --- a/src/DivaGL/canonical_properties.cpp +++ b/src/DivaGL/canonical_properties.cpp @@ -14,8 +14,8 @@ CanonicalProperties::~CanonicalProperties() { } void CanonicalProperties::Clear() { - key_value_pair_storage.clear(); - key_value_pair_storage.shrink_to_fit(); + key_value_pair_storage.first.clear(); + key_value_pair_storage.first.shrink_to_fit(); data.clear(); data.shrink_to_fit(); } diff --git a/src/DivaGL/canonical_properties.hpp b/src/DivaGL/canonical_properties.hpp index 3b5a258..3b9dd77 100644 --- a/src/DivaGL/canonical_properties.hpp +++ b/src/DivaGL/canonical_properties.hpp @@ -10,7 +10,7 @@ struct CanonicalProperties { prj::string data; - prj::vector_pair_alloc key_value_pair_storage; + prj::pair, bool> key_value_pair_storage; CanonicalProperties(); ~CanonicalProperties(); @@ -31,4 +31,4 @@ struct CanonicalProperties { } }; -static_assert(sizeof(CanonicalProperties) == 0x38, "\"CanonicalProperties\" struct should have a size of 0x38"); +static_assert(sizeof(CanonicalProperties) == 0x40, "\"CanonicalProperties\" struct should have a size of 0x40"); diff --git a/src/DivaGL/common.asm b/src/DivaGL/common.asm index 35fc7b9..1ee1183 100644 --- a/src/DivaGL/common.asm +++ b/src/DivaGL/common.asm @@ -28,27 +28,31 @@ popaq MACRO pop rax ENDM -EXTERN ?pv_game_load_state_4_tail_impl@@YAX_K@Z : PROC +EXTERN ?pv_game_load_state_4_tail_impl@@YA_NXZ : PROC EXTERN ?originalpv_game_load_state_4_tail@@3P6AXXZEA : QWORD EXTERN ?pv_game_load_state_6_head_impl@@YA_NXZ : PROC EXTERN ?originalpv_game_load_state_6_head@@3P6AXXZEA : QWORD -EXTERN ?pv_game_load_state_9_mid_impl@@YA_NXZ : PROC -EXTERN ?originalpv_game_load_state_9_mid@@3P6AXXZEA : QWORD +EXTERN ?pv_game_load_state_10_head_impl@@YA_NXZ : PROC +EXTERN ?originalpv_game_load_state_10_head@@3P6AXXZEA : QWORD -EXTERN ?pv_game_load_state_13_tail_impl@@YAX_K@Z : PROC -EXTERN ?originalpv_game_load_state_13_tail@@3P6AXXZEA : QWORD +EXTERN ?pv_game_load_state_13_head_impl@@YA_NXZ : PROC +EXTERN ?originalpv_game_load_state_13_head@@3P6AXXZEA : QWORD .DATA -pv_game_load_state_6_head_jump_false QWORD 00000001401043ECh +pv_game_load_jump_end QWORD 00000001401043ECh .CODE ?implOfpv_game_load_state_4_tail@@YAXXZ PROC PUBLIC pushaq mov rcx, r14 - call ?pv_game_load_state_4_tail_impl@@YAX_K@Z + call ?pv_game_load_state_4_tail_impl@@YA_NXZ + test al, al popaq + jz end_func + jmp pv_game_load_jump_end +end_func: jmp ?originalpv_game_load_state_4_tail@@3P6AXXZEA ?implOfpv_game_load_state_4_tail@@YAXXZ ENDP @@ -59,25 +63,31 @@ pv_game_load_state_6_head_jump_false QWORD 00000001401043ECh test al, al popaq jz end_func - jmp pv_game_load_state_6_head_jump_false + jmp pv_game_load_jump_end end_func: jmp ?originalpv_game_load_state_6_head@@3P6AXXZEA ?implOfpv_game_load_state_6_head@@YAXXZ ENDP -?implOfpv_game_load_state_9_mid@@YAXXZ PROC PUBLIC +?implOfpv_game_load_state_10_head@@YAXXZ PROC PUBLIC pushaq - call ?pv_game_load_state_9_mid_impl@@YA_NXZ + call ?pv_game_load_state_10_head_impl@@YA_NXZ test al, al popaq - cmovne ebx,r15d - jmp ?originalpv_game_load_state_9_mid@@3P6AXXZEA -?implOfpv_game_load_state_9_mid@@YAXXZ ENDP + jz end_func + jmp pv_game_load_jump_end +end_func: + jmp ?originalpv_game_load_state_10_head@@3P6AXXZEA +?implOfpv_game_load_state_10_head@@YAXXZ ENDP -?implOfpv_game_load_state_13_tail@@YAXXZ PROC PUBLIC +?implOfpv_game_load_state_13_head@@YAXXZ PROC PUBLIC pushaq mov rcx, r14 - call ?pv_game_load_state_13_tail_impl@@YAX_K@Z + call ?pv_game_load_state_13_head_impl@@YA_NXZ + test al, al popaq - jmp ?originalpv_game_load_state_13_tail@@3P6AXXZEA -?implOfpv_game_load_state_13_tail@@YAXXZ ENDP + jz end_func + jmp pv_game_load_jump_end +end_func: + jmp ?originalpv_game_load_state_13_head@@3P6AXXZEA +?implOfpv_game_load_state_13_head@@YAXXZ ENDP END \ No newline at end of file diff --git a/src/DivaGL/item_table.hpp b/src/DivaGL/item_table.hpp index 14f9c34..47a53e3 100644 --- a/src/DivaGL/item_table.hpp +++ b/src/DivaGL/item_table.hpp @@ -6,6 +6,8 @@ #pragma once #include "../KKdLib/default.hpp" +#include "../KKdLib/image.hpp" +#include "object.hpp" #include "types.hpp" enum item_id { diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index c4ff36a..dbf6566 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -3204,7 +3204,7 @@ namespace mdl { texture_color_offset = value; } - void DispManager::set_texture_pattern(int32_t count, texture_pattern_struct* value) { + void DispManager::set_texture_pattern(int32_t count, const texture_pattern_struct* value) { if (count > TEXTURE_PATTERN_COUNT) return; @@ -3226,7 +3226,7 @@ namespace mdl { texture_specular_offset = value; } - void DispManager::set_texture_transform(int32_t count, texture_transform_struct* value) { + void DispManager::set_texture_transform(int32_t count, const texture_transform_struct* value) { if (count > TEXTURE_TRANSFORM_COUNT) return; diff --git a/src/DivaGL/mdl/disp_manager.hpp b/src/DivaGL/mdl/disp_manager.hpp index a6aa757..61166c9 100644 --- a/src/DivaGL/mdl/disp_manager.hpp +++ b/src/DivaGL/mdl/disp_manager.hpp @@ -508,10 +508,10 @@ namespace mdl { void set_shadow_type(shadow_type_enum type = SHADOW_CHARA); void set_texture_color_coefficients(vec4& value); void set_texture_color_offset(vec4& value); - void set_texture_pattern(int32_t count = 0, texture_pattern_struct* value = 0); + void set_texture_pattern(int32_t count = 0, const texture_pattern_struct* value = 0); void set_texture_specular_coefficients(vec4& value); void set_texture_specular_offset(vec4& value); - void set_texture_transform(int32_t count = 0, texture_transform_struct* value = 0); + void set_texture_transform(int32_t count = 0, const texture_transform_struct* value = 0); void set_wet_param(float_t value = 0.0f); }; diff --git a/src/DivaGL/pv_game/pv_game.cpp b/src/DivaGL/pv_game/pv_game.cpp index 17bfb63..c24af45 100644 --- a/src/DivaGL/pv_game/pv_game.cpp +++ b/src/DivaGL/pv_game/pv_game.cpp @@ -640,16 +640,14 @@ pv_disp2d& pv_disp2d_data = *(pv_disp2d*)0x0000000140C938E0; size_t pv_game_ptr = 0x0000000140CDD8D0; pv_game_parent& pv_game_parent_data = *(pv_game_parent*)0x0000000140D0B510; -void pv_game_load_state_4_tail_impl(size_t pv_game) { +bool pv_game_load_state_4_tail_impl() { if (task_pv_game_x->use) { bool wait_load = false; - wait_load |= task_pv_game_x->data.effect.state < 12; wait_load |= task_pv_game_x->stage_data.state < 11; if (wait_load) - return; + return true; } - - *(uint32_t*)(pv_game + 0x08) = 5; + return false; } bool pv_game_load_state_6_head_impl() { @@ -661,26 +659,25 @@ bool pv_game_load_state_6_head_impl() { return false; } -bool pv_game_load_state_9_mid_impl() { +bool pv_game_load_state_10_head_impl() { return task_pv_game_x->use ? task_pv_game_x->data.effect.state < 11 : false; } -void pv_game_load_state_13_tail_impl(size_t pv_game) { +bool pv_game_load_state_13_head_impl() { if (task_pv_game_x->use) { bool wait_load = false; wait_load |= task_pv_game_x->data.effect.state < 12; wait_load |= task_pv_game_x->stage_data.state < 11; if (wait_load) - return; + return true; } - - *(uint32_t*)(pv_game + 0x08) = 14; + return false; } HOOK(void, FASTCALL, pv_game_load_state_4_tail, 0x00000001400FF55B); HOOK(void, FASTCALL, pv_game_load_state_6_head, 0x000000001400FF5ED); -HOOK(void, FASTCALL, pv_game_load_state_9_mid, 0x000000014010280D); -HOOK(void, FASTCALL, pv_game_load_state_13_tail, 0x000000014010386E); +HOOK(void, FASTCALL, pv_game_load_state_10_head, 0x000000014010290D); +HOOK(void, FASTCALL, pv_game_load_state_13_head, 0x000000014010356E); HOOK(int64_t, FASTCALL, pv_game_pv_data__ctrl, 0x00000001401230E0, size_t _this, float_t delta_time, int64_t curr_time, bool a4) { @@ -830,8 +827,8 @@ HOOK(bool, FASTCALL, pv_game_pv_data__load, 0x000000014011B7E0, size_t _this, void pv_game_patch() { INSTALL_HOOK(pv_game_load_state_4_tail); INSTALL_HOOK(pv_game_load_state_6_head); - INSTALL_HOOK(pv_game_load_state_9_mid); - INSTALL_HOOK(pv_game_load_state_13_tail); + INSTALL_HOOK(pv_game_load_state_10_head); + INSTALL_HOOK(pv_game_load_state_13_head); INSTALL_HOOK(pv_game_pv_data__ctrl); INSTALL_HOOK(task_pv_game_del_task); INSTALL_HOOK(task_pv_game_add_task); @@ -3191,8 +3188,8 @@ void x_pv_game_stage::ctrl(float_t delta_time) { state = 12; } case 12: { - //if (env.state && env.state != 20) - // break; + if (env.state && env.state != 20) + break; bool wait_load = false; for (int32_t i = 0; i < X_PV_GAME_STAGE_EFFECT_COUNT; i++) { diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index 02eed31..97ace41 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -285,12 +285,12 @@ 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 left_offset, float_t right_offset, float_t bottom_offset, float_t top_offset) { 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; - float_t top = tan_fov + tan_fov * top_scale; + float_t left = -tan_fov * aspect + tan_fov * aspect * left_offset; + float_t right = tan_fov * aspect + tan_fov * aspect * right_offset; + float_t bottom = -tan_fov + tan_fov * bottom_offset; + float_t top = tan_fov + tan_fov * top_offset; if (taa) { float_t offset = taa_texture_selector == 1 ? -0.25f : 0.25f; @@ -1140,8 +1140,8 @@ namespace rndr { } void Render::apply_mlaa(int32_t destination, int32_t source, int32_t mlaa) { + gl_state_begin_event("PostProcess::mlaa"); if (mlaa) { - gl_state_begin_event("PostProcess::mlaa"); mlaa_buffer.Bind(); gl_state_active_bind_texture_2d(0, taa_tex[source]->glid); gl_state_bind_sampler(0, rctx->render_samplers[1]); @@ -1177,7 +1177,6 @@ namespace rndr { uniform->arr[U_ALPHA_MASK] = 0; gl_state_active_bind_texture_2d(0, 0); gl_state_active_bind_texture_2d(1, 0); - gl_state_end_event(); } else { taa_buffer[destination].Bind(); @@ -1189,6 +1188,7 @@ namespace rndr { render_post_width_scale, render_post_height_scale, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f); } + gl_state_end_event(); } void Render::apply_tone_map(texture* light_proj_tex, int32_t npr_param) { diff --git a/src/DivaGL/render.hpp b/src/DivaGL/render.hpp index 459ae39..36ee646 100644 --- a/src/DivaGL/render.hpp +++ b/src/DivaGL/render.hpp @@ -177,7 +177,7 @@ namespace rndr { void bind_render_texture(bool aet_back = false); void calc_exposure_chara_data(); void 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 left_offset, float_t right_offset, float_t bottom_offset, float_t top_offset); void ctrl(); void draw_quad(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); diff --git a/src/DivaGL/rob/rob.cpp b/src/DivaGL/rob/rob.cpp index 43077d9..6781da7 100644 --- a/src/DivaGL/rob/rob.cpp +++ b/src/DivaGL/rob/rob.cpp @@ -467,7 +467,6 @@ HOOK(void, FASTCALL, RobCloth__UpdateVertexBuffer, 0x000000014021CF00, obj_mesh* buffer.UnmapMemory(); } - HOOK(void, FASTCALL, sub_1405044B0, 0x00000001405044B0, rob_chara* rob_chr) { rob_chara_item_adjust_x& item_adjust = rob_chara_item_adjust_x_array[rob_chr->chara_id]; rob_chara_arm_adjust_x& arm_adjust = rob_chara_arm_adjust_x_array[rob_chr->chara_id]; diff --git a/src/DivaGL/sprite.hpp b/src/DivaGL/sprite.hpp index fafd8a3..b11efaf 100644 --- a/src/DivaGL/sprite.hpp +++ b/src/DivaGL/sprite.hpp @@ -286,7 +286,7 @@ extern size_t(FASTCALL* sprite_manager_get_reqlist_count)(int32_t index); extern void (FASTCALL* sprite_manager_read_file)(int32_t set_id, const prj::string mdata_dir); extern bool (FASTCALL* sprite_manager_load_file)(int32_t set_id); -extern const spr_db_spr* sprite_database_get_spr_by_id(int32_t id); +extern const spr_db_spr* sprite_database_get_spr_by_id(int32_t id); extern int32_t sprite_database_get_spr_set_id_by_name(const prj::string& name); extern void sprite_manager_init();