Advertisement
thomasfn

glMesh.cpp

Nov 18th, 2011
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1.  
  2. #include "glMesh.hpp"
  3. #include "glShader.hpp"
  4. #include "../GL3/gl3w.h"
  5.  
  6.  // Note - these correspond to the AttributeT enum found in UnivMesh.hpp
  7. const char* AttribNames[MatSys::NUM_ATTRIBUTES] =
  8. {
  9.     "inPosition",
  10.     "inColour",
  11.     "inUV",
  12.     "inLUV",
  13.     "inNormal"
  14. };
  15. const int AttribSizes[MatSys::NUM_ATTRIBUTES] =
  16. {
  17.     sizeof(float) * 3,
  18.     sizeof(float) * 4,
  19.     sizeof(float) * 2,
  20.     sizeof(float) * 2,
  21.     sizeof(float) * 3
  22. };
  23. const int AttribOffsets[MatSys::NUM_ATTRIBUTES] =
  24. {
  25.     0,
  26.     sizeof(float) * 4,
  27.     sizeof(float) * 8,
  28.     sizeof(float) * 10,
  29.     sizeof(float) * 12
  30. };
  31.  
  32. glMeshT::glMeshT(WindingT W)
  33. {
  34.     UnivMeshT::UnivMeshT(W);
  35.     for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
  36.         iVBOs[i] = 0;
  37.     iVAO = 0;
  38.     lastBound = NULL;
  39. }
  40.  
  41. glMeshT::~glMeshT()
  42. {
  43.     for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
  44.     {
  45.         unsigned int vbo = iVBOs[i];
  46.         if (vbo != 0)
  47.         {
  48.             iVBOs[i] = 0;
  49.             glDeleteBuffers(1, &vbo);
  50.         }
  51.     }
  52.     if (iVAO != 0)
  53.     {
  54.         glDeleteVertexArrays(1, &iVAO);
  55.         iVAO = 0;
  56.     }
  57. }
  58.  
  59. void glMeshT::Init()
  60. {
  61.     for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
  62.     {
  63.         if (bAttributeNeeded[i])
  64.         {
  65.             unsigned int vbo;
  66.             glGenBuffers(1, &vbo);
  67.             iVBOs[i] = vbo;
  68.         }
  69.     }
  70.     glGenVertexArrays(1, &iVAO);
  71. }
  72.  
  73. void glMeshT::Update()
  74. {
  75.     if (!bModified) return;
  76.     RebuildVBOs();
  77.     bModified = false;
  78. }
  79.  
  80. void glMeshT::RebuildVBOs()
  81. {
  82.     unsigned int cnt = GetVertexCount();
  83.     for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
  84.     {
  85.         unsigned int vbo = iVBOs[i];
  86.         if (vbo != 0)
  87.         {
  88.             glBindBuffer(GL_ARRAY_BUFFER, vbo);
  89.             unsigned int len = cnt * AttribSizes[i];
  90.             char* tmp = new char[len];
  91.             int offset = 0;
  92.             for (unsigned int j = 0; j < cnt; j++)
  93.             {
  94.                 memcpy(tmp + offset, (&Vertices[j]) + AttribOffsets[i], AttribSizes[i]);
  95.                 offset += AttribSizes[i];
  96.             }
  97.             glBufferData(GL_ARRAY_BUFFER, len, tmp, GL_STATIC_DRAW);
  98.             delete [] tmp;
  99.         }
  100.     }
  101.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  102. }
  103.  
  104. void glMeshT::RebuildVAO(glShaderT* shader)
  105. {
  106.     glBindVertexArray(iVAO);
  107.     for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
  108.     {
  109.         unsigned int vbo = iVBOs[i];
  110.         if (vbo != 0)
  111.         {
  112.             glBindBuffer(GL_ARRAY_BUFFER, vbo);
  113.             shader->BindAttribute(AttribNames[i], AttribSizes[i]);
  114.         }
  115.     }
  116.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  117.     // We don't unbind here - intentional
  118. }
  119.  
  120. void glMeshT::Render(glShaderT* shader)
  121. {
  122.     if (shader != lastBound)
  123.     {
  124.         RebuildVAO(shader); // This will leave the VAO bound for us
  125.         lastBound = shader;
  126.     }
  127.     else
  128.         glBindVertexArray(iVAO);
  129.     glDrawArrays(GL_TRIANGLES, 0, GetVertexCount());
  130.     glBindVertexArray(0);
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement