| #include "rive/joystick.hpp" |
| #include "rive/artboard.hpp" |
| #include "rive/transform_component.hpp" |
| |
| using namespace rive; |
| |
| StatusCode Joystick::onAddedDirty(CoreContext* context) |
| { |
| StatusCode status = Super::onAddedDirty(context); |
| if (status != StatusCode::Ok) |
| { |
| return status; |
| } |
| if (handleSourceId() != Core::emptyId) |
| { |
| auto coreObject = context->resolve(handleSourceId()); |
| if (coreObject == nullptr || !coreObject->is<TransformComponent>()) |
| { |
| return StatusCode::MissingObject; |
| } |
| m_handleSource = static_cast<TransformComponent*>(coreObject); |
| } |
| |
| return StatusCode::Ok; |
| } |
| |
| StatusCode Joystick::onAddedClean(CoreContext* context) |
| { |
| m_xAnimation = artboard()->animation(xId()); |
| m_yAnimation = artboard()->animation(yId()); |
| |
| return StatusCode::Ok; |
| } |
| |
| void Joystick::buildDependencies() |
| { |
| // We only need to update if we're in world space (and that is only required |
| // at runtime if we have a custom handle source). |
| if (m_handleSource != nullptr && parent() != nullptr) |
| { |
| parent()->addDependent(this); |
| m_handleSource->addDependent(this); |
| } |
| } |
| |
| void Joystick::update(ComponentDirt value) |
| { |
| if (m_handleSource == nullptr) |
| { |
| return; |
| } |
| if (hasDirt(value, ComponentDirt::WorldTransform | ComponentDirt::Transform)) |
| { |
| Mat2D world = Mat2D::fromTranslate(posX(), posY()); |
| if (parent() != nullptr && parent()->is<WorldTransformComponent>()) |
| { |
| world = parent()->as<WorldTransformComponent>()->worldTransform() * world; |
| } |
| |
| if (m_worldTransform != world) |
| { |
| m_worldTransform = world; |
| m_inverseWorldTransform = world.invertOrIdentity(); |
| } |
| |
| auto pos = m_inverseWorldTransform * m_handleSource->worldTranslation(); |
| |
| auto localBounds = AABB(-width() * originX(), |
| -height() * originY(), |
| -width() * originX() + width(), |
| -height() * originY() + height()); |
| |
| auto local = localBounds.factorFrom(pos); |
| x(local.x); |
| y(local.y); |
| } |
| } |
| |
| void Joystick::apply(Artboard* artboard) const |
| { |
| if (m_xAnimation != nullptr) |
| { |
| m_xAnimation->apply(artboard, |
| ((isJoystickFlagged(JoystickFlags::invertX) ? -x() : x()) + 1.0f) / |
| 2.0f * m_xAnimation->durationSeconds()); |
| } |
| if (m_yAnimation != nullptr) |
| { |
| |
| m_yAnimation->apply(artboard, |
| ((isJoystickFlagged(JoystickFlags::invertY) ? -y() : y()) + 1.0f) / |
| 2.0f * m_yAnimation->durationSeconds()); |
| } |
| } |