raze/source/build/include/tilepacker.h

55 lines
1.8 KiB
C
Raw Normal View History

/*
* tilepacker.h
* A k-d tree based bin packer that organizes rectangular tiles to fit
* neatly into one texture.
*
* Copyright <EFBFBD> 2018, Alex Dawson. All rights reserved.
*/
#ifndef TILEPACKER_H_
#define TILEPACKER_H_
#define MAXTILESHEETS 64
#define MAXPACKEDTILES MAXTILES+1
typedef struct
{
uint32_t u, v, width, height;
} TileRect;
typedef struct
{
uint32_t tilesheetID;
TileRect rect;
} Tile;
// Initialize the specified tilesheet
// tilesheetId must be less than MAXTILESHEETS
// Re-initializing an existing tilesheet will discard all of its contents
void tilepacker_initTilesheet(uint32_t tilesheetID, uint32_t tilesheetWidth, uint32_t tilesheetHeight);
// Adds a tile into sorted collection to be packed
// uid can be any unique key -- picnums are used for indexed colour textures
void tilepacker_addTile(uint32_t tileUID, uint32_t tileWidth, uint32_t tileHeight);
// Packs the sorted collection of tiles that have been added with tilepacker_addTile()
// Returns true if all nodes could be packed succesfully into the specified tilesheet
// tilepacker_pack can be called again with a different tilesheetId to pack the remaining tiles
char tilepacker_pack(uint32_t tilesheetID);
// Discard the rejected tiles so that they will not be carried over to the next call to tilepacker_pack
void tilepacker_discardRejects();
// Sets pOutput to contain the Tile information for a packed tile with the given tileUID
// Returns true if the Tile has been packed, false otherwise
// If pOutput is NULL, the function solely returns whether or not the Tile has been packed
char tilepacker_getTile(uint32_t tileUID, Tile *pOutput);
// Returns true if the Tile with tileUID has been packed, false otherwise
static inline char tilepacker_isTilePacked(uint32_t tileUID)
{
return tilepacker_getTile(tileUID, NULL);
};
#endif /* TILEPACKER_H_ */