diff --git a/BaseGLProject/BaseGLProject.vcxproj b/BaseGLProject/BaseGLProject.vcxproj
index 7d58e40..97f3ed1 100644
--- a/BaseGLProject/BaseGLProject.vcxproj
+++ b/BaseGLProject/BaseGLProject.vcxproj
@@ -146,8 +146,7 @@
-
-
+
@@ -162,8 +161,6 @@
-
-
@@ -185,10 +182,12 @@
+
-
-
+
+
+
Geometry
4.0
Geometry
diff --git a/BaseGLProject/BaseGLProject.vcxproj.filters b/BaseGLProject/BaseGLProject.vcxproj.filters
index 45b7284..422e905 100644
--- a/BaseGLProject/BaseGLProject.vcxproj.filters
+++ b/BaseGLProject/BaseGLProject.vcxproj.filters
@@ -30,15 +30,9 @@
Source Files
-
- Source Files
-
Source Files
-
- Source Files
-
imgui
@@ -66,6 +60,9 @@
Source Files
+
+ Models
+
@@ -107,12 +104,6 @@
Models
-
- Models
-
-
- Models
-
Header Files
@@ -136,15 +127,9 @@
Shaders
-
- Shaders
-
Shaders
-
- Shaders
-
Shaders
@@ -163,6 +148,18 @@
Shaders
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
+
+ Shaders
+
diff --git a/BaseGLProject/CheckeredFloor.cpp b/BaseGLProject/CheckeredFloor.cpp
deleted file mode 100644
index 71c3c91..0000000
--- a/BaseGLProject/CheckeredFloor.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-//#include "CheckeredFloor.h"
-//
-//void CheckeredFloor::genVertices(std::vector &vertices,
-// std::vector &colors)
-//{
-// 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, 1); //upleft
-// vertices.emplace_back(x, 0, y + side_size, 1); //downleft
-// vertices.emplace_back(x + side_size, 0, y + side_size, 1); //downright
-//
-// vertices.emplace_back(x + side_size, 0, y + side_size, 1); //downright
-// vertices.emplace_back(x + side_size, 0, y, 1); //upright
-// vertices.emplace_back(x, 0, y, 1); //upleft
-//
-//
-//
-// for (int z = 0; z < 6; z++)
-// colors.push_back(tile_color);
-// }
-// color *= -1;
-// }
-//}
-//
-//void CheckeredFloor::setup()
-//{
-// std::vector floor_vertices;
-// std::vector floor_colors;
-//
-// glGenVertexArrays(1, &_vaoHandle);
-// glBindVertexArray(_vaoHandle);
-//
-// genVertices(floor_vertices, floor_colors);
-//
-// glGenBuffers(1, &_vbo_vertices);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * floor_vertices.size() * 4, floor_vertices.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 0, //attr number = 0
-// 4,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(0); //attr number = 0
-//
-//
-// glGenBuffers(1, &_vbo_colors);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_colors);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * floor_colors.size() * 3, floor_colors.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 1,
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void *)0);
-// glEnableVertexAttribArray(1);
-//
-// glBindVertexArray(0);
-//}
-//
-//CheckeredFloor::CheckeredFloor(int size, int squares) :
-// _size(size), _squares(squares)
-//{
-// setup();
-//}
-//
-//CheckeredFloor::~CheckeredFloor()
-//{
-//}
-//
-//void CheckeredFloor::draw(ShaderProgram * shader, glm::mat4x4 proj_matrix, glm::mat4x4 view_matrix)
-//{
-// _model.glPushMatrix();
-// effectTransformations();
-// glBindVertexArray(_vaoHandle);
-// glm::mat4 mvpMatrix = proj_matrix * view_matrix * _model.getMatrix();
-// glUniformMatrix4fv(shader->uniform("mvp"), 1, GL_FALSE, glm::value_ptr(mvpMatrix));
-// glDrawArrays(GL_TRIANGLES, 0, _squares * _squares * 6);
-// _model.glPopMatrix();
-//}
-//
-//DrawableType CheckeredFloor::getType()
-//{
-// return DrawableType::CHECKERED_FLOOR;
-//}
diff --git a/BaseGLProject/CheckeredFloor.h b/BaseGLProject/CheckeredFloor.h
deleted file mode 100644
index 115ea99..0000000
--- a/BaseGLProject/CheckeredFloor.h
+++ /dev/null
@@ -1,31 +0,0 @@
-//#pragma once
-//#define GLM_SWIZZLE
-//#define GLM_ENABLE_EXPERIMENTAL
-//#include
-//#include
-//#include
-//#include "ADrawable.h"
-//
-//class CheckeredFloor : public ADrawable
-//{
-//private :
-// GLuint _vaoHandle;
-// GLuint _vbo_vertices, _vbo_colors;
-//
-// void genVertices(std::vector &vertices,
-// std::vector &colors);
-// void setup();
-//
-// glm::vec3 _light_color = {.7f, .7f, .7f};
-// glm::vec3 _dark_color = {.3f, .3f, .3f};
-//
-// int _size;
-// int _squares;
-//
-//public :
-// CheckeredFloor(int size, int squares);
-// ~CheckeredFloor();
-// void draw(ShaderProgram *shader, glm::mat4x4 proj_matrix, glm::mat4x4 view_matrix) override;
-// DrawableType getType() override;
-//
-//};
\ No newline at end of file
diff --git a/BaseGLProject/ColorCube.cpp b/BaseGLProject/ColorCube.cpp
deleted file mode 100644
index 7f4ff36..0000000
--- a/BaseGLProject/ColorCube.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-//#include "ColorCube.h"
-//
-//glm::vec3 computeNormal(glm::vec3 p1, glm::vec3 p2, glm::vec3 p3)
-//{
-// glm::vec3 v1 = p2 - p1;
-// glm::vec3 v2 = p3 - p1;
-//
-// return glm::normalize(glm::cross(v1, v2));
-//}
-//
-//void ColorCube::iboSetup()
-//{
-// std::vector cube_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} };
-//
-// GLfloat cube_colors[] = {
-// // front colors
-// 1.0, 0.0, 0.0,
-// 0.0, 1.0, 0.0,
-// 0.0, 0.0, 1.0,
-// 1.0, 1.0, 1.0,
-// // back colors
-// 1.0, 0.0, 0.0,
-// 0.0, 1.0, 0.0,
-// 0.0, 0.0, 1.0,
-// 1.0, 1.0, 1.0,
-// };
-//
-// GLushort cube_elements[] = {
-// 0, 1, 2, 2, 3, 0, 1, 5, 6,
-// 6, 2, 1, 7, 6, 5, 5, 4, 7,
-// 4, 0, 3, 3, 7, 4, 4, 5, 1,
-// 1, 0, 4, 3, 2, 6, 6, 7, 3,
-// };
-//
-//
-// glGenVertexArrays(1, &_vaoHandle);
-// glBindVertexArray(_vaoHandle);
-//
-// glGenBuffers(1, &_vbo_vertices);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * cube_vertices.size() * 3, cube_vertices.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 0, //attr number = 0
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(0); //attr number = 0
-//
-// glGenBuffers(1, &_vbo_colors);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_colors);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 24, cube_colors, GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 1,
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(1);
-//
-// glGenBuffers(1, &_iboHandle);
-// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _iboHandle);
-// glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_elements), cube_elements, GL_STATIC_DRAW);
-//
-// glBindVertexArray(0);
-//}
-//
-//void ColorCube::vaoSetup()
-//{
-// std::vector cube_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} };
-//
-// std::vector cube_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
-// };
-//
-// std::vector cube_normals;
-//
-// for (int i = 0; i < cube_vertices.size() - 2; i += 3)
-// {
-// glm::vec3 norm = computeNormal(
-// cube_vertices[i], cube_vertices[i + 1], cube_vertices[i + 2]);
-// cube_normals.push_back(norm); cube_normals.push_back(norm); cube_normals.push_back(norm);
-// }
-//
-//
-// glGenVertexArrays(1, &_vaoHandle);
-// glBindVertexArray(_vaoHandle);
-//
-// glGenBuffers(1, &_vbo_vertices);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_vertices);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * cube_vertices.size() * 3, cube_vertices.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 0, //attr number = 0
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(0); //attr number = 0
-//
-// glGenBuffers(1, &_vbo_normals);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_normals);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * cube_normals.size() * 3, cube_normals.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 1,
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(1);
-//
-// glGenBuffers(1, &_vbo_colors);
-// glBindBuffer(GL_ARRAY_BUFFER, _vbo_colors);
-// glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * cube_colors.size(), cube_colors.data(), GL_STATIC_DRAW);
-//
-// glVertexAttribPointer(
-// 2,
-// 3,
-// GL_FLOAT,
-// GL_FALSE,
-// 0,
-// (void*)0);
-// glEnableVertexAttribArray(2);
-//
-// glBindVertexArray(0);
-//}
-//
-//ColorCube::ColorCube(bool usingIBO)
-//{
-// ibo_used = usingIBO;
-// if (usingIBO)
-// iboSetup();
-// else
-// vaoSetup();
-//}
-//
-//
-//void ColorCube::draw(ShaderProgram *shader, glm::mat4x4 proj_matrix, glm::mat4x4 view_matrix)
-//{
-// _model.glPushMatrix();
-// effectTransformations();
-// glBindVertexArray(_vaoHandle);
-// glm::mat4 mvpMatrix = proj_matrix * view_matrix * _model.getMatrix();
-// glUniformMatrix4fv(shader->uniform("mvp"), 1, GL_FALSE, glm::value_ptr(mvpMatrix));
-// glm::mat4 modelview = view_matrix * _model.getMatrix();
-// _model.glPopMatrix();
-// glUniform4fv(shader->uniform("LightLocation"), 1, glm::value_ptr(view_matrix * glm::vec4(50, 50, 50, 1)));
-// glUniformMatrix4fv(shader->uniform("ModelViewMatrix"), 1, GL_FALSE, glm::value_ptr(modelview));
-// glm::mat4 inverseModelView = glm::inverse(modelview);
-// glm::mat3 normalMatrix = glm::mat3(glm::transpose(inverseModelView));
-// glUniformMatrix3fv(shader->uniform("NormalMatrix"), 1, GL_FALSE, glm::value_ptr(normalMatrix));
-//
-// if (ibo_used)
-// {
-// int size;
-// glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
-// glDrawElements(GL_TRIANGLES, size / sizeof(GLushort), GL_UNSIGNED_SHORT, 0);
-// }
-// else
-// glDrawArrays(GL_TRIANGLES, 0, 36);
-//
-//
-//
-//}
-//
-//DrawableType ColorCube::getType()
-//{
-// return DrawableType::COLOR_CUBE;
-//}
-//
-//ColorCube::~ColorCube()
-//{
-//}
diff --git a/BaseGLProject/ColorCube.h b/BaseGLProject/ColorCube.h
deleted file mode 100644
index 557c840..0000000
--- a/BaseGLProject/ColorCube.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//#include
-//#include
-//#include
-//#include
-// #include "ADrawable.h"
-//
-//#pragma once
-//class ColorCube : public ADrawable
-//{
-//private:
-// GLuint _vaoHandle;
-// GLuint _iboHandle;
-// GLuint _vbo_vertices, _vbo_colors, _vbo_normals;
-//
-// bool ibo_used;
-//
-// void iboSetup();
-// void vaoSetup();
-//
-//public:
-// ColorCube(bool usingIBO);
-//
-// void draw(ShaderProgram *shader, glm::mat4x4 proj_matrix, glm::mat4x4 view_matrix) override;
-// DrawableType getType() override;
-// ~ColorCube();
-//};
-//
diff --git a/BaseGLProject/Dataset.cpp b/BaseGLProject/Dataset.cpp
new file mode 100644
index 0000000..db9c2c8
--- /dev/null
+++ b/BaseGLProject/Dataset.cpp
@@ -0,0 +1,148 @@
+#include "Dataset.h"
+
+void Dataset::sphere(float radius, GLuint slices, GLuint stacks)
+{
+ clear();
+
+ // Generate vertexes and normals
+ GLfloat theta, phi;
+ GLfloat thetaFac = glm::two_pi() / slices;
+ GLfloat phiFac = glm::pi() / stacks;
+ GLfloat nx, ny, nz, s, t;
+ GLuint idx = 0, tIdx = 0;
+ for (GLuint i = 0; i <= slices; i++) {
+ theta = i * thetaFac;
+ s = (GLfloat)i / slices;
+ for (GLuint j = 0; j <= stacks; j++) {
+ phi = j * phiFac;
+ t = (GLfloat)j / stacks;
+ nx = sinf(phi) * cosf(theta);
+ ny = sinf(phi) * sinf(theta);
+ nz = cosf(phi);
+ vertices.emplace_back(radius * nx, radius * ny, radius * nz);
+ normals.emplace_back(nx, ny, nz);
+ idx++;
+ }
+ }
+
+ // Generate the element list
+ idx = 0;
+ for (GLuint i = 0; i < slices; i++) {
+ GLuint stackStart = i * (stacks + 1);
+ GLuint nextStackStart = (i + 1) * (stacks + 1);
+ for (GLuint j = 0; j < stacks; j++) {
+ if (j == 0) {
+ GLuint a[3] = { stackStart, stackStart + 1, nextStackStart + 1 };
+ indexes.insert(indexes.end(), std::begin(a), std::end(a));
+ }
+ else if (j == stacks - 1) {
+ GLuint a[3] = { stackStart + j, stackStart + 1 + j, nextStackStart + j };
+ indexes.insert(indexes.end(), std::begin(a), std::end(a));
+ }
+ else {
+ GLuint a[6] = { stackStart + j, stackStart + 1 + j, nextStackStart + j + 1,
+ nextStackStart + j, stackStart + j, nextStackStart + j + 1 };
+ indexes.insert(indexes.end(), std::begin(a), std::end(a));
+ }
+ }
+ }
+}
+
+void Dataset::simpleCube()
+{
+ clear();
+ 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 } };
+
+ tex_mapping = {
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ { 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f }, // one triangle
+ { 0.0f, 0.0f },{ 1.0f, 1.0f },{ 0.0f, 1.0f }, //the other triangle
+ };
+
+ 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();
+}
+
+void Dataset::simpleFloor()
+{
+ clear();
+ 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 Dataset::checkeredFloor(float size, int squares, glm::vec3 light_color, glm::vec3 dark_color)
+{
+ clear();
+ 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();
+}
+
+void Dataset::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);
+ }
+}
diff --git a/BaseGLProject/Dataset.h b/BaseGLProject/Dataset.h
index 2e69500..3890bc9 100644
--- a/BaseGLProject/Dataset.h
+++ b/BaseGLProject/Dataset.h
@@ -1,4 +1,8 @@
#pragma once
+#include
+#include
+#include
+#include "GL/glew.h"
class Dataset
{
@@ -10,6 +14,7 @@ public:
std::vector normals;
std::vector colors;
std::vector tex_mapping;
+ std::vector indexes;
void clear()
{
@@ -17,107 +22,19 @@ public:
normals.clear();
colors.clear();
tex_mapping.clear();
+ indexes.clear();
}
- void simpleCube()
- {
- clear();
- 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} };
+ void sphere(float radius, GLuint slices, GLuint stacks);
- tex_mapping = {
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, // one triangle
- {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}, //the other triangle
- };
+ void simpleCube();
- 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();
- }
-
- void simpleFloor()
- {
- clear();
- 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 simpleFloor();
void checkeredFloor(float size, int squares,
- glm::vec3 light_color, glm::vec3 dark_color)
- {
- clear();
- 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();
- }
+ glm::vec3 light_color, glm::vec3 dark_color);
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);
- }
- }
+ void genNormals();
};
\ No newline at end of file
diff --git a/BaseGLProject/Models/Mesh.cpp b/BaseGLProject/Models/Mesh.cpp
index 0eaf2bd..419c20c 100644
--- a/BaseGLProject/Models/Mesh.cpp
+++ b/BaseGLProject/Models/Mesh.cpp
@@ -73,6 +73,20 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
glEnableVertexAttribArray(COLOR_BUFFER);
}
+ //Copy indexes to VBO
+ if (set.indexes.size() > 0)
+ {
+ renderType = OBJ;
+
+ glGenBuffers(1, &vbo[INDEX_BUFFER]);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, set.indexes.size() * sizeof(GLuint), set.indexes.data(), GL_STATIC_DRAW);
+
+ glVertexAttribPointer(INDEX_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
+ glEnableVertexAttribArray(INDEX_BUFFER);
+ }
+
+
dset_size = set.vertices.size();
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp
index 24aa21b..f12578c 100644
--- a/BaseGLProject/MyGLWindow.cpp
+++ b/BaseGLProject/MyGLWindow.cpp
@@ -55,8 +55,8 @@ void MyGlWindow::setBgColor(float bgColor[3])
_bgColor[2] = bgColor[2];
}
-void MyGlWindow::setup()
-{
+void MyGlWindow::textureSetup()
+{
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &_scnctx.textures); //tex_2d is a member variable
glBindTexture(GL_TEXTURE_2D, _scnctx.textures);
@@ -67,7 +67,7 @@ void MyGlWindow::setup()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
int width, height, channel;
- unsigned char * image = stbi_load("brick1.jpg", &width, &height, &channel, 0);
+ unsigned char * image = stbi_load("brick1.jpg", &width, &height, &channel, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
GL_UNSIGNED_BYTE, image);
@@ -75,7 +75,32 @@ void MyGlWindow::setup()
stbi_image_free(image);
glBindTexture(GL_TEXTURE_2D, 0);
+}
+void MyGlWindow::shaderSetup()
+{
+ shaders["Simple"] = new Shader("simple.vert", "simple.frag");
+ shaders["Simple"]->uniformFlags = ShaderFlags::MVP_FLAG;
+
+ shaders["BaseLight"] = new Shader("base_light.vert", "base_light.frag");
+ shaders["Fog"] = new Shader("fog.vert", "fog.frag");
+
+ shaders["TexBaseLight"] = new Shader("tex_base_light.vert", "tex_base_light.frag");
+ shaders["TexBaseLight"]->addUniform("tex1", 0);
+
+ 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["Toon"] = new Shader("base_light.vert", "toon.frag");
+ //Removing useless specular component
+ shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
+ shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
+}
+
+void MyGlWindow::lightSetup()
+{
//Showcase lights
_scnctx.lights.emplace("Light1", Light(glm::vec3(0.8f), glm::vec4(3, 10, 5, 1)));
@@ -85,38 +110,34 @@ void MyGlWindow::setup()
_scnctx.lights.emplace("Light3", Light(glm::vec3(0.5f, 0.0f, 0.0f), glm::vec4(-8.09, 10, 5.87, 1)));
_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["Simple"] = new Shader("simple.vert", "simple.frag");
- shaders["Simple"]->uniformFlags = ShaderFlags::MVP_FLAG;
+void MyGlWindow::setup()
+{
+ textureSetup();
+ shaderSetup();
+ lightSetup();
- shaders["Light"] = new Shader("light.vert", "light.frag");
- shaders["Light"]->addUniform("tex1", 0);
- shaders["Fog"] = new Shader("fog.vert", "fog.frag");
-
- 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["Toon"] = new Shader("light.vert", "toon.frag");
- //Removing useless specular component
- shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
- shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
-
- Dataset floor;
- floor.checkeredFloor(20, 20, glm::vec3(0.1, 0.1, 0.1), glm::vec3(0.7, 0.7, 0.7));
- meshes.push_back(new Mesh(floor, shaders["Simple"]));
+ Dataset moddata;
+ moddata.checkeredFloor(20, 20, glm::vec3(0.1, 0.1, 0.1), glm::vec3(0.7, 0.7, 0.7));
+ meshes.push_back(new Mesh(moddata, shaders["Simple"]));
meshes.back()->addTranslation(glm::vec4(0, -0.05, 0, 1));
meshes.back()->cullMode = BACK;
- floor.simpleCube();
- meshes.push_back(new Mesh(floor, shaders["Light"]));
- meshes.back()->addTranslation(glm::vec4(0, 1, 0, 1));
+ moddata.simpleCube();
+ meshes.push_back(new Mesh(moddata, shaders["TexBaseLight"]));
+ meshes.back()->addTranslation(glm::vec4(0, 1, 0, 1));
- /*meshes.push_back(new Mesh("teapot.obj", shaders["Silhouette"]));
+ moddata.sphere(1, 100, 100);
+ meshes.push_back(new Mesh(moddata, shaders["BaseLight"]));
+ meshes.back()->addTranslation(glm::vec4(-5, 1, -3, 1));
+
+ meshes.push_back(new Mesh("teapot.obj", shaders["Silhouette"]));
+ meshes.back()->addTranslation(glm::vec4(5, 0 ,3, 1));
meshes.back()->cullMode = FRONT;
meshes.push_back(new Mesh("teapot.obj", shaders["Toon"]));
- meshes.back()->cullMode = BACK; */
+ meshes.back()->addTranslation(glm::vec4(5, 0, 3, 1));
+ meshes.back()->cullMode = BACK;
}
diff --git a/BaseGLProject/MyGLWindow.h b/BaseGLProject/MyGLWindow.h
index 2f971b8..dd0de53 100644
--- a/BaseGLProject/MyGLWindow.h
+++ b/BaseGLProject/MyGLWindow.h
@@ -41,5 +41,8 @@ private:
GLuint _vaoHandle;
GLuint _iboHandle;
+ void textureSetup();
+ void shaderSetup();
+ void lightSetup();
void setup();
};
diff --git a/BaseGLProject/base_light.frag b/BaseGLProject/base_light.frag
new file mode 100644
index 0000000..f176fb5
--- /dev/null
+++ b/BaseGLProject/base_light.frag
@@ -0,0 +1,52 @@
+#version 440
+
+in vec3 f_color;
+out vec4 FragColors;
+
+uniform vec3 Kd;
+uniform vec3 Ka;
+uniform vec3 Ks;
+uniform float Shininess;
+
+struct LightInfo {
+ vec4 Position;
+ vec3 Intensity;
+};
+
+uniform LightInfo Light[64];
+uniform int LightCount;
+
+
+in vec3 fNormal;
+in vec3 pos;
+
+in vec2 texCoord;
+uniform sampler2D tex1;
+
+void main()
+{
+
+ vec3 finalColor;
+ vec3 diffuse_sum;
+ vec3 specular_sum;
+ vec3 ambient;
+
+ ambient = Ka * Light[0].Intensity;
+ for (int i=0; i