Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "glMesh.hpp"
- #include "glShader.hpp"
- #include "../GL3/gl3w.h"
- // Note - these correspond to the AttributeT enum found in UnivMesh.hpp
- const char* AttribNames[MatSys::NUM_ATTRIBUTES] =
- {
- "inPosition",
- "inColour",
- "inUV",
- "inLUV",
- "inNormal"
- };
- const int AttribSizes[MatSys::NUM_ATTRIBUTES] =
- {
- sizeof(float) * 3,
- sizeof(float) * 4,
- sizeof(float) * 2,
- sizeof(float) * 2,
- sizeof(float) * 3
- };
- const int AttribOffsets[MatSys::NUM_ATTRIBUTES] =
- {
- 0,
- sizeof(float) * 4,
- sizeof(float) * 8,
- sizeof(float) * 10,
- sizeof(float) * 12
- };
- glMeshT::glMeshT(WindingT W)
- {
- UnivMeshT::UnivMeshT(W);
- for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
- iVBOs[i] = 0;
- iVAO = 0;
- lastBound = NULL;
- }
- glMeshT::~glMeshT()
- {
- for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
- {
- unsigned int vbo = iVBOs[i];
- if (vbo != 0)
- {
- iVBOs[i] = 0;
- glDeleteBuffers(1, &vbo);
- }
- }
- if (iVAO != 0)
- {
- glDeleteVertexArrays(1, &iVAO);
- iVAO = 0;
- }
- }
- void glMeshT::Init()
- {
- for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
- {
- if (bAttributeNeeded[i])
- {
- unsigned int vbo;
- glGenBuffers(1, &vbo);
- iVBOs[i] = vbo;
- }
- }
- glGenVertexArrays(1, &iVAO);
- }
- void glMeshT::Update()
- {
- if (!bModified) return;
- RebuildVBOs();
- bModified = false;
- }
- void glMeshT::RebuildVBOs()
- {
- unsigned int cnt = GetVertexCount();
- for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
- {
- unsigned int vbo = iVBOs[i];
- if (vbo != 0)
- {
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- unsigned int len = cnt * AttribSizes[i];
- char* tmp = new char[len];
- int offset = 0;
- for (unsigned int j = 0; j < cnt; j++)
- {
- memcpy(tmp + offset, (&Vertices[j]) + AttribOffsets[i], AttribSizes[i]);
- offset += AttribSizes[i];
- }
- glBufferData(GL_ARRAY_BUFFER, len, tmp, GL_STATIC_DRAW);
- delete [] tmp;
- }
- }
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- }
- void glMeshT::RebuildVAO(glShaderT* shader)
- {
- glBindVertexArray(iVAO);
- for (int i = 0; i < MatSys::NUM_ATTRIBUTES; i++)
- {
- unsigned int vbo = iVBOs[i];
- if (vbo != 0)
- {
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- shader->BindAttribute(AttribNames[i], AttribSizes[i]);
- }
- }
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- // We don't unbind here - intentional
- }
- void glMeshT::Render(glShaderT* shader)
- {
- if (shader != lastBound)
- {
- RebuildVAO(shader); // This will leave the VAO bound for us
- lastBound = shader;
- }
- else
- glBindVertexArray(iVAO);
- glDrawArrays(GL_TRIANGLES, 0, GetVertexCount());
- glBindVertexArray(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement