diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 2eb54331c8..a7ff3827f0 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -667,20 +667,28 @@ void GeometryCache::renderWireCube(float size) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottomRight, int quadID) { +void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, int quadID) { bool registeredQuad = (quadID != UNKNOWN_QUAD_ID); - Vec2Pair key(topLeft, bottomRight); + Vec2Pair key(minCorner, maxCorner); VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[quadID] : _quad2DVBOs[key]; // if this is a registered quad, and we have buffers, then clear them and rebuild // TODO: would be nice to only rebuild if the geometry changed from last time. if (registeredQuad && vbo.first != 0) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + Vec2Pair& lastKey = _lastRegisteredQuad2D[quadID]; + if (lastKey != key) { + glDeleteBuffers(1, &vbo.first); + glDeleteBuffers(1, &vbo.second); + vbo.first = vbo.second = 0; + #ifdef WANT_DEBUG + qDebug() << "renderQuad() vec2... RELEASING REGISTERED QUAD"; + #endif // def WANT_DEBUG + } #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec2... RELEASING REGISTERED QUAD"; + else { + qDebug() << "renderQuad() vec2... REUSING PREVIOUSLY REGISTERED QUAD"; + } #endif // def WANT_DEBUG } @@ -688,20 +696,21 @@ void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottom const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 4; const int indices = 4; - if (vbo.first == 0) { + if (vbo.first == 0) { + _lastRegisteredQuad2D[quadID] = key; int vertexPoints = vertices * FLOATS_PER_VERTEX; GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad GLfloat* vertex = vertexData; static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; - vertex[0] = topLeft.x; - vertex[1] = topLeft.y; - vertex[2] = bottomRight.x; - vertex[3] = topLeft.y; - vertex[4] = bottomRight.x; - vertex[5] = bottomRight.y; - vertex[6] = topLeft.x; - vertex[7] = bottomRight.y; + vertex[0] = minCorner.x; + vertex[1] = minCorner.y; + vertex[2] = maxCorner.x; + vertex[3] = minCorner.y; + vertex[4] = maxCorner.x; + vertex[5] = maxCorner.y; + vertex[6] = minCorner.x; + vertex[7] = maxCorner.y; glGenBuffers(1, &vbo.first); glBindBuffer(GL_ARRAY_BUFFER, vbo.first); @@ -741,21 +750,28 @@ void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottom } -void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottomRight, - const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomRight, int quadID) { +void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, + const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, int quadID) { bool registeredQuad = (quadID != UNKNOWN_QUAD_ID); - Vec2PairPair key(Vec2Pair(topLeft, bottomRight), Vec2Pair(texCoordTopLeft, texCoordBottomRight)); + Vec2PairPair key(Vec2Pair(minCorner, maxCorner), Vec2Pair(texCoordMinCorner, texCoordMaxCorner)); VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[quadID] : _quad2DTextureVBOs[key]; // if this is a registered quad, and we have buffers, then clear them and rebuild - // TODO: would be nice to only rebuild if the geometry changed from last time. if (registeredQuad && vbo.first != 0) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + Vec2PairPair& lastKey = _lastRegisteredQuad2DTexture[quadID]; + if (lastKey != key) { + glDeleteBuffers(1, &vbo.first); + glDeleteBuffers(1, &vbo.second); + vbo.first = vbo.second = 0; + #ifdef WANT_DEBUG + qDebug() << "renderQuad() vec2 + texture... RELEASING REGISTERED QUAD"; + #endif // def WANT_DEBUG + } #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec2 + texture... RELEASING REGISTERED QUAD"; + else { + qDebug() << "renderQuad() vec2 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; + } #endif // def WANT_DEBUG } @@ -763,32 +779,33 @@ void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottom const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 4; const int indices = 4; - if (vbo.first == 0) { + if (vbo.first == 0) { + _lastRegisteredQuad2DTexture[quadID] = key; int vertexPoints = vertices * FLOATS_PER_VERTEX; GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices GLfloat* vertex = vertexData; static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; int v = 0; - vertex[v++] = topLeft.x; - vertex[v++] = topLeft.y; - vertex[v++] = texCoordTopLeft.x; - vertex[v++] = texCoordTopLeft.y; + vertex[v++] = minCorner.x; + vertex[v++] = minCorner.y; + vertex[v++] = texCoordMinCorner.x; + vertex[v++] = texCoordMinCorner.y; - vertex[v++] = bottomRight.x; - vertex[v++] = topLeft.y; - vertex[v++] = texCoordBottomRight.x; - vertex[v++] = texCoordTopLeft.y; + vertex[v++] = maxCorner.x; + vertex[v++] = minCorner.y; + vertex[v++] = texCoordMaxCorner.x; + vertex[v++] = texCoordMinCorner.y; - vertex[v++] = bottomRight.x; - vertex[v++] = bottomRight.y; - vertex[v++] = texCoordBottomRight.x; - vertex[v++] = texCoordBottomRight.y; + vertex[v++] = maxCorner.x; + vertex[v++] = maxCorner.y; + vertex[v++] = texCoordMaxCorner.x; + vertex[v++] = texCoordMaxCorner.y; - vertex[v++] = topLeft.x; - vertex[v++] = bottomRight.y; - vertex[v++] = texCoordTopLeft.x; - vertex[v++] = texCoordBottomRight.y; + vertex[v++] = minCorner.x; + vertex[v++] = maxCorner.y; + vertex[v++] = texCoordMinCorner.x; + vertex[v++] = texCoordMaxCorner.y; glGenBuffers(1, &vbo.first); glBindBuffer(GL_ARRAY_BUFFER, vbo.first); @@ -832,20 +849,28 @@ void GeometryCache::renderQuad(const glm::vec2& topLeft, const glm::vec2& bottom glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } -void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomRight, int quadID) { +void GeometryCache::renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, int quadID) { bool registeredQuad = (quadID != UNKNOWN_QUAD_ID); - Vec3Pair key(topLeft, bottomRight); + Vec3Pair key(minCorner, maxCorner); VerticesIndices& vbo = registeredQuad ? _registeredQuadVBOs[quadID] : _quad3DVBOs[key]; // if this is a registered quad, and we have buffers, then clear them and rebuild // TODO: would be nice to only rebuild if the geometry changed from last time. if (registeredQuad && vbo.first != 0) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + Vec3Pair& lastKey = _lastRegisteredQuad3D[quadID]; + if (lastKey != key) { + glDeleteBuffers(1, &vbo.first); + glDeleteBuffers(1, &vbo.second); + vbo.first = vbo.second = 0; + #ifdef WANT_DEBUG + qDebug() << "renderQuad() vec3... RELEASING REGISTERED QUAD"; + #endif // def WANT_DEBUG + } #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec3... RELEASING REGISTERED QUAD"; + else { + qDebug() << "renderQuad() vec3... REUSING PREVIOUSLY REGISTERED QUAD"; + } #endif // def WANT_DEBUG } @@ -854,27 +879,28 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const int vertices = 4; const int indices = 4; if (vbo.first == 0) { + _lastRegisteredQuad3D[quadID] = key; int vertexPoints = vertices * FLOATS_PER_VERTEX; GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices GLfloat* vertex = vertexData; static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3}; int v = 0; - vertex[v++] = topLeft.x; - vertex[v++] = topLeft.y; - vertex[v++] = topLeft.z; + vertex[v++] = minCorner.x; + vertex[v++] = minCorner.y; + vertex[v++] = minCorner.z; - vertex[v++] = bottomRight.x; - vertex[v++] = topLeft.y; - vertex[v++] = topLeft.z; + vertex[v++] = maxCorner.x; + vertex[v++] = minCorner.y; + vertex[v++] = minCorner.z; - vertex[v++] = bottomRight.x; - vertex[v++] = bottomRight.y; - vertex[v++] = bottomRight.z; + vertex[v++] = maxCorner.x; + vertex[v++] = maxCorner.y; + vertex[v++] = maxCorner.z; - vertex[v++] = topLeft.x; - vertex[v++] = bottomRight.y; - vertex[v++] = bottomRight.z; + vertex[v++] = minCorner.x; + vertex[v++] = maxCorner.y; + vertex[v++] = maxCorner.z; glGenBuffers(1, &vbo.first); glBindBuffer(GL_ARRAY_BUFFER, vbo.first); @@ -936,11 +962,19 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom // if this is a registered quad, and we have buffers, then clear them and rebuild // TODO: would be nice to only rebuild if the geometry changed from last time. if (registeredQuad && vbo.first != 0) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + Vec3PairVec2Pair& lastKey = _lastRegisteredQuad3DTexture[quadID]; + if (lastKey != key) { + glDeleteBuffers(1, &vbo.first); + glDeleteBuffers(1, &vbo.second); + vbo.first = vbo.second = 0; + #ifdef WANT_DEBUG + qDebug() << "renderQuad() vec3 + texture VBO... RELEASING REGISTERED QUAD"; + #endif // def WANT_DEBUG + } #ifdef WANT_DEBUG - qDebug() << "renderQuad() vec3 + texture VBO... RELEASING REGISTERED QUAD"; + else { + qDebug() << "renderQuad() vec3 + texture... REUSING PREVIOUSLY REGISTERED QUAD"; + } #endif // def WANT_DEBUG } @@ -948,7 +982,8 @@ void GeometryCache::renderQuad(const glm::vec3& topLeft, const glm::vec3& bottom const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); const int vertices = 4; const int indices = 4; - if (vbo.first == 0) { + if (vbo.first == 0) { + _lastRegisteredQuad3DTexture[quadID] = key; int vertexPoints = vertices * FLOATS_PER_VERTEX; GLfloat* vertexData = new GLfloat[vertexPoints]; // text coords & vertices GLfloat* vertex = vertexData; diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 5736cea116..f7b4489cc8 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -96,12 +96,12 @@ public: void renderQuad(int x, int y, int width, int height, int quadID = UNKNOWN_QUAD_ID) { renderQuad(glm::vec2(x,y), glm::vec2(x + width, y + height), quadID); } - void renderQuad(const glm::vec2& topLeft, const glm::vec2& bottomRight, int quadID = UNKNOWN_QUAD_ID); + void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, int quadID = UNKNOWN_QUAD_ID); - void renderQuad(const glm::vec2& topLeft, const glm::vec2& bottomRight, - const glm::vec2& texCoordTopLeft, const glm::vec2& texCoordBottomRight, int quadID = UNKNOWN_QUAD_ID); + void renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, + const glm::vec2& texCoordMinCorner, const glm::vec2& texCoordMaxCorner, int quadID = UNKNOWN_QUAD_ID); - void renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomRight, int quadID = UNKNOWN_QUAD_ID); + void renderQuad(const glm::vec3& minCorner, const glm::vec3& maxCorner, int quadID = UNKNOWN_QUAD_ID); void renderQuad(const glm::vec3& topLeft, const glm::vec3& bottomLeft, const glm::vec3& bottomRight, const glm::vec3& topRight, @@ -139,6 +139,11 @@ private: QHash _registeredQuadVBOs; int _nextQuadID; + QHash _lastRegisteredQuad2D; + QHash _lastRegisteredQuad2DTexture; + QHash _lastRegisteredQuad3D; + QHash _lastRegisteredQuad3DTexture; + QHash _gridBuffers; QHash > _networkGeometry;