| #include "rive/transform_component.hpp" | |
| #include "rive/world_transform_component.hpp" | |
| #include "rive/shapes/clipping_shape.hpp" | |
| #include "rive/math/vec2d.hpp" | |
| #include "rive/constraints/constraint.hpp" | |
| using namespace rive; | |
| StatusCode TransformComponent::onAddedClean(CoreContext* context) { | |
| m_ParentTransformComponent = parent() != nullptr && parent()->is<WorldTransformComponent>() | |
| ? parent()->as<WorldTransformComponent>() | |
| : nullptr; | |
| return StatusCode::Ok; | |
| } | |
| void TransformComponent::buildDependencies() { | |
| if (parent() != nullptr) { | |
| parent()->addDependent(this); | |
| } | |
| } | |
| void TransformComponent::markTransformDirty() { | |
| if (!addDirt(ComponentDirt::Transform)) { | |
| return; | |
| } | |
| markWorldTransformDirty(); | |
| } | |
| void TransformComponent::updateTransform() { | |
| m_Transform = Mat2D::fromRotation(rotation()); | |
| m_Transform[4] = x(); | |
| m_Transform[5] = y(); | |
| m_Transform.scaleByValues(scaleX(), scaleY()); | |
| } | |
| void TransformComponent::updateWorldTransform() { | |
| if (m_ParentTransformComponent != nullptr) { | |
| m_WorldTransform = m_ParentTransformComponent->m_WorldTransform * m_Transform; | |
| } else { | |
| m_WorldTransform = m_Transform; | |
| } | |
| for (auto constraint : m_Constraints) { | |
| constraint->constrain(this); | |
| } | |
| } | |
| void TransformComponent::update(ComponentDirt value) { | |
| if (hasDirt(value, ComponentDirt::Transform)) { | |
| updateTransform(); | |
| } | |
| if (hasDirt(value, ComponentDirt::WorldTransform)) { | |
| updateWorldTransform(); | |
| } | |
| if (hasDirt(value, ComponentDirt::RenderOpacity)) { | |
| m_RenderOpacity = opacity(); | |
| if (m_ParentTransformComponent != nullptr) { | |
| m_RenderOpacity *= m_ParentTransformComponent->childOpacity(); | |
| } | |
| } | |
| } | |
| const Mat2D& TransformComponent::transform() const { return m_Transform; } | |
| Mat2D& TransformComponent::mutableTransform() { return m_Transform; } | |
| void TransformComponent::rotationChanged() { markTransformDirty(); } | |
| void TransformComponent::scaleXChanged() { markTransformDirty(); } | |
| void TransformComponent::scaleYChanged() { markTransformDirty(); } | |
| void TransformComponent::addConstraint(Constraint* constraint) { | |
| m_Constraints.push_back(constraint); | |
| } |