From b294b33ac7ecc0c1d19b44f45833b27bd243792d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 5 Jul 2013 18:21:59 -0700 Subject: [PATCH 01/29] Started on ambient occlusion shader. --- .../resources/shaders/ambient_occlusion.frag | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 interface/resources/shaders/ambient_occlusion.frag diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag new file mode 100644 index 0000000000..2f7a322b05 --- /dev/null +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -0,0 +1,34 @@ +#version 120 + +// +// ambient_occlusion.frag +// fragment shader +// +// Created by Andrzej Kapolka on 7/5/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +// the depth texture +uniform sampler2D depth; + +// the distance to the near clip plane +uniform float near; + +// the distance to the far clip plane +uniform float far; + +// the left and bottom edges of the view window +uniform vec2 leftBottom; + +// the right and top edges of the view window +uniform vec2 rightTop; + +// given a texture coordinate, returns the 3D view space coordinate +vec3 texCoordToViewSpace(vec2 texCoord) { + float z = (far * near) / (texture2D(depth, texCoord).r * (far - near) - far); + return vec3(((texCoord * 2.0 - vec2(1.0, 1.0)) * (rightTop - leftBottom) + rightTop + leftBottom) * z / (-2.0 * near), z); +} + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} From 84bb2aa26518430560b66cf2bf366e6aa82016ec Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Sun, 14 Jul 2013 18:21:18 -0700 Subject: [PATCH 02/29] Started on C++ side of SSAO effect. --- .../resources/shaders/ambient_occlusion.frag | 7 +- interface/src/Application.cpp | 2 + interface/src/Application.h | 2 + .../src/renderer/AmbientOcclusionEffect.cpp | 70 +++++++++++++++++++ .../src/renderer/AmbientOcclusionEffect.h | 30 ++++++++ 5 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 interface/src/renderer/AmbientOcclusionEffect.cpp create mode 100644 interface/src/renderer/AmbientOcclusionEffect.h diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag index 2f7a322b05..2707415646 100644 --- a/interface/resources/shaders/ambient_occlusion.frag +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -9,7 +9,7 @@ // // the depth texture -uniform sampler2D depth; +uniform sampler2D depthTexture; // the distance to the near clip plane uniform float near; @@ -25,10 +25,11 @@ uniform vec2 rightTop; // given a texture coordinate, returns the 3D view space coordinate vec3 texCoordToViewSpace(vec2 texCoord) { - float z = (far * near) / (texture2D(depth, texCoord).r * (far - near) - far); + float z = (far * near) / (texture2D(depthTexture, texCoord).r * (far - near) - far); return vec3(((texCoord * 2.0 - vec2(1.0, 1.0)) * (rightTop - leftBottom) + rightTop + leftBottom) * z / (-2.0 * near), z); } void main(void) { - gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); + float depth = texture2D(depthTexture, gl_TexCoord[0].st).r; + gl_FragColor = vec4(depth, depth, depth, 1.0); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 6f70c89f3b..c67590f019 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2463,6 +2463,8 @@ void Application::displaySide(Camera& whichCamera) { // Render the world box if (!_lookingInMirror->isChecked() && _renderStatsOn->isChecked()) { render_world_box(); } + _ambientOcclusionEffect.render(_glWidget->width(), _glWidget->height()); + // brad's frustum for debugging if (_frustumOn->isChecked()) renderViewFrustum(_viewFrustum); diff --git a/interface/src/Application.h b/interface/src/Application.h index c6bbd4eec2..6eaa9ee5ca 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -37,6 +37,7 @@ #include "VoxelSystem.h" #include "PacketHeaders.h" #include "Webcam.h" +#include "renderer/AmbientOcclusionEffect.h" #include "renderer/GeometryCache.h" #include "ui/ChatEntry.h" #include "ToolsPalette.h" @@ -366,6 +367,7 @@ private: int _hmdWarpParamLocation; GeometryCache _geometryCache; + AmbientOcclusionEffect _ambientOcclusionEffect; ParticleSystem _particleSystem; diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp new file mode 100644 index 0000000000..74c25235d8 --- /dev/null +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -0,0 +1,70 @@ +// +// AmbientOcclusionEffect.cpp +// interface +// +// Created by Andrzej Kapolka on 7/14/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#include + +#include "AmbientOcclusionEffect.h" +#include "ProgramObject.h" + +ProgramObject* AmbientOcclusionEffect::_program = 0; + +AmbientOcclusionEffect::AmbientOcclusionEffect() : _depthTextureID(0) { +} + +void AmbientOcclusionEffect::render(int screenWidth, int screenHeight) { + // copy the z buffer into a depth texture + if (_depthTextureID == 0) { + glGenTextures(1, &_depthTextureID); + glBindTexture(GL_TEXTURE_2D, _depthTextureID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, screenWidth, screenHeight, 0); + + } else { + glBindTexture(GL_TEXTURE_2D, _depthTextureID); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, screenWidth, screenHeight); + } + + // now render a full screen quad with that texture + if (_program == 0) { + switchToResourcesParentIfRequired(); + _program = new ProgramObject(); + _program->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); + _program->link(); + + _program->bind(); + _program->setUniformValue("depthTexture", 0); + + } else { + _program->bind(); + } + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex2f(1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex2f(1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex2f(-1.0f, 1.0f); + glEnd(); + + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + _program->release(); + glBindTexture(GL_TEXTURE_2D, 0); +} diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h new file mode 100644 index 0000000000..4c05e348e6 --- /dev/null +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -0,0 +1,30 @@ +// +// AmbientOcclusionEffect.h +// interface +// +// Created by Andrzej Kapolka on 7/14/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __interface__AmbientOcclusionEffect__ +#define __interface__AmbientOcclusionEffect__ + +#include "InterfaceConfig.h" + +class ProgramObject; + +class AmbientOcclusionEffect { +public: + + AmbientOcclusionEffect(); + + void render(int screenWidth, int screenHeight); + +private: + + GLuint _depthTextureID; + + static ProgramObject* _program; +}; + +#endif /* defined(__interface__AmbientOcclusionEffect__) */ From 94e5c8d4a1192b245a65f2482a4452887e184dbc Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 15 Aug 2013 10:10:14 -0700 Subject: [PATCH 03/29] Missed a spot in the merge. --- interface/src/Application.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.h b/interface/src/Application.h index a2db40123f..fbdbbc9ae5 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -32,6 +32,7 @@ #include "Environment.h" #include "PacketHeaders.h" #include "ParticleSystem.h" +#include "PieMenu.h" #include "SerialInterface.h" #include "Stars.h" #include "Swatch.h" @@ -40,13 +41,9 @@ #include "VoxelFade.h" #include "VoxelSystem.h" #include "Webcam.h" -<<<<<<< HEAD -#include "renderer/AmbientOcclusionEffect.h" -======= -#include "PieMenu.h" #include "avatar/Avatar.h" #include "avatar/HandControl.h" ->>>>>>> 8238d0d380944c07a14c5fd42efa1a5d3eb468ed +#include "renderer/AmbientOcclusionEffect.h" #include "renderer/GeometryCache.h" #include "renderer/GlowEffect.h" #include "renderer/TextureCache.h" From 28d306a228d956ceb5373fd981ec7819b9f97570 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 15 Aug 2013 13:10:48 -0700 Subject: [PATCH 04/29] Remove the code here; will be replacing it based on glow effect work. --- interface/src/Application.cpp | 2 +- .../src/renderer/AmbientOcclusionEffect.cpp | 58 +------------------ .../src/renderer/AmbientOcclusionEffect.h | 10 +--- 3 files changed, 4 insertions(+), 66 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0beb7fedd0..4461443287 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3193,7 +3193,7 @@ void Application::displaySide(Camera& whichCamera) { // Render the world box if (!_lookingInMirror->isChecked() && _renderStatsOn->isChecked()) { renderWorldBox(); } - _ambientOcclusionEffect.render(_glWidget->width(), _glWidget->height()); + _ambientOcclusionEffect.render(); // brad's frustum for debugging if (_frustumOn->isChecked()) renderViewFrustum(_viewFrustum); diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 74c25235d8..5aac065647 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -11,60 +11,6 @@ #include "AmbientOcclusionEffect.h" #include "ProgramObject.h" -ProgramObject* AmbientOcclusionEffect::_program = 0; - -AmbientOcclusionEffect::AmbientOcclusionEffect() : _depthTextureID(0) { -} - -void AmbientOcclusionEffect::render(int screenWidth, int screenHeight) { - // copy the z buffer into a depth texture - if (_depthTextureID == 0) { - glGenTextures(1, &_depthTextureID); - glBindTexture(GL_TEXTURE_2D, _depthTextureID); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, screenWidth, screenHeight, 0); - - } else { - glBindTexture(GL_TEXTURE_2D, _depthTextureID); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, screenWidth, screenHeight); - } - - // now render a full screen quad with that texture - if (_program == 0) { - switchToResourcesParentIfRequired(); - _program = new ProgramObject(); - _program->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); - _program->link(); - - _program->bind(); - _program->setUniformValue("depthTexture", 0); - - } else { - _program->bind(); - } - glPushMatrix(); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(-1.0f, -1.0f); - glTexCoord2f(1.0f, 0.0f); - glVertex2f(1.0f, -1.0f); - glTexCoord2f(1.0f, 1.0f); - glVertex2f(1.0f, 1.0f); - glTexCoord2f(0.0f, 1.0f); - glVertex2f(-1.0f, 1.0f); - glEnd(); - - glPopMatrix(); - - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - _program->release(); - glBindTexture(GL_TEXTURE_2D, 0); +void AmbientOcclusionEffect::render() { + } diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index 4c05e348e6..f8e4be4edc 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -16,15 +16,7 @@ class ProgramObject; class AmbientOcclusionEffect { public: - AmbientOcclusionEffect(); - - void render(int screenWidth, int screenHeight); - -private: - - GLuint _depthTextureID; - - static ProgramObject* _program; + void render(); }; #endif /* defined(__interface__AmbientOcclusionEffect__) */ From 3ddab484e0903aa5528ca2fc65d4b5116c571bb0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Thu, 15 Aug 2013 17:52:31 -0700 Subject: [PATCH 05/29] Beginnings of ambient occlusion. Looks like an architectural drawing. --- .../resources/shaders/ambient_occlusion.frag | 11 +++- interface/src/Application.cpp | 1 + .../src/renderer/AmbientOcclusionEffect.cpp | 58 +++++++++++++++++++ .../src/renderer/AmbientOcclusionEffect.h | 13 ++++- interface/src/renderer/GlowEffect.cpp | 16 +---- interface/src/renderer/RenderUtil.cpp | 22 +++++++ interface/src/renderer/RenderUtil.h | 15 +++++ interface/src/renderer/TextureCache.cpp | 27 ++++++++- interface/src/renderer/TextureCache.h | 16 +++++ 9 files changed, 160 insertions(+), 19 deletions(-) create mode 100644 interface/src/renderer/RenderUtil.cpp create mode 100644 interface/src/renderer/RenderUtil.h diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag index 2707415646..b01f7f2db7 100644 --- a/interface/resources/shaders/ambient_occlusion.frag +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -30,6 +30,13 @@ vec3 texCoordToViewSpace(vec2 texCoord) { } void main(void) { - float depth = texture2D(depthTexture, gl_TexCoord[0].st).r; - gl_FragColor = vec4(depth, depth, depth, 1.0); + float ds = dFdx(gl_TexCoord[0].s); + float dt = dFdy(gl_TexCoord[0].t); + vec3 center = texCoordToViewSpace(gl_TexCoord[0].st); + vec3 left = texCoordToViewSpace(gl_TexCoord[0].st - vec2(-ds, 0.0)) - center; + vec3 right = texCoordToViewSpace(gl_TexCoord[0].st - vec2(ds, 0.0)) - center; + vec3 up = texCoordToViewSpace(gl_TexCoord[0].st - vec2(0.0, dt)) - center; + vec3 down = texCoordToViewSpace(gl_TexCoord[0].st - vec2(0.0, -dt)) - center; + float occlusion = 0.5 - (left.z / length(left) + right.z / length(right) + up.z / length(up) + down.z / length(down)) / 8.0; + gl_FragColor = vec4(occlusion, occlusion, occlusion, 0.0); } diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4bf760139d..a701fde1f2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2121,6 +2121,7 @@ void Application::init() { _environment.init(); _glowEffect.init(); + _ambientOcclusionEffect.init(); _handControl.setScreenDimensions(_glWidget->width(), _glWidget->height()); diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 5aac065647..8719350ec8 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -9,8 +9,66 @@ #include #include "AmbientOcclusionEffect.h" +#include "Application.h" +#include "InterfaceConfig.h" #include "ProgramObject.h" +#include "RenderUtil.h" + +void AmbientOcclusionEffect::init() { + switchToResourcesParentIfRequired(); + + _program = new ProgramObject(); + _program->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); + _program->link(); + + _nearLocation = _program->uniformLocation("near"); + _farLocation = _program->uniformLocation("far"); + _leftBottomLocation = _program->uniformLocation("leftBottom"); + _rightTopLocation = _program->uniformLocation("rightTop"); + + _program->bind(); + _program->setUniformValue("depthTexture", 0); + _program->release(); +} void AmbientOcclusionEffect::render() { + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glDisable(GL_BLEND); + //glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + + glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID()); + + float left, right, bottom, top, nearVal, farVal; + glm::vec4 nearClipPlane, farClipPlane; + Application::getInstance()->getViewFrustum()->computeOffAxisFrustum( + left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); + + _program->bind(); + _program->setUniformValue(_nearLocation, nearVal); + _program->setUniformValue(_farLocation, farVal); + _program->setUniformValue(_leftBottomLocation, left, bottom); + _program->setUniformValue(_rightTopLocation, right, top); + + renderFullscreenQuad(); + + _program->release(); + + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glEnable(GL_BLEND); + //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); + glEnable(GL_DEPTH_TEST); + glDepthMask(GL_TRUE); + glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index f8e4be4edc..8fba351827 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -9,14 +9,23 @@ #ifndef __interface__AmbientOcclusionEffect__ #define __interface__AmbientOcclusionEffect__ -#include "InterfaceConfig.h" - class ProgramObject; +/// A screen space ambient occlusion effect. class AmbientOcclusionEffect { public: + void init(); + void render(); + +private: + + ProgramObject* _program; + int _nearLocation; + int _farLocation; + int _leftBottomLocation; + int _rightTopLocation; }; #endif /* defined(__interface__AmbientOcclusionEffect__) */ diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index ce069bc20b..35d1777be3 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -13,6 +13,7 @@ #include "Application.h" #include "GlowEffect.h" #include "ProgramObject.h" +#include "RenderUtil.h" GlowEffect::GlowEffect() : _renderMode(BLUR_ADD_MODE) { } @@ -68,19 +69,6 @@ void GlowEffect::end() { glBlendColor(0.0f, 0.0f, 0.0f, 0.0f); } -static void renderFullscreenQuad() { - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); - glVertex2f(-1.0f, -1.0f); - glTexCoord2f(1.0f, 0.0f); - glVertex2f(1.0f, -1.0f); - glTexCoord2f(1.0f, 1.0f); - glVertex2f(1.0f, 1.0f); - glTexCoord2f(0.0f, 1.0f); - glVertex2f(-1.0f, 1.0f); - glEnd(); -} - void GlowEffect::render() { QOpenGLFramebufferObject* primaryFBO = Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject(); primaryFBO->release(); @@ -95,6 +83,7 @@ void GlowEffect::render() { glDisable(GL_BLEND); glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); if (_isEmpty) { // copy the primary to the screen @@ -210,6 +199,7 @@ void GlowEffect::render() { glEnable(GL_BLEND); glEnable(GL_DEPTH_TEST); + glDepthMask(GL_TRUE); glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/interface/src/renderer/RenderUtil.cpp b/interface/src/renderer/RenderUtil.cpp new file mode 100644 index 0000000000..4b53fb4d12 --- /dev/null +++ b/interface/src/renderer/RenderUtil.cpp @@ -0,0 +1,22 @@ +// +// RenderUtil.cpp +// interface +// +// Created by Andrzej Kapolka on 8/15/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. + +#include "InterfaceConfig.h" +#include "RenderUtil.h" + +void renderFullscreenQuad() { + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex2f(1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex2f(1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex2f(-1.0f, 1.0f); + glEnd(); +} diff --git a/interface/src/renderer/RenderUtil.h b/interface/src/renderer/RenderUtil.h new file mode 100644 index 0000000000..51e31fe260 --- /dev/null +++ b/interface/src/renderer/RenderUtil.h @@ -0,0 +1,15 @@ +// +// RenderUtil.h +// interface +// +// Created by Andrzej Kapolka on 8/15/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +#ifndef __interface__RenderUtil__ +#define __interface__RenderUtil__ + +/// Renders a quad from (-1, -1, 0) to (1, 1, 0) with texture coordinates from (0, 0) to (1, 1). +void renderFullscreenQuad(); + +#endif /* defined(__interface__RenderUtil__) */ diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index d4cc97edbf..5696475487 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -5,6 +5,9 @@ // Created by Andrzej Kapolka on 8/6/13. // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// include this before QGLWidget, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + #include #include @@ -23,6 +26,7 @@ TextureCache::~TextureCache() { } if (_primaryFramebufferObject != NULL) { delete _primaryFramebufferObject; + glDeleteTextures(1, &_primaryDepthTextureID); } if (_secondaryFramebufferObject != NULL) { delete _secondaryFramebufferObject; @@ -60,13 +64,31 @@ GLuint TextureCache::getPermutationNormalTextureID() { QOpenGLFramebufferObject* TextureCache::getPrimaryFramebufferObject() { if (_primaryFramebufferObject == NULL) { - _primaryFramebufferObject = new QOpenGLFramebufferObject(Application::getInstance()->getGLWidget()->size(), - QOpenGLFramebufferObject::Depth); + QSize size = Application::getInstance()->getGLWidget()->size(); + _primaryFramebufferObject = new QOpenGLFramebufferObject(size); Application::getInstance()->getGLWidget()->installEventFilter(this); + + glGenTextures(1, &_primaryDepthTextureID); + glBindTexture(GL_TEXTURE_2D, _primaryDepthTextureID); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.width(), size.height(), + 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D, 0); + + _primaryFramebufferObject->bind(); + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, _primaryDepthTextureID, 0); + _primaryFramebufferObject->release(); } return _primaryFramebufferObject; } +GLuint TextureCache::getPrimaryDepthTextureID() { + // ensure that the primary framebuffer object is initialized before returning the depth texture id + getPrimaryFramebufferObject(); + return _primaryDepthTextureID; +} + QOpenGLFramebufferObject* TextureCache::getSecondaryFramebufferObject() { if (_secondaryFramebufferObject == NULL) { _secondaryFramebufferObject = new QOpenGLFramebufferObject(Application::getInstance()->getGLWidget()->size()); @@ -89,6 +111,7 @@ bool TextureCache::eventFilter(QObject* watched, QEvent* event) { if (_primaryFramebufferObject != NULL && _primaryFramebufferObject->size() != size) { delete _primaryFramebufferObject; _primaryFramebufferObject = NULL; + glDeleteTextures(1, &_primaryDepthTextureID); } if (_secondaryFramebufferObject != NULL && _secondaryFramebufferObject->size() != size) { delete _secondaryFramebufferObject; diff --git a/interface/src/renderer/TextureCache.h b/interface/src/renderer/TextureCache.h index 716f087992..1f2fc96ac5 100644 --- a/interface/src/renderer/TextureCache.h +++ b/interface/src/renderer/TextureCache.h @@ -15,16 +15,31 @@ class QOpenGLFramebufferObject; +/// Stored cached textures, including render-to-texture targets. class TextureCache : public QObject { public: TextureCache(); ~TextureCache(); + /// Returns the ID of the permutation/normal texture used for Perlin noise shader programs. This texture + /// has two lines: the first, a set of random numbers in [0, 255] to be used as permutation offsets, and + /// the second, a set of random unit vectors to be used as noise gradients. GLuint getPermutationNormalTextureID(); + /// Returns a pointer to the primary framebuffer object. This render target includes a depth component, and is + /// used for scene rendering. QOpenGLFramebufferObject* getPrimaryFramebufferObject(); + + /// Returns the ID of the primary framebuffer object's depth texture. This contains the Z buffer used in rendering. + GLuint getPrimaryDepthTextureID(); + + /// Returns a pointer to the secondary framebuffer object, used as an additional render target when performing full + /// screen effects. QOpenGLFramebufferObject* getSecondaryFramebufferObject(); + + /// Returns a pointer to the tertiary framebuffer object, used as an additional render target when performing full + /// screen effects. QOpenGLFramebufferObject* getTertiaryFramebufferObject(); virtual bool eventFilter(QObject* watched, QEvent* event); @@ -34,6 +49,7 @@ private: GLuint _permutationNormalTextureID; QOpenGLFramebufferObject* _primaryFramebufferObject; + GLuint _primaryDepthTextureID; QOpenGLFramebufferObject* _secondaryFramebufferObject; QOpenGLFramebufferObject* _tertiaryFramebufferObject; }; From b41fa1e03ce5045fa13b98f329d6b0b2e0112457 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 16 Aug 2013 17:26:47 -0700 Subject: [PATCH 06/29] Basic ambient occlusion effect up and running; needs tweaking and optimization. --- .../resources/shaders/ambient_occlusion.frag | 42 ++++-- .../resources/shaders/ambient_occlusion.vert | 14 ++ .../resources/shaders/occlusion_blur.frag | 25 ++++ .../src/renderer/AmbientOcclusionEffect.cpp | 126 +++++++++++++----- .../src/renderer/AmbientOcclusionEffect.h | 9 +- interface/src/renderer/GlowEffect.cpp | 2 +- 6 files changed, 177 insertions(+), 41 deletions(-) create mode 100644 interface/resources/shaders/ambient_occlusion.vert create mode 100644 interface/resources/shaders/occlusion_blur.frag diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag index b01f7f2db7..b59c87d797 100644 --- a/interface/resources/shaders/ambient_occlusion.frag +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -11,6 +11,13 @@ // the depth texture uniform sampler2D depthTexture; +// the random rotation texture +uniform sampler2D rotationTexture; + +// the sample kernel containing the unit offset vectors +const int SAMPLE_KERNEL_SIZE = 16; +uniform vec3 sampleKernel[SAMPLE_KERNEL_SIZE]; + // the distance to the near clip plane uniform float near; @@ -23,20 +30,37 @@ uniform vec2 leftBottom; // the right and top edges of the view window uniform vec2 rightTop; +// the radius of the effect +uniform float radius; + +// the scale for the noise texture +uniform vec2 noiseScale; + +// given a texture coordinate, returns the 3D view space z coordinate +float texCoordToViewSpaceZ(vec2 texCoord) { + return (far * near) / (texture2D(depthTexture, texCoord).r * (far - near) - far); +} + // given a texture coordinate, returns the 3D view space coordinate vec3 texCoordToViewSpace(vec2 texCoord) { - float z = (far * near) / (texture2D(depthTexture, texCoord).r * (far - near) - far); + float z = texCoordToViewSpaceZ(texCoord); return vec3(((texCoord * 2.0 - vec2(1.0, 1.0)) * (rightTop - leftBottom) + rightTop + leftBottom) * z / (-2.0 * near), z); } void main(void) { - float ds = dFdx(gl_TexCoord[0].s); - float dt = dFdy(gl_TexCoord[0].t); + vec3 rotationX = texture2D(rotationTexture, gl_TexCoord[0].st * noiseScale).rgb; + vec3 rotationY = normalize(cross(rotationX, vec3(0.0, 0.0, 1.0))); + mat3 rotation = mat3(rotationX, rotationY, cross(rotationX, rotationY)); + vec3 center = texCoordToViewSpace(gl_TexCoord[0].st); - vec3 left = texCoordToViewSpace(gl_TexCoord[0].st - vec2(-ds, 0.0)) - center; - vec3 right = texCoordToViewSpace(gl_TexCoord[0].st - vec2(ds, 0.0)) - center; - vec3 up = texCoordToViewSpace(gl_TexCoord[0].st - vec2(0.0, dt)) - center; - vec3 down = texCoordToViewSpace(gl_TexCoord[0].st - vec2(0.0, -dt)) - center; - float occlusion = 0.5 - (left.z / length(left) + right.z / length(right) + up.z / length(up) + down.z / length(down)) / 8.0; - gl_FragColor = vec4(occlusion, occlusion, occlusion, 0.0); + + float occlusion = 4.0; + for (int i = 0; i < SAMPLE_KERNEL_SIZE; i++) { + vec3 offset = center + rotation * (radius * sampleKernel[i]); + vec4 projected = gl_ProjectionMatrix * vec4(offset, 1.0); + float depth = texCoordToViewSpaceZ(projected.xy * 0.5 / projected.w + vec2(0.5, 0.5)); + occlusion += 1.0 - step(offset.z, depth); // * step(abs(center.z - depth), radius); + } + + gl_FragColor = vec4(occlusion, occlusion, occlusion, 0.0) / 16.0; } diff --git a/interface/resources/shaders/ambient_occlusion.vert b/interface/resources/shaders/ambient_occlusion.vert new file mode 100644 index 0000000000..ca6af718bd --- /dev/null +++ b/interface/resources/shaders/ambient_occlusion.vert @@ -0,0 +1,14 @@ +#version 120 + +// +// ambient_occlusion.vert +// vertex shader +// +// Created by Andrzej Kapolka on 8/16/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +void main(void) { + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_Position = gl_Vertex; +} diff --git a/interface/resources/shaders/occlusion_blur.frag b/interface/resources/shaders/occlusion_blur.frag new file mode 100644 index 0000000000..2ee5eaf2cb --- /dev/null +++ b/interface/resources/shaders/occlusion_blur.frag @@ -0,0 +1,25 @@ +#version 120 + +// +// occlusion_blur.frag +// fragment shader +// +// Created by Andrzej Kapolka on 8/16/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +// the original texture +uniform sampler2D originalTexture; + +void main(void) { + float ds = dFdx(gl_TexCoord[0].s); + float dt = dFdy(gl_TexCoord[0].t); + vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + sum += texture2D(originalTexture, gl_TexCoord[0].st + + vec2(ds, dt) * vec2(-2.0 + float(i), -2.0 + float(j))); + } + } + gl_FragColor = sum / 16.0; +} diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 8719350ec8..83ed2fdbec 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -6,6 +6,13 @@ // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. // +// include this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL +#include "InterfaceConfig.h" + +#include + +#include + #include #include "AmbientOcclusionEffect.h" @@ -14,61 +21,120 @@ #include "ProgramObject.h" #include "RenderUtil.h" +const int ROTATION_WIDTH = 4; +const int ROTATION_HEIGHT = 4; + void AmbientOcclusionEffect::init() { switchToResourcesParentIfRequired(); - _program = new ProgramObject(); - _program->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); - _program->link(); + _occlusionProgram = new ProgramObject(); + _occlusionProgram->addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/ambient_occlusion.vert"); + _occlusionProgram->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); + _occlusionProgram->link(); - _nearLocation = _program->uniformLocation("near"); - _farLocation = _program->uniformLocation("far"); - _leftBottomLocation = _program->uniformLocation("leftBottom"); - _rightTopLocation = _program->uniformLocation("rightTop"); + _blurProgram = new ProgramObject(); + _blurProgram->addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/ambient_occlusion.vert"); + _blurProgram->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/occlusion_blur.frag"); + _blurProgram->link(); - _program->bind(); - _program->setUniformValue("depthTexture", 0); - _program->release(); + _blurProgram->bind(); + _blurProgram->setUniformValue("originalTexture", 0); + _blurProgram->release(); + + // create the sample kernel: an array of spherically distributed offset vectors + const int SAMPLE_KERNEL_SIZE = 16; + QVector3D sampleKernel[SAMPLE_KERNEL_SIZE]; + for (int i = 0; i < SAMPLE_KERNEL_SIZE; i++) { + glm::vec3 vector = glm::ballRand(1.0f); + sampleKernel[i] = QVector3D(vector.x, vector.y, vector.z); + } + + _occlusionProgram->bind(); + _occlusionProgram->setUniformValue("depthTexture", 0); + _occlusionProgram->setUniformValue("rotationTexture", 1); + _occlusionProgram->setUniformValueArray("sampleKernel", sampleKernel, SAMPLE_KERNEL_SIZE); + _occlusionProgram->setUniformValue("radius", 0.1f); + _occlusionProgram->release(); + + _nearLocation = _occlusionProgram->uniformLocation("near"); + _farLocation = _occlusionProgram->uniformLocation("far"); + _leftBottomLocation = _occlusionProgram->uniformLocation("leftBottom"); + _rightTopLocation = _occlusionProgram->uniformLocation("rightTop"); + _noiseScaleLocation = _occlusionProgram->uniformLocation("noiseScale"); + + // generate the random rotation texture + glGenTextures(1, &_rotationTextureID); + glBindTexture(GL_TEXTURE_2D, _rotationTextureID); + const int ELEMENTS_PER_PIXEL = 3; + unsigned char rotationData[ROTATION_WIDTH * ROTATION_HEIGHT * ELEMENTS_PER_PIXEL]; + unsigned char* rotation = rotationData; + for (int i = 0; i < ROTATION_WIDTH * ROTATION_HEIGHT; i++) { + glm::vec3 randvec = glm::sphericalRand(1.0f); + *rotation++ = ((randvec.x + 1.0f) / 2.0f) * 255.0f; + *rotation++ = ((randvec.y + 1.0f) / 2.0f) * 255.0f; + *rotation++ = ((randvec.z + 1.0f) / 2.0f) * 255.0f; + } + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROTATION_WIDTH, ROTATION_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, rotationData); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D, 0); } void AmbientOcclusionEffect::render() { - glPushMatrix(); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glDisable(GL_BLEND); - //glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glBindTexture(GL_TEXTURE_2D, Application::getInstance()->getTextureCache()->getPrimaryDepthTextureID()); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, _rotationTextureID); + + // render with the occlusion shader to the secondary buffer + QOpenGLFramebufferObject* secondaryFBO = Application::getInstance()->getTextureCache()->getSecondaryFramebufferObject(); + secondaryFBO->bind(); + float left, right, bottom, top, nearVal, farVal; glm::vec4 nearClipPlane, farClipPlane; Application::getInstance()->getViewFrustum()->computeOffAxisFrustum( left, right, bottom, top, nearVal, farVal, nearClipPlane, farClipPlane); - _program->bind(); - _program->setUniformValue(_nearLocation, nearVal); - _program->setUniformValue(_farLocation, farVal); - _program->setUniformValue(_leftBottomLocation, left, bottom); - _program->setUniformValue(_rightTopLocation, right, top); + _occlusionProgram->bind(); + _occlusionProgram->setUniformValue(_nearLocation, nearVal); + _occlusionProgram->setUniformValue(_farLocation, farVal); + _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); + _occlusionProgram->setUniformValue(_rightTopLocation, right, top); + QSize size = Application::getInstance()->getGLWidget()->size(); + _occlusionProgram->setUniformValue(_noiseScaleLocation, size.width() / (float)ROTATION_WIDTH, + size.height() / (float)ROTATION_HEIGHT); renderFullscreenQuad(); - _program->release(); + _occlusionProgram->release(); - glPopMatrix(); + secondaryFBO->release(); + + glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE0); + + // now render secondary to primary with 4x4 blur + Application::getInstance()->getTextureCache()->getPrimaryFramebufferObject()->bind(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glEnable(GL_BLEND); - //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); + glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ZERO, GL_ONE); + + glBindTexture(GL_TEXTURE_2D, secondaryFBO->texture()); + + _blurProgram->bind(); + + renderFullscreenQuad(); + + _blurProgram->release(); + + glBindTexture(GL_TEXTURE_2D, 0); + + //glEnable(GL_BLEND); + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); - glBindTexture(GL_TEXTURE_2D, 0); } diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index 8fba351827..4891a6eb2c 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -9,6 +9,8 @@ #ifndef __interface__AmbientOcclusionEffect__ #define __interface__AmbientOcclusionEffect__ +#include "InterfaceConfig.h" + class ProgramObject; /// A screen space ambient occlusion effect. @@ -21,11 +23,16 @@ public: private: - ProgramObject* _program; + ProgramObject* _occlusionProgram; int _nearLocation; int _farLocation; int _leftBottomLocation; int _rightTopLocation; + int _noiseScaleLocation; + + ProgramObject* _blurProgram; + + GLuint _rotationTextureID; }; #endif /* defined(__interface__AmbientOcclusionEffect__) */ diff --git a/interface/src/renderer/GlowEffect.cpp b/interface/src/renderer/GlowEffect.cpp index 35d1777be3..85c4eb27b2 100644 --- a/interface/src/renderer/GlowEffect.cpp +++ b/interface/src/renderer/GlowEffect.cpp @@ -5,7 +5,7 @@ // Created by Andrzej Kapolka on 8/7/13. // Copyright (c) 2013 High Fidelity, Inc. All rights reserved. -// include this before QGLWidget, which includes an earlier version of OpenGL +// include this before QOpenGLFramebufferObject, which includes an earlier version of OpenGL #include "InterfaceConfig.h" #include From e7dab88d69269ac7a778543676a436eae146ba73 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 19 Aug 2013 10:32:56 -0700 Subject: [PATCH 07/29] Square vector lengths to bunch them up towards the center, add a minimum length, include the URL of the SSAO tutorial. --- interface/src/renderer/AmbientOcclusionEffect.cpp | 7 ++++++- interface/src/renderer/AmbientOcclusionEffect.h | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 83ed2fdbec..ff86615b26 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -45,7 +45,12 @@ void AmbientOcclusionEffect::init() { const int SAMPLE_KERNEL_SIZE = 16; QVector3D sampleKernel[SAMPLE_KERNEL_SIZE]; for (int i = 0; i < SAMPLE_KERNEL_SIZE; i++) { - glm::vec3 vector = glm::ballRand(1.0f); + // square the length in order to increase density towards the center + glm::vec3 vector = glm::sphericalRand(1.0f); + float scale = randFloat(); + const float MIN_VECTOR_LENGTH = 0.01f; + const float MAX_VECTOR_LENGTH = 1.0f; + vector *= glm::mix(MIN_VECTOR_LENGTH, MAX_VECTOR_LENGTH, scale * scale); sampleKernel[i] = QVector3D(vector.x, vector.y, vector.z); } diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index 4891a6eb2c..d41bb65381 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -13,7 +13,8 @@ class ProgramObject; -/// A screen space ambient occlusion effect. +/// A screen space ambient occlusion effect. See John Chapman's tutorial at +/// http://john-chapman-graphics.blogspot.co.uk/2013/01/ssao-tutorial.html for reference. class AmbientOcclusionEffect { public: From fe2484ba68d9ef756933c0f6aef799f0b700580d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 19 Aug 2013 11:01:57 -0700 Subject: [PATCH 08/29] Added back the glow mode cycle command that got removed in the menu reshuffle. --- interface/src/Menu.cpp | 8 +++++++- interface/src/Menu.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ee4cd36b16..56317b86a2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -151,6 +151,12 @@ Menu::Menu() : &appInstance->getAvatar()->getHead().getFace(), SLOT(cycleRenderMode())); + addActionToQMenuAndActionHash(renderMenu, + MenuOption::GlowMode, + 0, + appInstance->getGlowEffect(), + SLOT(cycleRenderMode())); + addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::FrameTimer); addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::LookAtVectors); addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::LookAtIndicator, 0, true); @@ -776,4 +782,4 @@ void Menu::updateFrustumRenderModeAction() { frustumRenderModeAction->setText("Render Mode - Keyhole"); break; } -} \ No newline at end of file +} diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 544a6c0faf..2d871fd890 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -137,6 +137,7 @@ namespace MenuOption { const QString FrameTimer = "Show Timer"; const QString FrustumRenderMode = "Render Mode"; const QString Fullscreen = "Fullscreen"; + const QString GlowMode = "Cycle Glow Mode"; const QString ImportVoxels = "Import Voxels"; const QString ImportVoxelsClipboard = "Import Voxels to Clipboard"; const QString IncreaseAvatarSize = "Increase Avatar Size"; From dec4a4c4222bc9d26ec67a60604494ab9fa1f9f9 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 19 Aug 2013 11:45:43 -0700 Subject: [PATCH 09/29] Added toggle for ambient occlusion (defaults to off). --- interface/src/Application.cpp | 5 ++++- interface/src/Menu.cpp | 1 + interface/src/Menu.h | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index dc7fd14d49..47248ecaeb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2378,7 +2378,10 @@ void Application::displaySide(Camera& whichCamera) { renderWorldBox(); } - _ambientOcclusionEffect.render(); + // render the ambient occlusion effect if enabled + if (Menu::getInstance()->isOptionChecked(MenuOption::AmbientOcclusion)) { + _ambientOcclusionEffect.render(); + } // brad's frustum for debugging if (Menu::getInstance()->isOptionChecked(MenuOption::DisplayFrustum)) { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 56317b86a2..d49d322f34 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -157,6 +157,7 @@ Menu::Menu() : appInstance->getGlowEffect(), SLOT(cycleRenderMode())); + addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::AmbientOcclusion); addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::FrameTimer); addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::LookAtVectors); addCheckableActionToQMenuAndActionHash(renderMenu, MenuOption::LookAtIndicator, 0, true); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 2d871fd890..e7ecbcaf79 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -107,6 +107,7 @@ private: namespace MenuOption { + const QString AmbientOcclusion = "Ambient Occlusion"; const QString Avatars = "Avatars"; const QString AvatarAsBalls = "Avatar as Balls"; const QString Atmosphere = "Atmosphere"; From f8cd1380541e3baecbd242bd7e4434b4b4a2a140 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 12:36:50 -0700 Subject: [PATCH 10/29] changes to jobs.groovy to build on OS X --- jenkins/jobs.groovy | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index 24e4779fa1..8c63b3a8f8 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -108,14 +108,34 @@ def targets = [ 'pairing-server':true, 'space-server':true, 'voxel-server':true, - 'interface':false, ] /* setup all of the target jobs to use the above template */ for (target in targets) { - queue hifiJob(target.key, target.value) + queue hifiJob(target.key, target.value) } +/* setup the UNIX and OS X interface builds */ +interfaceUnixJob = hifiJob('interface', false) +interfaceUnixJob.with { + name 'hifi-interface-unix' +} + +queue interfaceUnixJob + +interfaceAppleJob = hifiJob('interface', false) +interfaceAppleJob.with { + name 'hifi-interface-osx' + configure { project -> + project << { + assignedNode 'interface-mini' + canRoam false + } + } +} + +queue interfaceAppleJob + /* setup the parametrized build job for builds from jenkins */ parameterizedJob = hifiJob('$TARGET', true) parameterizedJob.with { From 9ee66288ab9f1964b471bd91168dc4e68efd6549 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 13:09:05 -0700 Subject: [PATCH 11/29] switch to shallow clone for checkouts, os x build from stable --- jenkins/jobs.groovy | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index 8c63b3a8f8..f0e0e732a3 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -10,9 +10,10 @@ def hifiJob(String targetName, Boolean deploy) { scm { git(GIT_REPO_URL, 'master') { node -> - node / includedRegions << "${targetName}/.*\nlibraries/.*" - node / 'userRemoteConfigs' / 'hudson.plugins.git.UserRemoteConfig' / 'name' << '' - node / 'userRemoteConfigs' / 'hudson.plugins.git.UserRemoteConfig' / 'refspec' << '' + node << { + includedRegions "${targetName}/.*\nlibraries/.*" + useShallowClone true + } } } @@ -112,20 +113,23 @@ def targets = [ /* setup all of the target jobs to use the above template */ for (target in targets) { - queue hifiJob(target.key, target.value) + queue hifiJob(target.key, target.value) } -/* setup the UNIX and OS X interface builds */ -interfaceUnixJob = hifiJob('interface', false) -interfaceUnixJob.with { - name 'hifi-interface-unix' -} - -queue interfaceUnixJob - +/* setup the OS X interface builds */ interfaceAppleJob = hifiJob('interface', false) interfaceAppleJob.with { name 'hifi-interface-osx' + + scm { + git(GIT_REPO_URL, 'stable') { node -> + node << { + includedRegions "interface/.*\nlibraries/.*" + useShallowClone true + } + } + } + configure { project -> project << { assignedNode 'interface-mini' From 8d653233456a0a2eeb21e0b90275117c9cfbc84d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 19 Aug 2013 13:14:35 -0700 Subject: [PATCH 12/29] Restore the gyro-only lean behavior based on linear accelerometer data. --- interface/src/avatar/Avatar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 2879c7ded0..02d982a2ca 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -323,6 +323,7 @@ void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, Webcam* webcam = Application::getInstance()->getWebcam(); glm::vec3 estimatedPosition, estimatedRotation; if (gyros->isActive()) { + estimatedPosition = gyros->getEstimatedPosition(); estimatedRotation = gyros->getEstimatedRotation(); } else if (webcam->isActive()) { From d8798b7ed611ae98abf310f2a48bed50c89b2083 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 13:16:16 -0700 Subject: [PATCH 13/29] coalesce interfaceAppleJob name with name of generated job --- jenkins/jobs.groovy | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index f0e0e732a3..c0d5081d5c 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -117,8 +117,8 @@ for (target in targets) { } /* setup the OS X interface builds */ -interfaceAppleJob = hifiJob('interface', false) -interfaceAppleJob.with { +interfaceOSXJob = hifiJob('interface', false) +interfaceOSXJob.with { name 'hifi-interface-osx' scm { @@ -152,7 +152,11 @@ parameterizedJob.with { } scm { git('git@github.com:/$GITHUB_USER/hifi.git', '$GIT_BRANCH') { node -> - node / 'wipeOutWorkspace' << true + node << { + wipeOutWorkspace true + useShallowClone true + } + } } configure { project -> @@ -168,7 +172,11 @@ parameterizedJob.with { doxygenJob = hifiJob('docs', false) doxygenJob.with { scm { - git(GIT_REPO_URL, 'master') {} + git(GIT_REPO_URL, 'master') { node -> + node << { + useShallowClone true + } + } } configure { project -> From 222e0266620a47cb16a225fd96bace72fd0745c6 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 19 Aug 2013 13:18:20 -0700 Subject: [PATCH 14/29] Use a small default lean scale. --- interface/src/avatar/Avatar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 02d982a2ca..7cd3e4d7c8 100755 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -1574,7 +1574,7 @@ void Avatar::loadData(QSettings* settings) { _voxels.setVoxelURL(settings->value("voxelURL").toUrl()); - _leanScale = loadSetting(settings, "leanScale", 0.5f); + _leanScale = loadSetting(settings, "leanScale", 0.05f); _newScale = loadSetting(settings, "scale", 1.0f); setScale(_scale); From 42c69ba77f7990dce8da6a29d66f1dec52ac95bb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 13:19:02 -0700 Subject: [PATCH 15/29] rename missed variable in last commit --- jenkins/jobs.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index c0d5081d5c..ed33f49723 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -138,7 +138,7 @@ interfaceOSXJob.with { } } -queue interfaceAppleJob +queue interfaceOSXJob /* setup the parametrized build job for builds from jenkins */ parameterizedJob = hifiJob('$TARGET', true) From 54d637119fa280aa340887646c3752830367cc76 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 16:05:37 -0700 Subject: [PATCH 16/29] updates required for fervor updater with Qt5 --- interface/CMakeLists.txt | 2 ++ interface/external/fervor/CMakeLists.txt | 4 ++-- .../external/quazip/lib/MacOS/libquazip.a | Bin 230752 -> 224800 bytes 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 2adc7e6643..3930d57a61 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -50,6 +50,8 @@ find_package(Qt5Gui REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5OpenGL REQUIRED) find_package(Qt5Svg REQUIRED) +find_package(Qt5WebKit REQUIRED) +find_package(Qt5Widgets REQUIRED) if (APPLE) # set how the icon shows up in the Info.plist file diff --git a/interface/external/fervor/CMakeLists.txt b/interface/external/fervor/CMakeLists.txt index a8b37ba9d0..9c11f0fb7a 100644 --- a/interface/external/fervor/CMakeLists.txt +++ b/interface/external/fervor/CMakeLists.txt @@ -3,8 +3,8 @@ project(Fervor) find_package(Qt5Core REQUIRED) find_package(Qt5Network REQUIRED) -find_package(Qt5WebKit REQUIRED) find_package(Qt5Widgets REQUIRED) +find_package(Qt5WebKitWidgets REQUIRED) add_definitions(-DFV_GUI) @@ -32,4 +32,4 @@ include_directories( add_library(fervor ${FERVOR_SOURCES} ${FERVOR_HEADERS} ${FERVOR_MOC_SOURCES} ${FERVOR_WRAPPED_UI}) target_link_libraries(fervor ${QUAZIP_LIBRARIES}) -qt5_use_modules(fervor Core Network Widgets WebKit) \ No newline at end of file +qt5_use_modules(fervor Core Network Widgets WebKitWidgets) \ No newline at end of file diff --git a/interface/external/quazip/lib/MacOS/libquazip.a b/interface/external/quazip/lib/MacOS/libquazip.a index 2c7b66f5d19e7688914715e7d24d62b912260c03..6008f9f6122e840def67337c66db9e7806397a98 100644 GIT binary patch literal 224800 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 literal 230752 zcmeFa4R};VmN#CV1n59a2Sp8jMvV@P6HJGIWYig2`a)gl#$W&$M-pOaNRJ_jNngZ| zIIx}8l-C}0l^J$EcGzckcG;bo9o}(ZPy{-NBrvm1Kt&W4oMA+aD1I!7p!EOwRh@hL zb|(R5ci!jyzyJUC^T5feI(6z))u~e-w@%d+H`cb))qi8;Ro?5$N{doI@5JlNyi=|( zn=-MeXi{leQBjeK_Li1TE-x=C@|I7TgwUd*g(GWfCRBYZ=+~yR)NlDn#_n=4#=p+k zRDvU!!Y?N{nV?4S4uTB?qXeHM_zwi1A-J93%LLyf_%6W{1U-~Levs!W!ix!-1Ro?g zhv3I9##k$3KPGrdmcq*jev{xFg2M?OCi=Gtb`xAr@aF{UvKZt4%Gg`O6#RFBKgv<~ zMTFl-a4EsZDBW)f77SPP<&^GP!cS$Z@Eru7B3MuGZ;1XV!A^qTA^1n)?;(00!G}o> z-w4K5U*cll8?NAVg0B$#HNifD7ZH7!@H<8@HsvcW_87sp2#$5D@DT(*q42qcKSTHg z!lx2!rSNNV87nGtu_bN=+Xy~I@V5ltCU}hCg_JIf;0*+CA=sA3*n2m+*tZFOD_7xB zf?EilAUI~Eil0C*NU)LMV+4Oga2LV%2o{V|>8~MpBf;AU))Rc1;BN_zB>DE9!`Qg* zxL9AFf^QOBLvSs{A0;?8U(szPyqjU)43I5`I#@79vi@jT* zU^n512#y%7!m}?>@G62O6h4jcI)dM#@F?N`MDSq>e~s`H1jk>f_yp7;P1lJI}(xd1e zC)i4G7x8(6=yFM(uM?a_u!8D$Ev5U6!uJwBn%d)5g7p+%N%6}leU##VN$^PuZ@Zka z#Q9ll-h~Q2OmGjuF@-ApdV*C18wjo@IC89_;{@9X{+i&Q30``UqPvygKM*`j@Un|l zd_BQ61YaVUdx?slLGS^BYY6Tln0=|DD<-HDY$Et0g53oFOmM_yD%})LTxQ*az z1V12n&($j31cILxE4+D}f=?3sHNpQy@vjixPjDrLR}y~tc$Izz!5V@tim$sy#eaj~ zWdxTK-QN=Y1;HHz8POded3O*zNbxHu{$B{5r0{Q%e7zLTsQg!bl`%Fcn;rWqV^2)U zX7jF9a1z1M1UFNBoZw7?_g~9c_pEI8Yl5#5JVEg0uc`Ro5^N^;PXwPN`27;bcx^WG zOi=Je!cP)BOmNrNRD3q!Um+MIxMl)l9j)2yDuQ0vjF2R$Y-+X884XQ$)iz9PTDmmU z7)cLwrV2FG)i!9$BQ3Ry!=Z*n7U8Xn7q^BeS<{>*WN-79cuT88rlvVfvqH;L0bm*l z*)reS9BPz|@kg2cm!lkmg$+tLaWKlt+Sb;4n_86cw}omKWpb_xISW)3X$dzjfpoKK zmxiV_Ep4uCQ4-YDH8tPY5?)fTN*-!jEVGM*8X8#5{o&?m4WZhW=?%3@S_zd+B_o+!vx8=Z?zKq=4IG?wqNJ?~MN%@|-V%<4^u}~< z&T`emvSei+25NRX0_oHEbYZOK54+GFc?e>m|xSxHU46 z)LTc~Gnn2r2q|R`ft~peDnc4@<>c8$?H%D}Tj;Vug!V2`9RqUO><3CwW(k}r#+gXZ zN{BK?8Cz{B(&})~;!bo*HAKRJ0+w5;s*Jl(|AUA~?J!YQ;H=QSun7J#ZJFX$uELcL zIU**_Mm6eIg=^l4i$amwy84>>P(yR5MGMR11E{8?QPnJIX}VVn4^CUYxFrf^465kYFZT1swUP{O;jzL znZT|Cil~@vRl?~D>!3TEA~?v;Rzyb)=_FM(OHt=eqSjF8?sTH10~oh5kemQGZGRRhSX1|yr7Nj7WBY@>EsOI=1yq(Yt5V27Tj4s4p!SAb1s zmp&DeDmn~PMnQF(PFBXCrL0P)nU{vn@_J_*wKMJyOS|UvwyJ>vQvmI@nU+mc?dhZ} zNB_|#&z3{1KC5E3eyd-0EN>YG^I+4W5TZ0?qXtPD{x7ASBs+?wAx?oNEp9Mc>j#UO zf_^ORWo6y+fhDPsy+*~)9E@O^SF5~!_N{k)Csaq{iZkD7UPnEho{q+mwA5v%2MkhI}5lB9-9?XEdBXQ2zX zRe5RJF;uR4_^f%Q>GjOCny}|avJ0pt%b+L=w^oJjF+z=zaBYKC$7PruSe@W6>>X)o z(^Wh@Dow}Jq6Sg&wD>`_JdFZsp6bRKnw(BqcD9r$6-;B0(!um#TL~+il}TE7{i3Gn zvWus;-k`MUWl?>8FrMip8JaF7@L*hQxo4)AN2-$Er0k-tN@+zNOqZmB-w|%Ep-DPs zp?c=*Q=3y`&0s6#ymio2mYxrw#;89hv^+AcX;G*S^ZZ4jy6H_VQs?cyn=#>))~Jd) zVMd%?1vK}{j6eN6aS&=bMO_qXjkFkbk&J1oY^NbJDyP|P=F9}6t zhmpi(SOVM;ZuW;;oRf{z#3I!PWalfJl%l78j%WkuFVKR%Y-8P4IKZfQt z)YuNTRb@5AVbVQS_trKK%wXAVb875e&y0D>S z($o@;)Guwd`lC|v}JQ@swUUm zHgisC&79Qwr>efTB_x-$l}+KsNT@|0DDr@*fl?3el(S0>bJ=JOS!bK5whB`$OHMge z&M1+$Y)L4hEstPeYii82v4ba(JGZqhA+-tL>PTd_@?crjHDFUJqy4QElVL`P&Yqd0cTuPzq&Swz z&0L6p94b2z$xt*;k$=r^(^Q)=&$kRaK>`N=Wd* z2c%4S(>Ay>TSxQ$-!$)^REO_gb_)z%{{I7ug8{Xg)-B1l+JpXS8z@C}=5>)xdp2AB zHt}GUXh#lNc{at_uBhw;_T(zF9?~i)Wly|VC%~FxB5H3_mCyEvTc#k`vB~L3gtxSD{Xj`J;p&k1=IPA`Mxz99AYJqN?lfmZ#`B4Ggz0`Et=a*Dw;|%d9jph zK=}2op-5$Iq<(0A6>6~%3AJQY#$;7g+V4$eg(>#nBWD`TZPvzuBXr0yH;rbHl=g%= zMQAsBDo8cBvR8KjDPHO;+pL+X z>hyXW9o;|;G0y1p>Ksa^s!Acg*D1b|!I4o0r;HvqRJ}|DZ67GY6Jpa!aV8 zHWF5+00!$o4nfPC(ZL4rm{jLnsiev^IkY_78gWi~GD~hz3}87q+88fU#$(p%hkN2xgljJt&I!$36OS? zq_MZwvMEwo<7sr(`H9o4?9%BSdn^vdXRz^37JuOv1$?@tLY;NW%5YVA&0T}l%UQFy z&E9RG(-W05>%J2X-xa2V4NkezHe{R;*kr=afHiImsQy8|bvVj9=$8&hykkVl_{fn# zl>W^xJu;;nXGvC7Rx@;KpO%N}ifQ?$M#j^m9Pnk)Spw(Y)MvD zkTcN!GU*JolV6`wX~(MEN$Zfc{4}+#45%}q+}^VKJ(<3=c&ooVw`B$pWbS6A5e)Xt zFrA|OuKOaPR^PJPa0B)`2bBZcH@>=vQQKhcPYp^YH{*^m1?Bu5h)e9I)8;mM;lKDnl(x z!>!nDu*z!fs*;J4lXWMRJ$6l!$DF*SsYvTML;4XhxyOzM@z+K|bHan1oXDWZd>`~F z#sdcUj3jBN43t4k=b1)e?Q&$&ID7q|Oq>KZ6X!VrulJrv%~Bk1t8Hk|aIPa5iqxvJ z5#`em7Ote7grU;4Mp9oG(^yY#jnqcMbt#6br=}B4xhGPi=u%?X2JGzRDVsDPGo1I7 zr$ER)q{&u_GOJ=Lt(>E$5g^T+s)0fC1_aH@_yGJDRA~B_<5WUtji%EKRi)`v|BX6L zV{{gknnpipt)@{>wGIrMH!v)1h;-D>8THgL+BlLqE7eIcRFyhu{u>qQU~?AL>7X98 zG9B?$m6;*x2pmln$>sAZ?{!|~52}8a|LFA3r8A__lKJ&G)Yc>IC1pU z2*zC5j4`-L4r7dsgI{Hl%4jTOY#$Uj5G5HVt@T;kbgqBALk@y^K z{+twU{pMey{<8S7ag2QnK{;%NMT1`rK5n$87}jL)TS$CnQ=;z6z+&iMO-)^^JX}vC znf(42@f%L@W8qZm_)+ogUrkM@zGiVt?NVy6Onw`QUlCPM(dCSx4Z6R|*m9do>WA_! zZLY10)EJHTh8q{v)CBygSjP5Up|Av)Fvg}9E7&oCvCGt-X(9qCWQ?u7jj`coeNi8!x$@Ij4i*8u~Np^c*2qXY<_dO_;d7x%NV}k z2*}m{2z>OyNAo+nbAEc`MXlK@IuCaA(4X55w(p5tu@S1*zB6(OPwwE!u8qlLGC5_} zgXhTbhhFH-IsW?C#DW*V$alMMo^P&iP8DDIK?gjF#YrAJ9{CnGrx$T^);Mm?E9K@x zQ@GfiIF(Ftv1+3P@pTf!)&iK*3%Q7`QGXV25nC<)9L~*IZZ6_aDAJBo$z*RHk8j2w z@1Z>0B&KgahXzfqLJSwN?o-L6cR!CMJndgXCY3}NNiKG%gyID*ezH*JqF9*gk%)^o zygQStAe2w+uma<&R-8&E1A;P*o^*}fDdO`%6g?&Xz7uKVtCoW-zP|ZXG8yf6X=4u& zhk!WA#Q~YK3{P5|#esnMBo%%%70%K$=o_j5Cb0DeOZX^cW1-3%F+ zkAr$kp=eii%^mj?rwk&EO{xexy@m2053U^qF;S(=f`NUThI3uE8y2kG8+nxJ5 zkFVON3OIIu-^;nbv-lB*Xg|?;RwcN(9?W_6da&Z=W?AFn1Rwv2=cyNBJB@&QUxah9 z>Y%Lq%?wms+FG=2m$nXIYo&`ZyUpV3RSO?@&JnCCw)X-{8&vs{tDs@t{aozhE4M>6 zzwNuzx4>8Jt6A`Z8AFTp^^A(iR_uGlm%H89_nMY_*w^=}miwizZ?Bg7Vc*OC+)t1E z{!}uVuIbSars(3hE|R+W-6`Jv-aXHvU;C1`7sV2uSeJ`2LE&v zFsK3X4)4+usuO4%c}1ru>I0AXKfvJX;y?6??E%k>gZj!ZkW)|`-Ut}*%;@Ll-0r~m zKXUT{$mrdftdeqPp{J-YZqDrqh|iN%?m$Iys zoZx0#k5V^tK?1rH-9E*kIBAMdsf)e3=+ng)JU;gonaT{l!s}j-B_g?jaIee7Snm~x z3y8x3aZ2&63%-Kp>HM=>cfA!$L@wubuk+476$D(p-kq_8Q49*+`A#8sz3xr)o}ZCE zmWYh;?$kv-k8XE6B;$1pUdbTsU3(^Rz59`2pl)eq(pbVcM{?}^lN*91ba7cmhTvVr zqaPGc@vsv=1!t->eXTwe|W;XNa_QG$g5yyKxHH=kNIy3(Yk8Uc$&=ql8<`xRg z&DN>Os&Q73Hz5m>8otnur#7Jk!PxOgBxr5{lVB_vsrT;JqgyvZWaCO-bStD}Mxky# zzJ@X8O>FuB6!M10VX!>@eY*Kg9!o}sN$K@2OvacV-705Lkz76gUAK&}1`@sNVJR(R zOzN5Y+sZhhVyQxtk z{Kf8o$Sd~l(M2LCb}O}uZZAp|*&4CCr74L|k%m52h(;9gA_>-yL)pYB-&U#_PdjER zT&yZZggI}%o;|N#Hy@g!o6Dwpclwg^ibQAM>tpxF5|Lp(aiF&h5j?(Xs^s1$#qe## zTq2e*&i8GVgVD;(h_0OJ%JO^sCn-gxGlh7OLgza|MQjYDjIUZKg;_Q=KpBV^czjiT zMxak@=kZm|nV}fcj$_zPCX>;VE^Tb0Z?8Z1RCF_VtI_RKUtbS5*CVO;xbsLs^qtFn z(Jx$MlfK-2BKUiRogaP2liVqSJwV2;?0kL%V|}lQ;48pKMc=tR5N~@z1iQtjoxQ`N zfBI%1zI3%ew@XbB#DeXYeC}E+Za}JaR?Hx& zHd=9+saEkMP3hG9NXZy5mp)<4=H@D?k+D4yjhj+Q^@+qt=*P>UtG87wlEz>40*O>GUY=+?!5w2s)3 zlg)JTqAcT~$fXwJfcT>=k|oI+NN_cewiU5dJ#g_xKpe4i4^+H|++}{7(Z`JoV6;Z_ z_=SdNG^}xIGW#ml-l0Q~_cG1m;G1=kKgTr~WKPz%EkM`#nmv&`i z&C`2@wd^}GBa5-F>|6xq@o4{WV|Z6KOr~x=j0u!3+Ka&(`GOyQy2=hwZn#Z%-79% zZe2WG3|oa@EShw4)_nY3fN5v6->rA~i?P4Lj7BY%Fv5EL!D1OGr>j1zr-5v~l)TGd zTxtEm@duBe53uFqWHR||vt>hlqDzYOGLir+qxQ~MVcA$#EwIaMSsSE%u3DUbGJX6 zr-o=ZkM`#&CN0nE<`&4Uo3ajq=Jz2~(3ExL-R~E>SHAOQk}`blj=-hcy?@XrmiOyo19(sMYJ!Iw`=X!c=|bkuv1;5C5Wn-p?w7MtRVmS_%kz9)507)H zU180eJaXLH=z+0JjZx7LI2XaST+Cg~g|S8#$u7A^%Dd!#BlaLr=G*7%**|~^VM9VU z@0FE&dy(jrTY9mbp4iANMBa<~>#-IlzUS2>-M1Og7~@U&Hmk{cTTkW8>>R(x{~o33 z4v3^K_NviIdzwNM7ANrnLINUbZ*#Rh?HaoiJ7{}i3FD@|-TvGoeS30u`NS*6b>5x6 z=hY6C)~(<02+W1w+B9pA+21Kyf56lmHb-pdCJey>3u0f{n zh~F8PdiQgc6Z%>te0$}vE3y4P@wQQ<^xa5-OsIK} zBcc}2leu(ThI^3+rm@E7x{L%^XC>Cn$ED$q2gY8;O{mOBGq{eMbJvQIK36`L8Hv6gf9^pZ-Oe4O zG<42;+`C6E%TudvE{>^CT{uEDuLE&vYN0NYzUS2{GU;hA$wvSCm0DvT^|W7_&6w|b znl!s3S0uzXSibHo z&#$(5HoT&n8uM%@cYF8h=2na&fw=CP+EMPF>e+H!Hy?q$6WhF>cs9JjJKuBji8%*! zAwxYI5_#kl4!4~}1@Mn#S3LUU`vDA1#uF;`&RY)eEYSuJZ^tD9O87h1P&E-2js8%UjY z`6AzzFV%#63cAU$-g#Q=xRI|%H-k0vv_CD?MH}a@IOZ3hdT!nq+wW;V^d+{3eSLd< z6+8T%>BoG1d%X#6dLGSl>E_&`j=U_MO!z8x7`;cH{Zf7`2%4c%(jK zjS7zc8T83)d&TcMj1LEqt02il=+%++lF1jE_qY~2u6eX~dvpC}=#}1VpZLNr&@T%e z{n97C=zR^HlXoT5&Ra54z|F_er!bMr;ij)t?e^FkNf$Zd^Lg}H$ih5NCp;URUvlPD ziQT$5Zl&_HKP>C|r;79b$o<@W3Uf*`DpxP#d$45|@`>N;72Exu83(-yEp{j}hi5+} zcLB{!P-SjDqf|L57jpLKV|*>0K*KKSC)jv?3QEk0Fi`Qi&*R^Y^2^Qpw2_eZV7WNy z+pMZ$f21a0)>T?Nf84BE&ZFBdko(-hiqC?cY456mEtW7Q1!IRI7x{LKur~?=;zU5a zBX_gl>q0cpjC$2T1C}$DT(s76a~hY+7;EbJ*V#LTSw@w;riPNoYb{)6(ni4}|aX zH#9Ksgt7^f7#joS#JBPLZ)2|I1+Id;5$-2kjA7RppFjFBk|&c%Ip@aDmtXL3*0gi1 z@5GsOx+EG%_q7au@5|YfgRU|<;<4fJVc*MnTz=urq|eQy51yX>SDA9$a(enZ&p@A9 zPW#KeRUcYZ%AHAviL(4zbcANo`6%3`yLoVa)-uzkn;w;QmdTGkm#654$oK1+`4XO4 z|25X(0;?Pu?Uk9oG6T{F4be|=MnwLsa#6psg310_+B)Dzc5ldd*t^~H zhYcAI`*yl`*t65c!+xDE9`?$`uxmQ_kL=Wt@vu*)OAotL>yrCWgZ{`K4auME(2()4 zKc_1n?9J)qgPl2Dda^4+<_~*vI{vUDr{fR1ak_Z26GP@t_F>3)vI|4T!ycS2f9n53 zrl)>CWIX!&=utUC#-o3qE`RFJL#9VRK3)Bz{|=^qqm?$6jAD%4!dS`SEP1}G1%3wh{big5M*E(=nhQqjr)?_A|zAW~}7; zVT?^xxoUwAoN(x3OeqRok zM+Qs&j_@Z(FgBgBl6wgs?pEohCsyyE&_)UUW6C6qK<6M>QRf3xc zjwOiwXVlAwZUtW@xRqestatIx_l+yb@_~W87sLWpRpSl zD>)}$(f{ro)lTcrQFM#WVQeO2B{R-Z=_hy;UDtVv@78lw__5K9`57yDY_zJc2S+nD zgRzpOqvd(cOBWZY@V7mxUAhUb^T@NIB|rA4`n}7e_~8u!lyk@V3jWRcs$4S&emO?r z9}tX>QFIRy3==G)_*oY)=z7T_g7*+yIhMi3mV8mj@P0|jbr&l9KQC70#BoYDV|N1P zGI?b?Ag*Rdz2)PuB;o-_GM0y}@{x>H%Pn)p^6>@=;sHl7mWPe=QH)gsmNS!D_&-LVk(|91HmstOmRe@>4wE zMUY>?YQXCm%P-DW`2$|eSl&1Vs{x0h{wW^t64bwf)qs;w{}c~+De7OrYQQOwpW*>8 zgZv6s15Sqg6c2bgw0T`{tXn~CHt2ARTIu>27Vvmv*|p!NjNgY@9zmOklzs*dx7xZ z(ZuQ~;dyi}J(YaCA^P(P?7XyVRONp);gy7A?;Y_g z2%kjwI>K)v{2<{P;chz29wfY!@VSJ~Cwu|nD+mt}zLxN%g!d3`5H26fVvMyBK90`$ z#|WQKc%1MRgs&oeE#W^Qd>`RIBiv02{!7A3313h6e8M*qzJl-<313I}e-OTp@K*`9 z77}j}UP=p#KNG%?@S}ux5dNQpuOl4Ge!S!LCh1Q;;g`y@gwjUH_`QT9)C&}|$!kcJehHYA;{|Zg?U$fE^ zJ?sSHAqRf%6aGzFIGiH9p78T9{^GcbN73WM1@PM_-cPteIL2Yb|CHokOt|%f{qbZm z+b`vDia!Mh8^+iV2!E4s*eT~^|JND#iy1h^Z72PoGw|LF{6q$hLln;RkkyG_mVsZB zfltW5CuiXJ{m&aAjtl4h-}XjG4O}+s?yjk;zq@8}ZMcD@g)A{@@kmJ>u3bOPRrPoS zf#I4uP}W4?Bh6~Ujf-)qy#0sPxXAunZwyE9_{GxNhK8m(RkQBS6*^aCHM(Q$cOdM5IMcSl=JYpM^mgc|GaRsOov05 zm*HOj38DJ`-$2LjFZNrUIA!8w>EgI>WXfxi4eGauwSv=cQTj0s@q3>97B|v<^+v)m zJmDV=8)xmem__5f#V<0Bu|>%HFZ5f)8)f+2ssQW0Le5)<{GG{fv4;53w2xhAZ)B^V zwOw!h&g8dPPyE)=ytC*^IUi?FU(47a?wqWq=C0OOi@EgM^!w)6A9ENhyh=q{pBeCT z%H$k_@H>+q9nk_i~yneL=tDcY`)&XGp;K8^;{Rt1oG#H+6V0HY?KlE#$$7 zKjhf}Zc3&&2O>Yk$H&Cb54dX(ypr9GSI)Wf3xzh z7JY4%4G0KN~nr`@-U;{qaD;@hct262=Vx4D0Bc_Tb=6ii7tKoTalUa%vCb7 zrq`FwF)4fVkr&W0(lk~@aC0-1T~^eQzsI>QaTq6GQU|$Bs|wa~Q)!9NHm0+JBg>X# z(ki-r>aL%g)Rm+`f}_g_)G-$$V~I#1PCBLB$}BIo-itYDmN@X7qtpHbb|U@gtZ@s@ z=OcLKb{IbAL889B{!#1Ec&6-6I0Sf1I^T3zjB`n*NVB?EiSf z;sSvG@rJbzy{Z#dpTVsZC)tBI<@q_ovDZd-Fm}|Kw6&nXHj^((MX^)9>-FQN38 z)w?t|3}8?+x`Sdu5T|GHI=pTM-8{C__#-N6xr#<49DQ(ALHFN6zyde`KMLF?S?)BhH^8 zn8)R`Fc>?od$b+8*x^mUFVJl{OTjxoAo>ErP!5qW`T^5efwAEd9oJgK62{1Y=<^w4rB`qR`(ec};(OS9Yw)CC7Sr2BDjO+3d9SETrZt_eZ$Tj`1;wxZm! z?9al<7e2|4U{|msuRuDNB)3IR4qx0gbvQih9!I@BhncN2^+-_dlvM6yQm=a)1$_>!?xe~~QH_+m&`8f= zkJCw2V0`=>Iu#g>=$e{`1Bg3v3YaXz7~`{Np*5ya;1eJ3$Z<0%WufuevsmcZ0hbt` zp^n5$&tl7-i%)d%2{(;3&Z1qGD%vHML@hQx!_@C8Zq6+7?&$~=6x%J4WgJ6_3m11yElwtTJ>H!={O)2^lq};@BrE3T z%yBZ=HFmNbm8`I9>NThoN_UM)mt%Yyy!N-;$JnztuHo+}ck7)Wx@GlDFpirzOp4!J`m}Z4U;4Q~OXY1KMBs_tAW!Sx zJ5@J-01XX@WP1F?h_CyBI`S`hq{p9>-R%d^NRq-SfG38d9Tef+lOCl!-6YSkDIipYgOAtuCh!6yi24*!tDiIbUugX^(J`5>mF@eEMbh( z;IHkVT^$e~`_gCw6(4)FZQN|@;9WE7(IUKS23;sILwe!yt{Kt^k9W;bK6qU-@BtI} z6oS&Jk9W-&N4WfM!@FjnPXf{)IYVyLaCK#akFxW1Jt93Mr!uC;AIF}EE^b|}cg?_8 z6sC7Qf+Ozu#S+F+Uvw*)&}}^Ai*AL9WJW~qdPMpdC~7Qk=ufP0@T1{{i=1LyjRC%< zHU(>FTw z!%RflI6eM&Ar!0goq|Bz*e?Bok4wX+i-e^237HiftCR;>K(4*go62t1k-n}O_$Gr( zHca_Vh?}|mhG383;nD5&j+KXGE@uJ9y?au#0CUC|e$(a=jJ3G=Fn@nC**l8I`MPL- zCHKteG(G0+IlGT^{&ARVmwBt3cfK=vqhtA`1?T~oAqkt!+D@t;w@o8+o=kF63Q3~4=#+Z0j5>uXd+o3Jk zbx~Dkes>D5+t1^356P9~pp~E;0|xpj@aPBQ0wTCED0blX7Xgn2dqRVGLytERJ(1^m z?20VL)MiwiyM(O6Si(5Zs}`S=X1zOgljxH2aB+Z(1?vLnkLnUB&3j13biOx2H`_2z zED$G@LuThkZhhj7d&RDme}wyw9*-2ebkWAd%h6A>qr0*^zk0dzeYaO$DAM_!8!nG} zcAJ}rlggE+OBZeK&W{Scf0*jo@CSWj&P&l#BXyw_+}tte>K(fH%!qNb%_&UK3>Nss zPI9m8jviC)mEGP%=MlGO!<=C|bkks>&->a`&xQl=v<$?jy7Y8jTkD+&LeJLw0~qkB#egxrnXUeuol33O7wX9 zJsb8Rr;Ql!^@(HN_I|E+zE>C!e~`5%<}%NQJ$m+BHxKVoB4FO@md>ub5H<0}y}D>C z@O9ie5=D~L{s}q4c7EvACzhw`T^LNf7VT42{#xhzZa?Z==9DVwah1&uT^R1p4-367 z!NXLac;ibdo7+bX(z(VB*13H1pm>#jb8bPvTu|sYjUscwI8!SX{^BBWXK|rlL~vuw zoyBgy7*h-<6SAcKVrfdd{Ke9g!ao`|vddpQ4ld400i)Y1zwN6|`LWEmGBP#fgA9cK zzr?@GUo1_vmCt;~eLZTm>A3jE(~dJ5(Ff);PdmKtn)Vzm!zcT(4QB^yz%Q@Fj(PfHQJCpy$0W)yW((dqe{J2Ab? z!ema}>%`+vL0Hk5tST^{0#%o!#ZP+udUx`Q9*_2t=+3zHNnL>?udkZh1NSlMp(?k$ zajJ$3qg!dzh-}8XrpXCNAbvOWhMHCGsvF;?wpCa#5SPAg(M?h-j0*-+lh);abCXho zkG9yeNlOzxw>9CpXuk{Fn$b-t7>iu0#SR6`wr-=);tFBnGT0r5wf zm3_ODmirkuqgXerbw^sY*de2lSUgubbA;Q;WIJMql1xSpA(@ODLbB~V8Ljj||K)^x zpeJhPR&b$mEL2ya$j)>}7QCR3Mjx2(GCa78$J&tbVdv|(Q4lbnnU5JMOx-uLq-~Tf z>1c{%RUtl4;FhJ>(a1<#gBTD-Pw#iEzXE0**StqDV~)N2Bp?TPu~1;YWlf z4$CiXCo;vrT?dD-lvl=@oO`PZ=uWPqfr@^=M>}H0C#%NA5}s8FRMFF&>Z-W*PR-;0 zlAD{LBLhE!s0%@yzR_@@_8vOY`K7wG)AD4FxO0Dt-976TAv=6z-`*?IVtChZT!+HD zrn_+?3h$a;fICtAk9xHBoslr^!$rJrQ|i7HpJ&5Pzh^_Yj$1C@bKf#CXBSW|h6i1* z2gNqM^L=+P{5ocJdh&&UsCN6s>+)_8+;13|IA&Ks%q#Fe>f!P4y0rG4LD6IU+_`r7 z>v`;|U(x;Hzoyr2$(j6iGyU*p(Ro?huPwvBGL!!Qw4ZIJJl9zVBrLzYGx!D4amrMA z0~mhVYNQ@h_}@*jxFtQ^Mm`}?FWkfbh`XW&#hJ*@I$}(@1&>xF(iNVi^2T(tRMQr z>GFsEU%_z0^58${{ptJ&q3@^T5B)w}dg%4((nF6=7f*USr2M3>L&lSy4jDg`pCo>_ z43j=0C7=edIaAtlIV zSjnp+6kJ8HmEa8&eA!CZnL<}2UAmkB;Y@F{|=1aBj_Vw94reWW}aS+Z!P^t~yWL-2-? z(zox@WUllvD(TKua{j|;h5OExzBnbv#;9_YJv|ETu5;AMXEisE>imR?pTGNDwIA@C9f2!eAX1Id>Gtm`6UC@PWj>8GIlC;gf~F zg?K>tK;n}Ld?4kg6ZoJ}JRp1^v2g((NI>|2{et2F;RA_J8t{Pxg!|H)6b}d=NUXd^ zGgb`<_m(`D${!FukhtgST*j&a;X77N@qqAw#D!7kF;)!-AGk#n4+tN~dh&q;yqdB6 z$0!~UK9IO4=6uGg0pWZ08;S>n4HGN%4U2frM|`g^=GR`&WKm7RgUO zkOkxe2?!s^a*79p59Ac`fdqt)=A9G|2p>rJwq3+nH6VP}V1Lj)fbfBQLcwal5s;ta z0pSCQv(A@5{w&%4`G+VT5I&IaDOe3y%vk=IY{efCK9Ggv0|^LUy&EYW5I&Ibp}U;1 zYQU>d{}c}hAIN$Is{!4RpW*@G1Nnr4)quI=V+cKz`?>JZBfY|>Jm?Sf40?i(V$cVC zwM4r^f6%^ALbM}%4AEZjF@!H4d<;?l@bN)C!*>Vu2_Hk$8`|$0q^Ej-k0HtnA48N2 z^$+>sV+c848Yw*kf0dQr@5!J0Kr-j<#m{Fwn)TA~pA0L!=zA^(A7AV@1;Ve1grxFgIW67WJb%d`b9Q^_D3ButkD)|$R zI~9Nz(ph}?C6Zp5t zR}C(fz<)sPk5ARWN6}^PF?a%K)m(C`%J)V=n|Ml!at+Sv#`5^_@7ex9}<3? zd^_VdR2Opd`?7tKLdIqj% z;IlLEZ)M=M8TgV6yfFh`mVx6}bAPyb8s4(UW9F@dHnoOQf8nu0z44B4^B_UD)!r*Z zZ*7J%)%{`lN16TCtkAvbsX^xq9GrBbWKb2753DPhZf^-kLV9C5x0*WZLbi0LvNO4v zEeet282up~$LMd%acpt8p`qrUaMPmDvT$7pXb9d_Y;ae!OgFQop{1>%2&-wSg-=>5 zfr#=si-eb|>K)3n?EWxC*`8(25b`XmU9_lXQEjBQCfq3DT@6ijcgu=XZ09V!Up`6M z6Ouc89{{Gz*@8Iv>l~ttPzq_SjTGP_z zmQZUeJ%aaF@F#1gQ!tkQmxW_U#y@L+W9~@^Q~_SCjH$*i78P4Qcz6A^q9>(m#8x`~Y8D9+l^k!;S|caC81;)^*I${_M!; z6q4hKeFNWv;&^aMJ!U39r@Sk_33X}m)jb|>OYpd%UQp3WkG3Z~?Kqjl<85mK;uIZn z?$R)e!h?5sEC;U(sE<_f&3GpVzDDv59d#JlI%Co0FD|6B9R)bsVZGASl~asQtjK}K zjn(wnj=T%n_bd`f-W@Lxca@VFLl(!9ZqF+1wH0lzF(Z$gQW_Z#$@fR5Qfbr+GdH@7 z>yU{gh$W0GZN&Z~mN4>s>s?5uva!hR5P!#eeC2kugX7c#+|X3fWvbq61PqjLv{OPw zWbwB!%9ff(a?8{KcL8+ZI9>xwb0!SLH}`ymQ^h&O0dY9_1TN0?t#`F2j0x%;j_0tP zR>cx8Xr)IvPN>OK<)MV5S?$dnDCKJf=GR`ttwI{s4^ zUzF~b&q=i4RXF?YKB=YZDL~Rv3(4`sW?;4)U(hYJ^FxwYDQxL}DCDI%jQLh1U7i>g z>+m}qBOmf3HG%?n({mTqU7T zck_6pyAT)N^E#f#<9;C8S{`4}5r{8c(VN3fZLLpU|I90Pc-pa)wAw5nKH}nSVj4p= z$QNB=c>Ia7m(B4ZJqRTaCcO6y9(nBO;wI6ht2NSEVyn#0t0D@k56oD~2wvYI-x?t5TIM-@@YYI3ks(WE;%&r~|7$WC9VxQ$^0UxIngrd?m@E1W8v6 zk9NUOIvQoYd>km%E;0FvSNxZFKPV8F4?*^h;HC`T1oNSqNE%7?yp45M`=~{d<9)b#xVdN^7$JZlNir0bO4b0gVus=2h-nAJd9$}J0`+iUC5M+yQR2QHD1uTNgU1nv~R1BC_F({3GS) z7oH6VqMy2Yw{fS2DD{%rL{GXsPs0L3yOdz@wr=@H2Oj0bUk=lyjI-*Gse;2e+x?6z zczS2cw>z6I01jykf zLmxab>~O(@)T)Kv7DbrZ#>m-jV=L#(h6a({&=yfHy7*F#Kc6Bg;qW)${}wMq87~LB)ZCOrez~+xL6gy-smxT7+Tl z0G#Emnoh~vVaaQk;0dxf6k(0hV4v``?|@@|d^4=<7CZ+{!pc|N0;2CZj5{*yMwf9f zk8g%~P8Cq1GFndH?DzLpoOBsFb!Z2*d<0HeKgvgH509_6wF-92VF-@kt|BtoRuXh8 zi)oisTAHmQg2&g}DoaItO%4K>H>7O*jV@!fv(?*ivNkOrtNy4XT2+qjXJt<2-IB}h znMXpFSx8e8PwWuFO;VL3du^&TRe&KyKC>a(Ajmlrgbt1el{nY^%cKslR*YDLGPAgjYly z0;VG5ix6@3h;zECQ1jZhO{t1)WSwIMdRux?{2h2{5OxJ)h4idYBH8lxj&;bB3YD{c zN99-nnO2T6wAyTtslJ*|&#ThKDc#IBeR6}$D z8*NhOs*tEiep5>*Gj(`H+hJwsC??*fR*|4r98Kf|qnM(#^V%n;(`1ZccYX>BkH_}3 zbt&=Ir1Yq5EsvA6M5%ZjPdw9uq0)Sk0Z!#*8(^}dCOD^yqjaKuf20&Vt$I*@JmZQb zB3G8~w^r1>7dZYNnflvK*@0J`IXz_|hvM|QLO)h@W$A>fFbh+)rm&2vyMvolb-lML z&S|9uXH{B@m(yNklpDmV+!iqveCSnZ^n>Lb?*R34A(sP~Z`p6&+iJB@wcBf%+Ow9M z>mBO^=dh{t%wDun`=|vz7CUyIwcFBG!;PvfQ?$1Bb!V#9JJOulYA}k6;EH2Oms}e9 z|>%)XfJ>u94oJTt`n1GcHSN9Y6jSR^2?BaL@h;Dpb~$r~O6wPAOHs zR(c$c=;Q1Oz5R!81G=NfnXy)SJhh?X0p^s-npFBbj`8UB<(UhDbX^QbUB=&Qe1J{Vj(G^|zfs4iQt+CL9^H15HdH7E~2k4Xf&jG$XyT0;%!Erv{1B zP9rnQI&ci3!a9eA46P~EvH6E5YXk96kF}5ph{JMs$}zaZ(MUH(U}0vA!VMwTq{hs~ z>uS_Kx;cVc4%>Oy!L!sZ)pA3rhdp4X6h~E6`~FCSUH|qUu|y=C(ry~Lpxw?nkgcVb zBFoPZx)@IK_Rb&{j-c{^L04e%nVMP|>nywOoRq4{4hR^l(hLPjD>K?D-5k**OBMX4 z)J&laN?^^(dgZ&e(lpsYqZL8Af}OV2aUl;bQlVjui@6wI%+s2p z1@U&Wg9_ts5LRFQ`AKL(Suw^(vY zlU{DnOJ>&ow!P4_W#Fc^BE#7~O?@9qGkK~3&{v!zp>6V1^d+fjGj#>Eu(qsg+7$D$ zlwm%vH(zBv*cM>Ap|;vjwp_}3TK!0FX`Kwj+wAvX10tE;eIfzWg}n~4yOCqItqk3b zuE_OvbT;V)k3*m34C2W9&TeQC965qev0w%D#coH6K-_pjPA}~t9&50KHMb0kFR4dK zmsq8oLR*7s=E7F%fH;hm8;{RbwX3?&YUhLoQ+*Yg+6GH?A=QGZE`)goP0yf}=&xyC zdQ=xu-hP&;wV+i&Y3gTn9%ttbijN$_e`*bt5=)uQ*nXqg>aXnyPwe+sKMXLKy?;4G0tK0Vyv9mhUrWcBrbFs(c3pN^8+6%tk3w!ewM{CPn zVhil8T9t*h8D(Lr(ygYJ`smz6j()IE?jN7Rvpp(W7hPx{YdZ1_J_S3sL=5}!YHn&h zN@dkJJF0X)H?6_avXcWkuc!TQ^opLss{Za?WOV4CZ>H52eCCzvBovBpU$6r%>%mIV`-)SR+t4T=hS582%Pt=SPRAyk;=16-h1a+ z(v=TErzKLd*!pcXZ)(AAsezh2Ewm?3y4caXQ0bbp>7H>(WmNN=bk)HwbzSe*knm2G zkUqbvHvgtQJoT2#TGho4t6F-m?ak^<3s5?1ugjD^tC^cs2Fb+Q1;nR~Q?dQaJ-RvE zSi_2^WREGXkOymi)V^J$?*xvHg(}%*;i0pyH%)ak@CpT?{fs?>g?P zu{JG_B}aKyX@6eP_Gf0eEej<}-+L(+>U2Tx#TK=04o~tt8Er+TrLjw!#=VEBYf>>hU{w6!6Z2*?Q;UY<+x} zRg++>N4wm{hXK)-YO*8Pn*ui;{h)xGBb3ccu4qf5<;?3z`0WKLKVo%pirhf>QW!nD zxqt=g>fAhTs6M8P9kb$#{#1y!xOrW$2Q8x-1?oDdyD%W$k!?e(5GS{Fm zNENFsZNp#cG9*wz4)g*qubbfx#2@S`;GKWU*3F#D)8;U`c_aDmM_=eS4i3WqOxjG> zokDrI_%u*)GBQgae?apd3dBp~&Y^fc;Cd%gIx{}znwe(KHMfYIt9ZpOqmcS!Kzx|$ zkGGgPSE)(hUOl?q9jrKPY#pL1aKFKox0wE``ke(Dd5ihrRZ92t==Od?4J1PpVo3cf z8=!x%6RBNzx7E9BeSF)tNzv_Y>tSe%|6irY+v@UP@9t6_c?%M(4>zYxQHAPV(bg;X zjUJeydWt!%RKtR(4-^myRmjm5ZAWD%Q|3kqSG_>Z%q%t^u4wyE&ZdYB z4Ku_`VHU%WRwNs_yfvd+XAaPa;OBXv0Vd{fvP4vBCax^GF!Q%DoEvGRglW+>?RJ3)vfyC}!Opj16=rvz=x zaTMWxLS*3{BSaQ^b&hl~Rlk>W7=zE?lHrWGYK9NecI`RYCuPgo*An0lxGU{K#lv9@ z_w((>x1?=M$tGiP2QzB)d63~|XOLY0R``sKx2^h+26vUAkTNEh8cU`rBVGIo(%>BN zOvc#H!3|!FI0TLt5E-6-g*YtFtcW#a`y>4&X;HW7M$ntJSRu&Qm;>3Xf zN#Q0|RvQS!*iNp95}bvwM#eZwVn}RbOJJ6Osbh$^h^2)>Sz1czD{X0k7AR#YhVXD` zDGfXdDezbd6sV!3(1uVJ|G(dyGgs2pVpDkk_x}Iy&G*?y=g!QTnKR3sJ98F66t%mt zoPY_S_BV;S9|*j!Lc0HUAm_4rFkJ!!>o1nb(}3LL;-wu<3<+BMC{)FOE$~RA@<0y~ zF^XCnJC@{fe#n}+T!Tk)lzKM@_%FrOeF>xV*~C$*dG(~rykoe6)9`D2sgS&QLIAWV|hRgR6suT{U0yt=^;1#(6V(B6=34v5U>G{&z5rAfxwYA z%7p`J<#iiMjw;#9((<1o2LAuh`;huo6<@BC)yj(Z6k?Xi2v!8vu75!?ytMhsb~;}n+r@3 zr|Lv&;3*1&7BNsSwPPTVk0ApcQZ*V;ZQLEYu)k79l@T76QSlfMycF$Z;;@;6>IWLS z;rg%lkozjI1q#|6@B<3SC!*zWb%o)B*3d85S2TSM$gibX7;B`bq$8lQOaG8{@K*>^=8uS;F$}>(u;0Y)!AP<;!xD!kR0VFn`1V~ zdvz&dpe2nasP@A5 zm@^R5E68RbKM@2D?dcgoRGt@P5?_j#*V(2D2fazfE6BA{R_zmk9G|01TX2Bw9jM5w zWZz1+mOY213@eT5Efvsh;D|E31B(QBp{sDFa1l!};cynoAS~j7rR|hHVcM7&NC$O9 z7ld&!k5o8WVon1F*K|mxz69X&90;}rE?ue$dOq0SHF(jgfFBr`_aaZX5Wu#;wFO!x zIvF;j*d#uK2Y--c=qc9=u%oJz;R6FTfGoUPu#g8^Pnst&Di0K~Gqn3?nQ5vGST2@m z+BZq57*lGQL_t^_2qtHNU~zE4p=<`)NNcMl>i%j$CiIuRjll>81!cNSzdtP`!-AH9 zHdYnX0ezsR3J_!>vrlegC+)H7HfQ8HTUTQhCBGB3uK4SHehaJ`&rq;G~q3+7|NVu|nePw5J z+lCO$3bdZq+1z=~Eams|?Dozxx@N5i*R^+sX0C@POgx#zJ~O*!ow=#CD?D=}9n>D) z80xH?y09|5v9)VtG}eSVyIR}Zx@OIdlj{n1wzh4Usm$dnJ0&W(&TR~=Bv-e$;0AmF zc)g_sg|N>uSE<4h?G@FfTr2_@<8R3WZ70oPA5csjkn3DU)uriS+MxhV4@wy-WT4|L ze-l1*M^L^q-|HweUB2bL`IqHgo_htBe%VPS)=v#`1YN(n^mg&^9if6FowL38lt)P6 zpTAet!ddUvq+TiM9d_@W`P923T{%mW+w08t4_?|*%Nr)&k`dO^$&WuWJ5tLNyN1sC zb&jwcXTI-e;`=b|!nPS9h5y6kQ!l4<`IaQ}-)Y}5WxNR=oaykcS3!?AL7nYhlBqu( z_As6K)DoDk{*HXkdNoNs?0RMBN2nqo498dJczGmKz6|y%Gx5nu_n*Vi)dB0@(~&S1uP*x1Wf{vK?vv((QV zhCb$Rw)SJ5W}^=)*V)>S?Nhe)UyZYvEcM5{%@z;-XR|XY<4tB=YA{{d+mCsdjXyX* z&sIL>Rkr$L<2jXbGWP#)^~XF(n?Hx>3L@hZK9)B=bP+WZ8E?7>wmS_dik(4Z{M@BJ zXAB%eARcGqh==X2wPL&RTq2{zMYM{@z}W(D*cKup1N&ak*+=LUxQJE~8CVzA5E(z= zZvq4Tyqd_srt=gcV*?SLL}XxBcPf#AZSciJ#$f_+D+v6C9KxZOfv>=8i5BA1FhXRk z${`998L;t%=Y>VwUU!kYhA=)UB#cety+UqN$xlJ2BD!bzgBGLP`VX8b)@ zeR>!;_dTA-_+>89`RE@$+ci1_;;=;Vt3zepbxw{Yx=X6Or*;G1qTL zvHE;79xNv6z&t1>9I6}F6sv=2rUa9OeX2w%9km}oPRaj4+?3cbYF!Tu#8t?L1QODFSiyf_eEt8OOg-#_8`b zWC{t%3#`rRB|KB}?k5=Oi z5102F57*-n57*;9dHx*_^Y1DT^KYw%^LKlgZ>M^gZzp<)Hh^E_m=C9oV?LZTj@uC! zC+#1{MyoTc zik{Kx%*Z%(G*Ks!aqMX3>rtb*yaPvbJ0^|hc8rzhAA6av?|PZ9uXtr#dS(6dGGFiX zGGA{R&wRaZJoEL+@yv&>kLPk)1l9{Ya6FegVLX>xB+vhIAI|qI46G6vI|M!`@b-O} zf8XDS`S-1TnEv?!Pu+)Y`5wFvw{wC#|7;wW2it{Mp9iI1pB~5Ud~6)I^Oxheoj)1J z?fm9AZs%p=xSiiD=XPFR&h5Oooa@_N&U8;N=l%>zy5j}+mvcS8Ch)TfobT@wq&^e) z{qV{JE`MMGmwUIs?+Ltq0@J^00`Zr_Xhar>UzkK6aueq7J~{kYtp3%q4NrrRrcMDR5N7wpIUE|>ge zk}iKg9*@uL%k};3zD)PgeYriq+Lz<6-j~~9?aS?Gm-Hv>%jHfNe5&LhFZoL(|2q?z zFMpWG=^qgIor&E3u8BNfS|{>+Ic*}(m!%VVy*y$f*MIIrqAf(mf%1IfL>?C}mvjAp zU(WpNFK7NOpThj}PhtMmPGSDdnZooAoWkuLCop#k*YCB-3?H4$@plV;jllJjnaNV>-$xqnu zB;C1^u2a&%csBUIrjq$tSIPT_Lo1md6DxTiQBcY20HiRmk9c&p34cwN~%h3G2zZdgWS;JkS}Q3cHZ?L$<7`<`(`6^4uXJzc(s zU>o_H*iX0!-=GF$nZ7|}xaB#nCh`355FR2jULlUh_u8>U27Gdr6II~;X#!EjwR{q8 zz;aDDzJH`V*fb7c{0Lo$GJx)_u!~G&;9eQ!;+obZGGJrXPhYl@Z?PYw&9S%QF zLM1Q1$6%A;{EvLIZPk7ors5&66ixb2lV#1nciRBOz#ah(|gg) z`JQxhyRUOIUHBeBxmzXOd6Ew22PhZkjder@Ot>`2z8?_s3}+D;{kdH312AkuWc(tR z>HR2|%l(dgS8T~;dMk68&kecE-veQXn5bf09@j5NzIX1-W4b@dW4hnZW4brwF8e`_!X`TI=_`nWfJYK} zekC{{%r@f+4dnyEMml6YCW{UGY9bHBQGf%&R{1y=mk$V=>6mx0nGQG)Hq|8_5H{0c zv%C^E)mfBF*|bM_Fp~$H>9A!#l}OpNKa9w8j^Kc>eSWoz>j$_$Q7H_{>`xQ~Tu9`B z?Q!6Mu#x_xqz62Js1$M>2M`4T=M#BgXaP7NY^mei5%mF_MpRnJFbKGS$TLxJK-gA4 zLec{si1slI0vWs;FNQ(DdLmC$a6s5%zg5x$9*q8D7zCV){u3Oq z82u;d0jHz?7zP1r(0_shmWWM!v=@?#GsGtT4D=s=_j_jW^B`a;d?>h?KY(9@4+Vxn zKtGYES#ZEnL>{aw7@vTL5S4CY7z8xoQ$gYZ4~0(!hC#q%h&&K6Lj3>@qS9RqgMdd9 zdEOBm&;uU}xttzwCVVU~3<5R~d8P^uSVrWj&*l07&LS#>&y-n2LBKj9&nBSP zybm$IAq0eZiuWewr-tx}fpie+#k}0b_slkgI3MD%zF;20WjN-ahOnuQcr*g@4(kc# zn}+b2fq1;{G0)&51M^Em+~gx3>kQ@zd~subXxJ$6@ST8p0qt$f2Ms$U9um(>#is)1 zC#0n@FCn+J1npvJEgNE8QSIXQy=O0r4A>BISgKw8-d4UCFwU`FU_2||1LBhb;}z=y z#wmOVU_8PX0LC5cJY&3R2p<5T3(-}KGuZIQ_|gzI{#CtlcwC`VF@7-5F>W-3#1+zQ z&Arj}Zs{9E%b(2sQ^CEtd)zznKgho|?}QgzSGz7)e$bAb$6Tjg>3YR4x&?nzpKCWnSQz8tLHF&h~Qyd$l+Zm`0dKl4bck03q^`?o#5*PKU;7mnMOo7uS9vL zKvIo}ZW8=H!S57&oYcQw5(Q_%^{07W_WJ zX9>Pr@CAZT7eSY!1V2^qC4yfk__2cT5d3(-m0T|DkPBW7Ib9;!Ab5x1?SkJX_}PN* z6#PQL_X>WA;8n^X644ccZxsAm!LJnjyMpf!{D*??75omtE5*JyWFg>#;#Kj9foTAI zx5(CDeFnZs1U?|r1N;`Ka1asJTi~S-r6Hm}3BFQ%mO!W;@kff?bVx%3*8x5ufM16f z22@1^zf?pRp}dKBtUn0&E-B0Dp>JSg3Nb~&e|#|G*bgCoU%^ik9QNN4@EwEr`(*)v z93t@LBGLDsg71OwDmJnZqR;7}O;R580f0{z`N(4hKTPOfAozn4f0y9fBp%;E$gl0w zzXe%CE=q-u9QYVW%O}KR?k3`M95}vn65}CTpNPNa!2jvMr{pE4pXMp)xVI>|em)0& zq65F)fj{cN|Kh+uci{UKCzm(df#cpOk>9Nj{6+`&r&XY8hk!U3E|4rq`nsMUE&~mTAHL%JiPHFmY=o? zNr@ZhuZT3C)Y@TJdUl#h`!<9WY1GpupIVFAy28$C43~67m6)B-#xA=SNjyy3+&PK0 z%8)U&f^&7QRgu%c|1?#Uewf1yTpl{x-?qNJes;rIOl>YdX9r0M5%ZKRtzR>|!8d1J zDBRq#v1wyyQ%9(?p;cv1NmZScs%b-K``Hbx>C?_#-x&%uG%l}ECDk{Fo9E(RLt4V~ zn>#u}ZR;9VF4f#~7G2ZUzAmIZJ2f;eU*&6>yS#l}sA1Kdrd4yeXPp^r9!NyZ3eAM< zjZH{5k|rc1A88d6ve=be>a70k=CJC7F4%K#cHlO43b!}|!46SQwi)`A& z-Quf?50|;^9ig^{`74wIF#qzJ75-!EmD4NVY`E)M*1j%;sD>|*bLCRUxNTh8a(Zj) zX{|D(600+>1@6c6uuiCFozI>YjSE&Bd)n!t7Cn>Vjj8wPoXHcV&eyPVsh$LS)tS4Z zzO^$cMvYnZ*d{b@Mcu|`q-v1?jnU=vb@3Xtym@mdfpTJ!xm}@fW2kd;YnKusk8^lc zldmcsA$*;u=zg)j;5 zIfz@_+S!#Z5{#&ebasZ?I5yr9V8y(;=C07HP+M1Pxb>{o@HsrpgfR1C`KqS57={gv zzM6A4wVq~sV}sMSrY^;F$&kbhd6wE>iLjff2S%EiVn@wi-`T#owyUMJRWF^5OIvud z=`?y7S=E%V0_w=-Rao?R39DJ5T(h-qjx#;}$gWj<`B)&MErE5a(eV_iZFI!hCF{k} z?(TTPgp&0dFt;<*ysn|KrCZ9=&*z;DhkRgxj=|d+>%Pw?uMYLjXp|Wqe>tS#aXeDL z9(Z&mJZGBnwpyCFEU4|mNv$0Xot^ESl5wf?b?BSBA$c-#0ZY|X_st2lg*(r|`&4Z? z?4@v3)BMG)o5G>ahK5yDP5$MpnyOc|cPg)hGHZpv{N~fT+BZeQYNOTI9Ny^cD4nh| zw5d7V${VuG>E?&JTf4$tNtK+x`HYTqgn6=7!#|-~i=<&P!hKa6LSRn1C~UKweAC&g zHzZA2u%@BW$y7BYGG$3q;(`sKu$snFM?EvDLv8E2j&D_5=oe*3xl02bY^@$ zEsc+1-)!9%ioa4+LVRjprKFkHsy4wX&mH{|Cpy2CH=!vx9R0E?Toc9{p{+R_Qfb$1 z;+J^a*_+|QvZcGZ>9o*>*0!dW=5WhK{V3G7F8M)cD7>+={cOZ<=58S z4WH9=R@Df7VK$u$pSG{0%byWs`n)Bz2`^{5} z&undP?r3FSn!o?&d!OTI2I@;VAHb3IHvACZ$`f&~m3VOA2zy2ENg1Gk{+!_2kEWm_ z_M>^dl%?tQ=ZSKDir>r7#wMkd$Q5$>y@XG11l(UCz~?yX;?1|4mK28bD+wRXDhNHu zaUggLSg$sdU&&JoShfG=LbeZt<7ylk2QMv|@x7;OZo7I(isw;Jht~^7fgq`QIW=Ozw7bA3c;?#y=q{_ zZrF1yx(}+KeNRO8;mAOA&(M`HAyRg4fA8+N0~Ic5sIkM>&lc`9G-DY3WJU|@UrP$( zKfUpvWcE)4viv$m~rG!^I1K zGUf+gvXw9V$e3UFkTG7`pAwJdZ!D4VZ_uwIG9Z^UhRDDg?jfpxm#9%h6|hoKLR5i! zt5TwhQ*b{;Q~_V;#Y7d*$1EbMn8d6(1rSN`8gLOotWn+L!+Z!4odO8!6flC81NjeP zc>$#tPjm_(L|`EQ;D-DM<{{*fBtIYwE5RN}F65Ee>VyY6^2iUEM^p-Vh&-YoAmk0; zViECx`9#WuXg*O8hUjnw3t#bw2P}X*3&S8Ft`KpLhj_q3qEeB62m(Sr0FjVaKzkwo z0E+>rH{?5TWsda*^$-(YN?rqWA(w&t*Sf}z^_()=9@fwo^T3{p^xS5_l@&Q6iUZqa#ySc`*R`JQILiQ(9 zD3pz;6Y71c-e!%|-}@6%5a?n2Vqd8yeab$yrM;~S(xx1o`&3Own*@1UZ{Hvi z!cFiXk0efdFusEzVhHr|u=KL;qm_YA=)=n--7Wj*#(dt#I)l{De%#blU%NU%s~7TI z2zXy0?9JshDPbR-6q=gWHHVwg+NL&8b<(SrKG*GCl*jvg?4#2ShvD}5rewnV2BA@H z33(qbdyXWsK(L>`u7C}zytcGJzt7DjFVEai^TQkV{Qjg@4*l^FdY^x#d^hNQ zKJt$wU~{~x5e8{vd1$j4b^C^Vd&Ch>w60K@)a8Bc7fJVF0u|FLu~rnC)|p;2I>7X7 zo6(A9LfSMXTIUs-R=(9(Xj&a?|2CdT*`&3W6t3N_&KhfZnv=R!sM{E7IioAGc@9L- zM!H`X@s{{L^XOhR;+^})k*0(F1r_u@GXp(Xs~kx>5yu&}ej;xIz`hL- zRuBQ9rvjL5pNsunwtX)4f!X%C*f(a|=Rz(w+ddcj&usf#$nBzE0QJ5cYY^z7pHV*E zMc5Bx|BC%7K1Q*Rh4|-KiP!sGEeDNugC5$4e4qpVfiCvFsFxTq^h}?A=w$RA3<`U4 z#n*=3&tj7)J*M`vxkS)6LQwnJTq4L5BdGmsE)nF25!8M*H@;t1``KJEaGJ1xJ)e_9 zH$&|&^?D6)Q|vddm-w}ULrxn322&BQ1MH#z*XskuM_C?GrL6MXf#>(w?-{kf%^~}} z4f}Rw?jHNStM7ThP?hvZ=YNt0{a=N2sY4mne#Ua^>K^u@Urp4f=Z7Leu~5 zbLExB;j7r^!VaI_=N^0SqhrSZ_DIjSk9uL^XLD)8|L$|6yw9y(5oxZ&EKjq^<-Lds zPJ4v^>i$)~$A;U#{_j3FIsETFH}yRC|CN0%_P5xtV!w-hF7~yF`&{gM(c52UpS#?# z&&9nW_N96=2faApdY=ouT;O`23;j6YdY=mjT%QX=Zw|P=_tfXKdY_B$9qd!}J{Rpv z+~>l;HE_Mpg?%yLI>359aJ@djwMpW>7G`Nv_Py>N`#tO2_r4|R^?A;oI4e|uz3hbI z3HJ+$I0E*$_VSpt$&Eiv+~L|!vutneG}-sIb~1Zo8-Eht)k4-W;Z#CxZ0&TirA?D& zRdSj&4)iPC%&HCKSFn}MxR3RvKd<%q=FOg~BoEYi?S^w(J8(8_AK0doD^TaN3FozN zACM_rCkH^#*F?~`KCjj1BO^Vpy;{!kKo8>(_H&d?)0FetaHu<+c;2|W;RH-B37XE^ zvfm7d-bnvMw(*=wZ$nE!89l7v^A66at>kAjWruUuGEBR_bpRXeSNP;?FHGAJJ zH>3Yy#2cD2cVh~H+PS0D9k`AB)g(utMd)$)_qD(A(PPPV6K%bw(9 z>GWip03|F2NtO-2{T&f zO>#9RMW=cT`)@Au_*&bOr5SzB*;s!xKcTVF?O()W@+_C7aW*(~K?KY1aHUo5yyzbR~E& zt+n!_4RF%F(~KRr!;CG1M3Um*w(W7Jz0524nP#7qTVD*1S2^L2yKAuc2nxHH`YyBgvFYNUkmtO3ndP$JJX!mg<>(BAbaj(PQ}4T#>>E7Jr&qbb z@0-?nURCv7X6(3KW^CE3D(BYz@C5Z3{)=satlDjl50*7l?STlFF37Y%3vFTtfoK!c zsNc5R>=ofGu5*Tjnv`8<(^}#+t?t5KV@Xy|`})hS?qADyI%*uLr>0e>(j{CR$++YE zoTx=)ugtz@AWW7NwWIfAmpQTDEZVVlyOz!3HL%Jbeaeh}vVNf9Jt8aTw%qU%Gq(0s z(^6Il#Br_}eZ}{LDg|yè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 Nu^WSI=<6`-{6EnMkPZL< From 65a63fb73ee86ffae029567be7b891f8cb5ca8de Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 16:16:23 -0700 Subject: [PATCH 17/29] move checkForUpdates to menu to have option in menu --- interface/src/Application.cpp | 11 ++++------- interface/src/Menu.cpp | 7 +++++++ interface/src/Menu.h | 1 + 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b834097c8a..02c3dbf0f7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -64,7 +64,6 @@ #include "renderer/ProgramObject.h" #include "ui/TextRenderer.h" #include "Swatch.h" -#include "fvupdater.h" using namespace std; @@ -209,16 +208,14 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : NodeList::getInstance()->startSilentNodeRemovalThread(); _window->setCentralWidget(_glWidget); - -#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) - // if this is a release OS X build use fervor to check for an update - FvUpdater::sharedUpdater()->SetFeedURL("https://s3-us-west-1.amazonaws.com/highfidelity/appcast.xml"); - FvUpdater::sharedUpdater()->CheckForUpdatesSilent(); -#endif // call Menu getInstance static method to set up the menu _window->setMenuBar(Menu::getInstance()); +#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) + Menu::getInstance()->checkForUpdates(); +#endif + _networkAccessManager = new QNetworkAccessManager(this); QRect available = desktop()->availableGeometry(); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 56317b86a2..df9539cc1c 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -20,6 +20,7 @@ #include #include "Application.h" +#include "fvupdater.h" #include "PairingHandler.h" #include "Menu.h" #include "Util.h" @@ -459,6 +460,12 @@ void Menu::exportSettings() { } } +void Menu::checkForUpdates() { + qDebug() << "Checking if there are available updates.\n"; + // if this is a release OS X build use fervor to check for an update + FvUpdater::sharedUpdater()->SetFeedURL("https://s3-us-west-1.amazonaws.com/highfidelity/appcast.xml"); + FvUpdater::sharedUpdater()->CheckForUpdatesSilent(); +} void Menu::loadAction(QSettings* set, QAction* action) { if (action->isChecked() != set->value(action->text(), action->isChecked()).toBool()) { diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 2d871fd890..fbc89e762e 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -58,6 +58,7 @@ public slots: void saveSettings(QSettings* settings = NULL); void importSettings(); void exportSettings(); + void checkForUpdates(); private slots: void editPreferences(); From 329253d8e45259bd30d29c43fad1c16f328ed0b0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 19 Aug 2013 17:17:26 -0700 Subject: [PATCH 18/29] move update checking later in init, add menu option --- interface/src/Application.cpp | 9 +++++---- interface/src/Menu.cpp | 7 ++++++- interface/src/Menu.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 02c3dbf0f7..1785bf4d0c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -212,10 +212,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : // call Menu getInstance static method to set up the menu _window->setMenuBar(Menu::getInstance()); -#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) - Menu::getInstance()->checkForUpdates(); -#endif - _networkAccessManager = new QNetworkAccessManager(this); QRect available = desktop()->availableGeometry(); @@ -309,6 +305,11 @@ void Application::initializeGL() { // update before the first render update(0.0f); + + // now that things are drawn - if this is an OS X release build we can check for an update +#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) + Menu::getInstance()->checkForUpdates(); +#endif } void Application::paintGL() { diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index df9539cc1c..d80d972fb0 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -64,6 +64,11 @@ Menu::Menu() : this, SLOT(editPreferences())))->setMenuRole(QAction::PreferencesRole); +#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) + // show "Check for Updates" in the menu + (addActionToQMenuAndActionHash(fileMenu, MenuOption::CheckForUpdates, 0, this, SLOT(checkForUpdates())))->setMenuRole(QAction::ApplicationSpecificRole); +#endif + QMenu* pairMenu = addMenu("Pair"); addActionToQMenuAndActionHash(pairMenu, MenuOption::Pair, 0, PairingHandler::getInstance(), SLOT(sendPairRequest())); @@ -463,7 +468,7 @@ void Menu::exportSettings() { void Menu::checkForUpdates() { qDebug() << "Checking if there are available updates.\n"; // if this is a release OS X build use fervor to check for an update - FvUpdater::sharedUpdater()->SetFeedURL("https://s3-us-west-1.amazonaws.com/highfidelity/appcast.xml"); + FvUpdater::sharedUpdater()->SetFeedURL("file://localhost/Users/birarda/Desktop/appcast.xml"); FvUpdater::sharedUpdater()->CheckForUpdatesSilent(); } diff --git a/interface/src/Menu.h b/interface/src/Menu.h index fbc89e762e..e399101702 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -113,6 +113,7 @@ namespace MenuOption { const QString Atmosphere = "Atmosphere"; const QString Bandwidth = "Bandwidth Display"; const QString BandwidthDetails = "Bandwidth Details"; + const QString CheckForUpdates = "Check for Updates..."; const QString Collisions = "Collisions"; const QString CopyVoxels = "Copy Voxels"; const QString CoverageMap = "Render Coverage Map"; From 71edaa247241f67db71e6912c7e45aa8d1dcf9a6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Aug 2013 09:55:48 -0700 Subject: [PATCH 19/29] replace appcast url with highfidelity s3 bucket link --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index d80d972fb0..67bb1d3f8e 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -468,7 +468,7 @@ void Menu::exportSettings() { void Menu::checkForUpdates() { qDebug() << "Checking if there are available updates.\n"; // if this is a release OS X build use fervor to check for an update - FvUpdater::sharedUpdater()->SetFeedURL("file://localhost/Users/birarda/Desktop/appcast.xml"); + FvUpdater::sharedUpdater()->SetFeedURL("http://s3.highfidelity.io/appcast.xml"); FvUpdater::sharedUpdater()->CheckForUpdatesSilent(); } From 05c9ca71318e2d0fe0835224c5a284ea1ef4ae15 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Aug 2013 09:56:50 -0700 Subject: [PATCH 20/29] remove unneeded package finds in interface CMakeLists --- interface/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 3930d57a61..2adc7e6643 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -50,8 +50,6 @@ find_package(Qt5Gui REQUIRED) find_package(Qt5Network REQUIRED) find_package(Qt5OpenGL REQUIRED) find_package(Qt5Svg REQUIRED) -find_package(Qt5WebKit REQUIRED) -find_package(Qt5Widgets REQUIRED) if (APPLE) # set how the icon shows up in the Info.plist file From 13f5b7f68d6038fbee2872be4b40031a7410151f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Aug 2013 10:02:06 -0700 Subject: [PATCH 21/29] change application name to Interface --- interface/resources/info/ApplicationInfo.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/info/ApplicationInfo.ini b/interface/resources/info/ApplicationInfo.ini index 76e481ffce..a1d1603172 100644 --- a/interface/resources/info/ApplicationInfo.ini +++ b/interface/resources/info/ApplicationInfo.ini @@ -1,5 +1,5 @@ [INFO] -name=interface +name=Interface version=0.0.1 organizationName=High Fidelity organizationDomain=highfidelity.io \ No newline at end of file From 7f4557fe1a32f132c8d93076fa1f51cc7b75393d Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 10:50:25 -0700 Subject: [PATCH 22/29] Add blur scale uniform. --- .../src/renderer/AmbientOcclusionEffect.cpp | 20 ++++++++++--------- .../src/renderer/AmbientOcclusionEffect.h | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index ff86615b26..f4931c5f71 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -32,15 +32,6 @@ void AmbientOcclusionEffect::init() { _occlusionProgram->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/ambient_occlusion.frag"); _occlusionProgram->link(); - _blurProgram = new ProgramObject(); - _blurProgram->addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/ambient_occlusion.vert"); - _blurProgram->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/occlusion_blur.frag"); - _blurProgram->link(); - - _blurProgram->bind(); - _blurProgram->setUniformValue("originalTexture", 0); - _blurProgram->release(); - // create the sample kernel: an array of spherically distributed offset vectors const int SAMPLE_KERNEL_SIZE = 16; QVector3D sampleKernel[SAMPLE_KERNEL_SIZE]; @@ -83,6 +74,17 @@ void AmbientOcclusionEffect::init() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); + + _blurProgram = new ProgramObject(); + _blurProgram->addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/ambient_occlusion.vert"); + _blurProgram->addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/occlusion_blur.frag"); + _blurProgram->link(); + + _blurProgram->bind(); + _blurProgram->setUniformValue("originalTexture", 0); + _blurProgram->release(); + + _blurScaleLocation = _blurProgram->uniformLocation("blurScale"); } void AmbientOcclusionEffect::render() { diff --git a/interface/src/renderer/AmbientOcclusionEffect.h b/interface/src/renderer/AmbientOcclusionEffect.h index d41bb65381..416d97c236 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.h +++ b/interface/src/renderer/AmbientOcclusionEffect.h @@ -32,6 +32,7 @@ private: int _noiseScaleLocation; ProgramObject* _blurProgram; + int _blurScaleLocation; GLuint _rotationTextureID; }; From 1d74860877ae59e3d19fb15660e8853d8056779b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 10:51:55 -0700 Subject: [PATCH 23/29] Need to #ifdef this out to avoid linking against nonexistent quazip on Linux. --- interface/src/Menu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 1e55c8f911..b435604d3f 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -467,10 +467,12 @@ void Menu::exportSettings() { } void Menu::checkForUpdates() { +#if defined(Q_OS_MAC) && defined(QT_NO_DEBUG) qDebug() << "Checking if there are available updates.\n"; // if this is a release OS X build use fervor to check for an update FvUpdater::sharedUpdater()->SetFeedURL("http://s3.highfidelity.io/appcast.xml"); FvUpdater::sharedUpdater()->CheckForUpdatesSilent(); +#endif } void Menu::loadAction(QSettings* set, QAction* action) { From 22598ceb4f702ad04b6d45ce18a90cd381884200 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 11:52:43 -0700 Subject: [PATCH 24/29] Optimizations for occlusion blur (the main one being that we only need to sample the texture four, not sixteen, times if we turn on linear filtering and sample between the texels). --- .../resources/shaders/occlusion_blur.frag | 19 +++++++------- .../src/renderer/AmbientOcclusionEffect.cpp | 5 ++-- interface/src/renderer/TextureCache.cpp | 25 +++++++++++++------ interface/src/renderer/TextureCache.h | 2 ++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/interface/resources/shaders/occlusion_blur.frag b/interface/resources/shaders/occlusion_blur.frag index 2ee5eaf2cb..5b86aec68d 100644 --- a/interface/resources/shaders/occlusion_blur.frag +++ b/interface/resources/shaders/occlusion_blur.frag @@ -11,15 +11,14 @@ // the original texture uniform sampler2D originalTexture; +// the scale for the blur kernel +uniform vec2 blurScale; + void main(void) { - float ds = dFdx(gl_TexCoord[0].s); - float dt = dFdy(gl_TexCoord[0].t); - vec4 sum = vec4(0.0, 0.0, 0.0, 0.0); - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - sum += texture2D(originalTexture, gl_TexCoord[0].st + - vec2(ds, dt) * vec2(-2.0 + float(i), -2.0 + float(j))); - } - } - gl_FragColor = sum / 16.0; + vec2 minExtents = gl_TexCoord[0].st + blurScale * vec2(-0.5, -0.5); + vec2 maxExtents = gl_TexCoord[0].st + blurScale * vec2(1.5, 1.5); + gl_FragColor = (texture2D(originalTexture, minExtents) + + texture2D(originalTexture, vec2(maxExtents.s, minExtents.t)) + + texture2D(originalTexture, vec2(minExtents.s, maxExtents.t)) + + texture2D(originalTexture, maxExtents)) * 0.25; } diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index f4931c5f71..184298fd06 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -112,8 +112,8 @@ void AmbientOcclusionEffect::render() { _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); _occlusionProgram->setUniformValue(_rightTopLocation, right, top); QSize size = Application::getInstance()->getGLWidget()->size(); - _occlusionProgram->setUniformValue(_noiseScaleLocation, size.width() / (float)ROTATION_WIDTH, - size.height() / (float)ROTATION_HEIGHT); + QVector2D noiseScale(size.width() / (float)ROTATION_WIDTH, size.height() / (float)ROTATION_HEIGHT); + _occlusionProgram->setUniformValue(_noiseScaleLocation, noiseScale); renderFullscreenQuad(); @@ -133,6 +133,7 @@ void AmbientOcclusionEffect::render() { glBindTexture(GL_TEXTURE_2D, secondaryFBO->texture()); _blurProgram->bind(); + _blurProgram->setUniformValue(_blurScaleLocation, 1.0f / size.width(), 1.0f / size.height()); renderFullscreenQuad(); diff --git a/interface/src/renderer/TextureCache.cpp b/interface/src/renderer/TextureCache.cpp index 5696475487..603ff2ccf0 100644 --- a/interface/src/renderer/TextureCache.cpp +++ b/interface/src/renderer/TextureCache.cpp @@ -64,12 +64,11 @@ GLuint TextureCache::getPermutationNormalTextureID() { QOpenGLFramebufferObject* TextureCache::getPrimaryFramebufferObject() { if (_primaryFramebufferObject == NULL) { - QSize size = Application::getInstance()->getGLWidget()->size(); - _primaryFramebufferObject = new QOpenGLFramebufferObject(size); - Application::getInstance()->getGLWidget()->installEventFilter(this); - + _primaryFramebufferObject = createFramebufferObject(); + glGenTextures(1, &_primaryDepthTextureID); glBindTexture(GL_TEXTURE_2D, _primaryDepthTextureID); + QSize size = Application::getInstance()->getGLWidget()->size(); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.width(), size.height(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -91,16 +90,14 @@ GLuint TextureCache::getPrimaryDepthTextureID() { QOpenGLFramebufferObject* TextureCache::getSecondaryFramebufferObject() { if (_secondaryFramebufferObject == NULL) { - _secondaryFramebufferObject = new QOpenGLFramebufferObject(Application::getInstance()->getGLWidget()->size()); - Application::getInstance()->getGLWidget()->installEventFilter(this); + _secondaryFramebufferObject = createFramebufferObject(); } return _secondaryFramebufferObject; } QOpenGLFramebufferObject* TextureCache::getTertiaryFramebufferObject() { if (_tertiaryFramebufferObject == NULL) { - _tertiaryFramebufferObject = new QOpenGLFramebufferObject(Application::getInstance()->getGLWidget()->size()); - Application::getInstance()->getGLWidget()->installEventFilter(this); + _tertiaryFramebufferObject = createFramebufferObject(); } return _tertiaryFramebufferObject; } @@ -124,3 +121,15 @@ bool TextureCache::eventFilter(QObject* watched, QEvent* event) { } return false; } + +QOpenGLFramebufferObject* TextureCache::createFramebufferObject() { + QOpenGLFramebufferObject* fbo = new QOpenGLFramebufferObject(Application::getInstance()->getGLWidget()->size()); + Application::getInstance()->getGLWidget()->installEventFilter(this); + + glBindTexture(GL_TEXTURE_2D, fbo->texture()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D, 0); + + return fbo; +} diff --git a/interface/src/renderer/TextureCache.h b/interface/src/renderer/TextureCache.h index 1f2fc96ac5..9be048f398 100644 --- a/interface/src/renderer/TextureCache.h +++ b/interface/src/renderer/TextureCache.h @@ -46,6 +46,8 @@ public: private: + QOpenGLFramebufferObject* createFramebufferObject(); + GLuint _permutationNormalTextureID; QOpenGLFramebufferObject* _primaryFramebufferObject; From 146e9176eb88ebcf40313bc6d767265d1e0fd241 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Aug 2013 13:06:30 -0700 Subject: [PATCH 25/29] switch to one channel from PortAudio to resolve USB error --- interface/src/Audio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 449ec55a16..0d4b268fcc 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -407,7 +407,7 @@ Audio::Audio(Oscilloscope* scope, int16_t initialJitterBufferSamples) : return; } - inputParameters.channelCount = 2; // Stereo input + inputParameters.channelCount = 1; // Stereo input inputParameters.sampleFormat = (paInt16 | paNonInterleaved); inputParameters.suggestedLatency = Pa_GetDeviceInfo(inputParameters.device)->defaultLowInputLatency; inputParameters.hostApiSpecificStreamInfo = NULL; From 11be8c752baa685e1481ebf8819d919881985ec9 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 13:40:45 -0700 Subject: [PATCH 26/29] Cleanup. --- interface/src/renderer/AmbientOcclusionEffect.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/renderer/AmbientOcclusionEffect.cpp b/interface/src/renderer/AmbientOcclusionEffect.cpp index 184298fd06..368546a566 100644 --- a/interface/src/renderer/AmbientOcclusionEffect.cpp +++ b/interface/src/renderer/AmbientOcclusionEffect.cpp @@ -112,8 +112,8 @@ void AmbientOcclusionEffect::render() { _occlusionProgram->setUniformValue(_leftBottomLocation, left, bottom); _occlusionProgram->setUniformValue(_rightTopLocation, right, top); QSize size = Application::getInstance()->getGLWidget()->size(); - QVector2D noiseScale(size.width() / (float)ROTATION_WIDTH, size.height() / (float)ROTATION_HEIGHT); - _occlusionProgram->setUniformValue(_noiseScaleLocation, noiseScale); + _occlusionProgram->setUniformValue(_noiseScaleLocation, size.width() / (float)ROTATION_WIDTH, + size.height() / (float)ROTATION_HEIGHT); renderFullscreenQuad(); @@ -141,7 +141,6 @@ void AmbientOcclusionEffect::render() { glBindTexture(GL_TEXTURE_2D, 0); - //glEnable(GL_BLEND); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_CONSTANT_ALPHA, GL_ONE); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); From 5b923bc6f27d63ae3ffc141a253e4362dacff29b Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 20 Aug 2013 13:46:13 -0700 Subject: [PATCH 27/29] More cleanup. --- interface/resources/shaders/ambient_occlusion.frag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/shaders/ambient_occlusion.frag b/interface/resources/shaders/ambient_occlusion.frag index b59c87d797..a62d1d3a71 100644 --- a/interface/resources/shaders/ambient_occlusion.frag +++ b/interface/resources/shaders/ambient_occlusion.frag @@ -59,7 +59,7 @@ void main(void) { vec3 offset = center + rotation * (radius * sampleKernel[i]); vec4 projected = gl_ProjectionMatrix * vec4(offset, 1.0); float depth = texCoordToViewSpaceZ(projected.xy * 0.5 / projected.w + vec2(0.5, 0.5)); - occlusion += 1.0 - step(offset.z, depth); // * step(abs(center.z - depth), radius); + occlusion += 1.0 - step(offset.z, depth); } gl_FragColor = vec4(occlusion, occlusion, occlusion, 0.0) / 16.0; From 7e1b682663a552d772209c80a6b057e126f50838 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 20 Aug 2013 14:55:29 -0700 Subject: [PATCH 28/29] switch OS X base SDK to 10.7 --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77ae85589d..7a664c4ce4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ project(hifi) set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH}) +# set our Base SDK to 10.7 +set(CMAKE_OSX_SYSROOT /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk) + # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. From 22a2603eaae05c01c3f5aa88f181c1727032959b Mon Sep 17 00:00:00 2001 From: atlante45 Date: Tue, 20 Aug 2013 15:28:08 -0700 Subject: [PATCH 29/29] Several VoxelSystems can have different view frustum --- interface/src/VoxelSystem.cpp | 30 +++++++++++++++--------------- interface/src/VoxelSystem.h | 3 +++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 974595216b..59f55cf4b6 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -65,6 +65,8 @@ VoxelSystem::VoxelSystem(float treeScale, int maxVoxels) : _falseColorizeBySource = false; _dataSourceID = UNKNOWN_NODE_ID; _voxelServerCount = 0; + + _viewFrustum = Application::getInstance()->getViewFrustum(); } void VoxelSystem::nodeDeleted(VoxelNode* node) { @@ -394,7 +396,7 @@ int VoxelSystem::newTreeToArrays(VoxelNode* node) { int voxelsUpdated = 0; bool shouldRender = false; // assume we don't need to render it // if it's colored, we might need to render it! - shouldRender = node->calculateShouldRender(Application::getInstance()->getViewFrustum()); + shouldRender = node->calculateShouldRender(_viewFrustum); node->setShouldRender(shouldRender); // let children figure out their renderness @@ -813,10 +815,8 @@ bool VoxelSystem::falseColorizeInViewOperation(VoxelNode* node, void* extraData) } void VoxelSystem::falseColorizeInView() { - ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum(); - _nodeCount = 0; - _tree->recurseTreeWithOperation(falseColorizeInViewOperation,(void*)viewFrustum); + _tree->recurseTreeWithOperation(falseColorizeInViewOperation,(void*)_viewFrustum); qDebug("setting in view false color for %d nodes\n", _nodeCount); _tree->setDirtyBit(); setupNewVoxelsForDrawing(); @@ -942,15 +942,13 @@ bool VoxelSystem::getDistanceFromViewRangeOperation(VoxelNode* node, void* extra } void VoxelSystem::falseColorizeDistanceFromView() { - ViewFrustum* viewFrustum = Application::getInstance()->getViewFrustum(); - _nodeCount = 0; _maxDistance = 0.0; _minDistance = FLT_MAX; - _tree->recurseTreeWithOperation(getDistanceFromViewRangeOperation, (void*) viewFrustum); + _tree->recurseTreeWithOperation(getDistanceFromViewRangeOperation, (void*) _viewFrustum); qDebug("determining distance range for %d nodes\n", _nodeCount); _nodeCount = 0; - _tree->recurseTreeWithOperation(falseColorizeDistanceFromViewOperation, (void*) viewFrustum); + _tree->recurseTreeWithOperation(falseColorizeDistanceFromViewOperation, (void*) _viewFrustum); qDebug("setting in distance false color for %d nodes\n", _nodeCount); _tree->setDirtyBit(); setupNewVoxelsForDrawing(); @@ -960,6 +958,7 @@ void VoxelSystem::falseColorizeDistanceFromView() { class removeOutOfViewArgs { public: VoxelSystem* thisVoxelSystem; + ViewFrustum* thisViewFrustum; VoxelNodeBag dontRecurseBag; unsigned long nodesScanned; unsigned long nodesRemoved; @@ -969,6 +968,7 @@ public: removeOutOfViewArgs(VoxelSystem* voxelSystem) : thisVoxelSystem(voxelSystem), + thisViewFrustum(voxelSystem->getViewFrustum()), dontRecurseBag(), nodesScanned(0), nodesRemoved(0), @@ -997,7 +997,7 @@ bool VoxelSystem::removeOutOfViewOperation(VoxelNode* node, void* extraData) { for (int i = 0; i < NUMBER_OF_CHILDREN; i++) { VoxelNode* childNode = node->getChildAtIndex(i); if (childNode) { - ViewFrustum::location inFrustum = childNode->inFrustum(*Application::getInstance()->getViewFrustum()); + ViewFrustum::location inFrustum = childNode->inFrustum(*args->thisViewFrustum); switch (inFrustum) { case ViewFrustum::OUTSIDE: { args->nodesOutside++; @@ -1031,9 +1031,9 @@ bool VoxelSystem::isViewChanging() { bool result = false; // assume the best // If our viewFrustum has changed since our _lastKnowViewFrustum - if (!_lastKnowViewFrustum.matches(Application::getInstance()->getViewFrustum())) { + if (!_lastKnowViewFrustum.matches(_viewFrustum)) { result = true; - _lastKnowViewFrustum = *Application::getInstance()->getViewFrustum(); // save last known + _lastKnowViewFrustum = *_viewFrustum; // save last known } return result; } @@ -1047,9 +1047,9 @@ bool VoxelSystem::hasViewChanged() { } // If our viewFrustum has changed since our _lastKnowViewFrustum - if (!_lastStableViewFrustum.matches(Application::getInstance()->getViewFrustum())) { + if (!_lastStableViewFrustum.matches(_viewFrustum)) { result = true; - _lastStableViewFrustum = *Application::getInstance()->getViewFrustum(); // save last stable + _lastStableViewFrustum = *_viewFrustum; // save last stable } return result; } @@ -1403,7 +1403,7 @@ void VoxelSystem::falseColorizeOccluded() { myCoverageMap.erase(); FalseColorizeOccludedArgs args; - args.viewFrustum = Application::getInstance()->getViewFrustum(); + args.viewFrustum = _viewFrustum; args.map = &myCoverageMap; args.totalVoxels = 0; args.coloredVoxels = 0; @@ -1525,7 +1525,7 @@ void VoxelSystem::falseColorizeOccludedV2() { VoxelProjectedPolygon::intersects_calls = 0; FalseColorizeOccludedArgs args; - args.viewFrustum = Application::getInstance()->getViewFrustum(); + args.viewFrustum = _viewFrustum; args.mapV2 = &myCoverageMapV2; args.totalVoxels = 0; args.coloredVoxels = 0; diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index c55bd552db..240d12f0f1 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -43,6 +43,8 @@ public: void simulate(float deltaTime) { }; void render(bool texture); + ViewFrustum* getViewFrustum() const {return _viewFrustum;} + void setViewFrustum(ViewFrustum* viewFrustum) {_viewFrustum = viewFrustum;} unsigned long getVoxelsUpdated() const {return _voxelsUpdated;}; unsigned long getVoxelsRendered() const {return _voxelsInReadArrays;}; @@ -182,6 +184,7 @@ private: ViewFrustum _lastKnowViewFrustum; ViewFrustum _lastStableViewFrustum; + ViewFrustum* _viewFrustum; int newTreeToArrays(VoxelNode *currentNode); void cleanupRemovedVoxels();