summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2012-08-31 00:46:31 +0300
committerAndrei Karas <akaras@inbox.ru>2012-08-31 03:02:31 +0300
commite513b3e1d7334258c82febb873ccab88c9f8bb83 (patch)
tree3e75163c59b75bb8b606bc2c38244481869cac87
parent5cbd0d2cb7086fda592c00dbc3b07d06af95f080 (diff)
downloadmanaverse-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.gz
manaverse-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.bz2
manaverse-e513b3e1d7334258c82febb873ccab88c9f8bb83.tar.xz
manaverse-e513b3e1d7334258c82febb873ccab88c9f8bb83.zip
Improve OpenGL change color speed.
-rw-r--r--src/normalopenglgraphics.cpp86
-rw-r--r--src/normalopenglgraphics.h12
-rw-r--r--src/safeopenglgraphics.cpp67
-rw-r--r--src/safeopenglgraphics.h10
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;
};