History

make VoxelSystem::deleteVoxelAt() work properly

ZappoMan committed 13 years ago

Commit 9dc09de1 parent 57d0b403 files · +31 −4Browse files

Showing the changes to interface/src/VoxelSystem.cpp (1 of 3 files). Show all

Unified · Split

interface/src/VoxelSystem.cpp+23−4
@@ -232,7 +232,7 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) { · 231 unmodified lines
232232 bool inChildBoundary = (distanceToNode <= childBoundary);
233233 shouldRender = (node->isLeaf() && inChildBoundary) || (inBoundary && !inChildBoundary);
234234 }
235− node->setShouldRender(shouldRender);
235+ node->setShouldRender(shouldRender && !node->deleteMe());
236236 // let children figure out their renderness
237237 for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
238238 if (node->getChildAtIndex(i)) {
@@ -244,6 +244,15 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) { · 5 unmodified lines
244244 } else {
245245 voxelsUpdated += updateNodeInArraysAsPartialVBO(node);
246246 }
247+
248+ // If the node has been asked to be deleted, but we've gotten to here, after updateNodeInArraysXXX()
249+ // then it means our VBOs are "clean" and our vertices have been removed or not added. So we can now
250+ // safely remove the node from the tree and actually delete it.
251+ // otherwise honor our calculated shouldRender
252+ if (node->deleteMe()) {
253+ _tree->deleteVoxelCodeFromTree(node->getOctalCode());
254+ }
255+
247256 node->clearDirtyBit(); // always clear the dirty bit, even if it doesn't need to be rendered
248257 return voxelsUpdated;
249258 }
@@ -901,9 +910,19 @@ void VoxelSystem::collectStatsForTreesAndVBOs() { · 651 unmodified lines
901910
902911
903912 void VoxelSystem::deleteVoxelAt(float x, float y, float z, float s) {
904− //printLog("VoxelSystem::deleteVoxelAt(%f,%f,%f,%f)\n",x,y,z,s);
905− _tree->deleteVoxelAt(x, y, z, s);
906− setupNewVoxelsForDrawing();
913+ printLog("VoxelSystem::deleteVoxelAt(%f,%f,%f,%f)\n",x,y,z,s);
914+
915+ VoxelNode* node = _tree->getVoxelAt(x, y, z, s);
916+ if (node) {
917+ // tell the node we want it deleted
918+ node->pleaseDeleteMe();
919+
920+ // tree is now dirty
921+ _tree->setDirtyBit();
922+
923+ // redraw!
924+ setupNewVoxelsForDrawing(); // do we even need to do this? Or will the next network receive kick in?
925+ }
907926 };
908927
909928 VoxelNode* VoxelSystem::getVoxelAt(float x, float y, float z, float s) const {