// // Deus Hax (working title) // Copyright (c) 2010 Sam Hocevar <sam@hocevar.net> // #if defined HAVE_CONFIG_H # include "config.h" #endif #include <cstdlib> #include <cmath> #ifdef WIN32 # define WIN32_LEAN_AND_MEAN # include <windows.h> #endif #if defined __APPLE__ && defined __MACH__ # include <OpenGL/gl.h> #else # define GL_GLEXT_PROTOTYPES # include <GL/gl.h> #endif #include <SDL.h> #include <SDL_image.h> #include "tileset.h" /* * TileSet implementation class */ class TileSetData { friend class TileSet; private: char *name; int *tiles; int ntiles; SDL_Surface *img; GLuint texture; }; /* * Public TileSet class */ TileSet::TileSet(char const *path) { data = new TileSetData(); data->name = strdup(path); data->tiles = NULL; data->ntiles = 0; data->img = NULL; data->texture = 0; for (char const *name = path; *name; name++) if ((data->img = IMG_Load(name))) break; if (!data->img) { SDL_Quit(); exit(1); } } TileSet::~TileSet() { free(data->tiles); free(data->name); delete data; } Entity::Group TileSet::GetGroup() { return GROUP_BEFORE; } void TileSet::TickRender(float deltams) { Entity::TickRender(deltams); if (data->img) { glGenTextures(1, &data->texture); glBindTexture(GL_TEXTURE_2D, data->texture); glTexImage2D(GL_TEXTURE_2D, 0, 4, data->img->w, data->img->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data->img->pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); SDL_FreeSurface(data->img); data->img = NULL; } else if (ref == 0) { glDeleteTextures(1, &data->texture); destroy = 1; } } char const *TileSet::GetName() { return data->name; } void TileSet::BlitTile(uint32_t id, int x, int y, int z, int o) { float tx = .0625f * (id & 0xf); float ty = .0625f * ((id >> 4) & 0xf); float sqrt2 = sqrtf(2.0f); int off = o ? 32 : 0; if (!data->img) { glBindTexture(GL_TEXTURE_2D, data->texture); glBegin(GL_QUADS); glTexCoord2f(tx, ty); glVertex3f(x, sqrt2 * (y + off), sqrt2 * (z + off)); glTexCoord2f(tx + .0625f, ty); glVertex3f(x + 32, sqrt2 * (y + off), sqrt2 * (z + off)); glTexCoord2f(tx + .0625f, ty + .0625f); glVertex3f(x + 32, sqrt2 * (y + 32), sqrt2 * z); glTexCoord2f(tx, ty + .0625f); glVertex3f(x, sqrt2 * (y + 32), sqrt2 * z); glEnd(); } }