//  BlockyFroggy
//  Copyright © 2017 John Ryland.
//  All rights reserved.
#include "Cube.h"
#include "PolyVertex.h"


const int fltsPerVert = sizeof(PolyVertex) / sizeof(GLfloat);
const int trisPerCube = 12;
const int vertsPerCube = 3*trisPerCube;


Cube::Cube()
{
  const float vals1[6][6] = {
    {  0.5f, 0.5f, 0.5f,  0.5f, 0.5f, 0.5f },
    { -0.5f,-0.5f,-0.5f, -0.5f,-0.5f,-0.5f },
    {  0.5f,-0.5f, 0.5f,  0.5f,-0.5f,-0.5f },
    { -0.5f, 0.5f,-0.5f, -0.5f, 0.5f, 0.5f },
    { -0.5f,-0.5f, 0.5f,  0.5f,-0.5f, 0.5f },
    {  0.5f, 0.5f,-0.5f, -0.5f, 0.5f,-0.5f }
  };
  const float *valsx[6] = { vals1[0], vals1[2], vals1[1], vals1[3], vals1[2], vals1[2] };
  const float *valsy[6] = { vals1[3], vals1[0], vals1[2], vals1[1], vals1[5], vals1[4] };
  const float *valsz[6] = { vals1[4], vals1[4], vals1[4], vals1[4], vals1[0], vals1[1] };
  const int      nsi[6] = {  0,  1,  0,  1,  2,  2 };
  const float    nsv[6] = {  1.0f,  1.0f, -1.0f, -1.0f,  1.0f, -1.0f };

  m_baseCubeData.resize(fltsPerVert * vertsPerCube);
  
  // A cube instance
  // Probably don't need to do this every reset
  for (int j = 0; j < 6; j++) {
    for (int i = 0; i < 6; i++) {
      int p = (j*6+i)*fltsPerVert;
      for (int k = 0; k < fltsPerVert; k++) {
        m_baseCubeData[p+k] = 0.0f;
      }
      
      // Position
      m_baseCubeData[p+0] = valsx[j][i];
      m_baseCubeData[p+1] = valsy[j][i];
      m_baseCubeData[p+2] = valsz[j][i];
      
      // Normal
      m_baseCubeData[p+8+nsi[j]] = nsv[j];
      
      // Color
      m_baseCubeData[p+12] = 1.0f;
      m_baseCubeData[p+13] = 1.0f;
      
      // Barycenter
      m_baseCubeData[p+20+(i%3)] = 1.0f;
      m_baseCubeData[p+23] = 1.0f;
    }
  }
}

