From 9220ba3ee5a18d8d1cf9d8de0d765791d74d0b5f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 3 Apr 2013 12:42:24 -0700 Subject: [PATCH] Added agentTypes to AgentList::broadcastToAgents() Make voxel server rebroadcast "remove voxel" messages to all it's connected heads Cleaned up processing of Remove voxel messages to live in VoxelTree --- interface/src/VoxelSystem.cpp | 15 ++++++++++++--- interface/src/main.cpp | 5 ++--- shared/src/AgentList.cpp | 10 ++++++---- shared/src/AgentList.h | 7 ++++++- shared/src/VoxelTree.cpp | 21 +++++++++++++++++++++ shared/src/VoxelTree.h | 3 ++- voxel/src/main.cpp | 25 +++++++------------------ 7 files changed, 56 insertions(+), 30 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 81b2e66b33..03a83d086e 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -84,11 +84,20 @@ void VoxelSystem::createSphere(float r,float xc, float yc, float zc, float s, bo void VoxelSystem::parseData(void *data, int size) { - // output the bits received from the voxel server + + unsigned char command = *(unsigned char*)data; unsigned char *voxelData = (unsigned char *) data + 1; - // ask the VoxelTree to read the bitstream into the tree - tree->readBitstreamToTree(voxelData, size - 1); + switch(command) { + case 'V': + // ask the VoxelTree to read the bitstream into the tree + tree->readBitstreamToTree(voxelData, size - 1); + break; + case 'R': + // ask the tree to read the "remove" bitstream + tree->processRemoveVoxelBitstream((unsigned char*)data,size); + break; + } setupNewVoxelsForDrawing(); } diff --git a/interface/src/main.cpp b/interface/src/main.cpp index c03abf00f7..6a2c41ce24 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -467,7 +467,7 @@ void simulateHead(float frametime) const int MAX_BROADCAST_STRING = 200; char broadcast_string[MAX_BROADCAST_STRING]; int broadcast_bytes = myHead.getBroadcastData(broadcast_string); - agentList.broadcastToAgents(broadcast_string, broadcast_bytes); + agentList.broadcastToAgents(broadcast_string, broadcast_bytes,AgentList::AGENTS_OF_TYPE_VOXEL_AND_INTERFACE); } int render_test_spot = WIDTH/2; @@ -790,14 +790,13 @@ void *networkReceive(void *args) while (!stopNetworkReceiveThread) { if (agentList.getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) { - PerfStat("networkReceive receive()"); packetcount++; bytescount += bytesReceived; if (incomingPacket[0] == 't') { // Pass everything but transmitter data to the agent list myHead.hand->processTransmitterData(incomingPacket, bytesReceived); - } else if (incomingPacket[0] == 'V') { + } else if (incomingPacket[0] == 'V' || incomingPacket[0] == 'R') { voxels.parseData(incomingPacket, bytesReceived); } else { agentList.processAgentData(&senderAddress, incomingPacket, bytesReceived); diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index d745d0a9c4..9b2905e940 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -209,11 +209,13 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, } } -void AgentList::broadcastToAgents(char *broadcastData, size_t dataBytes) { +const char* AgentList::AGENTS_OF_TYPE_HEAD = "H"; +const char* AgentList::AGENTS_OF_TYPE_VOXEL_AND_INTERFACE = "VI"; + +void AgentList::broadcastToAgents(char *broadcastData, size_t dataBytes,const char* agentTypes) { for(std::vector::iterator agent = agents.begin(); agent != agents.end(); agent++) { - // for now assume we only want to send to other interface clients - // until the Audio class uses the AgentList - if (agent->getActiveSocket() != NULL && (agent->getType() == 'I' || agent->getType() == 'V')) { + // only send to the AgentTypes we are asked to send to. + if (agent->getActiveSocket() != NULL && strchr(agentTypes,agent->getType())) { // we know which socket is good for this agent, send there agentSocket.send(agent->getActiveSocket(), broadcastData, dataBytes); } diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index 34a927b1fc..99146c1984 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -28,6 +28,7 @@ extern char DOMAIN_HOSTNAME[]; extern char DOMAIN_IP[100]; // IP Address will be re-set by lookup on startup extern const int DOMAINSERVER_PORT; + class AgentList { UDPSocket agentSocket; @@ -56,7 +57,7 @@ public: bool addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId); void processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes); void updateAgentWithData(sockaddr *senderAddress, void *packetData, size_t dataBytes); - void broadcastToAgents(char *broadcastData, size_t dataBytes); + void broadcastToAgents(char *broadcastData, size_t dataBytes, const char* agentTypes); void pingAgents(); char getOwnerType(); unsigned int getSocketListenPort(); @@ -65,6 +66,10 @@ public: void stopSilentAgentRemovalThread(); void startDomainServerCheckInThread(); void stopDomainServerCheckInThread(); + + static const char* AGENTS_OF_TYPE_HEAD; + static const char* AGENTS_OF_TYPE_VOXEL_AND_INTERFACE; + }; int unpackAgentId(unsigned char *packedData, uint16_t *agentId); diff --git a/shared/src/VoxelTree.cpp b/shared/src/VoxelTree.cpp index 03c1ca5a15..c9136e9d33 100644 --- a/shared/src/VoxelTree.cpp +++ b/shared/src/VoxelTree.cpp @@ -388,6 +388,27 @@ unsigned char * VoxelTree::loadBitstreamBuffer(unsigned char *& bitstreamBuffer, return childStopOctalCode; } +void VoxelTree::processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes) { + // XXXBHG: validate buffer is at least 4 bytes long? other guards?? + unsigned short int itemNumber = (*((unsigned short int*)&bitstream[1])); + printf("processRemoveVoxelBitstream() receivedBytes=%d itemNumber=%d\n",bufferSizeBytes,itemNumber); + int atByte = 3; + unsigned char* pVoxelData = (unsigned char*)&bitstream[3]; + while (atByte < bufferSizeBytes) { + unsigned char octets = (unsigned char)*pVoxelData; + int voxelDataSize = bytesRequiredForCodeLength(octets)+3; // 3 for color! + + float* vertices = firstVertexForCode(pVoxelData); + printf("deleting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); + delete []vertices; + + deleteVoxelCodeFromTree(pVoxelData); + + pVoxelData+=voxelDataSize; + atByte+=voxelDataSize; + } +} + void VoxelTree::printTreeForDebugging(VoxelNode *startNode) { int colorMask = 0; diff --git a/shared/src/VoxelTree.h b/shared/src/VoxelTree.h index 1c19505da1..726aa9ab9b 100644 --- a/shared/src/VoxelTree.h +++ b/shared/src/VoxelTree.h @@ -27,7 +27,8 @@ public: VoxelNode *rootNode; int leavesWrittenToBitstream; - + + void processRemoveVoxelBitstream(unsigned char * bitstream, int bufferSizeBytes); void readBitstreamToTree(unsigned char * bitstream, int bufferSizeBytes); void readCodeColorBufferToTree(unsigned char *codeColorBuffer); void deleteVoxelCodeFromTree(unsigned char *codeBuffer); diff --git a/voxel/src/main.cpp b/voxel/src/main.cpp index db79ddff65..8e1bb52535 100644 --- a/voxel/src/main.cpp +++ b/voxel/src/main.cpp @@ -292,26 +292,15 @@ int main(int argc, const char * argv[]) } } if (packetData[0] == 'R') { - unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); - printf("got R - remove voxels - command from client receivedBytes=%ld itemNumber=%d\n",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! - float* vertices = firstVertexForCode(pVoxelData); - printf("deleting voxel at: %f,%f,%f\n",vertices[0],vertices[1],vertices[2]); - delete []vertices; + // Send these bits off to the VoxelTree class to process them + printf("got Remove Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); + randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); - randomTree.deleteVoxelCodeFromTree(pVoxelData); - - - //printf("readCodeColorBufferToTree() of size=%d atByte=%d receivedBytes=%ld\n",voxelDataSize,atByte,receivedBytes); - // skip to next - pVoxelData+=voxelDataSize; - atByte+=voxelDataSize; - } + // Now send this to the connected agents so they know to delete + printf("rebroadcasting delete voxel message to connected agents... agentList.broadcastToAgents()\n"); + agentList.broadcastToAgents(packetData,receivedBytes,AgentList::AGENTS_OF_TYPE_HEAD); + } if (packetData[0] == 'H') { if (agentList.addOrUpdateAgent(&agentPublicAddress,