commit 4563397a4487b1190ac151481ae2463da0c9416d Author: illegitimate-egg Date: Sat Oct 5 22:48:42 2024 +0100 Premodularizzzation diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a4fb4fb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +.cache/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8798a8c --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "SOIL2"] + path = SOIL2 + url = https://github.com/SpartanJ/SOIL2 +[submodule "include/SOIL2"] + path = include/SOIL2 + url = https://github.com/SpartanJ/SOIL2 +[submodule "include/assimp"] + path = include/assimp + url = https://github.com/assimp/assimp +[submodule "include/glew"] + path = include/glew + url = https://github.com/nigels-com/glew +[submodule "include/glfw"] + path = include/glfw + url = https://github.com/glfw/glfw +[submodule "include/glm"] + path = include/glm + url = https://github.com/g-truc/glm +[submodule "include/imgui"] + path = include/imgui + url = https://github.com/ocornut/imgui diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..cff82a2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,55 @@ +cmake_minimum_required(VERSION 3.11) +project(fred) + +# if($) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # For my Clangd LSP +# endif() + +set(GLFW_BUILD_WAYLAND OFF) # This should be detected and not forced + +find_package(OpenGL REQUIRED) + +if(CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) + message(FATAL_ERROR "You fucking smell fr") +endif() +if(CMAKE_SOURCE_DIR MATCHES " ") + message("Spaces in the source dir can cause errors, thou art been warned") +endif() +if(CMAKE_BIANRY_DIR MATCHES " ") + message("Spaces in the build dir can cause errors, thou art been warned") +endif() + +add_custom_command( + OUTPUT ${PROJECT_SOURCE_DIR}/include/glew/src/glew.c + ${PROJECT_SOURCE_DIR}/include/glewinfo.c + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/include/glew/auto + COMMAND ${CMAKE_MAKE_PROGRAM}) + +add_subdirectory(include/glm) +add_subdirectory(include/glew/build/cmake) +add_subdirectory(include/glfw) +add_subdirectory(include/SOIL2) +add_subdirectory(include/assimp) + +include_directories(include/imgui) +add_library( + imgui + include/imgui/imgui.cpp + include/imgui/imgui_demo.cpp + include/imgui/imgui_draw.cpp + include/imgui/imgui_tables.cpp + include/imgui/imgui_widgets.cpp + include/imgui/backends/imgui_impl_glfw.cpp # Zingaloid backend import + include/imgui/backends/imgui_impl_opengl3.cpp) +target_link_libraries(imgui glfw) + +add_executable(fred engine.cpp shader.c) +target_link_libraries( + fred + -lm + glm + glew + glfw + soil2 + assimp + imgui) diff --git a/engine.cpp b/engine.cpp new file mode 100644 index 0000000..ead91fd --- /dev/null +++ b/engine.cpp @@ -0,0 +1,353 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "shader.h" +} + +#define WIDTH 1024 +#define HEIGHT 768 + +static void glfwErrorCallback(int e, const char *description) { + fprintf(stderr, "GLFW Error %d: %s", e, description); +} + +bool loadModel(const char *path, std::vector &indices, + std::vector &vertices, std::vector &uvs, + std::vector &normals) { + Assimp::Importer importer; + + const aiScene *scene = importer.ReadFile( + path, aiProcess_Triangulate | aiProcess_JoinIdenticalVertices | + aiProcess_SortByPType); + if (!scene) { + fprintf(stderr, "%s\n", importer.GetErrorString()); + return false; + } + const aiMesh *mesh = scene->mMeshes[0]; + + vertices.reserve(mesh->mNumVertices); + for (unsigned int i = 0; i < mesh->mNumVertices; i++) { + aiVector3D pos = mesh->mVertices[i]; + vertices.push_back(glm::vec3(pos.x, pos.y, pos.z)); + } + + uvs.reserve(mesh->mNumVertices); + for (unsigned int i = 0; i < mesh->mNumVertices; i++) { + aiVector3D UVW = mesh->mTextureCoords[0][i]; // Multiple UVs? Prepsterous! + uvs.push_back(glm::vec2(UVW.x, UVW.y)); + } + + normals.reserve(mesh->mNumVertices); + for (unsigned int i = 0; i < mesh->mNumFaces; i++) { + indices.push_back(mesh->mFaces[i].mIndices[0]); + indices.push_back(mesh->mFaces[i].mIndices[1]); + indices.push_back(mesh->mFaces[i].mIndices[2]); + } + + return true; +} + +int initWindow() { + glfwSetErrorCallback(glfwErrorCallback); + + glewExperimental = true; + if (!glfwInit()) { + fprintf(stderr, "GLFW went shitty time\n"); + return 1; + } + + glfwWindowHint(GLFW_SAMPLES, 4); // 4x Antialiasing + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Loser MacOS is broken + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // New GL + + GLFWwindow *window; + window = glfwCreateWindow(WIDTH, HEIGHT, "Fred", NULL, NULL); + if (window == NULL) { + fprintf(stderr, "Failed to open window.\n"); + glfwTerminate(); + return 1; + } + + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + int code; + if ((code = glewInit()) != GLEW_OK) { + fprintf(stderr, "Failed to init GLEW: %s\n", glewGetErrorString(code)); + return 1; + } + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO &io = ImGui::GetIO(); + (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; + + ImGui::StyleColorsDark(); + + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init("#version 330"); + + std::vector indices; + std::vector indexed_vertices; + std::vector indexed_uvs; + std::vector indexed_normals; + if (!loadModel("../models/model.obj", indices, indexed_vertices, indexed_uvs, + indexed_normals)) { + return 0; + } + + GLuint vertexArrayID; + glGenVertexArrays(1, &vertexArrayID); + glBindVertexArray(vertexArrayID); + + GLuint vertexBuffer; + glGenBuffers(1, &vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, indexed_vertices.size() * sizeof(glm::vec3), + &indexed_vertices[0], GL_STATIC_DRAW); + + GLuint uvBuffer; + glGenBuffers(1, &uvBuffer); + glBindBuffer(GL_ARRAY_BUFFER, uvBuffer); + glBufferData(GL_ARRAY_BUFFER, indexed_uvs.size() * sizeof(glm::vec2), + &indexed_uvs[0], GL_STATIC_DRAW); + + GLuint normalBuffer; + glGenBuffers(1, &normalBuffer); + glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); + glBufferData(GL_ARRAY_BUFFER, indexed_normals.size() * sizeof(glm::vec3), + &indexed_normals[0], GL_STATIC_DRAW); + + GLuint elementBuffer; + glGenBuffers(1, &elementBuffer); + glBindBuffer(GL_ARRAY_BUFFER, elementBuffer); + glBufferData(GL_ARRAY_BUFFER, indices.size() * sizeof(unsigned short), + &indices[0], GL_STATIC_DRAW); + + GLuint texture = SOIL_load_OGL_texture( + "../textures/results/texture_BMP_DXT5_3.DDS", SOIL_LOAD_AUTO, + SOIL_CREATE_NEW_ID, + SOIL_FLAG_MIPMAPS | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT); + if (texture == 0) { + printf("Texture failed to load\n"); + return 0; + } + + GLuint programID = + loadShaders("../shaders/shader.vert", "../shaders/shader.frag"); + + // I love glm + // Projection matrix, 45deg FOV, 4:3 Aspect Ratio, Planes: 0.1units -> + // 100units + glm::mat4 projection = glm::perspective( + glm::radians(45.0f), (float)WIDTH / (float)HEIGHT, 0.1f, 100.0f); + + // Camera matrix + glm::mat4 view = + glm::lookAt(glm::vec3(4, 3, 3), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); + + glm::mat4 model = glm::mat4(1.0f); + + // Model view projection, the combination of the three vectors + glm::mat4 mvp = projection * view * model; + + GLuint matrixID = glGetUniformLocation(programID, "MVP"); + + glEnable(GL_DEPTH_TEST); // Turn on the Z-buffer + glDepthFunc(GL_LESS); // Accept only the closest fragments + + glEnable(GL_CULL_FACE); // Backface culling + + glClearColor(0.1f, 0.1f, 0.1f, 1.0f); + + // Define camera stuff + glm::vec3 position = {4, 3, 3}; + float horizontalAngle = 3.14F; // Toward -Z, in Rads + float verticalAngle = 0.0f; // On the horizon + float initialFOV = 60.0f; + + float speed = 3.0f; + float mouseSpeed = 0.005f; + + double xpos, ypos; + + double lastTime = 0; + while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && + glfwWindowShouldClose(window) == 0) { + // Clear this mf + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glUseProgram(programID); + + // ImGui + // if (glfwGetWindowAttrib(window, GLFW_ICONIFIED) != 0) { + // ImGui_ImplGlfw_Sleep(10); + // continue; // No rendering while minimized + // } + + glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + + ImGui::NewFrame(); + + // ImGui::ShowDemoWindow(); + ImGui::Begin("DEBUG INFO"); + ImGui::Text("MVP:"); + if (ImGui::BeginTable("mvp", 4)) { + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[0][0]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[0][1]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[0][2]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[0][3]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[1][0]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[1][1]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[1][2]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[1][3]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[2][0]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[2][1]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[2][2]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[2][3]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[3][0]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[3][1]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[3][2]); + ImGui::TableNextColumn(); + ImGui::Text("%f", mvp[3][3]); + + ImGui::EndTable(); + } + ImGui::End(); + + // Compute a Fresh Super Sigma MVP + // What would an input system be without delta time + double currentTime = glfwGetTime(); + float deltaTime = (float)(currentTime - lastTime); + + glfwGetCursorPos(window, &xpos, &ypos); + glfwSetCursorPos(window, (float)(WIDTH) / 2, (float)(HEIGHT) / 2); + + horizontalAngle += + mouseSpeed * deltaTime * (float)((float)(WIDTH) / 2 - xpos); + verticalAngle += + mouseSpeed * deltaTime * (float)((float)(HEIGHT) / 2 - ypos); + glm::vec3 direction(cos(verticalAngle) * sin(horizontalAngle), + sin(verticalAngle), + cos(verticalAngle) * cos(horizontalAngle)); + glm::vec3 right(sin(horizontalAngle - 3.14f / 2.0f), 0, + cos(horizontalAngle - 3.14f / 2.0f)); + glm::vec3 up = glm::cross(right, direction); + + if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { + position += direction * deltaTime * speed; + } + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { + position -= direction * deltaTime * speed; + } + if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { + position += right * deltaTime * speed; + } + if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { + position -= right * deltaTime * speed; + } + + // float FOV = initialFOV; + // Disabled because unchanged + // glm_perspective(glm_rad(FOV), 4.0f/ 3.0f, 0.1f, 100.0f, projection); + glm::mat4 view = glm::lookAt(position, position + direction, up); + mvp = projection * view * model; + + // Send mega sigma MVP to the vertex shader (transformations for the win) + glUniformMatrix4fv(matrixID, 1, GL_FALSE, &mvp[0][0]); + + // DRAWING HAPPENS HERE + // Vertex Data + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); + + // UV Data + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, uvBuffer); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void *)0); + + // Normal Data + glEnableVertexAttribArray(2); + glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); + glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void *)0); + + // Index buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer); + + glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, (void *)0); + + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(2); + + ImGui::Render(); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + // Swap buffers + glfwSwapBuffers(window); + glfwPollEvents(); + + lastTime = currentTime; // Count total frame time + } + + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glDeleteBuffers(1, &vertexBuffer); + glDeleteBuffers(1, &uvBuffer); + glDeleteBuffers(1, &normalBuffer); + glDeleteBuffers(1, &elementBuffer); + glDeleteProgram(programID); + glDeleteTextures(1, &texture); + glDeleteVertexArrays(1, &vertexArrayID); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} + +int main() { return initWindow(); } diff --git a/include/SOIL2 b/include/SOIL2 new file mode 160000 index 0000000..2293246 --- /dev/null +++ b/include/SOIL2 @@ -0,0 +1 @@ +Subproject commit 229324688c26f1e31da0171f3f5193f12253619e diff --git a/include/assimp b/include/assimp new file mode 160000 index 0000000..1d99895 --- /dev/null +++ b/include/assimp @@ -0,0 +1 @@ +Subproject commit 1d99895e91829296c0ddfd06176735ccec313c34 diff --git a/include/glew b/include/glew new file mode 160000 index 0000000..b323ebf --- /dev/null +++ b/include/glew @@ -0,0 +1 @@ +Subproject commit b323ebf9adeae6a3f26f91277d4f62df509037fc diff --git a/include/glfw b/include/glfw new file mode 160000 index 0000000..b35641f --- /dev/null +++ b/include/glfw @@ -0,0 +1 @@ +Subproject commit b35641f4a3c62aa86a0b3c983d163bc0fe36026d diff --git a/include/glm b/include/glm new file mode 160000 index 0000000..33b4a62 --- /dev/null +++ b/include/glm @@ -0,0 +1 @@ +Subproject commit 33b4a621a697a305bc3a7610d290677b96beb181 diff --git a/include/imgui b/include/imgui new file mode 160000 index 0000000..cb16568 --- /dev/null +++ b/include/imgui @@ -0,0 +1 @@ +Subproject commit cb16568fca5297512ff6a8f3b877f461c4323fbe diff --git a/models/model.obj b/models/model.obj new file mode 100644 index 0000000..e081595 --- /dev/null +++ b/models/model.obj @@ -0,0 +1,197 @@ +# Blender 4.2.2 LTS +# www.blender.org +o Cone +v 0.000000 -1.000000 -1.000000 +v 0.195090 -1.000000 -0.980785 +v 0.382683 -1.000000 -0.923880 +v 0.555570 -1.000000 -0.831470 +v 0.707107 -1.000000 -0.707107 +v 0.831470 -1.000000 -0.555570 +v 0.923880 -1.000000 -0.382683 +v 0.980785 -1.000000 -0.195090 +v 1.000000 -1.000000 0.000000 +v 0.980785 -1.000000 0.195090 +v 0.923880 -1.000000 0.382683 +v 0.831470 -1.000000 0.555570 +v 0.707107 -1.000000 0.707107 +v 0.555570 -1.000000 0.831470 +v 0.382683 -1.000000 0.923880 +v 0.195090 -1.000000 0.980785 +v 0.000000 -1.000000 1.000000 +v -0.195090 -1.000000 0.980785 +v -0.382683 -1.000000 0.923880 +v -0.555570 -1.000000 0.831470 +v -0.707107 -1.000000 0.707107 +v -0.831470 -1.000000 0.555570 +v -0.923880 -1.000000 0.382683 +v -0.980785 -1.000000 0.195090 +v -1.000000 -1.000000 0.000000 +v -0.980785 -1.000000 -0.195090 +v -0.923880 -1.000000 -0.382683 +v -0.831470 -1.000000 -0.555570 +v -0.707107 -1.000000 -0.707107 +v -0.555570 -1.000000 -0.831470 +v -0.382683 -1.000000 -0.923880 +v -0.195090 -1.000000 -0.980785 +v 0.000000 1.000000 0.000000 +vn 0.0878 0.4455 -0.8910 +vn 0.2599 0.4455 -0.8567 +vn 0.4220 0.4455 -0.7896 +vn 0.5680 0.4455 -0.6921 +vn 0.6921 0.4455 -0.5680 +vn 0.7896 0.4455 -0.4220 +vn 0.8567 0.4455 -0.2599 +vn 0.8910 0.4455 -0.0878 +vn 0.8910 0.4455 0.0878 +vn 0.8567 0.4455 0.2599 +vn 0.7896 0.4455 0.4220 +vn 0.6921 0.4455 0.5680 +vn 0.5680 0.4455 0.6921 +vn 0.4220 0.4455 0.7896 +vn 0.2599 0.4455 0.8567 +vn 0.0878 0.4455 0.8910 +vn -0.0878 0.4455 0.8910 +vn -0.2599 0.4455 0.8567 +vn -0.4220 0.4455 0.7896 +vn -0.5680 0.4455 0.6921 +vn -0.6921 0.4455 0.5680 +vn -0.7896 0.4455 0.4220 +vn -0.8567 0.4455 0.2599 +vn -0.8910 0.4455 0.0878 +vn -0.8910 0.4455 -0.0878 +vn -0.8567 0.4455 -0.2599 +vn -0.7896 0.4455 -0.4220 +vn -0.6921 0.4455 -0.5680 +vn -0.5680 0.4455 -0.6921 +vn -0.4220 0.4455 -0.7896 +vn -0.0000 -1.0000 -0.0000 +vn -0.2599 0.4455 -0.8567 +vn -0.0878 0.4455 -0.8910 +vt 0.501953 1.013587 +vt 0.501953 0.501953 +vt 0.601768 1.003756 +vt 0.697747 0.974641 +vt 0.786201 0.927361 +vt 0.863733 0.863733 +vt 0.927361 0.786201 +vt 0.974641 0.697747 +vt 1.003756 0.601768 +vt 1.013587 0.501953 +vt 1.003756 0.402138 +vt 0.974641 0.306159 +vt 0.927361 0.217705 +vt 0.863733 0.140174 +vt 0.786201 0.076546 +vt 0.697747 0.029266 +vt 0.601768 0.000151 +vt 0.501953 -0.009680 +vt 0.402138 0.000151 +vt 0.306159 0.029266 +vt 0.217705 0.076546 +vt 0.140174 0.140174 +vt 0.076546 0.217705 +vt 0.029266 0.306159 +vt 0.000151 0.402138 +vt -0.009680 0.501953 +vt 0.000151 0.601768 +vt 0.029266 0.697747 +vt 0.076546 0.786201 +vt 0.140174 0.863733 +vt 0.217705 0.927361 +vt 0.306159 0.974641 +vt 0.327532 0.912128 +vt 0.921894 0.643171 +vt 0.652937 0.048809 +vt 0.402138 1.003756 +vt 0.565598 0.025362 +vt 0.475363 0.019404 +vt 0.385699 0.031164 +vt 0.300053 0.060191 +vt 0.221715 0.105369 +vt 0.153697 0.164962 +vt 0.098611 0.236680 +vt 0.058575 0.317766 +vt 0.035127 0.405105 +vt 0.029169 0.495340 +vt 0.040930 0.585004 +vt 0.069957 0.670650 +vt 0.115135 0.748988 +vt 0.174728 0.817007 +vt 0.246445 0.872092 +vt 0.414871 0.935576 +vt 0.505106 0.941534 +vt 0.594769 0.929773 +vt 0.680416 0.900746 +vt 0.758753 0.855568 +vt 0.826772 0.795975 +vt 0.881858 0.724258 +vt 0.945341 0.555833 +vt 0.951299 0.465597 +vt 0.939539 0.375934 +vt 0.910512 0.290288 +vt 0.865334 0.211950 +vt 0.805741 0.143931 +vt 0.734023 0.088845 +s 0 +f 1/1/1 33/2/1 2/3/1 +f 2/3/2 33/2/2 3/4/2 +f 3/4/3 33/2/3 4/5/3 +f 4/5/4 33/2/4 5/6/4 +f 5/6/5 33/2/5 6/7/5 +f 6/7/6 33/2/6 7/8/6 +f 7/8/7 33/2/7 8/9/7 +f 8/9/8 33/2/8 9/10/8 +f 9/10/9 33/2/9 10/11/9 +f 10/11/10 33/2/10 11/12/10 +f 11/12/11 33/2/11 12/13/11 +f 12/13/12 33/2/12 13/14/12 +f 13/14/13 33/2/13 14/15/13 +f 14/15/14 33/2/14 15/16/14 +f 15/16/15 33/2/15 16/17/15 +f 16/17/16 33/2/16 17/18/16 +f 17/18/17 33/2/17 18/19/17 +f 18/19/18 33/2/18 19/20/18 +f 19/20/19 33/2/19 20/21/19 +f 20/21/20 33/2/20 21/22/20 +f 21/22/21 33/2/21 22/23/21 +f 22/23/22 33/2/22 23/24/22 +f 23/24/23 33/2/23 24/25/23 +f 24/25/24 33/2/24 25/26/24 +f 25/26/25 33/2/25 26/27/25 +f 26/27/26 33/2/26 27/28/26 +f 27/28/27 33/2/27 28/29/27 +f 28/29/28 33/2/28 29/30/28 +f 29/30/29 33/2/29 30/31/29 +f 30/31/30 33/2/30 31/32/30 +f 16/33/31 24/34/31 32/35/31 +f 31/32/32 33/2/32 32/36/32 +f 32/36/33 33/2/33 1/1/33 +f 32/35/31 1/37/31 2/38/31 +f 2/38/31 3/39/31 4/40/31 +f 4/40/31 5/41/31 6/42/31 +f 6/42/31 7/43/31 8/44/31 +f 8/44/31 9/45/31 10/46/31 +f 10/46/31 11/47/31 12/48/31 +f 12/48/31 13/49/31 14/50/31 +f 14/50/31 15/51/31 16/33/31 +f 16/33/31 17/52/31 18/53/31 +f 18/53/31 19/54/31 20/55/31 +f 20/55/31 21/56/31 22/57/31 +f 22/57/31 23/58/31 24/34/31 +f 24/34/31 25/59/31 26/60/31 +f 26/60/31 27/61/31 28/62/31 +f 28/62/31 29/63/31 30/64/31 +f 30/64/31 31/65/31 32/35/31 +f 32/35/31 2/38/31 8/44/31 +f 2/38/31 4/40/31 8/44/31 +f 4/40/31 6/42/31 8/44/31 +f 8/44/31 10/46/31 16/33/31 +f 10/46/31 12/48/31 16/33/31 +f 12/48/31 14/50/31 16/33/31 +f 16/33/31 18/53/31 24/34/31 +f 18/53/31 20/55/31 24/34/31 +f 20/55/31 22/57/31 24/34/31 +f 24/34/31 26/60/31 32/35/31 +f 26/60/31 28/62/31 32/35/31 +f 28/62/31 30/64/31 32/35/31 +f 32/35/31 8/44/31 16/33/31 diff --git a/shader.c b/shader.c new file mode 100644 index 0000000..3d169bc --- /dev/null +++ b/shader.c @@ -0,0 +1,96 @@ +#include +#include + +#include +#include +#include + +GLuint loadShaders(const char *vertex_file_path, + const char *fragment_file_path) { + GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + + FILE *vertexShaderFD; + vertexShaderFD = fopen(vertex_file_path, "rb"); + if (vertexShaderFD == NULL) { + fclose(vertexShaderFD); + fprintf(stderr, "Failed to open Vertex Shader"); + return 1; + } + int vertexShaderLength = lseek(fileno(vertexShaderFD), 0L, SEEK_END) + 1; + fseek(vertexShaderFD, 0L, SEEK_SET); + char *vertexShaderCode = (char *)calloc(vertexShaderLength, sizeof(char)); + fread(vertexShaderCode, sizeof(*vertexShaderCode), vertexShaderLength, + vertexShaderFD); + fclose(vertexShaderFD); + + FILE *fragmentShaderFD; + fragmentShaderFD = fopen(fragment_file_path, "rb"); + if (fragmentShaderFD == NULL) { + fclose(fragmentShaderFD); + fprintf(stderr, "Failed to open Fragment Shader"); + return 1; + } + int fragmentShaderLength = lseek(fileno(fragmentShaderFD), 0L, SEEK_END) + 1; + fseek(fragmentShaderFD, 0L, SEEK_SET); + char *fragmentShaderCode = (char *)calloc(fragmentShaderLength, sizeof(char)); + fread(fragmentShaderCode, sizeof(*fragmentShaderCode), fragmentShaderLength, + fragmentShaderFD); + fclose(fragmentShaderFD); + + GLint result = GL_FALSE; + int infoLogLength; + + printf("Compiling shader: %s\n", vertex_file_path); + char const *vertexShaderCodeConst = vertexShaderCode; + glShaderSource(vertexShaderID, 1, &vertexShaderCodeConst, NULL); + glCompileShader(vertexShaderID); + + glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + char *vertexShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, + *vertexShaderErrorMessage); + printf("%s\n", *vertexShaderErrorMessage); + } + + printf("Compiling shader: %s\n", fragment_file_path); + char const *fragmentShaderCodeConst = fragmentShaderCode; + glShaderSource(fragmentShaderID, 1, &fragmentShaderCodeConst, NULL); + glCompileShader(fragmentShaderID); + + glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + char *fragmentShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, + *fragmentShaderErrorMessage); + printf("%s\n", *fragmentShaderErrorMessage); + } + + printf("Linking program\n"); + GLuint programID = glCreateProgram(); + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); + + glGetProgramiv(programID, GL_COMPILE_STATUS, &result); + glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + char *programErrorMessage[infoLogLength + 1]; + glGetProgramInfoLog(programID, infoLogLength, NULL, *programErrorMessage); + printf("%s\n", *programErrorMessage); + } + + glDetachShader(programID, vertexShaderID); + glDetachShader(programID, fragmentShaderID); + + glDeleteShader(vertexShaderID); + glDeleteShader(fragmentShaderID); + + free(vertexShaderCode); + free(fragmentShaderCode); + + return programID; +} diff --git a/shader.h b/shader.h new file mode 100644 index 0000000..6bfecb9 --- /dev/null +++ b/shader.h @@ -0,0 +1,11 @@ +#ifndef LOAD_SHADERS_H +#define LOAD_SHADERS_H + +#include +#include +#include + +GLuint loadShaders(const char *vertex_file_path, + const char *fragment_file_path); + +#endif diff --git a/shaders/shader.frag b/shaders/shader.frag new file mode 100644 index 0000000..b05318b --- /dev/null +++ b/shaders/shader.frag @@ -0,0 +1,14 @@ +#version 330 core + +// Interpolated vals from vert shaders +in vec2 UV; + +out vec3 color; + +// Values stay constant +uniform sampler2D textureSampler; + +void main() { + color = texture(textureSampler, UV).rgb; + //color = vec3(1, 1, 1); +} diff --git a/shaders/shader.vert b/shaders/shader.vert new file mode 100644 index 0000000..e75cdc8 --- /dev/null +++ b/shaders/shader.vert @@ -0,0 +1,20 @@ +#version 330 core + +layout(location = 0) in vec3 vertexPosition_modelspace; +layout(location = 1) in vec2 vertexUV; + +// To the frag shader +out vec2 UV; + +// Model view projection from the CPU +uniform mat4 MVP; + +void main() { + gl_Position = MVP * vec4(vertexPosition_modelspace, 1); + + vec2 UV_FLIPPED; + UV_FLIPPED.x = vertexUV.x; + UV_FLIPPED.y = 1.0 - vertexUV.y; + + UV = vertexUV; +} diff --git a/textures/fred.cprj b/textures/fred.cprj new file mode 100644 index 0000000..813ded2 --- /dev/null +++ b/textures/fred.cprj @@ -0,0 +1,41 @@ + + + + + //wsl.localhost/Fedora/home/fedora/fred/textures/texture.bmp + //wsl.localhost/Fedora/home/fedora/fred/textures/results/texture_BMP_DXT3_2.DDS + DXT3 + 0.2 + 0.3086 + 0.6094 + 0.082 + 0 + 0 + 8.00 + + + //wsl.localhost/Fedora/home/fedora/fred/textures/texture.bmp + //wsl.localhost/Fedora/home/fedora/fred/textures/results/texture_BMP_DXT5_3.DDS + DXT5 + 0.05 + 0.3086 + 0.6094 + 0.082 + 0 + 0 + 8.00 + + + //wsl.localhost/Fedora/home/fedora/fred/textures/texture.bmp + //wsl.localhost/Fedora/home/fedora/fred/textures/results/texture_BMP_DXT1_1.DDS + DXT1 + 0.05 + 0.3086 + 0.6094 + 0.082 + 0 + 0 + 8.00 + + + \ No newline at end of file diff --git a/textures/results/texture_BMP_DXT1_1.DDS b/textures/results/texture_BMP_DXT1_1.DDS new file mode 100644 index 0000000..e23b4ee Binary files /dev/null and b/textures/results/texture_BMP_DXT1_1.DDS differ diff --git a/textures/results/texture_BMP_DXT3_2.DDS b/textures/results/texture_BMP_DXT3_2.DDS new file mode 100644 index 0000000..064e277 Binary files /dev/null and b/textures/results/texture_BMP_DXT3_2.DDS differ diff --git a/textures/results/texture_BMP_DXT5_3.DDS b/textures/results/texture_BMP_DXT5_3.DDS new file mode 100644 index 0000000..e46c604 Binary files /dev/null and b/textures/results/texture_BMP_DXT5_3.DDS differ diff --git a/textures/texture.bmp b/textures/texture.bmp new file mode 100644 index 0000000..a3e30c4 Binary files /dev/null and b/textures/texture.bmp differ