topical media & game development

talk show tell print

lib-of-vs-addons-ofx3DModelLoader-src-3DS-texture3DS.cpp / cpp



  /*
      BMP texture loader
      � Keith O'Conor 2005
      keith.oconor @ {cs.tcd.ie, gmail.com}
  
      adapted for openFrameworks by Theodore Watson - theo@openframeworks.cc
  */
  
  include <texture3DS.h>
  
  texture3DS::texture3DS(string filename, const int textureId){
          
      ofImage img;
      if( !img.loadImage(filename) ){
                  ofLog(OF_LOG_ERROR, "texture3DS ERROR:  Could not open \%s", filename.c_str());
      }
  
      m_width     = img.width;
      m_height    = img.height;
      m_bpp       = img.bpp;
  
      if( m_width <= 0 || m_height <= 0){
                  ofLog(OF_LOG_ERROR, "texture3DS ERROR: Something wrong with \%s - dimensions less than 0", filename.c_str());
  
      }
  
      if(m_bpp != 32 && m_bpp != 24){                
                  ofLog(OF_LOG_ERROR, "texture3DS ERROR: Invalid texture color depth \%s  must be uncompressed 24/32bpp png, jpg, bmp, tga", filename.c_str());
          return;
      }
  
      // Determine format
      int fileFormat, internalFormat;
      switch(m_bpp){
          case 24:fileFormat = GL_RGB; internalFormat = GL_RGB; break;
          case 32:fileFormat = GL_RGBA; internalFormat = GL_RGBA; break;
          default:
                          ofLog(OF_LOG_ERROR, "texture3DS ERROR: Invalid texture color depth \%s  must be uncompressed 24/32bpp", filename.c_str());
  
                          return;
              break;
      }
  
      // FLIP THE PIXELS
      //we need to flip the image vertically
      unsigned char * ptrToPixels = img.getPixels();
      int bytesPP = (m_bpp / 8);
  
          //this extra allocation is because of a glu bug - http://osdir.com/ml/video.mesa3d.devel/2005-02/msg00035.html
      unsigned char * flippedPixels = new unsigned char[bytesPP * m_width * (m_height+1)];
      unsigned char * ptrToFlipped = flippedPixels;
  
      int numBytesPerLine = m_width * bytesPP;
  
      //go to the beginning of the bottom line of pixels of the image
      ptrToPixels += ( numBytesPerLine * (m_height-1) );
  
      //then step through line at a time copying the whole line from the original
      //to the flipped pixels
      //- the original starts at the bottom and goes up
      //- the flipped starts at the top and goes down
      for(int y = 0; y < m_height; y++){
          memcpy(ptrToFlipped, ptrToPixels, numBytesPerLine * sizeof( char ) );
          ptrToPixels   -= numBytesPerLine;
          ptrToFlipped  += numBytesPerLine;
      }
  
          // Bind texture ID to load
      glBindTexture(GL_TEXTURE_2D, textureId);
  
      // Set texture parameters
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  
      // Upload texture to card with bound texture ID
      gluBuild2DMipmaps(GL_TEXTURE_2D, internalFormat, m_width, m_height, fileFormat, GL_UNSIGNED_BYTE, flippedPixels);
  
      ofLog(OF_LOG_NOTICE, "texture3DS Texture \%s loaded", filename.c_str());
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.