mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-15 22:16:57 +02:00
First cut at improved undo
This commit is contained in:
parent
c323249039
commit
dd02bae5b3
2 changed files with 70 additions and 18 deletions
|
@ -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,11 +60,17 @@ void AddVoxelCommand::redo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddVoxelCommand::undo() {
|
void AddVoxelCommand::undo() {
|
||||||
if (_tree) {
|
if (_oldTree) {
|
||||||
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
|
OctreeElement* element = _tree->getOrCreateChildElementAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
|
||||||
}
|
qDebug() << _voxel.x << " " << _voxel.y << " " << _voxel.z << " " << _voxel.s;
|
||||||
if (_packetSender) {
|
_tree->copyFromTreeIntoSubTree(_oldTree, element);
|
||||||
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
|
} else {
|
||||||
|
if (_tree) {
|
||||||
|
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
|
||||||
|
}
|
||||||
|
if (_packetSender) {
|
||||||
|
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,24 +78,37 @@ DeleteVoxelCommand::DeleteVoxelCommand(VoxelTree* tree, VoxelDetail& voxel, Voxe
|
||||||
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 (_tree) {
|
if (_oldTree) {
|
||||||
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
|
|
||||||
}
|
} else {
|
||||||
if (_packetSender) {
|
if (_tree) {
|
||||||
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
|
_tree->deleteVoxelAt(_voxel.x, _voxel.y, _voxel.z, _voxel.s);
|
||||||
|
}
|
||||||
|
if (_packetSender) {
|
||||||
|
_packetSender->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &_voxel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeleteVoxelCommand::undo() {
|
void DeleteVoxelCommand::undo() {
|
||||||
if (_tree) {
|
if (_oldTree) {
|
||||||
_tree->createVoxel(_voxel.x, _voxel.y, _voxel.z, _voxel.s, _voxel.red, _voxel.green, _voxel.blue);
|
|
||||||
}
|
} else {
|
||||||
if (_packetSender) {
|
if (_tree) {
|
||||||
_packetSender->queueVoxelEditMessages(PacketTypeVoxelSet, 1, &_voxel);
|
_tree->createVoxel(_voxel.x, _voxel.y, _voxel.z, _voxel.s, _voxel.red, _voxel.green, _voxel.blue);
|
||||||
|
}
|
||||||
|
if (_packetSender) {
|
||||||
|
_packetSender->queueVoxelEditMessages(PacketTypeVoxelSet, 1, &_voxel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue