[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