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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include "GlWrappers.h"
  2. #include <iostream>
  3. #include "gl.h"
  4. #include "util.h"
  5. namespace Cygnet {
  6. GlShader::GlShader(Type type, const char *source) {
  7. switch (type) {
  8. case Type::VERTEX:
  9. id_ = glCreateShader(GL_VERTEX_SHADER);
  10. glCheck();
  11. std::cerr << "Cygnet: Compiling vertex shader...\n";
  12. break;
  13. case Type::FRAGMENT:
  14. id_ = glCreateShader(GL_FRAGMENT_SHADER);
  15. glCheck();
  16. std::cerr << "Cygnet: Compiling fragment shader...\n";
  17. break;
  18. }
  19. glShaderSource(id_, 1, &source, NULL);
  20. glCheck();
  21. glCompileShader(id_);
  22. glCheck();
  23. char log[4096];
  24. GLsizei length = 0;
  25. glGetShaderInfoLog(id_, sizeof(log), &length, log);
  26. glCheck();
  27. if (length != 0) {
  28. std::cerr << "Cygnet: Shader compile info (" << length << "):\n" << log << '\n';
  29. }
  30. GLint status = 0;
  31. glGetShaderiv(id_, GL_COMPILE_STATUS, &status);
  32. glCheck();
  33. if (status == GL_FALSE) {
  34. std::cerr << "Cygnet: Here's the broken shader:\n" << source << '\n';
  35. throw GlCompileError("GL shader compilation failed.");
  36. }
  37. }
  38. GlShader::~GlShader() {
  39. glDeleteShader(id_);
  40. glCheck();
  41. }
  42. GlProgram::GlProgram() {
  43. id_ = glCreateProgram();
  44. glCheck();
  45. }
  46. GlProgram::~GlProgram() {
  47. glDeleteProgram(id_);
  48. glCheck();
  49. }
  50. void GlProgram::addShader(const GlShader &shader) {
  51. glAttachShader(id_, shader.id());
  52. glCheck();
  53. }
  54. GLint GlProgram::attribLoc(const char *name) {
  55. return glGetAttribLocation(id_, name);
  56. }
  57. GLint GlProgram::uniformLoc(const char *name) {
  58. return glGetUniformLocation(id_, name);
  59. }
  60. void GlProgram::link() {
  61. std::cout << "Cygnet: Linking...\n";
  62. glLinkProgram(id_);
  63. glCheck();
  64. char log[4096];
  65. GLsizei length = 0;
  66. glGetProgramInfoLog(id_, sizeof(log), &length, log);
  67. glCheck();
  68. if (length != 0) {
  69. std::cerr << "Cygnet: Program link info:\n" << log << '\n';
  70. }
  71. GLint status = 0;
  72. glGetProgramiv(id_, GL_LINK_STATUS, &status);
  73. glCheck();
  74. if (status == GL_FALSE) {
  75. throw GlCompileError("GL program link failed.");
  76. }
  77. }
  78. }