summaryrefslogtreecommitdiff
path: root/src/openglgraphics.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-25 16:56:52 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-25 16:56:52 +0000
commit14c82e5b5d5547bcf9c3b06c68cf20a100600d0b (patch)
treea46770e8dc29a541eff9480c0e5c132336666b48 /src/openglgraphics.cpp
parent06ea0c8cf1986460d3c74cddd02a714fb6c26bca (diff)
downloadmana-14c82e5b5d5547bcf9c3b06c68cf20a100600d0b.tar.gz
mana-14c82e5b5d5547bcf9c3b06c68cf20a100600d0b.tar.bz2
mana-14c82e5b5d5547bcf9c3b06c68cf20a100600d0b.tar.xz
mana-14c82e5b5d5547bcf9c3b06c68cf20a100600d0b.zip
Removed dependency on Guichan's OpenGL library. Taken over image loading and handling. Reduced memory usage when using OpenGL. (Up to 95% reduction for some textures.)
Diffstat (limited to 'src/openglgraphics.cpp')
-rw-r--r--src/openglgraphics.cpp115
1 files changed, 56 insertions, 59 deletions
diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp
index f4cda0b9..b1e6ef81 100644
--- a/src/openglgraphics.cpp
+++ b/src/openglgraphics.cpp
@@ -27,6 +27,7 @@
#include "openglgraphics.h"
+#include <cstring>
#include <SDL.h>
#ifdef __APPLE__
@@ -83,6 +84,23 @@ bool OpenGLGraphics::setVideoMode(int w, int h, int bpp, bool fs, bool hwaccel)
logger->log("Using OpenGL %s double buffering.",
(gotDoubleBuffer ? "with" : "without"));
+ char const *glExtensions = (char const *)glGetString(GL_EXTENSIONS);
+ int texSize;
+ bool rectTex = strstr(glExtensions, "GL_ARB_texture_rectangle");
+ if (rectTex)
+ {
+ Image::mTextureType = GL_TEXTURE_RECTANGLE_ARB;
+ glGetIntegerv(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, &texSize);
+ }
+ else
+ {
+ Image::mTextureType = GL_TEXTURE_2D;
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
+ }
+ Image::mTextureSize = texSize;
+ logger->log("OpenGL texture size: %d pixels%s", Image::mTextureSize,
+ rectTex ? " (rectangle textures)" : "");
+
return true;
}
@@ -92,17 +110,44 @@ bool OpenGLGraphics::drawImage(Image *image, int srcX, int srcY,
srcX += image->mBounds.x;
srcY += image->mBounds.y;
- // Find OpenGL texture coordinates
- float texX1 = srcX / (float)image->mTexWidth;
- float texY1 = srcY / (float)image->mTexHeight;
- float texX2 = (srcX + width) / (float)image->mTexWidth;
- float texY2 = (srcY + height) / (float)image->mTexHeight;
-
glColor4f(1.0f, 1.0f, 1.0f, image->mAlpha);
- glBindTexture(GL_TEXTURE_2D, image->mGLImage);
+ glBindTexture(Image::mTextureType, image->mGLImage);
+
+ setTexturingAndBlending(true);
+
+ // Draw a textured quad.
+ glBegin(GL_QUADS);
- drawTexedQuad(dstX, dstY, width, height, texX1, texY1, texX2, texY2);
+ if (Image::mTextureType == GL_TEXTURE_2D)
+ {
+ // Find OpenGL normalized texture coordinates.
+ float texX1 = srcX / (float)image->mTexWidth;
+ float texY1 = srcY / (float)image->mTexHeight;
+ float texX2 = (srcX + width) / (float)image->mTexWidth;
+ float texY2 = (srcY + height) / (float)image->mTexHeight;
+
+ glTexCoord2f(texX1, texY1);
+ glVertex2i(dstX, dstY);
+ glTexCoord2f(texX2, texY1);
+ glVertex2i(dstX + width, dstY);
+ glTexCoord2f(texX2, texY2);
+ glVertex2i(dstX + width, dstY + height);
+ glTexCoord2f(texX1, texY2);
+ glVertex2i(dstX, dstY + height);
+ }
+ else
+ {
+ glTexCoord2i(srcX, srcY);
+ glVertex2i(dstX, dstY);
+ glTexCoord2i(srcX + width, srcY);
+ glVertex2i(dstX + width, dstY);
+ glTexCoord2i(srcX + width, srcY + height);
+ glVertex2i(dstX + width, dstY + height);
+ glTexCoord2i(srcX, srcY + height);
+ glVertex2i(dstX, dstY + height);
+ }
+ glEnd();
glColor4ub(mColor.r, mColor.g, mColor.b, mColor.a);
return true;
@@ -229,33 +274,6 @@ void OpenGLGraphics::setColor(const gcn::Color& color)
mColorAlpha = (color.a != 255);
}
-void OpenGLGraphics::drawImage(const gcn::Image* image,
- int srcX, int srcY,
- int dstX, int dstY,
- int width, int height)
-{
- const gcn::OpenGLImage* srcImage =
- dynamic_cast<const gcn::OpenGLImage*>(image);
-
- if (srcImage == NULL)
- {
- throw GCN_EXCEPTION("Trying to draw an image of unknown format, "
- "must be an SDLImage.");
- }
-
- // Find OpenGL texture coordinates
- float texX1 = srcX / (float)srcImage->getTextureWidth();
- float texY1 = srcY / (float)srcImage->getTextureHeight();
- float texX2 = (srcX + width) / (float)srcImage->getTextureWidth();
- float texY2 = (srcY + height) / (float)srcImage->getTextureHeight();
-
- // Please dont look too closely at the next line, it is not pretty.
- // It uses the image data as a pointer to a GLuint
- glBindTexture(GL_TEXTURE_2D, srcImage->getTextureHandle());
-
- drawTexedQuad(dstX, dstY, width, height, texX1, texY1, texX2, texY2);
-}
-
void OpenGLGraphics::drawPoint(int x, int y)
{
setTexturingAndBlending(false);
@@ -297,9 +315,9 @@ void OpenGLGraphics::setTexturingAndBlending(bool enable)
{
if (enable) {
if (!mTexture) {
- glEnable(GL_TEXTURE_2D);
+ glEnable(Image::mTextureType);
mTexture = true;
- };
+ }
if (!mAlpha)
{
@@ -316,7 +334,7 @@ void OpenGLGraphics::setTexturingAndBlending(bool enable)
}
if (mTexture) {
- glDisable(GL_TEXTURE_2D);
+ glDisable(Image::mTextureType);
mTexture = false;
}
}
@@ -336,25 +354,4 @@ void OpenGLGraphics::drawRectangle(const gcn::Rectangle& rect, bool filled)
glEnd();
}
-void OpenGLGraphics::drawTexedQuad(int x, int y, int w, int h,
- float texX1, float texY1, float texX2, float texY2)
-{
- setTexturingAndBlending(true);
-
- // Draw a textured quad
- glBegin(GL_QUADS);
- glTexCoord2f(texX1, texY1);
- glVertex2i(x, y);
-
- glTexCoord2f(texX2, texY1);
- glVertex2i(x + w, y);
-
- glTexCoord2f(texX2, texY2);
- glVertex2i(x + w, y + h);
-
- glTexCoord2f(texX1, texY2);
- glVertex2i(x, y + h);
- glEnd();
-}
-
#endif // USE_OPENGL