//////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2014 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 #include namespace cpp3ds { //////////////////////////////////////////////////////////// Sprite::Sprite() : m_texture (NULL), m_textureRect() { m_vertices = new Vertex[4]; } //////////////////////////////////////////////////////////// Sprite::Sprite(const Sprite& copy) : Transformable(copy) , m_texture (copy.m_texture) , m_textureRect (copy.m_textureRect) { m_vertices = new Vertex[4]; memcpy(m_vertices, copy.m_vertices, sizeof(Vertex)*4); } //////////////////////////////////////////////////////////// Sprite& Sprite::operator=(const Sprite& other) { Transformable::operator=(other); m_texture = other.m_texture; m_textureRect = other.m_textureRect; memcpy(m_vertices, other.m_vertices, sizeof(Vertex)*4); return *this; } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture) : m_texture (NULL), m_textureRect() { m_vertices = new Vertex[4]; setTexture(texture); } //////////////////////////////////////////////////////////// Sprite::Sprite(const Texture& texture, const IntRect& rectangle) : m_texture (NULL), m_textureRect() { m_vertices = new Vertex[4]; setTexture(texture); setTextureRect(rectangle); } //////////////////////////////////////////////////////////// Sprite::~Sprite() { delete[] m_vertices; } //////////////////////////////////////////////////////////// void Sprite::setTexture(const Texture& texture, bool resetRect) { // Recompute the texture area if requested, or if there was no valid texture & rect before if (resetRect || (!m_texture && (m_textureRect == IntRect()))) setTextureRect(IntRect(0, 0, texture.getSize().x, texture.getSize().y)); // Assign the new texture m_texture = &texture; } //////////////////////////////////////////////////////////// void Sprite::setTextureRect(const IntRect& rectangle) { if (rectangle != m_textureRect) { m_textureRect = rectangle; updatePositions(); updateTexCoords(); } } //////////////////////////////////////////////////////////// void Sprite::setColor(const Color& color) { // Update the vertices' color m_vertices[0].color = color; m_vertices[1].color = color; m_vertices[2].color = color; m_vertices[3].color = color; } //////////////////////////////////////////////////////////// const Texture* Sprite::getTexture() const { return m_texture; } //////////////////////////////////////////////////////////// const IntRect& Sprite::getTextureRect() const { return m_textureRect; } //////////////////////////////////////////////////////////// const Color& Sprite::getColor() const { return m_vertices[0].color; } //////////////////////////////////////////////////////////// FloatRect Sprite::getLocalBounds() const { float width = static_cast(std::abs(m_textureRect.width)); float height = static_cast(std::abs(m_textureRect.height)); return FloatRect(0.f, 0.f, width, height); } //////////////////////////////////////////////////////////// FloatRect Sprite::getGlobalBounds() const { return getTransform().transformRect(getLocalBounds()); } //////////////////////////////////////////////////////////// void Sprite::draw(RenderTarget& target, RenderStates states) const { if (m_texture) { states.transform *= getTransform(); states.texture = m_texture; target.draw(m_vertices, 4, TrianglesStrip, states); } } //////////////////////////////////////////////////////////// void Sprite::updatePositions() { FloatRect bounds = getLocalBounds(); m_vertices[0].position = Vector2f(0, 0); m_vertices[1].position = Vector2f(0, bounds.height); m_vertices[2].position = Vector2f(bounds.width, 0); m_vertices[3].position = Vector2f(bounds.width, bounds.height); } //////////////////////////////////////////////////////////// void Sprite::updateTexCoords() { float left = static_cast(m_textureRect.left); float right = left + m_textureRect.width; float top = static_cast(m_textureRect.top); float bottom = top + m_textureRect.height; m_vertices[0].texCoords = Vector2f(left, top); m_vertices[1].texCoords = Vector2f(left, bottom); m_vertices[2].texCoords = Vector2f(right, top); m_vertices[3].texCoords = Vector2f(right, bottom); } } // namespace cpp3ds