diff --git a/BaseGLProject/Dataset.h b/BaseGLProject/Dataset.h index c969cf3..32fbe57 100644 --- a/BaseGLProject/Dataset.h +++ b/BaseGLProject/Dataset.h @@ -6,10 +6,9 @@ public: Dataset() {} ~Dataset() {} - unsigned int nFaces; - unsigned int nVertices; std::vector vertices; std::vector normals; + std::vector colors; void clear() { @@ -32,14 +31,64 @@ public: { -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} }; + colors = { + {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, + {0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}, + {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, + {1.0, 1.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, + {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 1.0, 1.0}, + {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 1.0, 1.0}, + {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 1.0, 0.0}, + {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, + {1.0, 1.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, + {0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0} + }, + genNormals(); - nVertices = vertices.size(); } void simpleFloor() - { - + { + vertices = {{-10.0, 0.0, -10.0}, {-10.0, 0.0, 10.0}, {10.0, 0.0, -10.0}, + {10.0, 0.0, 10.0}, {10.0, 0.0, -10.0}, {-10.0, 0.0, 10.0}}; + colors = { {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7}, + {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7} }; + genNormals(); } + + void checkeredFloor(float size, int squares, + glm::vec3 light_color, glm::vec3 dark_color) + { + float maxX = size / 2.f, maxY = size / 2.f; + float minX = -size / 2.f, minY = -size / 2.f; + float side_size = size / (float)squares; + int color = 1; + + for (float x = minX; x < maxX; x += side_size) + { + for (float y = minY; y < maxY; y += side_size) + { + color *= -1; + glm::vec3 tile_color = (color > 0) ? light_color : dark_color; + //gen 1 carré + vertices.emplace_back(x, 0, y); //upleft + vertices.emplace_back(x, 0, y + side_size); //downleft + vertices.emplace_back(x + side_size, 0, y + side_size); //downright + + vertices.emplace_back(x + side_size, 0, y + side_size); //downright + vertices.emplace_back(x + side_size, 0, y); //upright + vertices.emplace_back(x, 0, y); //upleft + + for (int z = 0; z < 6; z++) + colors.push_back(tile_color); + } + color *= -1; + } + genNormals(); + } + private: void genNormals() diff --git a/BaseGLProject/Models/Mesh.cpp b/BaseGLProject/Models/Mesh.cpp index 320ba1b..7b99943 100644 --- a/BaseGLProject/Models/Mesh.cpp +++ b/BaseGLProject/Models/Mesh.cpp @@ -1,4 +1,4 @@ - + #define GLM_ENABLE_EXPERIMENTAL #include @@ -20,6 +20,7 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m) { + renderType = NO_INDEX; parent = m; vbo[VERTEX_BUFFER] = NULL; @@ -28,47 +29,47 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m) vbo[INDEX_BUFFER] = NULL; glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - + glBindVertexArray(vao); - float *vertices = new float[set.nVertices * 3]; - for (unsigned int i = 0; i < set.nVertices; ++i) { - vertices[i * 3] = set.vertices[i].x; - vertices[i * 3 + 1] = set.vertices[i].y; - vertices[i * 3 + 2] = set.vertices[i].z; - } + //Copy Mesh vertices to VBO glGenBuffers(1, &vbo[VERTEX_BUFFER]); glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]); - glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, set.vertices.size() * 3 * sizeof(GLfloat), set.vertices.data(), GL_STATIC_DRAW); - glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); glEnableVertexAttribArray(VERTEX_BUFFER); - delete[] vertices; - - float *normals = new float[set.nVertices * 3]; - for (unsigned int i = 0; i < set.nVertices; ++i) { - normals[i * 3] = set.normals[i].x; - normals[i * 3 + 1] = set.normals[i].y; - normals[i * 3 + 2] = set.normals[i].z; - } + //Copy Normals to VBO glGenBuffers(1, &vbo[NORMAL_BUFFER]); glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]); - glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, set.normals.size() * 3 * sizeof(GLfloat), set.normals.data(), GL_STATIC_DRAW); - glVertexAttribPointer(NORMAL_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribPointer(NORMAL_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); glEnableVertexAttribArray(NORMAL_BUFFER); - delete[] normals; + //Copy vertice color to VBO + glGenBuffers(1, &vbo[TEXCOORD_BUFFER]); + glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]); + glBufferData(GL_ARRAY_BUFFER, set.colors.size() * 3 * sizeof(GLfloat), set.colors.data(), GL_STATIC_DRAW); + + glVertexAttribPointer(TEXCOORD_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); + glEnableVertexAttribArray(TEXCOORD_BUFFER); + + + + dset_size = set.vertices.size(); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); + shininessStrength = 0; + } Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m) { + renderType = OBJ; parent = m; vbo[VERTEX_BUFFER] = NULL; @@ -197,9 +198,16 @@ Mesh::MeshEntry::~MeshEntry() { void Mesh::MeshEntry::render() { glBindVertexArray(vao); - int size; - glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); - glDrawElements(GL_TRIANGLES, size/ sizeof(unsigned int), GL_UNSIGNED_INT, NULL); + if (renderType == NO_INDEX) + { + glDrawArrays(GL_TRIANGLES, 0, dset_size); + } + else + { + int size; + glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); + glDrawElements(GL_TRIANGLES, size / sizeof(unsigned int), GL_UNSIGNED_INT, NULL); + } glBindVertexArray(0); } @@ -250,12 +258,16 @@ Mesh::~Mesh(void) void Mesh::enableCulling() { + if (cullMode == NONE) + return; glEnable(GL_CULL_FACE); glCullFace(cullMode); } void Mesh::disableCulling() { + if (cullMode == NONE) + return; glDisable(GL_CULL_FACE); } diff --git a/BaseGLProject/Models/Mesh.h b/BaseGLProject/Models/Mesh.h index d5c6566..9f7850b 100644 --- a/BaseGLProject/Models/Mesh.h +++ b/BaseGLProject/Models/Mesh.h @@ -28,20 +28,31 @@ enum CullFace FRONT_BACK = GL_FRONT_AND_BACK }; +enum RenderType +{ + OBJ, + NO_INDEX +}; + class Mesh { public: struct MeshEntry { enum BUFFERS { - VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER + VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER, SHADERSTORAGE_BUFFER }; GLuint vao; GLuint vbo[4]; unsigned int elementCount; + RenderType renderType; + unsigned int dset_size = 0; + GLuint ssbo; + glm::vec3 ssbo_data[3]; aiColor3D dcolor; aiColor3D acolor; aiColor3D scolor; + float shininessStrength; MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m); MeshEntry(Dataset &set, Mesh *m); @@ -56,14 +67,14 @@ public: ~Mesh(void); std::vector meshEntries; -private: +private: std::vector> _transformations; void enableCulling(); void disableCulling(); public: Model model; - CullFace cullMode = NONE; + CullFace cullMode = NONE; void effectTransformations(); void addRotation(glm::vec4 vec); void addTranslation(glm::vec4 vec); diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp index 2a4ed89..6a49d67 100644 --- a/BaseGLProject/MyGLWindow.cpp +++ b/BaseGLProject/MyGLWindow.cpp @@ -63,29 +63,37 @@ void MyGlWindow::setup() _scnctx.lights.emplace("Light4", Light(glm::vec3(0.0f, 0.5f, 0.0f), glm::vec4(-8.09, 10, -5.87, 1))); _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["Simple"] = new Shader("simple.vert", "simple.frag"); + shaders["Simple"]->uniformFlags = ShaderFlags::MVP_FLAG; + shaders["Light"] = new Shader("light.vert", "light.frag"); + shaders["Fog"] = 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["Silhouette"] = new Shader("silhouette.vert", "silhouette.frag"); + shaders["Silhouette"]->uniformFlags = ShaderFlags::MVP_FLAG; + shaders["Silhouette"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255)); + shaders["Silhouette"]->addUniform("sil_offset", 0.1f); - shaders["ToonShader"] = new Shader("light.vert", "toon.frag"); + shaders["Toon"] = new Shader("light.vert", "toon.frag"); //Removing useless specular component - shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG; - shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; + shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG; + shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; Dataset cube; cube.simpleCube(); - meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"])); + Dataset floor; + floor.checkeredFloor(20, 40, glm::vec3(0.1, 0.1, 0.1), glm::vec3(0.7, 0.7, 0.7)); + + /*meshes.push_back(new Mesh("teapot.obj", shaders["Silhouette"])); meshes.back()->cullMode = FRONT; meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0)); - meshes.push_back(new Mesh("teapot.obj", shaders["ToonShader"])); + meshes.push_back(new Mesh("teapot.obj", shaders["Toon"])); meshes.back()->cullMode = BACK; meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0)); - meshes.push_back(new Mesh(cube, shaders["StandardLight"])); + meshes.push_back(new Mesh(cube, shaders["Simple"])); + meshes.back()->addTranslation(glm::vec4(0, 1.01, 0, 1));*/ + meshes.push_back(new Mesh(floor, shaders["Simple"])); + meshes.back()->cullMode = BACK; } void MyGlWindow::draw() diff --git a/BaseGLProject/Source.cpp b/BaseGLProject/Source.cpp index c96f62c..698cb32 100644 --- a/BaseGLProject/Source.cpp +++ b/BaseGLProject/Source.cpp @@ -102,8 +102,8 @@ bool initGLFW() } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); return true; } diff --git a/BaseGLProject/fog.frag b/BaseGLProject/fog.frag index 597f2d7..4f702cb 100644 --- a/BaseGLProject/fog.frag +++ b/BaseGLProject/fog.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 in vec3 f_color; out vec4 FragColors; diff --git a/BaseGLProject/fog.vert b/BaseGLProject/fog.vert index 32132ff..8dff67e 100644 --- a/BaseGLProject/fog.vert +++ b/BaseGLProject/fog.vert @@ -1,4 +1,4 @@ -#version 430 +#version 440 layout(location=0) in vec3 coord3d; layout(location=1) in vec3 v_normal; diff --git a/BaseGLProject/light.frag b/BaseGLProject/light.frag index 3a86e0e..04cb86b 100644 --- a/BaseGLProject/light.frag +++ b/BaseGLProject/light.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 in vec3 f_color; out vec4 FragColors; diff --git a/BaseGLProject/light.vert b/BaseGLProject/light.vert index da9c426..548b9cb 100644 --- a/BaseGLProject/light.vert +++ b/BaseGLProject/light.vert @@ -1,4 +1,4 @@ -#version 430 +#version 440 layout(location=0) in vec3 coord3d; layout(location=1) in vec3 v_normal; diff --git a/BaseGLProject/onelight.frag b/BaseGLProject/onelight.frag index c8a5db9..ba803a6 100644 --- a/BaseGLProject/onelight.frag +++ b/BaseGLProject/onelight.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 in vec3 f_color; out vec4 FragColors; diff --git a/BaseGLProject/silhouette.frag b/BaseGLProject/silhouette.frag index bd75ccb..2611004 100644 --- a/BaseGLProject/silhouette.frag +++ b/BaseGLProject/silhouette.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 uniform vec3 fColor; out vec4 FragColors; diff --git a/BaseGLProject/silhouette.vert b/BaseGLProject/silhouette.vert index 4d7eab2..d05bf3a 100644 --- a/BaseGLProject/silhouette.vert +++ b/BaseGLProject/silhouette.vert @@ -1,4 +1,4 @@ -#version 430 +#version 440 layout(location=0) in vec3 coord3d; layout(location=1) in vec3 v_normal; diff --git a/BaseGLProject/simple.frag b/BaseGLProject/simple.frag index e79348c..4c43408 100644 --- a/BaseGLProject/simple.frag +++ b/BaseGLProject/simple.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 in vec3 f_color; out vec4 FragColors; diff --git a/BaseGLProject/simple.vert b/BaseGLProject/simple.vert index a377d01..f3395c4 100644 --- a/BaseGLProject/simple.vert +++ b/BaseGLProject/simple.vert @@ -1,7 +1,8 @@ -#version 430 +#version 440 layout(location=0) in vec3 coord3d; -layout(location=1) in vec3 v_color; +layout(location=1) in vec3 v_normal; +layout(location=2) in vec3 v_color; out vec3 f_color; diff --git a/BaseGLProject/toon.frag b/BaseGLProject/toon.frag index 3794451..aef56ad 100644 --- a/BaseGLProject/toon.frag +++ b/BaseGLProject/toon.frag @@ -1,4 +1,4 @@ -#version 430 +#version 440 in vec3 f_color; out vec4 FragColors;