| #include "rive/node.hpp" | |
| #include "rive/world_transform_component.hpp" | |
| #include "rive/layout_component.hpp" | |
| #include "rive/artboard.hpp" | |
| #include "rive/artboard_host.hpp" | |
| using namespace rive; | |
| void Node::xChanged() { markTransformDirty(); } | |
| void Node::yChanged() { markTransformDirty(); } | |
| // A node that has not been parented into an artboard has no root to be | |
| // relative to, so both report the initial value rather than dereferencing. | |
| float Node::computedRootX() | |
| { | |
| if (artboard() == nullptr) | |
| { | |
| return 0.0f; | |
| } | |
| auto wt = worldTransform(); | |
| auto rootPos = artboard()->rootTransform(Vec2D(wt[4], wt[5])); | |
| return rootPos.x; | |
| }; | |
| float Node::computedRootY() | |
| { | |
| if (artboard() == nullptr) | |
| { | |
| return 0.0f; | |
| } | |
| auto wt = worldTransform(); | |
| auto rootPos = artboard()->rootTransform(Vec2D(wt[4], wt[5])); | |
| return rootPos.y; | |
| }; | |
| Mat2D Node::localTransform() | |
| { | |
| if (m_LocalTransformNeedsRecompute) | |
| { | |
| m_LocalTransformNeedsRecompute = false; | |
| if (m_ParentTransformComponent != nullptr) | |
| { | |
| auto parentWorld = m_ParentTransformComponent->worldTransform(); | |
| Mat2D inverse; | |
| if (parentWorld.invert(&inverse)) | |
| { | |
| m_LocalTransform = inverse * worldTransform(); | |
| return m_LocalTransform; | |
| } | |
| } | |
| m_LocalTransform = Mat2D(); | |
| } | |
| return m_LocalTransform; | |
| } | |
| #ifdef WITH_RIVE_LAYOUT | |
| void Node::markLayoutNodeDirty() | |
| { | |
| for (ContainerComponent* p = parent(); p != nullptr; p = p->parent()) | |
| { | |
| if (p->is<LayoutComponent>()) | |
| { | |
| p->as<LayoutComponent>()->markLayoutNodeDirty(); | |
| } | |
| } | |
| } | |
| #endif |