You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
354 lines
12 KiB
354 lines
12 KiB
# Project information
|
|
|
|
cmake_minimum_required(VERSION 3.20)
|
|
project(Minote
|
|
VERSION 0.0
|
|
DESCRIPTION "Modern action puzzle game"
|
|
LANGUAGES C CXX)
|
|
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
|
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
|
set(CMAKE_POLICY_DEFAULT_CMP0117 NEW)
|
|
set(CMAKE_C_STANDARD 11)
|
|
set(CMAKE_C_STANDARD_REQUIRED)
|
|
set(CMAKE_C_EXTENSIONS OFF)
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
# Build settings
|
|
|
|
add_compile_options("-march=x86-64;-mmmx;-msse;-msse2;-msse3;-mssse3;-msse4.1;-msse4.2;-mavx;-ffast-math")
|
|
|
|
add_compile_options("$<$<CONFIG:Debug,RelWithDebInfo>:-g;-Og>")
|
|
|
|
add_compile_options("$<$<CONFIG:RelWithDebInfo,Release>:-O3;-ffunction-sections;-Wl,--gc-sections>")
|
|
add_compile_options("$<$<CONFIG:Release>:-s>")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION "$<CONFIG:Release>")
|
|
|
|
if(WIN32)
|
|
add_compile_options("-mwindows")
|
|
endif()
|
|
|
|
set(BUILD_SHARED_LIBS OFF)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++")
|
|
|
|
# Main executable
|
|
|
|
add_executable(Minote
|
|
src/base/containers/hashmap.hpp
|
|
src/base/containers/vector.hpp
|
|
src/base/containers/string.hpp
|
|
src/base/containers/array.hpp
|
|
src/base/concepts.hpp
|
|
src/base/format.hpp
|
|
src/base/error.hpp
|
|
src/base/tween.hpp
|
|
src/base/types.hpp
|
|
src/base/math.hpp src/base/math.tpp
|
|
src/base/util.hpp
|
|
src/base/time.hpp
|
|
src/base/ease.hpp
|
|
src/base/log.hpp src/base/log.cpp
|
|
src/base/rng.hpp
|
|
src/base/id.hpp
|
|
src/tools/modelSchema.hpp
|
|
src/sys/window.hpp src/sys/window.cpp
|
|
src/sys/vulkan.hpp src/sys/vulkan.cpp
|
|
src/sys/system.hpp src/sys/system.cpp
|
|
src/gfx/resources/texture2dms.hpp src/gfx/resources/texture2dms.cpp
|
|
src/gfx/resources/texture3d.hpp src/gfx/resources/texture3d.cpp
|
|
src/gfx/resources/texture2d.hpp src/gfx/resources/texture2d.cpp
|
|
src/gfx/resources/cubemap.hpp src/gfx/resources/cubemap.cpp
|
|
src/gfx/resources/buffer.hpp src/gfx/resources/buffer.tpp
|
|
src/gfx/resources/pool.hpp
|
|
src/gfx/effects/cubeFilterCoeffs.hpp
|
|
src/gfx/effects/instanceList.hpp src/gfx/effects/instanceList.cpp
|
|
src/gfx/effects/quadBuffer.hpp src/gfx/effects/quadBuffer.cpp
|
|
src/gfx/effects/cubeFilter.hpp src/gfx/effects/cubeFilter.cpp
|
|
src/gfx/effects/visibility.hpp src/gfx/effects/visibility.cpp
|
|
src/gfx/effects/tonemap.hpp src/gfx/effects/tonemap.cpp
|
|
src/gfx/effects/bloom.hpp src/gfx/effects/bloom.cpp
|
|
src/gfx/effects/clear.hpp src/gfx/effects/clear.cpp
|
|
src/gfx/effects/bvh.hpp src/gfx/effects/bvh.cpp
|
|
src/gfx/effects/pbr.hpp src/gfx/effects/pbr.cpp
|
|
src/gfx/effects/sky.hpp src/gfx/effects/sky.cpp
|
|
src/gfx/effects/hiz.hpp src/gfx/effects/hiz.cpp
|
|
src/gfx/samplers.hpp
|
|
src/gfx/objects.hpp src/gfx/objects.cpp
|
|
src/gfx/models.hpp src/gfx/models.cpp
|
|
src/gfx/engine.hpp src/gfx/engine.cpp
|
|
src/gfx/camera.hpp src/gfx/camera.cpp
|
|
src/gfx/imgui.hpp src/gfx/imgui.cpp
|
|
src/gfx/world.hpp src/gfx/world.cpp
|
|
src/gfx/frame.hpp src/gfx/frame.cpp
|
|
src/gfx/util.hpp
|
|
#src/playstate.hpp src/playstate.cpp
|
|
src/assets.hpp src/assets.tpp src/assets.cpp
|
|
src/mapper.hpp src/mapper.cpp
|
|
src/config.hpp
|
|
src/game.hpp src/game.cpp
|
|
src/main.hpp src/main.cpp
|
|
src/mino.hpp src/mino.tpp)
|
|
target_precompile_headers(Minote PRIVATE
|
|
src/base/containers/hashmap.hpp
|
|
src/base/containers/vector.hpp
|
|
src/base/containers/string.hpp
|
|
src/base/containers/array.hpp
|
|
src/base/concepts.hpp
|
|
src/base/format.hpp
|
|
src/base/error.hpp
|
|
src/base/types.hpp
|
|
src/base/math.hpp
|
|
src/base/util.hpp
|
|
src/base/log.hpp
|
|
src/config.hpp)
|
|
target_include_directories(Minote PRIVATE src)
|
|
target_link_libraries(Minote PRIVATE winmm)
|
|
|
|
# Libraries
|
|
|
|
find_package(Vulkan REQUIRED)
|
|
|
|
include(FetchContent)
|
|
|
|
target_compile_definitions(Minote PRIVATE VK_NO_PROTOTYPES)
|
|
if(WIN32)
|
|
target_compile_definitions(Minote PRIVATE VK_USE_PLATFORM_WIN32_KHR)
|
|
else()
|
|
target_compile_definitions(Minote PRIVATE VK_USE_PLATFORM_XCB_KHR)
|
|
endif()
|
|
|
|
set(VOLK_PULL_IN_VULKAN OFF CACHE BOOL "")
|
|
FetchContent_Declare(volk
|
|
GIT_REPOSITORY https://github.com/zeux/volk
|
|
GIT_TAG 66169849935bd85f329c513dd01c28b0a02bfe33)
|
|
FetchContent_MakeAvailable(volk)
|
|
target_compile_definitions(volk PUBLIC VK_NO_PROTOTYPES)
|
|
target_include_directories(volk PUBLIC ${Vulkan_INCLUDE_DIRS})
|
|
target_link_libraries(Minote PRIVATE volk)
|
|
|
|
set(VUK_LINK_TO_LOADER OFF CACHE BOOL "")
|
|
set(VUK_USE_SHADERC OFF CACHE BOOL "")
|
|
FetchContent_Declare(vuk
|
|
GIT_REPOSITORY https://github.com/martty/vuk
|
|
GIT_TAG 4b842a633e3ccf1fea8af887991c96c62d2b4525)
|
|
FetchContent_MakeAvailable(vuk)
|
|
target_compile_definitions(vuk PUBLIC VUK_CUSTOM_VULKAN_HEADER="volk.h")
|
|
target_link_libraries(vuk PRIVATE volk)
|
|
target_link_libraries(Minote PRIVATE vuk)
|
|
|
|
FetchContent_Declare(vk-bootstrap
|
|
GIT_REPOSITORY https://github.com/charles-lunarg/vk-bootstrap
|
|
GIT_TAG 36eff8fa4222b2225e349a44dde0402f0f4a277b)
|
|
FetchContent_MakeAvailable(vk-bootstrap)
|
|
target_link_libraries(Minote PRIVATE vk-bootstrap)
|
|
|
|
FetchContent_Declare(pcg
|
|
GIT_REPOSITORY https://github.com/imneme/pcg-c-basic
|
|
GIT_TAG bc39cd76ac3d541e618606bcc6e1e5ba5e5e6aa3)
|
|
FetchContent_MakeAvailable(pcg)
|
|
add_library(pcg ${pcg_SOURCE_DIR}/pcg_basic.h ${pcg_SOURCE_DIR}/pcg_basic.c)
|
|
target_include_directories(pcg PUBLIC ${pcg_SOURCE_DIR})
|
|
target_link_libraries(Minote PRIVATE pcg)
|
|
|
|
set(OPT_DEF_LIBC ON CACHE BOOL "")
|
|
set(VIDEO_OPENGLES OFF CACHE BOOL "")
|
|
set(VIDEO_OPENGL OFF CACHE BOOL "")
|
|
set(SDL_DLOPEN OFF CACHE BOOL "")
|
|
set(RENDER_D3D OFF CACHE BOOL "")
|
|
set(DUMMYAUDIO OFF CACHE BOOL "")
|
|
set(DUMMYAUDIO OFF CACHE BOOL "")
|
|
set(DISKAUDIO OFF CACHE BOOL "")
|
|
set(DIRECTX OFF CACHE BOOL "")
|
|
set(WASAPI OFF CACHE BOOL "")
|
|
FetchContent_Declare(sdl
|
|
GIT_REPOSITORY https://github.com/libsdl-org/SDL
|
|
GIT_TAG release-2.0.14)
|
|
FetchContent_MakeAvailable(sdl)
|
|
target_link_libraries(Minote PRIVATE SDL2-static)
|
|
|
|
FetchContent_Declare(imgui
|
|
GIT_REPOSITORY https://github.com/ocornut/imgui
|
|
GIT_TAG 00d570e280533bca9cf6e5652d0f2eb131d032e7)
|
|
FetchContent_MakeAvailable(imgui)
|
|
add_library(imgui
|
|
${imgui_SOURCE_DIR}/imgui.h ${imgui_SOURCE_DIR}/imgui.cpp
|
|
${imgui_SOURCE_DIR}/imconfig.h ${imgui_SOURCE_DIR}/imgui_internal.h
|
|
${imgui_SOURCE_DIR}/imgui_draw.cpp ${imgui_SOURCE_DIR}/imgui_tables.cpp
|
|
${imgui_SOURCE_DIR}/imgui_widgets.cpp ${imgui_SOURCE_DIR}/imgui_demo.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_sdl.h ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl.cpp)
|
|
target_compile_definitions(imgui PRIVATE IMGUI_DISABLE_WIN32_FUNCTIONS)
|
|
target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR})
|
|
target_link_libraries(imgui PRIVATE SDL2-static)
|
|
target_link_libraries(Minote PRIVATE imgui)
|
|
|
|
FetchContent_Declare(sqlite
|
|
URL https://www.sqlite.org/2021/sqlite-amalgamation-3350400.zip)
|
|
FetchContent_MakeAvailable(sqlite)
|
|
add_library(sqlite
|
|
${sqlite_SOURCE_DIR}/sqlite3.h ${sqlite_SOURCE_DIR}/sqlite3.c
|
|
${sqlite_SOURCE_DIR}/sqlite3ext.h)
|
|
target_include_directories(sqlite PUBLIC ${sqlite_SOURCE_DIR})
|
|
target_link_libraries(Minote PRIVATE sqlite)
|
|
add_executable(sqlite-shell
|
|
${sqlite_SOURCE_DIR}/shell.c)
|
|
target_link_libraries(sqlite-shell PRIVATE sqlite)
|
|
|
|
FetchContent_Declare(cgltf
|
|
GIT_REPOSITORY https://github.com/jkuhlmann/cgltf
|
|
GIT_TAG 1bdc84d3bb81fa69bcf71ed5cafe63e58df1448a)
|
|
FetchContent_MakeAvailable(cgltf)
|
|
add_library(cgltf INTERFACE ${cgltf_SOURCE_DIR}/cgltf.h ${cgltf_SOURCE_DIR}/cgltf_write.h)
|
|
target_include_directories(cgltf INTERFACE ${cgltf_SOURCE_DIR})
|
|
|
|
if(NOT TARGET robin_hood) # vuk already includes this
|
|
FetchContent_Declare(robin_hood
|
|
GIT_REPOSITORY https://github.com/martinus/robin-hood-hashing
|
|
GIT_TAG 3.11.3)
|
|
FetchContent_MakeAvailable(robin_hood)
|
|
endif()
|
|
target_link_libraries(Minote PRIVATE robin_hood)
|
|
|
|
FetchContent_Declare(itlib
|
|
GIT_REPOSITORY https://github.com/iboB/itlib
|
|
GIT_TAG v1.4.5)
|
|
FetchContent_MakeAvailable(itlib)
|
|
target_compile_definitions(itlib INTERFACE ITLIB_STATIC_VECTOR_ERROR_HANDLING=ITLIB_STATIC_VECTOR_ERROR_HANDLING_THROW)
|
|
target_compile_definitions(itlib INTERFACE ITLIB_SMALL_VECTOR_ERROR_HANDLING=ITLIB_SMALL_VECTOR_ERROR_HANDLING_THROW)
|
|
target_link_libraries(Minote PRIVATE itlib)
|
|
|
|
FetchContent_Declare(fmt
|
|
GIT_REPOSITORY https://github.com/fmtlib/fmt
|
|
GIT_TAG 8.1.1)
|
|
FetchContent_MakeAvailable(fmt)
|
|
target_link_libraries(Minote PRIVATE fmt::fmt)
|
|
|
|
set(QUILL_FMT_EXTERNAL ON CACHE BOOL "")
|
|
FetchContent_Declare(quill
|
|
GIT_REPOSITORY https://github.com/Tearnote/quill
|
|
GIT_TAG 98b09cf8b824ea3f6c8d7ea93e9c37bb94709f9c)
|
|
FetchContent_MakeAvailable(quill)
|
|
target_link_libraries(quill PRIVATE fmt::fmt)
|
|
target_link_libraries(Minote PRIVATE quill::quill)
|
|
|
|
FetchContent_Declare(gcem
|
|
GIT_REPOSITORY https://github.com/kthohr/gcem
|
|
GIT_TAG 8d0e62d9c9c47dfad2cb2d800281908cf7ff16c6)
|
|
FetchContent_MakeAvailable(gcem)
|
|
target_link_libraries(Minote PRIVATE gcem)
|
|
|
|
FetchContent_Declare(mpack
|
|
URL https://github.com/ludocode/mpack/releases/download/v1.1/mpack-amalgamation-1.1.tar.gz)
|
|
FetchContent_MakeAvailable(mpack)
|
|
add_library(mpack
|
|
${mpack_SOURCE_DIR}/src/mpack/mpack.h ${mpack_SOURCE_DIR}/src/mpack/mpack.c)
|
|
# Force C++-style handling of inline functions. Fixes link-time error with GCC
|
|
set_property(SOURCE ${mpack_SOURCE_DIR}/src/mpack/mpack.c PROPERTY LANGUAGE CXX)
|
|
target_include_directories(mpack PUBLIC ${mpack_SOURCE_DIR}/src)
|
|
target_link_libraries(Minote PRIVATE mpack)
|
|
|
|
FetchContent_Declare(meshoptimizer
|
|
GIT_REPOSITORY https://github.com/zeux/meshoptimizer
|
|
GIT_TAG 70b6cc38a64eeb549567599418bc4ed3ebd607da)
|
|
FetchContent_MakeAvailable(meshoptimizer)
|
|
|
|
FetchContent_Declare(bvh
|
|
GIT_REPOSITORY https://github.com/madmann91/bvh
|
|
GIT_TAG 02749bca616260d2df1a8de69e76075b2c8a526b)
|
|
FetchContent_MakeAvailable(bvh)
|
|
target_link_libraries(Minote PRIVATE bvh)
|
|
|
|
# Shader compilation
|
|
|
|
set(SHADER_DIR_PREFIX src/glsl)
|
|
set(SHADER_SOURCES
|
|
instanceList/cullMeshlets.comp
|
|
instanceList/genIndices.comp
|
|
cubeFilter/post.comp
|
|
cubeFilter/pre.comp
|
|
visibility/worklist.comp
|
|
visibility/visbuf.vert visibility/visbuf.frag
|
|
bloom/downKaris.comp
|
|
bloom/down.comp
|
|
bloom/up.comp
|
|
quad/genBuffers.comp
|
|
quad/clusterize.comp
|
|
quad/resolve.comp
|
|
bvh/debugAABB.vert
|
|
bvh/debugAABB.frag
|
|
sky/genAerialPerspective.comp
|
|
sky/genMultiScattering.comp
|
|
sky/genTransmittance.comp
|
|
sky/genSunLuminance.comp
|
|
sky/drawCubemap.comp
|
|
sky/genSkyView.comp
|
|
sky/draw.comp
|
|
hiz/first.comp
|
|
hiz/mip.comp
|
|
tonemap.comp
|
|
imgui.vert imgui.frag
|
|
pbr.comp)
|
|
|
|
foreach(SHADER_PATH ${SHADER_SOURCES})
|
|
get_filename_component(SHADER_DIR ${SHADER_PATH} DIRECTORY)
|
|
set(SHADER_OUTPUT ${PROJECT_BINARY_DIR}/$<CONFIG>/generated/spv/${SHADER_PATH}.spv)
|
|
add_custom_command(
|
|
OUTPUT ${SHADER_OUTPUT}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/$<CONFIG>/generated/spv/${SHADER_DIR}
|
|
COMMAND $ENV{VULKAN_SDK}/Bin/glslc.exe --target-env=vulkan1.2 -mfmt=num $<$<CONFIG:Debug,RelWithDebInfo>:-g> -MD -MF ${SHADER_OUTPUT}.d -o ${SHADER_OUTPUT} ${PROJECT_SOURCE_DIR}/${SHADER_DIR_PREFIX}/${SHADER_PATH}
|
|
DEPENDS ${SHADER_DIR_PREFIX}/${SHADER_PATH}
|
|
DEPFILE ${SHADER_OUTPUT}.d
|
|
VERBATIM COMMAND_EXPAND_LISTS)
|
|
list(APPEND SHADER_OUTPUTS ${SHADER_OUTPUT})
|
|
endforeach()
|
|
|
|
add_custom_target(Compile_shaders DEPENDS ${SHADER_OUTPUTS})
|
|
target_include_directories(Minote PRIVATE ${PROJECT_BINARY_DIR}/$<CONFIG>/generated)
|
|
add_dependencies(Minote Compile_shaders)
|
|
|
|
# Asset pipeline
|
|
|
|
add_executable(Model_conv
|
|
src/tools/modelSchema.hpp
|
|
src/tools/modelConv.cpp)
|
|
target_include_directories(Model_conv PRIVATE src)
|
|
target_link_libraries(Model_conv PRIVATE meshoptimizer)
|
|
target_link_libraries(Model_conv PRIVATE quill::quill)
|
|
target_link_libraries(Model_conv PRIVATE itlib)
|
|
target_link_libraries(Model_conv PRIVATE cgltf)
|
|
target_link_libraries(Model_conv PRIVATE mpack)
|
|
target_link_libraries(Model_conv PRIVATE gcem)
|
|
|
|
set(ASSET_OUTPUT ${PROJECT_BINARY_DIR}/$<CONFIG>/assets.db)
|
|
add_custom_command(
|
|
OUTPUT ${ASSET_OUTPUT}
|
|
COMMAND sqlite-shell ${ASSET_OUTPUT} "VACUUM"
|
|
VERBATIM)
|
|
|
|
set(MODELS
|
|
models/block.glb
|
|
models/sphere.glb
|
|
models/testscene.glb)
|
|
add_custom_command(
|
|
OUTPUT ${ASSET_OUTPUT} APPEND
|
|
COMMAND sqlite-shell ${ASSET_OUTPUT} "CREATE TABLE IF NOT EXISTS models(name TEXT UNIQUE, data BLOB)"
|
|
VERBATIM)
|
|
foreach(MODEL_PATH ${MODELS})
|
|
get_filename_component(MODEL_NAME ${MODEL_PATH} NAME_WLE)
|
|
add_custom_command(
|
|
OUTPUT ${PROJECT_BINARY_DIR}/$<CONFIG>/models/${MODEL_NAME}.model
|
|
COMMAND Model_conv ${PROJECT_SOURCE_DIR}/${MODEL_PATH} ${PROJECT_BINARY_DIR}/$<CONFIG>/models/${MODEL_NAME}.model
|
|
DEPENDS ${PROJECT_SOURCE_DIR}/${MODEL_PATH}
|
|
DEPENDS Model_conv
|
|
VERBATIM COMMAND_EXPAND_LISTS)
|
|
add_custom_command(
|
|
OUTPUT ${ASSET_OUTPUT} APPEND
|
|
COMMAND sqlite-shell ${ASSET_OUTPUT} "INSERT OR REPLACE INTO models(name, data) VALUES('${MODEL_NAME}', readfile('${PROJECT_BINARY_DIR}/$<CONFIG>/models/${MODEL_NAME}.model'))"
|
|
DEPENDS ${PROJECT_BINARY_DIR}/$<CONFIG>/models/${MODEL_NAME}.model
|
|
DEPENDS sqlite-shell
|
|
VERBATIM COMMAND_EXPAND_LISTS)
|
|
endforeach()
|
|
|
|
add_custom_target(Package_assets DEPENDS ${ASSET_OUTPUT})
|
|
add_dependencies(Minote Package_assets)
|