| #include "rive/shapes/star.hpp" |
| #include "rive/shapes/straight_vertex.hpp" |
| #include <cmath> |
| #include <cstdio> |
| |
| using namespace rive; |
| |
| Star::Star() {} |
| |
| void Star::innerRadiusChanged() { markPathDirty(); } |
| |
| std::size_t Star::vertexCount() { return points() * 2; } |
| |
| void Star::buildPolygon() { |
| auto halfWidth = width() / 2; |
| auto halfHeight = height() / 2; |
| auto innerHalfWidth = width() * innerRadius() / 2; |
| auto innerHalfHeight = height() * innerRadius() / 2; |
| auto ox = -originX() * width() + halfWidth; |
| auto oy = -originY() * height() + halfHeight; |
| |
| std::size_t length = vertexCount(); |
| auto angle = -M_PI / 2; |
| auto inc = 2 * M_PI / length; |
| |
| for (std::size_t i = 0; i < length; i += 2) { |
| { |
| StraightVertex& vertex = m_PolygonVertices[i]; |
| vertex.x(ox + cos(angle) * halfWidth); |
| vertex.y(oy + sin(angle) * halfHeight); |
| vertex.radius(cornerRadius()); |
| angle += inc; |
| } |
| { |
| StraightVertex& vertex = m_PolygonVertices[i + 1]; |
| vertex.x(ox + cos(angle) * innerHalfWidth); |
| vertex.y(oy + sin(angle) * innerHalfHeight); |
| vertex.radius(cornerRadius()); |
| angle += inc; |
| } |
| } |
| } |
| |
| void Star::update(ComponentDirt value) { Super::update(value); } |