First cut at improved undo

This commit is contained in:
Atlante45 2014-04-15 16:11:00 -07:00
parent c323249039
commit dd02bae5b3
2 changed files with 70 additions and 18 deletions

View file

@ -17,8 +17,37 @@ AddVoxelCommand::AddVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditP
QUndoCommand("Add Voxel", parent), QUndoCommand("Add Voxel", parent),
_tree(tree), _tree(tree),
_packetSender(packetSender), _packetSender(packetSender),
_voxel(voxel) _voxel(voxel),
_oldTree(NULL)
{ {
VoxelTreeElement* element = _tree->getVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
if (element) {
if (element->hasContent() && element->isLeaf()) {
// Do nothing, everything is in order
} else {
_oldTree = new VoxelTree();
_tree->copySubTreeIntoNewTree(element, _oldTree, true);
}
} else {
glm::vec3 point(_voxel.x + _voxel.s / 2.0f,
_voxel.y + _voxel.s / 2.0f,
_voxel.z + _voxel.s / 2.0f);
OctreeElement* element = _tree->getElementEnclosingPoint(point, Octree::Lock);
if (element) {
VoxelTreeElement* node = static_cast<VoxelTreeElement*>(element);
_voxel.x = node->getCorner().x;
_voxel.y = node->getCorner().y;
_voxel.z = node->getCorner().z;
_voxel.s = node->getScale();
_voxel.red = node->getColor()[0];
_voxel.green = node->getColor()[1];
_voxel.blue = node->getColor()[2];
}
}
}
AddVoxelCommand::~AddVoxelCommand() {
delete _oldTree;
} }
void AddVoxelCommand::redo() { void AddVoxelCommand::redo() {
@ -31,6 +60,11 @@ void AddVoxelCommand::redo() {
} }
void AddVoxelCommand::undo() { void AddVoxelCommand::undo() {
if (_oldTree) {
OctreeElement* element = _tree->getOrCreateChildElementAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
qDebug() << _voxel.x << " " << _voxel.y << " " << _voxel.z << " " << _voxel.s;
_tree->copyFromTreeIntoSubTree(_oldTree, element);
} else {
if (_tree) { if (_tree) {
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s); _tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
} }
@ -38,16 +72,25 @@ void AddVoxelCommand::undo() {
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel); _packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
} }
} }
}
DeleteVoxelCommand::DeleteVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender, QUndoCommand* parent) : DeleteVoxelCommand::DeleteVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender, QUndoCommand* parent) :
QUndoCommand("Delete Voxel", parent), QUndoCommand("Delete Voxel", parent),
_tree(tree), _tree(tree),
_packetSender(packetSender), _packetSender(packetSender),
_voxel(voxel) _voxel(voxel),
_oldTree(NULL)
{ {
} }
DeleteVoxelCommand::~DeleteVoxelCommand() {
delete _oldTree;
}
void DeleteVoxelCommand::redo() { void DeleteVoxelCommand::redo() {
if (_oldTree) {
} else {
if (_tree) { if (_tree) {
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s); _tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
} }
@ -55,8 +98,12 @@ void DeleteVoxelCommand::redo() {
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel); _packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
} }
} }
}
void DeleteVoxelCommand::undo() { void DeleteVoxelCommand::undo() {
if (_oldTree) {
} else {
if (_tree) { if (_tree) {
_tree->createVoxel(_voxel.x, _voxel.y, _voxel.z, _voxel.s, _voxel.red, _voxel.green, _voxel.blue); _tree->createVoxel(_voxel.x, _voxel.y, _voxel.z, _voxel.s, _voxel.red, _voxel.green, _voxel.blue);
} }
@ -64,3 +111,4 @@ void DeleteVoxelCommand::undo() {
_packetSender->queueVoxelEditMessages(PacketTypeVoxelSet, 1, &_voxel); _packetSender->queueVoxelEditMessages(PacketTypeVoxelSet, 1, &_voxel);
} }
} }
}

View file

@ -23,6 +23,7 @@ class VoxelTree;
class AddVoxelCommand : public QUndoCommand { class AddVoxelCommand : public QUndoCommand {
public: public:
AddVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender = NULL, QUndoCommand* parent = NULL); AddVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender = NULL, QUndoCommand* parent = NULL);
~AddVoxelCommand();
virtual void redo(); virtual void redo();
virtual void undo(); virtual void undo();
@ -31,11 +32,13 @@ private:
VoxelTree* _tree; VoxelTree* _tree;
VoxelEditPacketSender* _packetSender; VoxelEditPacketSender* _packetSender;
VoxelDetail _voxel; VoxelDetail _voxel;
VoxelTree* _oldTree;
}; };
class DeleteVoxelCommand : public QUndoCommand { class DeleteVoxelCommand : public QUndoCommand {
public: public:
DeleteVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender = NULL, QUndoCommand* parent = NULL); DeleteVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, VoxelEditPacketSender* packetSender = NULL, QUndoCommand* parent = NULL);
~DeleteVoxelCommand();
virtual void redo(); virtual void redo();
virtual void undo(); virtual void undo();
@ -44,6 +47,7 @@ private:
VoxelTree* _tree; VoxelTree* _tree;
VoxelEditPacketSender* _packetSender; VoxelEditPacketSender* _packetSender;
VoxelDetail _voxel; VoxelDetail _voxel;
VoxelTree* _oldTree;
}; };
#endif // hifi_VoxelTreeCommands_h #endif // hifi_VoxelTreeCommands_h