A 2D tile-based sandbox game.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GlProgram.cc 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "GlProgram.h"
  2. #include <iostream>
  3. #include <stdexcept>
  4. namespace Cygnet {
  5. GlShader::GlShader(const char *source, Type type) {
  6. switch (type) {
  7. case Type::VERTEX:
  8. id_ = glCreateShader(GL_VERTEX_SHADER);
  9. break;
  10. case Type::FRAGMENT:
  11. id_ = glCreateShader(GL_FRAGMENT_SHADER);
  12. break;
  13. }
  14. glShaderSource(id_, 1, &source, NULL);
  15. glCompileShader(id_);
  16. char log[4096];
  17. GLsizei length;
  18. glGetShaderInfoLog(id_, sizeof(log), &length, log);
  19. if (length != 0) {
  20. std::cerr << "Shader compile info:\n" << log << '\n';
  21. }
  22. GLint status;
  23. glGetShaderiv(id_, GL_COMPILE_STATUS, &status);
  24. if (status == GL_FALSE) {
  25. id_ = -1;
  26. throw std::runtime_error("GL shader compilation failed.");
  27. }
  28. valid_ = true;
  29. }
  30. GlShader::~GlShader() {
  31. if (valid_) {
  32. glDeleteShader(id_);
  33. }
  34. }
  35. GlProgram::GlProgram(std::initializer_list<std::reference_wrapper<GlShader>> shaders) {
  36. id_ = glCreateProgram();
  37. for (GlShader &shader: shaders) {
  38. glAttachShader(id_, shader.id());
  39. }
  40. glLinkProgram(id_);
  41. char log[4096];
  42. GLsizei length;
  43. glGetProgramInfoLog(id_, sizeof(log), &length, log);
  44. if (length != 0) {
  45. std::cerr << "Program link info:\n" << log << '\n';
  46. }
  47. GLint status;
  48. glGetProgramiv(id_, GL_LINK_STATUS, &status);
  49. if (status == GL_FALSE) {
  50. id_ = -1;
  51. throw std::runtime_error("GL program link failed.");
  52. }
  53. valid_ = true;
  54. }
  55. GlProgram::~GlProgram() {
  56. if (valid_) {
  57. glDeleteProgram(id_);
  58. }
  59. }
  60. }