#include #include #include #include #include #include "main.h" #include int main() { if(!glfwInit()) { printf("Faild to initalize GLFW\n"); return -1; } glfwSetErrorCallback(&glfwError); glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow *window; window = glfwCreateWindow(1920, 1080, "Minecraft-Clone", NULL, NULL); if(window == NULL) { printf("Failed to open GLFW window.\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { printf("Failed to initialize GLAD\n"); return -1; } glViewport(0, 0, 1920, 1080); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; // parse shader unsigned int vertexShader = parseShader("shader/test.vert", GL_VERTEX_SHADER); unsigned int fragmentShader = parseShader("shader/test.frag", GL_FRAGMENT_SHADER); unsigned int shaderProgram = linkShader(vertexShader, fragmentShader); glUseProgram(shaderProgram); unsigned int VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); unsigned int VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); while(!glfwWindowShouldClose(window)) { glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 3); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } void glfwError(int id, const char* description) { printf("Glfw Error: %s\n", description); } void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } unsigned int parseShader(const char *filePath, const GLenum shaderType) { bool success; unsigned int ShaderId; char *ShaderSrc = acl_ReadTextFile(filePath, &success); if(!success) { printf("Failed to read Shader: %s", filePath); glfwTerminate(); exit(-1); } ShaderId = glCreateShader(shaderType); const char *tmpShaderSrc = ShaderSrc; glShaderSource(ShaderId, 1, &tmpShaderSrc, NULL); glCompileShader(ShaderId); free(ShaderSrc); int compileSuccess; glGetShaderiv(ShaderId, GL_COMPILE_STATUS, &compileSuccess); if(!compileSuccess) { char infoLog[512]; glGetShaderInfoLog(ShaderId, 512, NULL, infoLog); printf("Failed to compile Shader: %s Error: %s", filePath, infoLog); } return ShaderId; } unsigned int linkShader(unsigned int vertexShader, unsigned int fragmentShader) { unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); int success; glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if(!success) { char infoLog[512]; glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); printf("Failed to link Shader. Error: %s", infoLog); glfwTerminate(); exit(-1); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); return shaderProgram; }