twn_rendering: m_sprite texture_origin changed for texture_region, stretched subregion work now
This commit is contained in:
@ -40,7 +40,7 @@ struct sprite_primitive {
|
||||
bool repeat;
|
||||
|
||||
m_option_list(
|
||||
t_fvec2, texture_origin )
|
||||
t_frect, texture_region )
|
||||
};
|
||||
|
||||
struct rect_primitive {
|
||||
|
@ -26,7 +26,7 @@ void push_sprite(const t_push_sprite_args args) {
|
||||
.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_origin, args, texture_origin)
|
||||
m_opt_from(texture_region, args, texture_region)
|
||||
};
|
||||
|
||||
struct primitive_2d primitive = {
|
||||
@ -127,13 +127,22 @@ void render_sprites(const struct primitive_2d primitives[],
|
||||
const float xr = srcrect.x / dims.w;
|
||||
const float yr = srcrect.y / dims.h;
|
||||
|
||||
uv0 = (t_fvec2){ xr + wr * sprite.flip_x, yr + hr * sprite.flip_y };
|
||||
uv1 = (t_fvec2){ xr + wr * sprite.flip_x, yr + hr * !sprite.flip_y };
|
||||
uv2 = (t_fvec2){ xr + wr * !sprite.flip_x, yr + hr * !sprite.flip_y };
|
||||
uv3 = (t_fvec2){ xr + wr * !sprite.flip_x, yr + hr * sprite.flip_y };
|
||||
|
||||
/* TODO: texture_origin support */
|
||||
if (!m_is_set(sprite, texture_region)) {
|
||||
uv0 = (t_fvec2){ xr + wr * sprite.flip_x, yr + hr * sprite.flip_y };
|
||||
uv1 = (t_fvec2){ xr + wr * sprite.flip_x, yr + hr * !sprite.flip_y };
|
||||
uv2 = (t_fvec2){ xr + wr * !sprite.flip_x, yr + hr * !sprite.flip_y };
|
||||
uv3 = (t_fvec2){ xr + wr * !sprite.flip_x, yr + hr * sprite.flip_y };
|
||||
} else {
|
||||
const float offx = (sprite.texture_region_opt.x / srcrect.w) * (srcrect.w / dims.w);
|
||||
const float offy = (sprite.texture_region_opt.y / srcrect.h) * (srcrect.h / dims.h);
|
||||
const float offw = (1.0f - (sprite.texture_region_opt.w / srcrect.w)) * (srcrect.w / dims.w);
|
||||
const float offh = (1.0f - (sprite.texture_region_opt.h / srcrect.h)) * (srcrect.h / dims.h);
|
||||
|
||||
uv0 = (t_fvec2){ xr + offx + wr * sprite.flip_x, yr + offy + hr * sprite.flip_y };
|
||||
uv1 = (t_fvec2){ xr + offx + wr * sprite.flip_x, yr - offh + hr * !sprite.flip_y };
|
||||
uv2 = (t_fvec2){ xr - offw + wr * !sprite.flip_x, yr - offh + hr * !sprite.flip_y };
|
||||
uv3 = (t_fvec2){ xr - offw + wr * !sprite.flip_x, yr + offy + hr * sprite.flip_y };
|
||||
}
|
||||
} else {
|
||||
/* try fitting texture into supplied destination rectangle */
|
||||
|
||||
@ -145,11 +154,11 @@ void render_sprites(const struct primitive_2d primitives[],
|
||||
uv2 = (t_fvec2){ rx * !sprite.flip_x, ry * !sprite.flip_y };
|
||||
uv3 = (t_fvec2){ rx * !sprite.flip_x, ry * sprite.flip_y };
|
||||
|
||||
if (m_is_set(sprite, texture_origin)) {
|
||||
if (m_is_set(sprite, texture_region)) {
|
||||
/* displace origin */
|
||||
|
||||
const float ax = sprite.texture_origin_opt.x / srcrect.w;
|
||||
const float ay = sprite.texture_origin_opt.y / srcrect.h;
|
||||
const float ax = sprite.texture_region_opt.x / srcrect.w;
|
||||
const float ay = sprite.texture_region_opt.y / srcrect.h;
|
||||
|
||||
uv0.x += ax; uv1.x += ax; uv2.x += ax; uv3.x += ax;
|
||||
uv0.y += ay; uv1.y += ay; uv2.y += ay; uv3.y += ay;
|
||||
|
Reference in New Issue
Block a user