From eb9369ff236d4be52fe5c1e4d2331007b54f7177 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 31 Jan 2021 13:54:54 +0000 Subject: Create mesh direct from vertices and indices --- gfx/models/mesh.cpp | 36 +++++++++++++++++++++--------------- gfx/models/mesh.h | 3 ++- 2 files changed, 23 insertions(+), 16 deletions(-) (limited to 'gfx') diff --git a/gfx/models/mesh.cpp b/gfx/models/mesh.cpp index 967f3fd..90de8db 100644 --- a/gfx/models/mesh.cpp +++ b/gfx/models/mesh.cpp @@ -1,7 +1,6 @@ #include "mesh.h" #include "obj_loader.h" #include "vertex.hpp" -#include #include #include @@ -39,23 +38,30 @@ Mesh::Mesh(const IndexedModel & model) : glBindVertexArray(0); } -Mesh::Mesh(Vertex * vertices, unsigned int numVertices, unsigned int * indices, unsigned int numIndices) : - Mesh {[vertices, numVertices, indices, numIndices]() { - IndexedModel model; +Mesh::Mesh(std::span vertices, std::span indices) : + m_vertexArrayObject {}, m_vertexArrayBuffers {}, m_numIndices {indices.size()} +{ + glGenVertexArrays(1, &m_vertexArrayObject); + glBindVertexArray(m_vertexArrayObject); - for (unsigned int i = 0; i < numVertices; i++) { - model.positions.push_back(vertices[i].pos); - model.texCoords.push_back(vertices[i].texCoord); - model.normals.push_back(vertices[i].normal); - } + glGenBuffers(2, m_vertexArrayBuffers.data()); - for (unsigned int i = 0; i < numIndices; i++) { - model.indices.push_back(indices[i]); - } + glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), vertices.data(), GL_STATIC_DRAW); - return model; - }()} -{ + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, pos)); + + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, texCoord)); + + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *)offsetof(Vertex, normal)); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertexArrayBuffers[1]); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(), GL_STATIC_DRAW); + + glBindVertexArray(0); } Mesh::~Mesh() diff --git a/gfx/models/mesh.h b/gfx/models/mesh.h index 6dc5c32..e955644 100644 --- a/gfx/models/mesh.h +++ b/gfx/models/mesh.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -16,7 +17,7 @@ class Mesh { public: explicit Mesh(const std::string & fileName); explicit Mesh(const IndexedModel & model); - Mesh(Vertex * vertices, unsigned int numVertices, unsigned int * indices, unsigned int numIndices); + Mesh(std::span vertices, std::span indices); virtual ~Mesh(); NO_COPY(Mesh); -- cgit v1.2.3