forked from Mirrorlandia_minetest/irrlicht
Use a buffer for quads indices
also use glDrawRangeElements for quad drawing
This commit is contained in:
parent
e01f285c8f
commit
aa1696a7e6
@ -186,6 +186,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
void COpenGL3DriverBase::initQuadsIndices(int max_vertex_count)
|
||||
{
|
||||
int max_quad_count = max_vertex_count / 4;
|
||||
std::vector<GLushort> QuadsIndices;
|
||||
QuadsIndices.reserve(6 * max_quad_count);
|
||||
for (int k = 0; k < max_quad_count; k++) {
|
||||
QuadsIndices.push_back(4 * k + 0);
|
||||
@ -195,6 +196,11 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
QuadsIndices.push_back(4 * k + 2);
|
||||
QuadsIndices.push_back(4 * k + 3);
|
||||
}
|
||||
glGenBuffers(1, &QuadIndexBuffer);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, QuadIndexBuffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(QuadsIndices[0]) * QuadsIndices.size(), QuadsIndices.data(), GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
QuadIndexCount = QuadsIndices.size();
|
||||
}
|
||||
|
||||
bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer)
|
||||
@ -919,7 +925,7 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
}
|
||||
|
||||
const irr::u32 drawCount = core::min_<u32>(positions.size(), sourceRects.size());
|
||||
assert(6 * std::size_t(drawCount) <= QuadsIndices.size());
|
||||
assert(6 * drawCount <= QuadIndexCount); // FIXME split the batch? or let it crash?
|
||||
|
||||
core::array<S3DVertex> vtx(drawCount * 4);
|
||||
|
||||
@ -959,7 +965,9 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y));
|
||||
}
|
||||
|
||||
drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), QuadsIndices.data(), 6 * drawCount);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, QuadIndexBuffer);
|
||||
drawElements(GL_TRIANGLES, vt2DImage, vtx.const_pointer(), vtx.size(), 0, 6 * drawCount);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
|
||||
if (clipRect)
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
@ -1102,10 +1110,10 @@ COpenGL3DriverBase::~COpenGL3DriverBase()
|
||||
endDraw(vertexType);
|
||||
}
|
||||
|
||||
void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount)
|
||||
void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount)
|
||||
{
|
||||
beginDraw(vertexType, reinterpret_cast<uintptr_t>(vertices));
|
||||
glDrawElements(primitiveType, indexCount, GL_UNSIGNED_SHORT, indices);
|
||||
glDrawRangeElements(primitiveType, 0, vertexCount - 1, indexCount, GL_UNSIGNED_SHORT, indices);
|
||||
endDraw(vertexType);
|
||||
}
|
||||
|
||||
|
@ -331,7 +331,7 @@ namespace video
|
||||
|
||||
void drawQuad(const VertexType &vertexType, const S3DVertex (&vertices)[4]);
|
||||
void drawArrays(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount);
|
||||
void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, const u16 *indices, int indexCount);
|
||||
void drawElements(GLenum primitiveType, const VertexType &vertexType, const void *vertices, int vertexCount, const u16 *indices, int indexCount);
|
||||
void drawElements(GLenum primitiveType, const VertexType &vertexType, uintptr_t vertices, uintptr_t indices, int indexCount);
|
||||
|
||||
void beginDraw(const VertexType &vertexType, uintptr_t verticesBase);
|
||||
@ -386,7 +386,8 @@ private:
|
||||
|
||||
void addDummyMaterial(E_MATERIAL_TYPE type);
|
||||
|
||||
std::vector<u16> QuadsIndices;
|
||||
unsigned QuadIndexCount;
|
||||
GLuint QuadIndexBuffer = 0;
|
||||
void initQuadsIndices(int max_vertex_count = 65536);
|
||||
|
||||
void debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message);
|
||||
|
Loading…
Reference in New Issue
Block a user