diff options
author | Andrei Karas <akaras@inbox.ru> | 2012-08-31 00:46:31 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2012-08-31 03:02:31 +0300 |
commit | e513b3e1d7334258c82febb873ccab88c9f8bb83 (patch) | |
tree | 3e75163c59b75bb8b606bc2c38244481869cac87 | |
parent | 5cbd0d2cb7086fda592c00dbc3b07d06af95f080 (diff) | |
download | manaplus-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.gz manaplus-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.bz2 manaplus-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.xz manaplus-e513b3e1d7334258c82febb873ccab88c9f8bb83.zip |
Improve OpenGL change color speed.
-rw-r--r-- | src/normalopenglgraphics.cpp | 86 | ||||
-rw-r--r-- | src/normalopenglgraphics.h | 12 | ||||
-rw-r--r-- | src/safeopenglgraphics.cpp | 67 | ||||
-rw-r--r-- | src/safeopenglgraphics.h | 10 |
4 files changed, 89 insertions, 86 deletions
diff --git a/src/normalopenglgraphics.cpp b/src/normalopenglgraphics.cpp index b8b3eb89d..257fb7171 100644 --- a/src/normalopenglgraphics.cpp +++ b/src/normalopenglgraphics.cpp @@ -55,6 +55,8 @@ NormalOpenGLGraphics::NormalOpenGLGraphics(): mIntVertArray(new GLint[vertexBufSize * 4 + 30]), mAlpha(false), mTexture(false), + mIsByteColor(false), + mFloatColor(1.0f), #ifdef DEBUG_BIND_TEXTURE mColorAlpha(false), mOldTextureId(0) @@ -220,8 +222,7 @@ bool NormalOpenGLGraphics::drawImage2(const Image *const image, srcY += image->mBounds.y; if (!useColor) - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); -// glColor4ub(255, 255, 255, image->mAlpha * 255); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); @@ -232,14 +233,6 @@ bool NormalOpenGLGraphics::drawImage2(const Image *const image, drawQuad(image, srcX, srcY, dstX, dstY, width, height); - if (!useColor) - { - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - } - return true; } @@ -284,7 +277,7 @@ bool NormalOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, srcY += image->mBounds.y; if (!useColor) - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); @@ -299,7 +292,7 @@ bool NormalOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, if (smooth) // A basic smooth effect... { - glColor4f(1.0f, 1.0f, 1.0f, 0.2f); + setColorAlpha(0.2f); drawRescaledQuad(image, srcX, srcY, dstX - 1, dstY - 1, width, height, desiredWidth + 1, desiredHeight + 1); drawRescaledQuad(image, srcX, srcY, dstX + 1, dstY + 1, width, height, @@ -311,14 +304,6 @@ bool NormalOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, desiredWidth, desiredHeight - 1); } - if (!useColor) - { - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - } - return true; } @@ -341,7 +326,7 @@ void NormalOpenGLGraphics::drawImagePattern(const Image *const image, const float tw = static_cast<float>(image->getTextureWidth()); const float th = static_cast<float>(image->getTextureHeight()); - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); @@ -451,11 +436,6 @@ void NormalOpenGLGraphics::drawImagePattern(const Image *const image, if (vp > 0) drawQuadArrayii(vp); } - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); } void NormalOpenGLGraphics::drawRescaledImagePattern(const Image *const image, @@ -478,7 +458,7 @@ void NormalOpenGLGraphics::drawRescaledImagePattern(const Image *const image, if (iw == 0 || ih == 0) return; - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); @@ -607,11 +587,6 @@ void NormalOpenGLGraphics::drawRescaledImagePattern(const Image *const image, if (vp > 0) drawQuadArrayii(vp); } - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); } void NormalOpenGLGraphics::drawImagePattern2(GraphicsVertexes *const vert, @@ -622,7 +597,7 @@ void NormalOpenGLGraphics::drawImagePattern2(GraphicsVertexes *const vert, NormalOpenGLGraphicsVertexes *ogl = vert->getOGL(); - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); #endif @@ -667,12 +642,6 @@ void NormalOpenGLGraphics::drawImagePattern2(GraphicsVertexes *const vert, drawQuadArrayii(*iv, *it, *ivp); } } - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - } void NormalOpenGLGraphics::calcImagePattern(GraphicsVertexes *const vert, @@ -942,7 +911,7 @@ void NormalOpenGLGraphics::drawTile(const ImageVertexes *const vert) NormalOpenGLGraphicsVertexes *ogl = vert->ogl; - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); #endif @@ -953,11 +922,6 @@ void NormalOpenGLGraphics::drawTile(const ImageVertexes *const vert) drawQuadArrayfi(ogl->mIntVertArray, ogl->mFloatTexArray, ogl->ptr); else drawQuadArrayii(ogl->mIntVertArray, ogl->mIntTexArray, ogl->ptr); - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); } void NormalOpenGLGraphics::updateScreen() @@ -1113,17 +1077,13 @@ void NormalOpenGLGraphics::popClipArea() void NormalOpenGLGraphics::setColor(const gcn::Color& color) { mColor = color; - glColor4ub(static_cast<GLubyte>(color.r), - static_cast<GLubyte>(color.g), - static_cast<GLubyte>(color.b), - static_cast<GLubyte>(color.a)); - mColorAlpha = (color.a != 255); } void NormalOpenGLGraphics::drawPoint(int x, int y) { setTexturingAndBlending(false); + restoreColor(); glBegin(GL_POINTS); glVertex2i(x, y); @@ -1134,6 +1094,7 @@ void NormalOpenGLGraphics::drawLine(int x1, int y1, int x2, int y2) { setTexturingAndBlending(false); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + restoreColor(); mFloatTexArray[0] = static_cast<float>(x1) + 0.5f; mFloatTexArray[1] = static_cast<float>(y1) + 0.5f; @@ -1209,6 +1170,7 @@ void NormalOpenGLGraphics::drawRectangle(const gcn::Rectangle& rect, setTexturingAndBlending(false); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + restoreColor(); GLfloat vert[] = { @@ -1233,6 +1195,7 @@ bool NormalOpenGLGraphics::drawNet(const int x1, const int y1, setTexturingAndBlending(false); glDisableClientState(GL_TEXTURE_COORD_ARRAY); + restoreColor(); const float xf1 = static_cast<float>(x1); const float xf2 = static_cast<float>(x2); @@ -1356,6 +1319,29 @@ void NormalOpenGLGraphics::dumpSettings() } } +void NormalOpenGLGraphics::setColorAlpha(const float alpha) +{ + if (!mIsByteColor && mFloatColor == alpha) + return; + + glColor4f(1.0f, 1.0f, 1.0f, alpha); + mIsByteColor = false; + mFloatColor = alpha; +} + +void NormalOpenGLGraphics::restoreColor() +{ + if (mIsByteColor && mByteColor == mColor) + return; + + glColor4ub(static_cast<GLubyte>(mColor.r), + static_cast<GLubyte>(mColor.g), + static_cast<GLubyte>(mColor.b), + static_cast<GLubyte>(mColor.a)); + mIsByteColor = true; + mByteColor = mColor; +} + #ifdef DEBUG_BIND_TEXTURE void NormalOpenGLGraphics::debugBindTexture(const Image *image) { diff --git a/src/normalopenglgraphics.h b/src/normalopenglgraphics.h index 45973941a..972656cc4 100644 --- a/src/normalopenglgraphics.h +++ b/src/normalopenglgraphics.h @@ -166,10 +166,20 @@ class NormalOpenGLGraphics : public Graphics void debugBindTexture(const Image *image); private: + void inline setColorAlpha(float alpha); + + void inline restoreColor(); + GLfloat *mFloatTexArray; GLint *mIntTexArray; GLint *mIntVertArray; - bool mAlpha, mTexture; + bool mAlpha; + bool mTexture; + + bool mIsByteColor; + gcn::Color mByteColor; + float mFloatColor; + bool mColorAlpha; FBOInfo mFbo; #ifdef DEBUG_BIND_TEXTURE diff --git a/src/safeopenglgraphics.cpp b/src/safeopenglgraphics.cpp index 5463c648c..93cee86db 100644 --- a/src/safeopenglgraphics.cpp +++ b/src/safeopenglgraphics.cpp @@ -47,6 +47,8 @@ GLuint SafeOpenGLGraphics::mLastImage = 0; SafeOpenGLGraphics::SafeOpenGLGraphics(): mAlpha(false), mTexture(false), + mIsByteColor(false), + mFloatColor(1.0f), mColorAlpha(false) { mOpenGL = 2; @@ -157,7 +159,7 @@ bool SafeOpenGLGraphics::drawImage2(const Image *const image, srcY += image->mBounds.y; if (!useColor) - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); @@ -168,14 +170,6 @@ bool SafeOpenGLGraphics::drawImage2(const Image *const image, drawQuad(image, srcX, srcY, dstX, dstY, width, height); glEnd(); - if (!useColor) - { - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - } - return true; } @@ -220,7 +214,7 @@ bool SafeOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, srcY += image->mBounds.y; if (!useColor) - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); @@ -233,7 +227,7 @@ bool SafeOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, if (smooth) // A basic smooth effect... { - glColor4f(1.0f, 1.0f, 1.0f, 0.2f); + setColorAlpha(0.2f); drawRescaledQuad(image, srcX, srcY, dstX - 1, dstY - 1, width, height, desiredWidth + 1, desiredHeight + 1); drawRescaledQuad(image, srcX, srcY, dstX + 1, dstY + 1, width, height, @@ -247,14 +241,6 @@ bool SafeOpenGLGraphics::drawRescaledImage(Image *const image, int srcX, glEnd(); - if (!useColor) - { - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); - } - return true; } @@ -275,7 +261,7 @@ void SafeOpenGLGraphics::drawImagePattern(const Image *const image, if (iw == 0 || ih == 0) return; - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); @@ -298,11 +284,6 @@ void SafeOpenGLGraphics::drawImagePattern(const Image *const image, } glEnd(); - - glColor4ub(static_cast<GLubyte>(mColor.r), - static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), - static_cast<GLubyte>(mColor.a)); } void SafeOpenGLGraphics::drawRescaledImagePattern(const Image *const image, @@ -322,7 +303,7 @@ void SafeOpenGLGraphics::drawRescaledImagePattern(const Image *const image, if (iw == 0 || ih == 0) return; - glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha); + setColorAlpha(image->mAlpha); bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); @@ -352,9 +333,6 @@ void SafeOpenGLGraphics::drawRescaledImagePattern(const Image *const image, } glEnd(); - - glColor4ub(static_cast<GLubyte>(mColor.r), static_cast<GLubyte>(mColor.g), - static_cast<GLubyte>(mColor.b), static_cast<GLubyte>(mColor.a)); } bool SafeOpenGLGraphics::calcImageRect(GraphicsVertexes *const vert, @@ -533,17 +511,13 @@ void SafeOpenGLGraphics::popClipArea() void SafeOpenGLGraphics::setColor(const gcn::Color& color) { mColor = color; - glColor4ub(static_cast<GLubyte>(color.r), - static_cast<GLubyte>(color.g), - static_cast<GLubyte>(color.b), - static_cast<GLubyte>(color.a)); - mColorAlpha = (color.a != 255); } void SafeOpenGLGraphics::drawPoint(int x, int y) { setTexturingAndBlending(false); + restoreColor(); glBegin(GL_POINTS); glVertex2i(x, y); @@ -553,6 +527,7 @@ void SafeOpenGLGraphics::drawPoint(int x, int y) void SafeOpenGLGraphics::drawLine(int x1, int y1, int x2, int y2) { setTexturingAndBlending(false); + restoreColor(); glBegin(GL_LINES); glVertex2f(static_cast<float>(x1) + 0.5f, static_cast<float>(y1) + 0.5f); @@ -622,6 +597,7 @@ void SafeOpenGLGraphics::drawRectangle(const gcn::Rectangle& rect, bool filled) const float offset = filled ? 0 : 0.5f; setTexturingAndBlending(false); + restoreColor(); glBegin(filled ? GL_QUADS : GL_LINE_LOOP); glVertex2f(static_cast<float>(rect.x) + offset, @@ -644,4 +620,27 @@ void SafeOpenGLGraphics::bindTexture(GLenum target, GLuint texture) } } +void SafeOpenGLGraphics::setColorAlpha(const float alpha) +{ + if (!mIsByteColor && mFloatColor == alpha) + return; + + glColor4f(1.0f, 1.0f, 1.0f, alpha); + mIsByteColor = false; + mFloatColor = alpha; +} + +void SafeOpenGLGraphics::restoreColor() +{ + if (mIsByteColor && mByteColor == mColor) + return; + + glColor4ub(static_cast<GLubyte>(mColor.r), + static_cast<GLubyte>(mColor.g), + static_cast<GLubyte>(mColor.b), + static_cast<GLubyte>(mColor.a)); + mIsByteColor = true; + mByteColor = mColor; +} + #endif // USE_OPENGL diff --git a/src/safeopenglgraphics.h b/src/safeopenglgraphics.h index a1d744282..a6f22182c 100644 --- a/src/safeopenglgraphics.h +++ b/src/safeopenglgraphics.h @@ -141,7 +141,15 @@ class SafeOpenGLGraphics : public Graphics void setTexturingAndBlending(bool enable); private: - bool mAlpha, mTexture; + void inline setColorAlpha(float alpha); + + void inline restoreColor(); + + bool mAlpha; + bool mTexture; + bool mIsByteColor; + gcn::Color mByteColor; + float mFloatColor; bool mColorAlpha; FBOInfo mFbo; }; |