#include "GridManager.hpp" #include "World.hpp" #include "MainProgram.hpp" #include "WorldUndoManager.hpp" #include GridManager::GridManager(World& w): world(w) {} void GridManager::server_init_no_file() { grids = world.netObjMan.make_obj>(); } void GridManager::add_default_grid(const std::string& newName) { if(grids) { WorldGrid g; g.name = newName; g.color = color_mul_alpha(convert_vec4(world.canvasTheme.get_tool_front_color()), 0.4f); g.size = world.drawData.cam.c.inverseScale * WorldScalar(WorldGrid::GRID_UNIT_PIXEL_SIZE); g.offset = world.drawData.cam.c.pos + world.drawData.cam.c.dir_from_space(world.main.window.size.cast() * 0.5f); auto it = grids->emplace_back_direct(grids, g); class AddGridWorldUndoAction : public WorldUndoAction { public: AddGridWorldUndoAction(const WorldGrid& initGridData, WorldUndoManager::UndoObjectID initUndoID): gridData(initGridData), undoID(initUndoID) {} bool undo(WorldUndoManager& undoMan) override { std::optional toEraseID = undoMan.get_netid_from_undoid(undoID); if(!toEraseID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; gridList->erase(gridList, gridList->get(toEraseID.value())); return true; } bool redo(WorldUndoManager& undoMan) override { std::optional toInsertID = undoMan.get_netid_from_undoid(undoID); if(toInsertID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; auto insertedIt = gridList->emplace_back_direct(gridList, gridData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); return true; } void scale_up(const WorldScalar& scaleAmount) override { gridData.scale_up(scaleAmount); } ~AddGridWorldUndoAction() {} WorldGrid gridData; WorldUndoManager::UndoObjectID undoID; }; world.undo.push(std::make_unique(g, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); } } void GridManager::remove_grid(uint32_t indexToRemove) { if(grids) { class EraseGridWorldUndoAction : public WorldUndoAction { public: EraseGridWorldUndoAction(const WorldGrid& initGridData, WorldUndoManager::UndoObjectID initUndoID): gridData(initGridData), undoID(initUndoID) {} bool undo(WorldUndoManager& undoMan) override { std::optional toInsertID = undoMan.get_netid_from_undoid(undoID); if(toInsertID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; auto insertedIt = gridList->emplace_back_direct(gridList, gridData); undoMan.register_new_netid_to_existing_undoid(undoID, insertedIt->obj.get_net_id()); return true; } bool redo(WorldUndoManager& undoMan) override { std::optional toEraseID = undoMan.get_netid_from_undoid(undoID); if(!toEraseID.has_value()) return false; auto& gridList = undoMan.world.gridMan.grids; gridList->erase(gridList, gridList->get(toEraseID.value())); return true; } void scale_up(const WorldScalar& scaleAmount) override { gridData.scale_up(scaleAmount); } ~EraseGridWorldUndoAction() {} WorldGrid gridData; WorldUndoManager::UndoObjectID undoID; }; auto it = grids->at(indexToRemove); world.undo.push(std::make_unique(*it->obj, world.undo.get_undoid_from_netid(it->obj.get_net_id()))); grids->erase(grids, it); } } void GridManager::finalize_grid_modify(const NetworkingObjects::NetObjTemporaryPtr& wGrid, const WorldGrid& oldGridData) { class ModifyGridWorldUndoAction : public WorldUndoAction { public: ModifyGridWorldUndoAction(const WorldGrid& initGridDataOld, const WorldGrid& initGridDataNew, WorldUndoManager::UndoObjectID initUndoID): gridDataOld(initGridDataOld), gridDataNew(initGridDataNew), undoID(initUndoID) {} bool undo(WorldUndoManager& undoMan) override { std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); if(!toModifyID.has_value()) return false; auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); *gridPtr = gridDataOld; undoMan.world.delayedUpdateObjectManager.send_update_to_all(gridPtr, true); return true; } bool redo(WorldUndoManager& undoMan) override { std::optional toModifyID = undoMan.get_netid_from_undoid(undoID); if(!toModifyID.has_value()) return false; auto gridPtr = undoMan.world.netObjMan.get_obj_temporary_ref_from_id(toModifyID.value()); *gridPtr = gridDataNew; undoMan.world.delayedUpdateObjectManager.send_update_to_all(gridPtr, true); return true; } void scale_up(const WorldScalar& scaleAmount) override { gridDataOld.scale_up(scaleAmount); gridDataNew.scale_up(scaleAmount); } ~ModifyGridWorldUndoAction() {} WorldGrid gridDataOld; WorldGrid gridDataNew; WorldUndoManager::UndoObjectID undoID; }; world.undo.push(std::make_unique(oldGridData, *wGrid, world.undo.get_undoid_from_netid(wGrid.get_net_id()))); world.delayedUpdateObjectManager.send_update_to_all(wGrid, true); } void GridManager::draw_back(SkCanvas* canvas, const DrawData& drawData) { if(grids) { for(uint32_t i = 0; i < grids->size(); i++) { auto& g = grids->at(i)->obj; if(!g->displayInFront) g->draw(*this, canvas, drawData); } } } void GridManager::draw_front(SkCanvas* canvas, const DrawData& drawData) { if(grids) { for(uint32_t i = 0; i < grids->size(); i++) { auto& g = grids->at(i)->obj; if(g->displayInFront) g->draw(*this, canvas, drawData); } } } void GridManager::draw_coordinates(SkCanvas* canvas, const DrawData& drawData) { if(grids) { Vector2f axisOffset{0.0f, 0.0f}; for(uint32_t i = 0; i < grids->size(); i++) { auto& g = grids->at(i)->obj; if(g->coordinatesWillBeDrawn && g->coordinatesAxisOnBounds) { g->draw_coordinates(canvas, drawData, axisOffset); g->coordinatesWillBeDrawn = false; } } for(uint32_t i = 0; i < grids->size(); i++) { auto& g = grids->at(i)->obj; if(g->coordinatesWillBeDrawn && !g->coordinatesAxisOnBounds) g->draw_coordinates(canvas, drawData, axisOffset); g->coordinatesWillBeDrawn = false; } } } void GridManager::scale_up(const WorldScalar& scaleUpAmount) { if(grids) { for(uint32_t i = 0; i < grids->size(); i++) grids->at(i)->obj->scale_up(scaleUpAmount); } } void GridManager::save_file(cereal::PortableBinaryOutputArchive& a) const { a(grids->size()); for(auto& item : *grids) a(*item.obj); } void GridManager::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) { grids = world.netObjMan.make_obj>(); if(version >= VersionNumber(0, 4, 0)) { uint32_t gridSize; a(gridSize); for(uint32_t i = 0; i < gridSize; i++) { WorldGrid* g = new WorldGrid; a(*g); grids->push_back_and_send_create(grids, g); } } else if(version >= VersionNumber(0, 2, 0)) { std::unordered_map gridMap; a(gridMap); for(auto& [netID, wGrid] : gridMap) grids->emplace_back_direct(grids, wGrid); } }