2005-07-03 18:25:48 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
|
|
|
#include "MessageHandler.h"
|
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
#include "../CommandProc.h"
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
#include "graphics/Terrain.h"
|
|
|
|
#include "ps/Game.h"
|
|
|
|
|
|
|
|
namespace AtlasMessage {
|
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
BEGIN_COMMAND(AlterElevation)
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
// TODO: much more efficient version of this, and without the memory leaks
|
|
|
|
u16* OldTerrain;
|
|
|
|
u16* NewTerrain;
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
void Construct()
|
|
|
|
{
|
|
|
|
OldTerrain = NewTerrain = NULL;
|
|
|
|
}
|
|
|
|
void Destruct()
|
|
|
|
{
|
|
|
|
delete OldTerrain;
|
|
|
|
delete NewTerrain;
|
|
|
|
}
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
void Do() {
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
CTerrain* terrain = g_Game->GetWorld()->GetTerrain();
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-08-20 17:44:50 +02:00
|
|
|
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) {
|
2005-08-20 19:37:48 +02:00
|
|
|
std::swap(prev->NewTerrain, NewTerrain);
|
2005-08-20 17:44:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
END_COMMAND(AlterElevation);
|
2005-07-03 18:25:48 +02:00
|
|
|
|
|
|
|
}
|