#ifndef _CAREAFOG_HPP
#define _CAREAFOG_HPP

#include "types.h"

#include "Kyoto/Graphics/CColor.hpp"
#include "Kyoto/Math/CVector2f.hpp"

enum ERglFogMode {
  kRFM_None = GX_FOG_NONE,

  kRFM_PerspLin = GX_FOG_PERSP_LIN,
  kRFM_PerspExp = GX_FOG_PERSP_EXP,
  kRFM_PerspExp2 = GX_FOG_ORTHO_EXP2,
  kRFM_PerspRevExp = GX_FOG_PERSP_REVEXP,
  kRFM_PerspRevExp2 = GX_FOG_PERSP_REVEXP2,

  kRFM_OrthoLin = GX_FOG_ORTHO_LIN,
  kRFM_OrthoExp = GX_FOG_ORTHO_EXP,
  kRFM_OrthoExp2 = GX_FOG_ORTHO_EXP2,
  kRFM_OrthoRevExp = GX_FOG_ORTHO_REVEXP,
  kRFM_OrthoRevExp2 = GX_FOG_ORTHO_REVEXP2,
};

class CAreaFog {
private:
  ERglFogMode x0_fogMode;
  CVector2f x4_rangeCur;
  CVector2f xc_rangeTarget;
  CVector2f x14_rangeDelta;
  CColor x1c_colorCur;
  unkptr x20_;
  unkptr x24_;
  CColor x28_colorTarget;
  unkptr x2c_;
  unkptr x30_;
  float x34_colorDelta;

public:
  void SetCurrent() const;
  void Update(float dt);
  void RollFogOut(float rangeDelta, float colorDelta, const CColor& color);
  void FadeFog(ERglFogMode, const CColor& color, const CVector2f& vec1, float,
               const CVector2f& vec2);
  void SetFogExplicit(ERglFogMode mode, const CColor& color, const CVector2f& range);
  bool IsFogDisabled() const;
  void DisableFog();
};
CHECK_SIZEOF(CAreaFog, 0x38)

#endif