Page principale | Liste des namespaces | Hiérarchie des classes | Liste par ordre alphabétique | Liste des composants | Liste des fichiers | Composants | Déclarations

pi2d14_texture2d.cpp

Aller à la documentation de ce fichier.
00001 // Texture_2D.cpp: implementation of the RULES_Textures class.
00002 //
00004 
00005 #include <pi2d14/pi2d14_texture2d.h>
00006 
00008 // Construction/Destruction
00010 
00011 GRAPHICSTOOLS::Texture_2D::Texture_2D()
00012 {
00013         id=0;
00014         //genere l'objet de texture OpenGL en m�moire vid�o
00015         //glGenTextures(1,&id);
00016 }
00017 
00018 GRAPHICSTOOLS::Texture_2D::~Texture_2D()
00019 {
00020         //supprime l'objet de texture OpenGL en m�moire vid�o
00021         glDeleteTextures(1,&id);
00022 }
00023 
00024 //_ retourne l'identifiant OpenGL de la texture.
00025 unsigned int GRAPHICSTOOLS::Texture_2D::getId()
00026 {
00027         return id;
00028 }
00029 
00030 bool GRAPHICSTOOLS::Texture_2D::loadBMP(char *filePath, bool useMipMap, int magFilter, int minFilter, int sWrap, int tWrap, unsigned int levelOfDetail, bool generateAlpha, unsigned char rBlended, unsigned char gBlended, unsigned char bBlended, unsigned char alphaBlendValue, unsigned char alphaDefault)
00031 {
00032         unsigned char *temp;
00033         glGenTextures(1,&id);
00034         bool retFileExist=false;
00035         FILE *f=0;
00036 
00037         // TODO deleter la texture ancienne si on recharge!!!
00038 
00039         f=fopen(filePath,"r");
00040         if(f!=0)
00041         {
00042                 retFileExist=true;
00043 
00045 
00046                 // TODO : charger ici les donnee dans la sructure img
00047                 ImageBMP *img = new ImageBMP();
00048                 if(img->load(filePath))         //on continue seulement si l'image a ete charge
00049                 {
00050                         if(levelOfDetail<0)
00051                         {//verification validite de detailDown(pour baisser niveau de detail de la texture
00052                                 levelOfDetail=0;
00053                         }
00054                         int detailSizeFactor=(int)pow(2,levelOfDetail);                                 //decalage a effectuer entre les pixels pour baisser les details
00055                         int size=(img->getWidth()*img->getHeight()*4)/detailSizeFactor; //taille du buffer image avec baisse de detail prise en compte
00056                         if(size<4)
00057                         {//verification validite de la taille minimum du buffer image ( 4 -> r,g,b,a )
00058                                 size=4;
00059                         }
00060                         temp=new unsigned char[ size ]; //creation buffer de texture avec les composantes alpha
00061                         unsigned char * pc=img->getDatasPointer();              //initialisation pointeur temporaire sur le buffer image
00062                         unsigned char r,v,b;
00063                         bool NeedBlend;                                                                 //permet de verifier si on doit utiliser la transparence
00064                         int tailleDestX=img->getWidth()/detailSizeFactor;
00065                         int tailleDestY=img->getHeight()/detailSizeFactor;
00066                         if(tailleDestX<1)
00067                         {//verification de la bornes x de la texture destination
00068                                 tailleDestX=1;
00069                         }
00070                         if(tailleDestY<1)
00071                         {//verification de la bornes y de la texture destination
00072                                 tailleDestY=1;
00073                         }
00074                         int nbSourceTexel=img->getWidth()*img->getHeight();             //nb de texels de la texture a charger
00075                         int nbDestTexl=size/4;                                                                  //nb de texels de la texture a envoyer
00076 
00077                         //la texture source contient 3 composant (rgb)
00078                         //la texture destination contient 4 composant (rgba)
00079 
00080                         for(int i=0;i<tailleDestX;i++)
00081                         {
00082                                 for(int j=0;j<tailleDestY;j++)
00083                                 {
00084                                         int RX=(int)((float)img->getWidth()*((float)i/(float)tailleDestX));//coordonnee x du pixel a choisir dans la texture source
00085                                         int RY=(int)((float)img->getHeight()*((float)j/(float)tailleDestY));//coordonnee y du pixel a choisir dans la texture source
00086 
00087                                         //extraction et affectation de la composante r
00088                                         r=pc[RX*3+RY*3*img->getWidth()];
00089                                         temp[i*4+j*4*tailleDestX]=r;
00090 
00091                                         //extraction et affectation de la composante g
00092                                         v=pc[RX*3+RY*3*img->getWidth()+1];
00093                                         temp[i*4+j*4*tailleDestX+1]=v;
00094 
00095                                         //extraction et affectation de la composante b
00096                                         b=pc[RX*3+RY*3*img->getWidth()+2];
00097                                         temp[i*4+j*4*tailleDestX+2]=b;
00098 
00099                                         if( r==rBlended && v==gBlended && b==bBlended )
00100                                         {//la couleur correspond a la couleur de blend d�sirer
00101                                                 temp[i*4+j*4*tailleDestX+3]=alphaBlendValue;                            //on assigne le alpha de transparence
00102                                                 NeedBlend=true;
00103                                         }
00104                                         else
00105                                         {
00106                                                 temp[i*4+j*4*tailleDestX+3]=alphaDefault;
00107                                         }
00108                                 }
00109                         }
00110 
00111                         //initialisation de l'objet de texture
00112                         glBindTexture(GL_TEXTURE_2D,id);
00113 
00114                         //option de r�petition
00115                         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,sWrap);
00116                         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,tWrap);
00117 
00118                         //filtrage a appliquer en cas d'�tirement et de ress�rage de la texture
00119                         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,magFilter);
00120                         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,minFilter);
00121 
00122                         if(useMipMap)
00123                         {//on doit utiliser les mipmap
00124                                 if( NeedBlend && generateAlpha)
00125                                 {//on doit generer une composante alpha dans la texture
00126                                         gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,tailleDestX,tailleDestY,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00127                                 }
00128                                 else
00129                                 {//on ne doit pas generer une composante alpha dans la texture
00130                                         gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,tailleDestX,tailleDestY,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00131                                 }
00132                         }
00133                         else
00134                         {//on ne doit pas utiliser les mipmap
00135                                 if( NeedBlend && generateAlpha)
00136                                 {//on doit generer une composante alpha dans la texture
00137                                         glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,tailleDestX,tailleDestY,0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00138                                 }
00139                                 else
00140                                 {//on ne doit pas generer une composante alpha dans la texture
00141                                         glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,tailleDestX,tailleDestY,0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00142                                 }
00143                         }
00144                 }
00145 
00146                 delete [] temp;
00147                 delete img;
00148         }
00149 
00150         fclose(f);
00151         return retFileExist;
00152 }

Généré le Fri Mar 26 13:02:03 2004 pour AlgoAtomD par doxygen 1.3.5