diff options
| author | 3gg <3gg@shellblade.net> | 2023-07-08 14:37:29 -0700 |
|---|---|---|
| committer | 3gg <3gg@shellblade.net> | 2023-07-08 14:37:29 -0700 |
| commit | 21a0d0c1c424f7db90c3282aad4bf6ad4ef809b7 (patch) | |
| tree | a6ae8a8cb4108cd33713178e67d3b482fc1fd5ee /gfx-iso/include/isogfx | |
| parent | 303f5dc58dd8e8266df3c62fc84d9799db8047b9 (diff) | |
Load tile maps and tile sets from files.
Diffstat (limited to 'gfx-iso/include/isogfx')
| -rw-r--r-- | gfx-iso/include/isogfx/isogfx.h | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/gfx-iso/include/isogfx/isogfx.h b/gfx-iso/include/isogfx/isogfx.h index a5f7770..22c8fd5 100644 --- a/gfx-iso/include/isogfx/isogfx.h +++ b/gfx-iso/include/isogfx/isogfx.h | |||
| @@ -3,64 +3,97 @@ | |||
| 3 | */ | 3 | */ |
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include <stdbool.h> | ||
| 6 | #include <stdint.h> | 7 | #include <stdint.h> |
| 7 | 8 | ||
| 8 | typedef struct IsoGfx IsoGfx; | 9 | typedef struct IsoGfx IsoGfx; |
| 9 | 10 | ||
| 10 | typedef uint8_t Tile; | 11 | /// Tile handle. |
| 12 | typedef uint16_t Tile; | ||
| 13 | |||
| 14 | /// Colour channel. | ||
| 11 | typedef uint8_t Channel; | 15 | typedef uint8_t Channel; |
| 12 | 16 | ||
| 13 | typedef struct Pixel { | 17 | typedef struct Pixel { |
| 14 | Channel r, g, b; | 18 | Channel r, g, b, a; |
| 15 | } Pixel; | 19 | } Pixel; |
| 16 | 20 | ||
| 17 | typedef enum TileDescType { | 21 | typedef enum TileDescType { |
| 18 | TileFromColour, | 22 | TileFromColour, |
| 19 | TileFromFile, | 23 | TileFromFile, |
| 20 | TileFromMemory | 24 | TileFromMemory, |
| 21 | } TileDescType; | 25 | } TileDescType; |
| 22 | 26 | ||
| 23 | typedef struct TileDesc { | 27 | typedef struct TileDesc { |
| 24 | TileDescType type; | 28 | TileDescType type; |
| 29 | int width; /// Tile width in pixels. | ||
| 30 | int height; /// Tile height in pixels. | ||
| 25 | union { | 31 | union { |
| 26 | Pixel colour; | 32 | Pixel colour; /// Constant colour tile. |
| 27 | struct { | 33 | struct { |
| 28 | const char* path; | 34 | const char* path; |
| 29 | } file; | 35 | } file; |
| 30 | struct { | 36 | struct { |
| 31 | const void* data; | 37 | const uint8_t* data; /// sizeof(Pixel) * width * height |
| 32 | } mem; | 38 | } mem; |
| 33 | }; | 39 | }; |
| 34 | } TileDesc; | 40 | } TileDesc; |
| 35 | 41 | ||
| 42 | typedef struct WorldDesc { | ||
| 43 | int tile_width; /// Base tile width in pixels. | ||
| 44 | int tile_height; /// Base tile height in pixels. | ||
| 45 | int world_width; /// World width in tiles. | ||
| 46 | int world_height; /// World height in tiles. | ||
| 47 | int max_num_tiles; /// 0 for an implementation-defined default. | ||
| 48 | } WorldDesc; | ||
| 49 | |||
| 36 | typedef struct IsoGfxDesc { | 50 | typedef struct IsoGfxDesc { |
| 37 | int screen_width; | 51 | int screen_width; /// Screen width in pixels. |
| 38 | int screen_height; | 52 | int screen_height; /// Screen height in pixels. |
| 39 | int tile_width; | ||
| 40 | int tile_height; | ||
| 41 | int world_width; | ||
| 42 | int world_height; | ||
| 43 | int max_num_tiles; // 0 for an implementation-defined default. | ||
| 44 | } IsoGfxDesc; | 53 | } IsoGfxDesc; |
| 45 | 54 | ||
| 55 | /// Create a new isometric graphics engine. | ||
| 46 | IsoGfx* isogfx_new(const IsoGfxDesc*); | 56 | IsoGfx* isogfx_new(const IsoGfxDesc*); |
| 47 | 57 | ||
| 58 | /// Destroy the isometric graphics engine. | ||
| 48 | void isogfx_del(IsoGfx**); | 59 | void isogfx_del(IsoGfx**); |
| 49 | 60 | ||
| 61 | /// Create an empty world. | ||
| 62 | bool isogfx_make_world(IsoGfx*, const WorldDesc*); | ||
| 63 | |||
| 64 | /// Load a world from a tile map (.TM) file. | ||
| 65 | bool isogfx_load_world(IsoGfx*, const char* filepath); | ||
| 66 | |||
| 67 | /// Return the world's width. | ||
| 68 | int isogfx_world_width(const IsoGfx*); | ||
| 69 | |||
| 70 | /// Return the world's height. | ||
| 71 | int isogfx_world_height(const IsoGfx*); | ||
| 72 | |||
| 73 | /// Create a new tile. | ||
| 50 | Tile isogfx_make_tile(IsoGfx*, const TileDesc*); | 74 | Tile isogfx_make_tile(IsoGfx*, const TileDesc*); |
| 51 | 75 | ||
| 76 | /// Set the tile at position (x,y). | ||
| 52 | void isogfx_set_tile(IsoGfx*, int x, int y, Tile); | 77 | void isogfx_set_tile(IsoGfx*, int x, int y, Tile); |
| 53 | 78 | ||
| 79 | /// Set the tiles in positions in the range (x0,y0) - (x1,y1). | ||
| 54 | void isogfx_set_tiles(IsoGfx*, int x0, int y0, int x1, int y1, Tile); | 80 | void isogfx_set_tiles(IsoGfx*, int x0, int y0, int x1, int y1, Tile); |
| 55 | 81 | ||
| 82 | /// Translate Cartesian to isometric coordinates. | ||
| 56 | void isogfx_pick_tile( | 83 | void isogfx_pick_tile( |
| 57 | const IsoGfx*, double xcart, double ycart, int* xiso, int* yiso); | 84 | const IsoGfx*, double xcart, double ycart, int* xiso, int* yiso); |
| 58 | 85 | ||
| 86 | /// Render the world. | ||
| 59 | void isogfx_render(IsoGfx*); | 87 | void isogfx_render(IsoGfx*); |
| 60 | 88 | ||
| 89 | /// Draw/overlay a tile at position (x,y). | ||
| 90 | /// | ||
| 91 | /// This function just renders a tile at position (x,y) and should be called | ||
| 92 | /// after isogfx_render() to obtain the correct result. To set the tile at | ||
| 93 | /// position (x,y) instead, use isogfx_set_tile(). | ||
| 61 | void isogfx_draw_tile(IsoGfx*, int x, int y, Tile); | 94 | void isogfx_draw_tile(IsoGfx*, int x, int y, Tile); |
| 62 | 95 | ||
| 96 | /// Return a pointer to the internal colour buffer. | ||
| 97 | /// | ||
| 98 | /// Call after each call to isogfx_render() to retrieve the render output. | ||
| 63 | const Pixel* isogfx_get_screen_buffer(const IsoGfx*); | 99 | const Pixel* isogfx_get_screen_buffer(const IsoGfx*); |
| 64 | |||
| 65 | int isogfx_world_width(const IsoGfx*); | ||
| 66 | int isogfx_world_height(const IsoGfx*); | ||
