Advertisement
Guest User

Untitled

a guest
Oct 21st, 2023
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.76 KB | None | 0 0
  1. #include "Surface.h"
  2.  
  3.  
  4. namespace Renderer{
  5.  
  6. bool Surface::initialized = false;
  7. GLuint Surface::VBO = 0;
  8. GLuint Surface::EBO = 0;
  9. Shader Surface::shader = Shader();
  10. Shader Surface::shaderInstanced = Shader();
  11.  
  12. Surface::Surface(){
  13. if(!initialized){
  14. Initialize();
  15. }
  16.  
  17. }
  18.  
  19. Surface::Surface(glm::vec3 pos, glm::vec3 scale, glm::vec3 rotation, Sprite sprite){
  20. if(!initialized){
  21. Initialize();
  22. }
  23. CreateVAO();
  24.  
  25. this->pos = pos;
  26. this->scale = scale;
  27. this->rotation = rotation;
  28. this->sprite = sprite;
  29.  
  30. UpdateModelMatrix();
  31. }
  32.  
  33. void Surface::CreateVAO(){
  34. glCreateVertexArrays(1, &VAO);
  35. glBindVertexArray(VAO);
  36.  
  37. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  38. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  39.  
  40. glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
  41.  
  42.  
  43. glEnableVertexAttribArray(0);
  44.  
  45. }
  46.  
  47. void Surface::CreateInstanceVBO(){
  48.  
  49. glBindVertexArray(VAO);
  50.  
  51. glCreateBuffers(1, &instanceVBO);
  52. glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
  53.  
  54. glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(0 * sizeof(float)));
  55. glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(4 * sizeof(float)));
  56. glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(8 * sizeof(float)));
  57. glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 16 * sizeof(float), (void*)(12 * sizeof(float)));
  58.  
  59. glEnableVertexAttribArray(1);
  60. glEnableVertexAttribArray(2);
  61. glEnableVertexAttribArray(3);
  62. glEnableVertexAttribArray(4);
  63.  
  64. glVertexAttribDivisor(1, 1);
  65. glVertexAttribDivisor(2, 1);
  66. glVertexAttribDivisor(3, 1);
  67. glVertexAttribDivisor(4, 1);
  68. }
  69.  
  70. void Surface::UpdateModelMatrix(){
  71. model = glm::mat4(1.0f);
  72.  
  73. model = glm::translate(model, pos);
  74. model = glm::rotate(model, glm::radians(rotation.y), glm::vec3(1, 0, 0));
  75. model = glm::rotate(model, glm::radians(rotation.x), glm::vec3(0, 1, 0));
  76. model = glm::rotate(model, glm::radians(rotation.z), glm::vec3(0, 0, 1));
  77. model = glm::scale(model, scale);
  78. }
  79.  
  80. void Surface::SetPosition(glm::vec3 pos){
  81. this->pos = pos;
  82. UpdateModelMatrix();
  83. }
  84.  
  85. void Surface::SetScale(glm::vec3 scale){
  86. this->scale = scale;
  87. UpdateModelMatrix();
  88. }
  89.  
  90. void Surface::SetRotation(glm::vec3 rotation){
  91. this->rotation = rotation;
  92. UpdateModelMatrix();
  93. }
  94.  
  95. void Surface::UpdateInstanceVBO(std::vector<glm::vec3>& newTransform){
  96. if(newTransform.size() % 3 != 0){
  97. std::cerr << "ABORTING. NOT UPDATING THE INSTANCE VBO, newTransform not divisible by 3" << std::endl;
  98. return;
  99. }
  100.  
  101. instanceCount = newTransform.size()/3;
  102.  
  103. std::vector<float> v;
  104. for(uint32_t i = 0; i < newTransform.size()/3; i++){
  105. glm::vec3 instancePos = newTransform[i*3];
  106. glm::vec3 instanceScale = newTransform[i*3+1];
  107. glm::vec3 instanceRotation = newTransform[i*3+2];
  108. glm::mat4 instanceModel = glm::mat4(1.0f);
  109.  
  110. instanceModel = glm::translate(instanceModel, instancePos);
  111. instanceModel = glm::rotate(instanceModel, glm::radians(instanceRotation.y), glm::vec3(1, 0, 0));
  112. instanceModel = glm::rotate(instanceModel, glm::radians(instanceRotation.x), glm::vec3(0, 1, 0));
  113. instanceModel = glm::rotate(instanceModel, glm::radians(instanceRotation.z), glm::vec3(0, 0, 1));
  114. instanceModel = glm::scale(instanceModel, instanceScale);
  115.  
  116. v.push_back(instanceModel[0][0]);
  117. v.push_back(instanceModel[1][0]);
  118. v.push_back(instanceModel[2][0]);
  119. v.push_back(instanceModel[3][0]);
  120.  
  121. v.push_back(instanceModel[0][1]);
  122. v.push_back(instanceModel[1][1]);
  123. v.push_back(instanceModel[2][1]);
  124. v.push_back(instanceModel[3][1]);
  125.  
  126. v.push_back(instanceModel[0][2]);
  127. v.push_back(instanceModel[1][2]);
  128. v.push_back(instanceModel[2][2]);
  129. v.push_back(instanceModel[3][2]);
  130.  
  131. v.push_back(instanceModel[0][3]);
  132. v.push_back(instanceModel[1][3]);
  133. v.push_back(instanceModel[2][3]);
  134. v.push_back(instanceModel[3][3]);
  135. }
  136.  
  137. glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
  138.  
  139. glBufferData(GL_ARRAY_BUFFER, sizeof(float) * v.size(), v.data(), GL_DYNAMIC_DRAW);
  140.  
  141. }
  142.  
  143. void Surface::Draw(){
  144. shader.Use();
  145. sprite.BindTexture(GL_TEXTURE0);
  146.  
  147. glUniformMatrix4fv(shader.GetUniformLoc("model"), 1, GL_FALSE, glm::value_ptr(model));
  148. glUniform1i(shader.GetUniformLoc("tex"), 0);//TODO CHECK WHYNOT WORK;
  149.  
  150. Camera::ApplyViewProjectionMatrix(shader);
  151.  
  152. glBindVertexArray(VAO);
  153.  
  154. glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
  155. }
  156.  
  157. void Surface::DrawInstanced(){
  158. glBindVertexArray(VAO);
  159.  
  160. shaderInstanced.Use();
  161. sprite.BindTexture(GL_TEXTURE0);
  162.  
  163. Camera::ApplyViewProjectionMatrix(shaderInstanced);
  164.  
  165. glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr, instanceCount);
  166. }
  167.  
  168. void Surface::ClearInstanceVBO(){
  169. glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
  170.  
  171. glBufferData(instanceVBO, 0, 0, GL_STATIC_DRAW);
  172. }
  173.  
  174. const float vertices[] = {
  175. -0.5, -0.5,
  176. 0.5, -0.5,
  177. -0.5, 0.5,
  178. 0.5, 0.5
  179. };
  180. const unsigned int indices[] = {
  181. 0, 1, 2,
  182. 1, 2, 3
  183. };
  184. void Surface::Initialize(){
  185. initialized = true;
  186.  
  187.  
  188. glCreateBuffers(1, &VBO);
  189. glBindBuffer(GL_ARRAY_BUFFER, VBO);
  190.  
  191. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
  192.  
  193. glCreateBuffers(1, &EBO);
  194. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
  195.  
  196. glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
  197.  
  198. shader = Shader("shaders/surface.vert", "shaders/surface.frag");
  199. shaderInstanced = Shader("shaders/surfaceInstanced.vert", "shaders/surface.frag");
  200. }
  201.  
  202. }
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement