diff --git a/src/DivaGL/auth_3d.cpp b/src/DivaGL/auth_3d.cpp index 53a9b3d..2caf2ac 100644 --- a/src/DivaGL/auth_3d.cpp +++ b/src/DivaGL/auth_3d.cpp @@ -446,8 +446,8 @@ struct auth_3d { object_info object_info; mat4* bone_mats; bool shadow; - int32_t src_chara; // chara_index - int32_t dst_chara; // chara_index + chara_index src_chara; + chara_index dst_chara; int32_t pos; int64_t field_A8; void* frame_rate; // FrameRateControl diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index 43f1fb1..f9176a7 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -4,6 +4,7 @@ */ #include "disp_manager.hpp" +#include "../rob/rob.hpp" #include "../gl_state.hpp" #include "../object.hpp" #include "../render_manager.hpp" @@ -2422,8 +2423,6 @@ namespace mdl { wet_param = value; } - static const mat4* rob_chara_item_equip_mat = 0; - HOOK(void, FASTCALL, DataTestObjectManager__Disp, 0x0000000140293E30, __int64 a1) { if (*(int32_t*)(a1 + 0x88) == 3 || *(int32_t*)(a1 + 0x74) < 0 || *(int32_t*)(a1 + 0x74) >= *(int32_t*)(a1 + 0x70)) @@ -2504,43 +2503,7 @@ namespace mdl { disp_manager->entry_obj_etc(&mat, &etc); } - HOOK(void, FASTCALL, DispManager__entry_obj_by_object_info_object_skin, 0x00000001405E8E20, - object_info obj_info, prj::vector* texture_pattern, - texture_data_struct* texture_data, float_t alpha, mat4* matrices, mat4* ex_data_matrices, mat4* mat) { - disp_manager->entry_obj_by_object_info_object_skin(obj_info, texture_pattern, texture_data, - alpha, matrices, ex_data_matrices, mat, rob_chara_item_equip_mat); - } - void disp_manager_patch() { - WRITE_NOP_6(0x0000000140542019); - WRITE_NOP_6(0x000000014054204F); - WRITE_NOP_6(0x000000014054208E); - - uint8_t buf[0x1B] = {}; - buf[0x00] = 0x48; - buf[0x01] = 0x8D; - buf[0x02] = 0x8F; - buf[0x03] = 0xFC; - buf[0x04] = 0x00; - buf[0x05] = 0x00; - buf[0x06] = 0x00; - buf[0x07] = 0x48; - buf[0x08] = 0xB8; - *(uint64_t*)&buf[0x09] = (uint64_t)&rob_chara_item_equip_mat; - buf[0x11] = 0x48; - buf[0x12] = 0x89; - buf[0x13] = 0x08; - buf[0x14] = 0x0F; - buf[0x15] = 0x1F; - buf[0x16] = 0x80; - buf[0x17] = 0x00; - buf[0x18] = 0x00; - buf[0x19] = 0x00; - buf[0x1A] = 0x00; - WRITE_MEMORY_STRING(0x0000000140512A82, buf, sizeof(buf)); - - WRITE_NOP_6(0x0000000140512BE6); - INSTALL_HOOK(DataTestObjectManager__Disp); INSTALL_HOOK(sub_14031AF10); INSTALL_HOOK(sub_14031AFE0); @@ -2548,7 +2511,6 @@ namespace mdl { INSTALL_HOOK(DispManager__entry_obj_etc); INSTALL_HOOK(DispManager__entry_obj_by_obj); INSTALL_HOOK(sub_1404BCC60); - INSTALL_HOOK(DispManager__entry_obj_by_object_info_object_skin); } } diff --git a/src/DivaGL/mdl/draw_object.hpp b/src/DivaGL/mdl/draw_object.hpp index d71fc1b..58a2bdc 100644 --- a/src/DivaGL/mdl/draw_object.hpp +++ b/src/DivaGL/mdl/draw_object.hpp @@ -17,7 +17,7 @@ namespace mdl { extern void draw_etc_obj(mdl::EtcObj* etc); extern void draw_sub_mesh(const ObjSubMeshArgs* args, const mat4* model, void(*func)(const ObjSubMeshArgs* args)); - extern void draw_sub_mesh_show_vector(const ObjSubMeshArgs* args, const mat4* model, int32_t show_vector); + //extern void draw_sub_mesh_show_vector(const ObjSubMeshArgs* args, const mat4* model, int32_t show_vector); extern void draw_sub_mesh_default(const ObjSubMeshArgs* args); extern void draw_sub_mesh_default_instanced(const ObjSubMeshArgs* args, const mat4* mat); extern void draw_sub_mesh_sss(const ObjSubMeshArgs* args); diff --git a/src/DivaGL/rob/rob.cpp b/src/DivaGL/rob/rob.cpp index 3b2633d..d0dac03 100644 --- a/src/DivaGL/rob/rob.cpp +++ b/src/DivaGL/rob/rob.cpp @@ -4,12 +4,22 @@ */ #include "rob.hpp" +#include "../../KKdLib/str_utils.hpp" #include "../mdl/disp_manager.hpp" #include "../gl_state.hpp" #include "../object.hpp" +#include "../render_manager.hpp" #include #include +enum ExNodeType { + EX_NONE = 0x00, + EX_OSAGE = 0x01, + EX_EXPRESSION = 0x02, + EX_CONSTRAINT = 0x03, + EX_CLOTH = 0x04, +}; + struct rob_chara_age_age_object_vertex { vec3 position; vec3 normal; @@ -17,8 +27,10 @@ struct rob_chara_age_age_object_vertex { vec2 texcoord; }; +static_assert(sizeof(rob_chara_age_age_object_vertex) == 0x30, "\"rob_chara_age_age_object_vertex\" struct should have a size of 0x30"); + struct rob_chara_age_age_object { - void* obj_set_handler; // obj_set_handler + void* objset_info; // ObjsetInfo int32_t obj_index; int32_t field_C; int32_t num_vertex; @@ -37,8 +49,217 @@ struct rob_chara_age_age_object { int32_t disp_count; int32_t count; bool field_C3C; + + void disp(size_t chara_index, + bool npr, bool reflect, const vec3& a5, bool chara_color); }; +static_assert(sizeof(rob_chara_age_age_object) == 0xC40, "\"rob_chara_age_age_object\" struct should have a size of 0xC40"); + +struct rob_chara_age_age_data { + int32_t index; + int32_t part_id; + vec3 trans; + float_t field_14; + float_t rot_z; + int32_t field_1C; + float_t rot_speed; + float_t gravity; + float_t scale; + float_t alpha; + mat4 mat_scale; + mat4 mat; + mat4 prev_parent_mat; + float_t remaining; + bool alive; +}; +static_assert(sizeof(rob_chara_age_age_data) == 0xF8, "\"rob_chara_age_age_data\" struct should have a size of 0xF8"); + +struct rob_chara_age_age { + rob_chara_age_age_data data[10]; + float_t frame; + float_t field_9B4; + mat4 mat; + float_t step; + bool visible; + bool skip; + float_t move_cancel; + float_t alpha; + rob_chara_age_age_object object; + bool npr; + float_t rot_speed; + bool step_full; + + void disp(size_t chara_id, + bool npr, bool reflect, const vec3& a5, bool chara_color); +}; + +static_assert(sizeof(rob_chara_age_age) == 0x1658, "\"rob_chara_age_age\" struct should have a size of 0x1658"); + +struct bone_node_expression_data { + vec3 position; + vec3 rotation; + vec3 scale; + vec3 parent_scale; +}; + +static_assert(sizeof(bone_node_expression_data) == 0x30, "\"bone_node_expression_data\" struct should have a size of 0x30"); + +struct bone_node { + const char* name; + mat4* mat; + bone_node* parent; + bone_node_expression_data exp_data; + mat4* ex_data_mat; +}; + +static_assert(sizeof(bone_node) == 0x50, "\"bone_node\" struct should have a size of 0x50"); + +struct opd_blend_data { + int32_t motion_id; + float_t frame; + float_t frame_count; + bool use_blend; + int32_t type; // MotionBlendType + float_t blend; +}; + +static_assert(sizeof(opd_blend_data) == 0x18, "\"opd_blend_data\" struct should have a size of 0x18"); + +struct ExNodeBlock; + +struct ExNodeBlock_vtbl { + ExNodeBlock* (FASTCALL* Dispose)(ExNodeBlock* node, uint8_t); + void(FASTCALL* Field8)(ExNodeBlock* node); + void(FASTCALL* Field10)(ExNodeBlock* node); + void(FASTCALL* Field18)(ExNodeBlock* node, int32_t stage, bool disable_external_force); + void(FASTCALL* Field20)(ExNodeBlock* node); + void(FASTCALL* SetOsagePlayData)(ExNodeBlock* node); + void(FASTCALL* Disp)(ExNodeBlock* node); + void(FASTCALL* Reset)(ExNodeBlock* node); + void(FASTCALL* Field40)(ExNodeBlock* node); + void(FASTCALL* Field48)(ExNodeBlock* node); + void(FASTCALL* Field50)(ExNodeBlock* node); + void(FASTCALL* Field58)(ExNodeBlock* node); +}; + +struct rob_chara_item_equip_object; + +struct ExNodeBlock { + ExNodeBlock_vtbl* __vftable; + bone_node* bone_node_ptr; + ExNodeType type; + const char* name; + bone_node* parent_bone_node; + prj::string parent_name; + ExNodeBlock* parent_node; + rob_chara_item_equip_object* item_equip_object; + bool field_58; + bool field_59; + bool has_children_node; +}; + +struct rob_chara_item_equip; + +struct rob_chara_item_equip_object { + size_t index; + mat4* mats; + object_info obj_info; + int32_t field_14; + prj::vector texture_pattern; + texture_data_struct texture_data; + bool null_blocks_data_set; + bone_node_expression_data exp_data; + float_t alpha; + mdl::ObjFlags obj_flags; + bool can_disp; + int32_t field_A4; + mat4* mat; + int32_t osage_iterations; + bone_node* bone_nodes; + prj::vector node_blocks; + prj::vector ex_data_bone_nodes; + prj::vector ex_data_bone_mats; + prj::vector ex_data_mats; + prj::vector> ex_bones; + int64_t field_138; + prj::vector null_blocks; // ExNullBlock + prj::vector osage_blocks; // ExOsageBlock + prj::vector constraint_blocks; // ExConstraintBlock + prj::vector expression_blocks; // ExExpressionBlock + prj::vector cloth_blocks; // ExClothBlock + bool field_1B8; + size_t osage_nodes_count; + bool use_opd; + obj_skin_ex_data* skin_ex_data; + obj_skin* skin; + rob_chara_item_equip* item_equip; + + void disp(const mat4* mat); + int32_t get_bone_index(const char* name); + bone_node* get_bone_node(int32_t bone_index); + bone_node* get_bone_node(const char* name); +}; + +static_assert(sizeof(rob_chara_item_equip_object) == 0x1E8, "\"rob_chara_item_equip_object\" struct should have a size of 0x1E8"); + +struct rob_chara_item_equip { + bone_node* bone_nodes; + mat4* matrices; + rob_chara_item_equip_object* item_equip_object; + int32_t field_18[31]; + bool item_equip_range; + item_id first_item_equip_object; + item_id max_item_equip_object; + int32_t field_A0; + shadow_type_enum shadow_type; + vec3 position; + prj::vector texture_pattern; + object_info field_D0; + item_id field_D4; + bool disable_update; + int32_t field_DC; + vec4 texture_color_coefficients; + float_t wet; + float_t wind_strength; + bool chara_color; + bool npr_flag; + mat4 mat; + mat4 field_13C[30]; + int32_t field_8BC; + int32_t field_8C0; + int32_t field_8C4; + int32_t field_8C8; + int32_t field_8CC; + int32_t field_8D0; + int32_t field_8D4; + int32_t field_8D8; + int32_t field_8DC; + int32_t field_8E0; + int32_t field_8E4; + int32_t field_8E8; + int32_t field_8EC; + int32_t field_8F0; + int32_t field_8F4; + int32_t field_8F8; + int32_t field_8FC; + int64_t field_900; + int64_t field_908; + int64_t field_910; + int64_t field_918; + int64_t field_920; + int64_t field_928; + int64_t field_930; + float_t osage_step; + bool use_opd; + prj::vector opd_blend_data; + bool parts_short; + bool parts_append; + bool parts_white_one_l; +}; + +static_assert(sizeof(rob_chara_item_equip) == 0x960, "\"rob_chara_item_equip\" struct should have a size of 0x960"); + mat4* (FASTCALL* rob_chara_bone_data_get_mats_mat)(size_t rob_bone_data, size_t index) = (mat4 * (FASTCALL*)(size_t rob_bone_data, size_t index))0x0000000140419520; void(FASTCALL* sub_1405163C0)(size_t rob_chr, int32_t index, mat4* mat) @@ -59,17 +280,196 @@ size_t(FASTCALL* rob_chara_array_get_bone_data)(size_t rob_chr_smth, int32_t cha bool (FASTCALL* rob_chara_pv_data_array_check_chara_id)(size_t rob_chr_smth, int32_t chara_id) = (bool (FASTCALL*)(size_t rob_chr_smth, int32_t chara_id))0x00000001405327B0; -HOOK(void, FASTCALL, rob_chara_age_age_object__disp, 0x0000000140541D50, - rob_chara_age_age_object* rob_age_age_obj, size_t chara_index, bool npr, bool reflect, vec3* a5, bool chara_color) { - int32_t disp_count = rob_age_age_obj->disp_count; - if (!rob_age_age_obj->obj_set_handler || !disp_count) +static rob_chara_age_age* rob_chara_age_age_array = (rob_chara_age_age*)0x00000001411E83C0; + +static bool& chara_reflect = *(bool*)0x00000001411ADAFC; +static bool& chara_refract = *(bool*)0x00000001411ADAFD; + +const mat4* rob_chara_item_equip_mat = 0; + +static void rob_chara_age_age_array_disp(int32_t chara_id, bool reflect, bool chara_color); + +void rob_chara_age_age::disp(size_t chara_id, + bool npr, bool reflect, const vec3& a5, bool chara_color) { + if (alpha >= 0.1f && this->visible) + object.disp(chara_id, npr || this->npr, reflect, a5, chara_color); +} + +void rob_chara_item_equip_object::disp(const mat4* mat) { + if (obj_info.is_null()) + return; + + mdl::ObjFlags flags = disp_manager->get_obj_flags(); + mdl::ObjFlags chara_flags = flags; + if (fabsf(alpha - 1.0f) > 0.000001f) + enum_or(chara_flags, obj_flags); + else + enum_and(chara_flags, ~(mdl::OBJ_ALPHA_ORDER_3 | mdl::OBJ_ALPHA_ORDER_2 | mdl::OBJ_ALPHA_ORDER_1)); + disp_manager->set_obj_flags(chara_flags); + if (can_disp) { + disp_manager->entry_obj_by_object_info_object_skin(obj_info, + &texture_pattern, &texture_data, alpha, mats, ex_data_bone_mats.data(), 0, mat); + + rob_chara_item_equip_mat = mat; + + for (ExNodeBlock*& i : node_blocks) + i->__vftable->Disp(i); + } + disp_manager->set_obj_flags(flags); +} + +int32_t rob_chara_item_equip_object::get_bone_index(const char* name) { + int32_t (FASTCALL * sub_1401F13B0)(int32_t a1, const char* a2) + = (int32_t (FASTCALL*)(int32_t a1, const char* a2))0x00000001401F13B0; + + int32_t bone_index = sub_1401F13B0(0, name); + if (bone_index == -1) + for (auto& i : ex_bones) + if (!str_utils_compare(name, i.first)) + return 0x8000 | i.second; + return bone_index; +} + +bone_node* rob_chara_item_equip_object::get_bone_node( + int32_t bone_index) { + if (!(bone_index & 0x8000)) + return &bone_nodes[bone_index & 0x7FFF]; + else if ((bone_index & 0x7FFF) < ex_data_bone_nodes.size()) + return &ex_data_bone_nodes[bone_index & 0x7FFF]; + return 0; +} + +bone_node* rob_chara_item_equip_object::get_bone_node(const char* name) { + return get_bone_node(get_bone_index(name)); +} + +static void sub_140512C20(rob_chara_item_equip* rob_itm_equip) { + if (rob_itm_equip->field_D0.is_null() || rob_itm_equip->field_D4 == -1) + return; + + mat4 mat = mat4_identity; + const char* name; + if (rob_itm_equip->field_DC == 1) { + name = "kl_te_r_wj"; + mat4_translate(0.0f, 0.0f, 0.082f, &mat); + mat4_mul_rotate_zyx(&mat, (float_t)(-90.9 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); + } + if (rob_itm_equip->field_DC == 2) { + name = "kl_te_l_wj"; + mat4_translate(0.0f, 0.0015f, -0.0812f, &mat); + mat4_mul_rotate_zyx(&mat, (float_t)(-34.5 * DEG_TO_RAD), 0.0f, (float_t)(-179.5 * DEG_TO_RAD), &mat); + } + else + name = "j_1_hyoutan_000wj"; + + bone_node* node = rob_itm_equip->item_equip_object[rob_itm_equip->field_D4].get_bone_node(name); + if (!node || !node->mat) + return; + + mat4_transpose(&mat, &mat); + mat4_mul(node->mat, &mat, &mat); + int32_t tex_pat_count = (int32_t)rob_itm_equip->texture_pattern.size(); + if (tex_pat_count) + disp_manager->set_texture_pattern(tex_pat_count, rob_itm_equip->texture_pattern.data()); + disp_manager->entry_obj_by_object_info(&mat, rob_itm_equip->field_D0); + if (tex_pat_count) + disp_manager->set_texture_pattern(); +} + +static float_t sub_140512F60(rob_chara_item_equip* rob_itm_equip) { + mat4* mats = rob_itm_equip->matrices; + float_t y = 1.0f; + y = min_def(y, mats[ 0].row1.w); + y = min_def(y, mats[175].row1.w); + y = min_def(y, mats[181].row1.w); + y = min_def(y, mats[105].row1.w); + y = min_def(y, mats[140].row1.w); + return y; +} + +HOOK(void, FASTCALL, rob_chara_item_equip_disp, 0x0000000140512950, + rob_chara_item_equip* rob_item_equip, int32_t chara_id) { + + mdl::ObjFlags flags = (mdl::ObjFlags)0; + if (chara_reflect) + enum_or(flags, mdl::OBJ_CHARA_REFLECT); + if (chara_refract) + enum_or(flags, mdl::OBJ_REFRACT); + + mdl::DispManager& disp_manager = *::disp_manager; + if (rob_item_equip->shadow_type != -1) { + if (rob_item_equip->field_A0 & 0x04) { + vec3 pos = rob_item_equip->position; + pos.y -= 0.2f; + shadow_ptr_get()->field_1D0[rob_item_equip->shadow_type].push_back(pos); + + float_t v9; + if (sub_140512F60(rob_item_equip) <= -0.2f) + v9 = -0.5f; + else + v9 = 0.05f; + shadow_ptr_get()->field_1C0[rob_item_equip->shadow_type] = v9; + disp_manager.set_shadow_type(rob_item_equip->shadow_type); + enum_or(flags, mdl::OBJ_SHADOW); + } + + if (rob_item_equip->field_A0 & 0x01) + enum_or(flags, mdl::OBJ_4); + } + disp_manager.set_obj_flags(flags); + disp_manager.set_chara_color(rob_item_equip->chara_color); + + vec4 temp_texture_color_coeff; + disp_manager.get_texture_color_coeff(temp_texture_color_coeff); + + disp_manager.set_texture_color_coefficients(rob_item_equip->texture_color_coefficients); + disp_manager.set_wet_param(rob_item_equip->wet); + render_manager->field_31C |= rob_item_equip->npr_flag; + sub_140512C20(rob_item_equip); + rob_chara_age_age_array_disp(chara_id, chara_reflect, rob_item_equip->chara_color); + + if (rob_item_equip->item_equip_range) + for (int32_t i = rob_item_equip->first_item_equip_object; i < rob_item_equip->max_item_equip_object; i++) + rob_item_equip->item_equip_object[i].disp(&rob_item_equip->mat); + else { + for (int32_t i = ITEM_ATAMA; i < ITEM_MAX; i++) { + mdl::ObjFlags chara_flags = (mdl::ObjFlags)0; + if (!rob_item_equip->field_18[i]) { + if (chara_reflect) + enum_or(chara_flags, mdl::OBJ_CHARA_REFLECT); + if (chara_refract) + enum_or(chara_flags, mdl::OBJ_REFRACT); + } + + mdl::ObjFlags flags = (mdl::ObjFlags)(mdl::OBJ_4 | mdl::OBJ_SHADOW); + if (i == ITEM_HARA) + flags = (mdl::ObjFlags)0; + + if (!(rob_item_equip->field_A0 & 0x04)) + enum_and(flags, ~mdl::OBJ_SHADOW); + + disp_manager.set_obj_flags((mdl::ObjFlags)(chara_flags | flags | mdl::OBJ_SSS)); + rob_item_equip->item_equip_object[i].disp(&rob_item_equip->mat); + } + } + disp_manager.set_texture_color_coefficients(temp_texture_color_coeff); + disp_manager.set_wet_param(); + disp_manager.set_chara_color(); + disp_manager.set_obj_flags(); + disp_manager.set_shadow_type(); +} + +void rob_chara_age_age_object::disp(size_t chara_index, + bool npr, bool reflect, const vec3& a5, bool chara_color) { + int32_t disp_count = this->disp_count; + if (!objset_info || !disp_count) return; disp_count = min_def(disp_count, 10); std::pair v44[10]; for (int32_t i = 0; i < disp_count; i++) { - v44[i].first = vec3::dot(rob_age_age_obj->trans[i], *a5); + v44[i].first = vec3::dot(trans[i], a5); v44[i].second = i; } @@ -79,23 +479,23 @@ HOOK(void, FASTCALL, rob_chara_age_age_object__disp, 0x0000000140541D50, return a.first < b.first; }); - rob_age_age_obj->obj_vert_buf.cycle_index(); + obj_vert_buf.cycle_index(); - GLArrayBuffer buffer = rob_age_age_obj->obj_vert_buf.get_buffer(); + GLArrayBuffer buffer = obj_vert_buf.get_buffer(); size_t vtx_data = (size_t)buffer.MapMemory(); if (!vtx_data) return; - size_t vertex_array_size = rob_age_age_obj->vertex_array_size; + size_t vertex_array_size = this->vertex_array_size; for (int32_t i = 0; i < disp_count; i++) memmove((void*)(vtx_data + vertex_array_size * i), - (void*)((size_t)rob_age_age_obj->vertex_data + vertex_array_size * v44[i].second), vertex_array_size); + (void*)((size_t)vertex_data + vertex_array_size * v44[i].second), vertex_array_size); buffer.UnmapMemory(); - rob_age_age_obj->mesh.num_vertex = disp_count * rob_age_age_obj->num_vertex; - rob_age_age_obj->sub_mesh.num_index = disp_count * rob_age_age_obj->num_index; - rob_age_age_obj->sub_mesh.material_index = npr ? 1 : 0; + mesh.num_vertex = disp_count * num_vertex; + sub_mesh.num_index = disp_count * num_index; + sub_mesh.material_index = npr ? 1 : 0; mdl::ObjFlags flags = (mdl::ObjFlags)(mdl::OBJ_SSS | mdl::OBJ_4 | mdl::OBJ_SHADOW); if (reflect) @@ -106,12 +506,27 @@ HOOK(void, FASTCALL, rob_chara_age_age_object__disp, 0x0000000140541D50, static prj::vector*(FASTCALL * rob_chara_age_age_object__get_obj_set_texture)(rob_chara_age_age_object * rob_age_age_obj) = (prj::vector*(FASTCALL*)(rob_chara_age_age_object* rob_age_age_obj))0x000000014045A8E0; - disp_manager->entry_obj_by_obj(&mat4_identity, &rob_age_age_obj->obj, - rob_chara_age_age_object__get_obj_set_texture(rob_age_age_obj), - &rob_age_age_obj->obj_vert_buf, &rob_age_age_obj->obj_index_buf, 0, 1.0f); + disp_manager->entry_obj_by_obj(&mat4_identity, &obj, + rob_chara_age_age_object__get_obj_set_texture(this), + &obj_vert_buf, &obj_index_buf, 0, 1.0f); } - void rob_patch() { - INSTALL_HOOK(rob_chara_age_age_object__disp); + INSTALL_HOOK(rob_chara_item_equip_disp); +} + +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; + 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); + arr[chara_id * 3 + 2].disp(chara_id, npr, reflect, v11, chara_color); +} + +static void rob_chara_age_age_array_disp(int32_t chara_id, bool reflect, bool chara_color) { + mdl::ObjFlags obj_flags = disp_manager->get_obj_flags(); + rob_chara_age_age_disp(rob_chara_age_age_array, chara_id, reflect, chara_color); + disp_manager->set_obj_flags(obj_flags); } diff --git a/src/DivaGL/rob/rob.hpp b/src/DivaGL/rob/rob.hpp index c578837..f1d1d69 100644 --- a/src/DivaGL/rob/rob.hpp +++ b/src/DivaGL/rob/rob.hpp @@ -9,6 +9,87 @@ #include "../../KKdLib/mat.hpp" #include "../../KKdLib/vec.hpp" +enum chara_index { + CHARA_NONE = -1, + CHARA_MIKU = 0x00, + CHARA_RIN = 0x01, + CHARA_LEN = 0x02, + CHARA_LUKA = 0x03, + CHARA_NERU = 0x04, + CHARA_HAKU = 0x05, + CHARA_KAITO = 0x06, + CHARA_MEIKO = 0x07, + CHARA_SAKINE = 0x08, + CHARA_TETO = 0x09, + CHARA_MAX = 0x0A, +}; + +enum item_id { + ITEM_NONE = -1, + ITEM_BODY = 0x00, + ITEM_ATAMA = 0x01, + ITEM_KATA_R = 0x02, + ITEM_MUNE = 0x03, + ITEM_KATA_L = 0x04, + ITEM_UDE_R = 0x05, + ITEM_SENAKA = 0x06, + ITEM_UDE_L = 0x07, + ITEM_HARA = 0x08, + ITEM_KOSI = 0x09, + ITEM_TE_R = 0x0A, + ITEM_TE_L = 0x0B, + ITEM_MOMO = 0x0C, + ITEM_SUNE = 0x0D, + ITEM_ASI = 0x0E, + ITEM_KAMI = 0x0F, + ITEM_OUTER = 0x10, + ITEM_PANTS = 0x11, + ITEM_ZUJO = 0x12, + ITEM_MEGANE = 0x13, + ITEM_KUBI = 0x14, + ITEM_JOHA_USHIRO = 0x15, + ITEM_KUCHI = 0x16, + ITEM_ITEM09 = 0x17, + ITEM_ITEM10 = 0x18, + ITEM_ITEM11 = 0x19, + ITEM_ITEM12 = 0x1A, + ITEM_ITEM13 = 0x1B, + ITEM_ITEM14 = 0x1C, + ITEM_ITEM15 = 0x1D, + ITEM_ITEM16 = 0x1E, + ITEM_MAX = 0x1F, +}; + +enum item_sub_id { + ITEM_SUB_NONE = -1, + ITEM_SUB_ZUJO = 0x00, + ITEM_SUB_KAMI = 0x01, + ITEM_SUB_HITAI = 0x02, + ITEM_SUB_ME = 0x03, + ITEM_SUB_MEGANE = 0x04, + ITEM_SUB_MIMI = 0x05, + ITEM_SUB_KUCHI = 0x06, + ITEM_SUB_MAKI = 0x07, + ITEM_SUB_KUBI = 0x08, + ITEM_SUB_INNER = 0x09, + ITEM_SUB_OUTER = 0x0A, + ITEM_SUB_KATA = 0x0B, + ITEM_SUB_U_UDE = 0x0C, + ITEM_SUB_L_UDE = 0x0D, + ITEM_SUB_TE = 0x0E, + ITEM_SUB_JOHA_MAE = 0x0F, + ITEM_SUB_JOHA_USHIRO = 0x10, + ITEM_SUB_BELT = 0x11, + ITEM_SUB_KOSI = 0x12, + ITEM_SUB_PANTS = 0x13, + ITEM_SUB_ASI = 0x14, + ITEM_SUB_SUNE = 0x15, + ITEM_SUB_KUTSU = 0x16, + ITEM_SUB_HADA = 0x17, + ITEM_SUB_HEAD = 0x18, + ITEM_SUB_MAX = 0x19, +}; + #define ROB_CHARA_COUNT 6 extern mat4* (FASTCALL* rob_chara_bone_data_get_mats_mat)(size_t rob_bone_data, size_t index); @@ -22,4 +103,6 @@ extern size_t(FASTCALL* rob_chara_array_get)(size_t rob_chr_smth, int32_t chara_ extern size_t(FASTCALL* rob_chara_array_get_bone_data)(size_t rob_chr_smth, int32_t chara_id); extern bool (FASTCALL* rob_chara_pv_data_array_check_chara_id)(size_t rob_chr_smth, int32_t chara_id); +extern const mat4* rob_chara_item_equip_mat; + extern void rob_patch();