From 19cb20f0cd1301449c36c54428c5cf7999472cb2 Mon Sep 17 00:00:00 2001 From: Jose Carlos Date: Sat, 15 Feb 2014 01:05:21 +0100 Subject: [PATCH] Added rect around the display name with proper size, paying attention to QFontMetrics data Fully wired up the message sending and receiving from server --- interface/src/Menu.cpp | 2 +- interface/src/avatar/Avatar.cpp | 39 +++++++++++++++++++------- interface/src/avatar/AvatarManager.cpp | 9 ++++-- libraries/avatars/src/AvatarData.cpp | 5 ++-- libraries/avatars/src/AvatarData.h | 2 +- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 86ab8d0714..bf98738097 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -782,7 +782,7 @@ void Menu::editPreferences() { skeletonURLEdit->setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString()); form->addRow("Skeleton URL:", skeletonURLEdit); - QString displayNameString = applicationInstance->getAvatar()->getDisplayNameStr(); + QString displayNameString = applicationInstance->getAvatar()->getDisplayName(); QLineEdit* displayNameEdit = new QLineEdit(displayNameString); displayNameEdit->setMinimumWidth(QLINE_MINIMUM_WIDTH); form->addRow("Display name:", displayNameEdit); diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 4c071adf15..837c77b970 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -270,7 +270,7 @@ void Avatar::renderDisplayName() { QString displayName; if (_displayName.isEmpty()) { - displayName = "test string"; + displayName = "test string"; // just for debugging } else { displayName = _displayName; } @@ -278,7 +278,12 @@ void Avatar::renderDisplayName() { glm::vec3 textPosition = getPosition() + getBodyUpDirection() * getHeight(); // Scale is already considered in getHeight glPushMatrix(); glDepthMask(false); + glDisable(GL_LIGHTING); + // Set the correct modelview matrix: set the identity matrix in the rotation part + // [R|t1] = current modelview matrix (the camera rotation and translation) + // [I|t2] = the translation for the text + // We want this final model view matrix: [I | t1 + R*t2] glm::dmat4 modelViewMatrix2; glGetDoublev(GL_MODELVIEW_MATRIX, (GLdouble*)&modelViewMatrix2); glTranslatef(textPosition.x, textPosition.y, textPosition.z); @@ -293,7 +298,7 @@ void Avatar::renderDisplayName() { modelViewMatrix[2][0] = modelViewMatrix[2][1] = 0.0; glLoadMatrixd((GLdouble*)&modelViewMatrix); // Override current matrix with our own - glScalef(1.0, -1.0, 1.0); // TextRenderer::draw paints the text upside down. This fixes that + // We need to compute the scale factor such as the text remains with fixed size respect to window coordinates // We project y = 0 and y = 1 and check the difference in projection coordinates @@ -320,22 +325,36 @@ void Avatar::renderDisplayName() { if (success) { double textWindowHeight = abs(result1[1] - result0[1]); - float textScale = 1.0; - float scaleFactor = 1.0; - if (textWindowHeight > EPSILON) { - scaleFactor = textScale / textWindowHeight; - } + float scaleFactor = (textWindowHeight > EPSILON) ? 1.0f / textWindowHeight : 1.0f; + glScalef(scaleFactor, scaleFactor, 1.0); - glScalef(scaleFactor, scaleFactor, 1.0); + // draw a gray background so that we can actually see what we're typing + QFontMetrics metrics = displayNameTextRenderer()->metrics(); + int bottom = -metrics.descent(), top = bottom + metrics.height(); + int left = -_displayNameWidth/2, right = _displayNameWidth/2; + int border = 5; + bottom -= border; + left -= border; + top += border; + right += border; - glColor3f((GLfloat)0.93, (GLfloat)0.93, (GLfloat)0.93); + glColor3f(0.2f, 0.2f, 0.2f); + glBegin(GL_QUADS); + glVertex2f(left, bottom); + glVertex2f(right, bottom); + glVertex2f(right, top); + glVertex2f(left, top); + glEnd(); - // TextRenderer, based on QT opengl text rendering functions + glScalef(1.0f, -1.0f, 1.0f); // TextRenderer::draw paints the text upside down in y axis + glColor3f(0.93f, 0.93f, 0.93f); + QByteArray ba = displayName.toLocal8Bit(); const char *text = ba.data(); displayNameTextRenderer()->draw(-_displayNameWidth/2.0, 0, text); } + glEnable(GL_LIGHTING); glDepthMask(true); glPopMatrix(); } diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 551734666f..026a5d6291 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -187,8 +187,9 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet) { while (!identityStream.atEnd()) { QUrl faceMeshURL, skeletonURL; - identityStream >> nodeUUID >> faceMeshURL >> skeletonURL; - + QString displayName; + identityStream >> nodeUUID >> faceMeshURL >> skeletonURL >> displayName; + // mesh URL for a UUID, find avatar in our list AvatarSharedPointer matchingAvatar = _avatarHash.value(nodeUUID); if (matchingAvatar) { @@ -201,6 +202,10 @@ void AvatarManager::processAvatarIdentityPacket(const QByteArray &packet) { if (avatar->getSkeletonModelURL() != skeletonURL) { avatar->setSkeletonModelURL(skeletonURL); } + + if (avatar->getDisplayName() != displayName) { + avatar->setDisplayName(displayName); + } } } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 3cb5a6f0b1..548129b871 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -300,7 +300,7 @@ bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray &packet) { QByteArray AvatarData::identityByteArray() { QByteArray identityData; QDataStream identityStream(&identityData, QIODevice::Append); - + identityStream << QUuid() << _faceModelURL << _skeletonModelURL << _displayName; return identityData; @@ -319,8 +319,9 @@ void AvatarData::setSkeletonModelURL(const QUrl& skeletonModelURL) { } void AvatarData::setDisplayName(const QString& displayName) { - qDebug() << "Changing display name for avatar to" << displayName; _displayName = displayName; + + qDebug() << "Changing display name for avatar to" << displayName; } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 01cfa6dd58..f5d9da2447 100755 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -148,7 +148,7 @@ public: const QUrl& getFaceModelURL() const { return _faceModelURL; } const QUrl& getSkeletonModelURL() const { return _skeletonModelURL; } - const QString& getDisplayNameStr() const { return _displayName; } + const QString& getDisplayName() const { return _displayName; } virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); virtual void setDisplayName(const QString& displayName);