More work on billboards.

This commit is contained in:
Andrzej Kapolka 2014-02-21 10:16:06 -08:00
parent 0d0e9565ff
commit 18ea1d6a85
3 changed files with 25 additions and 12 deletions

View file

@ -527,7 +527,7 @@ void Application::paintGL() {
_glowEffect.render(); _glowEffect.render();
if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) { if (Menu::getInstance()->isOptionChecked(MenuOption::Mirror)) {
renderRearViewMirror(); renderRearViewMirror(_mirrorViewRect);
} else if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { } else if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) {
_rearMirrorTools->render(true); _rearMirrorTools->render(true);
@ -2679,10 +2679,20 @@ void Application::setupWorldLight() {
} }
QImage Application::renderAvatarBillboard() { 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; 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; 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.setDistance(MIRROR_REARVIEW_BODY_DISTANCE * _myAvatar->getScale());
_mirrorCamera.setTargetPosition(_myAvatar->getChestPosition()); _mirrorCamera.setTargetPosition(_myAvatar->getChestPosition());
} else { // HEAD zoom level } else { // HEAD zoom level
@ -3625,10 +3639,8 @@ void Application::renderRearViewMirror(bool billboard) {
_mirrorCamera.update(1.0f/_fps); _mirrorCamera.update(1.0f/_fps);
// set the bounds of rear mirror view // set the bounds of rear mirror view
glViewport(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(), glViewport(region.x(), _glWidget->height() - region.y() - region.height(), region.width(), region.height());
_mirrorViewRect.width(), _mirrorViewRect.height()); glScissor(region.x(), _glWidget->height() - region.y() - region.height(), region.width(), region.height());
glScissor(_mirrorViewRect.x(), _glWidget->height() - _mirrorViewRect.y() - _mirrorViewRect.height(),
_mirrorViewRect.width(), _mirrorViewRect.height());
bool updateViewFrustum = false; bool updateViewFrustum = false;
updateProjectionMatrix(_mirrorCamera, updateViewFrustum); updateProjectionMatrix(_mirrorCamera, updateViewFrustum);
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);

View file

@ -333,7 +333,7 @@ private:
void displayStats(); void displayStats();
void checkStatsClick(); void checkStatsClick();
void toggleStatsExpanded(); void toggleStatsExpanded();
void renderRearViewMirror(bool billboard = false); void renderRearViewMirror(const QRect& region, bool billboard = false);
void renderViewFrustum(ViewFrustum& viewFrustum); void renderViewFrustum(ViewFrustum& viewFrustum);
void checkBandwidthMeterClick(); void checkBandwidthMeterClick();

View file

@ -53,7 +53,8 @@ enum PacketType {
PacketTypeParticleErase, PacketTypeParticleErase,
PacketTypeParticleAddResponse, PacketTypeParticleAddResponse,
PacketTypeMetavoxelData, PacketTypeMetavoxelData,
PacketTypeAvatarIdentity PacketTypeAvatarIdentity,
PacketTypeAvatarBillboard
}; };
typedef char PacketVersion; typedef char PacketVersion;