| #include "rive/animation/listener_align_target.hpp" |
| #include "rive/animation/state_machine_instance.hpp" |
| #include "rive/node.hpp" |
| #include "rive/constraints/constraint.hpp" |
| |
| using namespace rive; |
| |
| void ListenerAlignTarget::perform(StateMachineInstance* stateMachineInstance, |
| Vec2D position) const { |
| auto coreTarget = stateMachineInstance->artboard()->resolve(targetId()); |
| if (coreTarget == nullptr || !coreTarget->is<Node>()) { |
| return; |
| } |
| auto target = coreTarget->as<Node>(); |
| Mat2D targetParentWorld = getParentWorld(*target); |
| Mat2D inverse; |
| if (!targetParentWorld.invert(&inverse)) { |
| return; |
| } |
| |
| auto localPosition = inverse * position; |
| target->x(localPosition.x); |
| target->y(localPosition.y); |
| } |