diff --git a/src/DivaGL/mdl/disp_manager.cpp b/src/DivaGL/mdl/disp_manager.cpp index 96b4f35..4c77460 100644 --- a/src/DivaGL/mdl/disp_manager.cpp +++ b/src/DivaGL/mdl/disp_manager.cpp @@ -7,6 +7,8 @@ #include "../gl_state.hpp" #include "../render_manager.hpp" #include "../shader_glsl_ft.hpp" +#include "../sprite.hpp" +#include "../stage.hpp" #include "../uniform.hpp" #include "../wrap.hpp" #include "draw_object.hpp" @@ -2394,6 +2396,31 @@ namespace mdl { static const mat4* rob_chara_item_equip_mat = 0; + HOOK(void, FASTCALL, sub_14031AF10, 0x000000014031AF10, obj_axis_aligned_bounding_box* aabb, color4u8_bgra color) { + mdl::EtcObj etc(mdl::ETC_OBJ_SPHERE); + etc.color = color; + etc.fog = false; + etc.data.cube.size = aabb->size * 2.0f; + + mat4 mat; + mat4_translate(&aabb->center, &mat); + disp_manager->entry_obj_etc(&mat, &etc); + } + + HOOK(void, FASTCALL, sub_14031AFE0, 0x000000014031AFE0, obj_bounding_sphere* bounding_sphere, color4u8_bgra color) { + mdl::EtcObj etc(mdl::ETC_OBJ_SPHERE); + etc.color = color; + etc.fog = false; + etc.data.sphere.radius = bounding_sphere->radius; + etc.data.sphere.slices = 0x20; + etc.data.sphere.stacks = 0x20; + etc.data.sphere.wire = false; + + mat4 mat; + mat4_translate(&bounding_sphere->center, &mat); + disp_manager->entry_obj_etc(&mat, &etc); + } + HOOK(void, FASTCALL, DispManager__entry_obj, 0x00000001404379E0, obj* obj_data, obj_mesh_vertex_buffer* obj_vert_buf, obj_mesh_index_buffer* obj_index_buf, prj::vector* textures, vec4* blend_color, mat4* bone_mat, obj* obj_morph, @@ -2403,6 +2430,10 @@ namespace mdl { abort(); } + HOOK(void, FASTCALL, DispManager__entry_obj_etc, 0x00000001404395C0, mdl::EtcObj* etc) { + disp_manager->entry_obj_etc(&mat4_identity, etc); + } + HOOK(void, FASTCALL, DispManager__entry_obj_by_obj, 0x0000000140439A20, obj* obj_data, prj::vector* textures, obj_mesh_vertex_buffer* obj_vert_buf, obj_mesh_index_buffer* obj_index_buf, mat4* bone_mat, float_t alpha) { if (!obj_data) @@ -2416,6 +2447,17 @@ namespace mdl { textures, blend_color_ptr, bone_mat, 0, 0, 0, 0, 0, 0, 0, !!bone_mat); } + HOOK(void, FASTCALL, sub_1404BCC60, 0x00000001404BCC60, vec3* pos, float_t width, float_t height) { + mdl::EtcObj etc(ETC_OBJ_PLANE); + etc.color = *spr_color; + etc.data.plane.w = (int)width; + etc.data.plane.h = (int)height; + + mat4 mat; + mat4_translate(pos, &mat); + 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) { @@ -2453,8 +2495,12 @@ namespace mdl { WRITE_NOP_6(0x0000000140512BE6); + INSTALL_HOOK(sub_14031AF10); + INSTALL_HOOK(sub_14031AFE0); INSTALL_HOOK(DispManager__entry_obj); + 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/sprite.cpp b/src/DivaGL/sprite.cpp index d1c3b0c..9a507d8 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -96,6 +96,8 @@ namespace spr { static void draw_sprite_scale(spr::SprArgs* args); } +vec4* spr_color = (vec4*)0x00000001411ACC30; + size_t(FASTCALL* sprite_manager_get_reqlist_count)(int32_t index) = (size_t(FASTCALL*)(int32_t index))0x000000014063FA90; @@ -1088,7 +1090,6 @@ namespace spr { } } - void sprite_manager_init() { if (!sprite_manager_render_data) sprite_manager_render_data = new spr::SpriteManager::RenderData; diff --git a/src/DivaGL/sprite.hpp b/src/DivaGL/sprite.hpp index 6ca135e..666e110 100644 --- a/src/DivaGL/sprite.hpp +++ b/src/DivaGL/sprite.hpp @@ -190,6 +190,8 @@ namespace spr { extern void(FASTCALL* put_rgb_cross)(mat4* mat); } +extern vec4* spr_color; + extern size_t(FASTCALL* sprite_manager_get_reqlist_count)(int32_t index); extern void sprite_manager_init(); diff --git a/src/DivaGL/stage.cpp b/src/DivaGL/stage.cpp index a38f185..afcc900 100644 --- a/src/DivaGL/stage.cpp +++ b/src/DivaGL/stage.cpp @@ -83,6 +83,7 @@ struct stage { static_assert(sizeof(stage) == 0x68, "\"stage\" struct should have a size of 0x68"); +extern size_t(FASTCALL* stage_data_handler_get_stage_data_count)() = (size_t(FASTCALL*)())0x000000014064AFC0; static bool object_bounding_sphere_check_visibility_shadow(obj_bounding_sphere* sphere, mat4* mat); static bool object_bounding_sphere_check_visibility_shadow_chara(obj_bounding_sphere* sphere); diff --git a/src/DivaGL/stage.hpp b/src/DivaGL/stage.hpp index 25f44aa..93b3530 100644 --- a/src/DivaGL/stage.hpp +++ b/src/DivaGL/stage.hpp @@ -7,4 +7,6 @@ #include "../KKdLib/default.hpp" +extern size_t(FASTCALL*stage_data_handler_get_stage_data_count)(); + extern void stage_patch();