Aets. Perf fixes. X PV fixes

This commit is contained in:
korenkonder
2023-03-19 23:27:00 +03:00
parent e14fcd4f36
commit bfec5625ee
45 changed files with 3687 additions and 1641 deletions
+248 -112
View File
@@ -23,15 +23,17 @@ static bool aet_database_file_strings_push_back_check(std::vector<string_hash>&
const aet_db_aet_set aet_db_aet_set_null;
const aet_db_aet aet_db_aet_null;
aet_db_aet_file::aet_db_aet_file() : id(), index() {
aet_db_aet_file::aet_db_aet_file() {
id = -1;
index = -1;
}
aet_db_aet_file::~aet_db_aet_file() {
}
aet_db_aet::aet_db_aet() : id() {
aet_db_aet::aet_db_aet() : load_count() {
id = -1;
name_hash = hash_murmurhash_empty;
}
@@ -39,17 +41,22 @@ aet_db_aet::~aet_db_aet() {
}
aet_db_aet_set_file::aet_db_aet_set_file() : id(), index(), sprite_set_id() {
aet_db_aet_set_file::aet_db_aet_set_file() {
id = -1;
index = -1;
sprite_set_id = -1;
}
aet_db_aet_set_file::~aet_db_aet_set_file() {
}
aet_db_aet_set::aet_db_aet_set() : id(), index(), sprite_set_id() {
aet_db_aet_set::aet_db_aet_set() {
id = -1;
name_hash = hash_murmurhash_empty;
file_name_hash = hash_murmurhash_empty;
index = -1;
sprite_set_id = -1;
}
aet_db_aet_set::~aet_db_aet_set() {
@@ -85,18 +92,18 @@ void aet_database_file::read(const char* path, bool modern) {
free_def(path_bin);
}
else {
char* path_spi = str_utils_add(path, ".aei");
if (path_check_file_exists(path_spi)) {
char* path_aei = str_utils_add(path, ".aei");
if (path_check_file_exists(path_aei)) {
f2_struct st;
st.read(path_spi);
st.read(path_aei);
if (st.header.signature == reverse_endianness_uint32_t('AEDB')) {
memory_stream s_spdb;
s_spdb.open(st.data);
s_spdb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_spdb, st.header.length);
memory_stream s_aedb;
s_aedb.open(st.data);
s_aedb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_aedb, st.header.length);
}
}
free_def(path_spi);
free_def(path_aei);
}
}
@@ -121,18 +128,18 @@ void aet_database_file::read(const wchar_t* path, bool modern) {
free_def(path_bin);
}
else {
wchar_t* path_spi = str_utils_add(path, L".aei");
if (path_check_file_exists(path_spi)) {
wchar_t* path_aei = str_utils_add(path, L".aei");
if (path_check_file_exists(path_aei)) {
f2_struct st;
st.read(path_spi);
st.read(path_aei);
if (st.header.signature == reverse_endianness_uint32_t('AEDB')) {
memory_stream s_spdb;
s_spdb.open(st.data);
s_spdb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_spdb, st.header.length);
memory_stream s_aedb;
s_aedb.open(st.data);
s_aedb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_aedb, st.header.length);
}
}
free_def(path_spi);
free_def(path_aei);
}
}
@@ -148,11 +155,11 @@ void aet_database_file::read(const void* data, size_t size, bool modern) {
else {
f2_struct st;
st.read(data, size);
if (st.header.signature == reverse_endianness_uint32_t('SPDB')) {
memory_stream s_spdb;
s_spdb.open(st.data);
s_spdb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_spdb, st.header.length);
if (st.header.signature == reverse_endianness_uint32_t('AEDB')) {
memory_stream s_aedb;
s_aedb.open(st.data);
s_aedb.big_endian = st.header.use_big_endian;
aet_database_file_modern_read_inner(this, s_aedb, st.header.length);
}
}
}
@@ -170,12 +177,12 @@ void aet_database_file::write(const char* path) {
free_def(path_bin);
}
else {
char* path_spi = str_utils_add(path, ".spi");
char* path_aei = str_utils_add(path, ".aei");
file_stream s;
s.open(path_spi, "wb");
s.open(path_aei, "wb");
if (s.check_not_null())
aet_database_file_modern_write_inner(this, s);
free_def(path_spi);
free_def(path_aei);
}
}
@@ -192,12 +199,12 @@ void aet_database_file::write(const wchar_t* path) {
free_def(path_bin);
}
else {
wchar_t* path_spi = str_utils_add(path, L".spi");
wchar_t* path_aei = str_utils_add(path, L".aei");
file_stream s;
s.open(path_spi, L"wb");
s.open(path_aei, L"wb");
if (s.check_not_null())
aet_database_file_modern_write_inner(this, s);
free_def(path_spi);
free_def(path_aei);
}
}
@@ -251,33 +258,36 @@ void aet_database::add(aet_database_file* aet_db_file) {
aet_set_names.reserve(aet_db_file->aet_set.size());
for (aet_db_aet_set_file& i : aet_db_file->aet_set) {
aet_db_aet_set aet_set;
aet_sets.push_back({});
aet_db_aet_set& aet_set = aet_sets.back();
aet_set.id = i.id;
aet_set.name.assign(i.name);
aet_set.name_hash = hash_string_murmurhash(aet_set.name);
aet_set.file_name.assign(i.file_name);
aet_set.file_name_hash = hash_string_murmurhash(aet_set.file_name);
aet_set.index = (uint16_t)(aet_sets_count + i.index);
aet_set.index = (uint32_t)(aet_sets_count + i.index);
aet_set.sprite_set_id = i.sprite_set_id;
aet_set_ids.push_back({ aet_set.id, aet_set });
aet_set_indices.push_back({ aet_set.index, aet_set });
aet_set_names.push_back({ aet_set.name, aet_set });
aet_set_ids.push_back({ aet_set.id, &aet_set });
aet_set_indices.push_back({ aet_set.index, &aet_set });
aet_set_names.push_back({ aet_set.name, &aet_set });
aet_ids.reserve(i.aet.size());
aet_names.reserve(i.aet.size());
aet_indices.reserve(i.aet.size());
for (aet_db_aet_file& j : i.aet) {
aet_db_aet aet;
aets.push_back({});
aet_db_aet& aet = aets.back();
aet.id = j.id;
aet.name.assign(j.name);
aet.name_hash = hash_string_murmurhash(aet.name);
aet.info = { j.index, aet_set.index };
aet.info = { j.index, (uint16_t)aet_set.index };
aet.load_count = 1;
aet_ids.push_back({ aet.id, aet });
aet_names.push_back({ aet.name, aet });
aet_indices.push_back({ aet.info, aet });
aet_ids.push_back({ aet.id, &aet });
aet_names.push_back({ aet.name, &aet });
aet_indices.push_back({ aet.info, &aet });
}
}
@@ -289,52 +299,178 @@ void aet_database::add(aet_database_file* aet_db_file) {
aet_indices.combine();
}
void aet_database::clear() {
aet_sets.clear();
aet_set_ids.clear();
aet_set_indices.clear();
aet_set_names.clear();
aets.clear();
aet_ids.clear();
aet_names.clear();
aet_indices.clear();
}
void aet_database::add_aet_set(uint32_t set_id, uint32_t index) {
if (set_id == -1 || set_id == hash_murmurhash_empty)
return;
aet_sets.push_back({});
aet_db_aet_set& set = aet_sets.back();
set.id = set_id;
set.index = index;
aet_set_indices.push_back({ set.index, &set });
aet_set_ids.push_back({ set.id, &set });
aet_set_indices.combine();
aet_set_ids.combine();
}
void aet_database::parse(const aet_db_aet_set_file* set_file,
std::string& set_name, std::vector<uint32_t>& aet_ids) {
if (!set_file)
return;
auto elem = aet_set_ids.find(set_file->id);
if (elem == aet_set_ids.end())
return;
uint16_t set_index = (uint16_t)elem->second->index;
aet_set_names.push_back({ set_file->name, elem->second });
aet_ids.reserve(set_file->aet.size());
for (const aet_db_aet_file& i : set_file->aet) {
uint32_t id = i.id;
aet_ids.push_back(id);
auto j_begin = aets.begin();
auto j_end = aets.end();
auto j = j_begin;
while (j != j_end)
if (j->id == id)
break;
aet_db_aet* aet;
if (j == j_end) {
aets.push_back({});
aet = &aets.back();
}
else
aet = &*j;
aet->id = id;
aet->name.assign(i.name);
aet->name_hash = hash_string_murmurhash(aet->name);
aet->info = { i.index, set_index };
aet->load_count++;
this->aet_ids.push_back({ aet->id, aet });
aet_names.push_back({ aet->name, aet });
aet_indices.push_back({ aet->info, aet });
}
aet_set_names.combine();
this->aet_ids.combine();
aet_names.combine();
aet_indices.combine();
}
void aet_database::remove_aet_set(uint32_t set_id, uint32_t index,
const char* set_name, std::vector<uint32_t>& aet_ids) {
if (set_name && *set_name) {
auto elem = aet_set_names.find(set_name);
if (elem != aet_set_names.end())
aet_set_names.erase(elem);
}
if (index != -1) {
auto elem = aet_set_indices.find(index);
if (elem != aet_set_indices.end())
aet_set_indices.erase(elem);
}
if (set_id != -1 && set_id != hash_murmurhash_empty) {
auto elem = aet_set_ids.find(set_id);
if (elem != aet_set_ids.end())
aet_set_ids.erase(elem);
auto i_begin = aet_sets.begin();
auto i_end = aet_sets.end();
auto i = i_begin;
while (i != i_end)
if (i->id == set_id)
i = aet_sets.erase(i);
else
i++;
}
for (auto& i : aet_ids) {
auto j_begin = aets.begin();
auto j_end = aets.end();
auto j = j_begin;
while (j != j_end) {
if (j->id != i || --j->load_count > 0) {
j++;
continue;
}
auto elem_id = this->aet_ids.find(j->id);
if (elem_id != this->aet_ids.end())
this->aet_ids.erase(elem_id);
auto elem_index = aet_indices.find(j->info);
if (elem_index != aet_indices.end())
aet_indices.erase(elem_index);
auto elem_name = aet_names.find(j->name);
if (elem_name != aet_names.end())
aet_names.erase(elem_name);
j = aets.erase(j);
}
}
}
const aet_db_aet_set* aet_database::get_aet_set_by_name(const char* name) const {
auto elem = aet_set_names.find(std::string(name));
if (elem != aet_set_names.end())
return &elem->second;
return elem->second;
return &aet_db_aet_set_null;
}
const aet_db_aet_set* aet_database::get_aet_set_by_id(uint32_t set_id) const {
auto elem = aet_set_ids.find(set_id);
if (elem != aet_set_ids.end())
return &elem->second;
return elem->second;
return &aet_db_aet_set_null;
}
const aet_db_aet_set* aet_database::get_aet_set_by_index(uint32_t index) const {
auto elem = aet_set_indices.find(index);
if (elem != aet_set_indices.end())
return &elem->second;
return elem->second;
return &aet_db_aet_set_null;
}
const aet_db_aet* aet_database::get_aet_by_name(const char* name) const {
auto elem = aet_names.find(std::string(name));
if (elem != aet_names.end())
return &elem->second;
return elem->second;
return &aet_db_aet_null;
}
const aet_db_aet* aet_database::get_aet_by_id(uint32_t id) const {
auto elem = aet_ids.find(id);
if (elem != aet_ids.end())
return &elem->second;
return elem->second;
return &aet_db_aet_null;
}
const aet_db_aet* aet_database::get_aet_by_set_id_index(uint32_t set_id, uint32_t index) const {
auto elem = aet_indices.find({ (uint16_t)index, get_aet_set_by_id(set_id)->index });
auto elem = aet_indices.find({ (uint16_t)index, (uint16_t)get_aet_set_by_id(set_id)->index });
if (elem != aet_indices.end())
return &elem->second;
return &aet_db_aet_null;
}
const aet_db_aet* aet_database::get_tex_by_set_id_index(uint32_t set_id, uint32_t index) const {
auto elem = aet_indices.find({ (uint16_t)index, (uint16_t)(0x1000 | get_aet_set_by_id(set_id)->index) });
if (elem != aet_indices.end())
return &elem->second;
return elem->second;
return &aet_db_aet_null;
}
@@ -347,7 +483,7 @@ uint32_t aet_database::get_aet_set_id_by_name(const char* name) const {
}
uint32_t aet_database::get_aet_set_id_by_name_index(uint32_t index) const {
return aet_set_names[index].second.id;
return aet_set_names[index].second->id;
}
const char* aet_database::get_aet_set_name(uint32_t set_id) const {
@@ -370,7 +506,7 @@ static void aet_database_file_classic_read_inner(aet_database_file* aet_db, stre
aet_set.id = s.read_uint32_t();
aet_set.name = s.read_string_null_terminated_offset(s.read_uint32_t());
aet_set.file_name = s.read_string_null_terminated_offset(s.read_uint32_t());
aet_set.index = (uint16_t)s.read_uint32_t();
aet_set.index = s.read_uint32_t();
aet_set.sprite_set_id = s.read_uint32_t();
}
s.position_pop();
@@ -453,7 +589,7 @@ static void aet_database_file_classic_write_inner(aet_database_file* aet_db, str
s.position_push(aets_offset, SEEK_SET);
for (aet_db_aet_set_file& i : aet_db->aet_set) {
uint16_t aet_set_index = i.index;
uint16_t aet_set_index = (uint16_t)i.index;
for (aet_db_aet_file& j : i.aet) {
s.write_uint32_t(j.id);
@@ -509,7 +645,7 @@ static void aet_database_file_modern_read_inner(aet_database_file* aet_db, strea
aet_set.id = s.read_uint32_t_reverse_endianness();
aet_set.name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
aet_set.file_name = s.read_string_null_terminated_offset(s.read_offset_f2(header_length));
aet_set.index = (uint16_t)s.read_uint32_t_reverse_endianness();
aet_set.index = s.read_uint32_t_reverse_endianness();
aet_set.sprite_set_id = s.read_uint32_t_reverse_endianness();
}
else
@@ -518,7 +654,7 @@ static void aet_database_file_modern_read_inner(aet_database_file* aet_db, strea
aet_set.id = s.read_uint32_t_reverse_endianness();
aet_set.name = s.read_string_null_terminated_offset(s.read_offset_x());
aet_set.file_name = s.read_string_null_terminated_offset(s.read_offset_x());
aet_set.index = (uint16_t)s.read_uint32_t_reverse_endianness();
aet_set.index = s.read_uint32_t_reverse_endianness();
aet_set.sprite_set_id = s.read_uint32_t_reverse_endianness();
s.align_read(0x08);
}
@@ -572,9 +708,9 @@ static void aet_database_file_modern_write_inner(aet_database_file* aet_db, stre
bool big_endian = aet_db->big_endian;
bool is_x = aet_db->is_x;
memory_stream s_spdb;
s_spdb.open();
s_spdb.big_endian = big_endian;
memory_stream s_aedb;
s_aedb.open();
s_aedb.big_endian = big_endian;
uint32_t off;
enrs e;
@@ -633,16 +769,16 @@ static void aet_database_file_modern_write_inner(aet_database_file* aet_db, stre
off = align_val(off, 0x10);
}
s_spdb.write(is_x ? 0x20 : 0x10);
s_spdb.align_write(0x10);
s_aedb.write(is_x ? 0x20 : 0x10);
s_aedb.align_write(0x10);
int64_t aet_sets_offset = s_spdb.get_position();
s_spdb.write(aet_sets_count * (is_x ? 0x20ULL : 0x10ULL));
s_spdb.align_write(0x10);
int64_t aet_sets_offset = s_aedb.get_position();
s_aedb.write(aet_sets_count * (is_x ? 0x20ULL : 0x10ULL));
s_aedb.align_write(0x10);
int64_t aets_offset = s_spdb.get_position();
s_spdb.write(aets_count * (is_x ? 0x18ULL : 0x0CULL));
s_spdb.align_write(0x10);
int64_t aets_offset = s_aedb.get_position();
s_aedb.write(aets_count * (is_x ? 0x18ULL : 0x0CULL));
s_aedb.align_write(0x10);
std::vector<string_hash> strings;
std::vector<int64_t> string_offsets;
@@ -651,85 +787,85 @@ static void aet_database_file_modern_write_inner(aet_database_file* aet_db, stre
for (aet_db_aet_set_file& i : aet_db->aet_set) {
if (aet_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);
string_offsets.push_back(s_aedb.get_position());
s_aedb.write_string_null_terminated(i.name);
}
if (aet_database_file_strings_push_back_check(strings, i.file_name)) {
string_offsets.push_back(s_spdb.get_position());
s_spdb.write_string_null_terminated(i.file_name);
string_offsets.push_back(s_aedb.get_position());
s_aedb.write_string_null_terminated(i.file_name);
}
}
for (aet_db_aet_set_file& i : aet_db->aet_set)
for (aet_db_aet_file& j : i.aet)
if (aet_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);
string_offsets.push_back(s_aedb.get_position());
s_aedb.write_string_null_terminated(j.name);
}
s_spdb.align_write(0x10);
s_aedb.align_write(0x10);
s_spdb.position_push(0x00, SEEK_SET);
s_spdb.write_uint32_t_reverse_endianness((uint32_t)aet_sets_count);
io_write_offset_pof_add(s_spdb, aet_sets_offset, 0x20, is_x, &pof);
s_spdb.write_uint32_t_reverse_endianness((uint32_t)aets_count);
io_write_offset_pof_add(s_spdb, aets_offset, 0x20, is_x, &pof);
s_spdb.position_pop();
s_aedb.position_push(0x00, SEEK_SET);
s_aedb.write_uint32_t_reverse_endianness((uint32_t)aet_sets_count);
io_write_offset_pof_add(s_aedb, aet_sets_offset, 0x20, is_x, &pof);
s_aedb.write_uint32_t_reverse_endianness((uint32_t)aets_count);
io_write_offset_pof_add(s_aedb, aets_offset, 0x20, is_x, &pof);
s_aedb.position_pop();
s_spdb.position_push(aet_sets_offset, SEEK_SET);
s_aedb.position_push(aet_sets_offset, SEEK_SET);
if (!is_x)
for (aet_db_aet_set_file& i : aet_db->aet_set) {
s_spdb.write_uint32_t_reverse_endianness(i.id);
io_write_offset_f2_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
s_aedb.write_uint32_t_reverse_endianness(i.id);
io_write_offset_f2_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, i.name), 0x20, &pof);
io_write_offset_f2_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
io_write_offset_f2_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, i.file_name), 0x20, &pof);
s_spdb.write_uint32_t_reverse_endianness(i.index);
s_spdb.write_uint32_t_reverse_endianness(i.sprite_set_id);
s_aedb.write_uint32_t_reverse_endianness(i.index);
s_aedb.write_uint32_t_reverse_endianness(i.sprite_set_id);
}
else
for (aet_db_aet_set_file& i : aet_db->aet_set) {
s_spdb.write_uint32_t_reverse_endianness(i.id);
io_write_offset_x_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
s_aedb.write_uint32_t_reverse_endianness(i.id);
io_write_offset_x_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, i.name), &pof);
io_write_offset_x_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
io_write_offset_x_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, i.file_name), &pof);
s_spdb.write_uint32_t_reverse_endianness(i.index);
s_spdb.write_uint32_t_reverse_endianness(i.sprite_set_id);
s_aedb.write_uint32_t_reverse_endianness(i.index);
s_aedb.write_uint32_t_reverse_endianness(i.sprite_set_id);
}
s_spdb.position_pop();
s_aedb.position_pop();
s_spdb.position_push(aets_offset, SEEK_SET);
s_aedb.position_push(aets_offset, SEEK_SET);
for (aet_db_aet_set_file& i : aet_db->aet_set) {
uint16_t aet_set_index = i.index;
uint16_t aet_set_index = (uint16_t)i.index;
if (!is_x)
for (aet_db_aet_file& j : i.aet) {
s_spdb.write_uint32_t_reverse_endianness(j.id);
io_write_offset_f2_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
s_aedb.write_uint32_t_reverse_endianness(j.id);
io_write_offset_f2_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, j.name), 0x20, &pof);
s_spdb.write_uint32_t_reverse_endianness((aet_set_index << 16) | j.index);
s_aedb.write_uint32_t_reverse_endianness((aet_set_index << 16) | j.index);
}
else
for (aet_db_aet_file& j : i.aet) {
s_spdb.write_uint32_t_reverse_endianness(j.id);
io_write_offset_x_pof_add(s_spdb, aet_database_file_strings_get_string_offset(strings,
s_aedb.write_uint32_t_reverse_endianness(j.id);
io_write_offset_x_pof_add(s_aedb, aet_database_file_strings_get_string_offset(strings,
string_offsets, j.name), &pof);
s_spdb.write_uint32_t_reverse_endianness((aet_set_index << 16) | j.index);
s_spdb.align_write(0x08);
s_aedb.write_uint32_t_reverse_endianness((aet_set_index << 16) | j.index);
s_aedb.align_write(0x08);
}
}
s_spdb.position_pop();
s_aedb.position_pop();
f2_struct st;
s_spdb.align_write(0x10);
s_spdb.copy(st.data);
s_spdb.close();
s_aedb.align_write(0x10);
s_aedb.copy(st.data);
s_aedb.close();
st.enrs = e;
st.pof = pof;
st.header.signature = reverse_endianness_uint32_t('SPDB');
st.header.signature = reverse_endianness_uint32_t('AEDB');
st.header.length = 0x20;
st.header.use_big_endian = big_endian;
st.header.use_section_size = true;