diff --git a/domain/src/main.cpp b/domain/src/main.cpp index 5044854ca2..0914b4db68 100644 --- a/domain/src/main.cpp +++ b/domain/src/main.cpp @@ -46,7 +46,6 @@ int listForBroadcast(unsigned char *listBuffer, sockaddr *agentPublicAddress, so unsigned char *startPointer = currentBufferPos; for(std::vector::iterator agent = agentList.agents.begin(); agent != agentList.agents.end(); agent++) { - *currentBufferPos++ = agent->type; if (DEBUG_TO_SELF || !agent->matches(agentPublicAddress, agentLocalAddress, agentType)) { *currentBufferPos++ = agent->type; diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 671bb57303..b789fa63d2 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -339,13 +339,13 @@ int Head::getBroadcastData(char* data) sprintf(data, "H%f,%f,%f,%f,%f,%f,%f,%f", getRenderPitch() + Pitch, -getRenderYaw() + 180 -Yaw, Roll, position.x + leanSideways, position.y, position.z + leanForward, loudness, averageLoudness); - //printf("x: %3.1f\n", position.x); return strlen(data); } void Head::parseData(void *data, int size) { // parse head data for this agent - sscanf((char *)data, "%f,%f,%f,%f,%f,%f,%f,%f", + std::cout << "HD: " << (char *)data << "\n"; + sscanf((char *)data, "H%f,%f,%f,%f,%f,%f,%f,%f", &Pitch, &Yaw, &Roll, &position.x, &position.y, &position.z, &loudness, &averageLoudness); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index b46f5ee21a..526fbd836e 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -523,6 +523,7 @@ void update_pos(float frametime) const int MAX_BROADCAST_STRING = 200; char broadcast_string[MAX_BROADCAST_STRING]; int broadcast_bytes = myHead.getBroadcastData(broadcast_string); + std::cout << "BS: " << broadcast_string << "\n"; agentList.broadcastToAgents(broadcast_string, broadcast_bytes); } @@ -867,7 +868,10 @@ void mouseoverFunc( int x, int y) } void attachNewHeadToAgent(Agent *newAgent) { - newAgent->linkedData = new Head(); + if (newAgent->linkedData == NULL) { + newAgent->linkedData = new Head(); + std::cout << "LD: " << newAgent->linkedData << "\n"; + } } int main(int argc, char** argv) @@ -923,7 +927,7 @@ int main(int argc, char** argv) printf("\n"); // the callback for our instance of AgentList is attachNewHeadToAgent - agentList.newAgentCallback = &attachNewHeadToAgent; + agentList.linkedDataCreateCallback = &attachNewHeadToAgent; // create thread for receipt of data via UDP pthread_t networkReceiveThread; diff --git a/shared/src/Agent.cpp b/shared/src/Agent.cpp index 9fa1d0d178..f342250ec0 100644 --- a/shared/src/Agent.cpp +++ b/shared/src/Agent.cpp @@ -44,10 +44,8 @@ Agent::Agent(const Agent &otherAgent) { type = otherAgent.type; - - linkedData = (AgentData *) malloc(sizeof(otherAgent.linkedData)); - // copy over linkedData - memcpy((void*)linkedData, (void *)otherAgent.linkedData, sizeof(otherAgent.linkedData)); + // linked data is transient, gets re-assigned on next packet receive + linkedData = NULL; } Agent& Agent::operator=(Agent otherAgent) { diff --git a/shared/src/AgentList.cpp b/shared/src/AgentList.cpp index 3c30f2a596..698bdec70a 100644 --- a/shared/src/AgentList.cpp +++ b/shared/src/AgentList.cpp @@ -10,7 +10,7 @@ #include AgentList::AgentList() : agentSocket(AGENT_SOCKET_LISTEN_PORT) { - + linkedDataCreateCallback = NULL; } AgentList::AgentList(int socketListenPort) : agentSocket(socketListenPort) { @@ -55,11 +55,15 @@ void AgentList::updateAgentWithData(sockaddr *senderAddress, void *packetData, s int agentIndex = indexOfMatchingAgent(senderAddress); if (agentIndex != -1) { - Agent matchingAgent = agents[agentIndex]; + Agent *matchingAgent = &agents[agentIndex]; - if (matchingAgent.linkedData != NULL) { - matchingAgent.linkedData->parseData(packetData, dataBytes); + if (matchingAgent->linkedData == NULL) { + if (linkedDataCreateCallback != NULL) { + linkedDataCreateCallback(matchingAgent); + } } + + matchingAgent->linkedData->parseData(packetData, dataBytes); } } @@ -121,7 +125,6 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, std::cout << "Added agent - " << &newAgent << "\n"; - newAgentCallback(&newAgent); agents.push_back(newAgent); return true; @@ -135,7 +138,7 @@ void AgentList::broadcastToAgents(char *broadcastData, size_t dataBytes) { for(std::vector::iterator agent = agents.begin(); agent != agents.end(); agent++) { if (agent->activeSocket != NULL) { // we know which socket is good for this agent, send there - agentSocket.send((sockaddr *)agent->activeSocket, broadcastData, sizeof(&broadcastData)); + agentSocket.send((sockaddr *)agent->activeSocket, broadcastData, dataBytes); } } } diff --git a/shared/src/AgentList.h b/shared/src/AgentList.h index e1964eb6f5..c4b646e9fe 100644 --- a/shared/src/AgentList.h +++ b/shared/src/AgentList.h @@ -21,7 +21,7 @@ class AgentList { AgentList(); AgentList(int socketListenPort); std::vector agents; - void(*newAgentCallback)(Agent *); + void(*linkedDataCreateCallback)(Agent *); UDPSocket* getAgentSocket();