From aeb424cd715cab75754d3f8ccd1d5605e613ab8c Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 22 Sep 2014 15:01:39 -0700 Subject: [PATCH] Fix for billboards. --- interface/src/Application.cpp | 7 ++-- interface/src/avatar/Avatar.cpp | 70 +++++++++++++++++-------------- interface/src/avatar/Avatar.h | 2 +- interface/src/avatar/Head.cpp | 2 - interface/src/avatar/MyAvatar.cpp | 36 +++++++++------- interface/src/avatar/MyAvatar.h | 2 +- 6 files changed, 65 insertions(+), 54 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e1ee1333ca..bcb732521d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2730,7 +2730,8 @@ void Application::setupWorldLight() { QImage Application::renderAvatarBillboard() { _textureCache.getPrimaryFramebufferObject()->bind(); - glDisable(GL_BLEND); + // the "glow" here causes an alpha of one + Glower glower; const int BILLBOARD_SIZE = 64; renderRearViewMirror(QRect(0, _glWidget->getDeviceHeight() - BILLBOARD_SIZE, BILLBOARD_SIZE, BILLBOARD_SIZE), true); @@ -2738,10 +2739,10 @@ QImage Application::renderAvatarBillboard() { QImage image(BILLBOARD_SIZE, BILLBOARD_SIZE, QImage::Format_ARGB32); glReadPixels(0, 0, BILLBOARD_SIZE, BILLBOARD_SIZE, GL_BGRA, GL_UNSIGNED_BYTE, image.bits()); - glEnable(GL_BLEND); - _textureCache.getPrimaryFramebufferObject()->release(); + image.save("billboard.png"); + return image; } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 8e426b4a4d..6907a82421 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -351,23 +351,23 @@ void Avatar::render(const glm::vec3& cameraPosition, RenderMode renderMode, bool : GLOW_FROM_AVERAGE_LOUDNESS; // render body - if (!postLighting && Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) { - renderBody(renderMode, glowLevel); + if (Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) { + renderBody(renderMode, postLighting, glowLevel); + } - if (renderMode != SHADOW_RENDER_MODE) { - // add local lights - const float BASE_LIGHT_DISTANCE = 2.0f; - const float LIGHT_EXPONENT = 1.0f; - const float LIGHT_CUTOFF = glm::radians(80.0f); - float distance = BASE_LIGHT_DISTANCE * _scale; - glm::vec3 position = glm::mix(_skeletonModel.getTranslation(), getHead()->getFaceModel().getTranslation(), 0.9f); - glm::quat orientation = getOrientation(); - foreach (const AvatarManager::LocalLight& light, Application::getInstance()->getAvatarManager().getLocalLights()) { - glm::vec3 direction = orientation * light.direction; - Application::getInstance()->getDeferredLightingEffect()->addSpotLight(position - direction * distance, - distance * 2.0f, glm::vec3(), light.color, light.color, 1.0f, 0.5f, 0.0f, direction, - LIGHT_EXPONENT, LIGHT_CUTOFF); - } + if (!postLighting && renderMode != SHADOW_RENDER_MODE) { + // add local lights + const float BASE_LIGHT_DISTANCE = 2.0f; + const float LIGHT_EXPONENT = 1.0f; + const float LIGHT_CUTOFF = glm::radians(80.0f); + float distance = BASE_LIGHT_DISTANCE * _scale; + glm::vec3 position = glm::mix(_skeletonModel.getTranslation(), getHead()->getFaceModel().getTranslation(), 0.9f); + glm::quat orientation = getOrientation(); + foreach (const AvatarManager::LocalLight& light, Application::getInstance()->getAvatarManager().getLocalLights()) { + glm::vec3 direction = orientation * light.direction; + Application::getInstance()->getDeferredLightingEffect()->addSpotLight(position - direction * distance, + distance * 2.0f, glm::vec3(), light.color, light.color, 1.0f, 0.5f, 0.0f, direction, + LIGHT_EXPONENT, LIGHT_CUTOFF); } } @@ -499,34 +499,40 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const { return glm::angleAxis(angle * proportion, axis); } -void Avatar::renderBody(RenderMode renderMode, float glowLevel) { +void Avatar::renderBody(RenderMode renderMode, bool postLighting, float glowLevel) { Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; { Glower glower(glowLevel); - if (_shouldRenderBillboard || !(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { + if (_shouldRenderBillboard || !(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable()) && + (postLighting || renderMode == SHADOW_RENDER_MODE)) { // render the billboard until both models are loaded renderBillboard(); return; } - _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(renderMode); - getHand()->render(false, modelRenderMode); + if (postLighting) { + getHand()->render(false, modelRenderMode); + } else { + _skeletonModel.render(1.0f, modelRenderMode); + renderAttachments(renderMode); + } } - getHead()->render(1.0f, modelRenderMode); + if (!postLighting) { + getHead()->render(1.0f, modelRenderMode); - if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { - // Render Hair - glPushMatrix(); - glm::vec3 headPosition = getHead()->getPosition(); - glTranslatef(headPosition.x, headPosition.y, headPosition.z); - const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - _hair.render(); - glPopMatrix(); + if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { + // Render Hair + glPushMatrix(); + glm::vec3 headPosition = getHead()->getPosition(); + glTranslatef(headPosition.x, headPosition.y, headPosition.z); + const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); + glm::vec3 axis = glm::axis(rotation); + glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + _hair.render(); + glPopMatrix(); + } } } diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 2dbd7d5dd6..cbdebc6a48 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -228,7 +228,7 @@ protected: glm::vec3 getDisplayNamePosition(); void renderDisplayName(); - virtual void renderBody(RenderMode renderMode, float glowLevel = 0.0f); + virtual void renderBody(RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); virtual bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void simulateAttachments(float deltaTime); diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index a06a060b7d..93119e6f6f 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -89,8 +89,6 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { } else { _longTermAverageLoudness = glm::mix(_longTermAverageLoudness, _averageLoudness, glm::min(deltaTime / AUDIO_LONG_TERM_AVERAGING_SECS, 1.0f)); } - float deltaLoudness = glm::max(0.0f, _averageLoudness - _longTermAverageLoudness); - //qDebug() << "deltaLoudness: " << deltaLoudness; if (!(_isFaceshiftConnected || billboard)) { // Update eye saccades diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 45ac377dc0..f1c63d44e7 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1096,7 +1096,7 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName, const g Avatar::attach(modelURL, jointName, translation, rotation, scale, allowDuplicates, useSaved); } -void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { +void MyAvatar::renderBody(RenderMode renderMode, bool postLighting, float glowLevel) { if (!(_skeletonModel.isRenderable() && getHead()->getFaceModel().isRenderable())) { return; // wait until both models are loaded } @@ -1104,28 +1104,34 @@ void MyAvatar::renderBody(RenderMode renderMode, float glowLevel) { // Render the body's voxels and head Model::RenderMode modelRenderMode = (renderMode == SHADOW_RENDER_MODE) ? Model::SHADOW_RENDER_MODE : Model::DEFAULT_RENDER_MODE; - _skeletonModel.render(1.0f, modelRenderMode); - renderAttachments(renderMode); + if (!postLighting) { + _skeletonModel.render(1.0f, modelRenderMode); + renderAttachments(renderMode); + } // Render head so long as the camera isn't inside it const Camera *camera = Application::getInstance()->getCamera(); const glm::vec3 cameraPos = camera->getPosition() + (camera->getRotation() * glm::vec3(0.0f, 0.0f, 1.0f)) * camera->getDistance(); if (shouldRenderHead(cameraPos, renderMode)) { - getHead()->render(1.0f, modelRenderMode); + if (!postLighting) { + getHead()->render(1.0f, modelRenderMode); - if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { - // Render Hair - glPushMatrix(); - glm::vec3 headPosition = getHead()->getPosition(); - glTranslatef(headPosition.x, headPosition.y, headPosition.z); - const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - _hair.render(); - glPopMatrix(); + if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { + // Render Hair + glPushMatrix(); + glm::vec3 headPosition = getHead()->getPosition(); + glTranslatef(headPosition.x, headPosition.y, headPosition.z); + const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); + glm::vec3 axis = glm::axis(rotation); + glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + _hair.render(); + glPopMatrix(); + } } } - getHand()->render(true, modelRenderMode); + if (postLighting) { + getHand()->render(true, modelRenderMode); + } } const float RENDER_HEAD_CUTOFF_DISTANCE = 0.50f; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 8f04afff94..b5eb7ee1ff 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -49,7 +49,7 @@ public: void moveWithLean(); void render(const glm::vec3& cameraPosition, RenderMode renderMode = NORMAL_RENDER_MODE, bool postLighting = false); - void renderBody(RenderMode renderMode, float glowLevel = 0.0f); + void renderBody(RenderMode renderMode, bool postLighting, float glowLevel = 0.0f); bool shouldRenderHead(const glm::vec3& cameraPosition, RenderMode renderMode) const; void renderDebugBodyPoints(); void renderHeadMouse(int screenWidth, int screenHeight) const;