From 252c6bc2868602b4a1420bf136f8e2fec021532a Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 3 Sep 2023 12:01:32 +0300 Subject: [PATCH] refactored underwater cell generation --- map.h | 1 + mapEditorAppState.cpp | 28 +++++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/map.h b/map.h index a07a1fc..4064997 100755 --- a/map.h +++ b/map.h @@ -33,6 +33,7 @@ namespace battleship{ Type type; vb01::Vector3 pos; std::vector edges; + std::vector underWaterCellIds; Cell(){} Cell(vb01::Vector3 p, Type t, std::vector e = std::vector{}): pos(p), type(t), edges(e){} diff --git a/mapEditorAppState.cpp b/mapEditorAppState.cpp index 0a7bc68..c015890 100644 --- a/mapEditorAppState.cpp +++ b/mapEditorAppState.cpp @@ -327,35 +327,37 @@ namespace battleship{ cells.push_back(Map::Cell(pos, type, edges)); } - std::map> waterCellMap; + vector waterCells; int currUnderWaterCellId = cells.size(); int weight = 2; for(pair p : waterBodyBedPoints){ int numUnderWaterCells = (int)((cells[p.first].pos.y - p.second) / cellSize.y); - vector underWaterCellIds; - if(numUnderWaterCells) + if(numUnderWaterCells > 0){ cells[p.first].edges.push_back(Map::Edge(weight, p.first, currUnderWaterCellId)); - for(int i = 0; i < numUnderWaterCells; i++, currUnderWaterCellId++) - underWaterCellIds.push_back(currUnderWaterCellId); + for(int i = 0; i < numUnderWaterCells; i++, currUnderWaterCellId++) + cells[p.first].underWaterCellIds.push_back(currUnderWaterCellId); - waterCellMap[p.first] = underWaterCellIds; + waterCells.push_back(cells[p.first]); + } } + for(int i = 0; i < waterCells.size(); i++){ + for(int j = 0; j < waterCells[i].underWaterCellIds.size(); j++){ + int aboveCellId = (j == 0 ? waterCells[i].edges[0].srcCellId : j - 1); + vector edges = vector{Map::Edge(weight, waterCells[i].underWaterCellIds[j], aboveCellId)}; - for(std::map>::iterator it = waterCellMap.begin(); it != waterCellMap.end(); ++it){ - for(int i = 0; i < waterCellMap[it->first].size(); i++){ - vector edges = vector{Map::Edge(weight, waterCellMap[it->first][i], it->first)}; + for(int k = 0; k < waterCells[i].edges.size(); k++){ + Map::Cell adjacentUnderwaterCell = cells[waterCells[i].edges[k].destCellId]; - for(Map::Edge edge : cells[it->first].edges){ - if(cells[edge.destCellId].type == Map::Cell::Type::WATER && waterCellMap[edge.destCellId].size() >= i){ - edges.push_back(Map::Edge(weight, waterCellMap[it->first][i], waterCellMap[edge.destCellId][i])); + if(adjacentUnderwaterCell.underWaterCellIds.size() >= j - 1){ + edges.push_back(Map::Edge(weight, waterCells[i].underWaterCellIds[j], adjacentUnderwaterCell.underWaterCellIds[j])); } } - Vector3 cellPos = cells[it->first].pos - Vector3::VEC_J * cellSize.y * (i + 1); + Vector3 cellPos = waterCells[i].pos - Vector3::VEC_J * cellSize.y * (j + 1); cells.push_back(Map::Cell(cellPos, Map::Cell::Type::WATER, edges)); } }