thing that is still broken is the Layer <--> Map interface.legacy
@@ -30,7 +30,7 @@ class EmitterData | |||
static const int MAX_PARTICLES = 1000; | |||
private: | |||
int tiler; | |||
TileSet *tileset; | |||
vec3 gravity; | |||
int particles[MAX_PARTICLES]; | |||
vec3 positions[MAX_PARTICLES]; | |||
@@ -42,10 +42,10 @@ private: | |||
* Public Emitter class | |||
*/ | |||
Emitter::Emitter(int tiler, vec3 gravity) | |||
Emitter::Emitter(TileSet *tileset, vec3 gravity) | |||
: data(new EmitterData()) | |||
{ | |||
data->tiler = tiler; | |||
data->tileset = tileset; | |||
data->gravity = gravity; | |||
data->nparticles = 0; | |||
} | |||
@@ -73,7 +73,7 @@ void Emitter::TickDraw(float deltams) | |||
Entity::TickDraw(deltams); | |||
for (int i = 0; i < data->nparticles; i++) | |||
Scene::GetDefault()->AddTile((data->tiler << 16) | data->particles[i], | |||
Scene::GetDefault()->AddTile(data->tileset, data->particles[i], | |||
data->positions[i].x, | |||
data->positions[i].y, | |||
data->positions[i].z, 0); | |||
@@ -17,6 +17,7 @@ | |||
#define __LOL_EMITTER_H__ | |||
#include "entity.h" | |||
#include "tileset.h" | |||
namespace lol | |||
{ | |||
@@ -26,7 +27,7 @@ class EmitterData; | |||
class Emitter : public Entity | |||
{ | |||
public: | |||
Emitter(int tiler, vec3 gravity); | |||
Emitter(TileSet *tileset, vec3 gravity); | |||
virtual ~Emitter(); | |||
void AddParticle(int id, vec3 pos, vec3 vel); | |||
@@ -32,7 +32,7 @@ class FontData | |||
private: | |||
char *name; | |||
int tiler; | |||
TileSet *tileset; | |||
vec2i size; | |||
}; | |||
@@ -46,15 +46,15 @@ Font::Font(char const *path) | |||
data->name = (char *)malloc(7 + strlen(path) + 1); | |||
sprintf(data->name, "<font> %s", path); | |||
data->tiler = Tiler::Register(path, 0, 16, 1.0f); | |||
data->size = Tiler::GetSize(data->tiler, 0); | |||
data->tileset = Tiler::Register(path, 0, 16, 1.0f); | |||
data->size = data->tileset->GetSize(0); | |||
drawgroup = DRAWGROUP_BEFORE; | |||
} | |||
Font::~Font() | |||
{ | |||
Tiler::Deregister(data->tiler); | |||
Tiler::Deregister(data->tileset); | |||
free(data->name); | |||
delete data; | |||
} | |||
@@ -78,7 +78,7 @@ void Font::Print(vec3i pos, char const *str) | |||
uint32_t ch = (uint8_t)*str++; | |||
if (ch != ' ') | |||
scene->AddTile((data->tiler << 16) | (ch & 255), | |||
scene->AddTile(data->tileset, ch & 255, | |||
pos.x, pos.y, pos.z, 0); | |||
pos.x += data->size.x; | |||
@@ -47,6 +47,8 @@ Layer::~Layer() | |||
void Layer::Render(int x, int y, int z) | |||
{ | |||
Log::Error("FIXME: Layer::Render no longer works\n"); | |||
#if 0 | |||
Scene *scene = Scene::GetDefault(); | |||
for (int j = 0; j < height; j++) | |||
for (int i = 0; i < width; i++) | |||
@@ -54,6 +56,7 @@ void Layer::Render(int x, int y, int z) | |||
scene->AddTile(data[j * width + i], | |||
x + i * 32, y + j * 32 - altitude, | |||
altitude + z, orientation); | |||
#endif | |||
} | |||
int Layer::GetZ() | |||
@@ -33,10 +33,10 @@ class MapData | |||
{ | |||
friend class Map; | |||
static int const MAX_TILERS = 128; | |||
static int const MAX_TILESETS = 128; | |||
private: | |||
int tilers[MAX_TILERS]; | |||
TileSet *tilesets[MAX_TILESETS]; | |||
int ntilers; | |||
Layer **layers; | |||
@@ -59,7 +59,7 @@ Map::Map(char const *path) | |||
data->height = 0; | |||
char tmp[BUFSIZ]; | |||
int gids[MapData::MAX_TILERS]; | |||
int gids[MapData::MAX_TILESETS]; | |||
uint32_t *tiles = NULL; | |||
int level = 0, orientation = 0, ntiles = 0; | |||
@@ -95,7 +95,8 @@ Map::Map(char const *path) | |||
if (n == data->ntilers - 1 | |||
|| id < gids[n + 1]) | |||
{ | |||
code = (data->tilers[n] << 16) | (id - gids[n]); | |||
Log::Error("tilesets no longer work this way"); | |||
//code = (data->tilesets[n] << 16) | (id - gids[n]); | |||
break; | |||
} | |||
} | |||
@@ -132,7 +133,7 @@ Map::Map(char const *path) | |||
else if (sscanf(tmp, " <image source=\"%[^\"]\"", str) == 1) | |||
{ | |||
/* This is a tileset image file. Associate it with firstgid. */ | |||
data->tilers[data->ntilers] = Tiler::Register(str, 32, 0, | |||
data->tilesets[data->ntilers] = Tiler::Register(str, 32, 0, | |||
sqrtf(2)); | |||
data->ntilers++; | |||
//Log::Debug("new tiler %s\n", str); | |||
@@ -158,7 +159,7 @@ Map::Map(char const *path) | |||
Map::~Map() | |||
{ | |||
for (int i = 0; i < data->ntilers; i++) | |||
Tiler::Deregister(data->tilers[i]); | |||
Tiler::Deregister(data->tilesets[i]); | |||
for (int i = 0; i < data->nlayers; i++) | |||
delete data->layers[i]; | |||
free(data->layers); | |||
@@ -28,8 +28,9 @@ namespace lol | |||
struct Tile | |||
{ | |||
uint32_t prio, code; | |||
int x, y, z, o; | |||
TileSet *tileset; | |||
uint32_t prio; | |||
int id, x, y, z, o; | |||
}; | |||
static Shader *stdshader = NULL; | |||
@@ -113,14 +114,15 @@ void Scene::Reset() | |||
SceneData::scene = NULL; | |||
} | |||
void Scene::AddTile(uint32_t code, int x, int y, int z, int o) | |||
void Scene::AddTile(TileSet *tileset, int id, int x, int y, int z, int o) | |||
{ | |||
if ((data->ntiles % 1024) == 0) | |||
data->tiles = (Tile *)realloc(data->tiles, | |||
(data->ntiles + 1024) * sizeof(Tile)); | |||
/* FIXME: this sorting only works for a 45-degree camera */ | |||
data->tiles[data->ntiles].prio = -y - 2 * 32 * z + (o ? 0 : 32); | |||
data->tiles[data->ntiles].code = code; | |||
data->tiles[data->ntiles].tileset = tileset; | |||
data->tiles[data->ntiles].id = id; | |||
data->tiles[data->ntiles].x = x; | |||
data->tiles[data->ntiles].y = y; | |||
data->tiles[data->ntiles].z = z; | |||
@@ -273,7 +275,7 @@ void Scene::Render() // XXX: rename to Blit() | |||
/* Count how many quads will be needed */ | |||
for (n = i + 1; n < data->ntiles; n++) | |||
if (data->tiles[i].code >> 16 != data->tiles[n].code >> 16) | |||
if (data->tiles[i].tileset != data->tiles[n].tileset) | |||
break; | |||
/* Create a vertex array object */ | |||
@@ -282,15 +284,16 @@ void Scene::Render() // XXX: rename to Blit() | |||
for (int j = i; j < n; j++) | |||
{ | |||
Tiler::BlitTile(data->tiles[j].code, data->tiles[j].x, | |||
data->tiles[j].y, data->tiles[j].z, data->tiles[j].o, | |||
data->tiles[i].tileset->BlitTile(data->tiles[j].id, | |||
data->tiles[j].x, data->tiles[j].y, | |||
data->tiles[j].z, data->tiles[j].o, | |||
vertex + 18 * (j - i), texture + 12 * (j - i)); | |||
} | |||
stdshader->Bind(); | |||
/* Bind texture */ | |||
Tiler::Bind(data->tiles[i].code); | |||
data->tiles[i].tileset->Bind(); | |||
/* Bind vertex, color and texture coordinate buffers */ | |||
#if defined HAVE_GL_2X | |||
@@ -18,6 +18,8 @@ | |||
#include <stdint.h> | |||
#include "tileset.h" | |||
namespace lol | |||
{ | |||
@@ -32,7 +34,7 @@ public: | |||
static Scene *GetDefault(); | |||
static void Reset(); | |||
void AddTile(uint32_t code, int x, int y, int z, int o); | |||
void AddTile(TileSet *tileset, int id, int x, int y, int z, int o); | |||
void Render(); | |||
private: | |||
@@ -27,16 +27,10 @@ static class TilerData | |||
public: | |||
TilerData() | |||
#if !LOL_RELEASE | |||
: lasterror(-1) | |||
#endif | |||
{ } | |||
private: | |||
Dict tilesets; | |||
#if !LOL_RELEASE | |||
int lasterror; | |||
#endif | |||
} | |||
tilerdata; | |||
@@ -46,87 +40,24 @@ static TilerData * const data = &tilerdata; | |||
* Public Tiler class | |||
*/ | |||
int Tiler::Register(char const *path, vec2i size, vec2i count, float dilate) | |||
TileSet *Tiler::Register(char const *path, vec2i size, vec2i count, | |||
float dilate) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
if (!data->tilesets.GetEntity(id)) | |||
{ | |||
TileSet *tileset = new TileSet(path, size, count, dilate); | |||
data->tilesets.SetEntity(id, tileset); | |||
#if !LOL_RELEASE | |||
if (id == data->lasterror) | |||
data->lasterror = -1; | |||
#endif | |||
} | |||
return id + 1; /* ID 0 is for the empty tileset */ | |||
} | |||
void Tiler::Deregister(int id) | |||
{ | |||
data->tilesets.RemoveSlot(id - 1); /* ID 0 is for the empty tileset */ | |||
} | |||
vec2i Tiler::GetCount(int id) | |||
{ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id - 1); | |||
#if !LOL_RELEASE | |||
if (!tileset) | |||
{ | |||
Log::Error("getting count for null tiler #%i\n", id); | |||
return 0; | |||
} | |||
#endif | |||
return tileset->GetCount(); | |||
} | |||
vec2i Tiler::GetSize(int id, int tileid) | |||
{ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id - 1); | |||
#if !LOL_RELEASE | |||
if (!tileset) | |||
{ | |||
Log::Error("getting size for null tiler #%i\n", id); | |||
return 0; | |||
tileset = new TileSet(path, size, count, dilate); | |||
data->tilesets.SetEntity(id, tileset); | |||
} | |||
#endif | |||
return tileset->GetSize(tileid); | |||
} | |||
void Tiler::Bind(uint32_t code) | |||
{ | |||
int id = (code >> 16) - 1; /* ID 0 is for the empty tileset */ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
#if !LOL_RELEASE | |||
if (!tileset) | |||
{ | |||
if (id != data->lasterror) | |||
Log::Error("binding null tiler #%i\n", id); | |||
data->lasterror = id; | |||
return; | |||
} | |||
#endif | |||
tileset->Bind(); | |||
return tileset; | |||
} | |||
void Tiler::BlitTile(uint32_t code, int x, int y, int z, int o, | |||
float *vertex, float *texture) | |||
void Tiler::Deregister(TileSet *tileset) | |||
{ | |||
int id = (code >> 16) - 1; /* ID 0 is for the empty tileset */ | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
#if !LOL_RELEASE | |||
if (!tileset) | |||
{ | |||
if (id != data->lasterror) | |||
Log::Error("blitting to null tiler #%i\n", id); | |||
data->lasterror = id; | |||
return; | |||
} | |||
#endif | |||
tileset->BlitTile(code & 0xffff, x, y, z, o, vertex, texture); | |||
data->tilesets.RemoveSlot(tileset); | |||
} | |||
} /* namespace lol */ | |||
@@ -19,21 +19,17 @@ | |||
#include <stdint.h> | |||
#include "tileset.h" | |||
namespace lol | |||
{ | |||
class Tiler | |||
{ | |||
public: | |||
static int Register(char const *path, vec2i size, vec2i count, | |||
static TileSet *Register(char const *path, vec2i size, vec2i count, | |||
float dilate); | |||
static void Deregister(int id); | |||
static vec2i GetCount(int id); | |||
static vec2i GetSize(int id, int tileid); | |||
static void Bind(uint32_t code); | |||
static void BlitTile(uint32_t code, int x, int y, int z, int o, | |||
float *vertex, float *texture); | |||
static void Deregister(TileSet *); | |||
}; | |||
} /* namespace lol */ | |||