From 47a66f3fb2a84f9fb2532892981feceda0649f99 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 5 Jan 2024 19:11:34 +0300 Subject: [PATCH] Beginning Medley DoF fix --- src/CRE/pv_param.cpp | 30 +++++++++++++---- src/CRE/pv_param.hpp | 5 +++ src/ReDIVA/x_pv_game.cpp | 72 ++++++++++++++++++++++++++++++++++++++-- src/ReDIVA/x_pv_game.hpp | 12 +++++-- 4 files changed, 108 insertions(+), 11 deletions(-) diff --git a/src/CRE/pv_param.cpp b/src/CRE/pv_param.cpp index caea4103..b870a9fc 100644 --- a/src/CRE/pv_param.cpp +++ b/src/CRE/pv_param.cpp @@ -763,6 +763,9 @@ namespace pv_param_task { Data(); } data; + post_process_task_set_dof_callback callback; + void* callback_data; + PostProcessCtrlDof(); ~PostProcessCtrlDof(); @@ -816,6 +819,19 @@ namespace pv_param_task { dof.frame = 0.0f; dof.duration = duration; dof.data.data = data; + dof.callback = 0; + dof.callback_data = 0; + } + + extern void post_process_task_set_dof_data( + pv_param::dof& data, float_t duration, + post_process_task_set_dof_callback callback, void* callback_data) { + PostProcessCtrlDof& dof = post_process_task.dof; + dof.frame = 0.0f; + dof.duration = duration; + dof.data.data = data; + dof.callback = callback; + dof.callback_data = callback_data; } void post_process_task_set_chara_alpha( @@ -1081,7 +1097,7 @@ namespace pv_param_task { } - PostProcessCtrlDof::PostProcessCtrlDof() { + PostProcessCtrlDof::PostProcessCtrlDof() : callback(), callback_data() { } @@ -1134,12 +1150,12 @@ namespace pv_param_task { return; vec3 trans = 0.0f; - rob_chara* rob_chr = rob_chara_array_get(data.data.chara_id); - if (rob_chr) { - motion_blend_mot* mot = rob_chr->bone_data->motion_loaded.front(); - ::bone_data* bone_data = mot->bone_data.bones.data(); - - mat4_get_translation(bone_data[MOTION_BONE_CL_KAO].node->mat, &trans); + if (callback) + trans = callback(callback_data, data.data.chara_id); + else { + rob_chara* rob_chr = rob_chara_array_get(data.data.chara_id); + if (rob_chr) + mat4_get_translation(rob_chr->get_bone_data_mat(MOTION_BONE_CL_KAO), &trans); } camera* cam = rctx_ptr->camera; diff --git a/src/CRE/pv_param.hpp b/src/CRE/pv_param.hpp index 25165ab1..a4f7f74b 100644 --- a/src/CRE/pv_param.hpp +++ b/src/CRE/pv_param.hpp @@ -75,6 +75,8 @@ namespace pv_param { namespace pv_param_task { typedef void (*post_process_task_set_chara_item_alpha_callback) (void* data, int32_t chara_id, int32_t type, float_t alpha); + typedef vec3(*post_process_task_set_dof_callback) + (void* data, int32_t chara_id); extern bool post_process_task_add_task(); extern void post_process_task_set_bloom_data( @@ -83,6 +85,9 @@ namespace pv_param_task { pv_param::color_correction& data, float_t duration); extern void post_process_task_set_dof_data( pv_param::dof& data, float_t duration); + extern void post_process_task_set_dof_data( + pv_param::dof& data, float_t duration, + post_process_task_set_dof_callback callback, void* callback_data); extern void post_process_task_set_chara_alpha( int32_t chara_id, int32_t type, float_t alpha, float_t duration); extern void post_process_task_set_chara_item_alpha( diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 609df9a6..626a7e3d 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -246,6 +246,7 @@ extern render_context* rctx_ptr; static vec4 bright_scale_get(int32_t index, float_t value); static float_t dsc_time_to_frame(int64_t time); +static vec3 x_pv_game_dof_callback(void* data, int32_t chara_id); static void x_pv_game_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha); static void x_pv_game_change_field(x_pv_game* xpvgm, int32_t field, int64_t dsc_time, int64_t curr_time); #if BAKE_PV826 @@ -1262,7 +1263,8 @@ void x_pv_game_effect::unload() { state = 0; } -x_pv_game_chara_effect_auth_3d::x_pv_game_chara_effect_auth_3d() : field_0(), src_chara(), dst_chara() { +x_pv_game_chara_effect_auth_3d::x_pv_game_chara_effect_auth_3d() + : field_0(), src_chara(), dst_chara(), objhrc_index(), node_mat() { id = {}; time = -1; reset(); @@ -1281,6 +1283,9 @@ void x_pv_game_chara_effect_auth_3d::reset() { object_set.clear(); id = {}; time = -1; + node_name.clear(); + objhrc_index = -1; + node_mat = 0; } x_pv_game_chara_effect::x_pv_game_chara_effect() : state(), change_fields(), frame_rate_control() { @@ -1368,6 +1373,50 @@ void x_pv_game_chara_effect::ctrl(object_database* obj_db, texture_database* tex } } +vec3 x_pv_game_chara_effect::get_node_translation(int32_t chara_id, + int32_t chara_effect, int32_t objhrc_index, const char* node_name) { + if (chara_id < 0 || chara_id >= ROB_CHARA_COUNT) + return 0.0f; + + rob_chara* rob_chr = rob_chara_array_get(chara_id); + if (!rob_chr) + return 0.0f; + + std::vector& chr_eff_auth = this->auth_3d[rob_chr->chara_id]; + if (chara_effect < 0 || chara_effect >= chr_eff_auth.size()) + return 0.0f; + + x_pv_game_chara_effect_auth_3d& chr_eff = chr_eff_auth[chara_effect]; + if (chr_eff.id.is_null()) + return 0.0f; + + ::auth_3d* auth = chr_eff.id.get_auth_3d(); + if (!auth || objhrc_index < 0 || objhrc_index >= auth->object_hrc.size()) + return 0.0f; + + if (!chr_eff.node_mat || chr_eff.objhrc_index != objhrc_index + || chr_eff.node_name.compare(node_name)) { + mat4* mat = 0; + uint32_t node_name_hash = hash_utf8_murmurhash(node_name); + for (auth_3d_object_node& i : auth->object_hrc[objhrc_index].node) + if (hash_string_murmurhash(i.name) == node_name_hash) { + mat = i.mat; + break; + } + + if (!mat) + return 0.0f; + + chr_eff.node_mat = mat; + chr_eff.node_name.assign(node_name); + chr_eff.objhrc_index = objhrc_index; + } + + vec3 trans; + mat4_get_translation(chr_eff.node_mat, &trans); + return trans; +} + #if BAKE_PV826 void x_pv_game_chara_effect::load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control, chara_index charas[6], @@ -3632,7 +3681,8 @@ bool x_pv_game_pv_data::set_pv_param_post_process_dof_data(bool set, int32_t id, pv_param::dof& dof = pv_param::post_process_data_get_dof_data(id); if (set) - pv_param_task::post_process_task_set_dof_data(dof, duration); + pv_param_task::post_process_task_set_dof_data(dof, duration, + x_pv_game_dof_callback, this->pv_game); return true; } @@ -7895,6 +7945,24 @@ static float_t dsc_time_to_frame(int64_t time) { return prj::roundf((float_t)time / 1000000000.0f * 60.0f); } +static vec3 x_pv_game_dof_callback(void* data, int32_t chara_id) { + x_pv_game_data& pv_data = ((x_pv_game*)data)->get_data(); + if (chara_id >= pv_data.play_param->chara.size()) + return pv_data.chara_effect.get_node_translation(0, + (int32_t)(chara_id - pv_data.play_param->chara.size()), 0, "j_kao_wj"); + + if (chara_id < 0 && chara_id >= ROB_CHARA_COUNT) + return 0.0f; + + rob_chara* rob_chr = rob_chara_array_get(chara_id); + if (!rob_chr) + return 0.0f; + + vec3 trans; + mat4_get_translation(rob_chr->get_bone_data_mat(MOTION_BONE_CL_KAO), &trans); + return trans; +} + static void x_pv_game_item_alpha_callback(void* data, int32_t chara_id, int32_t type, float_t alpha) { if (!data) return; diff --git a/src/ReDIVA/x_pv_game.hpp b/src/ReDIVA/x_pv_game.hpp index 50eafde6..0a7cd1f3 100644 --- a/src/ReDIVA/x_pv_game.hpp +++ b/src/ReDIVA/x_pv_game.hpp @@ -324,6 +324,9 @@ struct x_pv_game_chara_effect_auth_3d { string_hash object_set; auth_3d_id id; int64_t time; + std::string node_name; + int32_t objhrc_index; + mat4* node_mat; x_pv_game_chara_effect_auth_3d(); ~x_pv_game_chara_effect_auth_3d(); @@ -344,10 +347,15 @@ struct x_pv_game_chara_effect { #if BAKE_PV826 void ctrl(object_database* obj_db, texture_database* tex_db, int32_t pv_id = -1, std::map* effchrpv_auth_3d_mot_ids = 0); - void load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control, chara_index charas[6], - std::unordered_map* effchrpv_auth_3d_mot_names = 0); #else void ctrl(object_database* obj_db, texture_database* tex_db); +#endif + vec3 get_node_translation(int32_t chara_id, int32_t chara_effect, int32_t objhrc_index, const char* node_name); +#if BAKE_PV826 + void load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control, chara_index charas[6], + std::unordered_map* effchrpv_auth_3d_mot_names = 0); + +#else void load(int32_t pv_id, pvpp* play_param, FrameRateControl* frame_rate_control, chara_index charas[6]); #endif void load_data();