162 lines
4.6 KiB
C
162 lines
4.6 KiB
C
#include "Renderer.h"
|
|
|
|
GLFWwindow* initOpenGL() {
|
|
|
|
glfwInit();
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
|
|
GLFWwindow* window = glfwCreateWindow(800, 600, "Hello World", NULL, NULL);
|
|
if(window == NULL) {
|
|
printf("Failed to create a window\n");
|
|
glfwTerminate();
|
|
exit(-1);
|
|
}
|
|
|
|
glfwMakeContextCurrent(window);
|
|
glfwSetFramebufferSizeCallback(window, WindowGotResized);
|
|
|
|
if(!gladLoadGLLoader( (GLADloadproc) glfwGetProcAddress )) {
|
|
printf("Failed to initialize GLAD");
|
|
exit(-1);
|
|
}
|
|
|
|
|
|
// Set Global Texture Parameters
|
|
float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f};
|
|
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
return window;
|
|
}
|
|
|
|
void WindowGotResized(GLFWwindow* window, int width, int height) {
|
|
|
|
glViewport(0, 0, width, height);
|
|
}
|
|
|
|
unsigned int compileShaderProgram(const char** vertexSrc, const char** fragmentSrc) {
|
|
unsigned int vertexShader;
|
|
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
|
glShaderSource(vertexShader, 1, vertexSrc, NULL);
|
|
glCompileShader(vertexShader);
|
|
|
|
int vertexSuccess;
|
|
char infoLog[512];
|
|
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &vertexSuccess);
|
|
if(!vertexSuccess) {
|
|
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
|
|
printf("SHADER::VERTEX::COMPILATION_FAILED\n %s \n", infoLog);
|
|
}
|
|
|
|
unsigned int fragmentShader;
|
|
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
glShaderSource(fragmentShader, 1, fragmentSrc, NULL);
|
|
glCompileShader(fragmentShader);
|
|
|
|
int fragmentSuccess;
|
|
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &fragmentSuccess);
|
|
if(!fragmentSuccess){
|
|
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
|
|
printf("SHADER::FRAGMENT::COMPILATION_FAILED\n %s \n", infoLog);
|
|
}
|
|
|
|
unsigned int shaderProgram;
|
|
shaderProgram = glCreateProgram();
|
|
glAttachShader(shaderProgram, vertexShader);
|
|
glAttachShader(shaderProgram, fragmentShader);
|
|
|
|
glLinkProgram(shaderProgram);
|
|
|
|
int programSuccess;
|
|
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &programSuccess);
|
|
if(!programSuccess) {
|
|
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
|
|
printf("SHADER::PROGRAM::LINKING_FAILED\n %s \n", infoLog);
|
|
}
|
|
glDeleteShader(vertexShader);
|
|
glDeleteShader(fragmentShader);
|
|
|
|
return shaderProgram;
|
|
|
|
}
|
|
|
|
unsigned int createShader(char* vertexPath, char* fragmentPath) {
|
|
FILE* vertex_file = fopen(vertexPath, "r");
|
|
FILE* fragment_file = fopen(fragmentPath, "r");
|
|
if( vertex_file == NULL || fragment_file == NULL ) {
|
|
printf("Failed to load shaders.\n");
|
|
exit(1);
|
|
}
|
|
|
|
struct stat vertex_stat;
|
|
struct stat fragment_stat;
|
|
stat(vertexPath, &vertex_stat);
|
|
stat(fragmentPath, &fragment_stat);
|
|
|
|
int vertex_length = vertex_stat.st_size;
|
|
int fragment_length = fragment_stat.st_size;
|
|
|
|
char* vertex_src = (char*)malloc(vertex_length+1);
|
|
char* fragment_src = (char*)malloc(fragment_length+1);
|
|
memset(vertex_src, 0, vertex_length+1);
|
|
memset(fragment_src, 0, fragment_length+1);
|
|
|
|
fread(vertex_src, sizeof(char), vertex_length, vertex_file );
|
|
fread(fragment_src, sizeof(char), fragment_length, fragment_file );
|
|
|
|
vertex_src[vertex_length] = '\0';
|
|
fragment_src[fragment_length] = '\0';
|
|
// printf("%s", vertex_src);
|
|
// printf("%s", fragment_src);
|
|
|
|
const char* vertexSrc = vertex_src;
|
|
const char* fragmentSrc = fragment_src;
|
|
|
|
unsigned int shaderProgram;
|
|
shaderProgram = compileShaderProgram(&vertexSrc, &fragmentSrc);
|
|
free(fragment_src);
|
|
free(vertex_src);
|
|
|
|
return shaderProgram;
|
|
}
|
|
|
|
unsigned int createTexture(char* path){
|
|
// Generate Texture
|
|
unsigned int texture;
|
|
glGenTextures(1, &texture);
|
|
glBindTexture(GL_TEXTURE_2D, texture);
|
|
|
|
// Set Texure Parameters
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
|
// Load texture image
|
|
int width, height, channels;
|
|
unsigned char *data = stbi_load(path, &width, &height, &channels, 0);
|
|
|
|
if (data) {
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
|
glGenerateMipmap(GL_TEXTURE_2D);
|
|
} else {
|
|
printf("Failed to load texture %s", path);
|
|
}
|
|
stbi_image_free(data);
|
|
|
|
return texture;
|
|
}
|
|
|
|
void buffercpy(int VBO, void* ptr, int size){
|
|
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
|
void* buffer = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
|
|
memcpy(buffer, ptr, size);
|
|
glUnmapBuffer(GL_ARRAY_BUFFER);
|
|
}
|
|
|