diff --git a/examples/shapes/shapes_dashed_line.c b/examples/shapes/shapes_dashed_line.c index aa254ab8d..7a6bf3eee 100644 --- a/examples/shapes/shapes_dashed_line.c +++ b/examples/shapes/shapes_dashed_line.c @@ -16,8 +16,6 @@ ********************************************************************************************/ #include "raylib.h" -#define RAYGUI_IMPLEMENTATION -#include "raygui.h" // Required for GUI controls //------------------------------------------------------------------------------------ // Program main entry point @@ -42,6 +40,7 @@ int main(void) int colorIndex = 0; SetTargetFPS(60); // Set our game to run at 60 frames-per-second + //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key @@ -50,8 +49,6 @@ int main(void) //---------------------------------------------------------------------------------- lineEndPosition = GetMousePosition(); // Line endpoint follows the mouse - // --- Keyboard Controls --- - // Change Dash Length (UP/DOWN arrows) if (IsKeyDown(KEY_UP)) dashLength += 1.0f; if (IsKeyDown(KEY_DOWN) && dashLength > 1.0f) dashLength -= 1.0f; @@ -61,11 +58,7 @@ int main(void) if (IsKeyDown(KEY_LEFT) && blankLength > 1.0f) blankLength -= 1.0f; // Cycle through colors ('C' key) - if (IsKeyPressed(KEY_C)) - { - colorIndex = (colorIndex + 1) % (sizeof(lineColors)/sizeof(Color)); - } - + if (IsKeyPressed(KEY_C)) colorIndex = (colorIndex + 1)%(sizeof(lineColors)/sizeof(Color)); //---------------------------------------------------------------------------------- // Draw diff --git a/src/raylib.h b/src/raylib.h index b7ccaae22..c57efc2e1 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1258,11 +1258,11 @@ RLAPI Rectangle GetShapesTextureRectangle(void); // Get texture source re RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel using geometry [Can be slow, use with care] RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel using geometry (Vector version) [Can be slow, use with care] RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line -RLAPI void DrawLineDashed(Vector2 startPos, Vector2 endPos, int dashSize, int whiteSpaceSize, Color color); // Draw a dashed line RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (using gl lines) RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line (using triangles/quads) RLAPI void DrawLineStrip(const Vector2 *points, int pointCount, Color color); // Draw lines sequence (using gl lines) RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw line segment cubic-bezier in-out interpolation +RLAPI void DrawLineDashed(Vector2 startPos, Vector2 endPos, int dashSize, int spaceSize, Color color); // Draw a dashed line RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline diff --git a/src/rshapes.c b/src/rshapes.c index a62b1c5f8..55f7d7fb9 100644 --- a/src/rshapes.c +++ b/src/rshapes.c @@ -182,53 +182,26 @@ void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color colo rlEnd(); } -void DrawLineDashed(Vector2 startPos, Vector2 endPos, int dashSize, int whiteSpaceSize, Color color) +// Draw a line defining thickness +void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color) { - // Calculate the vector and length of the line - float dx = endPos.x - startPos.x; - float dy = endPos.y - startPos.y; - float lineLength = sqrtf(dx*dx + dy*dy); + Vector2 delta = { endPos.x - startPos.x, endPos.y - startPos.y }; + float length = sqrtf(delta.x*delta.x + delta.y*delta.y); - // If the line is too short for dashing or dash size is invalid, draw a solid thick line - if (lineLength < (dashSize + whiteSpaceSize) || dashSize <= 0) + if ((length > 0) && (thick > 0)) { - DrawLineV(startPos, endPos, color); - return; + float scale = thick/(2*length); + + Vector2 radius = { -scale*delta.y, scale*delta.x }; + Vector2 strip[4] = { + { 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); } - - // Calculate the normalized direction vector of the line - float invLineLength = 1 / lineLength; - float dirX = dx * invLineLength; - float dirY = dy * invLineLength; - - Vector2 currentPos = startPos; - float distanceTraveled = 0; - - rlBegin(RL_LINES); - rlColor4ub(color.r, color.g, color.b, color.a); - - while (distanceTraveled < lineLength) - { - // Calculate the end of the current dash - float dashEndDist = distanceTraveled + dashSize; - if (dashEndDist > lineLength) - { - dashEndDist = lineLength; - } - - Vector2 dashEndPos = { startPos.x + dashEndDist * dirX, startPos.y + dashEndDist * dirY }; - - // Draw the dash segment - rlVertex2f(currentPos.x, currentPos.y); - rlVertex2f(dashEndPos.x, dashEndPos.y); - - // Update the distance traveled and move the current position for the next dash - distanceTraveled = dashEndDist + whiteSpaceSize; - currentPos.x = startPos.x + distanceTraveled * dirX; - currentPos.y = startPos.y + distanceTraveled * dirY; - } - - rlEnd(); } // Draw a line (using gl lines) @@ -295,26 +268,50 @@ void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color) DrawTriangleStrip(points, 2*SPLINE_SEGMENT_DIVISIONS + 2, color); } -// Draw a line defining thickness -void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color) +// Draw a dashed line +void DrawLineDashed(Vector2 startPos, Vector2 endPos, int dashSize, int spaceSize, Color color) { - Vector2 delta = { endPos.x - startPos.x, endPos.y - startPos.y }; - float length = sqrtf(delta.x*delta.x + delta.y*delta.y); + // Calculate the vector and length of the line + float dx = endPos.x - startPos.x; + float dy = endPos.y - startPos.y; + float lineLength = sqrtf(dx*dx + dy*dy); - if ((length > 0) && (thick > 0)) + // If the line is too short for dashing or dash size is invalid, draw a solid thick line + if ((lineLength < (dashSize + spaceSize)) || (dashSize <= 0)) { - float scale = thick/(2*length); - - Vector2 radius = { -scale*delta.y, scale*delta.x }; - Vector2 strip[4] = { - { 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); + DrawLineV(startPos, endPos, color); + return; } + + // Calculate the normalized direction vector of the line + float invLineLength = 1.0f/lineLength; + float dirX = dx*invLineLength; + float dirY = dy*invLineLength; + + Vector2 currentPos = startPos; + float distanceTraveled = 0; + + rlBegin(RL_LINES); + rlColor4ub(color.r, color.g, color.b, color.a); + + while (distanceTraveled < lineLength) + { + // Calculate the end of the current dash + float dashEndDist = distanceTraveled + dashSize; + if (dashEndDist > lineLength) dashEndDist = lineLength; + + Vector2 dashEndPos = { startPos.x + dashEndDist*dirX, startPos.y + dashEndDist*dirY }; + + // Draw the dash segment + rlVertex2f(currentPos.x, currentPos.y); + rlVertex2f(dashEndPos.x, dashEndPos.y); + + // Update the distance traveled and move the current position for the next dash + distanceTraveled = dashEndDist + spaceSize; + currentPos.x = startPos.x + distanceTraveled*dirX; + currentPos.y = startPos.y + distanceTraveled*dirY; + } + rlEnd(); } // Draw a color-filled circle