summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/tiletex.cc
diff options
context:
space:
mode:
authorennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-08-23 17:07:46 +0000
committerennewalker <ennewalker@c06c8d41-db1a-0410-9941-cceddc491573>2008-08-23 17:07:46 +0000
commitb25208caa5f84ac6c370314945c6f110261d2c70 (patch)
treec477c16395f409c901bc7d405b14db67ff4a4d90 /crawl-ref/source/tiletex.cc
parent02bae5372f40ac282701831cc61deb2483938876 (diff)
downloadcrawl-ref-b25208caa5f84ac6c370314945c6f110261d2c70.tar.gz
crawl-ref-b25208caa5f84ac6c370314945c6f110261d2c70.zip
RLTiles complete code rewrite: now much more robust and functional.
Added PNG and non-palettized image input. Added PNG output. Added better tile packing and support for tiles of different sizes. Converted all BMPs to PNGs (for space and explicit transparency reasons.) Added the 48x32 pandemonium demon tiles, but these are not yet used in game. Added Bill B.'s portal tile (finally). The Win32 makefiles are not updated quite yet and thus will not build. Sorry. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6850 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/tiletex.cc')
-rw-r--r--crawl-ref/source/tiletex.cc150
1 files changed, 67 insertions, 83 deletions
diff --git a/crawl-ref/source/tiletex.cc b/crawl-ref/source/tiletex.cc
index f289352656..b8d80d9704 100644
--- a/crawl-ref/source/tiletex.cc
+++ b/crawl-ref/source/tiletex.cc
@@ -52,59 +52,85 @@ bool GenericTexture::load_texture(const char *filename,
// Determine texture format
unsigned char *pixels = (unsigned char*)img->pixels;
- int new_width = img->w;
- int new_height = img->h;
+ int new_width = 1;
+ while (new_width < img->w)
+ new_width *= 2;
+ int new_height = 1;
+ while (new_height < img->h)
+ new_height *= 2;
+
GLenum texture_format;
if (bpp == 4)
{
- if (img->format->Rmask == 0x000000ff)
- texture_format = GL_RGBA;
- else
- texture_format = GL_BGRA;
+ if (new_width != img->w || new_height != img->h)
+ {
+ SDL_LockSurface(img);
+ pixels = new unsigned char[4 * new_width * new_height];
+ memset(pixels, 0, 4 * new_width * new_height);
+
+ int dest = 0;
+ for (int y = 0; y < img->h; y++)
+ {
+ for (int x = 0; x < img->w; x++)
+ {
+ unsigned char *p = ((unsigned char*)img->pixels
+ + y * img->pitch + x * bpp);
+ unsigned int pixel = *(unsigned int*)p;
+ SDL_GetRGBA(pixel, img->format, &pixels[dest],
+ &pixels[dest+1], &pixels[dest+2],
+ &pixels[dest+3]);
+ dest += 4;
+ }
+ dest += 4 * (new_width - img->w);
+ }
+
+ SDL_UnlockSurface(img);
+ }
+ texture_format = GL_RGBA;
}
else if (bpp == 3)
{
- if (img->format->Rmask == 0x000000ff)
- texture_format = GL_RGB;
- else
- texture_format = GL_BGR;
+ if (new_width != img->w || new_height != img->h)
+ {
+ SDL_LockSurface(img);
+ pixels = new unsigned char[4 * new_width * new_height];
+ memset(pixels, 0, 4 * new_width * new_height);
+
+ int dest = 0;
+ for (int y = 0; y < img->h; y++)
+ {
+ for (int x = 0; x < img->w; x++)
+ {
+ unsigned char *p = ((unsigned char*)img->pixels
+ + y * img->pitch + x * bpp);
+ unsigned int pixel;
+ if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ pixel = p[0] << 16 | p[1] << 8 | p[2];
+ else
+ pixel = p[0] | p[1] << 8 | p[2];
+ SDL_GetRGBA(pixel, img->format, &pixels[dest],
+ &pixels[dest+1], &pixels[dest+2],
+ &pixels[dest+3]);
+ dest += 4;
+ }
+ dest += 4 * (new_width - img->w);
+ }
+
+ SDL_UnlockSurface(img);
+ }
+ texture_format = GL_RGBA;
}
else if (bpp == 1)
{
// need to depalettize
SDL_LockSurface(img);
- // Prefer power-of-two textures to avoid texture bleeding from
- // floating point error.
- // TODO enne - convert non-palettized to power-of-2 as well?
- new_width = 1;
- while (new_width < img->w)
- new_width *= 2;
- new_height = 1;
- while (new_height < img->h)
- new_height *= 2;
-
pixels = new unsigned char[4 * new_width * new_height];
SDL_Palette* pal = img->format->palette;
ASSERT(pal);
ASSERT(pal->colors);
- // Find transparent colour
- // TODO enne - this should probably be removed from rltiles
- // TODO enne - is there more than one transparent color??
- int trans_index = -1;
- for (int p = 0; p < pal->ncolors ; p++)
- {
- if (pal->colors[p].r == 71 &&
- pal->colors[p].g == 108 &&
- pal->colors[p].b == 108)
- {
- trans_index = p;
- break;
- }
- }
-
int src = 0;
int dest = 0;
for (int y = 0; y < img->h; y++)
@@ -116,7 +142,7 @@ bool GenericTexture::load_texture(const char *filename,
pixels[dest*4 ] = pal->colors[index].r;
pixels[dest*4 + 1] = pal->colors[index].g;
pixels[dest*4 + 2] = pal->colors[index].b;
- pixels[dest*4 + 3] = (index == trans_index) ? 0 : 255;
+ pixels[dest*4 + 3] = 255;
dest++;
}
while (x++ < new_width)
@@ -213,57 +239,15 @@ void GenericTexture::bind()
glBindTexture(GL_TEXTURE_2D, m_handle);
}
-void TilesTexture::get_texcoord_doll(int part, int idx, int ymax, float &x, float &y, float &wx, float &wy, int &wx_pix, int &wy_pix, int &ox, int &oy)
+TilesTexture::TilesTexture() :
+ GenericTexture(), m_tile_max(0), m_tile_info(NULL)
{
- int tile_idx = tilep_parts_start[part];
- int nx = tilep_parts_nx[part];
- int ny = tilep_parts_ny[part];
- ox = tilep_parts_ox[part];
- oy = tilep_parts_oy[part];
- wx_pix = TILE_X / nx;
- wy_pix = TILE_Y / ny;
-
- if (!idx)
- {
- wy = -1;
- return;
- }
- idx--;
- tile_idx += idx / (nx * ny);
-
- if (oy + wy_pix > ymax)
- wy_pix -= oy + wy_pix - ymax;
-
- int xs = (tile_idx % TILEP_PER_ROW) * TILE_X;
- int ys = (tile_idx / TILEP_PER_ROW) * TILE_Y;
- xs += (idx % nx) * TILE_X / nx;
- ys += ((idx / nx) % ny) * TILE_Y / ny;
-
- x = xs / (float)m_width;
- y = ys / (float)m_height;
- wx = wx_pix / (float)m_width;
- wy = wy_pix / (float)m_height;
}
-void TilesTexture::get_texcoord(int idx, float &x, float &y,
- float &wx, float &wy)
+void TilesTexture::set_info(int _max, tile_info *_info)
{
- const unsigned int tile_size = 32;
- unsigned int tiles_per_row = m_width / tile_size;
-
- wx = tile_size / (float)m_width;
- wy = tile_size / (float)m_height;
-
- unsigned int row = idx / tiles_per_row;
- unsigned int col = idx % tiles_per_row;
-
- x = tile_size * col / (float)m_width;
- y = tile_size * row / (float)m_height;
-
- ASSERT(row >= 0);
- ASSERT(col >= 0);
- ASSERT(x + wx <= m_width);
- ASSERT(y + wy <= m_height);
+ m_tile_max = _max;
+ m_tile_info = _info;
}