#include #include #define GLM_FORCE_RADIANS #include #include #include #include #include "shaders.hh" #include "Object.hh" using namespace gl; Object::Object(VBOManager& vboManager, std::vector const& vas, std::vector indices, Program& prog) : _vboManager(vboManager), _prog(prog), _indices(std::move(indices)), _vaID(0) { construct(vas); } Object::Object(VBOManager& vboManager, std::string const& filename, Program& prog) : _vboManager(vboManager), _prog(prog), _vaID(0) { auto tmp = readObject(filename); _indices = std::get<1>(tmp); construct(std::get<0>(tmp)); } Object::~Object() { glDeleteVertexArrays(1, &_vaID); } void Object::draw(glm::mat4 const& modelview, Program *override) const { glBindVertexArray(_vaID); if (override) override->use(); else _prog.use(); glUniformMatrix4fv(_prog.getUniformLocation("model_matrix"), 1, GL_FALSE, glm::value_ptr(modelview)); glDrawElements(GL_TRIANGLES, _indices.size(), GL_UNSIGNED_SHORT, _indices.data()); } void Object::construct(std::vector const& vas) { _vbo = _vboManager.alloc(sizeof(objVertexAttribs)*vas.size()); glBindBuffer(GL_ARRAY_BUFFER, _vbo.getVBOId()); glBufferSubData(GL_ARRAY_BUFFER, _vbo.getOfs(), sizeof(objVertexAttribs)*vas.size(), (void*)vas.data()); glGenVertexArrays(1, &_vaID); glBindVertexArray(_vaID); GLint al; if((al = _prog.getAttribLocation("vertex")) != -1) { glEnableVertexAttribArray(al); glVertexAttribPointer(al, 3, GL_FLOAT, GL_FALSE, sizeof(objVertexAttribs), (void*)(_vbo.getOfs()+offsetof(objVertexAttribs, vertex))); } if((al = _prog.getAttribLocation("vertexTC")) != -1) { glEnableVertexAttribArray(al); glVertexAttribPointer(al, 2, GL_UNSIGNED_SHORT, GL_TRUE, sizeof(objVertexAttribs), (void*)(_vbo.getOfs()+offsetof(objVertexAttribs, texCoords))); } if((al = _prog.getAttribLocation("vertexNorm")) != -1) { glEnableVertexAttribArray(al); glVertexAttribPointer(al, 4, GL_INT_2_10_10_10_REV, GL_TRUE, sizeof(objVertexAttribs), (void*)(_vbo.getOfs()+offsetof(objVertexAttribs, normal))); } }