From ff88d1fc069820c8a4aa61d98ea80f4b89eb2a74 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 6 May 2013 16:18:27 -0700 Subject: [PATCH 01/32] Created a drawVector() call that will draw a vector in 3-space with axes for testing --- interface/src/Util.cpp | 50 +++++++++++++++++++++--------------------- interface/src/Util.h | 4 +++- interface/src/main.cpp | 9 ++++++++ 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 94e0e826d1..355dec185c 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -65,46 +65,47 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float return atan2(head_pos.x - source_pos.x, head_pos.z - source_pos.z) * 180.0f / PIf + render_yaw + head_yaw; } -void render_vector(glm::vec3 * vec) +// Draw a 3D vector floating in space +void drawVector(glm::vec3 * vector) { - // Show edge of world glDisable(GL_LIGHTING); - glColor4f(1.0, 1.0, 1.0, 1.0); - glLineWidth(1.0); - glBegin(GL_LINES); + glEnable(GL_POINT_SMOOTH); + glPointSize(3.0); + glLineWidth(2.0); + // Draw axes + glBegin(GL_LINES); glColor3f(1,0,0); - glVertex3f(-1,0,0); + glVertex3f(0,0,0); glVertex3f(1,0,0); glColor3f(0,1,0); - glVertex3f(0,-1,0); + glVertex3f(0,0,0); glVertex3f(0, 1, 0); glColor3f(0,0,1); - glVertex3f(0,0,-1); + glVertex3f(0,0,0); glVertex3f(0, 0, 1); - // Draw vector + glEnd(); + + // Draw the vector itself + glBegin(GL_LINES); glColor3f(1,1,1); glVertex3f(0,0,0); - glVertex3f(vec->x, vec->y, vec->z); - // Draw marker dots for magnitude + glVertex3f(vector->x, vector->y, vector->z); glEnd(); - float particleAttenuationQuadratic[] = { 0.0f, 0.0f, 2.0f }; // larger Z = smaller particles - float particleAttenuationConstant[] = { 1.0f, 0.0f, 0.0f }; - - glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particleAttenuationQuadratic ); - glEnable(GL_POINT_SMOOTH); - glPointSize(10.0); - glBegin(GL_POINTS); + // Draw spheres for magnitude + glPushMatrix(); glColor3f(1,0,0); - glVertex3f(vec->x,0,0); + glTranslatef(vector->x,0,0); + glutSolidSphere(0.02, 10, 10); glColor3f(0,1,0); - glVertex3f(0,vec->y,0); + glTranslatef(-vector->x, vector->y, 0); + glutSolidSphere(0.02, 10, 10); glColor3f(0,0,1); - glVertex3f(0,0,vec->z); - glEnd(); + glTranslatef(0, -vector->y, vector->z); + glutSolidSphere(0.02, 10, 10); + glPopMatrix(); - glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, particleAttenuationConstant ); } void render_world_box() @@ -184,7 +185,6 @@ void drawtext(int x, int y, float scale, float rotate, float thick, int mono, } - void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, glm::vec3 vec, float r, float g, float b) { @@ -209,7 +209,7 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl } glPopMatrix(); -} +} void drawGroundPlaneGrid(float size) { diff --git a/interface/src/Util.h b/interface/src/Util.h index ed253f4393..7ea65bef4c 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -33,13 +33,15 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float float randFloat(); void render_world_box(); -void render_vector(glm::vec3 * vec); int widthText(float scale, int mono, char const* string); float widthChar(float scale, int mono, char ch); void drawtext(int x, int y, float scale, float rotate, float thick, int mono, char const* string, float r=1.0, float g=1.0, float b=1.0); void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, glm::vec3 vec, float r=1.0, float g=1.0, float b=1.0); + +void drawVector(glm::vec3* vector); + double diffclock(timeval *clock1,timeval *clock2); void drawGroundPlaneGrid(float size); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 8916fcd319..44b450ce46 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1081,6 +1081,15 @@ void display(void) // important... myCamera.update( 1.f/FPS ); + + // Render anything (like HUD items) that we want to be in 3D but not in worldspace + const float HUD_Z_OFFSET = -5.f; + glPushMatrix(); + glm::vec3 test(0.5, 0.5, 0.5); + glTranslatef(1, 1, HUD_Z_OFFSET); + drawVector(&test); + glPopMatrix(); + // Note: whichCamera is used to pick between the normal camera myCamera for our // main camera, vs, an alternate camera. The alternate camera we support right now From 69cac10cee2376a64ba2d4ac9261f15ebf690a5f Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 6 May 2013 18:21:33 -0700 Subject: [PATCH 02/32] null change --- libraries/voxels/src/AABox.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 libraries/voxels/src/AABox.cpp diff --git a/libraries/voxels/src/AABox.cpp b/libraries/voxels/src/AABox.cpp old mode 100755 new mode 100644 From 00c8673cebeb654d210c3291a2c43a10b81c4eec Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 6 May 2013 18:45:06 -0700 Subject: [PATCH 03/32] Added Utility function angleBetween() which returns the positive angle between any two 3D vectors. --- interface/src/Avatar.cpp | 8 ++++++++ interface/src/Util.cpp | 5 +++++ interface/src/Util.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index a1a93fbfe3..70e3907b4a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -469,6 +469,14 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) { glm::vec3 v(_joint[ AVATAR_JOINT_RIGHT_SHOULDER ].position); v -= otherAvatar->getJointPosition(AVATAR_JOINT_RIGHT_SHOULDER); + /* + // Test: Show angle between your fwd vector and nearest avatar + glm::vec3 vectorBetweenUs = otherAvatar->getJointPosition(AVATAR_JOINT_PELVIS) - + getJointPosition(AVATAR_JOINT_PELVIS); + glm::vec3 myForwardVector = _orientation.getFront(); + printLog("Angle between: %f\n", angleBetween(&vectorBetweenUs, &myForwardVector)); + */ + float distance = glm::length(v); if (distance < _distanceToNearestAvatar) {_distanceToNearestAvatar = distance;} diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 355dec185c..430d200af1 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -65,6 +65,11 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float return atan2(head_pos.x - source_pos.x, head_pos.z - source_pos.z) * 180.0f / PIf + render_yaw + head_yaw; } +// Helper function computes the angle between two 3D vectors +float angleBetween(glm::vec3 * v1, glm::vec3 * v2) { + return acos((glm::dot(*v1,*v2))/(glm::length(*v1) * glm::length(*v2))) * 180.f/PI; +} + // Draw a 3D vector floating in space void drawVector(glm::vec3 * vector) { diff --git a/interface/src/Util.h b/interface/src/Util.h index 7ea65bef4c..add347fb3b 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -42,6 +42,8 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl void drawVector(glm::vec3* vector); +float angleBetween(glm::vec3 * v1, glm::vec3 * v2); + double diffclock(timeval *clock1,timeval *clock2); void drawGroundPlaneGrid(float size); From 31593dccd419d09a4c0649c3266d8130b93ae024 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 6 May 2013 18:46:19 -0700 Subject: [PATCH 04/32] improved comment of function --- interface/src/Util.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 430d200af1..9159fb77cc 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -65,7 +65,7 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float return atan2(head_pos.x - source_pos.x, head_pos.z - source_pos.z) * 180.0f / PIf + render_yaw + head_yaw; } -// Helper function computes the angle between two 3D vectors +// Helper function returns the positive angle in degrees between two 3D vectors float angleBetween(glm::vec3 * v1, glm::vec3 * v2) { return acos((glm::dot(*v1,*v2))/(glm::length(*v1) * glm::length(*v2))) * 180.f/PI; } From 27540f1286139aa9723b90493b7bbf3403cabd17 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 7 May 2013 09:59:37 -0700 Subject: [PATCH 05/32] Fixes per code review --- interface/src/Util.cpp | 45 ++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 282acd1f03..e70aabcd2a 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -67,12 +67,11 @@ float angle_to(glm::vec3 head_pos, glm::vec3 source_pos, float render_yaw, float // Helper function returns the positive angle in degrees between two 3D vectors float angleBetween(glm::vec3 * v1, glm::vec3 * v2) { - return acos((glm::dot(*v1,*v2))/(glm::length(*v1) * glm::length(*v2))) * 180.f/PI; + return acos((glm::dot(*v1, *v2)) / (glm::length(*v1) * glm::length(*v2))) * 180.f / PI; } // Draw a 3D vector floating in space -void drawVector(glm::vec3 * vector) -{ +void drawVector(glm::vec3 * vector) { glDisable(GL_LIGHTING); glEnable(GL_POINT_SMOOTH); glPointSize(3.0); @@ -101,7 +100,7 @@ void drawVector(glm::vec3 * vector) // Draw spheres for magnitude glPushMatrix(); glColor3f(1,0,0); - glTranslatef(vector->x,0,0); + glTranslatef(vector->x, 0, 0); glutSolidSphere(0.02, 10, 10); glColor3f(0,1,0); glTranslatef(-vector->x, vector->y, 0); @@ -113,39 +112,38 @@ void drawVector(glm::vec3 * vector) } -void render_world_box() -{ +void render_world_box() { // Show edge of world glDisable(GL_LIGHTING); glColor4f(1.0, 1.0, 1.0, 1.0); glLineWidth(1.0); glBegin(GL_LINES); - glColor3f(1,0,0); - glVertex3f(0,0,0); - glVertex3f(WORLD_SIZE,0,0); - glColor3f(0,1,0); - glVertex3f(0,0,0); + glColor3f(1, 0, 0); + glVertex3f(0, 0, 0); + glVertex3f(WORLD_SIZE, 0, 0); + glColor3f(0, 1, 0); + glVertex3f(0, 0, 0); glVertex3f(0, WORLD_SIZE, 0); - glColor3f(0,0,1); - glVertex3f(0,0,0); + glColor3f(0, 0, 1); + glVertex3f(0, 0, 0); glVertex3f(0, 0, WORLD_SIZE); glEnd(); // Draw little marker dots along the axis glEnable(GL_LIGHTING); glPushMatrix(); - glTranslatef(WORLD_SIZE,0,0); - glColor3f(1,0,0); - glutSolidSphere(0.125,10,10); + glTranslatef(WORLD_SIZE, 0, 0); + glColor3f(1, 0, 0); + glutSolidSphere(0.125, 10, 10); glPopMatrix(); glPushMatrix(); - glTranslatef(0,WORLD_SIZE,0); - glColor3f(0,1,0); - glutSolidSphere(0.125,10,10); + glTranslatef(0, WORLD_SIZE, 0); + glColor3f(0, 1, 0); + glutSolidSphere(0.125, 10, 10); glPopMatrix(); glPushMatrix(); - glTranslatef(0,0,WORLD_SIZE); - glColor3f(0,0,1); - glutSolidSphere(0.125,10,10); + glTranslatef(0, 0, WORLD_SIZE); + glColor3f(0, 0, 1); + glutSolidSphere(0.125, 10, 10); glPopMatrix(); } @@ -172,8 +170,7 @@ float widthChar(float scale, int mono, char ch) { } void drawtext(int x, int y, float scale, float rotate, float thick, int mono, - char const* string, float r, float g, float b) -{ + char const* string, float r, float g, float b) { // // Draws text on screen as stroked so it can be resized // From be1b80365652fc47bae22ef3ee25a6415266e34c Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 7 May 2013 10:41:39 -0700 Subject: [PATCH 06/32] Noise Test function, adjust chat position --- interface/src/Avatar.cpp | 4 ++-- interface/src/Util.cpp | 23 +++++++++++++++++++++++ interface/src/Util.h | 2 ++ interface/src/main.cpp | 2 ++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index b658096ea8..1983de906a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -62,8 +62,8 @@ bool usingBigSphereCollisionTest = true; char iris_texture_file[] = "resources/images/green_eye.png"; -float chatMessageScale = 0.001; -float chatMessageHeight = 0.4; +float chatMessageScale = 0.0015; +float chatMessageHeight = 0.45; vector iris_texture; unsigned int iris_texture_width = 512; diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index e70aabcd2a..58cf1f61ad 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -112,6 +113,28 @@ void drawVector(glm::vec3 * vector) { } +// Render a 2D set of squares using perlin/fractal noise +void noiseTest(int w, int h) { + const float CELLS = 100; + float xStep = (float) w / CELLS; + float yStep = (float) h / CELLS; + glBegin(GL_QUADS); + for (float x = 0; x < (float)w; x += xStep) { + for (float y = 0; y < (float)h; y += yStep) { + // Generate a vector varying between 0-1 corresponding to the screen location + glm::vec2 position(x / (float) w, y / (float) h); + // Set the cell color using the noise value at that location + float color = glm::simplex(position); + glColor4f(color, color, color, 1.0); + glVertex2f(x, y); + glVertex2f(x + xStep, y); + glVertex2f(x + xStep, y + yStep); + glVertex2f(x, y + yStep); + } + } + glEnd(); +} + void render_world_box() { // Show edge of world glDisable(GL_LIGHTING); diff --git a/interface/src/Util.h b/interface/src/Util.h index b81edd8c87..d4a6ba6b03 100644 --- a/interface/src/Util.h +++ b/interface/src/Util.h @@ -40,6 +40,8 @@ void drawtext(int x, int y, float scale, float rotate, float thick, int mono, void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, glm::vec3 vec, float r=1.0, float g=1.0, float b=1.0); +void noiseTest(int w, int h); + void drawVector(glm::vec3* vector); float angleBetween(glm::vec3 * v1, glm::vec3 * v2); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index a4ef86024b..a341835206 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -893,6 +893,8 @@ void displayOverlay() { audioScope.render(); #endif + // noiseTest(WIDTH, HEIGHT); + if (displayHeadMouse && !::lookingInMirror && statsOn) { // Display small target box at center or head mouse target that can also be used to measure LOD glColor3f(1.0, 1.0, 1.0); From 331d4116d904bd36381df70a1c2520375f5ae636 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 7 May 2013 11:14:12 -0700 Subject: [PATCH 07/32] Finished noiseTest example (in util.h) that uses Perlin noise to draw a bitmap in 2D. --- interface/src/Util.cpp | 7 ++++--- interface/src/main.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index 58cf1f61ad..b4c7f3d6b0 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -115,16 +115,17 @@ void drawVector(glm::vec3 * vector) { // Render a 2D set of squares using perlin/fractal noise void noiseTest(int w, int h) { - const float CELLS = 100; + const float CELLS = 500; + const float NOISE_SCALE = 10.0; float xStep = (float) w / CELLS; float yStep = (float) h / CELLS; glBegin(GL_QUADS); for (float x = 0; x < (float)w; x += xStep) { for (float y = 0; y < (float)h; y += yStep) { // Generate a vector varying between 0-1 corresponding to the screen location - glm::vec2 position(x / (float) w, y / (float) h); + glm::vec2 position(NOISE_SCALE * x / (float) w, NOISE_SCALE * y / (float) h); // Set the cell color using the noise value at that location - float color = glm::simplex(position); + float color = glm::perlin(position); glColor4f(color, color, color, 1.0); glVertex2f(x, y); glVertex2f(x + xStep, y); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index a341835206..a448a1c2fa 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -893,7 +893,7 @@ void displayOverlay() { audioScope.render(); #endif - // noiseTest(WIDTH, HEIGHT); + //noiseTest(WIDTH, HEIGHT); if (displayHeadMouse && !::lookingInMirror && statsOn) { // Display small target box at center or head mouse target that can also be used to measure LOD From 589e524090e9184fe527f99b6a7ff4865cd3b7e2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 10:24:09 -0700 Subject: [PATCH 08/32] 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 09/32] 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 10/32] 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 11/32] 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 12/32] 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 13/32] 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 14/32] 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 15/32] 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 16/32] 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; From d5d9479b65a65170b5932902940c48c97c058b02 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 13:38:56 -0700 Subject: [PATCH 17/32] make eve send her ID to identify with the avatar mixer --- eve/src/main.cpp | 22 +++++++++++----------- interface/src/main.cpp | 5 ++--- libraries/shared/src/PacketHeaders.h | 27 ++++++++++++++------------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index ad0081fc3b..b72d1194a4 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -130,8 +130,6 @@ int main(int argc, const char* argv[]) { unsigned char broadcastPacket[MAX_PACKET_SIZE]; broadcastPacket[0] = PACKET_HEADER_HEAD_DATA; - int numBytesToSend = 0; - timeval thisSend; double numMicrosecondsSleep = 0; @@ -148,13 +146,16 @@ int main(int argc, const char* argv[]) { Agent *avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER); // make sure we actually have an avatar mixer with an active socket - if (avatarMixer != NULL && avatarMixer->getActiveSocket() != NULL) { + if (agentList->getOwnerID() != UNKNOWN_AGENT_ID && avatarMixer != NULL && avatarMixer->getActiveSocket() != NULL) { + unsigned char* packetPosition = broadcastPacket + sizeof(PACKET_HEADER); + packetPosition += packAgentId(packetPosition, agentList->getOwnerID()); + // use the getBroadcastData method in the AvatarData class to populate the broadcastPacket buffer - numBytesToSend = eve.getBroadcastData((broadcastPacket + 1)); + packetPosition += eve.getBroadcastData(packetPosition); // use the UDPSocket instance attached to our agent list to send avatar data to mixer - agentList->getAgentSocket().send(avatarMixer->getActiveSocket(), broadcastPacket, numBytesToSend); - } + agentList->getAgentSocket().send(avatarMixer->getActiveSocket(), broadcastPacket, packetPosition - broadcastPacket); + } // temporarily disable Eve's audio sending until the file is actually available on EC2 box if (numIterationsLeftBeforeAudioSend == 0) { @@ -175,13 +176,12 @@ int main(int argc, const char* argv[]) { // simulate the effect of pressing and un-pressing the mouse button/pad handStateTimer++; - if ( handStateTimer == 100 ) { + + if (handStateTimer == 100) { eve.setHandState(1); - } - if ( handStateTimer == 150 ) { + } else if (handStateTimer == 150) { eve.setHandState(0); - } - if ( handStateTimer >= 200 ) { + } else if (handStateTimer >= 200) { handStateTimer = 0; } } diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 704200d24c..756a1481c5 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -696,13 +696,12 @@ void displaySide(Camera& whichCamera) { drawGroundPlaneGrid(10.f); // Draw voxels - if (showingVoxels) - { + if (showingVoxels) { voxels.render(); } // Render avatars of other agents - AgentList* agentList = AgentList::getInstance(); + AgentList *agentList = AgentList::getInstance(); agentList->lock(); for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL && agent->getType() == AGENT_TYPE_AVATAR) { diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index 1ceb3fcc5a..152adc5805 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -13,18 +13,19 @@ #ifndef hifi_PacketHeaders_h #define hifi_PacketHeaders_h -const char PACKET_HEADER_DOMAIN = 'D'; -const char PACKET_HEADER_PING = 'P'; -const char PACKET_HEADER_PING_REPLY = 'R'; -const char PACKET_HEADER_HEAD_DATA = 'H'; -const char PACKET_HEADER_Z_COMMAND = 'Z'; -const char PACKET_HEADER_INJECT_AUDIO = 'I'; -const char PACKET_HEADER_SET_VOXEL = 'S'; -const char PACKET_HEADER_ERASE_VOXEL = 'E'; -const char PACKET_HEADER_VOXEL_DATA = 'V'; -const char PACKET_HEADER_BULK_AVATAR_DATA = 'X'; -const char PACKET_HEADER_TRANSMITTER_DATA = 't'; -const char PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; -const char PACKET_HEADER_DOMAIN_RFD = 'C'; +typedef char PACKET_HEADER; +const PACKET_HEADER PACKET_HEADER_DOMAIN = 'D'; +const PACKET_HEADER PACKET_HEADER_PING = 'P'; +const PACKET_HEADER PACKET_HEADER_PING_REPLY = 'R'; +const PACKET_HEADER PACKET_HEADER_HEAD_DATA = 'H'; +const PACKET_HEADER PACKET_HEADER_Z_COMMAND = 'Z'; +const PACKET_HEADER PACKET_HEADER_INJECT_AUDIO = 'I'; +const PACKET_HEADER PACKET_HEADER_SET_VOXEL = 'S'; +const PACKET_HEADER PACKET_HEADER_ERASE_VOXEL = 'E'; +const PACKET_HEADER PACKET_HEADER_VOXEL_DATA = 'V'; +const PACKET_HEADER PACKET_HEADER_BULK_AVATAR_DATA = 'X'; +const PACKET_HEADER PACKET_HEADER_TRANSMITTER_DATA = 't'; +const PACKET_HEADER PACKET_HEADER_DOMAIN_LIST_REQUEST = 'L'; +const PACKET_HEADER PACKET_HEADER_DOMAIN_RFD = 'C'; #endif From 9be92cebdd4638dc267db30bb26cb5ee19ea001e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 13:41:48 -0700 Subject: [PATCH 18/32] revert type squish, spacing, code review comment --- eve/src/main.cpp | 4 ++-- interface/src/main.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index b72d1194a4..08200c6606 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -143,10 +143,10 @@ int main(int argc, const char* argv[]) { gettimeofday(&thisSend, NULL); // find the current avatar mixer - Agent *avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER); + Agent* avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER); // make sure we actually have an avatar mixer with an active socket - if (agentList->getOwnerID() != UNKNOWN_AGENT_ID && avatarMixer != NULL && avatarMixer->getActiveSocket() != NULL) { + if (agentList->getOwnerID() != UNKNOWN_AGENT_ID && avatarMixer && avatarMixer->getActiveSocket() != NULL) { unsigned char* packetPosition = broadcastPacket + sizeof(PACKET_HEADER); packetPosition += packAgentId(packetPosition, agentList->getOwnerID()); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 756a1481c5..fad68d9c13 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -429,7 +429,7 @@ void updateAvatar(float frametime) { myAvatar.setCameraNearClip(::viewFrustum.getNearClip()); myAvatar.setCameraFarClip(::viewFrustum.getFarClip()); - AgentList *agentList = AgentList::getInstance(); + AgentList* agentList = AgentList::getInstance(); if (agentList->getOwnerID() != UNKNOWN_AGENT_ID) { // if I know my ID, send head/hand data to the avatar mixer and voxel server @@ -451,9 +451,9 @@ void updateAvatar(float frametime) { glm::vec3 avatarPos = myAvatar.getPosition(); // For some reason, we don't want to flip X and Z here. - ::paintingVoxel.x = avatarPos.x/10.0; - ::paintingVoxel.y = avatarPos.y/10.0; - ::paintingVoxel.z = avatarPos.z/10.0; + ::paintingVoxel.x = avatarPos.x / 10.0; + ::paintingVoxel.y = avatarPos.y / 10.0; + ::paintingVoxel.z = avatarPos.z / 10.0; unsigned char* bufferOut; int sizeOut; From 92daa8e6e05f31f9c3413ba7f9bb8c20ccd6c8f0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 13:43:07 -0700 Subject: [PATCH 19/32] revert the type squish --- interface/src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index fad68d9c13..4b34f9a2b0 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -701,7 +701,7 @@ void displaySide(Camera& whichCamera) { } // Render avatars of other agents - AgentList *agentList = AgentList::getInstance(); + AgentList* agentList = AgentList::getInstance(); agentList->lock(); for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL && agent->getType() == AGENT_TYPE_AVATAR) { From 3719454abd5904c00cab290d3a1373584cacfbe2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 13:47:12 -0700 Subject: [PATCH 20/32] use constants for eve's hand grabbing behavior --- eve/src/main.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 08200c6606..7c4bde7a2d 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -25,6 +25,10 @@ const int MIN_ITERATIONS_BETWEEN_AUDIO_SENDS = (MIN_AUDIO_SEND_INTERVAL_SECS * 1 const int MAX_AUDIO_SEND_INTERVAL_SECS = 15; const float MAX_ITERATIONS_BETWEEN_AUDIO_SENDS = (MAX_AUDIO_SEND_INTERVAL_SECS * 1000) / DATA_SEND_INTERVAL_MSECS; +const int ITERATIONS_BEFORE_HAND_GRAB = 100; +const int HAND_GRAB_DURATION_ITERATIONS = 50; +const int HAND_TIMER_SLEEP_ITERATIONS = 50; + bool stopReceiveAgentDataThread; bool injectAudioThreadRunning = false; @@ -177,11 +181,11 @@ int main(int argc, const char* argv[]) { // simulate the effect of pressing and un-pressing the mouse button/pad handStateTimer++; - if (handStateTimer == 100) { + if (handStateTimer == ITERATIONS_BEFORE_HAND_GRAB) { eve.setHandState(1); - } else if (handStateTimer == 150) { + } else if (handStateTimer == ITERATIONS_BEFORE_HAND_GRAB + HAND_GRAB_DURATION_ITERATIONS) { eve.setHandState(0); - } else if (handStateTimer >= 200) { + } else if (handStateTimer >= ITERATIONS_BEFORE_HAND_GRAB + HAND_GRAB_DURATION_ITERATIONS + HAND_TIMER_SLEEP_ITERATIONS) { handStateTimer = 0; } } From 00c11d82b270196d188c1e33aa2df00408ab98d1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 13:50:01 -0700 Subject: [PATCH 21/32] if the agent stops asking for loopback make sure the flag is set false --- libraries/shared/src/AudioRingBuffer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libraries/shared/src/AudioRingBuffer.cpp b/libraries/shared/src/AudioRingBuffer.cpp index f7cd256809..d48f95c754 100644 --- a/libraries/shared/src/AudioRingBuffer.cpp +++ b/libraries/shared/src/AudioRingBuffer.cpp @@ -122,6 +122,8 @@ int AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { bearing = bearing > 0 ? bearing - AGENT_LOOPBACK_MODIFIER : bearing + AGENT_LOOPBACK_MODIFIER; + } else { + _shouldLoopbackForAgent = false; } dataPtr += sizeof(float); From 82cff262b1906d79dae0479e97fe5d913b3da5ca Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 14:28:48 -0700 Subject: [PATCH 22/32] for agent loopback perform no distance and angle calculations --- audio-mixer/src/main.cpp | 127 ++++++++++++----------- libraries/shared/src/AudioRingBuffer.cpp | 5 +- 2 files changed, 68 insertions(+), 64 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 1427a4097b..82f307f8d4 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -120,73 +120,78 @@ void *sendBuffer(void *args) { AudioRingBuffer* otherAgentBuffer = (AudioRingBuffer*) otherAgent->getLinkedData(); if (otherAgentBuffer->shouldBeAddedToMix()) { - float *agentPosition = agentRingBuffer->getPosition(); - float *otherAgentPosition = otherAgentBuffer->getPosition(); + + float bearingRelativeAngleToSource = 0.f; + float attenuationCoefficient = 1.f; - // calculate the distance to the other agent - - // use the distance to the other agent to calculate the change in volume for this frame - int lowAgentIndex = std::min(agent.getAgentIndex(), otherAgent.getAgentIndex()); - int highAgentIndex = std::max(agent.getAgentIndex(), otherAgent.getAgentIndex()); - - if (distanceCoefficients[lowAgentIndex][highAgentIndex] == 0) { - float distanceToAgent = sqrtf(powf(agentPosition[0] - otherAgentPosition[0], 2) + - powf(agentPosition[1] - otherAgentPosition[1], 2) + - powf(agentPosition[2] - otherAgentPosition[2], 2)); + if (otherAgent != agent) { + float *agentPosition = agentRingBuffer->getPosition(); + float *otherAgentPosition = otherAgentBuffer->getPosition(); - float minCoefficient = std::min(1.0f, - powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); - distanceCoefficients[lowAgentIndex][highAgentIndex] = minCoefficient; - } - - - // get the angle from the right-angle triangle - float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), - fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); - float absoluteAngleToSource = 0; - float bearingRelativeAngleToSource = 0; - - - // find the angle we need for calculation based on the orientation of the triangle - if (otherAgentPosition[0] > agentPosition[0]) { - if (otherAgentPosition[2] > agentPosition[2]) { - absoluteAngleToSource = -90 + triangleAngle; - } else { - absoluteAngleToSource = -90 - triangleAngle; + // calculate the distance to the other agent + + // use the distance to the other agent to calculate the change in volume for this frame + int lowAgentIndex = std::min(agent.getAgentIndex(), otherAgent.getAgentIndex()); + int highAgentIndex = std::max(agent.getAgentIndex(), otherAgent.getAgentIndex()); + + if (distanceCoefficients[lowAgentIndex][highAgentIndex] == 0) { + float distanceToAgent = sqrtf(powf(agentPosition[0] - otherAgentPosition[0], 2) + + powf(agentPosition[1] - otherAgentPosition[1], 2) + + powf(agentPosition[2] - otherAgentPosition[2], 2)); + + float minCoefficient = std::min(1.0f, + powf(0.5, (logf(DISTANCE_RATIO * distanceToAgent) / logf(3)) - 1)); + distanceCoefficients[lowAgentIndex][highAgentIndex] = minCoefficient; } - } else { - if (otherAgentPosition[2] > agentPosition[2]) { - absoluteAngleToSource = 90 - triangleAngle; + + + // get the angle from the right-angle triangle + float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), + fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); + float absoluteAngleToSource = 0; + float bearingRelativeAngleToSource = 0; + + // find the angle we need for calculation based on the orientation of the triangle + if (otherAgentPosition[0] > agentPosition[0]) { + if (otherAgentPosition[2] > agentPosition[2]) { + absoluteAngleToSource = -90 + triangleAngle; + } else { + absoluteAngleToSource = -90 - triangleAngle; + } } else { - absoluteAngleToSource = 90 + triangleAngle; + if (otherAgentPosition[2] > agentPosition[2]) { + absoluteAngleToSource = 90 - triangleAngle; + } else { + absoluteAngleToSource = 90 + triangleAngle; + } } - } - - if (absoluteAngleToSource > 180) { - absoluteAngleToSource -= 360; - } else if (absoluteAngleToSource < -180) { - absoluteAngleToSource += 360; - } - - bearingRelativeAngleToSource = absoluteAngleToSource - agentBearing; - bearingRelativeAngleToSource *= (M_PI / 180); - - float angleOfDelivery = absoluteAngleToSource - otherAgentBuffer->getBearing(); - - if (angleOfDelivery < -180) { - angleOfDelivery += 360; - } - - float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION + + + if (absoluteAngleToSource > 180) { + absoluteAngleToSource -= 360; + } else if (absoluteAngleToSource < -180) { + absoluteAngleToSource += 360; + } + + bearingRelativeAngleToSource = absoluteAngleToSource - agentBearing; + bearingRelativeAngleToSource *= (M_PI / 180); + + float angleOfDelivery = absoluteAngleToSource - otherAgentBuffer->getBearing(); + + if (angleOfDelivery < -180) { + angleOfDelivery += 360; + } + + float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION + (OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f)); - - float attenuationCoefficient = distanceCoefficients[lowAgentIndex][highAgentIndex] - * otherAgentBuffer->getAttenuationRatio() - * offAxisCoefficient; - - float sinRatio = fabsf(sinf(bearingRelativeAngleToSource)); - int numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; - float weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); + + attenuationCoefficient = distanceCoefficients[lowAgentIndex][highAgentIndex] + * otherAgentBuffer->getAttenuationRatio() + * offAxisCoefficient; + + float sinRatio = fabsf(sinf(bearingRelativeAngleToSource)); + int numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; + float weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); + } int16_t* goodChannel = bearingRelativeAngleToSource > 0 ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix; int16_t* delayedChannel = bearingRelativeAngleToSource > 0 ? clientMix : clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL; diff --git a/libraries/shared/src/AudioRingBuffer.cpp b/libraries/shared/src/AudioRingBuffer.cpp index d48f95c754..5079582544 100644 --- a/libraries/shared/src/AudioRingBuffer.cpp +++ b/libraries/shared/src/AudioRingBuffer.cpp @@ -113,6 +113,7 @@ int AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { attenuationRatio = attenuationByte / 255.0f; memcpy(&bearing, dataPtr, sizeof(float)); + dataPtr += sizeof(bearing); if (bearing > 180 || bearing < -180) { // we were passed an invalid bearing because this agent wants loopback (pressed the H key) @@ -124,9 +125,7 @@ int AudioRingBuffer::parseData(unsigned char* sourceBuffer, int numBytes) { : bearing + AGENT_LOOPBACK_MODIFIER; } else { _shouldLoopbackForAgent = false; - } - - dataPtr += sizeof(float); + } sourceBuffer = dataPtr; } From a87e0d7f7fc7c26db6f49c930201f24906ad78a0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 14:32:15 -0700 Subject: [PATCH 23/32] variable fixes for audio-mixer loopback --- audio-mixer/src/main.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 82f307f8d4..e7126083a7 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -123,6 +123,8 @@ void *sendBuffer(void *args) { float bearingRelativeAngleToSource = 0.f; float attenuationCoefficient = 1.f; + int numSamplesDelay = 0; + float weakChannelAmplitudeRatio = 1.f; if (otherAgent != agent) { float *agentPosition = agentRingBuffer->getPosition(); @@ -189,8 +191,8 @@ void *sendBuffer(void *args) { * offAxisCoefficient; float sinRatio = fabsf(sinf(bearingRelativeAngleToSource)); - int numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; - float weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); + numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; + weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); } int16_t* goodChannel = bearingRelativeAngleToSource > 0 ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix; From 6bad72a18e0b38edfaddfd8ce6b496fc8c0698ef Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 14:41:20 -0700 Subject: [PATCH 24/32] spacing cleanup in audio-mixer main --- audio-mixer/src/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index e7126083a7..4e47da8776 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -215,8 +215,7 @@ void *sendBuffer(void *args) { if (s + numSamplesDelay < BUFFER_LENGTH_SAMPLES_PER_CHANNEL) { plateauAdditionOfSamples(delayedChannel[s + numSamplesDelay], - currentSample * - weakChannelAmplitudeRatio); + currentSample * weakChannelAmplitudeRatio); } } } From e8fbfcab05ce79665cc5cc86791630954a840b2d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 14:57:24 -0700 Subject: [PATCH 25/32] fix unpacking of other avatars in avatar mixer bulk packet --- avatar-mixer/src/main.cpp | 7 ++----- eve/src/main.cpp | 10 +++++----- libraries/shared/src/AgentList.cpp | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/avatar-mixer/src/main.cpp b/avatar-mixer/src/main.cpp index 74b731fdc5..2f031a6f0a 100644 --- a/avatar-mixer/src/main.cpp +++ b/avatar-mixer/src/main.cpp @@ -88,15 +88,12 @@ int main(int argc, const char* argv[]) { // send back a packet with other active agent data to this agent for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { - if (agent->getLinkedData() != NULL - && !socketMatch(agentAddress, agent->getActiveSocket())) { + if (agent->getLinkedData() && !socketMatch(agentAddress, agent->getActiveSocket())) { currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*agent); } } - agentList->getAgentSocket().send(agentAddress, - broadcastPacket, - currentBufferPosition - broadcastPacket); + agentList->getAgentSocket().send(agentAddress, broadcastPacket, currentBufferPosition - broadcastPacket); break; case PACKET_HEADER_DOMAIN: diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 7c4bde7a2d..b8025d5dd8 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -52,7 +52,7 @@ void *receiveAgentData(void *args) { // avatar mixer - this makes sure it won't be killed during silent agent removal avatarMixer = agentList->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER); - if (avatarMixer != NULL) { + if (avatarMixer) { avatarMixer->setLastHeardMicrostamp(usecTimestampNow()); } @@ -77,9 +77,9 @@ void *injectAudio(void *args) { // look for an audio mixer in our agent list Agent* audioMixer = AgentList::getInstance()->soloAgentOfType(AGENT_TYPE_AUDIO_MIXER); - if (audioMixer != NULL) { + if (audioMixer) { // until the audio mixer is setup for ping-reply, activate the public socket if it's not active - if (audioMixer->getActiveSocket() == NULL) { + if (!audioMixer->getActiveSocket()) { audioMixer->activatePublicSocket(); } @@ -117,9 +117,9 @@ int main(int argc, const char* argv[]) { // move eve away from the origin // pick a random point inside a 10x10 grid - eve.setPosition(glm::vec3(randFloatInRange(-RANDOM_POSITION_MAX_DIMENSION, RANDOM_POSITION_MAX_DIMENSION), + eve.setPosition(glm::vec3(randFloatInRange(0, RANDOM_POSITION_MAX_DIMENSION), 1.33, // this should be the same as the avatar's pelvis standing height - randFloatInRange(-RANDOM_POSITION_MAX_DIMENSION, RANDOM_POSITION_MAX_DIMENSION))); + randFloatInRange(0, RANDOM_POSITION_MAX_DIMENSION))); // face any instance of eve down the z-axis eve.setBodyYaw(0); diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 82a21ae479..0ff8184f07 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -123,7 +123,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, unsigned char *pac uint16_t agentID = -1; while ((currentPosition - startPosition) < numTotalBytes) { - currentPosition += unpackAgentId(currentPosition, &agentID); + unpackAgentId(currentPosition, &agentID); memcpy(packetHolder + 1, currentPosition, numTotalBytes - (currentPosition - startPosition)); Agent* matchingAgent = agentWithID(agentID); From 11b2271b918a6a03d2a5e50e1acb133b3522d48a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 15:05:31 -0700 Subject: [PATCH 26/32] size of agent ID must be included in bytes read per avatar --- eve/src/main.cpp | 2 +- libraries/avatars/src/AvatarData.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index b8025d5dd8..cb774d70a7 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -17,7 +17,7 @@ const int EVE_AGENT_LISTEN_PORT = 55441; -const float RANDOM_POSITION_MAX_DIMENSION = 5.0f; +const float RANDOM_POSITION_MAX_DIMENSION = 10.0f; const float DATA_SEND_INTERVAL_MSECS = 15; const float MIN_AUDIO_SEND_INTERVAL_SECS = 10; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 3136b3e30a..e1af4da4a2 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -128,11 +128,14 @@ 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 and agent ID - sourceBuffer += sizeof(PACKET_HEADER_HEAD_DATA) + sizeof(uint16_t); + // increment to push past the packet header + sourceBuffer += sizeof(PACKET_HEADER_HEAD_DATA); unsigned char* startPosition = sourceBuffer; + // push past the agent ID + sourceBuffer += + sizeof(uint16_t); + // Body world position memcpy(&_position, sourceBuffer, sizeof(float) * 3); sourceBuffer += sizeof(float) * 3; From 8daae1dd1d05c0a30d754011aa96e3fa412d40cd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 15:11:01 -0700 Subject: [PATCH 27/32] bring eve closer to the ground after scale changes --- eve/src/main.cpp | 4 +++- libraries/avatars/src/AvatarData.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index cb774d70a7..fd66d6911c 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -29,6 +29,8 @@ const int ITERATIONS_BEFORE_HAND_GRAB = 100; const int HAND_GRAB_DURATION_ITERATIONS = 50; const int HAND_TIMER_SLEEP_ITERATIONS = 50; +const float EVE_PELVIS_HEIGHT = 0.5f; + bool stopReceiveAgentDataThread; bool injectAudioThreadRunning = false; @@ -118,7 +120,7 @@ int main(int argc, const char* argv[]) { // pick a random point inside a 10x10 grid eve.setPosition(glm::vec3(randFloatInRange(0, RANDOM_POSITION_MAX_DIMENSION), - 1.33, // this should be the same as the avatar's pelvis standing height + EVE_PELVIS_HEIGHT, // this should be the same as the avatar's pelvis standing height randFloatInRange(0, RANDOM_POSITION_MAX_DIMENSION))); // face any instance of eve down the z-axis diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index e1af4da4a2..3b8e06e81e 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -139,7 +139,7 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { // Body world position memcpy(&_position, sourceBuffer, sizeof(float) * 3); sourceBuffer += sizeof(float) * 3; - + // Body rotation (NOTE: This needs to become a quaternion to save two bytes) sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyYaw); sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t *)sourceBuffer, &_bodyPitch); From 681044e3a6ace0b8ad0d7c6df156e68e615172d7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 15:24:15 -0700 Subject: [PATCH 28/32] add debugging output and value change for off-axis --- audio-mixer/src/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 4e47da8776..8215a32e80 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -60,7 +60,7 @@ const float DISTANCE_RATIO = 3.0f / 0.3f; const float PHASE_AMPLITUDE_RATIO_AT_90 = 0.5; const int PHASE_DELAY_AT_90 = 20; -const float MAX_OFF_AXIS_ATTENUATION = 0.5f; +const float MAX_OFF_AXIS_ATTENUATION = 0.1f; const float OFF_AXIS_ATTENUATION_FORMULA_STEP = (1 - MAX_OFF_AXIS_ATTENUATION) / 2.0f; void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) { @@ -186,10 +186,13 @@ void *sendBuffer(void *args) { float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION + (OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f)); + printf("AD: %f, OC: %f\n", angleOfDelivery, offAxisCoefficient); + attenuationCoefficient = distanceCoefficients[lowAgentIndex][highAgentIndex] * otherAgentBuffer->getAttenuationRatio() * offAxisCoefficient; + float sinRatio = fabsf(sinf(bearingRelativeAngleToSource)); numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); From 37aee099686036ae4c37192327cb94a9302c3af6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 15:43:28 -0700 Subject: [PATCH 29/32] fix order of angle calculations --- audio-mixer/src/main.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 8215a32e80..06250c42af 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -168,23 +168,20 @@ void *sendBuffer(void *args) { } } - if (absoluteAngleToSource > 180) { - absoluteAngleToSource -= 360; - } else if (absoluteAngleToSource < -180) { - absoluteAngleToSource += 360; + bearingRelativeAngleToSource = absoluteAngleToSource - agentBearing; + + if (bearingRelativeAngleToSource > 180) { + bearingRelativeAngleToSource -= 360; + } else if (bearingRelativeAngleToSource < -180) { + bearingRelativeAngleToSource += 360; } - bearingRelativeAngleToSource = absoluteAngleToSource - agentBearing; bearingRelativeAngleToSource *= (M_PI / 180); float angleOfDelivery = absoluteAngleToSource - otherAgentBuffer->getBearing(); - if (angleOfDelivery < -180) { - angleOfDelivery += 360; - } - float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION + - (OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f)); + (OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f)); printf("AD: %f, OC: %f\n", angleOfDelivery, offAxisCoefficient); From 70a6466a56308c0dc8c5d0b07313fa171d2f4de9 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 17:02:41 -0700 Subject: [PATCH 30/32] fix for bearingRelativeAngleToSource breaking spatialised audio --- audio-mixer/src/main.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index 06250c42af..b554d011d3 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -60,7 +60,7 @@ const float DISTANCE_RATIO = 3.0f / 0.3f; const float PHASE_AMPLITUDE_RATIO_AT_90 = 0.5; const int PHASE_DELAY_AT_90 = 20; -const float MAX_OFF_AXIS_ATTENUATION = 0.1f; +const float MAX_OFF_AXIS_ATTENUATION = 0.2f; const float OFF_AXIS_ATTENUATION_FORMULA_STEP = (1 - MAX_OFF_AXIS_ATTENUATION) / 2.0f; void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) { @@ -111,7 +111,6 @@ void *sendBuffer(void *args) { for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { AudioRingBuffer* agentRingBuffer = (AudioRingBuffer*) agent->getLinkedData(); - float agentBearing = agentRingBuffer->getBearing(); int16_t clientMix[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {}; @@ -151,7 +150,7 @@ void *sendBuffer(void *args) { float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI); float absoluteAngleToSource = 0; - float bearingRelativeAngleToSource = 0; + bearingRelativeAngleToSource = 0; // find the angle we need for calculation based on the orientation of the triangle if (otherAgentPosition[0] > agentPosition[0]) { @@ -168,7 +167,7 @@ void *sendBuffer(void *args) { } } - bearingRelativeAngleToSource = absoluteAngleToSource - agentBearing; + bearingRelativeAngleToSource = absoluteAngleToSource - agentRingBuffer->getBearing(); if (bearingRelativeAngleToSource > 180) { bearingRelativeAngleToSource -= 360; @@ -176,27 +175,30 @@ void *sendBuffer(void *args) { bearingRelativeAngleToSource += 360; } - bearingRelativeAngleToSource *= (M_PI / 180); - float angleOfDelivery = absoluteAngleToSource - otherAgentBuffer->getBearing(); + if (angleOfDelivery > 180) { + angleOfDelivery -= 360; + } else if (angleOfDelivery < -180) { + angleOfDelivery += 360; + } + float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION + (OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f)); - printf("AD: %f, OC: %f\n", angleOfDelivery, offAxisCoefficient); - attenuationCoefficient = distanceCoefficients[lowAgentIndex][highAgentIndex] * otherAgentBuffer->getAttenuationRatio() * offAxisCoefficient; + bearingRelativeAngleToSource *= (M_PI / 180); float sinRatio = fabsf(sinf(bearingRelativeAngleToSource)); numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio; weakChannelAmplitudeRatio = 1 - (PHASE_AMPLITUDE_RATIO_AT_90 * sinRatio); } - int16_t* goodChannel = bearingRelativeAngleToSource > 0 ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix; - int16_t* delayedChannel = bearingRelativeAngleToSource > 0 ? clientMix : clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL; + int16_t* goodChannel = bearingRelativeAngleToSource > 0.0f ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix; + int16_t* delayedChannel = bearingRelativeAngleToSource > 0.0f ? clientMix : clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL; int16_t* delaySamplePointer = otherAgentBuffer->getNextOutput() == otherAgentBuffer->getBuffer() ? otherAgentBuffer->getBuffer() + RING_BUFFER_SAMPLES - numSamplesDelay From 75ba88923fd564bd4a350394d0d54a0290622eb2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 17:09:49 -0700 Subject: [PATCH 31/32] remove the serial interface close in destructor, incorrect solution --- interface/src/SerialInterface.cpp | 6 ------ interface/src/SerialInterface.h | 1 - 2 files changed, 7 deletions(-) diff --git a/interface/src/SerialInterface.cpp b/interface/src/SerialInterface.cpp index 3453321d26..8929dbb2f5 100644 --- a/interface/src/SerialInterface.cpp +++ b/interface/src/SerialInterface.cpp @@ -33,12 +33,6 @@ const int GRAVITY_SAMPLES = 200; // Use the first samples to const bool USING_INVENSENSE_MPU9150 = 1; -SerialInterface::~SerialInterface() { -#ifdef __APPLE__ - close(_serialDescriptor); -#endif -} - void SerialInterface::pair() { #ifdef __APPLE__ diff --git a/interface/src/SerialInterface.h b/interface/src/SerialInterface.h index 4aafb46994..e84fa2ddde 100644 --- a/interface/src/SerialInterface.h +++ b/interface/src/SerialInterface.h @@ -38,7 +38,6 @@ class SerialInterface { public: SerialInterface() : active(false), _failedOpenAttempts(0) {} - ~SerialInterface(); void pair(); void readData(); From 9658c40dd6126ffabdf8c62b6a29b699e956e125 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 May 2013 17:17:47 -0700 Subject: [PATCH 32/32] change lastAgentId member variable to _lastAgentID --- audio-mixer/src/main.cpp | 4 ++-- domain-server/src/main.cpp | 4 ++-- libraries/shared/src/AgentList.cpp | 10 +--------- libraries/shared/src/AgentList.h | 8 ++++---- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/audio-mixer/src/main.cpp b/audio-mixer/src/main.cpp index b554d011d3..c47fbb2170 100644 --- a/audio-mixer/src/main.cpp +++ b/audio-mixer/src/main.cpp @@ -282,8 +282,8 @@ int main(int argc, const char* argv[]) { if(agentList->getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { if (packetData[0] == PACKET_HEADER_INJECT_AUDIO) { - if (agentList->addOrUpdateAgent(agentAddress, agentAddress, packetData[0], agentList->getLastAgentId())) { - agentList->increaseAgentId(); + if (agentList->addOrUpdateAgent(agentAddress, agentAddress, packetData[0], agentList->getLastAgentID())) { + agentList->increaseAgentID(); } agentList->updateAgentWithData(agentAddress, packetData, receivedBytes); diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 95da95c210..be906e194d 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -118,8 +118,8 @@ int main(int argc, const char * argv[]) if (agentList->addOrUpdateAgent((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType, - agentList->getLastAgentId())) { - agentList->increaseAgentId(); + agentList->getLastAgentID())) { + agentList->increaseAgentID(); } currentBufferPos = broadcastPacket + 1; diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 0ff8184f07..df591524c0 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -65,7 +65,7 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) : _ownerType(newOwnerType), socketListenPort(newSocketListenPort), _ownerID(UNKNOWN_AGENT_ID), - lastAgentId(0) { + _lastAgentID(0) { pthread_mutex_init(&mutex, 0); } @@ -192,14 +192,6 @@ Agent* AgentList::agentWithID(uint16_t agentID) { return NULL; } -uint16_t AgentList::getLastAgentId() { - return lastAgentId; -} - -void AgentList::increaseAgentId() { - ++lastAgentId; -} - int AgentList::processDomainServerList(unsigned char *packetData, size_t dataBytes) { int readAgents = 0; diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 1956916211..db71357114 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -52,9 +52,6 @@ public: UDPSocket& getAgentSocket(); - uint16_t getLastAgentId(); - void increaseAgentId(); - void lock() { pthread_mutex_lock(&mutex); } void unlock() { pthread_mutex_unlock(&mutex); } @@ -76,6 +73,9 @@ public: char getOwnerType() const { return _ownerType; } + uint16_t getLastAgentID() const { return _lastAgentID; } + void increaseAgentID() { ++_lastAgentID; } + uint16_t getOwnerID() const { return _ownerID; } void setOwnerID(uint16_t ownerID) { _ownerID = ownerID; } @@ -105,7 +105,7 @@ private: char _ownerType; unsigned int socketListenPort; uint16_t _ownerID; - uint16_t lastAgentId; + uint16_t _lastAgentID; pthread_t removeSilentAgentsThread; pthread_t checkInWithDomainServerThread; pthread_t pingUnknownAgentsThread;