1
0
Fork 0
blockofighter/src/graphics.cpp

296 lines
8 KiB
C++

/*
* $Id: graphics.cpp,v 1.17 2002/07/21 15:03:12 msell Exp $
*
*
* $Log: graphics.cpp,v $
* Revision 1.17 2002/07/21 15:03:12 msell
* Äänet disabloitu
*
* Revision 1.16 2002/07/19 22:01:35 msell
* Säätöä
*
* Revision 1.15 2002/07/19 21:32:54 msell
* Mipmap pois
*
* Revision 1.14 2002/07/19 21:17:06 msell
* bugifixi
*
* Revision 1.13 2002/07/17 16:40:33 msell
* Resoluution vaihto
*
* Revision 1.12 2002/07/14 21:22:39 jkaarlas
* skybox ja ukkojen säätö
*
* Revision 1.11 2002/06/28 14:51:40 jkaarlas
* transparenttilatausta korjailtu
*
* Revision 1.10 2002/06/27 21:42:32 jkaarlas
* lisätty transparentin tekstuurin lataus
*
* Revision 1.9 2002/06/26 18:54:43 jkaarlas
* Nyt se lataus vihdoin toimii
*
* Revision 1.8 2002/06/20 15:30:22 jkaarlas
* tekstuurisäätöä
*
* Revision 1.7 2002/06/19 22:44:56 jkaarlas
* lisätty glTexEnvf lataukseen
*
* Revision 1.6 2002/06/17 20:49:04 msell
* free -> SDL_FreeSurface
*
* Revision 1.5 2002/06/17 20:24:20 jkaarlas
* pahimmat bugit korjattu
*
* Revision 1.4 2002/06/17 19:58:08 msell
* #includeiden parantelua
*
* Revision 1.3 2002/06/17 16:51:38 jkaarlas
* realloc korjattu
*
* Revision 1.2 2002/06/16 01:05:18 jkaarlas
* vähän lihaa luiden ympärille näihinkin
*
*
*
* $Date: 2002/07/21 15:03:12 $
*
*/
#include "graphics.h"
#include <stdlib.h>
GraphicsDruid *GraphicsDruid::instance = 0;
GraphicsDruid::GraphicsDruid(void){
this->reserved = 0;
}
GraphicsDruid::~GraphicsDruid(void){
}
void GraphicsDruid::init(void){
instance->textureCount = 0;
instance->reserved = ID_ARRAY_INIT_SIZE;
instance->idArray = (int*) calloc(ID_ARRAY_INIT_SIZE, sizeof(int));
for (int i=0; i < instance->reserved; i++){
instance->idArray[i] = -1;
}
}
void GraphicsDruid::destroy(void){
if (instance->textureCount > 0){
glDeleteTextures(GL_TEXTURE_2D, (const unsigned int*)instance->idArray);
}
free(instance->idArray);
instance->idArray = 0;
delete instance;
instance = 0;
}
GraphicsDruid &GraphicsDruid::getInstance(void){
if (!instance){
instance = new GraphicsDruid;
init();
}
return *instance;
}
int GraphicsDruid::loadTexture(SDL_Surface *texture, int id, int format){
int textureID = id == -1 ? getNewTextureID(id) : id;
// register texture in OpenGL
glBindTexture (GL_TEXTURE_2D, textureID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);//_MIPMAP_NEAREST);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
//printf("w: %i, h: %i, format: %i, RGBA: %i, pixels: %p\n",
// texture->w, texture->h, format, GL_RGBA, texture->pixels);
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
/*gluBuild2DMipmaps(GL_TEXTURE_2D,
4,
texture->w,
texture->h,
format,
GL_UNSIGNED_BYTE,
texture->pixels);*/
int w = texture->w;
int h = texture->h;
/*int i;
while (w > 0){
w >>= 1;
i++;
}
w = 1;
for (;i > 1; i--) w <<= 1;
while (h > 0){
h >>= 1;
i++;
}
h = 1;
for (;i > 1; i--) h <<= 1;*/
//glTexImage2D(GL_TEXTURE_2D, 0, texture->format->BytesPerPixel, w, h, 0, format, GL_UNSIGNED_BYTE, texture->pixels);
if (texture->format->BytesPerPixel == 3){
glTexImage2D(GL_TEXTURE_2D, 0, 3, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
} else if (texture->format->BytesPerPixel == 4){
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
}
//SDL_FreeSurface(texture);
//SDL_FreeSurface(alphaSurface);
return textureID;
}
int GraphicsDruid::loadTexture(char* path, int id){
SDL_Surface* texture;
texture = IMG_Load(path);
if (!texture){
#ifdef _DEBUG
printf ("Error while loading image: %s\n", SDL_GetError());
#endif
return -1;
}
int textureID = getNewTextureID(id);
// register texture in OpenGL
glBindTexture (GL_TEXTURE_2D, textureID);
//glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
// NOTE : Making some assumptions about texture parameters
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
//printf("w: %i, h: %i, RGBA: %i, pixels: %p\n",
// texture->w, texture->h, GL_RGBA, texture->pixels);
//printf("Pitch: %i, Bpp: %i\n", texture->pitch, texture->format->BytesPerPixel);
if (texture->format->BytesPerPixel == 3){
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
texture->w,
texture->h,
GL_RGB, GL_UNSIGNED_BYTE,
texture->pixels);*/
glTexImage2D(GL_TEXTURE_2D, 0, 3, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
}
else if (texture->format->BytesPerPixel == 4){
/*gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
texture->w,
texture->h,
GL_RGBA, GL_UNSIGNED_BYTE,
texture->pixels);*/
glTexImage2D(GL_TEXTURE_2D, 0, 4, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
}
/*
gluBuild2DMipmaps(GL_TEXTURE_2D,
0,
texture->w,
texture->h,
GL_RGBA,
GL_UNSIGNED_BYTE,
texture->pixels);
*/
SDL_FreeSurface(texture);
return textureID;
}
int GraphicsDruid::loadTranspTexture(char* path, float* transpColor, int id){
SDL_Surface* texture;
texture = IMG_Load(path);
if (!texture){
#ifdef _DEBUG
printf ("Error while loading image: %s\n", SDL_GetError());
#endif
return -1;
}
Uint32 colorKey = SDL_MapRGB(texture->format,
(Uint8)(transpColor[0] * 255),
(Uint8)(transpColor[1] * 255),
(Uint8)(transpColor[2] * 255));
//SDL_SetAlpha(texture, 0, SDL_ALPHA_OPAQUE);
SDL_SetColorKey(texture, SDL_SRCCOLORKEY, colorKey);
//SDL_Surface* alphaSurface = SDL_DisplayFormatAlpha(texture);
texture = SDL_DisplayFormatAlpha(texture);
return loadTexture(texture);
}
int GraphicsDruid::getNewTextureID(int id){
if (id != -1){
for (int i = 0; i < instance->reserved; i++){
if (instance->idArray[i] == id){
freeTexture(id);
instance->textureCount--;
break;
}
}
}
GLuint newId;
if (id == -1){
glGenTextures (1, &newId);
}
else
newId = id;
int index = 0;
while (instance->idArray[index] != -1 && index < instance->reserved){
index++;
}
// out of space, make more
if (index >= instance->reserved){
instance->idArray = (int*) realloc(instance->idArray, (instance->reserved + ID_ARRAY_GROW)*sizeof(int));
for (int i = instance->reserved + 1; i < instance->reserved + ID_ARRAY_GROW; i++)
instance->idArray[i] = -1;
instance->reserved += ID_ARRAY_GROW;
}
else
instance->idArray[index] = newId;
instance->textureCount++;
return newId;
}
void GraphicsDruid::freeTexture(int id){
if (id > -1 && id < instance->reserved){
instance->idArray[id] = -1;
const unsigned int helpInt = id;
glDeleteTextures(1, &helpInt);
}
}