/*==========================================================
  File:  skybox.c
  Author:  _pragma

  Description:  Initializes and renders skybox.
  ==========================================================*/


#include <GL/gl.h>
#include <SDL/SDL.h>

#include "skybox.h"
#include "texture.h"
#include "console.h"
#include "util.h"

GLuint g_sbTexture[6], g_sbList = 0 ;

void SB_initSkyBox(void)
{
  if(!(g_sbTexture[0] = T_loadTextureTGA("data/textures/skybox/skyboxA.tga", false)))
    CON_printf("skybox: failed to load texture");
  if(!(g_sbTexture[1] = T_loadTextureTGA("data/textures/skybox/skyboxB.tga", false)))
    CON_printf("skybox: failed to load texture");
  if(!(g_sbTexture[2] = T_loadTextureTGA("data/textures/skybox/skyboxC.tga", false)))
    CON_printf("skybox: failed to load texture");
  if(!(g_sbTexture[3] = T_loadTextureTGA("data/textures/skybox/skyboxD.tga", false)))
    CON_printf("skybox: failed to load texture");
  if(!(g_sbTexture[4] = T_loadTextureTGA("data/textures/skybox/skyboxE.tga", false)))
    CON_printf("skybox: failed to load texture");
  if(!(g_sbTexture[5] = T_loadTextureTGA("data/textures/skybox/skyboxF.tga", false)))
    CON_printf("skybox: failed to load texture");

  SB_generateSkyBox(2024, 2024, 2024);
}

void SB_generateSkyBox(float width, float height, float length)
{
  float px, py, pz;

  px = -width  / 2;
  py = -height / 2;
  pz = -length / 2;

  if(!(g_sbList = glGenLists(1)))
  {
    CON_printf("SkyBox:  Failed to generate list");
    return;
  }

  glNewList(g_sbList, GL_COMPILE);

  glEnable(GL_TEXTURE_2D);

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[1]);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0);  glVertex3f(px,         py,          pz);
    glTexCoord2f(0, 1);  glVertex3f(px,         py + height, pz);
    glTexCoord2f(1, 1);  glVertex3f(px + width, py + height, pz);
    glTexCoord2f(1, 0);  glVertex3f(px + width, py, pz);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[3]);
  glBegin(GL_QUADS);
    glTexCoord2f(1, 0);  glVertex3f(px,         py,          pz + length);
    glTexCoord2f(1, 1);  glVertex3f(px,         py + height, pz + length);
    glTexCoord2f(0, 1);  glVertex3f(px + width, py + height, pz + length);
    glTexCoord2f(0, 0);  glVertex3f(px + width, py,          pz + length);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[5]);
  glBegin(GL_QUADS);
    glTexCoord2f(1, 1);  glVertex3f(px + width, py, pz);
    glTexCoord2f(1, 0);  glVertex3f(px + width, py, pz + length);
    glTexCoord2f(0, 0);  glVertex3f(px,         py, pz + length);
    glTexCoord2f(0, 1);  glVertex3f(px,         py, pz);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[4]);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0);  glVertex3f(px,         py + height, pz);
    glTexCoord2f(0, 1);  glVertex3f(px,         py + height, pz + length);
    glTexCoord2f(1, 1);  glVertex3f(px + width, py + height, pz + length);
    glTexCoord2f(1, 0);  glVertex3f(px + width, py + height, pz);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[0]);
  glBegin(GL_QUADS);
    glTexCoord2f(1, 0);  glVertex3f(px, py,          pz);
    glTexCoord2f(0, 0);  glVertex3f(px, py,          pz + length);
    glTexCoord2f(0, 1);  glVertex3f(px, py + height, pz + length);
    glTexCoord2f(1, 1);  glVertex3f(px, py + height, pz);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, g_sbTexture[2]);
  glBegin(GL_QUADS);
    glTexCoord2f(0, 0);  glVertex3f(px + width, py,          pz);
    glTexCoord2f(1, 0);  glVertex3f(px + width, py,          pz + length);
    glTexCoord2f(1, 1);  glVertex3f(px + width, py + height, pz + length);
    glTexCoord2f(0, 1);  glVertex3f(px + width, py + height, pz);
  glEnd();

  glEndList();
}