| #ifndef _RIVE_CONSTRAINT_HPP_ |
| #define _RIVE_CONSTRAINT_HPP_ |
| #include "rive/generated/constraints/constraint_base.hpp" |
| #include <stdio.h> |
| namespace rive |
| { |
| class TransformComponent; |
| class Mat2D; |
| class TransformComponents; |
| |
| class Constraint : public ConstraintBase |
| { |
| public: |
| void strengthChanged() override; |
| StatusCode onAddedDirty(CoreContext* context) override; |
| virtual void markConstraintDirty(); |
| virtual void constrain(TransformComponent* component) = 0; |
| void buildDependencies() override; |
| void onDirty(ComponentDirt dirt) override; |
| #ifdef WITH_RIVE_EDITOR |
| void editorParentChanged(ContainerComponent* from, |
| ContainerComponent* to) override; |
| #endif |
| |
| protected: |
| /// Writes composed into the component's world transform, keeping its |
| /// anchor where it already was. A layout's box starts at its local zero, |
| /// so recomposing about that zero would swing the box about its corner |
| /// rather than its origin. |
| static void composeKeepingAnchor(TransformComponent* component, |
| const TransformComponents& composed); |
| /// Steps the component's world translation back by its anchor, so a |
| /// position already written as "where local zero goes" instead lands the |
| /// anchor there. Scaled by strength so zero strength stays a no-op. |
| static void landAnchor(TransformComponent* component, float strength); |
| /// Composes, then lands the anchor — for constraints that copy a position. |
| static void composeLandingAnchor(TransformComponent* component, |
| const TransformComponents& composed, |
| float strength); |
| /// The component's world transform displaced by [offset] applied in its |
| /// parent's frame — for constraints that move a component by a delta |
| /// measured in the space the layout was solved in. |
| static Mat2D offsetInParentFrame(TransformComponent* component, |
| const Mat2D& offset); |
| }; |
| |
| const Mat2D& getParentWorld(const TransformComponent& component); |
| } // namespace rive |
| |
| #endif |