From 589e524090e9184fe527f99b6a7ff4865cd3b7e2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 10:24:09 -0700 Subject: [PATCH 1/9] remove debugging and a couple of lines --- audio-mixer/src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 9b594ec054..1427a4097b 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -199,9 +199,7 @@ void *sendBuffer(void *args) { if (s < numSamplesDelay) { // pull the earlier sample for the delayed channel - int earlierSample = delaySamplePointer[s] * attenuationCoefficient; - plateauAdditionOfSamples(delayedChannel[s], earlierSample * weakChannelAmplitudeRatio); } From 43a377563356a3fd32e0b0f4aa2c34dbd160f334 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 11:16:05 -0700 Subject: [PATCH 2/9] add _ownerID member variable to AgentList --- libraries/shared/src/AgentList.cpp | 7 ++----- libraries/shared/src/AgentList.h | 9 +++++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 51a14d8cb1..8f17b75af3 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -62,8 +62,9 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : _agentBuckets(), _numAgents(0), agentSocket(newSocketListenPort), - ownerType(newOwnerType), + _ownerType(newOwnerType), socketListenPort(newSocketListenPort), + _ownerID(-1), lastAgentId(0) { pthread_mutex_init(&mutex, 0); } @@ -81,10 +82,6 @@ UDPSocket& AgentList::getAgentSocket() { return agentSocket; } -char AgentList::getOwnerType() { - return ownerType; -} - unsigned int AgentList::getSocketListenPort() { return socketListenPort; } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 1a7a99b751..5544c3c0fd 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -70,9 +70,13 @@ public: int updateAgentWithData(Agent *agent, unsigned char *packetData, int dataBytes); void broadcastToAgents(unsigned char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes); - char getOwnerType(); unsigned int getSocketListenPort(); + char getOwnerType() const { return _ownerType; } + + uint16_t getOwnerID() const { return _ownerID; } + void setOwnerID(uint16_t ownerID) { _ownerID = ownerID; } + Agent* soloAgentOfType(char agentType); void startSilentAgentRemovalThread(); @@ -96,8 +100,9 @@ private: Agent** _agentBuckets[MAX_NUM_AGENTS / AGENTS_PER_BUCKET]; int _numAgents; UDPSocket agentSocket; - char ownerType; + char _ownerType; unsigned int socketListenPort; + uint16_t _ownerID; uint16_t lastAgentId; pthread_t removeSilentAgentsThread; pthread_t checkInWithDomainServerThread; From 722205682e868e07486ddc590a50aa7197648938 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 11:28:10 -0700 Subject: [PATCH 3/9] expect domain server to append one's own ID to end of packet --- domain-server/src/main.cpp | 21 ++++++++++++++------- libraries/shared/src/AgentList.cpp | 11 +++++++---- libraries/shared/src/AgentList.h | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 753009ffa9..95da95c210 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -86,7 +86,6 @@ int main(int argc, const char * argv[]) unsigned char* currentBufferPos; unsigned char* startPointer; - int packetBytesWithoutLeadingChar; sockaddr_in agentPublicAddress, agentLocalAddress; agentLocalAddress.sin_family = AF_INET; @@ -95,6 +94,8 @@ int main(int argc, const char * argv[]) agentList->startSilentAgentRemovalThread(); + uint16_t packetAgentID = 0; + while (true) { if (agentList->getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes) && (packetData[0] == PACKET_HEADER_DOMAIN_RFD || packetData[0] == PACKET_HEADER_DOMAIN_LIST_REQUEST)) { @@ -143,13 +144,17 @@ int main(int argc, const char * argv[]) } } else { double timeNow = usecTimestampNow(); + // this is the agent, just update last receive to now agent->setLastHeardMicrostamp(timeNow); + // grab the ID for this agent so we can send it back with the packet + packetAgentID = agent->getAgentId(); + if (packetData[0] == PACKET_HEADER_DOMAIN_RFD && memchr(SOLO_AGENT_TYPES, agentType, sizeof(SOLO_AGENT_TYPES))) { agent->setWakeMicrostamp(timeNow); - } + } } } @@ -160,11 +165,13 @@ int main(int argc, const char * argv[]) currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, soloAgent->second); } - if ((packetBytesWithoutLeadingChar = (currentBufferPos - startPointer))) { - agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress, - broadcastPacket, - packetBytesWithoutLeadingChar + 1); - } + // add the agent ID to the end of the pointer + currentBufferPos += packAgentId(currentBufferPos, packetAgentID); + + // send the constructed list back to this agent + agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress, + broadcastPacket, + (currentBufferPos - startPointer) + 1); } } diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 8f17b75af3..213a6a55ab 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -89,7 +89,7 @@ unsigned int AgentList::getSocketListenPort() { void AgentList::processAgentData(sockaddr *senderAddress, unsigned char *packetData, size_t dataBytes) { switch (((char *)packetData)[0]) { case PACKET_HEADER_DOMAIN: { - updateList(packetData, dataBytes); + processDomainServerList(packetData, dataBytes); break; } case PACKET_HEADER_PING: { @@ -200,7 +200,7 @@ void AgentList::increaseAgentId() { ++lastAgentId; } -int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { +int AgentList::processDomainServerList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; char agentType; @@ -215,14 +215,17 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { unsigned char *readPtr = packetData + 1; unsigned char *startPtr = packetData; - while((readPtr - startPtr) < dataBytes) { + while((readPtr - startPtr) < dataBytes - sizeof(uint16_t)) { agentType = *readPtr++; readPtr += unpackAgentId(readPtr, (uint16_t *)&agentId); readPtr += unpackSocket(readPtr, (sockaddr *)&agentPublicSocket); readPtr += unpackSocket(readPtr, (sockaddr *)&agentLocalSocket); addOrUpdateAgent((sockaddr *)&agentPublicSocket, (sockaddr *)&agentLocalSocket, agentType, agentId); - } + } + + // read out our ID from the packet + unpackAgentId(readPtr, &_ownerID); return readAgents; } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 5544c3c0fd..f9c9b35341 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -56,7 +56,7 @@ public: void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } - int updateList(unsigned char *packetData, size_t dataBytes); + int processDomainServerList(unsigned char *packetData, size_t dataBytes); Agent* agentWithAddress(sockaddr *senderAddress); Agent* agentWithID(uint16_t agentID); From 4eeb1ed5b1295e8ab5af6ab6b031fcbe35e135c4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 11:44:27 -0700 Subject: [PATCH 4/9] have interface clients tell the avatar-mixer and voxel-server what their ID is --- avatar-mixer/src/main.cpp | 13 ++++++++----- interface/src/main.cpp | 23 ++++++++++++++--------- libraries/avatars/src/AvatarData.cpp | 4 ++-- voxel-server/src/main.cpp | 9 +++------ 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index e3fb26ade3..5f1de38da7 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -69,17 +69,20 @@ int main(int argc, const char* argv[]) *broadcastPacket = PACKET_HEADER_BULK_AVATAR_DATA; unsigned char* currentBufferPosition = NULL; + + uint16_t agentID = 0; while (true) { if (agentList->getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { switch (packetData[0]) { case PACKET_HEADER_HEAD_DATA: - // add this agent if we don't have them yet - if (agentList->addOrUpdateAgent(agentAddress, agentAddress, AGENT_TYPE_AVATAR, agentList->getLastAgentId())) { - agentList->increaseAgentId(); - } + // grab the agent ID from the packet + unpackAgentId(packetData + 1, &agentID); - // this is positional data from an agent + // add or update the agent in our list + agentList->addOrUpdateAgent(agentAddress, agentAddress, AGENT_TYPE_AVATAR, agentID); + + // parse positional data from an agent agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); currentBufferPosition = broadcastPacket + 1; diff --git a/interface/src/main.cpp b/interface/src/main.cpp index a341835206..cd11a39063 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -436,17 +436,22 @@ void updateAvatar(float frametime) { myAvatar.setCameraAspectRatio(::viewFrustum.getAspectRatio()); myAvatar.setCameraNearClip(::viewFrustum.getNearClip()); myAvatar.setCameraFarClip(::viewFrustum.getFarClip()); - - // Send my stream of head/hand data to the avatar mixer and voxel server - unsigned char broadcastString[200]; - *broadcastString = PACKET_HEADER_HEAD_DATA; - int broadcastBytes = myAvatar.getBroadcastData(broadcastString + 1); - broadcastBytes++; + AgentList *agentList = AgentList::getInstance(); - const char broadcastReceivers[2] = {AGENT_TYPE_VOXEL, AGENT_TYPE_AVATAR_MIXER}; - - AgentList::getInstance()->broadcastToAgents(broadcastString, broadcastBytes, broadcastReceivers, 2); + if (agentList->getOwnerID() >= 0) { + // if I know my ID, send head/hand data to the avatar mixer and voxel server + unsigned char broadcastString[200]; + unsigned char* endOfBroadcastStringWrite = broadcastString; + + *(endOfBroadcastStringWrite++) = PACKET_HEADER_HEAD_DATA; + endOfBroadcastStringWrite += packAgentId(endOfBroadcastStringWrite, agentList->getOwnerID()); + + endOfBroadcastStringWrite += myAvatar.getBroadcastData(endOfBroadcastStringWrite); + + const char broadcastReceivers[2] = {AGENT_TYPE_VOXEL, AGENT_TYPE_AVATAR_MIXER}; + AgentList::getInstance()->broadcastToAgents(broadcastString, endOfBroadcastStringWrite - broadcastString, broadcastReceivers, 2); + } // If I'm in paint mode, send a voxel out to VOXEL server agents. if (::paintOn) { diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 8881c397af..bd866091a0 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -128,8 +128,8 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { // called on the other agents - assigns it to my views of the others int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { - // increment to push past the packet header - sourceBuffer++; + // increment to push past the packet header and agent ID + sourceBuffer += 3; unsigned char* startPosition = sourceBuffer; diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 7e39eb5483..4ba05b4ac2 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -547,12 +547,9 @@ int main(int argc, const char * argv[]) // 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. if (packetData[0] == PACKET_HEADER_HEAD_DATA) { - if (agentList->addOrUpdateAgent(&agentPublicAddress, - &agentPublicAddress, - AGENT_TYPE_AVATAR, - agentList->getLastAgentId())) { - agentList->increaseAgentId(); - } + uint16_t agentID = 0; + unpackAgentId(packetData + 1, &agentID); + agentList->addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, AGENT_TYPE_AVATAR, agentID); agentList->updateAgentWithData(&agentPublicAddress, packetData, receivedBytes); } From 5c90b4575e27c42ec096fd5aaa56dc4d18783d43 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 11:48:02 -0700 Subject: [PATCH 5/9] trivial deletions for cleanup --- avatar-mixer/src/main.cpp | 3 +-- interface/src/main.cpp | 10 ++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index 5f1de38da7..74b731fdc5 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -51,8 +51,7 @@ void attachAvatarDataToAgent(Agent *newAgent) { } } -int main(int argc, const char* argv[]) -{ +int main(int argc, const char* argv[]) { AgentList* agentList = AgentList::createInstance(AGENT_TYPE_AVATAR_MIXER, AVATAR_LISTEN_PORT); setvbuf(stdout, NULL, _IOLBF, 0); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index cd11a39063..4945c44123 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1438,8 +1438,7 @@ void setupPaintingVoxel() { shiftPaintingColor(); } -void addRandomSphere(bool wantColorRandomizer) -{ +void addRandomSphere(bool wantColorRandomizer) { float r = randFloatInRange(0.05,0.1); float xc = randFloatInRange(r,(1-r)); float yc = randFloatInRange(r,(1-r)); @@ -1770,10 +1769,6 @@ void reshape(int width, int height) { glLoadIdentity(); } - - - - //Find and return the gravity vector at this location glm::vec3 getGravity(glm::vec3 pos) { // @@ -1832,8 +1827,7 @@ void audioMixerUpdate(in_addr_t newMixerAddress, in_port_t newMixerPort) { } #endif -int main(int argc, const char * argv[]) -{ +int main(int argc, const char * argv[]) { voxels.setViewFrustum(&::viewFrustum); shared_lib::printLog = & ::printLog; From 83e59b1aa89dc4921e38382cf5ca86ca9e52300d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 11:49:14 -0700 Subject: [PATCH 6/9] more deletions --- interface/src/main.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 4945c44123..d27dabecc2 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -14,14 +14,6 @@ // // Welcome Aboard! // -// -// Keyboard Commands: -// -// / = toggle stats display -// spacebar = reset gyros/head position -// h = render Head facing yourself (mirror) -// l = show incoming gyro levels -// #include "InterfaceConfig.h" #include @@ -1385,8 +1377,7 @@ void initMenu() { menuColumnDebug->addRow("Show TRUE Colors", doTrueVoxelColors); } -void testPointToVoxel() -{ +void testPointToVoxel() { float y=0; float z=0; float s=0.1; @@ -1455,7 +1446,6 @@ void addRandomSphere(bool wantColorRandomizer) { voxels.createSphere(r,xc,yc,zc,s,solid,wantColorRandomizer); } - const float KEYBOARD_YAW_RATE = 0.8; const float KEYBOARD_PITCH_RATE = 0.6; const float KEYBOARD_STRAFE_RATE = 0.03; @@ -1509,7 +1499,6 @@ void specialkey(int k, int x, int y) { } } - void keyUp(unsigned char k, int x, int y) { if (::chatEntryOn) { myAvatar.setKeyState(NO_KEY_DOWN); @@ -1524,8 +1513,7 @@ void keyUp(unsigned char k, int x, int y) { if (k == 'd') myAvatar.setDriveKeys(ROT_RIGHT, 0); } -void key(unsigned char k, int x, int y) -{ +void key(unsigned char k, int x, int y) { if (::chatEntryOn) { if (chatEntry.key(k)) { myAvatar.setKeyState(k == '\b' || k == 127 ? // backspace or delete From 85dfb23fbd766cd86b663261dd03761c5f9cdefe Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 12:39:35 -0700 Subject: [PATCH 7/9] add constant for UNKNOWN_AGENT_ID --- interface/src/main.cpp | 2 +- libraries/shared/src/AgentList.cpp | 2 +- libraries/shared/src/AgentList.h | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index d27dabecc2..74fccc50c4 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -431,7 +431,7 @@ void updateAvatar(float frametime) { AgentList *agentList = AgentList::getInstance(); - if (agentList->getOwnerID() >= 0) { + if (agentList->getOwnerID() != UNKNOWN_AGENT_ID) { // if I know my ID, send head/hand data to the avatar mixer and voxel server unsigned char broadcastString[200]; unsigned char* endOfBroadcastStringWrite = broadcastString; diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 213a6a55ab..82a21ae479 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -64,7 +64,7 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : agentSocket(newSocketListenPort), _ownerType(newOwnerType), socketListenPort(newSocketListenPort), - _ownerID(-1), + _ownerID(UNKNOWN_AGENT_ID), lastAgentId(0) { pthread_mutex_init(&mutex, 0); } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index f9c9b35341..1956916211 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -31,6 +31,8 @@ extern char DOMAIN_HOSTNAME[]; extern char DOMAIN_IP[100]; // IP Address will be re-set by lookup on startup extern const int DOMAINSERVER_PORT; +const int UNKNOWN_AGENT_ID = -1; + class AgentListIterator; class AgentList { From 5ccc6d6d203b740e83920fadfe712461226fa4e9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 12:42:10 -0700 Subject: [PATCH 8/9] prefer sizeOf to hardcoded byte --- 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 4ba05b4ac2..380f2cc794 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -548,7 +548,7 @@ int main(int argc, const char * argv[]) // need to make sure we have it in our agentList. if (packetData[0] == PACKET_HEADER_HEAD_DATA) { uint16_t agentID = 0; - unpackAgentId(packetData + 1, &agentID); + unpackAgentId(packetData + sizeof(PACKET_HEADER_HEAD_DATA), &agentID); agentList->addOrUpdateAgent(&agentPublicAddress, &agentPublicAddress, AGENT_TYPE_AVATAR, agentID); agentList->updateAgentWithData(&agentPublicAddress, packetData, receivedBytes); From 0566330a8a2a07a7c35702b080bbd4c954b553d5 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 12:44:45 -0700 Subject: [PATCH 9/9] some magic number removals --- interface/src/main.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 74fccc50c4..704200d24c 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -442,7 +442,7 @@ void updateAvatar(float frametime) { endOfBroadcastStringWrite += myAvatar.getBroadcastData(endOfBroadcastStringWrite); const char broadcastReceivers[2] = {AGENT_TYPE_VOXEL, AGENT_TYPE_AVATAR_MIXER}; - AgentList::getInstance()->broadcastToAgents(broadcastString, endOfBroadcastStringWrite - broadcastString, broadcastReceivers, 2); + AgentList::getInstance()->broadcastToAgents(broadcastString, endOfBroadcastStringWrite - broadcastString, broadcastReceivers, sizeof(broadcastReceivers)); } // If I'm in paint mode, send a voxel out to VOXEL server agents. diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index bd866091a0..3136b3e30a 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -129,7 +129,7 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { // increment to push past the packet header and agent ID - sourceBuffer += 3; + sourceBuffer += sizeof(PACKET_HEADER_HEAD_DATA) + sizeof(uint16_t); unsigned char* startPosition = sourceBuffer;