Advertisement
ChocoMan

Untitled

Apr 15th, 2014
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #pragma once
  2. #include "commons.h"
  3.  
  4.  
  5. class Technique
  6. {
  7. public:
  8.     Technique();
  9.     ~Technique();
  10.  
  11.     virtual bool Init();
  12.  
  13.     void Enable();
  14.  
  15. protected:
  16.     bool AddShader(GLenum ShaderType, const char* pShaderText);
  17.     bool Finalize();
  18.  
  19.     GLint GetUniformLocation(const char* pUniformName);
  20.     GLint GetProgramParam(GLint param);
  21.  
  22.     GLuint m_shaderProg;
  23.  
  24. private:
  25.     typedef std::list<GLuint> ShaderObjList;
  26.     ShaderObjList m_shaderObjList;
  27. };
  28.  
  29. ////////////////////////////////////////////////////////
  30.  
  31. #include "Technique.h"
  32.  
  33. static const char* pVSName = "VS";
  34. static const char* pTessCSName = "TessCS";
  35. static const char* pTessESName = "TessES";
  36. static const char* pGSName = "GS";
  37. static const char* pFSName = "FS";
  38.  
  39. const char* ShaderType2ShaderName(GLuint Type)
  40. {
  41.     switch (Type)
  42.     {
  43.     case GL_VERTEX_SHADER :
  44.         return pVSName;
  45.     case GL_TESS_CONTROL_SHADER :
  46.         return pTessCSName;
  47.     case GL_TESS_EVALUATION_SHADER :
  48.         return pTessESName;
  49.     case GL_GEOMETRY_SHADER :
  50.         return pGSName;
  51.     case GL_FRAGMENT_SHADER :
  52.         return pFSName;
  53.     default :
  54.         assert(0);
  55.     }
  56.  
  57.     return NULL;
  58. }
  59.  
  60.  
  61. Technique::Technique()
  62. {
  63.     m_shaderProg = 0;
  64. }
  65.  
  66.  
  67. Technique::~Technique()
  68. {
  69.     for (ShaderObjList::iterator it = m_shaderObjList.begin(); it != m_shaderObjList.end(); it++)
  70.     {
  71.         glDeleteShader(*it);
  72.     }
  73.  
  74.     if (m_shaderProg != 0)
  75.     {
  76.         glDeleteProgram(m_shaderProg);
  77.         m_shaderProg = 0;
  78.     }
  79. }
  80.  
  81.  
  82. bool Technique::Init()
  83. {
  84.     m_shaderProg = glCreateProgram();
  85.  
  86.     if (m_shaderProg == 0)
  87.     {
  88.         std::cout << "Error creating shader program" << std::endl;
  89.         return false;
  90.     }
  91.  
  92.     return true;
  93. }
  94.  
  95.  
  96. bool Technique::AddShader(GLenum ShaderType, const char* pShaderText)
  97. {
  98.     GLuint ShaderObj = glCreateShader(ShaderType);
  99.  
  100.     if (ShaderObj == 0)
  101.     {
  102.         std::cout << "Error creating shader type" << std::endl;
  103.         return false;
  104.     }
  105.  
  106.     m_shaderObjList.push_back(ShaderObj);
  107.  
  108.     const GLchar* p[1];
  109.     p[0] = pShaderText;
  110.     GLint Lengths[1];
  111.     Lengths[0] = strlen(pShaderText);
  112.     glShaderSource(ShaderObj, 1, p, Lengths);
  113.  
  114.     glCompileShader(ShaderObj);
  115.  
  116.     GLint success;
  117.     glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
  118.  
  119.     if (!success)
  120.     {
  121.         GLchar InfoLog[1024];
  122.         glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
  123.         std::cout << "Error compiling " << ShaderType2ShaderName(ShaderType) << ": " << InfoLog << std::endl;
  124.         return false;
  125.     }
  126.  
  127.     glAttachShader(m_shaderProg, ShaderObj);
  128.  
  129.     return GLCheckError();
  130. }
  131.  
  132.  
  133. bool Technique::Finalize()
  134. {
  135.     GLint Success = 0;
  136.     GLchar ErrorLog[1024] = { 0 };
  137.  
  138.     glLinkProgram(m_shaderProg);
  139.  
  140.     glGetProgramiv(m_shaderProg, GL_LINK_STATUS, &Success);
  141.     if (Success == 0)
  142.     {
  143.         glGetProgramInfoLog(m_shaderProg, sizeof(ErrorLog), NULL, ErrorLog);
  144.         std::cout << "Error linking shader program: " << ErrorLog << std::endl;
  145.         return false;
  146.     }
  147.  
  148.     glValidateProgram(m_shaderProg);
  149.     glGetProgramiv(m_shaderProg, GL_VALIDATE_STATUS, &Success);
  150.     if (!Success)
  151.     {
  152.         glGetProgramInfoLog(m_shaderProg, sizeof(ErrorLog), NULL, ErrorLog);
  153.         std::cout << "Invalid shader program: " << ErrorLog << std::endl;
  154.         return false;
  155.     }
  156.  
  157.     for (ShaderObjList::iterator it = m_shaderObjList.begin(); it != m_shaderObjList.end(); it++)
  158.     {
  159.         glDeleteShader(*it);
  160.     }
  161.  
  162.     m_shaderObjList.clear();
  163.  
  164.     return GLCheckError();
  165. }
  166.  
  167.  
  168. void Technique::Enable()
  169. {
  170.     glUseProgram(m_shaderProg);
  171. }
  172.  
  173.  
  174. GLint Technique::GetUniformLocation(const char* pUniformName)
  175. {
  176.     GLuint Location = glGetUniformLocation(m_shaderProg, pUniformName);
  177.  
  178.     if (Location == INVALID_OGL_VALUE)
  179.     {
  180.         std::cout << "#####Warning!##### Unable to locate of uniform " << pUniformName << std::endl;
  181.         return false;
  182.     }
  183.  
  184.     std::cout << "Location of uniform '" << pUniformName << "' found" << std::endl;
  185.  
  186.     return Location;
  187. }
  188.  
  189.  
  190. GLint Technique::GetProgramParam(GLint param)
  191. {
  192.     GLint ret;
  193.     glGetProgramiv(m_shaderProg, param, &ret);
  194.     return ret;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement