diff --git a/CMakeLists.txt b/CMakeLists.txt index 44bca57..32c5cdc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.21) project(toddcox-visualize) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) include(FetchContent) @@ -14,33 +14,8 @@ include(External/imgui.cmake) include(External/json.cmake) include(External/peglib.cmake) -#include_directories(include) +include(embed.cmake) enable_testing() add_subdirectory(tc) add_subdirectory(vis) - -#add_custom_target(resources DEPENDS resources_output) -#add_custom_command( -# OUTPUT resources_output -# COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${CMAKE_CURRENT_BINARY_DIR}/res -# COMMENT "Copying Resources") -# -#add_executable(vis -# src/main.cpp -# src/gl/debug.hpp -# src/gl/shader.hpp -# src/gl/buffer.hpp -# src/gl/vertexarray.hpp -# src/gl/types.hpp) -#target_link_libraries(vis glfw glad imgui eigen nlohmann_json) -#add_dependencies(vis resources) - -#add_executable(serial src/serialtest.cpp) -#target_link_libraries(serial eigen nlohmann_json) - -#add_executable(combotest src/combotest.cpp) -#target_link_libraries(combotest eigen tc) - -#add_executable(geometrytest src/geometrytest.cpp) -#target_link_libraries(geometrytest eigen tc nlohmann_json) diff --git a/embed.cmake b/embed.cmake new file mode 100644 index 0000000..b69fbc5 --- /dev/null +++ b/embed.cmake @@ -0,0 +1,91 @@ +find_program(EMBED_LD ${CMAKE_LINKER}) +find_program(EMBED_OBJCOPY ${CMAKE_OBJCOPY}) + +function(_generate_embed_source EMBED_NAME) + set(options) + set(oneValueArgs SOURCE HEADER) + set(multiValueArgs FILES SYMBOLS) + cmake_parse_arguments(PARSE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + set(VIEW_DECLARATIONS) + set(VOID_DECLARATIONS) + set(DEFINITIONS) + + foreach (FILE SYMBOL IN ZIP_LISTS PARSE_FILES PARSE_SYMBOLS) + get_filename_component(FILE_NAME "${FILE}" NAME) + string(MAKE_C_IDENTIFIER "${FILE_NAME}" IDENTIFIER) + + set(START_SYMBOL "_binary_${SYMBOL}_start") + set(END_SYMBOL "_binary_${SYMBOL}_end") + + string(APPEND VIEW_DECLARATIONS + " /// ${FILE} Text Contents\n" + " extern std::string_view const ${IDENTIFIER};\n") + + string(APPEND VOID_DECLARATIONS + " /// ${FILE} Binary Contents\n" + " extern void* const ${IDENTIFIER};\n") + + string(APPEND DEFINITIONS + "// ${IDENTIFIER} (${FILE})\n" + "extern \"C\" const char ${START_SYMBOL}[], ${END_SYMBOL}[];\n" + "std::string_view const ${EMBED_NAME}::${IDENTIFIER}(${START_SYMBOL}, ${END_SYMBOL});\n" + "void* const ${EMBED_NAME}::bin::${IDENTIFIER} = (void *) ${START_SYMBOL};\n\n") + endforeach () + + file(WRITE "${PARSE_HEADER}" + "#pragma once\n" + "#include \n\n" + "namespace ${EMBED_NAME} {\n${VIEW_DECLARATIONS}}\n\n" + "namespace ${EMBED_NAME}::bin {\n${VOID_DECLARATIONS}}\n") + + file(WRITE "${PARSE_SOURCE}" + "#include <${EMBED_NAME}.hpp>\n\n" + "${DEFINITIONS}") +endfunction() + +function(_embed_file OUTPUT_OBJECT OUTPUT_SYMBOL FILE) + set(OBJECT "${CMAKE_CURRENT_BINARY_DIR}/${FILE}.o") + string(MAKE_C_IDENTIFIER "${FILE}" SYMBOL) + + set(${OUTPUT_OBJECT} ${OBJECT} PARENT_SCOPE) + set(${OUTPUT_SYMBOL} ${SYMBOL} PARENT_SCOPE) + + add_custom_command( + COMMENT "Embedding ${FILE} in ${OBJECT}" + OUTPUT "${FILE}.o" DEPENDS "${FILE}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMAND ${EMBED_LD} -r -o "${OBJECT}" -z noexecstack --format=binary "${FILE}" + COMMAND ${EMBED_OBJCOPY} --rename-section .data=.rodata,alloc,load,readonly,data,contents "${OBJECT}" + VERBATIM + ) +endfunction() + +function(add_embed_library EMBED_NAME) + set(FILES ${ARGN}) + + set(EMBED_ROOT ${CMAKE_CURRENT_BINARY_DIR}/_embed/${EMBED_NAME}) + set(EMBED_SOURCE "${EMBED_ROOT}/${EMBED_NAME}.cpp") + set(EMBED_INCLUDE "${EMBED_ROOT}/include") + set(EMBED_HEADER "${EMBED_INCLUDE}/${EMBED_NAME}.hpp") + + set(OBJECTS) + set(SYMBOLS) + foreach (FILE ${ARGN}) + _embed_file(OBJECT SYMBOL ${FILE}) + list(APPEND OBJECTS ${OBJECT}) + list(APPEND SYMBOLS ${SYMBOL}) + endforeach () + + message(STATUS "Generating embedding library ${EMBED_NAME}") + _generate_embed_source( + ${EMBED_NAME} + SOURCE ${EMBED_SOURCE} + HEADER ${EMBED_HEADER} + FILES ${FILES} + SYMBOLS ${SYMBOLS}) + + add_library(${EMBED_NAME} STATIC ${OBJECTS} "${EMBED_SOURCE}") + target_include_directories(${EMBED_NAME} PUBLIC "${EMBED_INCLUDE}") + set_target_properties(${EMBED_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +endfunction() diff --git a/vis/CMakeLists.txt b/vis/CMakeLists.txt index af70fa4..8d5926c 100644 --- a/vis/CMakeLists.txt +++ b/vis/CMakeLists.txt @@ -1,8 +1,4 @@ -add_custom_target(resources DEPENDS resources_output) -add_custom_command( - OUTPUT resources_output - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${CMAKE_CURRENT_BINARY_DIR}/res - COMMENT "Copying Resources") +add_subdirectory(shaders) add_executable(vis src/main.cpp @@ -15,6 +11,6 @@ target_link_libraries(vis imgui eigen nlohmann_json + shaders ) target_include_directories(vis PUBLIC include) -add_dependencies(vis resources) diff --git a/vis/include/gl/shader.hpp b/vis/include/gl/shader.hpp index 70111fa..5eb0c79 100644 --- a/vis/include/gl/shader.hpp +++ b/vis/include/gl/shader.hpp @@ -23,6 +23,17 @@ public: // todo throw if compile failed } + explicit Shader(const std::string_view &src) { + id = glCreateShader(mode); + + const char *str = src.data(); + const GLint length = (GLint) src.length(); + glShaderSource(id, 1, &str, &length); + glCompileShader(id); + + // todo throw if compile failed + } + explicit Shader(std::ifstream source) : Shader(std::string( std::istreambuf_iterator(source), diff --git a/vis/shaders/CMakeLists.txt b/vis/shaders/CMakeLists.txt new file mode 100644 index 0000000..f8c51c8 --- /dev/null +++ b/vis/shaders/CMakeLists.txt @@ -0,0 +1,4 @@ +add_embed_library(shaders + main-4d.vert.glsl + main.vert.glsl + main.frag.glsl) \ No newline at end of file diff --git a/vis/res/shaders/4d.vert.glsl b/vis/shaders/main-4d.vert.glsl similarity index 100% rename from vis/res/shaders/4d.vert.glsl rename to vis/shaders/main-4d.vert.glsl diff --git a/vis/res/shaders/main.frag.glsl b/vis/shaders/main.frag.glsl similarity index 100% rename from vis/res/shaders/main.frag.glsl rename to vis/shaders/main.frag.glsl diff --git a/vis/res/shaders/main.vert.glsl b/vis/shaders/main.vert.glsl similarity index 100% rename from vis/res/shaders/main.vert.glsl rename to vis/shaders/main.vert.glsl diff --git a/vis/src/render/pointrender.hpp b/vis/src/render/pointrender.hpp index 55a9c16..22873a8 100644 --- a/vis/src/render/pointrender.hpp +++ b/vis/src/render/pointrender.hpp @@ -7,6 +7,8 @@ #include +#include + struct State { Eigen::Vector4f bg{0.16, 0.16, 0.16, 1.00}; Eigen::Vector4f fg{0.71, 0.53, 0.94, 1.00}; @@ -39,8 +41,8 @@ template struct PointRenderer { using Vertex = V_; - VertexShader vs{std::ifstream("res/shaders/main.vert.glsl")}; - FragmentShader fs{std::ifstream("res/shaders/main.frag.glsl")}; + VertexShader vs{shaders::main_vert_glsl}; + FragmentShader fs{shaders::main_frag_glsl}; Program pgm{vs, fs};