Progress on Dataset meshes

This commit is contained in:
Hugo Willaume 2019-03-17 15:35:42 +09:00
parent 9b42d26f05
commit 638571af42
4 changed files with 89 additions and 52 deletions

View File

@ -3,11 +3,51 @@
class Dataset
{
public:
Dataset();
~Dataset();
Dataset() {}
~Dataset() {}
unsigned int nFaces;
unsigned int nVertices;
std::vector<glm::vec3> vertices;
std::vector<glm::vec3> normals;
void clear()
{
vertices.clear();
normals.clear();
}
void simpleCube()
{
vertices = { { -1.0, -1.0, 1.0}, { 1.0, -1.0, 1.0}, { 1.0, 1.0, 1.0},
{ 1.0, 1.0, 1.0}, { -1.0, 1.0, 1.0}, { -1.0, -1.0, 1.0},
{ 1.0, -1.0, 1.0}, { 1.0, -1.0, -1.0}, { 1.0, 1.0, -1.0},
{ 1.0, 1.0, -1.0}, { 1.0, 1.0, 1.0}, { 1.0, -1.0, 1.0},
{ -1.0, 1.0, -1.0}, { 1.0, 1.0, -1.0}, { 1.0, -1.0, -1.0},
{ 1.0, -1.0, -1.0}, { -1.0, -1.0, -1.0}, { -1.0, 1.0, -1.0},
{ -1.0, -1.0, -1.0}, { -1.0, -1.0, 1.0}, { -1.0, 1.0, 1.0},
{ -1.0, 1.0, 1.0}, { -1.0, 1.0, -1.0}, { -1.0, -1.0, -1.0},
{ -1.0, -1.0, -1.0}, { 1.0, -1.0, -1.0}, { 1.0, -1.0, 1.0},
{ 1.0, -1.0, 1.0}, { -1.0, -1.0, 1.0}, { -1.0, -1.0, -1.0},
{ -1.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 1.0, -1.0},
{ 1.0, 1.0, -1.0}, { -1.0, 1.0, -1.0}, { -1.0, 1.0, 1.0} };
genNormals();
nVertices = vertices.size();
}
void simpleFloor()
{
}
private:
void genNormals()
{
for (unsigned int i = 0; i < vertices.size() - 2; i += 3)
{
glm::vec3 norm = glm::cross(vertices[i + 1] - vertices[i], vertices[i + 2] - vertices[i]);
normals.push_back(norm); normals.push_back(norm); normals.push_back(norm);
}
}
};

View File

@ -30,7 +30,6 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
elementCount = set.nFaces * 3;
float *vertices = new float[set.nVertices * 3];
for (unsigned int i = 0; i < set.nVertices; ++i) {
@ -43,8 +42,8 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(VERTEX_BUFFER);
delete[] vertices;
@ -59,11 +58,13 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(1);
glVertexAttribPointer(NORMAL_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(NORMAL_BUFFER);
delete[] normals;
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
@ -98,25 +99,6 @@ Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
delete[] vertices;
}
if (mesh->HasTextureCoords(0)) {
float *texCoords = new float[mesh->mNumVertices * 2];
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
texCoords[i * 2] = mesh->mTextureCoords[0][i].x;
texCoords[i * 2 + 1] = mesh->mTextureCoords[0][i].y;
}
glGenBuffers(1, &vbo[TEXCOORD_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 2 * mesh->mNumVertices * sizeof(GLfloat), texCoords, GL_STATIC_DRAW);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(2);
delete[] texCoords;
}
if (mesh->HasNormals()) {
float *normals = new float[mesh->mNumVertices * 3];
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
@ -135,6 +117,23 @@ Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
delete[] normals;
}
if (mesh->HasTextureCoords(0)) {
float *texCoords = new float[mesh->mNumVertices * 2];
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
texCoords[i * 2] = mesh->mTextureCoords[0][i].x;
texCoords[i * 2 + 1] = mesh->mTextureCoords[0][i].y;
}
glGenBuffers(1, &vbo[TEXCOORD_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 2 * mesh->mNumVertices * sizeof(GLfloat), texCoords, GL_STATIC_DRAW);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(2);
delete[] texCoords;
}
if (mesh->HasFaces()) {
unsigned int *indices = new unsigned int[mesh->mNumFaces * 3];
@ -167,8 +166,6 @@ Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
/**
@ -192,8 +189,6 @@ Mesh::MeshEntry::~MeshEntry() {
}
glDeleteVertexArrays(1, &vao);
}
/**

View File

@ -33,7 +33,7 @@ class Mesh
public:
struct MeshEntry {
enum BUFFERS {
VERTEX_BUFFER, TEXCOORD_BUFFER, NORMAL_BUFFER, INDEX_BUFFER
VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER
};
GLuint vao;
GLuint vbo[4];
@ -52,7 +52,7 @@ public:
public:
Mesh(const char *filename, Shader *sh);
Mesh(Dataset dataset, Shader *sh);
Mesh(Dataset &dataset, Shader *sh);
~Mesh(void);
std::vector<MeshEntry*> meshEntries;

View File

@ -64,26 +64,28 @@ void MyGlWindow::setup()
_scnctx.lights.emplace("Light5", Light(glm::vec3(0.5f, 0.5f, 0.5f), glm::vec4(3.09, 10, -9.51, 1)));
shaders["StandardLight"] = new Shader("light.vert", "light.frag");
//shaders["FogShader"] = new Shader("fog.vert", "fog.frag");
shaders["FogShader"] = new Shader("fog.vert", "fog.frag");
//shaders["SilhouetteShader"] = new Shader("silhouette.vert", "silhouette.frag");
//shaders["SilhouetteShader"]->uniformFlags = ShaderFlags::MVP_FLAG;
//shaders["SilhouetteShader"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
//shaders["SilhouetteShader"]->addUniform("sil_offset", 0.1f);
//
shaders["SilhouetteShader"] = new Shader("silhouette.vert", "silhouette.frag");
shaders["SilhouetteShader"]->uniformFlags = ShaderFlags::MVP_FLAG;
shaders["SilhouetteShader"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
shaders["SilhouetteShader"]->addUniform("sil_offset", 0.1f);
shaders["ToonShader"] = new Shader("light.vert", "toon.frag");
//Removing useless specular component
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
//shaders["ToonShader"] = new Shader("light.vert", "toon.frag");
////Removing useless specular component
//shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
//shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
//
meshes.push_back(new Mesh("quad.obj", shaders["StandardLight"]));
Dataset cube;
cube.simpleCube();
/*meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"]));
meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"]));
meshes.back()->cullMode = FRONT;
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
meshes.push_back(new Mesh("teapot.obj", shaders["ToonShader"]));
meshes.back()->cullMode = BACK;*/
meshes.back()->cullMode = BACK;
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
meshes.push_back(new Mesh(cube, shaders["StandardLight"]));
}
void MyGlWindow::draw()