From ade1af12cab1a88c8974aa12287775f2ad1b3412 Mon Sep 17 00:00:00 2001 From: veclavtalica Date: Mon, 7 Oct 2024 17:53:09 +0300 Subject: [PATCH] twn_rendering -> twn_draw --- CMakeLists.txt | 2 +- apps/platformer/player.c | 6 +- apps/platformer/scenes/title.c | 6 +- apps/platformer/world.c | 2 +- apps/scenery/scenes/ingame.c | 10 +- apps/scenery/scenes/title.c | 6 +- apps/twnlua/game.c | 8 +- include/twn_draw.h | 109 ++++++++++++++++++ include/twn_game_api.h | 2 +- include/twn_rendering.h | 81 ------------- include/twn_types.h | 69 +++++------ src/rendering/twn_circles.c | 16 +-- src/rendering/{twn_rendering.c => twn_draw.c} | 11 +- .../{twn_rendering_c.h => twn_draw_c.h} | 4 +- src/rendering/twn_fog.c | 6 +- src/rendering/twn_gl_15_rendering.c | 2 +- src/rendering/twn_gl_any_rendering.c | 2 +- src/rendering/twn_skybox.c | 6 +- src/rendering/twn_sprites.c | 47 +++++--- src/rendering/twn_text.c | 8 +- src/rendering/twn_triangles.c | 19 +-- src/twn_engine_context_c.h | 2 +- 22 files changed, 238 insertions(+), 186 deletions(-) create mode 100644 include/twn_draw.h delete mode 100644 include/twn_rendering.h rename src/rendering/{twn_rendering.c => twn_draw.c} (96%) rename src/rendering/{twn_rendering_c.h => twn_draw_c.h} (99%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d89a64..a7fac71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ set(TWN_SOURCE_FILES src/twn_camera.c include/twn_camera.h src/twn_textures.c src/twn_textures_c.h - src/rendering/twn_rendering.c src/rendering/twn_rendering_c.h + src/rendering/twn_draw.c src/rendering/twn_draw_c.h src/rendering/twn_sprites.c src/rendering/twn_text.c src/rendering/twn_triangles.c diff --git a/apps/platformer/player.c b/apps/platformer/player.c index ee135b9..80e1712 100644 --- a/apps/platformer/player.c +++ b/apps/platformer/player.c @@ -252,7 +252,7 @@ static void drawdef(Player *player) { .h = player->sprite_h, }); - push_circle((Vec2) { 256, 128 }, + draw_circle((Vec2) { 256, 128 }, 24, (Color) { 255, 0, 0, 255 }); } @@ -268,10 +268,10 @@ static void drawdef_debug(Player *player) { /* .r = 0, .g = 0, .b = 0, .a = 255, */ /* }; */ - push_rectangle(player->collider_x, + draw_rectangle(player->collider_x, (Color){ 0, 0, 255, 128 }); - push_rectangle(player->collider_y, + draw_rectangle(player->collider_y, (Color){ 0, 0, 255, 128 }); } diff --git a/apps/platformer/scenes/title.c b/apps/platformer/scenes/title.c index eafe6e0..1341d0d 100644 --- a/apps/platformer/scenes/title.c +++ b/apps/platformer/scenes/title.c @@ -30,9 +30,9 @@ static void title_tick(State *state) { const char *font = "fonts/kenney-pixel.ttf"; int text_h = 32; - int text_w = text_get_width(text_str, text_h, font); + int text_w = draw_text_width(text_str, text_h, font); - push_rectangle( + draw_rectangle( (Rect) { .x = 0, .y = 0, @@ -41,7 +41,7 @@ static void title_tick(State *state) { }, (Color) { 0, 0, 0, 255 } ); - push_text( + draw_text( text_str, (Vec2){ 0, 0 }, text_h, diff --git a/apps/platformer/world.c b/apps/platformer/world.c index ddd5f69..067b144 100644 --- a/apps/platformer/world.c +++ b/apps/platformer/world.c @@ -39,7 +39,7 @@ static void drawdef_debug(struct World *world) { for (size_t i = 0; i < world->tilemap_height * world->tilemap_width; ++i) { if (world->tiles[i].type == TILE_TYPE_VOID) continue; - push_rectangle(to_frect(world->tiles[i].rect), + draw_rectangle(to_frect(world->tiles[i].rect), (Color) { 255, 0, 255, 128 }); } } diff --git a/apps/scenery/scenes/ingame.c b/apps/scenery/scenes/ingame.c index 3f8d175..d7848a6 100644 --- a/apps/scenery/scenes/ingame.c +++ b/apps/scenery/scenes/ingame.c @@ -55,7 +55,7 @@ static void ingame_tick(State *state) { input_set_mouse_captured(&ctx.input, !input_is_mouse_captured(&ctx.input)); } - set_camera(&scn->cam); + draw_camera(&scn->cam); #define TERRAIN_FREQUENCY 0.1f @@ -69,7 +69,7 @@ static void ingame_tick(State *state) { float d2 = stb_perlin_noise3((float)(x + 1) * TERRAIN_FREQUENCY, (float)(y - 1) * TERRAIN_FREQUENCY, 0, 0, 0, 0) * 3 - 6; float d3 = stb_perlin_noise3((float)x * TERRAIN_FREQUENCY, (float)(y - 1) * TERRAIN_FREQUENCY, 0, 0, 0, 0) * 3 - 6; - unfurl_triangle("/assets/grass.png", + draw_triangle("/assets/grass.png", (Vec3){ (float)x, d0, (float)y }, (Vec3){ (float)x + 1, d1, (float)y }, (Vec3){ (float)x, d3, (float)y - 1 }, @@ -77,7 +77,7 @@ static void ingame_tick(State *state) { (Vec2){ 128, 0 }, (Vec2){ 0, 128 }); - unfurl_triangle("/assets/grass.png", + draw_triangle("/assets/grass.png", (Vec3){ (float)x + 1, d1, (float)y }, (Vec3){ (float)x + 1, d2, (float)y - 1 }, (Vec3){ (float)x, d3, (float)y - 1 }, @@ -87,8 +87,8 @@ static void ingame_tick(State *state) { } } - push_skybox("/assets/miramar/miramar_*.tga"); - push_fog(0.9, 1.0, 0.05, (Color){ 140, 147, 160, 255 }); + draw_skybox("/assets/miramar/miramar_*.tga"); + draw_fog(0.9, 1.0, 0.05, (Color){ 140, 147, 160, 255 }); } diff --git a/apps/scenery/scenes/title.c b/apps/scenery/scenes/title.c index 843dd63..90e76af 100644 --- a/apps/scenery/scenes/title.c +++ b/apps/scenery/scenes/title.c @@ -27,9 +27,9 @@ static void title_tick(State *state) { const char *font = "/fonts/kenney-pixel.ttf"; int text_h = 32; - int text_w = text_get_width(text_str, text_h, font); + int text_w = draw_text_width(text_str, text_h, font); - push_rectangle( + draw_rectangle( (Rect) { .x = 0, .y = 0, @@ -38,7 +38,7 @@ static void title_tick(State *state) { }, (Color) { 0, 0, 0, 255 } ); - push_text(text_str, (Vec2){ 0, 0 }, text_h, (Color) { 255, 255, 255, 255 }, font); + draw_text(text_str, (Vec2){ 0, 0 }, text_h, (Color) { 255, 255, 255, 255 }, font); free(text_str); } diff --git a/apps/twnlua/game.c b/apps/twnlua/game.c index 1b039c9..bc8c539 100644 --- a/apps/twnlua/game.c +++ b/apps/twnlua/game.c @@ -108,7 +108,7 @@ static Color table_to_color(lua_State *L, int idx) { static int b_sprite(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); - PushSpriteArgs args = { 0 }; + DrawSpriteArgs args = { 0 }; lua_getfield(L, 1, "path"); const char *field_path = lua_tostring(L, -1); @@ -157,7 +157,7 @@ static int b_sprite(lua_State *L) { args.stretch_opt_set = true; } - push_sprite(args); + draw_sprite_args(args); return 0; } @@ -181,7 +181,7 @@ static int b_rectangle(lua_State *L) { if (lua_istable(L, -1)) color = table_to_color(L, -1); - push_rectangle(rect, color); + draw_rectangle(rect, color); return 0; } @@ -227,7 +227,7 @@ static int b_text(lua_State *L) { if (font == NULL) luaL_error(L, "bad field 'font' in 'data' (string expected, got %s)", luaL_typename(L, -1)); - push_text(string, (Vec2) { x, y }, height_px, color, font); + draw_text(string, (Vec2) { x, y }, height_px, color, font); return 0; } diff --git a/include/twn_draw.h b/include/twn_draw.h new file mode 100644 index 0000000..9eeff65 --- /dev/null +++ b/include/twn_draw.h @@ -0,0 +1,109 @@ +#ifndef TWN_DRAW_H +#define TWN_DRAW_H + +#include "twn_util.h" +#include "twn_option.h" +#include "twn_camera.h" +#include "twn_engine_api.h" + +#include + +/* pushes a sprite onto the sprite render queue */ +TWN_API void draw_sprite(char const *path, + Rect rect, + Rect const *texture_region, /* optional, default: NULL */ + Color color, /* optional, default: all 255 */ + float rotation, /* optional, default: 0 */ + bool flip_x, /* optional, default: false */ + bool flip_y, /* optional, default: false */ + bool stretch); /* optional, default: false */ + +/* pushes a filled rectangle onto the rectangle render queue */ +TWN_API void draw_rectangle(Rect rect, Color color); + +/* pushes a filled circle onto the circle render queue */ +TWN_API void draw_circle(Vec2 position, float radius, Color color); + +/* TODO: have font optional, with something minimal coming embedded */ +TWN_API void draw_text(char const *string, + Vec2 position, + int height_px, /* optional, default: 22 */ + Color color, /* optional, default: all 0 */ + char const *font); + + +TWN_API int draw_text_width(char const *string, + int height_px, /* TODO: make optional */ + char const *font); + +TWN_API void draw_9slice(char const *texture_path, + int texture_w, + int texture_h, + int border_thickness, + Rect rect, + Color color); /* TODO: make optional */ + +/* pushes a textured 3d triangle onto the render queue */ +/* vertices are in absolute coordinates, relative to world origin */ +/* texture coordinates are in pixels */ +TWN_API void draw_triangle(char const *path, + Vec3 v0, + Vec3 v1, + Vec3 v2, + Vec2 uv0, + Vec2 uv1, + Vec2 uv2); + +// TODO: decide whether it's needed to begin with? +// intended usage for it is baked lighting, i would think. +/* pushes a colored textured 3d triangle onto the render queue */ +// void unfurl_colored_triangle(const char *path, +// Vec3 v0, +// Vec3 v1, +// Vec3 v2, +// Vec2sh uv0, +// Vec2sh uv1, +// Vec2sh uv2, +// Color c0, +// Color c1, +// Color c2); + +// TODO: +// http://www.lighthouse3d.com/opengl/billboarding/index.php?billCheat2 +// void unfurl_billboard(const char *path, +// Vec2 position, +// Vec2 scaling, +// Rect uvs); + +/* pushes a camera state to be used for all future unfurl_* commands */ +TWN_API void draw_camera(const Camera *camera); + +/* expects '*' masks that will be expanded to 6 names: 'up', 'down', 'east', 'west', 'north' and 'south' */ +TWN_API void draw_skybox(const char *paths); + +TWN_API void draw_fog(float start, float end, float density, Color color); + + +#ifndef TWN_NOT_C + +typedef struct DrawSpriteArgs { + char const *path; + Rect rect; + + m_option_list( + Rect, texture_region, + Color, color, + float, rotation, + bool, flip_x, + bool, flip_y, + bool, stretch ) +} DrawSpriteArgs; + +TWN_API void draw_sprite_args(DrawSpriteArgs args); +#define m_sprite(...) (draw_sprite_args((DrawSpriteArgs){__VA_ARGS__})) + +/* TODO: define more */ + +#endif /* TWN_NOT_C */ + +#endif diff --git a/include/twn_game_api.h b/include/twn_game_api.h index 6c2b3d1..aadf815 100644 --- a/include/twn_game_api.h +++ b/include/twn_game_api.h @@ -4,7 +4,7 @@ #include "twn_context.h" -#include "twn_rendering.h" +#include "twn_draw.h" #include "twn_audio.h" #include "twn_util.h" #include "twn_input.h" diff --git a/include/twn_rendering.h b/include/twn_rendering.h deleted file mode 100644 index 6972476..0000000 --- a/include/twn_rendering.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef TWN_RENDERING_H -#define TWN_RENDERING_H - -#include "twn_util.h" -#include "twn_option.h" -#include "twn_camera.h" -#include "twn_engine_api.h" - -#include - -typedef struct PushSpriteArgs { - char *path; - Rect rect; - - m_option_list( - Rect, texture_region, - Color, color, - float, rotation, - bool, flip_x, - bool, flip_y, - bool, stretch ) -} PushSpriteArgs; - -/* pushes a sprite onto the sprite render queue */ -/* this is a simplified version of push_sprite_ex for the most common case. */ -/* it assumes you want no color modulation, no rotation, no flip */ -TWN_API void push_sprite(PushSpriteArgs args); -#define m_sprite(...) (push_sprite((PushSpriteArgs){__VA_ARGS__})) - -/* pushes a filled rectangle onto the rectangle render queue */ -TWN_API void push_rectangle(Rect rect, Color color); - -/* pushes a filled circle onto the circle render queue */ -TWN_API void push_circle(Vec2 position, float radius, Color color); - -TWN_API void push_text(char *string, Vec2 position, int height_px, Color color, const char *font); -TWN_API int text_get_width(char *string, int height_px, const char *font); - -TWN_API void push_9slice(char *texture_path, int texture_w, int texture_h, int border_thickness, Rect rect, Color color); - -/* pushes a textured 3d triangle onto the render queue */ -/* vertices are in absolute coordinates, relative to world origin */ -/* texture coordinates are in pixels */ -TWN_API void unfurl_triangle(const char *path, - Vec3 v0, - Vec3 v1, - Vec3 v2, - Vec2 uv0, - Vec2 uv1, - Vec2 uv2); - -// TODO: decide whether it's needed to begin with? -// intended usage for it is baked lighting, i would think. -/* pushes a colored textured 3d triangle onto the render queue */ -// void unfurl_colored_triangle(const char *path, -// Vec3 v0, -// Vec3 v1, -// Vec3 v2, -// Vec2sh uv0, -// Vec2sh uv1, -// Vec2sh uv2, -// Color c0, -// Color c1, -// Color c2); - -// TODO: -// http://www.lighthouse3d.com/opengl/billboarding/index.php?billCheat2 -// void unfurl_billboard(const char *path, -// Vec2 position, -// Vec2 scaling, -// Rect uvs); - -/* pushes a camera state to be used for all future unfurl_* commands */ -TWN_API void set_camera(const Camera *camera); - -/* expects '*' masks that will be expanded to 6 names: 'up', 'down', 'east', 'west', 'north' and 'south' */ -TWN_API void push_skybox(const char *paths); - -TWN_API void push_fog(float start, float end, float density, Color color); - -#endif diff --git a/include/twn_types.h b/include/twn_types.h index 083a2a9..485fe93 100644 --- a/include/twn_types.h +++ b/include/twn_types.h @@ -5,40 +5,6 @@ /* plain data aggregates that are accepted between public procedure boundaries */ -/* 32-bit color data */ -typedef struct Color { -_Alignas(4) - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; -} Color; - - -/* a rectangle with the origin at the upper left (integer) */ -typedef struct Recti { -_Alignas(16) - int32_t x; - int32_t y; - int32_t w; - int32_t h; -} Recti; - - -/* a rectangle with the origin at the upper left (floating point) */ -typedef struct Rect { -_Alignas(16) - float x; - float y; - float w; - float h; -} Rect; - - -typedef struct Matrix4 { - Vec4 row[4]; -} Matrix4; - /* a point in some space (integer) */ typedef struct Vec2i { @@ -77,4 +43,39 @@ _Alignas(16) } Vec4; +/* 32-bit color data */ +typedef struct Color { +_Alignas(4) + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t a; +} Color; + + +/* a rectangle with the origin at the upper left (integer) */ +typedef struct Recti { +_Alignas(16) + int32_t x; + int32_t y; + int32_t w; + int32_t h; +} Recti; + + +/* a rectangle with the origin at the upper left (floating point) */ +typedef struct Rect { +_Alignas(16) + float x; + float y; + float w; + float h; +} Rect; + + +typedef struct Matrix4 { + Vec4 row[4]; +} Matrix4; + + #endif diff --git a/src/rendering/twn_circles.c b/src/rendering/twn_circles.c index 3ac0178..ec715a5 100644 --- a/src/rendering/twn_circles.c +++ b/src/rendering/twn_circles.c @@ -1,13 +1,13 @@ #include "twn_util.h" #include "twn_engine_context_c.h" -#include "twn_rendering_c.h" -#include "twn_rendering.h" +#include "twn_draw_c.h" +#include "twn_draw.h" #include #include -void push_circle(Vec2 position, float radius, Color color) { +void draw_circle(Vec2 position, float radius, Color color) { CirclePrimitive circle = { .radius = radius, .color = color, @@ -25,11 +25,11 @@ void push_circle(Vec2 position, float radius, Color color) { /* TODO: caching and reuse scheme */ /* vertices_out and indices_out MUST BE FREED */ void create_circle_geometry(Vec2 position, - Color color, - float radius, - size_t num_vertices, - SDL_Vertex **vertices_out, - int **indices_out) + Color color, + float radius, + size_t num_vertices, + SDL_Vertex **vertices_out, + int **indices_out) { SDL_Vertex *vertices = cmalloc(sizeof *vertices * (num_vertices + 1)); int *indices = cmalloc(sizeof *indices * (num_vertices * 3)); diff --git a/src/rendering/twn_rendering.c b/src/rendering/twn_draw.c similarity index 96% rename from src/rendering/twn_rendering.c rename to src/rendering/twn_draw.c index 6408a9a..648b4c6 100644 --- a/src/rendering/twn_rendering.c +++ b/src/rendering/twn_draw.c @@ -1,7 +1,8 @@ -#include "twn_rendering_c.h" -#include "twn_rendering.h" +#include "twn_draw_c.h" +#include "twn_draw.h" #include "twn_engine_context_c.h" #include "twn_camera.h" +#include "twn_types.h" #include #include @@ -35,7 +36,7 @@ void render_queue_clear(void) { /* rectangle */ -void push_rectangle(Rect rect, Color color) { +void draw_rectangle(Rect rect, Color color) { RectPrimitive rectangle = { .rect = rect, .color = color, @@ -50,7 +51,7 @@ void push_rectangle(Rect rect, Color color) { } -void push_9slice(char *texture_path, int texture_w, int texture_h, int border_thickness, Rect rect, Color color) { +void draw_9slice(const char *texture_path, int texture_w, int texture_h, int border_thickness, Rect rect, Color color) { const float bt = (float)border_thickness; /* i know! */ const float bt2 = bt * 2; /* combined size of the two borders in an axis */ @@ -279,7 +280,7 @@ void render(void) { } -void set_camera(const Camera *const camera) { +void draw_camera(const Camera *const camera) { /* TODO: skip recaulculating if it's the same? */ camera_projection_matrix = camera_perspective(camera); camera_look_at_matrix = camera_look_at(camera); diff --git a/src/rendering/twn_rendering_c.h b/src/rendering/twn_draw_c.h similarity index 99% rename from src/rendering/twn_rendering_c.h rename to src/rendering/twn_draw_c.h index 96f072d..05a6380 100644 --- a/src/rendering/twn_rendering_c.h +++ b/src/rendering/twn_draw_c.h @@ -1,5 +1,5 @@ -#ifndef TWN_RENDERING_C_H -#define TWN_RENDERING_C_H +#ifndef TWN_DRAW_C_H +#define TWN_DRAW_C_H #include "twn_textures_c.h" #include "twn_text_c.h" diff --git a/src/rendering/twn_fog.c b/src/rendering/twn_fog.c index 4beec7c..fdf9eef 100644 --- a/src/rendering/twn_fog.c +++ b/src/rendering/twn_fog.c @@ -1,5 +1,5 @@ -#include "twn_rendering.h" -#include "twn_rendering_c.h" +#include "twn_draw.h" +#include "twn_draw_c.h" #include "twn_util.h" #include @@ -9,7 +9,7 @@ static Color color_cache; static bool fog_used = false; -void push_fog(float start, float end, float density, Color color) { +void draw_fog(float start, float end, float density, Color color) { start_cache = start; end_cache = end; density_cache = density; diff --git a/src/rendering/twn_gl_15_rendering.c b/src/rendering/twn_gl_15_rendering.c index 87e33ec..5afd1bf 100644 --- a/src/rendering/twn_gl_15_rendering.c +++ b/src/rendering/twn_gl_15_rendering.c @@ -1,4 +1,4 @@ -#include "twn_rendering_c.h" +#include "twn_draw_c.h" #include "twn_util.h" #include "twn_util_c.h" #include "twn_config.h" diff --git a/src/rendering/twn_gl_any_rendering.c b/src/rendering/twn_gl_any_rendering.c index 0af4320..fbd213d 100644 --- a/src/rendering/twn_gl_any_rendering.c +++ b/src/rendering/twn_gl_any_rendering.c @@ -1,4 +1,4 @@ -#include "twn_rendering_c.h" +#include "twn_draw_c.h" #include "twn_engine_context_c.h" #include "twn_util.h" diff --git a/src/rendering/twn_skybox.c b/src/rendering/twn_skybox.c index 94a719c..07031f1 100644 --- a/src/rendering/twn_skybox.c +++ b/src/rendering/twn_skybox.c @@ -1,11 +1,11 @@ -#include "twn_rendering.h" -#include "twn_rendering_c.h" +#include "twn_draw.h" +#include "twn_draw_c.h" #include char *paths_in_use; -void push_skybox(const char *paths) { +void draw_skybox(const char *paths) { if (paths_in_use && SDL_strcmp(paths, paths_in_use) == 0) return; diff --git a/src/rendering/twn_sprites.c b/src/rendering/twn_sprites.c index 7454e87..ac099e3 100644 --- a/src/rendering/twn_sprites.c +++ b/src/rendering/twn_sprites.c @@ -1,9 +1,10 @@ -#include "twn_rendering.h" -#include "twn_rendering_c.h" +#include "twn_draw.h" +#include "twn_draw_c.h" #include "twn_engine_context_c.h" #include "twn_util.h" #include "twn_util_c.h" #include "twn_textures_c.h" +#include "twn_option.h" #include @@ -16,20 +17,29 @@ * because they will be called multiple times in the main loop * before anything is really rendered */ -/* TODO: it might make sense to infer alpha channel presence / meaningfulness for textures in atlas */ -/* so that they are rendered with no blend / batched in a way to reduce overdraw automatically */ -void push_sprite(const PushSpriteArgs args) { +void draw_sprite(char const *path, + Rect rect, + Rect const *texture_region, /* optional, default: NULL */ + Color color, /* optional, default: all 255 */ + float rotation, /* optional, default: 0 */ + bool flip_x, /* optional, default: false */ + bool flip_y, /* optional, default: false */ + bool stretch) +{ SpritePrimitive sprite = { - .rect = args.rect, - .color = m_or(args, color, ((Color) { 255, 255, 255, 255 })), - .rotation = m_or(args, rotation, 0.0f), - .texture_key = textures_get_key(&ctx.texture_cache, args.path), - .flip_x = m_or(args, flip_x, false), - .flip_y = m_or(args, flip_y, false), - .repeat = !m_or(args, stretch, true), - m_opt_from(texture_region, args, texture_region) + .rect = rect, + .color = color, + .rotation = rotation, + .texture_key = textures_get_key(&ctx.texture_cache, path), + .flip_x = flip_x, + .flip_y = flip_y, + .repeat = !stretch, + .texture_region_opt_set = texture_region != NULL, }; + if (texture_region) + sprite.texture_region_opt = *texture_region; + Primitive2D primitive = { .type = PRIMITIVE_2D_SPRITE, .sprite = sprite, @@ -38,6 +48,17 @@ void push_sprite(const PushSpriteArgs args) { arrput(ctx.render_queue_2d, primitive); } +void draw_sprite_args(const DrawSpriteArgs args) { + Color const color = m_or(args, color, ((Color) { 255, 255, 255, 255 })); + float const rotation = m_or(args, rotation, 0.0f); + bool const flip_x = m_or(args, flip_x, false); + bool const flip_y = m_or(args, flip_y, false); + bool const stretch = m_or(args, stretch, false); + Rect const *texture_region = m_is_set(args, texture_region) ? &args.texture_region_opt : NULL; + + draw_sprite(args.path, args.rect, texture_region, color, rotation, flip_x, flip_y, stretch); +} + struct SpriteBatch collect_sprite_batch(const Primitive2D primitives[], size_t len) { /* assumes that first primitive is already a sprite */ diff --git a/src/rendering/twn_text.c b/src/rendering/twn_text.c index d5af71c..c54d57b 100644 --- a/src/rendering/twn_text.c +++ b/src/rendering/twn_text.c @@ -1,5 +1,5 @@ -#include "twn_rendering_c.h" -#include "twn_rendering.h" +#include "twn_draw_c.h" +#include "twn_draw.h" #include "twn_util.h" #include "twn_config.h" #include "twn_engine_context_c.h" @@ -248,7 +248,7 @@ void text_cache_reset_arena(TextCache *cache) { } -void push_text(char *string, Vec2 position, int height_px, Color color, const char *font_path) { +void draw_text(const char *string, Vec2 position, int height_px, Color color, const char *font_path) { ensure_font_cache(font_path, height_px); /* the original string might not be around by the time it's used, so copy it */ @@ -273,7 +273,7 @@ void push_text(char *string, Vec2 position, int height_px, Color color, const ch } -int text_get_width(char *string, int height_px, const char *font_path) { +int draw_text_width(const char *string, int height_px, const char *font_path) { ensure_font_cache(font_path, height_px); FontData *font_data = get_font_data(font_path, height_px); diff --git a/src/rendering/twn_triangles.c b/src/rendering/twn_triangles.c index a5c0360..fd6f9d7 100644 --- a/src/rendering/twn_triangles.c +++ b/src/rendering/twn_triangles.c @@ -1,20 +1,21 @@ -#include "twn_rendering.h" -#include "twn_rendering_c.h" +#include "twn_draw.h" +#include "twn_draw_c.h" #include "twn_engine_context_c.h" #include "twn_textures_c.h" +#include "twn_types.h" #include /* TODO: automatic handling of repeating textures */ /* for that we could allocate a loner texture */ -void unfurl_triangle(const char *path, - Vec3 v0, - Vec3 v1, - Vec3 v2, - Vec2 uv0, - Vec2 uv1, - Vec2 uv2) +void draw_triangle(const char *path, + Vec3 v0, + Vec3 v1, + Vec3 v2, + Vec2 uv0, + Vec2 uv1, + Vec2 uv2) { const TextureKey texture_key = textures_get_key(&ctx.texture_cache, path); diff --git a/src/twn_engine_context_c.h b/src/twn_engine_context_c.h index 496b929..398cc5b 100644 --- a/src/twn_engine_context_c.h +++ b/src/twn_engine_context_c.h @@ -5,7 +5,7 @@ #include "twn_textures_c.h" #include "twn_audio_c.h" #include "twn_engine_api.h" -#include "rendering/twn_rendering_c.h" +#include "rendering/twn_draw_c.h" #include #include