From de84b7803f14e304a25258ea36ab95d1e0de48be Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 20 May 2013 15:51:40 -0700 Subject: [PATCH] move _lookAtPosition to HeadData class --- interface/src/Avatar.cpp | 16 +++++++--------- interface/src/Avatar.h | 1 + interface/src/Head.cpp | 7 +++---- interface/src/Head.h | 2 -- libraries/avatars/src/AvatarData.cpp | 14 ++++++++------ libraries/avatars/src/AvatarData.h | 2 -- libraries/avatars/src/HeadData.cpp | 5 ++--- libraries/avatars/src/HeadData.h | 8 ++++++++ 8 files changed, 29 insertions(+), 26 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 589c99e462..cc41e0d585 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -111,6 +111,11 @@ Avatar::Avatar(bool isMine) : _head() { else { _balls = NULL; } } +Avatar::~Avatar() { + // if _balls is something that's sticking around other than Philip playing around it needs to be delete here too + _headData = NULL; +} + void Avatar::reset() { _head.setYaw(0.0f); _head.setRoll(0.0f); @@ -389,20 +394,19 @@ void Avatar::simulate(float deltaTime) { // update head state _head.setPositionAndScale(_joint[AVATAR_JOINT_HEAD_BASE].springyPosition, _joint[AVATAR_JOINT_HEAD_BASE].radius); - setLookatPosition(glm::vec3(0.0f, 0.0f, 0.0f)); //default lookat position is 0,0,0 + _head.setLookAtPosition(glm::vec3(0.0f, 0.0f, 0.0f)); //default lookat position is 0,0,0 if (_interactingOther) { _head.setLooking(true); if (_isMine) { - setLookatPosition(_interactingOther->getSpringyHeadPosition()); + _head.setLookAtPosition(_interactingOther->getSpringyHeadPosition()); } } else { _head.setLooking(false); } _head.setBodyYaw(_bodyYaw); - _head.setLookatPosition(_lookatPosition); _head.setAudioLoudness(_audioLoudness); _head.setSkinColor(glm::vec3(skinColor[0], skinColor[1], skinColor[2])); _head.simulate(deltaTime, _isMine); @@ -1328,12 +1332,6 @@ void Avatar::setHeadFromGyros(glm::vec3* eulerAngles, glm::vec3* angularVelocity // absolute eulerAngles passed. // // - float const MAX_YAW = 90.f; - float const MIN_YAW = -90.f; - float const MAX_PITCH = 85.f; - float const MIN_PITCH = -85.f; - float const MAX_ROLL = 90.f; - float const MIN_ROLL = -90.f; if (deltaTime == 0.f) { // On first sample, set head to absolute position diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 3845b9cb60..90735c5876 100644 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -77,6 +77,7 @@ enum AvatarJointID class Avatar : public AvatarData { public: Avatar(bool isMine); + ~Avatar(); void reset(); void updateHeadFromGyros(float frametime, SerialInterface * serialInterface, glm::vec3 * gravity); diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index 587e6279af..c59dd9ac1d 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -45,7 +45,6 @@ Head::Head() : _skinColor(0.0f, 0.0f, 0.0f), _position(0.0f, 0.0f, 0.0f), _rotation(0.0f, 0.0f, 0.0f), - _lookatPosition(0.0f, 0.0f, 0.0f), _eyeballPitch(), _eyeballYaw(), _interBrowDistance(0.75f), @@ -224,7 +223,7 @@ void Head::setLooking(bool looking) { _lookingAtSomething = looking; glm::vec3 averageEyePosition = _leftEyePosition + (_rightEyePosition - _leftEyePosition ) * ONE_HALF; - glm::vec3 targetLookatAxis = glm::normalize(_lookatPosition - averageEyePosition); + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - averageEyePosition); float dot = glm::dot(targetLookatAxis, _orientation.getFront()); if (dot < MINIMUM_EYE_ROTATION) { @@ -370,7 +369,7 @@ void Head::renderEyeBalls() { if (_lookingAtSomething) { //rotate the eyeball to aim towards the lookat position - glm::vec3 targetLookatAxis = glm::normalize(_lookatPosition - _leftEyePosition); // the lookat direction + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - _leftEyePosition); // the lookat direction glm::vec3 rotationAxis = glm::cross(targetLookatAxis, IDENTITY_UP); float angle = 180.0f - angleBetween(targetLookatAxis, IDENTITY_UP); glRotatef(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z); @@ -414,7 +413,7 @@ void Head::renderEyeBalls() { if (_lookingAtSomething) { //rotate the eyeball to aim towards the lookat position - glm::vec3 targetLookatAxis = glm::normalize(_lookatPosition - _rightEyePosition); + glm::vec3 targetLookatAxis = glm::normalize(_lookAtPosition - _rightEyePosition); glm::vec3 rotationAxis = glm::cross(targetLookatAxis, IDENTITY_UP); float angle = 180.0f - angleBetween(targetLookatAxis, IDENTITY_UP); glRotatef(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z); diff --git a/interface/src/Head.h b/interface/src/Head.h index 49f67e6dab..a731a7b87e 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -34,7 +34,6 @@ public: void setPositionAndScale(glm::vec3 position, float scale); void setNewTarget(float, float); - void setLookatPosition (glm::vec3 lookatPosition ) { _lookatPosition = lookatPosition; } void setGravity (glm::vec3 gravity ) { _gravity = gravity; } void setSkinColor (glm::vec3 skinColor ) { _skinColor = skinColor; } void setBodyYaw (float bodyYaw ) { _bodyYaw = bodyYaw; } @@ -60,7 +59,6 @@ private: glm::vec3 _skinColor; glm::vec3 _position; glm::vec3 _rotation; - glm::vec3 _lookatPosition; glm::vec3 _leftEyePosition; glm::vec3 _rightEyePosition; float _eyeballPitch[2]; diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b0fb963984..27f4286bbd 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -35,7 +35,6 @@ int unpackFloatAngleFromTwoByte(uint16_t* byteAnglePointer, float* destinationPo AvatarData::AvatarData() : _handPosition(0,0,0), - _lookatPosition(0,0,0), _bodyYaw(-90.0), _bodyPitch(0.0), _bodyRoll(0.0), @@ -97,8 +96,8 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { destinationBuffer += sizeof(float) * 3; // Lookat Position - memcpy(destinationBuffer, &_lookatPosition, sizeof(_lookatPosition)); - destinationBuffer += sizeof(_lookatPosition); + memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); + destinationBuffer += sizeof(_headData->_lookAtPosition); // Hand State (0 = not grabbing, 1 = grabbing) memcpy(destinationBuffer, &_handState, sizeof(char)); @@ -148,7 +147,10 @@ int AvatarData::getBroadcastData(unsigned char* destinationBuffer) { // called on the other agents - assigns it to my views of the others int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { -//printf("AvatarData::parseData()\n"); + // lazily allocate memory for HeadData in case we're not an Avatar instance + if (!_headData) { + _headData = new HeadData(); + } // increment to push past the packet header sourceBuffer += sizeof(PACKET_HEADER_HEAD_DATA); @@ -188,8 +190,8 @@ int AvatarData::parseData(unsigned char* sourceBuffer, int numBytes) { sourceBuffer += sizeof(float) * 3; // Lookat Position - memcpy(&_lookatPosition, sourceBuffer, sizeof(_lookatPosition)); - sourceBuffer += sizeof(_lookatPosition); + memcpy(&_headData->_lookAtPosition, sourceBuffer, sizeof(_headData->_lookAtPosition)); + sourceBuffer += sizeof(_headData->_lookAtPosition); // Hand State memcpy(&_handState, sourceBuffer, sizeof(char)); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 19a2332c8b..e3621095d3 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -36,7 +36,6 @@ public: void setPosition (const glm::vec3 position ) { _position = position; } void setHandPosition (const glm::vec3 handPosition ) { _handPosition = handPosition; } - void setLookatPosition(const glm::vec3 lookatPosition) { _lookatPosition = lookatPosition; } int getBroadcastData(unsigned char* destinationBuffer); int parseData(unsigned char* sourceBuffer, int numBytes); @@ -108,7 +107,6 @@ protected: glm::vec3 _position; glm::vec3 _handPosition; - glm::vec3 _lookatPosition; // Body rotation float _bodyYaw; diff --git a/libraries/avatars/src/HeadData.cpp b/libraries/avatars/src/HeadData.cpp index e806fe0b6b..c95f1b68e9 100644 --- a/libraries/avatars/src/HeadData.cpp +++ b/libraries/avatars/src/HeadData.cpp @@ -8,12 +8,11 @@ #include "HeadData.h" -#include - HeadData::HeadData() : _yaw(0.0f), _pitch(0.0f), - _roll(0.0f) + _roll(0.0f), + _lookAtPosition(0.0f, 0.0f, 0.0f) { } diff --git a/libraries/avatars/src/HeadData.h b/libraries/avatars/src/HeadData.h index d5647f0275..eca16ef6b0 100644 --- a/libraries/avatars/src/HeadData.h +++ b/libraries/avatars/src/HeadData.h @@ -11,6 +11,8 @@ #include +#include + class HeadData { public: HeadData(); @@ -27,10 +29,16 @@ public: void addYaw(float yaw); void addPitch(float pitch); void addRoll(float roll); + + const glm::vec3& getLookAtPosition() const { return _lookAtPosition; } + void setLookAtPosition(const glm::vec3& lookAtPosition) { _lookAtPosition = lookAtPosition; } + + friend class AvatarData; protected: float _yaw; float _pitch; float _roll; + glm::vec3 _lookAtPosition; }; #endif /* defined(__hifi__HeadData__) */