Skip to content

Commit

Permalink
Update Spinning Card to v1.3
Browse files Browse the repository at this point in the history
updates Spinning Card to v1.3, which updates code style but also modifies the parameter given to the spin functions from a float (that can be given to a degrees or a radians function) to an sf::Angle; we now only need one angle type (per direction).
  • Loading branch information
Hapaxia committed Feb 21, 2025
1 parent 512d3e7 commit 4b99fc0
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 58 deletions.
83 changes: 37 additions & 46 deletions src/SelbaWard/SpinningCard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,19 @@

#include <cmath>

namespace
{

constexpr float pi{ 3.14159f };

} // namespace
namespace selbaward
{

SpinningCard::SpinningCard(const sf::Sprite& sprite)
#ifdef USE_SFML_PRE_2_4
: m_vertices(sf::PrimitiveType::TrianglesFan, 6)
#else // USE_SFML_PRE_2_4
: m_vertices(sf::PrimitiveType::TriangleFan, 6)
#endif // USE_SFML_PRE_2_4
: m_vertices(sf::PrimitiveType::TriangleFan, 6u)
, m_pTexture{ nullptr }
, m_initial()
, m_pi{ 3.14159f }
, m_initial{}
, m_depth{ 0.2f }
{
// copy sprite's origin, position, rotation and scale in an attempt to look like the sprite
Expand All @@ -62,68 +63,58 @@ SpinningCard::SpinningCard(const sf::Sprite& sprite)
m_initial = sprite.getLocalBounds();

// start off by setting all vertices to top-left...
for (unsigned int i{ 0 }; i < 5; ++i)
for (std::size_t i{ 0u }; i < 5u; ++i)
m_vertices[i].position = sprite.getPosition() - sprite.getOrigin(); // top-left

// ...then, add offsets to individual vertices
m_vertices[0].position += sf::Vector2f(static_cast<float>(m_initial.size.x) / 2, static_cast<float>(m_initial.size.y) / 2); // centre
m_vertices[2].position += sf::Vector2f(m_initial.size.x, 0.f); // top-right
m_vertices[3].position += sf::Vector2f(m_initial.size.x, m_initial.size.y); // bottom-right
m_vertices[4].position += sf::Vector2f(0.f, m_initial.size.y); // bottom-left
m_vertices[0u].position += m_initial.size / 2.f; // centre
m_vertices[2u].position.x += m_initial.size.x; // top-right
m_vertices[3u].position += m_initial.size; // bottom-right
m_vertices[4u].position.y += m_initial.size.y; // bottom-left

// set texture coordinates to the same as the sprite's (using the same method for texCoords as position above)
for (unsigned int i{ 0 }; i < 5; ++i)
m_vertices[i].texCoords = sf::Vector2f(static_cast<float>(sprite.getTextureRect().position.x), static_cast<float>(sprite.getTextureRect().position.x)); // top-left
m_vertices[0].texCoords += sf::Vector2f(static_cast<float>(sprite.getTextureRect().size.x) / 2, static_cast<float>(sprite.getTextureRect().size.y) / 2); // centre
m_vertices[2].texCoords += sf::Vector2f(static_cast<float>(sprite.getTextureRect().size.x), 0.f); // top-right
m_vertices[3].texCoords += sf::Vector2f(static_cast<float>(sprite.getTextureRect().size.x), static_cast<float>(sprite.getTextureRect().size.y)); // bottom-right
m_vertices[4].texCoords += sf::Vector2f(0.f, static_cast<float>(sprite.getTextureRect().size.y)); // bottom-left
for (std::size_t i{ 0u }; i < 5u; ++i)
m_vertices[i].texCoords = static_cast<sf::Vector2f>(sprite.getTextureRect().position); // top-left
m_vertices[0u].texCoords += static_cast<sf::Vector2f>(sprite.getTextureRect().size) / 2.f; // centre
m_vertices[2u].texCoords.x += static_cast<float>(sprite.getTextureRect().size.x); // top-right
m_vertices[3u].texCoords += static_cast<sf::Vector2f>(sprite.getTextureRect().size); // bottom-right
m_vertices[4u].texCoords.y += static_cast<float>(sprite.getTextureRect().size.y); // bottom-left

// set colours of vertices to match sprite's colour
for (unsigned int i{ 0 }; i < 5; ++i)
for (std::size_t i{ 0u }; i < 5u; ++i)
m_vertices[i].color = sprite.getColor();

// weld last vertex to second vertex to complete the solid (matches its position, texture co-ordinate, and colour)
m_vertices[5] = m_vertices[1];
m_vertices[5u] = m_vertices[1u];

// store a pointer to the sprite's texture
m_pTexture = &sprite.getTexture();
}

void SpinningCard::spin(float angleInDegrees)
void SpinningCard::spin(const sf::Angle angle)
{
spinRadians(angleInDegrees * m_pi / 180);
}

void SpinningCard::spinRadians(float angleInRadians)
{
angleInRadians -= m_pi / 2;
m_vertices[0].position = sf::Vector2f(m_initial.position.x + m_initial.size.x / 2, m_initial.position.y + m_initial.size.y / 2);
m_vertices[1].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians) + 1) * m_initial.size.x / 2, m_initial.position.y - std::cos(angleInRadians) * m_depth * m_initial.size.y / 2);
m_vertices[2].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians + m_pi) + 1) * m_initial.size.x / 2, m_initial.position.y - std::cos(angleInRadians + m_pi) * m_depth * m_initial.size.y / 2);
m_vertices[3].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians + m_pi) + 1) * m_initial.size.x / 2, m_initial.position.y + (std::cos(angleInRadians + m_pi) * m_depth + 2) * m_initial.size.y / 2);
m_vertices[4].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians) + 1) * m_initial.size.x / 2, m_initial.position.y + (std::cos(angleInRadians) * m_depth + 2) * m_initial.size.y / 2);
const float angleInRadians{ angle.asRadians() - (pi / 2.f) };
m_vertices[0u].position = sf::Vector2f(m_initial.position.x + m_initial.size.x / 2.f, m_initial.position.y + m_initial.size.y / 2.f);
m_vertices[1u].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians) + 1.f) * m_initial.size.x / 2.f, m_initial.position.y - std::cos(angleInRadians) * m_depth * m_initial.size.y / 2.f);
m_vertices[2u].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians + pi) + 1.f) * m_initial.size.x / 2.f, m_initial.position.y - std::cos(angleInRadians + pi) * m_depth * m_initial.size.y / 2.f);
m_vertices[3u].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians + pi) + 1.f) * m_initial.size.x / 2.f, m_initial.position.y + (std::cos(angleInRadians + pi) * m_depth + 2.f) * m_initial.size.y / 2.f);
m_vertices[4u].position = sf::Vector2f(m_initial.position.x + (std::sin(angleInRadians) + 1.f) * m_initial.size.x / 2.f, m_initial.position.y + (std::cos(angleInRadians) * m_depth + 2.f) * m_initial.size.y / 2.f);

// weld last vertex to second vertex (to complete the solid)
m_vertices[5] = m_vertices[1];
}

void SpinningCard::spinVertically(float angleInDegrees)
{
spinVerticallyRadians(angleInDegrees * m_pi / 180);
m_vertices[5u] = m_vertices[1u];
}

void SpinningCard::spinVerticallyRadians(float angleInRadians)
void SpinningCard::spinVertically(const sf::Angle angle)
{
angleInRadians -= m_pi / 2;
m_vertices[0].position = sf::Vector2f(m_initial.position.x + m_initial.size.x / 2, m_initial.position.y + m_initial.size.y / 2);
m_vertices[1].position = sf::Vector2f(m_initial.position.x - std::cos(angleInRadians) * m_depth * m_initial.size.x / 2, m_initial.position.y + (std::sin(angleInRadians) + 1) * m_initial.size.y / 2);
m_vertices[4].position = sf::Vector2f(m_initial.position.x - std::cos(angleInRadians + m_pi) * m_depth * m_initial.size.x / 2, m_initial.position.y + (std::sin(angleInRadians + m_pi) + 1) * m_initial.size.y / 2);
m_vertices[3].position = sf::Vector2f(m_initial.position.x + (std::cos(angleInRadians + m_pi) * m_depth + 2) * m_initial.size.x / 2, m_initial.position.y + (std::sin(angleInRadians + m_pi) + 1) * m_initial.size.y / 2);
m_vertices[2].position = sf::Vector2f(m_initial.position.x + (std::cos(angleInRadians) * m_depth + 2) * m_initial.size.x / 2, m_initial.position.y + (std::sin(angleInRadians) + 1) * m_initial.size.y / 2);
const float angleInRadians{ angle.asRadians() - (pi / 2.f) };
m_vertices[0u].position = sf::Vector2f(m_initial.position.x + m_initial.size.x / 2.f, m_initial.position.y + m_initial.size.y / 2.f);
m_vertices[1u].position = sf::Vector2f(m_initial.position.x - std::cos(angleInRadians) * m_depth * m_initial.size.x / 2.f, m_initial.position.y + (std::sin(angleInRadians) + 1.f) * m_initial.size.y / 2.f);
m_vertices[4u].position = sf::Vector2f(m_initial.position.x - std::cos(angleInRadians + pi) * m_depth * m_initial.size.x / 2.f, m_initial.position.y + (std::sin(angleInRadians + pi) + 1.f) * m_initial.size.y / 2.f);
m_vertices[3u].position = sf::Vector2f(m_initial.position.x + (std::cos(angleInRadians + pi) * m_depth + 2.f) * m_initial.size.x / 2.f, m_initial.position.y + (std::sin(angleInRadians + pi) + 1.f) * m_initial.size.y / 2.f);
m_vertices[2u].position = sf::Vector2f(m_initial.position.x + (std::cos(angleInRadians) * m_depth + 2.f) * m_initial.size.x / 2.f, m_initial.position.y + (std::sin(angleInRadians) + 1.f) * m_initial.size.y / 2.f);

// weld last vertex to second vertex (to complete the solid)
m_vertices[5] = m_vertices[1];
m_vertices[5u] = m_vertices[1u];
}

void SpinningCard::setDepth(float depth)
Expand Down
18 changes: 6 additions & 12 deletions src/SelbaWard/SpinningCard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,23 @@
#include "Common.hpp"
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Graphics/VertexArray.hpp>
#include <SFML/System/Angle.hpp>

namespace selbaward
{

// SpinningCard v1.2.4
// SpinningCard v1.3.0
class SpinningCard : public sf::Drawable, public sf::Transformable
{
public:
// pass the sprite that it mimics when constructing the card
SpinningCard(const sf::Sprite& sprite);

// rotate around the y axis (in degrees)
void spin(float angleInDegrees);
// rotate around the y axis
void spin(sf::Angle angle);

// rotate around the y axis (in radians)
void spinRadians(float angleInRadians);

// rotate around the x axis (in degrees)
void spinVertically(float angleInDegrees);

// rotate around the x axis (in radians)
void spinVerticallyRadians(float angleInRadians);
// rotate around the x axis
void spinVertically(sf::Angle angle);

// set depth of fake perspective
void setDepth(float depth);
Expand All @@ -79,7 +74,6 @@ class SpinningCard : public sf::Drawable, public sf::Transformable
sf::VertexArray m_vertices;
const sf::Texture* m_pTexture;
sf::FloatRect m_initial;
const float m_pi;
float m_depth;
};

Expand Down

0 comments on commit 4b99fc0

Please sign in to comment.