296 lines
8 KiB
C++
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);
|
|
}
|
|
}
|
|
|