From 441703a99742699d580a1ed5329a4568a17c8eae Mon Sep 17 00:00:00 2001 From: Laurent Gomila Date: Sun, 5 Feb 2012 21:51:59 +0100 Subject: [PATCH] Added the sfTransformable class --- include/SFML/Graphics/Transform.h | 2 +- include/SFML/Graphics/Transformable.h | 220 ++++++++++++++++++++++++ include/SFML/Graphics/Types.h | 1 + src/SFML/Graphics/CMakeLists.txt | 3 + src/SFML/Graphics/SpriteStruct.h | 2 +- src/SFML/Graphics/Transformable.cpp | 173 +++++++++++++++++++ src/SFML/Graphics/TransformableStruct.h | 46 +++++ 7 files changed, 445 insertions(+), 2 deletions(-) create mode 100644 include/SFML/Graphics/Transformable.h create mode 100644 src/SFML/Graphics/Transformable.cpp create mode 100644 src/SFML/Graphics/TransformableStruct.h diff --git a/include/SFML/Graphics/Transform.h b/include/SFML/Graphics/Transform.h index 04bcbe2..eca7959 100644 --- a/include/SFML/Graphics/Transform.h +++ b/include/SFML/Graphics/Transform.h @@ -217,4 +217,4 @@ CSFML_GRAPHICS_API void sfTransform_Scale(sfTransform* transform, float scaleX, CSFML_GRAPHICS_API void sfTransform_ScaleWithCenter(sfTransform* transform, float scaleX, float scaleY, float centerX, float centerY); -#endif // SFML_TEXTURE_H +#endif // SFML_TRANSFORM_H diff --git a/include/SFML/Graphics/Transformable.h b/include/SFML/Graphics/Transformable.h new file mode 100644 index 0000000..a01f1a4 --- /dev/null +++ b/include/SFML/Graphics/Transformable.h @@ -0,0 +1,220 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) +// +// 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 SFML_TRANSFORMABLE_H +#define SFML_TRANSFORMABLE_H + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +//////////////////////////////////////////////////////////// +/// \brief Create a new transformable +/// +/// \return A new sfTransformable object +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API sfTransformable* sfTransformable_Create(void); + +//////////////////////////////////////////////////////////// +/// \brief Copy an existing transformable +/// +/// \param transformable Transformable to copy +/// +/// \return Copied object +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API sfTransformable* sfTransformable_Copy(sfTransformable* transformable); + +//////////////////////////////////////////////////////////// +/// \brief Destroy an existing transformable +/// +/// \param transformable Transformable to delete +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_Destroy(sfTransformable* transformable); + +//////////////////////////////////////////////////////////// +/// \brief Set the position of a transformable +/// +/// This function completely overwrites the previous position. +/// See sfTransformable_Move to apply an offset based on the previous position instead. +/// The default position of a transformable object is (0, 0). +/// +/// \param transformable Transformable object +/// \param x X coordinate of the new position +/// \param y Y coordinate of the new position +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_SetPosition(sfTransformable* transformable, float x, float y); + +//////////////////////////////////////////////////////////// +/// \brief Set the orientation of a transformable +/// +/// This function completely overwrites the previous rotation. +/// See sfTransformable_Rotate to add an angle based on the previous rotation instead. +/// The default rotation of a transformable object is 0. +/// +/// \param transformable Transformable object +/// \param angle New rotation, in degrees +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_SetRotation(sfTransformable* transformable, float angle); + +//////////////////////////////////////////////////////////// +/// \brief Set the scale factors of a transformable +/// +/// This function completely overwrites the previous scale. +/// See sfTransformable_Scale to add a factor based on the previous scale instead. +/// The default scale of a transformable object is (1, 1). +/// +/// \param transformable Transformable object +/// \param factorX New horizontal scale factor +/// \param factorY New vertical scale factor +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_SetScale(sfTransformable* transformable, float factorX, float factorY); + +//////////////////////////////////////////////////////////// +/// \brief Set the local origin of a transformable +/// +/// The origin of an object defines the center point for +/// all transformations (position, scale, rotation). +/// The coordinates of this point must be relative to the +/// top-left corner of the object, and ignore all +/// transformations (position, scale, rotation). +/// The default origin of a transformable object is (0, 0). +/// +/// \param transformable Transformable object +/// \param x X coordinate of the new origin +/// \param y Y coordinate of the new origin +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_SetOrigin(sfTransformable* transformable, float x, float y); + +//////////////////////////////////////////////////////////// +/// \brief Get the position of a transformable +/// +/// \param transformable Transformable object +/// +/// \return Current position +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_GetPosition(const sfTransformable* transformable, float* x, float* y); + +//////////////////////////////////////////////////////////// +/// \brief Get the orientation of a transformable +/// +/// The rotation is always in the range [0, 360]. +/// +/// \param transformable Transformable object +/// +/// \return Current rotation, in degrees +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API float sfTransformable_GetRotation(const sfTransformable* transformable); + +//////////////////////////////////////////////////////////// +/// \brief Get the current scale of a transformable +/// +/// \param transformable Transformable object +/// +/// \return Current scale factors +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_GetScale(const sfTransformable* transformable, float* x, float* y); + +//////////////////////////////////////////////////////////// +/// \brief Get the local origin of a transformable +/// +/// \param transformable Transformable object +/// +/// \return Current origin +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_GetOrigin(const sfTransformable* transformable, float* x, float* y); + +//////////////////////////////////////////////////////////// +/// \brief Move a transformable by a given offset +/// +/// This function adds to the current position of the object, +/// unlike sfTransformable_SetPosition which overwrites it. +/// +/// \param transformable Transformable object +/// \param offsetX X offset +/// \param offsetY Y offset +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_Move(sfTransformable* transformable, float offsetX, float offsetY); + +//////////////////////////////////////////////////////////// +/// \brief Rotate a transformable +/// +/// This function adds to the current rotation of the object, +/// unlike sfTransformable_SetRotation which overwrites it. +/// +/// \param transformable Transformable object +/// \param angle Angle of rotation, in degrees +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_Rotate(sfTransformable* transformable, float angle); + +//////////////////////////////////////////////////////////// +/// \brief Scale a transformable +/// +/// This function multiplies the current scale of the object, +/// unlike sfTransformable_SetScale which overwrites it. +/// +/// \param transformable Transformable object +/// \param factorX Horizontal scale factor +/// \param factorY Vertical scale factor +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API void sfTransformable_Scale(sfTransformable* transformable, float factorX, float factorY); + +//////////////////////////////////////////////////////////// +/// \brief Get the combined transform of a transformable +/// +/// \param transformable Transformable object +/// +/// \return Transform combining the position/rotation/scale/origin of the object +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API const sfTransform* sfTransformable_GetTransform(const sfTransformable* transformable); + +//////////////////////////////////////////////////////////// +/// \brief Get the inverse of the combined transform of a transformable +/// +/// \param transformable Transformable object +/// +/// \return Inverse of the combined transformations applied to the object +/// +//////////////////////////////////////////////////////////// +CSFML_GRAPHICS_API const sfTransform* sfTransformable_GetInverseTransform(const sfTransformable* transformable); + + +#endif // SFML_TRANSFORMABLE_H diff --git a/include/SFML/Graphics/Types.h b/include/SFML/Graphics/Types.h index 81c55b2..c27ff31 100644 --- a/include/SFML/Graphics/Types.h +++ b/include/SFML/Graphics/Types.h @@ -39,6 +39,7 @@ typedef struct sfSprite sfSprite; typedef struct sfText sfText; typedef struct sfTexture sfTexture; typedef struct sfTransform sfTransform; +typedef struct sfTransformable sfTransformable; typedef struct sfVertexArray sfVertexArray; typedef struct sfView sfView; diff --git a/src/SFML/Graphics/CMakeLists.txt b/src/SFML/Graphics/CMakeLists.txt index 97360be..e0cab0d 100644 --- a/src/SFML/Graphics/CMakeLists.txt +++ b/src/SFML/Graphics/CMakeLists.txt @@ -48,6 +48,9 @@ set(SRC ${SRCROOT}/Transform.cpp ${SRCROOT}/TransformStruct.h ${INCROOT}/Transform.h + ${SRCROOT}/Transformable.cpp + ${SRCROOT}/TransformableStruct.h + ${INCROOT}/Transformable.h ${INCROOT}/Types.h ${INCROOT}/Vertex.h ${SRCROOT}/VertexArray.cpp diff --git a/src/SFML/Graphics/SpriteStruct.h b/src/SFML/Graphics/SpriteStruct.h index 4d7bac0..d4ef2b1 100644 --- a/src/SFML/Graphics/SpriteStruct.h +++ b/src/SFML/Graphics/SpriteStruct.h @@ -34,7 +34,7 @@ //////////////////////////////////////////////////////////// -// Internal structure of sfMusic +// Internal structure of sfSprite //////////////////////////////////////////////////////////// struct sfSprite { diff --git a/src/SFML/Graphics/Transformable.cpp b/src/SFML/Graphics/Transformable.cpp new file mode 100644 index 0000000..a5f407f --- /dev/null +++ b/src/SFML/Graphics/Transformable.cpp @@ -0,0 +1,173 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) +// +// 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 +#include +#include + + +//////////////////////////////////////////////////////////// +sfTransformable* sfTransformable_Create(void) +{ + sfTransformable* transformable = new sfTransformable; + + return transformable; +} + + +//////////////////////////////////////////////////////////// +sfTransformable* sfTransformable_Copy(sfTransformable* transformable) +{ + CSFML_CHECK_RETURN(transformable, NULL); + + return new sfTransformable(*transformable); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_Destroy(sfTransformable* transformable) +{ + delete transformable; +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_SetPosition(sfTransformable* transformable, float x, float y) +{ + CSFML_CALL(transformable, SetPosition(x, y)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_SetRotation(sfTransformable* transformable, float angle) +{ + CSFML_CALL(transformable, SetRotation(angle)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_SetScale(sfTransformable* transformable, float factorX, float factorY) +{ + CSFML_CALL(transformable, SetScale(factorX, factorY)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_SetOrigin(sfTransformable* transformable, float x, float y) +{ + CSFML_CALL(transformable, SetOrigin(x, y)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_GetPosition(const sfTransformable* transformable, float* x, float* y) +{ + CSFML_CHECK(transformable); + + sf::Vector2f point = transformable->This.GetPosition(); + + if (x) + *x = point.x; + if (y) + *y = point.y; +} + + +//////////////////////////////////////////////////////////// +float sfTransformable_GetRotation(const sfTransformable* transformable) +{ + CSFML_CALL_RETURN(transformable, GetRotation(), 0.f); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_GetScale(const sfTransformable* transformable, float* x, float* y) +{ + CSFML_CHECK(transformable); + + sf::Vector2f point = transformable->This.GetScale(); + + if (x) + *x = point.x; + if (y) + *y = point.y; +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_GetOrigin(const sfTransformable* transformable, float* x, float* y) +{ + CSFML_CHECK(transformable); + + sf::Vector2f point = transformable->This.GetOrigin(); + + if (x) + *x = point.x; + if (y) + *y = point.y; +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_Move(sfTransformable* transformable, float offsetX, float offsetY) +{ + CSFML_CALL(transformable, Move(offsetX, offsetY)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_Rotate(sfTransformable* transformable, float angle) +{ + CSFML_CALL(transformable, Rotate(angle)); +} + + +//////////////////////////////////////////////////////////// +void sfTransformable_Scale(sfTransformable* transformable, float factorX, float factorY) +{ + CSFML_CALL(transformable, Scale(factorX, factorY)); +} + + +//////////////////////////////////////////////////////////// +const sfTransform* sfTransformable_GetTransform(const sfTransformable* transformable) +{ + CSFML_CHECK_RETURN(transformable, NULL); + + transformable->Transform.This = transformable->This.GetTransform(); + return &transformable->Transform; +} + + +//////////////////////////////////////////////////////////// +const sfTransform* sfTransformable_GetInverseTransform(const sfTransformable* transformable) +{ + CSFML_CHECK_RETURN(transformable, NULL); + + transformable->InverseTransform.This = transformable->This.GetInverseTransform(); + return &transformable->InverseTransform; +} diff --git a/src/SFML/Graphics/TransformableStruct.h b/src/SFML/Graphics/TransformableStruct.h new file mode 100644 index 0000000..f280147 --- /dev/null +++ b/src/SFML/Graphics/TransformableStruct.h @@ -0,0 +1,46 @@ +//////////////////////////////////////////////////////////// +// +// SFML - Simple and Fast Multimedia Library +// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) +// +// 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 SFML_TRANSFORMABLESTRUCT_H +#define SFML_TRANSFORMABLESTRUCT_H + +//////////////////////////////////////////////////////////// +// Headers +//////////////////////////////////////////////////////////// +#include +#include + + +//////////////////////////////////////////////////////////// +// Internal structure of sfTransformable +//////////////////////////////////////////////////////////// +struct sfTransformable +{ + sf::Transformable This; + mutable sfTransform Transform; + mutable sfTransform InverseTransform; +}; + + +#endif // SFML_TRANSFORMABLESTRUCT_H