//////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library // Copyright (C) 2007-2025 Laurent Gomila (laurent@sfml-dev.org) // // 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. // //////////////////////////////////////////////////////////// #pragma once //////////////////////////////////////////////////////////// // Headers //////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include namespace sf { class RenderTarget; //////////////////////////////////////////////////////////// /// \brief Set of one or more 2D primitives /// //////////////////////////////////////////////////////////// class SFML_GRAPHICS_API VertexArray : public Drawable { public: //////////////////////////////////////////////////////////// /// \brief Default constructor /// /// Creates an empty vertex array. /// //////////////////////////////////////////////////////////// VertexArray() = default; //////////////////////////////////////////////////////////// /// \brief Construct the vertex array with a type and an initial number of vertices /// /// \param type Type of primitives /// \param vertexCount Initial number of vertices in the array /// //////////////////////////////////////////////////////////// explicit VertexArray(PrimitiveType type, std::size_t vertexCount = 0); //////////////////////////////////////////////////////////// /// \brief Return the vertex count /// /// \return Number of vertices in the array /// //////////////////////////////////////////////////////////// [[nodiscard]] std::size_t getVertexCount() const; //////////////////////////////////////////////////////////// /// \brief Get a read-write access to a vertex by its index /// /// This function doesn't check `index`, it must be in range /// [0, `getVertexCount()` - 1]. The behavior is undefined /// otherwise. /// /// \param index Index of the vertex to get /// /// \return Reference to the `index`-th vertex /// /// \see `getVertexCount` /// //////////////////////////////////////////////////////////// [[nodiscard]] Vertex& operator[](std::size_t index); //////////////////////////////////////////////////////////// /// \brief Get a read-only access to a vertex by its index /// /// This function doesn't check `index`, it must be in range /// [0, `getVertexCount()` - 1]. The behavior is undefined /// otherwise. /// /// \param index Index of the vertex to get /// /// \return Const reference to the `index`-th vertex /// /// \see `getVertexCount` /// //////////////////////////////////////////////////////////// [[nodiscard]] const Vertex& operator[](std::size_t index) const; //////////////////////////////////////////////////////////// /// \brief Clear the vertex array /// /// This function removes all the vertices from the array. /// It doesn't deallocate the corresponding memory, so that /// adding new vertices after clearing doesn't involve /// reallocating all the memory. /// //////////////////////////////////////////////////////////// void clear(); //////////////////////////////////////////////////////////// /// \brief Resize the vertex array /// /// If `vertexCount` is greater than the current size, the previous /// vertices are kept and new (default-constructed) vertices are /// added. /// If `vertexCount` is less than the current size, existing vertices /// are removed from the array. /// /// \param vertexCount New size of the array (number of vertices) /// //////////////////////////////////////////////////////////// void resize(std::size_t vertexCount); //////////////////////////////////////////////////////////// /// \brief Add a vertex to the array /// /// \param vertex Vertex to add /// //////////////////////////////////////////////////////////// void append(const Vertex& vertex); //////////////////////////////////////////////////////////// /// \brief Set the type of primitives to draw /// /// This function defines how the vertices must be interpreted /// when it's time to draw them: /// \li As points /// \li As lines /// \li As triangles /// The default primitive type is `sf::PrimitiveType::Points`. /// /// \param type Type of primitive /// //////////////////////////////////////////////////////////// void setPrimitiveType(PrimitiveType type); //////////////////////////////////////////////////////////// /// \brief Get the type of primitives drawn by the vertex array /// /// \return Primitive type /// //////////////////////////////////////////////////////////// [[nodiscard]] PrimitiveType getPrimitiveType() const; //////////////////////////////////////////////////////////// /// \brief Compute the bounding rectangle of the vertex array /// /// This function returns the minimal axis-aligned rectangle /// that contains all the vertices of the array. /// /// \return Bounding rectangle of the vertex array /// //////////////////////////////////////////////////////////// [[nodiscard]] FloatRect getBounds() const; private: //////////////////////////////////////////////////////////// /// \brief Draw the vertex array to a render target /// /// \param target Render target to draw to /// \param states Current render states /// //////////////////////////////////////////////////////////// void draw(RenderTarget& target, RenderStates states) const override; //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// std::vector m_vertices; //!< Vertices contained in the array PrimitiveType m_primitiveType{PrimitiveType::Points}; //!< Type of primitives to draw }; } // namespace sf //////////////////////////////////////////////////////////// /// \class sf::VertexArray /// \ingroup graphics /// /// `sf::VertexArray` is a very simple wrapper around a dynamic /// array of vertices and a primitives type. /// /// It inherits `sf::Drawable`, but unlike other drawables it /// is not transformable. /// /// Example: /// \code /// sf::VertexArray lines(sf::PrimitiveType::LineStrip, 4); /// lines[0].position = sf::Vector2f(10, 0); /// lines[1].position = sf::Vector2f(20, 0); /// lines[2].position = sf::Vector2f(30, 5); /// lines[3].position = sf::Vector2f(40, 2); /// /// window.draw(lines); /// \endcode /// /// \see `sf::Vertex` /// ////////////////////////////////////////////////////////////