blob: 999014651b7e7a89912d7dc69155068a9b7ecb1f [file] [log] [blame]
#ifndef _RIVE_TRANSFORM_COMPONENT_HPP_
#define _RIVE_TRANSFORM_COMPONENT_HPP_
#include "rive/generated/transform_component_base.hpp"
#include "rive/math/mat2d.hpp"
namespace rive {
class Constraint;
class WorldTransformComponent;
class TransformComponent : public TransformComponentBase {
private:
Mat2D m_Transform;
float m_RenderOpacity = 0.0f;
WorldTransformComponent* m_ParentTransformComponent = nullptr;
std::vector<Constraint*> m_Constraints;
public:
#ifdef TESTING
const std::vector<Constraint*>& constraints() const { return m_Constraints; }
#endif
StatusCode onAddedClean(CoreContext* context) override;
void buildDependencies() override;
void update(ComponentDirt value) override;
void updateTransform();
void updateWorldTransform();
void markTransformDirty();
/// Opacity inherited by any child of this transform component. This'll
/// later get overridden by effect layers.
float childOpacity() override { return m_RenderOpacity; }
float renderOpacity() const { return m_RenderOpacity; }
const Mat2D& transform() const;
/// Explicitly dangerous. Use transform/worldTransform when you don't
/// need to transform things outside of their hierarchy.
Mat2D& mutableTransform();
virtual float x() const = 0;
virtual float y() const = 0;
void rotationChanged() override;
void scaleXChanged() override;
void scaleYChanged() override;
void addConstraint(Constraint* constraint);
};
} // namespace rive
#endif