diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 71f4621205..4c4bc93036 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -57,7 +57,7 @@ const float CHAT_MESSAGE_SCALE = 0.0015f; const float CHAT_MESSAGE_HEIGHT = 0.1f; const float DISPLAYNAME_FADE_TIME = 0.5f; const float DISPLAYNAME_FADE_FACTOR = pow(0.01f, 1.0f / DISPLAYNAME_FADE_TIME); -const float DISPLAYNAME_ALPHA = 0.95f; +const float DISPLAYNAME_ALPHA = 1.0f; const float DISPLAYNAME_BACKGROUND_ALPHA = 0.4f; namespace render { @@ -323,7 +323,7 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo _referential->update(); } - auto batch = renderArgs->_batch; + auto& batch = *renderArgs->_batch; if (postLighting && glm::distance(DependencyManager::get()->getMyAvatar()->getPosition(), _position) < 10.0f) { @@ -354,9 +354,9 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo Transform pointerTransform; pointerTransform.setTranslation(position); pointerTransform.setRotation(rotation); - batch->setModelTransform(pointerTransform); - deferredLighting->bindSimpleProgram(*batch); - geometryCache->renderLine(*batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); + batch.setModelTransform(pointerTransform); + deferredLighting->bindSimpleProgram(batch); + geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); } } @@ -377,9 +377,9 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo Transform pointerTransform; pointerTransform.setTranslation(position); pointerTransform.setRotation(rotation); - batch->setModelTransform(pointerTransform); - deferredLighting->bindSimpleProgram(*batch); - geometryCache->renderLine(*batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); + batch.setModelTransform(pointerTransform); + deferredLighting->bindSimpleProgram(batch); + geometryCache->renderLine(batch, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, laserLength, 0.0f), laserColor); } } } @@ -464,8 +464,8 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo } Transform transform; transform.setTranslation(position); - batch->setModelTransform(transform); - DependencyManager::get()->renderSolidSphere(*batch, LOOK_AT_INDICATOR_RADIUS + batch.setModelTransform(transform); + DependencyManager::get()->renderSolidSphere(batch, LOOK_AT_INDICATOR_RADIUS , 15, 15, LOOK_AT_INDICATOR_COLOR); } } @@ -492,14 +492,14 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo Transform transform; transform.setTranslation(_position); transform.setScale(height); - batch->setModelTransform(transform); + batch.setModelTransform(transform); if (_voiceSphereID == GeometryCache::UNKNOWN_ID) { _voiceSphereID = DependencyManager::get()->allocateID(); } - DependencyManager::get()->bindSimpleProgram(*batch); - DependencyManager::get()->renderSphere(*batch, sphereRadius, 15, 15, + DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->renderSphere(batch, sphereRadius, 15, 15, glm::vec4(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE), true, _voiceSphereID); } @@ -507,14 +507,13 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition, boo } const float DISPLAYNAME_DISTANCE = 20.0f; - setShowDisplayName(renderArgs->_renderMode == RenderArgs::NORMAL_RENDER_MODE && distanceToTarget < DISPLAYNAME_DISTANCE); + setShowDisplayName(distanceToTarget < DISPLAYNAME_DISTANCE); - if (renderArgs->_renderMode != RenderArgs::NORMAL_RENDER_MODE || (isMyAvatar() && - Application::getInstance()->getCamera()->getMode() == CAMERA_MODE_FIRST_PERSON)) { - return; + + auto cameraMode = Application::getInstance()->getCamera()->getMode(); + if (!isMyAvatar() || cameraMode != CAMERA_MODE_FIRST_PERSON) { + renderDisplayName(batch); } - - renderDisplayName(renderArgs); } glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { @@ -654,7 +653,7 @@ float Avatar::getBillboardSize() const { return _scale * BILLBOARD_DISTANCE * tanf(glm::radians(BILLBOARD_FIELD_OF_VIEW / 2.0f)); } -glm::vec3 Avatar::getDisplayNamePosition() { +glm::vec3 Avatar::getDisplayNamePosition() const { glm::vec3 namePosition; if (getSkeletonModel().getNeckPosition(namePosition)) { namePosition += getBodyUpDirection() * getHeadHeight() * 1.1f; @@ -665,7 +664,7 @@ glm::vec3 Avatar::getDisplayNamePosition() { return namePosition; } -float Avatar::calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD) { +float Avatar::calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD) const { // We need to compute the scale factor such as the text remains with fixed size respect to window coordinates // We project a unit vector and check the difference in screen coordinates, to check which is the @@ -710,9 +709,7 @@ float Avatar::calculateDisplayNameScaleFactor(const glm::vec3& textPosition, boo return scaleFactor; } -void Avatar::renderDisplayName(RenderArgs* renderArgs) { - auto batch = renderArgs->_batch; - +void Avatar::renderDisplayName(gpu::Batch& batch) const { bool shouldShowReceiveStats = DependencyManager::get()->shouldShowReceiveStats() && !isMyAvatar(); if ((_displayName.isEmpty() && !shouldShowReceiveStats) || _displayNameAlpha == 0.0f) { @@ -738,7 +735,6 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { // optionally render timing stats for this avatar with the display name QString renderedDisplayName = _displayName; - QRect nameDynamicRect = _displayNameBoundingRect; if (shouldShowReceiveStats) { float kilobitsPerSecond = getAverageBytesReceivedPerSecond() / (float) BYTES_PER_KILOBIT; @@ -750,11 +746,10 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { QString statsText = statsFormat.arg(QString::number(kilobitsPerSecond, 'f', 2)).arg(getReceiveRate()); renderedDisplayName += statsText; - - glm::vec2 extent = textRenderer(DISPLAYNAME)->computeExtent(renderedDisplayName); - nameDynamicRect = QRect(0, 0, (int)extent.x, (int)extent.y); } - + + glm::vec2 extent = textRenderer(DISPLAYNAME)->computeExtent(renderedDisplayName); + QRect nameDynamicRect = QRect(0, 0, (int)extent.x, (int)extent.y);; int text_x = -nameDynamicRect.width() / 2; int text_y = -nameDynamicRect.height() / 2; @@ -763,26 +758,27 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { int right = left + nameDynamicRect.width(); int bottom = text_y; int top = bottom + nameDynamicRect.height(); - const int border = 8; + const int border = 0.1f * nameDynamicRect.height(); bottom -= border; left -= border; top += border; right += border; + int bevelDistance = 0.1f * (top - bottom); glm::vec4 textColor(0.93f, 0.93f, 0.93f, _displayNameAlpha); glm::vec4 backgroundColor(0.2f, 0.2f, 0.2f, - _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA); + (_displayNameAlpha / DISPLAYNAME_ALPHA) * DISPLAYNAME_BACKGROUND_ALPHA); auto backgroundTransform = textTransform; backgroundTransform.postTranslate(glm::vec3(0.0f, 0.0f, -0.001f)); - batch->setModelTransform(backgroundTransform); - DependencyManager::get()->bindSimpleProgram(*batch); - DependencyManager::get()->renderBevelCornersRect(*batch, left, bottom, right - left, top - bottom, 3, - backgroundColor); + batch.setModelTransform(backgroundTransform); + DependencyManager::get()->bindSimpleProgram(batch); + DependencyManager::get()->renderBevelCornersRect(batch, left, bottom, right - left, top - bottom, + bevelDistance, backgroundColor); QByteArray nameUTF8 = renderedDisplayName.toLocal8Bit(); - batch->setModelTransform(textTransform); - textRenderer(DISPLAYNAME)->draw(*batch, text_x, -text_y, nameUTF8.data(), textColor); + batch.setModelTransform(textTransform); + textRenderer(DISPLAYNAME)->draw(batch, text_x, -text_y, nameUTF8.data(), textColor); } bool Avatar::findRayIntersection(RayIntersectionInfo& intersection) const { @@ -987,13 +983,6 @@ void Avatar::setAttachmentData(const QVector& attachmentData) { } } -void Avatar::setDisplayName(const QString& displayName) { - AvatarData::setDisplayName(displayName); - // FIXME is this a sufficient replacement for tightBoundingRect? - glm::vec2 extent = textRenderer(DISPLAYNAME)->computeExtent(displayName); - _displayNameBoundingRect = QRect(0, 0, (int)extent.x, (int)extent.y); -} - void Avatar::setBillboard(const QByteArray& billboard) { AvatarData::setBillboard(billboard); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 2590808347..6c6082ca33 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -98,6 +98,7 @@ public: //getters bool isInitialized() const { return _initialized; } SkeletonModel& getSkeletonModel() { return _skeletonModel; } + const SkeletonModel& getSkeletonModel() const { return _skeletonModel; } const QVector& getAttachmentModels() const { return _attachmentModels; } glm::vec3 getChestPosition() const; float getScale() const { return _scale; } @@ -131,7 +132,7 @@ public: /// \return whether or not the plane penetrated bool findPlaneCollisions(const glm::vec4& plane, CollisionList& collisions); - virtual bool isMyAvatar() { return false; } + virtual bool isMyAvatar() const { return false; } virtual QVector getJointRotations() const; virtual glm::quat getJointRotation(int index) const; @@ -141,7 +142,6 @@ public: virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setAttachmentData(const QVector& attachmentData); - virtual void setDisplayName(const QString& displayName); virtual void setBillboard(const QByteArray& billboard); void setShowDisplayName(bool showDisplayName); @@ -232,10 +232,10 @@ protected: float getSkeletonHeight() const; float getHeadHeight() const; float getPelvisFloatingHeight() const; - glm::vec3 getDisplayNamePosition(); + glm::vec3 getDisplayNamePosition() const; - float calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD); - void renderDisplayName(RenderArgs* renderArgs); + float calculateDisplayNameScaleFactor(const glm::vec3& textPosition, bool inHMD) const; + void renderDisplayName(gpu::Batch& batch) const; virtual void renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool postLighting, float glowLevel = 0.0f); virtual bool shouldRenderHead(const RenderArgs* renderArgs, const glm::vec3& cameraPosition) const; virtual void fixupModelsInScene(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 7adaf908f4..618184cce8 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -90,7 +90,7 @@ public: void relayDriveKeysToCharacterController(); - bool isMyAvatar() { return true; } + bool isMyAvatar() const { return true; } bool isLookingAtLeftEye(); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index c7ab6dce2e..9a6400ae16 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -52,9 +52,8 @@ AvatarData::AvatarData() : _headData(NULL), _handData(NULL), _faceModelURL("http://invalid.com"), - _displayNameBoundingRect(), - _displayNameTargetAlpha(0.0f), - _displayNameAlpha(0.0f), + _displayNameTargetAlpha(1.0f), + _displayNameAlpha(1.0f), _billboard(), _errorLogExpiry(0), _owningAvatarMixer(), diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 2a452f8510..c482f52bf1 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -163,7 +163,7 @@ public: AvatarData(); virtual ~AvatarData(); - virtual bool isMyAvatar() { return false; } + virtual bool isMyAvatar() const { return false; } const QUuid& getSessionUUID() const { return _sessionUUID; } @@ -378,7 +378,6 @@ protected: QVector _attachmentData; QString _displayName; - QRect _displayNameBoundingRect; float _displayNameTargetAlpha; float _displayNameAlpha;