diff --git a/inc/cube.hpp b/inc/cube.hpp new file mode 100644 index 0000000..958da33 --- /dev/null +++ b/inc/cube.hpp @@ -0,0 +1,27 @@ +#ifndef CUBE_HPP +#define CUBE_HPP + +#include "vbo.hpp" +#include "ebo.hpp" +#include "vao.hpp" +#include "shader.hpp" +#include "texture.hpp" +#include "camera.hpp" + +class Cube +{ +private: + VBO vbo; + EBO ebo; + VAO vao; + + Camera &camera; + Shader shader; + Texture texture; + +public: + Cube(Camera &camera); + void loop(int width, int height); +}; + +#endif \ No newline at end of file diff --git a/src/cube.cpp b/src/cube.cpp new file mode 100644 index 0000000..5f57b48 --- /dev/null +++ b/src/cube.cpp @@ -0,0 +1,178 @@ +#include "cube.hpp" +#include "VAO.hpp" +#include "vbo.hpp" + +GLfloat cubeVertices[] = { + // Positions // Normales // texture coordinate + + // front side + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, + + // back side + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, + + // left side + -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + + // right side + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, + + // bottom side + -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, + + // up side + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, +}; + +unsigned int cubeIndices[] = { + 0, 1, 2, // Triangle 1 + 2, 3, 0, // Triangle 2 + + 4, 5, 6, // Triangle 3 + 6, 7, 4, // Triangle 4 + + 8, 9, 10, // Triangle 5 + 10, 11, 8, // Triangle 6 + + 12, 13, 14, // Triangle 7 + 14, 15, 12, // Triangle 8 + + 16, 17, 18, // Triangle 9 + 18, 19, 16, // Triangle 10 + + 20, 21, 22, // Triangle 11 + 22, 23, 20 // Triangle 12 +}; + +const char* cubeVertexShader = R"( + #version 330 core + + layout (location = 0) in vec3 aPos; + layout (location = 1) in vec3 aNormal; + layout (location = 2) in vec2 aTexCoords; + + uniform mat4 projection; + uniform mat4 model; + uniform mat4 view; + + out vec3 Normal; + out vec3 FragPos; + out vec2 TexCoords; + + void main() { + FragPos = vec3(model * vec4(aPos, 1.0)); + gl_Position = projection * view * vec4(FragPos, 1.0); + + Normal = mat3(transpose(inverse(model))) * aNormal; + TexCoords = aTexCoords; + } +)"; + +const char* cubeFragShader = R"( + #version 330 core + out vec4 FragColor; + + // Définitions de struct non utilisées pour l'éclairage mais laissées pour référence + struct Material { + sampler2D diffuse; + vec3 specular; + float shininess; + }; + struct Light { + vec3 position; + + vec3 ambient; + vec3 diffuse; + vec3 specular; + }; + + in vec3 FragPos; + in vec3 Normal; + in vec2 TexCoords; + + uniform vec3 viewPos; + uniform Material material; // Utilisé uniquement pour material.diffuse + uniform Light light; // Non utilisé + + void main() + { + // 1. Lire la couleur de la texture + vec4 texColor = texture(material.diffuse, TexCoords); + + // 2. Afficher la couleur de la texture directement + FragColor = texColor; + + // Toutes les lignes de calcul d'éclairage (ambient, diffuse, specular) sont retirées. + } +)"; + +Cube::Cube(Camera &camera) : + vbo(cubeVertices, sizeof(cubeVertices)), + ebo(cubeIndices, sizeof(cubeIndices)), + texture("stone.png"), + camera(camera), + shader(cubeVertexShader, cubeFragShader) +{ + vao.bind(); + vbo.bind(); + + GLsizei stride = 8*sizeof(float); + + vao.setAttributePointer(0, 3, GL_FLOAT, stride, (void*)0); + vao.setAttributePointer(1, 3, GL_FLOAT, stride, (void*)(3*sizeof(float))); + vao.setAttributePointer(2, 2, GL_FLOAT, stride, (void*)(6*sizeof(float))); + + ebo.bind(); +} + +void Cube::loop(int width, int height) +{ + shader.use(); + glActiveTexture(GL_TEXTURE0); + + glm::vec3 coordinate = glm::vec3(0.0f, -1.0f, 0.0f); + glm::mat4 projection = glm::perspective( + glm::radians(camera.fov), + static_cast(width) / static_cast(height), + 0.1f, + 100.0f + ); + + GLint texLoc = glGetUniformLocation(shader.getProgram(), "material.diffuse"); + glUniform1i(texLoc, 0); + + GLint projectionLoc = glGetUniformLocation(shader.getProgram(), "projection"); + glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection)); + + GLint viewLoc = glGetUniformLocation(shader.getProgram(), "view"); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(camera.getViewMatrix())); + + glm::mat4 model = glm::translate(glm::mat4(1.0f), coordinate); + GLint modelLoc = glGetUniformLocation(shader.getProgram(), "model"); + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); + + vao.drawElement( + GL_TRIANGLES, + sizeof(cubeIndices) / sizeof(unsigned int), + GL_UNSIGNED_INT, + 0 + ); +} \ No newline at end of file