fixed mesh template issue

This commit is contained in:
Anselme 2016-04-26 22:03:55 +02:00
parent 72466f7ef7
commit c07c9e54a9
3 changed files with 38 additions and 30 deletions

View File

@ -15,6 +15,8 @@ if(CMAKE_BUILD_TYPE MATCHES "Debug")
endif() endif()
file(GLOB RESOURCES_FILES src/*.h shaders/*.glsl) file(GLOB RESOURCES_FILES src/*.h shaders/*.glsl)
FILE(GLOB RES_SRC_FILE shaders/*.glsl)
SET(RESOURCE_DST_FILE shaders.cpp)
set(CMAKE_TEMPLATE_PATH "../cmaketemplate") set(CMAKE_TEMPLATE_PATH "../cmaketemplate")

View File

@ -9,6 +9,13 @@
class Buffer class Buffer
{ {
public: public:
enum BufferType
{
VBO,
EBO,
UBO
};
virtual ~Buffer(); virtual ~Buffer();
virtual void bind() = 0; virtual void bind() = 0;
virtual void unbind() = 0; virtual void unbind() = 0;
@ -18,13 +25,6 @@ template <typename T>
class TBuffer : public Buffer class TBuffer : public Buffer
{ {
public: public:
enum BufferType
{
VBO,
EBO,
UBO
};
class BufferEditor class BufferEditor
{ {
GLenum m_typeEnum; GLenum m_typeEnum;

View File

@ -71,36 +71,34 @@ void Mesh::initGL()
glGenVertexArrays(1, &vao); glGenVertexArrays(1, &vao);
glBindVertexArray(vao); glBindVertexArray(vao);
Buffer *b;
// init positions VBO // init positions VBO
if(!positions3D.empty()) if(!positions3D.empty())
{ {
b = new TBuffer(positions3D, TBuffer::VBO); auto posBuffer = new TBuffer<glm::vec3>(positions3D, Buffer::VBO);
b->setVertexAttrib(0, 3); posBuffer->setVertexAttrib(0, 3);
addBuffer(b, POSITION_BUFFER); addBuffer(posBuffer, POSITION_BUFFER);
// init normals vbo // init normals vbo
if(!normals.empty()) if(!normals.empty())
{ {
b = new TBuffer(normals, TBuffer::VBO); auto normalsBuffer = new TBuffer<glm::vec3>(normals, Buffer::VBO);
b->setVertexAttrib(1, 3); normalsBuffer->setVertexAttrib(1, 3);
addBuffer(b, NORMAL_BUFFER); addBuffer(normalsBuffer, NORMAL_BUFFER);
} }
// init tangents vbo // init tangents vbo
if(!tangents.empty()) if(!tangents.empty())
{ {
b = new TBuffer(tangents, TBuffer::VBO); auto tangentsBuffer = new TBuffer<Tangents>(tangents, Buffer::VBO);
b->setVertexAttrib(3, 3); tangentsBuffer->setVertexAttrib(3, 3);
b->setVertexAttrib(4, 3); tangentsBuffer->setVertexAttrib(4, 3);
addBuffer(b, TANGENT_BUFFER); addBuffer(tangentsBuffer, TANGENT_BUFFER);
} }
} }
else if(!positions2D.empty()) else if(!positions2D.empty())
{ {
b = new TBuffer(positions2D, TBuffer::VBO); auto posBuffer = new TBuffer<glm::vec2>(positions2D, Buffer::VBO);
b->setVertexAttrib(0, 2); posBuffer->setVertexAttrib(0, 2);
addBuffer(b, POSITION_BUFFER); addBuffer(posBuffer, POSITION_BUFFER);
} }
else else
{ {
@ -110,24 +108,24 @@ void Mesh::initGL()
// init texCoords vbo // init texCoords vbo
if(!texCoords.empty()) if(!texCoords.empty())
{ {
b = new TBuffer(texCoords, TBuffer::VBO); auto texCoordBuffer = new TBuffer<glm::vec2>(texCoords, Buffer::VBO);
b->setVertexAttrib(2, 2); texCoordBuffer->setVertexAttrib(2, 2);
addBuffer(b, TEXCOORD_BUFFER); addBuffer(texCoordBuffer, TEXCOORD_BUFFER);
} }
// init instances vbo // init instances vbo
if(!instances_offsets.empty()) if(!instances_offsets.empty())
{ {
b = new TBuffer(instances_offsets, TBuffer::VBO); auto instancesBuffer = new TBuffer<glm::vec3>(instances_offsets, Buffer::VBO);
b->setVertexAttrib(5, 3, 0, 1); instancesBuffer->setVertexAttrib(5, 3, 0, 1);
addBuffer(b, INSTANCE_BUFFER); addBuffer(instancesBuffer, INSTANCE_BUFFER);
} }
// init EBO // init EBO
if(!indices.empty()) if(!indices.empty())
{ {
b = new TBuffer(indices, TBuffer::EBO); auto indicesBuffer = new TBuffer<GLuint>(indices, Buffer::EBO);
addBuffer(b, INDICES_BUFFER); addBuffer(indicesBuffer, INDICES_BUFFER);
} }
// unbind vao // unbind vao
@ -168,18 +166,26 @@ void Mesh::draw(Shader* shader, bool drawNormals, bool drawTexCoord, bool drawTa
{ {
int size = positions3D.empty() ? positions2D.size() : positions3D.size(); int size = positions3D.empty() ? positions2D.size() : positions3D.size();
if(!instances_offsets.empty() && !crappy) if(!instances_offsets.empty() && !crappy)
{
glDrawArraysInstanced(primitive_type, 0, size, instances_offsets.size()); glDrawArraysInstanced(primitive_type, 0, size, instances_offsets.size());
}
else else
{
glDrawArrays(primitive_type, 0, size); glDrawArrays(primitive_type, 0, size);
} }
}
else else
{ {
Buffer *b = buffers[buffersId[INDICES_BUFFER]]; Buffer *b = buffers[buffersId[INDICES_BUFFER]];
b->bind(); b->bind();
if(!instances_offsets.empty() && !crappy) if(!instances_offsets.empty() && !crappy)
{
glDrawElementsInstanced(primitive_type, indices.size(), GL_UNSIGNED_INT, NULL, instances_offsets.size()); glDrawElementsInstanced(primitive_type, indices.size(), GL_UNSIGNED_INT, NULL, instances_offsets.size());
}
else else
{
glDrawElements(primitive_type, indices.size(), GL_UNSIGNED_INT, NULL); glDrawElements(primitive_type, indices.size(), GL_UNSIGNED_INT, NULL);
}
b->unbind(); b->unbind();
} }