From ed3d5f6d51796a16dd4f5b275fba7f212cddb21d Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Thu, 31 Jul 2025 09:34:17 +0300 Subject: [PATCH] Removed temporary update commits --- include/Helpers/SCollision.hpp | 6 +- src/DrawComponents/DrawBrushStroke.cpp | 11 ++-- src/DrawComponents/DrawBrushStroke.hpp | 4 +- src/DrawComponents/DrawComponent.cpp | 63 +++++++------------ src/DrawComponents/DrawComponent.hpp | 19 ++---- src/DrawComponents/DrawEllipse.cpp | 3 +- src/DrawComponents/DrawEllipse.hpp | 4 +- src/DrawComponents/DrawImage.cpp | 7 ++- src/DrawComponents/DrawImage.hpp | 4 +- src/DrawComponents/DrawRectangle.cpp | 3 +- src/DrawComponents/DrawRectangle.hpp | 4 +- src/DrawComponents/DrawTextBox.cpp | 5 +- src/DrawComponents/DrawTextBox.hpp | 4 +- src/DrawingProgram/BrushTool.cpp | 10 +-- src/DrawingProgram/DrawingProgram.cpp | 38 +++++------ src/DrawingProgram/DrawingProgram.hpp | 2 +- src/DrawingProgram/DrawingProgramCache.cpp | 4 +- src/DrawingProgram/DrawingProgramCache.hpp | 2 +- .../DrawingProgramSelection.cpp | 8 +-- src/DrawingProgram/EditTool.cpp | 12 ++-- src/DrawingProgram/EllipseDrawTool.cpp | 18 +++--- src/DrawingProgram/RectDrawTool.cpp | 18 +++--- src/DrawingProgram/TextBoxTool.cpp | 22 +++---- src/Server/MainServer.cpp | 16 +---- src/Server/ServerData.hpp | 1 - 25 files changed, 125 insertions(+), 163 deletions(-) diff --git a/include/Helpers/SCollision.hpp b/include/Helpers/SCollision.hpp index 1b5db69..c56af14 100644 --- a/include/Helpers/SCollision.hpp +++ b/include/Helpers/SCollision.hpp @@ -459,7 +459,7 @@ namespace SCollision { return 3; } - void calculate_bvh_recursive(ColliderCollection& bvhObjects) { + void calculate_bvh_recursive(ColliderCollection& bvhObjects, int maxDepth = -1) { bvhObjects.recalculate_bounds(); objects.bounds = bvhObjects.bounds; @@ -468,7 +468,7 @@ namespace SCollision { return; } - if(bvhObjects.size() <= 2) { + if(bvhObjects.size() <= 2 || maxDepth == 0) { objects = bvhObjects; return; } @@ -492,7 +492,7 @@ namespace SCollision { } else { children.emplace_back(); - children.back().calculate_bvh_recursive(parts[i]); + children.back().calculate_bvh_recursive(parts[i], maxDepth - 1); } } } diff --git a/src/DrawComponents/DrawBrushStroke.cpp b/src/DrawComponents/DrawBrushStroke.cpp index c12a259..ec1d557 100644 --- a/src/DrawComponents/DrawBrushStroke.cpp +++ b/src/DrawComponents/DrawBrushStroke.cpp @@ -47,7 +47,7 @@ std::shared_ptr DrawBrushStroke::deep_copy() const { return a; } -void DrawBrushStroke::update_from_delayed_ptr() { +void DrawBrushStroke::update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) { std::shared_ptr newPtr = std::static_pointer_cast(delayedUpdatePtr); d = newPtr->d; } @@ -120,6 +120,7 @@ void DrawBrushStroke::initialize_draw_data(DrawingProgram& drawP) { create_triangles(triangleFunc, points, 30); vertices_to_draw_data(verticesMipMap[1], vertexData); } + create_collider(); } std::vector DrawBrushStroke::get_wedge_indices(const std::vector& points) { @@ -359,19 +360,19 @@ void DrawBrushStroke::create_collider() { SCollision::BVHContainer collisionTree; - collisionTree.calculate_bvh_recursive(strokeObjects); + collisionTree.calculate_bvh_recursive(strokeObjects, AABB_PRECHECK_BVH_LEVELS + 1); precheckAABBLevels.clear(); - add_precheck_aabb_level(0, collisionTree.children); + add_precheck_aabb_level(AABB_PRECHECK_BVH_LEVELS, collisionTree.children); bounds = collisionTree.objects.bounds; } void DrawBrushStroke::add_precheck_aabb_level(size_t level, const std::vector>& levelArray) { for(const auto& a : levelArray) { - if(level == AABB_PRECHECK_BVH_LEVELS || a.children.empty()) + if(level == 0 || a.children.empty()) precheckAABBLevels.emplace_back(a.objects.bounds); else - add_precheck_aabb_level(level + 1, a.children); + add_precheck_aabb_level(level - 1, a.children); } } diff --git a/src/DrawComponents/DrawBrushStroke.hpp b/src/DrawComponents/DrawBrushStroke.hpp index beb23fb..62b17e7 100644 --- a/src/DrawComponents/DrawBrushStroke.hpp +++ b/src/DrawComponents/DrawBrushStroke.hpp @@ -41,8 +41,8 @@ class DrawBrushStroke : public DrawComponent { virtual void initialize_draw_data(DrawingProgram& drawP) override; virtual void update(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; - virtual void create_collider() override; - virtual void update_from_delayed_ptr() override; + void create_collider(); + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; virtual SCollision::AABB get_obj_coord_bounds() const override; diff --git a/src/DrawComponents/DrawComponent.cpp b/src/DrawComponents/DrawComponent.cpp index 10bcbef..cbfecfd 100644 --- a/src/DrawComponents/DrawComponent.cpp +++ b/src/DrawComponents/DrawComponent.cpp @@ -72,26 +72,14 @@ void DrawComponent::server_send_erase_set(MainServer& server, const std::unorder server.netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_ERASE_MANY_COMPONENTS, ids); } -void DrawComponent::server_send_update_temp(MainServer& server, ServerClientID id) { - server.netServer->send_items_to_all_clients(UNRELIABLE_COMMAND_CHANNEL, CLIENT_UPDATE_COMPONENT, true, id, *this); -} - -void DrawComponent::server_send_update_final(MainServer& server, ServerClientID id) { - server.netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_UPDATE_COMPONENT, false, id, *this); +void DrawComponent::server_send_update(MainServer& server, ServerClientID id) { + server.netServer->send_items_to_all_clients(UNRELIABLE_COMMAND_CHANNEL, CLIENT_UPDATE_COMPONENT, id, *this); } void DrawComponent::server_send_transform_many(MainServer& server, const std::vector>& transforms) { server.netServer->send_items_to_all_clients(RELIABLE_COMMAND_CHANNEL, CLIENT_TRANSFORM_MANY_COMPONENTS, transforms); } -bool DrawComponent::server_update(MainServer& server, ServerClientID id, const std::chrono::time_point& tempServerUpdateTimer) { - if((std::chrono::steady_clock::now() - tempServerUpdateTimer) >= CLIENT_DRAWCOMP_DELAY_TIMER_DURATION) { - server_send_update_final(server, id); - return true; - } - return false; -} - void DrawComponent::get_used_resources(std::unordered_set& v) const { } @@ -105,35 +93,35 @@ bool DrawComponent::bounds_draw_check(const DrawData& drawData) const { return a; } -void DrawComponent::check_timers(DrawingProgram& drawP) { +bool DrawComponent::check_timers(DrawingProgram& drawP, const std::shared_ptr& delayedUpdatePtr) { if(delayedUpdatePtr) { if(std::chrono::steady_clock::now() - lastUpdateTime > CLIENT_DRAWCOMP_DELAY_TIMER_DURATION) { - update_from_delayed_ptr(); - delayedUpdatePtr = nullptr; - final_update(drawP); + update_from_delayed_ptr(delayedUpdatePtr); + commit_update(drawP); + return true; } + return false; } + return true; } -void DrawComponent::temp_update(DrawingProgram& drawP) { - if(collabListInfo.lock()) - drawP.compCache.preupdate_component(collabListInfo.lock()); - worldAABB = std::nullopt; +void DrawComponent::commit_update(DrawingProgram& drawP, bool invalidateCache) { + auto lockedCollabInfo = collabListInfo.lock(); + if(invalidateCache && lockedCollabInfo && worldAABB) + drawP.compCache.preupdate_component(lockedCollabInfo, worldAABB); initialize_draw_data(drawP); + calculate_world_bounds(); + if(invalidateCache && lockedCollabInfo && worldAABB) + drawP.compCache.preupdate_component(lockedCollabInfo, worldAABB); } -void DrawComponent::final_update(DrawingProgram& drawP, bool invalidateCache) { - if(invalidateCache && collabListInfo.lock()) - drawP.compCache.preupdate_component(collabListInfo.lock()); - initialize_draw_data(drawP); - create_collider(); - calculate_world_bounds(); -} - -void DrawComponent::transform_update(DrawingProgram& drawP, bool invalidateCache) { - if(invalidateCache && collabListInfo.lock()) - drawP.compCache.preupdate_component(collabListInfo.lock()); +void DrawComponent::commit_transform(DrawingProgram& drawP, bool invalidateCache) { + auto lockedCollabInfo = collabListInfo.lock(); + if(invalidateCache && lockedCollabInfo && worldAABB) + drawP.compCache.preupdate_component(lockedCollabInfo, worldAABB); calculate_world_bounds(); + if(invalidateCache && lockedCollabInfo && worldAABB) + drawP.compCache.preupdate_component(lockedCollabInfo, worldAABB); } void DrawComponent::client_send_place_many(DrawingProgram& drawP, std::vector& comps) { @@ -145,14 +133,9 @@ void DrawComponent::client_send_place(DrawingProgram& drawP) { drawP.world.con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_PLACE_SINGLE_COMPONENT, collabListInfo.lock()->pos, get_type(), this->coords, *this); } -void DrawComponent::client_send_update_temp(DrawingProgram& drawP) { +void DrawComponent::client_send_update(DrawingProgram& drawP) { if(collabListInfo.lock()) - drawP.world.con.client_send_items_to_server(UNRELIABLE_COMMAND_CHANNEL, SERVER_UPDATE_COMPONENT, true, collabListInfo.lock()->id, *this); -} - -void DrawComponent::client_send_update_final(DrawingProgram& drawP) { - if(collabListInfo.lock()) - drawP.world.con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_UPDATE_COMPONENT, false, collabListInfo.lock()->id, *this); + drawP.world.con.client_send_items_to_server(UNRELIABLE_COMMAND_CHANNEL, SERVER_UPDATE_COMPONENT, collabListInfo.lock()->id, *this); } void DrawComponent::client_send_transform_many(DrawingProgram& drawP, const std::vector>& transforms) { diff --git a/src/DrawComponents/DrawComponent.hpp b/src/DrawComponents/DrawComponent.hpp index 9fa0a01..94efdf2 100644 --- a/src/DrawComponents/DrawComponent.hpp +++ b/src/DrawComponents/DrawComponent.hpp @@ -67,28 +67,23 @@ class DrawComponent { static void server_send_place_many(MainServer& server, std::vector& comps); static void server_send_erase(MainServer& server, ServerClientID id); static void server_send_erase_set(MainServer& server, const std::unordered_set& ids); - void server_send_update_temp(MainServer& server, ServerClientID id); - void server_send_update_final(MainServer& server, ServerClientID id); + void server_send_update(MainServer& server, ServerClientID id); static void server_send_transform_many(MainServer& server, const std::vector>& transforms); std::weak_ptr collabListInfo; std::weak_ptr parentBvhNode; - bool server_update(MainServer& server, ServerClientID id, const std::chrono::time_point& tempServerUpdateTimer); - #ifndef IS_SERVER std::chrono::time_point lastUpdateTime; - std::shared_ptr delayedUpdatePtr = nullptr; bool bounds_draw_check(const DrawData& drawData) const; - void check_timers(DrawingProgram& drawP); + bool check_timers(DrawingProgram& drawP, const std::shared_ptr& delayedUpdatePtr); static void client_send_place_many(DrawingProgram& drawP, std::vector& comps); void client_send_place(DrawingProgram& drawP); void client_send_erase(DrawingProgram& drawP); static void client_send_erase_set(DrawingProgram& drawP, const std::unordered_set& ids); - void client_send_update_temp(DrawingProgram& drawP); - void client_send_update_final(DrawingProgram& drawP); + void client_send_update(DrawingProgram& drawP); static void client_send_transform_many(DrawingProgram& drawP, const std::vector>& transforms); std::optional> worldAABB; @@ -100,17 +95,15 @@ class DrawComponent { virtual std::shared_ptr copy() const = 0; virtual std::shared_ptr deep_copy() const = 0; - virtual void create_collider() = 0; virtual void draw(SkCanvas* canvas, const DrawData& drawData) = 0; - void temp_update(DrawingProgram& drawP); - void final_update(DrawingProgram& drawP, bool invalidateCache = true); // invalidateCache = false version should be thread safe - void transform_update(DrawingProgram& drawP, bool invalidateCache = true); + void commit_update(DrawingProgram& drawP, bool invalidateCache = true); // invalidateCache = false version should be thread safe + void commit_transform(DrawingProgram& drawP, bool invalidateCache = true); // invalidateCache = false version should be thread safe virtual void initialize_draw_data(DrawingProgram& drawP) = 0; virtual void update(DrawingProgram& drawP) = 0; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) = 0; bool collides_with_world_coords(const CoordSpaceHelper& camCoords, const SCollision::ColliderCollection& checkAgainstWorld); bool collides_with_cam_coords(const CoordSpaceHelper& camCoords, const SCollision::ColliderCollection& checkAgainstCam); bool collides_with(const CoordSpaceHelper& camCoords, const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam); - virtual void update_from_delayed_ptr() = 0; + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) = 0; #endif }; diff --git a/src/DrawComponents/DrawEllipse.cpp b/src/DrawComponents/DrawEllipse.cpp index 23efabc..893d574 100644 --- a/src/DrawComponents/DrawEllipse.cpp +++ b/src/DrawComponents/DrawEllipse.cpp @@ -35,7 +35,7 @@ std::shared_ptr DrawEllipse::deep_copy() const { return a; } -void DrawEllipse::update_from_delayed_ptr() { +void DrawEllipse::update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) { std::shared_ptr newPtr = std::static_pointer_cast(delayedUpdatePtr); d = newPtr->d; } @@ -69,6 +69,7 @@ void DrawEllipse::create_draw_data() { void DrawEllipse::initialize_draw_data(DrawingProgram& drawP) { create_draw_data(); + create_collider(); } void DrawEllipse::update(DrawingProgram& drawP) { diff --git a/src/DrawComponents/DrawEllipse.hpp b/src/DrawComponents/DrawEllipse.hpp index bba06e7..0946eb5 100644 --- a/src/DrawComponents/DrawEllipse.hpp +++ b/src/DrawComponents/DrawEllipse.hpp @@ -32,9 +32,9 @@ class DrawEllipse : public DrawComponent { virtual void initialize_draw_data(DrawingProgram& drawP) override; virtual void update(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; - virtual void update_from_delayed_ptr() override; + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; void create_draw_data(); - virtual void create_collider() override; + void create_collider(); virtual SCollision::AABB get_obj_coord_bounds() const override; diff --git a/src/DrawComponents/DrawImage.cpp b/src/DrawComponents/DrawImage.cpp index fd63e24..92856fd 100644 --- a/src/DrawComponents/DrawImage.cpp +++ b/src/DrawComponents/DrawImage.cpp @@ -49,7 +49,7 @@ std::shared_ptr DrawImage::deep_copy() const { return a; } -void DrawImage::update_from_delayed_ptr() { +void DrawImage::update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) { std::shared_ptr newPtr = std::static_pointer_cast(delayedUpdatePtr); d = newPtr->d; } @@ -70,13 +70,14 @@ void DrawImage::draw(SkCanvas* canvas, const DrawData& drawData) { void DrawImage::update(DrawingProgram& drawP) { std::shared_ptr display = drawP.world.drawData.rMan->get_display_data(d.imageID); if(display) { - if(display->update_draw())// && bounds_draw_check(drawP.world.drawData, collisionTree)) - temp_update(drawP); + if(display->update_draw() && collabListInfo.lock()) + drawP.compCache.invalidate_cache_at_optional_aabb_before_pos(worldAABB, collabListInfo.lock()->pos); } } void DrawImage::initialize_draw_data(DrawingProgram& drawP) { create_draw_data(); + create_collider(); } bool DrawImage::collides_within_coords(const SCollision::ColliderCollection& checkAgainst) { diff --git a/src/DrawComponents/DrawImage.hpp b/src/DrawComponents/DrawImage.hpp index 729a41e..92f5579 100644 --- a/src/DrawComponents/DrawImage.hpp +++ b/src/DrawComponents/DrawImage.hpp @@ -32,8 +32,8 @@ class DrawImage : public DrawComponent { virtual void update(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; void create_draw_data(); - virtual void create_collider() override; - virtual void update_from_delayed_ptr() override; + void create_collider(); + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; virtual SCollision::AABB get_obj_coord_bounds() const override; diff --git a/src/DrawComponents/DrawRectangle.cpp b/src/DrawComponents/DrawRectangle.cpp index e69926d..50e58a6 100644 --- a/src/DrawComponents/DrawRectangle.cpp +++ b/src/DrawComponents/DrawRectangle.cpp @@ -38,7 +38,7 @@ std::shared_ptr DrawRectangle::deep_copy() const { return a; } -void DrawRectangle::update_from_delayed_ptr() { +void DrawRectangle::update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) { std::shared_ptr newPtr = std::static_pointer_cast(delayedUpdatePtr); d = newPtr->d; } @@ -71,6 +71,7 @@ void DrawRectangle::update(DrawingProgram& drawP) { void DrawRectangle::initialize_draw_data(DrawingProgram& drawP) { create_draw_data(); + create_collider(); } bool DrawRectangle::collides_within_coords(const SCollision::ColliderCollection& checkAgainst) { diff --git a/src/DrawComponents/DrawRectangle.hpp b/src/DrawComponents/DrawRectangle.hpp index 5fdd3e6..5f9b920 100644 --- a/src/DrawComponents/DrawRectangle.hpp +++ b/src/DrawComponents/DrawRectangle.hpp @@ -34,8 +34,8 @@ class DrawRectangle : public DrawComponent { virtual void update(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; void create_draw_data(); - virtual void create_collider() override; - virtual void update_from_delayed_ptr() override; + void create_collider(); + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; virtual SCollision::AABB get_obj_coord_bounds() const override; diff --git a/src/DrawComponents/DrawTextBox.cpp b/src/DrawComponents/DrawTextBox.cpp index 5d30c97..122be0a 100644 --- a/src/DrawComponents/DrawTextBox.cpp +++ b/src/DrawComponents/DrawTextBox.cpp @@ -43,7 +43,7 @@ std::shared_ptr DrawTextBox::deep_copy() const { return a; } -void DrawTextBox::update_from_delayed_ptr() { +void DrawTextBox::update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) { std::shared_ptr newPtr = std::static_pointer_cast(delayedUpdatePtr); d = newPtr->d; textboxUpdate = true; @@ -105,7 +105,7 @@ void DrawTextBox::set_textbox_string(const std::string& str) { void DrawTextBox::update_contained_string(DrawingProgram& drawP) { d.currentText = textBox.get_string(); - temp_update(drawP); + commit_update(drawP); } Vector2f DrawTextBox::get_mouse_pos(DrawingProgram& drawP) { @@ -114,6 +114,7 @@ Vector2f DrawTextBox::get_mouse_pos(DrawingProgram& drawP) { void DrawTextBox::initialize_draw_data(DrawingProgram& drawP) { init_text_box(drawP); + create_collider(); } bool DrawTextBox::collides_within_coords(const SCollision::ColliderCollection& checkAgainst) { diff --git a/src/DrawComponents/DrawTextBox.hpp b/src/DrawComponents/DrawTextBox.hpp index 1f0074d..4b079cc 100644 --- a/src/DrawComponents/DrawTextBox.hpp +++ b/src/DrawComponents/DrawTextBox.hpp @@ -35,8 +35,8 @@ class DrawTextBox : public DrawComponent { virtual void initialize_draw_data(DrawingProgram& drawP) override; virtual bool collides_within_coords(const SCollision::ColliderCollection& checkAgainst) override; virtual void update(DrawingProgram& drawP) override; - virtual void create_collider() override; - virtual void update_from_delayed_ptr() override; + void create_collider(); + virtual void update_from_delayed_ptr(const std::shared_ptr& delayedUpdatePtr) override; void init_text_box(DrawingProgram& drawP); void update_contained_string(DrawingProgram& drawP); void set_textbox_string(const std::string& str); diff --git a/src/DrawingProgram/BrushTool.cpp b/src/DrawingProgram/BrushTool.cpp index e3a565d..e185697 100644 --- a/src/DrawingProgram/BrushTool.cpp +++ b/src/DrawingProgram/BrushTool.cpp @@ -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; diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 31eeab5..17832bf 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -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& 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 sortedPlacedComponents; @@ -143,7 +139,7 @@ void DrawingProgram::init_client_callbacks() { std::vector 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); } diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index f9ff64b..e41b982 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -52,7 +52,7 @@ class DrawingProgram { CollabListType components; std::unordered_set> updateableComponents; - std::unordered_set> delayedUpdateComponents; + std::unordered_map, std::shared_ptr> delayedUpdateComponents; Vector4f* get_foreground_color_ptr(); private: diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index fa72628..920c92e 100644 --- a/src/DrawingProgram/DrawingProgramCache.cpp +++ b/src/DrawingProgram/DrawingProgramCache.cpp @@ -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>& 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& bvhNode, const std::vector& components) { diff --git a/src/DrawingProgram/DrawingProgramCache.hpp b/src/DrawingProgram/DrawingProgramCache.hpp index 14f60a0..e6c2f4c 100644 --- a/src/DrawingProgram/DrawingProgramCache.hpp +++ b/src/DrawingProgram/DrawingProgramCache.hpp @@ -52,7 +52,7 @@ class DrawingProgramCache { void traverse_bvh_run_function(const SCollision::AABB& aabb, std::function& node, const std::vector& components)> f); void traverse_bvh_erase_function(const SCollision::AABB& aabb, std::function& node, std::vector& 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>& aabb); void invalidate_cache_before_pos(uint64_t placementToInvalidateAt); void invalidate_cache_at_aabb_before_pos(const SCollision::AABB& aabb, uint64_t placementToInvalidateAt); void invalidate_cache_at_optional_aabb_before_pos(const std::optional>& aabb, uint64_t placementToInvalidateAt); diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index e96851e..d58c7ea 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -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; diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index 578482b..4ecebbf 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -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; } diff --git a/src/DrawingProgram/EllipseDrawTool.cpp b/src/DrawingProgram/EllipseDrawTool.cpp index 4cad67c..272595c 100644 --- a/src/DrawingProgram/EllipseDrawTool.cpp +++ b/src/DrawingProgram/EllipseDrawTool.cpp @@ -70,15 +70,15 @@ void EllipseDrawTool::commit_edit_updates(const std::shared_ptr& 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; } diff --git a/src/DrawingProgram/RectDrawTool.cpp b/src/DrawingProgram/RectDrawTool.cpp index 6f3e780..2f386b8 100644 --- a/src/DrawingProgram/RectDrawTool.cpp +++ b/src/DrawingProgram/RectDrawTool.cpp @@ -74,15 +74,15 @@ void RectDrawTool::commit_edit_updates(const std::shared_ptr& 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; } diff --git a/src/DrawingProgram/TextBoxTool.cpp b/src/DrawingProgram/TextBoxTool.cpp index ab84fbb..33e6d1c 100644 --- a/src/DrawingProgram/TextBoxTool.cpp +++ b/src/DrawingProgram/TextBoxTool.cpp @@ -57,8 +57,8 @@ void TextBoxTool::commit_edit_updates(const std::shared_ptr& 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& 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& 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 toRun, const std::shared_ptr& 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; } diff --git a/src/Server/MainServer.cpp b/src/Server/MainServer.cpp index 08a1619..425b0ee 100644 --- a/src/Server/MainServer.cpp +++ b/src/Server/MainServer.cpp @@ -203,14 +203,7 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID): if(it != data.idToComponentMap.end()) { std::shared_ptr& comp = it->second; message(*comp); - if(isTemp) { - comp->server_send_update_temp(*this, idToUpdate); - data.updateComponentTimers[idToUpdate] = std::chrono::steady_clock::now(); - } - else { - comp->server_send_update_final(*this, idToUpdate); - data.updateComponentTimers.erase(idToUpdate); - } + comp->server_send_update(*this, idToUpdate); } }); netServer->add_recv_callback(SERVER_RESOURCE_INIT, [&](std::shared_ptr client, cereal::PortableBinaryInputArchive& message) { @@ -309,13 +302,6 @@ void MainServer::ensure_display_name_unique(std::string& displayName) { void MainServer::update() { netServer->update(); - std::erase_if(data.updateComponentTimers, [&](auto& c) { - auto& [id, timer] = c; - auto it = data.idToComponentMap.find(id); - if(it == data.idToComponentMap.end()) - return true; - return it->second->server_update(*this, id, timer); - }); if(std::chrono::steady_clock::now() - lastKeepAliveSent > std::chrono::seconds(2)) { netServer->send_items_to_all_clients(UNRELIABLE_COMMAND_CHANNEL, CLIENT_KEEP_ALIVE); lastKeepAliveSent = std::chrono::steady_clock::now(); diff --git a/src/Server/ServerData.hpp b/src/Server/ServerData.hpp index b4543fc..dae96b7 100644 --- a/src/Server/ServerData.hpp +++ b/src/Server/ServerData.hpp @@ -11,7 +11,6 @@ class ServerData { std::vector>> components; std::unordered_map> idToComponentMap; std::unordered_map resources; - std::unordered_map> updateComponentTimers; std::unordered_map bookmarks; void save(cereal::PortableBinaryOutputArchive& a) const; void write_to_file(cereal::PortableBinaryOutputArchive& a) const;