#ifndef __OPENGLPLAYGROUND_OBJECT_HH__ #define __OPENGLPLAYGROUND_OBJECT_HH__ #include #include "objectParser.hh" #include "VBOManager.hh" class Object { public: Object(VBOManager& vboManager, std::vector const& vas, std::vector const& indices, Program& prog) : _vboManager(vboManager), _prog(prog), _indices(indices), _vaID(0) { construct(vas); } 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() { glDeleteVertexArrays(1, &_vaID); } void draw(glm::mat4 const& modelview, Program *override = nullptr) 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()); } private: void 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))); } } VBOManager& _vboManager; VBOManager::VBOAlloc _vbo; Program& _prog; std::vector _indices; GLuint _vaID; }; #endif