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.
This commit is contained in:
Andrzej Kapolka 2013-05-10 17:31:55 -07:00
parent 6223b9537f
commit f0573e6ee5

View file

@ -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