From 61015bb37a04b1960e96c5382884b360984fa246 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sat, 13 Apr 2024 18:12:16 +0300 Subject: [PATCH] Forgot several hooks --- src/DivaGL/hook.cpp | 42 +++++++++++-- src/DivaGL/light_param.cpp | 10 ++++ src/DivaGL/render_manager.cpp | 1 + src/DivaGL/rob/rob.cpp | 110 ++++++++++++++++++++++++++++++++++ src/DivaGL/wrap.cpp | 4 +- 5 files changed, 159 insertions(+), 8 deletions(-) diff --git a/src/DivaGL/hook.cpp b/src/DivaGL/hook.cpp index cdf5799..7167915 100644 --- a/src/DivaGL/hook.cpp +++ b/src/DivaGL/hook.cpp @@ -182,6 +182,32 @@ HOOK(void, FASTCALL, env_set_offset_color, 0x00000001405E5630, float_t r, float_ rctx->obj_batch.g_offset_color = { r, g, b, a }; } +HOOK(void, FASTCALL, set_render_defaults, 0x00000001401948B0) { + glClearDepthDLL(1.0); + glClearStencilDLL(0); + //glShadeModelDLL(GL_SMOOTH); + glPolygonModeDLL(GL_FRONT_AND_BACK, GL_FILL); + glDisableDLL(GL_MULTISAMPLE); + glDisableDLL(GL_DITHER); + glEnableDLL(GL_DEPTH_TEST); + glDepthFuncDLL(GL_LEQUAL); + glEnableDLL(GL_CULL_FACE); + glFrontFaceDLL(GL_CCW); + glCullFaceDLL(GL_BACK); + //glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_ZERO); + //glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FIXED_ONLY_ARB); + //glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FIXED_ONLY_ARB); + glPixelStoreiDLL(GL_UNPACK_ALIGNMENT, 1); +} + +HOOK(GLenum, FASTCALL, gl_check_framebuffer_status, 0x0000000140503240) { + GLenum ret = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); + if (ret != GL_FRAMEBUFFER_COMPLETE) + return ret; + + return GL_FRAMEBUFFER_COMPLETE; +} + void hook_funcs() { WRITE_NOP_5(0x0000000140441290); WRITE_JUMP(0x00000001404412E2, 0x00000001404413BD); @@ -210,6 +236,10 @@ void hook_funcs() { INSTALL_HOOK(env_set_blend_color); INSTALL_HOOK(env_set_offset_color); + INSTALL_HOOK(set_render_defaults); + + INSTALL_HOOK(gl_check_framebuffer_status); + uint8_t buf[0x0C] = {}; buf[0x00] = 0x48; // mov rax, 0 buf[0x01] = 0xB8; @@ -235,15 +265,15 @@ void hook_funcs() { static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int32_t a5) { extern size_t glut_handle; - HDC& hDc = *(HDC*)(glut_handle + 0x55F20); + HDC& XHDC = *(HDC*)(glut_handle + 0x55F20); wrap_addresses(); if (true/*a5*/) { typedef HGLRC(GLAPIENTRY* PFNWGLCREATECONTEXTGLUTPROC)(HDC hDc); - HGLRC tmp_ctx = wglCreateContextGLUT(hDc);; - wglMakeCurrentGLUT(hDc, tmp_ctx); + HGLRC tmp_ctx = wglCreateContextGLUT(XHDC);; + wglMakeCurrentGLUT(XHDC, tmp_ctx); PFNWGLCREATECONTEXTATTRIBSARBPROC _wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddressGLUT("wglCreateContextAttribsARB"); @@ -257,15 +287,15 @@ static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, in WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, 0, }; - ctx = _wglCreateContextAttribsARB(hDc, 0, attrib_list);; + ctx = _wglCreateContextAttribsARB(XHDC, 0, attrib_list);; minor--; } - wglMakeCurrentGLUT(hDc, ctx); + wglMakeCurrentGLUT(XHDC, ctx); wglDeleteContextGLUT(tmp_ctx); return ctx; } else - return wglCreateContextGLUT(hDc); + return wglCreateContextGLUT(XHDC); } #ifdef DEBUG diff --git a/src/DivaGL/light_param.cpp b/src/DivaGL/light_param.cpp index 0a24803..fbfbaab 100644 --- a/src/DivaGL/light_param.cpp +++ b/src/DivaGL/light_param.cpp @@ -228,8 +228,18 @@ HOOK(void, FASTCALL, light_param_data__set_ibl, 0x00000001403E7210, light_param_data::set_ibl(ibl, storage); } +HOOK(void, FASTCALL, light_param_data_storage__gen_textures, 0x00000001403E8C50, light_param_data_storage* storage) { + glGenTextures(5, storage->textures); +} + +HOOK(void, FASTCALL, light_param_data_storage__delete_textures, 0x00000001403E8D80, light_param_data_storage* storage) { + glDeleteTextures(5, storage->textures); +} + void light_param_patch() { INSTALL_HOOK(light_param_data__set_ibl); + INSTALL_HOOK(light_param_data_storage__gen_textures); + INSTALL_HOOK(light_param_data_storage__delete_textures); } void light_param_data_storage_data_set_ibl() { diff --git a/src/DivaGL/render_manager.cpp b/src/DivaGL/render_manager.cpp index a47fd17..805f18c 100644 --- a/src/DivaGL/render_manager.cpp +++ b/src/DivaGL/render_manager.cpp @@ -1233,6 +1233,7 @@ void render_manager_patch() { WRITE_NOP_6(0x0000000140502A24); WRITE_MEMORY(0x0000000140502A3C, uint8_t, 0xC3); + INSTALL_HOOK(render_manager_free_data); INSTALL_HOOK(render_manager_init_render_textures); INSTALL_HOOK(render_manager_free_render_textures); INSTALL_HOOK(render_manager_init_data); diff --git a/src/DivaGL/rob/rob.cpp b/src/DivaGL/rob/rob.cpp index 21eaf5a..4a8cf59 100644 --- a/src/DivaGL/rob/rob.cpp +++ b/src/DivaGL/rob/rob.cpp @@ -36,6 +36,63 @@ enum rob_chara_data_hand_adjust_type : uint16_t { ROB_CHARA_DATA_HAND_ADJUST_ITEM = 0x0F, // X }; +struct opd_vec3_data { + const float_t* x; + const float_t* y; + const float_t* z; +}; + +static_assert(sizeof(opd_vec3_data) == 0x18, "\"opd_vec3_data\" struct should have a size of 0x18"); + +struct RobOsageNodeResetData { + vec3 trans; + vec3 trans_diff; + vec3 rotation; + float_t length; +}; + +static_assert(sizeof(RobOsageNodeResetData) == 0x28, "\"RobOsageNodeResetData\" struct should have a size of 0x28"); + +struct opd_node_data { + float_t length; + vec3 rotation; +}; + +static_assert(sizeof(opd_node_data) == 0x10, "\"opd_node_data\" struct should have a size of 0x10"); + +struct opd_node_data_pair { + opd_node_data curr; + opd_node_data prev; +}; + +static_assert(sizeof(opd_node_data_pair) == 0x20, "\"opd_node_data_pair\" struct should have a size of 0x20"); + +struct CLOTHNode { + uint32_t flags; + vec3 trans; + vec3 trans_orig; + vec3 field_1C; + vec3 trans_diff; + vec3 normal; + vec3 tangent; + vec3 binormal; + float_t tangent_sign; + vec2 texcoord; + vec3 field_64; + float_t dist_up; + float_t dist_down; + float_t dist_right; + float_t dist_left; + int64_t field_80; + int32_t field_88; + RobOsageNodeResetData reset_data; + int32_t field_B4; + prj::vector opd_data; + opd_node_data_pair opd_node_data; +}; + +static_assert(sizeof(CLOTHNode) == 0xF0, "\"CLOTHNode\" struct should have a size of 0xF0"); + struct rob_chara_age_age_object_vertex { vec3 position; vec3 normal; @@ -713,6 +770,58 @@ const mat4* rob_chara_get_item_adjust_data_mat(size_t rob_chr) { return &rob_chara_item_adjust_x_array[chara_id].mat; } +HOOK(void, FASTCALL, RobCloth__UpdateVertexBuffer, 0x000000014021CF00, obj_mesh* mesh, obj_mesh_vertex_buffer* vertex_buffer, + CLOTHNode* nodes, float_t facing, uint16_t* indices, bool double_sided) { + if (!mesh || !vertex_buffer || (mesh->vertex_format + & (OBJ_VERTEX_NORMAL | OBJ_VERTEX_POSITION)) != (OBJ_VERTEX_NORMAL | OBJ_VERTEX_POSITION)) + return; + + vertex_buffer->cycle_index(); + GLArrayBuffer buffer = vertex_buffer->get_buffer(); + size_t data = (size_t)buffer.MapMemory(); + if (!data) + return; + + int32_t indices_count = *indices++; + + if (double_sided) + indices_count /= 2; + + if (mesh->vertex_format & OBJ_VERTEX_TANGENT) + for (int32_t i = 2; i; i--, facing = -1.0f) { + for (int32_t j = indices_count; j; j--, indices++) { + CLOTHNode* node = &nodes[*indices]; + + *(vec3*)data = node->trans; + *(vec3*)(data + 0x0C) = node->normal * facing; + *(vec3*)(data + 0x18) = node->tangent; + *(float_t*)(data + 0x24) = node->tangent_sign; + + data += mesh->size_vertex; + } + + if (!double_sided) + break; + } + else + for (int32_t i = 2; i; i--, facing = -1.0f) { + for (int32_t j = indices_count; j; j--, indices++) { + CLOTHNode* node = &nodes[*indices]; + + *(vec3*)data = node->trans; + *(vec3*)(data + 0x0C) = node->normal * facing; + + data += mesh->size_vertex; + } + + if (!double_sided) + break; + } + + 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]; @@ -1076,6 +1185,7 @@ HOOK(void, FASTCALL, rob_chara_set_hand_adjust, 0x000000014053C070, rob_chara* r } void rob_patch() { + INSTALL_HOOK(RobCloth__UpdateVertexBuffer); INSTALL_HOOK(rob_chara_set_data_adjust_mat); INSTALL_HOOK(rob_chara_reset_data); INSTALL_HOOK(sub_1405044B0); diff --git a/src/DivaGL/wrap.cpp b/src/DivaGL/wrap.cpp index cd51ae5..97b2ccc 100644 --- a/src/DivaGL/wrap.cpp +++ b/src/DivaGL/wrap.cpp @@ -1675,12 +1675,12 @@ HOOK(void, FASTCALL, wglGetProcAddresses, 0x0000000140461B50) { void wrap_patch() { // glShadeModel(GL_SMOOTH); - WRITE_NOP_11(0x00000001401948CA); + //WRITE_NOP_11(0x00000001401948CA); // glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_ZERO); // glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FIXED_ONLY_ARB); // glClampColorARB(GL_CLAMP_READ_COLOR_ARB, GL_FIXED_ONLY_ARB); - WRITE_JUMP(0x0000000140194932, 0x000000014019495B); + //WRITE_JUMP(0x0000000140194932, 0x000000014019495B); INSTALL_HOOK(wglGetProcAddresses); }