J2D DottedLine & DashedLine
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 6m41s
All checks were successful
Run ReCI Build Test / Explore-Gitea-Actions (push) Successful in 6m41s
This commit is contained in:
@@ -79,7 +79,7 @@ namespace JGL::J2D {
|
||||
/// @param color A 3-or-4 channel color value. @see class Color3, class Color4
|
||||
/// @param points A set of x,y points to render.
|
||||
/// @param radius The size of the point to plot. By default, a single pixel.
|
||||
void DrawPoints(const Color4& color, const Vector2* points, int num_points, float radius = 1.f);
|
||||
void DrawPoints(const Color4& color, const Vector2* points, int point_count, float radius = 1.f);
|
||||
|
||||
/// Plots a line (segment) on the screen.
|
||||
/// @param color A 3-or-4 channel color value. @see classes Color3, Color4.
|
||||
@@ -89,6 +89,27 @@ namespace JGL::J2D {
|
||||
void DrawLine(const Color4& color, const Vector2& A, const Vector2& B, float thickness = 1);
|
||||
void DrawLine(const Color4& color, float x1, float y1, float x2, float y2, float thickness = 1);
|
||||
|
||||
/// Plots a line segment using a series of points separated by a given distance.
|
||||
/// @param color A 3-or-4 channel color value. @see classes Color3, Color4.
|
||||
/// @param A The starting point of the line segment.
|
||||
/// @param B The end point of the line segment.
|
||||
/// @param spacing The distance between each point (px)
|
||||
/// @param thickness The width at which to render the line.
|
||||
/// @note With diagonal lines, the distance between points can differ by one px.
|
||||
void DrawDottedLine(const Color4& color, const Vector2& A, const Vector2& B, float spacing = 1.f, float thickness = 1.f);
|
||||
void DrawDottedLine(const Color4& color, float x1, float y1, float x2, float y2, float spacing = 1.f, float thickness = 1.f);
|
||||
|
||||
/// Plots a line segment using a series of points separated by a given distance.
|
||||
/// @param color A 3-or-4 channel color value. @see classes Color3, Color4.
|
||||
/// @param A The starting point of the line segment.
|
||||
/// @param B The end point of the line segment.
|
||||
/// @param spacing The distance between each point (px)
|
||||
/// @param dash_length The length of each dash making up the line.
|
||||
/// @param thickness The width at which to render the line.
|
||||
/// @note With diagonal lines, the distance between dashes can differ by one px.
|
||||
void DrawDashedLine(const Color4& color, const Vector2& A, const Vector2& B, float spacing = 4.f, float dash_length = 6.f, float thickness = 1.f);
|
||||
void DrawDashedLine(const Color4& color, float x1, float y1, float x2, float y2, float spacing = 4.f, float dash_length = 6.f, float thickness = 1.f);
|
||||
|
||||
/// Draws a line with a color gradient that transitions across it.
|
||||
/// @param color_a A 3-or-4 channel color value. @see class Color3, class Color4
|
||||
/// @param color_b A 3-or-4 channel color value. @see class Color3, class Color4
|
||||
@@ -96,7 +117,7 @@ namespace JGL::J2D {
|
||||
/// @param B The end point of the line segment.
|
||||
/// @param thickness The width at which to render the line.
|
||||
void DrawGradientLine(const Color4& color_a, const Color4& color_b, const Vector2& A, const Vector2& B, float thickness = 1);
|
||||
void DrawGradientLine(const Color4& color_a, const Color4& color_b, float x, float y, float w, float h, float thickness = 1);
|
||||
void DrawGradientLine(const Color4& color_a, const Color4& color_b, float x1, float y1, float x2, float y2, float thickness = 1);
|
||||
|
||||
/// Draws an outline of a rectangle on the screen.
|
||||
/// @param color A 3-or-4 channel color value. @see class Color3, class Color4
|
||||
|
49
src/JGL.cpp
49
src/JGL.cpp
@@ -228,6 +228,55 @@ namespace JGL {
|
||||
J2D::DrawLine(color, {x, y}, {w, h}, thickness);
|
||||
}
|
||||
|
||||
void J2D::DrawDottedLine(const Color4& color, const Vector2& A, const Vector2& B, float spacing, float thickness) {
|
||||
float distance = Vector2::Distance(A, B);
|
||||
Vector2 direction = (B - A).Normalized();
|
||||
|
||||
unsigned int point_count = distance / spacing;
|
||||
std::vector<Vector2> points(point_count);
|
||||
|
||||
if (spacing > distance)
|
||||
Logger::Error("Drawing a dotted line that would have no dots?");
|
||||
|
||||
for (unsigned int i = 0; i < point_count; ++i)
|
||||
points[i] = A + direction * (i * spacing);
|
||||
|
||||
return J2D::DrawPoints(color, points.data(), points.size(), thickness);
|
||||
}
|
||||
|
||||
void J2D::DrawDottedLine(const Color4& color, float x1, float y1, float x2, float y2, float spacing, float thickness) {
|
||||
return J2D::DrawDottedLine(color, {x1, y1}, {x2, y2}, spacing, thickness);
|
||||
}
|
||||
|
||||
void J2D::DrawDashedLine(const Color4& color, const Vector2& A, const Vector2& B, float spacing, float dash_length, float thickness) {
|
||||
float distance = Vector2::Distance(A, B);
|
||||
Vector2 direction = (B - A).Normalized();
|
||||
float length_of_dash_and_gap = dash_length + spacing;
|
||||
unsigned int dash_count = distance / length_of_dash_and_gap;
|
||||
|
||||
if (spacing > distance)
|
||||
Logger::Error("Drawing a dashed line that would have no dashes?");
|
||||
|
||||
Vector2 A_current, B_current;
|
||||
for (unsigned int i = 0; i < dash_count; i++) {
|
||||
A_current = A + direction * (i * length_of_dash_and_gap);
|
||||
B_current = A_current + (direction * dash_length);
|
||||
J2D::DrawLine(color, A_current, B_current, thickness);
|
||||
}
|
||||
|
||||
// For the little piece at the end.
|
||||
float distance_left = distance - (dash_count * length_of_dash_and_gap);
|
||||
if (distance_left > 0) {
|
||||
A_current = A + direction * (dash_count * length_of_dash_and_gap);
|
||||
B_current = A_current + direction * std::min(dash_length, distance_left);
|
||||
J2D::DrawLine(color, A_current, B_current, thickness);
|
||||
}
|
||||
}
|
||||
|
||||
void J2D::DrawDashedLine(const Color4& color, float x1, float y1, float x2, float y2, float spacing, float dash_length, float thickness) {
|
||||
return J2D::DrawDashedLine(color, {x1, y1}, {x2, y2}, spacing, dash_length, thickness);
|
||||
}
|
||||
|
||||
void J2D::DrawGradientLine(const Color4& color1, const Color4& color2, const Vector2& A, const Vector2& B, float thickness) {
|
||||
if (!inJ2D)
|
||||
Logger::Error("Drawing J2D element before J2D begin.");
|
||||
|
Reference in New Issue
Block a user