#ifndef Transformation_HPP
#define Transformation_HPP

#include "PerPixelMesh.hpp"
#include <math.h>


class Transforms
{
public:

  inline static void Zoom(PixelPoint &p, const PerPixelContext &context, float zoom, float zoomExponent)
  {
    float fZoom2 = powf( zoom, powf( zoomExponent, context.rad*2.0f - 1.0f));
    float fZoom2Inv = 1.0f/fZoom2;
    p.x -= 0.5;
    p.y -= 0.5;
    p.x *= fZoom2Inv;
    p.y *= fZoom2Inv;
    p.x += 0.5;
    p.y += 0.5;
  }

  inline static void Transform(PixelPoint &p, const PerPixelContext &context, float dx, float dy)
  {
    p.x -= dx;
    p.y -= dy;
  }

  inline static void Scale(PixelPoint &p, const PerPixelContext &context, float sy, float sx, float cx, float cy)
  {
    p.x = (p.x - cx)/sx + cx;
    p.y = (p.y - cy)/sy + cy;
  }

  inline static void Rotate(PixelPoint &p, const PerPixelContext &context, float angle, float cx, float cy)
  {
    float u2 = p.x - cx;
    float v2 = p.y - cy;

    float cos_rot = cosf(angle);
    float sin_rot = sinf(angle);

    p.x = u2*cos_rot - v2*sin_rot + cx;
    p.y = u2*sin_rot + v2*cos_rot + cy;
  }

  inline static void Warp(PixelPoint &p, const PerPixelContext &context, float time, float speed, float scale, float warp)
  {
    float fWarpTime = time * speed;
    float fWarpScaleInv = 1.0f / scale;
    float f[4];
    f[0] = 11.68f + 4.0f*cosf(fWarpTime*1.413f + 10);
    f[1] =  8.77f + 3.0f*cosf(fWarpTime*1.113f + 7);
    f[2] = 10.54f + 3.0f*cosf(fWarpTime*1.233f + 3);
    f[3] = 11.49f + 4.0f*cosf(fWarpTime*0.933f + 5);

    p.x += warp*0.0035f*sinf(fWarpTime*0.333f + fWarpScaleInv*(context.x*f[0] - context.y*f[3]));
    p.y += warp*0.0035f*cosf(fWarpTime*0.375f - fWarpScaleInv*(context.x*f[2] + context.y*f[1]));
    p.x += warp*0.0035f*cosf(fWarpTime*0.753f - fWarpScaleInv*(context.x*f[1] - context.y*f[2]));
    p.y += warp*0.0035f*sinf(fWarpTime*0.825f + fWarpScaleInv*(context.x*f[0] + context.y*f[3]));
  }
};

#endif
