#include "Common.hpp"

#ifdef USE_GLES1
#include <GLES/gl.h>
#else
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#endif
#endif

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


typedef float floatPair[2];
typedef float floatTriple[3];
typedef float floatQuad[4];


#ifdef USE_GLES1
static void
glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)
{
  GLfloat verts[] = {
    x1, y1,
    x1, y2,
    x2, y1,
    x2, y2
  };
  GLboolean prev;

  prev = glIsEnabled (GL_VERTEX_ARRAY);

  glEnableClientState (GL_VERTEX_ARRAY);
  glVertexPointer (2, GL_FLOAT, 0, verts);
  glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);

  if (!prev)
    glDisableClientState (GL_VERTEX_ARRAY);
}
#endif

RenderContext::RenderContext()
  : time(0),
    texsize(512),
    aspectRatio(1),
    aspectCorrect(false)
{};

RenderItem::RenderItem() : masterAlpha(1) {}

DarkenCenter::DarkenCenter() : RenderItem() {}
MotionVectors::MotionVectors() : RenderItem() {}
Border::Border() : RenderItem() {}

void
DarkenCenter::Draw(RenderContext &context)
{
  //float unit=0.05f;

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  float colors[6][4] = {{0, 0, 0, (3.0f/32.0f) * masterAlpha},
                        {0, 0, 0, 0},
                        {0, 0, 0, 0},
                        {0, 0, 0, 0},
                        {0, 0, 0, 0},
                        {0, 0, 0, 0}};

  float points[6][2] = {{ 0.5,  0.5},
                        { 0.45, 0.5},
                        { 0.5,  0.45},
                        { 0.55, 0.5},
                        { 0.5,  0.55},
                        { 0.45, 0.5}};

  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);
  glDisableClientState(GL_TEXTURE_COORD_ARRAY);

  glVertexPointer(2,GL_FLOAT,0,points);
  glColorPointer(4,GL_FLOAT,0,colors);

  glDrawArrays(GL_TRIANGLE_FAN,0,6);
}

Shape::Shape():RenderItem()
{
  std::string imageUrl = "";

  sides = 4;
  thickOutline = false;
  enabled = true;
  additive = false;
  textured = false;

  tex_zoom = 1.0;
  tex_ang = 0.0;

  x = 0.5;
  y = 0.5;
  radius = 1.0;
  ang = 0.0;

  r = 0.0; /* red color value */
  g = 0.0; /* green color value */
  b = 0.0; /* blue color value */
  a = 0.0; /* alpha color value */

  r2 = 0.0; /* red color value */
  g2 = 0.0; /* green color value */
  b2 = 0.0; /* blue color value */
  a2 = 0.0; /* alpha color value */

  border_r = 0.0; /* red color value */
  border_g = 0.0; /* green color value */
  border_b = 0.0; /* blue color value */
  border_a = 0.0; /* alpha color value */
}

void
Shape::Draw(RenderContext &context)
{
  float xval, yval;
  float t;

  // printf("drawing shape %f\n", ang);

  float temp_radius= radius*(.707*.707*.707*1.04);

  //Additive Drawing or Overwrite
  if (additive == 0)  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  else                glBlendFunc(GL_SRC_ALPHA, GL_ONE);

  xval= x;
  yval= -(y-1);

  if ( textured)
  {
    if (imageUrl !="")
    {
      GLuint tex= context.textureManager->getTexture(imageUrl);
      if (tex != 0)
      {
        glBindTexture(GL_TEXTURE_2D, tex);
        context.aspectRatio=1.0;
      }
    }

    glMatrixMode(GL_TEXTURE);
    glPushMatrix();
    glLoadIdentity();

    glEnable(GL_TEXTURE_2D);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    floatQuad *colors = new float[sides+2][4];
    floatPair *tex    = new float[sides+2][2];
    floatPair *points = new float[sides+2][2];

    //Define the center point of the shape
    colors[0][0] = r;
    colors[0][1] = g;
    colors[0][2] = b;
    colors[0][3] = a * masterAlpha;
    tex[0][0] = 0.5;
    tex[0][1] = 0.5;
    points[0][0] = xval;
    points[0][1] = yval;

    for ( int i=1;i< sides+2;i++)
    {
      colors[i][0] = r2;
      colors[i][1] = g2;
      colors[i][2] = b2;
      colors[i][3] = a2 * masterAlpha;

      t = (i-1)/(float) sides;
      tex[i][0] =  0.5f + 0.5f*cosf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)/ tex_zoom;
      tex[i][1] =  0.5f + 0.5f*sinf(t*3.1415927f*2 +  tex_ang + 3.1415927f*0.25f)/ tex_zoom;
      points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
      points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
    }

    glVertexPointer(2,GL_FLOAT,0,points);
    glColorPointer(4,GL_FLOAT,0,colors);
    glTexCoordPointer(2,GL_FLOAT,0,tex);

    glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);

    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);

    //Reset Texture state since we might have changed it
    /*
    if(this->renderTarget->useFBO)
    {
      glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[1] );
    }
    else
    {
      glBindTexture( GL_TEXTURE_2D, renderTarget->textureID[0] );
    }
    */

    delete[] colors;
    delete[] tex;
    delete[] points;
  }
  else
  {
    //Untextured (use color values)

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    floatQuad *colors = new float[sides+2][4];
    floatPair *points = new float[sides+2][2];

    //Define the center point of the shape
    colors[0][0]=r;
    colors[0][1]=g;
    colors[0][2]=b;
    colors[0][3]=a * masterAlpha;
    points[0][0]=xval;
    points[0][1]=yval;



    for ( int i=1;i< sides+2;i++)
    {
      colors[i][0]=r2;
      colors[i][1]=g2;
      colors[i][2]=b2;
      colors[i][3]=a2 * masterAlpha;
      t = (i-1)/(float) sides;
      points[i][0]=temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
      points[i][1]=temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;

    }

    glVertexPointer(2,GL_FLOAT,0,points);
    glColorPointer(4,GL_FLOAT,0,colors);


    glDrawArrays(GL_TRIANGLE_FAN,0,sides+2);
    //draw first n-1 triangular pieces

    delete[] colors;
    delete[] points;
  }
  if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : 2*context.texsize/512);

  glEnableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);

  floatPair *points = new float[sides+1][2];

  glColor4f( border_r, border_g, border_b, border_a * masterAlpha);

  for ( int i=0;i< sides;i++)
  {
    t = (i-1)/(float) sides;
    points[i][0] = temp_radius*cosf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)*(context.aspectCorrect ? context.aspectRatio : 1.0)+xval;
    points[i][1] = temp_radius*sinf(t*3.1415927f*2 +  ang + 3.1415927f*0.25f)+yval;
  }

  glVertexPointer(2,GL_FLOAT,0,points);
  glDrawArrays(GL_LINE_LOOP,0,sides);

  if (thickOutline==1)  glLineWidth(context.texsize < 512 ? 1 : context.texsize/512);

  delete[] points;
}

void
MotionVectors::Draw(RenderContext &context)
{
  glEnableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);

  float  intervalx=1.0/x_num;
  float  intervaly=1.0/y_num;

  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  glPointSize(length);
  glColor4f(r, g, b, a * masterAlpha);

  if (x_num + y_num < 600)
  {
    int size = x_num * y_num ;

    floatPair *points = new float[size][2];

    for (int x=0;x<(int)x_num;x++)
    {
      for(int y=0;y<(int)y_num;y++)
      {
        float lx, ly, lz;
        lx = x_offset+x*intervalx;
        ly = y_offset+y*intervaly;

        points[(x * (int)y_num) + y][0] = lx;
        points[(x * (int)y_num) + y][1] = ly;
      }
    }

    glVertexPointer(2,GL_FLOAT,0,points);
    glDrawArrays(GL_POINTS,0,size);

    delete[] points;
  }
}

void
Border::Draw(RenderContext &context)
{
  glEnableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_COLOR_ARRAY);
  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  //Draw Borders
  float of=outer_size*.5;
  float iff=inner_size*.5;
  float texof=1.0-of;

  //no additive drawing for borders
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glColor4f(outer_r, outer_g, outer_b, outer_a * masterAlpha);

  float pointsA[4][2] = {{0,0},{0,1},{of,0},{of,1}};
  glVertexPointer(2,GL_FLOAT,0,pointsA);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsB[4][2] = {{of,0},{of,of},{texof,0},{texof,of}};
  glVertexPointer(2,GL_FLOAT,0,pointsB);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsC[4][2] = {{texof,0},{texof,1},{1,0},{1,1}};
  glVertexPointer(2,GL_FLOAT,0,pointsC);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsD[4][2] = {{of,1},{of,texof},{texof,1},{texof,texof}};
  glVertexPointer(2,GL_FLOAT,0,pointsD);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  glColor4f(inner_r, inner_g, inner_b, inner_a * masterAlpha);

  glRectf(of, of, of+iff, texof);
  glRectf(of+iff, of, texof-iff, of+iff);
  glRectf(texof-iff, of, texof, texof);
  glRectf(of+iff, texof, texof-iff, texof-iff);

  float pointsE[4][2] = {{of,of},{of,texof},{of+iff,of},{of+iff,texof}};
  glVertexPointer(2,GL_FLOAT,0,pointsE);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsF[4][2] = {{of+iff,of},{of+iff,of+iff},{texof-iff,of},{texof-iff,of+iff}};
  glVertexPointer(2,GL_FLOAT,0,pointsF);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsG[4][2] = {{texof-iff,of},{texof-iff,texof},{texof,of},{texof,texof}};
  glVertexPointer(2,GL_FLOAT,0,pointsG);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  float pointsH[4][2] = {{of+iff,texof},{of+iff,texof-iff},{texof-iff,texof},{texof-iff,texof-iff}};
  glVertexPointer(2,GL_FLOAT,0,pointsH);
  glDrawArrays(GL_TRIANGLE_STRIP,0,4);

}
