From ce6b78b772beecda6856d44d557e1887a17d6ed9 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 21 May 2013 20:25:07 -0700 Subject: [PATCH 01/17] new animation --- animation-server/src/main.cpp | 114 +++++++++++++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 18b4ad787c..7bfd8b79ab 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -65,6 +65,115 @@ static void sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail) { } } + +const float BUG_VOXEL_SIZE = 0.0625f / TREE_SCALE; +glm::vec3 bugPosition = glm::vec3(BUG_VOXEL_SIZE*10.0,0,BUG_VOXEL_SIZE*10.0); ///BUG_VOXEL_SIZE * 10.f, BUG_VOXEL_SIZE * 10.f, BUG_VOXEL_SIZE * 10.f); +glm::vec3 bugDirection = glm::vec3(0,0,1); + + +const unsigned char bugColor[3] = { 0, 255, 255}; + +const int VOXELS_PER_BUG = 14; +const glm::vec3 bugParts[VOXELS_PER_BUG] = { + + // body + glm::vec3(0,0,-3), + glm::vec3(0,0,-2), + glm::vec3(0,0,-1), + glm::vec3(0,0,0), + glm::vec3(0,0,1), + glm::vec3(0,0,2), + + // eyes + glm::vec3(1,0,3), + glm::vec3(-1,0,3), + + // wings + glm::vec3(1,0,1), + glm::vec3(2,0,1), + glm::vec3(3,0,1), + glm::vec3(-1,0,1), + glm::vec3(-2,0,1), + glm::vec3(-3,0,1), +}; + +static void renderMovingBug() { + VoxelDetail details[VOXELS_PER_BUG]; + PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; + unsigned char* bufferOut; + int sizeOut; + + // Generate voxels for where bug used to be + for (int i = 0; i < VOXELS_PER_BUG; i++) { + details[i].s = BUG_VOXEL_SIZE; + details[i].x = bugPosition.x + (bugParts[i].x * BUG_VOXEL_SIZE); + details[i].y = bugPosition.y + (bugParts[i].y * BUG_VOXEL_SIZE); + details[i].z = bugPosition.z + (bugParts[i].z * BUG_VOXEL_SIZE); + + details[i].red = bugColor[0]; + details[i].green = bugColor[1]; + details[i].blue = bugColor[2]; + } + + // send the "erase message" first... + message = PACKET_HEADER_ERASE_VOXEL; + if (createVoxelEditMessage(message, 0, VOXELS_PER_BUG, (VoxelDetail*)&details, bufferOut, sizeOut)){ + + ::packetsSent++; + ::bytesSent += sizeOut; + + if (::shouldShowPacketsPerSecond) { + printf("sending packet of size=%d\n",sizeOut); + } + AgentList::getInstance()->broadcastToAgents(bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); + delete[] bufferOut; + } + + // Move the bug... + bugPosition.x += (bugDirection.x * BUG_VOXEL_SIZE); + bugPosition.y += (bugDirection.y * BUG_VOXEL_SIZE); + bugPosition.z += (bugDirection.z * BUG_VOXEL_SIZE); + + // Check boundaries + if (bugPosition.z > 0.25) { + bugDirection.z = -1; + } + if (bugPosition.z < 0.01) { + bugDirection.z = 1; + } + printf("bugPosition=(%f,%f,%f)\n",bugPosition.x,bugPosition.y,bugPosition.z); + printf("bugDirection=(%f,%f,%f)\n",bugDirection.x,bugDirection.y,bugDirection.z); + // would be nice to add some randomness here... + + // Generate voxels for where bug is going to + for (int i = 0; i < VOXELS_PER_BUG; i++) { + details[i].s = BUG_VOXEL_SIZE; + details[i].x = bugPosition.x + (bugParts[i].x * BUG_VOXEL_SIZE); + details[i].y = bugPosition.y + (bugParts[i].y * BUG_VOXEL_SIZE); + details[i].z = bugPosition.z + (bugParts[i].z * BUG_VOXEL_SIZE); + + details[i].red = bugColor[0]; + details[i].green = bugColor[1]; + details[i].blue = bugColor[2]; + } + + // send the "create message" ... + message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; + if (createVoxelEditMessage(message, 0, VOXELS_PER_BUG, (VoxelDetail*)&details, bufferOut, sizeOut)){ + + ::packetsSent++; + ::bytesSent += sizeOut; + + if (::shouldShowPacketsPerSecond) { + printf("sending packet of size=%d\n",sizeOut); + } + AgentList::getInstance()->broadcastToAgents(bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); + delete[] bufferOut; + } +} + + + float intensity = 0.5f; float intensityIncrement = 0.1f; const float MAX_INTENSITY = 1.0f; @@ -323,8 +432,9 @@ void* animateVoxels(void* args) { // some animations //sendVoxelBlinkMessage(); - sendBlinkingStringOfLights(); - sendBillboard(); + //sendBlinkingStringOfLights(); + //sendBillboard(); + renderMovingBug(); double end = usecTimestampNow(); double elapsedSeconds = (end - ::start) / 1000000.0; From 06f2528d6a571434603fd0a91dbd4e939009d671 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:23:01 -0700 Subject: [PATCH 02/17] fix crashing on deleting voxels in server and client --- animation-server/src/main.cpp | 8 +++--- interface/src/VoxelSystem.cpp | 3 +-- libraries/voxels/src/VoxelTree.cpp | 41 +++++++++++++++++------------- libraries/voxels/src/VoxelTree.h | 10 ++++++-- voxel-server/src/main.cpp | 18 ++++++++++--- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 7bfd8b79ab..2d172e3c9a 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -83,7 +83,7 @@ const glm::vec3 bugParts[VOXELS_PER_BUG] = { glm::vec3(0,0,0), glm::vec3(0,0,1), glm::vec3(0,0,2), - + // eyes glm::vec3(1,0,3), glm::vec3(-1,0,3), @@ -432,9 +432,9 @@ void* animateVoxels(void* args) { // some animations //sendVoxelBlinkMessage(); - //sendBlinkingStringOfLights(); - //sendBillboard(); - renderMovingBug(); + sendBlinkingStringOfLights(); + sendBillboard(); + //renderMovingBug(); double end = usecTimestampNow(); double elapsedSeconds = (end - ::start) / 1000000.0; diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 33bfc43fec..b776ac9d03 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -337,16 +337,15 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) { } else { voxelsUpdated += updateNodeInArraysAsPartialVBO(node); } + node->clearDirtyBit(); // clear the dirty bit, do this before we potentially delete things. // If the node has been asked to be deleted, but we've gotten to here, after updateNodeInArraysXXX() // then it means our VBOs are "clean" and our vertices have been removed or not added. So we can now // safely remove the node from the tree and actually delete it. - // otherwise honor our calculated shouldRender if (node->isStagedForDeletion()) { _tree->deleteVoxelCodeFromTree(node->getOctalCode()); } - node->clearDirtyBit(); // always clear the dirty bit, even if it doesn't need to be rendered return voxelsUpdated; } diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 4a20ac160a..1e0b575c95 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -29,14 +29,15 @@ int boundaryDistanceForRenderLevel(unsigned int renderLevel) { return voxelSizeScale / powf(2, renderLevel); } -VoxelTree::VoxelTree() : +VoxelTree::VoxelTree(bool shouldReaverage) : voxelsCreated(0), voxelsColored(0), voxelsBytesRead(0), voxelsCreatedStats(100), voxelsColoredStats(100), voxelsBytesReadStats(100), - _isDirty(true) { + _isDirty(true), + _shouldReaverage(shouldReaverage) { rootNode = new VoxelNode(); } @@ -254,12 +255,13 @@ void VoxelTree::deleteVoxelAt(float x, float y, float z, float s, bool stage) { unsigned char* octalCode = pointToVoxel(x,y,z,s,0,0,0); deleteVoxelCodeFromTree(octalCode, stage); delete octalCode; // cleanup memory + reaverageVoxelColors(rootNode); } // Note: uses the codeColorBuffer format, but the color's are ignored, because // this only finds and deletes the node from the tree. -void VoxelTree::deleteVoxelCodeFromTree(unsigned char* codeBuffer, bool stage) { +void VoxelTree::deleteVoxelCodeFromTree(unsigned char* codeBuffer, bool stage, bool collapseEmptyTrees) { VoxelNode* parentNode = NULL; VoxelNode* nodeToDelete = nodeForOctalCode(rootNode, codeBuffer, &parentNode); // If the node exists... @@ -276,14 +278,13 @@ void VoxelTree::deleteVoxelCodeFromTree(unsigned char* codeBuffer, bool stage) { } // If we're not a colored leaf, and we have no children, then delete ourselves - // This will collapse the empty tree above us. - if (parentNode->getChildCount() == 0 && !parentNode->isColored()) { + // This will collapse the empty tree above us. + if (collapseEmptyTrees && parentNode->getChildCount() == 0 && !parentNode->isColored()) { // Can't delete the root this way. if (parentNode != rootNode) { - deleteVoxelCodeFromTree(parentNode->getOctalCode(),stage); + deleteVoxelCodeFromTree(parentNode->getOctalCode(), stage, collapseEmptyTrees); } } - reaverageVoxelColors(rootNode); // Fix our colors!! Need to call it on rootNode _isDirty = true; } } else if (nodeToDelete->isLeaf()) { @@ -357,11 +358,12 @@ void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int buffe unsigned char octets = (unsigned char)*pVoxelData; int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! - deleteVoxelCodeFromTree(pVoxelData); + deleteVoxelCodeFromTree(pVoxelData, ACTUALLY_DELETE, COLLAPSE_EMPTY_TREE); pVoxelData+=voxelDataSize; atByte+=voxelDataSize; } + reaverageVoxelColors(rootNode); // Fix our colors!! Need to call it on rootNode } void VoxelTree::printTreeForDebugging(VoxelNode *startNode) { @@ -411,20 +413,23 @@ void VoxelTree::printTreeForDebugging(VoxelNode *startNode) { } void VoxelTree::reaverageVoxelColors(VoxelNode *startNode) { - bool hasChildren = false; + // if our tree is a reaveraging tree, then we do this, otherwise we don't do anything + if (_shouldReaverage) { + bool hasChildren = false; - for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { - if (startNode->getChildAtIndex(i)) { - reaverageVoxelColors(startNode->getChildAtIndex(i)); - hasChildren = true; + for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { + if (startNode->getChildAtIndex(i)) { + reaverageVoxelColors(startNode->getChildAtIndex(i)); + hasChildren = true; + } } - } - if (hasChildren) { - bool childrenCollapsed = startNode->collapseIdenticalLeaves(); + if (hasChildren) { + bool childrenCollapsed = startNode->collapseIdenticalLeaves(); - if (!childrenCollapsed) { - startNode->setColorFromAverageOfChildren(); + if (!childrenCollapsed) { + startNode->setColorFromAverageOfChildren(); + } } } } diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index 4dde00c246..0643b1038e 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -24,6 +24,10 @@ typedef enum {GRADIENT, RANDOM, NATURAL} creationMode; #define NO_COLOR false #define WANT_COLOR true #define IGNORE_VIEW_FRUSTUM NULL +#define JUST_STAGE_DELETION true +#define ACTUALLY_DELETE false +#define COLLAPSE_EMPTY_TREE true +#define DONT_COLLAPSE false class VoxelTree { public: @@ -37,7 +41,7 @@ public: SimpleMovingAverage voxelsColoredStats; SimpleMovingAverage voxelsBytesReadStats; - VoxelTree(); + VoxelTree(bool shouldReaverage = false); ~VoxelTree(); VoxelNode *rootNode; @@ -49,7 +53,8 @@ public: void readBitstreamToTree(unsigned char * bitstream, unsigned long int bufferSizeBytes, bool includeColor = WANT_COLOR, bool includeExistsBits = WANT_EXISTS_BITS); void readCodeColorBufferToTree(unsigned char *codeColorBuffer, bool destructive = false); - void deleteVoxelCodeFromTree(unsigned char *codeBuffer, bool stage = false); + void deleteVoxelCodeFromTree(unsigned char *codeBuffer, bool stage = ACTUALLY_DELETE, + bool collapseEmptyTrees = DONT_COLLAPSE); void printTreeForDebugging(VoxelNode *startNode); void reaverageVoxelColors(VoxelNode *startNode); @@ -111,6 +116,7 @@ private: bool _isDirty; unsigned long int _nodesChangedFromBitstream; + bool _shouldReaverage; }; int boundaryDistanceForRenderLevel(unsigned int renderLevel); diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index c258ad052c..91a98d3fd5 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -49,7 +49,7 @@ int PACKETS_PER_CLIENT_PER_INTERVAL = 50; const int MAX_VOXEL_TREE_DEPTH_LEVELS = 4; -VoxelTree randomTree; +VoxelTree randomTree(true); // this is a reaveraging tree bool wantVoxelPersist = true; bool wantLocalDomain = false; @@ -225,12 +225,17 @@ void resInVoxelDistributor(AgentList* agentList, } } +pthread_mutex_t treeLock; + // Version of voxel distributor that sends the deepest LOD level at once void deepestLevelVoxelDistributor(AgentList* agentList, AgentList::iterator& agent, VoxelAgentData* agentData, bool viewFrustumChanged) { + + pthread_mutex_lock(&::treeLock); + int maxLevelReached = 0; double start = usecTimestampNow(); @@ -356,6 +361,8 @@ void deepestLevelVoxelDistributor(AgentList* agentList, } // end if bag wasn't empty, and so we sent stuff... + + pthread_mutex_unlock(&::treeLock); } double lastPersistVoxels = 0; @@ -434,8 +441,10 @@ void attachVoxelAgentDataToAgent(Agent *newAgent) { } } -int main(int argc, const char * argv[]) -{ +int main(int argc, const char * argv[]) { + + pthread_mutex_init(&::treeLock, NULL); + AgentList* agentList = AgentList::createInstance(AGENT_TYPE_VOXEL, VOXEL_LISTEN_PORT); setvbuf(stdout, NULL, _IOLBF, 0); @@ -605,7 +614,9 @@ int main(int argc, const char * argv[]) // Send these bits off to the VoxelTree class to process them //printf("got Erase Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); + pthread_mutex_lock(&::treeLock); randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); + pthread_mutex_unlock(&::treeLock); } if (packetData[0] == PACKET_HEADER_Z_COMMAND) { @@ -653,6 +664,7 @@ int main(int argc, const char * argv[]) } pthread_join(sendVoxelThread, NULL); + pthread_mutex_destroy(&::treeLock); return 0; } From eb7df9b49923bacf184e2483e00dabc7de2c652b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:32:40 -0700 Subject: [PATCH 03/17] fix whitespace --- voxel-server/src/main.cpp | 110 +++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 91a98d3fd5..34ab9425ba 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -408,11 +408,11 @@ void *distributeVoxelsToListeners(void *args) { VoxelAgentData* agentData = (VoxelAgentData*) agent->getLinkedData(); // Sometimes the agent data has not yet been linked, in which case we can't really do anything - if (agentData) { - bool viewFrustumChanged = agentData->updateCurrentViewFrustum(); + if (agentData) { + bool viewFrustumChanged = agentData->updateCurrentViewFrustum(); if (::debugVoxelSending) { - printf("agentData->updateCurrentViewFrustum() changed=%s\n", debug::valueOf(viewFrustumChanged)); - } + printf("agentData->updateCurrentViewFrustum() changed=%s\n", debug::valueOf(viewFrustumChanged)); + } if (agentData->getWantResIn()) { resInVoxelDistributor(agentList, agent, agentData); @@ -562,91 +562,91 @@ int main(int argc, const char * argv[]) { PerformanceWarning warn(::shouldShowAnimationDebug, destructive ? "PACKET_HEADER_SET_VOXEL_DESTRUCTIVE" : "PACKET_HEADER_SET_VOXEL", ::shouldShowAnimationDebug); - unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); - if (::shouldShowAnimationDebug) { + unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); + if (::shouldShowAnimationDebug) { printf("got %s - command from client receivedBytes=%ld itemNumber=%d\n", destructive ? "PACKET_HEADER_SET_VOXEL_DESTRUCTIVE" : "PACKET_HEADER_SET_VOXEL", receivedBytes,itemNumber); } - int atByte = 3; - unsigned char* pVoxelData = (unsigned char*)&packetData[3]; - while (atByte < receivedBytes) { - unsigned char octets = (unsigned char)*pVoxelData; - int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! - int voxelCodeSize = bytesRequiredForCodeLength(octets); + int atByte = 3; + unsigned char* pVoxelData = (unsigned char*)&packetData[3]; + while (atByte < receivedBytes) { + unsigned char octets = (unsigned char)*pVoxelData; + int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! + int voxelCodeSize = bytesRequiredForCodeLength(octets); - // color randomization on insert - int colorRandomizer = ::wantColorRandomizer ? randIntInRange (-50, 50) : 0; - int red = pVoxelData[voxelCodeSize+0]; - int green = pVoxelData[voxelCodeSize+1]; - int blue = pVoxelData[voxelCodeSize+2]; + // color randomization on insert + int colorRandomizer = ::wantColorRandomizer ? randIntInRange (-50, 50) : 0; + int red = pVoxelData[voxelCodeSize+0]; + int green = pVoxelData[voxelCodeSize+1]; + int blue = pVoxelData[voxelCodeSize+2]; if (::shouldShowAnimationDebug) { printf("insert voxels - wantColorRandomizer=%s old r=%d,g=%d,b=%d \n", (::wantColorRandomizer?"yes":"no"),red,green,blue); } - - red = std::max(0,std::min(255,red + colorRandomizer)); - green = std::max(0,std::min(255,green + colorRandomizer)); - blue = std::max(0,std::min(255,blue + colorRandomizer)); + + red = std::max(0,std::min(255,red + colorRandomizer)); + green = std::max(0,std::min(255,green + colorRandomizer)); + blue = std::max(0,std::min(255,blue + colorRandomizer)); if (::shouldShowAnimationDebug) { printf("insert voxels - wantColorRandomizer=%s NEW r=%d,g=%d,b=%d \n", (::wantColorRandomizer?"yes":"no"),red,green,blue); } - pVoxelData[voxelCodeSize+0]=red; - pVoxelData[voxelCodeSize+1]=green; - pVoxelData[voxelCodeSize+2]=blue; + pVoxelData[voxelCodeSize+0]=red; + pVoxelData[voxelCodeSize+1]=green; + pVoxelData[voxelCodeSize+2]=blue; if (::shouldShowAnimationDebug) { float* vertices = firstVertexForCode(pVoxelData); printf("inserting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); delete []vertices; } - - randomTree.readCodeColorBufferToTree(pVoxelData, destructive); - // skip to next - pVoxelData+=voxelDataSize; - atByte+=voxelDataSize; - } + + randomTree.readCodeColorBufferToTree(pVoxelData, destructive); + // skip to next + pVoxelData+=voxelDataSize; + atByte+=voxelDataSize; + } } if (packetData[0] == PACKET_HEADER_ERASE_VOXEL) { - // Send these bits off to the VoxelTree class to process them - //printf("got Erase Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); + // Send these bits off to the VoxelTree class to process them + //printf("got Erase Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); pthread_mutex_lock(&::treeLock); - randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); + randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); pthread_mutex_unlock(&::treeLock); } if (packetData[0] == PACKET_HEADER_Z_COMMAND) { - // the Z command is a special command that allows the sender to send the voxel server high level semantic - // requests, like erase all, or add sphere scene - char* command = (char*) &packetData[1]; // start of the command - int commandLength = strlen(command); // commands are null terminated strings + // the Z command is a special command that allows the sender to send the voxel server high level semantic + // requests, like erase all, or add sphere scene + char* command = (char*) &packetData[1]; // start of the command + int commandLength = strlen(command); // commands are null terminated strings int totalLength = 1+commandLength+1; - printf("got Z message len(%ld)= %s\n",receivedBytes,command); + printf("got Z message len(%ld)= %s\n",receivedBytes,command); - while (totalLength <= receivedBytes) { - if (0==strcmp(command,(char*)"erase all")) { - printf("got Z message == erase all\n"); - - eraseVoxelTreeAndCleanupAgentVisitData(); - } - if (0==strcmp(command,(char*)"add scene")) { - printf("got Z message == add scene\n"); - addSphereScene(&randomTree); - } - if (0==strcmp(command,(char*)"a message")) { - printf("got Z message == a message, nothing to do, just report\n"); - } + while (totalLength <= receivedBytes) { + if (0==strcmp(command,(char*)"erase all")) { + printf("got Z message == erase all\n"); + + eraseVoxelTreeAndCleanupAgentVisitData(); + } + if (0==strcmp(command,(char*)"add scene")) { + printf("got Z message == add scene\n"); + addSphereScene(&randomTree); + } + if (0==strcmp(command,(char*)"a message")) { + printf("got Z message == a message, nothing to do, just report\n"); + } totalLength += commandLength+1; - } + } - // Now send this to the connected agents so they can also process these messages - printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n"); - agentList->broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_AVATAR, 1); + // Now send this to the connected agents so they can also process these messages + printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n"); + agentList->broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_AVATAR, 1); } // If we got a PACKET_HEADER_HEAD_DATA, then we're talking to an AGENT_TYPE_AVATAR, and we // need to make sure we have it in our agentList. From ee0ceb8516da91f1d341a3d7944300e27502b339 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:36:06 -0700 Subject: [PATCH 04/17] fix CS issues --- voxel-server/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 34ab9425ba..92494c37d0 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -629,16 +629,16 @@ int main(int argc, const char * argv[]) { printf("got Z message len(%ld)= %s\n",receivedBytes,command); while (totalLength <= receivedBytes) { - if (0==strcmp(command,(char*)"erase all")) { + if (strcmp(command,(char*)"erase all") == 0) { printf("got Z message == erase all\n"); eraseVoxelTreeAndCleanupAgentVisitData(); } - if (0==strcmp(command,(char*)"add scene")) { + if (strcmp(command,(char*)"add scene") == 0) { printf("got Z message == add scene\n"); addSphereScene(&randomTree); } - if (0==strcmp(command,(char*)"a message")) { + if (strcmp(command,(char*)"a message") == 0) { printf("got Z message == a message, nothing to do, just report\n"); } totalLength += commandLength+1; From fe62ed9844b99ec30f4f05809e5abb59f3dfb181 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:38:09 -0700 Subject: [PATCH 05/17] fix CS issues --- voxel-server/src/main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 92494c37d0..ae1f01edec 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -624,24 +624,24 @@ int main(int argc, const char * argv[]) { // requests, like erase all, or add sphere scene char* command = (char*) &packetData[1]; // start of the command int commandLength = strlen(command); // commands are null terminated strings - int totalLength = 1+commandLength+1; + int totalLength = sizeof(PACKET_HEADER_Z_COMMAND) + commandLength + 1; // 1 for null termination - printf("got Z message len(%ld)= %s\n",receivedBytes,command); + printf("got Z message len(%ld)= %s\n", receivedBytes, command); while (totalLength <= receivedBytes) { - if (strcmp(command,(char*)"erase all") == 0) { + if (strcmp(command, (char*)"erase all") == 0) { printf("got Z message == erase all\n"); eraseVoxelTreeAndCleanupAgentVisitData(); } - if (strcmp(command,(char*)"add scene") == 0) { + if (strcmp(command, (char*)"add scene") == 0) { printf("got Z message == add scene\n"); addSphereScene(&randomTree); } - if (strcmp(command,(char*)"a message") == 0) { + if (strcmp(command, (char*)"a message") == 0) { printf("got Z message == a message, nothing to do, just report\n"); } - totalLength += commandLength+1; + totalLength += commandLength + 1; // 1 for null termination } // Now send this to the connected agents so they can also process these messages From 0c90a5f6b0c41783b2f8346d508b9ab2ab0073bf Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:39:29 -0700 Subject: [PATCH 06/17] fix CR issues --- animation-server/src/main.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 2d172e3c9a..299d05ef02 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -65,14 +65,10 @@ static void sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail) { } } - const float BUG_VOXEL_SIZE = 0.0625f / TREE_SCALE; -glm::vec3 bugPosition = glm::vec3(BUG_VOXEL_SIZE*10.0,0,BUG_VOXEL_SIZE*10.0); ///BUG_VOXEL_SIZE * 10.f, BUG_VOXEL_SIZE * 10.f, BUG_VOXEL_SIZE * 10.f); +glm::vec3 bugPosition = glm::vec3(BUG_VOXEL_SIZE*10.0, 0, BUG_VOXEL_SIZE*10.0); glm::vec3 bugDirection = glm::vec3(0,0,1); - - -const unsigned char bugColor[3] = { 0, 255, 255}; - +const unsigned char bugColor[3] = {0, 255, 255}; const int VOXELS_PER_BUG = 14; const glm::vec3 bugParts[VOXELS_PER_BUG] = { From cd1f07231f5698b686fb86ca1380d5014007cea4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:40:59 -0700 Subject: [PATCH 07/17] fix CR issues --- voxel-server/src/main.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index ae1f01edec..fe319c64fc 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -613,9 +613,8 @@ int main(int argc, const char * argv[]) { if (packetData[0] == PACKET_HEADER_ERASE_VOXEL) { // Send these bits off to the VoxelTree class to process them - //printf("got Erase Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); pthread_mutex_lock(&::treeLock); - randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); + randomTree.processRemoveVoxelBitstream((unsigned char*)packetData, receivedBytes); pthread_mutex_unlock(&::treeLock); } if (packetData[0] == PACKET_HEADER_Z_COMMAND) { @@ -646,7 +645,7 @@ int main(int argc, const char * argv[]) { // Now send this to the connected agents so they can also process these messages printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n"); - agentList->broadcastToAgents(packetData,receivedBytes, &AGENT_TYPE_AVATAR, 1); + agentList->broadcastToAgents(packetData, receivedBytes, &AGENT_TYPE_AVATAR, 1); } // If we got a PACKET_HEADER_HEAD_DATA, then we're talking to an AGENT_TYPE_AVATAR, and we // need to make sure we have it in our agentList. From 3e37c956c660cf7647faafe92fb7bbb96cbb7016 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:57:33 -0700 Subject: [PATCH 08/17] fix coding standard issues --- voxel-server/src/main.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index fe319c64fc..e9f4503f8a 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -568,18 +568,18 @@ int main(int argc, const char * argv[]) { destructive ? "PACKET_HEADER_SET_VOXEL_DESTRUCTIVE" : "PACKET_HEADER_SET_VOXEL", receivedBytes,itemNumber); } - int atByte = 3; - unsigned char* pVoxelData = (unsigned char*)&packetData[3]; + int atByte = sizeof(PACKET_HEADER) + sizeof(itemNumber); + unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < receivedBytes) { - unsigned char octets = (unsigned char)*pVoxelData; + unsigned char octets = (unsigned char)*voxelData; int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! int voxelCodeSize = bytesRequiredForCodeLength(octets); // color randomization on insert int colorRandomizer = ::wantColorRandomizer ? randIntInRange (-50, 50) : 0; - int red = pVoxelData[voxelCodeSize+0]; - int green = pVoxelData[voxelCodeSize+1]; - int blue = pVoxelData[voxelCodeSize+2]; + int red = voxelData[voxelCodeSize+0]; + int green = voxelData[voxelCodeSize+1]; + int blue = voxelData[voxelCodeSize+2]; if (::shouldShowAnimationDebug) { printf("insert voxels - wantColorRandomizer=%s old r=%d,g=%d,b=%d \n", @@ -594,20 +594,20 @@ int main(int argc, const char * argv[]) { printf("insert voxels - wantColorRandomizer=%s NEW r=%d,g=%d,b=%d \n", (::wantColorRandomizer?"yes":"no"),red,green,blue); } - pVoxelData[voxelCodeSize+0]=red; - pVoxelData[voxelCodeSize+1]=green; - pVoxelData[voxelCodeSize+2]=blue; + voxelData[voxelCodeSize+0]=red; + voxelData[voxelCodeSize+1]=green; + voxelData[voxelCodeSize+2]=blue; if (::shouldShowAnimationDebug) { - float* vertices = firstVertexForCode(pVoxelData); + float* vertices = firstVertexForCode(voxelData); printf("inserting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); delete []vertices; } - randomTree.readCodeColorBufferToTree(pVoxelData, destructive); + randomTree.readCodeColorBufferToTree(voxelData, destructive); // skip to next - pVoxelData+=voxelDataSize; - atByte+=voxelDataSize; + voxelData += voxelDataSize; + atByte += voxelDataSize; } } if (packetData[0] == PACKET_HEADER_ERASE_VOXEL) { From 4b8022c64ec0c1992c0dfbdcc8099b73c358f82a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 13:59:21 -0700 Subject: [PATCH 09/17] fix coding standard issues --- animation-server/src/main.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 299d05ef02..e5fc328c7c 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -66,31 +66,31 @@ static void sendVoxelEditMessage(PACKET_HEADER header, VoxelDetail& detail) { } const float BUG_VOXEL_SIZE = 0.0625f / TREE_SCALE; -glm::vec3 bugPosition = glm::vec3(BUG_VOXEL_SIZE*10.0, 0, BUG_VOXEL_SIZE*10.0); -glm::vec3 bugDirection = glm::vec3(0,0,1); +glm::vec3 bugPosition = glm::vec3(BUG_VOXEL_SIZE * 10.0, 0, BUG_VOXEL_SIZE * 10.0); +glm::vec3 bugDirection = glm::vec3(0, 0, 1); const unsigned char bugColor[3] = {0, 255, 255}; const int VOXELS_PER_BUG = 14; const glm::vec3 bugParts[VOXELS_PER_BUG] = { // body - glm::vec3(0,0,-3), - glm::vec3(0,0,-2), - glm::vec3(0,0,-1), - glm::vec3(0,0,0), - glm::vec3(0,0,1), - glm::vec3(0,0,2), + glm::vec3(0, 0, -3), + glm::vec3(0, 0, -2), + glm::vec3(0, 0, -1), + glm::vec3(0, 0, 0), + glm::vec3(0, 0, 1), + glm::vec3(0, 0, 2), // eyes - glm::vec3(1,0,3), - glm::vec3(-1,0,3), + glm::vec3(1, 0, 3), + glm::vec3(-1, 0, 3), // wings - glm::vec3(1,0,1), - glm::vec3(2,0,1), - glm::vec3(3,0,1), - glm::vec3(-1,0,1), - glm::vec3(-2,0,1), - glm::vec3(-3,0,1), + glm::vec3(1, 0, 1), + glm::vec3(2, 0, 1), + glm::vec3(3, 0, 1), + glm::vec3(-1, 0, 1), + glm::vec3(-2, 0, 1), + glm::vec3(-3, 0, 1), }; static void renderMovingBug() { From d1776cc5da939b1412441812dd34d803230bc5ef Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:02:13 -0700 Subject: [PATCH 10/17] fix coding standard issues --- voxel-server/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index e9f4503f8a..48014ef6bb 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -600,7 +600,7 @@ int main(int argc, const char * argv[]) { if (::shouldShowAnimationDebug) { float* vertices = firstVertexForCode(voxelData); - printf("inserting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); + printf("inserting voxel at: %f,%f,%f\n", vertices[0], vertices[1], vertices[2]); delete []vertices; } From ce30f1612bec154efa9d47199d45ef12109e6c4f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:02:49 -0700 Subject: [PATCH 11/17] fix coding standard issues --- voxel-server/src/main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 48014ef6bb..c7b08f9bb4 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -577,9 +577,9 @@ int main(int argc, const char * argv[]) { // color randomization on insert int colorRandomizer = ::wantColorRandomizer ? randIntInRange (-50, 50) : 0; - int red = voxelData[voxelCodeSize+0]; - int green = voxelData[voxelCodeSize+1]; - int blue = voxelData[voxelCodeSize+2]; + int red = voxelData[voxelCodeSize + 0]; + int green = voxelData[voxelCodeSize + 1]; + int blue = voxelData[voxelCodeSize + 2]; if (::shouldShowAnimationDebug) { printf("insert voxels - wantColorRandomizer=%s old r=%d,g=%d,b=%d \n", @@ -594,9 +594,9 @@ int main(int argc, const char * argv[]) { printf("insert voxels - wantColorRandomizer=%s NEW r=%d,g=%d,b=%d \n", (::wantColorRandomizer?"yes":"no"),red,green,blue); } - voxelData[voxelCodeSize+0]=red; - voxelData[voxelCodeSize+1]=green; - voxelData[voxelCodeSize+2]=blue; + voxelData[voxelCodeSize + 0]=red; + voxelData[voxelCodeSize + 1]=green; + voxelData[voxelCodeSize + 2]=blue; if (::shouldShowAnimationDebug) { float* vertices = firstVertexForCode(voxelData); From 59609b37a079b5ce5cd6125594ce7384b5577ff9 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:03:41 -0700 Subject: [PATCH 12/17] fix coding standard issues --- voxel-server/src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index c7b08f9bb4..f5ee3c6e27 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -586,9 +586,9 @@ int main(int argc, const char * argv[]) { (::wantColorRandomizer?"yes":"no"),red,green,blue); } - red = std::max(0,std::min(255,red + colorRandomizer)); - green = std::max(0,std::min(255,green + colorRandomizer)); - blue = std::max(0,std::min(255,blue + colorRandomizer)); + red = std::max(0, std::min(255, red + colorRandomizer)); + green = std::max(0, std::min(255, green + colorRandomizer)); + blue = std::max(0, std::min(255, blue + colorRandomizer)); if (::shouldShowAnimationDebug) { printf("insert voxels - wantColorRandomizer=%s NEW r=%d,g=%d,b=%d \n", From ea1916ee628954a8cb3d7b8289f34c39b3975649 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:07:08 -0700 Subject: [PATCH 13/17] fix coding standard issues --- animation-server/src/main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index e5fc328c7c..754a72e27f 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -119,7 +119,7 @@ static void renderMovingBug() { ::bytesSent += sizeOut; if (::shouldShowPacketsPerSecond) { - printf("sending packet of size=%d\n",sizeOut); + printf("sending packet of size=%d\n", sizeOut); } AgentList::getInstance()->broadcastToAgents(bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); delete[] bufferOut; @@ -137,8 +137,8 @@ static void renderMovingBug() { if (bugPosition.z < 0.01) { bugDirection.z = 1; } - printf("bugPosition=(%f,%f,%f)\n",bugPosition.x,bugPosition.y,bugPosition.z); - printf("bugDirection=(%f,%f,%f)\n",bugDirection.x,bugDirection.y,bugDirection.z); + printf("bugPosition=(%f,%f,%f)\n", bugPosition.x, bugPosition.y, bugPosition.z); + printf("bugDirection=(%f,%f,%f)\n", bugDirection.x, bugDirection.y, bugDirection.z); // would be nice to add some randomness here... // Generate voxels for where bug is going to @@ -161,7 +161,7 @@ static void renderMovingBug() { ::bytesSent += sizeOut; if (::shouldShowPacketsPerSecond) { - printf("sending packet of size=%d\n",sizeOut); + printf("sending packet of size=%d\n", sizeOut); } AgentList::getInstance()->broadcastToAgents(bufferOut, sizeOut, &AGENT_TYPE_VOXEL, 1); delete[] bufferOut; From cb96b34f9a5328719c5a6b49a341c5992ae8d504 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:08:18 -0700 Subject: [PATCH 14/17] CR feedback --- animation-server/src/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/animation-server/src/main.cpp b/animation-server/src/main.cpp index 754a72e27f..f6f1d4b9ef 100644 --- a/animation-server/src/main.cpp +++ b/animation-server/src/main.cpp @@ -95,7 +95,6 @@ const glm::vec3 bugParts[VOXELS_PER_BUG] = { static void renderMovingBug() { VoxelDetail details[VOXELS_PER_BUG]; - PACKET_HEADER message = PACKET_HEADER_SET_VOXEL_DESTRUCTIVE; unsigned char* bufferOut; int sizeOut; @@ -112,7 +111,7 @@ static void renderMovingBug() { } // send the "erase message" first... - message = PACKET_HEADER_ERASE_VOXEL; + PACKET_HEADER message = PACKET_HEADER_ERASE_VOXEL; if (createVoxelEditMessage(message, 0, VOXELS_PER_BUG, (VoxelDetail*)&details, bufferOut, sizeOut)){ ::packetsSent++; From 47c4ff887eedd4d9543e342edc1d0c36702411ff Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:13:38 -0700 Subject: [PATCH 15/17] CR feedback --- libraries/voxels/src/VoxelTree.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 1e0b575c95..642d747687 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -424,12 +424,10 @@ void VoxelTree::reaverageVoxelColors(VoxelNode *startNode) { } } - if (hasChildren) { - bool childrenCollapsed = startNode->collapseIdenticalLeaves(); - - if (!childrenCollapsed) { - startNode->setColorFromAverageOfChildren(); - } + // collapseIdenticalLeaves() returns true if it collapses the leaves + // in which case we don't need to set the average color + if (hasChildren && !startNode->collapseIdenticalLeaves()) { + startNode->setColorFromAverageOfChildren(); } } } From c2ebd6fc9596b362b516c7bea137a01b252db724 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:23:27 -0700 Subject: [PATCH 16/17] CR feedback --- libraries/shared/src/PacketHeaders.h | 6 ++++++ voxel-server/src/main.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 39f81bf651..850eced59b 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -33,4 +33,10 @@ const PACKET_HEADER PACKET_HEADER_ENVIRONMENT_DATA = 'e'; const PACKET_HEADER PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; const PACKET_HEADER PACKET_HEADER_DOMAIN_RFD = 'C'; + +// These are supported Z-Command +#define ERASE_ALL_COMMAND "erase all" +#define ADD_SCENE_COMMAND "add scene" +#define TEST_COMMAND "a message" + #endif diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index f5ee3c6e27..f4c05e1c31 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -594,9 +594,9 @@ int main(int argc, const char * argv[]) { printf("insert voxels - wantColorRandomizer=%s NEW r=%d,g=%d,b=%d \n", (::wantColorRandomizer?"yes":"no"),red,green,blue); } - voxelData[voxelCodeSize + 0]=red; - voxelData[voxelCodeSize + 1]=green; - voxelData[voxelCodeSize + 2]=blue; + voxelData[voxelCodeSize + 0] = red; + voxelData[voxelCodeSize + 1] = green; + voxelData[voxelCodeSize + 2] = blue; if (::shouldShowAnimationDebug) { float* vertices = firstVertexForCode(voxelData); @@ -628,16 +628,16 @@ int main(int argc, const char * argv[]) { printf("got Z message len(%ld)= %s\n", receivedBytes, command); while (totalLength <= receivedBytes) { - if (strcmp(command, (char*)"erase all") == 0) { + if (strcmp(command, ERASE_ALL_COMMAND) == 0) { printf("got Z message == erase all\n"); eraseVoxelTreeAndCleanupAgentVisitData(); } - if (strcmp(command, (char*)"add scene") == 0) { + if (strcmp(command, ADD_SCENE_COMMAND) == 0) { printf("got Z message == add scene\n"); addSphereScene(&randomTree); } - if (strcmp(command, (char*)"a message") == 0) { + if (strcmp(command, TEST_COMMAND) == 0) { printf("got Z message == a message, nothing to do, just report\n"); } totalLength += commandLength + 1; // 1 for null termination From ccd4f5e0029768c804aad5f538472c931108b475 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 22 May 2013 14:25:25 -0700 Subject: [PATCH 17/17] CR feedback --- voxel-server/src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index f4c05e1c31..3a08b1aaf7 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -572,7 +572,8 @@ int main(int argc, const char * argv[]) { unsigned char* voxelData = (unsigned char*)&packetData[atByte]; while (atByte < receivedBytes) { unsigned char octets = (unsigned char)*voxelData; - int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! + const int COLOR_SIZE_IN_BYTES = 3; + int voxelDataSize = bytesRequiredForCodeLength(octets) + COLOR_SIZE_IN_BYTES; int voxelCodeSize = bytesRequiredForCodeLength(octets); // color randomization on insert