forked from Green-Sky/tomato
fix accel structure being wrong and mark empty frags and dont count them
This commit is contained in:
parent
7879a0927b
commit
77a0ae6acd
@ -71,7 +71,13 @@ namespace Message::Components {
|
||||
namespace Fragment::Components {
|
||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(MessagesTSRange, begin, end)
|
||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(MessagesContact, id)
|
||||
} // Fragment::Components
|
||||
|
||||
namespace Ephemeral {
|
||||
// does not contain any messges
|
||||
// (recheck on frag update)
|
||||
struct MessagesEmptyTag {};
|
||||
}
|
||||
} // Fragment::Component
|
||||
|
||||
void MessageFragmentStore::handleMessage(const Message3Handle& m) {
|
||||
if (_fs_ignore_event) {
|
||||
@ -95,6 +101,12 @@ void MessageFragmentStore::handleMessage(const Message3Handle& m) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: this is bad, we need a non persistence tag instead
|
||||
if (!m.any_of<Message::Components::MessageText>()) {
|
||||
// skip everything else for now
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: use fid, seving full fuid for every message consumes alot of memory (and heap frag)
|
||||
if (!m.all_of<Message::Components::FID>()) {
|
||||
std::cout << "MFS: new msg missing FID\n";
|
||||
@ -273,6 +285,13 @@ void MessageFragmentStore::loadFragment(Message3Registry& reg, FragmentHandle fh
|
||||
|
||||
if (!j.is_array()) {
|
||||
// wrong data
|
||||
fh.emplace_or_replace<FragComp::Ephemeral::MessagesEmptyTag>();
|
||||
return;
|
||||
}
|
||||
|
||||
if (j.size() == 0) {
|
||||
// empty array
|
||||
fh.emplace_or_replace<FragComp::Ephemeral::MessagesEmptyTag>();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -288,6 +307,7 @@ void MessageFragmentStore::loadFragment(Message3Registry& reg, FragmentHandle fh
|
||||
}
|
||||
reg.ctx().get<Message::Components::LoadedContactFragments>().frags.emplace(fh);
|
||||
|
||||
size_t messages_new_or_updated {0};
|
||||
for (const auto& j_entry : j) {
|
||||
auto new_real_msg = Message3Handle{reg, reg.create()};
|
||||
// load into staging reg
|
||||
@ -339,6 +359,7 @@ void MessageFragmentStore::loadFragment(Message3Registry& reg, FragmentHandle fh
|
||||
// -> merge with preexisting (needs to be order independent)
|
||||
// -> throw update
|
||||
reg.destroy(new_real_msg);
|
||||
//messages_new_or_updated++; // TODO: how do i know on merging, if data was useful
|
||||
//_rmm.throwEventUpdate(reg, new_real_msg);
|
||||
} else {
|
||||
if (!new_real_msg.all_of<Message::Components::Timestamp, Message::Components::ContactFrom, Message::Components::ContactTo>()) {
|
||||
@ -348,10 +369,17 @@ void MessageFragmentStore::loadFragment(Message3Registry& reg, FragmentHandle fh
|
||||
continue;
|
||||
}
|
||||
|
||||
messages_new_or_updated++;
|
||||
// -> throw create
|
||||
_rmm.throwEventConstruct(reg, new_real_msg);
|
||||
}
|
||||
}
|
||||
|
||||
if (messages_new_or_updated == 0) {
|
||||
// useless frag
|
||||
// TODO: unload?
|
||||
fh.emplace_or_replace<FragComp::Ephemeral::MessagesEmptyTag>();
|
||||
}
|
||||
}
|
||||
|
||||
bool MessageFragmentStore::syncFragToStorage(FragmentHandle fh, Message3Registry& reg) {
|
||||
@ -604,6 +632,10 @@ float MessageFragmentStore::tick(float time_delta) {
|
||||
return 0.05f;
|
||||
}
|
||||
|
||||
if (fh.all_of<FragComp::Ephemeral::MessagesEmptyTag>()) {
|
||||
continue; // skip known empty
|
||||
}
|
||||
|
||||
// get ts range of frag and collide with all curser(s/ranges)
|
||||
const auto& [range_begin, range_end] = fh.get<FragComp::MessagesTSRange>();
|
||||
|
||||
@ -654,14 +686,19 @@ float MessageFragmentStore::tick(float time_delta) {
|
||||
|
||||
// a single adjacent frag is often not enough
|
||||
// only ok bc next is cheap
|
||||
for (size_t i = 0; i < 5 && _fs._reg.valid(next_frag); i++) {
|
||||
for (size_t i = 0; i < 5 && _fs._reg.valid(next_frag); next_frag = cf.next(next_frag)) {
|
||||
auto fh = _fs.fragmentHandle(next_frag);
|
||||
if (fh.any_of<FragComp::Ephemeral::MessagesEmptyTag>()) {
|
||||
continue; // skip known empty
|
||||
}
|
||||
|
||||
if (!loaded_frags.contains(next_frag)) {
|
||||
std::cout << "MFS: next frag of range\n";
|
||||
loadFragment(*msg_reg, {_fs._reg, next_frag});
|
||||
loadFragment(*msg_reg, fh);
|
||||
return 0.05f;
|
||||
}
|
||||
|
||||
next_frag = cf.next(next_frag);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -697,14 +734,19 @@ float MessageFragmentStore::tick(float time_delta) {
|
||||
|
||||
// a single adjacent frag is often not enough
|
||||
// only ok bc next is cheap
|
||||
for (size_t i = 0; i < 5 && _fs._reg.valid(prev_frag); i++) {
|
||||
for (size_t i = 0; i < 5 && _fs._reg.valid(prev_frag); prev_frag = cf.prev(prev_frag)) {
|
||||
auto fh = _fs.fragmentHandle(prev_frag);
|
||||
if (fh.any_of<FragComp::Ephemeral::MessagesEmptyTag>()) {
|
||||
continue; // skip known empty
|
||||
}
|
||||
|
||||
if (!loaded_frags.contains(prev_frag)) {
|
||||
std::cout << "MFS: prev frag of range\n";
|
||||
loadFragment(*msg_reg, {_fs._reg, prev_frag});
|
||||
loadFragment(*msg_reg, fh);
|
||||
return 0.05f;
|
||||
}
|
||||
|
||||
prev_frag = cf.prev(prev_frag);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -846,6 +888,14 @@ bool Message::Components::ContactFragments::insert(FragmentHandle frag) {
|
||||
|
||||
frags.emplace(frag, InternalEntry{begin_index, end_index});
|
||||
|
||||
// now adjust all indicies of fragments coming after the insert position
|
||||
for (size_t i = begin_index + 1; i < sorted_begin.size(); i++) {
|
||||
frags.at(sorted_begin[i]).i_b = i;
|
||||
}
|
||||
for (size_t i = end_index + 1; i < sorted_end.size(); i++) {
|
||||
frags.at(sorted_end[i]).i_e = i;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user