Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
254 changes: 254 additions & 0 deletions GameModules/SparkGameOpenWorld/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
cmake_minimum_required(VERSION 3.25)

# ================================================================
# SparkGameOpenWorld - Open World Game Module DLL
#
# Showcases SparkEngine's open-world capabilities:
# - 8 biome regions with seamless streaming and origin rebasing
# - Survival player (stamina, hunger, fast travel, compass)
# - Points of interest, map discovery, landmarks
# - Wildlife ecology (herds, predator-prey, taming)
# - NPC settlements and player camp building
# - Resource gathering and crafting
# - Dynamic world events and random encounters
# - Full engine integration (weather, time, save, AI, music)
#
# Built as a shared library loaded by the engine at runtime.
# ================================================================

if(NOT CMAKE_PROJECT_NAME OR CMAKE_PROJECT_NAME STREQUAL "SparkGameOpenWorld")
project(SparkGameOpenWorld LANGUAGES CXX)
set(SPARK_GAME_OW_STANDALONE TRUE)
else()
set(SPARK_GAME_OW_STANDALONE FALSE)
endif()

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# ---------------------------------------------------------------------
# Standalone mode: locate SparkEngine
# ---------------------------------------------------------------------
if(SPARK_GAME_OW_STANDALONE)
if(NOT SPARK_ENGINE_DIR)
set(SPARK_ENGINE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." CACHE PATH
"Path to SparkEngine root directory")
endif()

message(STATUS "SparkGameOpenWorld standalone build - Engine at: ${SPARK_ENGINE_DIR}")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

foreach(config Debug Release RelWithDebInfo MinSizeRel)
string(TOUPPER ${config} CONFIG_UPPER)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${CMAKE_BINARY_DIR}/lib)
endforeach()

if(MSVC)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
add_compile_options(/W3 /MP /bigobj /wd4005 /wd4996 /wd4244 /wd4267)
add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS SPARK_PLATFORM_WINDOWS)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
add_compile_options(-Wall -Wextra -Wno-unused-parameter -fPIC)
endif()

set(THIRDPARTY_INCLUDE_DIRS "")
if(EXISTS "${SPARK_ENGINE_DIR}/ThirdParty/ECS/entt/single_include")
list(APPEND THIRDPARTY_INCLUDE_DIRS "${SPARK_ENGINE_DIR}/ThirdParty/ECS/entt/single_include")
endif()
if(EXISTS "${SPARK_ENGINE_DIR}/ThirdParty/Physics/bullet3/src")
list(APPEND THIRDPARTY_INCLUDE_DIRS "${SPARK_ENGINE_DIR}/ThirdParty/Physics/bullet3/src")
endif()
if(EXISTS "${SPARK_ENGINE_DIR}/ThirdParty/UI/imgui")
list(APPEND THIRDPARTY_INCLUDE_DIRS "${SPARK_ENGINE_DIR}/ThirdParty/UI/imgui")
endif()

set(ENGINE_SOURCE_DIR "${SPARK_ENGINE_DIR}/SparkEngine/Source")
else()
set(ENGINE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/SparkEngine/Source")
endif()

# ---------------------------------------------------------------------
# Collect SparkGameOpenWorld source files
# ---------------------------------------------------------------------
file(GLOB_RECURSE SPARK_GAME_OW_SOURCES
CONFIGURE_DEPENDS
"Source/*.cpp"
"Source/*.h"
"Source/*.hpp"
)
list(FILTER SPARK_GAME_OW_SOURCES EXCLUDE REGEX ".*[Tt]est.*")
list(FILTER SPARK_GAME_OW_SOURCES EXCLUDE REGEX ".*[Ee]xample.*")

# ---------------------------------------------------------------------
# Create the game as a SHARED library (DLL)
# ---------------------------------------------------------------------
add_library(SparkGameOpenWorld SHARED ${SPARK_GAME_OW_SOURCES})

target_compile_definitions(SparkGameOpenWorld PRIVATE SPARK_GAME_DLL SPARK_MODULE_DLL)

# ---------------------------------------------------------------------
# Link against SparkEngineLib
# ---------------------------------------------------------------------
if(NOT SPARK_GAME_OW_STANDALONE AND TARGET SparkEngineLib)
if(WIN32)
target_link_libraries(SparkGameOpenWorld PRIVATE SparkEngineLib)
elseif(TARGET SparkEngineInterface)
target_link_libraries(SparkGameOpenWorld PRIVATE SparkEngineInterface)
endif()
endif()

# ---------------------------------------------------------------------
# Include directories
# ---------------------------------------------------------------------
if(SPARK_GAME_OW_STANDALONE)
set(SPARK_SDK_INCLUDE_DIR "${SPARK_ENGINE_DIR}/SparkSDK/Include")
else()
set(SPARK_SDK_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/SparkSDK/Include")
endif()

target_include_directories(SparkGameOpenWorld PRIVATE
"Source"
"${ENGINE_SOURCE_DIR}"
"${SPARK_SDK_INCLUDE_DIR}"
${THIRDPARTY_INCLUDE_DIRS}
)

# ---------------------------------------------------------------------
# Platform-specific libraries
# ---------------------------------------------------------------------
if(WIN32)
target_link_libraries(SparkGameOpenWorld PRIVATE
d3d11 dxgi d3dcompiler dxguid
kernel32 user32 gdi32 winspool
shell32 comdlg32 advapi32
ole32 oleaut32 uuid
winmm
$<$<BOOL:${ENABLE_NETWORKING}>:ws2_32>
$<$<BOOL:${ENABLE_NETWORKING}>:wsock32>
$<$<BOOL:${ENABLE_NETWORKING}>:crypt32>
$<$<BOOL:${ENABLE_NETWORKING}>:wldap32>
$<$<BOOL:${ENABLE_NETWORKING}>:normaliz>
)
target_compile_definitions(SparkGameOpenWorld PRIVATE
WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS SPARK_PLATFORM_WINDOWS
)
else()
find_package(Threads REQUIRED)
target_link_libraries(SparkGameOpenWorld PRIVATE
Threads::Threads
${CMAKE_DL_LIBS}
)
if(APPLE)
target_compile_definitions(SparkGameOpenWorld PRIVATE SPARK_PLATFORM_MACOS)
else()
target_compile_definitions(SparkGameOpenWorld PRIVATE SPARK_PLATFORM_LINUX)
endif()
endif()

if(MSVC)
target_link_libraries(SparkGameOpenWorld PRIVATE legacy_stdio_definitions)
endif()

# Link Jolt Physics if available
if(WIN32)
if(TARGET Jolt)
target_link_libraries(SparkGameOpenWorld PRIVATE Jolt)
endif()
if(TARGET miniz)
target_link_libraries(SparkGameOpenWorld PRIVATE miniz)
endif()
if(TARGET tinyobjloader)
target_link_libraries(SparkGameOpenWorld PRIVATE tinyobjloader)
endif()
endif()

# Vulkan backend
if(SPARK_VULKAN_AVAILABLE)
target_compile_definitions(SparkGameOpenWorld PRIVATE SPARK_VULKAN_SUPPORT)
if(Vulkan_FOUND)
target_link_libraries(SparkGameOpenWorld PRIVATE Vulkan::Vulkan)
else()
target_include_directories(SparkGameOpenWorld PRIVATE ${Vulkan_INCLUDE_DIR})
target_link_libraries(SparkGameOpenWorld PRIVATE ${Vulkan_LIBRARY})
endif()
endif()

# OpenGL backend
if(SPARK_OPENGL_AVAILABLE)
target_compile_definitions(SparkGameOpenWorld PRIVATE SPARK_OPENGL_SUPPORT)
target_link_libraries(SparkGameOpenWorld PRIVATE OpenGL::GL)
if(TARGET glad)
target_link_libraries(SparkGameOpenWorld PRIVATE glad)
endif()
endif()

# Apply feature definitions
if(FEATURE_DEFINITIONS)
target_compile_definitions(SparkGameOpenWorld PRIVATE ${FEATURE_DEFINITIONS})
endif()

# ---------------------------------------------------------------------
# Post-build: Asset directories
# ---------------------------------------------------------------------
add_custom_command(TARGET SparkGameOpenWorld POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:SparkGameOpenWorld>/Shaders"
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:SparkGameOpenWorld>/Assets"
COMMENT "Creating SparkGameOpenWorld asset directory structure"
)

# Copy shaders from engine
set(SHADER_SOURCE_DIR "${ENGINE_SOURCE_DIR}/../Shaders/HLSL")
if(NOT EXISTS "${SHADER_SOURCE_DIR}")
set(SHADER_SOURCE_DIR "${CMAKE_SOURCE_DIR}/SparkEngine/Shaders/HLSL")
if(SPARK_GAME_OW_STANDALONE)
set(SHADER_SOURCE_DIR "${SPARK_ENGINE_DIR}/SparkEngine/Shaders/HLSL")
endif()
endif()
if(EXISTS "${SHADER_SOURCE_DIR}")
file(GLOB_RECURSE SHADER_FILES "${SHADER_SOURCE_DIR}/*.hlsl")
foreach(SHADER_FILE ${SHADER_FILES})
get_filename_component(SHADER_NAME ${SHADER_FILE} NAME)
add_custom_command(TARGET SparkGameOpenWorld POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${SHADER_FILE}
"$<TARGET_FILE_DIR:SparkGameOpenWorld>/Shaders/${SHADER_NAME}"
COMMENT "Copying shader ${SHADER_NAME}"
)
endforeach()
endif()

# ---------------------------------------------------------------------
# Visual Studio settings
# ---------------------------------------------------------------------
if(MSVC)
foreach(src ${SPARK_GAME_OW_SOURCES})
get_filename_component(dir "${src}" DIRECTORY)
file(RELATIVE_PATH grp "${CMAKE_CURRENT_SOURCE_DIR}/Source" "${dir}")
string(REPLACE "/" "\\\\" grp "${grp}")
if(grp STREQUAL "")
source_group("Source Files" FILES "${src}")
else()
source_group("Source Files\\\\${grp}" FILES "${src}")
endif()
endforeach()

if(SPARK_GAME_OW_STANDALONE)
set_property(TARGET SparkGameOpenWorld PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${SPARK_ENGINE_DIR}")
else()
set_property(TARGET SparkGameOpenWorld PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
endif()
endif()

message(STATUS "SparkGameOpenWorld configured as SHARED LIBRARY (open world game module DLL)")
if(SPARK_GAME_OW_STANDALONE)
message(STATUS " Mode: Standalone build")
message(STATUS " Engine: ${SPARK_ENGINE_DIR}")
else()
message(STATUS " Mode: Sub-project of SparkEngine")
endif()
Loading
Loading