From 47fb85eaeb4057edbe2f302a4957c080923e3910 Mon Sep 17 00:00:00 2001
From: Seth Alves <seth.alves@gmail.com>
Date: Tue, 22 Mar 2016 11:24:12 -0700
Subject: [PATCH 1/7] be more defensive in FBXGeometry::convexHullContains

---
 libraries/fbx/src/FBXReader.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp
index b2ede33e01..de8c001566 100644
--- a/libraries/fbx/src/FBXReader.cpp
+++ b/libraries/fbx/src/FBXReader.cpp
@@ -78,10 +78,14 @@ bool FBXGeometry::convexHullContains(const glm::vec3& point) const {
 
     auto checkEachPrimitive = [=](FBXMesh& mesh, QVector<int> indices, int primitiveSize) -> bool {
         // Check whether the point is "behind" all the primitives.
+        int verticesSize = mesh.vertices.size();
         for (int j = 0;
              j < indices.size() - 2; // -2 in case the vertices aren't the right size -- we access j + 2 below
              j += primitiveSize) {
-            if (!isPointBehindTrianglesPlane(point,
+            if (indices[j] < verticesSize &&
+                indices[j + 1] < verticesSize &&
+                indices[j + 2] < verticesSize &&
+                !isPointBehindTrianglesPlane(point,
                                              mesh.vertices[indices[j]],
                                              mesh.vertices[indices[j + 1]],
                                              mesh.vertices[indices[j + 2]])) {

From 691ee87c737fbbd9a56fe7db32052157ea313edd Mon Sep 17 00:00:00 2001
From: Brad Hefta-Gaub <brad@highfidelity.io>
Date: Tue, 22 Mar 2016 11:32:38 -0700
Subject: [PATCH 2/7] fix to default avatar model

---
 libraries/avatars/src/AvatarData.cpp | 3 ++-
 libraries/avatars/src/AvatarData.h   | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp
index 93d2ebb5da..290aaff820 100644
--- a/libraries/avatars/src/AvatarData.cpp
+++ b/libraries/avatars/src/AvatarData.cpp
@@ -968,9 +968,10 @@ bool AvatarData::hasIdentityChangedAfterParsing(const QByteArray& data) {
 
     bool hasIdentityChanged = false;
 
-    if (skeletonModelURL != _skeletonModelURL) {
+    if (_firstSkeletonCheck || (skeletonModelURL != _skeletonModelURL)) {
         setSkeletonModelURL(skeletonModelURL);
         hasIdentityChanged = true;
+        _firstSkeletonCheck = false;
     }
 
     if (displayName != _displayName) {
diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h
index 8a6b558383..900da38ffa 100644
--- a/libraries/avatars/src/AvatarData.h
+++ b/libraries/avatars/src/AvatarData.h
@@ -368,7 +368,8 @@ protected:
 
     HeadData* _headData;
 
-    QUrl _skeletonModelURL; // These need to be empty so that on first time setting them they will not short circuit
+    QUrl _skeletonModelURL;
+    bool _firstSkeletonCheck { true };
     QUrl _skeletonFBXURL;
     QVector<AttachmentData> _attachmentData;
     QString _displayName;

From 64ced6ee049c96e0c473e4bccd5419438878a49a Mon Sep 17 00:00:00 2001
From: Zach Pomerantz <zach@highfidelity.io>
Date: Tue, 22 Mar 2016 12:04:24 -0700
Subject: [PATCH 3/7] Add comment explaining bare glGetError

---
 libraries/gpu/src/gpu/GLBackend.cpp            | 7 ++-----
 plugins/oculus/src/OculusBaseDisplayPlugin.cpp | 2 +-
 plugins/openvr/src/OpenVrDisplayPlugin.cpp     | 2 +-
 3 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/libraries/gpu/src/gpu/GLBackend.cpp b/libraries/gpu/src/gpu/GLBackend.cpp
index 14e4397b83..2c25255a80 100644
--- a/libraries/gpu/src/gpu/GLBackend.cpp
+++ b/libraries/gpu/src/gpu/GLBackend.cpp
@@ -87,18 +87,15 @@ void GLBackend::init() {
     static std::once_flag once;
     std::call_once(once, [] {
         qCDebug(gpulogging) << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
-
         qCDebug(gpulogging) << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
-
         qCDebug(gpulogging) << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
-
         qCDebug(gpulogging) << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
 
         glewExperimental = true;
         GLenum err = glewInit();
-        glGetError();
+        glGetError(); // clear the potential error from glewExperimental
         if (GLEW_OK != err) {
-            /* Problem: glewInit failed, something is seriously wrong. */
+            // glewInit failed, something is seriously wrong.
             qCDebug(gpulogging, "Error: %s\n", glewGetErrorString(err));
         }
         qCDebug(gpulogging, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION));
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
index 9d0838606e..29fc014a64 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
@@ -30,7 +30,7 @@ bool OculusBaseDisplayPlugin::isSupported() const {
 void OculusBaseDisplayPlugin::customizeContext() {
     glewExperimental = true;
     GLenum err = glewInit();
-    glGetError();
+    glGetError(); // clear the potential error from glewExperimental
     Parent::customizeContext();
 }
 
diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
index 843b70807d..0cd9bac15f 100644
--- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp
+++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
@@ -101,7 +101,7 @@ void OpenVrDisplayPlugin::customizeContext() {
     std::call_once(once, []{
         glewExperimental = true;
         GLenum err = glewInit();
-        glGetError();
+        glGetError(); // clear the potential error from glewExperimental
     });
     Parent::customizeContext();
 }

From 23e3b7e4e3bf93dca28f06b2fb6ac248edc0460d Mon Sep 17 00:00:00 2001
From: Zach Pomerantz <zach@highfidelity.io>
Date: Tue, 22 Mar 2016 12:04:58 -0700
Subject: [PATCH 4/7] Rm extra GL logging

---
 libraries/gl/src/gl/GLWindow.cpp          |  8 --------
 libraries/gl/src/gl/OffscreenGLCanvas.cpp | 11 -----------
 2 files changed, 19 deletions(-)

diff --git a/libraries/gl/src/gl/GLWindow.cpp b/libraries/gl/src/gl/GLWindow.cpp
index 78c7666d25..bde33ed170 100644
--- a/libraries/gl/src/gl/GLWindow.cpp
+++ b/libraries/gl/src/gl/GLWindow.cpp
@@ -39,14 +39,6 @@ GLWindow::~GLWindow() {
 bool GLWindow::makeCurrent() {
     bool makeCurrentResult = _context->makeCurrent(this);
     Q_ASSERT(makeCurrentResult);
-    
-    std::call_once(_reportOnce, []{
-        qDebug() << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
-        qDebug() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
-        qDebug() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
-        qDebug() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
-    });
-    
     Q_ASSERT(_context == QOpenGLContext::currentContext());
     
     return makeCurrentResult;
diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.cpp b/libraries/gl/src/gl/OffscreenGLCanvas.cpp
index 7406577814..ddca53d2f4 100644
--- a/libraries/gl/src/gl/OffscreenGLCanvas.cpp
+++ b/libraries/gl/src/gl/OffscreenGLCanvas.cpp
@@ -44,10 +44,6 @@ bool OffscreenGLCanvas::create(QOpenGLContext* sharedContext) {
         return true;
     }
 
-    qWarning() << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
-    qWarning() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
-    qWarning() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
-    qWarning() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
     qWarning() << "Failed to create OffscreenGLCanvas";
 
     return false;
@@ -57,13 +53,6 @@ bool OffscreenGLCanvas::makeCurrent() {
     bool result = _context->makeCurrent(_offscreenSurface);
     Q_ASSERT(result);
     
-    std::call_once(_reportOnce, []{
-        qDebug() << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
-        qDebug() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
-        qDebug() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
-        qDebug() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
-    });
-
 #ifdef DEBUG
     if (result && !_logger) {
         _logger = new QOpenGLDebugLogger(this);

From 362e288be8ef18d466e13db1dbea4bb6a00a7b8b Mon Sep 17 00:00:00 2001
From: Zach Pomerantz <zach@highfidelity.io>
Date: Tue, 22 Mar 2016 12:05:24 -0700
Subject: [PATCH 5/7] Rm mystery GL error before qml fbo

---
 libraries/gl/src/gl/OffscreenQmlSurface.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
index 0a3598e840..0f7a30a7d8 100644
--- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp
+++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
@@ -187,6 +187,15 @@ bool OffscreenQmlRenderThread::event(QEvent *e) {
 void OffscreenQmlRenderThread::setupFbo() {
     using namespace oglplus;
     _textures.setSize(_size);
+
+    // Before making any ogl calls, clear any outstanding errors
+    // FIXME: Something upstream is polluting the context with a GL_INVALID_ENUM,
+    //        likely from glewExperimental = true
+    GLenum err = glGetError();
+    if (err != GLEW_OK) {
+        qDebug() << "Clearing outstanding GL error to set up QML FBO:" << glewGetErrorString(err);
+    }
+
     _depthStencil.reset(new Renderbuffer());
     Context::Bound(Renderbuffer::Target::Renderbuffer, *_depthStencil)
         .Storage(

From 471ac80135cd6d46a33acfd9ee4bb73012c3ad1b Mon Sep 17 00:00:00 2001
From: Zach Pomerantz <zach@highfidelity.io>
Date: Tue, 22 Mar 2016 13:24:29 -0700
Subject: [PATCH 6/7] Revert most of "Rm extra GL logging"

---
 libraries/gl/src/gl/GLWindow.cpp          | 8 ++++++++
 libraries/gl/src/gl/OffscreenGLCanvas.cpp | 9 +++++++--
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/libraries/gl/src/gl/GLWindow.cpp b/libraries/gl/src/gl/GLWindow.cpp
index bde33ed170..78c7666d25 100644
--- a/libraries/gl/src/gl/GLWindow.cpp
+++ b/libraries/gl/src/gl/GLWindow.cpp
@@ -39,6 +39,14 @@ GLWindow::~GLWindow() {
 bool GLWindow::makeCurrent() {
     bool makeCurrentResult = _context->makeCurrent(this);
     Q_ASSERT(makeCurrentResult);
+    
+    std::call_once(_reportOnce, []{
+        qDebug() << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
+        qDebug() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
+        qDebug() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
+        qDebug() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
+    });
+    
     Q_ASSERT(_context == QOpenGLContext::currentContext());
     
     return makeCurrentResult;
diff --git a/libraries/gl/src/gl/OffscreenGLCanvas.cpp b/libraries/gl/src/gl/OffscreenGLCanvas.cpp
index ddca53d2f4..31bbc84cb2 100644
--- a/libraries/gl/src/gl/OffscreenGLCanvas.cpp
+++ b/libraries/gl/src/gl/OffscreenGLCanvas.cpp
@@ -44,8 +44,6 @@ bool OffscreenGLCanvas::create(QOpenGLContext* sharedContext) {
         return true;
     }
 
-    qWarning() << "Failed to create OffscreenGLCanvas";
-
     return false;
 }
 
@@ -53,6 +51,13 @@ bool OffscreenGLCanvas::makeCurrent() {
     bool result = _context->makeCurrent(_offscreenSurface);
     Q_ASSERT(result);
     
+    std::call_once(_reportOnce, []{
+        qDebug() << "GL Version: " << QString((const char*) glGetString(GL_VERSION));
+        qDebug() << "GL Shader Language Version: " << QString((const char*) glGetString(GL_SHADING_LANGUAGE_VERSION));
+        qDebug() << "GL Vendor: " << QString((const char*) glGetString(GL_VENDOR));
+        qDebug() << "GL Renderer: " << QString((const char*) glGetString(GL_RENDERER));
+    });
+
 #ifdef DEBUG
     if (result && !_logger) {
         _logger = new QOpenGLDebugLogger(this);

From e28a876629636c74dbfcd8d27444847146d3ef3a Mon Sep 17 00:00:00 2001
From: Zach Pomerantz <zach@highfidelity.io>
Date: Tue, 22 Mar 2016 13:25:43 -0700
Subject: [PATCH 7/7] Compare gl to GL_NO_ERROR, not GLEW_OK

---
 libraries/gl/src/gl/OffscreenQmlSurface.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
index 0f7a30a7d8..563c590874 100644
--- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp
+++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp
@@ -192,7 +192,7 @@ void OffscreenQmlRenderThread::setupFbo() {
     // FIXME: Something upstream is polluting the context with a GL_INVALID_ENUM,
     //        likely from glewExperimental = true
     GLenum err = glGetError();
-    if (err != GLEW_OK) {
+    if (err != GL_NO_ERROR) {
         qDebug() << "Clearing outstanding GL error to set up QML FBO:" << glewGetErrorString(err);
     }