diff --git a/src/shapes.c b/src/shapes.c index c6b746e20..f95004747 100644 --- a/src/shapes.c +++ b/src/shapes.c @@ -619,59 +619,61 @@ void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color { if (rlCheckBufferLimit(4)) rlglDraw(); - Vector2 bl = { 0 }; - Vector2 br = { 0 }; - Vector2 tr = { 0 }; - Vector2 tl = { 0 }; + Vector2 bottomLeft = { 0 }; + Vector2 bottomRight = { 0 }; + Vector2 topRight = { 0 }; + Vector2 topLeft = { 0 }; // 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 }; + bottomLeft = (Vector2){ x, y }; + bottomRight = (Vector2){ x, y + rec.height }; + topRight = (Vector2){ x + rec.width, y + rec.height }; + topLeft = (Vector2){ x + rec.width, y }; } else { - float sinRotation = sinf(rotation * DEG2RAD); - float cosRotation = cosf(rotation * DEG2RAD); + 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; - bl.x = x + dx * cosRotation - (dy + rec.height) * sinRotation; - bl.y = y + dx * sinRotation + (dy + rec.height) * cosRotation; + bottomLeft.x = x + dx*cosRotation - (dy + rec.height)*sinRotation; + bottomLeft.y = y + dx*sinRotation + (dy + rec.height)*cosRotation; - br.x = x + (dx + rec.width) * cosRotation - (dy + rec.height) * sinRotation; - br.y = y + (dx + rec.width) * sinRotation + (dy + rec.height) * cosRotation; + bottomRight.x = x + (dx + rec.width)*cosRotation - (dy + rec.height)*sinRotation; + bottomRight.y = y + (dx + rec.width)*sinRotation + (dy + rec.height)*cosRotation; - tr.x = x + (dx + rec.width) * cosRotation - dy * sinRotation; - tr.y = y + (dx + rec.width) * sinRotation + dy * cosRotation; + topRight.x = x + (dx + rec.width)*cosRotation - dy*sinRotation; + topRight.y = y + (dx + rec.width)*sinRotation + dy*cosRotation; - tl.x = x + dx * cosRotation - dy * sinRotation; - tl.y = y + dx * sinRotation + dy * cosRotation; + topLeft.x = x + dx*cosRotation - dy*sinRotation; + topLeft.y = y + dx*sinRotation + dy*cosRotation; } 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); + rlVertex2f(bottomLeft.x, bottomLeft.y); rlTexCoord2f(GetShapesTextureRec().x/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); - rlVertex2f(br.x, br.y); + rlVertex2f(bottomRight.x, bottomRight.y); rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, (GetShapesTextureRec().y + GetShapesTextureRec().height)/GetShapesTexture().height); - rlVertex2f(tr.x, tr.y); + rlVertex2f(topRight.x, topRight.y); rlTexCoord2f((GetShapesTextureRec().x + GetShapesTextureRec().width)/GetShapesTexture().width, GetShapesTextureRec().y/GetShapesTexture().height); - rlVertex2f(tl.x, tl.y); + rlVertex2f(topLeft.x, topLeft.y); + rlEnd(); rlDisableTexture(); } diff --git a/src/textures.c b/src/textures.c index ccab3bef2..6debe1a04 100644 --- a/src/textures.c +++ b/src/textures.c @@ -703,7 +703,7 @@ Image GenImageCellular(int width, int height, int tileSize) int seedsPerRow = width/tileSize; int seedsPerCol = height/tileSize; - int seedsCount = seedsPerRow * seedsPerCol; + int seedsCount = seedsPerRow*seedsPerCol; Vector2 *seeds = (Vector2 *)RL_MALLOC(seedsCount*sizeof(Vector2)); @@ -1811,7 +1811,7 @@ void ImageColorTint(Image *image, Color color) { for (int x = 0; x < image->width; x++) { - int index = y * image->width + x; + int index = y*image->width + x; unsigned char r = (unsigned char)(((float)pixels[index].r/255*cR)*255.0f); unsigned char g = (unsigned char)(((float)pixels[index].g/255*cG)*255.0f); unsigned char b = (unsigned char)(((float)pixels[index].b/255*cB)*255.0f); @@ -3200,69 +3200,111 @@ 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; - Vector2 bl = { 0 }; - Vector2 br = { 0 }; - Vector2 tr = { 0 }; - Vector2 tl = { 0 }; + Vector2 bottomLeft = { 0 }; + Vector2 bottomRight = { 0 }; + Vector2 topRight = { 0 }; + Vector2 topLeft = { 0 }; // 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 }; + bottomLeft = (Vector2){ x, y }; + bottomRight = (Vector2){ x, y + dest.height }; + topRight = (Vector2){ x + dest.width, y + dest.height }; + topLeft = (Vector2){ x + dest.width, y }; } else { - float sinRotation = sinf(rotation * DEG2RAD); - float cosRotation = cosf(rotation * DEG2RAD); + 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; - bl.x = x + dx * cosRotation - (dy + dest.height) * sinRotation; - bl.y = y + dx * sinRotation + (dy + dest.height) * cosRotation; + bottomLeft.x = x + dx*cosRotation - (dy + dest.height)*sinRotation; + bottomLeft.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; + bottomRight.x = x + (dx + dest.width)*cosRotation - (dy + dest.height) *sinRotation; + bottomRight.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; + topRight.x = x + (dx + dest.width)*cosRotation - dy*sinRotation; + topRight.y = y + (dx + dest.width)*sinRotation + dy*cosRotation; - tl.x = x + dx * cosRotation - dy * sinRotation; - tl.y = y + dx * sinRotation + dy * cosRotation; + topLeft.x = x + dx*cosRotation - dy*sinRotation; + topLeft.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); + rlVertex2f(bottomLeft.x, bottomLeft.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); + rlVertex2f(bottomRight.x, bottomRight.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); + rlVertex2f(topRight.x, topRight.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); + rlVertex2f(topLeft.x, topLeft.y); + rlEnd(); rlDisableTexture(); + + // NOTE: Vertex position can be transformed using matrices + // but the process is way more costly than just calculating + // the vertex positions manually, like done above. + // I leave here the old implementation for educational pourposes, + // just in case someone wants to do some performance test + /* + rlEnableTexture(texture.id); + rlPushMatrix(); + rlTranslatef(dest.x, dest.y, 0.0f); + if (rotation != 0.0f) rlRotatef(rotation, 0.0f, 0.0f, 1.0f); + rlTranslatef(-origin.x, -origin.y, 0.0f); + + 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(); + rlDisableTexture(); + */ } }