diff options
Diffstat (limited to 'external')
-rw-r--r-- | external/RoundedRectangleShape.cpp | 100 | ||||
-rw-r--r-- | external/RoundedRectangleShape.hpp | 151 |
2 files changed, 251 insertions, 0 deletions
diff --git a/external/RoundedRectangleShape.cpp b/external/RoundedRectangleShape.cpp new file mode 100644 index 0000000..3dc3274 --- /dev/null +++ b/external/RoundedRectangleShape.cpp @@ -0,0 +1,100 @@ +//////////////////////////////////////////////////////////// +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include "RoundedRectangleShape.hpp" +#include <cmath> + +namespace sf +{ +//////////////////////////////////////////////////////////// +RoundedRectangleShape::RoundedRectangleShape(const Vector2f& size, float radius, unsigned int cornerPointCount) +{ + mySize = size; + myRadius = radius; + myCornerPointCount = cornerPointCount; + update(); +} + +//////////////////////////////////////////////////////////// +void RoundedRectangleShape::setSize(const Vector2f& size) +{ + mySize = size; + update(); +} + +//////////////////////////////////////////////////////////// +const Vector2f& RoundedRectangleShape::getSize() const +{ + return mySize; +} + +//////////////////////////////////////////////////////////// +void RoundedRectangleShape::setCornersRadius(float radius) +{ + myRadius = radius; + update(); +} + +//////////////////////////////////////////////////////////// +float RoundedRectangleShape::getCornersRadius() const +{ + return myRadius; +} + +//////////////////////////////////////////////////////////// +void RoundedRectangleShape::setCornerPointCount(unsigned int count) +{ + myCornerPointCount = count; + update(); +} + +//////////////////////////////////////////////////////////// +std::size_t RoundedRectangleShape::getPointCount() const +{ + return myCornerPointCount*4; +} + +//////////////////////////////////////////////////////////// +sf::Vector2f RoundedRectangleShape::getPoint(std::size_t index) const +{ + if(index >= myCornerPointCount*4) + return sf::Vector2f(0,0); + + float deltaAngle = 90.0f/(myCornerPointCount-1); + sf::Vector2f center; + unsigned int centerIndex = index/myCornerPointCount; + static const float pi = 3.141592654f; + + switch(centerIndex) + { + case 0: center.x = mySize.x - myRadius; center.y = myRadius; break; + case 1: center.x = myRadius; center.y = myRadius; break; + case 2: center.x = myRadius; center.y = mySize.y - myRadius; break; + case 3: center.x = mySize.x - myRadius; center.y = mySize.y - myRadius; break; + } + + return sf::Vector2f(myRadius*cos(deltaAngle*(index-centerIndex)*pi/180)+center.x, + -myRadius*sin(deltaAngle*(index-centerIndex)*pi/180)+center.y); +} +} // namespace sf
\ No newline at end of file diff --git a/external/RoundedRectangleShape.hpp b/external/RoundedRectangleShape.hpp new file mode 100644 index 0000000..ab1c880 --- /dev/null +++ b/external/RoundedRectangleShape.hpp @@ -0,0 +1,151 @@ +//////////////////////////////////////////////////////////// +// +// This software is provided 'as-is', without any express or implied warranty. +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it freely, +// subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; +// you must not claim that you wrote the original software. +// If you use this software in a product, an acknowledgment +// in the product documentation would be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, +// and must not be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source distribution. +// +//////////////////////////////////////////////////////////// + +#ifndef ROUNDEDRECTANGLESHAPE_HPP +#define ROUNDEDRECTANGLESHAPE_HPP + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include <SFML/Graphics/Shape.hpp> + +namespace sf +{ +//////////////////////////////////////////////////////////// +/// \brief Specialized shape representing a rectangle +/// with rounded corners +//////////////////////////////////////////////////////////// +class RoundedRectangleShape : public sf::Shape +{ + public: + //////////////////////////////////////////////////////////// + /// \brief Default constructor + /// + /// \param size Size of the rectangle + /// \param radius Radius for each rounded corner + /// \param cornerPointCount Number of points of each corner + /// + //////////////////////////////////////////////////////////// + explicit RoundedRectangleShape(const Vector2f& size = Vector2f(0, 0), float radius = 0, unsigned int cornerPointCount = 0); + + //////////////////////////////////////////////////////////// + /// \brief Set the size of the rounded rectangle + /// + /// \param size New size of the rounded rectangle + /// + /// \see getSize + /// + //////////////////////////////////////////////////////////// + void setSize(const Vector2f& size); + + //////////////////////////////////////////////////////////// + /// \brief Get the size of the rounded rectangle + /// + /// \return Size of the rounded rectangle + /// + /// \see setSize + /// + //////////////////////////////////////////////////////////// + const Vector2f& getSize() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the radius of the rounded corners + /// + /// \param radius Radius of the rounded corners + /// + /// \see getCornersRadius + /// + //////////////////////////////////////////////////////////// + void setCornersRadius(float radius); + + //////////////////////////////////////////////////////////// + /// \brief Get the radius of the rounded corners + /// + /// \return Radius of the rounded corners + /// + /// \see setCornersRadius + /// + //////////////////////////////////////////////////////////// + float getCornersRadius() const; + + //////////////////////////////////////////////////////////// + /// \brief Set the number of points of each corner + /// + /// \param count New number of points of the rounded rectangle + /// + /// \see getPointCount + /// + //////////////////////////////////////////////////////////// + void setCornerPointCount(unsigned int count); + + //////////////////////////////////////////////////////////// + /// \brief Get the number of points defining the rounded rectangle + /// + /// \return Number of points of the rounded rectangle + /// + //////////////////////////////////////////////////////////// + virtual std::size_t getPointCount() const; + + //////////////////////////////////////////////////////////// + /// \brief Get a point of the rounded rectangle + /// + /// The result is undefined if \a index is out of the valid range. + /// + /// \param index Index of the point to get, in range [0 .. GetPointCount() - 1] + /// + /// \return Index-th point of the shape + /// + //////////////////////////////////////////////////////////// + virtual sf::Vector2f getPoint(std::size_t index) const; + + private: + //////////////////////////////////////////////////////////// + // Member data + //////////////////////////////////////////////////////////// + Vector2f mySize; + float myRadius; + unsigned int myCornerPointCount; +}; +} +#endif // ROUNDEDRECTANGLESHAPE_HPP + +//////////////////////////////////////////////////////////// +/// \class sf::RoundedRectangleShape +/// \ingroup graphics +/// +/// This class inherits all the functions of sf::Transformable +/// (position, rotation, scale, bounds, ...) as well as the +/// functions of sf::Shape (outline, color, texture, ...). +/// +/// Usage example: +/// \code +/// sf::RoundedRectangleShape roundedRectangle; +/// rectangle.setSize(sf::Vector2f(100, 50)); +/// rectangle.setCornersRadius(5); +/// rectangle.setOutlineThickness(5); +/// rectangle.setPosition(10, 20); +/// ... +/// window.draw(rectangle); +/// \endcode +/// +/// \see sf::Shape, sf::CircleShape, sf::ConvexShape +/// +////////////////////////////////////////////////////////////
\ No newline at end of file |