From 18ea1d6a855a1e57989c4fd43781b768b41c6d9d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 21 Feb 2014 10:16:06 -0800 Subject: [PATCH] More work on billboards. --- interface/src/Application.cpp | 32 +++++++++++++++++++--------- interface/src/Application.h | 2 +- libraries/shared/src/PacketHeaders.h | 3 ++- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 30a6fb4e74..9ef3fdc76b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -527,7 +527,7 @@ void Application::paintGL() { _glowEffect.render(); if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { - renderRearViewMirror(); + renderRearViewMirror(_mirrorViewRect); } else if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { _rearMirrorTools->render(true); @@ -2679,10 +2679,20 @@ void Application::setupWorldLight() { } QImage Application::renderAvatarBillboard() { - renderRearViewMirror(true); + _textureCache.getPrimaryFramebufferObject()->bind(); + + glDisable(GL_BLEND); + + const int BILLBOARD_SIZE = 128; + renderRearViewMirror(QRect(0, _glWidget->height() - BILLBOARD_SIZE, BILLBOARD_SIZE, BILLBOARD_SIZE), true); + + 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(); - QImage image(_glWidget->width(), _glWidget->height(), QImage::Format_ARGB32); - glReadPixels(0, 0, _glWidget->width(), _glWidget->height(), GL_BGRA, GL_UNSIGNED_BYTE, image.bits()); return image; } @@ -3603,9 +3613,13 @@ void Application::renderCoverageMapsRecursively(CoverageMap* map) { } } -void Application::renderRearViewMirror(bool billboard) { +void Application::renderRearViewMirror(const QRect& region, bool billboard) { bool eyeRelativeCamera = false; - if (_rearMirrorTools->getZoomLevel() == BODY && !billboard) { + if (billboard) { + const float BILLBOARD_DISTANCE = 5.0f; + _mirrorCamera.setDistance(BILLBOARD_DISTANCE * _myAvatar->getScale()); + _mirrorCamera.setTargetPosition(_myAvatar->getPosition()); + } else if (_rearMirrorTools->getZoomLevel() == BODY) { _mirrorCamera.setDistance(MIRROR_REARVIEW_BODY_DISTANCE * _myAvatar->getScale()); _mirrorCamera.setTargetPosition(_myAvatar->getChestPosition()); } else { // HEAD zoom level @@ -3625,10 +3639,8 @@ void Application::renderRearViewMirror(bool billboard) { _mirrorCamera.update(1.0f/_fps); // set the bounds of rear mirror view - glViewport(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(), - _mirrorViewRect.width(), _mirrorViewRect.height()); - glScissor(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(), - _mirrorViewRect.width(), _mirrorViewRect.height()); + glViewport(region.x(), _glWidget->height() - region.y() - region.height(), region.width(), region.height()); + glScissor(region.x(), _glWidget->height() - region.y() - region.height(), region.width(), region.height()); bool updateViewFrustum = false; updateProjectionMatrix(_mirrorCamera, updateViewFrustum); glEnable(GL_SCISSOR_TEST); diff --git a/interface/src/Application.h b/interface/src/Application.h index b35e4b4e08..d7bafc72b1 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -333,7 +333,7 @@ private: void displayStats(); void checkStatsClick(); void toggleStatsExpanded(); - void renderRearViewMirror(bool billboard = false); + void renderRearViewMirror(const QRect& region, bool billboard = false); void renderViewFrustum(ViewFrustum& viewFrustum); void checkBandwidthMeterClick(); diff --git a/libraries/shared/src/PacketHeaders.h b/libraries/shared/src/PacketHeaders.h index c1a5a34114..bb5821dd67 100644 --- a/libraries/shared/src/PacketHeaders.h +++ b/libraries/shared/src/PacketHeaders.h @@ -53,7 +53,8 @@ enum PacketType { PacketTypeParticleErase, PacketTypeParticleAddResponse, PacketTypeMetavoxelData, - PacketTypeAvatarIdentity + PacketTypeAvatarIdentity, + PacketTypeAvatarBillboard }; typedef char PacketVersion;