00001
00002
00004
00005 #include <pi2d14/pi2d14_texture2d.h>
00006
00008
00010
00011 GRAPHICSTOOLS::Texture_2D::Texture_2D()
00012 {
00013 id=0;
00014
00015
00016 }
00017
00018 GRAPHICSTOOLS::Texture_2D::~Texture_2D()
00019 {
00020
00021 glDeleteTextures(1,&id);
00022 }
00023
00024
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
00038
00039 f=fopen(filePath,"r");
00040 if(f!=0)
00041 {
00042 retFileExist=true;
00043
00045
00046
00047 ImageBMP *img = new ImageBMP();
00048 if(img->load(filePath))
00049 {
00050 if(levelOfDetail<0)
00051 {
00052 levelOfDetail=0;
00053 }
00054 int detailSizeFactor=(int)pow(2,levelOfDetail);
00055 int size=(img->getWidth()*img->getHeight()*4)/detailSizeFactor;
00056 if(size<4)
00057 {
00058 size=4;
00059 }
00060 temp=new unsigned char[ size ];
00061 unsigned char * pc=img->getDatasPointer();
00062 unsigned char r,v,b;
00063 bool NeedBlend;
00064 int tailleDestX=img->getWidth()/detailSizeFactor;
00065 int tailleDestY=img->getHeight()/detailSizeFactor;
00066 if(tailleDestX<1)
00067 {
00068 tailleDestX=1;
00069 }
00070 if(tailleDestY<1)
00071 {
00072 tailleDestY=1;
00073 }
00074 int nbSourceTexel=img->getWidth()*img->getHeight();
00075 int nbDestTexl=size/4;
00076
00077
00078
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));
00085 int RY=(int)((float)img->getHeight()*((float)j/(float)tailleDestY));
00086
00087
00088 r=pc[RX*3+RY*3*img->getWidth()];
00089 temp[i*4+j*4*tailleDestX]=r;
00090
00091
00092 v=pc[RX*3+RY*3*img->getWidth()+1];
00093 temp[i*4+j*4*tailleDestX+1]=v;
00094
00095
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 {
00101 temp[i*4+j*4*tailleDestX+3]=alphaBlendValue;
00102 NeedBlend=true;
00103 }
00104 else
00105 {
00106 temp[i*4+j*4*tailleDestX+3]=alphaDefault;
00107 }
00108 }
00109 }
00110
00111
00112 glBindTexture(GL_TEXTURE_2D,id);
00113
00114
00115 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,sWrap);
00116 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,tWrap);
00117
00118
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 {
00124 if( NeedBlend && generateAlpha)
00125 {
00126 gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA,tailleDestX,tailleDestY,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00127 }
00128 else
00129 {
00130 gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,tailleDestX,tailleDestY,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00131 }
00132 }
00133 else
00134 {
00135 if( NeedBlend && generateAlpha)
00136 {
00137 glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,tailleDestX,tailleDestY,0,GL_RGBA,GL_UNSIGNED_BYTE,temp);
00138 }
00139 else
00140 {
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 }