mirror of
https://github.com/lubosz/overte.git
synced 2025-04-24 06:53:59 +02:00
fix colors for renderBevelCornersRect()
This commit is contained in:
parent
72f2e6f3aa
commit
149f365410
2 changed files with 61 additions and 55 deletions
|
@ -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) {
|
||||
|
|
|
@ -220,10 +220,9 @@ private:
|
|||
QHash<Vec2Pair, BatchItemDetails> _quad2D;
|
||||
QHash<int, BatchItemDetails> _registeredQuad2D;
|
||||
|
||||
|
||||
QHash<int, Vec3Pair> _lastRegisteredRect;
|
||||
QHash<Vec3Pair, VerticesIndices> _rectVBOs;
|
||||
QHash<int, VerticesIndices> _registeredRectVBOs;
|
||||
QHash<int, Vec3Pair> _lastRegisteredBevelRects;
|
||||
QHash<Vec3Pair, BatchItemDetails> _bevelRects;
|
||||
QHash<int, BatchItemDetails> _registeredBevelRects;
|
||||
|
||||
QHash<int, Vec3Pair> _lastRegisteredLine3D;
|
||||
QHash<Vec3Pair, BatchItemDetails> _line3DVBOs;
|
||||
|
|
Loading…
Reference in a new issue