From 149f3654100551650eeed1cb579a18427fdf55f7 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 15 Jan 2015 11:55:45 -0800 Subject: [PATCH] fix colors for renderBevelCornersRect() --- libraries/render-utils/src/GeometryCache.cpp | 109 ++++++++++--------- libraries/render-utils/src/GeometryCache.h | 7 +- 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 3bfff42e38..0ab2a1a4cc 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -840,40 +840,55 @@ void GeometryCache::renderWireCube(float size, const glm::vec4& color) { } void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, int bevelDistance, const glm::vec4& color, int id) { - bool registeredRect = (id != UNKNOWN_ID); + bool registered = (id != UNKNOWN_ID); Vec3Pair key(glm::vec3(x, y, 0.0f), glm::vec3(width, height, bevelDistance)); - VerticesIndices& vbo = registeredRect ? _registeredRectVBOs[id] : _rectVBOs[key]; - + BatchItemDetails& details = registered ? _registeredBevelRects[id] : _bevelRects[key]; // if this is a registered quad, and we have buffers, then check to see if the geometry changed and rebuild if needed - if (registeredRect && vbo.first != 0) { - Vec3Pair& lastKey = _lastRegisteredRect[id]; + if (registered && details.isCreated) { + Vec3Pair& lastKey = _lastRegisteredBevelRects[id]; if (lastKey != key) { - glDeleteBuffers(1, &vbo.first); - glDeleteBuffers(1, &vbo.second); - vbo.first = vbo.second = 0; + details.clear(); + _lastRegisteredBevelRects[id] = key; #ifdef WANT_DEBUG - qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED RECT"; + qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED"; #endif // def WANT_DEBUG } #ifdef WANT_DEBUG else { - qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED RECT"; + qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED"; } #endif // def WANT_DEBUG } - const int FLOATS_PER_VERTEX = 2; - const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat); + const int FLOATS_PER_VERTEX = 2; // vertices const int vertices = 8; - const int indices = 8; - if (vbo.first == 0) { - _lastRegisteredRect[id] = key; + + if (!details.isCreated) { + + details.isCreated = true; + details.vertices = vertices; + details.vertexSize = FLOATS_PER_VERTEX; + + gpu::BufferPointer verticesBuffer(new gpu::Buffer()); + gpu::BufferPointer colorBuffer(new gpu::Buffer()); + gpu::Stream::FormatPointer streamFormat(new gpu::Stream::Format()); + gpu::BufferStreamPointer stream(new gpu::BufferStream()); + + details.verticesBuffer = verticesBuffer; + details.colorBuffer = colorBuffer; + details.streamFormat = streamFormat; + details.stream = stream; + + details.streamFormat->setAttribute(gpu::Stream::POSITION, 0, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::POS_XYZ), 0); + details.streamFormat->setAttribute(gpu::Stream::COLOR, 1, gpu::Element(gpu::VEC4, gpu::UINT8, gpu::RGBA)); + + details.stream->addBuffer(details.verticesBuffer, 0, details.streamFormat->getChannels().at(0)._stride); + details.stream->addBuffer(details.colorBuffer, 0, details.streamFormat->getChannels().at(1)._stride); + 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, 4, 5, 6, 7}; - + GLfloat* vertexBuffer = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad + GLfloat* vertex = vertexBuffer; int vertexPoint = 0; // left side @@ -902,41 +917,33 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height, vertex[vertexPoint++] = x +bevelDistance; vertex[vertexPoint++] = y; - glGenBuffers(1, &vbo.first); - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); - delete[] vertexData; - - GLushort* indexData = new GLushort[indices]; - GLushort* index = indexData; - for (int i = 0; i < indices; i++) { - index[i] = cannonicalIndices[i]; - } - - glGenBuffers(1, &vbo.second); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW); - delete[] indexData; - - #ifdef WANT_DEBUG - if (id == UNKNOWN_ID) { - qDebug() << "new rect VBO made -- _rectVBOs.size():" << _rectVBOs.size(); - } else { - qDebug() << "new registered rect VBO made -- _registeredRectVBOs.size():" << _registeredRectVBOs.size(); - } - #endif - - } else { - glBindBuffer(GL_ARRAY_BUFFER, vbo.first); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); + const int NUM_COLOR_SCALARS_PER_QUAD = 8; + int compactColor = ((int(color.x * 255.0f) & 0xFF)) | + ((int(color.y * 255.0f) & 0xFF) << 8) | + ((int(color.z * 255.0f) & 0xFF) << 16) | + ((int(color.w * 255.0f) & 0xFF) << 24); + int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor, + compactColor, compactColor, compactColor, compactColor }; + + + details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer); + details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors); + + delete[] vertexBuffer; } - glEnableClientState(GL_VERTEX_ARRAY); - glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); - glDrawRangeElementsEXT(GL_POLYGON, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0); + + gpu::Batch batch; + + batch.setInputFormat(details.streamFormat); + batch.setInputStream(0, *details.stream); + batch.draw(gpu::QUADS, 4, 0); + + gpu::GLBackend::renderBatch(batch); + glDisableClientState(GL_VERTEX_ARRAY); - + glDisableClientState(GL_COLOR_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) { diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index d9fb218a03..e42a34813d 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -220,10 +220,9 @@ private: QHash _quad2D; QHash _registeredQuad2D; - - QHash _lastRegisteredRect; - QHash _rectVBOs; - QHash _registeredRectVBOs; + QHash _lastRegisteredBevelRects; + QHash _bevelRects; + QHash _registeredBevelRects; QHash _lastRegisteredLine3D; QHash _line3DVBOs;