/*
 * 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_ */