// // Created by selim on 31.05.15. // #include "GLObject.h" #include #include GLObject::GLObject(ShaderProgram *shaderProgram): _sp(shaderProgram) { } GLObject::~GLObject() { glDeleteBuffers(1, &_vertexVbo); glDeleteBuffers(1, &_indexVbo); } void GLObject::create() { auto vData = generateVertices(); auto iData = generateIndices(); GLuint vbo[2]; glGenBuffers(2, vbo); _vertexVbo = vbo[0]; _indexVbo = vbo[1]; glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); glBufferData(GL_ARRAY_BUFFER, std::get<1>(vData), std::get<0>(vData), GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVbo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, std::get<1>(iData), std::get<0>(iData), GL_STATIC_DRAW); _trianglesCount = std::get<1>(iData)/sizeof(GLuint); glGenVertexArrays(1, &_vao); glBindVertexArray(_vao); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), nullptr); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (GLchar*)(3*sizeof(float))); delete[] std::get<0>(vData); delete[] std::get<0>(iData); } void GLObject::rotate(glm::vec3 angles) { GLint world = glGetUniformLocation(*_sp, "mWorld"); _worldMatrix = glm::rotate(_worldMatrix, angles.x, glm::vec3(1.0f, 0.0f, 0.0f)); _worldMatrix = glm::rotate(_worldMatrix, angles.y, glm::vec3(0.0f, 1.0f, 0.0f)); _worldMatrix = glm::rotate(_worldMatrix, angles.z, glm::vec3(0.0f, 0.0f, 1.0f)); glUniformMatrix4fv(world, 1, GL_FALSE, glm::value_ptr(_worldMatrix)); } void GLObject::scale(glm::vec3 scaleFactor) { GLint world = glGetUniformLocation(*_sp, "mWorld"); _worldMatrix = glm::scale(_worldMatrix, scaleFactor); glUniformMatrix4fv(world, 1, GL_FALSE, glm::value_ptr(_worldMatrix)); } void GLObject::translate(glm::vec3 point) { } void GLObject::draw() { _worldMatrix = glm::mat4(); glBindVertexArray(_vao); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexVbo); glDrawElements(GL_TRIANGLES, _trianglesCount, GL_UNSIGNED_INT, nullptr); } void GLObject::update() { auto vData = generateVertices(); glBindBuffer(GL_ARRAY_BUFFER, _vertexVbo); // glBufferData(GL_ARRAY_BUFFER, _size*_size*sizeof(Vertex), NULL, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, std::get<1>(vData), std::get<0>(vData), GL_STREAM_DRAW); delete[] std::get<0>(vData); }