]> git.lizzy.rs Git - irrlicht.git/commitdiff
Unify quad drawing
authornumzero <numzer0@yandex.ru>
Mon, 27 Feb 2023 18:56:26 +0000 (21:56 +0300)
committernumzero <numzer0@yandex.ru>
Mon, 27 Feb 2023 20:36:47 +0000 (23:36 +0300)
source/Irrlicht/OpenGL/Driver.cpp
source/Irrlicht/OpenGL/Driver.h

index 7603d8696213edfd8284f4e58700b67915d53f09..5e697e54fe0044de049d7b2b7d8154569c1769db 100644 (file)
@@ -63,6 +63,7 @@ COpenGL3Driver::COpenGL3Driver(const SIrrlichtCreationParameters& params, io::IF
        ContextManager->activateContext(ExposedData, false);\r
        GL.LoadAllProcedures(ContextManager);\r
        GL.DebugMessageCallback(debugCb, this);\r
+       initQuadsIndices();\r
 }\r
 \r
 COpenGL3Driver::~COpenGL3Driver()\r
@@ -89,6 +90,20 @@ COpenGL3Driver::~COpenGL3Driver()
        }\r
 }\r
 \r
+       void COpenGL3Driver::initQuadsIndices(int max_vertex_count)\r
+       {\r
+               int max_quad_count = max_vertex_count / 4;\r
+               QuadsIndices.reserve(6 * max_quad_count);\r
+               for (int k = 0; k < max_quad_count; k++) {\r
+                       QuadsIndices.push_back(4 * k + 0);\r
+                       QuadsIndices.push_back(4 * k + 1);\r
+                       QuadsIndices.push_back(4 * k + 2);\r
+                       QuadsIndices.push_back(4 * k + 0);\r
+                       QuadsIndices.push_back(4 * k + 2);\r
+                       QuadsIndices.push_back(4 * k + 3);\r
+               }\r
+       }\r
+\r
        bool COpenGL3Driver::genericDriverInit(const core::dimension2d<u32>& screenSize, bool stencilBuffer)\r
        {\r
                Name = glGetString(GL_VERSION);\r
@@ -886,23 +901,13 @@ COpenGL3Driver::~COpenGL3Driver()
                f32 down = 2.f - (f32)destRect.LowerRightCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
                f32 top = 2.f - (f32)destRect.UpperLeftCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
 \r
-               u16 indices[] = { 0, 1, 2, 3 };\r
                S3DVertex vertices[4];\r
                vertices[0] = S3DVertex(left, top, 0, 0, 0, 1, useColor[0], tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y);\r
                vertices[1] = S3DVertex(right, top, 0, 0, 0, 1, useColor[3], tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y);\r
                vertices[2] = S3DVertex(right, down, 0, 0, 0, 1, useColor[2], tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y);\r
                vertices[3] = S3DVertex(left, down, 0, 0, 0, 1, useColor[1], tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y);\r
 \r
-               glEnableVertexAttribArray(EVA_POSITION);\r
-               glEnableVertexAttribArray(EVA_COLOR);\r
-               glEnableVertexAttribArray(EVA_TCOORD0);\r
-               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
-               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-               glVertexAttribPointer(EVA_TCOORD0, 2, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].TCoords);\r
-               glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, indices);\r
-               glDisableVertexAttribArray(EVA_TCOORD0);\r
-               glDisableVertexAttribArray(EVA_COLOR);\r
-               glDisableVertexAttribArray(EVA_POSITION);\r
+               drawQuad(vertices, true);\r
 \r
                if (clipRect)\r
                        glDisable(GL_SCISSOR_TEST);\r
@@ -921,7 +926,6 @@ COpenGL3Driver::~COpenGL3Driver()
 \r
                setRenderStates2DMode(false, true, true);\r
 \r
-               u16 quad2DIndices[] = { 0, 1, 2, 3 };\r
                S3DVertex quad2DVertices[4];\r
 \r
                quad2DVertices[0].Pos = core::vector3df(-1.f, 1.f, 0.f);\r
@@ -941,19 +945,9 @@ COpenGL3Driver::~COpenGL3Driver()
                quad2DVertices[2].Color = SColor(0xFFFFFFFF);\r
                quad2DVertices[3].Color = SColor(0xFFFFFFFF);\r
 \r
-               glEnableVertexAttribArray(EVA_POSITION);\r
-               glEnableVertexAttribArray(EVA_COLOR);\r
-               glEnableVertexAttribArray(EVA_TCOORD0);\r
-               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(quad2DVertices))[0].Pos);\r
-               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(quad2DVertices))[0].Color);\r
-               glVertexAttribPointer(EVA_TCOORD0, 2, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(quad2DVertices))[0].TCoords);\r
-               glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, quad2DIndices);\r
-               glDisableVertexAttribArray(EVA_TCOORD0);\r
-               glDisableVertexAttribArray(EVA_COLOR);\r
-               glDisableVertexAttribArray(EVA_POSITION);\r
+               drawQuad(quad2DVertices, true);\r
        }\r
 \r
-\r
        void COpenGL3Driver::draw2DImageBatch(const video::ITexture* texture,\r
                        const core::array<core::position2d<s32> >& positions,\r
                        const core::array<core::rect<s32> >& sourceRects,\r
@@ -984,7 +978,6 @@ COpenGL3Driver::~COpenGL3Driver()
                const irr::u32 drawCount = core::min_<u32>(positions.size(), sourceRects.size());\r
 \r
                core::array<S3DVertex> vtx(drawCount * 4);\r
-               core::array<u16> indices(drawCount * 6);\r
 \r
                for (u32 i = 0; i < drawCount; i++)\r
                {\r
@@ -1020,30 +1013,12 @@ COpenGL3Driver::~COpenGL3Driver()
                        vtx.push_back(S3DVertex(left, down, 0.0f,\r
                                        0.0f, 0.0f, 0.0f, color,\r
                                        tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y));\r
-\r
-                       const u32 curPos = vtx.size() - 4;\r
-                       indices.push_back(0 + curPos);\r
-                       indices.push_back(1 + curPos);\r
-                       indices.push_back(2 + curPos);\r
-\r
-                       indices.push_back(0 + curPos);\r
-                       indices.push_back(2 + curPos);\r
-                       indices.push_back(3 + curPos);\r
                }\r
 \r
-               if (vtx.size())\r
-               {\r
-                       glEnableVertexAttribArray(EVA_POSITION);\r
-                       glEnableVertexAttribArray(EVA_COLOR);\r
-                       glEnableVertexAttribArray(EVA_TCOORD0);\r
-                       glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &vtx[0].Pos);\r
-                       glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &vtx[0].Color);\r
-                       glVertexAttribPointer(EVA_TCOORD0, 2, GL_FLOAT, false, sizeof(S3DVertex), &vtx[0].TCoords);\r
-                       glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, indices.pointer());\r
-                       glDisableVertexAttribArray(EVA_TCOORD0);\r
-                       glDisableVertexAttribArray(EVA_COLOR);\r
-                       glDisableVertexAttribArray(EVA_POSITION);\r
-               }\r
+               drawQuads(vtx.const_pointer(), drawCount, true);\r
+\r
+               if (clipRect)\r
+                       glDisable(GL_SCISSOR_TEST);\r
        }\r
 \r
 \r
@@ -1072,20 +1047,13 @@ COpenGL3Driver::~COpenGL3Driver()
                f32 down = 2.f - (f32)pos.LowerRightCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
                f32 top = 2.f - (f32)pos.UpperLeftCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
 \r
-               u16 indices[] = {0, 1, 2, 3};\r
                S3DVertex vertices[4];\r
                vertices[0] = S3DVertex(left, top, 0, 0, 0, 1, color, 0, 0);\r
                vertices[1] = S3DVertex(right, top, 0, 0, 0, 1, color, 0, 0);\r
                vertices[2] = S3DVertex(right, down, 0, 0, 0, 1, color, 0, 0);\r
                vertices[3] = S3DVertex(left, down, 0, 0, 0, 1, color, 0, 0);\r
 \r
-               glEnableVertexAttribArray(EVA_POSITION);\r
-               glEnableVertexAttribArray(EVA_COLOR);\r
-               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
-               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-               glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, indices);\r
-               glDisableVertexAttribArray(EVA_COLOR);\r
-               glDisableVertexAttribArray(EVA_POSITION);\r
+               drawQuad(vertices, false);\r
        }\r
 \r
 \r
@@ -1118,20 +1086,13 @@ COpenGL3Driver::~COpenGL3Driver()
                f32 down = 2.f - (f32)pos.LowerRightCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
                f32 top = 2.f - (f32)pos.UpperLeftCorner.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
 \r
-               u16 indices[] = {0, 1, 2, 3};\r
                S3DVertex vertices[4];\r
                vertices[0] = S3DVertex(left, top, 0, 0, 0, 1, colorLeftUp, 0, 0);\r
                vertices[1] = S3DVertex(right, top, 0, 0, 0, 1, colorRightUp, 0, 0);\r
                vertices[2] = S3DVertex(right, down, 0, 0, 0, 1, colorRightDown, 0, 0);\r
                vertices[3] = S3DVertex(left, down, 0, 0, 0, 1, colorLeftDown, 0, 0);\r
 \r
-               glEnableVertexAttribArray(EVA_POSITION);\r
-               glEnableVertexAttribArray(EVA_COLOR);\r
-               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
-               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-               glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, indices);\r
-               glDisableVertexAttribArray(EVA_COLOR);\r
-               glDisableVertexAttribArray(EVA_POSITION);\r
+               drawQuad(vertices, false);\r
        }\r
 \r
 \r
@@ -1155,18 +1116,11 @@ COpenGL3Driver::~COpenGL3Driver()
                        f32 startY = 2.f - (f32)start.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
                        f32 endY = 2.f - (f32)end.Y / (f32)renderTargetSize.Height * 2.f - 1.f;\r
 \r
-                       u16 indices[] = {0, 1};\r
                        S3DVertex vertices[2];\r
                        vertices[0] = S3DVertex(startX, startY, 0, 0, 0, 1, color, 0, 0);\r
                        vertices[1] = S3DVertex(endX, endY, 0, 0, 0, 1, color, 1, 1);\r
 \r
-                       glEnableVertexAttribArray(EVA_POSITION);\r
-                       glEnableVertexAttribArray(EVA_COLOR);\r
-                       glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
-                       glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-                       glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, indices);\r
-                       glDisableVertexAttribArray(EVA_COLOR);\r
-                       glDisableVertexAttribArray(EVA_POSITION);\r
+                       drawArrays(GL_LINES, vertices, 2, false);\r
                }\r
        }\r
 \r
@@ -1189,15 +1143,45 @@ COpenGL3Driver::~COpenGL3Driver()
                S3DVertex vertices[1];\r
                vertices[0] = S3DVertex(X, Y, 0, 0, 0, 1, color, 0, 0);\r
 \r
+               drawArrays(GL_POINTS, vertices, 1, false);\r
+       }\r
+\r
+       void COpenGL3Driver::drawQuads(const S3DVertex *vertices, int quad_count, bool textured)\r
+       {\r
+               assert(6 * std::size_t(quad_count) <= QuadsIndices.size());\r
                glEnableVertexAttribArray(EVA_POSITION);\r
                glEnableVertexAttribArray(EVA_COLOR);\r
+               if (textured)\r
+                       glEnableVertexAttribArray(EVA_TCOORD0);\r
                glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
                glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-               glDrawArrays(GL_POINTS, 0, 1);\r
+               glVertexAttribPointer(EVA_TCOORD0, 2, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].TCoords);\r
+               glDrawElements(GL_TRIANGLES, 6 * quad_count, GL_UNSIGNED_SHORT, QuadsIndices.data());\r
+               glDisableVertexAttribArray(EVA_TCOORD0);\r
                glDisableVertexAttribArray(EVA_COLOR);\r
                glDisableVertexAttribArray(EVA_POSITION);\r
        }\r
 \r
+       void COpenGL3Driver::drawArrays(GLenum type, const S3DVertex *vertices, int vertex_count, bool textured)\r
+       {\r
+               glEnableVertexAttribArray(EVA_POSITION);\r
+               glEnableVertexAttribArray(EVA_COLOR);\r
+               if (textured)\r
+                       glEnableVertexAttribArray(EVA_TCOORD0);\r
+               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
+               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
+               glVertexAttribPointer(EVA_TCOORD0, 2, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].TCoords);\r
+               glDrawArrays(type, 0, vertex_count);\r
+               glDisableVertexAttribArray(EVA_TCOORD0);\r
+               glDisableVertexAttribArray(EVA_COLOR);\r
+               glDisableVertexAttribArray(EVA_POSITION);\r
+       }\r
+\r
+       void COpenGL3Driver::drawQuad(const S3DVertex (&vertices)[4], bool textured)\r
+       {\r
+               drawQuads(vertices, 1, textured);\r
+       }\r
+\r
        ITexture* COpenGL3Driver::createDeviceDependentTexture(const io::path& name, IImage* image)\r
        {\r
                core::array<IImage*> imageArray(1);\r
@@ -1706,18 +1690,11 @@ COpenGL3Driver::~COpenGL3Driver()
        {\r
                setRenderStates3DMode();\r
 \r
-               u16 indices[] = {0, 1};\r
                S3DVertex vertices[2];\r
                vertices[0] = S3DVertex(start.X, start.Y, start.Z, 0, 0, 1, color, 0, 0);\r
                vertices[1] = S3DVertex(end.X, end.Y, end.Z, 0, 0, 1, color, 0, 0);\r
 \r
-               glEnableVertexAttribArray(EVA_POSITION);\r
-               glEnableVertexAttribArray(EVA_COLOR);\r
-               glVertexAttribPointer(EVA_POSITION, 3, GL_FLOAT, false, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Pos);\r
-               glVertexAttribPointer(EVA_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(S3DVertex), &(static_cast<const S3DVertex*>(vertices))[0].Color);\r
-               glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, indices);\r
-               glDisableVertexAttribArray(EVA_COLOR);\r
-               glDisableVertexAttribArray(EVA_POSITION);\r
+               drawArrays(GL_LINES, vertices, 2, false);\r
        }\r
 \r
 \r
index 42c2debc21779964c79e41815b92c78c2aca95d3..dc2929738812c7825be08e9a2cfa03a9498458f9 100644 (file)
@@ -332,6 +332,10 @@ namespace video
                //! Same as `CacheHandler->setViewport`, but also sets `ViewPort`\r
                virtual void setViewPortRaw(u32 width, u32 height);\r
 \r
+               void drawQuad(const S3DVertex (&vertices)[4], bool textured);\r
+               void drawQuads(const S3DVertex *vertices, int quad_count, bool textured);\r
+               void drawArrays(GLenum type, const S3DVertex *vertices, int vertex_count, bool textured);\r
+\r
                COpenGL3CacheHandler* CacheHandler;\r
                core::stringw Name;\r
                core::stringc VendorName;\r
@@ -379,6 +383,9 @@ private:
 \r
                IContextManager* ContextManager;\r
 \r
+               std::vector<u16> QuadsIndices;\r
+               void initQuadsIndices(int max_vertex_count = 65536);\r
+\r
                void debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message);\r
                static void APIENTRY debugCb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam);\r
        };\r