From 2bee021a66e851a1074c448d82eb102797cadcdf Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 15:26:17 +0200 Subject: [PATCH 1/6] Fix Avatar display names --- interface/src/avatar/Avatar.cpp | 37 +++++++++++++-------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 095a939036..f403877ae0 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -707,7 +707,7 @@ float Avatar::calculateDisplayNameScaleFactor(const glm::vec3& textPosition, boo void Avatar::renderDisplayName(RenderArgs* renderArgs) { auto batch = renderArgs->_batch; - bool shouldShowReceiveStats = DependencyManager::get()->shouldShowReceiveStats(); + bool shouldShowReceiveStats = DependencyManager::get()->shouldShowReceiveStats() && !isMyAvatar(); if ((_displayName.isEmpty() && !shouldShowReceiveStats) || _displayNameAlpha == 0.0f) { return; @@ -718,27 +718,16 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { glm::vec3 textPosition = getDisplayNamePosition(); - // we need "always facing camera": we must remove the camera rotation from the stack - glm::vec3 frontAxis(0.0f, 0.0f, 1.0f); - if (inHMD) { - glm::vec3 camPosition = Application::getInstance()->getCamera()->getPosition(); - frontAxis = camPosition - textPosition; - } else { - glm::quat rotation = Application::getInstance()->getCamera()->getRotation(); - frontAxis = glm::rotate(rotation, frontAxis); - } - - frontAxis = glm::normalize(glm::vec3(frontAxis.z, 0.0f, -frontAxis.x)); - float angle = acos(frontAxis.x) * ((frontAxis.z < 0) ? 1.0f : -1.0f); + // we need "always facing camera": we must remove the camera rotation from the stac + glm::quat rotation = Application::getInstance()->getCamera()->getRotation(); // TODO: Fix scaling - at some point this or the text rendering changed in scale. float scaleFactor = calculateDisplayNameScaleFactor(textPosition, inHMD); scaleFactor /= 3.0f; - // TODO: Fix rotation. Currently it causes horizontal stretching, possibly due to a bad view matrix. Transform textTransform; textTransform.setTranslation(textPosition); - //textTransform.setRotation(glm::quat(glm::degrees(angle), glm::vec3(0.0f, 1.0f, 0.0f))); + textTransform.setRotation(rotation); textTransform.setScale(scaleFactor); // optionally render timing stats for this avatar with the display name @@ -780,19 +769,21 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { left -= border; top += border; right += border; - + + 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); + auto backgroundTransform = textTransform; backgroundTransform.postTranslate(glm::vec3(0.0f, 0.0f, -0.001f)); batch->setModelTransform(backgroundTransform); DependencyManager::get()->renderBevelCornersRect(*batch, left, bottom, right - left, top - bottom, 3, - glm::vec4(0.2f, 0.2f, 0.2f, _displayNameAlpha * DISPLAYNAME_BACKGROUND_ALPHA / DISPLAYNAME_ALPHA)); - - glm::vec4 color(0.93f, 0.93f, 0.93f, _displayNameAlpha); - + backgroundColor); QByteArray nameUTF8 = renderedDisplayName.toLocal8Bit(); + //qDebug() << left << right << bottom << top; batch->setModelTransform(textTransform); - textRenderer(DISPLAYNAME)->draw(*batch, text_x, text_y, nameUTF8.data(), color); + textRenderer(DISPLAYNAME)->draw(*batch, text_x, text_y, nameUTF8.data(), textColor); } bool Avatar::findRayIntersection(RayIntersectionInfo& intersection) const { @@ -1095,13 +1086,13 @@ float Avatar::getSkeletonHeight() const { float Avatar::getHeadHeight() const { Extents extents = getHead()->getFaceModel().getMeshExtents(); - if (!extents.isEmpty()) { + if (!extents.isEmpty() && extents.isValid()) { return extents.maximum.y - extents.minimum.y; } extents = _skeletonModel.getMeshExtents(); glm::vec3 neckPosition; - if (!extents.isEmpty() && _skeletonModel.getNeckPosition(neckPosition)) { + if (!extents.isEmpty() && extents.isValid() && _skeletonModel.getNeckPosition(neckPosition)) { return extents.maximum.y / 2.0f - neckPosition.y + _position.y; } From 34bdcebbf6b6a3c3e65f07d922370feff7b260c9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 16:28:15 +0200 Subject: [PATCH 2/6] More display name work --- interface/src/avatar/Avatar.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index f403877ae0..db87cf08e3 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -723,7 +723,7 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { // TODO: Fix scaling - at some point this or the text rendering changed in scale. float scaleFactor = calculateDisplayNameScaleFactor(textPosition, inHMD); - scaleFactor /= 3.0f; + scaleFactor /= 3.5f; Transform textTransform; textTransform.setTranslation(textPosition); @@ -738,31 +738,24 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { float kilobitsPerSecond = getAverageBytesReceivedPerSecond() / (float) BYTES_PER_KILOBIT; QString statsFormat = QString("(%1 Kbps, %2 Hz)"); - if (!renderedDisplayName.isEmpty()) { statsFormat.prepend(" - "); } QString statsText = statsFormat.arg(QString::number(kilobitsPerSecond, 'f', 2)).arg(getReceiveRate()); - glm::vec2 extent = textRenderer(DISPLAYNAME)->computeExtent(statsText); - - // add the extent required for the stats to whatever was calculated for the display name - nameDynamicRect.setWidth(nameDynamicRect.width() + extent.x); - - if (extent.y > nameDynamicRect.height()) { - nameDynamicRect.setHeight(extent.y); - } - renderedDisplayName += statsText; + + glm::vec2 extent = textRenderer(DISPLAYNAME)->computeExtent(renderedDisplayName); + nameDynamicRect = QRect(0, 0, (int)extent.x, (int)extent.y); } int text_x = -nameDynamicRect.width() / 2; int text_y = -nameDynamicRect.height() / 2; // draw a gray background - int left = text_x + nameDynamicRect.x(); + int left = text_x; int right = left + nameDynamicRect.width(); - int bottom = text_y + nameDynamicRect.y(); + int bottom = text_y; int top = bottom + nameDynamicRect.height(); const int border = 8; bottom -= border; @@ -777,13 +770,13 @@ void Avatar::renderDisplayName(RenderArgs* renderArgs) { 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); QByteArray nameUTF8 = renderedDisplayName.toLocal8Bit(); - //qDebug() << left << right << bottom << top; batch->setModelTransform(textTransform); - textRenderer(DISPLAYNAME)->draw(*batch, text_x, text_y, nameUTF8.data(), textColor); + textRenderer(DISPLAYNAME)->draw(*batch, text_x, -text_y, nameUTF8.data(), textColor); } bool Avatar::findRayIntersection(RayIntersectionInfo& intersection) const { From d3eaa4755cfff1a680334321b05bc8cb90273ece Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 16:43:38 +0200 Subject: [PATCH 3/6] Partial fix to billboards --- interface/src/avatar/Avatar.cpp | 38 +++++++++++---------------------- interface/src/avatar/Avatar.h | 2 +- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index db87cf08e3..48e6ec869c 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -537,7 +537,7 @@ void Avatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bool if (_shouldRenderBillboard || !(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { if (postLighting || renderArgs->_renderMode == RenderArgs::SHADOW_RENDER_MODE) { // render the billboard until both models are loaded - renderBillboard(); + renderBillboard(renderArgs); } return; } @@ -591,7 +591,7 @@ void Avatar::updateJointMappings() { // no-op; joint mappings come from skeleton model } -void Avatar::renderBillboard() { +void Avatar::renderBillboard(RenderArgs* renderArgs) { if (_billboard.isEmpty()) { return; } @@ -604,28 +604,21 @@ void Avatar::renderBillboard() { if (!_billboardTexture->isLoaded()) { return; } - - glEnable(GL_ALPHA_TEST); - glAlphaFunc(GL_GREATER, 0.5f); - - glEnable(GL_TEXTURE_2D); - glDisable(GL_LIGHTING); - - glBindTexture(GL_TEXTURE_2D, _billboardTexture->getID()); - - glPushMatrix(); - glTranslatef(_position.x, _position.y, _position.z); - // rotate about vertical to face the camera glm::quat rotation = getOrientation(); glm::vec3 cameraVector = glm::inverse(rotation) * (Application::getInstance()->getCamera()->getPosition() - _position); rotation = rotation * glm::angleAxis(atan2f(-cameraVector.x, -cameraVector.z), glm::vec3(0.0f, 1.0f, 0.0f)); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - + // compute the size from the billboard camera parameters and scale float size = getBillboardSize(); - glScalef(size, size, size); + + gpu::Batch& batch = *renderArgs->_batch; + batch._glBindTexture(GL_TEXTURE_2D, _billboardTexture->getID()); + + Transform transform; + transform.setTranslation(_position); + transform.setRotation(rotation); + transform.setScale(size); glm::vec2 topLeft(-1.0f, -1.0f); glm::vec2 bottomRight(1.0f, 1.0f); @@ -634,14 +627,7 @@ void Avatar::renderBillboard() { DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); - - glPopMatrix(); - - glDisable(GL_TEXTURE_2D); - glEnable(GL_LIGHTING); - glDisable(GL_ALPHA_TEST); - - glBindTexture(GL_TEXTURE_2D, 0); + batch._glBindTexture(GL_TEXTURE_2D, 0); } float Avatar::getBillboardSize() const { diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index e25cd98554..dbc59f7d9c 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -248,7 +248,7 @@ private: bool _shouldRenderBillboard; bool _isLookAtTarget; - void renderBillboard(); + void renderBillboard(RenderArgs* renderArgs); float getBillboardSize() const; From 8eeb5e435c0c58fc6780460158f28ce07d71dc40 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 17:13:37 +0200 Subject: [PATCH 4/6] Enable/Disable texture for avatar billboards --- interface/src/avatar/Avatar.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 48e6ec869c..c0e019a098 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -613,6 +613,7 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { float size = getBillboardSize(); gpu::Batch& batch = *renderArgs->_batch; + batch._glEnable(GL_TEXTURE_2D); batch._glBindTexture(GL_TEXTURE_2D, _billboardTexture->getID()); Transform transform; @@ -628,6 +629,7 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); batch._glBindTexture(GL_TEXTURE_2D, 0); + batch._glDisable(GL_TEXTURE_2D); } float Avatar::getBillboardSize() const { From 31e565868d4657b1d97e5a0c4691416b17251df8 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 17:15:50 +0200 Subject: [PATCH 5/6] Bind simple textured program --- interface/src/avatar/Avatar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c0e019a098..c236158745 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -626,7 +626,8 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { glm::vec2 texCoordTopLeft(0.0f, 0.0f); glm::vec2 texCoordBottomRight(1.0f, 1.0f); - DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, + DependencyManager::get()->bindSimpleProgram(batch, true); + DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); batch._glBindTexture(GL_TEXTURE_2D, 0); batch._glDisable(GL_TEXTURE_2D); From 141d8fa0551cd97b4bc5f7e0a2952fedb90b921c Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 8 Jun 2015 18:55:13 +0200 Subject: [PATCH 6/6] Use setUniformTexture --- interface/src/avatar/Avatar.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c236158745..8708a2b2b0 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -612,10 +612,6 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { // compute the size from the billboard camera parameters and scale float size = getBillboardSize(); - gpu::Batch& batch = *renderArgs->_batch; - batch._glEnable(GL_TEXTURE_2D); - batch._glBindTexture(GL_TEXTURE_2D, _billboardTexture->getID()); - Transform transform; transform.setTranslation(_position); transform.setRotation(rotation); @@ -625,12 +621,12 @@ void Avatar::renderBillboard(RenderArgs* renderArgs) { glm::vec2 bottomRight(1.0f, 1.0f); glm::vec2 texCoordTopLeft(0.0f, 0.0f); glm::vec2 texCoordBottomRight(1.0f, 1.0f); - + + gpu::Batch& batch = *renderArgs->_batch; + batch.setUniformTexture(0, _billboardTexture->getGPUTexture()); DependencyManager::get()->bindSimpleProgram(batch, true); DependencyManager::get()->renderQuad(batch, topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, glm::vec4(1.0f, 1.0f, 1.0f, 1.0f)); - batch._glBindTexture(GL_TEXTURE_2D, 0); - batch._glDisable(GL_TEXTURE_2D); } float Avatar::getBillboardSize() const {