fix colors for renderBevelCornersRect()

This commit is contained in:
ZappoMan 2015-01-15 11:55:45 -08:00
parent 72f2e6f3aa
commit 149f365410
2 changed files with 61 additions and 55 deletions

View file

@ -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) { 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)); 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 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) { if (registered && details.isCreated) {
Vec3Pair& lastKey = _lastRegisteredRect[id]; Vec3Pair& lastKey = _lastRegisteredBevelRects[id];
if (lastKey != key) { if (lastKey != key) {
glDeleteBuffers(1, &vbo.first); details.clear();
glDeleteBuffers(1, &vbo.second); _lastRegisteredBevelRects[id] = key;
vbo.first = vbo.second = 0;
#ifdef WANT_DEBUG #ifdef WANT_DEBUG
qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED RECT"; qDebug() << "renderBevelCornersRect()... RELEASING REGISTERED";
#endif // def WANT_DEBUG #endif // def WANT_DEBUG
} }
#ifdef WANT_DEBUG #ifdef WANT_DEBUG
else { else {
qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED RECT"; qDebug() << "renderBevelCornersRect()... REUSING PREVIOUSLY REGISTERED";
} }
#endif // def WANT_DEBUG #endif // def WANT_DEBUG
} }
const int FLOATS_PER_VERTEX = 2; const int FLOATS_PER_VERTEX = 2; // vertices
const int NUM_BYTES_PER_VERTEX = FLOATS_PER_VERTEX * sizeof(GLfloat);
const int vertices = 8; const int vertices = 8;
const int indices = 8;
if (vbo.first == 0) { if (!details.isCreated) {
_lastRegisteredRect[id] = key;
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; int vertexPoints = vertices * FLOATS_PER_VERTEX;
GLfloat* vertexData = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad GLfloat* vertexBuffer = new GLfloat[vertexPoints]; // only vertices, no normals because we're a 2D quad
GLfloat* vertex = vertexData; GLfloat* vertex = vertexBuffer;
static GLubyte cannonicalIndices[indices] = {0, 1, 2, 3, 4, 5, 6, 7};
int vertexPoint = 0; int vertexPoint = 0;
// left side // left side
@ -902,41 +917,33 @@ void GeometryCache::renderBevelCornersRect(int x, int y, int width, int height,
vertex[vertexPoint++] = x +bevelDistance; vertex[vertexPoint++] = x +bevelDistance;
vertex[vertexPoint++] = y; vertex[vertexPoint++] = y;
glGenBuffers(1, &vbo.first); const int NUM_COLOR_SCALARS_PER_QUAD = 8;
glBindBuffer(GL_ARRAY_BUFFER, vbo.first); int compactColor = ((int(color.x * 255.0f) & 0xFF)) |
glBufferData(GL_ARRAY_BUFFER, vertices * NUM_BYTES_PER_VERTEX, vertexData, GL_STATIC_DRAW); ((int(color.y * 255.0f) & 0xFF) << 8) |
delete[] vertexData; ((int(color.z * 255.0f) & 0xFF) << 16) |
((int(color.w * 255.0f) & 0xFF) << 24);
GLushort* indexData = new GLushort[indices]; int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor,
GLushort* index = indexData; compactColor, compactColor, compactColor, compactColor };
for (int i = 0; i < indices; i++) {
index[i] = cannonicalIndices[i];
} details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Buffer::Byte*) vertexBuffer);
details.colorBuffer->append(sizeof(colors), (gpu::Buffer::Byte*) colors);
glGenBuffers(1, &vbo.second);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo.second); delete[] vertexBuffer;
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);
} }
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(FLOATS_PER_VERTEX, GL_FLOAT, FLOATS_PER_VERTEX * sizeof(float), 0); gpu::Batch batch;
glDrawRangeElementsEXT(GL_POLYGON, 0, vertices - 1, indices, GL_UNSIGNED_SHORT, 0);
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_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0); 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) { void GeometryCache::renderQuad(const glm::vec2& minCorner, const glm::vec2& maxCorner, const glm::vec4& color, int id) {

View file

@ -220,10 +220,9 @@ private:
QHash<Vec2Pair, BatchItemDetails> _quad2D; QHash<Vec2Pair, BatchItemDetails> _quad2D;
QHash<int, BatchItemDetails> _registeredQuad2D; QHash<int, BatchItemDetails> _registeredQuad2D;
QHash<int, Vec3Pair> _lastRegisteredBevelRects;
QHash<int, Vec3Pair> _lastRegisteredRect; QHash<Vec3Pair, BatchItemDetails> _bevelRects;
QHash<Vec3Pair, VerticesIndices> _rectVBOs; QHash<int, BatchItemDetails> _registeredBevelRects;
QHash<int, VerticesIndices> _registeredRectVBOs;
QHash<int, Vec3Pair> _lastRegisteredLine3D; QHash<int, Vec3Pair> _lastRegisteredLine3D;
QHash<Vec3Pair, BatchItemDetails> _line3DVBOs; QHash<Vec3Pair, BatchItemDetails> _line3DVBOs;