0ad/source/tools/atlas/GameInterface/Handlers/Elevation.cpp

66 lines
1.5 KiB
C++

#include "precompiled.h"
#include "MessageHandler.h"
#include "../CommandProc.h"
#include "graphics/Terrain.h"
#include "ps/Game.h"
namespace AtlasMessage {
BEGIN_COMMAND(AlterElevation)
// TODO: much more efficient version of this, and without the memory leaks
u16* OldTerrain;
u16* NewTerrain;
void Construct()
{
OldTerrain = NewTerrain = NULL;
}
void Destruct()
{
delete OldTerrain;
delete NewTerrain;
}
void Do() {
CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
int verts = terrain->GetVerticesPerSide()*terrain->GetVerticesPerSide();
OldTerrain = new u16[verts];
memcpy(OldTerrain, terrain->GetHeightMap(), verts*sizeof(u16));
int x = (int)d->pos.x;
int z = (int)d->pos.z;
terrain->RaiseVertex(x, z, (int)d->amount);
terrain->MakeDirty(x, z, x, z);
}
void Undo() {
CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
if (! NewTerrain)
{
int verts = terrain->GetVerticesPerSide()*terrain->GetVerticesPerSide();
NewTerrain = new u16[verts];
memcpy(NewTerrain, terrain->GetHeightMap(), verts*sizeof(u16));
}
terrain->SetHeightMap(OldTerrain); // CTerrain duplicates the data
}
void Redo() {
CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
terrain->SetHeightMap(NewTerrain); // CTerrain duplicates the data
}
void MergeWithSelf(cAlterElevation* prev) {
std::swap(prev->NewTerrain, NewTerrain);
}
END_COMMAND(AlterElevation);
}