diff --git a/src/CRE/auth_2d.cpp b/src/CRE/auth_2d.cpp index aa6276cb..c0a14351 100644 --- a/src/CRE/auth_2d.cpp +++ b/src/CRE/auth_2d.cpp @@ -21,9 +21,9 @@ public: float_t start_time; float_t end_time; AetFlags flags; - spr::SprTarget starget; - spr::SprLayer slayer; - spr::SprPrio prio; + spr::SPR_TARGET starget; + spr::SPR_LAYER slayer; + spr::SPR_PRIO prio; SCREEN_MODE src_mode; vec3 trans; vec3 rotate; @@ -48,7 +48,7 @@ public: bool sound_voice; bool use_float; - const sprite_database* spr_db; + const SprDb* spr_db; AetObj(); virtual ~AetObj(); @@ -71,7 +71,7 @@ public: virtual void SetEndTime(float_t value); virtual void SetFrame(float_t value); virtual void SetFrameRateControl(FrameRateControl* value); - virtual void SetPrio(spr::SprPrio value); + virtual void SetPrio(spr::SPR_PRIO value); virtual aet_info GetInfo(); virtual bool GetPlay(); virtual bool GetVisible(); @@ -79,16 +79,16 @@ public: virtual bool GetEnd(); virtual void CtrlComp(const aet_comp* comp, float_t frame); virtual void DispComp(const mat4& mat, const aet_comp* comp, - float_t frame, float_t opacity, const sprite_database* spr_db); + float_t frame, float_t opacity, const SprDb* spr_db); virtual void CtrlLayer(const aet_layer* layer, float_t frame); virtual void DispLayer(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db); + float_t frame, float_t opacity, const SprDb* spr_db); virtual void DispVideo(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db); + float_t frame, float_t opacity, const SprDb* spr_db); virtual void DispSprite(const mat4& mat, const aet_layer* layer, - float_t opacity, const sprite_database* spr_db); + float_t opacity, const SprDb* spr_db); virtual void DispSpriteSource(const mat4& mat, const aet_layer* layer, - uint32_t source_index, float_t opacity, const sprite_database* spr_db); + uint32_t source_index, float_t opacity, const SprDb* spr_db); virtual void CalcMat(mat4& mat, const aet_layer* layer, float_t frame); }; @@ -101,7 +101,7 @@ public: virtual void CtrlLayer(const aet_layer* layer, float_t frame) override; virtual void DispLayer(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db) override; + float_t frame, float_t opacity, const SprDb* spr_db) override; }; class AetMgr : public app::Task { @@ -157,7 +157,7 @@ public: void SetObjFrameRateControl(uint32_t id, FrameRateControl* value); void SetObjPlay(uint32_t id, bool value); void SetObjPosition(uint32_t id, const vec3& value); - void SetObjPrio(uint32_t id, spr::SprPrio value); + void SetObjPrio(uint32_t id, spr::SPR_PRIO value); void SetObjRotation(uint32_t id, const vec3& value); void SetObjScale(uint32_t id, const vec3& value); void SetObjSpriteDiscard(uint32_t id, std::map& value); @@ -225,19 +225,19 @@ aet_layout_data::aet_layout_data() : width(), height() { mode = SCREEN_MODE_HD; } -void aet_layout_data::put_sprite(int32_t spr_id, spr::SprAttr attr, spr::SprPrio prio, - const vec2* pos, const aet_layout_data* layout, const sprite_database* spr_db) { +void aet_layout_data::put_sprite(int32_t spr_id, spr::SPR_ATTR attr, spr::SPR_PRIO prio, + const vec2* pos, const aet_layout_data* layout, const SprDb* spr_db) { if (!layout) return; spr::SprArgs args; aet_layout_data::set_args(layout, &args); - args.id.id = spr_id; + args.id = spr_id; args.attr = attr; args.prio = prio; if (pos) *(vec2*)&args.trans.x += *pos; - spr::put_sprite(args, spr_db); + spr::put(args, spr_db); } void aet_layout_data::set_args(const aet_layout_data* layout, spr::SprArgs* args) { @@ -275,8 +275,8 @@ const aet_layout_data* AetComp::Find(const char* name) { } void AetComp::put_number_sprite(int32_t value, int32_t max_digits, - AetComp* comp, const char** names, const int32_t* spr_ids, spr::SprPrio prio, - const vec2* pos, bool all_digits, const sprite_database* spr_db) { + AetComp* comp, const char** names, const int32_t* spr_ids, spr::SPR_PRIO prio, + const vec2* pos, bool all_digits, const SprDb* spr_db) { if (!comp || !names || !spr_ids) return; @@ -287,7 +287,7 @@ void AetComp::put_number_sprite(int32_t value, int32_t max_digits, const aet_layout_data* layout = comp->Find(names[i]); if (layout) aet_layout_data::put_sprite(spr_ids[digit], - spr::SPR_ATTR_CTR_CC, prio, pos, layout, spr_db); + spr::M_SPR_ATTR_CTR_CC, prio, pos, layout, spr_db); if (!all_digits && !value) break; @@ -665,7 +665,7 @@ void aet_manager_init_aet_layout(AetComp* comp, AetArgs args, const aet_database void aet_manager_init_aet_layout(AetComp* comp, uint32_t aet_id, const char* layer_name, AetFlags flags, SCREEN_MODE mode, const char* start_marker, float_t start_time, - const aet_database* aet_db, const sprite_database* spr_db) { + const aet_database* aet_db, const SprDb* spr_db) { AetArgs args; args.id.info = aet_db->get_aet_by_id(aet_id)->info; args.layer_name = layer_name; @@ -683,8 +683,8 @@ uint32_t aet_manager_init_aet_object(AetArgs args, const aet_database* aet_db) { } uint32_t aet_manager_init_aet_object(uint32_t id, const char* layer_name, - spr::SprPrio prio, AetFlags flags, const char* start_marker, const char* end_marker, - const aet_database* aet_db, const sprite_database* spr_db) { + spr::SPR_PRIO prio, AetFlags flags, const char* start_marker, const char* end_marker, + const aet_database* aet_db, const SprDb* spr_db) { AetArgs args; args.id.info = aet_db->get_aet_by_id(id)->info; args.layer_name = layer_name; @@ -696,10 +696,10 @@ uint32_t aet_manager_init_aet_object(uint32_t id, const char* layer_name, return aet_manager->InitAetObject(args); } -uint32_t aet_manager_init_aet_object(uint32_t aet_id, spr::SprPrio prio, AetFlags flags, - const char* layer_name, const vec2* trans, spr::SprTarget target, const char* start_marker, const char* end_marker, +uint32_t aet_manager_init_aet_object(uint32_t aet_id, spr::SPR_PRIO prio, AetFlags flags, + const char* layer_name, const vec2* trans, spr::SPR_TARGET target, const char* start_marker, const char* end_marker, float_t start_time, float_t end_time, const vec2* scale, FrameRateControl* frame_rate_control, - const aet_database* aet_db, const sprite_database* spr_db) { + const aet_database* aet_db, const SprDb* spr_db) { AetArgs args; args.id.id = aet_id; args.prio = prio; @@ -791,7 +791,7 @@ void aet_manager_set_obj_position(uint32_t id, const vec3& value) { aet_manager->SetObjPosition(id, value); } -void aet_manager_set_obj_prio(uint32_t id, spr::SprPrio value) { +void aet_manager_set_obj_prio(uint32_t id, spr::SPR_PRIO value) { aet_manager->SetObjPrio(id, value); } @@ -1082,7 +1082,7 @@ void AetObj::SetFrameRateControl(FrameRateControl* value) { frame_rate_control = value; } -void AetObj::SetPrio(spr::SprPrio value) { +void AetObj::SetPrio(spr::SPR_PRIO value) { prio = value; } @@ -1116,7 +1116,7 @@ void AetObj::CtrlComp(const aet_comp* comp, float_t frame) { } void AetObj::DispComp(const mat4& mat, const aet_comp* comp, - float_t frame, float_t opacity, const sprite_database* spr_db) { + float_t frame, float_t opacity, const SprDb* spr_db) { if (!comp->layers_count) return; @@ -1189,7 +1189,7 @@ void AetObj::CtrlLayer(const aet_layer* layer, float_t frame) { } void AetObj::DispLayer(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db) { + float_t frame, float_t opacity, const SprDb* spr_db) { if (frame < layer->start_time || frame >= layer->end_time || layer->item_type == AET_ITEM_TYPE_AUDIO @@ -1211,7 +1211,7 @@ void AetObj::DispLayer(const mat4& mat, const aet_layer* layer, } void AetObj::DispVideo(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db) { + float_t frame, float_t opacity, const SprDb* spr_db) { const aet_video* video = layer->item.video; if (video->sources_count <= 1) { if (video->sources_count == 1) @@ -1246,7 +1246,7 @@ void AetObj::DispVideo(const mat4& mat, const aet_layer* layer, } void AetObj::DispSprite(const mat4& mat, const aet_layer* layer, - float_t opacity, const sprite_database* spr_db) { + float_t opacity, const SprDb* spr_db) { auto elem = list.find(layer->name); if (elem == list.end()) return; @@ -1255,7 +1255,7 @@ void AetObj::DispSprite(const mat4& mat, const aet_layer* layer, color.w *= opacity; spr::SprArgs args; - args.id.id = elem->second; + args.id = elem->second; args.matrix = mat; args.target = starget; args.layer = slayer; @@ -1264,16 +1264,16 @@ void AetObj::DispSprite(const mat4& mat, const aet_layer* layer, args.screen_trans = dst_mode; args.screen_scale = dst_mode; if (flags & AET_FLIP_H) - enum_or(args.attr, spr::SPR_ATTR_FLIP_H); + enum_or(args.attr, spr::M_SPR_ATTR_FLIP_H); if (flags & AET_FLIP_V) - enum_or(args.attr, spr::SPR_ATTR_FLIP_V); + enum_or(args.attr, spr::M_SPR_ATTR_FLIP_V); if (flags & AET_100000) - enum_or(args.attr, spr::SPR_ATTR_EDGELINE); - spr::put_sprite(args, spr_db); + enum_or(args.attr, spr::M_SPR_ATTR_EDGELINE); + spr::put(args, spr_db); } void AetObj::DispSpriteSource(const mat4& mat, const aet_layer* layer, - uint32_t source_index, float_t opacity, const sprite_database* spr_db) { + uint32_t source_index, float_t opacity, const SprDb* spr_db) { int32_t spr_id = layer->item.video->sources[source_index].sprite_index; auto elem_discard = sprite_discard.find(spr_id); @@ -1281,21 +1281,21 @@ void AetObj::DispSpriteSource(const mat4& mat, const aet_layer* layer, return; spr::SprArgs args; - args.id.id = spr_id; + args.id = spr_id; auto elem_texture = sprite_texture.find(spr_id); if (elem_texture != sprite_texture.end()) { args.tex = elem_texture->second; - args.id.id = -1; + args.id = -1; } else if (spr_id != -1) { auto elem_replace = sprite_replace.find(spr_id); if (elem_replace != sprite_replace.end() && elem_replace->second != -1) { - const spr_db_spr* spr = spr_db->get_spr_by_id(elem_replace->second); - //const spr_db_spr_set* spr_set = spr_db->get_spr_set_by_index(spr->info.set_index & 0x0FFF); - const spr_db_spr_set* spr_set = spr_db->get_spr_set_by_index(spr->info.set_index & 0x3FFF); - if (sprite_manager_get_set_ready(spr_set->id, spr_db)) - args.id.id = elem_replace->second; + const SprId spr_id = spr_db->getSprIdFromUid(elem_replace->second); + //const uint32_t set_uid = spr_db->getSetUidFromIdx(spr_id.m.set_idx & 0x0FFF); + const uint32_t set_uid = spr_db->getSetUidFromIdx(spr_id.m.set_idx & 0x3FFF); + if (spr::getReady(set_uid, spr_db)) + args.id = elem_replace->second; } } @@ -1310,11 +1310,11 @@ void AetObj::DispSpriteSource(const mat4& mat, const aet_layer* layer, args.screen_trans = dst_mode; args.screen_scale = dst_mode; if (flags & AET_FLIP_H) - enum_or(args.attr, spr::SPR_ATTR_FLIP_H); + enum_or(args.attr, spr::M_SPR_ATTR_FLIP_H); if (flags & AET_FLIP_V) - enum_or(args.attr, spr::SPR_ATTR_FLIP_V); + enum_or(args.attr, spr::M_SPR_ATTR_FLIP_V); if (flags & AET_100000) - enum_or(args.attr, spr::SPR_ATTR_EDGELINE); + enum_or(args.attr, spr::M_SPR_ATTR_EDGELINE); switch (layer->video->transfer_mode.mode) { case AET_BLEND_MODE_SCREEN: @@ -1335,11 +1335,11 @@ void AetObj::DispSpriteSource(const mat4& mat, const aet_layer* layer, if (layer->video->transfer_mode.matte) { this->opacity = opacity; matte = true; - spr_args.Reset(); + spr_args.init(); spr_args = args; } else if (fabsf(mat4_determinant(&args.matrix)) > 0.000001f) - spr::put_sprite(args, spr_db); + spr::put(args, spr_db); } else { matte = false; @@ -1349,10 +1349,10 @@ void AetObj::DispSpriteSource(const mat4& mat, const aet_layer* layer, spr_args.color = _color; - spr::SprArgs* v52 = spr::put_sprite(spr_args, spr_db); - spr::SprArgs* v53 = spr::put_sprite(args, spr_db); + spr::SprArgs* v52 = spr::put(spr_args, spr_db); + spr::SprArgs* v53 = spr::put(args, spr_db); if (v53 && v52) - spr::SprArgs::SetChild(v53, v52); + v53->setChild(v52); } } } @@ -1452,7 +1452,7 @@ void AetLyo::CtrlLayer(const aet_layer* layer, float_t frame) { } void AetLyo::DispLayer(const mat4& mat, const aet_layer* layer, - float_t frame, float_t opacity, const sprite_database* spr_db) { + float_t frame, float_t opacity, const SprDb* spr_db) { if (frame < layer->start_time || frame >= layer->end_time || layer->item_type == AET_ITEM_TYPE_AUDIO) @@ -1824,7 +1824,7 @@ void AetMgr::SetObjPosition(uint32_t id, const vec3& value) { obj->SetPosition(value); } -void AetMgr::SetObjPrio(uint32_t id, spr::SprPrio value) { +void AetMgr::SetObjPrio(uint32_t id, spr::SPR_PRIO value) { AetObj* obj = GetObj(id); if (obj) obj->SetPrio(value); diff --git a/src/CRE/auth_2d.hpp b/src/CRE/auth_2d.hpp index 83abb802..88b56b7d 100644 --- a/src/CRE/auth_2d.hpp +++ b/src/CRE/auth_2d.hpp @@ -46,9 +46,9 @@ struct AetArgs { float_t start_time; float_t end_time; AetFlags flags; - spr::SprTarget target; - spr::SprLayer layer; - spr::SprPrio prio; + spr::SPR_TARGET target; + spr::SPR_LAYER layer; + spr::SPR_PRIO prio; SCREEN_MODE screen; vec3 trans; vec3 rotate; @@ -66,7 +66,7 @@ struct AetArgs { FrameRateControl* frame_rate_control; bool sound_voice; - const sprite_database* spr_db; + const SprDb* spr_db; AetArgs(); ~AetArgs(); @@ -86,8 +86,8 @@ struct aet_layout_data { aet_layout_data(); - static void put_sprite(int32_t spr_id, spr::SprAttr attr, spr::SprPrio prio, - const vec2* pos, const aet_layout_data* layout, const sprite_database* spr_db); + static void put_sprite(int32_t spr_id, spr::SPR_ATTR attr, spr::SPR_PRIO prio, + const vec2* pos, const aet_layout_data* layout, const SprDb* spr_db); static void set_args(const aet_layout_data* layout, spr::SprArgs* args); }; @@ -102,8 +102,8 @@ struct AetComp { const aet_layout_data* Find(const char* name); static void put_number_sprite(int32_t value, int32_t max_digits, - AetComp* comp, const char** names, const int32_t* spr_ids, spr::SprPrio prio, - const vec2* pos, bool all_digits, const sprite_database* spr_db); + AetComp* comp, const char** names, const int32_t* spr_ids, spr::SPR_PRIO prio, + const vec2* pos, bool all_digits, const SprDb* spr_db); }; class AetSet { @@ -176,15 +176,15 @@ extern void aet_manager_init_aet_layout(AetComp* composition, AetArgs args, const aet_database* aet_db); extern void aet_manager_init_aet_layout(AetComp* composition, uint32_t aet_id, const char* layer_name, AetFlags flags, SCREEN_MODE mode, const char* start_marker, float_t start_time, - const aet_database* aet_db, const sprite_database* spr_db); + const aet_database* aet_db, const SprDb* spr_db); extern uint32_t aet_manager_init_aet_object(AetArgs args, const aet_database* aet_db); extern uint32_t aet_manager_init_aet_object(uint32_t id, const char* layer_name, - spr::SprPrio prio, AetFlags flags, const char* start_marker, const char* end_marker, - const aet_database* aet_db, const sprite_database* spr_db); -extern uint32_t aet_manager_init_aet_object(uint32_t aet_id, spr::SprPrio prio, AetFlags flags, - const char* layer_name, const vec2* trans, spr::SprTarget target, const char* start_marker, const char* end_marker, + spr::SPR_PRIO prio, AetFlags flags, const char* start_marker, const char* end_marker, + const aet_database* aet_db, const SprDb* spr_db); +extern uint32_t aet_manager_init_aet_object(uint32_t aet_id, spr::SPR_PRIO prio, AetFlags flags, + const char* layer_name, const vec2* trans, spr::SPR_TARGET target, const char* start_marker, const char* end_marker, float_t start_time, float_t end_time, const vec2* scale, FrameRateControl* frame_rate_control, - const aet_database* aet_db, const sprite_database* spr_db); + const aet_database* aet_db, const SprDb* spr_db); extern bool aet_manager_load_file(uint32_t set_id, const aet_database* aet_db); extern bool aet_manager_load_file_modern(uint32_t set_hash, aet_database* aet_db); extern void aet_manager_read_file(uint32_t set_id, @@ -200,7 +200,7 @@ extern void aet_manager_set_obj_frame(uint32_t id, float_t value); extern void aet_manager_set_obj_frame_rate_control(uint32_t id, FrameRateControl* value); extern void aet_manager_set_obj_play(uint32_t id, bool value); extern void aet_manager_set_obj_position(uint32_t id, const vec3& value); -extern void aet_manager_set_obj_prio(uint32_t id, spr::SprPrio value); +extern void aet_manager_set_obj_prio(uint32_t id, spr::SPR_PRIO value); extern void aet_manager_set_obj_rotation(uint32_t id, const vec3& value); extern void aet_manager_set_obj_scale(uint32_t id, const vec3& value); extern void aet_manager_set_obj_sprite_discard(uint32_t id, std::map& value); diff --git a/src/CRE/auth_3d.cpp b/src/CRE/auth_3d.cpp index 30bf702b..4180a08d 100644 --- a/src/CRE/auth_3d.cpp +++ b/src/CRE/auth_3d.cpp @@ -18,12 +18,12 @@ #include "app_system_detail.hpp" #include "clear_color.hpp" #include "data.hpp" +#include "debug_print.hpp" #include "effect.hpp" #include "object.hpp" #include "pv_db.hpp" #include "task.hpp" #include "sound.hpp" -#include "sprite.hpp" #include "stage.hpp" namespace auth_3d_detail { @@ -431,7 +431,7 @@ void auth_3d::disp(render_context* rctx) { return; if (pos) - spr::put_rgb_cross(mat); + debug_put_line_axis(mat); auth_3d_set_material_list(this, rctx); extern bool reflect_full; @@ -4406,7 +4406,7 @@ static void auth_3d_chara_disp(auth_3d_chara* c, auth_3d* auth, render_context* if (auth->pos) { c->model_transform.set_mat(&auth->mat); - spr::put_rgb_cross(c->model_transform.mat); + debug_put_line_axis(c->model_transform.mat); } } @@ -6531,7 +6531,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context if (!auth->visible) { if (auth->pos) - spr::put_rgb_cross(o->model_transform.mat); + debug_put_line_axis(o->model_transform.mat); for (auth_3d_object*& i : o->children_object) auth_3d_object_disp(i, auth, rctx); @@ -6656,7 +6656,7 @@ static void auth_3d_object_disp(auth_3d_object* o, auth_3d* auth, render_context disp_manager.set_obj_flags(); if (auth->pos) - spr::put_rgb_cross(o->model_transform.mat); + debug_put_line_axis(o->model_transform.mat); for (auth_3d_object*& i : o->children_object) auth_3d_object_disp(i, auth, rctx); @@ -7268,7 +7268,7 @@ static void auth_3d_play_control_store(auth_3d* auth, auth_3d_play_control_file* static void auth_3d_point_disp(auth_3d_point* p, auth_3d* auth, render_context* rctx) { if (auth->pos) { p->model_transform.set_mat(&auth->mat); - spr::put_rgb_cross(p->model_transform.mat); + debug_put_line_axis(p->model_transform.mat); } } diff --git a/src/CRE/customize_item_table.cpp b/src/CRE/customize_item_table.cpp index a0b0847e..99dd89be 100644 --- a/src/CRE/customize_item_table.cpp +++ b/src/CRE/customize_item_table.cpp @@ -347,7 +347,7 @@ void customize_item_data_handler::add_customize_items() { customize_items.clear(); data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; char buf[0x80]; @@ -376,10 +376,10 @@ void customize_item_data_handler::add_customize_items() { cstm_itm.field_3D = true;*/ sprintf_s(buf, sizeof(buf), "SPR_CMNITM_THMB%03d", cstm_itm.id); - cstm_itm.spr_cmnitm_thmb_id_spr_set_id = aft_spr_db->get_spr_set_by_name(buf)->id; + cstm_itm.spr_cmnitm_thmb_id_spr_set_id = aft_spr_db->getSetUidFromName(buf); sprintf_s(buf, sizeof(buf), "SPR_CMNITM_THMB%03d_ITM_IMG", cstm_itm.id); - cstm_itm.spr_cmnitm_thmb_id_itm_img_spr_id = aft_spr_db->get_spr_by_name(buf)->id; + cstm_itm.spr_cmnitm_thmb_id_itm_img_spr_id = aft_spr_db->getSprUidFromName(buf); customize_items.push_back(cstm_itm); } diff --git a/src/CRE/data.cpp b/src/CRE/data.cpp index 13f9ea65..427b8808 100644 --- a/src/CRE/data.cpp +++ b/src/CRE/data.cpp @@ -112,10 +112,10 @@ void data_struct_load_db() { std::string file(i); file.append("spr_db.bin"); - sprite_database_file spr_db_file; + SprDbFile spr_db_file; spr_db_file.modern = false; ds->load_file(&spr_db_file, "rom/2d/", file.c_str(), - sprite_database_file::load_file); + SprDbFile::load_file); d->spr_db.add(&spr_db_file); } diff --git a/src/CRE/data.hpp b/src/CRE/data.hpp index 4df84a51..a4045ea2 100644 --- a/src/CRE/data.hpp +++ b/src/CRE/data.hpp @@ -16,7 +16,6 @@ #include "../KKdLib/database/sprite.hpp" #include "../KKdLib/database/stage.hpp" #include "../KKdLib/database/texture.hpp" -#include "../KKdLib/vec.hpp" enum data_type { DATA_AFT = 0, @@ -67,7 +66,7 @@ struct data_ft { bone_database bone_data; motion_database mot_db; object_database obj_db; - sprite_database spr_db; + SprDb spr_db; stage_database stage_data; texture_database tex_db; diff --git a/src/CRE/debug_print.cpp b/src/CRE/debug_print.cpp new file mode 100644 index 00000000..1d46a4da --- /dev/null +++ b/src/CRE/debug_print.cpp @@ -0,0 +1,199 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#include "debug_print.hpp" +#include "render_context.hpp" +#include "screen_param.hpp" +#include "sprite.hpp" + +static vec4 primitive_color; + +extern render_context* rctx_ptr; + +void debug_put(const prj::Line3f& line) { + debug_put_line(line.p0, line.p1); +} + +void debug_put(const prj::Capsule3f& capsule) { + debug_put_capsule(capsule); +} + +void debug_put(const prj::Cylinder3f& cylinder) { + debug_put_cylinder(cylinder.c0, cylinder.c1, cylinder.r); +} + +void debug_put(const prj::Plane3f& plane) { + debug_put_plane(plane); +} + +void debug_put(const prj::Sphere3f& sphere) { + debug_put_sphere(sphere.c.x, sphere.c.y, sphere.c.z, sphere.r); +} + +void debug_put(const prj::Triangle3f& triangle) { + debug_put_triangle(triangle); +} + +void debug_put_capsule(const vec3& c0, const vec3& c1, float_t r) { + abort(); +} + +void debug_put_capsule(const prj::Capsule3f& capsule) { + debug_put_capsule(capsule.c0, capsule.c1, capsule.r); +} + +void debug_put_capsule(float_t x, float_t r) { + vec3 c0; + vec3 c1; + c1.x = x; + debug_put_capsule(c0, c1, r); +} + +void debug_put_color(const vec4& color) { + primitive_color = color; +} + +void debug_put_color(color4u8 color) { + primitive_color = color; +} + +void debug_put_cylinder(const vec3& c0, const vec3& c1, float_t r) { + abort(); +} + +void debug_put_cylinder(const prj::Cylinder3f& cylinder) { + debug_put_cylinder(cylinder.c0, cylinder.c1, cylinder.r); +} + +void debug_put_ellipse(const vec3& c0, const vec3& c1, float_t r) { + abort(); +} + +void debug_put_line(const prj::Line3f& line) { + debug_put_line(line.p0, line.p1); +} + +void debug_put_line(const vec3& p0, const vec3& p1) { + vec2 sc_p0 = project_screen(p0, true); + vec2 sc_p1 = project_screen(p1, true); + spr::putLine(sc_p0, sc_p1, SCREEN_MODE_MAX, spr::SPR_PRIO_DW, primitive_color); +} + +void debug_put_line(float_t p0x, float_t p0y, float_t p0z, float_t p1x, float_t p1y, float_t p1z) { + debug_put_line(vec3(p0x, p0y, p0z), vec3(p1x, p1y, p1z)); +} + +void debug_put_line_axis(const mat4& mat) { + debug_put_line_axis(mat, color_red, color_green, color_blue); +} + +void debug_put_line_axis(const mat4& mat, color4u8 color_x, color4u8 color_y, color4u8 color_z) { + vec3 center = { 0.0f, 0.0f, 0.0f }; + mat4_transform_point(&mat, ¢er, ¢er); + + vec3 x_axis = { 1.0f, 0.0f, 0.0f }; + mat4_transform_point(&mat, &x_axis, &x_axis); + debug_put_color(color_x); + debug_put_line(center, x_axis); + + vec3 y_axis = { 0.0f, 1.0f, 0.0f }; + mat4_transform_point(&mat, &y_axis, &y_axis); + debug_put_color(color_y); + debug_put_line(center, y_axis); + + vec3 z_axis = { 0.0f, 0.0f, 1.0f }; + mat4_transform_point(&mat, &z_axis, &z_axis); + debug_put_color(color_z); + debug_put_line(center, z_axis); +} + +void debug_put_plane(const vec3& p, const vec3& n, const vec3& s) { + float_t zang = atan2f(n.y, n.x); + float_t yang = atan2f(-n.z, sqrtf(n.x * n.x + n.y * n.y)); + + mat4 mat; + mat4_translate(&p, &mat); + + mat4_mul_rotate_z(&mat, zang, &mat); + mat4_mul_rotate_y(&mat, yang, &mat); + mat4_mul_rotate_z(&mat, 90.0f * DEG_TO_RAD_FLOAT, &mat); + mat4_scale_rot(&mat, &s, &mat); + + rctx_ptr->disp_manager->entry_obj_by_object_info(mat, object_info(0x02, 0x02), &primitive_color); +} + +void debug_put_plane(const prj::Plane3f& plane) { + debug_put_plane(plane.point, plane.normal); +} + +void debug_put_plane_zx(const vec3& p, float_t w, float_t h) { + mat4 mat; + mat4_translate(&p, &mat); + + mdl::EtcObj etc(mdl::ETC_OBJ_PLANE); + etc.color = primitive_color; + etc.data.plane.w = (int32_t)w; + etc.data.plane.h = (int32_t)h; + rctx_ptr->disp_manager->entry_obj_etc(mat, etc); +} + +void debug_put_sphere(const vec3& c, float_t r) { + mat4 mat; + mat4_translate(&c, &mat); + mat4_scale_rot(&mat, r, &mat); + + rctx_ptr->disp_manager->entry_obj_by_object_info(mat, object_info(0x00, 0x02), &primitive_color); +} + +void debug_put_sphere(const prj::Sphere3f& sphere) { + debug_put_sphere(sphere.c, sphere.r); +} + +void debug_put_sphere(float_t r) { + debug_put_sphere(0.0f, 0.0f, 0.0f, r); +} + +void debug_put_sphere(float_t x, float_t y, float_t z, float_t r) { + debug_put_sphere(vec3(x, y, z), r); +} + +void debug_put_triangle(const vec3& p0, const vec3& p1, const vec3& p2) { + // Empty +} + +void debug_put_triangle(const prj::Triangle3f& triangle) { + debug_put_triangle(triangle.p0, triangle.p1, triangle.p2); +} + +void debug_put_trnsl(float_t trnsl) { + primitive_color.w = trnsl; +} + +void dx_draw_line(vec3 p1, vec3 p2, color4u8 color) { + debug_put_color(color); + debug_put_line(p1, p2); +} + +vec2 project_screen(vec3 vec, bool offset) { + camera* cam = rctx_ptr->camera; + + mat4_transform_point(&cam->view, &vec, &vec); + if (fabsf(vec.z) < 1.0e-10f) + return 0.0f; + + vec2 sc_vec = cam->depth * *(vec2*)&vec.x * (1.0f / vec.z); + + ScreenParam& render_screen_param = get_render_screen_param(); + sc_vec.x = (float_t)render_screen_param.width * 0.5f - sc_vec.x; + sc_vec.y = (float_t)render_screen_param.height * 0.5f + sc_vec.y; + if (offset) { + ScreenParam& screen_param = get_screen_param(); + sc_vec.x = (float_t)render_screen_param.xoffset + sc_vec.x; + sc_vec.y = (float_t)(screen_param.height + - render_screen_param.yoffset - render_screen_param.height) + sc_vec.y; + } + return sc_vec; +} + diff --git a/src/CRE/debug_print.hpp b/src/CRE/debug_print.hpp new file mode 100644 index 00000000..ecd3e748 --- /dev/null +++ b/src/CRE/debug_print.hpp @@ -0,0 +1,46 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../KKdLib/default.hpp" +#include "../KKdLib/prj/primitive_type.hpp" +#include "../KKdLib/mat.hpp" +#include "../KKdLib/vec.hpp" +#include "color.hpp" + +extern void debug_put(const prj::Line3f& line); +extern void debug_put(const prj::Capsule3f& capsule); +extern void debug_put(const prj::Cylinder3f& cylinder); +extern void debug_put(const prj::Plane3f& plane); +extern void debug_put(const prj::Sphere3f& sphere); +extern void debug_put(const prj::Triangle3f& triangle); +extern void debug_put_capsule(const vec3& c0, const vec3& c1, float_t r); +extern void debug_put_capsule(const prj::Capsule3f& capsule); +extern void debug_put_capsule(float_t x, float_t r); +extern void debug_put_color(const vec4& color); +extern void debug_put_color(color4u8 color); +extern void debug_put_cylinder(const vec3& c0, const vec3& c1, float_t r); +extern void debug_put_cylinder(const prj::Cylinder3f& cylinder); +extern void debug_put_ellipse(const vec3& c0, const vec3& c1, float_t r); +extern void debug_put_line(const prj::Line3f& line); +extern void debug_put_line(const vec3& p0, const vec3& p1); +extern void debug_put_line(float_t p0x, float_t p0y, float_t p0z, float_t p1x, float_t p1y, float_t p1z); +extern void debug_put_line_axis(const mat4& mat); +extern void debug_put_line_axis(const mat4& mat, color4u8 color_x, color4u8 color_y, color4u8 color_z); +extern void debug_put_plane(const vec3& p, const vec3& n, const vec3& s = 1.0f); +extern void debug_put_plane(const prj::Plane3f& plane); +extern void debug_put_plane_zx(const vec3& p, float_t w, float_t h); +extern void debug_put_sphere(const vec3& c, float_t r); +extern void debug_put_sphere(const prj::Sphere3f& sphere); +extern void debug_put_sphere(float_t r); +extern void debug_put_sphere(float_t x, float_t y, float_t z, float_t r); +extern void debug_put_triangle(const vec3& p0, const vec3& p1, const vec3& p2); +extern void debug_put_triangle(const prj::Triangle3f& triangle); +extern void debug_put_trnsl(float_t trnsl); + +extern void dx_draw_line(vec3 p1, vec3 p2, color4u8 color); + +extern vec2 project_screen(vec3 vec, bool with_render_offset); diff --git a/src/CRE/module_table.cpp b/src/CRE/module_table.cpp index ef50ca1d..0fad042d 100644 --- a/src/CRE/module_table.cpp +++ b/src/CRE/module_table.cpp @@ -340,7 +340,7 @@ void module_data_handler::add_modules() { modules.clear(); data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; char buf[0x80]; @@ -356,16 +356,16 @@ void module_data_handler::add_modules() { rob_sleeve_handler_data_get_sleeve_data(mdl.chara_num, mdl.cos, mdl.sleeve_l, mdl.sleeve_r); sprintf_s(buf, sizeof(buf), "SPR_SEL_MD%03d", mdl.id); - mdl.spr_sel_md_id_spr_set_id = aft_spr_db->get_spr_set_by_name(buf)->id; + mdl.spr_sel_md_id_spr_set_id = aft_spr_db->getSetUidFromName(buf); sprintf_s(buf, sizeof(buf), "SPR_SEL_MD%03dCMN", mdl.id); - mdl.spr_sel_md_id_cmn_spr_set_id = aft_spr_db->get_spr_set_by_name(buf)->id; + mdl.spr_sel_md_id_cmn_spr_set_id = aft_spr_db->getSetUidFromName(buf); sprintf_s(buf, sizeof(buf), "SPR_SEL_MD%03d_MD_IMG_%03d", mdl.id, mdl.id); - mdl.spr_sel_md_id_md_img_id_spr_id = aft_spr_db->get_spr_by_name(buf)->id; + mdl.spr_sel_md_id_md_img_id_spr_id = aft_spr_db->getSprUidFromName(buf); sprintf_s(buf, sizeof(buf), "SPR_SEL_MD%03dCMN_MD_IMG", mdl.id); - mdl.spr_sel_md_id_cmn_md_img_spr_id = aft_spr_db->get_spr_by_name(buf)->id; + mdl.spr_sel_md_id_cmn_md_img_spr_id = aft_spr_db->getSprUidFromName(buf); /*struc_684 v17; if (sub_1402B7880()->sub_1402B7550(i.second.id, v17)) { diff --git a/src/CRE/render_context.cpp b/src/CRE/render_context.cpp index 7d1d867a..cd0dbb89 100644 --- a/src/CRE/render_context.cpp +++ b/src/CRE/render_context.cpp @@ -1380,17 +1380,17 @@ void render_context::disp() { start_render_process(); disp_manager->refresh(); draw_state->stats_update(); - sprite_manager_reset_req_list(); + spr::refresh(); camera->update(); render_manager->cam.get(camera); app::disp_task(); shadow_ptr_get()->ctrl(); - spr::SprTarget target = sprite_manager_get_target(); - //sprite_manager_set_target(spr::SPR_TARGET_CSBACK); - sprite_manager_set_target(spr::SPR_TARGET_FRONT); + spr::SPR_TARGET target = spr::getTarget(); + //spr::setTarget(spr::SPR_TARGET_CSBACK); + spr::setTarget(spr::SPR_TARGET_FRONT); extern void dw_gui_ctrl_disp(); dw_gui_ctrl_disp(); - sprite_manager_set_target(target); + spr::setTarget(target); render_manager->rndpass_pre_proc(); render_manager->render_all(); render_manager->rndpass_post_proc(); diff --git a/src/CRE/render_manager.cpp b/src/CRE/render_manager.cpp index bf4ec733..695f86a1 100644 --- a/src/CRE/render_manager.cpp +++ b/src/CRE/render_manager.cpp @@ -294,7 +294,7 @@ namespace rndr { void RenderManager::render_all() { gl_state.get(); - sprite_manager_pre_draw(); + spr::preFlush(); rctx_ptr->etc_obj_manager->pre_draw(); { @@ -339,7 +339,7 @@ namespace rndr { } rctx_ptr->etc_obj_manager->post_draw(); - sprite_manager_post_draw(); + spr::postFlush(); render_data_context rend_data_ctx(GL_REND_STATE_POST_2D); rend_data_ctx.state.get(); @@ -838,7 +838,7 @@ namespace rndr { rndr::Render* rend = render; if (!rctx->sss_data->enable || !rctx->sss_data->downsample) { rend->bind_render_texture(rend_data_ctx.state); - if (sprite_manager_get_reqlist_count(2)) { + if (spr::getObjListCount(spr::SPR_TARGET_BACK)) { rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear_depth(1.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -855,7 +855,7 @@ namespace rndr { } } else { - if (sprite_manager_get_reqlist_count(2)) { + if (spr::getObjListCount(spr::SPR_TARGET_BACK)) { rend->bind_render_texture(rend_data_ctx.state); rend_data_ctx.state.clear_color(0.0f, 0.0f, 0.0f, 0.0f); rend_data_ctx.state.clear(GL_COLOR_BUFFER_BIT); @@ -874,7 +874,7 @@ namespace rndr { } void RenderManager::pass_pre_sprite(render_data_context& rend_data_ctx) { - if (!sprite_manager_get_reqlist_count(2)) + if (!spr::getObjListCount(spr::SPR_TARGET_BACK)) return; render_context* rctx = rctx_ptr; @@ -888,7 +888,7 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); - sprite_manager_draw(rend_data_ctx, 2, true, + spr::flush(rend_data_ctx, spr::SPR_TARGET_BACK, true, rend->temp_buffer.color_texture, rctx->camera->view_projection_aet_3d); rend_data_ctx.state.enable_cull_face(); @@ -1127,7 +1127,7 @@ namespace rndr { void RenderManager::pass_sprite(render_data_context& rend_data_ctx) { render_context* rctx = rctx_ptr; - if (!sprite_manager_get_reqlist_count(0)) + if (!spr::getObjListCount(spr::SPR_TARGET_FRONT)) return; rend_data_ctx.state.begin_event("pass_sprite"); @@ -1150,7 +1150,7 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); - sprite_manager_draw(rend_data_ctx, 0, true, + spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT, true, rctx->screen_overlay_buffer.color_texture, rctx->camera->view_projection_aet_2d); rend_data_ctx.state.enable_cull_face(); @@ -1230,7 +1230,7 @@ namespace rndr { } void RenderManager::pass_sprite_surf(render_data_context& rend_data_ctx) { - if (!sprite_manager_get_reqlist_count(1)) + if (!spr::getObjListCount(spr::SPR_TARGET_FRONT_3D_SURF)) return; render_context* rctx = rctx_ptr; @@ -1240,7 +1240,7 @@ namespace rndr { rend_data_ctx.state.disable_depth_test(); rend_data_ctx.state.enable_blend(); rend_data_ctx.state.disable_cull_face(); - sprite_manager_draw(rend_data_ctx, 1, true, + spr::flush(rend_data_ctx, spr::SPR_TARGET_FRONT_3D_SURF, true, rend->temp_buffer.color_texture, rctx->camera->view_projection_aet_2d); } diff --git a/src/CRE/rob/ex_block.cpp b/src/CRE/rob/ex_block.cpp index afe39b01..2dd4fdd5 100644 --- a/src/CRE/rob/ex_block.cpp +++ b/src/CRE/rob/ex_block.cpp @@ -8,8 +8,8 @@ #include "../../KKdLib/str_utils.hpp" #include "../app_system_detail.hpp" #include "../data.hpp" +#include "../debug_print.hpp" #include "../gl_state.hpp" -#include "../sprite.hpp" #include "skin_param.hpp" struct ExpFuncUnaryTbl { @@ -1177,7 +1177,7 @@ void CLOTH::disp_debug() { const CLOTH_VERTEX* vtx = vtxarg.data(); for (const auto& i : spring) - spr::put_sprite_3d_line(vtx[i.index0].pos, vtx[i.index1].pos, color_spring); + dx_draw_line(vtx[i.index0].pos, vtx[i.index1].pos, color_spring); } void CLOTH::dest() { @@ -1199,22 +1199,17 @@ void RobCloth::disp_debug() { if (!dbg_osage_line_disp_flag) return; - const color4u8 color_spring = color_red; - const color4u8 color_tangent = color_green; const color4u8 color_binormal = color_cyan; const color4u8 color_normal = color_white; const CLOTH_VERTEX* vtx = vtxarg.data(); - for (const auto& i : spring) - spr::put_sprite_3d_line(vtx[i.index0].pos, vtx[i.index1].pos, color_spring); - vtx += width; for (size_t i = 1; i < height; i++) { for (size_t j = 0; j < width; j++, vtx++) { - spr::put_sprite_3d_line(vtx->pos, vtx->tangent * 0.05f + vtx->pos, color_tangent); - spr::put_sprite_3d_line(vtx->pos, vtx->binormal * 0.05f + vtx->pos, color_binormal); - spr::put_sprite_3d_line(vtx->pos, vtx->normal * 0.05f + vtx->pos, color_normal); + dx_draw_line(vtx->pos, vtx->tangent * 0.05f + vtx->pos, color_tangent); + dx_draw_line(vtx->pos, vtx->binormal * 0.05f + vtx->pos, color_binormal); + dx_draw_line(vtx->pos, vtx->normal * 0.05f + vtx->pos, color_normal); } } } diff --git a/src/CRE/rob/rob.cpp b/src/CRE/rob/rob.cpp index ef6183e6..f0e24379 100644 --- a/src/CRE/rob/rob.cpp +++ b/src/CRE/rob/rob.cpp @@ -17058,10 +17058,6 @@ void RobAdjust::reset() { item_scale = 1.0f; // X } -prj::Sphere3f::Sphere3f() : r() { - -} - prj::BallCollision::BallCollision() : sink(), colli_ball_mask(), org_rad() { } diff --git a/src/CRE/rob/rob.hpp b/src/CRE/rob/rob.hpp index bd1913fb..c3ea0507 100644 --- a/src/CRE/rob/rob.hpp +++ b/src/CRE/rob/rob.hpp @@ -9,6 +9,7 @@ #include "../../KKdLib/database/bone.hpp" #include "../../KKdLib/database/motion.hpp" #include "../../KKdLib/prj/bit_array.hpp" +#include "../../KKdLib/prj/primitive_type.hpp" #include "../../KKdLib/prj/vector_pair.hpp" #include "../../KKdLib/mat.hpp" #include "../../KKdLib/mot.hpp" @@ -4957,13 +4958,6 @@ struct RobAdjust { }; namespace prj { - struct Sphere3f { - vec3 c; - float_t r; - - Sphere3f(); - }; - struct BallCollision { vec3 old_c; Sphere3f ball; diff --git a/src/CRE/screen_param.cpp b/src/CRE/screen_param.cpp index fa3eed11..bb51be03 100644 --- a/src/CRE/screen_param.cpp +++ b/src/CRE/screen_param.cpp @@ -125,6 +125,7 @@ ScreenParam& get_render_screen_param() { return screen_info.render; } +// 0x14019A5D0 vec2 get_screen_conv_scale(const SCREEN_MODE dst_mode, const SCREEN_MODE src_mode) { if (dst_mode == SCREEN_MODE_MAX || src_mode == SCREEN_MODE_MAX || dst_mode < SCREEN_MODE_QVGA || src_mode < SCREEN_MODE_QVGA @@ -154,6 +155,7 @@ vec2 get_screen_conv_scale(const SCREEN_MODE dst_mode, const SCREEN_MODE src_mod return scale_y; } +// 0x14019A4C0 void get_screen_conv_pos(vec2& dst_pos, const SCREEN_MODE dst_mode, const vec2& src_pos, const SCREEN_MODE src_mode) { if (dst_mode == SCREEN_MODE_MAX || src_mode == SCREEN_MODE_MAX diff --git a/src/CRE/sprite.cpp b/src/CRE/sprite.cpp index a3a6f439..52a9b748 100644 --- a/src/CRE/sprite.cpp +++ b/src/CRE/sprite.cpp @@ -18,40 +18,46 @@ #include "shader_ft.hpp" #include "texture.hpp" -class SprSet { +class SPRSET { public: int32_t flag; - uint32_t index; + uint32_t id; ::spr_set* spr_set; texture** textures; - int32_t load_count; + int32_t reference; p_file_handler file_handler; bool ready; prj::shared_ptr alloc_handler; - std::string file; - std::string name; + + std::string set_name; std::vector sprite_ids; uint32_t hash; - SprSet(uint32_t index); - virtual ~SprSet(); - - const char* GetName(spr_info info); - rectangle GetRectangle(spr_info info); - SCREEN_MODE GetResolutionMode(spr_info info); - texture* GetTexture(spr_info info); - bool LoadData(); - bool LoadDataModern(const void* data, size_t size); - bool LoadFile(); - bool LoadFileModern(sprite_database* spr_db); - bool LoadTexture(); - bool LoadTextureModern(const void* data, size_t size); - void ReadFile(const char* file, std::string& mdata_dir, void* data); - void ReadFileModern(uint32_t set_hash, void* data); - void Unload(); - void UnloadModern(sprite_database* spr_db); - bool UnloadTexture(); + SPRSET(uint32_t in_id); + virtual ~SPRSET(); + + void request(const char* fname, const std::string mdata_dir, void* data); + void requestModern(uint32_t sethash, void* data); // Added + bool wait(); + bool waitModern(SprDb* spr_db); // Added + void free(); + void freeModern(SprDb* spr_db); // Added + int32_t getTexNum() const; + int32_t getSprNum() const; + bool getReady() const; + int32_t getReference() const; + const char* getFileName() const; + const texture* getTexture(SprId in_id) const; + const spr::SprArgs::Rect getRect(SprId in_id) const; + uint32_t getAttr(SprId in_id) const; + SCREEN_MODE getScreen(SprId in_id) const; + const char* getName(SprId in_id) const; + bool readTable(); + bool readTableModern(const void* data, size_t size); // Added + bool readTexHeader(); + bool readTexHeaderModern(const void* data, size_t size); // Added + bool freeTex(); }; struct sprite_vertex_data_uv0 { @@ -101,6 +107,26 @@ struct sprite_draw_param { }; namespace spr { + // Own stuff + struct RenderData { + std::vector draw_param_buffer; + std::vector vertex_buffer; + std::vector index_buffer; + GLuint vao[3]; + GL::ArrayBuffer vbo; + size_t vbo_vertex_count; + GL::ElementArrayBuffer ebo; + size_t ebo_index_count; + + RenderData(); + ~RenderData(); + + template + size_t AddData(T*& data, size_t nb_quad); + void Clear(); + void Update(); + }; + struct SprArgsDraw { int32_t num_texture; int32_t blend; @@ -109,55 +135,11 @@ namespace spr { spr::SprKind kind; }; - struct TexCoord { - struct UV { - float_t u; - float_t v; + struct SprMgr { + struct Projection { + float_t aspect; - inline UV() : u(), v() { - - } - - inline operator vec2() const { - return { u, v }; - } - }; - - UV uv[4]; - - inline TexCoord() { - - } - }; - - struct TexParam { - const texture* tex; - TexCoord texcoord; - //int32_t pad[2]; - - inline TexParam() : tex()/*, pad()*/ { - - } - }; - - struct SpriteManager { - struct RenderData { - std::vector draw_param_buffer; - std::vector vertex_buffer; - std::vector index_buffer; - GLuint vao[3]; - GL::ArrayBuffer vbo; - size_t vbo_vertex_count; - GL::ElementArrayBuffer ebo; - size_t ebo_index_count; - - RenderData(); - ~RenderData(); - - template - size_t AddData(T*& data, size_t nb_quad); - void Clear(); - void Update(); + Projection(); }; struct ViewPort { @@ -167,98 +149,113 @@ namespace spr { ViewPort(); }; - std::map sets; - std::list reqlist[SPR_TARGET_MAX][SPR_LAYER_MAX][SPR_PRIO_MAX]; - float_t aspect[2]; - ViewPort view_list[2]; - SprTarget target; + std::map sets; + std::list obj_list[SPR_TARGET_MAX][SPR_LAYER_MAX][SPR_PRIO_MAX]; + Projection projection_list[SPR_LAYER_MAX]; + ViewPort view_list[SPR_LAYER_MAX]; + SPR_TARGET target; mat4 view_projection; mat4 mat; SCREEN_MODE screen_mode_back; uint32_t set_counter; - RenderData render_data; + static SprMgr* p_sprmgr; - SpriteManager(); - ~SpriteManager(); + SprMgr(); + ~SprMgr(); - uint32_t AddSetModern(); - void AddSprSets(const sprite_database* spr_db); - void Clear(); - void Draw(render_data_context& rend_data_ctx, - int32_t index, bool font, texture* overlay_tex, const mat4& vp); - SprSet* GetSet(uint32_t index); - bool GetSetReady(uint32_t index); - uint32_t GetSetSpriteNum(uint32_t index); - uint32_t GetSetTextureNum(uint32_t index); - const char* GetSprName(spr_info info); - rectangle GetSprRectangle(spr_info info); - texture* GetSprTexture(spr_info info); - bool LoadFile(uint32_t index); - bool LoadFileModern(uint32_t index, sprite_database* spr_db); - SprArgs* PutSprite(const SprArgs& args, const sprite_database* spr_db); - void ReadFile(uint32_t index, const char* file, std::string& mdata_dir, void* data); - void ReadFileModern(uint32_t index, uint32_t set_hash, void* data, sprite_database* spr_db); - void RemoveSprSets(const sprite_database* spr_db); - void ResetTarget(); - void ResetReqList(); - void ResetResData(); - void PostDraw(); - void PreDraw(); - void UnloadSet(uint32_t index); - void UnloadSetModern(uint32_t index, sprite_database* spr_db); + public: + const SPRSET* find(uint32_t id); + void init(); + void init(const SprDb* spr_db); // Added + void dest(); + void dest(const SprDb* spr_db); // Added + bool ready(); + void setProjection(SPR_LAYER layer, float_t aspect); + void getViewport(SCREEN_MODE& screen, rectangle& rect, SPR_LAYER layer) const; + void setViewport(SPR_LAYER layer, SCREEN_MODE mode, const rectangle rect); + void setTarget(SPR_TARGET in_target); + SPR_TARGET getTarget(); + void flush(render_data_context& rend_data_ctx, + SPR_TARGET in_target, bool in_scale, texture* overlay_tex, const mat4& vp); + void refresh(); + void request(uint32_t id, const char* file, const std::string mdata_dir, void* data); + void requestModern(uint32_t id, uint32_t sethash, void* data, SprDb* spr_db); // Added + bool wait(uint32_t id); + bool waitModern(uint32_t id, SprDb* spr_db); // Added + void free(uint32_t id); + void freeModern(uint32_t id, SprDb* spr_db); // Added + int32_t getTexNum(uint32_t id); + int32_t getSprNum(uint32_t id); + bool getReady(uint32_t id); + const char* getName(SprId id); + size_t getObjListCount(SPR_TARGET in_target); + SprArgs::Rect getRect(SprId id); + uint32_t getAttr(SprId id); + SCREEN_MODE getScreen(SprId id); + const texture* getTexture(SprId id); + SprArgs* put(const SprArgs& args, const SprDb* spr_db); + + uint32_t addSet(); // Added + void resetTarget(); + + void postFlush(); // Added + void preFlush(); // Added + + inline static SprMgr& sprmgr() { + return *p_sprmgr; + } + + private: + static void begin_render(render_data_context& rend_data_ctx); + static void end_render(render_data_context& rend_data_ctx); }; - static void calc_sprite_vertex(spr::SprArgs* args, vec3 vtx[4], mat4* mat, bool font); - static int32_t calc_sprite_texture_param(SprArgs* args, spr::TexParam* param, vec3 vtx[4], bool font); - static int32_t calc_sprite_vertex_texture_param(SprArgs& args, vec3 vtx[4], spr::TexParam* param, bool font); + RenderData* render_data; - static void add_draw_sprite(SprArgs* args_array[0x100], const int32_t args_count, bool font, - SprArgsDraw& args_draw, SpriteManager::RenderData& render_data); - static void draw_sprite(render_data_context& rend_data_ctx, - spr::SpriteManager* sprite_manager, const SprArgs& args, const mat4& mat, - int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); - static void draw_sprite_begin(render_data_context& rend_data_ctx); - static void draw_sprite_copy_overlay_texture( - render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3 vtx[4], - int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max); - static void draw_sprite_end(render_data_context& rend_data_ctx); - static void draw_sprite_scale(spr::SprArgs* args); + SprMgr* SprMgr::p_sprmgr; + + const GLenum SprArgs::blend_table[spr::SPR_BLEND_MAX][4] = { + { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE }, + { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_ZERO, GL_ONE }, + { GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE }, + { GL_DST_COLOR, GL_ZERO, GL_ZERO, GL_ONE }, + { GL_ONE, GL_ZERO, GL_ONE, GL_ZERO }, + { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE }, + }; + + static bool use_quad_line = true; } -spr::SpriteManager* sprite_manager; - #if BREAK_SPRITE_VERTEX_LIMIT -size_t string_quad_max_count = 0x2000; +static size_t string_quad_max_count = 0x2000; -spr::SprArgs::Quad* string_quad; +static spr::SprArgs::Quad* string_quad; #else const size_t string_quad_max_count = 0x2000; -spr::SprArgs::Quad string_quad[string_quad_max_count]; +static spr::SprArgs::Quad string_quad[string_quad_max_count]; #endif -size_t string_quad_idx; +static size_t string_quad_idx; extern render_context* rctx_ptr; -static const GLenum spr_blend_param[6][4] = { - { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE }, - { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR, GL_ZERO, GL_ONE }, - { GL_SRC_ALPHA, GL_ONE, GL_ZERO, GL_ONE }, - { GL_DST_COLOR, GL_ZERO, GL_ZERO, GL_ONE }, - { GL_ONE, GL_ZERO, GL_ONE, GL_ZERO }, - { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE }, -}; - namespace spr { SprArgs::SprArgs() : kind(), attr(), blend(), target(), layer(), prio(), screen_trans(), screen_scale(), tex(), shader_name(), sprite_draw_param_index(), quad(), nb_quad(), flags(), next() { - Reset(); + init(); } - inline SprArgs::Quad* SprArgs::GetVertexArray() { + // 0x14063A110 + void SprArgs::draw(render_data_context& rend_data_ctx, const mat4& mat, + int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) { + drawObject(rend_data_ctx, mat, x_min, y_min, x_max, y_max, overlay_tex); + } + + // Inlined + inline SprArgs::Quad* SprArgs::getQuadArgs() { #if BREAK_SPRITE_VERTEX_LIMIT return string_quad + quad; #else @@ -266,11 +263,12 @@ namespace spr { #endif } - void SprArgs::Reset() { + // 0x14063CA10 + void SprArgs::init() { kind = SPR_KIND_NORMAL; id = {}; color = 0xFFFFFFFF; - attr = (SprAttr)0; + attr = (SPR_ATTR)0; blend = SPR_BLEND_DEFAULT; target = SPR_TARGET_DEFAULT; layer = SPR_LAYER_DEFAULT; @@ -302,18 +300,17 @@ namespace spr { next = 0; } - void SprArgs::SetRect(float_t x, float_t y, float_t width, float_t height) { - if (flags & TEXTURE_POS_SIZE) - return; - - enum_or(flags, TEXTURE_POS_SIZE); - rect.x = x; - rect.y = y; - rect.width = width; - rect.height = height; + // 0x14063EFE0 + void SprArgs::setChild(SprArgs* args) { + SprArgs* _args = this; + while (_args->next) + _args = _args->next; + _args->next = args; + args->kind = SPR_KIND_MULTI; } - void SprArgs::SetQuadArgs(SprArgs::Quad* quad_arg, size_t len) { + // 0x14063F040 + void SprArgs::setQuadArgs(const SprArgs::Quad* quad_arg, size_t len) { #if BREAK_SPRITE_VERTEX_LIMIT if (string_quad_idx + len >= string_quad_max_count) { while (string_quad_idx + len >= string_quad_max_count) @@ -340,172 +337,1213 @@ namespace spr { string_quad_idx += len; } - void SprArgs::SetSize(vec2 size) { + // 0x14063F0E0 + void SprArgs::setSize(vec2 in_size) { if (flags & SPRITE_SIZE) return; enum_or(flags, SPRITE_SIZE); - this->size.x = size.x; - this->size.y = size.y; - this->size.z = 0.0f; + size.x = in_size.x; + size.y = in_size.y; + size.z = 0.0f; } - void SprArgs::SetChild(SprArgs* args, SprArgs* next) { - while (args->next) - args = args->next; - args->next = next; - next->kind = SPR_KIND_MULTI; + // 0x14063F0A0 + void SprArgs::setRect(float_t x, float_t y, float_t width, float_t height) { + if (flags & TEXTURE_POS_SIZE) + return; + + enum_or(flags, TEXTURE_POS_SIZE); + rect.x = x; + rect.y = y; + rect.width = width; + rect.height = height; } - vec2 proj_sprite_3d_line(vec3 vec, bool offset) { - camera* cam = rctx_ptr->camera; + // Added + void SprArgs::addDraw(SprArgs* args_array[0x100], + const int32_t args_count, bool in_scale, SprArgsDraw& args_draw) { + SprArgs& args = *args_array[0]; + if (args.kind == SPR_KIND_MULTI) + return; - mat4_transform_point(&cam->view, &vec, &vec); - if (fabsf(vec.z) < 1.0e-10f) - return 0.0f; + const color4u8 color = args.color; - vec2 sc_vec = cam->depth * *(vec2*)&vec.x * (1.0f / vec.z); + if (in_scale) + args.correctResolution(); - ScreenParam& render_screen_param = get_render_screen_param(); - sc_vec.x = (float_t)render_screen_param.width * 0.5f - sc_vec.x; - sc_vec.y = (float_t)render_screen_param.height * 0.5f + sc_vec.y; - if (offset) { - ScreenParam& screen_param = get_screen_param(); - sc_vec.x = (float_t)render_screen_param.xoffset + sc_vec.x; - sc_vec.y = (float_t)(screen_param.height - - render_screen_param.yoffset - render_screen_param.height) + sc_vec.y; + vec3 spr_vtx[4] = {}; + SprArgs::TexParam tex_param[4] = {}; + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + std::vector& draw_param_buffer = render_data->draw_param_buffer; + std::vector& index_buffer = render_data->index_buffer; + + draw_param_buffer.push_back({}); + sprite_draw_param& draw_param = draw_param_buffer.back(); + + if (args.attr & M_SPR_ATTR_IGNORE_ALPHA) { + draw_param.attrib.m.enable_blend = 0; + draw_param.attrib.m.blend = 0; } - return sc_vec; + else { + draw_param.attrib.m.enable_blend = 1; + draw_param.attrib.m.blend = args_draw.blend; + } + + draw_param.shader_name = args_draw.shader_name; + if (draw_param.shader_name == SHADER_FT_FFP) + draw_param.shader_name = SHADER_FT_SPRITE; + + switch (args_draw.num_texture) { + case 0: + draw_param.attrib.m.vao = 0; + switch (args_draw.kind) { + case SPR_KIND_LINE: { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = 2ULL * args_count; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_LINES; + draw_param.first = (GLint)first; + draw_param.count = (GLint)count; + + vtx_data[0] = { spr_vtx[0], color }; + vtx_data[1] = { spr_vtx[2], color }; + vtx_data += 2; + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + const color4u8 color = args.color; + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + vtx_data[0] = { spr_vtx[0], color }; + vtx_data[1] = { spr_vtx[2], color }; + vtx_data += 2; + } + } break; + case SPR_KIND_RECT: { + sprite_vertex_data_uv0* vtx_data = 0; + size_t vtx_count = 4ULL * args_count; + size_t idx_count = 6ULL * args_count; + size_t start = render_data->AddData(vtx_data, vtx_count); + index_buffer.reserve(idx_count); + + draw_param.attrib.m.primitive = GL_TRIANGLES; + draw_param.start = (GLuint)start; + draw_param.end = (GLuint)(start + vtx_count - 1); + draw_param.count = (GLsizei)idx_count; + draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); + + vtx_data[0] = { spr_vtx[0], color }; // LB + vtx_data[1] = { spr_vtx[1], color }; // LT + vtx_data[2] = { spr_vtx[2], color }; // RT + vtx_data[3] = { spr_vtx[3], color }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + const color4u8 color = args.color; + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + vtx_data[0] = { spr_vtx[0], color }; // LB + vtx_data[1] = { spr_vtx[1], color }; // LT + vtx_data[2] = { spr_vtx[2], color }; // RT + vtx_data[3] = { spr_vtx[3], color }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + } + } break; + case SPR_KIND_LINE_BOX: { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = 5; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_LINE_STRIP; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + vtx_data[0] = { spr_vtx[0], color }; + vtx_data[1] = { spr_vtx[1], color }; + vtx_data[2] = { spr_vtx[2], color }; + vtx_data[3] = { spr_vtx[3], color }; + vtx_data[4] = { spr_vtx[0], color }; + + } break; + case SPR_KIND_LINES: { + if (args.nb_quad) { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = args.nb_quad & ~0x01; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_LINES; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad / 2; i; i--, vtx += 2, vtx_data += 2) { + vtx_data[0] = { vtx[0].pos, color }; + vtx_data[1] = { vtx[1].pos, color }; + } + } + else { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = 2; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_LINES; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + vtx_data[0] = { spr_vtx[0], color }; + vtx_data[1] = { spr_vtx[2], color }; + } + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + const color4u8 color = args.color; + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + if (args.nb_quad) { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = args.nb_quad & ~0x01; + render_data->AddData(vtx_data, count); + + draw_param.count += (GLsizei)count; + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad / 2; i; i--, vtx += 2, vtx_data += 2) { + vtx_data[0] = { vtx[0].pos, color }; + vtx_data[1] = { vtx[1].pos, color }; + } + } + else { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = 2; + render_data->AddData(vtx_data, count); + + draw_param.count += (GLsizei)count; + + vtx_data[0] = { spr_vtx[0], color }; + vtx_data[1] = { spr_vtx[2], color }; + + } + } + } break; + case SPR_KIND_POLY_LINE: { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = args.nb_quad; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_LINE_STRIP; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) + *vtx_data = { vtx->pos, color }; + } break; + case SPR_KIND_STRIP: { + sprite_vertex_data_uv0* vtx_data = 0; + size_t count = args.nb_quad; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_TRIANGLE_STRIP; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) + *vtx_data = { vtx->pos, vtx->color }; + + } break; + } + break; + case 1: + draw_param.texs[0] = tex_param[0].texture; + draw_param.attrib.m.sampler = 0; + draw_param.attrib.m.vao = 1; + + if (args.nb_quad) { + if (args_draw.kind == SPR_KIND_STRIP) { + draw_param.attrib.m.sampler = 1; + + sprite_vertex_data_uv1* vtx_data = 0; + size_t count = args.nb_quad; + size_t first = render_data->AddData(vtx_data, count); + + draw_param.attrib.m.primitive = GL_TRIANGLE_STRIP; + draw_param.first = (GLint)first; + draw_param.count = (GLsizei)count; + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) + *vtx_data = { vtx->pos, vtx->color, vtx->uv }; + } + else { + sprite_vertex_data_uv1* vtx_data = 0; + size_t vtx_count = args.nb_quad; + size_t idx_count = args.nb_quad / 4 * 6; + size_t start = render_data->AddData(vtx_data, vtx_count); + index_buffer.reserve(idx_count); + + draw_param.attrib.m.primitive = GL_TRIANGLES; + draw_param.start = (GLuint)start; + draw_param.end = (GLuint)(start + vtx_count - 1); + draw_param.count = (GLsizei)idx_count; + draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad / 4, j = 0; i; i--, j += 4, vtx += 4) { + vtx_data[0] = { vtx[0].pos, vtx[0].color, vtx[0].uv }; // LB + vtx_data[1] = { vtx[1].pos, vtx[1].color, vtx[1].uv }; // LT + vtx_data[2] = { vtx[2].pos, vtx[2].color, vtx[2].uv }; // RT + vtx_data[3] = { vtx[3].pos, vtx[3].color, vtx[3].uv }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + j + 0)); // LB + index_buffer.push_back((uint32_t)(start + j + 1)); // LT + index_buffer.push_back((uint32_t)(start + j + 3)); // RB + index_buffer.push_back((uint32_t)(start + j + 1)); // LT + index_buffer.push_back((uint32_t)(start + j + 2)); // RT + index_buffer.push_back((uint32_t)(start + j + 3)); // RB + } + start += args.nb_quad; + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + size_t vtx_count = args.nb_quad; + size_t idx_count = args.nb_quad / 4 * 6; + + draw_param.end += (GLuint)vtx_count; + draw_param.count += (GLsizei)idx_count; + + render_data->AddData(vtx_data, vtx_count); + index_buffer.reserve(idx_count); + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + SprArgs::Quad* vtx = args.getQuadArgs(); + for (size_t i = args.nb_quad / 4, j = 0; i; i--, j += 4, vtx += 4) { + + vtx_data[0] = { vtx[0].pos, vtx[0].color, vtx[0].uv }; // LB + vtx_data[1] = { vtx[1].pos, vtx[1].color, vtx[1].uv }; // LT + vtx_data[2] = { vtx[2].pos, vtx[2].color, vtx[2].uv }; // RT + vtx_data[3] = { vtx[3].pos, vtx[3].color, vtx[3].uv }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + j + 0)); // LB + index_buffer.push_back((uint32_t)(start + j + 1)); // LT + index_buffer.push_back((uint32_t)(start + j + 3)); // RB + index_buffer.push_back((uint32_t)(start + j + 1)); // LT + index_buffer.push_back((uint32_t)(start + j + 2)); // RT + index_buffer.push_back((uint32_t)(start + j + 3)); // RB + } + start += args.nb_quad; + } + } + } + else { + sprite_vertex_data_uv1* vtx_data = 0; + size_t vtx_count = 4ULL * args_count; + size_t idx_count = 6ULL * args_count; + size_t start = render_data->AddData(vtx_data, vtx_count); + index_buffer.reserve(idx_count); + + draw_param.attrib.m.primitive = GL_TRIANGLES; + draw_param.start = (GLuint)start; + draw_param.end = (GLuint)(start + vtx_count - 1); + draw_param.count = (GLsizei)idx_count; + draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); + + vtx_data[0] = { spr_vtx[0], color, tex_param[0].uv[0] }; // LB + vtx_data[1] = { spr_vtx[1], color, tex_param[0].uv[1] }; // LT + vtx_data[2] = { spr_vtx[2], color, tex_param[0].uv[2] }; // RT + vtx_data[3] = { spr_vtx[3], color, tex_param[0].uv[3] }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + const color4u8 color = args.color; + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + vtx_data[0] = { spr_vtx[0], color, tex_param[0].uv[0] }; // LB + vtx_data[1] = { spr_vtx[1], color, tex_param[0].uv[1] }; // LT + vtx_data[2] = { spr_vtx[2], color, tex_param[0].uv[2] }; // RT + vtx_data[3] = { spr_vtx[3], color, tex_param[0].uv[3] }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + } + } + break; + case 2: { + draw_param.texs[0] = tex_param[0].texture; + draw_param.texs[1] = tex_param[1].texture; + draw_param.attrib.m.sampler = 2; + draw_param.attrib.m.vao = 2; + + sprite_vertex_data_uv2* vtx_data = 0; + size_t vtx_count = 4ULL * args_count; + size_t idx_count = 6ULL * args_count; + size_t start = render_data->AddData(vtx_data, vtx_count); + index_buffer.reserve(idx_count); + + draw_param.attrib.m.primitive = GL_TRIANGLES; + draw_param.start = (GLuint)start; + draw_param.end = (GLuint)(start + vtx_count - 1); + draw_param.count = (GLsizei)idx_count; + draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); + + vtx_data[0] = { spr_vtx[0], color, + tex_param[0].uv[0], tex_param[1].uv[0] }; // LB + vtx_data[1] = { spr_vtx[1], color, + tex_param[0].uv[1], tex_param[1].uv[1] }; // LT + vtx_data[2] = { spr_vtx[2], color, + tex_param[0].uv[2], tex_param[1].uv[2] }; // RT + vtx_data[3] = { spr_vtx[3], color, + tex_param[0].uv[3], tex_param[1].uv[3] }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + + for (int32_t i = 1; i < args_count; i++) { + SprArgs& args = *args_array[i]; + + const color4u8 color = args.color; + + if (in_scale) + args.correctResolution(); + + args.calcTextureVertex(spr_vtx, tex_param, in_scale); + + vtx_data[0] = { spr_vtx[0], color, + tex_param[0].uv[0], tex_param[1].uv[0] }; // LB + vtx_data[1] = { spr_vtx[1], color, + tex_param[0].uv[1], tex_param[1].uv[1] }; // LT + vtx_data[2] = { spr_vtx[2], color, + tex_param[0].uv[2], tex_param[1].uv[2] }; // RT + vtx_data[3] = { spr_vtx[3], color, + tex_param[0].uv[3], tex_param[1].uv[3] }; // RB + vtx_data += 4; + + index_buffer.push_back((uint32_t)(start + 0)); // LB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 3)); // RB + index_buffer.push_back((uint32_t)(start + 1)); // LT + index_buffer.push_back((uint32_t)(start + 2)); // RT + index_buffer.push_back((uint32_t)(start + 3)); // RB + start += 4; + } + } break; + } + + if (!draw_param.count) { + draw_param_buffer.pop_back(); + + args.sprite_draw_param_index = -1; + } + else { + if (args_draw.blend == SPR_BLEND_OVERLAY) { + draw_param.vtx[0] = spr_vtx[0]; + draw_param.vtx[1] = spr_vtx[1]; + draw_param.vtx[2] = spr_vtx[2]; + draw_param.vtx[3] = spr_vtx[3]; + } + + args.sprite_draw_param_index = (int32_t)(draw_param_buffer.size() - 1); + } + + for (int32_t i = 1; i < args_count; i++) + args_array[i]->sprite_draw_param_index = -1; } - void put_cross(const mat4& mat, color4u8 color_x, color4u8 color_y, color4u8 color_z) { - vec3 v5 = { 0.0f, 0.0f, 0.0f }; - vec3 v6; - mat4_transform_point(&mat, &v5, &v6); + // 0x140638CD0 + int32_t SprArgs::calcTexture(SprArgs::TexParam* param, vec3 vertex[4], bool in_scale) { + SprArgs* args = this; + int32_t tex_param_count = 0; + const texture* tex = args->tex; + while (args) { + param->texture = args->tex; - vec3 v7 = v6; + float_t width = (float_t)args->tex->width; + float_t height = (float_t)args->tex->height; - v5 = { 1.0f, 0.0f, 0.0f }; - mat4_transform_point(&mat, &v5, &v6); - put_sprite_3d_line(v7, v6, color_x); + float_t u_scale = 1.0f / width; + float_t v_scale = 1.0f / height; - v5 = { 0.0f, 1.0f, 0.0f }; - mat4_transform_point(&mat, &v5, &v6); - put_sprite_3d_line(v7, v6, color_y); + if (!args->nb_quad) { + vec2 uv00; + vec2 uv01; + vec2 uv10; + vec2 uv11; + if (args->kind == SPR_KIND_MULTI) { + vec3 v42[4]; + mat4 mat; + args->calcVertex(v42, &mat, in_scale); + mat4_invert(&mat, &mat); + mat4_transform_point(&mat, &vertex[0], &v42[0]); + mat4_transform_point(&mat, &vertex[1], &v42[1]); + mat4_transform_point(&mat, &vertex[2], &v42[2]); + mat4_transform_point(&mat, &vertex[3], &v42[3]); + uv00 = *(vec2*)&v42[0].x; + uv01 = *(vec2*)&v42[1].x; + uv10 = *(vec2*)&v42[2].x; + uv11 = *(vec2*)&v42[3].x; + } + else { + uv00.x = 0.0f; + uv00.y = 0.0f; + uv01.x = 0.0f; + uv01.y = args->rect.height; + uv10.x = args->rect.width; + uv10.y = args->rect.height; + uv11.x = args->rect.width; + uv11.y = 0.0f; + } - v5 = { 0.0f, 0.0f, 1.0f }; - mat4_transform_point(&mat, &v5, &v6); - put_sprite_3d_line(v7, v6, color_z); + const float_t rect_x = args->rect.x; + const float_t rect_y = args->rect.y; + param->uv[0].x = (uv00.x + rect_x) * u_scale; + param->uv[0].y = (height - (uv00.y + rect_y)) * v_scale; + param->uv[1].x = (uv01.x + rect_x) * u_scale; + param->uv[1].y = (height - (uv01.y + rect_y)) * v_scale; + param->uv[2].x = (uv10.x + rect_x) * u_scale; + param->uv[2].y = (height - (uv10.y + rect_y)) * v_scale; + param->uv[3].x = (uv11.x + rect_x) * u_scale; + param->uv[3].y = (height - (uv11.y + rect_y)) * v_scale; + } + else if (in_scale) { + SprArgs::Quad* quad = args->getQuadArgs(); + for (size_t i = args->nb_quad; i; i--, quad++) { + quad->uv.x = quad->uv.x * u_scale; + quad->uv.y = (height - quad->uv.y) * v_scale; + } + } + + args = args->next; + param++; + tex_param_count++; + } + return tex_param_count; } - void put_rgb_cross(const mat4& mat) { - put_cross(mat, color_red, color_green, color_blue); + // Added + int32_t SprArgs::calcTextureVertex(vec3 vtx[4], SprArgs::TexParam* param, bool in_scale) { + vec3 _vtx[4] = {}; + if (flags & SPRITE_SIZE) + calcVertex(_vtx, 0, in_scale); + + int32_t tex_param_count = 0; + if ((flags & TEXTURE_POS_SIZE) && tex) + tex_param_count = calcTexture(param, _vtx, in_scale); + vtx[0] = _vtx[0]; + vtx[1] = _vtx[1]; + vtx[2] = _vtx[2]; + vtx[3] = _vtx[3]; + return tex_param_count; } - SprArgs* put_sprite(const SprArgs& args, const sprite_database* spr_db) { - return sprite_manager->PutSprite(args, spr_db); + // 0x140639150 + void SprArgs::calcVertex(vec3 vertex[4], mat4* trans_matrix, bool in_scale) { + vertex[0].x = 0.0f; + vertex[0].y = 0.0f; + vertex[0].z = 0.0f; + vertex[1].x = 0.0f; + vertex[1].y = size.y; + vertex[1].z = 0.0f; + vertex[2].x = size.x; + vertex[2].y = size.y; + vertex[2].z = 0.0f; + vertex[3].x = size.x; + vertex[3].y = 0.0f; + vertex[3].z = 0.0f; + + mat4 m; + SPR_ATTR attr = this->attr; + if (!(attr & M_SPR_ATTR_NOTRANSFORM)) { + if (attr & M_SPR_ATTR_CTR_ALL) { + if (attr & M_SPR_ATTR_CTR_LT) + anchor = 0.0f; + else if (attr & M_SPR_ATTR_CTR_LC) { + anchor.x = 0.0f; + anchor.y = size.y * 0.5f; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_LB) { + anchor.x = 0.0f; + anchor.y = size.y; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_CT) { + anchor.x = size.x * 0.5f; + anchor.y = 0.0f; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_CC) { + anchor.x = size.x * 0.5f; + anchor.y = size.y * 0.5f; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_CB) { + anchor.x = size.x * 0.5f; + anchor.y = size.y; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_RT) { + anchor.x = size.x; + anchor.y = 0.0f; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_RC) { + anchor.x = size.x; + anchor.y = size.y * 0.5f; + anchor.z = 0.0f; + } + else if (attr & M_SPR_ATTR_CTR_RB) { + anchor.x = size.x; + anchor.y = size.y; + anchor.z = 0.0f; + } + } + + if (in_scale) { + if (attr & M_SPR_ATTR_FLIP_H) { + scale.x = -scale.x; + rot.z = -rot.z; + } + if (attr & M_SPR_ATTR_FLIP_V) { + scale.y = -scale.y; + rot.z = -rot.z; + } + } + + if (fabsf(slant) > 0.000001f) { + float_t skew_width = tanf(slant) * size.y * 0.5f; + vertex[0].x = vertex[0].x + skew_width; + vertex[1].x = vertex[1].x - skew_width; + vertex[2].x = vertex[2].x - skew_width; + vertex[3].x = vertex[3].x + skew_width; + } + + if (fabsf(shear) > 0.000001f) { + float_t skew_height = tanf(shear) * size.x * 0.5f; + vertex[0].y = vertex[0].y - skew_height; + vertex[1].y = vertex[1].y - skew_height; + vertex[2].y = vertex[2].y + skew_height; + vertex[3].y = vertex[3].y + skew_height; + } + + mat4_translate(&trans, &m); + if (fabsf(rot.x) > 0.000001f) + mat4_mul_rotate_x(&m, rot.x, &m); + if (fabsf(rot.y) > 0.000001f) + mat4_mul_rotate_y(&m, rot.y, &m); + if (fabsf(rot.z) > 0.000001f) + mat4_mul_rotate_z(&m, rot.z, &m); + mat4_scale_rot(&m, &scale, &m); + const vec3 anchor = -anchor; + mat4_mul_translate(&m, &anchor, &m); + } + else { + mat4_translate(&trans, &m); + mat4_scale_rot(&m, &scale, &m); + } + + mat4_mul(&matrix, &m, &m); + + mat4_transform_point(&m, &vertex[0], &vertex[0]); + mat4_transform_point(&m, &vertex[1], &vertex[1]); + mat4_transform_point(&m, &vertex[2], &vertex[2]); + mat4_transform_point(&m, &vertex[3], &vertex[3]); + + if (trans_matrix) + *trans_matrix = m; } - 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); - put_sprite_line(sc_p1, sc_p2, SCREEN_MODE_MAX, SPR_PRIO_DW, color, SPR_LAYER_DEFAULT); + // 0x140639CC0 + void SprArgs::correctResolution() { + SprArgs* args = this; + SPR_TARGET target = args->target; + SCREEN_MODE screen_mode = get_screen_param().mode; + while (args) { + screen_mode_scale_data data(args->screen_trans, screen_mode); + if (args->screen_trans != SCREEN_MODE_MAX + && args->screen_trans != screen_mode && (target < SPR_TARGET_FRONT_3D_SURF || target > SPR_TARGET_BACK)) { + float_t scale_x = data.scale.x; + float_t scale_y = data.scale.y; + float_t src_res_x = data.src_res.x; + float_t src_res_y = data.src_res.y; + float_t dst_res_x = data.dst_res.x; + float_t dst_res_y = data.dst_res.y; + args->trans.x = (args->trans.x - src_res_x) * scale_x + src_res_x; + args->trans.y = (args->trans.y - src_res_y) * scale_y + src_res_y; + args->trans.z = args->trans.z * scale_y; + + SprArgs::Quad* vtx = args->getQuadArgs(); + for (size_t i = args->nb_quad; 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; + } + } + + if (args->screen_scale != SCREEN_MODE_MAX) { + vec2 scale = get_screen_conv_scale(screen_mode, args->screen_scale); + args->scale.x = scale.x * args->scale.x; + args->scale.y = scale.y * args->scale.y; + } + args = args->next; + } } - void put_sprite_line(vec2 p1, vec2 p2, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer) { + // Inlined + inline void SprArgs::drawObject(render_data_context& rend_data_ctx, const mat4& mat, + int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) { + sprite_draw_param& draw_param = render_data->draw_param_buffer.data()[sprite_draw_param_index]; + + int32_t combiner = 0; + if (draw_param.attrib.m.enable_blend) { + if (draw_param.attrib.m.blend == SPR_BLEND_OVERLAY) { + rend_data_ctx.state.active_bind_texture_2d(7, overlay_tex->glid); + drawObjectCopyOverlayTex(rend_data_ctx, + mat, draw_param.vtx, x_min, y_min, x_max, y_max); + combiner = 2; + } + else + combiner = draw_param.attrib.m.blend == SPR_BLEND_MODULATE ? 1 : 0; + + const GLenum* blend = blend_table[draw_param.attrib.m.blend]; + + rend_data_ctx.state.enable_blend(); + rend_data_ctx.state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]); + } + else + rend_data_ctx.state.disable_blend(); + + if (draw_param.shader_name == SHADER_FT_SPRITE) { + int32_t tex_0_type = 0; + int32_t tex_1_type = 0; + if (draw_param.texs[0]) { + if (draw_param.texs[0]->internal_format == GL_COMPRESSED_RED_RGTC1) + tex_0_type = 3; + else if (draw_param.texs[0]->internal_format == GL_COMPRESSED_RG_RGTC2) + tex_0_type = 2; + else + tex_0_type = 1; + + if (draw_param.texs[1]) { + if (draw_param.texs[1]->internal_format == GL_COMPRESSED_RED_RGTC1) + tex_1_type = 3; + else if (draw_param.texs[1]->internal_format == GL_COMPRESSED_RG_RGTC2) + tex_1_type = 2; + else + tex_1_type = 1; + } + } + + rend_data_ctx.shader_flags.arr[U_TEX_0_TYPE] = tex_0_type; + rend_data_ctx.shader_flags.arr[U_TEX_1_TYPE] = tex_1_type; + rend_data_ctx.shader_flags.arr[U_COMBINER] = combiner; + } + + shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, draw_param.shader_name); + if (draw_param.texs[0]) { + rend_data_ctx.state.active_bind_texture_2d(0, draw_param.texs[0]->glid); + rend_data_ctx.state.bind_sampler(0, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); + + if (draw_param.texs[1]) { + rend_data_ctx.state.active_bind_texture_2d(1, draw_param.texs[1]->glid); + rend_data_ctx.state.bind_sampler(1, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); + } + else + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); + } + else { + rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); + rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); + } + + rend_data_ctx.state.bind_vertex_array(render_data->vao[draw_param.attrib.m.vao]); + if (draw_param.attrib.m.primitive != GL_TRIANGLES) + rend_data_ctx.state.draw_arrays( + draw_param.attrib.m.primitive, draw_param.first, draw_param.count); + else + rend_data_ctx.state.draw_range_elements( + draw_param.attrib.m.primitive, draw_param.start, draw_param.end, + draw_param.count, GL_UNSIGNED_INT, (void*)draw_param.offset); + } + + // Added + void SprArgs::drawObjectCopyOverlayTex(render_data_context& rend_data_ctx, const mat4& mat, + const vec3 vertex[4], int32_t over_x_min, int32_t over_y_min, int32_t over_x_max, int32_t over_y_max) { + if (nb_quad || kind != SPR_KIND_NORMAL) + return; + + mat4 mat_t; + mat4_transpose(&mat, &mat_t); + + float_t x_min_coord = 0.0f; + float_t y_min_coord = 0.0f; + float_t x_max_coord = 0.0f; + float_t y_max_coord = 0.0f; + for (int32_t i = 0, j = 0; i < 4; i++) { + vec4 v; + *(vec3*)&v = vertex[i]; + v.w = 1.0f; + + const float_t w = vec4::dot(mat_t.row3, v); + if (w * w <= 0.0001f) + continue; + + const float_t x_coord = vec4::dot(mat_t.row0, v) * (1.0f / w); + const float_t y_coord = vec4::dot(mat_t.row1, v) * (1.0f / w); + if (j) { + if (x_min_coord > x_coord) + x_min_coord = x_coord; + else if (x_max_coord < x_coord) + x_max_coord = x_coord; + + if (y_min_coord > y_coord) + y_min_coord = y_coord; + else if (y_max_coord < y_coord) + y_max_coord = y_coord; + } + else { + x_min_coord = x_coord; + x_max_coord = x_coord; + y_min_coord = y_coord; + y_max_coord = y_coord; + } + j++; + } + + int32_t x_max = (int32_t)x_max_coord + 1; + int32_t y_max = (int32_t)y_max_coord + 1; + int32_t x_min = (int32_t)x_min_coord - 1; + int32_t y_min = (int32_t)y_min_coord - 1; + + x_max = clamp_def(x_max, over_x_min, over_x_min + over_x_max - 1); + y_max = clamp_def(y_max, over_y_min, over_y_min + over_y_max - 1); + x_min = clamp_def(x_min, over_x_min, over_x_min + over_x_max - 1); + y_min = clamp_def(y_min, over_y_min, over_y_min + over_y_max - 1); + + const int32_t width = x_max - x_min + 1; + const int32_t height = y_max - y_min + 1; + if (width * height > 0) { + rend_data_ctx.state.active_texture(7); + rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, + 0, x_min, y_min, x_min, y_min, width, height); + } + } + + // 0x14063F860 + void dest() { + SprMgr::sprmgr().dest(); + } + + // Added + void dest(const SprDb* spr_db) { + SprMgr::sprmgr().dest(spr_db); + } + + // 0x14063F870 + void flush(render_data_context& rend_data_ctx, + SPR_TARGET target, bool in_scale, texture* overlay_tex, const mat4& vp) { + SprMgr::sprmgr().flush(rend_data_ctx, target, in_scale, overlay_tex, vp); + } + + // 0x14063F890 + void free(const std::vector& setids, const SprDb* spr_db) { + for (uint32_t setid : setids) + free(setid, spr_db); + } + + // 0x14063F8D0 + void free(uint32_t setid, const SprDb* spr_db) { + SprMgr::sprmgr().free(spr_db->getSetIdFromUid(setid)); + } + + // Added + void freeModern(const std::vector& sethashes, SprDb* spr_db) { + for (uint32_t sethash : sethashes) + freeModern(sethash, spr_db); + } + + // Added + void freeModern(uint32_t sethash, SprDb* spr_db) { + SprMgr::sprmgr().freeModern(spr_db->getSetIdFromUid(sethash), spr_db); + } + + // 0x14063F900 + const char* getName(uint32_t uid, const SprDb* spr_db) { + return SprMgr::sprmgr().getName(spr_db->getSprIdFromUid(uid)); + } + + // 0x14063FA90 + size_t getObjListCount(SPR_TARGET target) { + return SprMgr::sprmgr().getObjListCount(target); + } + + // 0x14063FAF0 + bool getReady(uint32_t setid, const SprDb* spr_db) { + return SprMgr::sprmgr().getReady(spr_db->getSetIdFromUid(setid)); + } + + // 0x14063F930 + const SprArgs::Rect getRect(uint32_t uid, const SprDb* spr_db) { + return SprMgr::sprmgr().getRect(spr_db->getSprIdFromUid(uid)); + } + + // 0x14063F9A0 + uint32_t getSprNum(uint32_t setid, const SprDb* spr_db) { + return SprMgr::sprmgr().getSprNum(spr_db->getSetIdFromUid(setid)); + } + + // 0x14063F9D0 + SPR_TARGET getTarget() { + return SprMgr::sprmgr().getTarget(); + } + + // 0x14063F9E0 + uint32_t getTexNum(uint32_t setid, const SprDb* spr_db) { + return SprMgr::sprmgr().getTexNum(spr_db->getSetIdFromUid(setid)); + } + + // Inlined + const texture* getTexture(uint32_t uid, const SprDb* spr_db) { + return SprMgr::sprmgr().getTexture(spr_db->getSprIdFromUid(uid)); + } + + // 0x14063FA10 + void getViewport(SCREEN_MODE& screen, rectangle& rect, SPR_LAYER layer) { + SprMgr::sprmgr().getViewport(screen, rect, layer); + } + + // 0x14063FB20 + void init() { + SprMgr::sprmgr().init(); + } + + // Added + void init(const SprDb* spr_db) { + SprMgr::sprmgr().init(spr_db); + } + + // Missing + void putGlutFont(SprArgs args, const SprDb* spr_db) { + args.kind = SPR_KIND_GLUT; + SprMgr::sprmgr().put(args, spr_db); + } + + // Added + void postFlush() { + spr::SprMgr::sprmgr().postFlush(); + } + + // Added + void preFlush() { + spr::SprMgr::sprmgr().preFlush(); + } + + // 0x14063FC40 + SprArgs* putLine(vec2 p0, vec2 p1, SCREEN_MODE screen, SPR_PRIO prio, color4u8 color, SPR_LAYER layer) { SprArgs args; - args.trans.x = p1.x; - args.trans.y = p1.y; + args.trans.x = p0.x; + args.trans.y = p0.y; args.trans.z = 0.0f; args.layer = layer; args.kind = SPR_KIND_LINE; - args.screen_trans = screen_mode; - args.screen_scale = screen_mode; + args.screen_trans = screen; + args.screen_scale = screen; args.prio = prio; args.color = color; - args.SetSize({ p2.x - p1.x, p2.y - p1.y }); - enum_or(args.attr, SPR_ATTR_NOTRANSFORM); - sprite_manager->PutSprite(args, 0); + args.setSize({ p1.x - p0.x, p1.y - p0.y }); + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + return SprMgr::sprmgr().put(args, 0); } - void put_sprite_poly_line(vec2* points, size_t count, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer) { - SprArgs args; - args.kind = SPR_KIND_POLY_LINE; - args.layer = layer; - args.screen_trans = screen_mode; - args.screen_scale = screen_mode; - args.prio = prio; - args.color = color; - - std::vector quad; - quad.reserve(count); - - for (size_t i = 0; i < count; i++, points++) { - SprArgs::Quad vert = {}; - *(vec2*)&vert.pos = *points; - quad.push_back(vert); - } - - args.SetQuadArgs(quad.data(), quad.size()); - sprite_manager->PutSprite(args, 0); - } - - void put_sprite_line_box(rectangle rect, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer) { + // 0x14063FD60 + void putLineBox(rectangle rect, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer) { 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_LINE_BOX; - args.screen_trans = screen_mode; - args.screen_scale = screen_mode; + args.screen_trans = screen; + args.screen_scale = screen; args.prio = prio; args.color = color; - args.SetSize(rect.size); - enum_or(args.attr, SPR_ATTR_NOTRANSFORM); - sprite_manager->PutSprite(args, 0); + args.setSize(rect.size); + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + SprMgr::sprmgr().put(args, 0); } - void put_sprite_rect(rectangle rect, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer) { + // 0x14063FE60 + spr::SprArgs* putLines(const vec2* pos_arg, size_t len, SCREEN_MODE screen, + spr::SPR_PRIO prio, color4u8 color, spr::SPR_LAYER layer) { + if (use_quad_line) { + spr::SprArgs args; + args.kind = SPR_KIND_LINES; + args.layer = layer; + args.screen_trans = screen; + args.screen_scale = screen; + args.prio = prio; + args.color = (color4u8_bgra)(color.b | ((color.g | ((color.r | (color.a << 8)) << 8)) << 8)); + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + + std::vector quads; + for (size_t i = 0; i < len; i++) { + spr::SprArgs::Quad quad; + quad.pos.x = pos_arg[0].x; + quad.pos.y = pos_arg[0].y; + quads.push_back(quad); + quad.pos.x = pos_arg[1].x; + quad.pos.y = pos_arg[1].x; + quads.push_back(quad); + pos_arg += 2; + } + + args.setQuadArgs(quads.data(), quads.size()); + SprMgr::sprmgr().put(args, 0); + } + else + for (size_t i = 0; i < len; i++) { + spr::SprArgs args; + args.kind = SPR_KIND_LINES; + args.layer = layer; + args.screen_trans = screen; + args.screen_scale = screen; + args.prio = prio; + args.color = color; + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + + args.trans.x = pos_arg[0].x; + args.trans.y = pos_arg[0].y; + args.trans.z = 0.0f; + args.setSize(pos_arg[1] - pos_arg[0]); + SprMgr::sprmgr().put(args, 0); + pos_arg += 2; + } + return 0; + } + + // 0x140640590 + void putMask() { + putRect({ 0.0f, 0.0f, 1280.0f, 64.0f }, SCREEN_MODE_WXGA, SPR_PRIO_DEFAULT, color_black); + putRect({ 0.0f, 704.0f, 1280.0f, 64.0f }, SCREEN_MODE_WXGA, SPR_PRIO_DEFAULT, color_black); + } + + // 0x140640610 + SprArgs* putObject(const SprArgs& args, const SprDb* spr_db) { + SprArgs _args = args; + if (args.kind == SPR_KIND_NORMAL) + _args.id = spr_db->getSprIdFromUid(args.id.w); + return SprMgr::sprmgr().put(_args, spr_db); + } + + // 0x140640740 + SprArgs* put(const SprArgs& args, const SprDb* spr_db) { + return SprMgr::sprmgr().put(args, spr_db); + } + + // 0x140640750 + void putPolyLine(const vec2* pos_arg, size_t len, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer) { + SprArgs args; + args.kind = SPR_KIND_POLY_LINE; + args.layer = layer; + args.screen_trans = screen; + args.screen_scale = screen; + args.prio = prio; + args.color = color; + + std::vector quad; + quad.reserve(len); + + for (size_t i = 0; i < len; i++, pos_arg++) { + SprArgs::Quad vert = {}; + *(vec2*)&vert.pos = *pos_arg; + quad.push_back(vert); + } + + args.setQuadArgs(quad.data(), quad.size()); + SprMgr::sprmgr().put(args, 0); + } + + // 0x140640B50 + void putRect(rectangle rect, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer) { 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.screen_trans = screen_mode; - args.screen_scale = screen_mode; + args.screen_trans = screen; + args.screen_scale = screen; args.prio = prio; args.color = color; - args.SetSize(rect.size); - enum_or(args.attr, SPR_ATTR_NOTRANSFORM); - sprite_manager->PutSprite(args, 0); + args.setSize(rect.size); + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + SprMgr::sprmgr().put(args, 0); } - void put_sprite_strip(SprArgs::Quad* vert, size_t num, SCREEN_MODE screen_mode, - SprPrio prio, int32_t spr_id, SprLayer layer, const sprite_database* spr_db) { + // 0x140640C50 + void putStrip(const SprArgs::Quad* quad_arg, size_t len, SCREEN_MODE screen, + SPR_PRIO prio, uint32_t spr_id, SPR_LAYER layer, const SprDb* spr_db) { SprArgs args; args.layer = layer; args.kind = SPR_KIND_STRIP; - args.screen_trans = screen_mode; - args.screen_scale = screen_mode; + args.screen_trans = screen; + args.screen_scale = screen; args.prio = prio; - args.color = vert[0].color; + args.color = quad_arg[0].color; if (spr_id != -1) - args.id.info = spr_db->get_spr_by_id(spr_id)->info; - enum_or(args.attr, SPR_ATTR_NOTRANSFORM); - args.SetQuadArgs(vert, num); - sprite_manager->PutSprite(args, spr_db); + args.id = spr_db->getSprIdFromUid(spr_id); + enum_or(args.attr, M_SPR_ATTR_NOTRANSFORM); + args.setQuadArgs(quad_arg, len); + SprMgr::sprmgr().put(args, spr_db); + } + + // 0x140640D40 + void refresh() { + SprMgr::sprmgr().refresh(); + } + + // 0x140640D50 + void request(const std::vector& setids, + const std::string mdata_dir, void* data, const SprDb* spr_db) { + for (uint32_t setid : setids) + request(setid, mdata_dir, data, spr_db); + } + + // 0x140640E10 + void request(uint32_t setid, const std::string mdata_dir, void* data, const SprDb* spr_db) { + SprMgr::sprmgr().request(spr_db->getSetIdFromUid(setid), + spr_db->getSetFileFromUid(setid), mdata_dir, data); + } + + // Added + void requestModern(const std::vector& sethashes, void* data, SprDb* spr_db) { + for (uint32_t sethash : sethashes) + requestModern(sethash, data, spr_db); + } + + // Added + void requestModern(uint32_t sethash, void* data, SprDb* spr_db) { + SprMgr::sprmgr().requestModern(spr_db->getSetIdFromUid(sethash), sethash, data, spr_db); + } + + void setProjection(SPR_LAYER layer, float_t aspect) { + SprMgr::sprmgr().setProjection(layer, aspect); + } + + // 0x140640F10 + void setTarget(SPR_TARGET in_target) { + SprMgr::sprmgr().setTarget(in_target); + } + + // 0x140640F20 + void setViewport(SPR_LAYER layer, SCREEN_MODE screen, const rectangle rect) { + SprMgr::sprmgr().setViewport(layer, screen, rect); + } + + // 0x140640F50 + bool wait(const std::vector& setids, const SprDb* spr_db) { + bool ret = false; + for (uint32_t setid : setids) + if (wait(setid, spr_db)) + ret = true; + return ret; + } + + // 0x140640FB0 + bool wait(uint32_t setid, const SprDb* spr_db) { + return SprMgr::sprmgr().wait(spr_db->getSetIdFromUid(setid)); + } + + // Added + bool waitModern(const std::vector& sethashes, SprDb* spr_db) { + bool ret = false; + for (uint32_t sethash : sethashes) + if (waitModern(sethash, spr_db)) + ret = true; + return ret; + } + + // Added + bool waitModern(uint32_t sethash, SprDb* spr_db) { + return SprMgr::sprmgr().waitModern(spr_db->getSetIdFromUid(sethash), spr_db); } } void sprite_manager_init() { - if (!sprite_manager) - sprite_manager = new spr::SpriteManager; + if (!spr::SprMgr::p_sprmgr) + spr::SprMgr::p_sprmgr = new spr::SprMgr; + + if (!spr::render_data) + spr::render_data = new spr::RenderData; #if BREAK_SPRITE_VERTEX_LIMIT if (!string_quad) @@ -513,127 +1551,26 @@ void sprite_manager_init() { #endif } -void sprite_manager_add_spr_sets(const sprite_database* spr_db) { - sprite_manager->AddSprSets(spr_db); +void sprite_manager_add_spr_sets(const SprDb* spr_db) { + spr::SprMgr::sprmgr().init(spr_db); } -void sprite_manager_clear() { - sprite_manager->Clear(); -} - -void sprite_manager_draw(render_data_context& rend_data_ctx, - int32_t index, bool font, texture* overlay_tex, const mat4& vp) { - sprite_manager->Draw(rend_data_ctx, index, font, overlay_tex, vp); -} - -spr::SprTarget sprite_manager_get_target() { - return sprite_manager->target; -} - -size_t sprite_manager_get_reqlist_count(int32_t index) { - size_t count = 0; - for (const auto& i : sprite_manager->reqlist[index]) - for (const auto& j : i) - count += j.size(); - return count; -} - -::spr_set* sprite_manager_get_set(uint32_t spr_id, const sprite_database* spr_db) { - SprSet* set = sprite_manager->GetSet(spr_db->get_spr_set_by_id(spr_id)->index); +::spr_set* sprite_manager_get_set(uint32_t spr_id, const SprDb* spr_db) { + const SPRSET* set = spr::SprMgr::sprmgr().find(spr_db->getSetIdFromUid(spr_id)); if (set) return set->spr_set; return 0; } -bool sprite_manager_get_set_ready(uint32_t set_id, const sprite_database* spr_db) { - return sprite_manager->GetSetReady(spr_db->get_spr_set_by_id(set_id)->index); -} - -uint32_t sprite_manager_get_set_sprite_num(uint32_t set_id, const sprite_database* spr_db) { - return sprite_manager->GetSetSpriteNum(spr_db->get_spr_set_by_id(set_id)->index); -} - -uint32_t sprite_manager_get_set_texture_num(uint32_t set_id, const sprite_database* spr_db) { - return sprite_manager->GetSetTextureNum(spr_db->get_spr_set_by_id(set_id)->index); -} - -const char* sprite_manager_get_spr_name(uint32_t spr_id, const sprite_database* spr_db) { - return sprite_manager->GetSprName(spr_db->get_spr_by_id(spr_id)->info); -} - -rectangle sprite_manager_get_spr_rectangle(uint32_t spr_id, const sprite_database* spr_db) { - return sprite_manager->GetSprRectangle(spr_db->get_spr_by_id(spr_id)->info); -} - -texture* sprite_manager_get_spr_texture(uint32_t spr_id, const sprite_database* spr_db) { - return sprite_manager->GetSprTexture(spr_db->get_spr_by_id(spr_id)->info); -} - -bool sprite_manager_load_file(uint32_t set_id, const sprite_database* spr_db) { - return sprite_manager->LoadFile(spr_db->get_spr_set_by_id(set_id)->index); -} - -bool sprite_manager_load_file_modern(uint32_t set_hash, sprite_database* spr_db) { - return sprite_manager->LoadFileModern(spr_db->get_spr_set_by_id(set_hash)->index, spr_db); -} - -void sprite_manager_post_draw() { - sprite_manager->PostDraw(); -} - -void sprite_manager_pre_draw() { - sprite_manager->PreDraw(); -} - -void sprite_manager_read_file(uint32_t set_id, - std::string& mdata_dir, void* data, const sprite_database* spr_db) { - const spr_db_spr_set* spr_set = spr_db->get_spr_set_by_id(set_id); - sprite_manager->ReadFile(spr_set->index, spr_set->file_name.c_str(), mdata_dir, data); -} - -void sprite_manager_read_file(uint32_t set_id, - std::string&& mdata_dir, void* data, const sprite_database* spr_db) { - const spr_db_spr_set* spr_set = spr_db->get_spr_set_by_id(set_id); - sprite_manager->ReadFile(spr_set->index, spr_set->file_name.c_str(), mdata_dir, data); -} - -void sprite_manager_read_file_modern(uint32_t set_hash, void* data, sprite_database* spr_db) { - const spr_db_spr_set* spr_set = spr_db->get_spr_set_by_id(set_hash); - sprite_manager->ReadFileModern(spr_set->index, set_hash, data, spr_db); -} - -void sprite_manager_remove_spr_sets(const sprite_database* spr_db) { - sprite_manager->RemoveSprSets(spr_db); -} - -void sprite_manager_reset_req_list() { - sprite_manager->ResetReqList(); -} - -void sprite_manager_reset_res_data() { - sprite_manager->ResetResData(); -} - -void sprite_manager_set_target(spr::SprTarget value) { - sprite_manager->target = value; -} - void sprite_manager_set_res(double_t aspect, int32_t width, int32_t height) { - if (!sprite_manager) + if (!spr::SprMgr::p_sprmgr) return; - sprite_manager->aspect[0] = (float_t)aspect; - sprite_manager->view_list[0].rect = { 0.0f, 0.0f, (float_t)width, (float_t)height }; - sprite_manager->aspect[1] = (float_t)aspect; - sprite_manager->view_list[1].rect = { 0.0f, 0.0f, (float_t)width, (float_t)height }; -} - -void sprite_manager_unload_set(uint32_t set_id, const sprite_database* spr_db) { - sprite_manager->UnloadSet(spr_db->get_spr_set_by_id(set_id)->index); -} - -void sprite_manager_unload_set_modern(uint32_t set_hash, sprite_database* spr_db) { - sprite_manager->UnloadSetModern(spr_db->get_spr_set_by_id(set_hash)->index, spr_db); + for (int32_t i = 0; i < spr::SPR_LAYER_MAX; i++) { + spr::SprMgr::sprmgr().setProjection((spr::SPR_LAYER)i, (float_t)aspect); + spr::SprMgr::sprmgr().setViewport((spr::SPR_LAYER)i, spr::SprMgr::sprmgr().view_list[i].screen, + { 0.0f, 0.0f, (float_t)width, (float_t)height }); + } } void sprite_manager_free() { @@ -644,14 +1581,19 @@ void sprite_manager_free() { } #endif - if (sprite_manager) { - delete sprite_manager; - sprite_manager = 0; + if (spr::render_data) { + delete spr::render_data; + spr::render_data = 0; + } + + if (spr::SprMgr::p_sprmgr) { + delete spr::SprMgr::p_sprmgr; + spr::SprMgr::p_sprmgr = 0; } } namespace spr { - SpriteManager::RenderData::RenderData() : vao() { + RenderData::RenderData() : vao() { vbo_vertex_count = 4096; ebo_index_count = 4096; @@ -710,7 +1652,7 @@ namespace spr { gl_state.bind_element_array_buffer(0); } - SpriteManager::RenderData::~RenderData() { + RenderData::~RenderData() { if (vao[0]) { glDeleteVertexArrays(3, vao); vao[0] = 0; @@ -721,7 +1663,7 @@ namespace spr { } template - size_t SpriteManager::RenderData::AddData(T*& data, size_t nb_quad) { + size_t RenderData::AddData(T*& data, size_t nb_quad) { size_t size = vertex_buffer.size(); size_t align_offset = (sizeof(T) - size % sizeof(T)) % sizeof(T); size_t vertex_array_size = sizeof(T) * nb_quad; @@ -732,13 +1674,13 @@ namespace spr { return (uint32_t)((size + align_offset) / sizeof(T)); } - void SpriteManager::RenderData::Clear() { + void RenderData::Clear() { draw_param_buffer.clear(); vertex_buffer.clear(); index_buffer.clear(); } - void SpriteManager::RenderData::Update() { + void RenderData::Update() { static const GLsizei buffer_size_uv0 = sizeof(sprite_vertex_data_uv0); static const GLsizei buffer_size_uv1 = sizeof(sprite_vertex_data_uv1); static const GLsizei buffer_size_uv2 = sizeof(sprite_vertex_data_uv2); @@ -817,21 +1759,25 @@ namespace spr { gl_state.bind_element_array_buffer(0); } - SpriteManager::ViewPort::ViewPort() : screen(SCREEN_MODE_MAX) { + SprMgr::Projection::Projection() : aspect() { } - SpriteManager::SpriteManager() : aspect(), target(), set_counter() { - ResetTarget(); + SprMgr::ViewPort::ViewPort() : screen(SCREEN_MODE_MAX) { + + } + + SprMgr::SprMgr() : target(), set_counter() { + resetTarget(); screen_mode_back = SCREEN_MODE_MAX; ScreenParam res = ScreenParam(SCREEN_MODE_HD); - aspect[0] = (float_t)res.aspect; + projection_list[0].aspect = (float_t)res.aspect; view_list[0].screen = res.mode; view_list[0].rect = { 0.0f, 0.0f, (float_t)res.width, (float_t)res.height }; - aspect[1] = (float_t)res.aspect; + projection_list[1].aspect = (float_t)res.aspect; view_list[1].screen = res.mode; view_list[1].rect = { 0.0f, 0.0f, (float_t)res.width, (float_t)res.height }; @@ -839,76 +1785,105 @@ namespace spr { mat = mat4_identity; } - SpriteManager::~SpriteManager() { - Clear(); + SprMgr::~SprMgr() { + refresh(); + dest(); + render_data->Clear(); } - uint32_t SpriteManager::AddSetModern() { - uint32_t index = this->set_counter; - //for (; index <= 0x0FFF; index++) { - for (; index <= 0x3FFF; index++) { - auto elem = sets.find(0x8000 | index); - if (elem == sets.end()) - break; + // 0x14063BA60 + const SPRSET* SprMgr::find(uint32_t id) { + auto elem = sets.find(id); + if (elem != sets.end()) + return &elem->second; + return 0; + } + + // 0x14063CB40 + void SprMgr::init() { + resetTarget(); + screen_mode_back = SCREEN_MODE_MAX; + + ScreenParam& screen_param = get_screen_param(); + + for (int32_t i = 0; i < spr::SPR_LAYER_MAX; i++) { + setProjection((spr::SPR_LAYER)i, (float_t)screen_param.aspect); + setViewport((spr::SPR_LAYER)i, screen_param.mode, + { 0.0f, 0.0f, (float_t)screen_param.width, (float_t)screen_param.height }); } - //if (!index || index >= 0x0FFF) { - if (!index || index > 0x3FFF) { - //for (index = 1; index <= 0x0FFF; index++) { - for (index = 1; index <= 0x3FFF; index++) { - auto elem = sets.find(0x8000 | index); - if (elem == sets.end()) - break; - } - - //if (!index || index > 0x0FFF) - if (!index || index > 0x3FFF) - return 0x8000; - } - - sets.insert({ 0x8000 | index, SprSet(0x8000 | index) }); - set_counter = index + 1; - //if (index + 1 > 0x0FFF) - if (index + 1 > 0x3FFF) - set_counter = 1; - return 0x8000 | index; + view_projection = mat4_identity; + mat = mat4_identity; } - void SpriteManager::AddSprSets(const sprite_database* spr_db) { - for (auto& i : spr_db->spr_set_indices) - sets.insert({ i.first, SprSet(i.first) }); + // Added + void SprMgr::init(const SprDb* spr_db) { + for (auto& i : spr_db->set_idx) + sets.insert({ i.first, SPRSET(i.first) }); } - void SpriteManager::Clear() { - for (int32_t i = 0; i < SPR_TARGET_MAX; i++) - for (int32_t j = 0; j < 2; j++) - for (int32_t k = 0; k < SPR_PRIO_MAX; k++) - reqlist[i][j][k].clear(); - + // 0x140639F60 + void SprMgr::dest() { for (auto i : sets) - i.second.Unload(); + i.second.free(); sets.clear(); - - render_data.Clear(); } - void SpriteManager::Draw(render_data_context& rend_data_ctx, - int32_t index, bool font, texture* overlay_tex, const mat4& vp) { - render_context* rctx = rctx_ptr; - draw_sprite_begin(rend_data_ctx); + // Added + void SprMgr::dest(const SprDb* spr_db) { + for (auto& i : spr_db->set_idx) + sets.erase(i.first); + } + + // Missing (Not seen anywhere) + bool SprMgr::ready() { + abort(); + } + + // 0x14063F030 + void SprMgr::setProjection(SPR_LAYER layer, float_t aspect) { + projection_list[layer].aspect = aspect; + } + + // 0x14063C9C0 + void SprMgr::getViewport(SCREEN_MODE& screen, rectangle& rect, SPR_LAYER layer) const { + screen = view_list[layer].screen; + rect = view_list[layer].rect; + } + + // 0x14063F140 + void SprMgr::setViewport(SPR_LAYER layer, SCREEN_MODE screen, const rectangle rect) { + view_list[layer].screen = screen; + view_list[layer].rect = rect; + } + + // 0x14063F130 + void SprMgr::setTarget(SPR_TARGET in_target) { + target = in_target; + } + + // 0x14063C890 + SPR_TARGET SprMgr::getTarget() { + return target; + } + + // 0x14063BAB0 + void SprMgr::flush(render_data_context& rend_data_ctx, + SPR_TARGET in_target, bool in_scale, texture* overlay_tex, const mat4& vp) { + SprMgr::begin_render(rend_data_ctx); SCREEN_MODE screen_mode = get_screen_param().mode; - if (index == 2 && screen_mode_back != SCREEN_MODE_MAX) + if (in_target == SPR_TARGET_BACK && screen_mode_back != SCREEN_MODE_MAX) get_screen_param().mode = screen_mode_back; gl_rend_state_rect viewport_rect = rend_data_ctx.state.get_viewport(); - for (int32_t i = 0; i < 2; i++) { - auto reqlist = this->reqlist[index][i]; + for (int32_t i = 0; i < SPR_LAYER_MAX; i++) { + auto obj_list = this->obj_list[in_target][i]; size_t count = 0; for (uint32_t j = SPR_PRIO_MAX, k = 0; j; j--, k++) - count += reqlist[k].size(); + count += obj_list[k].size(); if (!count) continue; @@ -917,16 +1892,16 @@ namespace spr { int32_t y_min; int32_t x_max; int32_t y_max; - if (index == 0 || index == 3) { + if (in_target == SPR_TARGET_FRONT || in_target == SPR_TARGET_3) { ScreenParam& screen_param = get_screen_param(); float_t sprite_half_width = (float_t)screen_param.width * 0.5f; float_t sprite_half_height = (float_t)screen_param.height * 0.5f; - float_t aet_depth = rctx->camera->aet_depth; + float_t aet_depth = rctx_ptr->camera->aet_depth; float_t aet_depth_1 = 1.0f / aet_depth; - float_t v15a = sprite_half_height * aspect[i] * 0.2f * aet_depth_1; + float_t v15a = sprite_half_height * projection_list[i].aspect * 0.2f * aet_depth_1; float_t v15b = sprite_half_height * 0.2f * aet_depth_1; mat4 proj; @@ -981,188 +1956,257 @@ namespace spr { 1.0f / (float_t)overlay_tex->height, 0.0f, 0.0f }; mat4_transpose(&view_projection, &shader_data.g_transform); - rctx->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); - rend_data_ctx.state.bind_uniform_buffer_base(0, rctx->sprite_scene_ubo); + rctx_ptr->sprite_scene_ubo.WriteMemory(rend_data_ctx.state, shader_data); + rend_data_ctx.state.bind_uniform_buffer_base(0, rctx_ptr->sprite_scene_ubo); - for (uint32_t j = SPR_PRIO_MAX; j; j--, reqlist++) - for (SprArgs& k : *reqlist) + for (uint32_t j = SPR_PRIO_MAX; j; j--, obj_list++) + for (SprArgs& k : *obj_list) if (k.sprite_draw_param_index >= 0) - draw_sprite(rend_data_ctx, this, k, mat, x_min, y_min, x_max, y_max, overlay_tex); + k.draw(rend_data_ctx, mat, x_min, y_min, x_max, y_max, overlay_tex); rend_data_ctx.state.bind_vertex_array(0); } - if (index == 2 && screen_mode_back != SCREEN_MODE_MAX) + if (in_target == SPR_TARGET_BACK && screen_mode_back != SCREEN_MODE_MAX) get_screen_param().mode = screen_mode; - draw_sprite_end(rend_data_ctx); + SprMgr::end_render(rend_data_ctx); } - SprSet* SpriteManager::GetSet(uint32_t index) { - auto elem = sets.find(index); - if (elem != sets.end()) - return &elem->second; - return 0; + // 0x14063D940 + void SprMgr::refresh() { + for (auto& i : obj_list) + for (auto& j : i) + for (auto& k : j) + k.clear(); + + resetTarget(); + + string_quad_idx = 0; } - bool SpriteManager::GetSetReady(uint32_t index) { - SprSet* set = GetSet(index); + // 0x14063E990 + void SprMgr::request(uint32_t id, const char* file, const std::string mdata_dir, void* data) { + SPRSET* set = (SPRSET*)find(id); if (set) - return set->ready; + set->request(file, mdata_dir, data); + } + + // Added + void SprMgr::requestModern(uint32_t id, uint32_t sethash, void* data, SprDb* spr_db) { + if (id == -1) { + id = addSet(); + spr_db->addSet(sethash, id); + } + + SPRSET* set = (SPRSET*)find(id); + if (set) + set->requestModern(sethash, data); + } + + // 0x14063F6F0 + bool SprMgr::wait(uint32_t id) { + SPRSET* set = (SPRSET*)find(id); + if (set) + return set->wait(); return false; } - uint32_t SpriteManager::GetSetSpriteNum(uint32_t index) { - SprSet* set = GetSet(index); + // Added + bool SprMgr::waitModern(uint32_t id, SprDb* spr_db) { + SPRSET* set = (SPRSET*)find(id); if (set) - return set->spr_set->num_of_sprite; + return set->waitModern(spr_db); + return false; + } + + // 0x14063C300 + void SprMgr::free(uint32_t id) { + SPRSET* set = (SPRSET*)find(id); + if (set) + set->free(); + } + + // Added + void SprMgr::freeModern(uint32_t id, SprDb* spr_db) { + SPRSET* set = (SPRSET*)find(id); + if (set) { + set->freeModern(spr_db); + + if (set->reference <= 0) { + auto elem = sets.find(id); + if (elem != sets.end()) + sets.erase(elem); + } + } + } + + // 0x14063F9E0 + int32_t SprMgr::getTexNum(uint32_t id) { + const SPRSET* set = find(id); + if (set) + return set->getTexNum(); return 0; } - uint32_t SpriteManager::GetSetTextureNum(uint32_t index) { - SprSet* set = GetSet(index); + // 0x14063F9A0 + int32_t SprMgr::getSprNum(uint32_t id) { + const SPRSET* set = find(id); if (set) - return set->spr_set->num_of_texture; + return set->getSprNum(); return 0; } - const char* SpriteManager::GetSprName(spr_info info) { - SprSet* set = GetSet(info.set_index & 0x8FFF); + // 0x14063C420 + bool SprMgr::getReady(uint32_t id) { + const SPRSET* set = find(id); if (set) - return set->GetName(info); + return set->getReady(); + return false; + } + + // 0x14063F900 + const char* SprMgr::getName(SprId id) { + //const SPRSET* set = find(id.m.set_idx & 0x0FFF); + const SPRSET* set = find(id.m.set_idx & 0x3FFF); + if (set) + return set->getName(id.w); return "(null)"; } - rectangle SpriteManager::GetSprRectangle(spr_info info) { - SprSet* set = GetSet(info.set_index & 0x8FFF); + // 0x14063FA30, Inlined + inline size_t SprMgr::getObjListCount(SPR_TARGET in_target) { + size_t count = 0; + for (const auto& i : obj_list[target]) + for (const auto& j : i) + count += j.size(); + return count; + } + + // 0x14063C4F0 + SprArgs::Rect SprMgr::getRect(SprId id) { + //const SPRSET* set = find(id.m.set_idx & 0x0FFF); + const SPRSET* set = find(id.m.set_idx & 0x3FFF); if (set) - return set->GetRectangle(info); + return set->getRect(id.w); return {}; } - texture* SpriteManager::GetSprTexture(spr_info info) { - SprSet* set = GetSet(info.set_index & 0x8FFF); + // 0x14063C370 + uint32_t SprMgr::getAttr(SprId id) { + //const SPRSET* set = find(id.m.set_idx & 0x0FFF); + const SPRSET* set = find(id.m.set_idx & 0x3FFF); if (set) - return set->GetTexture(info); + return set->getAttr(id.w); return 0; } - bool SpriteManager::LoadFile(uint32_t index) { - SprSet* set = GetSet(index); + // 0x14063C580 + SCREEN_MODE SprMgr::getScreen(SprId id) { + //const SPRSET* set = find(id.m.set_idx & 0x0FFF); + const SPRSET* set = find(id.m.set_idx & 0x3FFF); if (set) - return set->LoadFile(); - return false; + return set->getScreen(id.w); + return SCREEN_MODE_HD; } - bool SpriteManager::LoadFileModern(uint32_t index, sprite_database* spr_db) { - SprSet* set = GetSet(index); + // 0x14063C990 + const texture* SprMgr::getTexture(SprId id) { + //const SPRSET* set = find(id.m.set_idx & 0x0FFF); + const SPRSET* set = find(id.m.set_idx & 0x3FFF); if (set) - return set->LoadFileModern(spr_db); - return false; + return set->getTexture(id.w); + return 0; } - SprArgs* SpriteManager::PutSprite(const SprArgs& args, const sprite_database* spr_db) { - SprTarget target = args.target; + // 0x14063D6A0 + SprArgs* SprMgr::put(const SprArgs& args, const SprDb* spr_db) { + SPR_TARGET target = args.target; if (target == -1) target = this->target; - auto reqlist = &this->reqlist[target][args.layer][args.prio]; - spr_info info = args.id.info; + auto obj_list = &this->obj_list[target][args.layer][args.prio]; + SprId id = args.id; if (args.kind == SPR_KIND_NORMAL) - info = spr_db->get_spr_by_id(args.id.id)->info; + id = spr_db->getSprIdFromUid(id.w); - if (info.not_null()) { - SprSet* set = GetSet(info.set_index & 0x8FFF); + if (id.not_null()) { + //const SPRSET* set = find(id.m.set_idx & 0x8FFF); + const SPRSET* set = find(id.m.set_idx & 0xBFFF); if (!set || !set->ready) return 0; - reqlist->push_back(args); - SprArgs& _args = reqlist->back(); - _args.id.info = info; - _args.tex = set->GetTexture(info); - rectangle rect = set->GetRectangle(info); - _args.SetSize({ rect.size.x, rect.size.y }); - _args.SetRect(rect.pos.x, rect.pos.y, rect.size.x, rect.size.y); + obj_list->push_back(args); + SprArgs& _args = obj_list->back(); + _args.id = id; + _args.tex = set->getTexture(id); + SprArgs::Rect rect = set->getRect(id); + _args.setSize({ rect.width, rect.height }); + _args.setRect(rect.x, rect.y, rect.width, rect.height); if (_args.screen_scale != SCREEN_MODE_MAX) - _args.screen_scale = set->GetResolutionMode(_args.id.info); + _args.screen_scale = set->getScreen(_args.id); return &_args; } if (args.tex) { - reqlist->push_back(args); - SprArgs& _args = reqlist->back(); - _args.id.index = -1; - _args.SetSize({ (float_t)_args.tex->width, (float_t)_args.tex->height }); - _args.SetRect(0.0, 0.0, (float_t)_args.tex->width, (float_t)_args.tex->height); + obj_list->push_back(args); + SprArgs& _args = obj_list->back(); + _args.id = -1; + _args.setSize({ (float_t)_args.tex->width, (float_t)_args.tex->height }); + _args.setRect(0.0, 0.0, (float_t)_args.tex->width, (float_t)_args.tex->height); return &_args; } else { - reqlist->push_back(args); - SprArgs& _args = reqlist->back(); - _args.id.index = -1; + obj_list->push_back(args); + SprArgs& _args = obj_list->back(); + _args.id = -1; return &_args; } } - void SpriteManager::ReadFile(uint32_t index, - const char* file, std::string& mdata_dir, void* data) { - SprSet* set = GetSet(index); - if (set) - set->ReadFile(file, mdata_dir, data); - } - - void SpriteManager::ReadFileModern(uint32_t index, - uint32_t set_hash, void* data, sprite_database* spr_db) { - if (index == -1) { - index = AddSetModern(); - spr_db->add_spr_set(set_hash, index); + // Added + uint32_t SprMgr::addSet() { + uint32_t index = set_counter; + //for (; index <= 0x0FFF; index++) { + for (; index <= 0x3FFF; index++) { + auto elem = sets.find(0x8000 | index); + if (elem == sets.end()) + break; } - SprSet* set = GetSet(index); - if (set) - set->ReadFileModern(set_hash, data); + //if (!index || index >= 0x0FFF) { + if (!index || index > 0x3FFF) { + //for (index = 1; index <= 0x0FFF; index++) { + for (index = 1; index <= 0x3FFF; index++) { + auto elem = sets.find(0x8000 | index); + if (elem == sets.end()) + break; + } + + //if (!index || index > 0x0FFF) + if (!index || index > 0x3FFF) + return 0x8000; + } + + sets.insert({ 0x8000 | index, SPRSET(0x8000 | index) }); + set_counter = index + 1; + //if (index + 1 > 0x0FFF) + if (index + 1 > 0x3FFF) + set_counter = 1; + return 0x8000 | index; } - void SpriteManager::ResetTarget() { + // 0x1406362E0 + void SprMgr::resetTarget() { target = SPR_TARGET_FRONT; } - void SpriteManager::RemoveSprSets(const sprite_database* spr_db) { - for (auto& i : spr_db->spr_set_indices) - sets.erase(i.first); + // Added + void SprMgr::postFlush() { + render_data->Clear(); } - void SpriteManager::ResetReqList() { - for (auto& i : reqlist) - for (auto& j : i) - for (auto& k : j) - k.clear(); - ResetTarget(); - string_quad_idx = 0; - } - - void SpriteManager::ResetResData() { - ResetTarget(); - screen_mode_back = SCREEN_MODE_MAX; - - ScreenParam& screen_param = get_screen_param(); - - aspect[0] = (float_t)screen_param.aspect; - view_list[0].screen = screen_param.mode; - view_list[0].rect = { 0.0f, 0.0f, (float_t)screen_param.width, (float_t)screen_param.height }; - - aspect[1] = (float_t)screen_param.aspect; - view_list[1].screen = screen_param.mode; - view_list[1].rect = { 0.0f, 0.0f, (float_t)screen_param.width, (float_t)screen_param.height }; - - view_projection = mat4_identity; - mat = mat4_identity; - } - - void SpriteManager::PostDraw() { - render_data.Clear(); - } - - void SpriteManager::PreDraw() { + // Added + void SprMgr::preFlush() { auto check_same = [](const SprArgsDraw& left, const SprArgsDraw& right) -> bool { if (left.num_texture != right.num_texture) return false; @@ -1171,7 +2215,8 @@ namespace spr { if (left.texs[i] != right.texs[i]) return false; - return left.blend == right.blend && left.blend != 5 && right.blend != 5 + return left.blend == right.blend + && left.blend != SPR_BLEND_OVERLAY && right.blend != SPR_BLEND_OVERLAY && left.shader_name == right.shader_name && left.kind == right.kind && left.kind != SPR_KIND_POLY_LINE && right.kind != SPR_KIND_POLY_LINE && left.kind != SPR_KIND_STRIP && right.kind != SPR_KIND_STRIP; @@ -1196,11 +2241,11 @@ namespace spr { SprArgsDraw args_draw[2]; SprArgs* args_array[256]; for (int32_t i = 0; i < SPR_TARGET_MAX; i++) - for (int32_t j = 0; j < 2; j++) + for (int32_t j = 0; j < SPR_LAYER_MAX; j++) for (int32_t k = 0; k < SPR_PRIO_MAX; k++) { int32_t args_count = 0; int32_t draw_idx = 0; - for (SprArgs& args : reqlist[i][j][k]) { + for (SprArgs& args : obj_list[i][j][k]) { if (!args_count) { get_args_draw(args, args_draw[draw_idx]); @@ -1208,8 +2253,8 @@ namespace spr { draw_idx = 1 - draw_idx; } else if (args_count >= 0x100) { - add_draw_sprite(args_array, args_count, true, - args_draw[1 - draw_idx], render_data); + SprArgs::addDraw(args_array, args_count, true, + args_draw[1 - draw_idx]); get_args_draw(args, args_draw[draw_idx]); args_count = 0; @@ -1219,8 +2264,8 @@ namespace spr { else { get_args_draw(args, args_draw[draw_idx]); if (!check_same(args_draw[1 - draw_idx], args_draw[draw_idx])) { - add_draw_sprite(args_array, args_count, true, - args_draw[1 - draw_idx], render_data); + SprArgs::addDraw(args_array, args_count, true, + args_draw[1 - draw_idx]); args_count = 0; draw_idx = 1 - draw_idx; @@ -1230,765 +2275,15 @@ namespace spr { } if (args_count) - add_draw_sprite(args_array, args_count, true, - args_draw[1 - draw_idx], render_data); + SprArgs::addDraw(args_array, args_count, true, + args_draw[1 - draw_idx]); } - render_data.Update(); + render_data->Update(); } - void SpriteManager::UnloadSet(uint32_t index) { - SprSet* set = GetSet(index); - if (set) - set->Unload(); - } - - void SpriteManager::UnloadSetModern(uint32_t index, sprite_database* spr_db) { - SprSet* set = GetSet(index); - if (set) { - set->UnloadModern(spr_db); - if (set->load_count <= 0) { - auto elem = sets.find(index); - if (elem != sets.end()) - sets.erase(elem); - } - } - } - - static void calc_sprite_vertex(SprArgs* args, vec3 vtx[4], mat4* mat, bool font) { - vtx[0].x = 0.0f; - vtx[0].y = 0.0f; - vtx[0].z = 0.0f; - vtx[1].x = 0.0f; - vtx[1].y = args->size.y; - vtx[1].z = 0.0f; - vtx[2].x = args->size.x; - vtx[2].y = args->size.y; - vtx[2].z = 0.0f; - vtx[3].x = args->size.x; - vtx[3].y = 0.0f; - vtx[3].z = 0.0f; - - mat4 m; - SprAttr attr = args->attr; - if (!(attr & SPR_ATTR_NOTRANSFORM)) { - if (attr & SPR_ATTR_CTR_ALL) { - if (attr & SPR_ATTR_CTR_LT) - args->anchor = 0.0f; - else if (attr & SPR_ATTR_CTR_LC) { - args->anchor.x = 0.0f; - args->anchor.y = args->size.y * 0.5f; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_LB) { - args->anchor.x = 0.0f; - args->anchor.y = args->size.y; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_CT) { - args->anchor.x = args->size.x * 0.5f; - args->anchor.y = 0.0f; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_CC) { - args->anchor.x = args->size.x * 0.5f; - args->anchor.y = args->size.y * 0.5f; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_CB) { - args->anchor.x = args->size.x * 0.5f; - args->anchor.y = args->size.y; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_RT) { - args->anchor.x = args->size.x; - args->anchor.y = 0.0f; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_RC) { - args->anchor.x = args->size.x; - args->anchor.y = args->size.y * 0.5f; - args->anchor.z = 0.0f; - } - else if (attr & SPR_ATTR_CTR_RB) { - args->anchor.x = args->size.x; - args->anchor.y = args->size.y; - args->anchor.z = 0.0f; - } - } - - if (font) { - if (attr & SPR_ATTR_FLIP_H) { - args->scale.x = -args->scale.x; - args->rot.z = -args->rot.z; - } - if (attr & SPR_ATTR_FLIP_V) { - args->scale.y = -args->scale.y; - args->rot.z = -args->rot.z; - } - } - - if (fabsf(args->slant) > 0.000001f) { - float_t skew_width = tanf(args->slant) * args->size.y * 0.5f; - vtx[0].x = vtx[0].x + skew_width; - vtx[1].x = vtx[1].x - skew_width; - vtx[2].x = vtx[2].x - skew_width; - vtx[3].x = vtx[3].x + skew_width; - } - - if (fabsf(args->shear) > 0.000001f) { - float_t skew_height = tanf(args->shear) * args->size.x * 0.5f; - vtx[0].y = vtx[0].y - skew_height; - vtx[1].y = vtx[1].y - skew_height; - vtx[2].y = vtx[2].y + skew_height; - vtx[3].y = vtx[3].y + skew_height; - } - - mat4_translate(&args->trans, &m); - if (fabsf(args->rot.x) > 0.000001f) - mat4_mul_rotate_x(&m, args->rot.x, &m); - if (fabsf(args->rot.y) > 0.000001f) - mat4_mul_rotate_y(&m, args->rot.y, &m); - if (fabsf(args->rot.z) > 0.000001f) - mat4_mul_rotate_z(&m, args->rot.z, &m); - mat4_scale_rot(&m, &args->scale, &m); - const vec3 anchor = -args->anchor; - mat4_mul_translate(&m, &anchor, &m); - } - else { - mat4_translate(&args->trans, &m); - mat4_scale_rot(&m, &args->scale, &m); - } - - mat4_mul(&args->matrix, &m, &m); - - mat4_transform_point(&m, &vtx[0], &vtx[0]); - mat4_transform_point(&m, &vtx[1], &vtx[1]); - mat4_transform_point(&m, &vtx[2], &vtx[2]); - mat4_transform_point(&m, &vtx[3], &vtx[3]); - - if (mat) - *mat = m; - } - - static int32_t calc_sprite_texture_param(SprArgs* args, TexParam* param, vec3 vtx[4], bool font) { - int32_t tex_param_count = 0; - const texture* tex = args->tex; - while (args) { - param->tex = args->tex; - - float_t width = (float_t)args->tex->width; - float_t height = (float_t)args->tex->height; - - float_t u_scale = 1.0f / width; - float_t v_scale = 1.0f / height; - - if (!args->nb_quad) { - vec2 uv00; - vec2 uv01; - vec2 uv10; - vec2 uv11; - if (args->kind == SPR_KIND_MULTI) { - vec3 v42[4]; - mat4 mat; - calc_sprite_vertex(args, v42, &mat, font); - mat4_invert(&mat, &mat); - mat4_transform_point(&mat, &vtx[0], &v42[0]); - mat4_transform_point(&mat, &vtx[1], &v42[1]); - mat4_transform_point(&mat, &vtx[2], &v42[2]); - mat4_transform_point(&mat, &vtx[3], &v42[3]); - uv00 = *(vec2*)&v42[0].x; - uv01 = *(vec2*)&v42[1].x; - uv10 = *(vec2*)&v42[2].x; - uv11 = *(vec2*)&v42[3].x; - } - else { - uv00.x = 0.0f; - uv00.y = 0.0f; - uv01.x = 0.0f; - uv01.y = args->rect.height; - uv10.x = args->rect.width; - uv10.y = args->rect.height; - uv11.x = args->rect.width; - uv11.y = 0.0f; - } - - const float_t rect_x = args->rect.x; - const float_t rect_y = args->rect.y; - param->texcoord.uv[0].u = (uv00.x + rect_x) * u_scale; - param->texcoord.uv[0].v = (height - (uv00.y + rect_y)) * v_scale; - param->texcoord.uv[1].u = (uv01.x + rect_x) * u_scale; - param->texcoord.uv[1].v = (height - (uv01.y + rect_y)) * v_scale; - param->texcoord.uv[2].u = (uv10.x + rect_x) * u_scale; - param->texcoord.uv[2].v = (height - (uv10.y + rect_y)) * v_scale; - param->texcoord.uv[3].u = (uv11.x + rect_x) * u_scale; - param->texcoord.uv[3].v = (height - (uv11.y + rect_y)) * v_scale; - } - else if (font) { - SprArgs::Quad* vtx = args->GetVertexArray(); - for (size_t i = args->nb_quad; i; i--, vtx++) { - vtx->uv.x = vtx->uv.x * u_scale; - vtx->uv.y = (height - vtx->uv.y) * v_scale; - } - } - - args = args->next; - param++; - tex_param_count++; - } - return tex_param_count; - } - - static int32_t calc_sprite_vertex_texture_param(SprArgs& args, vec3 vtx[4], TexParam* param, bool font) { - vec3 _vtx[4] = {}; - if (args.flags & SprArgs::SPRITE_SIZE) - calc_sprite_vertex(&args, _vtx, 0, font); - - int32_t tex_param_count = 0; - if ((args.flags & SprArgs::TEXTURE_POS_SIZE) && args.tex) - tex_param_count = calc_sprite_texture_param(&args, param, _vtx, font); - vtx[0] = _vtx[0]; - vtx[1] = _vtx[1]; - vtx[2] = _vtx[2]; - vtx[3] = _vtx[3]; - return tex_param_count; - } - - static void add_draw_sprite(SprArgs* args_array[0x100], const int32_t args_count, bool font, - SprArgsDraw& args_draw, SpriteManager::RenderData& render_data) { - SprArgs& args = *args_array[0]; - if (args.kind == SPR_KIND_MULTI) - return; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - vec3 spr_vtx[4] = {}; - TexParam tex_param[4] = {}; - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - std::vector& draw_param_buffer = render_data.draw_param_buffer; - std::vector& index_buffer = render_data.index_buffer; - - draw_param_buffer.push_back({}); - sprite_draw_param& draw_param = draw_param_buffer.back(); - - if (args.attr & SPR_ATTR_IGNORE_ALPHA) { - draw_param.attrib.m.enable_blend = 0; - draw_param.attrib.m.blend = 0; - } - else { - draw_param.attrib.m.enable_blend = 1; - draw_param.attrib.m.blend = args_draw.blend; - } - - draw_param.shader_name = args_draw.shader_name; - if (draw_param.shader_name == SHADER_FT_FFP) - draw_param.shader_name = SHADER_FT_SPRITE; - - switch (args_draw.num_texture) { - case 0: - draw_param.attrib.m.vao = 0; - switch (args_draw.kind) { - case SPR_KIND_LINE: { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = 2ULL * args_count; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_LINES; - draw_param.first = (GLint)first; - draw_param.count = (GLint)count; - - vtx_data[0] = { spr_vtx[0], color }; - vtx_data[1] = { spr_vtx[2], color }; - vtx_data += 2; - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - vtx_data[0] = { spr_vtx[0], color }; - vtx_data[1] = { spr_vtx[2], color }; - vtx_data += 2; - } - } break; - case SPR_KIND_RECT: { - sprite_vertex_data_uv0* vtx_data = 0; - size_t vtx_count = 4ULL * args_count; - size_t idx_count = 6ULL * args_count; - size_t start = render_data.AddData(vtx_data, vtx_count); - index_buffer.reserve(idx_count); - - draw_param.attrib.m.primitive = GL_TRIANGLES; - draw_param.start = (GLuint)start; - draw_param.end = (GLuint)(start + vtx_count - 1); - draw_param.count = (GLsizei)idx_count; - draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); - - vtx_data[0] = { spr_vtx[0], color }; // LB - vtx_data[1] = { spr_vtx[1], color }; // LT - vtx_data[2] = { spr_vtx[2], color }; // RT - vtx_data[3] = { spr_vtx[3], color }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - vtx_data[0] = { spr_vtx[0], color }; // LB - vtx_data[1] = { spr_vtx[1], color }; // LT - vtx_data[2] = { spr_vtx[2], color }; // RT - vtx_data[3] = { spr_vtx[3], color }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - } - } break; - case SPR_KIND_LINE_BOX: { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = 5; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_LINE_STRIP; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - vtx_data[0] = { spr_vtx[0], color }; - vtx_data[1] = { spr_vtx[1], color }; - vtx_data[2] = { spr_vtx[2], color }; - vtx_data[3] = { spr_vtx[3], color }; - vtx_data[4] = { spr_vtx[0], color }; - - } break; - case SPR_KIND_LINES: { - if (args.nb_quad) { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = args.nb_quad & ~0x01; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_LINES; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad / 2; i; i--, vtx += 2, vtx_data += 2) { - vtx_data[0] = { vtx[0].pos, color }; - vtx_data[1] = { vtx[1].pos, color }; - } - } - else { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = 2; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_LINES; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - vtx_data[0] = { spr_vtx[0], color }; - vtx_data[1] = { spr_vtx[2], color }; - } - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - if (args.nb_quad) { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = args.nb_quad & ~0x01; - render_data.AddData(vtx_data, count); - - draw_param.count += (GLsizei)count; - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad / 2; i; i--, vtx += 2, vtx_data += 2) { - vtx_data[0] = { vtx[0].pos, color }; - vtx_data[1] = { vtx[1].pos, color }; - } - } - else { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = 2; - render_data.AddData(vtx_data, count); - - draw_param.count += (GLsizei)count; - - vtx_data[0] = { spr_vtx[0], color }; - vtx_data[1] = { spr_vtx[2], color }; - - } - } - } break; - case SPR_KIND_POLY_LINE: { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = args.nb_quad; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_LINE_STRIP; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) - *vtx_data = { vtx->pos, color }; - } break; - case SPR_KIND_STRIP: { - sprite_vertex_data_uv0* vtx_data = 0; - size_t count = args.nb_quad; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_TRIANGLE_STRIP; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) - *vtx_data = { vtx->pos, vtx->color }; - - } break; - } - break; - case 1: - draw_param.texs[0] = tex_param[0].tex; - draw_param.attrib.m.sampler = 0; - draw_param.attrib.m.vao = 1; - - if (args.nb_quad) { - if (args_draw.kind == SPR_KIND_STRIP) { - draw_param.attrib.m.sampler = 1; - - sprite_vertex_data_uv1* vtx_data = 0; - size_t count = args.nb_quad; - size_t first = render_data.AddData(vtx_data, count); - - draw_param.attrib.m.primitive = GL_TRIANGLE_STRIP; - draw_param.first = (GLint)first; - draw_param.count = (GLsizei)count; - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad; i; i--, vtx++, vtx_data++) - *vtx_data = { vtx->pos, vtx->color, vtx->uv }; - } - else { - sprite_vertex_data_uv1* vtx_data = 0; - size_t vtx_count = args.nb_quad; - size_t idx_count = args.nb_quad / 4 * 6; - size_t start = render_data.AddData(vtx_data, vtx_count); - index_buffer.reserve(idx_count); - - draw_param.attrib.m.primitive = GL_TRIANGLES; - draw_param.start = (GLuint)start; - draw_param.end = (GLuint)(start + vtx_count - 1); - draw_param.count = (GLsizei)idx_count; - draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad / 4, j = 0; i; i--, j += 4, vtx += 4) { - vtx_data[0] = { vtx[0].pos, vtx[0].color, vtx[0].uv }; // LB - vtx_data[1] = { vtx[1].pos, vtx[1].color, vtx[1].uv }; // LT - vtx_data[2] = { vtx[2].pos, vtx[2].color, vtx[2].uv }; // RT - vtx_data[3] = { vtx[3].pos, vtx[3].color, vtx[3].uv }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + j + 0)); // LB - index_buffer.push_back((uint32_t)(start + j + 1)); // LT - index_buffer.push_back((uint32_t)(start + j + 3)); // RB - index_buffer.push_back((uint32_t)(start + j + 1)); // LT - index_buffer.push_back((uint32_t)(start + j + 2)); // RT - index_buffer.push_back((uint32_t)(start + j + 3)); // RB - } - start += args.nb_quad; - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - size_t vtx_count = args.nb_quad; - size_t idx_count = args.nb_quad / 4 * 6; - - draw_param.end += (GLuint)vtx_count; - draw_param.count += (GLsizei)idx_count; - - render_data.AddData(vtx_data, vtx_count); - index_buffer.reserve(idx_count); - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - SprArgs::Quad* vtx = args.GetVertexArray(); - for (size_t i = args.nb_quad / 4, j = 0; i; i--, j += 4, vtx += 4) { - - vtx_data[0] = { vtx[0].pos, vtx[0].color, vtx[0].uv }; // LB - vtx_data[1] = { vtx[1].pos, vtx[1].color, vtx[1].uv }; // LT - vtx_data[2] = { vtx[2].pos, vtx[2].color, vtx[2].uv }; // RT - vtx_data[3] = { vtx[3].pos, vtx[3].color, vtx[3].uv }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + j + 0)); // LB - index_buffer.push_back((uint32_t)(start + j + 1)); // LT - index_buffer.push_back((uint32_t)(start + j + 3)); // RB - index_buffer.push_back((uint32_t)(start + j + 1)); // LT - index_buffer.push_back((uint32_t)(start + j + 2)); // RT - index_buffer.push_back((uint32_t)(start + j + 3)); // RB - } - start += args.nb_quad; - } - } - } - else { - sprite_vertex_data_uv1* vtx_data = 0; - size_t vtx_count = 4ULL * args_count; - size_t idx_count = 6ULL * args_count; - size_t start = render_data.AddData(vtx_data, vtx_count); - index_buffer.reserve(idx_count); - - draw_param.attrib.m.primitive = GL_TRIANGLES; - draw_param.start = (GLuint)start; - draw_param.end = (GLuint)(start + vtx_count - 1); - draw_param.count = (GLsizei)idx_count; - draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); - - vtx_data[0] = { spr_vtx[0], color, tex_param[0].texcoord.uv[0] }; // LB - vtx_data[1] = { spr_vtx[1], color, tex_param[0].texcoord.uv[1] }; // LT - vtx_data[2] = { spr_vtx[2], color, tex_param[0].texcoord.uv[2] }; // RT - vtx_data[3] = { spr_vtx[3], color, tex_param[0].texcoord.uv[3] }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - vtx_data[0] = { spr_vtx[0], color, tex_param[0].texcoord.uv[0] }; // LB - vtx_data[1] = { spr_vtx[1], color, tex_param[0].texcoord.uv[1] }; // LT - vtx_data[2] = { spr_vtx[2], color, tex_param[0].texcoord.uv[2] }; // RT - vtx_data[3] = { spr_vtx[3], color, tex_param[0].texcoord.uv[3] }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - } - } - break; - case 2: { - draw_param.texs[0] = tex_param[0].tex; - draw_param.texs[1] = tex_param[1].tex; - draw_param.attrib.m.sampler = 2; - draw_param.attrib.m.vao = 2; - - sprite_vertex_data_uv2* vtx_data = 0; - size_t vtx_count = 4ULL * args_count; - size_t idx_count = 6ULL * args_count; - size_t start = render_data.AddData(vtx_data, vtx_count); - index_buffer.reserve(idx_count); - - draw_param.attrib.m.primitive = GL_TRIANGLES; - draw_param.start = (GLuint)start; - draw_param.end = (GLuint)(start + vtx_count - 1); - draw_param.count = (GLsizei)idx_count; - draw_param.offset = (GLintptr)(index_buffer.size() * sizeof(uint32_t)); - - vtx_data[0] = { spr_vtx[0], color, - tex_param[0].texcoord.uv[0], tex_param[1].texcoord.uv[0] }; // LB - vtx_data[1] = { spr_vtx[1], color, - tex_param[0].texcoord.uv[1], tex_param[1].texcoord.uv[1] }; // LT - vtx_data[2] = { spr_vtx[2], color, - tex_param[0].texcoord.uv[2], tex_param[1].texcoord.uv[2] }; // RT - vtx_data[3] = { spr_vtx[3], color, - tex_param[0].texcoord.uv[3], tex_param[1].texcoord.uv[3] }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - - for (int32_t i = 1; i < args_count; i++) { - SprArgs& args = *args_array[i]; - - const color4u8 color = args.color; - - if (font) - draw_sprite_scale(&args); - - calc_sprite_vertex_texture_param(args, spr_vtx, tex_param, font); - - vtx_data[0] = { spr_vtx[0], color, - tex_param[0].texcoord.uv[0], tex_param[1].texcoord.uv[0] }; // LB - vtx_data[1] = { spr_vtx[1], color, - tex_param[0].texcoord.uv[1], tex_param[1].texcoord.uv[1] }; // LT - vtx_data[2] = { spr_vtx[2], color, - tex_param[0].texcoord.uv[2], tex_param[1].texcoord.uv[2] }; // RT - vtx_data[3] = { spr_vtx[3], color, - tex_param[0].texcoord.uv[3], tex_param[1].texcoord.uv[3] }; // RB - vtx_data += 4; - - index_buffer.push_back((uint32_t)(start + 0)); // LB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 3)); // RB - index_buffer.push_back((uint32_t)(start + 1)); // LT - index_buffer.push_back((uint32_t)(start + 2)); // RT - index_buffer.push_back((uint32_t)(start + 3)); // RB - start += 4; - } - } break; - } - - if (!draw_param.count) { - draw_param_buffer.pop_back(); - - args.sprite_draw_param_index = -1; - } - else { - if (args_draw.blend == 5) { - draw_param.vtx[0] = spr_vtx[0]; - draw_param.vtx[1] = spr_vtx[1]; - draw_param.vtx[2] = spr_vtx[2]; - draw_param.vtx[3] = spr_vtx[3]; - } - - args.sprite_draw_param_index = (int32_t)(draw_param_buffer.size() - 1); - } - - for (int32_t i = 1; i < args_count; i++) - args_array[i]->sprite_draw_param_index = -1; - } - - static void draw_sprite(render_data_context& rend_data_ctx, - SpriteManager* sprite_manager, const SprArgs& args, - const mat4& mat, int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex) { - sprite_draw_param& draw_param - = sprite_manager->render_data.draw_param_buffer.data()[args.sprite_draw_param_index]; - - int32_t combiner = 0; - if (draw_param.attrib.m.enable_blend) { - if (draw_param.attrib.m.blend == 5) { - rend_data_ctx.state.active_bind_texture_2d(7, overlay_tex->glid); - draw_sprite_copy_overlay_texture(rend_data_ctx, - args, mat, draw_param.vtx, x_min, y_min, x_max, y_max); - combiner = 2; - } - else - combiner = draw_param.attrib.m.blend == 3 ? 1 : 0; - - const GLenum* blend = spr_blend_param[draw_param.attrib.m.blend]; - - rend_data_ctx.state.enable_blend(); - rend_data_ctx.state.set_blend_func_separate(blend[0], blend[1], blend[2], blend[3]); - } - else - rend_data_ctx.state.disable_blend(); - - if (draw_param.shader_name == SHADER_FT_SPRITE) { - int32_t tex_0_type = 0; - int32_t tex_1_type = 0; - if (draw_param.texs[0]) { - if (draw_param.texs[0]->internal_format == GL_COMPRESSED_RED_RGTC1) - tex_0_type = 3; - else if (draw_param.texs[0]->internal_format == GL_COMPRESSED_RG_RGTC2) - tex_0_type = 2; - else - tex_0_type = 1; - - if (draw_param.texs[1]) { - if (draw_param.texs[1]->internal_format == GL_COMPRESSED_RED_RGTC1) - tex_1_type = 3; - else if (draw_param.texs[1]->internal_format == GL_COMPRESSED_RG_RGTC2) - tex_1_type = 2; - else - tex_1_type = 1; - } - } - - rend_data_ctx.shader_flags.arr[U_TEX_0_TYPE] = tex_0_type; - rend_data_ctx.shader_flags.arr[U_TEX_1_TYPE] = tex_1_type; - rend_data_ctx.shader_flags.arr[U_COMBINER] = combiner; - } - - shaders_ft.set(rend_data_ctx.state, rend_data_ctx.shader_flags, draw_param.shader_name); - if (draw_param.texs[0]) { - rend_data_ctx.state.active_bind_texture_2d(0, draw_param.texs[0]->glid); - rend_data_ctx.state.bind_sampler(0, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); - - if (draw_param.texs[1]) { - rend_data_ctx.state.active_bind_texture_2d(1, draw_param.texs[1]->glid); - rend_data_ctx.state.bind_sampler(1, rctx_ptr->sprite_samplers[draw_param.attrib.m.sampler]); - } - else - rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); - } - else { - rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); - rend_data_ctx.state.active_bind_texture_2d(1, rctx_ptr->empty_texture_2d->glid); - } - - rend_data_ctx.state.bind_vertex_array(sprite_manager->render_data.vao[draw_param.attrib.m.vao]); - if (draw_param.attrib.m.primitive != GL_TRIANGLES) - rend_data_ctx.state.draw_arrays( - draw_param.attrib.m.primitive, draw_param.first, draw_param.count); - else - rend_data_ctx.state.draw_range_elements( - draw_param.attrib.m.primitive, draw_param.start, draw_param.end, - draw_param.count, GL_UNSIGNED_INT, (void*)draw_param.offset); - } - - static void draw_sprite_begin(render_data_context& rend_data_ctx) { + // 0x140638A80 + void SprMgr::begin_render(render_data_context& rend_data_ctx) { rend_data_ctx.state.disable_blend(); rend_data_ctx.state.active_bind_texture_2d(0, rctx_ptr->empty_texture_2d->glid); rend_data_ctx.state.bind_sampler(0, 0); @@ -1998,70 +2293,8 @@ namespace spr { rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); } - static void draw_sprite_copy_overlay_texture( - render_data_context& rend_data_ctx, const SprArgs& args, const mat4& mat, const vec3 vtx[4], - int32_t overlay_x_min, int32_t overlay_y_min, int32_t overlay_x_max, int32_t overlay_y_max) { - if (args.nb_quad || args.kind != SPR_KIND_NORMAL) - return; - - mat4 mat_t; - mat4_transpose(&mat, &mat_t); - - float_t x_min_coord = 0.0f; - float_t y_min_coord = 0.0f; - float_t x_max_coord = 0.0f; - float_t y_max_coord = 0.0f; - for (int32_t i = 0, j = 0; i < 4; i++) { - vec4 v; - *(vec3*)&v = vtx[i]; - v.w = 1.0f; - - const float_t w = vec4::dot(mat_t.row3, v); - if (w * w <= 0.0001f) - continue; - - const float_t x_coord = vec4::dot(mat_t.row0, v) * (1.0f / w); - const float_t y_coord = vec4::dot(mat_t.row1, v) * (1.0f / w); - if (j) { - if (x_min_coord > x_coord) - x_min_coord = x_coord; - else if (x_max_coord < x_coord) - x_max_coord = x_coord; - - if (y_min_coord > y_coord) - y_min_coord = y_coord; - else if (y_max_coord < y_coord) - y_max_coord = y_coord; - } - else { - x_min_coord = x_coord; - x_max_coord = x_coord; - y_min_coord = y_coord; - y_max_coord = y_coord; - } - j++; - } - - int32_t x_max = (int32_t)x_max_coord + 1; - int32_t y_max = (int32_t)y_max_coord + 1; - int32_t x_min = (int32_t)x_min_coord - 1; - int32_t y_min = (int32_t)y_min_coord - 1; - - x_max = clamp_def(x_max, overlay_x_min, overlay_x_min + overlay_x_max - 1); - y_max = clamp_def(y_max, overlay_y_min, overlay_y_min + overlay_y_max - 1); - x_min = clamp_def(x_min, overlay_x_min, overlay_x_min + overlay_x_max - 1); - y_min = clamp_def(y_min, overlay_y_min, overlay_y_min + overlay_y_max - 1); - - const int32_t width = x_max - x_min + 1; - const int32_t height = y_max - y_min + 1; - if (width * height > 0) { - rend_data_ctx.state.active_texture(7); - rend_data_ctx.state.copy_tex_sub_image_2d(GL_TEXTURE_2D, - 0, x_min, y_min, x_min, y_min, width, height); - } - } - - static void draw_sprite_end(render_data_context& rend_data_ctx) { + // 0x14063AF80 + void SprMgr::end_render(render_data_context& rend_data_ctx) { rend_data_ctx.state.disable_blend(); rend_data_ctx.state.active_bind_texture_2d(0, 0); rend_data_ctx.state.bind_sampler(0, 0); @@ -2072,122 +2305,63 @@ namespace spr { rend_data_ctx.state.set_blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ZERO); shader::unbind(rend_data_ctx.state); } - - static void draw_sprite_scale(SprArgs* args) { - SprTarget target = args->target; - SCREEN_MODE screen_mode = get_screen_param().mode; - while (args) { - screen_mode_scale_data data(args->screen_trans, screen_mode); - if (args->screen_trans != SCREEN_MODE_MAX - && args->screen_trans != screen_mode && (target < SPR_TARGET_FRONT_3D_SURF || target > SPR_TARGET_BACK)) { - float_t scale_x = data.scale.x; - float_t scale_y = data.scale.y; - float_t src_res_x = data.src_res.x; - float_t src_res_y = data.src_res.y; - float_t dst_res_x = data.dst_res.x; - float_t dst_res_y = data.dst_res.y; - args->trans.x = (args->trans.x - src_res_x) * scale_x + src_res_x; - args->trans.y = (args->trans.y - src_res_y) * scale_y + src_res_y; - args->trans.z = args->trans.z * scale_y; - - SprArgs::Quad* vtx = args->GetVertexArray(); - for (size_t i = args->nb_quad; 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; - } - } - - if (args->screen_scale != SCREEN_MODE_MAX) { - vec2 scale = get_screen_conv_scale(screen_mode, args->screen_scale); - args->scale.x = scale.x * args->scale.x; - args->scale.y = scale.y * args->scale.y; - } - args = args->next; - } - } } -SprSet::SprSet(uint32_t index) : flag(), spr_set(), -textures(), load_count(), ready() { - this->index = index; +SPRSET::SPRSET(uint32_t in_id) : flag(), spr_set(), +textures(), reference(), ready() { + id = in_id; hash = hash_murmurhash_empty; } -SprSet::~SprSet() { +SPRSET::~SPRSET() { } -const char* SprSet::GetName(spr_info info) { - //if (info.set_index & 0x1000) - if (info.set_index & 0x4000) - return spr_set->texname[info.index]; - else - return spr_set->sprname[info.index]; -} - -rectangle SprSet::GetRectangle(spr_info info) { - //if (info.set_index & 0x1000) { - if (info.set_index & 0x4000) { - texture* tex = textures[info.index]; - return { 0.0f, 0.0f, (float_t)tex->width, (float_t)tex->height }; +// 0x14063E410 +void SPRSET::request(const char* fname, const std::string mdata_dir, void* data) { + if (reference > 1) { + reference++; + return; } - spr::SprInfo* sprinfo = &spr_set->sprinfo[info.index]; - return { (float_t)(int32_t)sprinfo->px, (float_t)(int32_t)sprinfo->py, - (float_t)(int32_t)sprinfo->width, (float_t)(int32_t)sprinfo->height }; + reference = 1; + name.assign(fname); + + std::string farc_file(name); + size_t off = farc_file.rfind(".bin"); + if (off != -1 && off == farc_file.size() - 4) + farc_file.replace(off, 4, ".farc"); + + const char* dir = "./rom/2d/"; + if (mdata_dir.size() && ((data_struct*)data)->check_directory_exists(mdata_dir.c_str())) + dir = mdata_dir.c_str(); + + if (((data_struct*)data)->check_file_exists(dir, farc_file.c_str())) + file_handler.read_file(data, dir, farc_file.c_str(), fname, prj::MemCSystem, false); + ready = false; } -SCREEN_MODE SprSet::GetResolutionMode(spr_info info) { - //if (info.set_index & 0x1000) - if (info.set_index & 0x4000) - return SCREEN_MODE_HD; - else - return spr_set->sprdata[info.index].screen_mode; +// Added +void SPRSET::requestModern(uint32_t sethash, void* data) { + if (reference > 1) { + reference++; + return; + } + + std::string file; + if (((data_struct*)data)->get_file("root+/2d/", sethash, ".farc", file)) + file_handler.read_file(data, "root+/2d/", file.c_str(), prj::MemCSystem); + this->hash = sethash; + ready = false; } -texture* SprSet::GetTexture(spr_info info) { - //if (info.set_index & 0x1000) - if (info.set_index & 0x4000) - return textures[info.index]; - else - return textures[spr_set->sprinfo[info.index].texid]; -} - -bool SprSet::LoadData() { - const void* data = file_handler.get_data(); - size_t size = file_handler.get_size(); - if (!data || !size) - return false; - - prj::shared_ptr& alloc = alloc_handler; - alloc = prj::shared_ptr(new prj::stack_allocator); - - ::spr_set* set = alloc->allocate<::spr_set>(); - this->spr_set = set; - set->unpack_file(alloc, data, size, false); - return true; -} - -bool SprSet::LoadDataModern(const void* data, size_t size) { - if (!data || !size) - return false; - - prj::shared_ptr& alloc = alloc_handler; - alloc = prj::shared_ptr(new prj::stack_allocator); - - ::spr_set* set = alloc->allocate<::spr_set>(); - this->spr_set = set; - set->unpack_file(alloc, data, size, true); - file_handler.reset(); - return true; -} - -bool SprSet::LoadFile() { +// 0x14063F680 +bool SPRSET::wait() { if (ready) return false; else if (file_handler.check_not_ready()) return true; - else if (!LoadData() || !LoadTexture()) + else if (!readTable() || !readTexHeader()) return false; file_handler.reset(); @@ -2195,7 +2369,8 @@ bool SprSet::LoadFile() { return true; } -bool SprSet::LoadFileModern(sprite_database* spr_db) { +// Added +bool SPRSET::waitModern(SprDb* spr_db) { if (ready) return false; else if (file_handler.check_not_ready()) @@ -2234,13 +2409,13 @@ bool SprSet::LoadFileModern(sprite_database* spr_db) { if (!spi) return false; - sprite_database_file spr_db_file; + SprDbFile spr_db_file; spr_db_file.read(spi->data, spi->size, true); - spr_db_spr_set_file* spr_set_file = 0; + SprDbFile::SprSet* spr_set_file = 0; if (spr_db_file.ready) - for (spr_db_spr_set_file& m : spr_db_file.sprite_set) - if (m.id == hash) { + for (SprDbFile::SprSet& m : spr_db_file.set) + if (m.uid == hash) { spr_set_file = &m; break; } @@ -2248,10 +2423,12 @@ bool SprSet::LoadFileModern(sprite_database* spr_db) { if (!spr_set_file) return false; - if (spr_db_file.ready) - spr_db->parse(spr_set_file, name, sprite_ids); + if (spr_db_file.ready) { + spr_db->parse(spr_set_file, sprite_ids); + set_name.assign(spr_set_file->name); + } - if (!LoadDataModern(spr->data, spr->size) || !LoadTextureModern(spr->data, spr->size)) + if (!readTableModern(spr->data, spr->size) || !readTexHeaderModern(spr->data, spr->size)) return false; file_handler.reset(); @@ -2259,110 +2436,184 @@ bool SprSet::LoadFileModern(sprite_database* spr_db) { return true; } -bool SprSet::LoadTexture() { +// 0x14063C0D0 +void SPRSET::free() { + if (reference > 1) { + reference--; + return; + } + + file_handler.reset(); + freeTex(); + alloc_handler.reset(); + + spr_set = 0; + name.clear(); + ready = false; + reference = 0; +} + +// Added +void SPRSET::freeModern(SprDb* spr_db) { + if (reference > 1) { + reference--; + return; + } + + spr_db->freeSet(hash, id, set_name.c_str(), sprite_ids); + + file_handler.reset(); + freeTex(); + alloc_handler.reset(); + + spr_set = 0; + name.clear(); + ready = false; + reference = 0; + + hash = hash_murmurhash_empty; + set_name.clear(); + sprite_ids.clear(); +} + +// 0x14063C920 +int32_t SPRSET::getTexNum() const { + return spr_set->num_of_texture; +} + +// 0x14063C860 +int32_t SPRSET::getSprNum() const { + return spr_set->num_of_sprite; +} + +// 0x14063C410 +bool SPRSET::getReady() const { + return spr_set->ready; +} + +// Missing +int32_t SPRSET::getReference() const { + return reference; +} + +// Missing +const char* SPRSET::getFileName() const { + return name.c_str(); +} + +// 0x14063C950 +const texture* SPRSET::getTexture(SprId info) const { + //if (info.m.set_idx & 0x1000) + if (info.m.set_idx & 0x4000) + return textures[info.m.idx]; + else + return textures[spr_set->sprinfo[info.m.idx].texid]; +} + +// 0x14063C440 +const spr::SprArgs::Rect SPRSET::getRect(SprId in_id) const { + //if (in_id.m.set_idx & 0x1000) { + if (in_id.m.set_idx & 0x4000) { + texture* tex = textures[in_id.m.idx]; + return { 0.0f, 0.0f, (float_t)tex->width, (float_t)tex->height }; + } + + spr::SprInfo* sprinfo = &spr_set->sprinfo[in_id.m.idx]; + return { (float_t)(int32_t)sprinfo->px, (float_t)(int32_t)sprinfo->py, + (float_t)(int32_t)sprinfo->width, (float_t)(int32_t)sprinfo->height }; +} + +// 0x14063C350 +uint32_t SPRSET::getAttr(SprId in_id) const { + //if (in_id.m.set_idx & 0x1000) + if (in_id.m.set_idx & 0x4000) + return 0; + else + return spr_set->sprdata[in_id.m.idx].attr; +} + +// 0x14063C550 +SCREEN_MODE SPRSET::getScreen(SprId in_id) const { + //if (in_id.m.set_idx & 0x1000) + if (in_id.m.set_idx & 0x4000) + return SCREEN_MODE_HD; + else + return spr_set->sprdata[in_id.m.idx].screen_mode; +} + +// 0x14063C3A0 +const char* SPRSET::getName(SprId in_id) const { + //if (in_id.m.set_idx & 0x1000) + if (in_id.m.set_idx & 0x4000) + return spr_set->texname[in_id.m.idx]; + else + return spr_set->sprname[in_id.m.idx]; +} + +// 0x14063E220 +bool SPRSET::readTable() { + const void* data = file_handler.get_data(); + size_t size = file_handler.get_size(); + if (!data || !size) + return false; + + prj::shared_ptr& alloc = alloc_handler; + alloc = prj::shared_ptr(new prj::stack_allocator); + + ::spr_set* set = alloc->allocate<::spr_set>(); + this->spr_set = set; + set->unpack_file(alloc, data, size, false); + return true; +} + +// Added +bool SPRSET::readTableModern(const void* data, size_t size) { + if (!data || !size) + return false; + + prj::shared_ptr& alloc = alloc_handler; + alloc = prj::shared_ptr(new prj::stack_allocator); + + ::spr_set* set = alloc->allocate<::spr_set>(); + this->spr_set = set; + set->unpack_file(alloc, data, size, true); + file_handler.reset(); + return true; +} + +// 0x14063CCF0 +bool SPRSET::readTexHeader() { size_t data = (size_t)file_handler.get_data(); if (!data) return false; std::vector ids(spr_set->num_of_texture); - //uint32_t set_index = (uint32_t)(0x1000 | index & 0x0FFF); - uint32_t set_index = (uint32_t)(0x4000 | index & 0x3FFF); - uint32_t index = 0; + //uint32_t set_index = (uint32_t)(0x1000 | id & 0x0FFF); + uint32_t set_index = (uint32_t)(0x4000 | id & 0x3FFF); + uint32_t id = 0; for (uint32_t& i : ids) - i = (set_index << 16) | index++; + i = (set_index << 16) | id++; texture_txp_set_load(spr_set->txp, &textures, ids.data()); return !!textures; } -bool SprSet::LoadTextureModern(const void* data, size_t size) { +// Added +bool SPRSET::readTexHeaderModern(const void* data, size_t size) { if (!data || !size) return false; std::vector ids(spr_set->num_of_texture); - //uint32_t set_index = (uint32_t)(0x8000 | 0x1000 | index & 0x0FFF); - uint32_t set_index = (uint32_t)(0x8000 | 0x4000 | index & 0x3FFF); - uint32_t index = 0; + //uint32_t set_index = (uint32_t)(0x8000 | 0x1000 | id & 0x0FFF); + uint32_t set_index = (uint32_t)(0x8000 | 0x4000 | id & 0x3FFF); + uint32_t id = 0; for (uint32_t& i : ids) - i = (set_index << 16) | index++; + i = (set_index << 16) | id++; texture_txp_set_load(spr_set->txp, &textures, ids.data()); return !!textures; } -void SprSet::ReadFile(const char* file, std::string& mdata_dir, void* data) { - if (load_count > 1) { - load_count++; - return; - } - - load_count = 1; - this->file.assign(file); - - std::string farc_file(file); - size_t off = farc_file.rfind(".bin"); - if (off != -1 && off == farc_file.size() - 4) - farc_file.replace(off, 4, ".farc"); - - const char* dir = "./rom/2d/"; - if (mdata_dir.size() && ((data_struct*)data)->check_directory_exists(mdata_dir.c_str())) - dir = mdata_dir.c_str(); - - if (((data_struct*)data)->check_file_exists(dir, farc_file.c_str())) - file_handler.read_file(data, dir, farc_file.c_str(), file, prj::MemCSystem, false); - ready = false; -} - -void SprSet::ReadFileModern(uint32_t set_hash, void* data) { - if (load_count > 1) { - load_count++; - return; - } - - std::string file; - if (((data_struct*)data)->get_file("root+/2d/", set_hash, ".farc", file)) - file_handler.read_file(data, "root+/2d/", file.c_str(), prj::MemCSystem); - this->hash = set_hash; - ready = false; -} - -void SprSet::Unload() { - if (load_count > 1) { - load_count--; - return; - } - - file_handler.reset(); - UnloadTexture(); - alloc_handler.reset(); - - spr_set = 0; - file.clear(); - ready = false; - load_count = 0; -} - -void SprSet::UnloadModern(sprite_database* spr_db) { - if (load_count > 1) { - load_count--; - return; - } - - spr_db->remove_spr_set(hash, index, name.c_str(), sprite_ids); - - file_handler.reset(); - UnloadTexture(); - alloc_handler.reset(); - - spr_set = 0; - file.clear(); - ready = false; - load_count = 0; - - hash = hash_murmurhash_empty; - name.clear(); - sprite_ids.clear(); -} - -bool SprSet::UnloadTexture() { +// 0x14063C320 +bool SPRSET::freeTex() { if (spr_set && spr_set->txp) { delete spr_set->txp; spr_set->txp = 0; diff --git a/src/CRE/sprite.hpp b/src/CRE/sprite.hpp index bc173aac..ebf20caa 100644 --- a/src/CRE/sprite.hpp +++ b/src/CRE/sprite.hpp @@ -20,49 +20,32 @@ #define BREAK_SPRITE_VERTEX_LIMIT (1) +struct render_data_context; + namespace spr { - enum SprAttr : uint32_t { - /*M_SPR_ATTR_SCALESIZE_X = 0x800, - M_SPR_ATTR_SCALESIZE_Y = 0x1000, - M_SPR_ATTR_RATIOCROP = 0x2000, - M_SPR_ATTR_IGNR_FMTRC = 0x4000, - M_SPR_ATTR_NOTCORRECT_P = 0x8000, - M_SPR_ATTR_NOTCORRECT_S = 0x10000, - M_SPR_ATTR_MULTI = 0x40000, - M_SPR_ATTR_BACKGROUND = 0x80000, - M_SPR_ATTR_POLY = 0x1000000, - M_SPR_ATTR_MESH = 0x2000000, - M_SPR_ATTR_LINEAR = 0x4000000, - M_SPR_ATTR_TEXTURE = 0x8000000, - M_SPR_ATTR_EDGELINE = 0x10000000, - M_SPR_ATTR_CROPPED = 0x20000000, - M_SPR_ATTR_REQUESTED = 0x40000000, - M_SPR_ATTR_ALLOCATED = 0x80000000, - M_SPR_ATTR_SCALESIZE = 0x1800, - M_SPR_ATTR_NOTCORRECT = 0x18000,*/ + enum SPR_ATTR : uint32_t { + M_SPR_ATTR_SHAPED = 0x00000001, + M_SPR_ATTR_CROPPED = 0x00000002, - SPR_ATTR_SHAPED = 0x00000001, - SPR_ATTR_CROPPED = 0x00000002, + M_SPR_ATTR_FLIP_H = 0x00010000, + M_SPR_ATTR_FLIP_V = 0x00020000, + M_SPR_ATTR_CTR_LT = 0x00040000, + M_SPR_ATTR_CTR_CT = 0x00080000, + M_SPR_ATTR_CTR_RT = 0x00100000, + M_SPR_ATTR_CTR_LC = 0x00200000, + M_SPR_ATTR_CTR_CC = 0x00400000, + M_SPR_ATTR_CTR_RC = 0x00800000, + M_SPR_ATTR_CTR_LB = 0x01000000, + M_SPR_ATTR_CTR_CB = 0x02000000, + M_SPR_ATTR_CTR_RB = 0x04000000, + M_SPR_ATTR_NOTRANSFORM = 0x08000000, + M_SPR_ATTR_EDGELINE = 0x10000000, + M_SPR_ATTR_IGNORE_ALPHA = 0x20000000, - SPR_ATTR_FLIP_H = 0x00010000, - SPR_ATTR_FLIP_V = 0x00020000, - SPR_ATTR_CTR_LT = 0x00040000, - SPR_ATTR_CTR_CT = 0x00080000, - SPR_ATTR_CTR_RT = 0x00100000, - SPR_ATTR_CTR_LC = 0x00200000, - SPR_ATTR_CTR_CC = 0x00400000, - SPR_ATTR_CTR_RC = 0x00800000, - SPR_ATTR_CTR_LB = 0x01000000, - SPR_ATTR_CTR_CB = 0x02000000, - SPR_ATTR_CTR_RB = 0x04000000, - SPR_ATTR_NOTRANSFORM = 0x08000000, - SPR_ATTR_EDGELINE = 0x10000000, - SPR_ATTR_IGNORE_ALPHA = 0x20000000, - - SPR_ATTR_CTR_ALL = 0x07FC0000, + M_SPR_ATTR_CTR_ALL = 0x07FC0000, }; - enum SprBlend { + enum SPR_BLEND { SPR_BLEND_DEFAULT = 0, SPR_BLEND_SCREEN, SPR_BLEND_ADD, @@ -84,27 +67,13 @@ namespace spr { SPR_KIND_STRIP, }; - enum SprLayer { + enum SPR_LAYER { SPR_LAYER_DEFAULT = 0, SPR_LAYER_1, SPR_LAYER_MAX, }; - enum SprPrio { - /*SPR_PRIO_INFORMATION = SPR_PRIO_11, - SPR_PRIO_FRONTSIDE = SPR_PRIO_20, - SPR_PRIO_FOREGROUND = SPR_PRIO_24, - SPR_PRIO_SCREENSAVER = SPR_PRIO_30, - SPR_PRIO_VISTAFRAME = SPR_PRIO_23, - SPR_PRIO_PHASE_BACKGROUND_STA = SPR_PRIO_00, - SPR_PRIO_PHASE_BACKGROUND_END = SPR_PRIO_04, - SPR_PRIO_PHASE_DEFAULT_STA = SPR_PRIO_05, - SPR_PRIO_PHASE_DEFAULT_END = SPR_PRIO_20, - SPR_PRIO_PHASE_FOREGROUND_STA = SPR_PRIO_21, - SPR_PRIO_PHASE_FOREGROUND_END = SPR_PRIO_26, - SPR_PRIO_PHASE_DEBUG_STA = SPR_PRIO_27, - SPR_PRIO_PHASE_DEBUG_END = SPR_PRIO_31,*/ - + enum SPR_PRIO { SPR_PRIO_00 = 0, SPR_PRIO_01, SPR_PRIO_02, @@ -151,7 +120,7 @@ namespace spr { SPR_PRIO_INFORMATION = SPR_PRIO_25, }; - enum SprTarget { + enum SPR_TARGET { SPR_TARGET_DEFAULT = -1, SPR_TARGET_FRONT = 0, @@ -167,39 +136,50 @@ namespace spr { TEXTURE_POS_SIZE = 0x02, }; - union IDUnion { - int32_t index; - uint32_t id; - spr_info info; - - IDUnion() { - index = -1; - id = -1; - info = {}; - } - }; - struct Rect { float_t x; float_t y; float_t width; float_t height; + + inline Rect() : x(), y(), width(), height() { + + } + + inline Rect(float_t x, float_t y, float_t width, float_t height) + : x(x), y(y), width(width), height(height) { + + } }; struct Quad { vec3 pos; vec2 uv; color4u8 color; + + inline Quad() { + + } + }; + + struct TexParam { + const ::texture* texture; + vec2 uv[4]; + uint32_t attr; + + inline TexParam() : texture(), attr() { + + } }; SprKind kind; - IDUnion id; + SprId id; color4u8 color; - SprAttr attr; - SprBlend blend; - SprTarget target; - SprLayer layer; - SprPrio prio; + SPR_ATTR attr; + SPR_BLEND blend; + SPR_TARGET target; + SPR_LAYER layer; + SPR_PRIO prio; SCREEN_MODE screen_trans; SCREEN_MODE screen_scale; vec3 anchor; @@ -223,63 +203,85 @@ namespace spr { Rect rect; SprArgs* next; + static const GLenum blend_table[][4]; + SprArgs(); - SprArgs::Quad* GetVertexArray(); - void Reset(); - void SetRect(float_t x, float_t y, float_t width, float_t height); - void SetQuadArgs(SprArgs::Quad* quad_arg, size_t len); - void SetSize(vec2 size); + void draw(render_data_context& rend_data_ctx, const mat4& mat, + int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); + SprArgs::Quad* getQuadArgs(); + void init(); + void setChild(SprArgs* args); + void setQuadArgs(const SprArgs::Quad* quad_arg, size_t len); + void setRect(float_t x, float_t y, float_t width, float_t height); + void setSize(vec2 in_size); - static void SetChild(SprArgs* args, SprArgs* next); + static void addDraw(SprArgs* args_array[0x100], + const int32_t args_count, bool in_scale, struct SprArgsDraw& args_draw); + + private: + int32_t calcTexture(SprArgs::TexParam* param, vec3 vertex[4], bool in_scale); + int32_t calcTextureVertex(vec3 vertex[4], SprArgs::TexParam* param, bool in_scale); + void calcVertex(vec3 vertex[4], mat4* trans_matrix, bool in_scale); + void correctResolution(); + void drawObject(render_data_context& rend_data_ctx, const mat4& mat, + int32_t x_min, int32_t y_min, int32_t x_max, int32_t y_max, texture* overlay_tex); + void drawObjectCopyOverlayTex(render_data_context& rend_data_ctx, const mat4& mat, const vec3 vertex[4], + int32_t over_x_min, int32_t over_y_min, int32_t over_x_max, int32_t over_y_max); }; - vec2 proj_sprite_3d_line(vec3 vec, bool offset); - - void put_cross(const mat4& mat, color4u8 color_x, color4u8 color_y, color4u8 color_z); - void put_rgb_cross(const mat4& mat); - SprArgs* put_sprite(const SprArgs& args, const sprite_database* spr_db); - void put_sprite_3d_line(vec3 p1, vec3 p2, color4u8 color); - void put_sprite_line(vec2 p1, vec2 p2, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer = spr::SPR_LAYER_DEFAULT); - void put_sprite_poly_line(vec2* points, size_t count, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer = spr::SPR_LAYER_DEFAULT); - void put_sprite_line_box(rectangle rect, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer = spr::SPR_LAYER_DEFAULT); - void put_sprite_rect(rectangle rect, SCREEN_MODE screen_mode, - SprPrio prio, color4u8 color, SprLayer layer = spr::SPR_LAYER_DEFAULT); - void put_sprite_strip(SprArgs::Quad* vert, size_t num, SCREEN_MODE screen_mode, - SprPrio prio, int32_t spr_id, SprLayer layer = spr::SPR_LAYER_DEFAULT, const sprite_database* spr_db = 0); + extern void dest(); + extern void dest(const SprDb* spr_db); + extern void flush(render_data_context& rend_data_ctx, + SPR_TARGET target, bool in_scale, texture* overlay_tex, const mat4& vp); + extern void free(const std::vector& setids, const SprDb* spr_db); + extern void free(uint32_t setid, const SprDb* spr_db); + extern void freeModern(const std::vector& sethashes, SprDb* spr_db); // Added + extern void freeModern(uint32_t sethash, SprDb* spr_db); // Added + extern const char* getName(uint32_t uid, const SprDb* spr_db); + extern size_t getObjListCount(SPR_TARGET target); + extern bool getReady(uint32_t setid, const SprDb* spr_db); + extern const SprArgs::Rect getRect(uint32_t uid, const SprDb* spr_db); + extern uint32_t getSprNum(uint32_t setid, const SprDb* spr_db); + extern SPR_TARGET getTarget(); + extern uint32_t getTexNum(uint32_t setid, const SprDb* spr_db); + extern const texture* getTexture(uint32_t uid, const SprDb* spr_db); + extern void getViewport(SCREEN_MODE& screen, rectangle& rect, SPR_LAYER layer); + extern void init(); + extern void init(const SprDb* spr_db); + extern void postFlush(); + extern void preFlush(); + extern SprArgs* putLine(vec2 p0, vec2 p1, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT); + extern void putLineBox(rectangle rect, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT); + extern SprArgs* putLines(const vec2* pos_arg, size_t len, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT); + extern void putMask(); + extern SprArgs* putObject(const SprArgs& args, const SprDb* spr_db); + extern SprArgs* put(const SprArgs& args, const SprDb* spr_db); + extern void putPolyLine(const vec2* pos_arg, size_t len, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT); + extern void putRect(rectangle rect, SCREEN_MODE screen, + SPR_PRIO prio, color4u8 color, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT); + extern void putStrip(const SprArgs::Quad* quad_arg, size_t len, SCREEN_MODE screen, + SPR_PRIO prio, uint32_t spr_id, SPR_LAYER layer = spr::SPR_LAYER_DEFAULT, const SprDb* spr_db = 0); + extern void refresh(); + extern void request(const std::vector& setids, + const std::string mdata_dir, void* data, const SprDb* spr_db); + extern void request(uint32_t setid, const std::string mdata_dir, void* data, const SprDb* spr_db); + extern void requestModern(const std::vector& sethashes, void* data, SprDb* spr_db); // Added + extern void requestModern(uint32_t sethash, void* data, SprDb* spr_db); // Added + extern void setProjection(SPR_LAYER layer, float_t aspect); + extern void setTarget(SPR_TARGET in_target); + extern void setViewport(SPR_LAYER layer, SCREEN_MODE screen, const rectangle rect); + extern bool wait(const std::vector& setids, const SprDb* spr_db); + extern bool wait(uint32_t setid, const SprDb* spr_db); + extern bool waitModern(const std::vector& sethashes, SprDb* spr_db); + extern bool waitModern(uint32_t sethash, SprDb* spr_db); // Added } extern void sprite_manager_init(); -extern void sprite_manager_add_spr_sets(const sprite_database* spr_db); -extern void sprite_manager_clear(); -extern void sprite_manager_draw(struct render_data_context& rend_data_ctx, - int32_t index, bool font, texture* overlay_tex, const mat4& vp); -extern spr::SprTarget sprite_manager_get_target(); -extern size_t sprite_manager_get_reqlist_count(int32_t index); -extern ::spr_set* sprite_manager_get_set(uint32_t set_id, const sprite_database* spr_db); -extern bool sprite_manager_get_set_ready(uint32_t set_id, const sprite_database* spr_db); -extern uint32_t sprite_manager_get_set_sprite_num(uint32_t set_id, const sprite_database* spr_db); -extern uint32_t sprite_manager_get_set_texture_num(uint32_t set_id, const sprite_database* spr_db); -extern const char* sprite_manager_get_spr_name(uint32_t spr_id, const sprite_database* spr_db); -extern rectangle sprite_manager_get_spr_rectangle(uint32_t spr_id, const sprite_database* spr_db); -extern texture* sprite_manager_get_spr_texture(uint32_t spr_id, const sprite_database* spr_db); -extern bool sprite_manager_load_file(uint32_t set_id, const sprite_database* spr_db); -extern bool sprite_manager_load_file_modern(uint32_t set_hash, sprite_database* spr_db); -extern void sprite_manager_post_draw(); -extern void sprite_manager_pre_draw(); -extern void sprite_manager_read_file(uint32_t set_id, - std::string& mdata_dir, void* data, const sprite_database* spr_db); -extern void sprite_manager_read_file(uint32_t set_id, - std::string&& mdata_dir, void* data, const sprite_database* spr_db); -extern void sprite_manager_read_file_modern(uint32_t set_hash, void* data, sprite_database* spr_db); -extern void sprite_manager_remove_spr_sets(const sprite_database* spr_db); -extern void sprite_manager_reset_req_list(); -extern void sprite_manager_reset_res_data(); -extern void sprite_manager_set_target(spr::SprTarget value); +extern ::spr_set* sprite_manager_get_set(uint32_t set_id, const SprDb* spr_db); extern void sprite_manager_set_res(double_t aspect, int32_t width, int32_t height); -extern void sprite_manager_unload_set(uint32_t set_id, const sprite_database* spr_db); -extern void sprite_manager_unload_set_modern(uint32_t set_hash, sprite_database* spr_db); extern void sprite_manager_free(); diff --git a/src/KKdLib/database/sprite.cpp b/src/KKdLib/database/sprite.cpp index 4417f598..ea492dad 100644 --- a/src/KKdLib/database/sprite.cpp +++ b/src/KKdLib/database/sprite.cpp @@ -12,60 +12,43 @@ #include "../sort.hpp" #include "../str_utils.hpp" -static void sprite_database_file_classic_read_inner(sprite_database_file* spr_db, stream& s); -static void sprite_database_file_classic_write_inner(sprite_database_file* spr_db, stream& s); -static void sprite_database_file_modern_read_inner(sprite_database_file* spr_db, stream& s, uint32_t header_length); -static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db, stream& s); +static void sprite_database_file_classic_read_inner(SprDbFile* spr_db, stream& s); +static void sprite_database_file_classic_write_inner(SprDbFile* spr_db, stream& s); +static void sprite_database_file_modern_read_inner(SprDbFile* spr_db, stream& s, uint32_t header_length); +static void sprite_database_file_modern_write_inner(SprDbFile* spr_db, stream& s); static int64_t sprite_database_file_strings_get_string_offset(const std::vector& vec, const std::vector& vec_off, const std::string& str); static bool sprite_database_file_strings_push_back_check(std::vector& vec, const std::string& str); -const spr_db_spr_set spr_db_spr_set_null; -const spr_db_spr spr_db_spr_null; +const SprDb::SprSet SprDb::s_err_set; +const SprDb::Spr SprDb::s_err_spr; -spr_db_spr_file::spr_db_spr_file() : index(), texture() { +SprDbFile::Spr::Spr() : id(), texture() { + uid = -1; +} + +SprDbFile::Spr::~Spr() { + +} + +SprDbFile::SprSet::SprSet() { + uid = -1; id = -1; } -spr_db_spr_file::~spr_db_spr_file() { +SprDbFile::SprSet::~SprSet() { } -spr_db_spr::spr_db_spr() : load_count() { - id = -1; -} - -spr_db_spr::~spr_db_spr() { +SprDbFile::SprDbFile() : ready(), modern(), big_endian(), is_x() { } -spr_db_spr_set_file::spr_db_spr_set_file() { - id = -1; - index = -1; -} - -spr_db_spr_set_file::~spr_db_spr_set_file() { +SprDbFile::~SprDbFile() { } -spr_db_spr_set::spr_db_spr_set() { - id = -1; - index = -1; -} - -spr_db_spr_set::~spr_db_spr_set() { - -} - -sprite_database_file::sprite_database_file() : ready(), modern(), big_endian(), is_x() { - -} - -sprite_database_file::~sprite_database_file() { - -} - -void sprite_database_file::read(const char* path, bool modern) { +void SprDbFile::read(const char* path, bool modern) { if (!path) return; @@ -107,7 +90,7 @@ void sprite_database_file::read(const char* path, bool modern) { } } -void sprite_database_file::read(const wchar_t* path, bool modern) { +void SprDbFile::read(const wchar_t* path, bool modern) { if (!path) return; @@ -149,7 +132,7 @@ void sprite_database_file::read(const wchar_t* path, bool modern) { } } -void sprite_database_file::read(const void* data, size_t size, bool modern) { +void SprDbFile::read(const void* data, size_t size, bool modern) { if (!data || !size) return; @@ -170,7 +153,7 @@ void sprite_database_file::read(const void* data, size_t size, bool modern) { } } -void sprite_database_file::write(const char* path) { +void SprDbFile::write(const char* path) { if (!path || !ready) return; @@ -198,7 +181,7 @@ void sprite_database_file::write(const char* path) { } } -void sprite_database_file::write(const wchar_t* path) { +void SprDbFile::write(const wchar_t* path) { if (!path || !ready) return; @@ -226,7 +209,7 @@ void sprite_database_file::write(const wchar_t* path) { } } -void sprite_database_file::write(void** data, size_t* size) { +void SprDbFile::write(void** data, size_t* size) { if (!data || !size || !ready) return; @@ -240,7 +223,7 @@ void sprite_database_file::write(void** data, size_t* size) { s.copy(data, size); } -bool sprite_database_file::load_file(void* data, const char* dir, const char* file, uint32_t hash) { +bool SprDbFile::load_file(void* data, const char* dir, const char* file, uint32_t hash) { size_t file_len = utf8_length(file); const char* t = strrchr(file, '.'); @@ -250,317 +233,381 @@ bool sprite_database_file::load_file(void* data, const char* dir, const char* fi std::string path(dir); path.append(file, file_len); - sprite_database_file* spr_db = (sprite_database_file*)data; + SprDbFile* spr_db = (SprDbFile*)data; spr_db->read(path.c_str(), spr_db->modern); return spr_db->ready; } -sprite_database::sprite_database() { +SprDb::Spr::Spr() : reference() { + uid = -1; +} + +SprDb::Spr::~Spr() { } -sprite_database::~sprite_database() { +SprDb::SprSet::SprSet() { + uid = -1; + id = -1; +} + +SprDb::SprSet::~SprSet() { } -void sprite_database::add(sprite_database_file* spr_db_file) { +SprDb::SprDb() { + +} + +SprDb::~SprDb() { + +} + +void SprDb::add(SprDbFile* spr_db_file) { if (!spr_db_file || !spr_db_file->ready) return; - size_t sprite_sets_count = this->spr_set_ids.size(); + size_t set_count = this->set_uid.size(); - spr_set_ids.reserve(spr_db_file->sprite_set.size()); - spr_set_indices.reserve(spr_db_file->sprite_set.size()); - spr_set_names.reserve(spr_db_file->sprite_set.size()); + set_uid.reserve(spr_db_file->set.size()); + set_idx.reserve(spr_db_file->set.size()); + set_name.reserve(spr_db_file->set.size()); - for (spr_db_spr_set_file& i : spr_db_file->sprite_set) { - spr_sets.push_back({}); - spr_db_spr_set& spr_set = spr_sets.back(); - spr_set.id = i.id; - spr_set.name.assign(i.name); - spr_set.file_name.assign(i.file_name); - spr_set.index = (uint32_t)(sprite_sets_count + i.index); + for (SprDbFile::SprSet& i : spr_db_file->set) { + this->set.push_back({}); + SprDb::SprSet& set = this->set.back(); + set.uid = i.uid; + set.name.assign(i.name); + set.file.assign(i.file); + set.id = (uint32_t)(set_count + i.id); - spr_set_ids.push_back(spr_set.id, &spr_set); - spr_set_indices.push_back(spr_set.index, &spr_set); - spr_set_names.push_back(spr_set.name, &spr_set); + set_uid.push_back(set.uid, &set); + set_idx.push_back(set.id, &set); + set_name.push_back(set.name, &set); - spr_ids.reserve(i.sprite.size()); - spr_names.reserve(i.sprite.size()); - spr_indices.reserve(i.sprite.size()); + spr_uid.reserve(i.sprite.size()); + spr_name.reserve(i.sprite.size()); + spr_idx.reserve(i.sprite.size()); - for (spr_db_spr_file& j : i.sprite) { - sprs.push_back({}); - spr_db_spr& spr = sprs.back(); - spr.id = j.id; + for (SprDbFile::Spr& j : i.sprite) { + this->spr.push_back({}); + SprDb::Spr& spr = this->spr.back(); + spr.uid = j.uid; spr.name.assign(j.name); - //spr.info = { j.index, (uint16_t)((j.texture ? 0x1000 : 0x0000) | spr_set.index) }; - spr.info = { j.index, (uint16_t)((j.texture ? 0x4000 : 0x0000) | spr_set.index) }; - spr.load_count = 1; + //spr.id = { j.id, (uint16_t)((j.texture ? 0x1000 : 0x0000) | set.id) }; + spr.id = { j.id, (uint16_t)((j.texture ? 0x4000 : 0x0000) | set.id) }; + spr.reference = 1; - spr_ids.push_back(spr.id, &spr); - spr_names.push_back(spr.name, &spr); - spr_indices.push_back(spr.info, &spr); + spr_uid.push_back(spr.uid, &spr); + spr_name.push_back(spr.name, &spr); + spr_idx.push_back(spr.id, &spr); } } - spr_set_ids.combine(); - spr_set_indices.combine(); - spr_set_names.combine(); - spr_ids.combine(); - spr_names.combine(); - spr_indices.combine(); + set_uid.combine(); + set_idx.combine(); + set_name.combine(); + spr_uid.combine(); + spr_name.combine(); + spr_idx.combine(); } -void sprite_database::clear() { - spr_sets.clear(); - spr_set_ids.clear(); - spr_set_indices.clear(); - spr_set_names.clear(); - sprs.clear(); - spr_ids.clear(); - spr_names.clear(); - spr_indices.clear(); +void SprDb::clear() { + set.clear(); + set_uid.clear(); + set_idx.clear(); + set_name.clear(); + spr.clear(); + spr_uid.clear(); + spr_name.clear(); + spr_idx.clear(); } -void sprite_database::add_spr_set(uint32_t set_id, uint32_t index) { - if (set_id == -1 || set_id == hash_murmurhash_empty) +void SprDb::addSet(uint32_t set_uid, uint32_t id) { + if (set_uid == -1 || set_uid == hash_murmurhash_empty) return; - spr_sets.push_back({}); - spr_db_spr_set& set = spr_sets.back(); - set.id = set_id; - set.index = index; + this->set.push_back({}); + SprDb::SprSet& set = this->set.back(); + set.uid = set_uid; + set.id = id; - spr_set_indices.push_back(set.index, &set); - spr_set_ids.push_back(set.id, &set); + this->set_uid.push_back(set.uid, &set); + this->set_idx.push_back(set.id, &set); - spr_set_indices.combine(); - spr_set_ids.combine(); + this->set_uid.combine(); + this->set_idx.combine(); } -void sprite_database::parse(const spr_db_spr_set_file* set_file, - std::string& set_name, std::vector& sprite_ids) { - if (!set_file) - return; - - auto elem = spr_set_ids.find(set_file->id); - if (elem == spr_set_ids.end()) - return; - - uint16_t set_index = (uint16_t)elem->second->index; - - spr_db_spr_set* spr_set = elem->second; - spr_set->name.assign(set_file->name); - spr_set->file_name.assign(set_file->file_name); - - spr_set_names.push_back(set_file->name, elem->second); - - sprite_ids.reserve(set_file->sprite.size()); - for (const spr_db_spr_file& i : set_file->sprite) { - uint32_t id = i.id; - sprite_ids.push_back(id); - - auto j_begin = sprs.begin(); - auto j_end = sprs.end(); - auto j = j_begin; - while (j != j_end) - if (j->id == id) - break; - else - j++; - - spr_db_spr* spr; - if (j == j_end) { - sprs.push_back({}); - spr = &sprs.back(); - } - else - spr = &*j; - - spr->id = id; - spr->name.assign(i.name); - //spr->info = { i.index, (uint16_t)((i.texture ? 0x1000 : 0x0000) | set_index) }; - spr->info = { i.index, (uint16_t)((i.texture ? 0x4000 : 0x0000) | set_index) }; - spr->load_count++; - - spr_ids.push_back(spr->id, spr); - spr_names.push_back(spr->name, spr); - spr_indices.push_back(spr->info, spr); - } - - spr_set_names.combine(); - spr_ids.combine(); - spr_names.combine(); - spr_indices.combine(); -} - -void sprite_database::remove_spr_set(uint32_t set_id, uint32_t index, +void SprDb::freeSet(uint32_t set_uid, uint32_t id, const char* set_name, std::vector& sprite_ids) { if (set_name && *set_name) { - auto elem = spr_set_names.find(set_name); - if (elem != spr_set_names.end()) - spr_set_names.erase(elem); + auto elem = this->set_name.find(set_name); + if (elem != this->set_name.end()) + this->set_name.erase(elem); } - if (index != -1) { - auto elem = spr_set_indices.find(index); - if (elem != spr_set_indices.end()) - spr_set_indices.erase(elem); + if (id != -1) { + auto elem = set_idx.find(id); + if (elem != set_idx.end()) + set_idx.erase(elem); } - if (set_id != -1 && set_id != hash_murmurhash_empty) { - auto elem = spr_set_ids.find(set_id); - if (elem != spr_set_ids.end()) - spr_set_ids.erase(elem); + if (set_uid != -1 && set_uid != hash_murmurhash_empty) { + auto elem = this->set_uid.find(set_uid); + if (elem != this->set_uid.end()) + this->set_uid.erase(elem); - auto i_begin = spr_sets.begin(); - auto i_end = spr_sets.end(); + auto i_begin = set.begin(); + auto i_end = set.end(); auto i = i_begin; while (i != i_end) - if (i->id == set_id) { - i = spr_sets.erase(i); - i_end = spr_sets.end(); + if (i->uid == set_uid) { + i = set.erase(i); + i_end = set.end(); } else i++; } for (auto& i : sprite_ids) { - auto j_begin = sprs.begin(); - auto j_end = sprs.end(); + auto j_begin = spr.begin(); + auto j_end = spr.end(); auto j = j_begin; while (j != j_end) { - if (j->id != i || --j->load_count > 0) { + if (j->uid != i || --j->reference > 0) { j++; continue; } - auto elem_id = spr_ids.find(j->id); - if (elem_id != spr_ids.end()) - spr_ids.erase(elem_id); + auto elem_uid = spr_uid.find(j->uid); + if (elem_uid != spr_uid.end()) + spr_uid.erase(elem_uid); - auto elem_index = spr_indices.find(j->info); - if (elem_index != spr_indices.end()) - spr_indices.erase(elem_index); + auto elem_idx = spr_idx.find(j->id); + if (elem_idx != spr_idx.end()) + spr_idx.erase(elem_idx); - auto elem_name = spr_names.find(j->name); - if (elem_name != spr_names.end()) - spr_names.erase(elem_name); + auto elem_name = spr_name.find(j->name); + if (elem_name != spr_name.end()) + spr_name.erase(elem_name); - j = sprs.erase(j); + j = spr.erase(j); } } } -const spr_db_spr_set* sprite_database::get_spr_set_by_name(const char* name) const { - auto elem = spr_set_names.find(std::string(name)); - if (elem != spr_set_names.end()) - return elem->second; - return &spr_db_spr_set_null; +void SprDb::parse(const SprDbFile::SprSet* set_file, std::vector& sprite_ids) { + if (!set_file) + return; + + auto elem = set_uid.find(set_file->uid); + if (elem == set_uid.end()) + return; + + uint16_t set_id = (uint16_t)elem->second->id; + + SprDb::SprSet* set = elem->second; + set->name.assign(set_file->name); + set->file.assign(set_file->file); + + this->set_name.push_back(set_file->name, elem->second); + + sprite_ids.reserve(set_file->sprite.size()); + for (const SprDbFile::Spr& i : set_file->sprite) { + uint32_t uid = i.uid; + sprite_ids.push_back(uid); + + auto j_begin = spr.begin(); + auto j_end = spr.end(); + auto j = j_begin; + while (j != j_end) + if (j->uid == uid) + break; + else + j++; + + SprDb::Spr* spr; + if (j == j_end) { + this->spr.push_back({}); + spr = &this->spr.back(); + } + else + spr = &*j; + + spr->uid = uid; + spr->name.assign(i.name); + //spr->id = { i.id, (uint16_t)((i.texture ? 0x1000 : 0x0000) | set_id) }; + spr->id = { i.id, (uint16_t)((i.texture ? 0x4000 : 0x0000) | set_id) }; + spr->reference++; + + spr_uid.push_back(spr->uid, spr); + spr_name.push_back(spr->name, spr); + spr_idx.push_back(spr->id, spr); + } + + this->set_name.combine(); + spr_uid.combine(); + spr_name.combine(); + spr_idx.combine(); } -const spr_db_spr_set* sprite_database::get_spr_set_by_id(uint32_t set_id) const { - auto elem = spr_set_ids.find(set_id); - if (elem != spr_set_ids.end()) - return elem->second; - return &spr_db_spr_set_null; +uint32_t SprDb::getSetSize() const { + return (uint32_t)set.size(); } -const spr_db_spr_set* sprite_database::get_spr_set_by_index(uint32_t index) const { - auto elem = spr_set_indices.find(index); - if (elem != spr_set_indices.end()) - return elem->second; - return &spr_db_spr_set_null; +const char* SprDb::getSetNameFromUid(uint32_t uid) const { + return getSetFromUid(uid).name.c_str(); } -const spr_db_spr* sprite_database::get_spr_by_name(const char* name) const { - auto elem = spr_names.find(std::string(name)); - if (elem != spr_names.end()) - return elem->second; - return &spr_db_spr_null; +const char* SprDb::getSetFileFromUid(uint32_t uid) const { + return getSetFromUid(uid).file.c_str(); } -const spr_db_spr* sprite_database::get_spr_by_id(uint32_t id) const { - auto elem = spr_ids.find(id); - if (elem != spr_ids.end()) - return elem->second; - return &spr_db_spr_null; +uint32_t SprDb::getSetIdFromUid(uint32_t uid) const { + return getSetFromUid(uid).id; } -const spr_db_spr* sprite_database::get_spr_by_set_id_index(uint32_t set_id, uint32_t index) const { - auto elem = spr_indices.find({ (uint16_t)index, (uint16_t)get_spr_set_by_id(set_id)->index }); - if (elem != spr_indices.end()) - return elem->second; - return &spr_db_spr_null; +uint32_t SprDb::getSetUidFromIdx(uint32_t idx) const { + return set_name[idx].second->uid; } -const spr_db_spr* sprite_database::get_tex_by_set_id_index(uint32_t set_id, uint32_t index) const { - //auto elem = spr_indices.find({ (uint16_t)index, (uint16_t)(0x1000 | get_spr_set_by_id(set_id)->index) }); - auto elem = spr_indices.find({ (uint16_t)index, (uint16_t)(0x4000 | get_spr_set_by_id(set_id)->index) }); - if (elem != spr_indices.end()) - return elem->second; - return &spr_db_spr_null; +const char* SprDb::getSetNameFromIdx(uint32_t idx) const { + return getSetFromIdx(idx).name.c_str(); } -uint32_t sprite_database::get_spr_id_by_name(const char* name) const { - return get_spr_by_name(name)->id; +const char* SprDb::getSetFileFromIdx(uint32_t idx) const { + return getSetFromIdx(idx).file.c_str(); } -const char* sprite_database::get_spr_set_file_name(uint32_t set_id) const { - return get_spr_set_by_id(set_id)->file_name.c_str(); +uint32_t SprDb::getSetUidFromName(const std::string& name) const { + return getSetFromName(name).uid; } -uint32_t sprite_database::get_spr_set_id_by_name(const char* name) const { - return get_spr_set_by_name(name)->id; +uint32_t SprDb::getSetIdFromName(const std::string& name) const { + return getSetFromName(name).id; } -uint32_t sprite_database::get_spr_set_id_by_name_index(uint32_t index) const { - return spr_set_names[index].second->id; +uint32_t SprDb::getSetIdFromIdx(uint32_t idx) const { + return getSetFromIdx(idx).id; } -const char* sprite_database::get_spr_set_name(uint32_t set_id) const { - return get_spr_set_by_id(set_id)->name.c_str(); +uint32_t SprDb::getSprIdFromUid(uint32_t uid) const { + return getSprFromUid(uid).id.w; } -static void sprite_database_file_classic_read_inner(sprite_database_file* spr_db, stream& s) { - uint32_t sprite_sets_count = s.read_uint32_t(); - uint32_t sprite_sets_offset = s.read_uint32_t(); - uint32_t sprites_count = s.read_uint32_t(); - uint32_t sprites_offset = s.read_uint32_t(); +uint32_t SprDb::getSprUidFromName(const std::string& name) const { + return getSprFromName(name).uid; +} - spr_db->sprite_set.resize(sprite_sets_count); +uint32_t SprDb::getSprIdFromName(const std::string& name) const { + return getSprFromName(name).id.w; +} - spr_db_spr_set_file* spr_db_spr_set = spr_db->sprite_set.data(); +uint32_t SprDb::getSprUidFromIdx(uint32_t set_uid, uint32_t idx) const { + return getSprFromIdx(set_uid, idx).uid; +} - s.position_push(sprite_sets_offset, SEEK_SET); - for (uint32_t i = 0; i < sprite_sets_count; i++) { - spr_db_spr_set_file& spr_set = spr_db_spr_set[i]; - spr_set.id = s.read_uint32_t(); - spr_set.name = s.read_string_null_terminated_offset(s.read_uint32_t()); - spr_set.file_name = s.read_string_null_terminated_offset(s.read_uint32_t()); - spr_set.index = s.read_uint32_t(); +uint32_t SprDb::getSprIdFromIdx(uint32_t set_uid, uint32_t idx) const { + return getSprFromIdx(set_uid, idx).id.w; +} + +uint32_t SprDb::getTexUidFromIdx(uint32_t set_uid, uint32_t idx) const { + return getTexFromIdx(set_uid, idx).uid; +} + +uint32_t SprDb::getTexIdFromIdx(uint32_t set_uid, uint32_t idx) const { + return getTexFromIdx(set_uid, idx).id.w; +} + +const SprDb::SprSet& SprDb::getSetFromUid(uint32_t uid) const { + auto elem = set_uid.find(uid); + if (elem != set_uid.end()) + return *elem->second; + return s_err_set; +} + +const SprDb::SprSet& SprDb::getSetFromIdx(uint32_t idx) const { + auto elem = set_idx.find(idx); + if (elem != set_idx.end()) + return *elem->second; + return s_err_set; +} + +const SprDb::SprSet& SprDb::getSetFromName(const std::string& name) const { + auto elem = set_name.find(name); + if (elem != set_name.end()) + return *elem->second; + return s_err_set; +} + +const SprDb::Spr& SprDb::getSprFromUid(uint32_t uid) const { + auto elem = spr_uid.find(uid); + if (elem != spr_uid.end()) + return *elem->second; + return s_err_spr; +} + +const SprDb::Spr& SprDb::getSprFromName(const std::string& name) const { + auto elem = spr_name.find(std::string(name)); + if (elem != spr_name.end()) + return *elem->second; + return s_err_spr; +} + +const SprDb::Spr& SprDb::getSprFromIdx(uint32_t set_uid, uint32_t idx) const { + auto elem = spr_idx.find({ (uint16_t)idx, (uint16_t)getSetIdFromUid(set_uid) }); + if (elem != spr_idx.end()) + return *elem->second; + return s_err_spr; +} + +const SprDb::Spr& SprDb::getTexFromIdx(uint32_t set_uid, uint32_t idx) const { + //auto elem = spr_idx.find({ (uint16_t)idx, (uint16_t)(0x1000 | getSetIdFromUid(set_uid)) }); + auto elem = spr_idx.find({ (uint16_t)idx, (uint16_t)(0x4000 | getSetIdFromUid(set_uid)) }); + if (elem != spr_idx.end()) + return *elem->second; + return s_err_spr; +} + +static void sprite_database_file_classic_read_inner(SprDbFile* spr_db, stream& s) { + uint32_t set_count = s.read_uint32_t(); + uint32_t set_offset = s.read_uint32_t(); + uint32_t spr_count = s.read_uint32_t(); + uint32_t spr_offset = s.read_uint32_t(); + + spr_db->set.resize(set_count); + + SprDbFile::SprSet* spr_db_set = spr_db->set.data(); + + s.position_push(set_offset, SEEK_SET); + for (uint32_t i = 0; i < set_count; i++) { + SprDbFile::SprSet& set = spr_db_set[i]; + set.uid = s.read_uint32_t(); + set.name = s.read_string_null_terminated_offset(s.read_uint32_t()); + set.file = s.read_string_null_terminated_offset(s.read_uint32_t()); + set.id = s.read_uint32_t(); } s.position_pop(); - s.position_push(sprites_offset, SEEK_SET); - for (uint32_t i = 0; i < sprites_count; i++) { - uint32_t id = s.read_uint32_t(); + s.position_push(spr_offset, SEEK_SET); + for (uint32_t i = 0; i < spr_count; i++) { + uint32_t uid = s.read_uint32_t(); uint32_t name_offset = s.read_uint32_t(); uint32_t info = s.read_uint32_t(); - uint16_t index = (uint16_t)(info & 0xFFFF); - uint16_t set_index = (uint16_t)((info >> 16) & 0x0FFF); + uint16_t id = (uint16_t)(info & 0xFFFF); + uint16_t set_id = (uint16_t)((info >> 16) & 0x0FFF); bool texture = !!((info >> 16) & 0x1000); - spr_db_spr_set_file& spr_set = spr_db_spr_set[set_index]; + SprDbFile::SprSet& set = spr_db_set[set_id]; - spr_set.sprite.push_back({}); - spr_db_spr_file& spr = spr_set.sprite.back(); - spr.id = id; + set.sprite.push_back({}); + SprDbFile::Spr& spr = set.sprite.back(); + spr.uid = uid; spr.name.assign(s.read_string_null_terminated_offset(name_offset)); - spr.index = index; + spr.id = id; spr.texture = texture; } s.position_pop(); @@ -571,7 +618,7 @@ static void sprite_database_file_classic_read_inner(sprite_database_file* spr_db spr_db->is_x = false; } -static void sprite_database_file_classic_write_inner(sprite_database_file* spr_db, stream& s) { +static void sprite_database_file_classic_write_inner(SprDbFile* spr_db, stream& s) { s.write_uint32_t(0x90669066); s.write_uint32_t(0x90669066); s.write_uint32_t(0x90669066); @@ -582,34 +629,34 @@ static void sprite_database_file_classic_write_inner(sprite_database_file* spr_d s.write_uint32_t(0x90669066); s.align_write(0x20); - size_t sprite_sets_count = spr_db->sprite_set.size(); + size_t set_count = spr_db->set.size(); - size_t sprites_count = 0; - for (spr_db_spr_set_file& i : spr_db->sprite_set) - sprites_count += i.sprite.size(); + size_t spr_count = 0; + for (SprDbFile::SprSet& i : spr_db->set) + spr_count += i.sprite.size(); - int64_t sprites_offset = s.get_position(); - s.write(0x0C * sprites_count); + int64_t spr_offset = s.get_position(); + s.write(0x0C * spr_count); s.align_write(0x20); - int64_t sprite_sets_offset = s.get_position(); - s.write(0x10 * spr_db->sprite_set.size()); + int64_t set_offset = s.get_position(); + s.write(0x10 * spr_db->set.size()); s.align_write(0x20); std::vector strings; std::vector string_offsets; - strings.reserve(sprite_sets_count + sprites_count); - string_offsets.reserve(sprite_sets_count + sprites_count); + strings.reserve(set_count + spr_count); + string_offsets.reserve(set_count + spr_count); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - for (spr_db_spr_file& j : i.sprite) + for (SprDbFile::SprSet& i : spr_db->set) { + for (SprDbFile::Spr& j : i.sprite) if (j.texture && sprite_database_file_strings_push_back_check(strings, j.name)) { string_offsets.push_back(s.get_position()); s.write_string_null_terminated(j.name); } - for (spr_db_spr_file& j : i.sprite) + for (SprDbFile::Spr& j : i.sprite) if (!j.texture && sprite_database_file_strings_push_back_check(strings, j.name)) { string_offsets.push_back(s.get_position()); s.write_string_null_terminated(j.name); @@ -617,65 +664,65 @@ static void sprite_database_file_classic_write_inner(sprite_database_file* spr_d } s.align_write(0x04); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { + for (SprDbFile::SprSet& i : spr_db->set) { if (sprite_database_file_strings_push_back_check(strings, i.name)) { string_offsets.push_back(s.get_position()); s.write_string_null_terminated(i.name); } - if (sprite_database_file_strings_push_back_check(strings, i.file_name)) { + if (sprite_database_file_strings_push_back_check(strings, i.file)) { string_offsets.push_back(s.get_position()); - s.write_string_null_terminated(i.file_name); + s.write_string_null_terminated(i.file); } } s.align_write(0x04); - s.position_push(sprites_offset, SEEK_SET); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - uint16_t sprite_set_index = (uint16_t)(i.index & 0x0FFF); + s.position_push(spr_offset, SEEK_SET); + for (SprDbFile::SprSet& i : spr_db->set) { + uint16_t sprite_set_id = (uint16_t)(i.id & 0x0FFF); - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (!j.texture) continue; - s.write_uint32_t(j.id); + s.write_uint32_t(j.uid); s.write_uint32_t((uint32_t)sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name)); - s.write_uint32_t(((0x1000 | sprite_set_index) << 16) | j.index); + s.write_uint32_t(((0x1000 | sprite_set_id) << 16) | j.id); } - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (j.texture) continue; - s.write_uint32_t(j.id); + s.write_uint32_t(j.uid); s.write_uint32_t((uint32_t)sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name)); - s.write_uint32_t((sprite_set_index << 16) | j.index); + s.write_uint32_t((sprite_set_id << 16) | j.id); } } s.position_pop(); - s.position_push(sprite_sets_offset, SEEK_SET); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - s.write_uint32_t(i.id); + s.position_push(set_offset, SEEK_SET); + for (SprDbFile::SprSet& i : spr_db->set) { + s.write_uint32_t(i.uid); s.write_uint32_t((uint32_t)sprite_database_file_strings_get_string_offset(strings, string_offsets, i.name)); s.write_uint32_t((uint32_t)sprite_database_file_strings_get_string_offset(strings, - string_offsets, i.file_name)); - s.write_uint32_t(i.index); + string_offsets, i.file)); + s.write_uint32_t(i.id); } s.position_pop(); s.position_push(0x00, SEEK_SET); - s.write_uint32_t((uint32_t)sprite_sets_count); - s.write_uint32_t((uint32_t)sprite_sets_offset); - s.write_uint32_t((uint32_t)sprites_count); - s.write_uint32_t((uint32_t)sprites_offset); + s.write_uint32_t((uint32_t)set_count); + s.write_uint32_t((uint32_t)set_offset); + s.write_uint32_t((uint32_t)spr_count); + s.write_uint32_t((uint32_t)spr_offset); s.position_pop(); } -static void sprite_database_file_modern_read_inner(sprite_database_file* spr_db, stream& s, uint32_t header_length) { +static void sprite_database_file_modern_read_inner(SprDbFile* spr_db, stream& s, uint32_t header_length) { bool big_endian = s.big_endian; bool is_x = true; @@ -684,73 +731,73 @@ static void sprite_database_file_modern_read_inner(sprite_database_file* spr_db, s.set_position(0x00, SEEK_SET); - uint32_t sprite_sets_count = s.read_uint32_t_reverse_endianness(); - int64_t sprite_sets_offset = s.read_offset(header_length, is_x); - uint32_t sprites_count = s.read_uint32_t_reverse_endianness(); - int64_t sprites_offset = s.read_offset(header_length, is_x); + uint32_t set_count = s.read_uint32_t_reverse_endianness(); + int64_t set_offset = s.read_offset(header_length, is_x); + uint32_t spr_count = s.read_uint32_t_reverse_endianness(); + int64_t spr_offset = s.read_offset(header_length, is_x); - spr_db->sprite_set.resize(sprite_sets_count); + spr_db->set.resize(set_count); - spr_db_spr_set_file* spr_db_spr_set = spr_db->sprite_set.data(); + SprDbFile::SprSet* spr_db_set = spr_db->set.data(); - s.position_push(sprite_sets_offset, SEEK_SET); + s.position_push(set_offset, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < sprite_sets_count; i++) { - spr_db_spr_set_file& spr_set = spr_db_spr_set[i]; - spr_set.id = s.read_uint32_t_reverse_endianness(); - spr_set.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); - spr_set.file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); - spr_set.index = s.read_uint32_t_reverse_endianness(); + for (uint32_t i = 0; i < set_count; i++) { + SprDbFile::SprSet& set = spr_db_set[i]; + set.uid = s.read_uint32_t_reverse_endianness(); + set.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); + set.file = s.read_string_null_terminated_offset(s.read_offset_f2(header_length)); + set.id = s.read_uint32_t_reverse_endianness(); } else - for (uint32_t i = 0; i < sprite_sets_count; i++) { - spr_db_spr_set_file& spr_set = spr_db_spr_set[i]; - spr_set.id = s.read_uint32_t_reverse_endianness(); - spr_set.name = s.read_string_null_terminated_offset(s.read_offset_x()); - spr_set.file_name = s.read_string_null_terminated_offset(s.read_offset_x()); - spr_set.index = s.read_uint32_t_reverse_endianness(); + for (uint32_t i = 0; i < set_count; i++) { + SprDbFile::SprSet& set = spr_db_set[i]; + set.uid = s.read_uint32_t_reverse_endianness(); + set.name = s.read_string_null_terminated_offset(s.read_offset_x()); + set.file = s.read_string_null_terminated_offset(s.read_offset_x()); + set.id = s.read_uint32_t_reverse_endianness(); s.align_read(0x08); } s.position_pop(); - s.position_push(sprites_offset, SEEK_SET); + s.position_push(spr_offset, SEEK_SET); if (!is_x) - for (uint32_t i = 0; i < sprites_count; i++) { - uint32_t id = s.read_uint32_t_reverse_endianness(); + for (uint32_t i = 0; i < spr_count; i++) { + uint32_t uid = s.read_uint32_t_reverse_endianness(); int64_t name_offset = s.read_offset_f2(header_length); uint32_t info = s.read_uint32_t_reverse_endianness(); - uint16_t index = (uint16_t)(info & 0xFFFF); - uint16_t set_index = (uint16_t)((info >> 16) & 0x0FFF); + uint16_t id = (uint16_t)(info & 0xFFFF); + uint16_t set_id = (uint16_t)((info >> 16) & 0x0FFF); bool texture = !!((info >> 16) & 0x1000); - spr_db_spr_set_file& spr_set = spr_db_spr_set[set_index]; + SprDbFile::SprSet& set = spr_db_set[set_id]; - spr_set.sprite.push_back({}); - spr_db_spr_file& spr = spr_set.sprite.back(); - spr.id = id; + set.sprite.push_back({}); + SprDbFile::Spr& spr = set.sprite.back(); + spr.uid = uid; spr.name.assign(s.read_string_null_terminated_offset(name_offset)); - spr.index = index; + spr.id = id; spr.texture = texture; } else - for (uint32_t i = 0; i < sprites_count; i++) { - uint32_t id = s.read_uint32_t_reverse_endianness(); + for (uint32_t i = 0; i < spr_count; i++) { + uint32_t uid = s.read_uint32_t_reverse_endianness(); int64_t name_offset = s.read_offset_x(); uint32_t info = s.read_uint32_t_reverse_endianness(); s.align_read(0x08); - uint16_t index = (uint16_t)(info & 0xFFFF); - uint16_t set_index = (uint16_t)((info >> 16) & 0x0FFF); + uint16_t id = (uint16_t)(info & 0xFFFF); + uint16_t set_id = (uint16_t)((info >> 16) & 0x0FFF); bool texture = !!((info >> 16) & 0x1000); - spr_db_spr_set_file& spr_set = spr_db_spr_set[set_index]; + SprDbFile::SprSet& set = spr_db_set[set_id]; - spr_set.sprite.push_back({}); - spr_db_spr_file& spr = spr_set.sprite.back(); - spr.id = id; + set.sprite.push_back({}); + SprDbFile::Spr& spr = set.sprite.back(); + spr.uid = uid; spr.name.assign(s.read_string_null_terminated_offset(name_offset)); - spr.index = index; + spr.id = id; spr.texture = texture; } s.position_pop(); @@ -761,7 +808,7 @@ static void sprite_database_file_modern_read_inner(sprite_database_file* spr_db, spr_db->is_x = is_x; } -static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db, stream& s) { +static void sprite_database_file_modern_write_inner(SprDbFile* spr_db, stream& s) { bool big_endian = spr_db->big_endian; bool is_x = spr_db->is_x; @@ -774,11 +821,11 @@ static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db enrs_entry ee; pof pof; - size_t sprite_sets_count = spr_db->sprite_set.size(); + size_t set_count = spr_db->set.size(); - size_t sprites_count = 0; - for (spr_db_spr_set_file& i : spr_db->sprite_set) - sprites_count += i.sprite.size(); + size_t spr_count = 0; + for (SprDbFile::SprSet& i : spr_db->set) + spr_count += i.sprite.size(); if (!is_x) { ee = { 0, 1, 16, 1 }; @@ -787,16 +834,16 @@ static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db off = 16; off = align_val(off, 0x10); - ee = { off, 1, 16, (uint32_t)sprite_sets_count }; + ee = { off, 1, 16, (uint32_t)set_count }; ee.append(0, 4, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(sprite_sets_count * 16ULL); + off = (uint32_t)(set_count * 16ULL); off = align_val(off, 0x10); - ee = { off, 1, 12, (uint32_t)sprites_count }; + ee = { off, 1, 12, (uint32_t)spr_count }; ee.append(0, 3, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(sprites_count * 12ULL); + off = (uint32_t)(spr_count * 12ULL); off = align_val(off, 0x10); } else { @@ -809,60 +856,60 @@ static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db off = 32; off = align_val(off, 0x10); - ee = { off, 3, 32, (uint32_t)sprite_sets_count }; + ee = { off, 3, 32, (uint32_t)set_count }; ee.append(0, 1, ENRS_DWORD); ee.append(4, 2, ENRS_QWORD); ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(sprite_sets_count * 32ULL); + off = (uint32_t)(set_count * 32ULL); off = align_val(off, 0x10); - ee = { off, 3, 24, (uint32_t)sprites_count }; + ee = { off, 3, 24, (uint32_t)spr_count }; ee.append(0, 1, ENRS_DWORD); ee.append(4, 1, ENRS_QWORD); ee.append(0, 1, ENRS_DWORD); e.vec.push_back(ee); - off = (uint32_t)(sprites_count * 24ULL); + off = (uint32_t)(spr_count * 24ULL); off = align_val(off, 0x10); } s_spdb.write(is_x ? 0x20 : 0x10); s_spdb.align_write(0x10); - int64_t sprite_sets_offset = s_spdb.get_position(); - s_spdb.write(sprite_sets_count * (is_x ? 0x20ULL : 0x10ULL)); + int64_t set_offset = s_spdb.get_position(); + s_spdb.write(set_count * (is_x ? 0x20ULL : 0x10ULL)); s_spdb.align_write(0x10); - int64_t sprites_offset = s_spdb.get_position(); - s_spdb.write(sprites_count * (is_x ? 0x18ULL : 0x0CULL)); + int64_t spr_offset = s_spdb.get_position(); + s_spdb.write(spr_count * (is_x ? 0x18ULL : 0x0CULL)); s_spdb.align_write(0x10); std::vector strings; std::vector string_offsets; - strings.reserve(sprite_sets_count + sprites_count); - string_offsets.reserve(sprite_sets_count + sprites_count); + strings.reserve(set_count + spr_count); + string_offsets.reserve(set_count + spr_count); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { + for (SprDbFile::SprSet& i : spr_db->set) { if (sprite_database_file_strings_push_back_check(strings, i.name)) { string_offsets.push_back(s_spdb.get_position()); s_spdb.write_string_null_terminated(i.name); } - if (sprite_database_file_strings_push_back_check(strings, i.file_name)) { + if (sprite_database_file_strings_push_back_check(strings, i.file)) { string_offsets.push_back(s_spdb.get_position()); - s_spdb.write_string_null_terminated(i.file_name); + s_spdb.write_string_null_terminated(i.file); } } - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - for (spr_db_spr_file& j : i.sprite) + for (SprDbFile::SprSet& i : spr_db->set) { + for (SprDbFile::Spr& j : i.sprite) if (j.texture && sprite_database_file_strings_push_back_check(strings, j.name)) { string_offsets.push_back(s_spdb.get_position()); s_spdb.write_string_null_terminated(j.name); } - for (spr_db_spr_file& j : i.sprite) + for (SprDbFile::Spr& j : i.sprite) if (!j.texture && sprite_database_file_strings_push_back_check(strings, j.name)) { string_offsets.push_back(s_spdb.get_position()); s_spdb.write_string_null_terminated(j.name); @@ -871,78 +918,78 @@ static void sprite_database_file_modern_write_inner(sprite_database_file* spr_db s_spdb.align_write(0x10); s_spdb.position_push(0x00, SEEK_SET); - s_spdb.write_uint32_t_reverse_endianness((uint32_t)sprite_sets_count); - io_write_offset_pof_add(s_spdb, sprite_sets_offset, 0x20, is_x, &pof); - s_spdb.write_uint32_t_reverse_endianness((uint32_t)sprites_count); - io_write_offset_pof_add(s_spdb, sprites_offset, 0x20, is_x, &pof); + s_spdb.write_uint32_t_reverse_endianness((uint32_t)set_count); + io_write_offset_pof_add(s_spdb, set_offset, 0x20, is_x, &pof); + s_spdb.write_uint32_t_reverse_endianness((uint32_t)spr_count); + io_write_offset_pof_add(s_spdb, spr_offset, 0x20, is_x, &pof); s_spdb.position_pop(); - s_spdb.position_push(sprite_sets_offset, SEEK_SET); + s_spdb.position_push(set_offset, SEEK_SET); if (!is_x) - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - s_spdb.write_uint32_t_reverse_endianness(i.id); + for (SprDbFile::SprSet& i : spr_db->set) { + s_spdb.write_uint32_t_reverse_endianness(i.uid); io_write_offset_f2_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, i.name), 0x20, &pof); io_write_offset_f2_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, - string_offsets, i.file_name), 0x20, &pof); - s_spdb.write_uint32_t_reverse_endianness(i.index); + string_offsets, i.file), 0x20, &pof); + s_spdb.write_uint32_t_reverse_endianness(i.id); } else - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - s_spdb.write_uint32_t_reverse_endianness(i.id); + for (SprDbFile::SprSet& i : spr_db->set) { + s_spdb.write_uint32_t_reverse_endianness(i.uid); io_write_offset_x_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, i.name), &pof); io_write_offset_x_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, - string_offsets, i.file_name), &pof); - s_spdb.write_uint32_t_reverse_endianness(i.index); + string_offsets, i.file), &pof); + s_spdb.write_uint32_t_reverse_endianness(i.id); } s_spdb.position_pop(); - s_spdb.position_push(sprites_offset, SEEK_SET); - for (spr_db_spr_set_file& i : spr_db->sprite_set) { - uint16_t sprite_set_index = (uint16_t)(i.index & 0x0FFF); + s_spdb.position_push(spr_offset, SEEK_SET); + for (SprDbFile::SprSet& i : spr_db->set) { + uint16_t sprite_set_id = (uint16_t)(i.id & 0x0FFF); if (!is_x) { - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (!j.texture) continue; - s_spdb.write_uint32_t_reverse_endianness(j.id); + s_spdb.write_uint32_t_reverse_endianness(j.uid); io_write_offset_f2_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name), 0x20, &pof); - s_spdb.write_uint32_t_reverse_endianness(((0x1000 | sprite_set_index) << 16) | j.index); + s_spdb.write_uint32_t_reverse_endianness(((0x1000 | sprite_set_id) << 16) | j.id); } - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (j.texture) continue; - s_spdb.write_uint32_t_reverse_endianness(j.id); + s_spdb.write_uint32_t_reverse_endianness(j.uid); io_write_offset_f2_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name), 0x20, &pof); - s_spdb.write_uint32_t_reverse_endianness((sprite_set_index << 16) | j.index); + s_spdb.write_uint32_t_reverse_endianness((sprite_set_id << 16) | j.id); } } else { - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (!j.texture) continue; - s_spdb.write_uint32_t_reverse_endianness(j.id); + s_spdb.write_uint32_t_reverse_endianness(j.uid); io_write_offset_x_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name), &pof); - s_spdb.write_uint32_t_reverse_endianness(((0x1000 | sprite_set_index) << 16) | j.index); + s_spdb.write_uint32_t_reverse_endianness(((0x1000 | sprite_set_id) << 16) | j.id); s_spdb.align_write(0x08); } - for (spr_db_spr_file& j : i.sprite) { + for (SprDbFile::Spr& j : i.sprite) { if (j.texture) continue; - s_spdb.write_uint32_t_reverse_endianness(j.id); + s_spdb.write_uint32_t_reverse_endianness(j.uid); io_write_offset_x_pof_add(s_spdb, sprite_database_file_strings_get_string_offset(strings, string_offsets, j.name), &pof); - s_spdb.write_uint32_t_reverse_endianness((sprite_set_index << 16) | j.index); + s_spdb.write_uint32_t_reverse_endianness((sprite_set_id << 16) | j.id); s_spdb.align_write(0x08); } } diff --git a/src/KKdLib/database/sprite.hpp b/src/KKdLib/database/sprite.hpp index bc13976c..4b4427fb 100644 --- a/src/KKdLib/database/sprite.hpp +++ b/src/KKdLib/database/sprite.hpp @@ -11,104 +11,102 @@ #include "../default.hpp" #include "../prj/vector_pair_combine.hpp" -struct spr_info { - uint16_t index; - uint16_t set_index; +struct SprIdMember { + uint16_t idx; + uint16_t set_idx; - inline spr_info() { - this->index = (uint16_t)-1; - this->set_index = (uint16_t)-1; + inline SprIdMember() { + idx = (uint16_t)-1; + set_idx = (uint16_t)-1; } - inline spr_info(uint16_t index, uint16_t set_index) { - this->index = index; - this->set_index = set_index; + inline SprIdMember(uint16_t in_idx, uint16_t in_set_idx) { + idx = in_idx; + set_idx = in_set_idx; + } +}; + +union SprId { + SprIdMember m; + uint32_t w; + + inline SprId() { + w = (uint32_t)-1; + } + + inline SprId(uint32_t in_id) { + w = in_id; + } + + inline SprId(uint16_t in_idx, uint16_t in_set_idx) { + m.idx = in_idx; + m.set_idx = in_set_idx; } inline bool is_null() const { - return index == (uint16_t)-1 && set_index == (uint16_t)-1; + return w == (uint32_t)-1; } inline bool not_null() const { - return index != (uint16_t)-1 || set_index != (uint16_t)-1; + return w != (uint32_t)-1; } }; -constexpr bool operator==(const spr_info& left, const spr_info& right) { - return *(uint32_t*)&left == *(uint32_t*)&right; +constexpr bool operator==(const SprId& left, const SprId& right) { + return left.w == right.w; } -constexpr bool operator!=(const spr_info& left, const spr_info& right) { +constexpr bool operator!=(const SprId& left, const SprId& right) { return !(left == right); } -constexpr bool operator<(const spr_info& left, const spr_info& right) { - return *(uint32_t*)&left < *(uint32_t*)&right; +constexpr bool operator<(const SprId& left, const SprId& right) { + return left.w < right.w; } -constexpr bool operator>(const spr_info& left, const spr_info& right) { +constexpr bool operator>(const SprId& left, const SprId& right) { return right < left; } -constexpr bool operator<=(const spr_info& left, const spr_info& right) { +constexpr bool operator<=(const SprId& left, const SprId& right) { return !(right < left); } -constexpr bool operator>=(const spr_info& left, const spr_info& right) { +constexpr bool operator>=(const SprId& left, const SprId& right) { return !(left < right); } -struct spr_db_spr_file { - uint32_t id; - std::string name; - uint16_t index; - bool texture; +struct SprDbFile { + struct Spr { + uint32_t uid; + std::string name; + uint16_t id; + bool texture; - spr_db_spr_file(); - ~spr_db_spr_file(); -}; + Spr(); + ~Spr(); + }; -struct spr_db_spr { - uint32_t id; - std::string name; - spr_info info; - int32_t load_count; + struct SprSet { + uint32_t uid; + std::string name; + std::string file; + std::vector sprite; + uint32_t id; - spr_db_spr(); - ~spr_db_spr(); -}; + SprSet(); + ~SprSet(); + }; -struct spr_db_spr_set_file { - uint32_t id; - std::string name; - std::string file_name; - std::vector sprite; - uint32_t index; - - spr_db_spr_set_file(); - ~spr_db_spr_set_file(); -}; - -struct spr_db_spr_set { - uint32_t id; - std::string name; - std::string file_name; - uint32_t index; - - spr_db_spr_set(); - ~spr_db_spr_set(); -}; - -struct sprite_database_file { bool ready; bool modern; bool big_endian; bool is_x; - std::vector sprite_set; + std::vector set; - sprite_database_file(); - ~sprite_database_file(); + SprDbFile(); + ~SprDbFile(); void read(const char* path, bool modern); void read(const wchar_t* path, bool modern); @@ -120,38 +118,75 @@ struct sprite_database_file { static bool load_file(void* data, const char* dir, const char* file, uint32_t hash); }; -struct sprite_database { - std::list spr_sets; - prj::vector_pair_combine spr_set_ids; - prj::vector_pair_combine spr_set_indices; - prj::vector_pair_combine spr_set_names; - std::list sprs; - prj::vector_pair_combine spr_ids; - prj::vector_pair_combine spr_names; - prj::vector_pair_combine spr_indices; +struct SprDb { + struct Spr { + uint32_t uid; + std::string name; + SprId id; + int32_t reference; - sprite_database(); - ~sprite_database(); + Spr(); + ~Spr(); + }; - void add(sprite_database_file* spr_db_file); + struct SprSet { + uint32_t uid; + std::string name; + std::string file; + uint32_t id; + + SprSet(); + ~SprSet(); + }; + + std::list set; + prj::vector_pair_combine set_uid; + prj::vector_pair_combine set_idx; + prj::vector_pair_combine set_name; + std::list spr; + prj::vector_pair_combine spr_uid; + prj::vector_pair_combine spr_name; + prj::vector_pair_combine spr_idx; + + static const SprSet s_err_set; + static const Spr s_err_spr; + + SprDb(); + ~SprDb(); + + void add(SprDbFile* spr_db_file); void clear(); - void add_spr_set(uint32_t set_id, uint32_t index); - void parse(const spr_db_spr_set_file* set_file, - std::string& set_name, std::vector& sprite_ids); - void remove_spr_set(uint32_t set_id, uint32_t index, + void addSet(uint32_t set_uid, uint32_t idx); + void freeSet(uint32_t set_uid, uint32_t idx, const char* set_name, std::vector& sprite_ids); + void parse(const SprDbFile::SprSet* set_file, std::vector& sprite_ids); - const spr_db_spr_set* get_spr_set_by_name(const char* name) const; - const spr_db_spr_set* get_spr_set_by_id(uint32_t set_id) const; - const spr_db_spr_set* get_spr_set_by_index(uint32_t index) const; - const spr_db_spr* get_spr_by_name(const char* name) const; - const spr_db_spr* get_spr_by_id(uint32_t id) const; - const spr_db_spr* get_spr_by_set_id_index(uint32_t set_id, uint32_t index) const; - const spr_db_spr* get_tex_by_set_id_index(uint32_t set_id, uint32_t index) const; - uint32_t get_spr_id_by_name(const char* name) const; - const char* get_spr_set_file_name(uint32_t set_id) const; - uint32_t get_spr_set_id_by_name(const char* name) const; - uint32_t get_spr_set_id_by_name_index(uint32_t index) const; - const char* get_spr_set_name(uint32_t set_id) const; + uint32_t getSetSize() const; + + const char* getSetNameFromUid(uint32_t uid) const; + const char* getSetFileFromUid(uint32_t uid) const; + uint32_t getSetIdFromUid(uint32_t uid) const; + uint32_t getSetUidFromIdx(uint32_t idx) const; + const char* getSetNameFromIdx(uint32_t idx) const; + const char* getSetFileFromIdx(uint32_t idx) const; + uint32_t getSetUidFromName(const std::string& name) const; + uint32_t getSetIdFromName(const std::string& name) const; + uint32_t getSetIdFromIdx(uint32_t idx) const; + + uint32_t getSprIdFromUid(uint32_t uid) const; + uint32_t getSprUidFromName(const std::string& name) const; + uint32_t getSprIdFromName(const std::string& name) const; + uint32_t getSprUidFromIdx(uint32_t set_uid, uint32_t idx) const; + uint32_t getSprIdFromIdx(uint32_t set_uid, uint32_t idx) const; + uint32_t getTexUidFromIdx(uint32_t set_uid, uint32_t idx) const; + uint32_t getTexIdFromIdx(uint32_t set_uid, uint32_t idx) const; + + const SprDb::SprSet& getSetFromUid(uint32_t uid) const; + const SprDb::SprSet& getSetFromIdx(uint32_t idx) const; + const SprDb::SprSet& getSetFromName(const std::string& name) const; + const SprDb::Spr& getSprFromUid(uint32_t uid) const; + const SprDb::Spr& getSprFromName(const std::string& name) const; + const SprDb::Spr& getSprFromIdx(uint32_t set_uid, uint32_t idx) const; + const SprDb::Spr& getTexFromIdx(uint32_t set_uid, uint32_t idx) const; }; diff --git a/src/KKdLib/prj/primitive_type.hpp b/src/KKdLib/prj/primitive_type.hpp new file mode 100644 index 00000000..31487720 --- /dev/null +++ b/src/KKdLib/prj/primitive_type.hpp @@ -0,0 +1,97 @@ +/* + by korenkonder + GitHub/GitLab: korenkonder +*/ + +#pragma once + +#include "../default.hpp" +#include "../vec.hpp" + +namespace prj { + struct Capsule3f { + vec3 c0; + vec3 c1; + float_t r; + + inline Capsule3f() : r() { + + } + + inline Capsule3f(const vec3& c0, const vec3& c1, float_t r) : c0(c0), c1(c1), r(r) { + + } + }; + + struct Cylinder3f { + vec3 c0; + vec3 c1; + float_t r; + + inline Cylinder3f() : r() { + + } + + inline Cylinder3f(const vec3& c0, const vec3& c1, float_t r) : c0(c0), c1(c1), r(r) { + + } + }; + + struct Line3f { + vec3 p0; + vec3 p1; + + inline Line3f() { + + } + + inline Line3f(const vec3& p0, const vec3& p1) : p0(p0), p1(p1) { + + } + }; + + struct Plane3f { + vec3 point; + vec3 normal; + float_t _l; + float_t _m; + float_t _n; + float_t _p; + + inline Plane3f() : _l(), _m(), _n(), _p() { + + } + + inline Plane3f(const vec3& point, const vec3& normal) + : point(point), normal(normal), _l(), _m(), _n(), _p() { + + } + }; + + struct Sphere3f { + vec3 c; + float_t r; + + inline Sphere3f() : r() { + + } + + inline Sphere3f(const vec3& c, const float_t r) : c(c), r(r) { + + } + }; + + struct Triangle3f { + vec3 p0; + vec3 p1; + vec3 p2; + + inline Triangle3f() { + + } + + inline Triangle3f(const vec3& p0, const vec3& p1, const vec3& p2) : p0(p0), p1(p1), p2(p2) { + + } + }; +} diff --git a/src/KKdLib/spr.hpp b/src/KKdLib/spr.hpp index 2d85413a..0591c4a0 100644 --- a/src/KKdLib/spr.hpp +++ b/src/KKdLib/spr.hpp @@ -11,25 +11,25 @@ #include "txp.hpp" enum SCREEN_MODE { - SCREEN_MODE_QVGA = 0x00, - SCREEN_MODE_VGA = 0x01, - SCREEN_MODE_SVGA = 0x02, - SCREEN_MODE_XGA = 0x03, - SCREEN_MODE_SXGA = 0x04, + SCREEN_MODE_QVGA = 0x00, + SCREEN_MODE_VGA = 0x01, + SCREEN_MODE_SVGA = 0x02, + SCREEN_MODE_XGA = 0x03, + SCREEN_MODE_SXGA = 0x04, SCREEN_MODE_SXGA_P = 0x05, - SCREEN_MODE_UXGA = 0x06, - SCREEN_MODE_WVGA = 0x07, - SCREEN_MODE_WSVGA = 0x08, - SCREEN_MODE_WXGA = 0x09, - SCREEN_MODE_FWXGA = 0x0A, - SCREEN_MODE_WUXGA = 0x0B, - SCREEN_MODE_WQXGA = 0x0C, - SCREEN_MODE_HD = 0x0D, - SCREEN_MODE_FHD = 0x0E, - SCREEN_MODE_QHD = 0x0F, - SCREEN_MODE_WQVGA = 0x10, - SCREEN_MODE_qHD = 0x11, - SCREEN_MODE_MAX = 0x12, + SCREEN_MODE_UXGA = 0x06, + SCREEN_MODE_WVGA = 0x07, + SCREEN_MODE_WSVGA = 0x08, + SCREEN_MODE_WXGA = 0x09, + SCREEN_MODE_FWXGA = 0x0A, + SCREEN_MODE_WUXGA = 0x0B, + SCREEN_MODE_WQXGA = 0x0C, + SCREEN_MODE_HD = 0x0D, + SCREEN_MODE_FHD = 0x0E, + SCREEN_MODE_QHD = 0x0F, + SCREEN_MODE_WQVGA = 0x10, + SCREEN_MODE_qHD = 0x11, + SCREEN_MODE_MAX = 0x12, // MM+ /*SCREEN_MODE_QVGA = 0x00, @@ -53,13 +53,13 @@ enum SCREEN_MODE { SCREEN_MODE_QHD = 0x12, SCREEN_MODE_WQVGA = 0x13, SCREEN_MODE_qHD = 0x14, - SCREEN_MODE_XGA_P = 0x15, + SCREEN_MODE_XGA_P = 0x15, SCREEN_MODE_1176x664 = 0x16, SCREEN_MODE_1200x960 = 0x17, SCREEN_MODE_WXGA1280x900 = 0x18, - SCREEN_MODE_SXGA_M = 0x19, + SCREEN_MODE_SXGA_M = 0x19, SCREEN_MODE_FWXGA1366x768 = 0x1A, - SCREEN_MODE_WXGA_P = 0x1B, + SCREEN_MODE_WXGA_P = 0x1B, SCREEN_MODE_HDPlus = 0x1C, SCREEN_MODE_WSXGA = 0x1D, SCREEN_MODE_WSXGAPlus = 0x1E, diff --git a/src/ReDIVA/app.cpp b/src/ReDIVA/app.cpp index 79e6fe0a..66733757 100644 --- a/src/ReDIVA/app.cpp +++ b/src/ReDIVA/app.cpp @@ -783,7 +783,7 @@ static render_context* render_context_load(const wchar_t* config_path) { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; texture_database* aft_tex_db = &aft_data->data_ft.tex_db; stage_database* aft_stage_data = &aft_data->data_ft.stage_data; @@ -876,17 +876,17 @@ static render_context* render_context_load(const wchar_t* config_path) { dbg_set_id = aft_obj_db->get_object_set_id("DBG"); aet_gam_loadsc_set_id = aft_aet_db->get_aet_set_id_by_name("AET_GAM_LOADSC"); - spr_gam_loadsc_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_GAM_LOADSC"); + spr_gam_loadsc_set_id = aft_spr_db->getSetUidFromName("SPR_GAM_LOADSC"); aet_cmn_all_set_id = aft_aet_db->get_aet_set_id_by_name("AET_CMN_ALL"); - spr_cmn_all_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_CMN_ALL"); + spr_cmn_all_set_id = aft_spr_db->getSetUidFromName("SPR_CMN_ALL"); aet_gam_cmn_set_id = aft_aet_db->get_aet_set_id_by_name("AET_GAM_CMN"); - spr_gam_cmn_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_GAM_CMN"); + spr_gam_cmn_set_id = aft_spr_db->getSetUidFromName("SPR_GAM_CMN"); - spr_fnt_24_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_FNT_24"); - spr_fnt_bold24_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_FNT_BOLD24"); - spr_fnt_cmn_set_id = aft_spr_db->get_spr_set_id_by_name("SPR_FNT_CMN"); + spr_fnt_24_set_id = aft_spr_db->getSetUidFromName("SPR_FNT_24"); + spr_fnt_bold24_set_id = aft_spr_db->getSetUidFromName("SPR_FNT_BOLD24"); + spr_fnt_cmn_set_id = aft_spr_db->getSetUidFromName("SPR_FNT_CMN"); hand_item_handler_data_init(); module_table_handler_data_init(); @@ -895,7 +895,7 @@ static render_context* render_context_load(const wchar_t* config_path) { customize_item_data_handler_data_init(); aet_manager_add_aet_sets(aft_aet_db); - sprite_manager_add_spr_sets(aft_spr_db); + spr::init(aft_spr_db); render_timer->reset(); for (int32_t i = 0; i < 30; i++) { @@ -1349,19 +1349,19 @@ static void render_context_dispose(render_context* rctx) { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; objset_info_storage_unload_set(dbg_set_id); fontmap_data_unload(); aet_manager_unload_set(aet_gam_loadsc_set_id, aft_aet_db); - sprite_manager_unload_set(spr_gam_loadsc_set_id, aft_spr_db); + spr::free(spr_gam_loadsc_set_id, aft_spr_db); aet_manager_unload_set(aet_cmn_all_set_id, aft_aet_db); - sprite_manager_unload_set(spr_cmn_all_set_id, aft_spr_db); - sprite_manager_unload_set(spr_fnt_24_set_id, aft_spr_db); - sprite_manager_unload_set(spr_fnt_bold24_set_id, aft_spr_db); - sprite_manager_unload_set(spr_fnt_cmn_set_id, aft_spr_db); + spr::free(spr_cmn_all_set_id, aft_spr_db); + spr::free(spr_fnt_24_set_id, aft_spr_db); + spr::free(spr_fnt_bold24_set_id, aft_spr_db); + spr::free(spr_fnt_cmn_set_id, aft_spr_db); - sprite_manager_remove_spr_sets(aft_spr_db); + spr::dest(aft_spr_db); aet_manager_remove_aet_sets(aft_aet_db); customize_item_data_handler_data_free(); diff --git a/src/ReDIVA/data_initialize.cpp b/src/ReDIVA/data_initialize.cpp index ab3c4bb9..1f6f742e 100644 --- a/src/ReDIVA/data_initialize.cpp +++ b/src/ReDIVA/data_initialize.cpp @@ -50,22 +50,22 @@ bool TaskDataInit::ctrl() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; switch (state) { case 0: { // Fucks up scaling - //sprite_manager_reset_res_data(); - sprite_manager_read_file(spr_fnt_24_set_id, "", aft_data, aft_spr_db); - sprite_manager_read_file(spr_fnt_bold24_set_id, "", aft_data, aft_spr_db); - sprite_manager_read_file(spr_fnt_cmn_set_id, "", aft_data, aft_spr_db); + //spr::init(); + spr::request(spr_fnt_24_set_id, "", aft_data, aft_spr_db); + spr::request(spr_fnt_bold24_set_id, "", aft_data, aft_spr_db); + spr::request(spr_fnt_cmn_set_id, "", aft_data, aft_spr_db); fontmap_data_read_file(); state = 1; } break; case 1: - if (!sprite_manager_load_file(spr_fnt_24_set_id, aft_spr_db) - && !sprite_manager_load_file(spr_fnt_bold24_set_id, aft_spr_db) - && !sprite_manager_load_file(spr_fnt_cmn_set_id, aft_spr_db) + if (!spr::wait(spr_fnt_24_set_id, aft_spr_db) + && !spr::wait(spr_fnt_bold24_set_id, aft_spr_db) + && !spr::wait(spr_fnt_cmn_set_id, aft_spr_db) && !fontmap_data_load_file()) state = field_6C ? 2 : 4; break; @@ -78,16 +78,16 @@ bool TaskDataInit::ctrl() { state = 4; break; case 4: { - sprite_manager_read_file(spr_gam_loadsc_set_id, "", aft_data, aft_spr_db); + spr::request(spr_gam_loadsc_set_id, "", aft_data, aft_spr_db); aet_manager_read_file(aet_gam_loadsc_set_id, "", aft_data, aft_aet_db); - sprite_manager_read_file(spr_cmn_all_set_id, "", aft_data, aft_spr_db); + spr::request(spr_cmn_all_set_id, "", aft_data, aft_spr_db); aet_manager_read_file(aet_cmn_all_set_id, "", aft_data, aft_aet_db); state = 5; } break; case 5: - if (sprite_manager_load_file(spr_gam_loadsc_set_id, aft_spr_db) + if (spr::wait(spr_gam_loadsc_set_id, aft_spr_db) || aet_manager_load_file(aet_gam_loadsc_set_id, aft_aet_db) - || sprite_manager_load_file(spr_cmn_all_set_id, aft_spr_db) + || spr::wait(spr_cmn_all_set_id, aft_spr_db) || aet_manager_load_file(aet_cmn_all_set_id, aft_aet_db)) break; diff --git a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp index 79ee37d9..88cd2b2f 100644 --- a/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp +++ b/src/ReDIVA/data_process/effchrpv_auth_3d_to_mot.cpp @@ -389,11 +389,11 @@ void effchrpv_auth_3d_to_mot::disp() { mat4 mat; mat = oh->node[a2m.j_mune_wj].model_transform.mat; mat4_scale_rot(&mat, 0.1f, &mat); - spr::put_rgb_cross(mat); + debug_put_line_axis(mat); mat = oh->node[a2m.j_kao_wj].model_transform.mat; mat4_scale_rot(&mat, 0.1f, &mat); - spr::put_rgb_cross(mat); + debug_put_line_axis(mat); }*/ } diff --git a/src/ReDIVA/data_test/auth_2d_test.cpp b/src/ReDIVA/data_test/auth_2d_test.cpp index 7f0370b7..50e87828 100644 --- a/src/ReDIVA/data_test/auth_2d_test.cpp +++ b/src/ReDIVA/data_test/auth_2d_test.cpp @@ -55,11 +55,11 @@ DtmAet::~DtmAet() { bool DtmAet::init() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; uint32_t set_id = aft_aet_db->get_aet_set_id_by_name_index(this->curr_set_index); std::string mdata_dir = "";//GetMdataDir(set_id); - sprite_manager_read_file(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, + spr::request(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, mdata_dir, aft_data, aft_spr_db); aet_manager_read_file(set_id, mdata_dir, aft_data, aft_aet_db); GetSoundFarcs(); @@ -70,7 +70,7 @@ bool DtmAet::init() { bool DtmAet::ctrl() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; switch (state) { case 1: { @@ -84,21 +84,21 @@ bool DtmAet::ctrl() { } break; case 2: { uint32_t prev_set_id = aft_aet_db->get_aet_set_id_by_name_index(curr_set_index); - sprite_manager_unload_set(aft_aet_db->get_aet_set_by_id(prev_set_id)->sprite_set_id, aft_spr_db); + spr::free(aft_aet_db->get_aet_set_by_id(prev_set_id)->sprite_set_id, aft_spr_db); aet_manager_unload_set(prev_set_id, aft_aet_db); curr_set_index = set_index; uint32_t set_id = aft_aet_db->get_aet_set_id_by_name_index(set_index); std::string mdata_dir = "";//GetMdataDir(set_id); - sprite_manager_read_file(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, + spr::request(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, mdata_dir, aft_data, aft_spr_db); aet_manager_read_file(set_id, mdata_dir, aft_data, aft_aet_db); state = 3; } break; case 3: { uint32_t set_id = aft_aet_db->get_aet_set_id_by_name_index(curr_set_index); - if (sprite_manager_load_file(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, aft_spr_db) + if (spr::wait(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, aft_spr_db) || aet_manager_load_file(set_id, aft_aet_db)) break; @@ -235,10 +235,10 @@ bool DtmAet::ctrl() { bool DtmAet::dest() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; uint32_t set_id = aft_aet_db->get_aet_set_id_by_name_index(curr_set_index); - sprite_manager_unload_set(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, aft_spr_db); + spr::free(aft_aet_db->get_aet_set_by_id(set_id)->sprite_set_id, aft_spr_db); aet_manager_unload_set(set_id, aft_aet_db); for (std::string& i : sound_farcs) @@ -253,7 +253,7 @@ void DtmAet::disp() { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; for (const auto& i : comp.data) { vec2 v7 = 0.0f; @@ -265,7 +265,7 @@ void DtmAet::disp() { pos.z = i.second.position.z; spr::SprArgs v34; - v34.SetSize({ 10.0f, 10.0f}); + v34.setSize({ 10.0f, 10.0f}); v34.trans = pos; v34.anchor = { 5.0f, 5.0f, 0.0f }; v34.kind = spr::SPR_KIND_LINE; @@ -273,8 +273,8 @@ void DtmAet::disp() { spr::SprArgs v35 = v34; v35.rot.z = v34.rot.z + (float_t)(M_PI / 2.0f); - spr::put_sprite(v34, aft_spr_db); - spr::put_sprite(v35, aft_spr_db); + spr::put(v34, aft_spr_db); + spr::put(v35, aft_spr_db); font.init_font_data(0); diff --git a/src/ReDIVA/data_test/auth_3d_test.cpp b/src/ReDIVA/data_test/auth_3d_test.cpp index 1ae9ceac..002d331f 100644 --- a/src/ReDIVA/data_test/auth_3d_test.cpp +++ b/src/ReDIVA/data_test/auth_3d_test.cpp @@ -9,6 +9,7 @@ #include "../../CRE/app_system_detail.hpp" #include "../../CRE/clear_color.hpp" #include "../../CRE/data.hpp" +#include "../../CRE/debug_print.hpp" #include "../../CRE/effect.hpp" #include "../../CRE/render_context.hpp" #include "../../CRE/stage.hpp" @@ -729,15 +730,8 @@ bool Auth3dTestTask::dest() { } void Auth3dTestTask::disp() { - if (plane_above_floor) { - mat4 mat; - mat4_translate_y(0.25f, &mat); - mdl::EtcObj etc(mdl::ETC_OBJ_PLANE); - etc.color = 0xFFFFFFFF; - etc.data.plane.w = 20; - etc.data.plane.h = 20; - rctx_ptr->disp_manager->entry_obj_etc(mat, etc); - } + if (plane_above_floor) + debug_put_plane_zx(vec3(0.0f, 0.25f, 0.0f), 20.0f, 20.0f); } void Auth3dTestTask::DispAuth3dChara(::auth_3d_id& id) { diff --git a/src/ReDIVA/data_test/motion_test.cpp b/src/ReDIVA/data_test/motion_test.cpp index b545f988..b8f7c15c 100644 --- a/src/ReDIVA/data_test/motion_test.cpp +++ b/src/ReDIVA/data_test/motion_test.cpp @@ -10,6 +10,7 @@ #include "../../CRE/app_system_detail.hpp" #include "../../CRE/clear_color.hpp" #include "../../CRE/data.hpp" +#include "../../CRE/debug_print.hpp" #include "../../CRE/render_context.hpp" #include "../../CRE/hand_item.hpp" #include "../../CRE/module_table.hpp" diff --git a/src/ReDIVA/data_test/rob_osage_test.cpp b/src/ReDIVA/data_test/rob_osage_test.cpp index 30cea06d..f7501b99 100644 --- a/src/ReDIVA/data_test/rob_osage_test.cpp +++ b/src/ReDIVA/data_test/rob_osage_test.cpp @@ -7,8 +7,8 @@ #include "../../CRE/Glitter/glitter.hpp" #include "../../CRE/rob/rob.hpp" #include "../../CRE/data.hpp" +#include "../../CRE/debug_print.hpp" #include "../../CRE/render_context.hpp" -#include "../../CRE/screen_param.hpp" #include "../../CRE/sprite.hpp" #include "../../KKdLib/io/file_stream.hpp" #include "../../KKdLib/io/path.hpp" @@ -1156,9 +1156,9 @@ void RobOsageTest::disp_line() { mat4 mat; mat4_scale_rot(i->osage_work.joint_node_vec.data()[0].dst_node_mat, 0.05f, &mat); if (i == ex_node) - spr::put_cross(mat, color_red, color_green, color_blue); + debug_put_line_axis(mat, color_red, color_green, color_blue); else - spr::put_cross(mat, color_dark_red, color_dark_green, color_dark_blue); + debug_put_line_axis(mat, color_dark_red, color_dark_green, color_dark_blue); const color4u8 line_color = i == ex_node ? color_white : color_dark_cyan; const color4u8 rect_color = i == ex_node ? color_red : color_dark_red; @@ -1166,14 +1166,14 @@ void RobOsageTest::disp_line() { const RobJointNode* j_begin = i->osage_work.joint_node_vec.data() + 1; const RobJointNode* j_end = i->osage_work.joint_node_vec.data() + i->osage_work.joint_node_vec.size(); for (const RobJointNode* j = j_begin; j != j_end; j++) - spr::put_sprite_3d_line(j[-1].pos, j[0].pos, line_color); + dx_draw_line(j[-1].pos, j[0].pos, line_color); for (const RobJointNode* j = j_begin; j != j_end; j++) - spr::put_sprite_rect({ spr::proj_sprite_3d_line(j->pos, true) - 2.0f, 4.0f }, + spr::putRect({ project_screen(j->pos, true) - 2.0f, 4.0f }, SCREEN_MODE_MAX, spr::SPR_PRIO_DW, rect_color); mat4_scale_rot(i->osage_work.effector.dst_node_mat, 0.05f, &mat); - spr::put_cross(mat, color_dark_red, color_dark_green, color_dark_blue); + debug_put_line_axis(mat, color_dark_red, color_dark_green, color_dark_blue); } for (ExClothBlock*& i : skin_disp->cloth) { @@ -1188,14 +1188,14 @@ void RobOsageTest::disp_line() { const CLOTH_VERTEX* vtxarg = i->cloth_work.vtxarg.data(); for (const CLOTH_SPRING& j : i->cloth_work.spring) - spr::put_sprite_3d_line(vtxarg[j.index0].pos, vtxarg[j.index1].pos, color_spring); + dx_draw_line(vtxarg[j.index0].pos, vtxarg[j.index1].pos, color_spring); const CLOTH_VERTEX* j_begin = i->cloth_work.vtxarg.data() + i->cloth_work.width; const CLOTH_VERTEX* j_end = i->cloth_work.vtxarg.data() + i->cloth_work.vtxarg.size(); for (const CLOTH_VERTEX* j = j_begin; j != j_end; j++) { - spr::put_sprite_3d_line(j->pos, j->tangent * 0.05f + j->pos, color_tangent); - spr::put_sprite_3d_line(j->pos, j->binormal * 0.05f + j->pos, color_binormal); - spr::put_sprite_3d_line(j->pos, j->normal * 0.05f + j->pos, color_normal); + dx_draw_line(j->pos, j->tangent * 0.05f + j->pos, color_tangent); + dx_draw_line(j->pos, j->binormal * 0.05f + j->pos, color_binormal); + dx_draw_line(j->pos, j->normal * 0.05f + j->pos, color_normal); } } @@ -1244,16 +1244,16 @@ void RobOsageTest::disp_line() { void RobOsageTest::disp_line_cls_param(const mat4& motion_matrix, const vec3& pos) { mat4 mat; mat4_scale_rot(&motion_matrix, 0.1f, &mat); - spr::put_cross(mat, color_red, color_green, color_blue); + debug_put_line_axis(mat, color_red, color_green, color_blue); vec3 p; mat4_transform_point(&motion_matrix, &pos, &p); vec3 p_node; mat4_get_translation(&motion_matrix, &p_node); - spr::put_sprite_3d_line(p, p_node, color_grey); + dx_draw_line(p, p_node, color_grey); - spr::put_sprite_rect({ spr::proj_sprite_3d_line(p, true) - 1.0f, 2.0f }, + spr::putRect({ project_screen(p, true) - 1.0f, 2.0f }, SCREEN_MODE_MAX, spr::SPR_PRIO_DW, color_yellow); } diff --git a/src/ReDIVA/dw.cpp b/src/ReDIVA/dw.cpp index c6a2b4c5..bf4b6864 100644 --- a/src/ReDIVA/dw.cpp +++ b/src/ReDIVA/dw.cpp @@ -4518,7 +4518,7 @@ void dw_gui_detail::Input::Draw() { } else if (field_20 < 300) { spr::SprArgs args; - args.id.index = 3343; + args.id = 3343; args.prio = spr::SPR_PRIO_29; args.trans.x = mouse_pos.x; args.trans.y = mouse_pos.y; @@ -4526,8 +4526,8 @@ void dw_gui_detail::Input::Draw() { args.screen_scale = SCREEN_MODE_MAX; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; - spr::put_sprite(args, aft_spr_db); + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; + spr::put(args, aft_spr_db); } } diff --git a/src/ReDIVA/graphics/color_change.cpp b/src/ReDIVA/graphics/color_change.cpp index a2daca45..653f48e4 100644 --- a/src/ReDIVA/graphics/color_change.cpp +++ b/src/ReDIVA/graphics/color_change.cpp @@ -377,24 +377,24 @@ void ColorChangeDw::Draw() { if (show) { data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; if (org_tex) { spr::SprArgs args; args.tex = org_tex; if (auto_resize) - args.SetSize(256.0f); - spr::put_sprite(args, aft_spr_db); + args.setSize(256.0f); + spr::put(args, aft_spr_db); } if (chg_tex) { spr::SprArgs args; args.tex = chg_tex; args.trans.x = (float_t)chg_tex->width; if (auto_resize) { - args.SetSize(256.0f); - args.trans.x = 266.0; + args.setSize(256.0f); + args.trans.x = 266.0f; } - spr::put_sprite(args, aft_spr_db); + spr::put(args, aft_spr_db); } } diff --git a/src/ReDIVA/mask_screen.cpp b/src/ReDIVA/mask_screen.cpp index 123ea06e..efc3086a 100644 --- a/src/ReDIVA/mask_screen.cpp +++ b/src/ReDIVA/mask_screen.cpp @@ -112,7 +112,7 @@ bool TaskMaskScreen::ctrl_inner() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; aet_obj_id = aet_manager_init_aet_object(43, layer_names[index], spr::SPR_PRIO_21, AET_PLAY_ONCE, 0, 0, aft_aet_db, aft_spr_db); diff --git a/src/ReDIVA/mode_advertise.cpp b/src/ReDIVA/mode_advertise.cpp index 4fa856ce..b5423087 100644 --- a/src/ReDIVA/mode_advertise.cpp +++ b/src/ReDIVA/mode_advertise.cpp @@ -485,9 +485,9 @@ bool dest_photo_mode_demo() { static bool adv_load() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; - if (sprite_manager_load_file(37, aft_spr_db) || aet_manager_load_file(30, aft_aet_db)) + if (spr::wait(37, aft_spr_db) || aet_manager_load_file(30, aft_aet_db)) return true; return sound_work_load_farc("rom/sound/se_adv.farc"); } @@ -495,9 +495,9 @@ static bool adv_load() { static void adv_read() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; - sprite_manager_read_file(37, "", aft_data, aft_spr_db); + spr::request(37, "", aft_data, aft_spr_db); aet_manager_read_file(30, "", aft_data, aft_aet_db); sound_work_read_farc("rom/sound/se_adv.farc"); } @@ -505,9 +505,9 @@ static void adv_read() { static void adv_unload() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; - sprite_manager_unload_set(37, aft_spr_db); + spr::free(37, aft_spr_db); aet_manager_unload_set(30, aft_aet_db); sound_work_unload_farc("rom/sound/se_adv.farc"); } diff --git a/src/ReDIVA/print_work.cpp b/src/ReDIVA/print_work.cpp index d22c51ef..69c2a2f8 100644 --- a/src/ReDIVA/print_work.cpp +++ b/src/ReDIVA/print_work.cpp @@ -159,15 +159,15 @@ PrintWork::PrintWork() : clip(), layer(), field_28(), line_length() { } void PrintWork::DrawLine(vec2 pos[2]) { - spr::put_sprite_line(pos[0], pos[1], screen_mode, prio, color, layer); + spr::putLine(pos[0], pos[1], screen_mode, prio, color, layer); } void PrintWork::DrawPolyLine(vec2* points, size_t count) { - spr::put_sprite_poly_line(points, count, screen_mode, prio, color, layer); + spr::putPolyLine(points, count, screen_mode, prio, color, layer); } void PrintWork::DrawRectangle(rectangle rect) { - spr::put_sprite_line_box(rect, screen_mode, prio, color, layer); + spr::putLineBox(rect, screen_mode, prio, color, layer); } void PrintWork::DrawTextMesh(app::text_flags flags, sprite_text_mesh& mesh) { @@ -175,7 +175,7 @@ void PrintWork::DrawTextMesh(app::text_flags flags, sprite_text_mesh& mesh) { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; spr::SprArgs args; args.blend = (field_28 >> 3) == 0x02 ? spr::SPR_BLEND_ADD : spr::SPR_BLEND_DEFAULT; @@ -193,9 +193,9 @@ void PrintWork::DrawTextMesh(app::text_flags flags, sprite_text_mesh& mesh) { i.pos.x += 2.0f; i.pos.y += 2.0f; } - args.SetQuadArgs(mesh.quads.data(), mesh.quads.size()); - args.id.index = mesh.sprite_id; - spr::put_sprite(args, aft_spr_db); + args.setQuadArgs(mesh.quads.data(), mesh.quads.size()); + args.id = mesh.sprite_id; + spr::put(args, aft_spr_db); for (spr::SprArgs::Quad& i : mesh.quads) { i.color.r = color.r; @@ -206,11 +206,11 @@ void PrintWork::DrawTextMesh(app::text_flags flags, sprite_text_mesh& mesh) { } } - args.SetQuadArgs(mesh.quads.data(), mesh.quads.size()); + args.setQuadArgs(mesh.quads.data(), mesh.quads.size()); if (flags & app::TEXT_FLAG_FONT) args.shader_name = SHADER_FT_FONT; - args.id.index = mesh.sprite_id; - spr::put_sprite(args, aft_spr_db); + args.id = mesh.sprite_id; + spr::put(args, aft_spr_db); } void PrintWork::FillRectangle(rectangle rect) { @@ -226,7 +226,7 @@ void PrintWork::FillRectangle(rectangle rect) { rect.size.y = clip_max_pos_y - rect.pos.y; } - spr::put_sprite_rect(rect, screen_mode, prio, fill_color, layer); + spr::putRect(rect, screen_mode, prio, fill_color, layer); } font_char PrintWork::GetCharData(wchar_t c) { diff --git a/src/ReDIVA/print_work.hpp b/src/ReDIVA/print_work.hpp index 665913cf..a346b463 100644 --- a/src/ReDIVA/print_work.hpp +++ b/src/ReDIVA/print_work.hpp @@ -53,8 +53,8 @@ struct PrintWork { color4u8 fill_color; bool clip; rectangle clip_data; - spr::SprPrio prio; - spr::SprLayer layer; + spr::SPR_PRIO prio; + spr::SPR_LAYER layer; SCREEN_MODE screen_mode; uint32_t field_28; vec2 text_current_loc; @@ -127,7 +127,7 @@ struct PrintWork { text_current_loc = line_origin_loc; } - inline void set_prio(const spr::SprPrio value) { + inline void set_prio(const spr::SPR_PRIO value) { prio = value; } diff --git a/src/ReDIVA/pv_game/game_2d.cpp b/src/ReDIVA/pv_game/game_2d.cpp index 8b15824b..45174af2 100644 --- a/src/ReDIVA/pv_game/game_2d.cpp +++ b/src/ReDIVA/pv_game/game_2d.cpp @@ -42,7 +42,7 @@ Game2dEnergyUnit::~Game2dEnergyUnit() { void Game2dEnergyUnit::init() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; for (int32_t i = 0; i < 5; i++) { field_1B8[i] = 0; @@ -72,7 +72,9 @@ void Game2dEnergyUnit::init() { field_1CC[3] = true; - field_1D8 = sprite_manager_get_spr_rectangle(2569, aft_spr_db).size; + spr::SprArgs::Rect rect = spr::getRect(2569, aft_spr_db); + field_1D8.x = rect.width; + field_1D8.y = rect.height; field_1E0.x = field_8[1].position.x - field_8[0].position.x; field_1E0.y = field_1D8.y; @@ -126,7 +128,7 @@ void Game2dEnergyUnit::init() { void Game2dEnergyUnit::ctrl() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; float_t life_gauge = 0.0f; bool life_gauge_safety = false; @@ -238,7 +240,7 @@ void Game2dEnergyUnit::disp() { void Game2dEnergyUnit::disp_inner() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; if (!field_1D1 || !field_1CC[0]) return; @@ -250,8 +252,8 @@ void Game2dEnergyUnit::disp_inner() { v11.x = v9 * 0.5f; spr::SprArgs v49; - v49.SetSize({ v9, v11.y}); - v49.id.index = 2570; + v49.setSize({ v9, v11.y}); + v49.id = 2570; v49.trans = field_8[0].position; v49.trans.y = field_8[0].position.y + (float_t)field_1D4; v49.screen_trans = field_8[0].mode; @@ -259,8 +261,8 @@ void Game2dEnergyUnit::disp_inner() { v49.prio = spr::SPR_PRIO_12; spr::SprArgs v51; - v51.SetSize(v11); - v51.id.index = 2569; + v51.setSize(v11); + v51.id = 2569; v51.trans = field_8[0].position; v51.trans.y = field_8[0].position.y + (float_t)field_1D4; v51.screen_trans = field_8[0].mode; @@ -268,8 +270,8 @@ void Game2dEnergyUnit::disp_inner() { v51.prio = spr::SPR_PRIO_12; spr::SprArgs v43; - v43.SetSize(v11); - v43.id.index = 2569; + v43.setSize(v11); + v43.id = 2569; v43.trans.x = field_8[0].position.x + v9; v43.trans.y = field_8[0].position.y + (float_t)field_1D4; v43.trans.z = field_8[0].position.z; @@ -285,8 +287,8 @@ void Game2dEnergyUnit::disp_inner() { v14.x = v12 * 0.5f; spr::SprArgs v54; - v54.SetSize({ v12, v14.y }); - v54.id.index = 2583; + v54.setSize({ v12, v14.y }); + v54.id = 2583; v54.trans = field_8[0].position; v54.trans.y = field_8[0].position.y + (float_t)field_1D4; v54.screen_trans = field_8[0].mode; @@ -294,8 +296,8 @@ void Game2dEnergyUnit::disp_inner() { v54.prio = spr::SPR_PRIO_12; spr::SprArgs v52; - v52.SetSize(v14); - v52.id.index = 2581; + v52.setSize(v14); + v52.id = 2581; v52.trans = field_8[0].position; v52.trans.y = field_8[0].position.y + (float_t)field_1D4; v52.screen_trans = field_8[0].mode; @@ -303,8 +305,8 @@ void Game2dEnergyUnit::disp_inner() { v52.prio = spr::SPR_PRIO_12; spr::SprArgs v46; - v46.SetSize(v14); - v46.id.index = 2581; + v46.setSize(v14); + v46.id = 2581; v46.trans.x = field_8[0].position.x + v12; v46.trans.y = field_8[0].position.y + (float_t)field_1D4; v46.trans.z = field_8[0].position.z; @@ -320,8 +322,8 @@ void Game2dEnergyUnit::disp_inner() { v17.x = v15 * 0.5f; spr::SprArgs v50; - v50.SetSize({ v15, v17.y }); - v50.id.index = 2582; + v50.setSize({ v15, v17.y }); + v50.id = 2582; v50.trans = field_8[0].position; v50.trans.y = field_8[0].position.y + (float_t)field_1D4; v50.screen_trans = field_8[0].mode; @@ -329,8 +331,8 @@ void Game2dEnergyUnit::disp_inner() { v50.prio = spr::SPR_PRIO_12; spr::SprArgs v48; - v48.SetSize(v17); - v48.id.index = 2580; + v48.setSize(v17); + v48.id = 2580; v48.trans = field_8[0].position; v48.trans.y = field_8[0].position.y + (float_t)field_1D4; v48.screen_trans = field_8[0].mode; @@ -338,8 +340,8 @@ void Game2dEnergyUnit::disp_inner() { v48.prio = spr::SPR_PRIO_12; spr::SprArgs v44; - v44.SetSize(v17); - v44.id.index = 2580; + v44.setSize(v17); + v44.id = 2580; v44.trans.x = field_8[0].position.x + v15; v44.trans.y = field_8[0].position.y + (float_t)field_1D4; v44.trans.z = field_8[0].position.z; @@ -355,8 +357,8 @@ void Game2dEnergyUnit::disp_inner() { v19.x = v15 * 0.5f; spr::SprArgs v53; - v53.SetSize({ v18, v19.y }); - v53.id.index = 2866; + v53.setSize({ v18, v19.y }); + v53.id = 2866; v53.trans = field_8[0].position; v53.trans.y = field_8[0].position.y + (float_t)field_1D4; v53.screen_trans = field_8[0].mode; @@ -364,8 +366,8 @@ void Game2dEnergyUnit::disp_inner() { v53.prio = spr::SPR_PRIO_13; spr::SprArgs v55; - v55.SetSize(v19); - v55.id.index = 2865; + v55.setSize(v19); + v55.id = 2865; v55.trans = field_8[0].position; v55.trans.y = field_8[0].position.y + (float_t)field_1D4; v55.screen_trans = field_8[0].mode; @@ -373,8 +375,8 @@ void Game2dEnergyUnit::disp_inner() { v55.prio = spr::SPR_PRIO_13; spr::SprArgs v45; - v45.SetSize(v19); - v45.id.index = 2865; + v45.setSize(v19); + v45.id = 2865; v45.trans.z = field_8[0].position.z; v45.trans.x = v18 + field_8[0].position.x; v45.trans.y = field_8[0].position.y + (float_t)field_1D4; @@ -384,7 +386,7 @@ void Game2dEnergyUnit::disp_inner() { v45.prio = spr::SPR_PRIO_13; spr::SprArgs v47; - v47.SetSize({ (life_gauge_prev - life_gauge_stable) * field_1E0.x * (1.0f / max_value), field_1D8.y }); + v47.setSize({ (life_gauge_prev - life_gauge_stable) * field_1E0.x * (1.0f / max_value), field_1D8.y }); v47.kind = spr::SPR_KIND_RECT; v47.trans.z = field_8[0].position.z; v47.trans.x = field_8[0].position.x + field_1E0.x * life_gauge_stable * (1.0f / max_value); @@ -394,24 +396,24 @@ void Game2dEnergyUnit::disp_inner() { v47.prio = spr::SPR_PRIO_12; v47.color = { 0xFF, 0xFF, 0xFF, (uint8_t)(int32_t)(life_gauge_delay * 0.05f * 255.0f) }; - spr::put_sprite(v50, aft_spr_db); - spr::put_sprite(v48, aft_spr_db); + spr::put(v50, aft_spr_db); + spr::put(v48, aft_spr_db); if (life_gauge_stable != life_gauge_increase) - spr::put_sprite(v44, aft_spr_db); - spr::put_sprite(v54, aft_spr_db); - spr::put_sprite(v52, aft_spr_db); + spr::put(v44, aft_spr_db); + spr::put(v54, aft_spr_db); + spr::put(v52, aft_spr_db); if (life_gauge_stable != life_gauge_decrease) - spr::put_sprite(v46, aft_spr_db); - spr::put_sprite(v49, aft_spr_db); - spr::put_sprite(v51, aft_spr_db); + spr::put(v46, aft_spr_db); + spr::put(v49, aft_spr_db); + spr::put(v51, aft_spr_db); if (life_gauge_stable == life_gauge_decrease) - spr::put_sprite(v43, aft_spr_db); - spr::put_sprite(v47, aft_spr_db); + spr::put(v43, aft_spr_db); + spr::put(v47, aft_spr_db); if (life_gauge_safety) { - spr::put_sprite(v53, aft_spr_db); - spr::put_sprite(v55, aft_spr_db); - spr::put_sprite(v45, aft_spr_db); + spr::put(v53, aft_spr_db); + spr::put(v55, aft_spr_db); + spr::put(v45, aft_spr_db); } if (life_gauge_safety) { @@ -420,13 +422,13 @@ void Game2dEnergyUnit::disp_inner() { int32_t v23 = life_gauge_safety_time / 10; int32_t v24 = life_gauge_safety_time % 10; if (v23 > 0) { - aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v23], spr::SPR_ATTR_CTR_CC, + aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v23], spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_13, &field_1F0, &field_8[3], aft_spr_db); - aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v24], spr::SPR_ATTR_CTR_CC, + aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v24], spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_13, &field_1F0, &field_8[2], aft_spr_db); } else - aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v24], spr::SPR_ATTR_CTR_CC, + aet_layout_data::put_sprite(spr_p_life_safe_num_spr[v24], spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_13, &field_1F0, &field_8[3], aft_spr_db); } } diff --git a/src/ReDIVA/pv_game/pv_game.cpp b/src/ReDIVA/pv_game/pv_game.cpp index 3576d629..f853cab4 100644 --- a/src/ReDIVA/pv_game/pv_game.cpp +++ b/src/ReDIVA/pv_game/pv_game.cpp @@ -239,10 +239,10 @@ void pv_game_edit_effect::reset() { void pv_game_edit_effect::unload() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; for (uint32_t& i : spr_set_ids) - sprite_manager_unload_set(i, aft_spr_db); + spr::free(i, aft_spr_db); for (uint32_t& i : aet_set_ids) aet_manager_unload_set(i, aft_aet_db); @@ -2474,7 +2474,7 @@ bool pv_game::load() { bone_database* aft_bone_data = &aft_data->data_ft.bone_data; motion_database* aft_mot_db = &aft_data->data_ft.mot_db; object_database* aft_obj_db = &aft_data->data_ft.obj_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; texture_database* aft_tex_db = &aft_data->data_ft.tex_db; stage_database* aft_stage_data = &aft_data->data_ft.stage_data; @@ -2527,7 +2527,7 @@ bool pv_game::load() { std::string aet_name(aet_set_name); aet_name.append("_MAIN"); - pv_disp2d_data.pv_spr_set_id = aft_spr_db->get_spr_set_id_by_name(spr_set_name.c_str()); + pv_disp2d_data.pv_spr_set_id = aft_spr_db->getSetUidFromName(spr_set_name.c_str()); pv_disp2d_data.pv_aet_set_id = aft_aet_db->get_aet_set_id_by_name(aet_set_name.c_str()); pv_disp2d_data.pv_aet_id = aft_aet_db->get_aet_id_by_name(aet_name.c_str()); } @@ -3084,12 +3084,12 @@ bool pv_game::load() { field.spr_set_back_id = -1; if (i.spr_set_back.size()) { - uint32_t spr_set_id = aft_spr_db->get_spr_set_id_by_name(i.spr_set_back.c_str()); + uint32_t spr_set_id = aft_spr_db->getSetUidFromName(i.spr_set_back.c_str()); if (spr_set_id != -1) { std::string spr_set_back_image(i.spr_set_back); spr_set_back_image.append("_IMAGE"); - uint32_t spr_id = aft_spr_db->get_spr_id_by_name(spr_set_back_image.c_str()); + uint32_t spr_id = aft_spr_db->getSprUidFromName(spr_set_back_image.c_str()); if (spr_id != -1) { data.spr_set_back_ids.push_back(spr_set_id); field.spr_set_back_id = spr_id; @@ -3273,7 +3273,7 @@ bool pv_game::load() { case 8: { prj::sort_unique(data.spr_set_back_ids); for (uint32_t& i : data.spr_set_back_ids) - sprite_manager_read_file(i, std::string(data.pv->mdata.dir), aft_data, aft_spr_db); + spr::request(i, std::string(data.pv->mdata.dir), aft_data, aft_spr_db); data.field_2D7E8 = true; prj::sort_unique(data.auth_3d_categories); @@ -3407,7 +3407,7 @@ bool pv_game::load() { spr_set_name.append(i.name); uint32_t aet_set_id = aft_aet_db->get_aet_set_id_by_name(aet_set_name.c_str()); - uint32_t spr_set_id = aft_spr_db->get_spr_set_id_by_name(spr_set_name.c_str()); + uint32_t spr_set_id = aft_spr_db->getSetUidFromName(spr_set_name.c_str()); if (aet_set_id != -1 && spr_set_id != -1) { std::string aet_name(aet_set_name); aet_name.append("_MAIN"); @@ -3422,7 +3422,7 @@ bool pv_game::load() { } for (uint32_t& i : data.edit_effect.spr_set_ids) - sprite_manager_read_file(i, "", aft_data, aft_spr_db); + spr::request(i, "", aft_data, aft_spr_db); for (uint32_t& i : data.edit_effect.aet_set_ids) aet_manager_read_file(i, "", aft_data, aft_aet_db); @@ -3480,7 +3480,7 @@ bool pv_game::load() { bool wait_load = task_stage_check_not_loaded(); for (uint32_t& i : data.spr_set_back_ids) - if (sprite_manager_load_file(i, aft_spr_db)) + if (spr::wait(i, aft_spr_db)) wait_load |= true; for (std::string& i : data.auth_3d_categories) @@ -3492,7 +3492,7 @@ bool pv_game::load() { wait_load |= true; for (uint32_t& i : data.edit_effect.spr_set_ids) - if (sprite_manager_load_file(i, aft_spr_db)) + if (spr::wait(i, aft_spr_db)) wait_load |= true; for (uint32_t& i : data.obj_set_itmpv) @@ -4659,7 +4659,7 @@ void pv_game::title_image_ctrl(bool dont_wait) { bool pv_game::unload() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; texture_database* aft_tex_db = &aft_data->data_ft.tex_db; switch (data.field_2D09C) { @@ -4754,7 +4754,7 @@ bool pv_game::unload() { if (data.field_2D7E8) for (uint32_t& i : data.spr_set_back_ids) - sprite_manager_unload_set(i, aft_spr_db); + spr::free(i, aft_spr_db); data.field_2D7E8 = false; data.spr_set_back_ids.clear(); diff --git a/src/ReDIVA/pv_game/pv_game_play_data.cpp b/src/ReDIVA/pv_game/pv_game_play_data.cpp index 1618b4c4..3b646039 100644 --- a/src/ReDIVA/pv_game/pv_game_play_data.cpp +++ b/src/ReDIVA/pv_game/pv_game_play_data.cpp @@ -389,7 +389,7 @@ const char* spr_white_fade[] = { extern uint32_t aet_gam_cmn_set_id; extern uint32_t spr_gam_cmn_set_id; -static void sub_14013AAE0(float_t pos_x, float_t pos_y, spr::SprPrio prio, +static void sub_14013AAE0(float_t pos_x, float_t pos_y, spr::SPR_PRIO prio, const char* str, bool h_center, color4u8 color, rectangle* clip_rect = 0); pv_disp2d::pv_disp2d() : pv_id(), title_start_2d_field(), title_end_2d_field(), @@ -564,7 +564,7 @@ void pv_game_play_data::disp_chance_point() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; int32_t digits = get_digit_count(chance_points, 6); @@ -587,7 +587,7 @@ void pv_game_play_data::disp_chance_point() { const aet_layout_data* layout = comp.Find((&spr_p_chance_point_num[v5 / 2])[digits]); if (layout) - aet_layout_data::put_sprite(392, spr::SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, layout, aft_spr_db); + aet_layout_data::put_sprite(392, spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, layout, aft_spr_db); AetComp::put_number_sprite(chance_points, 7, &comp, &spr_p_chance_point_num[v5 / 2], spr_p_chance_point_num_spr, spr::SPR_PRIO_16, &pos, 0, aft_spr_db); @@ -629,7 +629,7 @@ void pv_game_play_data::disp_chance_txt() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; vec2 pos = { ((float_t)(6 - digits) * field_350) * -0.5f, 0.0f }; aet_manager_init_aet_layout(&comp, 3, spr_chance_txt[1], (AetFlags)0, SCREEN_MODE_HD, @@ -644,7 +644,7 @@ void pv_game_play_data::disp_combo() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; const char* name; if (value_text_time_offset < -(float_t)(1.0 / 120.0)) @@ -675,7 +675,7 @@ void pv_game_play_data::disp_max_slide_point() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; int32_t digits = get_digit_count(max_slide_points, 6); @@ -731,7 +731,7 @@ void pv_game_play_data::disp_score() { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; vec2 pos = { 0.0f, frame_btm_pos[0] }; AetComp::put_number_sprite(score, 7, &comp, spr_p_score, @@ -744,7 +744,7 @@ void pv_game_play_data::disp_slide_point() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; int32_t digits = get_digit_count(slide_points, 6); @@ -766,7 +766,7 @@ void pv_game_play_data::disp_slide_point() { target_pos_scale_offset_apply(&slide_points_pos, &pos); const aet_layout_data* layout = comp.Find((&spr_p_chance_point_num[v5 / 2])[digits]); if (layout) - aet_layout_data::put_sprite(34086, spr::SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, layout, aft_spr_db); + aet_layout_data::put_sprite(34086, spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, layout, aft_spr_db); AetComp::put_number_sprite(slide_points, 7, &comp, &spr_p_chance_point_num[v5 / 2], spr_p_slide_point_num_spr, spr::SPR_PRIO_16, &pos, 0, aft_spr_db); } @@ -793,7 +793,7 @@ void pv_game_play_data::disp_song_energy() { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; pv_game* pv_game = pv_game_get(); const int32_t* spr; @@ -811,12 +811,12 @@ void pv_game_play_data::disp_song_energy() { const aet_layout_data* spr_p_energy_num_3_layout = comp.Find(spr_p_energy_num[3]); if (spr_p_energy_num_3_layout) - aet_layout_data::put_sprite(spr[11], spr::SPR_ATTR_CTR_CC, + aet_layout_data::put_sprite(spr[11], spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, spr_p_energy_num_3_layout, aft_spr_db); const aet_layout_data* spr_p_energy_num_0_layout = comp.Find(spr_p_energy_num[0]); if (spr_p_energy_num_0_layout) - aet_layout_data::put_sprite(spr[10], spr::SPR_ATTR_CTR_CC, + aet_layout_data::put_sprite(spr[10], spr::M_SPR_ATTR_CTR_CC, spr::SPR_PRIO_16, &pos, spr_p_energy_num_0_layout, aft_spr_db); } @@ -846,13 +846,13 @@ void pv_game_play_data::disp_spr_set_back() { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; spr::SprArgs args; - args.id.id = spr_set_back_id; + args.id = spr_set_back_id; args.prio = spr::SPR_PRIO_01; args.target = spr::SPR_TARGET_BACK; - spr::put_sprite(args, aft_spr_db); + spr::put(args, aft_spr_db); } void pv_game_play_data::fade_begin_ctrl() { @@ -1091,9 +1091,9 @@ void pv_game_play_data::init_aet(pv_aet aet, int32_t index, std::string&& layer_ aet_id = aft_aet_db->get_aet_by_name(aet_name.c_str())->id; } - spr::SprTarget target; + spr::SPR_TARGET target; pv_game_aet aet_index; - spr::SprPrio prio; + spr::SPR_PRIO prio; switch (aet) { case PV_AET_FRONT: target = spr::SPR_TARGET_FRONT; @@ -1203,7 +1203,7 @@ void pv_game_play_data::init_aet_combo(int32_t target_display_index, void pv_game_play_data::init_aet_demo_font() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; aet_manager_free_aet_object_reset(&aet_ids[PV_GAME_AET_DEMO_FONT]); aet_ids[PV_GAME_AET_DEMO_FONT] = aet_manager_init_aet_object(33, spr::SPR_PRIO_16, AET_PLAY_ONCE, @@ -1213,7 +1213,7 @@ void pv_game_play_data::init_aet_demo_font() { void pv_game_play_data::init_aet_demo_logo() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; aet_manager_free_aet_object_reset(&aet_ids[PV_GAME_AET_DEMO_LOGO]); aet_ids[PV_GAME_AET_DEMO_LOGO] = aet_manager_init_aet_object(33, spr::SPR_PRIO_16, AET_LOOP, @@ -1228,7 +1228,7 @@ float_t pv_game_play_data::init_aet_edit_effect(int32_t aet_id, const char* name data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; std::vector vec; aet_manager_get_scene_comp_layer_names(vec, aet_id, aft_aet_db); @@ -1294,11 +1294,11 @@ void pv_game_play_data::init_aet_frame(bool danger) { } } -uint32_t pv_game_play_data::init_aet_gam_cmn(pv_game_aet aet_index, spr::SprPrio prio, +uint32_t pv_game_play_data::init_aet_gam_cmn(pv_game_aet aet_index, spr::SPR_PRIO prio, AetFlags flags, const char* layer_name, const vec2* pos, const vec2* scale) { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; uint32_t aet_id = aet_manager_init_aet_object(3, prio, flags, layer_name, pos, spr::SPR_TARGET_FRONT, 0, 0, -1.0f, -1.0f, scale, 0, aft_aet_db, aft_spr_db); @@ -1307,7 +1307,7 @@ uint32_t pv_game_play_data::init_aet_gam_cmn(pv_game_aet aet_index, spr::SprPrio } void pv_game_play_data::init_aet_id(int32_t aet_id, const char* layer_name, - spr::SprTarget target, pv_game_aet aet_index, spr::SprPrio prio, bool* not_init, + spr::SPR_TARGET target, pv_game_aet aet_index, spr::SPR_PRIO prio, bool* not_init, float_t start_time, float_t end_time, FrameRateControl* frame_rate_control) { aet_manager_free_aet_object_reset(&aet_ids[aet_index]); if (!pv_set || !layer_name || !*layer_name) @@ -1315,7 +1315,7 @@ void pv_game_play_data::init_aet_id(int32_t aet_id, const char* layer_name, data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; aet_ids[aet_index] = aet_manager_init_aet_object(aet_id, prio, AET_PLAY_ONCE, layer_name, 0, target, 0, 0, start_time, end_time, 0, frame_rate_control, aft_aet_db, aft_spr_db); @@ -1411,7 +1411,7 @@ void pv_game_play_data::init_aet_slide_max(int32_t slide_point, float_t pos_x, f data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; AetComp comp; aet_manager_init_aet_layout(&comp, 3, spr_max_slide_point[v10], (AetFlags)0, SCREEN_MODE_HD, @@ -1525,7 +1525,7 @@ void pv_game_play_data::init_aet_success_info() { void pv_game_play_data::init_aet_title_image(const char* name) { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; #if PV_DEBUG FrameRateControl* frame_rate_control = get_sys_frame_rate(); @@ -1565,16 +1565,16 @@ bool pv_game_play_data::load_auth_2d(int32_t stage_index, pv_disp2d* disp2d) { bool pv_game_play_data::load_auth_2d_data() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; if (pv_set) { - if (pv_spr_set_id != -1 && sprite_manager_load_file(pv_spr_set_id, aft_spr_db)) + if (pv_spr_set_id != -1 && spr::wait(pv_spr_set_id, aft_spr_db)) return true; if (pv_aet_set_id != -1 && aet_manager_load_file(pv_aet_set_id, aft_aet_db)) return true; } - if (sprite_manager_load_file(9, aft_spr_db) || aet_manager_load_file(3, aft_aet_db)) + if (spr::wait(9, aft_spr_db) || aet_manager_load_file(3, aft_aet_db)) return true; return false;//game_skin_get()->load_file(); @@ -1583,9 +1583,9 @@ bool pv_game_play_data::load_auth_2d_data() { void pv_game_play_data::read_auth_2d_data() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; - sprite_manager_read_file(spr_gam_cmn_set_id, "", aft_data, aft_spr_db); + spr::request(spr_gam_cmn_set_id, "", aft_data, aft_spr_db); aet_manager_read_file(aet_gam_cmn_set_id, "", aft_data, aft_aet_db); if (pv_set) { @@ -1594,7 +1594,7 @@ void pv_game_play_data::read_auth_2d_data() { mdata_dir.assign(pv_game_get()->data.pv->mdata.dir); if (pv_spr_set_id != -1) - sprite_manager_read_file(pv_spr_set_id, mdata_dir, aft_data, aft_spr_db); + spr::request(pv_spr_set_id, mdata_dir, aft_data, aft_spr_db); if (pv_aet_set_id != -1) aet_manager_read_file(pv_aet_set_id, mdata_dir, aft_data, aft_aet_db); @@ -1949,18 +1949,18 @@ void pv_game_play_data::unload_aet() { void pv_game_play_data::unload_auth_2d() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; unload_auth_2d_data(); if (pv_set) { if (pv_spr_set_id != -1) - sprite_manager_unload_set(pv_spr_set_id, aft_spr_db); + spr::free(pv_spr_set_id, aft_spr_db); if (pv_aet_set_id != -1) aet_manager_unload_set(pv_aet_set_id, aft_aet_db); } - sprite_manager_unload_set(spr_gam_cmn_set_id, aft_spr_db); + spr::free(spr_gam_cmn_set_id, aft_spr_db); aet_manager_unload_set(aet_gam_cmn_set_id, aft_aet_db); //game_skin_get()->unload_skin(); @@ -2003,32 +2003,31 @@ void pv_game_play_data::sub_1401349B0() { void pv_game_play_data::sub_1401349C0(uint32_t set_id) { data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; - if (!sprite_manager_get_set_ready(aft_spr_db->get_spr_set_by_id(set_id)->index, aft_spr_db)) + if (!spr::getReady(set_id, aft_spr_db)) return; - uint32_t count = sprite_manager_get_set_texture_num(set_id, aft_spr_db); + uint32_t count = spr::getTexNum(set_id, aft_spr_db); for (uint32_t i = 0; i < count; i++) { - texture* tex = sprite_manager_get_spr_texture( - aft_spr_db->get_tex_by_set_id_index(set_id, i)->id, aft_spr_db); + const texture* tex = spr::getTexture(aft_spr_db->getTexFromIdx(set_id, i).uid, aft_spr_db); if (!tex) continue; spr::SprArgs args; - args.id.id = -1; + args.id = -1; args.prio = spr::SPR_PRIO_04; args.tex = tex; - args.SetSize({ (float_t)tex->width, (float_t)tex->height }); - args.SetRect(0.0f, 0.0f, (float_t)tex->width, (float_t)tex->height); - spr::put_sprite(args, aft_spr_db); + args.setSize({ (float_t)tex->width, (float_t)tex->height }); + args.setRect(0.0f, 0.0f, (float_t)tex->width, (float_t)tex->height); + spr::put(args, aft_spr_db); } } void pv_game_play_data::sub_140135ED0() { data_struct* aft_data = &data_list[DATA_AFT]; aet_database* aft_aet_db = &aft_data->data_ft.aet_db; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; AetArgs args; args.id.id = 3; @@ -2217,7 +2216,7 @@ float_t get_percentage_clear_great() { return percentage_clear_great[sub_14013C8C0()->difficulty]; } -static void sub_14013AAE0(float_t pos_x, float_t pos_y, spr::SprPrio prio, +static void sub_14013AAE0(float_t pos_x, float_t pos_y, spr::SPR_PRIO prio, const char* str, bool h_center, color4u8 color, rectangle* clip_rect) { if (!str) return; diff --git a/src/ReDIVA/pv_game/pv_game_play_data.hpp b/src/ReDIVA/pv_game/pv_game_play_data.hpp index 389a59c7..617258d8 100644 --- a/src/ReDIVA/pv_game/pv_game_play_data.hpp +++ b/src/ReDIVA/pv_game/pv_game_play_data.hpp @@ -265,10 +265,10 @@ struct pv_game_play_data { void init_aet_demo_logo(); float_t init_aet_edit_effect(int32_t aet_id, const char* name, bool loop, bool low_field); void init_aet_frame(bool danger); - uint32_t init_aet_gam_cmn(pv_game_aet aet_index, spr::SprPrio prio, + uint32_t init_aet_gam_cmn(pv_game_aet aet_index, spr::SPR_PRIO prio, AetFlags flags, const char* layer_name, const vec2* pos = 0, const vec2* scale = 0); void init_aet_id(int32_t aet_id, const char* layer_name, - spr::SprTarget target, pv_game_aet aet_index, spr::SprPrio prio, bool* not_init, + spr::SPR_TARGET target, pv_game_aet aet_index, spr::SPR_PRIO prio, bool* not_init, float_t start_time, float_t end_time, FrameRateControl* frame_rate_control); void init_aet_level_info(); void init_aet_next_info(); @@ -322,7 +322,7 @@ struct pv_game_play_data { void sub_140137DD0(int32_t a2, float_t delta_time, vec2& pos, int32_t combo_count); void sub_140137F80(bool update, float_t duration); - inline void reinit_aet_gam_cmn(pv_game_aet aet_index, spr::SprPrio prio, + inline void reinit_aet_gam_cmn(pv_game_aet aet_index, spr::SPR_PRIO prio, AetFlags flags, const char* layer_name, const vec2* pos = 0, const vec2* scale = 0) { aet_manager_free_aet_object_reset(&aet_ids[aet_index]); aet_ids[aet_index] = init_aet_gam_cmn(aet_index, prio, flags, layer_name, pos, scale); diff --git a/src/ReDIVA/system_startup.cpp b/src/ReDIVA/system_startup.cpp index 6a4cb2ea..00aa8d2c 100644 --- a/src/ReDIVA/system_startup.cpp +++ b/src/ReDIVA/system_startup.cpp @@ -233,7 +233,7 @@ namespace system_startup_detail { void TaskSystemStartup::disp() { ScreenParam& screen_param = get_screen_param(); - spr::put_sprite_rect({ 0.0f, 0.0f, (float_t)screen_param.width, (float_t)screen_param.height }, + spr::putRect({ 0.0f, 0.0f, (float_t)screen_param.width, (float_t)screen_param.height }, screen_param.mode, spr::SPR_PRIO_25, color_black); system_startup.print_work.set_prio(spr::SPR_PRIO_25); diff --git a/src/ReDIVA/task_movie.cpp b/src/ReDIVA/task_movie.cpp index 27631172..47bb5bdc 100644 --- a/src/ReDIVA/task_movie.cpp +++ b/src/ReDIVA/task_movie.cpp @@ -330,14 +330,14 @@ void TaskMovie::disp() { } data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; spr::SprArgs args; - args.Reset(); + args.init(); args.tex = tex; - args.SetSize(sprite_size); - args.SetRect(tex_x, tex_y, tex_width, tex_height); - args.attr = (spr::SprAttr)(spr::SPR_ATTR_CTR_CC | spr::SPR_ATTR_FLIP_V); + args.setSize(sprite_size); + args.setRect(tex_x, tex_y, tex_width, tex_height); + args.attr = (spr::SPR_ATTR)(spr::M_SPR_ATTR_CTR_CC | spr::M_SPR_ATTR_FLIP_V); args.target = spr_params.disp.target; args.prio = spr_params.prio; args.screen_trans = spr_params.disp.screen_mode; @@ -348,7 +348,7 @@ void TaskMovie::disp() { args.scale.x = scale; args.scale.y = scale; args.scale.z = 1.0f; - spr::put_sprite(args, aft_spr_db); + spr::put(args, aft_spr_db); } bool TaskMovie::CheckDisp() { diff --git a/src/ReDIVA/task_movie.hpp b/src/ReDIVA/task_movie.hpp index 2ef77c19..2427a306 100644 --- a/src/ReDIVA/task_movie.hpp +++ b/src/ReDIVA/task_movie.hpp @@ -44,14 +44,14 @@ public: SCREEN_MODE screen_mode; float_t scale; uint32_t field_18; - spr::SprTarget target; + spr::SPR_TARGET target; DispParams(); }; struct SprParams { DispParams disp; - spr::SprPrio prio; + spr::SPR_PRIO prio; SprParams(); }; diff --git a/src/ReDIVA/wait_screen.cpp b/src/ReDIVA/wait_screen.cpp index 4156ad8a..2f429ea7 100644 --- a/src/ReDIVA/wait_screen.cpp +++ b/src/ReDIVA/wait_screen.cpp @@ -56,7 +56,7 @@ public: inline void reload_aet_obj(int32_t index, const char* start_marker, const char* end_marker) { data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; AetArgs args; args.id.id = aet_id; @@ -306,7 +306,7 @@ void TaskWaitScreen::set_load_loop(TaskWaitScreenIndex index) { return; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; switch (index) { case TASK_WAIT_SCREEN_NONE: @@ -355,7 +355,7 @@ bool TaskWaitScreen::wait_load_loop() { break; data_struct* aft_data = &data_list[DATA_AFT]; - sprite_database* aft_spr_db = &aft_data->data_ft.spr_db; + SprDb* aft_spr_db = &aft_data->data_ft.spr_db; AetArgs args; args.id.id = aet_id; diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index 8bfbb39b..7e053243 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -502,7 +502,7 @@ static void x_pv_game_read_object_reflect(const char* path, const char* set_name static void x_pv_game_update_object_set(ObjsetInfo* info); static void x_pv_game_write_aet(uint32_t aet_set_id, const aet_database* aet_db, aet_database_file* x_pack_aet_db, - const sprite_database_file* x_pack_spr_db, const char* out_dir); + const SprDbFile* x_pack_spr_db, const char* out_dir); static bool x_pv_game_write_auth_3d(farc* f, auth_3d* auth, auth_3d_database_file* auth_3d_db, const char* category, std::vector& avail_uids, const char* out_dir); static void x_pv_game_write_auth_3d_camera(auth_3d* auth, int32_t pv_id, @@ -530,7 +530,7 @@ static void x_pv_game_write_stage_data(int32_t stage_id, const auth_3d_database* static void x_pv_game_write_stage_data_reflect(stream& s, stage_database_file* stg_db); static void x_pv_game_write_str_array(stream& s); static void x_pv_game_write_spr(uint32_t spr_set_id, - const sprite_database* spr_db, sprite_database_file* x_pack_spr_db, const char* out_dir); + const SprDb* spr_db, SprDbFile* x_pack_spr_db, const char* out_dir); #endif static void print_dsc_command(dsc& dsc, dsc_data* dsc_data_ptr, int64_t time); @@ -2289,7 +2289,7 @@ const aet_layout_data* aet_obj_data_comp::find_layout(const char* name) { } bool aet_obj_data_comp::init_comp(uint32_t aet_id, const std::string&& layer_name, - float_t frame, const aet_database* aet_db, const sprite_database* spr_db) { + float_t frame, const aet_database* aet_db, const SprDb* spr_db) { if (aet_id == hash_murmurhash_empty || aet_id == -1) return false; @@ -2325,7 +2325,7 @@ bool aet_obj_data::check_disp() { } const aet_layout_data* aet_obj_data::find_aet_layout(const char* name, - const aet_database* aet_db, const sprite_database* spr_db) { + const aet_database* aet_db, const SprDb* spr_db) { if (!name) return 0; @@ -2388,7 +2388,7 @@ x_pv_aet_disp_string::~x_pv_aet_disp_string() { } -void x_pv_aet_disp_string::ctrl(const char* name, aet_obj_data* aet, const aet_database* aet_db, const sprite_database* spr_db) { +void x_pv_aet_disp_string::ctrl(const char* name, aet_obj_data* aet, const aet_database* aet_db, const SprDb* spr_db) { if (!aet) { data.disp = false; return; @@ -2475,7 +2475,7 @@ void x_pv_game_title::ctrl() { switch (state) { case 2: if (!aet_manager_load_file_modern(aet_set_id, &aet_db) - && !sprite_manager_load_file_modern(spr_set_id, &spr_db)) { + && !spr::waitModern(spr_set_id, &spr_db)) { spr_set* set = sprite_manager_get_set(spr_set_id, &spr_db); if (set) { SpriteData* sprdata = set->sprdata; @@ -2651,7 +2651,7 @@ void x_pv_game_title::load_data() { if (!state || state != 1) return; - sprite_manager_read_file_modern(spr_set_id, &data_list[DATA_X], &spr_db); + spr::requestModern(spr_set_id, &data_list[DATA_X], &spr_db); aet_manager_read_file_modern(aet_set_id, &data_list[DATA_X], &aet_db); state = 2; } @@ -2732,7 +2732,7 @@ void x_pv_game_title::unload() { void x_pv_game_title::unload_data() { if (state && state != 2 && state != 1) { reset(); - sprite_manager_unload_set_modern(spr_set_id, &spr_db); + spr::freeModern(spr_set_id, &spr_db); aet_manager_unload_set_modern(aet_set_id, &aet_db); state = 1; } @@ -4679,7 +4679,7 @@ void x_pv_game_stage_env::ctrl(float_t delta_time) { if ((aet_gam_stgpv_id_hash == hash_murmurhash_empty || !aet_manager_load_file_modern(aet_gam_stgpv_id_hash, &aet_db)) && (spr_gam_stgpv_id_hash == hash_murmurhash_empty - || !sprite_manager_load_file_modern(spr_gam_stgpv_id_hash, &spr_db))) { + || !spr::waitModern(spr_gam_stgpv_id_hash, &spr_db))) { spr_set* set = sprite_manager_get_set(spr_gam_stgpv_id_hash, &spr_db); if (set) { SpriteData* sprdata = set->sprdata; @@ -4751,7 +4751,7 @@ void x_pv_game_stage_env::load(int32_t stage_id, pvsr* stage_resource) { spr_gam_stgpv_id_hash = hash_utf8_murmurhash(buf); aet_manager_read_file_modern(aet_gam_stgpv_id_hash, &data_list[DATA_X], &aet_db); - sprite_manager_read_file_modern(spr_gam_stgpv_id_hash, &data_list[DATA_X], &spr_db); + spr::requestModern(spr_gam_stgpv_id_hash, &data_list[DATA_X], &spr_db); sprintf_s(buf, sizeof(buf), "AET_GAM_STGPV%03d_MAIN", stage_id); aet_gam_stgpv_id_main_hash = hash_utf8_murmurhash(buf); @@ -4902,7 +4902,7 @@ void x_pv_game_stage_env::unload() { } if (spr_gam_stgpv_id_hash != hash_murmurhash_empty) { - sprite_manager_unload_set_modern(spr_gam_stgpv_id_hash, &spr_db); + spr::freeModern(spr_gam_stgpv_id_hash, &spr_db); spr_gam_stgpv_id_hash = hash_murmurhash_empty; } @@ -6548,7 +6548,7 @@ bool x_pv_game::ctrl() { baker->pv_tit_aet_ids[4] = hash_utf8_murmurhash("AET_PV_TIT05_MAIN"); for (int32_t i = 0; i < 5; i++) { - sprite_manager_read_file_modern(baker->pv_tit_spr_set_ids[i], + spr::requestModern(baker->pv_tit_spr_set_ids[i], &data_list[DATA_X], &baker->pv_tit_spr_db); aet_manager_read_file_modern(baker->pv_tit_aet_set_ids[i], &data_list[DATA_X], &baker->pv_tit_aet_db); @@ -6560,7 +6560,7 @@ bool x_pv_game::ctrl() { bool wait_load = false; for (int32_t i = 0; i < 5; i++) { if (!aet_manager_load_file_modern(baker->pv_tit_aet_set_ids[i], &baker->pv_tit_aet_db) - && !sprite_manager_load_file_modern(baker->pv_tit_spr_set_ids[i], &baker->pv_tit_spr_db)) { + && !spr::waitModern(baker->pv_tit_spr_set_ids[i], &baker->pv_tit_spr_db)) { spr_set* set = sprite_manager_get_set(baker->pv_tit_spr_set_ids[i], &baker->pv_tit_spr_db); if (set) { SpriteData* sprdata = set->sprdata; @@ -8434,7 +8434,7 @@ void XPVGameBaker::AFTData::Read() { obj_db.modern = false; aft_data->load_file(&obj_db, "rom/objset/", "mdata_obj_db.bin", object_database_file::load_file); spr_db.modern = false; - aft_data->load_file(&spr_db, "rom/2d/", "mdata_spr_db.bin", sprite_database_file::load_file); + aft_data->load_file(&spr_db, "rom/2d/", "mdata_spr_db.bin", SprDbFile::load_file); aft_data->load_file(&stage_data, "rom/", "mdata_stage_data.bin", stage_database_file::load_file); { texture_database_file tex_db_base; @@ -9413,7 +9413,7 @@ bool XPVGameBaker::dest() { } for (int32_t i = 0; i < 5; i++) { - sprite_manager_unload_set_modern(pv_tit_aet_set_ids[i], &pv_tit_spr_db); + spr::freeModern(pv_tit_aet_set_ids[i], &pv_tit_spr_db); aet_manager_unload_set_modern(pv_tit_spr_set_ids[i], &pv_tit_aet_db); } @@ -11385,7 +11385,7 @@ static void x_pv_game_update_object_set(ObjsetInfo* info) { static void x_pv_game_write_aet(uint32_t aet_set_id, const aet_database* aet_db, aet_database_file* x_pack_aet_db, - const sprite_database_file* x_pack_spr_db, const char* out_dir) { + const SprDbFile* x_pack_spr_db, const char* out_dir) { const aet_db_aet_set* aet_set_db = aet_db->get_aet_set_by_id(aet_set_id); ::aet_set* aet_set = aet_manager_get_set(aet_set_id, aet_db); @@ -11446,9 +11446,9 @@ static void x_pv_game_write_aet(uint32_t aet_set_id, sprite_set_name.append(aet_db_aet_set->name, 4); const uint64_t sprite_set_hash = hash_string_xxh3_64bits(sprite_set_name); - for (const spr_db_spr_set_file& i : x_pack_spr_db->sprite_set) + for (const SprDbFile::SprSet& i : x_pack_spr_db->set) if (hash_string_xxh3_64bits(i.name) == sprite_set_hash) { - aet_db_aet_set->sprite_set_id = i.id; + aet_db_aet_set->sprite_set_id = i.uid; break; } @@ -11519,10 +11519,10 @@ static void x_pv_game_write_aet(uint32_t aet_set_id, name.append(source->sprite_name); const uint64_t name_hash = hash_string_xxh3_64bits(name); - for (const spr_db_spr_set_file& l : x_pack_spr_db->sprite_set) - for (const spr_db_spr_file& m : l.sprite) + for (const SprDbFile::SprSet& l : x_pack_spr_db->set) + for (const SprDbFile::Spr& m : l.sprite) if (hash_string_xxh3_64bits(m.name) == name_hash) - *(uint32_t*)&source->sprite_index = m.id; + *(uint32_t*)&source->sprite_index = m.uid; } } @@ -13687,8 +13687,8 @@ static void x_pv_game_write_str_array(stream& s) { } static void x_pv_game_write_spr(uint32_t spr_set_id, - const sprite_database* spr_db, sprite_database_file* x_pack_spr_db, const char* out_dir) { - const spr_db_spr_set* spr_set_db = spr_db->get_spr_set_by_id(spr_set_id); + const SprDb* spr_db, SprDbFile* x_pack_spr_db, const char* out_dir) { + const SprDb::SprSet& spr_db_set = spr_db->getSetFromUid(spr_set_id); ::spr_set* spr_set = sprite_manager_get_set(spr_set_id, spr_db); @@ -13696,73 +13696,73 @@ static void x_pv_game_write_spr(uint32_t spr_set_id, ::spr_set* set = alloc->allocate<::spr_set>(); set->move_data(spr_set, alloc); - std::string name(spr_set_db->name); - std::string file_name(spr_set_db->file_name); + std::string name(spr_db_set.name); + std::string file(spr_db_set.file); replace_stgpv_pv(name); - replace_stgpv_pv(file_name); + replace_stgpv_pv(file); - size_t pos = file_name.rfind(".spr"); + size_t pos = file.rfind(".spr"); if (pos != -1) - file_name.replace(pos, 4, ".bin"); + file.replace(pos, 4, ".bin"); const uint64_t name_hash = hash_string_xxh3_64bits(name); size_t set_index = -1; - uint32_t id = -1; - for (spr_db_spr_set_file& i : x_pack_spr_db->sprite_set) { + uint32_t uid = -1; + for (SprDbFile::SprSet& i : x_pack_spr_db->set) { if (hash_string_xxh3_64bits(i.name) == name_hash) - set_index = &i - x_pack_spr_db->sprite_set.data(); + set_index = &i - x_pack_spr_db->set.data(); - id = (uint32_t)max_def((int32_t)id, (int32_t)i.id); + uid = (uint32_t)max_def((int32_t)uid, (int32_t)i.uid); } - spr_db_spr_set_file* spr_db_spr_set = &x_pack_spr_db->sprite_set.back(); + SprDbFile::SprSet* spr_db_spr_set = &x_pack_spr_db->set.back(); if (set_index != -1) { - spr_db_spr_set = &x_pack_spr_db->sprite_set.data()[set_index]; + spr_db_spr_set = &x_pack_spr_db->set.data()[set_index]; - spr_db_spr_set->file_name.assign(file_name); + spr_db_spr_set->file.assign(file); spr_db_spr_set->sprite.clear(); } else { - uint32_t index = x_pack_spr_db->sprite_set.back().index + 1; + uint32_t id = x_pack_spr_db->set.back().id + 1; - x_pack_spr_db->sprite_set.push_back({}); - spr_db_spr_set = &x_pack_spr_db->sprite_set.back(); + x_pack_spr_db->set.push_back({}); + spr_db_spr_set = &x_pack_spr_db->set.back(); - spr_db_spr_set->id = ++id; + spr_db_spr_set->uid = ++uid; spr_db_spr_set->name.assign(name); - spr_db_spr_set->file_name.assign(file_name); - spr_db_spr_set->index = index; + spr_db_spr_set->file.assign(file); + spr_db_spr_set->id = id; - x_pv_game_baker_ptr->print_log(out_dir, "New Sprite Set ID: %d; Name: %s", id, name.c_str()); + x_pv_game_baker_ptr->print_log(out_dir, "New Sprite Set UID: %d; Name: %s", uid, name.c_str()); } spr_db_spr_set->sprite.reserve((size_t)set->num_of_sprite + set->num_of_texture); uint32_t num_of_sprite = set->num_of_sprite; for (uint32_t i = 0; i < num_of_sprite; i++) { - const spr_db_spr* spr = spr_db->get_spr_by_set_id_index(spr_set_id, i); + const SprDb::Spr& spr = spr_db->getSprFromIdx(spr_set_id, i); spr_db_spr_set->sprite.push_back({}); - spr_db_spr_file& spr_file = spr_db_spr_set->sprite.back(); - spr_file.name.assign(spr->name); + SprDbFile::Spr& spr_file = spr_db_spr_set->sprite.back(); + spr_file.name.assign(spr.name); replace_stgpv_pv(spr_file.name); - spr_file.id = hash_string_murmurhash(spr_file.name); - spr_file.index = i; + spr_file.uid = hash_string_murmurhash(spr_file.name); + spr_file.id = i; spr_file.texture = false; } uint32_t num_of_texture = set->num_of_texture; for (uint32_t i = 0; i < num_of_texture; i++) { - const spr_db_spr* spr = spr_db->get_tex_by_set_id_index(spr_set_id, i); + const SprDb::Spr& spr = spr_db->getTexFromIdx(spr_set_id, i); spr_db_spr_set->sprite.push_back({}); - spr_db_spr_file& spr_file = spr_db_spr_set->sprite.back(); - spr_file.name.assign(spr->name); + SprDbFile::Spr& spr_file = spr_db_spr_set->sprite.back(); + spr_file.name.assign(spr.name); replace_stgpv_pv(spr_file.name); - spr_file.id = hash_string_murmurhash(spr_file.name); - spr_file.index = i; + spr_file.uid = hash_string_murmurhash(spr_file.name); + spr_file.id = i; spr_file.texture = true; } @@ -13784,17 +13784,17 @@ static void x_pv_game_write_spr(uint32_t spr_set_id, f->header_padding = 0x01 + (rand() % 0x20); } - farc_file* ff_bin = f->add_file(spr_db_spr_set->file_name.c_str()); + farc_file* ff_bin = f->add_file(spr_db_spr_set->file.c_str()); set->pack_file(&ff_bin->data, &ff_bin->size); ff_bin->compressed = true; ff_bin->encrypted = true; - file_name.assign(spr_db_spr_set->file_name); - pos = file_name.rfind(".bin"); + file.assign(spr_db_spr_set->file); + pos = file.rfind(".bin"); if (pos != -1) - file_name.erase(pos); + file.erase(pos); - farc_compress_ptr->AddFarc(f, sprintf_s_string("%s\\2d\\%s", out_dir, file_name.c_str())); + farc_compress_ptr->AddFarc(f, sprintf_s_string("%s\\2d\\%s", out_dir, file.c_str())); if (set->txp) { delete set->txp; diff --git a/src/ReDIVA/x_pv_game.hpp b/src/ReDIVA/x_pv_game.hpp index 6e8f54fc..e6f1e494 100644 --- a/src/ReDIVA/x_pv_game.hpp +++ b/src/ReDIVA/x_pv_game.hpp @@ -391,7 +391,7 @@ struct aet_obj_data_comp { const aet_layout_data* find_layout(const char* name); bool init_comp(uint32_t aet_id, const std::string&& layer_name, - float_t frame, const aet_database* aet_db, const sprite_database* spr_db); + float_t frame, const aet_database* aet_db, const SprDb* spr_db); }; struct aet_obj_data { @@ -409,7 +409,7 @@ struct aet_obj_data { bool check_disp(); const aet_layout_data* find_aet_layout(const char* name, - const aet_database* aet_db, const sprite_database* spr_db); + const aet_database* aet_db, const SprDb* spr_db); uint32_t init(AetArgs& args, const aet_database* aet_db); void reset(); }; @@ -430,7 +430,7 @@ struct x_pv_aet_disp_string { ~x_pv_aet_disp_string(); void ctrl(const char* name, aet_obj_data* aet, - const aet_database* aet_db, const sprite_database* spr_db); + const aet_database* aet_db, const SprDb* spr_db); }; struct x_pv_str_array_pv { @@ -455,7 +455,7 @@ struct x_pv_game_title { int32_t txt_layer_index; aet_database aet_db; - sprite_database spr_db; + SprDb spr_db; x_pv_game_title(); ~x_pv_game_title(); @@ -600,7 +600,7 @@ struct x_pv_game_stage_env { x_pv_game_stage_env_aet aet; aet_database aet_db; - sprite_database spr_db; + SprDb spr_db; x_pv_game_stage_env(); ~x_pv_game_stage_env(); @@ -802,7 +802,7 @@ public: auth_3d_database_file auth_3d_db; std::vector avail_auth_3d_uids; object_database_file obj_db; - sprite_database_file spr_db; + SprDbFile spr_db; stage_database_file stage_data; texture_database tex_db_base; texture_database_file tex_db; @@ -822,7 +822,7 @@ public: std::vector avail_auth_3d_uids; object_database obj_db_base; object_database_file obj_db; - sprite_database_file spr_db; + SprDbFile spr_db; stage_database stage_data_base; stage_database_file stage_data; texture_database tex_db_base; @@ -855,7 +855,7 @@ public: bool farc; aet_database pv_tit_aet_db; - sprite_database pv_tit_spr_db; + SprDb pv_tit_spr_db; AFTData aft; MMPData mmp;