[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: playground/libs/kgllib/core/kgllib
From: Rivo Laks <rivolaks () hot ! ee>
Date: 2008-04-01 17:01:40
Message-ID: 1207069300.779892.24336.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 792595 by rivol:
Add optional format parameter to Texture ctor.
It should now be possible to create e.g. depth or floating-point
textures.
M +121 -9 texture.cpp
M +4 -2 texture.h
--- trunk/playground/libs/kgllib/core/kgllib/texture.cpp #792594:792595
@@ -26,6 +26,105 @@
#include <QtDebug>
+namespace
+{
+
+GLint determineFormat(GLint internalformat)
+{
+ switch (internalformat) {
+ // From OpenGL 2.1 spec
+ case GL_ALPHA:
+ case GL_ALPHA4:
+ case GL_ALPHA8:
+ case GL_ALPHA12:
+ case GL_ALPHA16:
+ return GL_ALPHA;
+ case GL_DEPTH_COMPONENT16:
+ case GL_DEPTH_COMPONENT24:
+ case GL_DEPTH_COMPONENT32:
+ return GL_DEPTH_COMPONENT;
+ case GL_LUMINANCE:
+ case GL_LUMINANCE4:
+ case GL_LUMINANCE8:
+ case GL_LUMINANCE12:
+ case GL_LUMINANCE16:
+ return GL_LUMINANCE;
+ case GL_LUMINANCE_ALPHA:
+ case GL_LUMINANCE4_ALPHA4:
+ case GL_LUMINANCE6_ALPHA2:
+ case GL_LUMINANCE8_ALPHA8:
+ case GL_LUMINANCE12_ALPHA4:
+ case GL_LUMINANCE12_ALPHA12:
+ case GL_LUMINANCE16_ALPHA16:
+ return GL_LUMINANCE_ALPHA;
+ case GL_INTENSITY:
+ case GL_INTENSITY4:
+ case GL_INTENSITY8:
+ case GL_INTENSITY12:
+ case GL_INTENSITY16:
+ return GL_INTENSITY;
+ case GL_R3_G3_B2:
+ case GL_RGB:
+ case GL_RGB4:
+ case GL_RGB5:
+ case GL_RGB8:
+ case GL_RGB10:
+ case GL_RGB12:
+ case GL_RGB16:
+ return GL_RGB;
+ case GL_RGBA:
+ case GL_RGBA2:
+ case GL_RGBA4:
+ case GL_RGB5_A1:
+ case GL_RGBA8:
+ case GL_RGB10_A2:
+ case GL_RGBA12:
+ case GL_RGBA16:
+ return GL_RGBA;
+ // sRGB
+ case GL_SRGB8: return GL_RGB;
+ case GL_SRGB8_ALPHA8: return GL_RGBA;
+ case GL_SLUMINANCE: return GL_LUMINANCE;
+ case GL_SLUMINANCE8_ALPHA8: return GL_LUMINANCE_ALPHA;
+ // Generic compressed formats
+ case GL_COMPRESSED_ALPHA: return GL_ALPHA;
+ case GL_COMPRESSED_LUMINANCE: return GL_LUMINANCE;
+ case GL_COMPRESSED_LUMINANCE_ALPHA: return GL_LUMINANCE_ALPHA;
+ case GL_COMPRESSED_INTENSITY: return GL_INTENSITY;
+ case GL_COMPRESSED_RGB: return GL_RGB;
+ case GL_COMPRESSED_RGBA: return GL_RGBA;
+ case GL_COMPRESSED_SRGB: return GL_RGB;
+ case GL_COMPRESSED_SRGB_ALPHA: return GL_RGBA;
+ case GL_COMPRESSED_SLUMINANCE: return GL_LUMINANCE;
+ case GL_COMPRESSED_SLUMINANCE_ALPHA: return GL_LUMINANCE_ALPHA;
+ // From EXT_texture_compression_s3tc extension
+ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+ return GL_RGB;
+ case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+ return GL_RGBA;
+ // From ARB_texture_float extension
+ case GL_RGBA32F_ARB: return GL_RGBA;
+ case GL_RGB32F_ARB: return GL_RGB;
+ case GL_ALPHA32F_ARB: return GL_ALPHA;
+ case GL_INTENSITY32F_ARB: return GL_INTENSITY;
+ case GL_LUMINANCE32F_ARB: return GL_LUMINANCE;
+ case GL_LUMINANCE_ALPHA32F_ARB: return GL_LUMINANCE_ALPHA;
+ case GL_RGBA16F_ARB: return GL_RGBA;
+ case GL_RGB16F_ARB: return GL_RGB;
+ case GL_ALPHA16F_ARB: return GL_ALPHA;
+ case GL_INTENSITY16F_ARB: return GL_INTENSITY;
+ case GL_LUMINANCE16F_ARB: return GL_LUMINANCE;
+ case GL_LUMINANCE_ALPHA16F_ARB: return GL_LUMINANCE_ALPHA;
+
+ default:
+ return 0;
+ }
+}
+
+}
+
namespace KGLLib
{
@@ -104,9 +203,9 @@
/*** Texture ***/
-Texture::Texture(int width, int height)
+Texture::Texture(int width, int height, GLint internalformat, GLint format)
{
- mValid = init(width, height);
+ mValid = init(width, height, internalformat, format);
}
Texture::Texture(const QImage& img, GLenum filter)
@@ -123,13 +222,24 @@
{
}
-bool Texture::init(int width, int height)
+bool Texture::init(int width, int height, GLint internalformat, GLint format)
{
glGenTextures(1, &mGLId);
bind();
setFilter(GL_LINEAR);
- glTexImage2D( glTarget(), 0, GL_RGBA, width, height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, 0);
+
+ if (!format) {
+ format = determineFormat(internalformat);
+ if (!format) {
+ qCritical() << "Texture::init(): Couldn't determine matching format for \
internalformat" << internalformat; + return false;
+ }
+ }
+ mInternalFormat = internalformat;
+ mFormat = format;
+ glTexImage2D( glTarget(), 0, mInternalFormat, width, height, 0,
+ mFormat, GL_UNSIGNED_BYTE, 0);
+
checkGLError(QString("Texture::init(%1, %2)").arg(width).arg(height));
return true;
@@ -137,15 +247,17 @@
bool Texture::init(const QImage& img, GLenum filter)
{
- glGenTextures(1, &mGLId);
- bind();
+ if (!init(img.width(), img.height())) {
+ return false;
+ }
+
setFilter(filter);
QImage glimg = convertToGLFormat( img );
// TODO: make sure generate_mipmap is supported and use gluBuild2DMipmaps if it \
isn't // TODO: generate mipmaps only if filter requires them
glTexParameteri(glTarget(), GL_GENERATE_MIPMAP, GL_TRUE);
- glTexImage2D( glTarget(), 0, GL_RGBA, glimg.width(), glimg.height(), 0,
- GL_RGBA, GL_UNSIGNED_BYTE, glimg.bits());
+ glTexImage2D( glTarget(), 0, mInternalFormat, glimg.width(), glimg.height(), 0,
+ mFormat, GL_UNSIGNED_BYTE, glimg.bits());
checkGLError("Texture::init(Qimage)");
return true;
--- trunk/playground/libs/kgllib/core/kgllib/texture.h #792594:792595
@@ -157,6 +157,8 @@
bool mValid;
GLuint mGLId;
QString mName;
+ GLenum mFormat;
+ GLenum mInternalFormat;
};
@@ -175,7 +177,7 @@
explicit Texture(const QImage& img, GLenum filter = GL_LINEAR_MIPMAP_LINEAR);
explicit Texture(const QPixmap& pix, GLenum filter = GL_LINEAR_MIPMAP_LINEAR);
explicit Texture(const QString& filename, GLenum filter = \
GL_LINEAR_MIPMAP_LINEAR);
- Texture(int width, int height);
+ Texture(int width, int height, GLint internalformat = GL_RGBA, GLint format = \
0); virtual ~Texture();
int width() const { return mWidth; }
@@ -189,7 +191,7 @@
QImage convertToGLFormat(const QImage& img) const;
protected:
- bool init(int width, int height);
+ bool init(int width, int height, GLint internalformat = GL_RGBA, GLint format = \
0); bool init(const QImage& img, GLenum filter);
bool init(const QString& filename, GLenum filter);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic