From f0573e6ee5929f4596215d3d9797cfd9c036eb45 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 10 May 2013 17:31:55 -0700 Subject: [PATCH] When we add (or recolor) a voxel, make sure it has no children. When we attempt to remove a voxel that would be a child of a larger solid one, carve up the parent. --- libraries/voxels/src/VoxelTree.cpp | 33 ++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 0120c7bfe1..794851c04d 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -254,6 +254,34 @@ void VoxelTree::deleteVoxelCodeFromTree(unsigned char *codeBuffer) { reaverageVoxelColors(rootNode); // Fix our colors!! Need to call it on rootNode _isDirty = true; } + } else { + // we need to break up ancestors until we get to the right level + if (!nodeToDelete->isColored()) { + return; + } + nodeColor color; + nodeColor noColor; + memcpy(color, nodeToDelete->getColor(), sizeof(nodeColor)); + memcpy(noColor, nodeToDelete->getColor(), sizeof(nodeColor)); + noColor[3] = 0; + + while (true) { + nodeToDelete->setColor(noColor); + int index = branchIndexWithDescendant(nodeToDelete->getOctalCode(), codeBuffer); + for (int i = 0; i < 8; i++) { + if (i != index) { + nodeToDelete->addChildAtIndex(i); + nodeToDelete->getChildAtIndex(i)->setColor(color); + } + } + if (*nodeToDelete->getOctalCode() == *codeBuffer - 1) { + break; + } + nodeToDelete->addChildAtIndex(index); + nodeToDelete = nodeToDelete->getChildAtIndex(index); + } + reaverageVoxelColors(rootNode); + _isDirty = true; } } @@ -271,6 +299,11 @@ void VoxelTree::readCodeColorBufferToTree(unsigned char *codeColorBuffer) { if (*lastCreatedNode->getOctalCode() != *codeColorBuffer) { lastCreatedNode = createMissingNode(lastCreatedNode, codeColorBuffer); _isDirty = true; + } else { + // if it does exist, make sure it has no children + for (int i = 0; i < 8; i++) { + lastCreatedNode->deleteChildAtIndex(i); + } } // give this node its color