| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- // ----------------------------------------------------------------
- // From Game Programming in C++ by Sanjay Madhav
- // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
- //
- // Released under the BSD License
- // See LICENSE in root directory for full details.
- // ----------------------------------------------------------------
- #include "VertexArray.h"
- #include <GL/glew.h>
- VertexArray::VertexArray(const void* verts, unsigned int numVerts, Layout layout,
- const unsigned int* indices, unsigned int numIndices)
- :mNumVerts(numVerts)
- ,mNumIndices(numIndices)
- {
- // Create vertex array
- glGenVertexArrays(1, &mVertexArray);
- glBindVertexArray(mVertexArray);
- unsigned vertexSize = 8 * sizeof(float);
- if (layout == PosNormSkinTex)
- {
- vertexSize = 8 * sizeof(float) + 8 * sizeof(char);
- }
- // Create vertex buffer
- glGenBuffers(1, &mVertexBuffer);
- glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
- glBufferData(GL_ARRAY_BUFFER, numVerts * vertexSize, verts, GL_STATIC_DRAW);
- // Create index buffer
- glGenBuffers(1, &mIndexBuffer);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices * sizeof(unsigned int), indices, GL_STATIC_DRAW);
- // Specify the vertex attributes
- if (layout == PosNormTex)
- {
- // Position is 3 floats
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexSize, 0);
- // Normal is 3 floats
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 3));
- // Texture coordinates is 2 floats
- glEnableVertexAttribArray(2);
- glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 6));
- }
- else if (layout == PosNormSkinTex)
- {
- // Position is 3 floats
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexSize, 0);
- // Normal is 3 floats
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 3));
- // Skinning indices (keep as ints)
- glEnableVertexAttribArray(2);
- glVertexAttribIPointer(2, 4, GL_UNSIGNED_BYTE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 6));
- // Skinning weights (convert to floats)
- glEnableVertexAttribArray(3);
- glVertexAttribPointer(3, 4, GL_UNSIGNED_BYTE, GL_TRUE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 6 + sizeof(char) * 4));
- // Texture coordinates
- glEnableVertexAttribArray(4);
- glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, vertexSize,
- reinterpret_cast<void*>(sizeof(float) * 6 + sizeof(char) * 8));
- }
- }
- VertexArray::~VertexArray()
- {
- glDeleteBuffers(1, &mVertexBuffer);
- glDeleteBuffers(1, &mIndexBuffer);
- glDeleteVertexArrays(1, &mVertexArray);
- }
- void VertexArray::SetActive()
- {
- glBindVertexArray(mVertexArray);
- }
|