|
|
@ -58,6 +58,7 @@ |
|
|
|
|
|
|
|
#include <math.h> // Required for: sinf(), asinf(), cosf(), acosf(), sqrtf(), fabsf() |
|
|
|
#include <float.h> // Required for: FLT_EPSILON |
|
|
|
#include <stdlib.h> // Required for: RL_FREE |
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------- |
|
|
|
// Defines and Macros |
|
|
@ -197,6 +198,8 @@ void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color) |
|
|
|
Vector2 previous = startPos; |
|
|
|
Vector2 current = { 0 }; |
|
|
|
|
|
|
|
Vector2 points[2*BEZIER_LINE_DIVISIONS + 2] = { 0 }; |
|
|
|
|
|
|
|
for (int i = 1; i <= BEZIER_LINE_DIVISIONS; i++) |
|
|
|
{ |
|
|
|
// Cubic easing in-out |
|
|
@ -204,12 +207,27 @@ void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color) |
|
|
|
current.y = EaseCubicInOut((float)i, startPos.y, endPos.y - startPos.y, (float)BEZIER_LINE_DIVISIONS); |
|
|
|
current.x = previous.x + (endPos.x - startPos.x)/ (float)BEZIER_LINE_DIVISIONS; |
|
|
|
|
|
|
|
// TODO: Avoid drawing the line by pieces, it generates gaps for big thicks, |
|
|
|
// Custom "triangle-strip" implementation should be used, check DrawTriangleStrip() for reference |
|
|
|
DrawLineEx(previous, current, thick, color); |
|
|
|
float dy = current.y-previous.y; |
|
|
|
float dx = current.x-previous.x; |
|
|
|
float size = 0.5*thick/sqrt(dx*dx+dy*dy); |
|
|
|
|
|
|
|
if (i==1) |
|
|
|
{ |
|
|
|
points[0].x = previous.x+dy*size; |
|
|
|
points[0].y = previous.y-dx*size; |
|
|
|
points[1].x = previous.x-dy*size; |
|
|
|
points[1].y = previous.y+dx*size; |
|
|
|
} |
|
|
|
|
|
|
|
points[2*i+1].x = current.x-dy*size; |
|
|
|
points[2*i+1].y = current.y+dx*size; |
|
|
|
points[2*i].x = current.x+dy*size; |
|
|
|
points[2*i].y = current.y-dx*size; |
|
|
|
|
|
|
|
previous = current; |
|
|
|
} |
|
|
|
|
|
|
|
DrawTriangleStrip(points, 2*BEZIER_LINE_DIVISIONS+2, color); |
|
|
|
} |
|
|
|
|
|
|
|
// Draw line using quadratic bezier curves with a control point |
|
|
@ -221,6 +239,8 @@ void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, fl |
|
|
|
Vector2 current = { 0 }; |
|
|
|
float t = 0.0f; |
|
|
|
|
|
|
|
Vector2 points[2*BEZIER_LINE_DIVISIONS + 2] = { 0 }; |
|
|
|
|
|
|
|
for (int i = 0; i <= BEZIER_LINE_DIVISIONS; i++) |
|
|
|
{ |
|
|
|
t = step*i; |
|
|
@ -232,12 +252,27 @@ void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, fl |
|
|
|
current.y = a*startPos.y + b*controlPos.y + c*endPos.y; |
|
|
|
current.x = a*startPos.x + b*controlPos.x + c*endPos.x; |
|
|
|
|
|
|
|
// TODO: Avoid drawing the line by pieces, it generates gaps for big thicks, |
|
|
|
// Custom "triangle-strip" implementation should be used, check DrawTriangleStrip() for reference |
|
|
|
DrawLineEx(previous, current, thick, color); |
|
|
|
float dy = current.y-previous.y; |
|
|
|
float dx = current.x-previous.x; |
|
|
|
float size = 0.5*thick/sqrt(dx*dx+dy*dy); |
|
|
|
|
|
|
|
if (i==1) |
|
|
|
{ |
|
|
|
points[0].x = previous.x+dy*size; |
|
|
|
points[0].y = previous.y-dx*size; |
|
|
|
points[1].x = previous.x-dy*size; |
|
|
|
points[1].y = previous.y+dx*size; |
|
|
|
} |
|
|
|
|
|
|
|
points[2*i+1].x = current.x-dy*size; |
|
|
|
points[2*i+1].y = current.y+dx*size; |
|
|
|
points[2*i].x = current.x+dy*size; |
|
|
|
points[2*i].y = current.y-dx*size; |
|
|
|
|
|
|
|
previous = current; |
|
|
|
} |
|
|
|
|
|
|
|
DrawTriangleStrip(points, 2*BEZIER_LINE_DIVISIONS+2, color); |
|
|
|
} |
|
|
|
|
|
|
|
// Draw line using cubic bezier curves with 2 control points |
|
|
@ -249,6 +284,8 @@ void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlP |
|
|
|
Vector2 current = { 0 }; |
|
|
|
float t = 0.0f; |
|
|
|
|
|
|
|
Vector2 points[2*BEZIER_LINE_DIVISIONS + 2] = { 0 }; |
|
|
|
|
|
|
|
for (int i = 0; i <= BEZIER_LINE_DIVISIONS; i++) |
|
|
|
{ |
|
|
|
t = step*i; |
|
|
@ -260,12 +297,27 @@ void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlP |
|
|
|
current.y = a*startPos.y + b*startControlPos.y + c*endControlPos.y + d*endPos.y; |
|
|
|
current.x = a*startPos.x + b*startControlPos.x + c*endControlPos.x + d*endPos.x; |
|
|
|
|
|
|
|
// TODO: Avoid drawing the line by pieces, it generates gaps for big thicks, |
|
|
|
// Custom "triangle-strip" implementation should be used, check DrawTriangleStrip() for reference |
|
|
|
DrawLineEx(previous, current, thick, color); |
|
|
|
float dy = current.y-previous.y; |
|
|
|
float dx = current.x-previous.x; |
|
|
|
float size = 0.5*thick/sqrt(dx*dx+dy*dy); |
|
|
|
|
|
|
|
if (i==1) |
|
|
|
{ |
|
|
|
points[0].x = previous.x+dy*size; |
|
|
|
points[0].y = previous.y-dx*size; |
|
|
|
points[1].x = previous.x-dy*size; |
|
|
|
points[1].y = previous.y+dx*size; |
|
|
|
} |
|
|
|
|
|
|
|
points[2*i+1].x = current.x-dy*size; |
|
|
|
points[2*i+1].y = current.y+dx*size; |
|
|
|
points[2*i].x = current.x+dy*size; |
|
|
|
points[2*i].y = current.y-dx*size; |
|
|
|
|
|
|
|
previous = current; |
|
|
|
} |
|
|
|
|
|
|
|
DrawTriangleStrip(points, 2*BEZIER_LINE_DIVISIONS+2, color); |
|
|
|
} |
|
|
|
|
|
|
|
// Draw lines sequence |
|
|
|