78 lines
2.4 KiB
C++
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);
|
|
}
|