2022-10-08 00:14:45 +02:00

79 lines
2.3 KiB
C++

#include "mesh.h"
#include "constants.h"
#include <GL/glew.h>
namespace kek {
Vertex::Vertex(glm::vec3 pos, glm::vec3 normal, glm::vec2 texCoords) {
this->pos = pos;
this->normal = normal;
this->texCoords = texCoords;
}
Mesh::Mesh(std::vector<Vertex> vertices, std::vector<uint32_t> indices) {
this->vertices = vertices;
this->indices = indices;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);
//glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glVertexAttribPointer(KEK_VERTEX_SHADER_IN_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glEnableVertexAttribArray(KEK_VERTEX_SHADER_IN_POSITION);
glVertexAttribPointer(KEK_VERTEX_SHADER_IN_NORMAL, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, normal));
glEnableVertexAttribArray(KEK_VERTEX_SHADER_IN_NORMAL);
glVertexAttribPointer(KEK_VERTEX_SHADER_IN_TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, texCoords));
glEnableVertexAttribArray(KEK_VERTEX_SHADER_IN_TEXCOORD);
glBindVertexArray(0);
GLenum err = glGetError();
if(err != GL_NO_ERROR) {
std::cout << "OpenGL error while loading mesh: " << err << std::endl;
exit(1);
}
}
Mesh::~Mesh() {
glDeleteBuffers(1, &ebo);
glDeleteBuffers(1, &vbo);
glDeleteVertexArrays(1, &vao);
}
void Mesh::draw(Shader *shader) {
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
/*if(!light) {
material->diffuse->use(GL_TEXTURE0);
glUniform1i(glGetUniformLocation(shader->id, "material.diffuse"), 0);
material->specular->use(GL_TEXTURE1);
glUniform1i(glGetUniformLocation(shader->id, "material.specular"), 1);
glUniform1f(glGetUniformLocation(shader->id, "material.shininess"), material->shininess);
}*/
// Bind vertices + texture coordinates
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
}