From 02ef1db0d040cfbc648682921fbdac94f20a49b7 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 1 May 2013 12:38:22 -0700 Subject: [PATCH 1/8] Adding devices for Glass, Android --- interface/src/Avatar.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 3c60f32d04..01c2f0c3fe 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -1267,7 +1267,9 @@ void Avatar::SetNewHeadTarget(float pitch, float yaw) { _head.yawTarget = yaw; } +// // Process UDP interface data from Android transmitter or Google Glass +// void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { // Read a packet from a transmitter app, process the data float @@ -1278,30 +1280,43 @@ void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { rot1, rot2, rot3, rot4; // Rotation of device: // rot1 = roll, ranges from -1 to 1, 0 = flat on table // rot2 = pitch, ranges from -1 to 1, 0 = flat on table - // rot3 = yaw, ranges from -1 to 1 + // rot3 = yaw, ranges from -1 to 1 + char device[100]; // Device ID - const bool IS_GLASS = false; // Whether to assume this is a Google glass transmitting + enum deviceTypes { DEVICE_GLASS, DEVICE_ANDROID, DEVICE_IPHONE, DEVICE_UNKNOWN }; - sscanf((char *)packetData, "tacc %f %f %f gra %f %f %f gyr %f %f %f lin %f %f %f rot %f %f %f %f", + sscanf((char *)packetData, + "tacc %f %f %f gra %f %f %f gyr %f %f %f lin %f %f %f rot %f %f %f %f dna \"%s", &accX, &accY, &accZ, &graX, &graY, &graZ, &gyrX, &gyrY, &gyrZ, &linX, &linY, &linZ, - &rot1, &rot2, &rot3, &rot4); + &rot1, &rot2, &rot3, &rot4, (char *)&device); + + // decode transmitter device type + deviceTypes deviceType = DEVICE_UNKNOWN; + if (strcmp(device, "ADR")) { + deviceType = DEVICE_ANDROID; + } else { + deviceType = DEVICE_GLASS; + } if (_transmitterPackets++ == 0) { // If first packet received, note time, turn head spring return OFF, get start rotation gettimeofday(&_transmitterTimer, NULL); - if (IS_GLASS) { + if (deviceType == DEVICE_GLASS) { setHeadReturnToCenter(true); setHeadSpringScale(10.f); printLog("Using Google Glass to drive head, springs ON.\n"); } else { setHeadReturnToCenter(false); - printLog("Using Transmitter to drive head, springs OFF.\n"); + printLog("Using Transmitter %s to drive head, springs OFF.\n", device); } + printLog("Packet: [%s]\n", packetData); + printLog("Version: %s\n", device); + _transmitterInitialReading = glm::vec3( rot3, rot2, rot1 ); @@ -1327,7 +1342,7 @@ void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { if (eulerAngles.x < -180.f) { eulerAngles.x += 360.f; } glm::vec3 angularVelocity; - if (!IS_GLASS) { + if (!(deviceType == DEVICE_GLASS)) { angularVelocity = glm::vec3(glm::degrees(gyrZ), glm::degrees(-gyrX), glm::degrees(gyrY)); setHeadFromGyros( &eulerAngles, &angularVelocity, (_transmitterHz == 0.f) ? 0.f : 1.f / _transmitterHz, 1.0); @@ -1338,7 +1353,6 @@ void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { (_transmitterHz == 0.f) ? 0.f : 1.f / _transmitterHz, 1000.0); } - } void Avatar::setHeadFromGyros(glm::vec3* eulerAngles, glm::vec3* angularVelocity, float deltaTime, float smoothingTime) { From 1e6ba9cc348a9322dd555ef479c9308635e688c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 1 May 2013 20:35:21 -0700 Subject: [PATCH 2/8] (1) raised Eve's hand; (2) renamed some member variables; (3) added more functionality to hand-holding --- eve/src/main.cpp | 2 +- interface/src/Avatar.cpp | 42 +++++++++++++++++++--------------------- interface/src/Avatar.h | 5 +++-- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/eve/src/main.cpp b/eve/src/main.cpp index 73f2c8b72e..9ebffec7e9 100644 --- a/eve/src/main.cpp +++ b/eve/src/main.cpp @@ -122,7 +122,7 @@ int main(int argc, const char* argv[]) { // put her hand out so somebody can shake it eve.setHandPosition(glm::vec3(eve.getPosition()[0] - 0.2, - 0.2, + 0.25, eve.getPosition()[2] + 0.1)); // read eve's audio data AudioInjector eveAudioInjector("/etc/highfidelity/eve/resources/eve.raw"); diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 716507576d..5c410eb21a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -4,7 +4,7 @@ // // Created by Philip Rosedale on 9/11/12. // adapted by Jeffrey Ventrella -// Copyright (c) 2012 Physical, Inc.. All rights reserved. +// Copyright (c) 2013 Physical, Inc.. All rights reserved. // #include @@ -32,11 +32,6 @@ const float MY_HAND_HOLDING_PULL = 0.2; const float YOUR_HAND_HOLDING_PULL = 1.0; const float BODY_SPRING_FORCE = 6.0f; const float BODY_SPRING_DECAY = 16.0f; -//const float COLLISION_FRICTION = 0.5; -//const float COLLISION_RADIUS_SCALAR = 1.8; -//const float COLLISION_BALL_FORCE = 0.1; -//const float COLLISION_BODY_FORCE = 3.0; - const float COLLISION_RADIUS_SCALAR = 1.8; const float COLLISION_BALL_FORCE = 0.6; const float COLLISION_BODY_FORCE = 6.0; @@ -140,7 +135,7 @@ Avatar::Avatar(bool isMine) { _renderPitch = 0.0; _sphere = NULL; _interactingOther = NULL; - _closeEnoughToHoldHands = false; + _canReachToOtherAvatar = false; _handHoldingPosition = glm::vec3( 0.0, 0.0, 0.0 ); initializeSkeleton(); @@ -162,7 +157,7 @@ Avatar::Avatar(const Avatar &otherAvatar) { _velocity = otherAvatar._velocity; _thrust = otherAvatar._thrust; _rotation = otherAvatar._rotation; - _closeEnoughToHoldHands = otherAvatar._closeEnoughToHoldHands; + _canReachToOtherAvatar = otherAvatar._canReachToOtherAvatar; _bodyYaw = otherAvatar._bodyYaw; _bodyPitch = otherAvatar._bodyPitch; _bodyRoll = otherAvatar._bodyRoll; @@ -231,7 +226,6 @@ Avatar::Avatar(const Avatar &otherAvatar) { _head.browAudioLift = otherAvatar._head.browAudioLift; _head.noise = otherAvatar._head.noise; - initializeSkeleton(); if (iris_texture.size() == 0) { @@ -342,19 +336,18 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); // reset hand and arm positions according to hand movement updateHandMovement( deltaTime ); - if ( !_closeEnoughToHoldHands ) { + if ( !_canReachToOtherAvatar ) { //initialize _handHolding _handHoldingPosition = _bone[ AVATAR_BONE_RIGHT_HAND ].position; } - _closeEnoughToHoldHands = false; // reset for the next go-round + _handsCloseEnoughToGrasp = false; // reset for the next go-round + _canReachToOtherAvatar = false; // reset for the next go-round // if the avatar being simulated is mine, then loop through // all the other avatars for potential interactions... if ( _isMine ) { - //float closestDistance = 10000.0f; - AgentList* agentList = AgentList::getInstance(); for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL && agent->getType() == AGENT_TYPE_AVATAR) { @@ -365,21 +358,27 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); // test other avatar hand position for proximity glm::vec3 v( _bone[ AVATAR_BONE_RIGHT_SHOULDER ].position ); - v -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); + v -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_SHOULDER ); float distance = glm::length( v ); if ( distance < _maxArmLength + _maxArmLength ) { - //closestDistance = distance; _interactingOther = otherAvatar; - _closeEnoughToHoldHands = true; + _canReachToOtherAvatar = true; // if I am holding hands with another avatar, a force is applied if (( _handState == 1 ) || ( _interactingOther->_handState == 1 )) { - + + glm::vec3 vectorBetweenHands( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); + vectorBetweenHands -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); + + float distanceBetweenHands = glm::length(vectorBetweenHands); + // if the hands are close enough to grasp... - //if (distance < 0.1) + if (distanceBetweenHands < 0.1) { + _handsCloseEnoughToGrasp = true; + glm::vec3 vectorToOtherHand = _interactingOther->_handPosition - _handHoldingPosition; glm::vec3 vectorToMyHand = _bone[ AVATAR_BONE_RIGHT_HAND ].position - _handHoldingPosition; @@ -399,7 +398,6 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); // Set the vector we send for hand position to other people to be our right hand setHandPosition(_bone[ AVATAR_BONE_RIGHT_HAND ].position); - //update the effects of touching another avatar }//if ( _isMine ) //constrain right arm length and re-adjust elbow position as it bends @@ -417,7 +415,7 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); } } - if (!_closeEnoughToHoldHands) { + if (!_canReachToOtherAvatar) { _interactingOther = NULL; } @@ -488,7 +486,7 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); void Avatar::updateHead(float deltaTime) { - //apply the head lean values to the springy positions in the upper-spine... + //apply the head lean values to the springy position... if ( fabs( _head.leanSideways + _head.leanForward ) > 0.0f ) { glm::vec3 headLean = _orientation.getRight() * _head.leanSideways + @@ -741,7 +739,7 @@ void Avatar::render(bool lookingInMirror) { } // if this is my avatar, then render my interactions with the other avatar - if (( _isMine ) && ( _closeEnoughToHoldHands )) { + if (( _isMine ) && ( _handsCloseEnoughToGrasp )) { _avatarTouch.render(); } diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 03deb9a58b..2abfc19498 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -92,7 +92,7 @@ public: float getBodyYaw() {return _bodyYaw;}; void addBodyYaw(float y) {_bodyYaw += y;}; - bool getIsNearInteractingOther() { return _closeEnoughToHoldHands; } + bool getIsNearInteractingOther() { return _canReachToOtherAvatar; } float getAbsoluteHeadYaw() const; void setLeanForward(float dist); @@ -256,7 +256,8 @@ private: int _transmitterPackets; glm::vec3 _transmitterInitialReading; Avatar* _interactingOther; - bool _closeEnoughToHoldHands; + bool _canReachToOtherAvatar; + bool _handsCloseEnoughToGrasp; float _pelvisStandingHeight; float _height; Balls* _balls; From 09a6a476d597fa5c054bcf462de666b535a19d33 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 1 May 2013 20:55:40 -0700 Subject: [PATCH 3/8] Slow down when near other avatars - incremental commit --- interface/src/Avatar.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index d59395e01f..e4a63fce51 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -320,6 +320,8 @@ void Avatar::setMousePressed( bool d ) { void Avatar::simulate(float deltaTime) { + float nearestAvatarDistance = 1000000.f; + // update balls if (_balls) { _balls->simulate(deltaTime); } @@ -341,7 +343,7 @@ void Avatar::simulate(float deltaTime) { if ( _isMine ) { float closestDistance = 10000.0f; - + AgentList* agentList = AgentList::getInstance(); for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL && agent->getType() == AGENT_TYPE_AVATAR) { @@ -355,6 +357,8 @@ void Avatar::simulate(float deltaTime) { v -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); float distance = glm::length( v ); + if ( distance < nearestAvatarDistance ) { nearestAvatarDistance = distance; } + if ( distance < _maxArmLength + _maxArmLength ) { closestDistance = distance; @@ -442,6 +446,11 @@ void Avatar::simulate(float deltaTime) { // decay velocity _velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime ); + + // If other avatars nearby, damp velocity much more! + if (_isMine && (nearestAvatarDistance < 3.f)) { + _velocity *= (1.0 - fmin(10.f * glm::length(_velocity) * deltaTime, 1.0)); + } // update head information updateHead(deltaTime); From ee1e5d16fcef5c2e4596f4ffc2f48cc7f3ebb22c Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 1 May 2013 22:03:57 -0700 Subject: [PATCH 4/8] Avatars are now slowed down when they get near other avatars, for easy fine positioning. --- interface/src/Avatar.cpp | 22 ++++++++++++++++------ interface/src/main.cpp | 20 ++++++-------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 53ba706604..402af33c55 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -324,7 +324,16 @@ void Avatar::setMousePressed( bool d ) { void Avatar::simulate(float deltaTime) { - float nearestAvatarDistance = 1000000.f; + float nearestAvatarDistance = std::numeric_limits::max(); + +//keep this - I'm still using it to test things.... +/* +//TEST +static float tt = 0.0f; +tt += deltaTime * 2.0f; +//_head.leanSideways = 0.01 * sin( tt ); +_head.leanForward = 0.02 * sin( tt * 0.8 ); +*/ // update balls if (_balls) { _balls->simulate(deltaTime); } @@ -346,8 +355,7 @@ void Avatar::simulate(float deltaTime) { // all the other avatars for potential interactions... if ( _isMine ) { - float closestDistance = 10000.0f; - + AgentList* agentList = AgentList::getInstance(); for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if (agent->getLinkedData() != NULL && agent->getType() == AGENT_TYPE_AVATAR) { @@ -467,9 +475,11 @@ void Avatar::simulate(float deltaTime) { // decay velocity _velocity *= ( 1.0 - LIN_VEL_DECAY * deltaTime ); - // If other avatars nearby, damp velocity much more! - if (_isMine && (nearestAvatarDistance < 3.f)) { - _velocity *= (1.0 - fmin(10.f * glm::length(_velocity) * deltaTime, 1.0)); + // If someone is near, damp velocity as a function of closeness + const float AVATAR_BRAKING_RANGE = 1.2f; + const float AVATAR_BRAKING_STRENGTH = 25.f; + if (_isMine && (nearestAvatarDistance < AVATAR_BRAKING_RANGE )) { + _velocity *= (1.f - deltaTime * AVATAR_BRAKING_STRENGTH * (AVATAR_BRAKING_RANGE - nearestAvatarDistance)); } // update head information diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 055bf73c85..ce15eb07c4 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -221,23 +221,15 @@ void displayStats(void) if (::menuOn == 0) { statsVerticalOffset = 8; } - // bitmap chars are about 10 pels high - char legend[] = "/ - toggle this display, Q - exit, H - show head, M - show hand, T - test audio"; - drawtext(10, statsVerticalOffset + 15, 0.10f, 0, 1.0, 0, legend); - char legend2[] = "* - toggle stars, & - toggle paint mode, '-' - send erase all, '%' - send add scene"; - drawtext(10, statsVerticalOffset + 32, 0.10f, 0, 1.0, 0, legend2); - - glm::vec3 avatarPos = myAvatar.getPosition(); - char stats[200]; - sprintf(stats, "FPS = %3.0f Pkts/s = %d Bytes/s = %d Head(x,y,z)= %4.2f, %4.2f, %4.2f ", - FPS, packetsPerSecond, bytesPerSecond, avatarPos.x,avatarPos.y,avatarPos.z); - drawtext(10, statsVerticalOffset + 49, 0.10f, 0, 1.0, 0, stats); + sprintf(stats, "%3.0f FPS, %d Pkts/sec, %3.2f Mbps", + FPS, packetsPerSecond, (float)bytesPerSecond * 8.f / 1000000.f); + drawtext(10, statsVerticalOffset + 15, 0.10f, 0, 1.0, 0, stats); std::stringstream voxelStats; voxelStats << "Voxels Rendered: " << voxels.getVoxelsRendered() << " Updated: " << voxels.getVoxelsUpdated(); - drawtext(10, statsVerticalOffset + 70, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); + drawtext(10, statsVerticalOffset + 230, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); voxelStats << "Voxels Created: " << voxels.getVoxelsCreated() << " (" << voxels.getVoxelsCreatedPerSecondAverage() @@ -251,7 +243,7 @@ void displayStats(void) voxelStats.str(""); voxelStats << "Voxels Bytes Read: " << voxels.getVoxelsBytesRead() - << " (" << voxels.getVoxelsBytesReadPerSecondAverage() << " Bps)"; + << " (" << voxels.getVoxelsBytesReadPerSecondAverage() * 8.f / 1000000.f << " Mbps)"; drawtext(10, statsVerticalOffset + 290,0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); @@ -1633,7 +1625,7 @@ int main(int argc, const char * argv[]) } // Handle Local Domain testing with the --local command line - if (true || cmdOptionExists(argc, argv, "--local")) { + if (cmdOptionExists(argc, argv, "--local")) { printLog("Local Domain MODE!\n"); int ip = getLocalAddress(); sprintf(DOMAIN_IP,"%d.%d.%d.%d", (ip & 0xFF), ((ip >> 8) & 0xFF),((ip >> 16) & 0xFF), ((ip >> 24) & 0xFF)); From 900caa6278de7811c392c25702dbc48aeffdc3e8 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 1 May 2013 22:40:38 -0700 Subject: [PATCH 5/8] Changed idle simulate call to 16msecs (which will set avatar mixer rate at 60FPS), further small stats improvements --- interface/src/main.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index ce15eb07c4..822bfe81f6 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -15,7 +15,7 @@ // Welcome Aboard! // // -// Keyboard Commands: +// Keyboard Commands: // // / = toggle stats display // spacebar = reset gyros/head position @@ -134,7 +134,7 @@ VoxelSystem voxels; Audio audio(&audioScope, &myAvatar); #endif -#define IDLE_SIMULATE_MSECS 8 // How often should call simulate and other stuff +#define IDLE_SIMULATE_MSECS 16 // How often should call simulate and other stuff // in the idle loop? // Where one's own agent begins in the world (needs to become a dynamic thing passed to the program) @@ -228,22 +228,23 @@ void displayStats(void) drawtext(10, statsVerticalOffset + 15, 0.10f, 0, 1.0, 0, stats); std::stringstream voxelStats; - voxelStats << "Voxels Rendered: " << voxels.getVoxelsRendered() << " Updated: " << voxels.getVoxelsUpdated(); + voxelStats.precision(4); + voxelStats << "Voxels Rendered: " << voxels.getVoxelsRendered()/1000.f << "K Updated: " << voxels.getVoxelsUpdated()/1000.f << "K"; drawtext(10, statsVerticalOffset + 230, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Created: " << voxels.getVoxelsCreated() << " (" << voxels.getVoxelsCreatedPerSecondAverage() - << "/sec) "; + voxelStats << "Voxels Created: " << voxels.getVoxelsCreated()/1000.f << "K (" << voxels.getVoxelsCreatedPerSecondAverage()/1000.f + << "Kps) "; drawtext(10, statsVerticalOffset + 250, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Colored: " << voxels.getVoxelsColored() << " (" << voxels.getVoxelsColoredPerSecondAverage() - << "/sec) "; + voxelStats << "Voxels Colored: " << voxels.getVoxelsColored()/1000.f << "K (" << voxels.getVoxelsColoredPerSecondAverage()/1000.f + << "Kps) "; drawtext(10, statsVerticalOffset + 270, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Bytes Read: " << voxels.getVoxelsBytesRead() - << " (" << voxels.getVoxelsBytesReadPerSecondAverage() * 8.f / 1000000.f << " Mbps)"; + voxelStats << "Voxel Bits Read: " << voxels.getVoxelsBytesRead() * 8.f / 1000000.f + << "M (" << voxels.getVoxelsBytesReadPerSecondAverage() * 8.f / 1000000.f << " Mbps)"; drawtext(10, statsVerticalOffset + 290,0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); @@ -251,13 +252,13 @@ void displayStats(void) ? ((float) voxels.getVoxelsBytesRead() / voxels.getVoxelsColored()) : 0; - voxelStats << "Voxels Bytes per Colored: " << voxelsBytesPerColored; + voxelStats << "Voxels Bits per Colored: " << voxelsBytesPerColored * 8; drawtext(10, statsVerticalOffset + 310, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); Agent *avatarMixer = AgentList::getInstance()->soloAgentOfType(AGENT_TYPE_AVATAR_MIXER); char avatarMixerStats[200]; if (avatarMixer) { - sprintf(avatarMixerStats, "Avatar Mixer - %.f kbps, %.f pps", + sprintf(avatarMixerStats, "Avatar Mixer: %.f kbps, %.f pps", roundf(avatarMixer->getAverageKilobitsPerSecond()), roundf(avatarMixer->getAveragePacketsPerSecond())); } else { From 35a8066bd64bb4ac3cf17aea531f77f1c753f338 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Thu, 2 May 2013 11:05:51 -0700 Subject: [PATCH 6/8] fixed merge problem --- interface/src/Avatar.cpp | 61 +++++++++++++++----------- interface/src/Avatar.h | 80 +++++++++++++++++------------------ interface/src/AvatarTouch.cpp | 79 +++++++++++++++++++--------------- interface/src/AvatarTouch.h | 18 ++++++-- 4 files changed, 134 insertions(+), 104 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 5c410eb21a..cfb6fb9f6a 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -20,11 +20,15 @@ using namespace std; +/* const bool BALLS_ON = false; const bool AVATAR_GRAVITY = true; const float DECAY = 0.1; -const float THRUST_MAG = 1200.0; + +//const float THRUST_MAG = 1200.0; +const float THRUST_MAG = 0.0; + const float YAW_MAG = 500.0; //JJV - changed from 300.0; const float TEST_YAW_DECAY = 5.0; const float LIN_VEL_DECAY = 5.0; @@ -37,7 +41,8 @@ const float COLLISION_BALL_FORCE = 0.6; const float COLLISION_BODY_FORCE = 6.0; const float COLLISION_BALL_FRICTION = 200.0; const float COLLISION_BODY_FRICTION = 0.5; - +*/ + float skinColor[] = {1.0, 0.84, 0.66}; float lightBlue[] = { 0.7, 0.8, 1.0 }; float browColor[] = {210.0/255.0, 105.0/255.0, 30.0/255.0}; @@ -135,7 +140,7 @@ Avatar::Avatar(bool isMine) { _renderPitch = 0.0; _sphere = NULL; _interactingOther = NULL; - _canReachToOtherAvatar = false; + //_canReachToOtherAvatar = false; _handHoldingPosition = glm::vec3( 0.0, 0.0, 0.0 ); initializeSkeleton(); @@ -157,7 +162,7 @@ Avatar::Avatar(const Avatar &otherAvatar) { _velocity = otherAvatar._velocity; _thrust = otherAvatar._thrust; _rotation = otherAvatar._rotation; - _canReachToOtherAvatar = otherAvatar._canReachToOtherAvatar; + //_canReachToOtherAvatar = otherAvatar._canReachToOtherAvatar; _bodyYaw = otherAvatar._bodyYaw; _bodyPitch = otherAvatar._bodyPitch; _bodyRoll = otherAvatar._bodyRoll; @@ -316,6 +321,11 @@ void Avatar::setMousePressed( bool d ) { } +bool Avatar::getIsNearInteractingOther() { + return _avatarTouch.getAbleToReachOtherAvatar(); +} + + void Avatar::simulate(float deltaTime) { //keep this - I'm still using it to test things.... @@ -336,13 +346,14 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); // reset hand and arm positions according to hand movement updateHandMovement( deltaTime ); - if ( !_canReachToOtherAvatar ) { + if ( !_avatarTouch.getAbleToReachOtherAvatar() ) { //initialize _handHolding _handHoldingPosition = _bone[ AVATAR_BONE_RIGHT_HAND ].position; } - _handsCloseEnoughToGrasp = false; // reset for the next go-round - _canReachToOtherAvatar = false; // reset for the next go-round + //reset these for the next go-round + _avatarTouch.setAbleToReachOtherAvatar (false); + _avatarTouch.setHandsCloseEnoughToGrasp(false); // if the avatar being simulated is mine, then loop through // all the other avatars for potential interactions... @@ -364,21 +375,23 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); if ( distance < _maxArmLength + _maxArmLength ) { _interactingOther = otherAvatar; - _canReachToOtherAvatar = true; + _avatarTouch.setAbleToReachOtherAvatar(true); + glm::vec3 vectorBetweenHands( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); + vectorBetweenHands -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); + float distanceBetweenHands = glm::length(vectorBetweenHands); + + if (distanceBetweenHands < _avatarTouch.HANDS_CLOSE_ENOUGH_TO_GRASP) { + _avatarTouch.setHandsCloseEnoughToGrasp(true); + } + // if I am holding hands with another avatar, a force is applied if (( _handState == 1 ) || ( _interactingOther->_handState == 1 )) { - glm::vec3 vectorBetweenHands( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); - vectorBetweenHands -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_HAND ); - - float distanceBetweenHands = glm::length(vectorBetweenHands); - // if the hands are close enough to grasp... - if (distanceBetweenHands < 0.1) + if (distanceBetweenHands < _avatarTouch.HANDS_CLOSE_ENOUGH_TO_GRASP) { - _handsCloseEnoughToGrasp = true; - + // apply the forces... glm::vec3 vectorToOtherHand = _interactingOther->_handPosition - _handHoldingPosition; glm::vec3 vectorToMyHand = _bone[ AVATAR_BONE_RIGHT_HAND ].position - _handHoldingPosition; @@ -386,6 +399,7 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); _handHoldingPosition += vectorToMyHand * MY_HAND_HOLDING_PULL; _bone[ AVATAR_BONE_RIGHT_HAND ].position = _handHoldingPosition; + // apply a force to the avatar body if ( glm::length(vectorToOtherHand) > _maxArmLength * 0.9 ) { _velocity += vectorToOtherHand; } @@ -404,18 +418,17 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); updateArmIKAndConstraints( deltaTime ); // set hand positions for _avatarTouch.setMyHandPosition AFTER calling updateArmIKAndConstraints - //if ( _interactingOther != NULL ) { - if ( _interactingOther ) { // Brad recommended I use this method pof checking that a pointer is valid + if ( _interactingOther ) { if (_isMine) { _avatarTouch.setMyHandPosition ( _bone[ AVATAR_BONE_RIGHT_HAND ].position ); - _avatarTouch.setYourHandPosition( _interactingOther->_handPosition ); + _avatarTouch.setYourHandPosition( _interactingOther->_bone[ AVATAR_BONE_RIGHT_HAND ].position ); _avatarTouch.setMyHandState ( _handState ); _avatarTouch.setYourHandState ( _interactingOther->_handState ); _avatarTouch.simulate(deltaTime); } } - if (!_canReachToOtherAvatar) { + if (!_avatarTouch.getAbleToReachOtherAvatar() ) { _interactingOther = NULL; } @@ -720,7 +733,6 @@ void Avatar::render(bool lookingInMirror) { */ if ( usingBigSphereCollisionTest ) { - // show TEST big sphere glColor4f( 0.5f, 0.6f, 0.8f, 0.7 ); glPushMatrix(); @@ -730,7 +742,7 @@ void Avatar::render(bool lookingInMirror) { glPopMatrix(); } - // render body + //render body renderBody(); // render head @@ -739,12 +751,11 @@ void Avatar::render(bool lookingInMirror) { } // if this is my avatar, then render my interactions with the other avatar - if (( _isMine ) && ( _handsCloseEnoughToGrasp )) { + if ( _isMine ) { _avatarTouch.render(); } // Render the balls - if (_balls) { glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); @@ -1145,7 +1156,7 @@ void Avatar::updateSkeleton() { _bone[ AVATAR_BONE_RIGHT_HAND ].position = _handPosition; } - // the following will be replaced by a proper rotation... + // the following will be replaced by a proper rotation...close float xx = glm::dot( _bone[b].defaultPosePosition, _bone[b].orientation.getRight() ); float yy = glm::dot( _bone[b].defaultPosePosition, _bone[b].orientation.getUp () ); float zz = glm::dot( _bone[b].defaultPosePosition, _bone[b].orientation.getFront() ); diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 2abfc19498..fec8b6e4d0 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -92,8 +92,8 @@ public: float getBodyYaw() {return _bodyYaw;}; void addBodyYaw(float y) {_bodyYaw += y;}; - bool getIsNearInteractingOther() { return _canReachToOtherAvatar; } - + bool getIsNearInteractingOther(); + float getAbsoluteHeadYaw() const; void setLeanForward(float dist); void setLeanSideways(float dist); @@ -144,6 +144,7 @@ public: private: + const bool BALLS_ON = false; const bool AVATAR_GRAVITY = true; const float DECAY = 0.1; const float THRUST_MAG = 1200.0; @@ -226,46 +227,43 @@ private: float returnSpringScale; }; - AvatarHead _head; - bool _isMine; - glm::vec3 _TEST_bigSpherePosition; - float _TEST_bigSphereRadius; - bool _mousePressed; - float _bodyPitchDelta; - float _bodyYawDelta; - float _bodyRollDelta; - bool _usingBodySprings; - glm::vec3 _movedHandOffset; - glm::quat _rotation; // the rotation of the avatar body as a whole expressed as a quaternion - AvatarBone _bone[ NUM_AVATAR_BONES ]; - AvatarMode _mode; - glm::vec3 _handHoldingPosition; - glm::vec3 _velocity; - glm::vec3 _thrust; - float _speed; - float _maxArmLength; - Orientation _orientation; - int _driveKeys[MAX_DRIVE_KEYS]; - GLUquadric* _sphere; - float _renderYaw; - float _renderPitch; // Pitch from view frustum when this is own head - bool _transmitterIsFirstData; - timeval _transmitterTimeLastReceived; - timeval _transmitterTimer; - float _transmitterHz; - int _transmitterPackets; - glm::vec3 _transmitterInitialReading; - Avatar* _interactingOther; - bool _canReachToOtherAvatar; - bool _handsCloseEnoughToGrasp; - float _pelvisStandingHeight; - float _height; - Balls* _balls; - AvatarTouch _avatarTouch; - bool _displayingHead; // should be false if in first-person view - bool _returnHeadToCenter; + AvatarHead _head; + bool _isMine; + glm::vec3 _TEST_bigSpherePosition; + float _TEST_bigSphereRadius; + bool _mousePressed; + float _bodyPitchDelta; + float _bodyYawDelta; + float _bodyRollDelta; + bool _usingBodySprings; + glm::vec3 _movedHandOffset; + glm::quat _rotation; // the rotation of the avatar body as a whole expressed as a quaternion + AvatarBone _bone[ NUM_AVATAR_BONES ]; + AvatarMode _mode; + glm::vec3 _handHoldingPosition; + glm::vec3 _velocity; + glm::vec3 _thrust; + float _speed; + float _maxArmLength; + Orientation _orientation; + int _driveKeys[MAX_DRIVE_KEYS]; + GLUquadric* _sphere; + float _renderYaw; + float _renderPitch; // Pitch from view frustum when this is own head + bool _transmitterIsFirstData; + timeval _transmitterTimeLastReceived; + timeval _transmitterTimer; + float _transmitterHz; + int _transmitterPackets; + glm::vec3 _transmitterInitialReading; + Avatar* _interactingOther; + float _pelvisStandingHeight; + float _height; + Balls* _balls; + AvatarTouch _avatarTouch; + bool _displayingHead; // should be false if in first-person view + bool _returnHeadToCenter; - // private methods... void initializeSkeleton(); void updateSkeleton(); diff --git a/interface/src/AvatarTouch.cpp b/interface/src/AvatarTouch.cpp index bf694afdac..37c4c7fb2f 100644 --- a/interface/src/AvatarTouch.cpp +++ b/interface/src/AvatarTouch.cpp @@ -11,15 +11,18 @@ #include "AvatarTouch.h" #include "InterfaceConfig.h" -const float THREAD_RADIUS = 0.007; +const float THREAD_RADIUS = 0.012; AvatarTouch::AvatarTouch() { _myHandPosition = glm::vec3( 0.0f, 0.0f, 0.0f ); _yourHandPosition = glm::vec3( 0.0f, 0.0f, 0.0f ); _myHandState = 0; - _yourHandState = 0; + _yourHandState = 0; + _canReachToOtherAvatar = false; + _handsCloseEnoughToGrasp = false; + for (int p=0; p Date: Thu, 2 May 2013 20:51:17 -0700 Subject: [PATCH 7/8] Fixes per code review. --- interface/src/Avatar.cpp | 16 +++++++++------- interface/src/main.cpp | 6 +++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 05450f64f2..b75e151a5b 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -375,9 +375,9 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); v -= otherAvatar->getBonePosition( AVATAR_BONE_RIGHT_SHOULDER ); float distance = glm::length( v ); - if ( distance < nearestAvatarDistance ) { nearestAvatarDistance = distance; } + if (distance < nearestAvatarDistance) { nearestAvatarDistance = distance; } - if ( distance < _maxArmLength + _maxArmLength ) { + if (distance < _maxArmLength + _maxArmLength) { _interactingOther = otherAvatar; _avatarTouch.setAbleToReachOtherAvatar(true); @@ -491,8 +491,10 @@ _head.leanForward = 0.02 * sin( tt * 0.8 ); // If someone is near, damp velocity as a function of closeness const float AVATAR_BRAKING_RANGE = 1.2f; const float AVATAR_BRAKING_STRENGTH = 25.f; - if (_isMine && (nearestAvatarDistance < AVATAR_BRAKING_RANGE )) { - _velocity *= (1.f - deltaTime * AVATAR_BRAKING_STRENGTH * (AVATAR_BRAKING_RANGE - nearestAvatarDistance)); + if (_isMine && (nearestAvatarDistance < AVATAR_BRAKING_RANGE)) { + _velocity *= + (1.f - deltaTime * AVATAR_BRAKING_STRENGTH * + (AVATAR_BRAKING_RANGE - nearestAvatarDistance)); } // update head information @@ -1421,8 +1423,8 @@ void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { printLog("Using Transmitter %s to drive head, springs OFF.\n", device); } - printLog("Packet: [%s]\n", packetData); - printLog("Version: %s\n", device); + //printLog("Packet: [%s]\n", packetData); + //printLog("Version: %s\n", device); _transmitterInitialReading = glm::vec3( rot3, rot2, @@ -1449,7 +1451,7 @@ void Avatar::processTransmitterData(unsigned char* packetData, int numBytes) { if (eulerAngles.x < -180.f) { eulerAngles.x += 360.f; } glm::vec3 angularVelocity; - if (!(deviceType == DEVICE_GLASS)) { + if (deviceType != DEVICE_GLASS) { angularVelocity = glm::vec3(glm::degrees(gyrZ), glm::degrees(-gyrX), glm::degrees(gyrY)); setHeadFromGyros( &eulerAngles, &angularVelocity, (_transmitterHz == 0.f) ? 0.f : 1.f / _transmitterHz, 1.0); diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 822bfe81f6..3edab8bfe9 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -229,16 +229,16 @@ void displayStats(void) std::stringstream voxelStats; voxelStats.precision(4); - voxelStats << "Voxels Rendered: " << voxels.getVoxelsRendered()/1000.f << "K Updated: " << voxels.getVoxelsUpdated()/1000.f << "K"; + voxelStats << "Voxels Rendered: " << voxels.getVoxelsRendered() / 1000.f << "K Updated: " << voxels.getVoxelsUpdated()/1000.f << "K"; drawtext(10, statsVerticalOffset + 230, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Created: " << voxels.getVoxelsCreated()/1000.f << "K (" << voxels.getVoxelsCreatedPerSecondAverage()/1000.f + voxelStats << "Voxels Created: " << voxels.getVoxelsCreated() / 1000.f << "K (" << voxels.getVoxelsCreatedPerSecondAverage() / 1000.f << "Kps) "; drawtext(10, statsVerticalOffset + 250, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); voxelStats.str(""); - voxelStats << "Voxels Colored: " << voxels.getVoxelsColored()/1000.f << "K (" << voxels.getVoxelsColoredPerSecondAverage()/1000.f + voxelStats << "Voxels Colored: " << voxels.getVoxelsColored() / 1000.f << "K (" << voxels.getVoxelsColoredPerSecondAverage() / 1000.f << "Kps) "; drawtext(10, statsVerticalOffset + 270, 0.10f, 0, 1.0, 0, (char *)voxelStats.str().c_str()); From 9716ea9550e80ecb6e5030b6a45b603524ebaf22 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Thu, 2 May 2013 22:28:41 -0700 Subject: [PATCH 8/8] Ground plane moved to 0->10 and lines are exactly 1 meter --- interface/src/Avatar.cpp | 9 ++++++-- interface/src/Util.cpp | 44 ++++++++++++++-------------------------- interface/src/Util.h | 2 +- interface/src/main.cpp | 2 +- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index b75e151a5b..a1f9103d37 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -1508,8 +1508,13 @@ 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 (glm::length(pos) < 5.f) { - // If near the origin sphere, turn gravity ON + 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 diff --git a/interface/src/Util.cpp b/interface/src/Util.cpp index ef51f9b72a..138ae7aef4 100644 --- a/interface/src/Util.cpp +++ b/interface/src/Util.cpp @@ -213,42 +213,28 @@ void drawvec3(int x, int y, float scale, float rotate, float thick, int mono, gl } -void drawGroundPlaneGrid( float size, int resolution ) +void drawGroundPlaneGrid(float size) { - glColor3f( 0.4f, 0.5f, 0.3f ); + glColor3f( 0.4f, 0.5f, 0.3f ); glLineWidth(2.0); - float gridSize = 10.0; - int gridResolution = 20; - - for (int g=0; g