diff options
| author | Chris <[email protected]> | 2021-03-19 18:19:10 +0000 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-19 19:19:10 +0100 |
| commit | 45670fbf2d6ade37bce3c054421565abafde6aa3 (patch) | |
| tree | e3eda4aae72492b715281c13cafe9b7748a5a78e /src/shapes.c | |
| parent | 2f367a905ed7fd525e6629146ddc642531a3c504 (diff) | |
| download | raylib-45670fbf2d6ade37bce3c054421565abafde6aa3.tar.gz raylib-45670fbf2d6ade37bce3c054421565abafde6aa3.zip | |
Optimize DrawTexturePro and DrawRectanglePro transformations (#1632)
* Optimize DrawTexturePro and DrawRectanglePro transformations
- Add check so rotation is only applied if rotation != 0.0f.
- Replace matrix usage by calculating the vertex data directly.
* Fix error with windows build and trim whitespace
Diffstat (limited to 'src/shapes.c')
| -rw-r--r-- | src/shapes.c | 79 |
1 files changed, 54 insertions, 25 deletions
diff --git a/src/shapes.c b/src/shapes.c index 3e6b9d7d..c6b746e2 100644 --- a/src/shapes.c +++ b/src/shapes.c @@ -119,11 +119,11 @@ void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color) Vector2 delta = {endPos.x-startPos.x, endPos.y-startPos.y}; float length = sqrtf(delta.x*delta.x + delta.y*delta.y); - if (length > 0 && thick > 0) + if (length > 0 && thick > 0) { float scale = thick/(2*length); Vector2 radius = {-scale*delta.y, scale*delta.x}; - Vector2 strip[] = {{startPos.x-radius.x, startPos.y-radius.y}, {startPos.x+radius.x, startPos.y+radius.y}, + Vector2 strip[] = {{startPos.x-radius.x, startPos.y-radius.y}, {startPos.x+radius.x, startPos.y+radius.y}, {endPos.x-radius.x, endPos.y-radius.y}, {endPos.x+radius.x, endPos.y+radius.y}}; DrawTriangleStrip(strip, 4, color); @@ -157,24 +157,24 @@ void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color) void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thick, Color color) { const float step = 1.0f/BEZIER_LINE_DIVISIONS; - + Vector2 previous = startPos; Vector2 current = { 0 }; float t = 0.0f; - + for (int i = 0; i <= BEZIER_LINE_DIVISIONS; i++) { t = step*i; float a = powf(1 - t, 2); float b = 2*(1 - t)*t; float c = powf(t, 2); - + // NOTE: The easing functions aren't suitable here because they don't take a control point current.y = a*startPos.y + b*controlPos.y + c*endPos.y; current.x = a*startPos.x + b*controlPos.x + c*endPos.x; - + DrawLineEx(previous,current,thick,color); - + previous = current; } } @@ -619,31 +619,60 @@ void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color { if (rlCheckBufferLimit(4)) rlglDraw(); - rlEnableTexture(GetShapesTexture().id); + Vector2 bl = { 0 }; + Vector2 br = { 0 }; + Vector2 tr = { 0 }; + Vector2 tl = { 0 }; - rlPushMatrix(); - rlTranslatef(rec.x, rec.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 = rec.x - origin.x; + float y = rec.y - origin.y; + bl = (Vector2){ x, y }; + br = (Vector2){ x, y + rec.height }; + tr = (Vector2){ x + rec.width, y + rec.height }; + tl = (Vector2){ x + rec.width, y }; + } + else + { + float sinRotation = sinf(rotation * DEG2RAD); + float cosRotation = cosf(rotation * DEG2RAD); + float x = rec.x; + float y = rec.y; + float dx = -origin.x; + float dy = -origin.y; - rlBegin(RL_QUADS); - rlNormal3f(0.0f, 0.0f, 1.0f); - rlColor4ub(color.r, color.g, color.b, color.a); + bl.x = x + dx * cosRotation - (dy + rec.height) * sinRotation; + bl.y = y + dx * sinRotation + (dy + rec.height) * cosRotation; - rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height); - rlVertex2f(0.0f, 0.0f); + br.x = x + (dx + rec.width) * cosRotation - (dy + rec.height) * sinRotation; + br.y = y + (dx + rec.width) * sinRotation + (dy + rec.height) * cosRotation; - rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); - rlVertex2f(0.0f, rec.height); + tr.x = x + (dx + rec.width) * cosRotation - dy * sinRotation; + tr.y = y + (dx + rec.width) * sinRotation + dy * cosRotation; - rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); - rlVertex2f(rec.width, rec.height); + tl.x = x + dx * cosRotation - dy * sinRotation; + tl.y = y + dx * sinRotation + dy * cosRotation; + } - rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height); - rlVertex2f(rec.width, 0.0f); - rlEnd(); - rlPopMatrix(); + rlEnableTexture(GetShapesTexture().id); + rlBegin(RL_QUADS); + rlNormal3f(0.0f, 0.0f, 1.0f); + rlColor4ub(color.r, color.g, color.b, color.a); + rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height); + rlVertex2f(bl.x, bl.y); + + rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); + rlVertex2f(br.x, br.y); + + rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); + rlVertex2f(tr.x, tr.y); + + rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height); + rlVertex2f(tl.x, tl.y); + rlEnd(); rlDisableTexture(); } |
