diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..37ee4d0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dependencies/microtar"] + path = dependencies/microtar + url = https://github.com/MrLetsplay2003/microtar.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 97257cb..50f90e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,23 +3,54 @@ cmake_minimum_required(VERSION 3.10) project(KekEngine VERSION 1.0) option(BUILD_SHARED_LIBS "Build as a shared library" ON) +option(KEKENGINE_DEBUG "Build with debug information" OFF) +option(KEKENGINE_BUILD_KEKGAME "Build kekgame" OFF) -file(GLOB KEKENGINE_SOURCE_FILES "src/kekengine/cpp/*.cpp") -file(GLOB KEKGAME_SOURCE_FILES "src/kekgame/cpp/*.cpp") +message("Build shared libs: ${BUILD_SHARED_LIBS}") +message("Debug: ${KEKENGINE_DEBUG}") +message("Build kekgame: ${KEKENGINE_BUILD_KEKGAME}") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(KEKENGINE_RESOURCE_DIR "${CMAKE_SOURCE_DIR}/src/kekengine/res") +set(KEKGAME_RESOURCE_DIR "${CMAKE_SOURCE_DIR}/src/kekgame/res") + +file(GLOB KEKENGINE_SOURCE_FILES "src/kekengine/cpp/*.cpp") +file(GLOB_RECURSE KEKENGINE_RESOURCE_FILES "${KEKENGINE_RESOURCE_DIR}/*") +file(GLOB_RECURSE KEKENGINE_RELATIVE_RESOURCE_FILES RELATIVE ${KEKENGINE_RESOURCE_DIR} "${KEKENGINE_RESOURCE_DIR}/*") + +file(GLOB KEKGAME_SOURCE_FILES "src/kekgame/cpp/*.cpp") +file(GLOB_RECURSE KEKGAME_RESOURCE_FILES "${KEKGAME_RESOURCE_DIR}/*") +file(GLOB_RECURSE KEKGAME_RELATIVE_RESOURCE_FILES RELATIVE ${KEKGAME_RESOURCE_DIR} "${KEKGAME_RESOURCE_DIR}/*") + add_compile_definitions(FT_CONFIG_OPTION_ERROR_STRINGS) # Freetype error strings -add_compile_options(-Wall -g) +if(${KEKENGINE_DEBUG}) + add_compile_options(-Wall -g) + message("Compiler flags A") +else() + add_compile_options(-Wall -O3) + message("Compiler flags B") +endif() + + +add_subdirectory(dependencies/microtar) + +# kekengine resources +add_custom_target(kekengine_res ALL DEPENDS ${KEKENGINE_RESOURCE_FILES}) + +add_custom_command(TARGET kekengine_res PRE_BUILD + BYPRODUCTS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources.tar + COMMAND ${CMAKE_COMMAND} -E + chdir ${KEKENGINE_RESOURCE_DIR} + tar cf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources.tar ${KEKENGINE_RELATIVE_RESOURCE_FILES}) # libkekengine - add_library(kekengine ${KEKENGINE_SOURCE_FILES}) -target_link_libraries(kekengine PUBLIC glfw GLEW GL) +target_link_libraries(kekengine PUBLIC glfw GLEW GL microtar) target_include_directories(kekengine PRIVATE "src/kekengine/include") target_compile_definitions(kekengine PUBLIC KEKENGINE_TARGET_LINUX) @@ -28,9 +59,18 @@ pkg_check_modules(GTK3 REQUIRED gtk+-3.0) target_link_libraries(kekengine PUBLIC ${GTK3_LIBRARIES}) target_include_directories(kekengine PRIVATE ${GTK3_INCLUDE_DIRS}) -# kekgame +# kekgame resources +add_custom_target(kekgame_res ALL + DEPENDS ${KEKGAME_RESOURCE_FILES} kekengine_res) +add_custom_command(TARGET kekgame_res PRE_BUILD + BYPRODUCTS ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources.tar + COMMAND ${CMAKE_COMMAND} -E + chdir ${KEKGAME_RESOURCE_DIR} + tar rf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/resources.tar ${KEKGAME_RELATIVE_RESOURCE_FILES}) + +# kekgame add_executable(kekgame ${KEKGAME_SOURCE_FILES}) target_link_libraries(kekgame PUBLIC kekengine) -target_include_directories(kekgame PRIVATE "src/kekengine/include") \ No newline at end of file +target_include_directories(kekgame PRIVATE "src/kekengine/include") diff --git a/dependencies/microtar b/dependencies/microtar new file mode 160000 index 0000000..b240d95 --- /dev/null +++ b/dependencies/microtar @@ -0,0 +1 @@ +Subproject commit b240d953b12dc87c625743a9fb55634b0f0f3608 diff --git a/src/kekengine/cpp/kekengine.cpp b/src/kekengine/cpp/kekengine.cpp index c73b0fb..c0ac8a9 100644 --- a/src/kekengine/cpp/kekengine.cpp +++ b/src/kekengine/cpp/kekengine.cpp @@ -119,8 +119,13 @@ int init() { glEnable(GL_DEPTH_TEST); glEnable(GL_MULTISAMPLE); - //glEnable(GL_CULL_FACE); - //glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + if(Resource::init() != KEK_SUCCESS) { + glfwTerminate(); + return KEK_ERROR; + } glfwSetCursorPosCallback(window, onCursorPosCallback); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); @@ -129,10 +134,9 @@ int init() { cam = new Camera(); - kek::MemoryBuffer *buf = kek::Resource::loadResource("../src/res/object/sphere/Sphere.obj"); - if(!buf) std::cout << "err buf" << std::endl; - kek::Mesh *mesh = kek::ObjParser::parse(buf); - kek::Shader *shader = new kek::Shader("../src/res/shader/mesh/vertex.glsl", "../src/res/shader/mesh/fragment.glsl"); + MemoryBuffer *buf = Resource::loadResource("object/sphere/Sphere.obj"); + Mesh *mesh = ObjParser::parse(buf); + Shader *shader = new Shader("shader/mesh/vertex.glsl", "shader/mesh/fragment.glsl"); while(1) { // Clear the screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/src/kekengine/cpp/objparser.cpp b/src/kekengine/cpp/objparser.cpp index 1b2685e..d58dc46 100644 --- a/src/kekengine/cpp/objparser.cpp +++ b/src/kekengine/cpp/objparser.cpp @@ -74,10 +74,6 @@ Mesh *parse(MemoryBuffer *buf) { } } - for(glm::vec3 v : vertexNormals) { - std::cout << v.x << " " << v.y << " " << v.z << std::endl; - } - return new Mesh(vertices, indices); } diff --git a/src/kekengine/cpp/resource.cpp b/src/kekengine/cpp/resource.cpp index c6a8b0e..a69f5a4 100644 --- a/src/kekengine/cpp/resource.cpp +++ b/src/kekengine/cpp/resource.cpp @@ -1,8 +1,29 @@ #include "resource.h" +#include "constants.h" +#include "errordialog.h" + +#include "microtar.h" + namespace kek::Resource { -MemoryBuffer *loadResource(std::string path) { +static mtar_t resources; + +int init() { + int r = mtar_open(&resources, "resources.tar", "r"); + if(r != MTAR_ESUCCESS) { + ErrorDialog::showError("Failed to open resources.tar: " + std::string(mtar_strerror(r))); + return KEK_ERROR; + } + + return KEK_SUCCESS; +} + +void exit() { + mtar_close(&resources); +} + +/*MemoryBuffer *loadResource(std::string path) { std::ifstream in = std::ifstream(path, std::ios::binary); if(!in.good()) return nullptr; in.ignore(std::numeric_limits::max()); @@ -12,6 +33,24 @@ MemoryBuffer *loadResource(std::string path) { char *data = (char *) malloc(size); in.read(data, size); return new MemoryBuffer(data, size); +}*/ + +MemoryBuffer *loadResource(std::string path) { + mtar_header_t h; + int r = mtar_find(&resources, path.c_str(), &h); + if(r != MTAR_ESUCCESS) { + if(r == MTAR_ENOTFOUND) std::cerr << "Failed to find resource '" << path << "': " << mtar_strerror(r) << std::endl; + return nullptr; + } + + void *buf = malloc(h.size); + r = mtar_read_data(&resources, buf, h.size); + if(r != MTAR_ESUCCESS) { + std::cerr << "Failed to read resource '" << path << "': " << mtar_strerror(r) << std::endl; + return nullptr; + } + + return new MemoryBuffer((char *) buf, h.size); } } diff --git a/src/kekengine/include/resource.h b/src/kekengine/include/resource.h index 3b7847c..4448fc2 100644 --- a/src/kekengine/include/resource.h +++ b/src/kekengine/include/resource.h @@ -7,6 +7,8 @@ namespace kek::Resource { +int init(); + MemoryBuffer *loadResource(std::string path); -} \ No newline at end of file +} diff --git a/src/res/shader/mesh/fragment.glsl b/src/kekengine/res/shader/mesh/fragment.glsl similarity index 100% rename from src/res/shader/mesh/fragment.glsl rename to src/kekengine/res/shader/mesh/fragment.glsl diff --git a/src/res/shader/mesh/vertex.glsl b/src/kekengine/res/shader/mesh/vertex.glsl similarity index 100% rename from src/res/shader/mesh/vertex.glsl rename to src/kekengine/res/shader/mesh/vertex.glsl diff --git a/src/res/object/cube/Cube.mtl b/src/kekgame/res/object/cube/Cube.mtl similarity index 100% rename from src/res/object/cube/Cube.mtl rename to src/kekgame/res/object/cube/Cube.mtl diff --git a/src/res/object/cube/Cube.obj b/src/kekgame/res/object/cube/Cube.obj similarity index 100% rename from src/res/object/cube/Cube.obj rename to src/kekgame/res/object/cube/Cube.obj diff --git a/src/res/object/sphere/Sphere.mtl b/src/kekgame/res/object/sphere/Sphere.mtl similarity index 100% rename from src/res/object/sphere/Sphere.mtl rename to src/kekgame/res/object/sphere/Sphere.mtl diff --git a/src/res/object/sphere/Sphere.obj b/src/kekgame/res/object/sphere/Sphere.obj similarity index 100% rename from src/res/object/sphere/Sphere.obj rename to src/kekgame/res/object/sphere/Sphere.obj