summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-01-31 13:54:54 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2021-02-04 19:29:49 +0000
commiteb9369ff236d4be52fe5c1e4d2331007b54f7177 (patch)
treef0750889075b8f46f592a4e74fe5d02fe4324b6a
parentCollection can be shared/unique pointers (diff)
downloadilt-eb9369ff236d4be52fe5c1e4d2331007b54f7177.tar.bz2
ilt-eb9369ff236d4be52fe5c1e4d2331007b54f7177.tar.xz
ilt-eb9369ff236d4be52fe5c1e4d2331007b54f7177.zip
Create mesh direct from vertices and indices
-rw-r--r--gfx/models/mesh.cpp36
-rw-r--r--gfx/models/mesh.h3
2 files changed, 23 insertions, 16 deletions
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 <glm/glm.hpp>
#include <memory>
#include <vector>
@@ -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<Vertex> vertices, std::span<unsigned int> 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 <GL/glew.h>
#include <array>
#include <cstddef>
+#include <span>
#include <special_members.hpp>
#include <string>
@@ -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<Vertex> vertices, std::span<unsigned int> indices);
virtual ~Mesh();
NO_COPY(Mesh);