mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 20:44:14 +02:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
eedbb98c32
11 changed files with 198 additions and 186 deletions
|
@ -10,4 +10,5 @@ add_subdirectory(interface)
|
|||
add_subdirectory(injector)
|
||||
add_subdirectory(pairing-server)
|
||||
add_subdirectory(space-server)
|
||||
add_subdirectory(voxel-edit)add_subdirectory(voxel-server)
|
||||
add_subdirectory(voxel-edit)
|
||||
add_subdirectory(voxel-server)
|
|
@ -45,8 +45,6 @@ unsigned char packetData[MAX_PACKET_SIZE];
|
|||
|
||||
const int LOGOFF_CHECK_INTERVAL = 5000;
|
||||
|
||||
#define DEBUG_TO_SELF 0
|
||||
|
||||
int lastActiveCount = 0;
|
||||
|
||||
unsigned char* addAgentToBroadcastPacket(unsigned char* currentPosition, Agent* agentToAdd) {
|
||||
|
@ -81,13 +79,13 @@ int main(int argc, const char * argv[])
|
|||
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||
|
||||
ssize_t receivedBytes = 0;
|
||||
char agentType;
|
||||
char agentType = '\0';
|
||||
|
||||
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
|
||||
*broadcastPacket = PACKET_HEADER_DOMAIN;
|
||||
unsigned char broadcastPacket[MAX_PACKET_SIZE];
|
||||
broadcastPacket[0] = PACKET_HEADER_DOMAIN;
|
||||
|
||||
unsigned char *currentBufferPos;
|
||||
unsigned char *startPointer;
|
||||
unsigned char* currentBufferPos;
|
||||
unsigned char* startPointer;
|
||||
int packetBytesWithoutLeadingChar;
|
||||
|
||||
sockaddr_in agentPublicAddress, agentLocalAddress;
|
||||
|
@ -101,8 +99,8 @@ int main(int argc, const char * argv[])
|
|||
if (agentList->getAgentSocket().receive((sockaddr *)&agentPublicAddress, packetData, &receivedBytes)) {
|
||||
std::map<char, Agent *> newestSoloAgents;
|
||||
|
||||
agentType = packetData[0];
|
||||
unpackSocket(&packetData[1], (sockaddr *)&agentLocalAddress);
|
||||
agentType = packetData[1];
|
||||
unpackSocket(&packetData[2], (sockaddr*) g&agentLocalAddress);
|
||||
|
||||
// check the agent public address
|
||||
// if it matches our local address we're on the same box
|
||||
|
@ -115,21 +113,23 @@ int main(int argc, const char * argv[])
|
|||
}
|
||||
}
|
||||
|
||||
if (agentList->addOrUpdateAgent((sockaddr *)&agentPublicAddress,
|
||||
(sockaddr *)&agentLocalAddress,
|
||||
if (agentList->addOrUpdateAgent((sockaddr*) &agentPublicAddress,
|
||||
(sockaddr*) &agentLocalAddress,
|
||||
agentType,
|
||||
agentList->getLastAgentId())) {
|
||||
|
||||
agentList->increaseAgentId();
|
||||
|
||||
} else if (packetData[0] == PACKET_HEADER_DOMAIN_RFD) {
|
||||
// if this is a previous agent, and they are re-reporting for duty
|
||||
// then we need to update the first receive time
|
||||
Agent* refreshedAgent = agentList->agentWithAddress((sockaddr*) &agentLocalAddress);
|
||||
refreshedAgent->setWakeMicrostamp(usecTimestampNow());
|
||||
}
|
||||
|
||||
currentBufferPos = broadcastPacket + 1;
|
||||
currentBufferPos = broadcastPacket + 2;
|
||||
startPointer = currentBufferPos;
|
||||
|
||||
for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
|
||||
if (DEBUG_TO_SELF ||
|
||||
!agent->matches((sockaddr *)&agentPublicAddress, (sockaddr *)&agentLocalAddress, agentType)) {
|
||||
if (!agent->matches((sockaddr*) &agentPublicAddress, (sockaddr*) &agentLocalAddress, agentType)) {
|
||||
if (memchr(SOLO_AGENT_TYPES, agent->getType(), sizeof(SOLO_AGENT_TYPES)) == NULL) {
|
||||
// this is an agent of which there can be multiple, just add them to the packet
|
||||
// don't send avatar agents to other avatars, that will come from avatar mixer
|
||||
|
@ -140,26 +140,26 @@ int main(int argc, const char * argv[])
|
|||
} else {
|
||||
// solo agent, we need to only send newest
|
||||
if (newestSoloAgents[agent->getType()] == NULL ||
|
||||
newestSoloAgents[agent->getType()]->getFirstRecvTimeUsecs() < agent->getFirstRecvTimeUsecs()) {
|
||||
newestSoloAgents[agent->getType()]->getWakeMicrostamp() < agent->getWakeMicrostamp()) {
|
||||
// we have to set the newer solo agent to add it to the broadcast later
|
||||
newestSoloAgents[agent->getType()] = &(*agent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// this is the agent, just update last receive to now
|
||||
agent->setLastRecvTimeUsecs(usecTimestampNow());
|
||||
agent->setLastHeardMicrostamp(usecTimestampNow());
|
||||
}
|
||||
}
|
||||
|
||||
for (std::map<char, Agent *>::iterator agentIterator = newestSoloAgents.begin();
|
||||
agentIterator != newestSoloAgents.end();
|
||||
agentIterator++) {
|
||||
for (std::map<char, Agent *>::iterator soloAgent = newestSoloAgents.begin();
|
||||
soloAgent != newestSoloAgents.end();
|
||||
soloAgent++) {
|
||||
// this is the newest alive solo agent, add them to the packet
|
||||
currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, agentIterator->second);
|
||||
currentBufferPos = addAgentToBroadcastPacket(currentBufferPos, soloAgent->second);
|
||||
}
|
||||
|
||||
if ((packetBytesWithoutLeadingChar = (currentBufferPos - startPointer))) {
|
||||
agentList->getAgentSocket().send((sockaddr *)&agentPublicAddress,
|
||||
agentList->getAgentSocket().send((sockaddr*) &agentPublicAddress,
|
||||
broadcastPacket,
|
||||
packetBytesWithoutLeadingChar + 1);
|
||||
}
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
using namespace std;
|
||||
|
||||
const bool BALLS_ON = false;
|
||||
const bool AVATAR_GRAVITY = true;
|
||||
const bool USING_AVATAR_GRAVITY = true;
|
||||
const float GRAVITY_SCALE = 6.0f;
|
||||
const float BOUNCE = 0.3f;
|
||||
const float DECAY = 0.1;
|
||||
const float THRUST_MAG = 1200.0;
|
||||
const float YAW_MAG = 500.0;
|
||||
|
@ -145,6 +147,7 @@ Avatar::Avatar(bool isMine) {
|
|||
_interactingOther = NULL;
|
||||
_handHoldingPosition = glm::vec3(0.0f, 0.0f, 0.0f);
|
||||
_distanceToNearestAvatar = std::numeric_limits<float>::max();
|
||||
_gravity = glm::vec3(0.0f, -1.0f, 0.0f); // default
|
||||
|
||||
initializeSkeleton();
|
||||
|
||||
|
@ -336,13 +339,13 @@ void Avatar::simulate(float deltaTime) {
|
|||
updateHandMovementAndTouching(deltaTime);
|
||||
|
||||
|
||||
// apply gravity and collision wiht the ground/floor
|
||||
if (AVATAR_GRAVITY) {
|
||||
if ( _position.y > _pelvisStandingHeight + 0.01f) {
|
||||
_velocity += glm::dvec3(getGravity(getPosition())) * (6.0 * deltaTime );
|
||||
// apply gravity and collision with the ground/floor
|
||||
if (USING_AVATAR_GRAVITY) {
|
||||
if (_position.y > _pelvisStandingHeight + 0.01f) {
|
||||
_velocity += _gravity * (GRAVITY_SCALE * deltaTime);
|
||||
} else if (_position.y < _pelvisStandingHeight) {
|
||||
_position.y = _pelvisStandingHeight;
|
||||
_velocity.y = 0.0;
|
||||
_velocity.y = -_velocity.y * BOUNCE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -387,16 +390,16 @@ void Avatar::simulate(float deltaTime) {
|
|||
_velocity += _thrust * deltaTime;
|
||||
|
||||
// calculate speed
|
||||
_speed = glm::length( _velocity );
|
||||
_speed = glm::length(_velocity);
|
||||
|
||||
//pitch and roll the body as a function of forward speed and turning delta
|
||||
float forwardComponentOfVelocity = glm::dot( _orientation.getFront(), _velocity );
|
||||
float forwardComponentOfVelocity = glm::dot(_orientation.getFront(), _velocity);
|
||||
_bodyPitch += BODY_PITCH_WHILE_WALKING * deltaTime * forwardComponentOfVelocity;
|
||||
_bodyRoll += BODY_ROLL_WHILE_TURNING * deltaTime * _speed * _bodyYawDelta;
|
||||
|
||||
// these forces keep the body upright...
|
||||
float tiltDecay = 1.0 - BODY_UPRIGHT_FORCE * deltaTime;
|
||||
if ( tiltDecay < 0.0f ) { tiltDecay = 0.0f; }
|
||||
if (tiltDecay < 0.0f) {tiltDecay = 0.0f;}
|
||||
_bodyPitch *= tiltDecay;
|
||||
_bodyRoll *= tiltDecay;
|
||||
|
||||
|
@ -404,7 +407,7 @@ void Avatar::simulate(float deltaTime) {
|
|||
_position += _velocity * deltaTime;
|
||||
|
||||
// decay velocity
|
||||
_velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime );
|
||||
_velocity *= (1.0 - LIN_VEL_DECAY * deltaTime);
|
||||
|
||||
// If someone is near, damp velocity as a function of closeness
|
||||
const float AVATAR_BRAKING_RANGE = 1.2f;
|
||||
|
@ -419,7 +422,7 @@ void Avatar::simulate(float deltaTime) {
|
|||
updateHead(deltaTime);
|
||||
|
||||
// use speed and angular velocity to determine walking vs. standing
|
||||
if ( _speed + fabs( _bodyYawDelta ) > 0.2 ) {
|
||||
if (_speed + fabs(_bodyYawDelta) > 0.2) {
|
||||
_mode = AVATAR_MODE_WALKING;
|
||||
} else {
|
||||
_mode = AVATAR_MODE_INTERACTING;
|
||||
|
@ -449,7 +452,7 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
|
||||
// if the avatar being simulated is mine, then loop through
|
||||
// all the other avatars for potential interactions...
|
||||
if ( _isMine )
|
||||
if (_isMine)
|
||||
{
|
||||
// Reset detector for nearest avatar
|
||||
_distanceToNearestAvatar = std::numeric_limits<float>::max();
|
||||
|
@ -463,24 +466,24 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
updateCollisionWithOtherAvatar(otherAvatar, deltaTime );
|
||||
|
||||
// test other avatar hand position for proximity
|
||||
glm::vec3 v( _joint[ AVATAR_JOINT_RIGHT_SHOULDER ].position );
|
||||
v -= otherAvatar->getJointPosition( AVATAR_JOINT_RIGHT_SHOULDER );
|
||||
glm::vec3 v(_joint[ AVATAR_JOINT_RIGHT_SHOULDER ].position);
|
||||
v -= otherAvatar->getJointPosition(AVATAR_JOINT_RIGHT_SHOULDER);
|
||||
|
||||
float distance = glm::length( v );
|
||||
if (distance < _distanceToNearestAvatar) { _distanceToNearestAvatar = distance; }
|
||||
float distance = glm::length(v);
|
||||
if (distance < _distanceToNearestAvatar) {_distanceToNearestAvatar = distance;}
|
||||
|
||||
if (distance < _maxArmLength + _maxArmLength) {
|
||||
|
||||
_interactingOther = otherAvatar;
|
||||
|
||||
if ( ! _avatarTouch.getAbleToReachOtherAvatar() ) {
|
||||
if (! _avatarTouch.getAbleToReachOtherAvatar()) {
|
||||
//initialize _handHolding
|
||||
_handHoldingPosition = _joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position;
|
||||
_avatarTouch.setAbleToReachOtherAvatar(true);
|
||||
}
|
||||
|
||||
glm::vec3 vectorBetweenHands( _joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position );
|
||||
vectorBetweenHands -= otherAvatar->getJointPosition( AVATAR_JOINT_RIGHT_FINGERTIPS );
|
||||
glm::vec3 vectorBetweenHands(_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position);
|
||||
vectorBetweenHands -= otherAvatar->getJointPosition(AVATAR_JOINT_RIGHT_FINGERTIPS);
|
||||
float distanceBetweenHands = glm::length(vectorBetweenHands);
|
||||
|
||||
if (distanceBetweenHands < HANDS_CLOSE_ENOUGH_TO_GRASP) {
|
||||
|
@ -488,7 +491,7 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
}
|
||||
|
||||
// if I am holding hands with another avatar, a force is applied
|
||||
if (( _handState == 1 ) || ( _interactingOther->_handState == 1 )) {
|
||||
if ((_handState == 1) || (_interactingOther->_handState == 1)) {
|
||||
|
||||
// if the hands are close enough to grasp...
|
||||
if (distanceBetweenHands < HANDS_CLOSE_ENOUGH_TO_GRASP)
|
||||
|
@ -502,7 +505,7 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position = _handHoldingPosition;
|
||||
|
||||
// apply a force to the avatar body
|
||||
if ( glm::length(vectorToOtherHand) > _maxArmLength * 0.9 ) {
|
||||
if (glm::length(vectorToOtherHand) > _maxArmLength * 0.9) {
|
||||
_velocity += vectorToOtherHand;
|
||||
}
|
||||
}
|
||||
|
@ -514,18 +517,18 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
// Set the vector we send for hand position to other people to be our right hand
|
||||
setHandPosition(_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position);
|
||||
|
||||
}//if ( _isMine )
|
||||
}//if (_isMine)
|
||||
|
||||
//constrain right arm length and re-adjust elbow position as it bends
|
||||
updateArmIKAndConstraints( deltaTime );
|
||||
updateArmIKAndConstraints(deltaTime);
|
||||
|
||||
// set hand positions for _avatarTouch.setMyHandPosition AFTER calling updateArmIKAndConstraints
|
||||
if ( _interactingOther ) {
|
||||
if (_interactingOther) {
|
||||
if (_isMine) {
|
||||
_avatarTouch.setMyHandPosition ( _joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position );
|
||||
_avatarTouch.setYourHandPosition( _interactingOther->_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position );
|
||||
_avatarTouch.setMyHandState ( _handState );
|
||||
_avatarTouch.setYourHandState ( _interactingOther->_handState );
|
||||
_avatarTouch.setMyHandPosition (_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position);
|
||||
_avatarTouch.setYourHandPosition(_interactingOther->_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].position);
|
||||
_avatarTouch.setMyHandState (_handState);
|
||||
_avatarTouch.setYourHandState (_interactingOther->_handState);
|
||||
_avatarTouch.simulate(deltaTime);
|
||||
}
|
||||
}
|
||||
|
@ -539,7 +542,7 @@ void Avatar::updateHandMovementAndTouching(float deltaTime) {
|
|||
void Avatar::updateHead(float deltaTime) {
|
||||
|
||||
//apply the head lean values to the springy position...
|
||||
if ( fabs( _head.leanSideways + _head.leanForward ) > 0.0f ) {
|
||||
if (fabs( _head.leanSideways + _head.leanForward ) > 0.0f) {
|
||||
glm::vec3 headLean =
|
||||
_orientation.getRight() * _head.leanSideways +
|
||||
_orientation.getFront() * _head.leanForward;
|
||||
|
@ -650,19 +653,19 @@ float Avatar::getHeight() {
|
|||
}
|
||||
|
||||
|
||||
void Avatar::updateCollisionWithSphere( glm::vec3 position, float radius, float deltaTime ) {
|
||||
void Avatar::updateCollisionWithSphere(glm::vec3 position, float radius, float deltaTime) {
|
||||
float myBodyApproximateBoundingRadius = 1.0f;
|
||||
glm::vec3 vectorFromMyBodyToBigSphere(_position - position);
|
||||
bool jointCollision = false;
|
||||
|
||||
float distanceToBigSphere = glm::length(vectorFromMyBodyToBigSphere);
|
||||
if ( distanceToBigSphere < myBodyApproximateBoundingRadius + radius ) {
|
||||
if (distanceToBigSphere < myBodyApproximateBoundingRadius + radius) {
|
||||
for (int b = 0; b < NUM_AVATAR_JOINTS; b++) {
|
||||
glm::vec3 vectorFromJointToBigSphereCenter(_joint[b].springyPosition - position);
|
||||
float distanceToBigSphereCenter = glm::length(vectorFromJointToBigSphereCenter);
|
||||
float combinedRadius = _joint[b].radius + radius;
|
||||
|
||||
if ( distanceToBigSphereCenter < combinedRadius ) {
|
||||
if (distanceToBigSphereCenter < combinedRadius) {
|
||||
jointCollision = true;
|
||||
if (distanceToBigSphereCenter > 0.0) {
|
||||
glm::vec3 directionVector = vectorFromJointToBigSphereCenter / distanceToBigSphereCenter;
|
||||
|
@ -677,7 +680,7 @@ void Avatar::updateCollisionWithSphere( glm::vec3 position, float radius, float
|
|||
}
|
||||
}
|
||||
|
||||
if ( jointCollision ) {
|
||||
if (jointCollision) {
|
||||
if (!_usingBodySprings) {
|
||||
_usingBodySprings = true;
|
||||
initializeBodySprings();
|
||||
|
@ -688,37 +691,37 @@ void Avatar::updateCollisionWithSphere( glm::vec3 position, float radius, float
|
|||
|
||||
|
||||
//detect collisions with other avatars and respond
|
||||
void Avatar::updateCollisionWithOtherAvatar( Avatar * otherAvatar, float deltaTime ) {
|
||||
void Avatar::updateCollisionWithOtherAvatar(Avatar * otherAvatar, float deltaTime) {
|
||||
|
||||
// check if the bounding spheres of the two avatars are colliding
|
||||
glm::vec3 vectorBetweenBoundingSpheres(_position - otherAvatar->_position);
|
||||
if ( glm::length(vectorBetweenBoundingSpheres) < _height * ONE_HALF + otherAvatar->_height * ONE_HALF ) {
|
||||
if (glm::length(vectorBetweenBoundingSpheres) < _height * ONE_HALF + otherAvatar->_height * ONE_HALF) {
|
||||
|
||||
float bodyMomentum = 1.0f;
|
||||
glm::vec3 bodyPushForce = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
glm::vec3 bodyPushForce = glm::vec3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
// loop through the joints of each avatar to check for every possible collision
|
||||
for (int b=1; b<NUM_AVATAR_JOINTS; b++) {
|
||||
if ( _joint[b].isCollidable ) {
|
||||
if (_joint[b].isCollidable) {
|
||||
|
||||
for (int o=b+1; o<NUM_AVATAR_JOINTS; o++) {
|
||||
if ( otherAvatar->_joint[o].isCollidable ) {
|
||||
if (otherAvatar->_joint[o].isCollidable) {
|
||||
|
||||
glm::vec3 vectorBetweenJoints(_joint[b].springyPosition - otherAvatar->_joint[o].springyPosition);
|
||||
float distanceBetweenJoints = glm::length(vectorBetweenJoints);
|
||||
|
||||
if ( distanceBetweenJoints > 0.0 ) { // to avoid divide by zero
|
||||
if (distanceBetweenJoints > 0.0 ) { // to avoid divide by zero
|
||||
float combinedRadius = _joint[b].radius + otherAvatar->_joint[o].radius;
|
||||
|
||||
// check for collision
|
||||
if ( distanceBetweenJoints < combinedRadius * COLLISION_RADIUS_SCALAR) {
|
||||
if (distanceBetweenJoints < combinedRadius * COLLISION_RADIUS_SCALAR) {
|
||||
glm::vec3 directionVector = vectorBetweenJoints / distanceBetweenJoints;
|
||||
|
||||
// push balls away from each other and apply friction
|
||||
glm::vec3 ballPushForce = directionVector * COLLISION_BALL_FORCE * deltaTime;
|
||||
|
||||
float ballMomentum = 1.0 - COLLISION_BALL_FRICTION * deltaTime;
|
||||
if ( ballMomentum < 0.0 ) { ballMomentum = 0.0;}
|
||||
if (ballMomentum < 0.0 ) { ballMomentum = 0.0;}
|
||||
|
||||
_joint[b].springyVelocity += ballPushForce;
|
||||
otherAvatar->_joint[o].springyVelocity -= ballPushForce;
|
||||
|
@ -729,7 +732,7 @@ void Avatar::updateCollisionWithOtherAvatar( Avatar * otherAvatar, float deltaTi
|
|||
// accumulate forces and frictions to apply to the velocities of avatar bodies
|
||||
bodyPushForce += directionVector * COLLISION_BODY_FORCE * deltaTime;
|
||||
bodyMomentum -= COLLISION_BODY_FRICTION * deltaTime;
|
||||
if ( bodyMomentum < 0.0 ) { bodyMomentum = 0.0;}
|
||||
if (bodyMomentum < 0.0 ) { bodyMomentum = 0.0;}
|
||||
|
||||
}// check for collision
|
||||
} // to avoid divide by zero
|
||||
|
@ -749,7 +752,7 @@ void Avatar::updateCollisionWithOtherAvatar( Avatar * otherAvatar, float deltaTi
|
|||
} //method
|
||||
|
||||
|
||||
void Avatar::setDisplayingHead( bool displayingHead ) {
|
||||
void Avatar::setDisplayingHead(bool displayingHead ) {
|
||||
_displayingHead = displayingHead;
|
||||
}
|
||||
|
||||
|
@ -760,28 +763,33 @@ static TextRenderer* textRenderer() {
|
|||
}
|
||||
|
||||
|
||||
void Avatar::setGravity(glm::vec3 gravity) {
|
||||
_gravity = gravity;
|
||||
}
|
||||
|
||||
|
||||
void Avatar::render(bool lookingInMirror) {
|
||||
|
||||
// render a simple round on the ground projected down from the avatar's position
|
||||
renderDiskShadow( _position, glm::vec3( 0.0f, 1.0f, 0.0f ), 0.1f, 0.2f );
|
||||
renderDiskShadow(_position, glm::vec3(0.0f, 1.0f, 0.0f ), 0.1f, 0.2f );
|
||||
|
||||
/*
|
||||
// show avatar position
|
||||
glColor4f( 0.5f, 0.5f, 0.5f, 0.6 );
|
||||
glColor4f(0.5f, 0.5f, 0.5f, 0.6 );
|
||||
glPushMatrix();
|
||||
glTranslatef(_position.x, _position.y, _position.z);
|
||||
glScalef( 0.03, 0.03, 0.03 );
|
||||
glutSolidSphere( 1, 10, 10 );
|
||||
glScalef(0.03, 0.03, 0.03 );
|
||||
glutSolidSphere(1, 10, 10 );
|
||||
glPopMatrix();
|
||||
*/
|
||||
|
||||
if ( usingBigSphereCollisionTest ) {
|
||||
if (usingBigSphereCollisionTest ) {
|
||||
// show TEST big sphere
|
||||
glColor4f( 0.5f, 0.6f, 0.8f, 0.7 );
|
||||
glColor4f(0.5f, 0.6f, 0.8f, 0.7 );
|
||||
glPushMatrix();
|
||||
glTranslatef(_TEST_bigSpherePosition.x, _TEST_bigSpherePosition.y, _TEST_bigSpherePosition.z);
|
||||
glScalef( _TEST_bigSphereRadius, _TEST_bigSphereRadius, _TEST_bigSphereRadius );
|
||||
glutSolidSphere( 1, 20, 20 );
|
||||
glScalef(_TEST_bigSphereRadius, _TEST_bigSphereRadius, _TEST_bigSphereRadius );
|
||||
glutSolidSphere(1, 20, 20 );
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
@ -794,7 +802,7 @@ void Avatar::render(bool lookingInMirror) {
|
|||
}
|
||||
|
||||
// if this is my avatar, then render my interactions with the other avatar
|
||||
if ( _isMine ) {
|
||||
if (_isMine ) {
|
||||
_avatarTouch.render();
|
||||
}
|
||||
|
||||
|
@ -855,7 +863,7 @@ void Avatar::renderHead(bool lookingInMirror) {
|
|||
glEnable(GL_RESCALE_NORMAL);
|
||||
|
||||
// show head orientation
|
||||
//renderOrientationDirections( _joint[ AVATAR_JOINT_HEAD_BASE ].springyPosition, _joint[ AVATAR_JOINT_HEAD_BASE ].orientation, 0.2f );
|
||||
//renderOrientationDirections(_joint[ AVATAR_JOINT_HEAD_BASE ].springyPosition, _joint[ AVATAR_JOINT_HEAD_BASE ].orientation, 0.2f );
|
||||
|
||||
glPushMatrix();
|
||||
|
||||
|
@ -871,7 +879,7 @@ void Avatar::renderHead(bool lookingInMirror) {
|
|||
}
|
||||
|
||||
glScalef
|
||||
(
|
||||
(
|
||||
_joint[ AVATAR_JOINT_HEAD_BASE ].radius,
|
||||
_joint[ AVATAR_JOINT_HEAD_BASE ].radius,
|
||||
_joint[ AVATAR_JOINT_HEAD_BASE ].radius
|
||||
|
@ -883,15 +891,15 @@ void Avatar::renderHead(bool lookingInMirror) {
|
|||
//glRotatef(_bodyPitch + _headPitch, 1, 0, 0);
|
||||
//glRotatef(_bodyRoll - _headRoll, 0, 0, 1);
|
||||
// don't let body pitch and roll affect the head..
|
||||
glRotatef( _headPitch, 1, 0, 0);
|
||||
glRotatef( -_headRoll, 0, 0, 1);
|
||||
glRotatef( _headPitch, 1, 0, 0);
|
||||
glRotatef(-_headRoll, 0, 0, 1);
|
||||
} else {
|
||||
glRotatef(_bodyYaw + _headYaw, 0, 1, 0);
|
||||
//glRotatef(_bodyPitch + _headPitch, 1, 0, 0);
|
||||
//glRotatef(_bodyRoll + _headRoll, 0, 0, 1);
|
||||
// don't let body pitch and roll affect the head..
|
||||
glRotatef( _headPitch, 1, 0, 0);
|
||||
glRotatef( _headRoll, 0, 0, 1);
|
||||
glRotatef(_headPitch, 1, 0, 0);
|
||||
glRotatef(_headRoll, 0, 0, 1);
|
||||
}
|
||||
|
||||
//glScalef(2.0, 2.0, 2.0);
|
||||
|
@ -1020,7 +1028,7 @@ void Avatar::renderHead(bool lookingInMirror) {
|
|||
glPopMatrix();
|
||||
}
|
||||
|
||||
void Avatar::setHandMovementValues( glm::vec3 handOffset ) {
|
||||
void Avatar::setHandMovementValues(glm::vec3 handOffset ) {
|
||||
_movedHandOffset = handOffset;
|
||||
}
|
||||
|
||||
|
@ -1033,11 +1041,11 @@ void Avatar::initializeSkeleton() {
|
|||
for (int b=0; b<NUM_AVATAR_JOINTS; b++) {
|
||||
_joint[b].isCollidable = true;
|
||||
_joint[b].parent = AVATAR_JOINT_NULL;
|
||||
_joint[b].position = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[b].defaultPosePosition = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[b].springyPosition = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[b].springyVelocity = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[b].rotation = glm::quat( 0.0f, 0.0f, 0.0f, 0.0f );
|
||||
_joint[b].position = glm::vec3(0.0, 0.0, 0.0 );
|
||||
_joint[b].defaultPosePosition = glm::vec3(0.0, 0.0, 0.0 );
|
||||
_joint[b].springyPosition = glm::vec3(0.0, 0.0, 0.0 );
|
||||
_joint[b].springyVelocity = glm::vec3(0.0, 0.0, 0.0 );
|
||||
_joint[b].rotation = glm::quat(0.0f, 0.0f, 0.0f, 0.0f );
|
||||
_joint[b].yaw = 0.0;
|
||||
_joint[b].pitch = 0.0;
|
||||
_joint[b].roll = 0.0;
|
||||
|
@ -1074,19 +1082,19 @@ void Avatar::initializeSkeleton() {
|
|||
_joint[ AVATAR_JOINT_RIGHT_TOES ].parent = AVATAR_JOINT_RIGHT_HEEL;
|
||||
|
||||
// specify the default pose position
|
||||
_joint[ AVATAR_JOINT_PELVIS ].defaultPosePosition = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[ AVATAR_JOINT_TORSO ].defaultPosePosition = glm::vec3( 0.0, 0.08, 0.01 );
|
||||
_joint[ AVATAR_JOINT_CHEST ].defaultPosePosition = glm::vec3( 0.0, 0.09, 0.0 );
|
||||
_joint[ AVATAR_JOINT_NECK_BASE ].defaultPosePosition = glm::vec3( 0.0, 0.1, -0.01 );
|
||||
_joint[ AVATAR_JOINT_HEAD_BASE ].defaultPosePosition = glm::vec3( 0.0, 0.08, 0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_COLLAR ].defaultPosePosition = glm::vec3( -0.06, 0.04, -0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_SHOULDER ].defaultPosePosition = glm::vec3( -0.03, 0.0, -0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_ELBOW ].defaultPosePosition = glm::vec3( 0.0, -0.13, 0.0 );
|
||||
_joint[ AVATAR_JOINT_LEFT_WRIST ].defaultPosePosition = glm::vec3( 0.0, -0.11, 0.0 );
|
||||
_joint[ AVATAR_JOINT_LEFT_FINGERTIPS ].defaultPosePosition = glm::vec3( 0.0, -0.07, 0.0 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_COLLAR ].defaultPosePosition = glm::vec3( 0.06, 0.04, -0.01 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_SHOULDER ].defaultPosePosition = glm::vec3( 0.03, 0.0, -0.01 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_ELBOW ].defaultPosePosition = glm::vec3( 0.0, -0.13, 0.0 );
|
||||
_joint[ AVATAR_JOINT_PELVIS ].defaultPosePosition = glm::vec3( 0.0, 0.0, 0.0 );
|
||||
_joint[ AVATAR_JOINT_TORSO ].defaultPosePosition = glm::vec3( 0.0, 0.08, 0.01 );
|
||||
_joint[ AVATAR_JOINT_CHEST ].defaultPosePosition = glm::vec3( 0.0, 0.09, 0.0 );
|
||||
_joint[ AVATAR_JOINT_NECK_BASE ].defaultPosePosition = glm::vec3( 0.0, 0.1, -0.01 );
|
||||
_joint[ AVATAR_JOINT_HEAD_BASE ].defaultPosePosition = glm::vec3( 0.0, 0.08, 0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_COLLAR ].defaultPosePosition = glm::vec3(-0.06, 0.04, -0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_SHOULDER ].defaultPosePosition = glm::vec3(-0.03, 0.0, -0.01 );
|
||||
_joint[ AVATAR_JOINT_LEFT_ELBOW ].defaultPosePosition = glm::vec3( 0.0, -0.13, 0.0 );
|
||||
_joint[ AVATAR_JOINT_LEFT_WRIST ].defaultPosePosition = glm::vec3( 0.0, -0.11, 0.0 );
|
||||
_joint[ AVATAR_JOINT_LEFT_FINGERTIPS ].defaultPosePosition = glm::vec3( 0.0, -0.07, 0.0 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_COLLAR ].defaultPosePosition = glm::vec3( 0.06, 0.04, -0.01 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_SHOULDER ].defaultPosePosition = glm::vec3( 0.03, 0.0, -0.01 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_ELBOW ].defaultPosePosition = glm::vec3( 0.0, -0.13, 0.0 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_WRIST ].defaultPosePosition = glm::vec3( 0.0, -0.11, 0.0 );
|
||||
_joint[ AVATAR_JOINT_RIGHT_FINGERTIPS ].defaultPosePosition = glm::vec3( 0.0, -0.07, 0.0 );
|
||||
_joint[ AVATAR_JOINT_LEFT_HIP ].defaultPosePosition = glm::vec3( -0.04, 0.0, -0.02 );
|
||||
|
@ -1523,25 +1531,6 @@ void Avatar::setHeadFromGyros(glm::vec3* eulerAngles, glm::vec3* angularVelocity
|
|||
}
|
||||
}
|
||||
|
||||
// Find and return the gravity vector at my location
|
||||
glm::vec3 Avatar::getGravity(glm::vec3 pos) {
|
||||
//
|
||||
// For now, we'll test this with a simple global lookup, but soon we will add getting this
|
||||
// from the domain/voxelserver (or something similar)
|
||||
//
|
||||
if ((pos.x > 0.f) &&
|
||||
(pos.x < 10.f) &&
|
||||
(pos.z > 0.f) &&
|
||||
(pos.z < 10.f) &&
|
||||
(pos.y > 0.f) &&
|
||||
(pos.y < 3.f)) {
|
||||
// If above ground plane, turn gravity on
|
||||
return glm::vec3(0.f, -1.f, 0.f);
|
||||
} else {
|
||||
// If flying in space, turn gravity OFF
|
||||
return glm::vec3(0.f, 0.f, 0.f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char AVATAR_DATA_FILENAME[] = "avatar.ifd";
|
||||
|
|
|
@ -84,7 +84,7 @@ public:
|
|||
void reset();
|
||||
void UpdateGyros(float frametime, SerialInterface * serialInterface, glm::vec3 * gravity);
|
||||
|
||||
void setNoise (float mag) { _head.noise = mag; }
|
||||
void setNoise (float mag) {_head.noise = mag;}
|
||||
void setScale(float s) {_head.scale = s; };
|
||||
void setRenderYaw(float y) {_renderYaw = y;}
|
||||
void setRenderPitch(float p) {_renderPitch = p;}
|
||||
|
@ -93,6 +93,7 @@ public:
|
|||
float getLastMeasuredHeadYaw() const {return _head.yawRate;}
|
||||
float getBodyYaw() {return _bodyYaw;};
|
||||
void addBodyYaw(float y) {_bodyYaw += y;};
|
||||
void setGravity(glm::vec3 gravity);
|
||||
|
||||
bool getIsNearInteractingOther();
|
||||
|
||||
|
@ -143,9 +144,6 @@ public:
|
|||
void processTransmitterData(unsigned char * packetData, int numBytes);
|
||||
float getTransmitterHz() { return _transmitterHz; };
|
||||
|
||||
// Find out what the local gravity vector is at this location
|
||||
glm::vec3 getGravity(glm::vec3 pos);
|
||||
|
||||
void writeAvatarDataToFile();
|
||||
void readAvatarDataFromFile();
|
||||
|
||||
|
@ -251,6 +249,7 @@ private:
|
|||
bool _displayingHead; // should be false if in first-person view
|
||||
bool _returnHeadToCenter;
|
||||
float _distanceToNearestAvatar; // How close is the nearest avatar?
|
||||
glm::vec3 _gravity;
|
||||
|
||||
// private methods...
|
||||
void initializeSkeleton();
|
||||
|
|
|
@ -43,25 +43,29 @@ void SerialInterface::pair() {
|
|||
int matchStatus;
|
||||
regex_t regex;
|
||||
|
||||
// for now this only works on OS X, where the usb serial shows up as /dev/tty.usb*
|
||||
if((devDir = opendir("/dev"))) {
|
||||
while((entry = readdir(devDir))) {
|
||||
regcomp(®ex, "tty\\.usb", REG_EXTENDED|REG_NOSUB);
|
||||
matchStatus = regexec(®ex, entry->d_name, (size_t) 0, NULL, 0);
|
||||
if (matchStatus == 0) {
|
||||
char *serialPortname = new char[100];
|
||||
sprintf(serialPortname, "/dev/%s", entry->d_name);
|
||||
|
||||
initializePort(serialPortname, 115200);
|
||||
|
||||
delete [] serialPortname;
|
||||
if (_failedOpenAttempts < 2) {
|
||||
// if we've already failed to open the detected interface twice then don't try again
|
||||
|
||||
// for now this only works on OS X, where the usb serial shows up as /dev/tty.usb*
|
||||
if((devDir = opendir("/dev"))) {
|
||||
while((entry = readdir(devDir))) {
|
||||
regcomp(®ex, "tty\\.usb", REG_EXTENDED|REG_NOSUB);
|
||||
matchStatus = regexec(®ex, entry->d_name, (size_t) 0, NULL, 0);
|
||||
if (matchStatus == 0) {
|
||||
char *serialPortname = new char[100];
|
||||
sprintf(serialPortname, "/dev/%s", entry->d_name);
|
||||
|
||||
initializePort(serialPortname, 115200);
|
||||
|
||||
delete [] serialPortname;
|
||||
}
|
||||
regfree(®ex);
|
||||
}
|
||||
regfree(®ex);
|
||||
closedir(devDir);
|
||||
}
|
||||
closedir(devDir);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
// connect to the serial port
|
||||
|
@ -73,6 +77,7 @@ int SerialInterface::initializePort(char* portname, int baud) {
|
|||
|
||||
if (serialFd == -1) {
|
||||
printLog("Failed.\n");
|
||||
_failedOpenAttempts++;
|
||||
return -1; // Failed to open port
|
||||
}
|
||||
struct termios options;
|
||||
|
|
|
@ -36,7 +36,8 @@ extern const bool USING_INVENSENSE_MPU9150;
|
|||
|
||||
class SerialInterface {
|
||||
public:
|
||||
SerialInterface() { active = false; };
|
||||
SerialInterface() : active(false),
|
||||
_failedOpenAttempts(0) {}
|
||||
void pair();
|
||||
void readData();
|
||||
|
||||
|
@ -56,7 +57,7 @@ public:
|
|||
glm::vec3 getGravity() {return gravity;};
|
||||
|
||||
private:
|
||||
int initializePort(char * portname, int baud);
|
||||
int initializePort(char* portname, int baud);
|
||||
void resetSerial();
|
||||
int lastMeasured[NUM_CHANNELS];
|
||||
float trailingAverage[NUM_CHANNELS];
|
||||
|
@ -68,6 +69,7 @@ private:
|
|||
int _lastYaw;
|
||||
int _lastPitch;
|
||||
int _lastRoll;
|
||||
int _failedOpenAttempts;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -90,6 +90,8 @@ using namespace std;
|
|||
void reshape(int width, int height); // will be defined below
|
||||
void loadViewFrustum(ViewFrustum& viewFrustum); // will be defined below
|
||||
|
||||
glm::vec3 getGravity(glm::vec3 pos); //get the local gravity vector at this location in the universe
|
||||
|
||||
QApplication* app;
|
||||
|
||||
bool enableNetworkThread = true;
|
||||
|
@ -1703,6 +1705,7 @@ void idle(void) {
|
|||
}
|
||||
agentList->unlock();
|
||||
|
||||
myAvatar.setGravity(getGravity(myAvatar.getPosition()));
|
||||
myAvatar.simulate(deltaTime);
|
||||
|
||||
glutPostRedisplay();
|
||||
|
@ -1765,6 +1768,30 @@ void reshape(int width, int height) {
|
|||
glLoadIdentity();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//Find and return the gravity vector at this location
|
||||
glm::vec3 getGravity(glm::vec3 pos) {
|
||||
//
|
||||
// For now, we'll test this with a simple global lookup, but soon we will add getting this
|
||||
// from the domain/voxelserver (or something similar)
|
||||
//
|
||||
if ((pos.x > 0.f) &&
|
||||
(pos.x < 10.f) &&
|
||||
(pos.z > 0.f) &&
|
||||
(pos.z < 10.f) &&
|
||||
(pos.y > 0.f) &&
|
||||
(pos.y < 3.f)) {
|
||||
// If above ground plane, turn gravity on
|
||||
return glm::vec3(0.f, -1.f, 0.f);
|
||||
} else {
|
||||
// If flying in space, turn gravity OFF
|
||||
return glm::vec3(0.f, 0.f, 0.f);
|
||||
}
|
||||
}
|
||||
|
||||
void mouseFunc(int button, int state, int x, int y) {
|
||||
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) {
|
||||
if (state == GLUT_DOWN && !menu.mouseClick(x, y)) {
|
||||
|
|
|
@ -52,8 +52,8 @@ Agent::Agent(sockaddr *agentPublicSocket, sockaddr *agentLocalSocket, char agent
|
|||
type = agentType;
|
||||
agentId = thisAgentId;
|
||||
|
||||
firstRecvTimeUsecs = usecTimestampNow();
|
||||
lastRecvTimeUsecs = usecTimestampNow();
|
||||
_wakeMicrostamp = usecTimestampNow();
|
||||
_lastHeardMicrostamp = usecTimestampNow();
|
||||
|
||||
activeSocket = NULL;
|
||||
linkedData = NULL;
|
||||
|
@ -87,8 +87,8 @@ Agent::Agent(const Agent &otherAgent) {
|
|||
activeSocket = NULL;
|
||||
}
|
||||
|
||||
firstRecvTimeUsecs = otherAgent.firstRecvTimeUsecs;
|
||||
lastRecvTimeUsecs = otherAgent.lastRecvTimeUsecs;
|
||||
_wakeMicrostamp = otherAgent._wakeMicrostamp;
|
||||
_lastHeardMicrostamp = otherAgent._lastHeardMicrostamp;
|
||||
type = otherAgent.type;
|
||||
|
||||
if (otherAgent.linkedData != NULL) {
|
||||
|
@ -120,8 +120,8 @@ void Agent::swap(Agent &first, Agent &second) {
|
|||
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._wakeMicrostamp, second._wakeMicrostamp);
|
||||
swap(first._lastHeardMicrostamp, second._lastHeardMicrostamp);
|
||||
swap(first._bytesReceivedMovingAverage, second._bytesReceivedMovingAverage);
|
||||
}
|
||||
|
||||
|
@ -178,22 +178,6 @@ void Agent::setAgentId(uint16_t thisAgentId) {
|
|||
agentId = thisAgentId;
|
||||
}
|
||||
|
||||
double Agent::getFirstRecvTimeUsecs() {
|
||||
return firstRecvTimeUsecs;
|
||||
}
|
||||
|
||||
void Agent::setFirstRecvTimeUsecs(double newTimeUsecs) {
|
||||
firstRecvTimeUsecs = newTimeUsecs;
|
||||
}
|
||||
|
||||
double Agent::getLastRecvTimeUsecs() {
|
||||
return lastRecvTimeUsecs;
|
||||
}
|
||||
|
||||
void Agent::setLastRecvTimeUsecs(double newTimeUsecs) {
|
||||
lastRecvTimeUsecs = newTimeUsecs;
|
||||
}
|
||||
|
||||
sockaddr* Agent::getPublicSocket() {
|
||||
return publicSocket;
|
||||
}
|
||||
|
|
|
@ -38,11 +38,11 @@ public:
|
|||
uint16_t getAgentId();
|
||||
void setAgentId(uint16_t thisAgentId);
|
||||
|
||||
double getFirstRecvTimeUsecs();
|
||||
void setFirstRecvTimeUsecs(double newTimeUsecs);
|
||||
double getWakeMicrostamp() const { return _wakeMicrostamp; }
|
||||
void setWakeMicrostamp(double wakeMicrostamp) { _wakeMicrostamp = wakeMicrostamp; }
|
||||
|
||||
double getLastRecvTimeUsecs();
|
||||
void setLastRecvTimeUsecs(double newTimeUsecs);
|
||||
double getLastHeardMicrostamp() const { return _lastHeardMicrostamp; }
|
||||
void setLastHeardMicrostamp(double lastHeardMicrostamp) { _lastHeardMicrostamp = lastHeardMicrostamp; }
|
||||
|
||||
sockaddr* getPublicSocket();
|
||||
void setPublicSocket(sockaddr *newSocket);
|
||||
|
@ -70,8 +70,8 @@ private:
|
|||
sockaddr *publicSocket, *localSocket, *activeSocket;
|
||||
char type;
|
||||
uint16_t agentId;
|
||||
double firstRecvTimeUsecs;
|
||||
double lastRecvTimeUsecs;
|
||||
double _wakeMicrostamp;
|
||||
double _lastHeardMicrostamp;
|
||||
SimpleMovingAverage* _bytesReceivedMovingAverage;
|
||||
AgentData* linkedData;
|
||||
bool _isAlive;
|
||||
|
|
|
@ -64,8 +64,7 @@ AgentList::AgentList(char newOwnerType, unsigned int newSocketListenPort) :
|
|||
agentSocket(newSocketListenPort),
|
||||
ownerType(newOwnerType),
|
||||
socketListenPort(newSocketListenPort),
|
||||
lastAgentId(0)
|
||||
{
|
||||
lastAgentId(0) {
|
||||
pthread_mutex_init(&mutex, 0);
|
||||
}
|
||||
|
||||
|
@ -114,7 +113,7 @@ void AgentList::processBulkAgentData(sockaddr *senderAddress, unsigned char *pac
|
|||
Agent* bulkSendAgent = agentWithAddress(senderAddress);
|
||||
|
||||
if (bulkSendAgent) {
|
||||
bulkSendAgent->setLastRecvTimeUsecs(usecTimestampNow());
|
||||
bulkSendAgent->setLastHeardMicrostamp(usecTimestampNow());
|
||||
bulkSendAgent->recordBytesReceived(numTotalBytes);
|
||||
}
|
||||
|
||||
|
@ -161,7 +160,7 @@ int AgentList::updateAgentWithData(sockaddr *senderAddress, unsigned char *packe
|
|||
}
|
||||
|
||||
int AgentList::updateAgentWithData(Agent *agent, unsigned char *packetData, int dataBytes) {
|
||||
agent->setLastRecvTimeUsecs(usecTimestampNow());
|
||||
agent->setLastHeardMicrostamp(usecTimestampNow());
|
||||
|
||||
if (agent->getActiveSocket() != NULL) {
|
||||
agent->recordBytesReceived(dataBytes);
|
||||
|
@ -273,7 +272,7 @@ bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket,
|
|||
if (agent->getType() == AGENT_TYPE_AUDIO_MIXER || agent->getType() == AGENT_TYPE_VOXEL) {
|
||||
// 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
|
||||
agent->setLastRecvTimeUsecs(usecTimestampNow());
|
||||
agent->setLastHeardMicrostamp(usecTimestampNow());
|
||||
}
|
||||
|
||||
// we had this agent already, do nothing for now
|
||||
|
@ -383,7 +382,7 @@ void *removeSilentAgents(void *args) {
|
|||
|
||||
for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); ++agent) {
|
||||
|
||||
if ((checkTimeUSecs - agent->getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS
|
||||
if ((checkTimeUSecs - agent->getLastHeardMicrostamp()) > AGENT_SILENCE_THRESHOLD_USECS
|
||||
&& agent->getType() != AGENT_TYPE_VOXEL) {
|
||||
|
||||
printLog("Killing agent - ");
|
||||
|
@ -418,13 +417,6 @@ void *checkInWithDomainServer(void *args) {
|
|||
|
||||
const int DOMAIN_SERVER_CHECK_IN_USECS = 1 * 1000000;
|
||||
|
||||
AgentList* parentAgentList = (AgentList*) args;
|
||||
|
||||
timeval lastSend;
|
||||
unsigned char output[7];
|
||||
|
||||
in_addr_t localAddress = getLocalAddress();
|
||||
|
||||
// Lookup the IP address of the domain server if we need to
|
||||
if (atoi(DOMAIN_IP) == 0) {
|
||||
struct hostent* pHostInfo;
|
||||
|
@ -439,14 +431,23 @@ void *checkInWithDomainServer(void *args) {
|
|||
}
|
||||
} else printLog("Using static domainserver IP: %s\n", DOMAIN_IP);
|
||||
|
||||
AgentList* parentAgentList = (AgentList*) args;
|
||||
|
||||
timeval lastSend;
|
||||
in_addr_t localAddress = getLocalAddress();
|
||||
unsigned char packet[8];
|
||||
|
||||
packet[0] = PACKET_HEADER_DOMAIN_RFD;
|
||||
packet[1] = parentAgentList->getOwnerType();
|
||||
|
||||
while (!domainServerCheckinStopFlag) {
|
||||
gettimeofday(&lastSend, NULL);
|
||||
|
||||
output[0] = parentAgentList->getOwnerType();
|
||||
packSocket(output + 1, localAddress, htons(parentAgentList->getSocketListenPort()));
|
||||
packSocket(packet + 2, localAddress, htons(parentAgentList->getSocketListenPort()));
|
||||
|
||||
parentAgentList->getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, output, 7);
|
||||
parentAgentList->getAgentSocket().send(DOMAIN_IP, DOMAINSERVER_PORT, packet, sizeof(packet));
|
||||
|
||||
packet[0] = PACKET_HEADER_DOMAIN_LIST_REQUEST;
|
||||
|
||||
double usecToSleep = DOMAIN_SERVER_CHECK_IN_USECS - (usecTimestampNow() - usecTimestamp(&lastSend));
|
||||
|
||||
|
@ -481,7 +482,8 @@ AgentList::iterator AgentList::begin() const {
|
|||
}
|
||||
}
|
||||
|
||||
return AgentListIterator(this, 0);
|
||||
// there's no alive agent to start from - return the end
|
||||
return end();
|
||||
}
|
||||
|
||||
AgentList::iterator AgentList::end() const {
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
//
|
||||
// PacketHeaders.h
|
||||
// hifi
|
||||
|
@ -23,5 +24,7 @@ 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';
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue