khanat-opennel-code/code/nel/tools/3d/plugin_max/nel_patch_paint/paint_undo.cpp
2013-02-12 17:35:51 +01:00

206 lines
4.3 KiB
C++

#include "stdafx.h"
#include "nel_patch_paint.h"
#include "paint_undo.h"
#include "paint_to_nel.h"
#include "paint_vcolor.h"
/*-------------------------------------------------------------------*/
void CTileUndo::toUndo ( const CUndoElement& undoList )
{
// Push in the toundo list
_ToUndoList.push_back (undoList);
}
/*-------------------------------------------------------------------*/
// Add undo action
void CTileUndo::pushUndo ()
{
// Resize the array
if (_UndoSize<MAX_UNDO)
_UndoSize++;
// Decal undo list
for (int l=_UndoSize-1; l>0; l--)
// Copy array
_UndoList[l]=_UndoList[l-1];
// Push it in the undo stack
_UndoList[0]=_ToUndoList;
// Clear redo list
_RedoSize=0;
// Clear the toundo list
_ToUndoList.clear();
}
/*-------------------------------------------------------------------*/
// Undo action: return action to performe
void CTileUndo::getUndoList ()
{
// Clear result
_Result.clear ();
// Not empty list
if (_UndoSize>0)
{
// Resize the array
if (_RedoSize<MAX_UNDO)
_RedoSize++;
// Decal redo list
uint l;
for (l=_RedoSize-1; l>0; l--)
// Copy array
_RedoList[l]=_RedoList[l-1];
// Put in the redo list
_RedoList[0]=_UndoList[0];
// Copy return
_Result=_UndoList[0];
// Decal undo list upper
for (l=0; l<_UndoSize-1; l++)
// Copy array
_UndoList[l]=_UndoList[l+1];
// Resize the undo array
_UndoSize--;
}
}
/*-------------------------------------------------------------------*/
// Redo action: return action to performe
void CTileUndo::getRedoList ()
{
// Clear result
_Result.clear ();
// Not empty list
if (_RedoSize>0)
{
// Resize the undo array
if (_UndoSize<MAX_UNDO)
_UndoSize++;
// Decal undo list
uint l;
for (l=_UndoSize-1; l>0; l--)
// Copy array
_UndoList[l]=_UndoList[l-1];
// Put in the redo list
_UndoList[0]=_RedoList[0];
// Copy return
_Result=_RedoList[0];
// Decal undo list upper
for (l=0; l<_RedoSize-1; l++)
// Copy array
_RedoList[l]=_RedoList[l+1];
// Resize the undo array
_RedoSize--;
}
}
/*-------------------------------------------------------------------*/
// Undo
void CTileUndo::undo (EPM_PaintMouseProc& mouseProc, std::vector<EPM_Mesh>& vectMesh, CLandscape* land, PaintPatchMod* pobj, CPaintColor& paintColor)
{
// List to undo
getUndoList ();
// Iterator
std::vector<CUndoElement>::iterator ite=_Result.begin();
// Set of meshes
std::set<int> setMeshes;
// Nel patch changement manager
CNelPatchChanger nelPatchChg (land);
// Iterator
if (_Result.size()!=0)
{
std::vector<CUndoElement>::iterator ite=_Result.end();
// Go undo
do
{
// Previous
ite--;
// Add the mesh
setMeshes.insert (ite->_Mesh);
// Check the good action
if (ite->_Action==UndoTile)
// Set the tile
mouseProc.SetTile (ite->_Mesh, ite->_Tile, ite->_Old._Desc, vectMesh, land, nelPatchChg, false, false);
else if (ite->_Action==UndoColor)
// Set the color
paintColor.setVertexColor (ite->_Mesh, ite->_Old._Patch, ite->_Old._S, ite->_Old._T, ite->_Old._Color, ite->_Old._Blend,
vectMesh, nelPatchChg, false);
}
while (ite!=_Result.begin());
}
// Flush nel chgt
nelPatchChg.applyChanges (true);
// Invalid all meshes
std::set<int>::iterator iteSet=setMeshes.begin();
}
/*-------------------------------------------------------------------*/
// Redo
void CTileUndo::redo (EPM_PaintMouseProc& mouseProc, std::vector<EPM_Mesh>& vectMesh, CLandscape* land, PaintPatchMod* pobj, CPaintColor& paintColor)
{
// List to undo
getRedoList ();
// Set of meshes
std::set<int> setMeshes;
// Nel patch changement manager
CNelPatchChanger nelPatchChg (land);
// First
std::vector<CUndoElement>::iterator ite=_Result.begin();
// Go undo
while (ite!=_Result.end())
{
// Check the good action
if (ite->_Action==UndoTile)
// Set the tile
mouseProc.SetTile (ite->_Mesh, ite->_Tile, ite->_New._Desc, vectMesh, land, nelPatchChg, false, false);
else if (ite->_Action==UndoColor)
// Set the color
paintColor.setVertexColor (ite->_Mesh, ite->_New._Patch, ite->_New._S, ite->_New._T, ite->_New._Color, ite->_New._Blend,
vectMesh, nelPatchChg, false);
// Add the mesh
setMeshes.insert (ite->_Mesh);
// Next
ite++;
}
// Flush nel chgt
nelPatchChg.applyChanges (true);
// Invalid all meshes
std::set<int>::iterator iteSet=setMeshes.begin();
}