diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 1f84d3255b..c9e03d15cc 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -103,6 +103,31 @@ float Avatar::getLODDistance() const { void Avatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); + + // update the avatar's position according to its referential + if (_referential) { + if (_referential->hasExtraData()) { + ModelTree* tree = Application::getInstance()->getModels()->getTree(); + switch (_referential->type()) { + case Referential::MODEL: + _referential = new ModelReferential(_referential, + tree, + this); + break; + case Referential::JOINT: + _referential = new JointReferential(_referential, + tree, + this); + break; + default: + qDebug() << "[WARNING] Avatar::simulate(): Unknown referential type."; + break; + } + } + + _referential->update(); + } + if (_scale != _targetScale) { setScale(_targetScale); } @@ -180,28 +205,6 @@ void Avatar::simulate(float deltaTime) { } _displayNameAlpha = abs(_displayNameAlpha - _displayNameTargetAlpha) < 0.01f ? _displayNameTargetAlpha : _displayNameAlpha; } - if (_referential) { - if (_referential->hasExtraData()) { - ModelTree* tree = Application::getInstance()->getModels()->getTree(); - switch (_referential->type()) { - case Referential::MODEL: - _referential = new ModelReferential(_referential, - tree, - this); - break; - case Referential::JOINT: - _referential = new JointReferential(_referential, - tree, - this); - break; - default: - qDebug() << "[WARNING] Avatar::simulate(): Unknown referential type."; - break; - } - } - - _referential->update(); - } } void Avatar::updateAcceleration(float deltaTime) { @@ -241,18 +244,9 @@ static TextRenderer* textRenderer(TextRendererType type) { } void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) { - // make sure we have the right position - _skeletonModel.setTranslation(getPosition()); - static const glm::quat refOrientation = glm::angleAxis(PI, glm::vec3(0.0f, 1.0f, 0.0f)); - _skeletonModel.setRotation(getOrientation() * refOrientation); - const float MODEL_SCALE = 0.0006f; - _skeletonModel.setScale(glm::vec3(1.0f, 1.0f, 1.0f) * getScale() * MODEL_SCALE); - - glm::vec3 headPosition = _position; - _skeletonModel.getHeadPosition(headPosition); - Head* head = getHead(); - head->setPosition(headPosition); - head->setScale(_scale); + if (_referential) { + _referential->update(); + } if (glm::distance(Application::getInstance()->getAvatar()->getPosition(), _position) < 10.0f) { @@ -303,7 +297,7 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode) { float boundingRadius = getBillboardSize(); ViewFrustum* frustum = (renderMode == Avatar::SHADOW_RENDER_MODE) ? Application::getInstance()->getShadowViewFrustum() : Application::getInstance()->getViewFrustum(); - if (frustum->sphereInFrustum(_position, boundingRadius) == ViewFrustum::OUTSIDE) { + if (frustum->sphereInFrustum(getPosition(), boundingRadius) == ViewFrustum::OUTSIDE) { return; } diff --git a/interface/src/avatar/ModelReferential.cpp b/interface/src/avatar/ModelReferential.cpp index a6e611107f..1b9e6a9f52 100644 --- a/interface/src/avatar/ModelReferential.cpp +++ b/interface/src/avatar/ModelReferential.cpp @@ -70,7 +70,7 @@ void ModelReferential::update() { bool somethingChanged = false; if (item->getRadius() != _refScale) { _refScale = item->getRadius(); - _avatar->setTargetScale(_refScale * _scale); + _avatar->setTargetScale(_refScale * _scale, true); somethingChanged = true; } if (item->getModelRotation() != _refRotation) { @@ -147,17 +147,17 @@ void JointReferential::update() { bool somethingChanged = false; if (item->getRadius() != _refScale) { _refScale = item->getRadius(); - _avatar->setTargetScale(_refScale * _scale); + _avatar->setTargetScale(_refScale * _scale, true); somethingChanged = true; } if (item->getModelRotation() != _refRotation) { model->getJointRotationInWorldFrame(_jointIndex, _refRotation); - _avatar->setOrientation(_refRotation * _rotation); + _avatar->setOrientation(_refRotation * _rotation, true); somethingChanged = true; } if (item->getPosition() != _refPosition || somethingChanged) { model->getJointPositionInWorldFrame(_jointIndex, _refPosition); - _avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale)); + _avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale), true); somethingChanged = true; } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 59f9a440f0..0b41e0ffaa 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -94,7 +94,29 @@ void AvatarData::setOrientation(const glm::quat& orientation, bool overideRefere _bodyYaw = eulerAngles.y; _bodyRoll = eulerAngles.z; } -} +} + +float AvatarData::getTargetScale() const { + if (_referential) { + _referential->update(); + } + + return _targetScale; +} + +void AvatarData::setTargetScale(float targetScale, bool overideReferential) { + if (!_referential || overideReferential) { + _targetScale = targetScale; + } +} + +void AvatarData::setClampedTargetScale(float targetScale, bool overideReferential) { + + targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE); + + setTargetScale(targetScale, overideReferential); + qDebug() << "Changed scale to " << _targetScale; +} glm::vec3 AvatarData::getHandPosition() const { return getOrientation() * _handPosition + _position; @@ -868,14 +890,6 @@ void AvatarData::setJointMappingsFromNetworkReply() { networkReply->deleteLater(); } -void AvatarData::setClampedTargetScale(float targetScale) { - - targetScale = glm::clamp(targetScale, MIN_AVATAR_SCALE, MAX_AVATAR_SCALE); - - _targetScale = targetScale; - qDebug() << "Changed scale to " << _targetScale; -} - void AvatarData::sendIdentityPacket() { QByteArray identityPacket = byteArrayWithPopulatedHeader(PacketTypeAvatarIdentity); identityPacket.append(identityByteArray()); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 767c905322..df64813a28 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -190,9 +190,9 @@ public: void setAudioAverageLoudness(float value) { _headData->setAudioAverageLoudness(value); } // Scale - float getTargetScale() const { return _targetScale; } - void setTargetScale(float targetScale) { _targetScale = targetScale; } - void setClampedTargetScale(float targetScale); + float getTargetScale() const; + void setTargetScale(float targetScale, bool overideReferential = false); + void setClampedTargetScale(float targetScale, bool overideReferential = false); // Hand State Q_INVOKABLE void setHandState(char s) { _handState = s; }