Adding density to nodes

This commit is contained in:
Philip Rosedale 2013-06-08 14:24:29 -07:00
parent f42f248db2
commit 769383582b
3 changed files with 35 additions and 14 deletions

View file

@ -35,7 +35,7 @@ void VoxelNode::init(unsigned char * octalCode) {
_currentColor[0] = _currentColor[1] = _currentColor[2] = _currentColor[3] = 0; _currentColor[0] = _currentColor[1] = _currentColor[2] = _currentColor[3] = 0;
#endif #endif
_trueColor[0] = _trueColor[1] = _trueColor[2] = _trueColor[3] = 0; _trueColor[0] = _trueColor[1] = _trueColor[2] = _trueColor[3] = 0;
_density = 0.0f;
// default pointers to child nodes to NULL // default pointers to child nodes to NULL
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
@ -165,6 +165,7 @@ void VoxelNode::safeDeepDeleteChildAtIndex(int childIndex, bool& stagedForDeleti
// will average the child colors... // will average the child colors...
void VoxelNode::setColorFromAverageOfChildren() { void VoxelNode::setColorFromAverageOfChildren() {
int colorArray[4] = {0,0,0,0}; int colorArray[4] = {0,0,0,0};
float density = 0.0f;
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
if (_children[i] && !_children[i]->isStagedForDeletion() && _children[i]->isColored()) { if (_children[i] && !_children[i]->isStagedForDeletion() && _children[i]->isColored()) {
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
@ -172,11 +173,27 @@ void VoxelNode::setColorFromAverageOfChildren() {
} }
colorArray[3]++; colorArray[3]++;
} }
if (_children[i]) {
density += _children[i]->getDensity();
}
} }
if (_childCount > 0) {
// If there are children, density is sum of child densities
density /= (float) NUMBER_OF_CHILDREN;
} else {
// If there are no children
density = 1.f;
}
if (colorArray[3] > 0) {
printf("children: %d, density = %4.2f\n", colorArray[3], density);
}
const float VISIBLE_ABOVE_DENSITY = 0.0f;
nodeColor newColor = { 0, 0, 0, 0}; nodeColor newColor = { 0, 0, 0, 0};
if (colorArray[3] > 4) { // if (density > VISIBLE_ABOVE_DENSITY) {
// we need at least 4 colored children to have an average color value if (colorArray[3] > 0) {
// or if we have none we generate random values // The density of material in the space of the voxel sets whether it is actually colored
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
// set the average color value // set the average color value
newColor[c] = colorArray[c] / colorArray[3]; newColor[c] = colorArray[c] / colorArray[3];
@ -188,6 +205,7 @@ void VoxelNode::setColorFromAverageOfChildren() {
// this will be the default value all zeros, and therefore be marked as // this will be the default value all zeros, and therefore be marked as
// transparent with a 4th element of 0 // transparent with a 4th element of 0
setColor(newColor); setColor(newColor);
setDensity(density);
} }
// Note: !NO_FALSE_COLOR implementations of setFalseColor(), setFalseColored(), and setColor() here. // Note: !NO_FALSE_COLOR implementations of setFalseColor(), setFalseColored(), and setColor() here.

View file

@ -36,6 +36,7 @@ private:
unsigned char* _octalCode; unsigned char* _octalCode;
VoxelNode* _children[8]; VoxelNode* _children[8];
int _childCount; int _childCount;
float _density; // If leaf: density = 1, if internal node: 0-1 density of voxels inside
void calculateAABox(); void calculateAABox();
@ -102,11 +103,14 @@ public:
void setColor(const nodeColor& color); void setColor(const nodeColor& color);
const nodeColor& getTrueColor() const { return _trueColor; }; const nodeColor& getTrueColor() const { return _trueColor; };
const nodeColor& getColor() const { return _currentColor; }; const nodeColor& getColor() const { return _currentColor; };
void setDensity(const float density) { _density = density; };
const float getDensity() const { return _density; };
#else #else
void setFalseColor(colorPart red, colorPart green, colorPart blue) { /* no op */ }; void setFalseColor(colorPart red, colorPart green, colorPart blue) { /* no op */ };
void setFalseColored(bool isFalseColored) { /* no op */ }; void setFalseColored(bool isFalseColored) { /* no op */ };
bool getFalseColored() { return false; }; bool getFalseColored() { return false; };
void setColor(const nodeColor& color) { memcpy(_trueColor,color,sizeof(nodeColor)); }; void setColor(const nodeColor& color) { memcpy(_trueColor,color,sizeof(nodeColor)); };
void setDensity(const float density) { _density = density; };
const nodeColor& getTrueColor() const { return _trueColor; }; const nodeColor& getTrueColor() const { return _trueColor; };
const nodeColor& getColor() const { return _trueColor; }; const nodeColor& getColor() const { return _trueColor; };
#endif #endif

View file

@ -387,16 +387,6 @@ void persistVoxelsWhenDirty() {
// check the dirty bit and persist here... // check the dirty bit and persist here...
if (::wantVoxelPersist && ::serverTree.isDirty() && sinceLastTime > VOXEL_PERSIST_INTERVAL) { if (::wantVoxelPersist && ::serverTree.isDirty() && sinceLastTime > VOXEL_PERSIST_INTERVAL) {
{
PerformanceWarning warn(::shouldShowAnimationDebug,
"persistVoxelsWhenDirty() - reaverageVoxelColors()", ::shouldShowAnimationDebug);
// after done inserting all these voxels, then reaverage colors
serverTree.reaverageVoxelColors(serverTree.rootNode);
}
{ {
PerformanceWarning warn(::shouldShowAnimationDebug, PerformanceWarning warn(::shouldShowAnimationDebug,
"persistVoxelsWhenDirty() - writeToSVOFile()", ::shouldShowAnimationDebug); "persistVoxelsWhenDirty() - writeToSVOFile()", ::shouldShowAnimationDebug);
@ -506,6 +496,15 @@ int main(int argc, const char * argv[]) {
if (::wantVoxelPersist) { if (::wantVoxelPersist) {
printf("loading voxels from file...\n"); printf("loading voxels from file...\n");
persistantFileRead = ::serverTree.readFromSVOFile(::wantLocalDomain ? LOCAL_VOXELS_PERSIST_FILE : VOXELS_PERSIST_FILE); persistantFileRead = ::serverTree.readFromSVOFile(::wantLocalDomain ? LOCAL_VOXELS_PERSIST_FILE : VOXELS_PERSIST_FILE);
if (persistantFileRead) {
PerformanceWarning warn(::shouldShowAnimationDebug,
"persistVoxelsWhenDirty() - reaverageVoxelColors()", ::shouldShowAnimationDebug);
// after done inserting all these voxels, then reaverage colors
serverTree.reaverageVoxelColors(serverTree.rootNode);
printf("Voxels reAveraged\n");
}
::serverTree.clearDirtyBit(); // the tree is clean since we just loaded it ::serverTree.clearDirtyBit(); // the tree is clean since we just loaded it
printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead)); printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead));
unsigned long nodeCount = ::serverTree.getVoxelCount(); unsigned long nodeCount = ::serverTree.getVoxelCount();