/*
 * ShaderEngine.hpp
 *
 *  Created on: Jul 18, 2008
 *      Author: pete
 */
#ifndef SHADERENGINE_HPP_
#define SHADERENGINE_HPP_

#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


#ifdef USE_CG
#include <Cg/cg.h>    /* Can't include this?  Is Cg Toolkit installed! */
#include <Cg/cgGL.h>
#endif


#include "Pipeline.hpp"
#include "PipelineContext.hpp"
class ShaderEngine;
#include "TextureManager.hpp"

#include <cstdlib>
#include <iostream>
#include <map>
#include "Shader.hpp"


class ShaderEngine
{
#ifdef USE_CG
  unsigned int mainTextureId;
  int texsize;
  float aspect;
  BeatDetect *beatDetect;
  TextureManager *textureManager;

  GLuint noise_texture_lq_lite;
  GLuint noise_texture_lq;
  GLuint noise_texture_mq;
  GLuint noise_texture_hq;
  GLuint noise_texture_perlin;
  GLuint noise_texture_lq_vol;
  GLuint noise_texture_hq_vol;

  bool blur1_enabled;
  bool blur2_enabled;
  bool blur3_enabled;
  GLuint blur1_tex;
  GLuint blur2_tex;
  GLuint blur3_tex;

  float rand_preset[4];

  CGcontext   myCgContext;
  CGprofile   myCgProfile;
  CGprogram   blur1Program;
  CGprogram   blur2Program;

  bool enabled;

  std::map<Shader*,CGprogram> programs;

  std::string cgTemplate;
  std::string blurProgram;

  bool LoadCgProgram(Shader &shader);
  bool checkForCgCompileError(const char *situation);
  void checkForCgError(const char *situation);

  void SetupCg();
  void SetupCgVariables(CGprogram program, const Pipeline &pipeline, const PipelineContext &pipelineContext);
  void SetupCgQVariables(CGprogram program, const Pipeline &pipeline);

  void SetupUserTexture(CGprogram program, const UserTexture* texture);
  void SetupUserTextureState(const UserTexture* texture);
#endif

public:
  ShaderEngine();
  virtual ~ShaderEngine();
#ifdef USE_CG
  void RenderBlurTextures(const Pipeline  &pipeline, const PipelineContext &pipelineContext, const int texsize);
  void loadShader(Shader &shader);

  void setParams(const int texsize, const unsigned int texId, const float aspect, BeatDetect *beatDetect, TextureManager *textureManager);
  void enableShader(Shader &shader, const Pipeline &pipeline, const PipelineContext &pipelineContext);
  void disableShader();
  void reset();
  void setAspect(float aspect);
  std::string profileName;
#endif
};

#endif /* SHADERENGINE_HPP_ */
