]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/textures.cpp
my own uncrustify run
[xonotic/netradiant.git] / radiant / textures.cpp
index e7ff7e42528b86fc7594ee925cc779731f38ef35..b223e2ee1318a87c40d0b7ccbab788f13a72f1c1 100644 (file)
@@ -1,23 +1,23 @@
 /*
-Copyright (C) 1999-2006 Id Software, Inc. and contributors.
-For a list of contributors, see the accompanying CONTRIBUTORS file.
+   Copyright (C) 1999-2006 Id Software, Inc. and contributors.
+   For a list of contributors, see the accompanying CONTRIBUTORS file.
 
-This file is part of GtkRadiant.
+   This file is part of GtkRadiant.
 
-GtkRadiant is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   GtkRadiant is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
 
-GtkRadiant is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   GtkRadiant is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-You should have received a copy of the GNU General Public License
-along with GtkRadiant; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-*/
+   You should have received a copy of the GNU General Public License
+   along with GtkRadiant; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
 
 #include "textures.h"
 
@@ -43,93 +43,93 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 enum ETexturesMode
 {
-  eTextures_NEAREST = 0,
-  eTextures_NEAREST_MIPMAP_NEAREST = 1,
-  eTextures_NEAREST_MIPMAP_LINEAR = 2,
-  eTextures_LINEAR = 3,
-  eTextures_LINEAR_MIPMAP_NEAREST = 4,
-  eTextures_LINEAR_MIPMAP_LINEAR = 5,
-  eTextures_MAX_ANISOTROPY = 6,
+       eTextures_NEAREST = 0,
+       eTextures_NEAREST_MIPMAP_NEAREST = 1,
+       eTextures_NEAREST_MIPMAP_LINEAR = 2,
+       eTextures_LINEAR = 3,
+       eTextures_LINEAR_MIPMAP_NEAREST = 4,
+       eTextures_LINEAR_MIPMAP_LINEAR = 5,
+       eTextures_MAX_ANISOTROPY = 6,
 };
 
 enum TextureCompressionFormat
 {
-  TEXTURECOMPRESSION_NONE = 0,
-  TEXTURECOMPRESSION_RGBA = 1,
-  TEXTURECOMPRESSION_RGBA_S3TC_DXT1 = 2,
-  TEXTURECOMPRESSION_RGBA_S3TC_DXT3 = 3,
-  TEXTURECOMPRESSION_RGBA_S3TC_DXT5 = 4,
+       TEXTURECOMPRESSION_NONE = 0,
+       TEXTURECOMPRESSION_RGBA = 1,
+       TEXTURECOMPRESSION_RGBA_S3TC_DXT1 = 2,
+       TEXTURECOMPRESSION_RGBA_S3TC_DXT3 = 3,
+       TEXTURECOMPRESSION_RGBA_S3TC_DXT5 = 4,
 };
 
 struct texture_globals_t
 {
-  // RIANT
-  // texture compression format
-  TextureCompressionFormat m_nTextureCompressionFormat;
-
-  float fGamma;
-
-  bool bTextureCompressionSupported; // is texture compression supported by hardware?
-  GLint texture_components;
-
-  // temporary values that should be initialised only once at run-time
-  bool m_bOpenGLCompressionSupported;
-  bool m_bS3CompressionSupported;
-
-  texture_globals_t(GLint components) :
-    m_nTextureCompressionFormat(TEXTURECOMPRESSION_NONE),
-    fGamma(1.0f),
-    bTextureCompressionSupported(false),
-    texture_components(components),
-    m_bOpenGLCompressionSupported(false),
-    m_bS3CompressionSupported(false)
-  {
-  }
+       // RIANT
+       // texture compression format
+       TextureCompressionFormat m_nTextureCompressionFormat;
+
+       float fGamma;
+
+       bool bTextureCompressionSupported; // is texture compression supported by hardware?
+       GLint texture_components;
+
+       // temporary values that should be initialised only once at run-time
+       bool m_bOpenGLCompressionSupported;
+       bool m_bS3CompressionSupported;
+
+       texture_globals_t( GLint components ) :
+               m_nTextureCompressionFormat( TEXTURECOMPRESSION_NONE ),
+               fGamma( 1.0f ),
+               bTextureCompressionSupported( false ),
+               texture_components( components ),
+               m_bOpenGLCompressionSupported( false ),
+               m_bS3CompressionSupported( false ){
+       }
 };
 
-texture_globals_t g_texture_globals(GL_RGBA);
+texture_globals_t g_texture_globals( GL_RGBA );
 
-void SetTexParameters(ETexturesMode mode)
-{
+void SetTexParameters( ETexturesMode mode ){
        float maxAniso = QGL_maxTextureAnisotropy();
-       if(maxAniso > 1)
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
+       if ( maxAniso > 1 ) {
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f );
+       }
        else
-               if(mode == eTextures_MAX_ANISOTROPY)
-                       mode = eTextures_LINEAR_MIPMAP_LINEAR;
-
-  switch (mode)
-  {
-  case eTextures_NEAREST:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
-    break;
-  case eTextures_NEAREST_MIPMAP_NEAREST:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
-    break;
-  case eTextures_NEAREST_MIPMAP_LINEAR:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
-    break;
-  case eTextures_LINEAR:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-    break;
-  case eTextures_LINEAR_MIPMAP_NEAREST:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-    break;
-  case eTextures_LINEAR_MIPMAP_LINEAR:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-    break;
-  case eTextures_MAX_ANISOTROPY:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAniso);
-    break;
-  default:
-    globalOutputStream() << "invalid texture mode\n";
-  }
+       if ( mode == eTextures_MAX_ANISOTROPY ) {
+               mode = eTextures_LINEAR_MIPMAP_LINEAR;
+       }
+
+       switch ( mode )
+       {
+       case eTextures_NEAREST:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+               break;
+       case eTextures_NEAREST_MIPMAP_NEAREST:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+               break;
+       case eTextures_NEAREST_MIPMAP_LINEAR:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+               break;
+       case eTextures_LINEAR:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+               break;
+       case eTextures_LINEAR_MIPMAP_NEAREST:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+               break;
+       case eTextures_LINEAR_MIPMAP_LINEAR:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+               break;
+       case eTextures_MAX_ANISOTROPY:
+               glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAniso );
+               break;
+       default:
+               globalOutputStream() << "invalid texture mode\n";
+       }
 }
 
 ETexturesMode g_texture_mode = eTextures_LINEAR_MIPMAP_LINEAR;
@@ -138,178 +138,181 @@ ETexturesMode g_texture_mode = eTextures_LINEAR_MIPMAP_LINEAR;
 
 
 byte g_gammatable[256];
-void ResampleGamma(float fGamma)
-{
-  int i,inf;
-  if (fGamma == 1.0)
-  {
-    for (i = 0; i < 256; i++)
-      g_gammatable[i] = i;
-  } else
-  {
-    for (i = 0; i < 256; i++)
-    {
-      inf = (int)(255 * pow ( static_cast<double>((i + 0.5) / 255.5) , static_cast<double>(fGamma) ) + 0.5);
-      if (inf < 0)
-        inf = 0;
-      if (inf > 255)
-        inf = 255;
-      g_gammatable[i] = inf;
-    }
-  }
-}
-
-inline const int& min_int(const int& left, const int& right)
-{
-  return std::min(left, right);
+void ResampleGamma( float fGamma ){
+       int i,inf;
+       if ( fGamma == 1.0 ) {
+               for ( i = 0; i < 256; i++ )
+                       g_gammatable[i] = i;
+       }
+       else
+       {
+               for ( i = 0; i < 256; i++ )
+               {
+                       inf = (int)( 255 * pow( static_cast<double>( ( i + 0.5 ) / 255.5 ), static_cast<double>( fGamma ) ) + 0.5 );
+                       if ( inf < 0 ) {
+                               inf = 0;
+                       }
+                       if ( inf > 255 ) {
+                               inf = 255;
+                       }
+                       g_gammatable[i] = inf;
+               }
+       }
+}
+
+inline const int& min_int( const int& left, const int& right ){
+       return std::min( left, right );
 }
 
 int max_tex_size = 0;
 const int max_texture_quality = 3;
-LatchedInt g_Textures_textureQuality(3, "Texture Quality");
+LatchedInt g_Textures_textureQuality( 3, "Texture Quality" );
 
 /// \brief This function does the actual processing of raw RGBA data into a GL texture.
 /// It will also resample to power-of-two dimensions, generate the mipmaps and adjust gamma.
-void LoadTextureRGBA(qtexture_t* q, unsigned char* pPixels, int nWidth, int nHeight)
-{
-  static float fGamma = -1;
-  float total[3];
-  byte  *outpixels = 0;
-  int   nCount = nWidth * nHeight;
-
-  if (fGamma != g_texture_globals.fGamma)
-  {
-    fGamma = g_texture_globals.fGamma;
-    ResampleGamma(fGamma);
-  }
-
-  q->width = nWidth;
-  q->height = nHeight;
-
-  total[0] = total[1] = total[2] = 0.0f;
-
-  // resample texture gamma according to user settings
-  for (int i = 0; i < (nCount * 4); i += 4)
-  {
-    for (int j = 0; j < 3; j++)
-    {
-      total[j] += (pPixels + i)[j];
-      byte b = (pPixels + i)[j];
-      (pPixels + i)[j] = g_gammatable[b];
-    }
-  }
-
-  q->color[0] = total[0] / (nCount * 255);
-  q->color[1] = total[1] / (nCount * 255);
-  q->color[2] = total[2] / (nCount * 255);
-
-  glGenTextures (1, &q->texture_number);
-
-  glBindTexture( GL_TEXTURE_2D, q->texture_number );
-
-  SetTexParameters(g_texture_mode);
-
-  int gl_width = 1;
-  while(gl_width < nWidth)
-    gl_width <<= 1;
-
-  int gl_height = 1;
-  while(gl_height < nHeight)
-    gl_height <<= 1;
-
-  bool resampled = false;
-  if (!(gl_width == nWidth && gl_height == nHeight))
-  {
-    resampled = true;
-    outpixels = (byte *)malloc(gl_width * gl_height * 4);
-    R_ResampleTexture(pPixels, nWidth, nHeight, outpixels, gl_width, gl_height, 4);
-  }
-  else
-  {
-    outpixels = pPixels;
-  }
-
-  int quality_reduction = max_texture_quality - g_Textures_textureQuality.m_value;
-  int target_width = min_int(gl_width >> quality_reduction, max_tex_size);
-  int target_height = min_int(gl_height >> quality_reduction, max_tex_size);
-
-  while (gl_width > target_width || gl_height > target_height)
-  {
-    GL_MipReduce(outpixels, outpixels, gl_width, gl_height, target_width, target_height);
-
-    if (gl_width > target_width)
-      gl_width >>= 1;
-    if (gl_height > target_height)
-      gl_height >>= 1;
-  }
-
-  int mip = 0;
-  glTexImage2D(GL_TEXTURE_2D, mip++, g_texture_globals.texture_components, gl_width, gl_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, outpixels);
-  while (gl_width > 1 || gl_height > 1)
-  {
-    GL_MipReduce(outpixels, outpixels, gl_width, gl_height, 1, 1);
-
-    if (gl_width > 1)
-      gl_width >>= 1;
-    if (gl_height > 1)
-      gl_height >>= 1;
-
-    glTexImage2D(GL_TEXTURE_2D, mip++, g_texture_globals.texture_components, gl_width, gl_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, outpixels);
-  }
-
-  glBindTexture(GL_TEXTURE_2D, 0);
-  if (resampled)
-    free(outpixels);
+void LoadTextureRGBA( qtexture_t* q, unsigned char* pPixels, int nWidth, int nHeight ){
+       static float fGamma = -1;
+       float total[3];
+       byte  *outpixels = 0;
+       int nCount = nWidth * nHeight;
+
+       if ( fGamma != g_texture_globals.fGamma ) {
+               fGamma = g_texture_globals.fGamma;
+               ResampleGamma( fGamma );
+       }
+
+       q->width = nWidth;
+       q->height = nHeight;
+
+       total[0] = total[1] = total[2] = 0.0f;
+
+       // resample texture gamma according to user settings
+       for ( int i = 0; i < ( nCount * 4 ); i += 4 )
+       {
+               for ( int j = 0; j < 3; j++ )
+               {
+                       total[j] += ( pPixels + i )[j];
+                       byte b = ( pPixels + i )[j];
+                       ( pPixels + i )[j] = g_gammatable[b];
+               }
+       }
+
+       q->color[0] = total[0] / ( nCount * 255 );
+       q->color[1] = total[1] / ( nCount * 255 );
+       q->color[2] = total[2] / ( nCount * 255 );
+
+       glGenTextures( 1, &q->texture_number );
+
+       glBindTexture( GL_TEXTURE_2D, q->texture_number );
+
+       SetTexParameters( g_texture_mode );
+
+       int gl_width = 1;
+       while ( gl_width < nWidth )
+               gl_width <<= 1;
+
+       int gl_height = 1;
+       while ( gl_height < nHeight )
+               gl_height <<= 1;
+
+       bool resampled = false;
+       if ( !( gl_width == nWidth && gl_height == nHeight ) ) {
+               resampled = true;
+               outpixels = (byte *)malloc( gl_width * gl_height * 4 );
+               R_ResampleTexture( pPixels, nWidth, nHeight, outpixels, gl_width, gl_height, 4 );
+       }
+       else
+       {
+               outpixels = pPixels;
+       }
+
+       int quality_reduction = max_texture_quality - g_Textures_textureQuality.m_value;
+       int target_width = min_int( gl_width >> quality_reduction, max_tex_size );
+       int target_height = min_int( gl_height >> quality_reduction, max_tex_size );
+
+       while ( gl_width > target_width || gl_height > target_height )
+       {
+               GL_MipReduce( outpixels, outpixels, gl_width, gl_height, target_width, target_height );
+
+               if ( gl_width > target_width ) {
+                       gl_width >>= 1;
+               }
+               if ( gl_height > target_height ) {
+                       gl_height >>= 1;
+               }
+       }
+
+       int mip = 0;
+       glTexImage2D( GL_TEXTURE_2D, mip++, g_texture_globals.texture_components, gl_width, gl_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, outpixels );
+       while ( gl_width > 1 || gl_height > 1 )
+       {
+               GL_MipReduce( outpixels, outpixels, gl_width, gl_height, 1, 1 );
+
+               if ( gl_width > 1 ) {
+                       gl_width >>= 1;
+               }
+               if ( gl_height > 1 ) {
+                       gl_height >>= 1;
+               }
+
+               glTexImage2D( GL_TEXTURE_2D, mip++, g_texture_globals.texture_components, gl_width, gl_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, outpixels );
+       }
+
+       glBindTexture( GL_TEXTURE_2D, 0 );
+       if ( resampled ) {
+               free( outpixels );
+       }
 }
 
 #if 0
 /*
-==============
-Texture_InitPalette
-==============
-*/
-void Texture_InitPalette (byte *pal)
-{
-  int   r,g,b;
-  int   i;
-  int   inf;
-  byte  gammatable[256];
-  float gamma;
-
-  gamma = g_texture_globals.fGamma;
-
-  if (gamma == 1.0)
-  {
-    for (i=0 ; i<256 ; i++)
-      gammatable[i] = i;
-  } else
-  {
-    for (i=0 ; i<256 ; i++)
-    {
-      inf = (int)(255 * pow ( (i+0.5)/255.5 , gamma ) + 0.5);
-      if (inf < 0)
-        inf = 0;
-      if (inf > 255)
-        inf = 255;
-      gammatable[i] = inf;
-    }
-  }
-
-  for (i=0 ; i<256 ; i++)
-  {
-    r = gammatable[pal[0]];
-    g = gammatable[pal[1]];
-    b = gammatable[pal[2]];
-    pal += 3;
-
-    //v = (r<<24) + (g<<16) + (b<<8) + 255;
-    //v = BigLong (v);
-
-    //tex_palette[i] = v;
-    tex_palette[i*3+0] = r;
-    tex_palette[i*3+1] = g;
-    tex_palette[i*3+2] = b;
-  }
+   ==============
+   Texture_InitPalette
+   ==============
+ */
+void Texture_InitPalette( byte *pal ){
+       int r,g,b;
+       int i;
+       int inf;
+       byte gammatable[256];
+       float gamma;
+
+       gamma = g_texture_globals.fGamma;
+
+       if ( gamma == 1.0 ) {
+               for ( i = 0 ; i < 256 ; i++ )
+                       gammatable[i] = i;
+       }
+       else
+       {
+               for ( i = 0 ; i < 256 ; i++ )
+               {
+                       inf = (int)( 255 * pow( ( i + 0.5 ) / 255.5, gamma ) + 0.5 );
+                       if ( inf < 0 ) {
+                               inf = 0;
+                       }
+                       if ( inf > 255 ) {
+                               inf = 255;
+                       }
+                       gammatable[i] = inf;
+               }
+       }
+
+       for ( i = 0 ; i < 256 ; i++ )
+       {
+               r = gammatable[pal[0]];
+               g = gammatable[pal[1]];
+               b = gammatable[pal[2]];
+               pal += 3;
+
+               //v = (r<<24) + (g<<16) + (b<<8) + 255;
+               //v = BigLong (v);
+
+               //tex_palette[i] = v;
+               tex_palette[i * 3 + 0] = r;
+               tex_palette[i * 3 + 1] = g;
+               tex_palette[i * 3 + 2] = b;
+       }
 }
 #endif
 
@@ -317,12 +320,11 @@ void Texture_InitPalette (byte *pal)
 class TestHashtable
 {
 public:
-  TestHashtable()
-  {
-    HashTable<CopiedString, CopiedString, HashStringNoCase, StringEqualNoCase> strings;
-    strings["Monkey"] = "bleh";
-    strings["MonkeY"] = "blah";
-  }
+TestHashtable(){
+       HashTable<CopiedString, CopiedString, HashStringNoCase, StringEqualNoCase> strings;
+       strings["Monkey"] = "bleh";
+       strings["MonkeY"] = "blah";
+}
 };
 
 const TestHashtable g_testhashtable;
@@ -331,527 +333,467 @@ const TestHashtable g_testhashtable;
 
 typedef std::pair<LoadImageCallback, CopiedString> TextureKey;
 
-void qtexture_realise(qtexture_t& texture, const TextureKey& key)
-{
-  texture.texture_number = 0;
-  if(!string_empty(key.second.c_str()))
-  {
-    Image* image = key.first.loadImage(key.second.c_str());
-    if(image != 0)
-    {
-      LoadTextureRGBA(&texture, image->getRGBAPixels(), image->getWidth(), image->getHeight());
-      texture.surfaceFlags = image->getSurfaceFlags();
-      texture.contentFlags = image->getContentFlags();
-      texture.value = image->getValue();
-      image->release();
-      globalOutputStream() << "Loaded Texture: \"" << key.second.c_str() << "\"\n";
-      GlobalOpenGL_debugAssertNoErrors();
-    }
-    else
-    {
-      globalErrorStream() << "Texture load failed: \"" << key.second.c_str() << "\"\n";
-    }
-  }
-}
-
-void qtexture_unrealise(qtexture_t& texture)
-{
-  if(GlobalOpenGL().contextValid && texture.texture_number != 0)
-  {
-    glDeleteTextures(1, &texture.texture_number);
-    GlobalOpenGL_debugAssertNoErrors();
-  }
+void qtexture_realise( qtexture_t& texture, const TextureKey& key ){
+       texture.texture_number = 0;
+       if ( !string_empty( key.second.c_str() ) ) {
+               Image* image = key.first.loadImage( key.second.c_str() );
+               if ( image != 0 ) {
+                       LoadTextureRGBA( &texture, image->getRGBAPixels(), image->getWidth(), image->getHeight() );
+                       texture.surfaceFlags = image->getSurfaceFlags();
+                       texture.contentFlags = image->getContentFlags();
+                       texture.value = image->getValue();
+                       image->release();
+                       globalOutputStream() << "Loaded Texture: \"" << key.second.c_str() << "\"\n";
+                       GlobalOpenGL_debugAssertNoErrors();
+               }
+               else
+               {
+                       globalErrorStream() << "Texture load failed: \"" << key.second.c_str() << "\"\n";
+               }
+       }
+}
+
+void qtexture_unrealise( qtexture_t& texture ){
+       if ( GlobalOpenGL().contextValid && texture.texture_number != 0 ) {
+               glDeleteTextures( 1, &texture.texture_number );
+               GlobalOpenGL_debugAssertNoErrors();
+       }
 }
 
 class TextureKeyEqualNoCase
 {
 public:
-  bool operator()(const TextureKey& key, const TextureKey& other) const
-  {
-    return key.first == other.first && string_equal_nocase(key.second.c_str(), other.second.c_str());
-  }
+bool operator()( const TextureKey& key, const TextureKey& other ) const {
+       return key.first == other.first && string_equal_nocase( key.second.c_str(), other.second.c_str() );
+}
 };
 
 class TextureKeyHashNoCase
 {
 public:
-  typedef hash_t hash_type;
-  hash_t operator()(const TextureKey& key) const
-  {
-    return hash_combine(string_hash_nocase(key.second.c_str()), pod_hash(key.first));
-  }
+typedef hash_t hash_type;
+hash_t operator()( const TextureKey& key ) const {
+       return hash_combine( string_hash_nocase( key.second.c_str() ), pod_hash( key.first ) );
+}
 };
 
 #define DEBUG_TEXTURES 0
 
 class TexturesMap : public TexturesCache
 {
-  class TextureConstructor
-  {
-    TexturesMap* m_cache;
-  public:
-    explicit TextureConstructor(TexturesMap* cache)
-      : m_cache(cache)
-    {
-    }
-    qtexture_t* construct(const TextureKey& key)
-    {
-      qtexture_t* texture = new qtexture_t(key.first, key.second.c_str());
-      if(m_cache->realised())
-      {
-        qtexture_realise(*texture, key);
-      }
-      return texture;
-    }
-    void destroy(qtexture_t* texture)
-    {
-      if(m_cache->realised())
-      {
-        qtexture_unrealise(*texture);
-      }
-      delete texture;
-    }
-  };
-
-  typedef HashedCache<TextureKey, qtexture_t, TextureKeyHashNoCase, TextureKeyEqualNoCase, TextureConstructor> qtextures_t;
-  qtextures_t m_qtextures;
-  TexturesCacheObserver* m_observer;
-  std::size_t m_unrealised;
+class TextureConstructor
+{
+TexturesMap* m_cache;
+public:
+explicit TextureConstructor( TexturesMap* cache )
+       : m_cache( cache ){
+}
+qtexture_t* construct( const TextureKey& key ){
+       qtexture_t* texture = new qtexture_t( key.first, key.second.c_str() );
+       if ( m_cache->realised() ) {
+               qtexture_realise( *texture, key );
+       }
+       return texture;
+}
+void destroy( qtexture_t* texture ){
+       if ( m_cache->realised() ) {
+               qtexture_unrealise( *texture );
+       }
+       delete texture;
+}
+};
+
+typedef HashedCache<TextureKey, qtexture_t, TextureKeyHashNoCase, TextureKeyEqualNoCase, TextureConstructor> qtextures_t;
+qtextures_t m_qtextures;
+TexturesCacheObserver* m_observer;
+std::size_t m_unrealised;
 
 public:
-  TexturesMap() : m_qtextures(TextureConstructor(this)), m_observer(0), m_unrealised(1)
-  {
-  }
-  typedef qtextures_t::iterator iterator;
-
-  iterator begin()
-  {
-    return m_qtextures.begin();
-  }
-  iterator end()
-  {
-    return m_qtextures.end();
-  }
-
-  LoadImageCallback defaultLoader() const
-  {
-    return LoadImageCallback(0, QERApp_LoadImage);
-  }
-  Image* loadImage(const char* name)
-  {
-    return defaultLoader().loadImage(name);
-  }
-  qtexture_t* capture(const char* name)
-  {
-    return capture(defaultLoader(), name);
-  }
-  qtexture_t* capture(const LoadImageCallback& loader, const char* name)
-  {
+TexturesMap() : m_qtextures( TextureConstructor( this ) ), m_observer( 0 ), m_unrealised( 1 ){
+}
+typedef qtextures_t::iterator iterator;
+
+iterator begin(){
+       return m_qtextures.begin();
+}
+iterator end(){
+       return m_qtextures.end();
+}
+
+LoadImageCallback defaultLoader() const {
+       return LoadImageCallback( 0, QERApp_LoadImage );
+}
+Image* loadImage( const char* name ){
+       return defaultLoader().loadImage( name );
+}
+qtexture_t* capture( const char* name ){
+       return capture( defaultLoader(), name );
+}
+qtexture_t* capture( const LoadImageCallback& loader, const char* name ){
 #if DEBUG_TEXTURES
-    globalOutputStream() << "textures capture: " << makeQuoted(name) << '\n';
+       globalOutputStream() << "textures capture: " << makeQuoted( name ) << '\n';
 #endif
-    return m_qtextures.capture(TextureKey(loader, name)).get();
-  }
-  void release(qtexture_t* texture)
-  {
+       return m_qtextures.capture( TextureKey( loader, name ) ).get();
+}
+void release( qtexture_t* texture ){
 #if DEBUG_TEXTURES
-    globalOutputStream() << "textures release: " << makeQuoted(texture->name) << '\n';
+       globalOutputStream() << "textures release: " << makeQuoted( texture->name ) << '\n';
 #endif
-    m_qtextures.release(TextureKey(texture->load, texture->name));
-  }
-  void attach(TexturesCacheObserver& observer)
-  {
-    ASSERT_MESSAGE(m_observer == 0, "TexturesMap::attach: cannot attach observer");
-    m_observer = &observer;
-  }
-  void detach(TexturesCacheObserver& observer)
-  {
-    ASSERT_MESSAGE(m_observer == &observer, "TexturesMap::detach: cannot detach observer");
-    m_observer = 0;
-  }
-  void realise()
-  {
-    if(--m_unrealised == 0)
-    {
-      g_texture_globals.bTextureCompressionSupported = false;
-
-      if(GlobalOpenGL().ARB_texture_compression())
-      {
-        g_texture_globals.bTextureCompressionSupported = true;
-        g_texture_globals.m_bOpenGLCompressionSupported = true;
-      }
-
-      if(GlobalOpenGL().EXT_texture_compression_s3tc())
-      {
-        g_texture_globals.bTextureCompressionSupported = true;
-        g_texture_globals.m_bS3CompressionSupported = true;
-      }
-
-         switch(g_texture_globals.texture_components)
-         {
-                 case GL_RGBA:
-                         break;
-                 case GL_COMPRESSED_RGBA_ARB:
-                         if (!g_texture_globals.m_bOpenGLCompressionSupported)
-                         {
-                                 globalOutputStream() << "OpenGL extension GL_ARB_texture_compression not supported by current graphics drivers\n";
-                                 g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
-                                 g_texture_globals.texture_components = GL_RGBA;
-                         }
-                         break;
-                 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-                 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
-                 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-                         if(!g_texture_globals.m_bS3CompressionSupported)
-                         {
-                                 globalOutputStream() << "OpenGL extension GL_EXT_texture_compression_s3tc not supported by current graphics drivers\n";
-                                 if(g_texture_globals.m_bOpenGLCompressionSupported)
-                                 {
-                                         g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_RGBA;
-                                         g_texture_globals.texture_components = GL_COMPRESSED_RGBA_ARB;
-                                 }
-                                 else
-                                 {
-                                         g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
-                                         g_texture_globals.texture_components = GL_RGBA;
-                                 }
-                         }
-                         break;
-                 default:
-                         globalOutputStream() << "Unknown texture compression selected, reverting\n";
-                         g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
-                         g_texture_globals.texture_components = GL_RGBA;
-                         break;
-         }
-
-
-      glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size);
-      if(max_tex_size == 0)
-      {
-        max_tex_size = 1024;
-      }
-
-      for(qtextures_t::iterator i = m_qtextures.begin(); i != m_qtextures.end(); ++i)
-      {
-        if(!(*i).value.empty())
-        {
-          qtexture_realise(*(*i).value, (*i).key);
-        }
-      }
-      if(m_observer != 0)
-      {
-        m_observer->realise();
-      }
-    }
-  }
-  void unrealise()
-  {
-    if(++m_unrealised == 1)
-    {
-      if(m_observer != 0)
-      {
-        m_observer->unrealise();
-      }
-      for(qtextures_t::iterator i = m_qtextures.begin(); i != m_qtextures.end(); ++i)
-      {
-        if(!(*i).value.empty())
-        {
-          qtexture_unrealise(*(*i).value);
-        }
-      }
-    }
-  }
-  bool realised()
-  {
-    return m_unrealised == 0;
-  }
+       m_qtextures.release( TextureKey( texture->load, texture->name ) );
+}
+void attach( TexturesCacheObserver& observer ){
+       ASSERT_MESSAGE( m_observer == 0, "TexturesMap::attach: cannot attach observer" );
+       m_observer = &observer;
+}
+void detach( TexturesCacheObserver& observer ){
+       ASSERT_MESSAGE( m_observer == &observer, "TexturesMap::detach: cannot detach observer" );
+       m_observer = 0;
+}
+void realise(){
+       if ( --m_unrealised == 0 ) {
+               g_texture_globals.bTextureCompressionSupported = false;
+
+               if ( GlobalOpenGL().ARB_texture_compression() ) {
+                       g_texture_globals.bTextureCompressionSupported = true;
+                       g_texture_globals.m_bOpenGLCompressionSupported = true;
+               }
+
+               if ( GlobalOpenGL().EXT_texture_compression_s3tc() ) {
+                       g_texture_globals.bTextureCompressionSupported = true;
+                       g_texture_globals.m_bS3CompressionSupported = true;
+               }
+
+               switch ( g_texture_globals.texture_components )
+               {
+               case GL_RGBA:
+                       break;
+               case GL_COMPRESSED_RGBA_ARB:
+                       if ( !g_texture_globals.m_bOpenGLCompressionSupported ) {
+                               globalOutputStream() << "OpenGL extension GL_ARB_texture_compression not supported by current graphics drivers\n";
+                               g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
+                               g_texture_globals.texture_components = GL_RGBA;
+                       }
+                       break;
+               case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+               case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+               case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+                       if ( !g_texture_globals.m_bS3CompressionSupported ) {
+                               globalOutputStream() << "OpenGL extension GL_EXT_texture_compression_s3tc not supported by current graphics drivers\n";
+                               if ( g_texture_globals.m_bOpenGLCompressionSupported ) {
+                                       g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_RGBA;
+                                       g_texture_globals.texture_components = GL_COMPRESSED_RGBA_ARB;
+                               }
+                               else
+                               {
+                                       g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
+                                       g_texture_globals.texture_components = GL_RGBA;
+                               }
+                       }
+                       break;
+               default:
+                       globalOutputStream() << "Unknown texture compression selected, reverting\n";
+                       g_texture_globals.m_nTextureCompressionFormat = TEXTURECOMPRESSION_NONE;
+                       g_texture_globals.texture_components = GL_RGBA;
+                       break;
+               }
+
+
+               glGetIntegerv( GL_MAX_TEXTURE_SIZE, &max_tex_size );
+               if ( max_tex_size == 0 ) {
+                       max_tex_size = 1024;
+               }
+
+               for ( qtextures_t::iterator i = m_qtextures.begin(); i != m_qtextures.end(); ++i )
+               {
+                       if ( !( *i ).value.empty() ) {
+                               qtexture_realise( *( *i ).value, ( *i ).key );
+                       }
+               }
+               if ( m_observer != 0 ) {
+                       m_observer->realise();
+               }
+       }
+}
+void unrealise(){
+       if ( ++m_unrealised == 1 ) {
+               if ( m_observer != 0 ) {
+                       m_observer->unrealise();
+               }
+               for ( qtextures_t::iterator i = m_qtextures.begin(); i != m_qtextures.end(); ++i )
+               {
+                       if ( !( *i ).value.empty() ) {
+                               qtexture_unrealise( *( *i ).value );
+                       }
+               }
+       }
+}
+bool realised(){
+       return m_unrealised == 0;
+}
 };
 
 TexturesMap* g_texturesmap;
 
-TexturesCache& GetTexturesCache()
-{
-  return *g_texturesmap;
+TexturesCache& GetTexturesCache(){
+       return *g_texturesmap;
 }
 
 
-void Textures_Realise()
-{
-  g_texturesmap->realise();
+void Textures_Realise(){
+       g_texturesmap->realise();
 }
 
-void Textures_Unrealise()
-{
-  g_texturesmap->unrealise();
+void Textures_Unrealise(){
+       g_texturesmap->unrealise();
 }
 
 
 Callback g_texturesModeChangedNotify;
 
-void Textures_setModeChangedNotify(const Callback& notify)
-{
-  g_texturesModeChangedNotify = notify;
+void Textures_setModeChangedNotify( const Callback& notify ){
+       g_texturesModeChangedNotify = notify;
 }
 
-void Textures_ModeChanged()
-{
-  if(g_texturesmap->realised())
-  {
-    SetTexParameters(g_texture_mode);
+void Textures_ModeChanged(){
+       if ( g_texturesmap->realised() ) {
+               SetTexParameters( g_texture_mode );
 
-    for(TexturesMap::iterator i = g_texturesmap->begin(); i != g_texturesmap->end(); ++i)
-    {
-      glBindTexture (GL_TEXTURE_2D, (*i).value->texture_number);
-      SetTexParameters(g_texture_mode);
-    }
+               for ( TexturesMap::iterator i = g_texturesmap->begin(); i != g_texturesmap->end(); ++i )
+               {
+                       glBindTexture( GL_TEXTURE_2D, ( *i ).value->texture_number );
+                       SetTexParameters( g_texture_mode );
+               }
 
-    glBindTexture( GL_TEXTURE_2D, 0 );
-  }
-  g_texturesModeChangedNotify();
+               glBindTexture( GL_TEXTURE_2D, 0 );
+       }
+       g_texturesModeChangedNotify();
 }
 
-void Textures_SetMode(ETexturesMode mode)
-{
-  if(g_texture_mode != mode)
-  {
-    g_texture_mode = mode;
+void Textures_SetMode( ETexturesMode mode ){
+       if ( g_texture_mode != mode ) {
+               g_texture_mode = mode;
 
-    Textures_ModeChanged();
-  }
+               Textures_ModeChanged();
+       }
 }
 
-void Textures_setTextureComponents(GLint texture_components)
-{
-  if(g_texture_globals.texture_components != texture_components)
-  {
-    Textures_Unrealise();
-    g_texture_globals.texture_components = texture_components;
-    Textures_Realise();
-  }
+void Textures_setTextureComponents( GLint texture_components ){
+       if ( g_texture_globals.texture_components != texture_components ) {
+               Textures_Unrealise();
+               g_texture_globals.texture_components = texture_components;
+               Textures_Realise();
+       }
 }
 
-void Textures_UpdateTextureCompressionFormat()
-{
-  GLint texture_components = GL_RGBA;
+void Textures_UpdateTextureCompressionFormat(){
+       GLint texture_components = GL_RGBA;
 
-       switch (g_texture_globals.m_nTextureCompressionFormat)
+       switch ( g_texture_globals.m_nTextureCompressionFormat )
        {
-       case (TEXTURECOMPRESSION_NONE):
-               {
-                       texture_components = GL_RGBA;
-                       break;
-               }
-       case (TEXTURECOMPRESSION_RGBA):
-               {
-                       texture_components = GL_COMPRESSED_RGBA_ARB;
-                       break;
-               }
-       case (TEXTURECOMPRESSION_RGBA_S3TC_DXT1):
-               {
-                       texture_components = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
-                       break;
-               }
-       case (TEXTURECOMPRESSION_RGBA_S3TC_DXT3):
-               {
-                       texture_components = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
-                       break;
-               }
-       case (TEXTURECOMPRESSION_RGBA_S3TC_DXT5):
-               {
-                       texture_components = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
-                       break;
-               }
+       case ( TEXTURECOMPRESSION_NONE ):
+       {
+               texture_components = GL_RGBA;
+               break;
+       }
+       case ( TEXTURECOMPRESSION_RGBA ):
+       {
+               texture_components = GL_COMPRESSED_RGBA_ARB;
+               break;
+       }
+       case ( TEXTURECOMPRESSION_RGBA_S3TC_DXT1 ):
+       {
+               texture_components = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+               break;
+       }
+       case ( TEXTURECOMPRESSION_RGBA_S3TC_DXT3 ):
+       {
+               texture_components = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
+               break;
+       }
+       case ( TEXTURECOMPRESSION_RGBA_S3TC_DXT5 ):
+       {
+               texture_components = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
+               break;
+       }
        }
 
-  Textures_setTextureComponents(texture_components);
+       Textures_setTextureComponents( texture_components );
 }
 
-void TextureCompressionImport(TextureCompressionFormat& self, int value)
-{
-  if(!g_texture_globals.m_bOpenGLCompressionSupported
-    && g_texture_globals.m_bS3CompressionSupported
-    && value >= 1)
-  {
-    ++value;
-  }
-  switch(value)
-  {
-  case 0:
-    self = TEXTURECOMPRESSION_NONE;
-    break;
-  case 1:
-    self = TEXTURECOMPRESSION_RGBA;
-    break;
-  case 2:
-    self = TEXTURECOMPRESSION_RGBA_S3TC_DXT1;
-    break;
-  case 3:
-    self = TEXTURECOMPRESSION_RGBA_S3TC_DXT3;
-    break;
-  case 4:
-    self = TEXTURECOMPRESSION_RGBA_S3TC_DXT5;
-    break;
-  }
-  Textures_UpdateTextureCompressionFormat();
+void TextureCompressionImport( TextureCompressionFormat& self, int value ){
+       if ( !g_texture_globals.m_bOpenGLCompressionSupported
+                && g_texture_globals.m_bS3CompressionSupported
+                && value >= 1 ) {
+               ++value;
+       }
+       switch ( value )
+       {
+       case 0:
+               self = TEXTURECOMPRESSION_NONE;
+               break;
+       case 1:
+               self = TEXTURECOMPRESSION_RGBA;
+               break;
+       case 2:
+               self = TEXTURECOMPRESSION_RGBA_S3TC_DXT1;
+               break;
+       case 3:
+               self = TEXTURECOMPRESSION_RGBA_S3TC_DXT3;
+               break;
+       case 4:
+               self = TEXTURECOMPRESSION_RGBA_S3TC_DXT5;
+               break;
+       }
+       Textures_UpdateTextureCompressionFormat();
 }
 typedef ReferenceCaller1<TextureCompressionFormat, int, TextureCompressionImport> TextureCompressionImportCaller;
 
-void TextureGammaImport(float& self, float value)
-{
-  if(self != value)
-  {
-    Textures_Unrealise();
-    self = value;
-    Textures_Realise();
-  }
+void TextureGammaImport( float& self, float value ){
+       if ( self != value ) {
+               Textures_Unrealise();
+               self = value;
+               Textures_Realise();
+       }
 }
 typedef ReferenceCaller1<float, float, TextureGammaImport> TextureGammaImportCaller;
 
-void TextureModeImport(ETexturesMode& self, int value)
-{
-  switch(value)
-  {
-  case 0:
-    Textures_SetMode(eTextures_NEAREST);
-    break;
-  case 1:
-    Textures_SetMode(eTextures_NEAREST_MIPMAP_NEAREST);
-    break;
-  case 2:
-    Textures_SetMode(eTextures_LINEAR);
-    break;
-  case 3:
-    Textures_SetMode(eTextures_NEAREST_MIPMAP_LINEAR);
-    break;
-  case 4:
-    Textures_SetMode(eTextures_LINEAR_MIPMAP_NEAREST);
-    break;
-  case 5:
-    Textures_SetMode(eTextures_LINEAR_MIPMAP_LINEAR);
-    break;
-  case 6:
-    Textures_SetMode(eTextures_MAX_ANISOTROPY);
-  }
+void TextureModeImport( ETexturesMode& self, int value ){
+       switch ( value )
+       {
+       case 0:
+               Textures_SetMode( eTextures_NEAREST );
+               break;
+       case 1:
+               Textures_SetMode( eTextures_NEAREST_MIPMAP_NEAREST );
+               break;
+       case 2:
+               Textures_SetMode( eTextures_LINEAR );
+               break;
+       case 3:
+               Textures_SetMode( eTextures_NEAREST_MIPMAP_LINEAR );
+               break;
+       case 4:
+               Textures_SetMode( eTextures_LINEAR_MIPMAP_NEAREST );
+               break;
+       case 5:
+               Textures_SetMode( eTextures_LINEAR_MIPMAP_LINEAR );
+               break;
+       case 6:
+               Textures_SetMode( eTextures_MAX_ANISOTROPY );
+       }
 }
 typedef ReferenceCaller1<ETexturesMode, int, TextureModeImport> TextureModeImportCaller;
 
-void TextureModeExport(ETexturesMode& self, const IntImportCallback& importer)
-{
-  switch(self)
-  {
-  case eTextures_NEAREST:
-    importer(0);
-    break;
-  case eTextures_NEAREST_MIPMAP_NEAREST:
-    importer(1);
-    break;
-  case eTextures_LINEAR:
-    importer(2);
-    break;
-  case eTextures_NEAREST_MIPMAP_LINEAR:
-    importer(3);
-    break;
-  case eTextures_LINEAR_MIPMAP_NEAREST:
-    importer(4);
-    break;
-  case eTextures_LINEAR_MIPMAP_LINEAR:
-    importer(5);
-    break;
-  case eTextures_MAX_ANISOTROPY:
-    importer(6);
-    break;
-  default:
-    importer(4);
-  }
+void TextureModeExport( ETexturesMode& self, const IntImportCallback& importer ){
+       switch ( self )
+       {
+       case eTextures_NEAREST:
+               importer( 0 );
+               break;
+       case eTextures_NEAREST_MIPMAP_NEAREST:
+               importer( 1 );
+               break;
+       case eTextures_LINEAR:
+               importer( 2 );
+               break;
+       case eTextures_NEAREST_MIPMAP_LINEAR:
+               importer( 3 );
+               break;
+       case eTextures_LINEAR_MIPMAP_NEAREST:
+               importer( 4 );
+               break;
+       case eTextures_LINEAR_MIPMAP_LINEAR:
+               importer( 5 );
+               break;
+       case eTextures_MAX_ANISOTROPY:
+               importer( 6 );
+               break;
+       default:
+               importer( 4 );
+       }
 }
 typedef ReferenceCaller1<ETexturesMode, const IntImportCallback&, TextureModeExport> TextureModeExportCaller;
 
-void Textures_constructPreferences(PreferencesPage& page)
-{
-  {
-    const char* percentages[] = { "12.5%", "25%", "50%", "100%", };
-    page.appendRadio(
-      "Texture Quality",
-      STRING_ARRAY_RANGE(percentages),
-      LatchedIntImportCaller(g_Textures_textureQuality),
-      IntExportCaller(g_Textures_textureQuality.m_latched)
-    );
-  }
-  page.appendSpinner(
-    "Texture Gamma",
-    1.0,
-    0.0,
-    1.0,
-    FloatImportCallback(TextureGammaImportCaller(g_texture_globals.fGamma)),
-    FloatExportCallback(FloatExportCaller(g_texture_globals.fGamma))
-  );
-  {
-    const char* texture_mode[] = { "Nearest", "Nearest Mipmap", "Linear", "Bilinear", "Bilinear Mipmap", "Trilinear", "Anisotropy" };
-    page.appendCombo(
-      "Texture Render Mode",
-      STRING_ARRAY_RANGE(texture_mode),
-      IntImportCallback(TextureModeImportCaller(g_texture_mode)),
-      IntExportCallback(TextureModeExportCaller(g_texture_mode))
-    );
-  }
-  {
-    const char* compression_none[] = { "None" };
-    const char* compression_opengl[] = { "None", "OpenGL ARB" };
-    const char* compression_s3tc[] = { "None", "S3TC DXT1", "S3TC DXT3", "S3TC DXT5" };
-    const char* compression_opengl_s3tc[] = { "None", "OpenGL ARB", "S3TC DXT1", "S3TC DXT3", "S3TC DXT5" };
-    StringArrayRange compression(
-      (g_texture_globals.m_bOpenGLCompressionSupported)
-        ? (g_texture_globals.m_bS3CompressionSupported)
-          ? STRING_ARRAY_RANGE(compression_opengl_s3tc)
-          : STRING_ARRAY_RANGE(compression_opengl)
-        : (g_texture_globals.m_bS3CompressionSupported)
-          ? STRING_ARRAY_RANGE(compression_s3tc)
-          : STRING_ARRAY_RANGE(compression_none)
-    );
-    page.appendCombo(
-      "Hardware Texture Compression",
-      compression,
-      TextureCompressionImportCaller(g_texture_globals.m_nTextureCompressionFormat),
-      IntExportCaller(reinterpret_cast<int&>(g_texture_globals.m_nTextureCompressionFormat))
-    );
-  }
-}
-void Textures_constructPage(PreferenceGroup& group)
-{
-  PreferencesPage page(group.createPage("Textures", "Texture Settings"));
-  Textures_constructPreferences(page);
+void Textures_constructPreferences( PreferencesPage& page ){
+       {
+               const char* percentages[] = { "12.5%", "25%", "50%", "100%", };
+               page.appendRadio(
+                       "Texture Quality",
+                       STRING_ARRAY_RANGE( percentages ),
+                       LatchedIntImportCaller( g_Textures_textureQuality ),
+                       IntExportCaller( g_Textures_textureQuality.m_latched )
+                       );
+       }
+       page.appendSpinner(
+               "Texture Gamma",
+               1.0,
+               0.0,
+               1.0,
+               FloatImportCallback( TextureGammaImportCaller( g_texture_globals.fGamma ) ),
+               FloatExportCallback( FloatExportCaller( g_texture_globals.fGamma ) )
+               );
+       {
+               const char* texture_mode[] = { "Nearest", "Nearest Mipmap", "Linear", "Bilinear", "Bilinear Mipmap", "Trilinear", "Anisotropy" };
+               page.appendCombo(
+                       "Texture Render Mode",
+                       STRING_ARRAY_RANGE( texture_mode ),
+                       IntImportCallback( TextureModeImportCaller( g_texture_mode ) ),
+                       IntExportCallback( TextureModeExportCaller( g_texture_mode ) )
+                       );
+       }
+       {
+               const char* compression_none[] = { "None" };
+               const char* compression_opengl[] = { "None", "OpenGL ARB" };
+               const char* compression_s3tc[] = { "None", "S3TC DXT1", "S3TC DXT3", "S3TC DXT5" };
+               const char* compression_opengl_s3tc[] = { "None", "OpenGL ARB", "S3TC DXT1", "S3TC DXT3", "S3TC DXT5" };
+               StringArrayRange compression(
+                       ( g_texture_globals.m_bOpenGLCompressionSupported )
+                       ? ( g_texture_globals.m_bS3CompressionSupported )
+                       ? STRING_ARRAY_RANGE( compression_opengl_s3tc )
+                       : STRING_ARRAY_RANGE( compression_opengl )
+                       : ( g_texture_globals.m_bS3CompressionSupported )
+                       ? STRING_ARRAY_RANGE( compression_s3tc )
+                       : STRING_ARRAY_RANGE( compression_none )
+                       );
+               page.appendCombo(
+                       "Hardware Texture Compression",
+                       compression,
+                       TextureCompressionImportCaller( g_texture_globals.m_nTextureCompressionFormat ),
+                       IntExportCaller( reinterpret_cast<int&>( g_texture_globals.m_nTextureCompressionFormat ) )
+                       );
+       }
 }
-void Textures_registerPreferencesPage()
-{
-  PreferencesDialog_addDisplayPage(FreeCaller1<PreferenceGroup&, Textures_constructPage>());
+void Textures_constructPage( PreferenceGroup& group ){
+       PreferencesPage page( group.createPage( "Textures", "Texture Settings" ) );
+       Textures_constructPreferences( page );
+}
+void Textures_registerPreferencesPage(){
+       PreferencesDialog_addDisplayPage( FreeCaller1<PreferenceGroup&, Textures_constructPage>() );
 }
 
-void TextureCompression_importString(const char* string)
-{
-  g_texture_globals.m_nTextureCompressionFormat = static_cast<TextureCompressionFormat>(atoi(string));
-  Textures_UpdateTextureCompressionFormat();
+void TextureCompression_importString( const char* string ){
+       g_texture_globals.m_nTextureCompressionFormat = static_cast<TextureCompressionFormat>( atoi( string ) );
+       Textures_UpdateTextureCompressionFormat();
 }
 typedef FreeCaller1<const char*, TextureCompression_importString> TextureCompressionImportStringCaller;
 
 
-void Textures_Construct()
-{
-  g_texturesmap = new TexturesMap;
+void Textures_Construct(){
+       g_texturesmap = new TexturesMap;
 
-  GlobalPreferenceSystem().registerPreference("TextureCompressionFormat", TextureCompressionImportStringCaller(), IntExportStringCaller(reinterpret_cast<int&>(g_texture_globals.m_nTextureCompressionFormat)));
-  GlobalPreferenceSystem().registerPreference("TextureFiltering", IntImportStringCaller(reinterpret_cast<int&>(g_texture_mode)), IntExportStringCaller(reinterpret_cast<int&>(g_texture_mode)));
-  GlobalPreferenceSystem().registerPreference("TextureQuality", IntImportStringCaller(g_Textures_textureQuality.m_latched), IntExportStringCaller(g_Textures_textureQuality.m_latched));
-  GlobalPreferenceSystem().registerPreference("SI_Gamma", FloatImportStringCaller(g_texture_globals.fGamma), FloatExportStringCaller(g_texture_globals.fGamma));
+       GlobalPreferenceSystem().registerPreference( "TextureCompressionFormat", TextureCompressionImportStringCaller(), IntExportStringCaller( reinterpret_cast<int&>( g_texture_globals.m_nTextureCompressionFormat ) ) );
+       GlobalPreferenceSystem().registerPreference( "TextureFiltering", IntImportStringCaller( reinterpret_cast<int&>( g_texture_mode ) ), IntExportStringCaller( reinterpret_cast<int&>( g_texture_mode ) ) );
+       GlobalPreferenceSystem().registerPreference( "TextureQuality", IntImportStringCaller( g_Textures_textureQuality.m_latched ), IntExportStringCaller( g_Textures_textureQuality.m_latched ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Gamma", FloatImportStringCaller( g_texture_globals.fGamma ), FloatExportStringCaller( g_texture_globals.fGamma ) );
 
-  g_Textures_textureQuality.useLatched();
+       g_Textures_textureQuality.useLatched();
 
-  Textures_registerPreferencesPage();
+       Textures_registerPreferencesPage();
 
-  Textures_ModeChanged();
+       Textures_ModeChanged();
 }
-void Textures_Destroy()
-{
-  delete g_texturesmap;
+void Textures_Destroy(){
+       delete g_texturesmap;
 }
 
 
@@ -860,53 +802,44 @@ void Textures_Destroy()
 #include "modulesystem/moduleregistry.h"
 
 class TexturesDependencies :
-  public GlobalRadiantModuleRef,
-  public GlobalOpenGLModuleRef,
-  public GlobalPreferenceSystemModuleRef
+       public GlobalRadiantModuleRef,
+       public GlobalOpenGLModuleRef,
+       public GlobalPreferenceSystemModuleRef
 {
-  ImageModulesRef m_image_modules;
+ImageModulesRef m_image_modules;
 public:
-  TexturesDependencies() :
-    m_image_modules(GlobalRadiant().getRequiredGameDescriptionKeyValue("texturetypes"))
-  {
-  }
-  ImageModules& getImageModules()
-  {
-    return m_image_modules.get();
-  }
+TexturesDependencies() :
+       m_image_modules( GlobalRadiant().getRequiredGameDescriptionKeyValue( "texturetypes" ) ){
+}
+ImageModules& getImageModules(){
+       return m_image_modules.get();
+}
 };
 
 class TexturesAPI
 {
-  TexturesCache* m_textures;
+TexturesCache* m_textures;
 public:
-  typedef TexturesCache Type;
-  STRING_CONSTANT(Name, "*");
-
-  TexturesAPI()
-  {
-    Textures_Construct();
-
-    m_textures = &GetTexturesCache();
-  }
-  ~TexturesAPI()
-  {
-    Textures_Destroy();
-  }
-  TexturesCache* getTable()
-  {
-    return m_textures;
-  }
+typedef TexturesCache Type;
+STRING_CONSTANT( Name, "*" );
+
+TexturesAPI(){
+       Textures_Construct();
+
+       m_textures = &GetTexturesCache();
+}
+~TexturesAPI(){
+       Textures_Destroy();
+}
+TexturesCache* getTable(){
+       return m_textures;
+}
 };
 
 typedef SingletonModule<TexturesAPI, TexturesDependencies> TexturesModule;
 typedef Static<TexturesModule> StaticTexturesModule;
-StaticRegisterModule staticRegisterTextures(StaticTexturesModule::instance());
+StaticRegisterModule staticRegisterTextures( StaticTexturesModule::instance() );
 
-ImageModules& Textures_getImageModules()
-{
-  return StaticTexturesModule::instance().getDependencies().getImageModules();
+ImageModules& Textures_getImageModules(){
+       return StaticTexturesModule::instance().getDependencies().getImageModules();
 }
-
-
-