resolve merge conflicts with origin/master

This commit is contained in:
Jeffrey Ventrella 2013-04-09 13:30:26 -07:00
commit e90dd52da4
19 changed files with 192 additions and 68 deletions

View file

@ -25,6 +25,8 @@
#include <fcntl.h> #include <fcntl.h>
#include <map> #include <map>
#include "AgentList.h" #include "AgentList.h"
#include "AgentTypes.h"
#include <PacketHeaders.h>
#include "SharedUtil.h" #include "SharedUtil.h"
#ifdef _WIN32 #ifdef _WIN32
@ -46,7 +48,7 @@ const int LOGOFF_CHECK_INTERVAL = 5000;
#define DEBUG_TO_SELF 0 #define DEBUG_TO_SELF 0
int lastActiveCount = 0; int lastActiveCount = 0;
AgentList agentList('D', DOMAIN_LISTEN_PORT); AgentList agentList(AGENT_TYPE_DOMAIN, DOMAIN_LISTEN_PORT);
unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) { unsigned char * addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *agentToAdd) {
*currentPosition++ = agentToAdd->getType(); *currentPosition++ = agentToAdd->getType();
@ -82,7 +84,7 @@ int main(int argc, const char * argv[])
char agentType; char agentType;
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE]; unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
*broadcastPacket = 'D'; *broadcastPacket = PACKET_HEADER_DOMAIN;
unsigned char *currentBufferPos; unsigned char *currentBufferPos;
unsigned char *startPointer; unsigned char *startPointer;

View file

@ -20,6 +20,8 @@
#include "UDPSocket.h" #include "UDPSocket.h"
#include "UDPSocket.cpp" #include "UDPSocket.cpp"
#include <SharedUtil.h> #include <SharedUtil.h>
#include <PacketHeaders.h>
char EC2_WEST_AUDIO_SERVER[] = "54.241.92.53"; char EC2_WEST_AUDIO_SERVER[] = "54.241.92.53";
const int AUDIO_UDP_LISTEN_PORT = 55443; const int AUDIO_UDP_LISTEN_PORT = 55443;
@ -121,7 +123,7 @@ void stream(void)
int leadingBytes = 1 + (sizeof(float) * 4); int leadingBytes = 1 + (sizeof(float) * 4);
unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes];
dataPacket[0] = 'I'; dataPacket[0] = PACKET_HEADER_INJECT_AUDIO;
unsigned char *currentPacketPtr = dataPacket + 1; unsigned char *currentPacketPtr = dataPacket + 1;
for (int p = 0; p < 4; p++) { for (int p = 0; p < 4; p++) {

View file

@ -16,6 +16,7 @@
#include <StdDev.h> #include <StdDev.h>
#include <UDPSocket.h> #include <UDPSocket.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include <PacketHeaders.h>
#include "Audio.h" #include "Audio.h"
#include "Util.h" #include "Util.h"
@ -150,7 +151,7 @@ int audioCallback (const void *inputBuffer,
// + 12 for 3 floats for position + float for bearing + 1 attenuation byte // + 12 for 3 floats for position + float for bearing + 1 attenuation byte
unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes]; unsigned char dataPacket[BUFFER_LENGTH_BYTES + leadingBytes];
dataPacket[0] = 'I'; dataPacket[0] = PACKET_HEADER_INJECT_AUDIO;
unsigned char *currentPacketPtr = dataPacket + 1; unsigned char *currentPacketPtr = dataPacket + 1;
// memcpy the three float positions // memcpy the three float positions
@ -230,19 +231,19 @@ int audioCallback (const void *inputBuffer,
if (ringBuffer->getEndOfLastWrite() != NULL) { if (ringBuffer->getEndOfLastWrite() != NULL) {
if (!ringBuffer->isStarted() && ringBuffer->diffLastWriteNextOutput() < PACKET_LENGTH_SAMPLES + JITTER_BUFFER_SAMPLES) { if (!ringBuffer->isStarted() && ringBuffer->diffLastWriteNextOutput() < PACKET_LENGTH_SAMPLES + JITTER_BUFFER_SAMPLES) {
printf("Held back, buffer has %d of %d samples required.\n", ringBuffer->diffLastWriteNextOutput(), PACKET_LENGTH_SAMPLES + JITTER_BUFFER_SAMPLES); //printf("Held back, buffer has %d of %d samples required.\n", ringBuffer->diffLastWriteNextOutput(), PACKET_LENGTH_SAMPLES + JITTER_BUFFER_SAMPLES);
} else if (ringBuffer->diffLastWriteNextOutput() < PACKET_LENGTH_SAMPLES) { } else if (ringBuffer->diffLastWriteNextOutput() < PACKET_LENGTH_SAMPLES) {
ringBuffer->setStarted(false); ringBuffer->setStarted(false);
starve_counter++; starve_counter++;
packetsReceivedThisPlayback = 0; packetsReceivedThisPlayback = 0;
printf("Starved #%d\n", starve_counter); //printf("Starved #%d\n", starve_counter);
data->wasStarved = 10; // Frames to render the indication that the system was starved. data->wasStarved = 10; // Frames to render the indication that the system was starved.
} else { } else {
if (!ringBuffer->isStarted()) { if (!ringBuffer->isStarted()) {
ringBuffer->setStarted(true); ringBuffer->setStarted(true);
printf("starting playback %3.1f msecs delayed, \n", (usecTimestampNow() - usecTimestamp(&firstPlaybackTimer))/1000.0); printf("starting playback %3.1f msecs delayed \n", (usecTimestampNow() - usecTimestamp(&firstPlaybackTimer))/1000.0);
} else { } else {
//printf("pushing buffer\n"); //printf("pushing buffer\n");
} }
@ -395,7 +396,7 @@ void *receiveAudioViaUDP(void *args) {
if (totalPacketsReceived > 3) stdev.addValue(tDiff); if (totalPacketsReceived > 3) stdev.addValue(tDiff);
if (stdev.getSamples() > 500) { if (stdev.getSamples() > 500) {
sharedAudioData->measuredJitter = stdev.getStDev(); sharedAudioData->measuredJitter = stdev.getStDev();
printf("Avg: %4.2f, Stdev: %4.2f\n", stdev.getAverage(), sharedAudioData->measuredJitter); //printf("Avg: %4.2f, Stdev: %4.2f\n", stdev.getAverage(), sharedAudioData->measuredJitter);
stdev.reset(); stdev.reset();
} }
@ -403,7 +404,7 @@ void *receiveAudioViaUDP(void *args) {
if (!ringBuffer->isStarted()) { if (!ringBuffer->isStarted()) {
printf("Audio packet %d received at %6.0f\n", ++packetsReceivedThisPlayback, usecTimestampNow()/1000); packetsReceivedThisPlayback++;
} }
else { else {
//printf("Audio packet received at %6.0f\n", usecTimestampNow()/1000); //printf("Audio packet received at %6.0f\n", usecTimestampNow()/1000);

View file

@ -508,6 +508,8 @@ void Head::renderHead( int faceToFace, int isMine )
// Always render own hand, but don't render head unless showing face2face // Always render own hand, but don't render head unless showing face2face
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glEnable(GL_RESCALE_NORMAL);
glPushMatrix(); glPushMatrix();
//glScalef(scale, scale, scale); //glScalef(scale, scale, scale);
@ -538,17 +540,14 @@ void Head::renderHead( int faceToFace, int isMine )
glRotatef(Roll, 0, 0, 1); glRotatef(Roll, 0, 0, 1);
// Overall scale of head // Overall scale of head
if (faceToFace) glScalef(1.5, 2.0, 2.0); if (faceToFace) glScalef(2.0, 2.0, 2.0);
else glScalef(0.75, 1.0, 1.0); else glScalef(0.75, 1.0, 1.0);
glColor3fv(skinColor); glColor3fv(skinColor);
// Head // Head
glutSolidSphere(1, 30, 30); glutSolidSphere(1, 30, 30);
//std::cout << distanceToCamera << "\n";
// Ears // Ears
glPushMatrix(); glPushMatrix();
glTranslatef(1.0, 0, 0); glTranslatef(1.0, 0, 0);
@ -920,13 +919,13 @@ void Head::updateHandMovement()
// adjust right hand and elbow according to hand offset // adjust right hand and elbow according to hand offset
//---------------------------------------------------------------- //----------------------------------------------------------------
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition += handOffset; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition += handOffset;
glm::dvec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition; glm::vec3 armVector = avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition;
armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; armVector -= avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
// test to see if right hand is being dragged beyond maximum arm length // test to see if right hand is being dragged beyond maximum arm length
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
double distance = glm::length( armVector ); float distance = glm::length( armVector );
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
@ -938,10 +937,10 @@ void Head::updateHandMovement()
// reset right hand to be constrained to maximum arm length // reset right hand to be constrained to maximum arm length
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
glm::dvec3 armNormal = armVector / distance; glm::vec3 armNormal = armVector / distance;
armVector = armNormal * avatar.maxArmLength; armVector = armNormal * (float)avatar.maxArmLength;
distance = avatar.maxArmLength; distance = avatar.maxArmLength;
glm::dvec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; glm::vec3 constrainedPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
constrainedPosition += armVector; constrainedPosition += armVector;
avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = constrainedPosition; avatar.bone[ AVATAR_BONE_RIGHT_HAND ].worldPosition = constrainedPosition;
} }
@ -949,8 +948,8 @@ void Head::updateHandMovement()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// set elbow position // set elbow position
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
glm::dvec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition; glm::vec3 newElbowPosition = avatar.bone[ AVATAR_BONE_RIGHT_SHOULDER ].worldPosition;
newElbowPosition += armVector * ONE_HALF; newElbowPosition += armVector * (float)ONE_HALF;
glm::dvec3 perpendicular = glm::dvec3( -armVector.y, armVector.x, armVector.z ); glm::dvec3 perpendicular = glm::dvec3( -armVector.y, armVector.x, armVector.z );
newElbowPosition += perpendicular * ( 1.0 - ( avatar.maxArmLength / distance ) ) * ONE_HALF; newElbowPosition += perpendicular * ( 1.0 - ( avatar.maxArmLength / distance ) ) * ONE_HALF;
avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].worldPosition = newElbowPosition; avatar.bone[ AVATAR_BONE_RIGHT_FOREARM ].worldPosition = newElbowPosition;
@ -964,21 +963,57 @@ void Head::renderBody()
{ {
glColor3fv(skinColor); glColor3fv(skinColor);
// Render bones as spheres
for (int b=0; b<NUM_AVATAR_BONES; b++) for (int b=0; b<NUM_AVATAR_BONES; b++)
{ {
glPushMatrix(); glPushMatrix();
glTranslatef( avatar.bone[b].worldPosition.x, avatar.bone[b].worldPosition.y, avatar.bone[b].worldPosition.z ); glTranslatef( avatar.bone[b].worldPosition.x, avatar.bone[b].worldPosition.y, avatar.bone[b].worldPosition.z );
glScalef( 0.02, 0.02, 0.02 ); glutSolidSphere( .02, 10, 5 );
glutSolidSphere( 1, 10, 5 );
glPopMatrix(); glPopMatrix();
} }
// Render lines connecting the bones
glColor3f(1,1,1);
glLineWidth(3.0);
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_NECK].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_SHOULDER].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_UPPER_ARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_FOREARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_HAND].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_SHOULDER].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_UPPER_ARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_FOREARM].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_HAND].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_CHEST_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_MID_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_PELVIS].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_THIGH].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_SHIN].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_LEFT_FOOT].worldPosition.x);
glEnd();
glBegin(GL_LINE_STRIP);
glVertex3fv(&avatar.bone[AVATAR_BONE_PELVIS_SPINE].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_PELVIS].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_THIGH].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_SHIN].worldPosition.x);
glVertex3fv(&avatar.bone[AVATAR_BONE_RIGHT_FOOT].worldPosition.x);
glEnd();
} }
// Transmit data to agents requesting it
// Transmit data to agents requesting it
//called on me just prior to sending data to others (continuasly called) //called on me just prior to sending data to others (continuasly called)

View file

@ -104,7 +104,7 @@ enum AvatarBones
struct AvatarBone struct AvatarBone
{ {
AvatarBones parent; AvatarBones parent;
glm::dvec3 worldPosition; glm::vec3 worldPosition;
glm::dvec3 defaultPosePosition; glm::dvec3 defaultPosePosition;
glm::dvec3 velocity; glm::dvec3 velocity;
double yaw; double yaw;

View file

@ -8,7 +8,7 @@
#ifndef __interface__orientation__ #ifndef __interface__orientation__
#define __interface__orientation__ #define __interface__orientation__
#include "Math.h" #include <cmath> // with this work? "Math.h"
#include "Vector3D.h" #include "Vector3D.h"
enum Axis enum Axis

View file

@ -6,7 +6,7 @@
//----------------------------------------------------------- //-----------------------------------------------------------
#include "Vector3D.h" #include "Vector3D.h"
#include "Math.h" #include <cmath> // "Math.h"
//--------------------------------------- //---------------------------------------
Vector3D::Vector3D() Vector3D::Vector3D()

View file

@ -11,6 +11,7 @@
#include <iostream> // to load voxels from file #include <iostream> // to load voxels from file
#include <fstream> // to load voxels from file #include <fstream> // to load voxels from file
#include <SharedUtil.h> #include <SharedUtil.h>
#include <PacketHeaders.h>
#include <OctalCode.h> #include <OctalCode.h>
#include "VoxelSystem.h" #include "VoxelSystem.h"
@ -113,15 +114,15 @@ void VoxelSystem::parseData(void *data, int size) {
unsigned char *voxelData = (unsigned char *) data + 1; unsigned char *voxelData = (unsigned char *) data + 1;
switch(command) { switch(command) {
case 'V': case PACKET_HEADER_VOXEL_DATA:
// ask the VoxelTree to read the bitstream into the tree // ask the VoxelTree to read the bitstream into the tree
tree->readBitstreamToTree(voxelData, size - 1); tree->readBitstreamToTree(voxelData, size - 1);
break; break;
case 'R': case PACKET_HEADER_ERASE_VOXEL:
// ask the tree to read the "remove" bitstream // ask the tree to read the "remove" bitstream
tree->processRemoveVoxelBitstream((unsigned char*)data,size); tree->processRemoveVoxelBitstream((unsigned char*)data,size);
break; break;
case 'Z': case PACKET_HEADER_Z_COMMAND:
// the Z command is a special command that allows the sender to send high level semantic // the Z command is a special command that allows the sender to send high level semantic
// requests, like erase all, or add sphere scene, different receivers may handle these // requests, like erase all, or add sphere scene, different receivers may handle these

View file

@ -55,6 +55,7 @@
#include "Texture.h" #include "Texture.h"
#include "Cloud.h" #include "Cloud.h"
#include <AgentList.h> #include <AgentList.h>
#include <AgentTypes.h>
#include "VoxelSystem.h" #include "VoxelSystem.h"
#include "Lattice.h" #include "Lattice.h"
#include "Finger.h" #include "Finger.h"
@ -63,13 +64,14 @@
#include "SerialInterface.h" #include "SerialInterface.h"
#include <PerfStat.h> #include <PerfStat.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include <PacketHeaders.h>
using namespace std; using namespace std;
int audio_on = 1; // Whether to turn on the audio support int audio_on = 1; // Whether to turn on the audio support
int simulate_on = 1; int simulate_on = 1;
AgentList agentList('I'); AgentList agentList(AGENT_TYPE_INTERFACE);
pthread_t networkReceiveThread; pthread_t networkReceiveThread;
bool stopNetworkReceiveThread = false; bool stopNetworkReceiveThread = false;
@ -553,7 +555,7 @@ void simulateHead(float frametime)
::paintingVoxel.y >= 0.0 && ::paintingVoxel.y <= 1.0 && ::paintingVoxel.y >= 0.0 && ::paintingVoxel.y <= 1.0 &&
::paintingVoxel.z >= 0.0 && ::paintingVoxel.z <= 1.0) { ::paintingVoxel.z >= 0.0 && ::paintingVoxel.z <= 1.0) {
if (createVoxelEditMessage('I',0,1,&::paintingVoxel,bufferOut,sizeOut)){ if (createVoxelEditMessage(PACKET_HEADER_SET_VOXEL,0,1,&::paintingVoxel,bufferOut,sizeOut)){
agentList.broadcastToAgents((char*)bufferOut, sizeOut,AgentList::AGENTS_OF_TYPE_VOXEL); agentList.broadcastToAgents((char*)bufferOut, sizeOut,AgentList::AGENTS_OF_TYPE_VOXEL);
delete bufferOut; delete bufferOut;
} }
@ -609,6 +611,7 @@ void display(void)
myCamera.setYaw ( - myHead.getAvatarYaw() ); myCamera.setYaw ( - myHead.getAvatarYaw() );
myCamera.setUp ( 0.4 ); myCamera.setUp ( 0.4 );
myCamera.setDistance( 0.5 ); myCamera.setDistance( 0.5 );
myCamera.setDistance( 0.08 );
myCamera.update(); myCamera.update();
} }
else else
@ -619,6 +622,7 @@ void display(void)
myCamera.setYaw ( 180.0 - myHead.getAvatarYaw() ); myCamera.setYaw ( 180.0 - myHead.getAvatarYaw() );
myCamera.setUp ( 0.15 ); myCamera.setUp ( 0.15 );
myCamera.setDistance( 1.0 ); myCamera.setDistance( 1.0 );
myCamera.setDistance( 0.08 );
myCamera.update(); myCamera.update();
} }
@ -1005,10 +1009,12 @@ void *networkReceive(void *args)
packetcount++; packetcount++;
bytescount += bytesReceived; bytescount += bytesReceived;
if (incomingPacket[0] == 't') { if (incomingPacket[0] == PACKET_HEADER_TRANSMITTER_DATA) {
// Pass everything but transmitter data to the agent list // Pass everything but transmitter data to the agent list
myHead.hand->processTransmitterData(incomingPacket, bytesReceived); myHead.hand->processTransmitterData(incomingPacket, bytesReceived);
} else if (incomingPacket[0] == 'V' || incomingPacket[0] == 'Z') { } else if (incomingPacket[0] == PACKET_HEADER_VOXEL_DATA ||
incomingPacket[0] == PACKET_HEADER_Z_COMMAND ||
incomingPacket[0] == PACKET_HEADER_ERASE_VOXEL) {
voxels.parseData(incomingPacket, bytesReceived); voxels.parseData(incomingPacket, bytesReceived);
} else { } else {
agentList.processAgentData(&senderAddress, incomingPacket, bytesReceived); agentList.processAgentData(&senderAddress, incomingPacket, bytesReceived);
@ -1092,10 +1098,11 @@ void reshape(int width, int height)
WIDTH = width; WIDTH = width;
HEIGHT = height; HEIGHT = height;
glMatrixMode(GL_PROJECTION); //hello glMatrixMode(GL_PROJECTION); //hello
fov.setResolution(width, height) fov.setResolution(width, height)
.setBounds(glm::vec3(-0.5f,-0.5f,-500.0f), glm::vec3(0.5f, 0.5f, 0.1f) ) .setBounds(glm::vec3(-0.5f,-0.5f,-500.0f), glm::vec3(0.5f, 0.5f, 0.1f) )
.setPerspective(0.7854f); .setPerspective(0.7854f);
glLoadMatrixf(glm::value_ptr(fov.getViewerScreenXform())); glLoadMatrixf(glm::value_ptr(fov.getViewerScreenXform()));
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);

View file

@ -17,9 +17,11 @@
#include <fstream> #include <fstream>
#include <limits> #include <limits>
#include <AgentList.h> #include <AgentList.h>
#include <AgentTypes.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include <StdDev.h> #include <StdDev.h>
#include "AudioRingBuffer.h" #include "AudioRingBuffer.h"
#include "PacketHeaders.h"
#ifdef _WIN32 #ifdef _WIN32
#include "Syssocket.h" #include "Syssocket.h"
@ -59,7 +61,7 @@ const int AGENT_LOOPBACK_MODIFIER = 307;
const int LOOPBACK_SANITY_CHECK = 0; const int LOOPBACK_SANITY_CHECK = 0;
AgentList agentList('M', MIXER_LISTEN_PORT); AgentList agentList(AGENT_TYPE_MIXER, MIXER_LISTEN_PORT);
StDev stdev; StDev stdev;
void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) { void plateauAdditionOfSamples(int16_t &mixSample, int16_t sampleToAdd) {
@ -275,7 +277,7 @@ int main(int argc, const char * argv[])
while (true) { while (true) {
if(agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) { if(agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) {
if (packetData[0] == 'I') { if (packetData[0] == PACKET_HEADER_INJECT_AUDIO) {
// Compute and report standard deviation for jitter calculation // Compute and report standard deviation for jitter calculation
if (firstSample) { if (firstSample) {
@ -286,7 +288,7 @@ int main(int argc, const char * argv[])
stdev.addValue(tDiff); stdev.addValue(tDiff);
if (stdev.getSamples() > 500) { if (stdev.getSamples() > 500) {
printf("Avg: %4.2f, Stdev: %4.2f\n", stdev.getAverage(), stdev.getStDev()); //printf("Avg: %4.2f, Stdev: %4.2f\n", stdev.getAverage(), stdev.getStDev());
stdev.reset(); stdev.reset();
} }
} }

View file

@ -7,6 +7,7 @@
// //
#include "Agent.h" #include "Agent.h"
#include "AgentTypes.h"
#include <cstring> #include <cstring>
#include "UDPSocket.h" #include "UDPSocket.h"
#include "SharedUtil.h" #include "SharedUtil.h"
@ -90,10 +91,40 @@ Agent::~Agent() {
delete linkedData; delete linkedData;
} }
char Agent::getType() { char Agent::getType() const {
return type; return type;
} }
// Names of Agent Types
const char* AGENT_TYPE_NAME_DOMAIN = "Domain";
const char* AGENT_TYPE_NAME_VOXEL = "Voxel Server";
const char* AGENT_TYPE_NAME_INTERFACE = "Client Interface";
const char* AGENT_TYPE_NAME_HEAD = "Avatar Head"; // Is this needed???
const char* AGENT_TYPE_NAME_MIXER = "Audio Mixer";
const char* AGENT_TYPE_NAME_UNKNOWN = "Unknown";
const char* Agent::getTypeName() const {
const char* name = AGENT_TYPE_NAME_UNKNOWN;
switch (this->type) {
case AGENT_TYPE_DOMAIN:
name = AGENT_TYPE_NAME_DOMAIN;
break;
case AGENT_TYPE_VOXEL:
name = AGENT_TYPE_NAME_VOXEL;
break;
case AGENT_TYPE_INTERFACE:
name = AGENT_TYPE_NAME_INTERFACE;
break;
case AGENT_TYPE_HEAD:
name = AGENT_TYPE_NAME_HEAD;
break;
case AGENT_TYPE_MIXER:
name = AGENT_TYPE_NAME_MIXER;
break;
}
return name;
}
void Agent::setType(char newType) { void Agent::setType(char newType) {
type = newType; type = newType;
} }
@ -174,7 +205,7 @@ std::ostream& operator<<(std::ostream& os, const Agent* agent) {
sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket; sockaddr_in *agentPublicSocket = (sockaddr_in *)agent->publicSocket;
sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket; sockaddr_in *agentLocalSocket = (sockaddr_in *)agent->localSocket;
os << "T: " << agent->type << " PA: " << inet_ntoa(agentPublicSocket->sin_addr) << os << "T: " << agent->getTypeName() << " (" << agent->type << ") PA: " << inet_ntoa(agentPublicSocket->sin_addr) <<
":" << ntohs(agentPublicSocket->sin_port) << " LA: " << inet_ntoa(agentLocalSocket->sin_addr) << ":" << ntohs(agentPublicSocket->sin_port) << " LA: " << inet_ntoa(agentLocalSocket->sin_addr) <<
":" << ntohs(agentLocalSocket->sin_port); ":" << ntohs(agentLocalSocket->sin_port);
return os; return os;

View file

@ -40,7 +40,8 @@ public:
pthread_mutex_t deleteMutex; pthread_mutex_t deleteMutex;
char getType(); char getType() const;
const char* getTypeName() const;
void setType(char newType); void setType(char newType);
uint16_t getAgentId(); uint16_t getAgentId();
void setAgentId(uint16_t thisAgentId); void setAgentId(uint16_t thisAgentId);

View file

@ -11,6 +11,7 @@
#include <cstdlib> #include <cstdlib>
#include <cstdio> #include <cstdio>
#include "AgentList.h" #include "AgentList.h"
#include "AgentTypes.h"
#include "PacketHeaders.h" #include "PacketHeaders.h"
#include "SharedUtil.h" #include "SharedUtil.h"
@ -69,12 +70,12 @@ unsigned int AgentList::getSocketListenPort() {
void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes) { void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size_t dataBytes) {
switch (((char *)packetData)[0]) { switch (((char *)packetData)[0]) {
case 'D': { case PACKET_HEADER_DOMAIN: {
// list of agents from domain server // list of agents from domain server
updateList((unsigned char *)packetData, dataBytes); updateList((unsigned char *)packetData, dataBytes);
break; break;
} }
case 'H': { case PACKET_HEADER_HEAD_DATA: {
// head data from another agent // head data from another agent
updateAgentWithData(senderAddress, packetData, dataBytes); updateAgentWithData(senderAddress, packetData, dataBytes);
break; break;
@ -82,8 +83,7 @@ void AgentList::processAgentData(sockaddr *senderAddress, void *packetData, size
case PACKET_HEADER_PING: { case PACKET_HEADER_PING: {
// ping from another agent // ping from another agent
//std::cout << "Got ping from " << inet_ntoa(((sockaddr_in *)senderAddress)->sin_addr) << "\n"; //std::cout << "Got ping from " << inet_ntoa(((sockaddr_in *)senderAddress)->sin_addr) << "\n";
char reply[] = "R"; agentSocket.send(senderAddress, &PACKET_HEADER_PING_REPLY, 1);
agentSocket.send(senderAddress, reply, 1);
break; break;
} }
case PACKET_HEADER_PING_REPLY: { case PACKET_HEADER_PING_REPLY: {
@ -181,13 +181,13 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket,
newAgent.activatePublicSocket(); newAgent.activatePublicSocket();
} }
if (newAgent.getType() == 'M' && audioMixerSocketUpdate != NULL) { if (newAgent.getType() == AGENT_TYPE_MIXER && audioMixerSocketUpdate != NULL) {
// this is an audio mixer // this is an audio mixer
// for now that means we need to tell the audio class // for now that means we need to tell the audio class
// to use the local socket information the domain server gave us // to use the local socket information the domain server gave us
sockaddr_in *publicSocketIn = (sockaddr_in *)publicSocket; sockaddr_in *publicSocketIn = (sockaddr_in *)publicSocket;
audioMixerSocketUpdate(publicSocketIn->sin_addr.s_addr, publicSocketIn->sin_port); audioMixerSocketUpdate(publicSocketIn->sin_addr.s_addr, publicSocketIn->sin_port);
} else if (newAgent.getType() == 'V') { } else if (newAgent.getType() == AGENT_TYPE_VOXEL) {
newAgent.activatePublicSocket(); newAgent.activatePublicSocket();
} }
@ -200,7 +200,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket,
return true; return true;
} else { } else {
if (agent->getType() == 'M' || agent->getType() == 'V') { if (agent->getType() == AGENT_TYPE_MIXER || agent->getType() == AGENT_TYPE_VOXEL) {
// until the Audio class also uses our agentList, we need to update // until the Audio class also uses our agentList, we need to update
// the lastRecvTimeUsecs for the audio mixer so it doesn't get killed and re-added continously // the lastRecvTimeUsecs for the audio mixer so it doesn't get killed and re-added continously
agent->setLastRecvTimeUsecs(usecTimestampNow()); agent->setLastRecvTimeUsecs(usecTimestampNow());
@ -211,6 +211,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket,
} }
} }
// XXXBHG - do we want to move these?
const char* AgentList::AGENTS_OF_TYPE_HEAD = "H"; const char* AgentList::AGENTS_OF_TYPE_HEAD = "H";
const char* AgentList::AGENTS_OF_TYPE_VOXEL_AND_INTERFACE = "VI"; const char* AgentList::AGENTS_OF_TYPE_VOXEL_AND_INTERFACE = "VI";
const char* AgentList::AGENTS_OF_TYPE_VOXEL = "V"; const char* AgentList::AGENTS_OF_TYPE_VOXEL = "V";
@ -230,7 +231,7 @@ void AgentList::pingAgents() {
*payload = PACKET_HEADER_PING; *payload = PACKET_HEADER_PING;
for(std::vector<Agent>::iterator agent = agents.begin(); agent != agents.end(); agent++) { for(std::vector<Agent>::iterator agent = agents.begin(); agent != agents.end(); agent++) {
if (agent->getType() == 'I') { if (agent->getType() == AGENT_TYPE_INTERFACE) {
if (agent->getActiveSocket() != NULL) { if (agent->getActiveSocket() != NULL) {
// we know which socket is good for this agent, send there // we know which socket is good for this agent, send there
agentSocket.send(agent->getActiveSocket(), payload, 1); agentSocket.send(agent->getActiveSocket(), payload, 1);
@ -269,7 +270,8 @@ void *removeSilentAgents(void *args) {
pthread_mutex_t * agentDeleteMutex = &agent->deleteMutex; pthread_mutex_t * agentDeleteMutex = &agent->deleteMutex;
if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS && agent->getType() != 'V' if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS
&& agent->getType() != AGENT_TYPE_VOXEL
&& pthread_mutex_trylock(agentDeleteMutex) == 0) { && pthread_mutex_trylock(agentDeleteMutex) == 0) {
std::cout << "Killing agent " << &(*agent) << "\n"; std::cout << "Killing agent " << &(*agent) << "\n";
@ -325,7 +327,7 @@ void *checkInWithDomainServer(void *args) {
sockaddr_in tempAddress; sockaddr_in tempAddress;
memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length);
strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr)); strcpy(DOMAIN_IP, inet_ntoa(tempAddress.sin_addr));
printf("Domain server %s: %s\n", DOMAIN_HOSTNAME, DOMAIN_IP); printf("Domain server %s: \n", DOMAIN_HOSTNAME);
} else { } else {
printf("Failed lookup domainserver\n"); printf("Failed lookup domainserver\n");

27
shared/src/AgentTypes.h Normal file
View file

@ -0,0 +1,27 @@
//
// AgentTypes.h
// hifi
//
// Created by Brad Hefta-Gaub on 2013/04/09
//
//
// Single byte/character Agent Types used to identify various agents in the system.
// For example, an agent whose is 'V' is always a voxel server.
//
#ifndef hifi_AgentTypes_h
#define hifi_AgentTypes_h
// NOTE: If you add a new AGENT_TYPE_XXX then you also should add a new AGENT_TYPE_NAME_XXX and a new "case" to the
// switch statement in Agent.cpp specifically Agent::getTypeName().
// If you don't then it will make things harder on your co-developers in debugging because the Agent
// class won't know the name and will report it as "Unknown".
// Agent Type Codes
const char AGENT_TYPE_DOMAIN = 'D';
const char AGENT_TYPE_VOXEL = 'V';
const char AGENT_TYPE_INTERFACE = 'I'; // could also be injector???
const char AGENT_TYPE_HEAD = 'H'; // Is this needed???
const char AGENT_TYPE_MIXER = 'M';
#endif

View file

@ -5,6 +5,9 @@
// Created by Stephen Birarda on 4/8/13. // Created by Stephen Birarda on 4/8/13.
// //
// //
// The packet headers below refer to the first byte of a received UDP packet transmitted between
// any two Hifi components. For example, a packet whose first byte is 'P' is always a ping packet.
//
#ifndef hifi_PacketHeaders_h #ifndef hifi_PacketHeaders_h
#define hifi_PacketHeaders_h #define hifi_PacketHeaders_h
@ -12,5 +15,12 @@
const char PACKET_HEADER_DOMAIN = 'D'; const char PACKET_HEADER_DOMAIN = 'D';
const char PACKET_HEADER_PING = 'P'; const char PACKET_HEADER_PING = 'P';
const char PACKET_HEADER_PING_REPLY = 'R'; 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_TRANSMITTER_DATA = 't';
#endif #endif

View file

@ -131,7 +131,7 @@ bool cmdOptionExists(int argc, const char * argv[],const char* option) {
// corresponding to the closest voxel which encloses a cube with // corresponding to the closest voxel which encloses a cube with
// lower corners at x,y,z, having side of length S. // lower corners at x,y,z, having side of length S.
// The input values x,y,z range 0.0 <= v < 1.0 // The input values x,y,z range 0.0 <= v < 1.0
// message should be either 'I' for insert or 'R' for remove // message should be either 'S' for SET or 'E' for ERASE
// //
// IMPORTANT: The buffer is returned to you a buffer which you MUST delete when you are // IMPORTANT: The buffer is returned to you a buffer which you MUST delete when you are
// done with it. // done with it.

View file

@ -10,6 +10,7 @@
#include <cstdio> #include <cstdio>
#include <cmath> #include <cmath>
#include "SharedUtil.h" #include "SharedUtil.h"
#include "PacketHeaders.h"
#include "CounterStats.h" #include "CounterStats.h"
#include "OctalCode.h" #include "OctalCode.h"
#include "VoxelTree.h" #include "VoxelTree.h"
@ -309,7 +310,7 @@ unsigned char * VoxelTree::loadBitstreamBuffer(unsigned char *& bitstreamBuffer,
if (strcmp((char *)stopOctalCode, (char *)currentVoxelNode->octalCode) == 0) { if (strcmp((char *)stopOctalCode, (char *)currentVoxelNode->octalCode) == 0) {
// this is is the root node for this packet // this is is the root node for this packet
// add the leading V // add the leading V
*(bitstreamBuffer++) = 'V'; *(bitstreamBuffer++) = PACKET_HEADER_VOXEL_DATA;
// add its octal code to the packet // add its octal code to the packet
int octalCodeBytes = bytesRequiredForCodeLength(*currentVoxelNode->octalCode); int octalCodeBytes = bytesRequiredForCodeLength(*currentVoxelNode->octalCode);

View file

@ -68,15 +68,15 @@ if (empty($options['i']) && empty($options['zcommand'])) {
$filename = $options['i']; $filename = $options['i'];
$server = $options['s']; $server = $options['s'];
$port = empty($options['p']) ? 40106 : $options['p']; $port = empty($options['p']) ? 40106 : $options['p'];
$command = empty($options['c']) ? 'I' : $options['c']; $command = empty($options['c']) ? 'S' : $options['c'];
switch($command) { switch($command) {
case 'I': case 'S':
case 'R': case 'E':
case 'Z': case 'Z':
//$command is good //$command is good
break; break;
default: default:
$command='I';// insert by default! $command='S';// insert by default!
} }
if ($options['testmode']) { if ($options['testmode']) {

View file

@ -13,9 +13,11 @@
#include <cstdio> #include <cstdio>
#include <OctalCode.h> #include <OctalCode.h>
#include <AgentList.h> #include <AgentList.h>
#include <AgentTypes.h>
#include <VoxelTree.h> #include <VoxelTree.h>
#include "VoxelAgentData.h" #include "VoxelAgentData.h"
#include <SharedUtil.h> #include <SharedUtil.h>
#include <PacketHeaders.h>
#ifdef _WIN32 #ifdef _WIN32
#include "Syssocket.h" #include "Syssocket.h"
@ -44,7 +46,7 @@ const int PACKETS_PER_CLIENT_PER_INTERVAL = 2;
const int MAX_VOXEL_TREE_DEPTH_LEVELS = 4; const int MAX_VOXEL_TREE_DEPTH_LEVELS = 4;
AgentList agentList('V', VOXEL_LISTEN_PORT); AgentList agentList(AGENT_TYPE_VOXEL, VOXEL_LISTEN_PORT);
VoxelTree randomTree; VoxelTree randomTree;
bool wantColorRandomizer = false; bool wantColorRandomizer = false;
@ -293,8 +295,8 @@ int main(int argc, const char * argv[])
// loop to send to agents requesting data // loop to send to agents requesting data
while (true) { while (true) {
if (agentList.getAgentSocket().receive(&agentPublicAddress, packetData, &receivedBytes)) { if (agentList.getAgentSocket().receive(&agentPublicAddress, packetData, &receivedBytes)) {
// XXXBHG: Hacked in support for 'I' insert command // XXXBHG: Hacked in support for 'S' SET command
if (packetData[0] == 'I') { if (packetData[0] == PACKET_HEADER_SET_VOXEL) {
unsigned short int itemNumber = (*((unsigned short int*)&packetData[1])); unsigned short int itemNumber = (*((unsigned short int*)&packetData[1]));
printf("got I - insert voxels - command from client receivedBytes=%ld itemNumber=%d\n", printf("got I - insert voxels - command from client receivedBytes=%ld itemNumber=%d\n",
receivedBytes,itemNumber); receivedBytes,itemNumber);
@ -335,10 +337,10 @@ int main(int argc, const char * argv[])
// after done inserting all these voxels, then reaverage colors // after done inserting all these voxels, then reaverage colors
randomTree.reaverageVoxelColors(randomTree.rootNode); randomTree.reaverageVoxelColors(randomTree.rootNode);
} }
if (packetData[0] == 'R') { if (packetData[0] == PACKET_HEADER_ERASE_VOXEL) {
// Send these bits off to the VoxelTree class to process them // Send these bits off to the VoxelTree class to process them
printf("got Remove Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n"); printf("got Erase Voxels message, have voxel tree do the work... randomTree.processRemoveVoxelBitstream()\n");
randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes); randomTree.processRemoveVoxelBitstream((unsigned char*)packetData,receivedBytes);
// Now send this to the connected agents so they know to delete // Now send this to the connected agents so they know to delete
@ -346,7 +348,7 @@ int main(int argc, const char * argv[])
agentList.broadcastToAgents(packetData,receivedBytes,AgentList::AGENTS_OF_TYPE_HEAD); agentList.broadcastToAgents(packetData,receivedBytes,AgentList::AGENTS_OF_TYPE_HEAD);
} }
if (packetData[0] == 'Z') { if (packetData[0] == PACKET_HEADER_Z_COMMAND) {
// the Z command is a special command that allows the sender to send the voxel server high level semantic // the Z command is a special command that allows the sender to send the voxel server high level semantic
// requests, like erase all, or add sphere scene // requests, like erase all, or add sphere scene
@ -373,7 +375,7 @@ int main(int argc, const char * argv[])
printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n"); printf("rebroadcasting Z message to connected agents... agentList.broadcastToAgents()\n");
agentList.broadcastToAgents(packetData,receivedBytes,AgentList::AGENTS_OF_TYPE_HEAD); agentList.broadcastToAgents(packetData,receivedBytes,AgentList::AGENTS_OF_TYPE_HEAD);
} }
if (packetData[0] == 'H') { if (packetData[0] == PACKET_HEADER_HEAD_DATA) {
if (agentList.addOrUpdateAgent(&agentPublicAddress, if (agentList.addOrUpdateAgent(&agentPublicAddress,
&agentPublicAddress, &agentPublicAddress,
packetData[0], packetData[0],