topical media & game development
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.