#ifndef _RIVE_NODE_HPP_
#define _RIVE_NODE_HPP_
#include "rive/generated/node_base.hpp"

namespace rive
{
/// A Rive Node
class Node : public NodeBase
{
private:
  Mat2D m_LocalTransform = Mat2D();
  bool m_LocalTransformNeedsRecompute = false;

  void computeLocalTransform();

public:
  void setComputedLocalX(float value) override {}
  void setComputedLocalY(float value) override {}
  void setComputedWorldX(float value) override {}
  void setComputedWorldY(float value) override {}
  void setComputedRootX(float value) override {}
  void setComputedRootY(float value) override {}
  void setComputedWidth(float value) override {}
  void setComputedHeight(float value) override {}

  float computedLocalX() override { return localTransform()[4]; };
  float computedLocalY() override { return localTransform()[5]; };
  float computedWorldX() override { return worldTransform()[4]; };
  float computedWorldY() override { return worldTransform()[5]; };
  float computedRootX() override;
  float computedRootY() override;
  float computedWidth() override { return 0; };
  float computedHeight() override { return 0; };

  void updateWorldTransform() override
  {
    m_LocalTransformNeedsRecompute = true;
    Super::updateWorldTransform();
  }

  Mat2D localTransform();

protected:
  void xChanged() override;
  void yChanged() override;
  void computedLocalXChanged() override {}
  void computedLocalYChanged() override {}
  void computedWorldXChanged() override {}
  void computedWorldYChanged() override {}
  void computedRootXChanged() override {}
  void computedRootYChanged() override {}
  void computedWidthChanged() override {}
  void computedHeightChanged() override {}

#ifdef WITH_RIVE_LAYOUT
  void markLayoutNodeDirty();
#endif
};
} // namespace rive

#endif