summaryrefslogtreecommitdiffhomepage
path: root/src/textures.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/textures.c')
-rw-r--r--src/textures.c89
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();
}
}