In my code I have a function called CompileRawBufferData(), this function compiles my array of custom classes into raw data that the buffer can read. The array of VBufferObject
s is really just the same as the normal data, except with a bufferSignature so I can identify the object when I need to delete it from the buffers. VBufferObject looks like this:
namespace Vega
{
class VBufferObject
{
public:
unsigned int bufferSignature;
std::vector<unsigned int> IBD;
std::vector<glm::vec3> VBD;
std::vector<glm::vec2> UVBD;
std::vector<glm::vec3> NBD;
};
}
This is then passed into my CompileRawBufferData() function which looks like this:
void VInstance::CompileRawBufferData
(
std::vector<unsigned int>& IBD,
std::vector<glm::vec3>& VBD,
std::vector<glm::vec2>& UVBD,
std::vector<glm::vec3>& NBD
)
{
std::vector<unsigned int> IBData;
std::vector<glm::vec3> VBData;
std::vector<glm::vec2> UVBData;
std::vector<glm::vec3> NBData;
for (VBufferObject object : objectBuffer)
{
IBData.insert(IBData.end(), object.IBD.begin(), object.IBD.end());
VBData.insert(VBData.end(), object.VBD.begin(), object.VBD.end());
UVBData.insert(UVBData.end(), object.UVBD.begin(), object.UVBD.end());
NBData.insert(NBData.end(), object.NBD.begin(), object.NBD.end());
}
IBD = IBData;
VBD = VBData;
UVBD = UVBData;
NBD = NBData;
glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);
}
So everytime I want to update the objects in a scene (add or delete them) I call:
Loader::LoadObject("OBJECT PATH", objectBuffer, newestSignature);
CompileRawBufferData(IBD, VBD, UVBD, NBD);
The LoadObject() function loads and adds the new object to the objectBuffer and then I compile the raw buffer data to be assigned to each of the buffers.
When I use the glBufferData() in the main function like this:
GLuint VertexBuffer;
glGenBuffers(1, &VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);
GLuint UVBuffer;
glGenBuffers(1, &UVBuffer);
glBindBuffer(GL_ARRAY_BUFFER, UVBuffer);
glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);
GLuint NormalBuffer;
glGenBuffers(1, &NormalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);
GLuint IndexBuffer;
glGenBuffers(1, &IndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);
It works perfectly fine, however, in the CompileRawBufferData() function (above) it does not update the buffers, and doesn't cause any errors either. NOTE: I am 100% that this is not the fault of the object loader. Any help would be appreciated.
To update the buffers, I need to bind them like so:
glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, UVBuffer);
glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, IndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);
Instead of calling glBufferData by itself. Credit to genpfault for the answer.