Browse Source

base: some refactoring in the tileset class.

legacy
Sam Hocevar sam 11 years ago
parent
commit
d34d31dae0
3 changed files with 63 additions and 68 deletions
  1. +1
    -1
      src/font.cpp
  2. +55
    -62
      src/tileset.cpp
  3. +7
    -5
      src/tileset.h

+ 1
- 1
src/font.cpp View File

@@ -46,7 +46,7 @@ Font::Font(char const *path)
data->m_name = String("<font> ") + path; data->m_name = String("<font> ") + path;


data->tileset = Tiler::Register(path, ivec2(0), ivec2(16)); data->tileset = Tiler::Register(path, ivec2(0), ivec2(16));
data->size = data->tileset->GetSize(0);
data->size = data->tileset->GetTileSize(0);


m_drawgroup = DRAWGROUP_BEFORE; m_drawgroup = DRAWGROUP_BEFORE;
} }


+ 55
- 62
src/tileset.cpp View File

@@ -50,12 +50,11 @@ class TileSetData


private: private:
String m_name; String m_name;
int *tiles, ntiles;
ivec2 size, isize, count;
vec2 scale;
float tx, ty;
int ntiles;
ivec2 m_tile_size, m_image_size, count;
vec2 m_texcoord;


Image *img;
Image *m_img;
Texture *m_texture; Texture *m_texture;
}; };


@@ -64,41 +63,39 @@ private:
*/ */


TileSet::TileSet(char const *path, ivec2 size, ivec2 count) TileSet::TileSet(char const *path, ivec2 size, ivec2 count)
: data(new TileSetData())
: m_data(new TileSetData())
{ {
data->m_name = String("<tileset> ") + path;
m_data->m_name = String("<tileset> ") + path;


data->tiles = nullptr;
data->m_texture = 0;
data->img = Image::Create(path);
data->isize = data->img->GetSize();
m_data->m_texture = 0;
m_data->m_img = Image::Create(path);
m_data->m_image_size = m_data->m_img->GetSize();


if (count.x > 0 && count.y > 0) if (count.x > 0 && count.y > 0)
{ {
data->count = count;
data->size = data->isize / count;
m_data->count = count;
m_data->m_tile_size = m_data->m_image_size / count;
} }
else else
{ {
if (size.x <= 0 || size.y <= 0) if (size.x <= 0 || size.y <= 0)
size = ivec2(32, 32); size = ivec2(32, 32);
data->count.x = data->isize.x > size.x ? data->isize.x / size.x : 1;
data->count.y = data->isize.y > size.y ? data->isize.y / size.y : 1;
data->size = size;
m_data->count.x = m_data->m_image_size.x / max(size.x, m_data->m_image_size.x);
m_data->count.y = m_data->m_image_size.y / max(size.y, m_data->m_image_size.y);
m_data->m_tile_size = size;
} }


data->tx = (float)data->size.x / PotUp(data->isize.x);
data->ty = (float)data->size.y / PotUp(data->isize.y);
m_data->m_texcoord.x = (float)m_data->m_tile_size.x / PotUp(m_data->m_image_size.x);
m_data->m_texcoord.y = (float)m_data->m_tile_size.y / PotUp(m_data->m_image_size.y);


data->ntiles = data->count.x * data->count.y;
m_data->ntiles = m_data->count.x * m_data->count.y;


m_drawgroup = DRAWGROUP_BEFORE; m_drawgroup = DRAWGROUP_BEFORE;
} }


TileSet::~TileSet() TileSet::~TileSet()
{ {
free(data->tiles);
delete data;
delete m_data;
} }


void TileSet::TickDraw(float seconds) void TileSet::TickDraw(float seconds)
@@ -107,21 +104,21 @@ void TileSet::TickDraw(float seconds)


if (IsDestroying()) if (IsDestroying())
{ {
if (data->img)
if (m_data->m_img)
{ {
Image::Destroy(data->img);
data->img = nullptr;
Image::Destroy(m_data->m_img);
m_data->m_img = nullptr;
} }
else else
{ {
delete data->m_texture;
data->m_texture = nullptr;
delete m_data->m_texture;
m_data->m_texture = nullptr;
} }
} }
else if (data->img)
else if (m_data->m_img)
{ {
int planes; int planes;
PixelFormat format = data->img->GetFormat();
PixelFormat format = m_data->m_img->GetFormat();


switch (format) switch (format)
{ {
@@ -136,66 +133,62 @@ void TileSet::TickDraw(float seconds)
break; break;
} }


int w = PotUp(data->isize.x);
int h = PotUp(data->isize.y);
int w = PotUp(m_data->m_image_size.x);
int h = PotUp(m_data->m_image_size.y);


uint8_t *pixels = data->img->GetData();
if (w != data->isize.x || h != data->isize.y)
uint8_t *pixels = m_data->m_img->GetData();
if (w != m_data->m_image_size.x || h != m_data->m_image_size.y)
{ {
uint8_t *tmp = new uint8_t[planes * w * h]; uint8_t *tmp = new uint8_t[planes * w * h];
for (int line = 0; line < data->isize.y; line++)
for (int line = 0; line < m_data->m_image_size.y; line++)
memcpy(tmp + planes * w * line, memcpy(tmp + planes * w * line,
pixels + planes * data->isize.x * line,
planes * data->isize.x);
pixels + planes * m_data->m_image_size.x * line,
planes * m_data->m_image_size.x);
pixels = tmp; pixels = tmp;
} }


data->m_texture = new Texture(ivec2(w, h), format);
data->m_texture->SetData(pixels);
m_data->m_texture = new Texture(ivec2(w, h), format);
m_data->m_texture->SetData(pixels);


if (pixels != data->img->GetData())
if (pixels != m_data->m_img->GetData())
delete[] pixels; delete[] pixels;
Image::Destroy(data->img);
data->img = nullptr;
Image::Destroy(m_data->m_img);
m_data->m_img = nullptr;
} }
} }


char const *TileSet::GetName() char const *TileSet::GetName()
{ {
return data->m_name.C();
return m_data->m_name.C();
} }


ivec2 TileSet::GetCount() const
ivec2 TileSet::GetTileCount() const
{ {
return data->count;
return m_data->count;
} }


ivec2 TileSet::GetSize(int tileid) const
ivec2 TileSet::GetTileSize(int tileid) const
{ {
(void)tileid; (void)tileid;


return data->size;
return m_data->m_tile_size;
} }


vec2 TileSet::GetImageSize() const vec2 TileSet::GetImageSize() const
{ {
return vec2(PotUp(data->isize.x), PotUp(data->isize.y));
}

vec2 TileSet::GetTileSize() const
{
return vec2(data->tx, data->ty);
return vec2(PotUp(m_data->m_image_size.x),
PotUp(m_data->m_image_size.y));
} }


ShaderTexture TileSet::GetTexture() const ShaderTexture TileSet::GetTexture() const
{ {
return data->m_texture->GetTexture();
return m_data->m_texture->GetTexture();
} }


void TileSet::Bind() void TileSet::Bind()
{ {
if (!data->img && data->m_texture)
data->m_texture->Bind();
if (!m_data->m_img && m_data->m_texture)
m_data->m_texture->Bind();
} }


void TileSet::Unbind() void TileSet::Unbind()
@@ -206,14 +199,14 @@ void TileSet::Unbind()
void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale, void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale,
float *vertex, float *texture) float *vertex, float *texture)
{ {
float dtx = data->tx;
float dty = data->ty;
float tx = dtx * ((id & 0xffff) % data->count.x);
float ty = dty * ((id & 0xffff) / data->count.x);
float dtx = m_data->m_texcoord.x;
float dty = m_data->m_texcoord.y;
float tx = dtx * ((id & 0xffff) % m_data->count.x);
float ty = dty * ((id & 0xffff) / m_data->count.x);


int dx = data->size.x * scale.x;
int dy = o ? 0 : data->size.y * scale.y;
int dz = o ? data->size.y * scale.y : 0;
int dx = m_data->m_tile_size.x * scale.x;
int dy = o ? 0 : m_data->m_tile_size.y * scale.y;
int dz = o ? m_data->m_tile_size.y * scale.y : 0;


/* If scaling is negative, switch triangle winding */ /* If scaling is negative, switch triangle winding */
if (scale.x * scale.y < 0.0f) if (scale.x * scale.y < 0.0f)
@@ -233,7 +226,7 @@ void TileSet::BlitTile(uint32_t id, vec3 pos, int o, vec2 scale,
dty *= 126.f / 128.f; dty *= 126.f / 128.f;
#endif #endif


if (!data->img && data->m_texture)
if (!m_data->m_img && m_data->m_texture)
{ {
float tmp[10]; float tmp[10];




+ 7
- 5
src/tileset.h View File

@@ -31,9 +31,12 @@ class TileSetData;
class TileSet : public Entity class TileSet : public Entity
{ {
public: public:
TileSet(char const *path, ivec2 size, ivec2 count);
TileSet(char const *path);
virtual ~TileSet(); virtual ~TileSet();


/* Old style: path to PNG file */
TileSet(char const *path, ivec2 size, ivec2 count);

protected: protected:
/* Inherited from Entity */ /* Inherited from Entity */
virtual char const *GetName(); virtual char const *GetName();
@@ -41,10 +44,9 @@ protected:


public: public:
/* New methods */ /* New methods */
ivec2 GetCount() const;
ivec2 GetSize(int tileid) const;
ivec2 GetTileCount() const;
ivec2 GetTileSize(int tileid) const;
vec2 GetImageSize() const; vec2 GetImageSize() const;
vec2 GetTileSize() const;
ShaderTexture GetTexture() const; ShaderTexture GetTexture() const;
void Bind(); void Bind();
void Unbind(); void Unbind();
@@ -52,7 +54,7 @@ public:
float *vertex, float *texture); float *vertex, float *texture);


private: private:
TileSetData *data;
TileSetData *m_data;
}; };


} /* namespace lol */ } /* namespace lol */


Loading…
Cancel
Save