more render pipeline optimizations

This commit is contained in:
ZappoMan 2013-05-02 18:12:55 -07:00
parent fcce4753c9
commit 771c604121
4 changed files with 36 additions and 10 deletions

View file

@ -101,6 +101,11 @@ int VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) {
double start = usecTimestampNow(); double start = usecTimestampNow();
// ask the VoxelTree to read the bitstream into the tree // ask the VoxelTree to read the bitstream into the tree
_tree->readBitstreamToTree(voxelData, numBytes - 1); _tree->readBitstreamToTree(voxelData, numBytes - 1);
if (_renderWarningsOn && _tree->getNodesChangedFromBitstream()) {
printLog("readBitstreamToTree()... getNodesChangedFromBitstream=%ld _tree->isDirty()=%s \n",
_tree->getNodesChangedFromBitstream(), (_tree->isDirty() ? "yes" : "no") );
}
double end = usecTimestampNow(); double end = usecTimestampNow();
double elapsedmsec = (end - start)/1000.0; double elapsedmsec = (end - start)/1000.0;
if (_renderWarningsOn && elapsedmsec > 1) { if (_renderWarningsOn && elapsedmsec > 1) {
@ -178,7 +183,7 @@ void VoxelSystem::setupNewVoxelsForDrawing() {
void VoxelSystem::copyWrittenDataToReadArrays() { void VoxelSystem::copyWrittenDataToReadArrays() {
double start = usecTimestampNow(); double start = usecTimestampNow();
if (_voxelsDirty) { if (_voxelsDirty && _voxelsUpdated) {
// lock on the buffer write lock so we can't modify the data when the GPU is reading it // lock on the buffer write lock so we can't modify the data when the GPU is reading it
pthread_mutex_lock(&_bufferWriteLock); pthread_mutex_lock(&_bufferWriteLock);
int bytesOfVertices = (_voxelsInArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLfloat); int bytesOfVertices = (_voxelsInArrays * VERTEX_POINTS_PER_VOXEL) * sizeof(GLfloat);

View file

@ -125,9 +125,9 @@ void VoxelNode::setFalseColor(colorPart red, colorPart green, colorPart blue) {
_currentColor[1] = green; _currentColor[1] = green;
_currentColor[2] = blue; _currentColor[2] = blue;
_currentColor[3] = 1; // XXXBHG - False colors are always considered set _currentColor[3] = 1; // XXXBHG - False colors are always considered set
if (_shouldRender) { //if (_shouldRender) {
_isDirty = true; _isDirty = true;
} //}
} }
} }
@ -138,9 +138,9 @@ void VoxelNode::setFalseColored(bool isFalseColored) {
memcpy(&_currentColor,&_trueColor,sizeof(nodeColor)); memcpy(&_currentColor,&_trueColor,sizeof(nodeColor));
} }
_falseColored = isFalseColored; _falseColored = isFalseColored;
if (_shouldRender) { //if (_shouldRender) {
_isDirty = true; _isDirty = true;
} //}
} }
}; };
@ -153,9 +153,9 @@ void VoxelNode::setColor(const nodeColor& color) {
if (!_falseColored) { if (!_falseColored) {
memcpy(&_currentColor,&color,sizeof(nodeColor)); memcpy(&_currentColor,&color,sizeof(nodeColor));
} }
if (_shouldRender) { //if (_shouldRender) {
_isDirty = true; _isDirty = true;
} //}
} }
} }
#endif #endif

View file

@ -132,6 +132,7 @@ int VoxelTree::readNodeData(VoxelNode* destinationNode,
destinationNode->addChildAtIndex(i); destinationNode->addChildAtIndex(i);
if (destinationNode->isDirty()) { if (destinationNode->isDirty()) {
_isDirty = true; _isDirty = true;
_nodesChangedFromBitstream++;
} }
voxelsCreated++; voxelsCreated++;
voxelsCreatedStats.updateAverage(1); voxelsCreatedStats.updateAverage(1);
@ -141,9 +142,14 @@ int VoxelTree::readNodeData(VoxelNode* destinationNode,
nodeColor newColor; nodeColor newColor;
memcpy(newColor, nodeData + bytesRead, 3); memcpy(newColor, nodeData + bytesRead, 3);
newColor[3] = 1; newColor[3] = 1;
bool nodeWasDirty = destinationNode->children[i]->isDirty();
destinationNode->children[i]->setColor(newColor); destinationNode->children[i]->setColor(newColor);
if (destinationNode->children[i]->isDirty()) { bool nodeIsDirty = destinationNode->children[i]->isDirty();
if (nodeIsDirty) {
_isDirty = true; _isDirty = true;
}
if (!nodeWasDirty && nodeIsDirty) {
_nodesChangedFromBitstream++;
} }
this->voxelsColored++; this->voxelsColored++;
this->voxelsColoredStats.updateAverage(1); this->voxelsColoredStats.updateAverage(1);
@ -152,10 +158,15 @@ int VoxelTree::readNodeData(VoxelNode* destinationNode,
} }
} }
// average node's color based on color of children // average node's color based on color of children
bool nodeWasDirty = destinationNode->isDirty();
destinationNode->setColorFromAverageOfChildren(); destinationNode->setColorFromAverageOfChildren();
if (destinationNode->isDirty()) { bool nodeIsDirty = destinationNode->isDirty();
if (nodeIsDirty) {
_isDirty = true; _isDirty = true;
} }
if (!nodeWasDirty && nodeIsDirty) {
_nodesChangedFromBitstream++;
}
// 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);
@ -169,10 +180,15 @@ int VoxelTree::readNodeData(VoxelNode* destinationNode,
if (oneAtBit(childMask, childIndex)) { if (oneAtBit(childMask, childIndex)) {
if (!destinationNode->children[childIndex]) { if (!destinationNode->children[childIndex]) {
// add a child at that index, if it doesn't exist // add a child at that index, if it doesn't exist
bool nodeWasDirty = destinationNode->isDirty();
destinationNode->addChildAtIndex(childIndex); destinationNode->addChildAtIndex(childIndex);
if (destinationNode->isDirty()) { bool nodeIsDirty = destinationNode->isDirty();
if (nodeIsDirty) {
_isDirty = true; _isDirty = true;
} }
if (!nodeWasDirty && nodeIsDirty) {
_nodesChangedFromBitstream++;
}
this->voxelsCreated++; this->voxelsCreated++;
this->voxelsCreatedStats.updateAverage(this->voxelsCreated); this->voxelsCreatedStats.updateAverage(this->voxelsCreated);
} }
@ -192,6 +208,8 @@ int VoxelTree::readNodeData(VoxelNode* destinationNode,
void VoxelTree::readBitstreamToTree(unsigned char * bitstream, int bufferSizeBytes) { void VoxelTree::readBitstreamToTree(unsigned char * bitstream, int bufferSizeBytes) {
int bytesRead = 0; int bytesRead = 0;
unsigned char* bitstreamAt = bitstream; unsigned char* bitstreamAt = bitstream;
_nodesChangedFromBitstream = 0;
// Keep looping through the buffer calling readNodeData() this allows us to pack multiple root-relative Octal codes // Keep looping through the buffer calling readNodeData() this allows us to pack multiple root-relative Octal codes
// into a single network packet. readNodeData() basically goes down a tree from the root, and fills things in from there // into a single network packet. readNodeData() basically goes down a tree from the root, and fills things in from there
@ -208,6 +226,7 @@ void VoxelTree::readBitstreamToTree(unsigned char * bitstream, int bufferSizeByt
bitstreamRootNode = createMissingNode(rootNode, (unsigned char*) bitstreamAt); bitstreamRootNode = createMissingNode(rootNode, (unsigned char*) bitstreamAt);
if (bitstreamRootNode->isDirty()) { if (bitstreamRootNode->isDirty()) {
_isDirty = true; _isDirty = true;
_nodesChangedFromBitstream++;
} }
} }

View file

@ -57,6 +57,7 @@ public:
bool isDirty() const { return _isDirty; }; bool isDirty() const { return _isDirty; };
void clearDirtyBit() { _isDirty = false; }; void clearDirtyBit() { _isDirty = false; };
unsigned long int getNodesChangedFromBitstream() const { return _nodesChangedFromBitstream; };
private: private:
int encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEncodeLevel, int encodeTreeBitstreamRecursion(int maxEncodeLevel, int& currentEncodeLevel,
@ -73,6 +74,7 @@ private:
int readNodeData(VoxelNode *destinationNode, unsigned char* nodeData, int bufferSizeBytes); int readNodeData(VoxelNode *destinationNode, unsigned char* nodeData, int bufferSizeBytes);
bool _isDirty; bool _isDirty;
unsigned long int _nodesChangedFromBitstream;
}; };
int boundaryDistanceForRenderLevel(unsigned int renderLevel); int boundaryDistanceForRenderLevel(unsigned int renderLevel);