From 769bcaba3908f617daae48c0a9de68452c3de770 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Wed, 31 Jan 2024 14:54:21 +0300 Subject: [PATCH] Changed logic of finding object_info for Glitter files --- src/CRE/Glitter/effect.cpp | 9 -------- src/CRE/Glitter/file_reader.cpp | 2 +- src/CRE/Glitter/glitter.hpp | 2 -- src/KKdLib/database/object.cpp | 37 +++++++++++++++++++++++++++++++++ src/KKdLib/database/object.hpp | 5 +++++ src/ReDIVA/glitter_editor.cpp | 6 ++++-- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/CRE/Glitter/effect.cpp b/src/CRE/Glitter/effect.cpp index cbf60f6d..81b3e3f3 100644 --- a/src/CRE/Glitter/effect.cpp +++ b/src/CRE/Glitter/effect.cpp @@ -6,15 +6,6 @@ #include "glitter.hpp" namespace Glitter { - object_info Effect::ExtAnim::GetObjectInfo(uint64_t hash, object_database* obj_db) { - for (object_set_info& i : obj_db->object_set) { - for (object_info_data& j : i.object) - if (hash == j.name_hash_murmurhash || hash == j.name_hash_fnv1a64m_upper) - return { j.id, i.id }; - } - return object_info(); - } - Effect::Data::Data(GLT) : appear_time(), life_time(), start_time(), ext_anim(), flags(), emission(), seed(), unk() { color = 0xFFFFFFFF; diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 429c8e77..10b1a231 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -1215,7 +1215,7 @@ namespace Glitter { ext_anim->flags = (EffectExtAnimFlag) * (int32_t*)(d + 8); } - ext_anim->object = Effect::ExtAnim::GetObjectInfo(ext_anim->object_hash, obj_db); + ext_anim->object = obj_db->get_object_info_by_fnv1a64m_hash_upper(ext_anim->object_hash); ext_anim->node_index = EFFECT_EXT_ANIM_CHARA_MAX; if (*(char*)(d + 12)) { strncpy_s(ext_anim->mesh_name, 0x80, (char*)(d + 12), 0x80); diff --git a/src/CRE/Glitter/glitter.hpp b/src/CRE/Glitter/glitter.hpp index 913ca988..a724b3fa 100644 --- a/src/CRE/Glitter/glitter.hpp +++ b/src/CRE/Glitter/glitter.hpp @@ -670,8 +670,6 @@ namespace Glitter { EffectExtAnimCharaNode node_index; }; }; - - static object_info GetObjectInfo(uint64_t hash, object_database* obj_db); }; struct ExtAnimX { diff --git a/src/KKdLib/database/object.cpp b/src/KKdLib/database/object.cpp index 6e89ff18..d7e19302 100644 --- a/src/KKdLib/database/object.cpp +++ b/src/KKdLib/database/object.cpp @@ -297,6 +297,10 @@ void object_database::clear() { obj_fnv1a64m_hashes_upper.shrink_to_fit(); obj_murmurhashes.clear(); obj_murmurhashes.shrink_to_fit(); + obj_info_fnv1a64m_hashes.clear(); + obj_info_fnv1a64m_hashes.shrink_to_fit(); + obj_info_fnv1a64m_hashes_upper.clear(); + obj_info_fnv1a64m_hashes_upper.shrink_to_fit(); obj_info_murmurhashes.clear(); obj_info_murmurhashes.shrink_to_fit(); } @@ -308,6 +312,8 @@ void object_database::update() { obj_fnv1a64m_hashes.clear(); obj_fnv1a64m_hashes_upper.clear(); obj_murmurhashes.clear(); + obj_info_fnv1a64m_hashes.clear(); + obj_info_fnv1a64m_hashes_upper.clear(); obj_info_murmurhashes.clear(); obj_set_ids.reserve(object_set.size()); @@ -321,6 +327,8 @@ void object_database::update() { obj_fnv1a64m_hashes.reserve(i.object.size()); obj_fnv1a64m_hashes_upper.reserve(i.object.size()); obj_murmurhashes.reserve(i.object.size()); + obj_info_fnv1a64m_hashes.reserve(i.object.size()); + obj_info_fnv1a64m_hashes_upper.reserve(i.object.size()); obj_info_murmurhashes.reserve(i.object.size()); for (object_info_data& j : i.object) { @@ -328,6 +336,8 @@ void object_database::update() { obj_fnv1a64m_hashes.push_back(j.name_hash_fnv1a64m, &j); obj_fnv1a64m_hashes_upper.push_back(j.name_hash_fnv1a64m_upper, &j); obj_murmurhashes.push_back(j.name_hash_murmurhash, &j); + obj_info_fnv1a64m_hashes.push_back(j.name_hash_fnv1a64m, { j.id, i.id }); + obj_info_fnv1a64m_hashes_upper.push_back(j.name_hash_fnv1a64m_upper, { j.id, i.id }); obj_info_murmurhashes.push_back(j.name_hash_murmurhash, { j.id, i.id }); } } @@ -338,6 +348,8 @@ void object_database::update() { obj_fnv1a64m_hashes.sort_unique(); obj_fnv1a64m_hashes_upper.sort_unique(); obj_murmurhashes.sort_unique(); + obj_info_fnv1a64m_hashes.sort_unique(); + obj_info_fnv1a64m_hashes_upper.sort_unique(); obj_info_murmurhashes.sort_unique(); } @@ -365,6 +377,10 @@ const object_info_data* object_database::get_object_info_data(const char* name) if (!name || !*name) return 0; + size_t name_len = utf8_length(name); + if (!str_utils_compare_length(name, name_len, "NULL", 5)) + return 0; + auto elem = obj_murmurhashes.find(hash_utf8_murmurhash(name)); if (elem != obj_murmurhashes.end()) return elem->second; @@ -439,6 +455,27 @@ object_info object_database::get_object_info(const char* name) const { return object_info(); } +object_info object_database::get_object_info_by_fnv1a64m_hash(uint64_t hash) const { + auto elem = obj_info_fnv1a64m_hashes.find(hash); + if (elem != obj_info_fnv1a64m_hashes.end()) + return elem->second; + return object_info(); +} + +object_info object_database::get_object_info_by_fnv1a64m_hash_upper(uint64_t hash) const { + auto elem = obj_info_fnv1a64m_hashes_upper.find(hash); + if (elem != obj_info_fnv1a64m_hashes_upper.end()) + return elem->second; + return object_info(); +} + +object_info object_database::get_object_info_by_murmurhash(uint32_t hash) const { + auto elem = obj_info_murmurhashes.find(hash); + if (elem != obj_info_murmurhashes.end()) + return elem->second; + return object_info(); +} + const char* object_database::get_object_name(object_info obj_info) const { if (obj_info.is_null()) return 0; diff --git a/src/KKdLib/database/object.hpp b/src/KKdLib/database/object.hpp index 17cde527..64f4c373 100644 --- a/src/KKdLib/database/object.hpp +++ b/src/KKdLib/database/object.hpp @@ -143,6 +143,8 @@ struct object_database { prj::vector_pair obj_fnv1a64m_hashes; prj::vector_pair obj_fnv1a64m_hashes_upper; prj::vector_pair obj_murmurhashes; + prj::vector_pair obj_info_fnv1a64m_hashes; + prj::vector_pair obj_info_fnv1a64m_hashes_upper; prj::vector_pair obj_info_murmurhashes; object_database(); @@ -161,5 +163,8 @@ struct object_database { uint32_t get_object_set_id(const char* name) const; const char* get_object_set_name(uint32_t set_id) const; object_info get_object_info(const char* name) const; + object_info get_object_info_by_fnv1a64m_hash(uint64_t hash) const; + object_info get_object_info_by_fnv1a64m_hash_upper(uint64_t hash) const; + object_info get_object_info_by_murmurhash(uint32_t hash) const; const char* get_object_name(object_info obj_info) const; }; diff --git a/src/ReDIVA/glitter_editor.cpp b/src/ReDIVA/glitter_editor.cpp index 9e679ba4..03c2ce16 100644 --- a/src/ReDIVA/glitter_editor.cpp +++ b/src/ReDIVA/glitter_editor.cpp @@ -3419,8 +3419,10 @@ static void glitter_editor_property_effect(GlitterEditor* glt_edt) { } else { if (glitter_editor_hash_input(glt_edt, "Object Hash", &ext_anim->object_hash)) { - ext_anim->object = Glitter::Effect::ExtAnim::GetObjectInfo(ext_anim->object_hash, - &data_list[glt_edt->load_data_type].data_ft.obj_db); + object_database& obj_db = data_list[glt_edt->load_data_type].data_ft.obj_db; + ext_anim->object = eg->type == Glitter::FT + ? obj_db.get_object_info_by_fnv1a64m_hash_upper(ext_anim->object_hash) + : obj_db.get_object_info_by_murmurhash((uint32_t)ext_anim->object_hash); changed = true; }