Added more funcs to PrintWork

This commit is contained in:
korenkonder
2024-06-02 16:05:38 +03:00
parent b4fb7c1bf6
commit a2b94b680c
6 changed files with 895 additions and 32 deletions
+229 -1
View File
@@ -120,6 +120,17 @@ 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::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 spr::SpriteManager::RenderData* sprite_manager_render_data;
@@ -134,10 +145,220 @@ static const GLenum spr_blend_param[6][4] = {
};
namespace spr {
void(FASTCALL* put_rgb_cross)(mat4* mat) = (void(FASTCALL*)(mat4 * mat))0x00000001404BC8F0;
void(FASTCALL* put_cross)(const mat4* mat, color4u8 color_x, color4u8 color_y, color4u8 color_z)
= (void(FASTCALL*)(const mat4 * mat, color4u8 color_x, color4u8 color_y, color4u8 color_z))0x00000001404BC920;
void(FASTCALL* put_rgb_cross)(const mat4* mat) = (void(FASTCALL*)(const mat4 * mat))0x00000001404BC8F0;
spr::SprArgs* (FASTCALL* put_sprite)(const spr::SprArgs* args)
= (spr::SprArgs * (FASTCALL*)(const spr::SprArgs * args))0x0000000140640740;
SprArgs::SprArgs() : kind(), attr(), blend(), index(), layer(),
prio(), resolution_mode_screen(), resolution_mode_sprite(), texture(),
shader(), vertex_array(), num_vertex(), flags(), field_CC(), next() {
Reset();
}
void SprArgs::Reset() {
kind = SPR_KIND_NORMAL;
id = {};
color = 0xFFFFFFFF;
attr = (SprAttr)0;
blend = 0;
index = -1;
layer = 0;
prio = SPR_PRIO_DEFAULT;
resolution_mode_screen = RESOLUTION_MODE_HD;
resolution_mode_sprite = RESOLUTION_MODE_HD;
center = 0.0f;
trans = 0.0f;
scale = 1.0f;
rot = 0.0f;
skew_angle = 0.0f;
mat = mat4_identity;
texture = 0;
shader = SHADER_FT_FFP;
#if BREAK_SPRITE_VERTEX_LIMIT
vertex_array = -1;
#else
vertex_array = 0;
#endif
num_vertex = 0;
flags = (SprArgs::Flags)0;
sprite_size = 0.0f;
field_CC = 0;
texture_pos = 0.0f;
texture_size = 1.0f;
next = 0;
}
void SprArgs::SetSpriteSize(vec2 size) {
if (flags & SPRITE_SIZE)
return;
enum_or(flags, SPRITE_SIZE);
sprite_size = size;
field_CC = 0;
}
void SprArgs::SetTexturePosSize(float_t x, float_t y, float_t width, float_t height) {
if (flags & TEXTURE_POS_SIZE)
return;
enum_or(flags, TEXTURE_POS_SIZE);
texture_pos.x = x;
texture_pos.y = y;
texture_size.x = width;
texture_size.y = height;
}
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 SprArgs::SetNext(SprArgs* args, SprArgs* next) {
while (args->next)
args = args->next;
args->next = next;
next->kind = SPR_KIND_LINE;
}
vec2 proj_sprite_3d_line(vec3 vec, bool offset) {
mat4 view;
mat4_transpose(&camera_data->view, &view);
mat4_transform_point(&view, &vec, &vec);
if (fabsf(vec.z) < 1.0e-10f)
return 0.0f;
vec2 sc_vec = camera_data->depth * *(vec2*)&vec.x * (1.0f / vec.z);
resolution_struct* res_wind_int = res_window_internal_get();
sc_vec.x = (float_t)res_wind_int->width * 0.5f - sc_vec.x;
sc_vec.y = (float_t)res_wind_int->height * 0.5f + sc_vec.y;
if (offset) {
resolution_struct* res_wind = res_window_get();
sc_vec.x = (float_t)res_wind_int->x_offset + sc_vec.x;
sc_vec.y = (float_t)(res_wind->height
- res_wind_int->y_offset - res_wind_int->height) + sc_vec.y;
}
return sc_vec;
}
void put_sprite_3d_line(vec3 p1, vec3 p2, color4u8 color) {
vec2 sc_p1 = proj_sprite_3d_line(p1, true);
vec2 sc_p2 = proj_sprite_3d_line(p2, true);
spr::put_sprite_line(sc_p1, sc_p2, RESOLUTION_MODE_MAX, SPR_PRIO_DEBUG, color, 0);
}
void put_sprite_line(vec2 p1, vec2 p2, resolution_mode mode, spr::SprPrio prio, color4u8 color, int32_t layer) {
spr::SprArgs args;
args.trans.x = p1.x;
args.trans.y = p1.y;
args.trans.z = 0.0f;
args.layer = layer;
args.kind = SPR_KIND_LINES;
args.resolution_mode_screen = mode;
args.resolution_mode_sprite = mode;
args.prio = prio;
args.color = color;
args.SetSpriteSize({ p2.x - p1.x, p2.y - p1.y });
enum_or(args.attr, SPR_ATTR_MATRIX);
spr::put_sprite(&args);
}
void put_sprite_line_list(vec2* points, size_t count, resolution_mode mode,
spr::SprPrio prio, color4u8 color, int32_t layer) {
spr::SprArgs args;
args.kind = SPR_KIND_ARROW_AB;
args.layer = layer;
args.resolution_mode_screen = mode;
args.resolution_mode_sprite = mode;
args.prio = prio;
args.color = color;
std::vector<spr::SpriteVertex> vertex_array;
vertex_array.reserve(count);
for (size_t i = 0; i < count; i++, points++) {
spr::SpriteVertex vert = {};
*(vec2*)&vert.pos = *points;
vertex_array.push_back(vert);
}
args.SetVertexArray(vertex_array.data(), vertex_array.size());
spr::put_sprite(&args);
}
void put_sprite_multi(rectangle rect, resolution_mode mode, spr::SprPrio prio, color4u8 color, int32_t layer) {
spr::SprArgs args;
args.trans.x = rect.pos.x;
args.trans.y = rect.pos.y;
args.trans.z = 0.0f;
args.layer = layer;
args.kind = SPR_KIND_MULTI;
args.resolution_mode_screen = mode;
args.resolution_mode_sprite = mode;
args.prio = prio;
args.color = color;
args.SetSpriteSize(rect.size);
enum_or(args.attr, SPR_ATTR_MATRIX);
spr::put_sprite(&args);
}
void put_sprite_rect(rectangle rect, resolution_mode mode, spr::SprPrio prio, color4u8 color, int32_t layer) {
spr::SprArgs args;
args.trans.x = rect.pos.x;
args.trans.y = rect.pos.y;
args.trans.z = 0.0f;
args.layer = layer;
args.kind = SPR_KIND_RECT;
args.resolution_mode_screen = mode;
args.resolution_mode_sprite = mode;
args.prio = prio;
args.color = color;
args.SetSpriteSize(rect.size);
enum_or(args.attr, SPR_ATTR_MATRIX);
spr::put_sprite(&args);
}
void put_sprite_triangles(SpriteVertex* vert, size_t num, resolution_mode mode,
SprPrio prio, int32_t spr_id, int32_t layer) {
spr::SprArgs args;
args.layer = layer;
args.kind = SPR_KIND_TRIANGLE;
args.resolution_mode_screen = mode;
args.resolution_mode_sprite = mode;
args.prio = prio;
args.color = vert[0].color;
if (spr_id != -1)
args.id.info = sprite_database_get_spr_by_id(spr_id)->info;
enum_or(args.attr, SPR_ATTR_MATRIX);
args.SetVertexArray(vert, num);
spr::put_sprite(&args);
}
SpriteManager::RenderData::RenderData() {
glGenVertexArrays(1, &vao);
gl_state_bind_vertex_array(vao, true);
@@ -1195,6 +1416,13 @@ namespace spr {
}
}
const spr_db_spr* sprite_database_get_spr_by_id(int32_t id) {
const spr_db_spr* (FASTCALL* sprite_database_struct__get_spr_by_id)
(size_t _this, int32_t id)
= (const spr_db_spr * (FASTCALL*)(size_t _this, int32_t id))0x000000014063C800;
return sprite_database_struct__get_spr_by_id(0x000000014CC62290, id);
}
int32_t sprite_database_get_spr_set_id_by_name(const prj::string& name) {
int32_t(FASTCALL * sprite_database_struct__get_spr_set_id_by_name)
(size_t _this, const prj::string & name)