From 84723d0e641d4f2f442ffb7d75ce1efdd931f33b Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 28 Jun 2024 12:17:24 +0300 Subject: [PATCH] `Sprite`: Rely on `Sprite Draw Limit` patch from `korenkonder/AFTMods` --- src/DivaGL/hook.hpp | 2 -- src/DivaGL/sprite.cpp | 84 +++++++++++++++++++++---------------------- src/DivaGL/sprite.hpp | 13 +++---- src/DivaGL/types.hpp | 4 +-- 4 files changed, 49 insertions(+), 54 deletions(-) diff --git a/src/DivaGL/hook.hpp b/src/DivaGL/hook.hpp index a0e81fd..3a04ae1 100644 --- a/src/DivaGL/hook.hpp +++ b/src/DivaGL/hook.hpp @@ -5,6 +5,4 @@ #pragma once -#include "gl_state.hpp" - extern void hook_funcs(); diff --git a/src/DivaGL/sprite.cpp b/src/DivaGL/sprite.cpp index 58b5354..e6454e1 100644 --- a/src/DivaGL/sprite.cpp +++ b/src/DivaGL/sprite.cpp @@ -93,6 +93,11 @@ namespace spr { void Draw(int32_t index, bool font, texture* tex); }; + struct SpriteVertexData { + size_t max_count; + spr::SpriteVertex* array; + }; + static_assert(sizeof(spr::SpriteManager) == 0x10C8, "\"spr::SpriteManager\" struct should have a size of 0x10C8"); static void calc_sprite_vertex(spr::SprArgs* args, vec3* vtx, mat4* mat, bool font); @@ -120,19 +125,16 @@ bool (FASTCALL* sprite_manager_load_file)(int32_t set_id) spr::SpriteManager* sprite_manager = (spr::SpriteManager*)0x000000014CC611C0; -#if BREAK_SPRITE_VERTEX_LIMIT -size_t sprite_vertex_array_max_count = 0x2000; +spr::SpriteVertexData& sprite_vertex_data = *(spr::SpriteVertexData*)0x000000014CC62480; -spr::SpriteVertex* sprite_vertex_array; -#else const size_t sprite_vertex_array_max_count = 0x2000; - spr::SpriteVertex* sprite_vertex_array = (spr::SpriteVertex*)0x000000014CC62480; -#endif + size_t& sprite_vertex_array_count = *(size_t*)0x000000014CC611B0; static mat4 view_projection_aet; +static bool break_sprite_vertex_limit = false; static spr::SpriteManager::RenderData* sprite_manager_render_data; static const GLenum spr_blend_param[6][4] = { @@ -157,6 +159,13 @@ namespace spr { Reset(); } + SpriteVertex* SprArgs::GetVertexArray() { + if (break_sprite_vertex_limit) + return sprite_vertex_data.array + vertex_array; + else + return vertex_array_ptr; + } + void SprArgs::Reset() { kind = SPR_KIND_NORMAL; id = {}; @@ -176,11 +185,10 @@ namespace spr { mat = mat4_identity; texture = 0; shader = SHADER_FT_FFP; -#if BREAK_SPRITE_VERTEX_LIMIT - vertex_array = -1; -#else - vertex_array = 0; -#endif + if (break_sprite_vertex_limit) + vertex_array = -1; + else + vertex_array = 0; num_vertex = 0; flags = (SprArgs::Flags)0; sprite_size = 0.0f; @@ -211,30 +219,11 @@ namespace spr { } void SprArgs::SetVertexArray(SpriteVertex* vertex_array, size_t num_vertex) { -#if BREAK_SPRITE_VERTEX_LIMIT - if (sprite_vertex_array_count + num_vertex >= sprite_vertex_array_max_count) { - while (sprite_vertex_array_count + num_vertex >= sprite_vertex_array_max_count) - sprite_vertex_array_max_count *= 2; - - spr::SpriteVertex* _sprite_vertex_array = new spr::SpriteVertex[sprite_vertex_array_max_count * 2]; - memmove(_sprite_vertex_array, sprite_vertex_array, sizeof(SpriteVertex) * sprite_vertex_array_count); - delete[] sprite_vertex_array; - sprite_vertex_array = _sprite_vertex_array; - } -#else - if (sprite_vertex_array_count + num_vertex >= sprite_vertex_array_max_count) - return; -#endif - - this->num_vertex = num_vertex; -#if BREAK_SPRITE_VERTEX_LIMIT - this->vertex_array = sprite_vertex_array_count; - memmove(sprite_vertex_array + this->vertex_array, vertex_array, sizeof(SpriteVertex) * num_vertex); -#else - this->vertex_array = &sprite_vertex_array[sprite_vertex_array_count]; - memmove(this->vertex_array, vertex_array, sizeof(SpriteVertex) * num_vertex); -#endif - sprite_vertex_array_count += num_vertex; + void (FASTCALL * spr__SprArgs__SetVertexArray)(spr::SprArgs * This, + spr::SpriteVertex * vertex_array, size_t num_vertex) + = (void (FASTCALL*)(spr::SprArgs * This, + spr::SpriteVertex * vertex_array, size_t num_vertex))0x000000014063F040; + spr__SprArgs__SetVertexArray(this, vertex_array, num_vertex); } void SprArgs::SetNext(SprArgs* args, SprArgs* next) { @@ -799,7 +788,7 @@ namespace spr { param->texcoord.uv[3].v = (height - (uv11.y + texture_pos.y)) * v_scale; } else if (font) { - SpriteVertex* vtx = args->vertex_array; + SpriteVertex* vtx = args->GetVertexArray(); for (size_t i = args->num_vertex; i; i--, vtx++) { vtx->uv.x = vtx->uv.x * u_scale; vtx->uv.y = (height - vtx->uv.y) * v_scale; @@ -1050,7 +1039,7 @@ namespace spr { size_t vertex_buffer_size = vertex_buffer.size(); vertex_buffer.reserve(args.num_vertex / 2 * 2); - SpriteVertex* vtx = args.vertex_array; + SpriteVertex* vtx = args.GetVertexArray(); for (size_t i = args.num_vertex / 2; i; i--, vtx += 2) { if (vtx[0].pos == 0.0f && vtx[1].pos == 0.0f) continue; @@ -1099,7 +1088,7 @@ namespace spr { sprite_draw_vertex spr_vtx = {}; spr_vtx.color = color; - SpriteVertex* vtx = args.vertex_array; + SpriteVertex* vtx = args.GetVertexArray(); for (size_t i = args.num_vertex; i; i--, vtx++) { spr_vtx.pos = vtx->pos; vertex_buffer.push_back(spr_vtx); @@ -1120,7 +1109,7 @@ namespace spr { sprite_draw_vertex spr_vtx = {}; spr_vtx.color = color; - SpriteVertex* vtx = args.vertex_array; + SpriteVertex* vtx = args.GetVertexArray(); for (size_t i = args.num_vertex; i; i--, vtx++) { spr_vtx.pos = vtx->pos; vertex_buffer.push_back(spr_vtx); @@ -1148,7 +1137,7 @@ namespace spr { sprite_draw_vertex spr_vtx = {}; - SpriteVertex* vtx = args.vertex_array; + SpriteVertex* vtx = args.GetVertexArray(); for (size_t i = args.num_vertex; i; i--, vtx++) { spr_vtx.pos = vtx->pos; spr_vtx.uv[0] = vtx->uv; @@ -1173,7 +1162,7 @@ namespace spr { sprite_draw_vertex spr_vtx[4] = {}; - SpriteVertex* vtx = args.vertex_array; + SpriteVertex* vtx = args.GetVertexArray(); for (size_t i = num_vertex / 6, j = 0; i; i--, j += 4, vtx += 4) { if (vtx[0].pos == 0.0f && vtx[1].pos == 0.0f && vtx[2].pos == 0.0f && vtx[3].pos == 0.0f) @@ -1392,7 +1381,7 @@ namespace spr { args->trans.y = (args->trans.y - src_res_y) * scale_y + src_res_y; args->trans.z = args->trans.z * scale_y; - SpriteVertex* vtx = args->vertex_array; + SpriteVertex* vtx = args->GetVertexArray(); for (size_t i = args->num_vertex; i; i--, vtx++) { vtx->pos.x = (vtx->pos.x - src_res_x) * scale_x + dst_res_x; vtx->pos.y = (vtx->pos.y - src_res_y) * scale_y + dst_res_y; @@ -1424,6 +1413,17 @@ int32_t sprite_database_get_spr_set_id_by_name(const prj::string& name) { } void sprite_manager_init() { + const uint8_t orig_spr__SprArgs__SetVertexArray[] = { + 0x40, 0x53, 0x48, 0x83, 0xEC, 0x20, 0x48, 0x8B, + 0x05, 0x63, 0x21, 0x62, 0x0C, 0x4C, 0x8B, 0xC9, + }; + + if (memcmp((void*)0x000000014063F040, (void*)orig_spr__SprArgs__SetVertexArray, + sizeof(orig_spr__SprArgs__SetVertexArray))) + break_sprite_vertex_limit = true; + else + break_sprite_vertex_limit = false; + 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 cdb2cb8..fafd8a3 100644 --- a/src/DivaGL/sprite.hpp +++ b/src/DivaGL/sprite.hpp @@ -9,14 +9,11 @@ #include "../KKdLib/mat.hpp" #include "../KKdLib/rectangle.hpp" #include "../KKdLib/vec.hpp" -#include "gl_state.hpp" #include "render_context.hpp" #include "resolution_mode.hpp" #include "texture.hpp" #include "types.hpp" -#define BREAK_SPRITE_VERTEX_LIMIT (0) - struct spr_info { uint16_t index; uint16_t set_index; @@ -241,11 +238,10 @@ namespace spr { mat4 mat; texture* texture; int32_t shader; -#if BREAK_SPRITE_VERTEX_LIMIT - size_t vertex_array; -#else - SpriteVertex* vertex_array; -#endif + union { + size_t vertex_array; + SpriteVertex* vertex_array_ptr; + }; size_t num_vertex; Flags flags; vec2 sprite_size; @@ -256,6 +252,7 @@ namespace spr { SprArgs(); + SpriteVertex* GetVertexArray(); void Reset(); void SetSpriteSize(vec2 size); void SetTexturePosSize(float_t x, float_t y, float_t width, float_t height); diff --git a/src/DivaGL/types.hpp b/src/DivaGL/types.hpp index fd00fdd..93af153 100644 --- a/src/DivaGL/types.hpp +++ b/src/DivaGL/types.hpp @@ -5,6 +5,8 @@ Original: Allocator.h, Types.h by blueskythlikesclouds from DivaModLoader */ +#pragma once + #include "../KKdLib/default.hpp" #include "../KKdLib/prj/vector_pair.hpp" #include "../KKdLib/prj/vector_pair_combine.hpp" @@ -15,8 +17,6 @@ #include #include -#pragma once - namespace prj { typedef enum HeapCMallocType { HeapCMallocSystem = 0x00,