Skip to content

Commit

Permalink
Update PieChart to v1.0.5
Browse files Browse the repository at this point in the history
updates Pie Chart to version 1.0.5, which updates code style as well as removing primitive type from being a member of the class; it's now hard-coded into the draw call.
  • Loading branch information
Hapaxia committed Feb 20, 2025
1 parent de388b1 commit a299a7a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 25 deletions.
45 changes: 22 additions & 23 deletions src/SelbaWard/PieChart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
namespace
{

inline float radiansFromDegrees(float degrees)
inline float radiansFromDegrees(const float degrees)
{
return degrees * 0.0174532925f; // pi/180
}
Expand All @@ -51,53 +51,52 @@ PieChart::Slice::Slice()
: size{ 0.1f }
, scale{ 1.f }
, explode{ 0.f }
, color(sf::Color::White)
, color{ sf::Color::White }
{
}

PieChart::PieChart()
: slices()
, m_primitive{ sf::PrimitiveType::Triangles }
, m_vertices()
, m_size({ 32.f, 32.f })
: slices{}
, m_vertices{}
, m_size{ 32.f, 32.f }
{
}

void PieChart::update()
{
const sf::Vector2f halfSize{ m_size / 2.f };
unsigned int totalNumberOfTrianglesRequired{ 0u };
std::vector<unsigned int> numberOfTrianglesRequiredPerSlice;
std::vector<std::size_t> numberOfTrianglesRequiredPerSlice;
for (auto& slice : slices)
{
numberOfTrianglesRequiredPerSlice.emplace_back(static_cast<unsigned int>(std::floor(1.f + slice.size * 50.f)));
numberOfTrianglesRequiredPerSlice.emplace_back(static_cast<std::size_t>(std::floor(1.f + slice.size * 50.f)));
totalNumberOfTrianglesRequired += numberOfTrianglesRequiredPerSlice.back();
}
m_vertices.resize(totalNumberOfTrianglesRequired * 3);
unsigned int currentVertex{ 0u };
m_vertices.resize(totalNumberOfTrianglesRequired * 3u);
std::size_t currentVertex{ 0u };
float currentAngle{ 0.f };
for (unsigned int slice{ 0u }; slice < slices.size(); ++slice)
for (std::size_t slice{ 0u }; slice < slices.size(); ++slice)
{
const float startAngle{ currentAngle };
const float halfAngleDifference{ 180.f * slices[slice].size };
const sf::Vector2f offset{ sf::Vector2f(std::sin(radiansFromDegrees(startAngle + halfAngleDifference)), -std::cos(radiansFromDegrees(startAngle + halfAngleDifference))) * slices[slice].explode };
for (unsigned int triangle{ 0u }; triangle < numberOfTrianglesRequiredPerSlice[slice]; ++triangle)
for (std::size_t triangle{ 0u }; triangle < numberOfTrianglesRequiredPerSlice[slice]; ++triangle)
{
m_vertices[currentVertex + 0].position = halfSize + sf::Vector2f(offset.x * halfSize.x, offset.y * halfSize.y);
m_vertices[currentVertex + 1].position = halfSize + sf::Vector2f((offset.x + std::sin(radiansFromDegrees(currentAngle))) * halfSize.x, (offset.y - std::cos(radiansFromDegrees(currentAngle))) * halfSize.y) * slices[slice].scale;
m_vertices[currentVertex + 0u].position = halfSize + sf::Vector2f(offset.x * halfSize.x, offset.y * halfSize.y);
m_vertices[currentVertex + 1u].position = halfSize + sf::Vector2f((offset.x + std::sin(radiansFromDegrees(currentAngle))) * halfSize.x, (offset.y - std::cos(radiansFromDegrees(currentAngle))) * halfSize.y) * slices[slice].scale;
currentAngle += halfAngleDifference * 2.f / numberOfTrianglesRequiredPerSlice[slice];
m_vertices[currentVertex + 2].position = halfSize + sf::Vector2f((offset.x + std::sin(radiansFromDegrees(currentAngle))) * halfSize.x, (offset.y - std::cos(radiansFromDegrees(currentAngle))) * halfSize.y) * slices[slice].scale;
m_vertices[currentVertex + 0].color = slices[slice].color;
m_vertices[currentVertex + 1].color = slices[slice].color;
m_vertices[currentVertex + 2].color = slices[slice].color;
currentVertex += 3;
m_vertices[currentVertex + 2u].position = halfSize + sf::Vector2f((offset.x + std::sin(radiansFromDegrees(currentAngle))) * halfSize.x, (offset.y - std::cos(radiansFromDegrees(currentAngle))) * halfSize.y) * slices[slice].scale;
m_vertices[currentVertex + 0u].color = slices[slice].color;
m_vertices[currentVertex + 1u].color = slices[slice].color;
m_vertices[currentVertex + 2u].color = slices[slice].color;
currentVertex += 3u;
}
}
}

sf::FloatRect PieChart::getLocalBounds() const
{
sf::Vector2f topLeft{ m_vertices[0].position };
sf::Vector2f topLeft{ m_vertices[0u].position };
sf::Vector2f bottomRight{ topLeft };
for (auto& vertex : m_vertices)
{
Expand All @@ -116,7 +115,7 @@ sf::FloatRect PieChart::getLocalBounds() const
sf::FloatRect PieChart::getGlobalBounds() const
{
const sf::Transform transform{ getTransform() };
sf::Vector2f topLeft{ transform.transformPoint(m_vertices[0].position) };
sf::Vector2f topLeft{ transform.transformPoint(m_vertices[0u].position) };
sf::Vector2f bottomRight{ topLeft };
sf::Vector2f current;
for (auto& vertex : m_vertices)
Expand All @@ -142,8 +141,8 @@ void PieChart::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
states.transform *= getTransform();

if (m_vertices.size() > 0)
target.draw(&m_vertices.front(), m_vertices.size(), m_primitive, states);
if (!m_vertices.empty())
target.draw(m_vertices.data(), m_vertices.size(), sf::PrimitiveType::Triangles, states);
}

} // namespace selbaward
3 changes: 1 addition & 2 deletions src/SelbaWard/PieChart.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
namespace selbaward
{

// SW Pie Chart v1.0.4
// SW Pie Chart v1.0.5
class PieChart : public sf::Drawable, public sf::Transformable
{
public:
Expand All @@ -63,7 +63,6 @@ class PieChart : public sf::Drawable, public sf::Transformable
sf::FloatRect getGlobalBounds() const;

private:
sf::PrimitiveType m_primitive;
std::vector<sf::Vertex> m_vertices;
sf::Vector2f m_size;

Expand Down

0 comments on commit a299a7a

Please sign in to comment.