Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #include "ShaderProgram.h"
  2.  
  3. #include <string>
  4.  
  5. #include "OpenGL.h"
  6.  
  7. ShaderProgram::ShaderProgram() {
  8. program = glCreateProgram();
  9. }
  10.  
  11. void ShaderProgram::attachShader(const char* fileName, uint type) {
  12. std::fstream file(fileName);
  13. std::string fileContents = "";
  14.  
  15. //Loading file into string
  16. if (file.is_open()) {
  17. std::string line;
  18. while (std::getline(file, line)) {
  19. fileContents += line + '\n';
  20. }
  21. file.close();
  22. } else {
  23. PRINT_ERROR << "Could not load " << fileName << "!\n";
  24. return;
  25. }
  26.  
  27. const GLchar* text = fileContents.c_str();
  28. GLint length = fileContents.length();
  29.  
  30. GLuint shader = glCreateShader(type);
  31. glShaderSource(shader, 1, &text, &length);
  32. glCompileShader(shader);
  33.  
  34. GLint isCompiled = 0;
  35. glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
  36. if(isCompiled == GL_FALSE) {
  37. GLint maxLength = 0;
  38. glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
  39.  
  40. char* errorLog = new char[maxLength];
  41. glGetShaderInfoLog(shader, maxLength, &maxLength, &errorLog[0]);
  42. PRINT_ERROR << "Shader failed to compile with message:\n" << errorLog << '\n';
  43. delete errorLog;
  44.  
  45. glDeleteShader(shader);
  46. return;
  47. }
  48.  
  49. glAttachShader(program, shader);
  50.  
  51. glBindAttribLocation(program, 0, "position");
  52.  
  53. glLinkProgram(program);
  54.  
  55. GLint isLinked = 0;
  56. glGetProgramiv(program, GL_LINK_STATUS, (int *)&isLinked);
  57. if(isLinked == GL_FALSE) {
  58. GLint maxLength = 0;
  59. glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
  60.  
  61. char* infoLog = new char[maxLength];
  62. glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
  63. PRINT_ERROR << "Program failed to link with message:\n" << infoLog << '\n';
  64. delete infoLog;
  65.  
  66. glDeleteShader(shader);
  67. return;
  68. }
  69.  
  70. shaders.push_back(shader);
  71. }
  72.  
  73. void ShaderProgram::use() const {
  74. glUseProgram(program);
  75. }
  76.  
  77. int ShaderProgram::getLocation(const char* name) {
  78. const auto loc = uniforms.find(name);
  79. int location;
  80. if (loc == uniforms.end()) {
  81. location = glGetUniformLocation(program, name);
  82. uniforms[name] = location;
  83. } else
  84. location = loc->second;
  85. return location;
  86. }
  87.  
  88. void ShaderProgram::setUniform(const char* name, int value) {
  89. glUniform1i(getLocation(name), value);
  90. }
  91. void ShaderProgram::setUniform(const char* name, float value) {
  92. glUniform1f(getLocation(name), value);
  93. }
  94. void ShaderProgram::setUniform(const char* name, const glm::vec2& value) {
  95. glUniform2f(getLocation(name), value.x, value.y);
  96. }
  97. void ShaderProgram::setUniform(const char* name, const glm::vec3& value) {
  98. glUniform3f(getLocation(name), value.x, value.y, value.z);
  99. }
  100. void ShaderProgram::setUniform(const char* name, const glm::vec4& value) {
  101. glUniform4f(getLocation(name), value.x, value.y, value.z, value.w);
  102. }
  103.  
  104. void ShaderProgram::setUniform(const char* name, const glm::mat2& value) {
  105. glUniformMatrix2fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
  106. }
  107. void ShaderProgram::setUniform(const char* name, const glm::mat3& value) {
  108. glUniformMatrix3fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
  109. }
  110. void ShaderProgram::setUniform(const char* name, const glm::mat4& value) {
  111. glUniformMatrix4fv(getLocation(name), 1, GL_FALSE, &value[0][0]);
  112. }
  113.  
  114. ShaderProgram::~ShaderProgram() {
  115. for (uint shader : shaders)
  116. glDeleteShader(shader);
  117. glDeleteProgram(program);
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement