home *** CD-ROM | disk | FTP | other *** search
/ 3DS Max Model 2 / 3dsModelCD2.iso / ALTEROS / PLUGINS / GLC.X3D / CPP / LOAD_TEXTURE < prev    next >
Encoding:
Text File  |  2001-02-02  |  4.9 KB  |  192 lines

  1. struct DIB2D{
  2.  BITMAPINFOHEADER *Info;
  3.  RGBQUAD *palette;
  4.  BYTE    *bits;
  5. };
  6. struct GLTXTLOAD{
  7.  GLint format;
  8.  GLint perpixel;
  9.  GLint Width;
  10.  GLint Height;
  11.  BYTE* bits;
  12. };
  13.  
  14. /*
  15. BOOL LoadDIB(char*file,DIB2D*dib)
  16. Only trueColor and 256 color ucompressed bitmaps supported
  17. */
  18. BOOL LoadDIB(char*file,DIB2D*dib)
  19.  {
  20.   BOOL result=FALSE;
  21.   HANDLE hfile=CreateFile(file,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,0);
  22.   if(hfile!=INVALID_HANDLE_VALUE)
  23.     {
  24.      DWORD readed;
  25.      int size=GetFileSize(hfile,0);
  26.      if(size>sizeof(BITMAPFILEHEADER))
  27.       {
  28.        BITMAPFILEHEADER bmfh;
  29.        ReadFile(hfile,&bmfh,sizeof(BITMAPFILEHEADER),&readed,0);
  30.        if((readed==sizeof(BITMAPFILEHEADER)) && (bmfh.bfType==0x4d42))
  31.         {
  32.          dib->Info=(BITMAPINFOHEADER*)(new BYTE[size-sizeof(BITMAPFILEHEADER)]);
  33.          ReadFile(hfile,dib->Info,size-sizeof(BITMAPFILEHEADER),&readed,0);
  34.          dib->bits=(BYTE*)(dib->Info+1);
  35.  
  36.          if(dib->Info->biBitCount==8)
  37.           {
  38.            dib->palette=(RGBQUAD*)dib->bits;
  39.            if(dib->Info->biClrUsed)dib->bits+=dib->Info->biClrUsed*4;else dib->bits+=1024;
  40.           }else{
  41.            dib->palette=NULL;
  42.           }
  43.          result=TRUE;
  44.         }
  45.       }
  46.      CloseHandle(hfile);
  47.     }
  48.    return result;
  49.  };
  50.  
  51. long ScanBytes(int pixWidth, int bitsPixel) {
  52.   return (((long)pixWidth*bitsPixel+31) / 32) * 4;
  53. }
  54.  
  55. BOOL  ScaleImage(DIB2D&dib,GLTXTLOAD&p)
  56.  {
  57.    GLint glMaxTexDim;     // OpenGL maximum texture dimension
  58.    GLint XDMaxTexDim=512; // user maximum texture dimension
  59.    GLint minsize =2;
  60.    double xPow2, yPow2;
  61.    int ixPow2, iyPow2;
  62.    int xSize2, ySize2;
  63.    GLint m_iWidth=dib.Info->biWidth;
  64.    GLint m_iHeight=dib.Info->biHeight;
  65.    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);
  66.  
  67.    glMaxTexDim = min(XDMaxTexDim, glMaxTexDim);
  68.  
  69.    if (m_iWidth <= glMaxTexDim)
  70.       xPow2 = log((double)m_iWidth) / log(2.0);
  71.    else
  72.       xPow2 = log((double)glMaxTexDim) / log(2.0);
  73.  
  74.    if (m_iHeight <= glMaxTexDim)
  75.       yPow2 = log((double)m_iHeight) / log(2.0);
  76.    else
  77.       yPow2 = log((double)glMaxTexDim) / log(2.0);
  78.  
  79.    ixPow2 = (int)xPow2;
  80.    iyPow2 = (int)yPow2;
  81.  
  82.    if (xPow2 != (double)ixPow2)
  83.       ixPow2++;
  84.    if (yPow2 != (double)iyPow2)
  85.       iyPow2++;
  86.  
  87.    xSize2 = 1 << ixPow2;
  88.    ySize2 = 1 << iyPow2;
  89.  
  90.    if(xSize2<minsize)xSize2=minsize;
  91.    if(ySize2<minsize)ySize2=minsize;
  92.  
  93.    if(((xSize2==m_iWidth) && (ySize2==m_iHeight)))
  94.    {
  95.      if(dib.Info->biBitCount==24){
  96.        p.format=GL_BGR_EXT;
  97.        p.perpixel=3;
  98.        return FALSE;
  99.       }
  100.      if(dib.Info->biBitCount==32)
  101.       {
  102.        p.format=GL_BGRA_EXT;
  103.        p.perpixel=4;
  104.        return FALSE;
  105.       }
  106.    }
  107.  
  108.    BYTE *bits=(BYTE *)dib.bits;
  109.    if(dib.Info->biBitCount==8){
  110.  
  111.     // convert to TRUECOLOR
  112.     int _perline=ScanBytes(8,m_iWidth);
  113.     int perline=ScanBytes(24,m_iWidth);
  114.     bits= new BYTE[perline*m_iHeight * sizeof(BYTE)];
  115.     for(int y=0;y<m_iHeight;y++){
  116.      BYTE *_b=((BYTE *)dib.bits)+y*_perline;
  117.      BYTE *b=bits+y*perline;
  118.      for(int x=0;x<m_iWidth;x++){
  119.       RGBQUAD _p=dib.palette[*_b];
  120.       _b++;
  121.       *b=_p.rgbBlue;b++;
  122.       *b=_p.rgbGreen;b++;
  123.       *b=_p.rgbRed;b++;
  124.      }
  125.     }
  126.    }
  127.    BOOL isAlpha=(dib.Info->biBitCount==32);
  128.    int _mem_size=xSize2 * ySize2 *  sizeof(BYTE);
  129.    if(isAlpha){
  130.          _mem_size*=4;
  131.           p.perpixel=4;
  132.           p.format=GL_BGRA_EXT;
  133.           }else {
  134.           _mem_size*=3;
  135.           p.perpixel=3;
  136.           p.format=GL_BGR_EXT;
  137.           }
  138.    BYTE *pData = (BYTE*)new BYTE[_mem_size];
  139.    if (!pData) return FALSE;
  140.  
  141.    if(isAlpha){
  142.    gluScaleImage(GL_BGRA_EXT, m_iWidth, m_iHeight,
  143.                  GL_UNSIGNED_BYTE, bits,
  144.                  xSize2, ySize2, GL_UNSIGNED_BYTE, pData);
  145.    }
  146.    else
  147.    gluScaleImage(GL_RGB, m_iWidth, m_iHeight,
  148.                  GL_UNSIGNED_BYTE, bits,
  149.                  xSize2, ySize2, GL_UNSIGNED_BYTE, pData);
  150.  
  151.  
  152.    if(bits!=dib.bits)delete bits;
  153. //   m_pBits = pData;
  154.    m_iWidth = xSize2 ;
  155.    m_iHeight = ySize2 ;
  156.    p.Width=m_iWidth;
  157.    p.Height=m_iHeight;
  158.    p.bits=pData;
  159.  
  160.    return TRUE ;
  161.  }
  162. void LoadTexture(char*filename)
  163.  {
  164.   DIB2D dib;
  165.   GLTXTLOAD load;
  166.   if(LoadDIB(filename,&dib))
  167.    {
  168.  
  169.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  170.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  171.  
  172.     if(ScaleImage(dib,load))
  173.      {
  174.    glTexImage2D(GL_TEXTURE_2D,0,load.perpixel,
  175.                 load.Width,load.Height,0,
  176.                 load.format,GL_UNSIGNED_BYTE,
  177.                 load.bits);
  178.                 delete load.bits;
  179.      }else{
  180.  
  181.    glTexImage2D(GL_TEXTURE_2D,0,load.perpixel,
  182.                 dib.Info->biWidth,dib.Info->biHeight,
  183.                 0,load.format,GL_UNSIGNED_BYTE,dib.bits);
  184.      }
  185.    delete dib.Info;
  186.    }
  187.  
  188.   //DeleteObject(hbitmap);
  189.  };
  190.  
  191.  
  192.