From 66ed8dc0531c7472485162fdbddc1e8edea6b148 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 11 Dec 2015 14:51:14 -0800 Subject: [PATCH 1/9] Add AssignmentParentFinder to Agent --- assignment-client/src/Agent.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 46fa8c8181..f4c4ffaf99 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -37,6 +37,7 @@ #include // TODO: consider moving to scriptengine.h #include "avatars/ScriptableAvatar.h" +#include "entities/AssignmentParentFinder.h" #include "RecordingScriptingInterface.h" #include "AbstractAudioInterface.h" @@ -62,6 +63,8 @@ Agent::Agent(ReceivedMessage& message) : connect(assetThread, &QThread::started, assetClient.data(), &AssetClient::init); assetThread->start(); + DependencyManager::registerInheritance(); + DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); @@ -284,6 +287,8 @@ void Agent::executeScript() { entityScriptingInterface->setEntityTree(_entityViewer.getTree()); + DependencyManager::set(_entityViewer.getTree()); + // wire up our additional agent related processing to the update signal QObject::connect(_scriptEngine.get(), &ScriptEngine::update, this, &Agent::processAgentAvatarAndAudio); From 1ddbc15df41ae2efcde373a484c020a008720519 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 11 Dec 2015 17:47:33 -0800 Subject: [PATCH 2/9] Exploring how to solve the mirror fullscreen bug --- interface/src/Application.cpp | 38 +++++++++++++++++++++++++++---- interface/src/avatar/MyAvatar.cpp | 4 ++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2b1644e3ca..e1915d4415 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1273,6 +1273,9 @@ void Application::paintGL() { // Primary rendering pass auto framebufferCache = DependencyManager::get(); const QSize size = framebufferCache->getFrameBufferSize(); + + auto finalFramebuffer = framebufferCache->getFramebuffer(); + { PROFILE_RANGE(__FUNCTION__ "/mainRender"); PerformanceTimer perfTimer("mainRender"); @@ -1326,9 +1329,34 @@ void Application::paintGL() { } displaySide(&renderArgs, _myCamera); renderArgs._context->enableStereo(false); - gpu::doInBatch(renderArgs._context, [](gpu::Batch& batch) { + /* gpu::doInBatch(renderArgs._context, [](gpu::Batch& batch) { batch.setFramebuffer(nullptr); }); + */ + float ratio = ((float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale()); + // Flip the src and destination rect horizontally to do the mirror + auto mirrorRect = glm::ivec4(0, 0, _mirrorViewRect.width() * ratio, _mirrorViewRect.height() * ratio); + auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w); + + auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); + /** + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + batch.setFramebuffer(finalFramebuffer); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.blit(primaryFbo, mirrorRect, finalFramebuffer, mirrorRectDest); + batch.setFramebuffer(nullptr); + }); + */ + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + gpu::Vec4i rect; + rect.z = size.width(); + rect.w = size.height(); + batch.setFramebuffer(finalFramebuffer); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.blit(primaryFbo, rect, finalFramebuffer, rect); + // batch.setFramebuffer(nullptr); + }); + } // Overlay Composition, needs to occur after screen space effects have completed @@ -1336,7 +1364,8 @@ void Application::paintGL() { { PROFILE_RANGE(__FUNCTION__ "/compositor"); PerformanceTimer perfTimer("compositor"); - auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); + // auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); + auto primaryFbo = finalFramebuffer; glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFbo)); if (displayPlugin->isStereo()) { QRect currentViewport(QPoint(0, 0), QSize(size.width() / 2, size.height())); @@ -1361,7 +1390,8 @@ void Application::paintGL() { { PROFILE_RANGE(__FUNCTION__ "/pluginOutput"); PerformanceTimer perfTimer("pluginOutput"); - auto primaryFramebuffer = framebufferCache->getPrimaryFramebuffer(); + auto scratchFramebuffer = finalFramebuffer; + /* auto primaryFramebuffer = framebufferCache->getPrimaryFramebuffer(); auto scratchFramebuffer = framebufferCache->getFramebuffer(); gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { gpu::Vec4i rect; @@ -1371,7 +1401,7 @@ void Application::paintGL() { batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); batch.blit(primaryFramebuffer, rect, scratchFramebuffer, rect); batch.setFramebuffer(nullptr); - }); + });*/ auto finalTexturePointer = scratchFramebuffer->getRenderBuffer(0); GLuint finalTexture = gpu::GLBackend::getTextureID(finalTexturePointer); Q_ASSERT(0 != finalTexture); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b3f6b4c238..5010b67af6 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1402,10 +1402,10 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; //Invert yaw and roll when in mirror mode - if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { YAW(euler) *= -1.0f; ROLL(euler) *= -1.0f; - } + }*/ Head* head = getHead(); head->setBaseYaw(YAW(euler)); From 6288e99798751d3b98a5f161447e33c5cd5c4193 Mon Sep 17 00:00:00 2001 From: Sam Cake Date: Fri, 11 Dec 2015 23:28:04 -0800 Subject: [PATCH 3/9] Playing with mirror --- interface/src/Application.cpp | 44 +++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e1915d4415..93dbf3fead 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1339,23 +1339,33 @@ void Application::paintGL() { auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w); auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); - /** - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - batch.setFramebuffer(finalFramebuffer); - batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - batch.blit(primaryFbo, mirrorRect, finalFramebuffer, mirrorRectDest); - batch.setFramebuffer(nullptr); - }); - */ - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - gpu::Vec4i rect; - rect.z = size.width(); - rect.w = size.height(); - batch.setFramebuffer(finalFramebuffer); - batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - batch.blit(primaryFbo, rect, finalFramebuffer, rect); - // batch.setFramebuffer(nullptr); - }); + + if (renderArgs._renderMode == RenderArgs::MIRROR_RENDER_MODE) { + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + gpu::Vec4i srcRect; + srcRect.z = size.width(); + srcRect.w = size.height(); + gpu::Vec4i destRect; + destRect.x = size.width(); + destRect.y = 0; + destRect.z = 0; + destRect.w = size.height(); + batch.setFramebuffer(finalFramebuffer); + // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); + // batch.setFramebuffer(nullptr); + }); + } else { + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + gpu::Vec4i rect; + rect.z = size.width(); + rect.w = size.height(); + batch.setFramebuffer(finalFramebuffer); + // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + batch.blit(primaryFbo, rect, finalFramebuffer, rect); + // batch.setFramebuffer(nullptr); + }); + } } From be058398a2477cfe7ee0c7a67faccc47aaaeeb14 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Sun, 13 Dec 2015 12:02:39 -0800 Subject: [PATCH 4/9] remove blue sphere while speaking --- interface/src/Menu.cpp | 3 --- interface/src/Menu.h | 1 - interface/src/avatar/Avatar.cpp | 33 --------------------------------- 3 files changed, 37 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index b03e223c07..b965607b39 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -261,9 +261,6 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::NamesAboveHeads, 0, true, NULL, NULL, UNSPECIFIED_POSITION, "Advanced"); - addCheckableActionToQMenuAndActionHash(avatarMenu, MenuOption::BlueSpeechSphere, 0, true, - NULL, NULL, UNSPECIFIED_POSITION, "Advanced"); - MenuWrapper* viewMenu = addMenu("View"); addActionToQMenuAndActionHash(viewMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches()), QAction::NoRole, UNSPECIFIED_POSITION, "Advanced"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index d6047bf711..13618d1808 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -168,7 +168,6 @@ namespace MenuOption { const QString Back = "Back"; const QString BandwidthDetails = "Bandwidth Details"; const QString BinaryEyelidControl = "Binary Eyelid Control"; - const QString BlueSpeechSphere = "Blue Sphere While Speaking"; const QString BookmarkLocation = "Bookmark Location"; const QString Bookmarks = "Bookmarks"; const QString CachesSize = "RAM Caches Size"; diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 218d679898..42fc023013 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -495,39 +495,6 @@ void Avatar::render(RenderArgs* renderArgs, const glm::vec3& cameraPosition) { } } } - - // quick check before falling into the code below: - // (a 10 degree breadth of an almost 2 meter avatar kicks in at about 12m) - const float MIN_VOICE_SPHERE_DISTANCE = 12.0f; - if (Menu::getInstance()->isOptionChecked(MenuOption::BlueSpeechSphere) - && distanceToTarget > MIN_VOICE_SPHERE_DISTANCE) { - PROFILE_RANGE_BATCH(batch, __FUNCTION__":renderVoiceSphere"); - - // render voice intensity sphere for avatars that are farther away - const float MAX_SPHERE_ANGLE = 10.0f * RADIANS_PER_DEGREE; - const float MIN_SPHERE_ANGLE = 0.5f * RADIANS_PER_DEGREE; - const float MIN_SPHERE_SIZE = 0.01f; - const float SPHERE_LOUDNESS_SCALING = 0.0005f; - const float SPHERE_COLOR[] = { 0.5f, 0.8f, 0.8f }; - float height = getSkeletonHeight(); - glm::vec3 delta = height * (getHead()->getCameraOrientation() * IDENTITY_UP) / 2.0f; - float angle = abs(angleBetween(toTarget + delta, toTarget - delta)); - float sphereRadius = getHead()->getAverageLoudness() * SPHERE_LOUDNESS_SCALING; - - if (renderArgs->_renderMode == RenderArgs::DEFAULT_RENDER_MODE && (sphereRadius > MIN_SPHERE_SIZE) && - (angle < MAX_SPHERE_ANGLE) && (angle > MIN_SPHERE_ANGLE)) { - batch.setModelTransform(Transform()); - - - Transform transform; - transform.setTranslation(getPosition()); - transform.setScale(height); - transform.postScale(sphereRadius); - DependencyManager::get()->renderSolidSphereInstance(batch, - transform, - glm::vec4(SPHERE_COLOR[0], SPHERE_COLOR[1], SPHERE_COLOR[2], 1.0f - angle / MAX_SPHERE_ANGLE)); - } - } } const float DISPLAYNAME_DISTANCE = 20.0f; From e005bb7b5a5c80c7da86ce52514bbe5ddf933997 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Dec 2015 09:25:32 -0800 Subject: [PATCH 5/9] MAybe a mirror solution ? --- interface/src/Application.cpp | 77 ++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 93dbf3fead..fceee76c2c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1333,15 +1333,10 @@ void Application::paintGL() { batch.setFramebuffer(nullptr); }); */ - float ratio = ((float)QApplication::desktop()->windowHandle()->devicePixelRatio() * getRenderResolutionScale()); - // Flip the src and destination rect horizontally to do the mirror - auto mirrorRect = glm::ivec4(0, 0, _mirrorViewRect.width() * ratio, _mirrorViewRect.height() * ratio); - auto mirrorRectDest = glm::ivec4(mirrorRect.z, mirrorRect.y, mirrorRect.x, mirrorRect.w); - auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); if (renderArgs._renderMode == RenderArgs::MIRROR_RENDER_MODE) { - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + if (displayPlugin->isStereo()) { gpu::Vec4i srcRect; srcRect.z = size.width(); srcRect.w = size.height(); @@ -1350,23 +1345,60 @@ void Application::paintGL() { destRect.y = 0; destRect.z = 0; destRect.w = size.height(); - batch.setFramebuffer(finalFramebuffer); - // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); - // batch.setFramebuffer(nullptr); - }); + // batch.setFramebuffer(finalFramebuffer); + // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); + // batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); + + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + gpu::Vec4i srcRectLeft; + srcRectLeft.z = size.width() / 2; + srcRectLeft.w = size.height(); + + gpu::Vec4i srcRectRight; + srcRectRight.x = size.width() / 2; + srcRectRight.z = size.width(); + srcRectRight.w = size.height(); + + gpu::Vec4i destRectLeft; + destRectLeft.x = srcRectLeft.z; + destRectLeft.z = srcRectLeft.x; + destRectLeft.y = srcRectLeft.y; + destRectLeft.w = srcRectLeft.w; + + gpu::Vec4i destRectRight; + destRectRight.x = srcRectRight.z; + destRectRight.z = srcRectRight.x; + destRectRight.y = srcRectRight.y; + destRectRight.w = srcRectRight.w; + + batch.setFramebuffer(finalFramebuffer); + batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f)); + batch.blit(primaryFbo, srcRectLeft, finalFramebuffer, destRectLeft); + // batch.blit(primaryFbo, srcRectRight, finalFramebuffer, destRectRight); + }); + } else { + gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { + gpu::Vec4i srcRect; + srcRect.z = size.width(); + srcRect.w = size.height(); + gpu::Vec4i destRect; + destRect.x = size.width(); + destRect.y = 0; + destRect.z = 0; + destRect.w = size.height(); + batch.setFramebuffer(finalFramebuffer); + batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); + }); + } } else { gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { gpu::Vec4i rect; rect.z = size.width(); rect.w = size.height(); batch.setFramebuffer(finalFramebuffer); - // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); batch.blit(primaryFbo, rect, finalFramebuffer, rect); - // batch.setFramebuffer(nullptr); }); } - } // Overlay Composition, needs to occur after screen space effects have completed @@ -1374,7 +1406,6 @@ void Application::paintGL() { { PROFILE_RANGE(__FUNCTION__ "/compositor"); PerformanceTimer perfTimer("compositor"); - // auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); auto primaryFbo = finalFramebuffer; glBindFramebuffer(GL_DRAW_FRAMEBUFFER, gpu::GLBackend::getFramebufferID(primaryFbo)); if (displayPlugin->isStereo()) { @@ -1400,24 +1431,12 @@ void Application::paintGL() { { PROFILE_RANGE(__FUNCTION__ "/pluginOutput"); PerformanceTimer perfTimer("pluginOutput"); - auto scratchFramebuffer = finalFramebuffer; - /* auto primaryFramebuffer = framebufferCache->getPrimaryFramebuffer(); - auto scratchFramebuffer = framebufferCache->getFramebuffer(); - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { - gpu::Vec4i rect; - rect.z = size.width(); - rect.w = size.height(); - batch.setFramebuffer(scratchFramebuffer); - batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - batch.blit(primaryFramebuffer, rect, scratchFramebuffer, rect); - batch.setFramebuffer(nullptr); - });*/ - auto finalTexturePointer = scratchFramebuffer->getRenderBuffer(0); + auto finalTexturePointer = finalFramebuffer->getRenderBuffer(0); GLuint finalTexture = gpu::GLBackend::getTextureID(finalTexturePointer); Q_ASSERT(0 != finalTexture); Q_ASSERT(!_lockedFramebufferMap.contains(finalTexture)); - _lockedFramebufferMap[finalTexture] = scratchFramebuffer; + _lockedFramebufferMap[finalTexture] = finalFramebuffer; Q_ASSERT(isCurrentContext(_offscreenContext->getContext())); { From 2aad26154e22ebb7e24e2337c0faf3b23112c9e8 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Dec 2015 10:24:51 -0800 Subject: [PATCH 6/9] THis should fix the mirror and the skybox issue --- interface/src/Application.cpp | 5 +++-- interface/src/avatar/MyAvatar.cpp | 4 ++-- .../src/procedural/ProceduralSkybox.cpp | 3 --- .../src/procedural/ProceduralSkybox.slv | 15 ++++++++++----- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fceee76c2c..a824010f00 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1373,8 +1373,9 @@ void Application::paintGL() { batch.setFramebuffer(finalFramebuffer); batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f)); - batch.blit(primaryFbo, srcRectLeft, finalFramebuffer, destRectLeft); - // batch.blit(primaryFbo, srcRectRight, finalFramebuffer, destRectRight); + // BLit left to right and right to left in stereo + batch.blit(primaryFbo, srcRectRight, finalFramebuffer, destRectLeft); + batch.blit(primaryFbo, srcRectLeft, finalFramebuffer, destRectRight); }); } else { gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5010b67af6..b3f6b4c238 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1402,10 +1402,10 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; //Invert yaw and roll when in mirror mode - /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { YAW(euler) *= -1.0f; ROLL(euler) *= -1.0f; - }*/ + } Head* head = getHead(); head->setBaseYaw(YAW(euler)); diff --git a/libraries/procedural/src/procedural/ProceduralSkybox.cpp b/libraries/procedural/src/procedural/ProceduralSkybox.cpp index 68645045b4..ce6f29c3d5 100644 --- a/libraries/procedural/src/procedural/ProceduralSkybox.cpp +++ b/libraries/procedural/src/procedural/ProceduralSkybox.cpp @@ -47,9 +47,6 @@ void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, Skybox::render(batch, viewFrustum, skybox); } - static gpu::BufferPointer theBuffer; - static gpu::Stream::FormatPointer theFormat; - if (skybox._procedural && skybox._procedural->_enabled && skybox._procedural->ready()) { glm::mat4 projMat; viewFrustum.evalProjectionMatrix(projMat); diff --git a/libraries/procedural/src/procedural/ProceduralSkybox.slv b/libraries/procedural/src/procedural/ProceduralSkybox.slv index d1b9a20a66..810afb1033 100644 --- a/libraries/procedural/src/procedural/ProceduralSkybox.slv +++ b/libraries/procedural/src/procedural/ProceduralSkybox.slv @@ -11,21 +11,26 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // - -<@include gpu/Inputs.slh@> - <@include gpu/Transform.slh@> <$declareStandardTransform()$> out vec3 _normal; -void main(void) { +void main(void) { + const float depth = 0.0; + const vec4 UNIT_QUAD[4] = vec4[4]( + vec4(-1.0, -1.0, depth, 1.0), + vec4(1.0, -1.0, depth, 1.0), + vec4(-1.0, 1.0, depth, 1.0), + vec4(1.0, 1.0, depth, 1.0) + ); + vec4 inPosition = UNIT_QUAD[gl_VertexID]; + // standard transform TransformCamera cam = getTransformCamera(); vec3 clipDir = vec3(inPosition.xy, 0.0); vec3 eyeDir; - <$transformClipToEyeDir(cam, clipDir, eyeDir)$> <$transformEyeToWorldDir(cam, eyeDir, _normal)$> From ed2d45d0b6d524e5afd9755ec7a7b6416daf910f Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Dec 2015 16:18:44 -0800 Subject: [PATCH 7/9] HMD Mirror looks correct --- interface/src/Application.cpp | 23 +++++++++++++++---- interface/src/avatar/MyAvatar.cpp | 12 +++++----- .../src/procedural/ProceduralSkybox.cpp | 10 -------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b5c468926e..0e83e92b1d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1231,15 +1231,28 @@ void Application::paintGL() { } } else if (_myCamera.getMode() == CAMERA_MODE_MIRROR) { if (isHMDMode()) { + auto mirrorBodyOrientation = myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)); + glm::quat hmdRotation = extractRotation(myAvatar->getHMDSensorMatrix()); - _myCamera.setRotation(myAvatar->getWorldAlignedOrientation() - * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f)) * hmdRotation); + // Mirror HMD yaw and roll + glm::vec3 mirrorHmdEulers = glm::eulerAngles(hmdRotation); + mirrorHmdEulers.y = -mirrorHmdEulers.y; + mirrorHmdEulers.z = -mirrorHmdEulers.z; + glm::quat mirrorHmdRotation = glm::quat(mirrorHmdEulers); + + glm::quat worldMirrorRotation = mirrorBodyOrientation * mirrorHmdRotation; + + _myCamera.setRotation(worldMirrorRotation); + glm::vec3 hmdOffset = extractTranslation(myAvatar->getHMDSensorMatrix()); + // Mirror HMD lateral offsets + hmdOffset.x = -hmdOffset.x; + _myCamera.setPosition(myAvatar->getDefaultEyePosition() + glm::vec3(0, _raiseMirror * myAvatar->getAvatarScale(), 0) - + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, _rotateMirror, 0.0f))) * - glm::vec3(0.0f, 0.0f, -1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror - + (myAvatar->getOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))) * hmdOffset); + + mirrorBodyOrientation * glm::vec3(0.0f, 0.0f, 1.0f) * MIRROR_FULLSCREEN_DISTANCE * _scaleMirror + + mirrorBodyOrientation * hmdOffset); + } else { _myCamera.setRotation(myAvatar->getWorldAlignedOrientation() * glm::quat(glm::vec3(0.0f, PI + _rotateMirror, 0.0f))); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index b3f6b4c238..db041e3e6d 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -441,14 +441,14 @@ void MyAvatar::updateFromTrackers(float deltaTime) { estimatedPosition = tracker->getHeadTranslation(); _trackedHeadPosition = estimatedPosition; estimatedRotation = glm::degrees(safeEulerAngles(tracker->getHeadRotation())); - if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { // Invert yaw and roll when in mirror mode // NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror // it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to // match your body movements. YAW(estimatedRotation) *= -1.0f; ROLL(estimatedRotation) *= -1.0f; - } + }*/ } // Rotate the body if the head is turned beyond the screen @@ -493,9 +493,9 @@ void MyAvatar::updateFromTrackers(float deltaTime) { // NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror // it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to // match your body movements. - if ((inHmd || inFacetracker) && qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + /* if ((inHmd || inFacetracker) && qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { relativePosition.x = -relativePosition.x; - } + }*/ const float MAX_LEAN = 45.0f; head->setLeanSideways(glm::clamp(glm::degrees(atanf(relativePosition.x * _leanScale / TORSO_LENGTH)), @@ -1402,10 +1402,10 @@ void MyAvatar::updateOrientation(float deltaTime) { glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; //Invert yaw and roll when in mirror mode - if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { + /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { YAW(euler) *= -1.0f; ROLL(euler) *= -1.0f; - } + }*/ Head* head = getHead(); head->setBaseYaw(YAW(euler)); diff --git a/libraries/procedural/src/procedural/ProceduralSkybox.cpp b/libraries/procedural/src/procedural/ProceduralSkybox.cpp index 78121ef735..ce6f29c3d5 100644 --- a/libraries/procedural/src/procedural/ProceduralSkybox.cpp +++ b/libraries/procedural/src/procedural/ProceduralSkybox.cpp @@ -48,14 +48,6 @@ void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, } if (skybox._procedural && skybox._procedural->_enabled && skybox._procedural->ready()) { - if (!theBuffer) { - const float CLIP = 1.0f; - const glm::vec2 vertices[4] = { { -CLIP, -CLIP }, { CLIP, -CLIP }, { -CLIP, CLIP }, { CLIP, CLIP } }; - theBuffer = std::make_shared(sizeof(vertices), (const gpu::Byte*) vertices); - theFormat = std::make_shared(); - theFormat->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::XYZ)); - } - glm::mat4 projMat; viewFrustum.evalProjectionMatrix(projMat); @@ -64,8 +56,6 @@ void ProceduralSkybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, batch.setProjectionTransform(projMat); batch.setViewTransform(viewTransform); batch.setModelTransform(Transform()); // only for Mac - batch.setInputBuffer(gpu::Stream::POSITION, theBuffer, 0, 8); - batch.setInputFormat(theFormat); if (skybox.getCubemap() && skybox.getCubemap()->isDefined()) { batch.setResourceTexture(0, skybox.getCubemap()); From 9f1f0798cb2f38b17dfa0aa50ab1abe152e9eca5 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Dec 2015 17:04:26 -0800 Subject: [PATCH 8/9] cleaning up the code --- interface/src/Application.cpp | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0e83e92b1d..2aa1a5ee96 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1287,6 +1287,7 @@ void Application::paintGL() { auto framebufferCache = DependencyManager::get(); const QSize size = framebufferCache->getFrameBufferSize(); + // Final framebuffer that will be handled to the display-plugin auto finalFramebuffer = framebufferCache->getFramebuffer(); { @@ -1342,26 +1343,12 @@ void Application::paintGL() { } displaySide(&renderArgs, _myCamera); renderArgs._context->enableStereo(false); - /* gpu::doInBatch(renderArgs._context, [](gpu::Batch& batch) { - batch.setFramebuffer(nullptr); - }); - */ + + // Blit primary to final FBO auto primaryFbo = framebufferCache->getPrimaryFramebuffer(); if (renderArgs._renderMode == RenderArgs::MIRROR_RENDER_MODE) { if (displayPlugin->isStereo()) { - gpu::Vec4i srcRect; - srcRect.z = size.width(); - srcRect.w = size.height(); - gpu::Vec4i destRect; - destRect.x = size.width(); - destRect.y = 0; - destRect.z = 0; - destRect.w = size.height(); - // batch.setFramebuffer(finalFramebuffer); - // batch.clearColorFramebuffer(gpu::Framebuffer::BUFFER_COLOR0, glm::vec4(0.0f, 0.0f, 0.0f, 0.0f)); - // batch.blit(primaryFbo, srcRect, finalFramebuffer, destRect); - gpu::doInBatch(renderArgs._context, [=](gpu::Batch& batch) { gpu::Vec4i srcRectLeft; srcRectLeft.z = size.width() / 2; From 571ccb3c206e040eb27c82c7b2293f5ec0575b6f Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 14 Dec 2015 17:14:45 -0800 Subject: [PATCH 9/9] cleaning up the code --- interface/src/avatar/MyAvatar.cpp | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index db041e3e6d..cd761f8cd2 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -441,14 +441,6 @@ void MyAvatar::updateFromTrackers(float deltaTime) { estimatedPosition = tracker->getHeadTranslation(); _trackedHeadPosition = estimatedPosition; estimatedRotation = glm::degrees(safeEulerAngles(tracker->getHeadRotation())); - /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { - // Invert yaw and roll when in mirror mode - // NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror - // it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to - // match your body movements. - YAW(estimatedRotation) *= -1.0f; - ROLL(estimatedRotation) *= -1.0f; - }*/ } // Rotate the body if the head is turned beyond the screen @@ -489,14 +481,6 @@ void MyAvatar::updateFromTrackers(float deltaTime) { const float TORSO_LENGTH = 0.5f; glm::vec3 relativePosition = estimatedPosition - glm::vec3(0.0f, -TORSO_LENGTH, 0.0f); - // Invert left/right lean when in mirror mode - // NOTE: this is kinda a hack, it's the same hack we use to make the head tilt. But it's not really a mirror - // it just makes you feel like you're looking in a mirror because the body movements of the avatar appear to - // match your body movements. - /* if ((inHmd || inFacetracker) && qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { - relativePosition.x = -relativePosition.x; - }*/ - const float MAX_LEAN = 45.0f; head->setLeanSideways(glm::clamp(glm::degrees(atanf(relativePosition.x * _leanScale / TORSO_LENGTH)), -MAX_LEAN, MAX_LEAN)); @@ -1401,12 +1385,6 @@ void MyAvatar::updateOrientation(float deltaTime) { // ... so they need to be converted to degrees before we do math... glm::vec3 euler = glm::eulerAngles(localOrientation) * DEGREES_PER_RADIAN; - //Invert yaw and roll when in mirror mode - /* if (qApp->getCamera()->getMode() == CAMERA_MODE_MIRROR) { - YAW(euler) *= -1.0f; - ROLL(euler) *= -1.0f; - }*/ - Head* head = getHead(); head->setBaseYaw(YAW(euler)); head->setBasePitch(PITCH(euler));