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

