Removed temporary update commits

This commit is contained in:
Yousef Khadadeh 2025-07-31 09:34:17 +03:00
parent d19b5c4cb0
commit ed3d5f6d51
25 changed files with 125 additions and 163 deletions

View file

@ -107,7 +107,7 @@ void BrushTool::tool_update() {
controls.intermediateItem->lastUpdateTime = std::chrono::steady_clock::now();
uint64_t placement = drawP.components.client_list().size();
auto objAdd = drawP.components.client_insert(placement, controls.intermediateItem);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->commit_update(drawP);
controls.intermediateItem->client_send_place(drawP);
// NOTE: The data isnt finallized at this point, so a BVH isn't generated for an object that you undo while youre drawing (this isnt just for brush strokes)
// The fix for now is to generate a BVH for an object when you redo it
@ -141,7 +141,7 @@ void BrushTool::tool_update() {
if((!controls.drawingMinimumRelativeToSize && distToPrev >= 10.0) || (controls.drawingMinimumRelativeToSize && distToPrev >= drawP.controls.relativeWidth * DRAW_MINIMUM_LIMIT)) {
controls.intermediateItem->d->points.back() = p;
controls.addedTemporaryPoint = false;
controls.intermediateItem->client_send_update_temp(drawP);
controls.intermediateItem->client_send_update(drawP);
if(controls.midwayInterpolation) {
if(controls.intermediateItem->d->points.size() != 2) // Don't interpolate the first point
@ -149,7 +149,7 @@ void BrushTool::tool_update() {
controls.prevPointUnaltered = p.pos;
}
}
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
}
}
@ -175,8 +175,8 @@ bool BrushTool::prevent_undo_or_redo() {
void BrushTool::commit_stroke() {
if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) {
if(!controls.intermediateItem->d->points.empty()) {
controls.intermediateItem->client_send_update_final(drawP);
controls.intermediateItem->final_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
}
controls.intermediateItem = nullptr;

View file

@ -69,25 +69,21 @@ DrawingProgram::DrawingProgram(World& initWorld):
void DrawingProgram::init_client_callbacks() {
world.con.client_add_recv_callback(CLIENT_UPDATE_COMPONENT, [&](cereal::PortableBinaryInputArchive& message) {
bool isTemp;
ServerClientID id;
message(isTemp, id);
message(id);
auto objPtr = components.get_item_by_id(id);
if(!objPtr)
return;
std::shared_ptr<DrawComponent>& comp = objPtr->obj;
if((std::chrono::steady_clock::now() - comp->lastUpdateTime) > CLIENT_DRAWCOMP_DELAY_TIMER_DURATION){
comp->delayedUpdatePtr = nullptr;
if((std::chrono::steady_clock::now() - comp->lastUpdateTime) > CLIENT_DRAWCOMP_DELAY_TIMER_DURATION) {
delayedUpdateComponents.erase(comp);
message(*comp);
if(isTemp)
comp->temp_update(*this);
else
comp->final_update(*this);
comp->commit_update(*this);
}
else {
comp->delayedUpdatePtr = DrawComponent::allocate_comp_type(comp->get_type());
message(*comp->delayedUpdatePtr);
delayedUpdateComponents.emplace(comp);
auto delayedUpdatePtr = DrawComponent::allocate_comp_type(comp->get_type());
message(*delayedUpdatePtr);
delayedUpdateComponents[comp] = delayedUpdatePtr;
}
});
world.con.client_add_recv_callback(CLIENT_TRANSFORM_MANY_COMPONENTS, [&](cereal::PortableBinaryInputArchive& message) {
@ -105,7 +101,7 @@ void DrawingProgram::init_client_callbacks() {
return;
comp->coords = coords;
objsActuallyTransformed++;
comp->transform_update(*this, false);
comp->commit_transform(*this, false);
});
if(objsActuallyTransformed != 0)
force_rebuild_cache();
@ -119,7 +115,7 @@ void DrawingProgram::init_client_callbacks() {
if(comp->coords == coords)
return;
comp->coords = coords;
comp->transform_update(*this);
comp->commit_transform(*this);
}
}
});
@ -132,7 +128,7 @@ void DrawingProgram::init_client_callbacks() {
message(newObjectID, newObj->coords, *newObj);
bool didntExistPreviously = components.server_insert(insertPosition, newObjectID, newObj);
if(didntExistPreviously)
newObj->final_update(*this);
newObj->commit_update(*this);
});
world.con.client_add_recv_callback(CLIENT_PLACE_MANY_COMPONENTS, [&](cereal::PortableBinaryInputArchive& message) {
std::vector<CollabListType::ObjectInfoPtr> sortedPlacedComponents;
@ -143,7 +139,7 @@ void DrawingProgram::init_client_callbacks() {
std::vector<bool> didntExistPreviously = components.server_insert_ordered_vector(sortedPlacedComponents);
bool isSingleThread = sortedPlacedComponents.size() < DrawingProgramCache::MINIMUM_COMPONENTS_TO_START_REBUILD;
parallel_loop_container(sortedPlacedComponents, [&](const auto& c){
c->obj->final_update(*this, isSingleThread);
c->obj->commit_update(*this, isSingleThread);
}, isSingleThread);
if(!isSingleThread)
force_rebuild_cache();
@ -161,9 +157,9 @@ void DrawingProgram::init_client_callbacks() {
}
void DrawingProgram::check_delayed_update_timers() {
std::erase_if(delayedUpdateComponents, [&](auto& comp) {
comp->check_timers(*this);
return !comp->delayedUpdatePtr;
std::erase_if(delayedUpdateComponents, [&](auto& p) {
auto& [comp, delayedUpdatePtr] = p;
return comp->check_timers(*this, delayedUpdatePtr);
});
}
@ -450,7 +446,7 @@ void DrawingProgram::add_file_to_canvas_by_path_execute(const std::string& fileP
img->d.p1 = dropPos - imDim;
img->d.p2 = dropPos + imDim;
img->d.imageID = imageID;
img->final_update(*this);
img->commit_update(*this);
uint64_t placement = components.client_list().size();
auto objAdd = components.client_insert(placement, img);
img->client_send_place(*this);
@ -473,7 +469,7 @@ void DrawingProgram::add_file_to_canvas_by_data(const std::string& fileName, std
img->d.p1 = dropPos - imDim;
img->d.p2 = dropPos + imDim;
img->d.imageID = imageID;
img->final_update(*this);
img->commit_update(*this);
uint64_t placement = components.client_list().size();
auto objAdd = components.client_insert(placement, img);
img->client_send_place(*this);
@ -502,7 +498,7 @@ void DrawingProgram::initialize_draw_data(cereal::PortableBinaryInputArchive& a)
components.init_emplace_back(id, newComp);
}
parallel_loop_all_components([&](const auto& c){
c->obj->final_update(*this, false);
c->obj->commit_update(*this, false);
});
compCache.test_rebuild(components.client_list(), true);
}

View file

@ -52,7 +52,7 @@ class DrawingProgram {
CollabListType components;
std::unordered_set<std::shared_ptr<DrawComponent>> updateableComponents;
std::unordered_set<std::shared_ptr<DrawComponent>> delayedUpdateComponents;
std::unordered_map<std::shared_ptr<DrawComponent>, std::shared_ptr<DrawComponent>> delayedUpdateComponents;
Vector4f* get_foreground_color_ptr();
private:

View file

@ -165,14 +165,14 @@ void DrawingProgramCache::traverse_bvh_run_function_recursive(const std::shared_
}
}
void DrawingProgramCache::preupdate_component(const CollabListType::ObjectInfoPtr& c) {
void DrawingProgramCache::preupdate_component(const CollabListType::ObjectInfoPtr& c, const std::optional<SCollision::AABB<WorldScalar>>& aabb) {
auto parentBvhNode = c->obj->parentBvhNode.lock();
if(parentBvhNode) {
unsortedComponents.emplace_back(c);
std::erase(parentBvhNode->components, c);
c->obj->parentBvhNode.reset();
}
invalidate_cache_before_pos(c->pos);
invalidate_cache_at_optional_aabb_before_pos(aabb, c->pos);
}
void DrawingProgramCache::build_bvh_node(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const std::vector<CollabListType::ObjectInfoPtr>& components) {

View file

@ -52,7 +52,7 @@ class DrawingProgramCache {
void traverse_bvh_run_function(const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, const std::vector<CollabListType::ObjectInfoPtr>& components)> f);
void traverse_bvh_erase_function(const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, std::vector<CollabListType::ObjectInfoPtr>& components)> f);
// Run before actually updating the component
void preupdate_component(const CollabListType::ObjectInfoPtr& c);
void preupdate_component(const CollabListType::ObjectInfoPtr& c, const std::optional<SCollision::AABB<WorldScalar>>& aabb);
void invalidate_cache_before_pos(uint64_t placementToInvalidateAt);
void invalidate_cache_at_aabb_before_pos(const SCollision::AABB<WorldScalar>& aabb, uint64_t placementToInvalidateAt);
void invalidate_cache_at_optional_aabb_before_pos(const std::optional<SCollision::AABB<WorldScalar>>& aabb, uint64_t placementToInvalidateAt);

View file

@ -94,7 +94,7 @@ void DrawingProgramSelection::deselect_all() {
bool isSingleThread = a.size() < DrawingProgramCache::MINIMUM_COMPONENTS_TO_START_REBUILD;
parallel_loop_container(a, [&](auto& obj) {
obj->obj->coords = selectionTransformCoords.other_coord_space_from_this_space(obj->obj->coords);
obj->obj->transform_update(drawP, false);
obj->obj->commit_transform(drawP, false);
}, isSingleThread);
if(!isSingleThread)
drawP.force_rebuild_cache();
@ -128,7 +128,7 @@ void DrawingProgramSelection::deselect_all() {
parallel_loop_container(transformsFrom, [&](auto& p) {
auto& [comp, coords] = p;
comp->obj->coords = coords;
comp->obj->transform_update(drawP, isSingleThread);
comp->obj->commit_transform(drawP, isSingleThread);
}, isSingleThread);
DrawComponent::client_send_transform_many(drawP, transformsToSend);
@ -154,7 +154,7 @@ void DrawingProgramSelection::deselect_all() {
parallel_loop_container(transformsTo, [&](auto& p) {
auto& [comp, coords] = p;
comp->obj->coords = coords;
comp->obj->transform_update(drawP, isSingleThread);
comp->obj->commit_transform(drawP, isSingleThread);
}, isSingleThread);
DrawComponent::client_send_transform_many(drawP, transformsToSend);
@ -334,7 +334,7 @@ void DrawingProgramSelection::paste_clipboard() {
parallel_loop_container(compListInserted, [&](auto& c) {
c->obj->remap_resource_ids(resourceRemapIDs);
c->obj->coords.translate(-moveVec);
c->obj->transform_update(drawP, false);
c->obj->commit_transform(drawP, false);
});
DrawComponent::client_send_place_many(drawP, compListInserted);
drawP.addToCompCacheOnInsert = true;

View file

@ -49,8 +49,8 @@ void EditTool::gui_toolbox() {
}
}
if(editHappened) {
a->temp_update(drawP);
a->client_send_update_temp(drawP);
a->commit_update(drawP);
a->client_send_update(drawP);
}
}
else {
@ -83,8 +83,8 @@ void EditTool::reset_tool() {
default:
break;
}
a->final_update(drawP);
a->client_send_update_final(drawP);
a->commit_update(drawP);
a->client_send_update(drawP);
}
controls.compToEdit.reset();
controls.pointHandles.clear();
@ -177,8 +177,8 @@ void EditTool::tool_update() {
if(controls.pointDragging->max)
newPos = cwise_vec_min(*controls.pointDragging->max, newPos);
*controls.pointDragging->p = newPos;
a->temp_update(drawP);
a->client_send_update_temp(drawP);
a->commit_update(drawP);
a->client_send_update(drawP);
}
isMovingPoint = true;
}

View file

@ -70,15 +70,15 @@ void EllipseDrawTool::commit_edit_updates(const std::shared_ptr<DrawEllipse>& a,
drawP.world.undo.push(UndoManager::UndoRedoPair{
[&, a, pData]() {
a->d = pData;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
},
[&, a, cData]() {
a->d = cData;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
}
@ -112,7 +112,7 @@ void EllipseDrawTool::tool_update() {
auto objAdd = drawP.components.client_insert(placement, controls.intermediateItem);
controls.intermediateItem->client_send_place(drawP);
drawP.add_undo_place_component(objAdd);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->commit_update(drawP);
controls.drawStage = 1;
}
break;
@ -127,8 +127,8 @@ void EllipseDrawTool::tool_update() {
}
controls.intermediateItem->d.p1 = cwise_vec_min(controls.startAt, newPos);
controls.intermediateItem->d.p2 = cwise_vec_max(controls.startAt, newPos);
controls.intermediateItem->client_send_update_temp(drawP);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
else {
commit();
@ -145,8 +145,8 @@ bool EllipseDrawTool::prevent_undo_or_redo() {
void EllipseDrawTool::commit() {
if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) {
controls.intermediateItem->client_send_update_final(drawP);
controls.intermediateItem->final_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
controls.intermediateItem = nullptr;
}

View file

@ -74,15 +74,15 @@ void RectDrawTool::commit_edit_updates(const std::shared_ptr<DrawRectangle>& a,
drawP.world.undo.push(UndoManager::UndoRedoPair{
[&, a, pData]() {
a->d = pData;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
},
[&, a, cData]() {
a->d = cData;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
}
@ -110,7 +110,7 @@ void RectDrawTool::tool_update() {
controls.intermediateItem->lastUpdateTime = std::chrono::steady_clock::now();
uint64_t placement = drawP.components.client_list().size();
auto objAdd = drawP.components.client_insert(placement, controls.intermediateItem);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->commit_update(drawP);
controls.intermediateItem->client_send_place(drawP);
drawP.add_undo_place_component(objAdd);
controls.drawStage = 1;
@ -127,8 +127,8 @@ void RectDrawTool::tool_update() {
}
controls.intermediateItem->d.p1 = cwise_vec_min(controls.startAt, newPos);
controls.intermediateItem->d.p2 = cwise_vec_max(controls.startAt, newPos);
controls.intermediateItem->client_send_update_temp(drawP);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
else {
commit_rectangle();
@ -145,8 +145,8 @@ bool RectDrawTool::prevent_undo_or_redo() {
void RectDrawTool::commit_rectangle() {
if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) {
controls.intermediateItem->client_send_update_final(drawP);
controls.intermediateItem->final_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
controls.intermediateItem = nullptr;
}

View file

@ -57,8 +57,8 @@ void TextBoxTool::commit_edit_updates(const std::shared_ptr<DrawTextBox>& a, std
a->d = pData;
a->set_textbox_string(pData.currentText);
a->d.editing = false;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
},
@ -66,8 +66,8 @@ void TextBoxTool::commit_edit_updates(const std::shared_ptr<DrawTextBox>& a, std
a->d = cData;
a->set_textbox_string(cData.currentText);
a->d.editing = false;
a->client_send_update_final(drawP);
a->final_update(drawP);
a->client_send_update(drawP);
a->commit_update(drawP);
drawP.reset_tools();
return true;
}
@ -82,7 +82,7 @@ void TextBoxTool::edit_start(const std::shared_ptr<DrawTextBox>& a, std::any& pr
cur.pos = cur.selectionBeginPos = cur.selectionEndPos = textbox.getPosition(p);
prevData = a->d;
a->d.editing = true;
a->client_send_update_temp(drawP);
a->client_send_update(drawP);
drawP.editTool.add_point_handle({&a->d.p1, nullptr, &a->d.p2});
drawP.editTool.add_point_handle({&a->d.p2, &a->d.p1, nullptr});
}
@ -253,8 +253,8 @@ void TextBoxTool::tool_update() {
drawP.editTool.edit_start(i);
}
else {
controls.intermediateItem->client_send_update_temp(drawP);
controls.intermediateItem->temp_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
break;
}
@ -273,14 +273,14 @@ void TextBoxTool::edit_text(std::function<void()> toRun, const std::shared_ptr<D
}
void TextBoxTool::update_textbox_network(const std::shared_ptr<DrawTextBox>& textBox) {
textBox->client_send_update_temp(drawP);
textBox->temp_update(drawP);
textBox->client_send_update(drawP);
textBox->commit_update(drawP);
}
void TextBoxTool::commit() {
if(controls.intermediateItem && controls.intermediateItem->collabListInfo.lock()) {
controls.intermediateItem->client_send_update_final(drawP);
controls.intermediateItem->final_update(drawP);
controls.intermediateItem->client_send_update(drawP);
controls.intermediateItem->commit_update(drawP);
}
controls.intermediateItem = nullptr;
}