optimized performance of VoxelNode::isLeaf()

This commit is contained in:
ZappoMan 2013-05-10 14:32:44 -07:00
parent b9a023af37
commit ef20b3e4b3
3 changed files with 28 additions and 18 deletions

View file

@ -292,6 +292,7 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) {
assert(_viewFrustum); // you must set up _viewFrustum before calling this
int voxelsUpdated = 0;
bool shouldRender = false; // assume we don't need to render it
bool isLeaf = node->isLeaf();
// if it's colored, we might need to render it!
if (node->isColored()) {
float distanceToNode = node->distanceToCamera(*_viewFrustum);
@ -299,13 +300,15 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) {
float childBoundary = boundaryDistanceForRenderLevel(node->getLevel() + 1);
bool inBoundary = (distanceToNode <= boundary);
bool inChildBoundary = (distanceToNode <= childBoundary);
shouldRender = (node->isLeaf() && inChildBoundary) || (inBoundary && !inChildBoundary);
shouldRender = (isLeaf && inChildBoundary) || (inBoundary && !inChildBoundary);
}
node->setShouldRender(shouldRender && !node->isStagedForDeletion());
// let children figure out their renderness
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
if (node->getChildAtIndex(i)) {
voxelsUpdated += newTreeToArrays(node->getChildAtIndex(i));
if (!isLeaf) {
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
if (node->getChildAtIndex(i)) {
voxelsUpdated += newTreeToArrays(node->getChildAtIndex(i));
}
}
}
if (_renderFullVBO) {
@ -886,7 +889,8 @@ public:
coloredNodes(0),
nodesInVBO(0),
nodesInVBOOverExpectedMax(0),
duplicateVBOIndex(0)
duplicateVBOIndex(0),
leafNodes(0)
{
memset(hasIndexFound, false, MAX_VOXELS_PER_SYSTEM * sizeof(bool));
};
@ -898,9 +902,10 @@ public:
unsigned long nodesInVBO;
unsigned long nodesInVBOOverExpectedMax;
unsigned long duplicateVBOIndex;
unsigned long leafNodes;
unsigned long expectedMax;
bool colorThis;
bool hasIndexFound[MAX_VOXELS_PER_SYSTEM];
};
@ -908,6 +913,10 @@ bool VoxelSystem::collectStatsForTreesAndVBOsOperation(VoxelNode* node, void* ex
collectStatsForTreesAndVBOsArgs* args = (collectStatsForTreesAndVBOsArgs*)extraData;
args->totalNodes++;
if (node->isLeaf()) {
args->leafNodes++;
}
if (node->isColored()) {
args->coloredNodes++;
}
@ -939,6 +948,7 @@ bool VoxelSystem::collectStatsForTreesAndVBOsOperation(VoxelNode* node, void* ex
}
void VoxelSystem::collectStatsForTreesAndVBOs() {
PerformanceWarning warn(true, "collectStatsForTreesAndVBOs()", true);
glBufferIndex minDirty = GLBUFFER_INDEX_UNKNOWN;
glBufferIndex maxDirty = 0;
@ -957,8 +967,10 @@ void VoxelSystem::collectStatsForTreesAndVBOs() {
printLog("_voxelsDirty=%s _voxelsInWriteArrays=%ld minDirty=%ld maxDirty=%ld \n", (_voxelsDirty ? "yes" : "no"),
_voxelsInWriteArrays, minDirty, maxDirty);
printLog("stats: total %ld, dirty %ld, colored %ld, shouldRender %ld, inVBO %ld, nodesInVBOOverExpectedMax %ld, duplicateVBOIndex %ld\n",
args.totalNodes, args.dirtyNodes, args.coloredNodes, args.shouldRenderNodes,
printLog("stats: total %ld, leaves %ld, dirty %ld, colored %ld, shouldRender %ld, inVBO %ld\n",
args.totalNodes, args.leafNodes, args.dirtyNodes, args.coloredNodes, args.shouldRenderNodes);
printLog("inVBO %ld, nodesInVBOOverExpectedMax %ld, duplicateVBOIndex %ld\n",
args.nodesInVBO, args.nodesInVBOOverExpectedMax, args.duplicateVBOIndex);
glBufferIndex minInVBO = GLBUFFER_INDEX_UNKNOWN;

View file

@ -40,6 +40,7 @@ void VoxelNode::init(unsigned char * octalCode) {
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
_children[i] = NULL;
}
_childCount = 0;
_glBufferIndex = GLBUFFER_INDEX_UNKNOWN;
_isDirty = true;
@ -87,6 +88,8 @@ void VoxelNode::deleteChildAtIndex(int childIndex) {
if (_children[childIndex]) {
delete _children[childIndex];
_children[childIndex] = NULL;
_isDirty = true;
_childCount--;
}
}
@ -96,6 +99,7 @@ VoxelNode* VoxelNode::removeChildAtIndex(int childIndex) {
if (_children[childIndex]) {
_children[childIndex] = NULL;
_isDirty = true;
_childCount--;
}
return returnedChild;
}
@ -111,6 +115,7 @@ void VoxelNode::addChildAtIndex(int childIndex) {
_children[childIndex]->setFalseColored(false);
_isDirty = true;
_childCount++;
}
}
@ -215,6 +220,7 @@ bool VoxelNode::collapseIdenticalLeaves() {
delete _children[i]; // delete all the child nodes
_children[i]=NULL; // set it to NULL
}
_childCount = 0;
nodeColor collapsedColor;
collapsedColor[0]=red;
collapsedColor[1]=green;
@ -235,15 +241,6 @@ void VoxelNode::setRandomColor(int minimumBrightness) {
setColor(newColor);
}
bool VoxelNode::isLeaf() const {
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
if (_children[i]) {
return false;
}
}
return true;
}
void VoxelNode::printDebugDetails(const char* label) const {
printLog("%s - Voxel at corner=(%f,%f,%f) size=%f octcode=", label,
_box.getCorner().x, _box.getCorner().y, _box.getCorner().z, _box.getSize().x);

View file

@ -31,6 +31,7 @@ private:
AABox _box;
unsigned char* _octalCode;
VoxelNode* _children[8];
int _childCount;
void calculateAABox();
@ -60,7 +61,7 @@ public:
bool isInView(const ViewFrustum& viewFrustum) const;
ViewFrustum::location inFrustum(const ViewFrustum& viewFrustum) const;
float distanceToCamera(const ViewFrustum& viewFrustum) const;
bool isLeaf() const;
bool isLeaf() const { return _childCount == 0; }
void printDebugDetails(const char* label) const;
bool isDirty() const { return _isDirty; };
void clearDirtyBit() { _isDirty = false; };