/* Ken Mazaika
February 23, 2005
Texture Engine
Copyright 2005
http://home.comcast.net/~kjmaz
*/
#include "qd.h"
#include <stdio.h>
#include "Texture.h"
#include <GL/glaux.h>
#include <GL/glu.h>
#include <fstream.h>
int QdTexture::SelectTexture()
{
glBindTexture(GL_TEXTURE_2D, m_nTexture);
return true;
}
int QdTexture::LoadFromBitmapResource(int nResource)
{
HBITMAP hBMP;
BITMAP BMP;
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(nResource), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
if (hBMP)
{
GetObject(hBMP,sizeof(BMP), &BMP);
glGenTextures(1, &m_nTexture);
glBindTexture(GL_TEXTURE_2D, m_nTexture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, BMP.bmWidth, BMP.bmHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
//Automatically generate texture coordinates if desired
if(m_bAutoTexture)
{
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
}
DeleteObject(hBMP);
return QD_SUCCESS;
}
else
{
return QD_INVALID_RESOURCE;
}
}
int QdTexture::LoadFromBitmap(char *szPath)
{
FILE *fp;
int nMemory;
QD_BITMAP_IMAGE pbiTexture;
fp = fopen(szPath, "rb");
fread(&pbiTexture.bmfHeader, 1, 14, fp);
fread(&pbiTexture.bmiHeader, 1, 40, fp);
if (pbiTexture.bmiHeader.biSizeImage == 0)
{
nMemory = pbiTexture.bmiHeader.biWidth * pbiTexture.bmiHeader.biHeight * 4;
}
else
{
nMemory = pbiTexture.bmiHeader.biSizeImage;
}
pbiTexture.image_data= new GLubyte[nMemory];
fread(pbiTexture.image_data , 1, nMemory, fp);
fclose(fp);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1, &m_nTexture);
glBindTexture(GL_TEXTURE_2D, m_nTexture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pbiTexture.bmiHeader.biWidth, pbiTexture.bmiHeader.biHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, pbiTexture.image_data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
//Automatically generate texture coordinates if desired
if(m_bAutoTexture)
{
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
}
delete[] pbiTexture.image_data;
return true;
}
QdTexture::QdTexture()
{
m_bAutoTexture = 1; //Set to autotexture by default
}
QdTexture::~QdTexture()
{
}
int QdTexture::SetMode(int nMode)
{
if(nMode == QD_NO_AUTO_TEXTURE)
{
m_bAutoTexture = 0;
}
else if(nMode == QD_AUTO_TEXURE)
{
m_bAutoTexture = 1;
}
return QD_SUCCESS;
}