blob: 33940b7140d43603907ac39feb2bdd71dda776bd [file] [log] [blame]
#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