twn_rendering -> twn_draw
This commit is contained in:
		| @@ -99,7 +99,7 @@ set(TWN_SOURCE_FILES | |||||||
|         src/twn_camera.c include/twn_camera.h |         src/twn_camera.c include/twn_camera.h | ||||||
|         src/twn_textures.c src/twn_textures_c.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_sprites.c | ||||||
|         src/rendering/twn_text.c |         src/rendering/twn_text.c | ||||||
|         src/rendering/twn_triangles.c |         src/rendering/twn_triangles.c | ||||||
|   | |||||||
| @@ -252,7 +252,7 @@ static void drawdef(Player *player) { | |||||||
|                 .h = player->sprite_h, |                 .h = player->sprite_h, | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|     push_circle((Vec2) { 256, 128 }, |     draw_circle((Vec2) { 256, 128 }, | ||||||
|                 24, |                 24, | ||||||
|                 (Color) { 255, 0, 0, 255 }); |                 (Color) { 255, 0, 0, 255 }); | ||||||
| } | } | ||||||
| @@ -268,10 +268,10 @@ static void drawdef_debug(Player *player) { | |||||||
|     /*  .r = 0, .g = 0, .b = 0, .a = 255, */ |     /*  .r = 0, .g = 0, .b = 0, .a = 255, */ | ||||||
|     /* }; */ |     /* }; */ | ||||||
|  |  | ||||||
|     push_rectangle(player->collider_x, |     draw_rectangle(player->collider_x, | ||||||
|                    (Color){ 0, 0, 255, 128 }); |                    (Color){ 0, 0, 255, 128 }); | ||||||
|  |  | ||||||
|     push_rectangle(player->collider_y, |     draw_rectangle(player->collider_y, | ||||||
|                    (Color){ 0, 0, 255, 128 }); |                    (Color){ 0, 0, 255, 128 }); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -30,9 +30,9 @@ static void title_tick(State *state) { | |||||||
|  |  | ||||||
|     const char *font = "fonts/kenney-pixel.ttf"; |     const char *font = "fonts/kenney-pixel.ttf"; | ||||||
|     int text_h = 32; |     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) { |         (Rect) { | ||||||
|             .x = 0, |             .x = 0, | ||||||
|             .y = 0, |             .y = 0, | ||||||
| @@ -41,7 +41,7 @@ static void title_tick(State *state) { | |||||||
|         }, |         }, | ||||||
|         (Color) { 0, 0, 0, 255 } |         (Color) { 0, 0, 0, 255 } | ||||||
|     ); |     ); | ||||||
|     push_text( |     draw_text( | ||||||
|         text_str, |         text_str, | ||||||
|         (Vec2){ 0, 0 }, |         (Vec2){ 0, 0 }, | ||||||
|         text_h, |         text_h, | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ static void drawdef_debug(struct World *world) { | |||||||
|     for (size_t i = 0; i < world->tilemap_height * world->tilemap_width; ++i) { |     for (size_t i = 0; i < world->tilemap_height * world->tilemap_width; ++i) { | ||||||
|         if (world->tiles[i].type == TILE_TYPE_VOID) continue; |         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 }); |                         (Color) { 255, 0, 255, 128 }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -55,7 +55,7 @@ static void ingame_tick(State *state) { | |||||||
|         input_set_mouse_captured(&ctx.input, !input_is_mouse_captured(&ctx.input)); |         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 |     #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 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; |             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,     d0, (float)y }, | ||||||
|                             (Vec3){ (float)x + 1, d1, (float)y }, |                             (Vec3){ (float)x + 1, d1, (float)y }, | ||||||
|                             (Vec3){ (float)x,     d3, (float)y - 1 }, |                             (Vec3){ (float)x,     d3, (float)y - 1 }, | ||||||
| @@ -77,7 +77,7 @@ static void ingame_tick(State *state) { | |||||||
|                             (Vec2){ 128, 0 }, |                             (Vec2){ 128, 0 }, | ||||||
|                             (Vec2){ 0, 128 }); |                             (Vec2){ 0, 128 }); | ||||||
|  |  | ||||||
|             unfurl_triangle("/assets/grass.png", |             draw_triangle("/assets/grass.png", | ||||||
|                             (Vec3){ (float)x + 1, d1, (float)y }, |                             (Vec3){ (float)x + 1, d1, (float)y }, | ||||||
|                             (Vec3){ (float)x + 1, d2, (float)y - 1 }, |                             (Vec3){ (float)x + 1, d2, (float)y - 1 }, | ||||||
|                             (Vec3){ (float)x,     d3, (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"); |     draw_skybox("/assets/miramar/miramar_*.tga"); | ||||||
|     push_fog(0.9, 1.0, 0.05, (Color){ 140, 147, 160, 255 }); |     draw_fog(0.9, 1.0, 0.05, (Color){ 140, 147, 160, 255 }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -27,9 +27,9 @@ static void title_tick(State *state) { | |||||||
|  |  | ||||||
|     const char *font = "/fonts/kenney-pixel.ttf"; |     const char *font = "/fonts/kenney-pixel.ttf"; | ||||||
|     int text_h = 32; |     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) { |         (Rect) { | ||||||
|             .x = 0, |             .x = 0, | ||||||
|             .y = 0, |             .y = 0, | ||||||
| @@ -38,7 +38,7 @@ static void title_tick(State *state) { | |||||||
|         }, |         }, | ||||||
|         (Color) { 0, 0, 0, 255 } |         (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); |     free(text_str); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -108,7 +108,7 @@ static Color table_to_color(lua_State *L, int idx) { | |||||||
| static int b_sprite(lua_State *L) { | static int b_sprite(lua_State *L) { | ||||||
|     luaL_checktype(L, 1, LUA_TTABLE); |     luaL_checktype(L, 1, LUA_TTABLE); | ||||||
|  |  | ||||||
|     PushSpriteArgs args = { 0 }; |     DrawSpriteArgs args = { 0 }; | ||||||
|  |  | ||||||
|     lua_getfield(L, 1, "path"); |     lua_getfield(L, 1, "path"); | ||||||
|     const char *field_path = lua_tostring(L, -1); |     const char *field_path = lua_tostring(L, -1); | ||||||
| @@ -157,7 +157,7 @@ static int b_sprite(lua_State *L) { | |||||||
|         args.stretch_opt_set = true; |         args.stretch_opt_set = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     push_sprite(args); |     draw_sprite_args(args); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -181,7 +181,7 @@ static int b_rectangle(lua_State *L) { | |||||||
|     if (lua_istable(L, -1)) |     if (lua_istable(L, -1)) | ||||||
|         color = table_to_color(L, -1); |         color = table_to_color(L, -1); | ||||||
|  |  | ||||||
|     push_rectangle(rect, color); |     draw_rectangle(rect, color); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -227,7 +227,7 @@ static int b_text(lua_State *L) { | |||||||
|     if (font == NULL) |     if (font == NULL) | ||||||
|         luaL_error(L, "bad field 'font' in 'data' (string expected, got %s)", luaL_typename(L, -1)); |         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; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										109
									
								
								include/twn_draw.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								include/twn_draw.h
									
									
									
									
									
										Normal file
									
								
							| @@ -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 <stdbool.h> | ||||||
|  |  | ||||||
|  | /* 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 | ||||||
| @@ -4,7 +4,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| #include "twn_context.h" | #include "twn_context.h" | ||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_audio.h" | #include "twn_audio.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
| #include "twn_input.h" | #include "twn_input.h" | ||||||
|   | |||||||
| @@ -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 <stdbool.h> |  | ||||||
|  |  | ||||||
| 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 |  | ||||||
| @@ -5,40 +5,6 @@ | |||||||
|  |  | ||||||
| /* plain data aggregates that are accepted between public procedure boundaries */ | /* 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) */ | /* a point in some space (integer) */ | ||||||
| typedef struct Vec2i { | typedef struct Vec2i { | ||||||
| @@ -77,4 +43,39 @@ _Alignas(16) | |||||||
| } Vec4; | } 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 | #endif | ||||||
|   | |||||||
| @@ -1,13 +1,13 @@ | |||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
| #include "twn_engine_context_c.h" | #include "twn_engine_context_c.h" | ||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
|  |  | ||||||
| #include <SDL2/SDL.h> | #include <SDL2/SDL.h> | ||||||
| #include <stb_ds.h> | #include <stb_ds.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| void push_circle(Vec2 position, float radius, Color color) { | void draw_circle(Vec2 position, float radius, Color color) { | ||||||
|     CirclePrimitive circle = { |     CirclePrimitive circle = { | ||||||
|         .radius = radius, |         .radius = radius, | ||||||
|         .color = color, |         .color = color, | ||||||
| @@ -25,11 +25,11 @@ void push_circle(Vec2 position, float radius, Color color) { | |||||||
| /* TODO: caching and reuse scheme */ | /* TODO: caching and reuse scheme */ | ||||||
| /* vertices_out and indices_out MUST BE FREED */ | /* vertices_out and indices_out MUST BE FREED */ | ||||||
| void create_circle_geometry(Vec2 position, | void create_circle_geometry(Vec2 position, | ||||||
|                                    Color color, |                             Color color, | ||||||
|                                    float radius, |                             float radius, | ||||||
|                                    size_t num_vertices, |                             size_t num_vertices, | ||||||
|                                    SDL_Vertex **vertices_out, |                             SDL_Vertex **vertices_out, | ||||||
|                                    int **indices_out) |                             int **indices_out) | ||||||
| { | { | ||||||
|     SDL_Vertex *vertices = cmalloc(sizeof *vertices * (num_vertices + 1)); |     SDL_Vertex *vertices = cmalloc(sizeof *vertices * (num_vertices + 1)); | ||||||
|     int *indices = cmalloc(sizeof *indices * (num_vertices * 3)); |     int *indices = cmalloc(sizeof *indices * (num_vertices * 3)); | ||||||
|   | |||||||
| @@ -1,7 +1,8 @@ | |||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_engine_context_c.h" | #include "twn_engine_context_c.h" | ||||||
| #include "twn_camera.h" | #include "twn_camera.h" | ||||||
|  | #include "twn_types.h" | ||||||
| 
 | 
 | ||||||
| #include <SDL2/SDL.h> | #include <SDL2/SDL.h> | ||||||
| #include <stb_ds.h> | #include <stb_ds.h> | ||||||
| @@ -35,7 +36,7 @@ void render_queue_clear(void) { | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* rectangle */ | /* rectangle */ | ||||||
| void push_rectangle(Rect rect, Color color) { | void draw_rectangle(Rect rect, Color color) { | ||||||
|     RectPrimitive rectangle = { |     RectPrimitive rectangle = { | ||||||
|         .rect = rect, |         .rect = rect, | ||||||
|         .color = color, |         .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 bt = (float)border_thickness; /* i know! */ | ||||||
|     const float bt2 = bt * 2; /* combined size of the two borders in an axis */ |     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? */ |     /* TODO: skip recaulculating if it's the same? */ | ||||||
|     camera_projection_matrix = camera_perspective(camera); |     camera_projection_matrix = camera_perspective(camera); | ||||||
|     camera_look_at_matrix    = camera_look_at(camera); |     camera_look_at_matrix    = camera_look_at(camera); | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| #ifndef TWN_RENDERING_C_H | #ifndef TWN_DRAW_C_H | ||||||
| #define TWN_RENDERING_C_H | #define TWN_DRAW_C_H | ||||||
| 
 | 
 | ||||||
| #include "twn_textures_c.h" | #include "twn_textures_c.h" | ||||||
| #include "twn_text_c.h" | #include "twn_text_c.h" | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
|  |  | ||||||
| #include <stdbool.h> | #include <stdbool.h> | ||||||
| @@ -9,7 +9,7 @@ static Color color_cache; | |||||||
| static bool fog_used = false; | 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; |     start_cache = start; | ||||||
|     end_cache = end; |     end_cache = end; | ||||||
|     density_cache = density; |     density_cache = density; | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
| #include "twn_util_c.h" | #include "twn_util_c.h" | ||||||
| #include "twn_config.h" | #include "twn_config.h" | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_engine_context_c.h" | #include "twn_engine_context_c.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,11 +1,11 @@ | |||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
|  |  | ||||||
| #include <SDL2/SDL.h> | #include <SDL2/SDL.h> | ||||||
|  |  | ||||||
| char *paths_in_use; | 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) |     if (paths_in_use && SDL_strcmp(paths, paths_in_use) == 0) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,10 @@ | |||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_engine_context_c.h" | #include "twn_engine_context_c.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
| #include "twn_util_c.h" | #include "twn_util_c.h" | ||||||
| #include "twn_textures_c.h" | #include "twn_textures_c.h" | ||||||
|  | #include "twn_option.h" | ||||||
|  |  | ||||||
| #include <stb_ds.h> | #include <stb_ds.h> | ||||||
|  |  | ||||||
| @@ -16,20 +17,29 @@ | |||||||
|  * because they will be called multiple times in the main loop |  * because they will be called multiple times in the main loop | ||||||
|  * before anything is really rendered |  * before anything is really rendered | ||||||
|  */ |  */ | ||||||
| /* TODO: it might make sense to infer alpha channel presence / meaningfulness for textures in atlas */ | void draw_sprite(char const *path, | ||||||
| /*          so that they are rendered with no blend / batched in a way to reduce overdraw automatically */ |                  Rect        rect, | ||||||
| void push_sprite(const PushSpriteArgs args) { |                  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 = { |     SpritePrimitive sprite = { | ||||||
|         .rect = args.rect, |         .rect = rect, | ||||||
|         .color = m_or(args, color, ((Color) { 255, 255, 255, 255 })), |         .color = color, | ||||||
|         .rotation = m_or(args, rotation, 0.0f), |         .rotation = rotation, | ||||||
|         .texture_key = textures_get_key(&ctx.texture_cache, args.path), |         .texture_key = textures_get_key(&ctx.texture_cache, path), | ||||||
|         .flip_x = m_or(args, flip_x, false), |         .flip_x = flip_x, | ||||||
|         .flip_y = m_or(args, flip_y, false), |         .flip_y = flip_y, | ||||||
|         .repeat = !m_or(args, stretch, true), |         .repeat = !stretch, | ||||||
|         m_opt_from(texture_region, args, texture_region) |         .texture_region_opt_set = texture_region != NULL, | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     if (texture_region) | ||||||
|  |         sprite.texture_region_opt = *texture_region; | ||||||
|  |  | ||||||
|     Primitive2D primitive = { |     Primitive2D primitive = { | ||||||
|         .type = PRIMITIVE_2D_SPRITE, |         .type = PRIMITIVE_2D_SPRITE, | ||||||
|         .sprite = sprite, |         .sprite = sprite, | ||||||
| @@ -38,6 +48,17 @@ void push_sprite(const PushSpriteArgs args) { | |||||||
|     arrput(ctx.render_queue_2d, primitive); |     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) { | struct SpriteBatch collect_sprite_batch(const Primitive2D primitives[], size_t len) { | ||||||
|     /* assumes that first primitive is already a sprite */ |     /* assumes that first primitive is already a sprite */ | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_util.h" | #include "twn_util.h" | ||||||
| #include "twn_config.h" | #include "twn_config.h" | ||||||
| #include "twn_engine_context_c.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); |     ensure_font_cache(font_path, height_px); | ||||||
|  |  | ||||||
|     /* the original string might not be around by the time it's used, so copy it */ |     /* 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); |     ensure_font_cache(font_path, height_px); | ||||||
|     FontData *font_data = get_font_data(font_path, height_px); |     FontData *font_data = get_font_data(font_path, height_px); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,20 +1,21 @@ | |||||||
| #include "twn_rendering.h" | #include "twn_draw.h" | ||||||
| #include "twn_rendering_c.h" | #include "twn_draw_c.h" | ||||||
| #include "twn_engine_context_c.h" | #include "twn_engine_context_c.h" | ||||||
| #include "twn_textures_c.h" | #include "twn_textures_c.h" | ||||||
|  | #include "twn_types.h" | ||||||
|  |  | ||||||
| #include <stb_ds.h> | #include <stb_ds.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| /* TODO: automatic handling of repeating textures */ | /* TODO: automatic handling of repeating textures */ | ||||||
| /*       for that we could allocate a loner texture */ | /*       for that we could allocate a loner texture */ | ||||||
| void unfurl_triangle(const char *path, | void draw_triangle(const char *path, | ||||||
|                      Vec3 v0, |                    Vec3 v0, | ||||||
|                      Vec3 v1, |                    Vec3 v1, | ||||||
|                      Vec3 v2, |                    Vec3 v2, | ||||||
|                      Vec2 uv0, |                    Vec2 uv0, | ||||||
|                      Vec2 uv1, |                    Vec2 uv1, | ||||||
|                      Vec2 uv2) |                    Vec2 uv2) | ||||||
| { | { | ||||||
|     const TextureKey texture_key = textures_get_key(&ctx.texture_cache, path); |     const TextureKey texture_key = textures_get_key(&ctx.texture_cache, path); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ | |||||||
| #include "twn_textures_c.h" | #include "twn_textures_c.h" | ||||||
| #include "twn_audio_c.h" | #include "twn_audio_c.h" | ||||||
| #include "twn_engine_api.h" | #include "twn_engine_api.h" | ||||||
| #include "rendering/twn_rendering_c.h" | #include "rendering/twn_draw_c.h" | ||||||
|  |  | ||||||
| #include <SDL2/SDL.h> | #include <SDL2/SDL.h> | ||||||
| #include <toml.h> | #include <toml.h> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user