diff --git a/src/DrawingProgram/DrawingProgramSelection.cpp b/src/DrawingProgram/DrawingProgramSelection.cpp index cfedbe4..022ab81 100644 --- a/src/DrawingProgram/DrawingProgramSelection.cpp +++ b/src/DrawingProgram/DrawingProgramSelection.cpp @@ -69,17 +69,31 @@ std::function&, std::vect return toRet; } -void DrawingProgramSelection::add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC) { +void DrawingProgramSelection::add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC, bool onlyFrontObject) { auto cCWorld = drawP.world.drawData.cam.c.collider_to_world, SCollision::ColliderCollection>(cC); std::unordered_set selectedComponents; drawP.compCache.traverse_bvh_erase_function(cCWorld.bounds, erase_select_objects_in_bvh_func(selectedComponents, cC, cCWorld)); + if(onlyFrontObject && !selectedComponents.empty()) { + CollabListType::ObjectInfoPtr p = *std::max_element(selectedComponents.begin(), selectedComponents.end(), [](auto& a, auto& b) { + return a->pos < b->pos; + }); + selectedComponents.clear(); + selectedComponents.emplace(p); + } add_to_selection(selectedComponents); } -void DrawingProgramSelection::remove_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC) { +void DrawingProgramSelection::remove_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC, bool onlyFrontObject) { auto cCWorld = drawP.world.drawData.cam.c.collider_to_world, SCollision::ColliderCollection>(cC); std::unordered_set selectedComponents; cache.traverse_bvh_erase_function(cCWorld.bounds, erase_select_objects_in_bvh_func(selectedComponents, cC, cCWorld)); + if(onlyFrontObject && !selectedComponents.empty()) { + CollabListType::ObjectInfoPtr p = *std::max_element(selectedComponents.begin(), selectedComponents.end(), [](auto& a, auto& b) { + return a->pos < b->pos; + }); + selectedComponents.clear(); + selectedComponents.emplace(p); + } cache.clear_own_cached_surfaces(); std::erase_if(selectedSet, [&](auto& c) { return selectedComponents.contains(c); @@ -96,6 +110,19 @@ void DrawingProgramSelection::remove_from_cam_coord_collider_to_selection(const } } +CollabListType::ObjectInfoPtr DrawingProgramSelection::get_front_object_colliding_with(const SCollision::ColliderCollection& cC) { + auto cCWorld = drawP.world.drawData.cam.c.collider_to_world, SCollision::ColliderCollection>(cC); + CollabListType::ObjectInfoPtr p; + cache.traverse_bvh_run_function(cCWorld.bounds, [&](const std::shared_ptr& bvhNode, const std::vector& components) { + for(auto& c : components) { + if((!p || c->pos >= p->pos) && c->obj->collides_with_world_coords(drawP.world.drawData.cam.c, cCWorld)) + p = c; + } + return true; + }); + return p; +} + void DrawingProgramSelection::add_to_selection(const std::unordered_set& newSelection) { selectedSet.insert(newSelection.begin(), newSelection.end()); for(auto& obj : newSelection) diff --git a/src/DrawingProgram/DrawingProgramSelection.hpp b/src/DrawingProgram/DrawingProgramSelection.hpp index 626ee30..da8c381 100644 --- a/src/DrawingProgram/DrawingProgramSelection.hpp +++ b/src/DrawingProgram/DrawingProgramSelection.hpp @@ -7,8 +7,9 @@ class DrawingProgram; class DrawingProgramSelection { public: DrawingProgramSelection(DrawingProgram& initDrawP); - void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC); - void remove_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC); + void add_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC, bool onlyFrontObject = false); + void remove_from_cam_coord_collider_to_selection(const SCollision::ColliderCollection& cC, bool onlyFrontObject = false); + CollabListType::ObjectInfoPtr get_front_object_colliding_with(const SCollision::ColliderCollection& cC); void deselect_all(); void update(); diff --git a/src/DrawingProgram/EditTool.cpp b/src/DrawingProgram/EditTool.cpp index fd548a6..bbbf009 100644 --- a/src/DrawingProgram/EditTool.cpp +++ b/src/DrawingProgram/EditTool.cpp @@ -56,6 +56,9 @@ void EditTool::switch_tool(DrawingProgramToolType newTool) { controls.pointHandles.clear(); controls.pointDragging = nullptr; controls.isEditing = false; + + if(newTool != DrawingProgramToolType::RECTSELECT && newTool != DrawingProgramToolType::LASSOSELECT && newTool != DrawingProgramToolType::EDIT) + drawP.selection.deselect_all(); } void EditTool::edit_start(const std::shared_ptr& comp) { @@ -96,22 +99,40 @@ void EditTool::tool_update() { cMouseAABB.aabb.emplace_back(mouseAABB); cMouseAABB.recalculate_bounds(); - if(drawP.controls.leftClick) { - CollabListType::ObjectInfoPtr lastSelectedObj; - uint64_t lastPos = 0; + SCollision::AABB camMouseAABB{drawP.world.main.input.mouse.pos - Vector2f{0.5f, 0.5f}, drawP.world.main.input.mouse.pos + Vector2f{0.5f, 0.5f}}; + SCollision::ColliderCollection camCMouseAABB; + camCMouseAABB.aabb.emplace_back(camMouseAABB); + camCMouseAABB.recalculate_bounds(); - drawP.compCache.traverse_bvh_run_function(mouseAABB, [&](const std::shared_ptr& bvhNode, const std::vector& components) { - for(auto& c : components) { - if(c->pos >= lastPos && c->obj->collides_with_world_coords(drawP.world.drawData.cam.c, cMouseAABB)) { - lastSelectedObj = c; - lastPos = c->pos; + if(drawP.controls.leftClick) { + if(drawP.world.main.input.mouse.leftClicks >= 2 && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held && !drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) { + CollabListType::ObjectInfoPtr selectedObjectToEdit = drawP.selection.get_front_object_colliding_with(camCMouseAABB); + + if(selectedObjectToEdit) { + drawP.selection.deselect_all(); + edit_start(selectedObjectToEdit->obj); + } + else { + if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) + drawP.selection.add_from_cam_coord_collider_to_selection(camCMouseAABB, true); + else if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) + drawP.selection.remove_from_cam_coord_collider_to_selection(camCMouseAABB, true); + else { + drawP.selection.deselect_all(); + drawP.selection.add_from_cam_coord_collider_to_selection(camCMouseAABB, true); } } - return true; - }); - - if(lastSelectedObj) - edit_start(lastSelectedObj->obj); + } + else if(!drawP.selection.is_being_transformed()) { + if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LSHIFT).held) + drawP.selection.add_from_cam_coord_collider_to_selection(camCMouseAABB, true); + else if(drawP.world.main.input.key(InputManager::KEY_GENERIC_LALT).held) + drawP.selection.remove_from_cam_coord_collider_to_selection(camCMouseAABB, true); + else { + drawP.selection.deselect_all(); + drawP.selection.add_from_cam_coord_collider_to_selection(camCMouseAABB, true); + } + } } } else { diff --git a/src/DrawingProgram/LassoSelectTool.cpp b/src/DrawingProgram/LassoSelectTool.cpp index 817e02b..0e457fb 100644 --- a/src/DrawingProgram/LassoSelectTool.cpp +++ b/src/DrawingProgram/LassoSelectTool.cpp @@ -42,7 +42,7 @@ void LassoSelectTool::gui_toolbox() { } void LassoSelectTool::switch_tool(DrawingProgramToolType newTool) { - if(newTool != DrawingProgramToolType::RECTSELECT && newTool != DrawingProgramToolType::LASSOSELECT) + if(newTool != DrawingProgramToolType::RECTSELECT && newTool != DrawingProgramToolType::LASSOSELECT && newTool != DrawingProgramToolType::EDIT) drawP.selection.deselect_all(); } diff --git a/src/DrawingProgram/RectSelectTool.cpp b/src/DrawingProgram/RectSelectTool.cpp index 118615f..6e05019 100644 --- a/src/DrawingProgram/RectSelectTool.cpp +++ b/src/DrawingProgram/RectSelectTool.cpp @@ -21,7 +21,7 @@ void RectSelectTool::gui_toolbox() { } void RectSelectTool::switch_tool(DrawingProgramToolType newTool) { - if(newTool != DrawingProgramToolType::RECTSELECT && newTool != DrawingProgramToolType::LASSOSELECT) + if(newTool != DrawingProgramToolType::RECTSELECT && newTool != DrawingProgramToolType::LASSOSELECT && newTool != DrawingProgramToolType::EDIT) drawP.selection.deselect_all(); }