refactor: extract vertex generation from ctor
This commit is contained in:
parent
ae78f0a399
commit
8c9bacbd04
|
@ -10,6 +10,37 @@
|
||||||
Icosphere::Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::vec3 position) :
|
Icosphere::Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::vec3 position) :
|
||||||
_shaderProgram(shaderProgram),
|
_shaderProgram(shaderProgram),
|
||||||
_position(position)
|
_position(position)
|
||||||
|
{
|
||||||
|
generateVertices(radius, subdivisions);
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &_vao);
|
||||||
|
glGenBuffers(1, &_vbo);
|
||||||
|
glGenBuffers(1, &_ebo);
|
||||||
|
|
||||||
|
glBindVertexArray(_vao);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
||||||
|
size_t vboBufferSize = _vertices.size() * sizeof(float);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, vboBufferSize, &_vertices[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
|
||||||
|
size_t eboBufferSize = _indices.size() * sizeof(unsigned int);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, eboBufferSize, &_indices[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// Vertex position attribute
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
|
||||||
|
|
||||||
|
// Vertex normal attribute
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Icosphere::generateVertices(float radius, int subdivisions)
|
||||||
{
|
{
|
||||||
VertexList vertices = _isocahedronVertices;
|
VertexList vertices = _isocahedronVertices;
|
||||||
TriangleList triangles = _isocahedronTriangles;
|
TriangleList triangles = _isocahedronTriangles;
|
||||||
|
@ -29,12 +60,6 @@ Icosphere::Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::
|
||||||
vertices[i] *= radius;
|
vertices[i] *= radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
glGenVertexArrays(1, &_vao);
|
|
||||||
glGenBuffers(1, &_vbo);
|
|
||||||
glGenBuffers(1, &_ebo);
|
|
||||||
|
|
||||||
glBindVertexArray(_vao);
|
|
||||||
|
|
||||||
for (const auto& tri : triangles)
|
for (const auto& tri : triangles)
|
||||||
{
|
{
|
||||||
_indices.push_back(tri.vertex[0]);
|
_indices.push_back(tri.vertex[0]);
|
||||||
|
@ -56,26 +81,6 @@ Icosphere::Icosphere(float radius, int subdivisions, GLuint shaderProgram, glm::
|
||||||
_vertices.push_back(normal[1]);
|
_vertices.push_back(normal[1]);
|
||||||
_vertices.push_back(normal[2]);
|
_vertices.push_back(normal[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
|
|
||||||
size_t vboBufferSize = _vertices.size() * sizeof(float);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, vboBufferSize, &_vertices[0], GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
|
|
||||||
size_t eboBufferSize = _indices.size() * sizeof(unsigned int);
|
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, eboBufferSize, &_indices[0], GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
// Vertex position attribute
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
|
|
||||||
|
|
||||||
// Vertex normal attribute
|
|
||||||
glEnableVertexAttribArray(1);
|
|
||||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
||||||
glBindVertexArray(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Icosphere::vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second)
|
int Icosphere::vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second)
|
||||||
|
|
|
@ -57,6 +57,7 @@ private:
|
||||||
|
|
||||||
using Lookup = std::map<std::pair<int, int>, int>;
|
using Lookup = std::map<std::pair<int, int>, int>;
|
||||||
|
|
||||||
|
void generateVertices(float radius, int subdivisions);
|
||||||
int vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second);
|
int vertexForEdge(Lookup& lookup, VertexList& vertices, int first, int second);
|
||||||
TriangleList subdivide(VertexList& vertices, TriangleList triangles);
|
TriangleList subdivide(VertexList& vertices, TriangleList triangles);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue