1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-31 23:06:42 +00:00

Allow selecting cell edges everywhere

This commit is contained in:
Nelsson Huotari 2019-11-04 12:16:08 +02:00
parent 8f6dc78217
commit aeb0ccff90
2 changed files with 22 additions and 4 deletions

View file

@ -1038,6 +1038,21 @@ bool CSVRender::TerrainShapeMode::isInCellSelection(int globalSelectionX, int gl
return false; return false;
} }
void CSVRender::TerrainShapeMode::handleSelection(int globalSelectionX, int globalSelectionY, std::vector<std::pair<int, int>>* selections)
{
if (isInCellSelection(globalSelectionX, globalSelectionY)) selections->emplace_back(globalSelectionX, globalSelectionY);
else
{
int moduloX = globalSelectionX % (ESM::Land::LAND_SIZE - 1);
int moduloY = globalSelectionY % (ESM::Land::LAND_SIZE - 1);
bool xIsAtCellBorder = moduloX == 0;
bool yIsAtCellBorder = moduloY == 0;
if (isInCellSelection(globalSelectionX - 1, globalSelectionY) && xIsAtCellBorder && !yIsAtCellBorder) selections->emplace_back(globalSelectionX, globalSelectionY);
if (isInCellSelection(globalSelectionX, globalSelectionY - 1) && !xIsAtCellBorder && yIsAtCellBorder) selections->emplace_back(globalSelectionX, globalSelectionY);
if (isInCellSelection(globalSelectionX - 1, globalSelectionY - 1) && xIsAtCellBorder && yIsAtCellBorder) selections->emplace_back(globalSelectionX, globalSelectionY);
}
}
void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>& vertexCoords, unsigned char selectMode, bool dragOperation) void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>& vertexCoords, unsigned char selectMode, bool dragOperation)
{ {
int r = mBrushSize / 2; int r = mBrushSize / 2;
@ -1045,7 +1060,7 @@ void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>&
if (mBrushShape == CSVWidget::BrushShape_Point) if (mBrushShape == CSVWidget::BrushShape_Point)
{ {
if (isInCellSelection(vertexCoords.first, vertexCoords.second)) selections.emplace_back(vertexCoords.first, vertexCoords.second); handleSelection(vertexCoords.first, vertexCoords.second, &selections);
} }
if (mBrushShape == CSVWidget::BrushShape_Square) if (mBrushShape == CSVWidget::BrushShape_Square)
@ -1054,7 +1069,7 @@ void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>&
{ {
for(int j = vertexCoords.second - r; j <= vertexCoords.second + r; ++j) for(int j = vertexCoords.second - r; j <= vertexCoords.second + r; ++j)
{ {
if (isInCellSelection(i, j)) selections.emplace_back(i, j); handleSelection(i, j, &selections);
} }
} }
} }
@ -1068,7 +1083,7 @@ void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>&
int distanceX = abs(i - vertexCoords.first); int distanceX = abs(i - vertexCoords.first);
int distanceY = abs(j - vertexCoords.second); int distanceY = abs(j - vertexCoords.second);
int distance = std::round(sqrt(pow(distanceX, 2)+pow(distanceY, 2))); int distance = std::round(sqrt(pow(distanceX, 2)+pow(distanceY, 2)));
if (isInCellSelection(i, j) && distance <= r) selections.emplace_back(i, j); if (distance <= r) handleSelection(i, j, &selections);
} }
} }
} }
@ -1081,7 +1096,7 @@ void CSVRender::TerrainShapeMode::selectTerrainShapes(const std::pair<int, int>&
{ {
std::pair<int, int> localVertexCoords (vertexCoords.first + value.first, vertexCoords.second + value.second); std::pair<int, int> localVertexCoords (vertexCoords.first + value.first, vertexCoords.second + value.second);
std::string cellId (CSMWorld::CellCoordinates::vertexGlobalToCellId(localVertexCoords)); std::string cellId (CSMWorld::CellCoordinates::vertexGlobalToCellId(localVertexCoords));
if (isInCellSelection(localVertexCoords.first, localVertexCoords.second)) selections.emplace_back(localVertexCoords); handleSelection(localVertexCoords.first, localVertexCoords.second, &selections);
} }
} }
} }

View file

@ -134,6 +134,9 @@ namespace CSVRender
/// Check if global selection coordinate belongs to cell in view /// Check if global selection coordinate belongs to cell in view
bool isInCellSelection(int globalSelectionX, int globalSelectionY); bool isInCellSelection(int globalSelectionX, int globalSelectionY);
/// Select vertex at global selection coordinate
void handleSelection(int globalSelectionX, int globalSelectionY, std::vector<std::pair<int, int>>* selections);
/// Handle brush mechanics for terrain shape selection /// Handle brush mechanics for terrain shape selection
void selectTerrainShapes (const std::pair<int, int>& vertexCoords, unsigned char selectMode, bool dragOperation); void selectTerrainShapes (const std::pair<int, int>& vertexCoords, unsigned char selectMode, bool dragOperation);