From 46daf9dd1555537d15a9ade332e99ca8350f6a2f Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Mon, 2 Nov 2015 03:28:31 -0400 Subject: [PATCH] Simplified some code by removing an unnecessary/useless optimization. --- src/modules/graphics/opengl/Font.cpp | 72 +++++++++++----------------- src/modules/graphics/opengl/Font.h | 16 ++----- src/modules/graphics/opengl/Text.cpp | 37 +++++--------- src/modules/graphics/opengl/Text.h | 2 +- 4 files changed, 48 insertions(+), 79 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 20e33e839..25391875e 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -398,7 +398,7 @@ float Font::getHeight() const return (float) height; } -Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, std::vector &vertices, float extra_spacing, Vector offset, TextInfo *info) +std::vector Font::generateVertices(const ColoredCodepoints &codepoints, std::vector &vertices, float extra_spacing, Vector offset, TextInfo *info) { // Spacing counter and newline handling. float dx = offset.x; @@ -408,7 +408,7 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s int maxwidth = 0; // Keeps track of when we need to switch textures in our vertex array. - DrawCommands drawcmds; + std::vector commands; // Pre-allocate space for the maximum possible number of vertices. size_t vertstartsize = vertices.size(); @@ -420,11 +420,6 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s int curcolori = -1; int ncolors = (int) codepoints.colors.size(); - if (ncolors == 0 || (ncolors == 1 && codepoints.colors[0].color == curcolor)) - drawcmds.usecolors = false; - else - drawcmds.usecolors = true; - for (int i = 0; i < (int) codepoints.cps.size(); i++) { uint32 g = codepoints.cps[i]; @@ -454,7 +449,7 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s maxwidth = 0; dx = offset.x; dy = offset.y; - drawcmds.commands.clear(); + commands.clear(); vertices.resize(vertstartsize); prevglyph = 0; curcolori = -1; @@ -477,17 +472,17 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s } // Check if glyph texture has changed since the last iteration. - if (drawcmds.commands.empty() || drawcmds.commands.back().texture != glyph.texture) + if (commands.empty() || commands.back().texture != glyph.texture) { // Add a new draw command if the texture has changed. DrawCommand cmd; cmd.startvertex = (int) vertices.size() - 4; cmd.vertexcount = 0; cmd.texture = glyph.texture; - drawcmds.commands.push_back(cmd); + commands.push_back(cmd); } - drawcmds.commands.back().vertexcount += 4; + commands.back().vertexcount += 4; } // Advance the x position for the next glyph. @@ -510,7 +505,7 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s return a.startvertex < b.startvertex; }; - std::sort(drawcmds.commands.begin(), drawcmds.commands.end(), drawsort); + std::sort(commands.begin(), commands.end(), drawsort); if (dx > maxwidth) maxwidth = (int) dx; @@ -521,24 +516,24 @@ Font::DrawCommands Font::generateVertices(const ColoredCodepoints &codepoints, s info->height = (int) dy + (dx > 0.0f ? floorf(getHeight() * getLineHeight() + 0.5f) : 0) - offset.y; } - return drawcmds; + return commands; } -Font::DrawCommands Font::generateVertices(const std::string &text, std::vector &vertices, float extra_spacing, Vector offset, TextInfo *info) +std::vector Font::generateVertices(const std::string &text, std::vector &vertices, float extra_spacing, Vector offset, TextInfo *info) { ColoredCodepoints codepoints; getCodepointsFromString(text, codepoints.cps); return generateVertices(codepoints, vertices, extra_spacing, offset, info); } -Font::DrawCommands Font::generateVerticesFormatted(const ColoredCodepoints &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info) +std::vector Font::generateVerticesFormatted(const ColoredCodepoints &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info) { wrap = std::max(wrap, 0.0f); uint32 cacheid = textureCacheID; - DrawCommands drawcmds; + std::vector drawcommands; vertices.reserve(text.cps.size() * 4); std::vector widths; @@ -581,29 +576,27 @@ Font::DrawCommands Font::generateVerticesFormatted(const ColoredCodepoints &text break; } - DrawCommands cmds = generateVertices(line, vertices, extraspacing, offset); + std::vector newcommands = generateVertices(line, vertices, extraspacing, offset); - if (!cmds.commands.empty()) + if (!newcommands.empty()) { - auto firstcmd = cmds.commands.begin(); + auto firstcmd = newcommands.begin(); // If the first draw command in the new list has the same texture // as the last one in the existing list we're building and its // vertices are in-order, we can combine them (saving a draw call.) - if (!drawcmds.commands.empty()) + if (!drawcommands.empty()) { - auto prevcmd = drawcmds.commands.back(); + auto prevcmd = drawcommands.back(); if (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex) { - drawcmds.commands.back().vertexcount += firstcmd->vertexcount; + drawcommands.back().vertexcount += firstcmd->vertexcount; ++firstcmd; } } // Append the new draw commands to the list we're building. - drawcmds.commands.insert(drawcmds.commands.end(), firstcmd, cmds.commands.end()); - - drawcmds.usecolors = drawcmds.usecolors || cmds.usecolors; + drawcommands.insert(drawcommands.end(), firstcmd, newcommands.end()); } y += getHeight() * getLineHeight(); @@ -618,19 +611,19 @@ Font::DrawCommands Font::generateVerticesFormatted(const ColoredCodepoints &text if (cacheid != textureCacheID) { vertices.clear(); - drawcmds = generateVerticesFormatted(text, wrap, align, vertices); + drawcommands = generateVerticesFormatted(text, wrap, align, vertices); } - return drawcmds; + return drawcommands; } -void Font::drawVertices(const DrawCommands &drawcommands) +void Font::drawVertices(const std::vector &drawcommands) { // Vertex attribute pointers need to be set before calling this function. // This assumes that the attribute pointers are constant for all vertices. int totalverts = 0; - for (const DrawCommand &cmd : drawcommands.commands) + for (const DrawCommand &cmd : drawcommands) totalverts = std::max(cmd.startvertex + cmd.vertexcount, totalverts); if ((size_t) totalverts / 4 > quadIndices.getSize()) @@ -645,7 +638,7 @@ void Font::drawVertices(const DrawCommands &drawcommands) // We need a separate draw call for every section of the text which uses a // different texture than the previous section. - for (const DrawCommand &cmd : drawcommands.commands) + for (const DrawCommand &cmd : drawcommands) { GLsizei count = (cmd.vertexcount / 4) * 6; size_t offset = (cmd.startvertex / 4) * 6 * elemsize; @@ -656,9 +649,9 @@ void Font::drawVertices(const DrawCommands &drawcommands) } } -void Font::printv(const Matrix4 &t, const DrawCommands &drawcommands, const std::vector &vertices) +void Font::printv(const Matrix4 &t, const std::vector &drawcommands, const std::vector &vertices) { - if (vertices.empty() || drawcommands.commands.empty()) + if (vertices.empty() || drawcommands.empty()) return; OpenGL::TempDebugGroup debuggroup("Font print"); @@ -668,16 +661,9 @@ void Font::printv(const Matrix4 &t, const DrawCommands &drawcommands, const std: glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, sizeof(GlyphVertex), &vertices[0].x); glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_UNSIGNED_SHORT, GL_TRUE, sizeof(GlyphVertex), &vertices[0].s); + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(GlyphVertex), &vertices[0].color.r); - uint32 enabledattribs = ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD; - - if (drawcommands.usecolors) - { - glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(GlyphVertex), &vertices[0].color.r); - enabledattribs |= ATTRIBFLAG_COLOR; - } - - gl.useVertexAttribArrays(enabledattribs); + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD | ATTRIBFLAG_COLOR); drawVertices(drawcommands); } @@ -688,7 +674,7 @@ void Font::print(const std::vector &text, float x, float y, float getCodepointsFromString(text, codepoints); std::vector vertices; - DrawCommands drawcommands = generateVertices(codepoints, vertices); + std::vector drawcommands = generateVertices(codepoints, vertices); Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); @@ -701,7 +687,7 @@ void Font::printf(const std::vector &text, float x, float y, floa getCodepointsFromString(text, codepoints); std::vector vertices; - DrawCommands drawcommands = generateVerticesFormatted(codepoints, wrap, align, vertices); + std::vector drawcommands = generateVerticesFormatted(codepoints, wrap, align, vertices); Matrix4 t(x, y, angle, sx, sy, ox, oy, kx, ky); diff --git a/src/modules/graphics/opengl/Font.h b/src/modules/graphics/opengl/Font.h index 164665ad4..6ed474b01 100644 --- a/src/modules/graphics/opengl/Font.h +++ b/src/modules/graphics/opengl/Font.h @@ -100,22 +100,16 @@ public: int vertexcount; }; - struct DrawCommands - { - std::vector commands; - bool usecolors; - }; - Font(love::font::Rasterizer *r, const Texture::Filter &filter = Texture::getDefaultFilter()); virtual ~Font(); - DrawCommands generateVertices(const ColoredCodepoints &codepoints, std::vector &vertices, float extra_spacing = 0.0f, Vector offset = {}, TextInfo *info = nullptr); - DrawCommands generateVertices(const std::string &text, std::vector &vertices, float extra_spacing = 0.0f, Vector offset = Vector(), TextInfo *info = nullptr); + std::vector generateVertices(const ColoredCodepoints &codepoints, std::vector &vertices, float extra_spacing = 0.0f, Vector offset = {}, TextInfo *info = nullptr); + std::vector generateVertices(const std::string &text, std::vector &vertices, float extra_spacing = 0.0f, Vector offset = Vector(), TextInfo *info = nullptr); - DrawCommands generateVerticesFormatted(const ColoredCodepoints &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info = nullptr); + std::vector generateVerticesFormatted(const ColoredCodepoints &text, float wrap, AlignMode align, std::vector &vertices, TextInfo *info = nullptr); - void drawVertices(const DrawCommands &drawcommands); + void drawVertices(const std::vector &drawcommands); static void getCodepointsFromString(const std::string &str, Codepoints &codepoints); static void getCodepointsFromString(const std::vector &strs, ColoredCodepoints &codepoints); @@ -233,7 +227,7 @@ private: const Glyph &addGlyph(uint32 glyph); const Glyph &findGlyph(uint32 glyph); float getKerning(uint32 leftglyph, uint32 rightglyph); - void printv(const Matrix4 &t, const DrawCommands &drawcommands, const std::vector &vertices); + void printv(const Matrix4 &t, const std::vector &drawcommands, const std::vector &vertices); std::vector> rasterizers; diff --git a/src/modules/graphics/opengl/Text.cpp b/src/modules/graphics/opengl/Text.cpp index 3673fa288..6008c091e 100644 --- a/src/modules/graphics/opengl/Text.cpp +++ b/src/modules/graphics/opengl/Text.cpp @@ -111,7 +111,7 @@ void Text::regenerateVertices() void Text::addTextData(const TextData &t) { std::vector vertices; - Font::DrawCommands new_commands; + std::vector new_commands; // We only have formatted text if the align mode is valid. if (t.align == Font::ALIGN_MAX_ENUM) @@ -127,37 +127,34 @@ void Text::addTextData(const TextData &t) if (!t.append_vertices) { voffset = 0; - draw_commands.commands.clear(); - draw_commands.usecolors = false; + draw_commands.clear(); } uploadVertices(vertices, voffset); - if (!new_commands.commands.empty()) + if (!new_commands.empty()) { // The start vertex should be adjusted to account for the vertex offset. - for (Font::DrawCommand &cmd : new_commands.commands) + for (Font::DrawCommand &cmd : new_commands) cmd.startvertex += (int) voffset; - auto firstcmd = new_commands.commands.begin(); + auto firstcmd = new_commands.begin(); // If the first draw command in the new list has the same texture as the // last one in the existing list we're building and its vertices are // in-order, we can combine them (saving a draw call.) - if (!draw_commands.commands.empty()) + if (!draw_commands.empty()) { - auto prevcmd = draw_commands.commands.back(); + auto prevcmd = draw_commands.back(); if (prevcmd.texture == firstcmd->texture && (prevcmd.startvertex + prevcmd.vertexcount) == firstcmd->startvertex) { - draw_commands.commands.back().vertexcount += firstcmd->vertexcount; + draw_commands.back().vertexcount += firstcmd->vertexcount; ++firstcmd; } } // Append the new draw commands to the list we're building. - draw_commands.commands.insert(draw_commands.commands.end(), firstcmd, new_commands.commands.end()); - - draw_commands.usecolors = draw_commands.usecolors || new_commands.usecolors; + draw_commands.insert(draw_commands.end(), firstcmd, new_commands.end()); } vert_offset = voffset + vertices.size(); @@ -210,8 +207,7 @@ void Text::addf(const std::vector &text, float wrap, Font:: void Text::clear() { text_data.clear(); - draw_commands.commands.clear(); - draw_commands.usecolors = false; + draw_commands.clear(); texture_cache_id = font->getTextureCacheID(); text_info = {}; vert_offset = 0; @@ -219,7 +215,7 @@ void Text::clear() void Text::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) { - if (vbo == nullptr || draw_commands.commands.empty()) + if (vbo == nullptr || draw_commands.empty()) return; OpenGL::TempDebugGroup debuggroup("Text object draw"); @@ -243,17 +239,10 @@ void Text::draw(float x, float y, float angle, float sx, float sy, float ox, flo // Font::drawVertices expects AttribPointer calls to be done already. glVertexAttribPointer(ATTRIB_POS, 2, GL_FLOAT, GL_FALSE, stride, vbo->getPointer(pos_offset)); glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_UNSIGNED_SHORT, GL_TRUE, stride, vbo->getPointer(tex_offset)); - - if (draw_commands.usecolors) - glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, vbo->getPointer(color_offset)); + glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, vbo->getPointer(color_offset)); } - uint32 enabledattribs = ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD; - - if (draw_commands.usecolors) - enabledattribs |= ATTRIBFLAG_COLOR; - - gl.useVertexAttribArrays(enabledattribs); + gl.useVertexAttribArrays(ATTRIBFLAG_POS | ATTRIBFLAG_TEXCOORD | ATTRIBFLAG_COLOR); font->drawVertices(draw_commands); } diff --git a/src/modules/graphics/opengl/Text.h b/src/modules/graphics/opengl/Text.h index 317e82c91..612dcee97 100644 --- a/src/modules/graphics/opengl/Text.h +++ b/src/modules/graphics/opengl/Text.h @@ -84,7 +84,7 @@ private: StrongRef font; GLBuffer *vbo; - Font::DrawCommands draw_commands; + std::vector draw_commands; std::vector text_data; Font::TextInfo text_info;