Changed logic of finding object_info for Glitter files

This commit is contained in:
korenkonder
2024-01-31 14:54:21 +03:00
parent 61873568f9
commit 769bcaba39
6 changed files with 47 additions and 14 deletions
-9
View File
@@ -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;
+1 -1
View File
@@ -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);
-2
View File
@@ -670,8 +670,6 @@ namespace Glitter {
EffectExtAnimCharaNode node_index;
};
};
static object_info GetObjectInfo(uint64_t hash, object_database* obj_db);
};
struct ExtAnimX {
+37
View File
@@ -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;
+5
View File
@@ -143,6 +143,8 @@ struct object_database {
prj::vector_pair<uint64_t, object_info_data*> obj_fnv1a64m_hashes;
prj::vector_pair<uint64_t, object_info_data*> obj_fnv1a64m_hashes_upper;
prj::vector_pair<uint32_t, object_info_data*> obj_murmurhashes;
prj::vector_pair<uint64_t, object_info> obj_info_fnv1a64m_hashes;
prj::vector_pair<uint64_t, object_info> obj_info_fnv1a64m_hashes_upper;
prj::vector_pair<uint32_t, object_info> 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;
};
+4 -2
View File
@@ -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;
}