From 0768785cfd5ac5180adfb7011f628439d4588484 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 17 Apr 2013 11:01:08 -0700 Subject: [PATCH 1/7] fix mutex movement when resizing AgentList vector --- libraries/shared/src/Agent.cpp | 16 ++++++++++++---- libraries/shared/src/Agent.h | 25 ++++++++++++------------- libraries/shared/src/AgentList.cpp | 2 +- voxel-server/src/main.cpp | 8 ++++---- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/libraries/shared/src/Agent.cpp b/libraries/shared/src/Agent.cpp index 8c14d9a617..1ac676e916 100644 --- a/libraries/shared/src/Agent.cpp +++ b/libraries/shared/src/Agent.cpp @@ -19,8 +19,6 @@ #include #endif -Agent::Agent() {} - Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId) { publicSocket = new sockaddr; memcpy(publicSocket, agentPublicSocket, sizeof(sockaddr)); @@ -37,7 +35,8 @@ Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agent activeSocket = NULL; linkedData = NULL; - pthread_mutex_init(&deleteMutex, NULL); + deleteMutex = new pthread_mutex_t; + pthread_mutex_init(deleteMutex, NULL); } Agent::Agent(const Agent &otherAgent) { @@ -67,25 +66,34 @@ Agent::Agent(const Agent &otherAgent) { linkedData = NULL; } - pthread_mutex_init(&deleteMutex, NULL); + deleteMutex = new pthread_mutex_t; + pthread_mutex_init(deleteMutex, NULL); } Agent& Agent::operator=(Agent otherAgent) { + std::cout << "Agent swap constructor called on resize?\n"; swap(*this, otherAgent); return *this; } void Agent::swap(Agent &first, Agent &second) { using std::swap; + swap(first.publicSocket, second.publicSocket); swap(first.localSocket, second.localSocket); swap(first.activeSocket, second.activeSocket); swap(first.type, second.type); swap(first.linkedData, second.linkedData); swap(first.agentId, second.agentId); + swap(first.firstRecvTimeUsecs, second.firstRecvTimeUsecs); + swap(first.lastRecvTimeUsecs, second.lastRecvTimeUsecs); + swap(first.deleteMutex, second.deleteMutex); } Agent::~Agent() { + // the deleteMutex isn't destroyed here + // that's handled by the agent list silent agent removal thread + delete publicSocket; delete localSocket; delete linkedData; diff --git a/libraries/shared/src/Agent.h b/libraries/shared/src/Agent.h index bc6a6eb714..13d3326e57 100644 --- a/libraries/shared/src/Agent.h +++ b/libraries/shared/src/Agent.h @@ -19,17 +19,8 @@ #include #endif -class Agent { - void swap(Agent &first, Agent &second); - sockaddr *publicSocket, *localSocket, *activeSocket; - char type; - uint16_t agentId; - double firstRecvTimeUsecs; - double lastRecvTimeUsecs; - AgentData *linkedData; - -public: - Agent(); +class Agent { +public: Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agentType, uint16_t thisAgentId); Agent(const Agent &otherAgent); ~Agent(); @@ -38,7 +29,7 @@ public: bool matches(sockaddr *otherPublicSocket, sockaddr *otherLocalSocket, char otherAgentType); - pthread_mutex_t deleteMutex; + pthread_mutex_t *deleteMutex; char getType() const; const char* getTypeName() const; @@ -59,7 +50,15 @@ public: AgentData* getLinkedData(); void setLinkedData(AgentData *newData); - friend std::ostream& operator<<(std::ostream& os, const Agent* agent); + friend std::ostream& operator<<(std::ostream& os, const Agent* agent); +private: + void swap(Agent &first, Agent &second); + sockaddr *publicSocket, *localSocket, *activeSocket; + char type; + uint16_t agentId; + double firstRecvTimeUsecs; + double lastRecvTimeUsecs; + AgentData *linkedData; }; std::ostream& operator<<(std::ostream& os, const Agent* agent); diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 2751527d37..33716ec9f1 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -331,7 +331,7 @@ void *removeSilentAgents(void *args) { for(std::vector::iterator agent = agents->begin(); agent != agents->end();) { - pthread_mutex_t * agentDeleteMutex = &agent->deleteMutex; + pthread_mutex_t* agentDeleteMutex = agent->deleteMutex; if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS && agent->getType() != AGENT_TYPE_VOXEL diff --git a/voxel-server/src/main.cpp b/voxel-server/src/main.cpp index 70a743b9c0..8f6bab7dc7 100644 --- a/voxel-server/src/main.cpp +++ b/voxel-server/src/main.cpp @@ -129,7 +129,7 @@ void eraseVoxelTreeAndCleanupAgentVisitData() { // lock this agent's delete mutex so that the delete thread doesn't // kill the agent while we are working with it - pthread_mutex_lock(&thisAgent->deleteMutex); + pthread_mutex_lock(thisAgent->deleteMutex); // clean up the agent visit data delete agentData->rootMarkerNode; @@ -137,7 +137,7 @@ void eraseVoxelTreeAndCleanupAgentVisitData() { // unlock the delete mutex so the other thread can // kill the agent if it has dissapeared - pthread_mutex_unlock(&thisAgent->deleteMutex); + pthread_mutex_unlock(thisAgent->deleteMutex); } } @@ -167,7 +167,7 @@ void *distributeVoxelsToListeners(void *args) { // lock this agent's delete mutex so that the delete thread doesn't // kill the agent while we are working with it - pthread_mutex_lock(&thisAgent->deleteMutex); + pthread_mutex_lock(thisAgent->deleteMutex); stopOctal = NULL; packetCount = 0; @@ -207,7 +207,7 @@ void *distributeVoxelsToListeners(void *args) { // unlock the delete mutex so the other thread can // kill the agent if it has dissapeared - pthread_mutex_unlock(&thisAgent->deleteMutex); + pthread_mutex_unlock(thisAgent->deleteMutex); } // dynamically sleep until we need to fire off the next set of voxels From 53796d067f77578839dc8185090761aae5927292 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 11:11:05 -0700 Subject: [PATCH 2/7] changed Ori constructor to include setIdentity --- libraries/avatars/src/Orientation.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/avatars/src/Orientation.cpp b/libraries/avatars/src/Orientation.cpp index cd19b2aac0..8eeb3dd0ff 100755 --- a/libraries/avatars/src/Orientation.cpp +++ b/libraries/avatars/src/Orientation.cpp @@ -12,9 +12,7 @@ static bool testingForNormalizationAndOrthogonality = true; Orientation::Orientation() { - right = glm::vec3( 1.0, 0.0, 0.0 ); - up = glm::vec3( 0.0, 1.0, 0.0 ); - front = glm::vec3( 0.0, 0.0, 1.0 ); + setToIdentity(); } From 3cee28f0efabbeed186ea57732129ceb73436f7b Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 11:23:47 -0700 Subject: [PATCH 3/7] added back the av position --- interface/src/Head.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 658e749eed..4f77e6fafe 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -548,7 +548,6 @@ void Head::simulate(float deltaTime) { void Head::render(int faceToFace, int isMine) { -/* //--------------------------------------------------- // show avatar position //--------------------------------------------------- @@ -557,7 +556,6 @@ void Head::render(int faceToFace, int isMine) { glScalef( 0.03, 0.03, 0.03 ); glutSolidSphere( 1, 10, 10 ); glPopMatrix(); -*/ //--------------------------------------------------- // show avatar orientation From e9592c45c744b1da105adaa81cfa09d57c74b966 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 17 Apr 2013 11:56:32 -0700 Subject: [PATCH 4/7] fix reference to resources directory on OS X --- interface/src/Audio.cpp | 4 ++-- interface/src/Head.cpp | 2 +- libraries/shared/src/SharedUtil.cpp | 3 ++- libraries/shared/src/SharedUtil.h | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 578e1368c8..997361a378 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -444,8 +444,8 @@ Audio::Audio(Oscilloscope *s, Head *linkedHead) // read the walking sound from the raw file and store it // in the in memory array - switchToResourcesIfRequired(); - FILE *soundFile = fopen("audio/walking.raw", "r"); + switchToResourcesParentIfRequired(); + FILE *soundFile = fopen("resources/audio/walking.raw", "r"); // get length of file: std::fseek(soundFile, 0, SEEK_END); diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 658e749eed..7a310b8171 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -114,7 +114,7 @@ Head::Head() { springVelocityDecay = 16.0f; if (iris_texture.size() == 0) { - switchToResourcesIfRequired(); + switchToResourcesParentIfRequired(); unsigned error = lodepng::decode(iris_texture, iris_texture_width, iris_texture_height, iris_texture_file); if (error != 0) { std::cout << "error " << error << ": " << lodepng_error_text(error) << std::endl; diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 8fb8645730..97c9b047be 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -74,7 +74,7 @@ bool oneAtBit(unsigned char byte, int bitIndex) { return (byte >> (7 - bitIndex) & 1); } -void switchToResourcesIfRequired() { +void switchToResourcesParentIfRequired() { #ifdef __APPLE__ CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); @@ -85,6 +85,7 @@ void switchToResourcesIfRequired() { CFRelease(resourcesURL); chdir(path); + chdir(".."); #endif } diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index f7e639ba43..e70229637a 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -47,7 +47,7 @@ void printVoxelCode(unsigned char* voxelCode); int numberOfOnes(unsigned char byte); bool oneAtBit(unsigned char byte, int bitIndex); -void switchToResourcesIfRequired(); +void switchToResourcesParentIfRequired(); const char* getCmdOption(int argc, const char * argv[],const char* option); bool cmdOptionExists(int argc, const char * argv[],const char* option); From 4f0ca2f33eff3cc167a0d873fc59ca76c62b43ed Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 12:31:03 -0700 Subject: [PATCH 5/7] added quaternions to avatar body and bone structure (but not using them yet) --- interface/src/Head.cpp | 76 ++++++++++++--------------- interface/src/Head.h | 10 +++- libraries/avatars/src/Orientation.cpp | 3 +- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 4f77e6fafe..18fa5c9181 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -48,26 +48,20 @@ unsigned int iris_texture_height = 256; Head::Head() { initializeAvatar(); - + avatar.orientation.setToIdentity(); avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.orientation.setToIdentity(); - - closestOtherAvatar = 0; - - _bodyYaw = -90.0; - _bodyPitch = 0.0; - _bodyRoll = 0.0; - - bodyYawDelta = 0.0; - - triggeringAction = false; - - mode = AVATAR_MODE_STANDING; + rotation = glm::quat( 0.0f, 0.0f, 0.0f, 0.0f ); + closestOtherAvatar = 0; + _bodyYaw = -90.0; + _bodyPitch = 0.0; + _bodyRoll = 0.0; + bodyYawDelta = 0.0; + triggeringAction = false; + mode = AVATAR_MODE_STANDING; initializeSkeleton(); - for (int i = 0; i < MAX_DRIVE_KEYS; i++) driveKeys[i] = false; PupilSize = 0.10; @@ -102,17 +96,15 @@ Head::Head() { browAudioLift = 0.0; noise = 0; - handBeingMoved = false; - previousHandBeingMoved = false; - movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 ); + handBeingMoved = false; + previousHandBeingMoved = false; + movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 ); + usingSprings = false; + springForce = 6.0f; + springVelocityDecay = 16.0f; sphere = NULL; - usingSprings = false; - - springForce = 6.0f; - springVelocityDecay = 16.0f; - if (iris_texture.size() == 0) { switchToResourcesIfRequired(); unsigned error = lodepng::decode(iris_texture, iris_texture_width, iris_texture_height, iris_texture_file); @@ -137,30 +129,23 @@ Head::Head() { } - - Head::Head(const Head &otherHead) { initializeAvatar(); + avatar.orientation.set( otherHead.avatar.orientation ); avatar.velocity = otherHead.avatar.velocity; avatar.thrust = otherHead.avatar.thrust; - avatar.orientation.set( otherHead.avatar.orientation ); - - closestOtherAvatar = otherHead.closestOtherAvatar; - - _bodyYaw = otherHead._bodyYaw; - _bodyPitch = otherHead._bodyPitch; - _bodyRoll = otherHead._bodyRoll; - - bodyYawDelta = otherHead.bodyYawDelta; - - triggeringAction = otherHead.triggeringAction; - - mode = otherHead.mode; + rotation = otherHead.rotation; + closestOtherAvatar = otherHead.closestOtherAvatar; + _bodyYaw = otherHead._bodyYaw; + _bodyPitch = otherHead._bodyPitch; + _bodyRoll = otherHead._bodyRoll; + bodyYawDelta = otherHead.bodyYawDelta; + triggeringAction = otherHead.triggeringAction; + mode = otherHead.mode; initializeSkeleton(); - for (int i = 0; i < MAX_DRIVE_KEYS; i++) driveKeys[i] = otherHead.driveKeys[i]; PupilSize = otherHead.PupilSize; @@ -833,14 +818,19 @@ void Head::initializeAvatar() { } - - void Head::initializeSkeleton() { for (int b=0; b + +#include and + + enum eyeContactTargets {LEFT_EYE, RIGHT_EYE, MOUTH}; #define FWD 0 @@ -80,6 +85,7 @@ struct AvatarBone glm::vec3 springyPosition; // used for special effects (a 'flexible' variant of position) glm::dvec3 springyVelocity; // used for special effects ( the velocity of the springy position) float springBodyTightness; // how tightly the springy position tries to stay on the position + glm::quat rotation; // this will eventually replace yaw, pitch and roll (and maybe orienttion) float yaw; // the yaw Euler angle of the bone rotation off the parent float pitch; // the pitch Euler angle of the bone rotation off the parent float roll; // the roll Euler angle of the bone rotation off the parent @@ -231,7 +237,9 @@ class Head : public AvatarData { GLUquadric *sphere; Avatar avatar; - + + glm::quat rotation; // the rotation of the avatar body as a whole + AvatarBone bone[ NUM_AVATAR_BONES ]; AvatarMode mode; diff --git a/libraries/avatars/src/Orientation.cpp b/libraries/avatars/src/Orientation.cpp index 8eeb3dd0ff..f11f820c89 100755 --- a/libraries/avatars/src/Orientation.cpp +++ b/libraries/avatars/src/Orientation.cpp @@ -22,7 +22,6 @@ void Orientation::setToIdentity() { front = glm::vec3( 0.0, 0.0, 1.0 ); } - void Orientation::set( Orientation o ) { right = o.right; up = o.up; @@ -125,7 +124,7 @@ void Orientation::testForOrthogonalAndNormalizedVectors( float epsilon ) { //---------------------------------------------------------------- - // make sure vectors are orthoginal (or close enough) + // make sure vectors are orthogonal (or close enough) //---------------------------------------------------------------- glm::vec3 rightCross = glm::cross( up, front ); glm::vec3 upCross = glm::cross( front, right ); From 3856a70b7e2eb76f8949e372a23965afa0958949 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 17 Apr 2013 12:48:47 -0700 Subject: [PATCH 6/7] added "_" to several members in Head class, and cleaned up some code formatting (housecleaning :) --- interface/src/Head.cpp | 426 ++++++++++++++++++++--------------------- interface/src/Head.h | 52 +++-- 2 files changed, 235 insertions(+), 243 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 18fa5c9181..1d25118210 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -48,17 +48,17 @@ unsigned int iris_texture_height = 256; Head::Head() { initializeAvatar(); - avatar.orientation.setToIdentity(); - avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); - avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); - rotation = glm::quat( 0.0f, 0.0f, 0.0f, 0.0f ); - closestOtherAvatar = 0; + _avatar.orientation.setToIdentity(); + _avatar.velocity = glm::vec3( 0.0, 0.0, 0.0 ); + _avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); + _rotation = glm::quat( 0.0f, 0.0f, 0.0f, 0.0f ); + _closestOtherAvatar = 0; _bodyYaw = -90.0; _bodyPitch = 0.0; _bodyRoll = 0.0; - bodyYawDelta = 0.0; - triggeringAction = false; - mode = AVATAR_MODE_STANDING; + _bodyYawDelta = 0.0; + _triggeringAction = false; + _mode = AVATAR_MODE_STANDING; initializeSkeleton(); @@ -96,12 +96,12 @@ Head::Head() { browAudioLift = 0.0; noise = 0; - handBeingMoved = false; - previousHandBeingMoved = false; - movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 ); - usingSprings = false; - springForce = 6.0f; - springVelocityDecay = 16.0f; + _handBeingMoved = false; + _previousHandBeingMoved = false; + _movedHandOffset = glm::vec3( 0.0, 0.0, 0.0 ); + _usingSprings = false; + _springForce = 6.0f; + _springVelocityDecay = 16.0f; sphere = NULL; @@ -132,17 +132,17 @@ Head::Head() { Head::Head(const Head &otherHead) { initializeAvatar(); - avatar.orientation.set( otherHead.avatar.orientation ); - avatar.velocity = otherHead.avatar.velocity; - avatar.thrust = otherHead.avatar.thrust; - rotation = otherHead.rotation; - closestOtherAvatar = otherHead.closestOtherAvatar; + _avatar.orientation.set( otherHead._avatar.orientation ); + _avatar.velocity = otherHead._avatar.velocity; + _avatar.thrust = otherHead._avatar.thrust; + _rotation = otherHead._rotation; + _closestOtherAvatar = otherHead._closestOtherAvatar; _bodyYaw = otherHead._bodyYaw; _bodyPitch = otherHead._bodyPitch; _bodyRoll = otherHead._bodyRoll; - bodyYawDelta = otherHead.bodyYawDelta; - triggeringAction = otherHead.triggeringAction; - mode = otherHead.mode; + _bodyYawDelta = otherHead._bodyYawDelta; + _triggeringAction = otherHead._triggeringAction; + _mode = otherHead._mode; initializeSkeleton(); @@ -268,7 +268,7 @@ void Head::setLeanSideways(float dist){ } void Head::setTriggeringAction( bool d ) { - triggeringAction = d; + _triggeringAction = d; } @@ -279,7 +279,7 @@ void Head::simulate(float deltaTime) { // DEBUG - other avatars... //------------------------------------- //closeEnoughToInteract = 0.3f; - closestOtherAvatar = -1; + _closestOtherAvatar = -1; float closestDistance = 10000.0f; @@ -303,15 +303,15 @@ void Head::simulate(float deltaTime) { //------------------------------------- // test other avs for proximity... //------------------------------------- - glm::vec3 v( bone[ AVATAR_BONE_RIGHT_SHOULDER ].position ); + glm::vec3 v( _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position ); v -= DEBUG_otherAvatarListPosition[o]; float distance = glm::length( v ); - if ( distance < avatar.maxArmLength ) { + if ( distance < _avatar.maxArmLength ) { if ( distance < closestDistance ) { closestDistance = distance; - closestOtherAvatar = o; + _closestOtherAvatar = o; } } } @@ -327,80 +327,80 @@ void Head::simulate(float deltaTime) { //------------------------------------------------------------------------ // reset hand and elbow position according to hand movement //------------------------------------------------------------------------ - if ( handBeingMoved ){ - if (! previousHandBeingMoved ){ + if ( _handBeingMoved ){ + if (! _previousHandBeingMoved ){ initializeBodySprings(); - usingSprings = true; + _usingSprings = true; //printf( "just started moving hand\n" ); } } else { - if ( previousHandBeingMoved ){ - usingSprings = false; + if ( _previousHandBeingMoved ){ + _usingSprings = false; //printf( "just stopped moving hand\n" ); } } - if ( handBeingMoved ) { + if ( _handBeingMoved ) { updateHandMovement(); updateBodySprings( deltaTime ); } - previousHandBeingMoved = handBeingMoved; - handBeingMoved = false; + _previousHandBeingMoved = _handBeingMoved; + _handBeingMoved = false; //------------------------------------------------- // this handles the avatar being driven around... //------------------------------------------------- - avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); + _avatar.thrust = glm::vec3( 0.0, 0.0, 0.0 ); if (driveKeys[FWD]) { - glm::vec3 front( avatar.orientation.getFront().x, avatar.orientation.getFront().y, avatar.orientation.getFront().z ); - avatar.thrust += front * THRUST_MAG; + glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); + _avatar.thrust += front * THRUST_MAG; } if (driveKeys[BACK]) { - glm::vec3 front( avatar.orientation.getFront().x, avatar.orientation.getFront().y, avatar.orientation.getFront().z ); - avatar.thrust -= front * THRUST_MAG; + glm::vec3 front( _avatar.orientation.getFront().x, _avatar.orientation.getFront().y, _avatar.orientation.getFront().z ); + _avatar.thrust -= front * THRUST_MAG; } if (driveKeys[RIGHT]) { - glm::vec3 right( avatar.orientation.getRight().x, avatar.orientation.getRight().y, avatar.orientation.getRight().z ); - avatar.thrust -= right * THRUST_MAG; + glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); + _avatar.thrust -= right * THRUST_MAG; } if (driveKeys[LEFT]) { - glm::vec3 right( avatar.orientation.getRight().x, avatar.orientation.getRight().y, avatar.orientation.getRight().z ); - avatar.thrust += right * THRUST_MAG; + glm::vec3 right( _avatar.orientation.getRight().x, _avatar.orientation.getRight().y, _avatar.orientation.getRight().z ); + _avatar.thrust += right * THRUST_MAG; } if (driveKeys[UP]) { - glm::vec3 up( avatar.orientation.getUp().x, avatar.orientation.getUp().y, avatar.orientation.getUp().z ); - avatar.thrust += up * THRUST_MAG; + glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); + _avatar.thrust += up * THRUST_MAG; } if (driveKeys[DOWN]) { - glm::vec3 up( avatar.orientation.getUp().x, avatar.orientation.getUp().y, avatar.orientation.getUp().z ); - avatar.thrust -= up * THRUST_MAG; + glm::vec3 up( _avatar.orientation.getUp().x, _avatar.orientation.getUp().y, _avatar.orientation.getUp().z ); + _avatar.thrust -= up * THRUST_MAG; } if (driveKeys[ROT_RIGHT]) { - bodyYawDelta -= YAW_MAG * deltaTime; + _bodyYawDelta -= YAW_MAG * deltaTime; } if (driveKeys[ROT_LEFT]) { - bodyYawDelta += YAW_MAG * deltaTime; + _bodyYawDelta += YAW_MAG * deltaTime; } //---------------------------------------------------------- - float translationalSpeed = glm::length( avatar.velocity ); - float rotationalSpeed = fabs( bodyYawDelta ); + float translationalSpeed = glm::length( _avatar.velocity ); + float rotationalSpeed = fabs( _bodyYawDelta ); if ( translationalSpeed + rotationalSpeed > 0.2 ) { - mode = AVATAR_MODE_WALKING; + _mode = AVATAR_MODE_WALKING; } else { - mode = AVATAR_MODE_COMMUNICATING; + _mode = AVATAR_MODE_COMMUNICATING; } //---------------------------------------------------------- // update body yaw by body yaw delta //---------------------------------------------------------- - _bodyYaw += bodyYawDelta * deltaTime; + _bodyYaw += _bodyYawDelta * deltaTime; //---------------------------------------------------------- // (for now) set head yaw to body yaw @@ -411,23 +411,23 @@ void Head::simulate(float deltaTime) { // decay body yaw delta //---------------------------------------------------------- const float TEST_YAW_DECAY = 5.0; - bodyYawDelta *= ( 1.0 - TEST_YAW_DECAY * deltaTime ); + _bodyYawDelta *= ( 1.0 - TEST_YAW_DECAY * deltaTime ); //---------------------------------------------------------- // add thrust to velocity //---------------------------------------------------------- - avatar.velocity += glm::dvec3( avatar.thrust * deltaTime ); + _avatar.velocity += glm::dvec3( _avatar.thrust * deltaTime ); //---------------------------------------------------------- // update position by velocity //---------------------------------------------------------- - _bodyPosition += (glm::vec3)avatar.velocity * deltaTime; + _bodyPosition += (glm::vec3)_avatar.velocity * deltaTime; //---------------------------------------------------------- // decay velocity //---------------------------------------------------------- const float LIN_VEL_DECAY = 5.0; - avatar.velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime ); + _avatar.velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime ); @@ -545,7 +545,7 @@ void Head::render(int faceToFace, int isMine) { //--------------------------------------------------- // show avatar orientation //--------------------------------------------------- - renderOrientationDirections(bone[ AVATAR_BONE_HEAD ].position, bone[ AVATAR_BONE_HEAD ].orientation, 0.2f ); + renderOrientationDirections( _bone[ AVATAR_BONE_HEAD ].position, _bone[ AVATAR_BONE_HEAD ].orientation, 0.2f ); //--------------------------------------------------- // render body @@ -568,11 +568,11 @@ void Head::render(int faceToFace, int isMine) { glPopMatrix(); } - if ( usingSprings ) { - if ( closestOtherAvatar != -1 ) { + if ( _usingSprings ) { + if ( _closestOtherAvatar != -1 ) { - glm::vec3 v1( bone[ AVATAR_BONE_RIGHT_HAND ].position ); - glm::vec3 v2( DEBUG_otherAvatarListPosition[ closestOtherAvatar ] ); + glm::vec3 v1( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); + glm::vec3 v2( DEBUG_otherAvatarListPosition[ _closestOtherAvatar ] ); glLineWidth( 5.0 ); glColor4f( 0.9f, 0.5f, 0.2f, 0.6 ); @@ -624,20 +624,20 @@ void Head::renderHead( int faceToFace, int isMine ) { glPushMatrix(); - if ( usingSprings ) { + if ( _usingSprings ) { glTranslatef ( - bone[ AVATAR_BONE_HEAD ].springyPosition.x, - bone[ AVATAR_BONE_HEAD ].springyPosition.y, - bone[ AVATAR_BONE_HEAD ].springyPosition.z + _bone[ AVATAR_BONE_HEAD ].springyPosition.x, + _bone[ AVATAR_BONE_HEAD ].springyPosition.y, + _bone[ AVATAR_BONE_HEAD ].springyPosition.z ); } else { glTranslatef ( - bone[ AVATAR_BONE_HEAD ].position.x, - bone[ AVATAR_BONE_HEAD ].position.y, - bone[ AVATAR_BONE_HEAD ].position.z + _bone[ AVATAR_BONE_HEAD ].position.x, + _bone[ AVATAR_BONE_HEAD ].position.y, + _bone[ AVATAR_BONE_HEAD ].position.z ); } @@ -786,12 +786,12 @@ void Head::renderHead( int faceToFace, int isMine ) { void Head::setHandMovement( glm::vec3 movement ) { - handBeingMoved = true; - movedHandOffset = movement; + _handBeingMoved = true; + _movedHandOffset = movement; } AvatarMode Head::getMode() { - return mode; + return _mode; } @@ -821,18 +821,18 @@ void Head::initializeAvatar() { void Head::initializeSkeleton() { for (int b=0; b 0.0f ) { glm::vec3 springDirection = springVector / length; - float force = ( length - bone[b].length ) * springForce * deltaTime; + float force = ( length - _bone[b].length ) * _springForce * deltaTime; - bone[ b ].springyVelocity -= springDirection * force; - bone[ bone[b].parent ].springyVelocity += springDirection * force; + _bone[ b ].springyVelocity -= springDirection * force; + _bone[ _bone[b].parent ].springyVelocity += springDirection * force; } - bone[b].springyVelocity += ( bone[b].position - bone[b].springyPosition ) * bone[b].springBodyTightness * deltaTime; + _bone[b].springyVelocity += ( _bone[b].position - _bone[b].springyPosition ) * _bone[b].springBodyTightness * deltaTime; - float decay = 1.0 - springVelocityDecay * deltaTime; + float decay = 1.0 - _springVelocityDecay * deltaTime; if ( decay > 0.0 ) { - bone[b].springyVelocity *= decay; + _bone[b].springyVelocity *= decay; } else { - bone[b].springyVelocity = glm::vec3( 0.0f, 0.0f, 0.0f ); + _bone[b].springyVelocity = glm::vec3( 0.0f, 0.0f, 0.0f ); } - bone[b].springyPosition += bone[b].springyVelocity; + _bone[b].springyPosition += _bone[b].springyVelocity; } } @@ -1024,36 +1024,36 @@ float Head::getBodyYaw() { glm::vec3 Head::getHeadLookatDirection() { return glm::vec3 ( - avatar.orientation.getFront().x, - avatar.orientation.getFront().y, - avatar.orientation.getFront().z + _avatar.orientation.getFront().x, + _avatar.orientation.getFront().y, + _avatar.orientation.getFront().z ); } glm::vec3 Head::getHeadLookatDirectionUp() { return glm::vec3 ( - avatar.orientation.getUp().x, - avatar.orientation.getUp().y, - avatar.orientation.getUp().z + _avatar.orientation.getUp().x, + _avatar.orientation.getUp().y, + _avatar.orientation.getUp().z ); } glm::vec3 Head::getHeadLookatDirectionRight() { return glm::vec3 ( - avatar.orientation.getRight().x, - avatar.orientation.getRight().y, - avatar.orientation.getRight().z + _avatar.orientation.getRight().x, + _avatar.orientation.getRight().y, + _avatar.orientation.getRight().z ); } glm::vec3 Head::getHeadPosition() { return glm::vec3 ( - bone[ AVATAR_BONE_HEAD ].position.x, - bone[ AVATAR_BONE_HEAD ].position.y, - bone[ AVATAR_BONE_HEAD ].position.z + _bone[ AVATAR_BONE_HEAD ].position.x, + _bone[ AVATAR_BONE_HEAD ].position.y, + _bone[ AVATAR_BONE_HEAD ].position.z ); } @@ -1061,26 +1061,26 @@ void Head::updateHandMovement() { glm::vec3 transformedHandMovement; transformedHandMovement - = avatar.orientation.getRight() * -movedHandOffset.x - + avatar.orientation.getUp() * -movedHandOffset.y * 0.5f - + avatar.orientation.getFront() * -movedHandOffset.y; + = _avatar.orientation.getRight() * -_movedHandOffset.x + + _avatar.orientation.getUp() * -_movedHandOffset.y * 0.5f + + _avatar.orientation.getFront() * -_movedHandOffset.y; - bone[ AVATAR_BONE_RIGHT_HAND ].position += transformedHandMovement; + _bone[ AVATAR_BONE_RIGHT_HAND ].position += transformedHandMovement; //if holding hands, add a pull to the hand... - if ( usingSprings ) { - if ( closestOtherAvatar != -1 ) { - if ( triggeringAction ) { + if ( _usingSprings ) { + if ( _closestOtherAvatar != -1 ) { + if ( _triggeringAction ) { /* glm::vec3 handShakePull( DEBUG_otherAvatarListPosition[ closestOtherAvatar ]); - handShakePull -= bone[ AVATAR_BONE_RIGHT_HAND ].position; + handShakePull -= _bone[ AVATAR_BONE_RIGHT_HAND ].position; handShakePull *= 1.0; transformedHandMovement += handShakePull; */ - bone[ AVATAR_BONE_RIGHT_HAND ].position = DEBUG_otherAvatarListPosition[ closestOtherAvatar ]; + _bone[ AVATAR_BONE_RIGHT_HAND ].position = DEBUG_otherAvatarListPosition[ _closestOtherAvatar ]; } } } @@ -1090,8 +1090,8 @@ void Head::updateHandMovement() { //------------------------------------------------------------------------------- // determine the arm vector //------------------------------------------------------------------------------- - glm::vec3 armVector = bone[ AVATAR_BONE_RIGHT_HAND ].position; - armVector -= bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; + glm::vec3 armVector = _bone[ AVATAR_BONE_RIGHT_HAND ].position; + armVector -= _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; //------------------------------------------------------------------------------- @@ -1102,52 +1102,52 @@ void Head::updateHandMovement() { //------------------------------------------------------------------------------- // if right hand is being dragged beyond maximum arm length... //------------------------------------------------------------------------------- - if ( distance > avatar.maxArmLength ) { + if ( distance > _avatar.maxArmLength ) { //------------------------------------------------------------------------------- // reset right hand to be constrained to maximum arm length //------------------------------------------------------------------------------- - bone[ AVATAR_BONE_RIGHT_HAND ].position = bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; + _bone[ AVATAR_BONE_RIGHT_HAND ].position = _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; glm::vec3 armNormal = armVector / distance; - armVector = armNormal * avatar.maxArmLength; - distance = avatar.maxArmLength; - glm::vec3 constrainedPosition = bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; + armVector = armNormal * _avatar.maxArmLength; + distance = _avatar.maxArmLength; + glm::vec3 constrainedPosition = _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; constrainedPosition += armVector; - bone[ AVATAR_BONE_RIGHT_HAND ].position = constrainedPosition; + _bone[ AVATAR_BONE_RIGHT_HAND ].position = constrainedPosition; } /* //------------------------------------------------------------------------------- // keep arm from going through av body... //------------------------------------------------------------------------------- - glm::vec3 adjustedArmVector = bone[ AVATAR_BONE_RIGHT_HAND ].position; - adjustedArmVector -= bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; + glm::vec3 adjustedArmVector = _bone[ AVATAR_BONE_RIGHT_HAND ].position; + adjustedArmVector -= _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; float rightComponent = glm::dot( adjustedArmVector, avatar.orientation.getRight() ); if ( rightComponent < 0.0 ) { - bone[ AVATAR_BONE_RIGHT_HAND ].position -= avatar.orientation.getRight() * rightComponent; + _bone[ AVATAR_BONE_RIGHT_HAND ].position -= avatar.orientation.getRight() * rightComponent; } */ //----------------------------------------------------------------------------- // set elbow position //----------------------------------------------------------------------------- - glm::vec3 newElbowPosition = bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; + glm::vec3 newElbowPosition = _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position; newElbowPosition += armVector * ONE_HALF; - glm::vec3 perpendicular = glm::cross( avatar.orientation.getFront(), armVector ); + glm::vec3 perpendicular = glm::cross( _avatar.orientation.getFront(), armVector ); - newElbowPosition += perpendicular * ( 1.0f - ( avatar.maxArmLength / distance ) ) * ONE_HALF; - bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position = newElbowPosition; + newElbowPosition += perpendicular * ( 1.0f - ( _avatar.maxArmLength / distance ) ) * ONE_HALF; + _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position = newElbowPosition; //----------------------------------------------------------------------------- // set wrist position //----------------------------------------------------------------------------- - glm::vec3 vv( bone[ AVATAR_BONE_RIGHT_HAND ].position ); - vv -= bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; - glm::vec3 newWristPosition = bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; + glm::vec3 vv( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); + vv -= _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; + glm::vec3 newWristPosition = _bone[ AVATAR_BONE_RIGHT_UPPER_ARM ].position; newWristPosition += vv * 0.7f; - bone[ AVATAR_BONE_RIGHT_FOREARM ].position = newWristPosition; + _bone[ AVATAR_BONE_RIGHT_FOREARM ].position = newWristPosition; } @@ -1157,17 +1157,17 @@ void Head::renderBody() { // Render bone positions as spheres //----------------------------------------- for (int b=0; b - -#include and +#include +#include +#include enum eyeContactTargets {LEFT_EYE, RIGHT_EYE, MOUTH}; @@ -164,9 +164,9 @@ class Head : public AvatarData { bool getDriveKeys(int key) { return driveKeys[key]; }; // Set/Get update the thrust that will move the avatar around - void setThrust(glm::vec3 newThrust) { avatar.thrust = newThrust; }; - void addThrust(glm::vec3 newThrust) { avatar.thrust += newThrust; }; - glm::vec3 getThrust() { return avatar.thrust; }; + void setThrust(glm::vec3 newThrust) { _avatar.thrust = newThrust; }; + void addThrust(glm::vec3 newThrust) { _avatar.thrust += newThrust; }; + glm::vec3 getThrust() { return _avatar.thrust; }; // // Related to getting transmitter UDP data used to animate the avatar hand @@ -210,39 +210,33 @@ class Head : public AvatarData { float audioAttack; float browAudioLift; - bool triggeringAction; - - float bodyYawDelta; - - float closeEnoughToInteract; - int closestOtherAvatar; //temporary - placeholder for real other avs glm::vec3 DEBUG_otherAvatarListPosition [ NUM_OTHER_AVATARS ]; float DEBUG_otherAvatarListTimer [ NUM_OTHER_AVATARS ]; - bool usingSprings; - - bool handBeingMoved; - bool previousHandBeingMoved; - glm::vec3 movedHandOffset; + bool _triggeringAction; + float _bodyYawDelta; + float _closeEnoughToInteract; + int _closestOtherAvatar; + bool _usingSprings; + bool _handBeingMoved; + bool _previousHandBeingMoved; + glm::vec3 _movedHandOffset; + float _springVelocityDecay; + float _springForce; + glm::quat _rotation; // the rotation of the avatar body as a whole + AvatarBone _bone[ NUM_AVATAR_BONES ]; + AvatarMode _mode; + Avatar _avatar; int driveKeys[MAX_DRIVE_KEYS]; - float springVelocityDecay; - float springForce; int eyeContact; eyeContactTargets eyeContactTarget; GLUquadric *sphere; - Avatar avatar; - - glm::quat rotation; // the rotation of the avatar body as a whole - - AvatarBone bone[ NUM_AVATAR_BONES ]; - - AvatarMode mode; float renderYaw, renderPitch; // Pitch from view frustum when this is own head. @@ -252,18 +246,16 @@ class Head : public AvatarData { timeval transmitterTimer; float transmitterHz; int transmitterPackets; - - //------------------------------------------- + //----------------------------- // private methods... - //------------------------------------------- + //----------------------------- void initializeAvatar(); void initializeSkeleton(); void updateSkeleton(); void initializeBodySprings(); void updateBodySprings( float deltaTime ); void calculateBoneLengths(); - void readSensors(); }; From 4b1ce1158f9dd26d1788a27cf0b6517ab9d12c91 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 17 Apr 2013 13:15:44 -0700 Subject: [PATCH 7/7] fix number of bytes for avatar processBulkAgentData --- 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 851408b55e..9fb29cc6e2 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -1316,7 +1316,7 @@ void *networkReceive(void *args) AgentList::getInstance()->processBulkAgentData(&senderAddress, incomingPacket, bytesReceived, - (sizeof(float) * 3) + (sizeof(uint16_t) * 2)); + (sizeof(float) * 3) + (sizeof(uint16_t) * 3)); break; default: AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived);