fixed reaverageVoxelColors() behavior. seems to work better now

This commit is contained in:
ZappoMan 2013-04-05 13:18:06 -07:00
parent 16ad4fc220
commit 12e06135bb
4 changed files with 16 additions and 37 deletions

View file

@ -37,25 +37,20 @@ void VoxelNode::addChildAtIndex(int childIndex) {
} }
// will average the child colors... // will average the child colors...
void VoxelNode::setColorFromAverageOfChildren(int * colorArray) { void VoxelNode::setColorFromAverageOfChildren() {
if (colorArray == NULL) { int colorArray[4] = {0,0,0,0};
colorArray = new int[4]; for (int i = 0; i < 8; i++) {
memset(colorArray, 0, 4*sizeof(int)); if (children[i] != NULL && children[i]->color[3] == 1) {
for (int j = 0; j < 3; j++) {
for (int i = 0; i < 8; i++) { colorArray[j] += children[i]->color[j];
if (children[i] != NULL && children[i]->color[3] == 1) { }
for (int j = 0; j < 3; j++) { colorArray[3]++;
colorArray[j] += children[i]->color[j]; }
} }
colorArray[3]++;
}
}
}
if (colorArray[3] > 4) { if (colorArray[3] > 4) {
// we need at least 4 colored children to have an average color value // we need at least 4 colored children to have an average color value
// or if we have none we generate random values // or if we have none we generate random values
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
// set the average color value // set the average color value
color[c] = colorArray[c] / colorArray[3]; color[c] = colorArray[c] / colorArray[3];

View file

@ -17,7 +17,7 @@ public:
~VoxelNode(); ~VoxelNode();
void addChildAtIndex(int childIndex); void addChildAtIndex(int childIndex);
void setColorFromAverageOfChildren(int * colorArray = NULL); void setColorFromAverageOfChildren();
void setRandomColor(int minimumBrightness); void setRandomColor(int minimumBrightness);
bool collapseIdenticalLeaves(); bool collapseIdenticalLeaves();

View file

@ -100,8 +100,6 @@ int VoxelTree::readNodeData(VoxelNode *destinationNode,
// instantiate variable for bytes already read // instantiate variable for bytes already read
int bytesRead = 1; int bytesRead = 1;
int colorArray[4] = {};
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
// check the colors mask to see if we have a child to color in // check the colors mask to see if we have a child to color in
if (oneAtBit(*nodeData, i)) { if (oneAtBit(*nodeData, i)) {
@ -115,17 +113,12 @@ int VoxelTree::readNodeData(VoxelNode *destinationNode,
memcpy(destinationNode->children[i]->color, nodeData + bytesRead, 3); memcpy(destinationNode->children[i]->color, nodeData + bytesRead, 3);
destinationNode->children[i]->color[3] = 1; destinationNode->children[i]->color[3] = 1;
for (int j = 0; j < 3; j++) {
colorArray[j] += destinationNode->children[i]->color[j];
}
bytesRead += 3; bytesRead += 3;
colorArray[3]++;
} }
} }
// average node's color based on color of children // average node's color based on color of children
destinationNode->setColorFromAverageOfChildren(colorArray); destinationNode->setColorFromAverageOfChildren();
// give this destination node the child mask from the packet // give this destination node the child mask from the packet
unsigned char childMask = *(nodeData + bytesRead); unsigned char childMask = *(nodeData + bytesRead);

View file

@ -85,8 +85,6 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) {
if (levelsToGo > 0) { if (levelsToGo > 0) {
bool createdChildren = false; bool createdChildren = false;
int colorArray[4] = {};
createdChildren = false; createdChildren = false;
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
@ -96,17 +94,8 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) {
// give this child it's octal code // give this child it's octal code
currentRootNode->children[i]->octalCode = childOctalCode(currentRootNode->octalCode, i); currentRootNode->children[i]->octalCode = childOctalCode(currentRootNode->octalCode, i);
randomlyFillVoxelTree(levelsToGo - 1, currentRootNode->children[i]);
if (currentRootNode->children[i]->color[3] == 1) { randomlyFillVoxelTree(levelsToGo - 1, currentRootNode->children[i]);
for (int c = 0; c < 3; c++) {
colorArray[c] += currentRootNode->children[i]->color[c];
}
colorArray[3]++;
}
createdChildren = true; createdChildren = true;
} }
} }
@ -117,7 +106,7 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) {
currentRootNode->setRandomColor(MIN_BRIGHTNESS); currentRootNode->setRandomColor(MIN_BRIGHTNESS);
} else { } else {
// set the color value for this node // set the color value for this node
currentRootNode->setColorFromAverageOfChildren(colorArray); currentRootNode->setColorFromAverageOfChildren();
} }
} else { } else {
// this is a leaf node, just give it a color // this is a leaf node, just give it a color
@ -316,6 +305,8 @@ int main(int argc, const char * argv[])
pVoxelData+=voxelDataSize; pVoxelData+=voxelDataSize;
atByte+=voxelDataSize; atByte+=voxelDataSize;
} }
// after done inserting all these voxels, then reaverage colors
randomTree.reaverageVoxelColors(randomTree.rootNode);
} }
if (packetData[0] == 'R') { if (packetData[0] == 'R') {