added the other files
This commit is contained in:
parent
deff78ed58
commit
11d4aac4ce
18
CMakeLists.txt
Normal file
18
CMakeLists.txt
Normal file
@ -0,0 +1,18 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(CoursOpenGl)
|
||||
|
||||
file(GLOB_RECURSE SRC src/*)
|
||||
file(GLOB_RECURSE HEADERS include/*)
|
||||
|
||||
find_package(GLEW REQUIRED)
|
||||
include_directories(${GLEW_INCLUDE_DIRS})
|
||||
add_executable(CoursOpenGl ${LIB_HEADERS} ${HEADERS} ${SRC})
|
||||
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(glfw3 3.4 REQUIRED)
|
||||
|
||||
|
||||
target_include_directories(CoursOpenGl PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
||||
target_link_libraries(CoursOpenGl glfw OpenGL::GL -lGLU ${GLEW_LIBRARIES})
|
||||
target_link_directories(CoursOpenGl PUBLIC .)
|
||||
|
||||
11
assets/shaders/fragment.glsl
Normal file
11
assets/shaders/fragment.glsl
Normal file
@ -0,0 +1,11 @@
|
||||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
in vec2 TexCoord;
|
||||
|
||||
uniform sampler2D ourTexture;
|
||||
|
||||
void main()
|
||||
{
|
||||
//FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
|
||||
FragColor = texture(ourTexture, TexCoord);
|
||||
}
|
||||
13
assets/shaders/vertex.glsl
Normal file
13
assets/shaders/vertex.glsl
Normal file
@ -0,0 +1,13 @@
|
||||
#version 330 core
|
||||
layout (location = 0) in vec3 aPos;
|
||||
layout (location = 1) in vec2 aTexCoord;
|
||||
out vec2 TexCoord;
|
||||
uniform mat4 model;
|
||||
uniform mat4 view;
|
||||
uniform mat4 projection;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = projection * view * model * vec4(aPos, 1.0);
|
||||
TexCoord = aTexCoord;
|
||||
}
|
||||
BIN
assets/textures/prof.png
Normal file
BIN
assets/textures/prof.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 353 KiB |
35
include/ShaderProgram.h
Normal file
35
include/ShaderProgram.h
Normal file
@ -0,0 +1,35 @@
|
||||
#ifndef SHADERPROGRAM_H
|
||||
#define SHADERPROGRAM_H
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <string>
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
namespace djalim {
|
||||
class ShaderProgram {
|
||||
public:
|
||||
ShaderProgram();
|
||||
~ShaderProgram();
|
||||
|
||||
bool loadShaders(const char* vertexShaderFile, const char* fragmentShaderFile);
|
||||
void use();
|
||||
|
||||
void setUniform(const std::string& name, float value);
|
||||
void setUniform(const std::string& name, int value);
|
||||
void setUniform(const std::string& name, const glm::vec2& value);
|
||||
void setUniform(const std::string& name, const glm::vec3& value);
|
||||
void setUniform(const std::string& name, const glm::vec4& value);
|
||||
void setUniform(const std::string& name, const glm::mat4& value);
|
||||
|
||||
GLuint getProgram() const { return mHandle; }
|
||||
|
||||
private:
|
||||
std::string fileToString(const std::string& filename);
|
||||
void checkCompileErrors(GLuint shader, std::string type);
|
||||
|
||||
GLuint mHandle;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // SHADERPROGRAM_H
|
||||
20
include/Texture2D.h
Normal file
20
include/Texture2D.h
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef TEXTURE2D_H
|
||||
#define TEXTURE2D_H
|
||||
#include <stb_image/stb_image.h>
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <string>
|
||||
|
||||
class Texture2D {
|
||||
public:
|
||||
Texture2D();
|
||||
~Texture2D();
|
||||
|
||||
bool loadTexture(const std::string& filename, bool generateMipmaps = true);
|
||||
void bind(GLuint texUnit = 0);
|
||||
|
||||
private:
|
||||
GLuint mTexture;
|
||||
};
|
||||
|
||||
#endif // TEXTURE2D_H
|
||||
60
include/engine.h
Normal file
60
include/engine.h
Normal file
@ -0,0 +1,60 @@
|
||||
#ifndef ENGINE_H
|
||||
#define ENGINE_H
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include "ShaderProgram.h"
|
||||
#include "Texture2D.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#define NBCALLBACKS 1
|
||||
|
||||
typedef void (*KeyCallback)(GLFWwindow* window, int key, int scancode, int action, int mods);
|
||||
|
||||
struct Object3D {
|
||||
Texture2D texture;
|
||||
GLuint VBO;
|
||||
GLuint VAO;
|
||||
};
|
||||
|
||||
typedef std::map<std::string,Object3D> Objects3D;
|
||||
|
||||
static bool gWireframe = false;
|
||||
|
||||
namespace djalim {
|
||||
|
||||
class OpenGlEngine{
|
||||
|
||||
public:
|
||||
|
||||
void start();
|
||||
OpenGlEngine( const char* title, int width, int height);
|
||||
~OpenGlEngine();
|
||||
|
||||
GLFWwindow* window;
|
||||
double previousSeconds = 0.0;
|
||||
double elapsedSeconds;
|
||||
int frameCount = 0;
|
||||
std::map<std::string,Texture2D> textures;
|
||||
ShaderProgram shaderProgram;
|
||||
|
||||
Objects3D objects;
|
||||
|
||||
unsigned int VBO;
|
||||
unsigned int VAO;
|
||||
|
||||
bool gWireframe = false;
|
||||
|
||||
void onUpdate();
|
||||
void loadHints();
|
||||
void createObject(std::string name, std::string textures, std::vector<float>& vertices);
|
||||
void loadCallbacks();
|
||||
void showFps();
|
||||
void onCreate();
|
||||
void onDestroy();
|
||||
};
|
||||
}
|
||||
|
||||
#endif // ENGINE_H
|
||||
15
include/loops.h
Normal file
15
include/loops.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef LOOPS_H
|
||||
#define LOOPS_H
|
||||
#include "ShaderProgram.h"
|
||||
#include "Texture2D.h"
|
||||
#include "engine.h"
|
||||
#include <map>
|
||||
|
||||
namespace djalim {
|
||||
void rainbowWindow(double elapsedSeconds);
|
||||
void rgbTriangle(djalim::ShaderProgram shaderProgram, unsigned int VAO);
|
||||
//void cube(GLFWwindow* window, djalim::ShaderProgram shader, GLuint VAO, std::map<std::string, Texture2D>& textures);
|
||||
void cube(GLFWwindow* window, djalim::ShaderProgram shader, Objects3D& objects);
|
||||
}
|
||||
|
||||
#endif // LOOPS_H
|
||||
7988
include/stb_image/stb_image.h
Normal file
7988
include/stb_image/stb_image.h
Normal file
File diff suppressed because it is too large
Load Diff
95
src/core/ShaderProgram.cpp
Normal file
95
src/core/ShaderProgram.cpp
Normal file
@ -0,0 +1,95 @@
|
||||
#include "engine.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
djalim::ShaderProgram::ShaderProgram() : mHandle(0) {}
|
||||
|
||||
djalim::ShaderProgram::~ShaderProgram() {
|
||||
if (mHandle > 0) {
|
||||
glDeleteProgram(mHandle);
|
||||
}
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::use() {
|
||||
if (mHandle > 0) {
|
||||
glUseProgram(mHandle);
|
||||
}
|
||||
}
|
||||
|
||||
bool djalim::ShaderProgram::loadShaders(const char* vertexShaderFile, const char* fragmentShaderFile) {
|
||||
std::string vertSourceStr = fileToString(vertexShaderFile);
|
||||
std::string fragSourceStr = fileToString(fragmentShaderFile);
|
||||
const char* vertSource = vertSourceStr.c_str();
|
||||
const char* fragSource = fragSourceStr.c_str();
|
||||
|
||||
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(vertexShader, 1, &vertSource, NULL);
|
||||
glCompileShader(vertexShader);
|
||||
checkCompileErrors(vertexShader, "VERTEX");
|
||||
|
||||
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragmentShader, 1, &fragSource, NULL);
|
||||
glCompileShader(fragmentShader);
|
||||
checkCompileErrors(fragmentShader, "FRAGMENT");
|
||||
|
||||
mHandle = glCreateProgram();
|
||||
glAttachShader(mHandle, vertexShader);
|
||||
glAttachShader(mHandle, fragmentShader);
|
||||
glLinkProgram(mHandle);
|
||||
checkCompileErrors(mHandle, "PROGRAM");
|
||||
|
||||
glDeleteShader(vertexShader);
|
||||
glDeleteShader(fragmentShader);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string djalim::ShaderProgram::fileToString(const std::string& filename) {
|
||||
std::ifstream fileStream(filename);
|
||||
if (!fileStream.is_open()) {
|
||||
std::cerr << "Erreur : Impossible d'ouvrir le fichier shader : " << filename << std::endl;
|
||||
return "";
|
||||
}
|
||||
std::stringstream buffer;
|
||||
buffer << fileStream.rdbuf();
|
||||
return buffer.str();
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::checkCompileErrors(GLuint shader, std::string type) {
|
||||
GLint success;
|
||||
GLchar infoLog[1024];
|
||||
if (type != "PROGRAM") {
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||
if (!success) {
|
||||
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||
std::cerr << "ERREUR::SHADER_COMPILATION_ERROR de type: " << type << "\n" << infoLog << std::endl;
|
||||
}
|
||||
} else {
|
||||
glGetProgramiv(shader, GL_LINK_STATUS, &success);
|
||||
if (!success) {
|
||||
glGetProgramInfoLog(shader, 1024, NULL, infoLog);
|
||||
std::cerr << "ERREUR::PROGRAM_LINKING_ERROR de type: " << type << "\n" << infoLog << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::setUniform(const std::string& name, const glm::vec4& value) {
|
||||
glUniform4f(glGetUniformLocation(mHandle, name.c_str()), value.x, value.y, value.z, value.w);
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::setUniform(const std::string& name, const glm::mat4& value) {
|
||||
glUniformMatrix4fv(glGetUniformLocation(mHandle, name.c_str()), 1, GL_FALSE, &value[0][0]);
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::setUniform(const std::string& name, int value) {
|
||||
glUniform1i(glGetUniformLocation(mHandle, name.c_str()), value);
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::setUniform(const std::string& name, float value) {
|
||||
glUniform1f(glGetUniformLocation(mHandle, name.c_str()), value);
|
||||
}
|
||||
|
||||
void djalim::ShaderProgram::setUniform(const std::string& name, const glm::vec3& value) {
|
||||
glUniform3f(glGetUniformLocation(mHandle, name.c_str()), value.x, value.y, value.z);
|
||||
}
|
||||
52
src/core/Texture2D.cpp
Normal file
52
src/core/Texture2D.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
#include "Texture2D.h"
|
||||
#include <iostream>
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include <stb_image/stb_image.h>
|
||||
|
||||
Texture2D::Texture2D() : mTexture(0) {}
|
||||
|
||||
Texture2D::~Texture2D() {
|
||||
if (mTexture > 0) {
|
||||
glDeleteTextures(1, &mTexture);
|
||||
}
|
||||
}
|
||||
|
||||
bool Texture2D::loadTexture(const std::string& filename, bool generateMipmaps) {
|
||||
int width, height, components;
|
||||
unsigned char* data = stbi_load(filename.c_str(), &width, &height, &components, STBI_rgb);
|
||||
if (data == NULL) {
|
||||
std::cerr << "Erreur: Impossible de charger la texture : " << filename << std::endl;
|
||||
std::cerr << "STBI Reason: " << stbi_failure_reason() << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::cout << "Texture loaded successfully: " << filename << std::endl;
|
||||
std::cout << "Width: " << width << ", Height: " << height << ", Components: " << components << std::endl;
|
||||
|
||||
glGenTextures(1, &mTexture);
|
||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
||||
|
||||
if (generateMipmaps) {
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
}
|
||||
std::cout << "Mipmaps generated" << std::endl;
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
stbi_image_free(data);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void Texture2D::bind(GLuint texUnit) {
|
||||
glActiveTexture(GL_TEXTURE0 + texUnit);
|
||||
glBindTexture(GL_TEXTURE_2D, mTexture);
|
||||
}
|
||||
29
src/core/callbacks.cpp
Normal file
29
src/core/callbacks.cpp
Normal file
@ -0,0 +1,29 @@
|
||||
#include "engine.h"
|
||||
|
||||
extern bool gWireframe;
|
||||
|
||||
// TODO Try to make callbacks more flexible
|
||||
// there should not be a single function with 100+ if elses 💀
|
||||
void mainCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||
{
|
||||
//TODO Extract this in a exitCallBack Function
|
||||
if ((key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) && action == GLFW_PRESS) {
|
||||
glfwSetWindowShouldClose(window, GL_TRUE);
|
||||
}
|
||||
// end todo
|
||||
|
||||
//TODO Extract this in a wireframeCallBack Function
|
||||
if (key == GLFW_KEY_W && action == GLFW_PRESS)
|
||||
gWireframe = !gWireframe;
|
||||
if (gWireframe)
|
||||
|
||||
glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
|
||||
else
|
||||
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
|
||||
// end todo
|
||||
|
||||
}
|
||||
|
||||
void djalim::OpenGlEngine::loadCallbacks(){
|
||||
glfwSetKeyCallback(window, mainCallback);
|
||||
}
|
||||
106
src/core/engine.cpp
Normal file
106
src/core/engine.cpp
Normal file
@ -0,0 +1,106 @@
|
||||
#include "engine.h"
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
djalim::OpenGlEngine::OpenGlEngine(const char* title, int width, int height) {
|
||||
// initialize GLFW
|
||||
if (!glfwInit()) {
|
||||
std::cerr << "Failed to initialize GLFW" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
loadHints();
|
||||
|
||||
this->window = glfwCreateWindow(width, height, title, NULL, NULL);
|
||||
if (!this->window) {
|
||||
std::cerr << "Failed to create GLFW window" << std::endl;
|
||||
glfwTerminate();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
glfwMakeContextCurrent(this->window);
|
||||
|
||||
// initialize GLEW
|
||||
glewExperimental = GL_TRUE;
|
||||
if (glewInit() != GLEW_OK) {
|
||||
std::cerr << "Failed to initialize GLEW" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
loadCallbacks();
|
||||
|
||||
bool loaded = shaderProgram.loadShaders("../assets/shaders/vertex.glsl", "../assets/shaders/fragment.glsl");
|
||||
if (!loaded) {
|
||||
std::cerr << "Failed to load shaders correctly" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
onCreate();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void djalim::OpenGlEngine::createObject(std::string name, std::string textures, std::vector<float>& vertices){
|
||||
|
||||
objects[name];
|
||||
|
||||
bool textureLoaded = objects[name].texture.loadTexture(textures);
|
||||
|
||||
if (!textureLoaded) {
|
||||
std::cerr << "Failed to load " << name << " texture!" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
//glGenVertexArrays(1, &VAO);
|
||||
glGenVertexArrays(1, &(objects[name].VAO));
|
||||
|
||||
//glGenBuffers(1, &VBO);
|
||||
glGenBuffers(1, &(objects[name].VBO));
|
||||
|
||||
//glBindVertexArray(VAO);
|
||||
glBindVertexArray(objects[name].VAO);
|
||||
|
||||
|
||||
//glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, objects[name].VBO);
|
||||
|
||||
|
||||
std::cout << "Loading 3D objects with "<< vertices.size() << " vertices"<< std::endl;
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*vertices.size(), vertices.data(), GL_STATIC_DRAW);
|
||||
|
||||
// Attribut de position
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
// Attribut de coordonnée de texture
|
||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
|
||||
glEnableVertexAttribArray(1);
|
||||
}
|
||||
|
||||
djalim::OpenGlEngine::~OpenGlEngine() {
|
||||
onDestroy();
|
||||
glfwDestroyWindow(window);
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
void djalim::OpenGlEngine::start(){
|
||||
// Main loop
|
||||
|
||||
double currentSeconds;
|
||||
while (!glfwWindowShouldClose(this->window)) {
|
||||
|
||||
currentSeconds = glfwGetTime();
|
||||
elapsedSeconds = currentSeconds-previousSeconds;
|
||||
previousSeconds = currentSeconds;
|
||||
|
||||
glfwPollEvents();
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
//glClearColor(0, 0.5, 0.5, 1.0f);
|
||||
|
||||
onUpdate();
|
||||
|
||||
glfwSwapBuffers(this->window);
|
||||
|
||||
}
|
||||
}
|
||||
9
src/core/hints.cpp
Normal file
9
src/core/hints.cpp
Normal file
@ -0,0 +1,9 @@
|
||||
#include "engine.h"
|
||||
|
||||
void djalim::OpenGlEngine::loadHints(){
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
}
|
||||
68
src/loops/cube.cpp
Normal file
68
src/loops/cube.cpp
Normal file
@ -0,0 +1,68 @@
|
||||
#include "ShaderProgram.h"
|
||||
#include "Texture2D.h"
|
||||
#include "engine.h"
|
||||
#include "loops.h"
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
#include <iostream>
|
||||
|
||||
// void djalim::cube(GLFWwindow* window, djalim::ShaderProgram shader, GLuint VAO, std::map<std::string, Texture2D>& textures){
|
||||
//
|
||||
// shader.use();
|
||||
// shader.setUniform("ourTexture", 0);
|
||||
// textures["cube"].bind();
|
||||
//
|
||||
// // Matrice de Projection
|
||||
// glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
|
||||
// shader.setUniform("projection", projection); // Assurez-vous que setUniform pour mat4 est implémenté
|
||||
//
|
||||
// // Matrice de Vue
|
||||
// glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), // Position caméra
|
||||
// glm::vec3(0.0f, 0.0f, 0.0f), // Cible
|
||||
// glm::vec3(0.0f, 1.0f, 0.0f)); // Axe Haut
|
||||
// shader.setUniform("view", view);
|
||||
//
|
||||
// // Matrice Modèle
|
||||
// glm::mat4 model = glm::mat4(1.0f);
|
||||
// model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));
|
||||
// shader.setUniform("model", model);
|
||||
//
|
||||
// // Dessiner le cube
|
||||
// glBindVertexArray(VAO);
|
||||
// glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
//
|
||||
// }
|
||||
|
||||
void djalim::cube(GLFWwindow* window, djalim::ShaderProgram shader, Objects3D& objects){
|
||||
|
||||
shader.use();
|
||||
shader.setUniform("ourTexture", 0);
|
||||
|
||||
objects["cube"].texture.bind();
|
||||
//textures["cube"].bind();
|
||||
|
||||
// Matrice de Projection
|
||||
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
|
||||
shader.setUniform("projection", projection); // Assurez-vous que setUniform pour mat4 est implémenté
|
||||
|
||||
// Matrice de Vue
|
||||
glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), // Position caméra
|
||||
glm::vec3(0.0f, 0.0f, 0.0f), // Cible
|
||||
glm::vec3(0.0f, 1.0f, 0.0f)); // Axe Haut
|
||||
shader.setUniform("view", view);
|
||||
|
||||
// Matrice Modèle
|
||||
glm::mat4 model = glm::mat4(1.0f);
|
||||
model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));
|
||||
shader.setUniform("model", model);
|
||||
|
||||
// Dessiner le cube
|
||||
glBindVertexArray(objects["cube"].VAO);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||
|
||||
//std::cout << objects["cube"].VAO << std::endl;
|
||||
|
||||
}
|
||||
32
src/loops/rainbowWindow.cpp
Normal file
32
src/loops/rainbowWindow.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include "engine.h"
|
||||
#include "loops.h"
|
||||
#include "iostream"
|
||||
#include <GL/gl.h>
|
||||
|
||||
|
||||
void djalim::rainbowWindow(double elapsedSeconds){
|
||||
static double red = 0.0;
|
||||
static double green= 0.0;
|
||||
static double blue = 0.0;
|
||||
static double thresh = 0.0;
|
||||
|
||||
thresh += elapsedSeconds;
|
||||
|
||||
if (thresh >0.1){
|
||||
thresh = 0.0;
|
||||
red += 0.1;
|
||||
if( red > 1.0 ) {
|
||||
red = 0.0;
|
||||
green += 0.1;
|
||||
if( green > 1.0 ) {
|
||||
green = 0.0;
|
||||
blue += 0.1;
|
||||
if( blue > 1.0 ) {
|
||||
blue = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
std::cout << "red: " << red << ", green: " << green << ", blue: " << blue << " \r";
|
||||
glClearColor(red, green, blue, 1.0f);
|
||||
}
|
||||
12
src/loops/rbgTriangle.cpp
Normal file
12
src/loops/rbgTriangle.cpp
Normal file
@ -0,0 +1,12 @@
|
||||
#include "engine.h"
|
||||
#include "loops.h"
|
||||
|
||||
void djalim::rgbTriangle(djalim::ShaderProgram shaderProgram, unsigned int VAO){
|
||||
// Dessiner le triangle
|
||||
shaderProgram.use();
|
||||
glBindVertexArray(VAO);
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
|
||||
glClearColor(0, 0.5, 0.5, 1.0f);
|
||||
|
||||
}
|
||||
7
src/main.cpp
Normal file
7
src/main.cpp
Normal file
@ -0,0 +1,7 @@
|
||||
#include "engine.h"
|
||||
|
||||
int main() {
|
||||
djalim::OpenGlEngine engine = djalim::OpenGlEngine("Mon app", 800, 600);
|
||||
engine.start();
|
||||
return 0;
|
||||
}
|
||||
76
src/onCreate.cpp
Normal file
76
src/onCreate.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
#include "engine.h"
|
||||
#include "Texture2D.h"
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
void djalim::OpenGlEngine::onCreate(){
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
std::vector<float> vertices {
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
|
||||
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
|
||||
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
||||
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
||||
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
|
||||
|
||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
||||
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
|
||||
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
|
||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
||||
|
||||
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
||||
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
||||
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
|
||||
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
||||
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
|
||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
|
||||
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
|
||||
|
||||
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
|
||||
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
|
||||
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
|
||||
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
|
||||
};
|
||||
|
||||
stbi_set_flip_vertically_on_load(true);
|
||||
createObject("cube", "../assets/textures/prof.png", vertices);
|
||||
|
||||
// textures["cube"] = Texture2D();
|
||||
// bool textureLoaded = textures["cube"].loadTexture("../assets/textures/prof.png");
|
||||
// if (!textureLoaded) {
|
||||
// std::cerr << "Failed to load cube texture!" << std::endl;
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// glGenVertexArrays(1, &VAO);
|
||||
// glGenBuffers(1, &VBO);
|
||||
// glBindVertexArray(VAO);
|
||||
// glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
// glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
// // Attribut de position
|
||||
// glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
|
||||
// glEnableVertexAttribArray(0);
|
||||
// // Attribut de coordonnée de texture
|
||||
// glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
|
||||
// glEnableVertexAttribArray(1);
|
||||
|
||||
// juste pour voir le cube
|
||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||
}
|
||||
5
src/onDestroy.cpp
Normal file
5
src/onDestroy.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
#include "engine.h"
|
||||
|
||||
void djalim::OpenGlEngine::onDestroy(){
|
||||
|
||||
}
|
||||
10
src/onUpdate.cpp
Normal file
10
src/onUpdate.cpp
Normal file
@ -0,0 +1,10 @@
|
||||
#include "engine.h"
|
||||
#include <GL/gl.h>
|
||||
#include "loops.h"
|
||||
|
||||
void djalim::OpenGlEngine::onUpdate(){
|
||||
showFps();
|
||||
|
||||
cube(window,shaderProgram,objects);
|
||||
|
||||
}
|
||||
26
src/utils/showFps.cpp
Normal file
26
src/utils/showFps.cpp
Normal file
@ -0,0 +1,26 @@
|
||||
#include "engine.h"
|
||||
|
||||
void djalim::OpenGlEngine::showFps()
|
||||
{
|
||||
static double thresh = 0.0;
|
||||
|
||||
thresh += elapsedSeconds;
|
||||
|
||||
if (thresh > 0.25)
|
||||
{
|
||||
double fps = (double)frameCount / thresh;
|
||||
double msPerFrame = 1000.0 / fps;
|
||||
|
||||
std::ostringstream outs;
|
||||
outs.precision(3);
|
||||
outs << std::fixed
|
||||
<< "FPS: " << fps << " "
|
||||
<< "Frame Time: " << msPerFrame << "(ms)";
|
||||
glfwSetWindowTitle(window, outs.str().c_str());
|
||||
|
||||
|
||||
frameCount = 0;
|
||||
thresh = 0.0;
|
||||
}
|
||||
frameCount++;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user