| #ifndef _RIVE_PATH_HPP_ |
| #define _RIVE_PATH_HPP_ |
| #include "rive/command_path.hpp" |
| #include "rive/generated/shapes/path_base.hpp" |
| #include "rive/math/mat2d.hpp" |
| #include <vector> |
| |
| namespace rive { |
| class Shape; |
| class PathVertex; |
| |
| #ifdef ENABLE_QUERY_FLAT_VERTICES |
| /// Optionally compiled in for tools that need to compute per frame world |
| /// transformed path vertices. These should not be used at runtime as it's |
| /// not optimized for performance (it does a lot of memory allocation). |
| |
| /// A flattened path is composed of only linear |
| /// and cubic vertices. No corner vertices and it's entirely in world space. |
| /// This is helpful for getting a close to identical representation of the |
| /// vertices used to issue the high level path draw commands. |
| class FlattenedPath { |
| private: |
| std::vector<PathVertex*> m_Vertices; |
| |
| public: |
| ~FlattenedPath(); |
| |
| const std::vector<PathVertex*>& vertices() const { return m_Vertices; } |
| void addVertex(PathVertex* vertex, const Mat2D& transform); |
| }; |
| #endif |
| |
| class Path : public PathBase { |
| protected: |
| Shape* m_Shape = nullptr; |
| std::unique_ptr<CommandPath> m_CommandPath; |
| std::vector<PathVertex*> m_Vertices; |
| |
| public: |
| Shape* shape() const { return m_Shape; } |
| StatusCode onAddedClean(CoreContext* context) override; |
| void buildDependencies() override; |
| virtual const Mat2D& pathTransform() const; |
| CommandPath* commandPath() const { return m_CommandPath.get(); } |
| void update(ComponentDirt value) override; |
| |
| void addVertex(PathVertex* vertex); |
| |
| virtual void markPathDirty(); |
| virtual bool isPathClosed() const { return true; } |
| void onDirty(ComponentDirt dirt) override; |
| #ifdef ENABLE_QUERY_FLAT_VERTICES |
| FlattenedPath* makeFlat(bool transformToParent); |
| #endif |
| |
| #ifdef TESTING |
| std::vector<PathVertex*>& vertices() { return m_Vertices; } |
| #endif |
| |
| // pour ourselves into a command-path |
| void buildPath(CommandPath&) const; |
| }; |
| } // namespace rive |
| |
| #endif |