diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 2b72fe2c23..6ceca9b426 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -24,6 +24,7 @@ #include #include #include +#include // adebug #include "Application.h" #include "Avatar.h" @@ -52,6 +53,7 @@ const float DISPLAYNAME_BACKGROUND_ALPHA = 0.4f; Avatar::Avatar() : AvatarData(), _skeletonModel(this), + _skeletonOffset(0.0f), _bodyYawDelta(0.0f), _velocity(0.0f), _positionDeltaAccumulator(0.0f), @@ -762,6 +764,21 @@ bool Avatar::findCollisions(const QVector& shapes, CollisionList& return collided; } +void Avatar::setSkeletonOffset(const glm::vec3& offset) { + const float MAX_OFFSET_LENGTH = _scale * 0.5f; + float offsetLength = glm::length(offset); + if (offsetLength > MAX_OFFSET_LENGTH) { + _skeletonOffset = (MAX_OFFSET_LENGTH / offsetLength) * offset; + } else { + _skeletonOffset = offset; + } + std::cout << "adebug set offset = " << offset << std::endl; // adebug +} + +glm::vec3 Avatar::getSkeletonPosition() const { + return _position + _skeletonOffset; +} + QVector Avatar::getJointRotations() const { if (QThread::currentThread() != thread()) { return AvatarData::getJointRotations(); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index cbdebc6a48..29fb4cf241 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -69,6 +69,7 @@ class Texture; class Avatar : public AvatarData { Q_OBJECT Q_PROPERTY(quint32 collisionGroups READ getCollisionGroups WRITE setCollisionGroups) + Q_PROPERTY(glm::vec3 skeletonOffset READ getSkeletonOffset WRITE setSkeletonOffset) public: Avatar(); @@ -146,6 +147,10 @@ public: quint32 getCollisionGroups() const { return _collisionGroups; } virtual void setCollisionGroups(quint32 collisionGroups) { _collisionGroups = (collisionGroups & VALID_COLLISION_GROUPS); } + + Q_INVOKABLE void setSkeletonOffset(const glm::vec3& offset); + Q_INVOKABLE glm::vec3 getSkeletonOffset() { return _skeletonOffset; } + virtual glm::vec3 getSkeletonPosition() const; Q_INVOKABLE glm::vec3 getJointPosition(int index) const; Q_INVOKABLE glm::vec3 getJointPosition(const QString& name) const; @@ -184,6 +189,7 @@ signals: protected: Hair _hair; SkeletonModel _skeletonModel; + glm::vec3 _skeletonOffset; QVector _attachmentModels; float _bodyYawDelta; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index aae1907b76..5b6433365c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -108,6 +108,20 @@ MyAvatar::~MyAvatar() { _lookAtTargetAvatar.clear(); } +QByteArray MyAvatar::toByteArray() { + CameraMode mode = Application::getInstance()->getCamera()->getMode(); + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT) { + // fake the avatar position that is sent up to the AvatarMixer + glm::vec3 oldPosition = _position; + _position += _skeletonOffset; + QByteArray array = AvatarData::toByteArray(); + // copy the correct position back + _position = oldPosition; + return array; + } + return AvatarData::toByteArray(); +} + void MyAvatar::reset() { _skeletonModel.reset(); getHead()->reset(); @@ -1052,6 +1066,14 @@ void MyAvatar::setAttachmentData(const QVector& attachmentData) _billboardValid = false; } +glm::vec3 MyAvatar::getSkeletonPosition() const { + CameraMode mode = Application::getInstance()->getCamera()->getMode(); + if (mode == CAMERA_MODE_THIRD_PERSON || mode == CAMERA_MODE_INDEPENDENT) { + return Avatar::getSkeletonPosition(); + } + return Avatar::getPosition(); +} + QString MyAvatar::getScriptedMotorFrame() const { QString frame = "avatar"; if (_scriptedMotorFrame == SCRIPTED_MOTOR_CAMERA_FRAME) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 98fc5ff74d..34a8ec6f5e 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -41,7 +41,8 @@ class MyAvatar : public Avatar { public: MyAvatar(); ~MyAvatar(); - + + QByteArray toByteArray(); void reset(); void update(float deltaTime); void simulate(float deltaTime); @@ -133,6 +134,8 @@ public: virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setAttachmentData(const QVector& attachmentData); + + virtual glm::vec3 getSkeletonPosition() const; void clearJointAnimationPriorities(); diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index a1fccf1a10..cf14038331 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -77,7 +77,7 @@ const float PALM_PRIORITY = DEFAULT_PRIORITY; const float LEAN_PRIORITY = DEFAULT_PRIORITY; void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { - setTranslation(_owningAvatar->getPosition()); + setTranslation(_owningAvatar->getSkeletonPosition()); static const glm::quat refOrientation = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); setRotation(_owningAvatar->getOrientation() * refOrientation); setScale(glm::vec3(1.0f, 1.0f, 1.0f) * _owningAvatar->getScale() * MODEL_SCALE); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index ef7083e3bf..d8679d5550 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -67,7 +67,7 @@ AvatarData::~AvatarData() { delete _referential; } -const glm::vec3& AvatarData::getPosition() { +const glm::vec3& AvatarData::getPosition() const { if (_referential) { _referential->update(); } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 1fd4052974..d6636ff384 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -138,15 +138,15 @@ public: AvatarData(); virtual ~AvatarData(); - const QUuid& getSessionUUID() { return _sessionUUID; } + const QUuid& getSessionUUID() const { return _sessionUUID; } - const glm::vec3& getPosition(); + const glm::vec3& getPosition() const; virtual void setPosition(const glm::vec3 position, bool overideReferential = false); glm::vec3 getHandPosition() const; void setHandPosition(const glm::vec3& handPosition); - QByteArray toByteArray(); + virtual QByteArray toByteArray(); /// \return true if an error should be logged bool shouldLogError(const quint64& now);