rendering.c: sprite rotation

This commit is contained in:
2024-07-27 16:55:38 +03:00
parent 687e42ddfd
commit 79bc261ccd
5 changed files with 135 additions and 58 deletions

View File

@ -135,45 +135,95 @@ static void render_sprites(const struct primitive_2d primitives[],
const float xr = (float)srcrect.x / (float)dims.w;
const float yr = (float)srcrect.y / (float)dims.h;
payload[i] = (struct sprite_primitive_payload) {
/* upper-left */
.v0 = {
sprite.rect.x,
sprite.rect.y },
.uv0 = {
xr + wr * sprite.flip_x,
yr + hr * sprite.flip_y, },
/* non-rotated case */
if (sprite.rotation == 0.0f) {
payload[i] = (struct sprite_primitive_payload) {
/* upper-left */
.v0 = {
sprite.rect.x,
sprite.rect.y },
.uv0 = {
xr + wr * sprite.flip_x,
yr + hr * sprite.flip_y, },
/* bottom-left */
.v1 = {
(sprite.rect.x),
(sprite.rect.y + sprite.rect.h) },
.uv1 = {
xr + wr * sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* bottom-left */
.v1 = {
(sprite.rect.x),
(sprite.rect.y + sprite.rect.h) },
.uv1 = {
xr + wr * sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* bottom-right */
.v2 = {
(sprite.rect.x + sprite.rect.w),
(sprite.rect.y + sprite.rect.h) },
.uv2 = {
xr + wr * !sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* bottom-right */
.v2 = {
(sprite.rect.x + sprite.rect.w),
(sprite.rect.y + sprite.rect.h) },
.uv2 = {
xr + wr * !sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* upper-right */
.v3 = {
(sprite.rect.x + sprite.rect.w),
(sprite.rect.y) },
.uv3 = {
xr + wr * !sprite.flip_x,
yr + hr * sprite.flip_y, },
/* upper-right */
.v3 = {
(sprite.rect.x + sprite.rect.w),
(sprite.rect.y) },
.uv3 = {
xr + wr * !sprite.flip_x,
yr + hr * sprite.flip_y, },
/* equal for all (flat shaded) */
.c0 = sprite.color,
.c1 = sprite.color,
.c2 = sprite.color,
.c3 = sprite.color,
};
/* equal for all (flat shaded) */
.c0 = sprite.color,
.c1 = sprite.color,
.c2 = sprite.color,
.c3 = sprite.color,
};
} else {
/* rotated case */
const t_fvec2 c = frect_center(sprite.rect);
const t_fvec2 d = {
.x = (cosf(sprite.rotation + (float)M_PI_4) * sprite.rect.w) * (float)M_SQRT1_2,
.y = (sinf(sprite.rotation + (float)M_PI_4) * sprite.rect.h) * (float)M_SQRT1_2,
};
payload[i] = (struct sprite_primitive_payload) {
/* upper-left */
.v0 = {
c.x - d.x,
c.y - d.y },
.uv0 = {
xr + wr * sprite.flip_x,
yr + hr * sprite.flip_y, },
/* bottom-left */
.v1 = {
c.x - d.y,
c.y + d.x },
.uv1 = {
xr + wr * sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* bottom-right */
.v2 = {
c.x + d.x,
c.y + d.y },
.uv2 = {
xr + wr * !sprite.flip_x,
yr + hr * !sprite.flip_y, },
/* upper-right */
.v3 = {
c.x + d.y,
c.y - d.x },
.uv3 = {
xr + wr * !sprite.flip_x,
yr + hr * sprite.flip_y, },
/* equal for all (flat shaded) */
.c0 = sprite.color,
.c1 = sprite.color,
.c2 = sprite.color,
.c3 = sprite.color,
};
}
}
glUnmapBuffer(GL_ARRAY_BUFFER);