CMakeLists.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. cmake_minimum_required(VERSION 3.8)
  2. project(r3d VERSION 0.8.0 LANGUAGES C CXX)
  3. # ========================================
  4. # Standards and Policies
  5. # ========================================
  6. set(CMAKE_C_STANDARD 11)
  7. set(CMAKE_C_STANDARD_REQUIRED ON)
  8. if(POLICY CMP0141)
  9. cmake_policy(SET CMP0141 NEW)
  10. # This section configures MSVC (Visual Studio) to enable "Edit and Continue" debugging
  11. set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
  12. endif()
  13. # ========================================
  14. # Project Configuration
  15. # ========================================
  16. set(R3D_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
  17. if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
  18. set(R3D_IS_MAIN ON)
  19. else()
  20. set(R3D_IS_MAIN OFF)
  21. endif()
  22. set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${R3D_ROOT_PATH}/cmake")
  23. option(R3D_BUILD_DOCS "Build the doxygen documentation" OFF)
  24. option(R3D_BUILD_EXAMPLES "Build the examples" ${R3D_IS_MAIN})
  25. option(R3D_RAYLIB_VENDORED "Use vendored raylib from submodule" OFF)
  26. option(R3D_ASSIMP_VENDORED "Use vendored assimp from submodule" OFF)
  27. # ========================================
  28. # Output Directories
  29. # ========================================
  30. set(R3D_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
  31. set(R3D_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
  32. set(R3D_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
  33. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${R3D_RUNTIME_OUTPUT_DIRECTORY})
  34. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${R3D_LIBRARY_OUTPUT_DIRECTORY})
  35. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${R3D_ARCHIVE_OUTPUT_DIRECTORY})
  36. # ========================================
  37. # R3D Compile-Time Configuration
  38. # ========================================
  39. set(R3D_CONFIG_DEFAULTS
  40. R3D_MAX_LIGHT_FORWARD_PER_MESH 8
  41. R3D_MAX_PROBE_ON_SCREEN 8
  42. R3D_PROBE_CAPTURE_SIZE 256
  43. R3D_SHADOW_MAP_DIRECTIONAL_SIZE 4096
  44. R3D_SHADOW_MAP_SPOT_SIZE 2048
  45. R3D_SHADOW_MAP_OMNI_SIZE 2048
  46. R3D_CUBEMAP_IRRADIANCE_SIZE 32
  47. R3D_CUBEMAP_PREFILTER_SIZE 128
  48. R3D_MAX_SHADER_CODE_LENGTH 16384
  49. R3D_MAX_SHADER_SAMPLERS 4
  50. R3D_MAX_SHADER_UNIFORMS 16
  51. R3D_MAX_SCREEN_SHADERS 8
  52. R3D_ENABLE_TRACELOG 1
  53. )
  54. list(LENGTH R3D_CONFIG_DEFAULTS _len)
  55. math(EXPR _count "${_len} / 2")
  56. math(EXPR _last "${_count} - 1")
  57. foreach(i RANGE 0 ${_last})
  58. math(EXPR key_index "2 * ${i}")
  59. math(EXPR val_index "2 * ${i} + 1")
  60. list(GET R3D_CONFIG_DEFAULTS ${key_index} key)
  61. list(GET R3D_CONFIG_DEFAULTS ${val_index} val)
  62. set(${key} ${val} CACHE STRING "R3D compile-time configuration")
  63. endforeach()
  64. set(R3D_GENERATED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated/include")
  65. configure_file(
  66. ${CMAKE_CURRENT_SOURCE_DIR}/src/r3d_config.h.in
  67. ${R3D_GENERATED_INCLUDE_DIR}/r3d_config.h
  68. @ONLY
  69. )
  70. # ========================================
  71. # Dependencies: Assimp
  72. # ========================================
  73. if(R3D_ASSIMP_VENDORED)
  74. set(R3D_ASSIMP_SUBMODULE_PATH "${R3D_ROOT_PATH}/external/assimp")
  75. set(R3D_ASSIMP_CMAKELISTS "${R3D_ASSIMP_SUBMODULE_PATH}/CMakeLists.txt")
  76. if(NOT EXISTS "${R3D_ASSIMP_CMAKELISTS}")
  77. message(FATAL_ERROR
  78. "Vendored assimp not found!\n"
  79. "Missing: ${R3D_ASSIMP_CMAKELISTS}\n"
  80. "Please initialize the submodule with:\n"
  81. " git submodule update --init --recursive")
  82. endif()
  83. message(STATUS "Using vendored assimp from: ${R3D_ASSIMP_SUBMODULE_PATH}")
  84. # Common settings
  85. set(ASSIMP_INJECT_DEBUG_POSTFIX OFF CACHE BOOL "")
  86. set(ASSIMP_WARNINGS_AS_ERRORS OFF CACHE BOOL "")
  87. set(ASSIMP_IGNORE_GIT_HASH ON CACHE BOOL "")
  88. set(ASSIMP_BUILD_TESTS OFF CACHE BOOL "")
  89. set(ASSIMP_NO_EXPORT ON CACHE BOOL "")
  90. set(ASSIMP_INSTALL OFF CACHE BOOL "")
  91. # Enabled importers
  92. # Note: There may be conflicts between Assimp and raylib if both enable the M3D format
  93. set(_ASSIMP_ENABLED_IMPORTERS
  94. COLLADA GLTF OBJ FBX IQM
  95. )
  96. # Disabled importers
  97. set(_ASSIMP_DISABLED_IMPORTERS
  98. AMF BVH OFF COB STL 3DS AC ASE ASSBIN B3D DXF CSM HMP
  99. IRRMESH IRR LWO LWS M3D MD2 MD3 MD5 MDC MDL NFF NDO OGRE
  100. OPENGEX PLY MS3D BLEND IFC XGL Q3D Q3BSP RAW SIB SMD
  101. TERRAGEN 3D X X3D 3MF MMD
  102. )
  103. foreach(importer ${_ASSIMP_ENABLED_IMPORTERS})
  104. set(ASSIMP_BUILD_${importer}_IMPORTER ON CACHE BOOL "")
  105. endforeach()
  106. foreach(importer ${_ASSIMP_DISABLED_IMPORTERS})
  107. set(ASSIMP_BUILD_${importer}_IMPORTER OFF CACHE BOOL "")
  108. endforeach()
  109. add_subdirectory("${R3D_ASSIMP_SUBMODULE_PATH}")
  110. set(R3D_ASSIMP_INC "${R3D_ASSIMP_SUBMODULE_PATH}/include" CACHE STRING "" FORCE)
  111. set(R3D_ASSIMP_LIB "assimp" CACHE STRING "" FORCE)
  112. set_target_properties(assimp PROPERTIES
  113. RUNTIME_OUTPUT_DIRECTORY ${R3D_RUNTIME_OUTPUT_DIRECTORY}
  114. LIBRARY_OUTPUT_DIRECTORY ${R3D_LIBRARY_OUTPUT_DIRECTORY}
  115. ARCHIVE_OUTPUT_DIRECTORY ${R3D_ARCHIVE_OUTPUT_DIRECTORY}
  116. )
  117. else()
  118. find_package(assimp QUIET)
  119. if(assimp_FOUND)
  120. message(STATUS "Using system-installed Assimp")
  121. set(R3D_ASSIMP_INC "${ASSIMP_INCLUDE_DIRS}" CACHE STRING "" FORCE)
  122. set(R3D_ASSIMP_LIB "${ASSIMP_LIBRARIES}" CACHE STRING "" FORCE)
  123. else()
  124. message(FATAL_ERROR
  125. "System Assimp not found.\n"
  126. "Please install Assimp development files for your platform, "
  127. "or use the vendored version included with this project.")
  128. endif()
  129. endif()
  130. # ========================================
  131. # Dependencies: Raylib
  132. # ========================================
  133. if(R3D_RAYLIB_VENDORED)
  134. set(R3D_RAYLIB_SUBMODULE_PATH "${R3D_ROOT_PATH}/external/raylib")
  135. set(R3D_RAYLIB_CMAKELISTS "${R3D_RAYLIB_SUBMODULE_PATH}/CMakeLists.txt")
  136. if(NOT EXISTS "${R3D_RAYLIB_CMAKELISTS}")
  137. message(FATAL_ERROR
  138. "Vendored raylib not found!\n"
  139. "Missing: ${R3D_RAYLIB_CMAKELISTS}\n"
  140. "Please initialize the submodule with:\n"
  141. " git submodule update --init --recursive")
  142. endif()
  143. message(STATUS "Using vendored raylib from: ${R3D_RAYLIB_SUBMODULE_PATH}")
  144. set(CUSTOMIZE_BUILD ON CACHE BOOL "" FORCE)
  145. # Enabled file formats
  146. set(_RAYLIB_ENABLED_FORMATS
  147. HDR JPG
  148. )
  149. # Disabled file formats
  150. # r3d provides its own model importers via Assimp
  151. # Note: There may be conflicts between raylib and Assimp if both enable the M3D format
  152. set(_RAYLIB_DISABLED_FORMATS
  153. OBJ MTL IQM GLTF VOX M3D
  154. )
  155. foreach(format ${_RAYLIB_ENABLED_FORMATS})
  156. set(SUPPORT_FILEFORMAT_${format} ON CACHE BOOL "" FORCE)
  157. endforeach()
  158. foreach(format ${_RAYLIB_DISABLED_FORMATS})
  159. set(SUPPORT_FILEFORMAT_${format} OFF CACHE BOOL "" FORCE)
  160. endforeach()
  161. add_subdirectory("${R3D_RAYLIB_SUBMODULE_PATH}")
  162. set(R3D_RAYLIB_INC "${R3D_RAYLIB_SUBMODULE_PATH}/src" CACHE STRING "" FORCE)
  163. set(R3D_RAYLIB_LIB "raylib" CACHE STRING "" FORCE)
  164. set_target_properties(raylib PROPERTIES
  165. RUNTIME_OUTPUT_DIRECTORY ${R3D_RUNTIME_OUTPUT_DIRECTORY}
  166. LIBRARY_OUTPUT_DIRECTORY ${R3D_LIBRARY_OUTPUT_DIRECTORY}
  167. ARCHIVE_OUTPUT_DIRECTORY ${R3D_ARCHIVE_OUTPUT_DIRECTORY}
  168. )
  169. else()
  170. find_package(raylib QUIET)
  171. if(raylib_FOUND)
  172. message(STATUS "Using system-installed raylib")
  173. set(R3D_RAYLIB_INC "${RAYLIB_INCLUDE_DIRS}" CACHE STRING "" FORCE)
  174. set(R3D_RAYLIB_LIB "${RAYLIB_LIBRARIES}" CACHE STRING "" FORCE)
  175. else()
  176. message(FATAL_ERROR
  177. "System raylib not found.\n"
  178. "Please install raylib development files for your platform, "
  179. "or use the vendored version included with this project.")
  180. endif()
  181. endif()
  182. # ========================================
  183. # Library Definition
  184. # ========================================
  185. include(CheckLibraryExists)
  186. include(EmbedShaders)
  187. include(EmbedAssets)
  188. if(BUILD_SHARED_LIBS)
  189. add_definitions(-DR3D_BUILD_SHARED)
  190. add_definitions(-DGLAD_API_CALL_EXPORT)
  191. endif()
  192. add_library(${PROJECT_NAME}
  193. # Importer
  194. "${R3D_ROOT_PATH}/src/importer/r3d_importer_animation.c"
  195. "${R3D_ROOT_PATH}/src/importer/r3d_importer_material.c"
  196. "${R3D_ROOT_PATH}/src/importer/r3d_importer_mesh.c"
  197. "${R3D_ROOT_PATH}/src/importer/r3d_importer_skeleton.c"
  198. "${R3D_ROOT_PATH}/src/importer/r3d_importer_texture.c"
  199. # Common
  200. "${R3D_ROOT_PATH}/src/common/r3d_frustum.c"
  201. "${R3D_ROOT_PATH}/src/common/r3d_helper.c"
  202. "${R3D_ROOT_PATH}/src/common/r3d_image.c"
  203. "${R3D_ROOT_PATH}/src/common/r3d_pass.c"
  204. # Modules
  205. "${R3D_ROOT_PATH}/src/modules/r3d_texture.c"
  206. "${R3D_ROOT_PATH}/src/modules/r3d_target.c"
  207. "${R3D_ROOT_PATH}/src/modules/r3d_shader.c"
  208. "${R3D_ROOT_PATH}/src/modules/r3d_driver.c"
  209. "${R3D_ROOT_PATH}/src/modules/r3d_light.c"
  210. "${R3D_ROOT_PATH}/src/modules/r3d_render.c"
  211. "${R3D_ROOT_PATH}/src/modules/r3d_env.c"
  212. # Core
  213. "${R3D_ROOT_PATH}/src/r3d_animation_player.c"
  214. "${R3D_ROOT_PATH}/src/r3d_animation.c"
  215. "${R3D_ROOT_PATH}/src/r3d_core.c"
  216. "${R3D_ROOT_PATH}/src/r3d_cubemap.c"
  217. "${R3D_ROOT_PATH}/src/r3d_draw.c"
  218. "${R3D_ROOT_PATH}/src/r3d_decal.c"
  219. "${R3D_ROOT_PATH}/src/r3d_ambient_map.c"
  220. "${R3D_ROOT_PATH}/src/r3d_environment.c"
  221. "${R3D_ROOT_PATH}/src/r3d_importer.c"
  222. "${R3D_ROOT_PATH}/src/r3d_instance.c"
  223. "${R3D_ROOT_PATH}/src/r3d_kinematics.c"
  224. "${R3D_ROOT_PATH}/src/r3d_lighting.c"
  225. "${R3D_ROOT_PATH}/src/r3d_surface_shader.c"
  226. "${R3D_ROOT_PATH}/src/r3d_screen_shader.c"
  227. "${R3D_ROOT_PATH}/src/r3d_material.c"
  228. "${R3D_ROOT_PATH}/src/r3d_mesh.c"
  229. "${R3D_ROOT_PATH}/src/r3d_mesh_data.c"
  230. "${R3D_ROOT_PATH}/src/r3d_model.c"
  231. "${R3D_ROOT_PATH}/src/r3d_probe.c"
  232. "${R3D_ROOT_PATH}/src/r3d_skeleton.c"
  233. "${R3D_ROOT_PATH}/src/r3d_utils.c"
  234. "${R3D_ROOT_PATH}/src/r3d_visibility.c"
  235. # External
  236. "${R3D_ROOT_PATH}/external/tinycthread/tinycthread.c"
  237. )
  238. # ========================================
  239. # Embedded Resources
  240. # ========================================
  241. embed_shaders(${PROJECT_NAME}
  242. # Generic
  243. "${R3D_ROOT_PATH}/shaders/generic/color.frag"
  244. "${R3D_ROOT_PATH}/shaders/generic/screen.vert"
  245. "${R3D_ROOT_PATH}/shaders/generic/cubemap.vert"
  246. # Prepare
  247. "${R3D_ROOT_PATH}/shaders/prepare/atrous_wavelet.frag"
  248. "${R3D_ROOT_PATH}/shaders/prepare/bicubic_up.frag"
  249. "${R3D_ROOT_PATH}/shaders/prepare/lanczos_up.frag"
  250. "${R3D_ROOT_PATH}/shaders/prepare/blur_down.frag"
  251. "${R3D_ROOT_PATH}/shaders/prepare/blur_up.frag"
  252. "${R3D_ROOT_PATH}/shaders/prepare/ssao_in_down.frag"
  253. "${R3D_ROOT_PATH}/shaders/prepare/ssao.frag"
  254. "${R3D_ROOT_PATH}/shaders/prepare/ssao_blur.frag"
  255. "${R3D_ROOT_PATH}/shaders/prepare/ssil_in_down.frag"
  256. "${R3D_ROOT_PATH}/shaders/prepare/ssil.frag"
  257. "${R3D_ROOT_PATH}/shaders/prepare/ssr_in_down.frag"
  258. "${R3D_ROOT_PATH}/shaders/prepare/ssr.frag"
  259. "${R3D_ROOT_PATH}/shaders/prepare/bloom_down.frag"
  260. "${R3D_ROOT_PATH}/shaders/prepare/bloom_up.frag"
  261. "${R3D_ROOT_PATH}/shaders/prepare/dof_coc.frag"
  262. "${R3D_ROOT_PATH}/shaders/prepare/dof_down.frag"
  263. "${R3D_ROOT_PATH}/shaders/prepare/dof_blur.frag"
  264. "${R3D_ROOT_PATH}/shaders/prepare/cubemap_from_equirectangular.frag"
  265. "${R3D_ROOT_PATH}/shaders/prepare/cubemap_irradiance.frag"
  266. "${R3D_ROOT_PATH}/shaders/prepare/cubemap_prefilter.frag"
  267. "${R3D_ROOT_PATH}/shaders/prepare/cubemap_skybox.frag"
  268. # Scene
  269. "${R3D_ROOT_PATH}/shaders/scene/scene.vert"
  270. "${R3D_ROOT_PATH}/shaders/scene/geometry.frag"
  271. "${R3D_ROOT_PATH}/shaders/scene/forward.frag"
  272. "${R3D_ROOT_PATH}/shaders/scene/unlit.frag"
  273. "${R3D_ROOT_PATH}/shaders/scene/depth.frag"
  274. "${R3D_ROOT_PATH}/shaders/scene/depth_cube.frag"
  275. "${R3D_ROOT_PATH}/shaders/scene/decal.frag"
  276. "${R3D_ROOT_PATH}/shaders/scene/skybox.vert"
  277. "${R3D_ROOT_PATH}/shaders/scene/skybox.frag"
  278. # Deferred
  279. "${R3D_ROOT_PATH}/shaders/deferred/ambient.frag"
  280. "${R3D_ROOT_PATH}/shaders/deferred/lighting.frag"
  281. "${R3D_ROOT_PATH}/shaders/deferred/compose.frag"
  282. # Post
  283. "${R3D_ROOT_PATH}/shaders/post/fog.frag"
  284. "${R3D_ROOT_PATH}/shaders/post/bloom.frag"
  285. "${R3D_ROOT_PATH}/shaders/post/dof.frag"
  286. "${R3D_ROOT_PATH}/shaders/post/screen.frag"
  287. "${R3D_ROOT_PATH}/shaders/post/output.frag"
  288. "${R3D_ROOT_PATH}/shaders/post/fxaa.frag"
  289. "${R3D_ROOT_PATH}/shaders/post/visualizer.frag"
  290. )
  291. embed_assets(${PROJECT_NAME}
  292. "${R3D_ROOT_PATH}/assets/brdf_lut_512_rg16_float.raw"
  293. )
  294. # ========================================
  295. # Include Directories
  296. # ========================================
  297. target_include_directories(${PROJECT_NAME}
  298. PRIVATE
  299. "${R3D_ROOT_PATH}/external/tinycthread"
  300. "${R3D_ROOT_PATH}/external/uthash"
  301. "${R3D_ROOT_PATH}/external/glad"
  302. "${R3D_GENERATED_INCLUDE_DIR}"
  303. "${R3D_ROOT_PATH}/include"
  304. "${R3D_RAYLIB_INC}"
  305. "${R3D_ASSIMP_INC}"
  306. )
  307. # ========================================
  308. # Link Libraries
  309. # ========================================
  310. target_link_libraries(${PROJECT_NAME}
  311. PRIVATE
  312. "${R3D_RAYLIB_LIB}"
  313. "${R3D_ASSIMP_LIB}"
  314. )
  315. check_library_exists(m cos "" HAVE_LIB_M)
  316. if(HAVE_LIB_M)
  317. target_link_libraries(${PROJECT_NAME} PUBLIC m)
  318. endif()
  319. # ========================================
  320. # Compiler Settings
  321. # ========================================
  322. if(CMAKE_VERSION VERSION_GREATER 3.12)
  323. set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 11)
  324. endif()
  325. if(MSVC)
  326. target_compile_options(${PROJECT_NAME} PRIVATE /experimental:c11atomics)
  327. endif()
  328. # ========================================
  329. # Documentation
  330. # ========================================
  331. if(R3D_BUILD_DOCS)
  332. find_package(Doxygen QUIET)
  333. if(NOT Doxygen_FOUND)
  334. message(FATAL_ERROR "Doxygen not found. Install Doxygen to build documentation.")
  335. endif()
  336. set(DOXYGEN_IN ${R3D_ROOT_PATH}/Doxyfile.in)
  337. set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
  338. configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
  339. add_custom_target(docs
  340. COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
  341. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  342. COMMENT "Generating API documentation with Doxygen"
  343. VERBATIM
  344. )
  345. endif()
  346. # ========================================
  347. # Examples
  348. # ========================================
  349. if(R3D_BUILD_EXAMPLES)
  350. include("${R3D_ROOT_PATH}/examples/CMakeLists.txt")
  351. endif()