Guest User

Untitled

a guest
Oct 9th, 2023
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. #include "include/glad/glad.h"
  2. #include <GLFW/glfw3.h>
  3. #include <cstddef>
  4. #include <initializer_list>
  5. #include <iostream>
  6. #include <exception>
  7. #include <string_view>
  8. #include <string>
  9. #include <memory>
  10.  
  11.  
  12. class BufferObject {
  13. public:
  14. BufferObject(size_t n, GLenum target, size_t size, const void *data, GLenum usage) {
  15. glGenBuffers(n, &buffer_id);
  16. glBindBuffer(target, buffer_id);
  17. glBufferData(target, size, data, usage);
  18. }
  19.  
  20. unsigned int get_vbo_id() const {
  21. return buffer_id;
  22. }
  23.  
  24. private:
  25. unsigned int buffer_id;
  26. };
  27.  
  28.  
  29. class VAObject {
  30. public:
  31. explicit VAObject(size_t n) {
  32. glGenVertexArrays(n, &vao_id);
  33. }
  34.  
  35. void bind_vao() const {
  36. glBindVertexArray(vao_id);
  37. }
  38.  
  39. unsigned int get_vao_id() const {
  40. return vao_id;
  41. }
  42.  
  43. private:
  44. unsigned int vao_id;
  45. };
  46.  
  47.  
  48. class GLShader {
  49. friend class GLShaderProgram;
  50. public:
  51. GLShader(const char **src, size_t count, GLenum shader_type, int *length) {
  52. shader_id = glCreateShader(shader_type);
  53. glShaderSource(shader_id, count, src, length);
  54. glCompileShader(shader_id);
  55. glGetShaderiv(shader_id, GL_COMPILE_STATUS, &compile_status);
  56. }
  57.  
  58. int get_compile_status() const {
  59. return compile_status;
  60. }
  61.  
  62. unsigned int get_shader_id() const {
  63. return shader_id;
  64. }
  65.  
  66. ~GLShader() {
  67. glDeleteShader(shader_id);
  68. }
  69.  
  70. void get_shader_infolog() const {
  71. char *log;
  72. glGetShaderInfoLog(shader_id, 512, NULL, log);
  73. std::cout << log << std::endl;
  74. }
  75.  
  76. private:
  77. unsigned int shader_id;
  78. int compile_status;
  79. };
  80.  
  81.  
  82. class GLShaderProgram {
  83. public:
  84. GLShaderProgram(std::initializer_list<std::shared_ptr<GLShader>> shaders) {
  85. shader_program_id = glCreateProgram();
  86.  
  87. for (auto shader : shaders)
  88. glAttachShader(shader_program_id, shader->get_shader_id());
  89.  
  90. for (auto shader : shaders)
  91. shader.reset();
  92. }
  93.  
  94. void link_program() {
  95. glLinkProgram(shader_program_id);
  96. }
  97.  
  98. void bind_attribute_location(int location, const char *attr) {
  99. glBindAttribLocation(shader_program_id, location, attr);
  100. }
  101.  
  102. void use_shader_program() const {
  103. glUseProgram(shader_program_id);
  104. }
  105.  
  106. private:
  107. unsigned int shader_program_id;
  108. };
  109.  
  110.  
  111. class GLFWInitFailed: public std::exception {
  112. public:
  113. GLFWInitFailed(int err_code, const char *msg) {
  114. full_error_message = "[" + std::to_string(err_code) + "] " + std::string(msg);
  115. }
  116.  
  117. const char *what() const noexcept override {
  118. return full_error_message.c_str();
  119. }
  120.  
  121. private:
  122. std::string full_error_message;
  123. };
  124.  
  125.  
  126. void error_callback(int err_code, const char *err_msg);
  127.  
  128.  
  129. void framebuffer_size_callback(GLFWwindow *window, int width, int height);
  130.  
  131.  
  132. class GLFWWindow {
  133. friend void error_callback(int err_code, const char *err_msg);
  134. friend void framebuffer_size_callback(GLFWwindow *window, size_t width, size_t height);
  135. public:
  136. GLFWWindow(size_t width, size_t height, const char *title, GLFWmonitor *monitor, GLFWwindow *share,
  137. int version_major, int version_minor, int profile);
  138.  
  139. ~GLFWWindow() {
  140. glfwTerminate();
  141. }
  142.  
  143. GLFWWindow(const GLFWWindow &rhs) = delete;
  144. GLFWWindow &operator=(const GLFWWindow &rhs) = delete;
  145.  
  146. void set_viewport(int x, int y, size_t width, size_t height) {
  147. glViewport(x, y, width, height);
  148. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  149. viewport_x = x;
  150. viewport_y = y;
  151. }
  152.  
  153. void main_loop_setup() {
  154. glfwSwapBuffers(window);
  155. glfwPollEvents();
  156. }
  157.  
  158. void get_gl_string(GLenum name) {
  159. std::cout << glGetString(name) << std::endl;
  160. }
  161.  
  162. bool should_close() {
  163. return glfwWindowShouldClose(window);
  164. }
  165.  
  166. void set_close() {
  167. glfwSetWindowShouldClose(window, true);
  168. }
  169.  
  170. void set_color(float r, float g, float b, float a) {
  171. glClearColor(r, g, b, a);
  172. }
  173.  
  174. void clear_buffer(GLbitfield mask) {
  175. glClear(mask);
  176. }
  177.  
  178. int get_event(int key) {
  179. return glfwGetKey(window, key);
  180. }
  181.  
  182. static int viewport_x;
  183. static int viewport_y;
  184.  
  185. private:
  186. GLFWwindow *window;
  187. };
Advertisement
Add Comment
Please, Sign In to add comment