Main Page | Alphabetical List | Class List | File List | Class Members

gltex.h

00001 #ifndef __GLTEX__
00002 #define __GLTEX__
00003 
00004 #ifdef WIN32
00005 #include <windows.h>
00006 #endif
00007 
00008 #include <GL/gl.h>
00009 #include <GL/glu.h>
00010 #include "CTexture.h"
00011 
00012 namespace gltex
00013 {
00014 
00018         inline GLuint gltexIdFromTexture(const CTexture *tex)
00019         {
00020                 unsigned int id;
00021 
00022                 glGenTextures(1,&id);
00023                 glBindTexture(GL_TEXTURE_2D,id);
00024                 if (tex->isAlpha())
00025                         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tex->getWidth(), tex->getHeight(), 
00026                         GL_RGBA, GL_UNSIGNED_BYTE, tex->getData());
00027                 else
00028                         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tex->getWidth(), tex->getHeight(), 
00029                         GL_RGB, GL_UNSIGNED_BYTE, tex->getData());
00030                 return (id);
00031         }
00032 
00036         inline GLuint gltexLoadTexture(const char *n)
00037         {
00038                 unsigned int  id;
00039                 CTexture     *tex=CTexture::loadTexture(n);
00040                 id=gltexIdFromTexture(tex);
00041                 delete (tex);
00042                 return (id);
00043         }
00044 
00048         inline void gltexUpdateTextureId(GLuint id,const CTexture *tex)
00049         {
00050                 glBindTexture(GL_TEXTURE_2D,id);
00051                 if (tex->isAlpha())
00052                         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tex->getWidth(), tex->getHeight(), 
00053                         GL_RGBA, GL_UNSIGNED_BYTE, tex->getData());
00054                 else
00055                         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tex->getWidth(), tex->getHeight(), 
00056                         GL_RGB, GL_UNSIGNED_BYTE, tex->getData());
00057         }
00058 
00063         inline CTexture *gltexTextureFromId(GLuint id,GLenum format=GL_RGB)
00064         {
00065                 int            w,h;
00066                 unsigned char *pixels;
00067                 CTexture      *tex;
00068 
00069                 glBindTexture(GL_TEXTURE_2D,id);
00070                 glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_WIDTH,&w);
00071                 glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_HEIGHT,&h);
00072                 pixels = new unsigned char [w*h*(format==GL_RGBA?4:3)];
00073                 glGetTexImage(GL_TEXTURE_2D,0,format,GL_UNSIGNED_BYTE,pixels);
00074                 tex=new CTexture("gltexTextureFromId",w,h,(format==GL_RGBA),pixels);
00075                 tex->setDataOwner(true);
00076                 return (tex);
00077         }
00078 
00082         inline CTexture *gltexTextureFromScreen(GLenum format=GL_RGB)
00083         {
00084                 GLint          v[4];
00085                 unsigned char *pixels;
00086                 CTexture      *tex;
00087 
00088                 glGetIntegerv(GL_VIEWPORT,v);
00089                 pixels = new unsigned char [v[2]*v[3]*(format==GL_RGBA?4:3)];
00090                 glReadPixels(v[0],v[1],v[2],v[3],format,GL_UNSIGNED_BYTE,pixels);
00091                 tex=new CTexture("gltexTextureFromScreen",v[2],v[3],(format==GL_RGBA),pixels);
00092                 tex->setDataOwner(true);
00093                 return (tex);    
00094         }
00095 
00099         inline CTexture *gltexTextureFromDepth()
00100         {
00101                 GLint          v[4];
00102                 int            i,j,w,h;
00103                 unsigned char *depth,*rgb;
00104                 CTexture      *tex;
00105 
00106                 glGetIntegerv(GL_VIEWPORT,v);
00107                 depth = new unsigned char [v[2]*v[3]];
00108                 rgb=new unsigned char[v[2]*v[3]*3];
00109                 glReadPixels(v[0],v[1],v[2],v[3],
00110                         GL_DEPTH_COMPONENT,GL_UNSIGNED_BYTE,depth);
00111                 w=v[2];
00112                 h=v[3];
00113                 for (i=0;i<w;i++)
00114                 {
00115                         for (j=0;j<h;j++)
00116                         {
00117                                 rgb[(i+(h-j-1)*w)*3  ]=depth[i+(h-j-1)*w];
00118                                 rgb[(i+(h-j-1)*w)*3+1]=depth[i+(h-j-1)*w];
00119                                 rgb[(i+(h-j-1)*w)*3+2]=depth[i+(h-j-1)*w];
00120                         }
00121                 }
00122                 tex=new CTexture("gltexTextureFromDepth",w,h,false,rgb);
00123                 delete (depth);
00124                 tex->setDataOwner(true);
00125                 return (tex);    
00126         }
00127 
00131         inline CTexture *gltexTextureFromStencil()
00132         {
00133                 GLint          v[4];
00134                 int            i,j,w,h;
00135                 unsigned char *stencil,*rgb;
00136                 CTexture      *tex;
00137 
00138                 glGetIntegerv(GL_VIEWPORT,v);
00139                 stencil = new unsigned char [v[2]*v[3]];
00140                 rgb=new unsigned char[v[2]*v[3]*3];
00141                 glReadPixels(v[0],v[1],v[2],v[3],
00142                         GL_STENCIL_INDEX,GL_UNSIGNED_BYTE,stencil);
00143                 w=v[2];
00144                 h=v[3];
00145                 for (i=0;i<w;i++)
00146                 {
00147                         for (j=0;j<h;j++)
00148                         {
00149                                 rgb[(i+(h-j-1)*w)*3  ]=stencil[i+(h-j-1)*w];
00150                                 rgb[(i+(h-j-1)*w)*3+1]=stencil[i+(h-j-1)*w];
00151                                 rgb[(i+(h-j-1)*w)*3+2]=stencil[i+(h-j-1)*w];
00152                         }
00153                 }
00154                 tex=new CTexture("gltexTextureFromStencil",w,h,false,rgb);
00155                 delete (stencil);
00156                 tex->setDataOwner(true);
00157                 return (tex);    
00158         }
00159 
00160 
00164         inline GLuint gltexConvertToNormal(GLuint id,double scale,double norme=1.0)
00165         {
00166                 CTexture *tex=gltexTextureFromId(id,GL_RGB);
00167                 tex->convertToNormal(scale,norme);
00168                 GLuint glid=gltex::gltexIdFromTexture(tex);
00169                 delete (tex);
00170                 return (glid);
00171         }
00172 };
00173 
00174 #endif

Generated on Tue Sep 21 17:28:12 2004 for libTexture by doxygen 1.3.5