From 0b1cc8d4c215679f6bd737074e4e0efea8e9945f Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Thu, 31 Jul 2025 19:28:18 +0300 Subject: [PATCH] Selection cache is also updated when objects are updated --- src/DrawComponents/DrawComponent.cpp | 8 ++++---- src/DrawComponents/DrawImage.cpp | 2 +- src/DrawingProgram/DrawingProgram.cpp | 14 ++++++++++++++ src/DrawingProgram/DrawingProgram.hpp | 4 ++++ src/DrawingProgram/DrawingProgramCache.cpp | 4 ++-- src/DrawingProgram/DrawingProgramCache.hpp | 2 +- src/DrawingProgram/DrawingProgramSelection.cpp | 8 ++++++++ src/DrawingProgram/DrawingProgramSelection.hpp | 3 +++ 8 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/DrawComponents/DrawComponent.cpp b/src/DrawComponents/DrawComponent.cpp index cbfecfd..ce7e01a 100644 --- a/src/DrawComponents/DrawComponent.cpp +++ b/src/DrawComponents/DrawComponent.cpp @@ -108,20 +108,20 @@ bool DrawComponent::check_timers(DrawingProgram& drawP, const std::shared_ptr& comps) { diff --git a/src/DrawComponents/DrawImage.cpp b/src/DrawComponents/DrawImage.cpp index 92856fd..4068240 100644 --- a/src/DrawComponents/DrawImage.cpp +++ b/src/DrawComponents/DrawImage.cpp @@ -71,7 +71,7 @@ void DrawImage::update(DrawingProgram& drawP) { std::shared_ptr display = drawP.world.drawData.rMan->get_display_data(d.imageID); if(display) { if(display->update_draw() && collabListInfo.lock()) - drawP.compCache.invalidate_cache_at_optional_aabb_before_pos(worldAABB, collabListInfo.lock()->pos); + drawP.invalidate_cache_at_component(collabListInfo.lock()); } } diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index e1ff3fc..7f72024 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -531,6 +531,20 @@ void DrawingProgram::add_undo_place_component(const CollabListType::ObjectInfoPt }); } +void DrawingProgram::invalidate_cache_at_component(const CollabListType::ObjectInfoPtr& objToCheck) { + if(selection.is_selected(objToCheck)) + selection.invalidate_cache_at_optional_aabb_before_pos(objToCheck->obj->worldAABB, objToCheck->pos); + else + compCache.invalidate_cache_at_optional_aabb_before_pos(objToCheck->obj->worldAABB, objToCheck->pos); +} + +void DrawingProgram::preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck) { + if(selection.is_selected(objToCheck)) + selection.preupdate_component(objToCheck); + else + compCache.preupdate_component(objToCheck); +} + void DrawingProgram::add_undo_place_components(const std::unordered_set& objSetToUndo) { world.undo.push(UndoManager::UndoRedoPair{ [&, objSetToUndo = objSetToUndo]() { diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index e41b982..d180175 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -47,6 +47,10 @@ class DrawingProgram { void parallel_loop_all_components(std::function, ServerClientID>::ObjectInfo>&)> func); + // This function, unlike preupdate_component, does not take the object out of the BVH. Use for a draw update that doesn't change the object's bounding box + void invalidate_cache_at_component(const CollabListType::ObjectInfoPtr& objToCheck); + void preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck); + DrawingProgramCache compCache; CollabListType components; diff --git a/src/DrawingProgram/DrawingProgramCache.cpp b/src/DrawingProgram/DrawingProgramCache.cpp index 285d42c..6e04dd2 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, const std::optional>& aabb) { +void DrawingProgramCache::preupdate_component(const CollabListType::ObjectInfoPtr& c) { auto parentBvhNode = c->obj->parentBvhNode.lock(); if(parentBvhNode) { unsortedComponents.emplace_back(c); std::erase(parentBvhNode->components, c); c->obj->parentBvhNode.reset(); } - invalidate_cache_at_optional_aabb_before_pos(aabb, c->pos); + invalidate_cache_at_optional_aabb_before_pos(c->obj->worldAABB, 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 44932b9..c1c3c22 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, const std::optional>& aabb); + void preupdate_component(const CollabListType::ObjectInfoPtr& c); 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 d58c7ea..521a3ce 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -170,6 +170,14 @@ void DrawingProgramSelection::deselect_all() { } } +void DrawingProgramSelection::invalidate_cache_at_optional_aabb_before_pos(const std::optional>& aabb, uint64_t placementToInvalidateAt) { + cache.invalidate_cache_at_optional_aabb_before_pos(aabb, placementToInvalidateAt); +} + +void DrawingProgramSelection::preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck) { + cache.preupdate_component(objToCheck); +} + bool DrawingProgramSelection::is_selected(const CollabListType::ObjectInfoPtr& objToCheck) { return selectedSet.contains(objToCheck); } diff --git a/src/DrawingProgram/DrawingProgramSelection.hpp b/src/DrawingProgram/DrawingProgramSelection.hpp index 0225fd6..62fed5c 100644 --- a/src/DrawingProgram/DrawingProgramSelection.hpp +++ b/src/DrawingProgram/DrawingProgramSelection.hpp @@ -16,6 +16,9 @@ class DrawingProgramSelection { void erase_component(const CollabListType::ObjectInfoPtr& objToCheck); bool is_selected(const CollabListType::ObjectInfoPtr& objToCheck); const std::unordered_set& get_selected_set(); + + void invalidate_cache_at_optional_aabb_before_pos(const std::optional>& aabb, uint64_t placementToInvalidateAt); + void preupdate_component(const CollabListType::ObjectInfoPtr& objToCheck); private: void delete_all(); bool mouse_collided_with_selection_aabb();