Use VBO now copies texCoords & indices to vram.

This commit is contained in:
2024-03-19 14:15:14 -04:00
parent 389da5d713
commit 02bfb8ff60
3 changed files with 52 additions and 18 deletions

View File

@@ -27,7 +27,12 @@ public:
void rotate(const Vector3& angle);
void load(const std::string& filename);
static void erase(const VertexArray& vArray);
void drawWireframe();
virtual void draw();
GLuint vbo = NULL;
void drawWireframe();
VertexArray() = default;
VertexArray(const std::string& filename);
GLuint vbo = 0; //Vertices
GLuint ebo = 0; //Indices
GLuint tbo = 0; //Texture Coordinates
};

View File

@@ -178,7 +178,6 @@ void Entity::render() {
bool Entity::isCollidingWith(Entity *entity) {
Collider thisCollider = this->getCollider();
Collider otherCollider = entity->getCollider();
std::cout << (int) entity->getCollider().type << std::endl;
if (thisCollider.type == ColliderType::OrientedBoundingBox && otherCollider.type == ColliderType::OrientedBoundingBox)
return Collision::orientedBoundingBoxCollides(thisCollider, otherCollider);

View File

@@ -50,7 +50,8 @@ void VertexArray::load (const std::string& filename) {
//Copy verts to vram.
if (engine->useVBO) {
if (vbo == NULL) {
if (vbo == 0) {
//This breaks stuff if the model is *very* big.
GLfloat verts[vertices.size() * 3];
size_t index = 0;
for (const auto &vertex: vertices) {
@@ -58,12 +59,28 @@ void VertexArray::load (const std::string& filename) {
verts[index++] = vertex.y;
verts[index++] = vertex.z;
}
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts, GL_STATIC_DRAW); //GL_STATIC_DRAW means the VBO won't be changed atall.
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//This breaks stuff if the model is *very* big.
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts, GL_STATIC_DRAW); //GL_STATIC_DRAW means the VBO won't be changed atall.
glBindBuffer(GL_ARRAY_BUFFER, 0);
//Copy Texture Coordinates to vram.
GLfloat textureCoordinates[texCoords.size() * 2];
index = 0;
for (const auto &tCoord: texCoords) {
textureCoordinates[index++] = tCoord.x;
textureCoordinates[index++] = tCoord.y;
}
glGenBuffers(1, &tbo);
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(textureCoordinates), &textureCoordinates, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//copy indices to vram.
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, (indices.size() * sizeof(GLuint)), indices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
}
@@ -79,26 +96,32 @@ void VertexArray::draw() {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(TextureCoordinate), &texCoords[0].x);
if (!engine->useVBO)
if (!engine->useVBO) {
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(TextureCoordinate), &texCoords[0].x);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
}
if (engine->useVBO) {
//Vertices
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(3, GL_FLOAT, 0, nullptr);
}
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
//Texture Coordinates
glBindBuffer(GL_ARRAY_BUFFER, tbo);
glTexCoordPointer(2, GL_FLOAT, 0, nullptr);
//Indices
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
if (engine->useVBO)
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, nullptr);
//Reset bound buffer.
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisable(GL_TEXTURE_2D);
}
//This only works for *really* simple shapes.
//Primarily for the bounding box.
}
void VertexArray::drawWireframe() {
@@ -153,11 +176,18 @@ VertexArray VertexArray::getBoundingVolume(Vector3 angle) {
}
void VertexArray::erase(const VertexArray& vArray) {
if (engine->useVBO)
if (engine->useVBO) {
glDeleteBuffers(1, &vArray.vbo);
glDeleteBuffers(1, &vArray.tbo);
glDeleteBuffers(1, &vArray.ebo);
}
for (int i = 0; i < engine->world->geometryList.size(); i++) {
if (engine->world->geometryList[i].name == vArray.name)
engine->world->geometryList.erase(engine->world->geometryList.begin() + i);
}
}
VertexArray::VertexArray(const std::string &filename) {
load(filename);
}