Draw params into struct

main
parent acdab05932
commit 28ede282b7

@ -941,26 +941,35 @@ void flush_quad_batch()
cur_batch_data_index = 0; cur_batch_data_index = 0;
} }
typedef struct DrawParams
{
bool world_space;
Quad quad;
sg_image image;
AABB image_region;
Color tint;
} DrawParams;
// The image region is in pixel space of the image // The image region is in pixel space of the image
void draw_quad(bool world_space, Quad quad, sg_image image, AABB image_region, Color tint) void draw_quad(DrawParams d)
{ {
quad_fs_params_t params = {0}; quad_fs_params_t params = {0};
params.tint[0] = tint.R; params.tint[0] = d.tint.R;
params.tint[1] = tint.G; params.tint[1] = d.tint.G;
params.tint[2] = tint.B; params.tint[2] = d.tint.B;
params.tint[3] = tint.A; params.tint[3] = d.tint.A;
// if the rendering call is different, and the batch must be flushed // if the rendering call is different, and the batch must be flushed
if(image.id != cur_batch_image.id || memcmp(&params,&cur_batch_params,sizeof(params)) != 0 ) if(d.image.id != cur_batch_image.id || memcmp(&params,&cur_batch_params,sizeof(params)) != 0 )
{ {
flush_quad_batch(); flush_quad_batch();
cur_batch_image = image; cur_batch_image = d.image;
cur_batch_params = params; cur_batch_params = params;
} }
Vec2 *points = quad.points; Vec2 *points = d.quad.points;
if(world_space) if(d.world_space)
{ {
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
{ {
@ -988,19 +997,19 @@ void draw_quad(bool world_space, Quad quad, sg_image image, AABB image_region, C
} }
float new_vertices[ (2 + 2)*4 ]; float new_vertices[ (2 + 2)*4 ];
Vec2 region_size = SubV2(image_region.lower_right, image_region.upper_left); Vec2 region_size = SubV2(d.image_region.lower_right, d.image_region.upper_left);
assert(region_size.X > 0.0); assert(region_size.X > 0.0);
assert(region_size.Y > 0.0); assert(region_size.Y > 0.0);
Vec2 tex_coords[4] = Vec2 tex_coords[4] =
{ {
AddV2(image_region.upper_left, V2(0.0, 0.0)), AddV2(d.image_region.upper_left, V2(0.0, 0.0)),
AddV2(image_region.upper_left, V2(region_size.X, 0.0)), AddV2(d.image_region.upper_left, V2(region_size.X, 0.0)),
AddV2(image_region.upper_left, V2(region_size.X, region_size.Y)), AddV2(d.image_region.upper_left, V2(region_size.X, region_size.Y)),
AddV2(image_region.upper_left, V2(0.0, region_size.Y)), AddV2(d.image_region.upper_left, V2(0.0, region_size.Y)),
}; };
// convert to uv space // convert to uv space
sg_image_info info = sg_query_image_info(image); sg_image_info info = sg_query_image_info(d.image);
for(int i = 0; i < 4; i++) for(int i = 0; i < 4; i++)
{ {
tex_coords[i] = DivV2(tex_coords[i], V2((float)info.width, (float)info.height)); tex_coords[i] = DivV2(tex_coords[i], V2((float)info.width, (float)info.height));
@ -1021,7 +1030,7 @@ void draw_quad(bool world_space, Quad quad, sg_image image, AABB image_region, C
if(cur_batch_data_index + total_size >= ARRLEN(cur_batch_data)) if(cur_batch_data_index + total_size >= ARRLEN(cur_batch_data))
{ {
flush_quad_batch(); flush_quad_batch();
cur_batch_image = image; cur_batch_image = d.image;
cur_batch_params = params; cur_batch_params = params;
} }
@ -1070,7 +1079,7 @@ void draw_animated_sprite(AnimatedSprite *s, double elapsed_time, bool flipped,
region.upper_left = AddV2(s->start, V2(index * s->horizontal_diff_btwn_frames, 0.0f)); region.upper_left = AddV2(s->start, V2(index * s->horizontal_diff_btwn_frames, 0.0f));
region.lower_right = V2(region.upper_left.X + (float)s->region_size.X, (float)s->region_size.Y); region.lower_right = V2(region.upper_left.X + (float)s->region_size.X, (float)s->region_size.Y);
draw_quad(true, q, spritesheet_img, region, tint); draw_quad((DrawParams){true, q, spritesheet_img, region, tint});
} }
@ -1087,7 +1096,7 @@ Vec2 tile_id_to_coord(sg_image tileset_image, Vec2 tile_size, uint16_t tile_id)
void colorquad(bool world_space, Quad q, Color col) void colorquad(bool world_space, Quad q, Color col)
{ {
draw_quad(world_space, q, image_white_square, full_region(image_white_square), col); draw_quad((DrawParams){world_space, q, image_white_square, full_region(image_white_square), col});
} }
void dbgsquare(Vec2 at) void dbgsquare(Vec2 at)
@ -1203,7 +1212,7 @@ AABB draw_text(bool world_space, bool dry_run, const char *text, Vec2 pos, Color
if(!dry_run) if(!dry_run)
{ {
draw_quad(world_space, to_draw, image_font, font_atlas_region, color); draw_quad((DrawParams){world_space, to_draw, image_font, font_atlas_region, color});
} }
} }
} }
@ -1391,7 +1400,7 @@ void frame(void)
sg_image img = image_wonky_mystery_tile; sg_image img = image_wonky_mystery_tile;
AABB region = full_region(img); AABB region = full_region(img);
//region.lower_right.X *= 0.5f; //region.lower_right.X *= 0.5f;
draw_quad(false,quad_at(V2(0.0, 100.0), V2(100.0f, 100.0f)), img, region, WHITE); draw_quad((DrawParams){false,quad_at(V2(0.0, 100.0), V2(100.0f, 100.0f)), img, region, WHITE});
sg_end_pass(); sg_end_pass();
sg_commit(); sg_commit();
@ -1463,7 +1472,7 @@ void frame(void)
region.upper_left = tile_image_coord; region.upper_left = tile_image_coord;
region.lower_right = AddV2(region.upper_left, tile_size); region.lower_right = AddV2(region.upper_left, tile_size);
draw_quad(true, tile_quad(cur_coord), tileset_image, region, WHITE); draw_quad((DrawParams){true, tile_quad(cur_coord), tileset_image, region, WHITE});
} }
} }
} }
@ -1485,7 +1494,7 @@ void frame(void)
// debug draw font image // debug draw font image
{ {
draw_quad(true, quad_centered(V2(0.0, 0.0), V2(250.0, 250.0)), image_font,full_region(image_font), WHITE); draw_quad((DrawParams){true, quad_centered(V2(0.0, 0.0), V2(250.0, 250.0)), image_font,full_region(image_font), WHITE});
} }
// statistics // statistics
@ -1511,7 +1520,7 @@ void frame(void)
if(it->gen_request_id != 0) if(it->gen_request_id != 0)
{ {
assert(it->gen_request_id > 0); assert(it->gen_request_id > 0);
draw_quad(true, quad_centered(AddV2(it->pos, V2(0.0, 50.0)), V2(100.0,100.0)), IMG(image_thinking), WHITE); draw_quad((DrawParams){true, quad_centered(AddV2(it->pos, V2(0.0, 50.0)), V2(100.0,100.0)), IMG(image_thinking), WHITE});
int status = EM_ASM_INT({ int status = EM_ASM_INT({
return get_generation_request_status($0); return get_generation_request_status($0);
}, it->gen_request_id); }, it->gen_request_id);
@ -1587,7 +1596,7 @@ void frame(void)
else if (it->kind == ENTITY_BULLET) else if (it->kind == ENTITY_BULLET)
{ {
it->pos = AddV2(it->pos, MulV2F(it->vel, pixels_per_meter * dt)); it->pos = AddV2(it->pos, MulV2F(it->vel, pixels_per_meter * dt));
draw_quad(true, quad_aabb(entity_aabb(it)), image_white_square, full_region(image_white_square), WHITE); draw_quad((DrawParams){true, quad_aabb(entity_aabb(it)), image_white_square, full_region(image_white_square), WHITE});
Overlapping over = get_overlapping(cur_level, entity_aabb(it)); Overlapping over = get_overlapping(cur_level, entity_aabb(it));
Entity *from_bullet = it; Entity *from_bullet = it;
BUFF_ITER(Overlap, &over) if(it->e != from_bullet) BUFF_ITER(Overlap, &over) if(it->e != from_bullet)
@ -1651,7 +1660,7 @@ void frame(void)
// if somebody, show their dialog panel // if somebody, show their dialog panel
if(talking_to) { if(talking_to) {
// talking to them feedback // talking to them feedback
draw_quad(true, quad_centered(talking_to->pos, V2(TILE_SIZE, TILE_SIZE)), image_dialog_circle, full_region(image_dialog_circle), WHITE); draw_quad((DrawParams){true, quad_centered(talking_to->pos, V2(TILE_SIZE, TILE_SIZE)), image_dialog_circle, full_region(image_dialog_circle), WHITE});
float panel_width = 250.0f; float panel_width = 250.0f;
float panel_height = 150.0f; float panel_height = 150.0f;
float panel_vert_offset = 30.0f; float panel_vert_offset = 30.0f;
@ -1830,7 +1839,7 @@ void frame(void)
} }
else else
{ {
draw_quad(false, (Quad){.ul=V2(0.0f, screen_size().Y), .ur = screen_size(), .lr = V2(screen_size().X, 0.0f)}, image_hurt_vignette, full_region(image_hurt_vignette), (Color){1.0f, 1.0f, 1.0f, player->damage}); draw_quad((DrawParams){false, (Quad){.ul=V2(0.0f, screen_size().Y), .ur = screen_size(), .lr = V2(screen_size().X, 0.0f)}, image_hurt_vignette, full_region(image_hurt_vignette), (Color){1.0f, 1.0f, 1.0f, player->damage}});
} }
} }

Loading…
Cancel
Save