Skip to content

Commit

Permalink
Add support for tileset objectalignment
Browse files Browse the repository at this point in the history
  • Loading branch information
baylej committed Jan 17, 2021
1 parent 52ebed9 commit a08b1b7
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 1 deletion.
31 changes: 31 additions & 0 deletions doc/src/datastructure.rst
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,33 @@ Enumerations
| SA_Y | y axis. |
+--------------+--------------------------------------------+

.. c:type:: enum tmx_obj_alignment
Controls the alignment of tiles.
When unspecified, tile objects use OA_BOTTOMLEFT in orthogonal mode and OA_BOTTOM in isometric mode (see :c:type:`tmx_map_orient`).

+----------------+----------------------------------+
| Object align | Description |
+================+==================================+
| OA_NONE | Object alignment is unspecified. |
+----------------+----------------------------------+
| OA_TOP | Top. |
+----------------+----------------------------------+
| OA_LEFT | Left. |
+----------------+----------------------------------+
| OA_BOTTOM | Bottom. |
+----------------+----------------------------------+
| OA_RIGHT | Right. |
+----------------+----------------------------------+
| OA_TOPLEFT | Top-Left. |
+----------------+----------------------------------+
| OA_TOPRIGHT | Top-Right. |
+----------------+----------------------------------+
| OA_BOTTOMLEFT | Bottom-Left. |
+----------------+----------------------------------+
| OA_BOTTOMRIGHT | Bottom-Right. |
+----------------+----------------------------------+

.. c:type:: enum tmx_layer_type
Type of :term:`layer`.
Expand Down Expand Up @@ -459,6 +486,10 @@ you can access everything.
Vertical offset in pixels, a positive value shifts the drawing of tiles down.

.. c:member:: enum tmx_obj_alignment
Controls the alignment of tiles, see :c:type:`tmx_obj_alignment`.

.. c:member:: unsigned int tilecount
The number of tiles in this tileset, length of the :c:member:`tmx_tileset.tiles` array.
Expand Down
2 changes: 1 addition & 1 deletion examples/data/csv.tmx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ baz</property>
<property name="pi" type="float" value="3.14"/>
<property name="xml" value="libxml2"/>
</properties>
<tileset firstgid="1" name="base" tilewidth="32" tileheight="32" spacing="1" tilecount="9" columns="3">
<tileset firstgid="1" name="base" tilewidth="32" tileheight="32" spacing="1" tilecount="9" columns="3" objectalignment="bottomleft">
<image source="numbers.png" width="100" height="100"/>
<tile id="0">
<properties>
Expand Down
17 changes: 17 additions & 0 deletions examples/dumper/dumper.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,22 @@ void print_renderorder(enum tmx_map_renderorder ro) {
}
}

void print_objectalignment(enum tmx_obj_alignment oa) {
switch (oa) {
case OA_NONE: printf("unspecified"); break;
case OA_TOP: printf("top"); break;
case OA_LEFT: printf("left"); break;
case OA_BOTTOM: printf("bottom"); break;
case OA_RIGHT: printf("right"); break;
case OA_CENTER: printf("center"); break;
case OA_TOPLEFT: printf("topleft"); break;
case OA_TOPRIGHT: printf("topright"); break;
case OA_BOTTOMLEFT: printf("bottomleft"); break;
case OA_BOTTOMRIGHT: printf("bottomright"); break;
default: printf("unknown");
}
}

void print_draworder(enum tmx_objgr_draworder dro) {
switch(dro) {
case G_NONE: printf("none"); break;
Expand Down Expand Up @@ -263,6 +279,7 @@ void dump_tileset(tmx_tileset_list *tsl, int depth) {
printf("\n%s\t" "spacing=%u", padding, t->spacing);
printf("\n%s\t" "x_offset=%d", padding, t->x_offset);
printf("\n%s\t" "y_offset=%d", padding, t->y_offset);
printf("\n%s\t" "objectalignment=", padding); print_objectalignment(t->objectalignment);
dump_image(t->image, depth+1);
dump_tile(t->tiles, t->tilecount, depth+1);
dump_prop(t->properties, depth+1);
Expand Down
2 changes: 2 additions & 0 deletions src/tmx.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ enum tmx_map_orient {O_NONE, O_ORT, O_ISO, O_STA, O_HEX};
enum tmx_map_renderorder {R_NONE, R_RIGHTDOWN, R_RIGHTUP, R_LEFTDOWN, R_LEFTUP};
enum tmx_stagger_index {SI_NONE, SI_EVEN, SI_ODD};
enum tmx_stagger_axis {SA_NONE, SA_X, SA_Y};
enum tmx_obj_alignment {OA_NONE, OA_TOP, OA_LEFT, OA_BOTTOM, OA_RIGHT, OA_CENTER, OA_TOPLEFT, OA_TOPRIGHT, OA_BOTTOMLEFT, OA_BOTTOMRIGHT};
enum tmx_layer_type {L_NONE, L_LAYER, L_OBJGR, L_IMAGE, L_GROUP};
enum tmx_objgr_draworder {G_NONE, G_INDEX, G_TOPDOWN};
enum tmx_obj_type {OT_NONE, OT_SQUARE, OT_POLYGON, OT_POLYLINE, OT_ELLIPSE, OT_TILE, OT_TEXT, OT_POINT};
Expand Down Expand Up @@ -130,6 +131,7 @@ struct _tmx_ts { /* <tileset> and <tileoffset> */
unsigned int tile_width, tile_height;
unsigned int spacing, margin;
int x_offset, y_offset; /* tileoffset */
enum tmx_obj_alignment objectalignment;

unsigned int tilecount;
tmx_image *image;
Expand Down
32 changes: 32 additions & 0 deletions src/tmx_utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,38 @@ enum tmx_map_renderorder parse_renderorder(const char *renderorder) {
return R_NONE;
}

/* "topleft" -> OA_TOPLEFT */
enum tmx_obj_alignment parse_obj_alignment(const char *objalign_str) {
if (!strcmp("top", objalign_str)) {
return OA_TOP;
}
if (!strcmp("left", objalign_str)) {
return OA_LEFT;
}
if (!strcmp("bottom", objalign_str)) {
return OA_BOTTOM;
}
if (!strcmp("right", objalign_str)) {
return OA_RIGHT;
}
if (!strcmp("center", objalign_str)) {
return OA_CENTER;
}
if (!strcmp("topleft", objalign_str)) {
return OA_TOPLEFT;
}
if (!strcmp("topright", objalign_str)) {
return OA_TOPRIGHT;
}
if (!strcmp("bottomleft", objalign_str)) {
return OA_BOTTOMLEFT;
}
if (!strcmp("bottomright", objalign_str)) {
return OA_BOTTOMRIGHT;
}
return OA_NONE;
}

/* "index" -> G_INDEX */
enum tmx_objgr_draworder parse_objgr_draworder(const char *draworder) {
if (draworder == NULL || !strcmp(draworder, "topdown")) {
Expand Down
1 change: 1 addition & 0 deletions src/tmx_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ int mk_map_tile_array(tmx_map *map);

enum tmx_map_orient parse_orient(const char *orient_str);
enum tmx_map_renderorder parse_renderorder(const char *renderorder);
enum tmx_obj_alignment parse_obj_alignment(const char *objalign_str);
enum tmx_objgr_draworder parse_objgr_draworder(const char *draworder);
enum tmx_stagger_index parse_stagger_index(const char *staggerindex);
enum tmx_stagger_axis parse_stagger_axis(const char *staggeraxis);
Expand Down
5 changes: 5 additions & 0 deletions src/tmx_xml.c
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,11 @@ static int parse_tileset(xmlTextReaderPtr reader, tmx_tileset *ts_addr, tmx_reso
tmx_free_func(value);
}

if ((value = (char*)xmlTextReaderGetAttribute(reader, (xmlChar*)"objectalignment"))) { /* objectalignment */
ts_addr->objectalignment = parse_obj_alignment(value);
tmx_free_func(value);
}

if (!(ts_addr->tiles = alloc_tiles(ts_addr->tilecount))) return 0;

/* Parse each child */
Expand Down

0 comments on commit a08b1b7

Please sign in to comment.