From d28b47ffb141fb5438b8e32714e7c3b0b43707db Mon Sep 17 00:00:00 2001 From: Titus Tscharntke Date: Tue, 24 May 2011 00:58:21 +0000 Subject: [PATCH] diagonal flipping --- source/glest_map_editor/main.cpp | 12 +++++++++++ source/glest_map_editor/main.h | 2 ++ source/glest_map_editor/program.cpp | 16 ++++++++++++++ source/glest_map_editor/program.h | 1 + source/shared_lib/include/map/map_preview.h | 1 + source/shared_lib/sources/map/map_preview.cpp | 21 +++++++++++++++++++ 6 files changed, 53 insertions(+) diff --git a/source/glest_map_editor/main.cpp b/source/glest_map_editor/main.cpp index dae1d3e0..93510959 100644 --- a/source/glest_map_editor/main.cpp +++ b/source/glest_map_editor/main.cpp @@ -125,6 +125,7 @@ void MainWindow::init(string fname) { // menuEdit->Append(miEditReset, wxT("Rese&t...")); menuEdit->Append(miEditResetPlayers, wxT("Reset &Players...")); menuEdit->Append(miEditResize, wxT("Re&size...")); + menuEdit->Append(miEditFlipDiagonal, wxT("Flip &Diagonal")); menuEdit->Append(miEditFlipX, wxT("Flip &X")); menuEdit->Append(miEditFlipY, wxT("Flip &Y")); @@ -747,6 +748,16 @@ void MainWindow::onMenuEditResetPlayers(wxCommandEvent &event) { setExtension(); } + +void MainWindow::onMenuEditFlipDiagonal(wxCommandEvent &event) { + if(program == NULL) { + return; + } + program->setUndoPoint(ctAll); + program->flipDiagonal(); + setDirty(); +} + void MainWindow::onMenuEditResize(wxCommandEvent &event) { if(program == NULL) { return; @@ -1255,6 +1266,7 @@ BEGIN_EVENT_TABLE(MainWindow, wxFrame) EVT_MENU(miEditRedo, MainWindow::onMenuEditRedo) EVT_MENU(miEditResetPlayers, MainWindow::onMenuEditResetPlayers) EVT_MENU(miEditResize, MainWindow::onMenuEditResize) + EVT_MENU(miEditFlipDiagonal, MainWindow::onMenuEditFlipDiagonal) EVT_MENU(miEditFlipX, MainWindow::onMenuEditFlipX) EVT_MENU(miEditFlipY, MainWindow::onMenuEditFlipY) diff --git a/source/glest_map_editor/main.h b/source/glest_map_editor/main.h index 021cd6ba..2ae20e62 100644 --- a/source/glest_map_editor/main.h +++ b/source/glest_map_editor/main.h @@ -104,6 +104,7 @@ private: miEditReset, miEditResetPlayers, miEditResize, + miEditFlipDiagonal, miEditFlipX, miEditFlipY, @@ -212,6 +213,7 @@ public: void onMenuEditReset(wxCommandEvent &event); void onMenuEditResetPlayers(wxCommandEvent &event); void onMenuEditResize(wxCommandEvent &event); + void onMenuEditFlipDiagonal(wxCommandEvent &event); void onMenuEditFlipX(wxCommandEvent &event); void onMenuEditFlipY(wxCommandEvent &event); diff --git a/source/glest_map_editor/program.cpp b/source/glest_map_editor/program.cpp index 14ffc283..8aab6a63 100644 --- a/source/glest_map_editor/program.cpp +++ b/source/glest_map_editor/program.cpp @@ -483,6 +483,22 @@ void Program::shiftLeft() { map->changeStartLocation(map->getStartLocationX(i)-1, map->getStartLocationY(i), i); // it allready check limits } } + +void Program::flipDiagonal() { + if(map) { + int w=map->getW(); + int h=map->getH(); + for (int i=0; iswapXY(i,j , j,i); + } + for (int i = 0; i < map->getMaxFactions(); ++i) // move players + if (map->getStartLocationX(i) != 0 || map->getStartLocationY(i) != 0) // don't move the unset ones + map->changeStartLocation(map->getStartLocationY(i), map->getStartLocationX(i), i); // it allready check limits + } +} + + void Program::shiftRight() { if(map) { int w=map->getW()-1; diff --git a/source/glest_map_editor/program.h b/source/glest_map_editor/program.h index e4997261..ba70593c 100644 --- a/source/glest_map_editor/program.h +++ b/source/glest_map_editor/program.h @@ -133,6 +133,7 @@ public: void rotatecopyY(); void rotatecopyXY(); void rotatecopyCorner(); + void flipDiagonal(); void shiftLeft(); void shiftRight(); void shiftUp(); diff --git a/source/shared_lib/include/map/map_preview.h b/source/shared_lib/include/map/map_preview.h index d9b05655..887dd491 100644 --- a/source/shared_lib/include/map/map_preview.h +++ b/source/shared_lib/include/map/map_preview.h @@ -171,6 +171,7 @@ public: void flipX(); void flipY(); void copyXY(int x, int y, int sx, int sy); // destination x,y = source sx,sy + void swapXY(int x, int y, int sx, int sy); void reset(int w, int h, float alt, MapSurfaceType surf); void resize(int w, int h, float alt, MapSurfaceType surf); void resetFactions(int maxFactions); diff --git a/source/shared_lib/sources/map/map_preview.cpp b/source/shared_lib/sources/map/map_preview.cpp index 657611f6..409af5c9 100644 --- a/source/shared_lib/sources/map/map_preview.cpp +++ b/source/shared_lib/sources/map/map_preview.cpp @@ -401,6 +401,27 @@ void MapPreview::copyXY(int x, int y, int sx, int sy) { cells[x][y].surface = cells[sx][sy].surface; } +// swap a cell in the map with another, used by rotate etc +void MapPreview::swapXY(int x, int y, int sx, int sy) { + if(inside(x, y) and inside(sx, sy)){ + float tmpHeight= cells[x][y].height; + cells[x][y].height= cells[sx][sy].height; + cells[sx][sy].height= tmpHeight; + + int tmpObject= cells[x][y].object; + cells[x][y].object= cells[sx][sy].object; + cells[sx][sy].object= tmpObject; + + int tmpResource= cells[x][y].resource; + cells[x][y].resource= cells[sx][sy].resource; + cells[sx][sy].resource= tmpResource; + + int tmpSurface= cells[x][y].surface; + cells[x][y].surface= cells[sx][sy].surface; + cells[sx][sy].surface= tmpSurface; + } +} + void MapPreview::changeSurface(int x, int y, MapSurfaceType surface, int radius) { int i, j; int dist;