| #include "rive/shapes/path_composer.hpp" |
| #include "rive/artboard.hpp" |
| #include "rive/renderer.hpp" |
| #include "rive/shapes/path.hpp" |
| #include "rive/shapes/shape.hpp" |
| |
| using namespace rive; |
| |
| static Mat2D identity; |
| |
| PathComposer::PathComposer(Shape* shape) : m_Shape(shape) {} |
| |
| void PathComposer::buildDependencies() { |
| assert(m_Shape != nullptr); |
| m_Shape->addDependent(this); |
| for (auto path : m_Shape->paths()) { |
| path->addDependent(this); |
| } |
| } |
| |
| void PathComposer::update(ComponentDirt value) { |
| if (hasDirt(value, ComponentDirt::Path)) { |
| auto space = m_Shape->pathSpace(); |
| if ((space & PathSpace::Local) == PathSpace::Local) { |
| if (m_LocalPath == nullptr) { |
| m_LocalPath = m_Shape->makeCommandPath(PathSpace::Local); |
| } else { |
| m_LocalPath->reset(); |
| } |
| auto world = m_Shape->worldTransform(); |
| Mat2D inverseWorld = world.invertOrIdentity(); |
| // Get all the paths into local shape space. |
| for (auto path : m_Shape->paths()) { |
| const auto localTransform = inverseWorld * path->pathTransform(); |
| m_LocalPath->addPath(path->commandPath(), localTransform); |
| } |
| } |
| if ((space & PathSpace::World) == PathSpace::World) { |
| if (m_WorldPath == nullptr) { |
| m_WorldPath = m_Shape->makeCommandPath(PathSpace::World); |
| } else { |
| m_WorldPath->reset(); |
| } |
| for (auto path : m_Shape->paths()) { |
| const Mat2D& transform = path->pathTransform(); |
| m_WorldPath->addPath(path->commandPath(), transform); |
| } |
| } |
| } |
| } |