Undo/Snapshots, fixes #118
This commit is contained in:
parent
f19c7f62c7
commit
edad8f46af
@ -23,6 +23,7 @@
|
|||||||
#include "save/LocalSaveActivity.h"
|
#include "save/LocalSaveActivity.h"
|
||||||
#include "save/ServerSaveActivity.h"
|
#include "save/ServerSaveActivity.h"
|
||||||
#include "interface/Keys.h"
|
#include "interface/Keys.h"
|
||||||
|
#include "simulation/Snapshot.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -187,6 +188,40 @@ GameController::~GameController()
|
|||||||
delete gameView;
|
delete gameView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameController::HistoryRestore()
|
||||||
|
{
|
||||||
|
std::deque<Snapshot*> history = gameModel->GetHistory();
|
||||||
|
if(history.size())
|
||||||
|
{
|
||||||
|
Snapshot * snap = history.back();
|
||||||
|
gameModel->GetSimulation()->Restore(*snap);
|
||||||
|
if(history.size()>1)
|
||||||
|
{
|
||||||
|
history.pop_back();
|
||||||
|
delete snap;
|
||||||
|
gameModel->SetHistory(history);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameController::HistorySnapshot()
|
||||||
|
{
|
||||||
|
std::deque<Snapshot*> history = gameModel->GetHistory();
|
||||||
|
Snapshot * newSnap = gameModel->GetSimulation()->CreateSnapshot();
|
||||||
|
if(newSnap)
|
||||||
|
{
|
||||||
|
if(history.size() >= 1) //History limit is current 1
|
||||||
|
{
|
||||||
|
Snapshot * snap = history.front();
|
||||||
|
history.pop_front();
|
||||||
|
//snap->Particles.clear();
|
||||||
|
delete snap;
|
||||||
|
}
|
||||||
|
history.push_back(newSnap);
|
||||||
|
gameModel->SetHistory(history);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GameView * GameController::GetView()
|
GameView * GameController::GetView()
|
||||||
{
|
{
|
||||||
return gameView;
|
return gameView;
|
||||||
|
@ -69,6 +69,9 @@ public:
|
|||||||
|
|
||||||
void Install();
|
void Install();
|
||||||
|
|
||||||
|
void HistoryRestore();
|
||||||
|
void HistorySnapshot();
|
||||||
|
|
||||||
void AdjustGridSize(int direction);
|
void AdjustGridSize(int direction);
|
||||||
void InvertAirSim();
|
void InvertAirSim();
|
||||||
void LoadRenderPreset(RenderPreset preset);
|
void LoadRenderPreset(RenderPreset preset);
|
||||||
|
@ -253,6 +253,15 @@ void GameModel::BuildMenus()
|
|||||||
notifyLastToolChanged();
|
notifyLastToolChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::deque<Snapshot*> GameModel::GetHistory()
|
||||||
|
{
|
||||||
|
return history;
|
||||||
|
}
|
||||||
|
void GameModel::SetHistory(std::deque<Snapshot*> newHistory)
|
||||||
|
{
|
||||||
|
history = newHistory;
|
||||||
|
}
|
||||||
|
|
||||||
void GameModel::SetVote(int direction)
|
void GameModel::SetVote(int direction)
|
||||||
{
|
{
|
||||||
if(currentSave)
|
if(currentSave)
|
||||||
|
@ -57,6 +57,7 @@ private:
|
|||||||
bool colourSelector;
|
bool colourSelector;
|
||||||
ui::Colour colour;
|
ui::Colour colour;
|
||||||
float toolStrength;
|
float toolStrength;
|
||||||
|
std::deque<Snapshot*> history;
|
||||||
|
|
||||||
std::string infoTip;
|
std::string infoTip;
|
||||||
std::string toolTip;
|
std::string toolTip;
|
||||||
@ -100,6 +101,9 @@ public:
|
|||||||
void BuildMenus();
|
void BuildMenus();
|
||||||
void BuildQuickOptionMenu();
|
void BuildQuickOptionMenu();
|
||||||
|
|
||||||
|
std::deque<Snapshot*> GetHistory();
|
||||||
|
void SetHistory(std::deque<Snapshot*> newHistory);
|
||||||
|
|
||||||
void UpdateQuickOptions();
|
void UpdateQuickOptions();
|
||||||
|
|
||||||
void SetToolStrength(float value);
|
void SetToolStrength(float value);
|
||||||
|
@ -984,6 +984,8 @@ void GameView::OnMouseDown(int x, int y, unsigned button)
|
|||||||
if(button == BUTTON_MIDDLE)
|
if(button == BUTTON_MIDDLE)
|
||||||
toolIndex = 2;
|
toolIndex = 2;
|
||||||
isMouseDown = true;
|
isMouseDown = true;
|
||||||
|
if(!pointQueue.size())
|
||||||
|
c->HistorySnapshot();
|
||||||
if(drawMode == DrawRect || drawMode == DrawLine)
|
if(drawMode == DrawRect || drawMode == DrawLine)
|
||||||
{
|
{
|
||||||
drawPoint1 = ui::Point(x, y);
|
drawPoint1 = ui::Point(x, y);
|
||||||
@ -1230,9 +1232,16 @@ void GameView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool
|
|||||||
c->ChangeBrush();
|
c->ChangeBrush();
|
||||||
break;
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
isMouseDown = false;
|
if(ctrl)
|
||||||
zoomCursorFixed = false;
|
{
|
||||||
c->SetZoomEnabled(true);
|
c->HistoryRestore();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isMouseDown = false;
|
||||||
|
zoomCursorFixed = false;
|
||||||
|
c->SetZoomEnabled(true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case '`':
|
case '`':
|
||||||
c->ShowConsole();
|
c->ShowConsole();
|
||||||
@ -1384,8 +1393,11 @@ void GameView::OnKeyRelease(int key, Uint16 character, bool shift, bool ctrl, bo
|
|||||||
disableShiftBehaviour();
|
disableShiftBehaviour();
|
||||||
break;
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
if(!zoomCursorFixed && !alt)
|
if(!ctrl)
|
||||||
c->SetZoomEnabled(false);
|
{
|
||||||
|
if(!zoomCursorFixed && !alt)
|
||||||
|
c->SetZoomEnabled(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "game/Brush.h"
|
#include "game/Brush.h"
|
||||||
#include "client/GameSave.h"
|
#include "client/GameSave.h"
|
||||||
#include "Sample.h"
|
#include "Sample.h"
|
||||||
|
#include "Snapshot.h"
|
||||||
//#include "StorageClasses.h"
|
//#include "StorageClasses.h"
|
||||||
|
|
||||||
#undef LUACONSOLE
|
#undef LUACONSOLE
|
||||||
@ -214,6 +215,44 @@ GameSave * Simulation::Save(int fullX, int fullY, int fullX2, int fullY2)
|
|||||||
return newSave;
|
return newSave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Snapshot * Simulation::CreateSnapshot()
|
||||||
|
{
|
||||||
|
Snapshot * snap = new Snapshot();
|
||||||
|
snap->AirPressure.insert(snap->AirPressure.begin(), &pv[0][0], &pv[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->AirVelocityX.insert(snap->AirVelocityX.begin(), &vx[0][0], &vx[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->AirVelocityY.insert(snap->AirVelocityY.begin(), &vy[0][0], &vy[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->Particles.insert(snap->Particles.begin(), parts, parts+NPART);
|
||||||
|
snap->PortalParticles.insert(snap->PortalParticles.begin(), &portalp[0][0][0], &portalp[CHANNELS-1][8-1][80-1]);
|
||||||
|
snap->WirelessData.insert(snap->WirelessData.begin(), &wireless[0][0], &wireless[CHANNELS-1][2-1]);
|
||||||
|
snap->GravVelocityX.insert(snap->GravVelocityX.begin(), gravx, gravx+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->GravVelocityY.insert(snap->GravVelocityY.begin(), gravy, gravy+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->GravValue.insert(snap->GravValue.begin(), gravp, gravp+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->GravMap.insert(snap->GravMap.begin(), gravmap, gravmap+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->BlockMap.insert(snap->BlockMap.begin(), &bmap[0][0], &bmap[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->ElecMap.insert(snap->ElecMap.begin(), &emap[0][0], &emap[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->FanVelocityX.insert(snap->FanVelocityX.begin(), &fvx[0][0], &fvx[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
snap->FanVelocityY.insert(snap->FanVelocityY.begin(), &fvy[0][0], &fvy[0][0]+((XRES/CELL)*(YRES/CELL)));
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Simulation::Restore(const Snapshot & snap)
|
||||||
|
{
|
||||||
|
std::copy(snap.AirPressure.begin(), snap.AirPressure.end(), &pv[0][0]);
|
||||||
|
std::copy(snap.AirVelocityX.begin(), snap.AirVelocityX.end(), &vx[0][0]);
|
||||||
|
std::copy(snap.AirVelocityY.begin(), snap.AirVelocityY.end(), &vy[0][0]);
|
||||||
|
std::copy(snap.Particles.begin(), snap.Particles.end(), parts);
|
||||||
|
std::copy(snap.PortalParticles.begin(), snap.PortalParticles.end(), &portalp[0][0][0]);
|
||||||
|
std::copy(snap.WirelessData.begin(), snap.WirelessData.end(), &wireless[0][0]);
|
||||||
|
std::copy(snap.GravVelocityX.begin(), snap.GravVelocityX.end(), gravx);
|
||||||
|
std::copy(snap.GravVelocityY.begin(), snap.GravVelocityY.end(), gravy);
|
||||||
|
std::copy(snap.GravValue.begin(), snap.GravValue.end(), gravp);
|
||||||
|
std::copy(snap.GravMap.begin(), snap.GravMap.end(), gravmap);
|
||||||
|
std::copy(snap.BlockMap.begin(), snap.BlockMap.end(), &bmap[0][0]);
|
||||||
|
std::copy(snap.ElecMap.begin(), snap.ElecMap.end(), &emap[0][0]);
|
||||||
|
std::copy(snap.FanVelocityX.begin(), snap.FanVelocityX.end(), &fvx[0][0]);
|
||||||
|
std::copy(snap.FanVelocityY.begin(), snap.FanVelocityY.end(), &fvy[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
/*int Simulation::Load(unsigned char * data, int dataLength)
|
/*int Simulation::Load(unsigned char * data, int dataLength)
|
||||||
{
|
{
|
||||||
return SaveLoader::Load(data, dataLength, this, true, 0, 0);
|
return SaveLoader::Load(data, dataLength, this, true, 0, 0);
|
||||||
@ -4577,4 +4616,4 @@ Simulation::Simulation():
|
|||||||
clear_sim();
|
clear_sim();
|
||||||
|
|
||||||
grav->gravity_mask();
|
grav->gravity_mask();
|
||||||
}
|
}
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#define CHANNELS ((int)(MAX_TEMP-73)/100+2)
|
#define CHANNELS ((int)(MAX_TEMP-73)/100+2)
|
||||||
|
|
||||||
|
class Snapshot;
|
||||||
class Element;
|
class Element;
|
||||||
class SimTool;
|
class SimTool;
|
||||||
class Brush;
|
class Brush;
|
||||||
@ -122,6 +123,10 @@ public:
|
|||||||
GameSave * Save();
|
GameSave * Save();
|
||||||
GameSave * Save(int x1, int y1, int x2, int y2);
|
GameSave * Save(int x1, int y1, int x2, int y2);
|
||||||
SimulationSample Get(int x, int y);
|
SimulationSample Get(int x, int y);
|
||||||
|
|
||||||
|
Snapshot * CreateSnapshot();
|
||||||
|
void Restore(const Snapshot & snap);
|
||||||
|
|
||||||
inline int is_blocking(int t, int x, int y);
|
inline int is_blocking(int t, int x, int y);
|
||||||
inline int is_boundary(int pt, int x, int y);
|
inline int is_boundary(int pt, int x, int y);
|
||||||
inline int find_next_boundary(int pt, int *x, int *y, int dm, int *em);
|
inline int find_next_boundary(int pt, int *x, int *y, int dm, int *em);
|
||||||
|
53
src/simulation/Snapshot.h
Normal file
53
src/simulation/Snapshot.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Particle.h"
|
||||||
|
|
||||||
|
class Snapshot
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<float> AirPressure;
|
||||||
|
std::vector<float> AirVelocityX;
|
||||||
|
std::vector<float> AirVelocityY;
|
||||||
|
|
||||||
|
std::vector<Particle> Particles;
|
||||||
|
std::vector<Particle> PortalParticles;
|
||||||
|
|
||||||
|
std::vector<int> WirelessData;
|
||||||
|
|
||||||
|
std::vector<float> GravVelocityX;
|
||||||
|
std::vector<float> GravVelocityY;
|
||||||
|
std::vector<float> GravValue;
|
||||||
|
std::vector<float> GravMap;
|
||||||
|
|
||||||
|
std::vector<unsigned char> BlockMap;
|
||||||
|
std::vector<unsigned char> ElecMap;
|
||||||
|
|
||||||
|
std::vector<float> FanVelocityX;
|
||||||
|
std::vector<float> FanVelocityY;
|
||||||
|
|
||||||
|
Snapshot() :
|
||||||
|
AirPressure(),
|
||||||
|
AirVelocityX(),
|
||||||
|
AirVelocityY(),
|
||||||
|
Particles(),
|
||||||
|
PortalParticles(),
|
||||||
|
WirelessData(),
|
||||||
|
GravVelocityX(),
|
||||||
|
GravVelocityY(),
|
||||||
|
GravValue(),
|
||||||
|
GravMap(),
|
||||||
|
BlockMap(),
|
||||||
|
ElecMap(),
|
||||||
|
FanVelocityX(),
|
||||||
|
FanVelocityY()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~Snapshot()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user