diff options
Diffstat (limited to 'src/textures.c')
| -rw-r--r-- | src/textures.c | 89 |
1 files changed, 59 insertions, 30 deletions
diff --git a/src/textures.c b/src/textures.c index ddcecf73..ccab3bef 100644 --- a/src/textures.c +++ b/src/textures.c @@ -3200,39 +3200,68 @@ void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 if (source.width < 0) { flipX = true; source.width *= -1; } if (source.height < 0) source.y -= source.height; - rlEnableTexture(texture.id); + Vector2 bl = { 0 }; + Vector2 br = { 0 }; + Vector2 tr = { 0 }; + Vector2 tl = { 0 }; - rlPushMatrix(); - rlTranslatef(dest.x, dest.y, 0.0f); - rlRotatef(rotation, 0.0f, 0.0f, 1.0f); - rlTranslatef(-origin.x, -origin.y, 0.0f); + // Only calculate rotation if needed + if (rotation == 0.0f) + { + float x = dest.x - origin.x; + float y = dest.y - origin.y; + bl = (Vector2){ x, y }; + br = (Vector2){ x, y + dest.height }; + tr = (Vector2){ x + dest.width, y + dest.height }; + tl = (Vector2){ x + dest.width, y }; + } + else + { + float sinRotation = sinf(rotation * DEG2RAD); + float cosRotation = cosf(rotation * DEG2RAD); + float x = dest.x; + float y = dest.y; + float dx = -origin.x; + float dy = -origin.y; - rlBegin(RL_QUADS); - rlColor4ub(tint.r, tint.g, tint.b, tint.a); - rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer - - // Bottom-left corner for texture and quad - if (flipX) rlTexCoord2f((source.x + source.width)/width, source.y/height); - else rlTexCoord2f(source.x/width, source.y/height); - rlVertex2f(0.0f, 0.0f); - - // Bottom-right corner for texture and quad - if (flipX) rlTexCoord2f((source.x + source.width)/width, (source.y + source.height)/height); - else rlTexCoord2f(source.x/width, (source.y + source.height)/height); - rlVertex2f(0.0f, dest.height); - - // Top-right corner for texture and quad - if (flipX) rlTexCoord2f(source.x/width, (source.y + source.height)/height); - else rlTexCoord2f((source.x + source.width)/width, (source.y + source.height)/height); - rlVertex2f(dest.width, dest.height); - - // Top-left corner for texture and quad - if (flipX) rlTexCoord2f(source.x/width, source.y/height); - else rlTexCoord2f((source.x + source.width)/width, source.y/height); - rlVertex2f(dest.width, 0.0f); - rlEnd(); - rlPopMatrix(); + bl.x = x + dx * cosRotation - (dy + dest.height) * sinRotation; + bl.y = y + dx * sinRotation + (dy + dest.height) * cosRotation; + + br.x = x + (dx + dest.width) * cosRotation - (dy + dest.height) * sinRotation; + br.y = y + (dx + dest.width) * sinRotation + (dy + dest.height) * cosRotation; + tr.x = x + (dx + dest.width) * cosRotation - dy * sinRotation; + tr.y = y + (dx + dest.width) * sinRotation + dy * cosRotation; + + tl.x = x + dx * cosRotation - dy * sinRotation; + tl.y = y + dx * sinRotation + dy * cosRotation; + } + + rlEnableTexture(texture.id); + rlBegin(RL_QUADS); + rlColor4ub(tint.r, tint.g, tint.b, tint.a); + rlNormal3f(0.0f, 0.0f, 1.0f); // Normal vector pointing towards viewer + + // Bottom-left corner for texture and quad + if (flipX) rlTexCoord2f((source.x + source.width)/width, source.y/height); + else rlTexCoord2f(source.x/width, source.y/height); + rlVertex2f(bl.x, bl.y); + + // Bottom-right corner for texture and quad + if (flipX) rlTexCoord2f((source.x + source.width)/width, (source.y + source.height)/height); + else rlTexCoord2f(source.x/width, (source.y + source.height)/height); + rlVertex2f(br.x, br.y); + + // Top-right corner for texture and quad + if (flipX) rlTexCoord2f(source.x/width, (source.y + source.height)/height); + else rlTexCoord2f((source.x + source.width)/width, (source.y + source.height)/height); + rlVertex2f(tr.x, tr.y); + + // Top-left corner for texture and quad + if (flipX) rlTexCoord2f(source.x/width, source.y/height); + else rlTexCoord2f((source.x + source.width)/width, source.y/height); + rlVertex2f(tl.x, tl.y); + rlEnd(); rlDisableTexture(); } } |
