implemented mesh class, and added gridmesh implementation
This commit is contained in:
parent
9e19c2211d
commit
6eb437fe23
42
gridmesh.cpp
Normal file
42
gridmesh.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#include "gridmesh.h"
|
||||||
|
|
||||||
|
GridMesh::GridMesh(int width, int height, bool alternate) : Mesh()
|
||||||
|
{
|
||||||
|
for(int i=0; i<=width; ++i)
|
||||||
|
{
|
||||||
|
for(int j=0; j<=height; ++j)
|
||||||
|
{
|
||||||
|
Vertex v;
|
||||||
|
v.position = glm::vec3((float)i/(float)width, (float)j/(float)height, 0);
|
||||||
|
v.normal = glm::vec3(0, 0, 1);
|
||||||
|
v.texCoord = glm::vec2(v.position.x, v.position.y);
|
||||||
|
addVertex(v);
|
||||||
|
if(i > 0 && j > 0)
|
||||||
|
{
|
||||||
|
if(alternate && (i+j)%2)
|
||||||
|
{
|
||||||
|
addFace(getVertexId(i, j),
|
||||||
|
getVertexId(i-1, j),
|
||||||
|
getVertexId(i, j-1));
|
||||||
|
addFace(getVertexId(i-1, j-1),
|
||||||
|
getVertexId(i, j-1),
|
||||||
|
getVertexId(i-1, j));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
addFace(getVertexId(i, j),
|
||||||
|
getVertexId(i-1, j),
|
||||||
|
getVertexId(i-1, j-1));
|
||||||
|
addFace(getVertexId(i, j),
|
||||||
|
getVertexId(i-1, j-1),
|
||||||
|
getVertexId(i, j-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int GridMesh::getVertexId(int i, int j)
|
||||||
|
{
|
||||||
|
return i*(height+1) + j;
|
||||||
|
}
|
14
gridmesh.h
Normal file
14
gridmesh.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef GRIDMESH_H
|
||||||
|
#define GRIDMESH_H
|
||||||
|
|
||||||
|
#include "mesh.h"
|
||||||
|
|
||||||
|
class GridMesh : public Mesh
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GridMesh(int width, int height, bool alternate);
|
||||||
|
private:
|
||||||
|
int getVertexId(int i, int j);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GRIDMESH_H
|
66
mesh.cpp
66
mesh.cpp
@ -1,23 +1,83 @@
|
|||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
|
#include "glassert.h"
|
||||||
|
|
||||||
Mesh::Mesh()
|
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
|
||||||
|
|
||||||
|
Mesh::~Mesh()
|
||||||
{
|
{
|
||||||
|
destroyGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::addVertex(Vertex& v)
|
void Mesh::addVertex(Vertex& v)
|
||||||
{
|
{
|
||||||
|
if(!locked)
|
||||||
vertices.push_back(v);
|
vertices.push_back(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::addFace(int i1, int i2, int i3)
|
void Mesh::addFace(int i1, int i2, int i3)
|
||||||
|
{
|
||||||
|
if(!locked)
|
||||||
{
|
{
|
||||||
indices.push_back(i1);
|
indices.push_back(i1);
|
||||||
indices.push_back(i2);
|
indices.push_back(i2);
|
||||||
indices.push_back(i3);
|
indices.push_back(i3);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::initGL()
|
||||||
|
{
|
||||||
|
if(locked)
|
||||||
|
destroyGL();
|
||||||
|
|
||||||
|
// create VAO
|
||||||
|
glAssert(glGenVertexArrays(1, &vao));
|
||||||
|
glAssert(glBindVertexArray(vao));
|
||||||
|
|
||||||
|
// create VBOs
|
||||||
|
glAssert(glGenBuffers(NB_BUFFERS, vbo));
|
||||||
|
|
||||||
|
// init vertex vbo
|
||||||
|
glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]));
|
||||||
|
glAssert(glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW));
|
||||||
|
|
||||||
|
// position attribute
|
||||||
|
glAssert(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(0)));
|
||||||
|
glAssert(glEnableVertexAttribArray(0));
|
||||||
|
// normal attribute
|
||||||
|
glAssert(glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(sizeof(glm::vec3))));
|
||||||
|
glAssert(glEnableVertexAttribArray(1));
|
||||||
|
// texCoord attribute
|
||||||
|
glAssert(glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), BUFFER_OFFSET(2*sizeof(glm::vec3))));
|
||||||
|
glAssert(glEnableVertexAttribArray(2));
|
||||||
|
|
||||||
|
// init indices vbo
|
||||||
|
glAssert(glBindBuffer(GL_ARRAY_BUFFER, vbo[INDICES_BUFFER]));
|
||||||
|
glAssert(glBufferData(GL_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW));
|
||||||
|
|
||||||
|
// unbind vao
|
||||||
|
glAssert(glBindVertexArray(0));
|
||||||
|
|
||||||
|
locked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::destroyGL()
|
||||||
|
{
|
||||||
|
if(locked)
|
||||||
|
{
|
||||||
|
locked = false;
|
||||||
|
glAssert(glDeleteVertexArrays(1, &vao));
|
||||||
|
vao = 0;
|
||||||
|
glAssert(glDeleteBuffers(2, vbo));
|
||||||
|
vbo[0] = 0;
|
||||||
|
vbo[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Mesh::draw()
|
void Mesh::draw()
|
||||||
{
|
{
|
||||||
|
if(locked)
|
||||||
|
{
|
||||||
|
glAssert(glBindVertexArray(vao));
|
||||||
|
glAssert(glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
11
mesh.h
11
mesh.h
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
#include <glew/glew.h>
|
||||||
|
|
||||||
class Mesh
|
class Mesh
|
||||||
{
|
{
|
||||||
@ -14,14 +15,22 @@ public:
|
|||||||
glm::vec2 texCoord;
|
glm::vec2 texCoord;
|
||||||
} Vertex;
|
} Vertex;
|
||||||
|
|
||||||
Mesh();
|
~Mesh();
|
||||||
void addVertex(Vertex& v);
|
void addVertex(Vertex& v);
|
||||||
void addFace(int i1, int i2, int i3);
|
void addFace(int i1, int i2, int i3);
|
||||||
|
void initGL();
|
||||||
|
void destroyGL();
|
||||||
void draw();
|
void draw();
|
||||||
|
bool isLocked(){return locked;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
enum {VERTEX_BUFFER, INDICES_BUFFER, NB_BUFFERS};
|
||||||
|
|
||||||
std::vector<Vertex> vertices;
|
std::vector<Vertex> vertices;
|
||||||
std::vector<int> indices;
|
std::vector<int> indices;
|
||||||
|
GLuint vao;
|
||||||
|
GLuint vbo[2];
|
||||||
|
bool locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MESH_H
|
#endif // MESH_H
|
||||||
|
@ -27,7 +27,8 @@ SOURCES += main.cpp\
|
|||||||
camera.cpp \
|
camera.cpp \
|
||||||
sparrowrenderer.cpp \
|
sparrowrenderer.cpp \
|
||||||
scene.cpp \
|
scene.cpp \
|
||||||
material.cpp
|
material.cpp \
|
||||||
|
gridmesh.cpp
|
||||||
|
|
||||||
HEADERS += mainwindow.h \
|
HEADERS += mainwindow.h \
|
||||||
myglwidget.h \
|
myglwidget.h \
|
||||||
@ -37,7 +38,8 @@ HEADERS += mainwindow.h \
|
|||||||
sparrowrenderer.h \
|
sparrowrenderer.h \
|
||||||
glassert.h \
|
glassert.h \
|
||||||
scene.h \
|
scene.h \
|
||||||
material.h
|
material.h \
|
||||||
|
gridmesh.h
|
||||||
|
|
||||||
FORMS += mainwindow.ui
|
FORMS += mainwindow.ui
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user