mirror of
https://github.com/korenkonder/ReDIVA.git
synced 2026-10-11 00:28:21 +03:00
Changed logic of finding object_info for Glitter files
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -670,8 +670,6 @@ namespace Glitter {
|
||||
EffectExtAnimCharaNode node_index;
|
||||
};
|
||||
};
|
||||
|
||||
static object_info GetObjectInfo(uint64_t hash, object_database* obj_db);
|
||||
};
|
||||
|
||||
struct ExtAnimX {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user