Use VBO now copies texCoords & indices to vram.
This commit is contained in:
@@ -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
|
||||
};
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user