/**
 * =========================================================================
 * File        : BlendShapes.h
 * Project     : 0 A.D.
 * Description : 
 * =========================================================================
 */

#ifndef INCLUDED_BLENDSHAPES
#define INCLUDED_BLENDSHAPES

struct BlendShape4
{
public:
    BlendShape4() {}
    BlendShape4(int a,int b,int c,int d) {
        m_Data[0]=a; m_Data[1]=b; m_Data[2]=c; m_Data[3]=d;
    }

    int& operator[](int index) { return m_Data[index]; }
    const int& operator[](int index) const { return m_Data[index]; }

    bool operator==(const BlendShape4& lhs) const {
        return memcmp(m_Data,lhs.m_Data,sizeof(BlendShape4))==0;
    }

    void Rotate90(BlendShape4& dst) const {
        dst[0]=m_Data[3];
        dst[1]=m_Data[0];
        dst[2]=m_Data[1];
        dst[3]=m_Data[2];
    }

    void Rotate180(BlendShape4& dst) const {
        dst[0]=m_Data[2];
        dst[1]=m_Data[3];
        dst[2]=m_Data[0];
        dst[3]=m_Data[1];
    }

    void Rotate270(BlendShape4& dst) const {
        dst[0]=m_Data[1];
        dst[1]=m_Data[2];
        dst[2]=m_Data[3];
        dst[3]=m_Data[0];
    }

    void FlipU(BlendShape4& dst) const {
        dst[0]=m_Data[2];
        dst[1]=m_Data[1];
        dst[2]=m_Data[0];
        dst[3]=m_Data[3];
    }

    void FlipV(BlendShape4& dst) const {
        dst[0]=m_Data[0];
        dst[1]=m_Data[3];
        dst[2]=m_Data[2];
        dst[3]=m_Data[1];
    }

private:
    int m_Data[4];
};


struct BlendShape8
{
public:
    BlendShape8() {}
    BlendShape8(int a,int b,int c,int d,int e,int f,int g,int h) {
        m_Data[0]=a; m_Data[1]=b; m_Data[2]=c; m_Data[3]=d;
        m_Data[4]=e; m_Data[5]=f; m_Data[6]=g; m_Data[7]=h;
    }

    int& operator[](int index) { return m_Data[index]; }
    const int& operator[](int index) const { return m_Data[index]; }

    bool operator==(const BlendShape8& lhs) const {
        return memcmp(m_Data,lhs.m_Data,sizeof(BlendShape8))==0;
    }

    void Rotate90(BlendShape8& dst) const {
        dst[0]=m_Data[6];
        dst[1]=m_Data[7];
        dst[2]=m_Data[0];
        dst[3]=m_Data[1];
        dst[4]=m_Data[2];
        dst[5]=m_Data[3];
        dst[6]=m_Data[4];
        dst[7]=m_Data[5];
    }

    void Rotate180(BlendShape8& dst) const {
        dst[0]=m_Data[4];
        dst[1]=m_Data[5];
        dst[2]=m_Data[6];
        dst[3]=m_Data[7];
        dst[4]=m_Data[0];
        dst[5]=m_Data[1];
        dst[6]=m_Data[2];
        dst[7]=m_Data[3];
    }

    void Rotate270(BlendShape8& dst) const {
        dst[0]=m_Data[2];
        dst[1]=m_Data[3];
        dst[2]=m_Data[4];
        dst[3]=m_Data[5];
        dst[4]=m_Data[6];
        dst[5]=m_Data[7];
        dst[6]=m_Data[0];
        dst[7]=m_Data[1];
    }

    void FlipU(BlendShape8& dst) const {
        dst[0]=m_Data[4];
        dst[1]=m_Data[3];
        dst[2]=m_Data[2];
        dst[3]=m_Data[1];
        dst[4]=m_Data[0];
        dst[5]=m_Data[7];
        dst[6]=m_Data[6];
        dst[7]=m_Data[5];
    }

    void FlipV(BlendShape8& dst) const {
        dst[0]=m_Data[0];
        dst[1]=m_Data[7];
        dst[2]=m_Data[6];
        dst[3]=m_Data[5];
        dst[4]=m_Data[4];
        dst[5]=m_Data[3];
        dst[6]=m_Data[2];
        dst[7]=m_Data[1];
    }

private:
    int m_Data[8];
};

#endif