diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 4ae10b94d3..0c1fb05ebf 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -147,7 +147,8 @@ glm::vec3 start_location(6.1f, 0, 1.4f); int stats_on = 0; // Whether to show onscreen text overlay with stats bool starsOn = true; // Whether to display the stars bool paintOn = false; // Whether to paint voxels as you fly around - +VoxelDetail paintingVoxel; // The voxel we're painting if we're painting +unsigned char dominantColor = 0; // The dominant color of the voxel we're painting int noise_on = 0; // Whether to add random noise float noise = 1.0; // Overall magnitude scaling for random noise levels @@ -512,23 +513,18 @@ void simulateHead(float frametime) glm::vec3 headPos = myHead.getPos(); - VoxelDetail paintingVoxel; - paintingVoxel.x = headPos.z/10.0; // voxel space x is positive z head space - paintingVoxel.y = headPos.y/-10.0; // voxel space y is negative y head space - paintingVoxel.z = headPos.x/-10.0; // voxel space z is negative x head space - paintingVoxel.s = 1.0/256; - paintingVoxel.red = 0; - paintingVoxel.green = 255; - paintingVoxel.blue = 0; + ::paintingVoxel.x = headPos.z/-10.0; // voxel space x is negative z head space + ::paintingVoxel.y = headPos.y/-10.0; // voxel space y is negative y head space + ::paintingVoxel.z = headPos.x/-10.0; // voxel space z is negative x head space unsigned char* bufferOut; int sizeOut; - if (paintingVoxel.x >= 0.0 && paintingVoxel.x <= 1.0 && - paintingVoxel.y >= 0.0 && paintingVoxel.y <= 1.0 && - paintingVoxel.z >= 0.0 && paintingVoxel.z <= 1.0) { + if (::paintingVoxel.x >= 0.0 && ::paintingVoxel.x <= 1.0 && + ::paintingVoxel.y >= 0.0 && ::paintingVoxel.y <= 1.0 && + ::paintingVoxel.z >= 0.0 && ::paintingVoxel.z <= 1.0) { - if (createVoxelEditMessage('I',0,1,&paintingVoxel,bufferOut,sizeOut)){ + if (createVoxelEditMessage('I',0,1,&::paintingVoxel,bufferOut,sizeOut)){ agentList.broadcastToAgents((char*)bufferOut, sizeOut,AgentList::AGENTS_OF_TYPE_VOXEL); delete bufferOut; } @@ -715,7 +711,12 @@ void display(void) drawtext(WIDTH-200,20, 0.10, 0, 1.0, 0, agents, 1, 1, 0); if (::paintOn) { - drawtext(WIDTH-200,40, 0.10, 0, 1.0, 0, "Paint ON", 1, 1, 0); + + char paintMessage[100]; + sprintf(paintMessage,"Painting (%.3f,%.3f,%.3f/%.3f/%d,%d,%d)", + ::paintingVoxel.x,::paintingVoxel.y,::paintingVoxel.z,::paintingVoxel.s, + (unsigned int)::paintingVoxel.red,(unsigned int)::paintingVoxel.green,(unsigned int)::paintingVoxel.blue); + drawtext(WIDTH-350,40, 0.10, 0, 1.0, 0, paintMessage, 1, 1, 0); } glPopMatrix(); @@ -749,6 +750,27 @@ void testPointToVoxel() } } +void shiftPaintingColor() +{ + // About the color of the paintbrush... first determine the dominant color + ::dominantColor = (::dominantColor+1)%3; // 0=red,1=green,2=blue + ::paintingVoxel.red = (::dominantColor==0)?randIntInRange(200,255):randIntInRange(40,100); + ::paintingVoxel.green = (::dominantColor==1)?randIntInRange(200,255):randIntInRange(40,100); + ::paintingVoxel.blue = (::dominantColor==2)?randIntInRange(200,255):randIntInRange(40,100); +} + +void setupPaintingVoxel() +{ + glm::vec3 headPos = myHead.getPos(); + + ::paintingVoxel.x = headPos.z/-10.0; // voxel space x is negative z head space + ::paintingVoxel.y = headPos.y/-10.0; // voxel space y is negative y head space + ::paintingVoxel.z = headPos.x/-10.0; // voxel space z is negative x head space + ::paintingVoxel.s = 1.0/256; + + shiftPaintingColor(); +} + void addRandomSphere(bool wantColorRandomizer) { float r = randFloatInRange(0.05,0.1); @@ -835,7 +857,13 @@ void key(unsigned char k, int x, int y) if (k == 'q') ::terminate(); if (k == '/') stats_on = !stats_on; // toggle stats if (k == '*') ::starsOn = !::starsOn; // toggle stars - if (k == '&') ::paintOn = !::paintOn; // toggle paint + if (k == '&') { + ::paintOn = !::paintOn; // toggle paint + setupPaintingVoxel(); // also randomizes colors + } + if (k == '^') { + shiftPaintingColor(); // shifts randomize color between R,G,B dominant + } if (k == 'n') { noise_on = !noise_on; // Toggle noise diff --git a/shared/src/VoxelNode.cpp b/shared/src/VoxelNode.cpp index 8b71a04893..7300af814a 100644 --- a/shared/src/VoxelNode.cpp +++ b/shared/src/VoxelNode.cpp @@ -37,25 +37,20 @@ void VoxelNode::addChildAtIndex(int childIndex) { } // will average the child colors... -void VoxelNode::setColorFromAverageOfChildren(int * colorArray) { - if (colorArray == NULL) { - colorArray = new int[4]; - memset(colorArray, 0, 4*sizeof(int)); - - for (int i = 0; i < 8; i++) { - if (children[i] != NULL && children[i]->color[3] == 1) { - for (int j = 0; j < 3; j++) { - colorArray[j] += children[i]->color[j]; - } - colorArray[3]++; - } - } - } +void VoxelNode::setColorFromAverageOfChildren() { + int colorArray[4] = {0,0,0,0}; + for (int i = 0; i < 8; i++) { + if (children[i] != NULL && children[i]->color[3] == 1) { + for (int j = 0; j < 3; j++) { + colorArray[j] += children[i]->color[j]; + } + colorArray[3]++; + } + } if (colorArray[3] > 4) { // we need at least 4 colored children to have an average color value // or if we have none we generate random values - for (int c = 0; c < 3; c++) { // set the average color value color[c] = colorArray[c] / colorArray[3]; diff --git a/shared/src/VoxelNode.h b/shared/src/VoxelNode.h index 9be1b64c70..e97689aa9b 100644 --- a/shared/src/VoxelNode.h +++ b/shared/src/VoxelNode.h @@ -17,7 +17,7 @@ public: ~VoxelNode(); void addChildAtIndex(int childIndex); - void setColorFromAverageOfChildren(int * colorArray = NULL); + void setColorFromAverageOfChildren(); void setRandomColor(int minimumBrightness); bool collapseIdenticalLeaves(); diff --git a/shared/src/VoxelTree.cpp b/shared/src/VoxelTree.cpp index a00fb48cf5..a7390dd06f 100644 --- a/shared/src/VoxelTree.cpp +++ b/shared/src/VoxelTree.cpp @@ -100,8 +100,6 @@ int VoxelTree::readNodeData(VoxelNode *destinationNode, // instantiate variable for bytes already read int bytesRead = 1; - int colorArray[4] = {}; - for (int i = 0; i < 8; i++) { // check the colors mask to see if we have a child to color in if (oneAtBit(*nodeData, i)) { @@ -115,17 +113,12 @@ int VoxelTree::readNodeData(VoxelNode *destinationNode, memcpy(destinationNode->children[i]->color, nodeData + bytesRead, 3); destinationNode->children[i]->color[3] = 1; - for (int j = 0; j < 3; j++) { - colorArray[j] += destinationNode->children[i]->color[j]; - } - bytesRead += 3; - colorArray[3]++; } } // average node's color based on color of children - destinationNode->setColorFromAverageOfChildren(colorArray); + destinationNode->setColorFromAverageOfChildren(); // give this destination node the child mask from the packet unsigned char childMask = *(nodeData + bytesRead); diff --git a/voxel/src/main.cpp b/voxel/src/main.cpp index 914411db64..0a2ae0c584 100644 --- a/voxel/src/main.cpp +++ b/voxel/src/main.cpp @@ -85,8 +85,6 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) { if (levelsToGo > 0) { bool createdChildren = false; - int colorArray[4] = {}; - createdChildren = false; for (int i = 0; i < 8; i++) { @@ -96,17 +94,8 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) { // give this child it's octal code currentRootNode->children[i]->octalCode = childOctalCode(currentRootNode->octalCode, i); - - randomlyFillVoxelTree(levelsToGo - 1, currentRootNode->children[i]); - if (currentRootNode->children[i]->color[3] == 1) { - for (int c = 0; c < 3; c++) { - colorArray[c] += currentRootNode->children[i]->color[c]; - } - - colorArray[3]++; - } - + randomlyFillVoxelTree(levelsToGo - 1, currentRootNode->children[i]); createdChildren = true; } } @@ -117,7 +106,7 @@ void randomlyFillVoxelTree(int levelsToGo, VoxelNode *currentRootNode) { currentRootNode->setRandomColor(MIN_BRIGHTNESS); } else { // set the color value for this node - currentRootNode->setColorFromAverageOfChildren(colorArray); + currentRootNode->setColorFromAverageOfChildren(); } } else { // this is a leaf node, just give it a color @@ -171,7 +160,12 @@ void *distributeVoxelsToListeners(void *args) { packetCount++; totalBytesSent += voxelPacketEnd - voxelPacket; - if (agentData->rootMarkerNode->childrenVisitedMask == 255) { + // XXXBHG Hack Attack: This is temporary code to help debug an issue. + // Normally we use this break to prevent resending voxels that an agent has + // already visited. But since we might be modifying the voxel tree we might + // want to always send. This is a hack to test the behavior + bool alwaysSend = true; + if (!alwaysSend && agentData->rootMarkerNode->childrenVisitedMask == 255) { break; } } @@ -311,6 +305,8 @@ int main(int argc, const char * argv[]) pVoxelData+=voxelDataSize; atByte+=voxelDataSize; } + // after done inserting all these voxels, then reaverage colors + randomTree.reaverageVoxelColors(randomTree.rootNode); } if (packetData[0] == 'R') {