cmake_minimum_required(VERSION 3.25) project(shader-automaton) set(CMAKE_CXX_STANDARD 23) set(VERBOSE yes) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(glfw3 3.3 REQUIRED) include(FetchContent) include(EmbedResources.cmake) FetchContent_Declare( perlin GIT_REPOSITORY https://github.com/Reputeless/PerlinNoise.git GIT_TAG bdf39fe92b2a585cdef485bcec2bca8ab5614095 ) FetchContent_Declare( imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG 70cca1eac07aa3809bdd3717253c3754a5b7cfcc ) FetchContent_Declare( gtest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG bc860af08783b8113005ca7697da5f5d49a8056f ) FetchContent_Declare( dejavufonts URL https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2 URL_HASH SHA1=7fa15e7b9676fc3915338c41e76ad454c344fff5 ) FetchContent_MakeAvailable(perlin) FetchContent_MakeAvailable(imgui) add_executable(shader-automaton src/main.cpp src/options.cpp src/colormaps/viridis.cpp src/rule_presets.cpp src/argparser.h src/rule_presets.h src/options.h src/shader-helper.cpp src/shader-helper.h src/color.cpp src/color.h src/colormaps/colormaps.cpp src/colormaps/dualcolor.cpp src/colormaps/viridis.cpp src/colormaps/rainbow.cpp src/program.cpp src/program.h ) target_compile_definitions(shader-automaton PRIVATE PROGRAM_NAME="${CMAKE_PROJECT_NAME}" PROGRAM_VERSION="${CMAKE_PROJECT_VERSION}") function(preprocess_shader name) add_custom_command( OUTPUT "preprocessed-shaders/${name}" COMMAND ./preprocess-shader.sh "${name}" DEPENDS "shaders/${name}" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" PRE_BUILD VERBATIM ) endfunction() preprocess_shader("automaton.comp") preprocess_shader("automaton.vert") preprocess_shader("automaton.frag") # TODO: this whole shader preprocessing and embedding is just broken # it happens half at configure time rather than build time so the preprocessed files are outdated # TODO: maybe rewrite this tool to put multiple namespaces into one target # and to maybe define the contents separately from the target, if possible add_embedded_binary_resources( shader-automaton-shaders OUT_DIR embedded-resources HEADER shaders.h NAMESPACE resources::shaders RESOURCE_NAMES automaton_comp automaton_vert automaton_frag RESOURCES "${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.comp" "${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.vert" "${PROJECT_SOURCE_DIR}/preprocessed-shaders/automaton.frag" ) FetchContent_MakeAvailable(dejavufonts) add_embedded_binary_resources( shader-automaton-fonts OUT_DIR embedded-resources HEADER fonts.h NAMESPACE resources::fonts RESOURCE_NAMES DejaVuSansMono RESOURCES "${dejavufonts_SOURCE_DIR}/ttf/DejaVuSansMono.ttf" ) target_link_libraries(shader-automaton OpenGL::GL GLEW::GLEW glfw shader-automaton-shaders shader-automaton-fonts) file(COPY_FILE "${perlin_SOURCE_DIR}/PerlinNoise.hpp" "${perlin_BINARY_DIR}/PerlinNoise.hpp") target_include_directories(shader-automaton PRIVATE ${perlin_BINARY_DIR}) target_include_directories(shader-automaton PRIVATE "${imgui_SOURCE_DIR}/backends" "${imgui_SOURCE_DIR}") target_sources(shader-automaton PRIVATE ${imgui_SOURCE_DIR}/imgui.cpp ${imgui_SOURCE_DIR}/imgui_demo.cpp ${imgui_SOURCE_DIR}/imgui_draw.cpp ${imgui_SOURCE_DIR}/imgui_tables.cpp ${imgui_SOURCE_DIR}/imgui_widgets.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp ) enable_testing() FetchContent_MakeAvailable(gtest) include(GoogleTest) add_executable(ColorTest tests/color.cpp src/color.cpp) target_link_libraries(ColorTest GTest::gtest_main) target_include_directories(ColorTest PRIVATE src) gtest_discover_tests(ColorTest)