Separate object layers, asign layers to proper slots
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
#include "../math/vec2i.h"
|
||||
|
||||
#include <cute_tiled.h>
|
||||
#include <string.h>
|
||||
|
||||
BzTileMap BZ_TILEMAP_INVALID = {.isValid = false};
|
||||
|
||||
@@ -12,18 +13,71 @@ int16_t bzTileLayerGetTile(BzTileLayer *layer, i32 x, i32 y) {
|
||||
return layer->data[layer->width * y + x];
|
||||
}
|
||||
|
||||
BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
|
||||
BzTileMap map = {};
|
||||
i32 tilesetCount = desc->tilesetCount;
|
||||
if (tilesetCount == 0) {
|
||||
// Auto detect tileset count.
|
||||
for (i32 i = 0; i < BZ_MAX_MAP_TILESETS; i++) {
|
||||
if (!desc->tilesets[i].isValid)
|
||||
break;
|
||||
tilesetCount++;
|
||||
static void handleTileLayer(BzTileLayer *layer, cute_tiled_layer_t *cuteLayer) {
|
||||
layer->id = cuteLayer->id;
|
||||
layer->dataCount = cuteLayer->data_count;
|
||||
layer->data = NULL;
|
||||
if (layer->dataCount > 0) {
|
||||
layer->data = bzAlloc(layer->dataCount * sizeof(*layer->data));
|
||||
layer->minData = layer->maxData = (i16) cuteLayer->data[0];
|
||||
for (i32 i = 0; i < layer->dataCount; i++) {
|
||||
layer->data[i] = (i16) cuteLayer->data[i];
|
||||
if (layer->data[i] < layer->minData)
|
||||
layer->minData = layer->data[i];
|
||||
else if (layer->data[i] > layer->maxData)
|
||||
layer->maxData = layer->data[i];
|
||||
}
|
||||
}
|
||||
map.tilesetCount = tilesetCount;
|
||||
|
||||
layer->width = cuteLayer->width;
|
||||
layer->height = cuteLayer->height;
|
||||
|
||||
layer->offsetX = cuteLayer->offsetx;
|
||||
layer->offsetY = cuteLayer->offsety;
|
||||
layer->opacity = cuteLayer->opacity;
|
||||
|
||||
}
|
||||
|
||||
// tileset.c
|
||||
BzTileShape bzCuteObjectToTileShape(cute_tiled_object_t *object);
|
||||
|
||||
static void handleTileObjectLayer(BzTileObjectLayer *layer, cute_tiled_layer_t *cuteLayer,
|
||||
BzStringHashFunc hashFunc) {
|
||||
// Count objects
|
||||
layer->objectCount = 0;
|
||||
cute_tiled_object_t *object = cuteLayer->objects;
|
||||
while (object) {
|
||||
layer->objectCount++;
|
||||
object = object->next;
|
||||
}
|
||||
|
||||
layer->objects = bzAlloc(layer->objectCount * sizeof(*layer->objects));
|
||||
object = cuteLayer->objects;
|
||||
for (i32 i = 0; i < layer->objectCount; i++) {
|
||||
layer->objects[i].id = hashFunc(object->name.ptr);
|
||||
layer->objects[i].shape = bzCuteObjectToTileShape(object);
|
||||
object = object->next;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static i32 findSlot(const char *name, const BzTileLayerDesc desc[BZ_MAX_MAP_LAYERS]) {
|
||||
for (i32 i = 0; i < BZ_MAX_MAP_LAYERS; i++) {
|
||||
if (!desc[i].name) break;
|
||||
if (strcmp(name, desc[i].name) == 0) return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
|
||||
BzTileMap map = {};
|
||||
// Auto detect tileset count.
|
||||
for (i32 i = 0; i < BZ_MAX_MAP_TILESETS; i++) {
|
||||
if (!desc->tilesets[i].isValid)
|
||||
break;
|
||||
map.tilesetCount++;
|
||||
}
|
||||
for (i32 i = 0; i < map.tilesetCount; i++) {
|
||||
map.tilesets[i] = desc->tilesets[i];
|
||||
}
|
||||
@@ -40,38 +94,49 @@ BzTileMap bzTileMapCreate(const BzTileMapDesc *desc) {
|
||||
cute_tiled_layer_t *cuteLayer = cuteMap->layers;
|
||||
while (cuteLayer) {
|
||||
BZ_ASSERT(map.layerCount < BZ_MAX_MAP_LAYERS);
|
||||
BZ_ASSERT(map.objectLayerCount < BZ_MAX_MAP_LAYERS);
|
||||
|
||||
BzTileLayer *layer = map.layers + map.layerCount;
|
||||
layer->id = cuteLayer->id;
|
||||
|
||||
layer->dataCount = cuteLayer->data_count;
|
||||
layer->data = NULL;
|
||||
if (layer->dataCount > 0) {
|
||||
layer->data = bzAlloc(layer->dataCount * sizeof(*layer->data));
|
||||
layer->minData = layer->maxData = (i16) cuteLayer->data[0];
|
||||
for (i32 i = 0; i < layer->dataCount; i++) {
|
||||
layer->data[i] = (i16) cuteLayer->data[i];
|
||||
if (layer->data[i] < layer->minData)
|
||||
layer->minData = layer->data[i];
|
||||
else if (layer->data[i] > layer->maxData)
|
||||
layer->maxData = layer->data[i];
|
||||
// Find slot
|
||||
i32 slot = -1;
|
||||
for (i32 i = 0; i < BZ_MAX_MAP_LAYERS; i++) {
|
||||
const BzTileLayerDesc *layerDesc = desc->layers + i;
|
||||
const BzTileObjectsDesc *objectsDesc = desc->objectLayers + i;
|
||||
if (layerDesc->name && strcmp(layerDesc->name, cuteLayer->name.ptr) == 0 ||
|
||||
objectsDesc->name && strcmp(objectsDesc->name, cuteLayer->name.ptr) == 0) {
|
||||
slot = i;
|
||||
break;
|
||||
} else if (!layerDesc->name && !objectsDesc->name) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (slot == -1) {
|
||||
cuteLayer = cuteLayer->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
layer->width = cuteLayer->width;
|
||||
layer->height = cuteLayer->height;
|
||||
if (cuteLayer->data) {
|
||||
BzTileLayer *layer = map.layers + slot;
|
||||
const BzTileLayerDesc *layerDesc = desc->layers + slot;
|
||||
handleTileLayer(layer, cuteLayer);
|
||||
if (layerDesc->handler) layerDesc->handler(layer);
|
||||
map.layerCount++;
|
||||
} else {
|
||||
BzTileObjectLayer *objectLayer = map.objectLayers + slot;
|
||||
const BzTileObjectsDesc *objectLayerDesc = desc->objectLayers + slot;
|
||||
BzStringHashFunc *hashFunc = objectLayerDesc->hashFunc;
|
||||
if (!hashFunc)
|
||||
hashFunc = bzStringDefaultHash;
|
||||
handleTileObjectLayer(objectLayer, cuteLayer, hashFunc);
|
||||
if (objectLayerDesc->handler) objectLayerDesc->handler(objectLayer);
|
||||
map.objectLayerCount++;
|
||||
}
|
||||
|
||||
layer->offsetX = cuteLayer->offsetx;
|
||||
layer->offsetY = cuteLayer->offsety;
|
||||
layer->opacity = cuteLayer->opacity;
|
||||
|
||||
map.layerCount++;
|
||||
cuteLayer = cuteLayer->next;
|
||||
}
|
||||
|
||||
cute_tiled_tileset_t *cuteTileset = cuteMap->tilesets;
|
||||
tilesetCount = 0;
|
||||
while ((cuteTileset = cuteTileset->next)) tilesetCount++;
|
||||
int tilesetCount = 0;
|
||||
for (; cuteTileset; cuteTileset = cuteTileset->next) tilesetCount++;
|
||||
BZ_ASSERT(tilesetCount == map.tilesetCount);
|
||||
|
||||
cuteTileset = cuteMap->tilesets;
|
||||
@@ -155,8 +220,8 @@ bool bzTileMapCanPlace(BzTileMap *map, i32 tileX, i32 tileY, i32 sizeX, i32 size
|
||||
BzTileset *tileset = map->tilesets + layer->tilesetIdx;
|
||||
|
||||
i16 tile = bzTileLayerGetTile(layer, x, y);
|
||||
BzTileCollider collider = bzTilesetGetTileCollider(tileset, tile);
|
||||
if (collider.type != BZ_TILE_COLLIDER_NONE)
|
||||
BzTileShape collider = bzTilesetGetTileCollider(tileset, tile);
|
||||
if (collider.type != BZ_TILE_SHAPE_NONE)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user