gltest/src/GLObjects/GLObject.cpp

78 lines
2.4 KiB
C++

//
// Created by selim on 31.05.15.
//
#include "GLObject.h"
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
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);
}