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
255 changes: 255 additions & 0 deletions GameModules/SparkGameEngineEditor/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,255 @@
cmake_minimum_required(VERSION 3.25)

# ================================================================
# SparkGameEngineEditor - Engine/Editor No-Code Game Module DLL
#
# Showcases SparkEngine's no-code game creation tools:
# - Visual scripting with typed node graphs and pin validation
# - Level design with prefab placement, terrain, and foliage
# - Visual material editor with PBR output channels
# - VFX/particle authoring with composable emitter modules
# - Animation state machine editor with IK and blend layers
# - WYSIWYG UI editor with widget trees and data binding
# - Rapid prototyping with blockout meshes and game templates
# - Asset pipeline with import, LOD, compression, and packaging
# - Engine integration with project save/load and undo/redo
#
# Built as a shared library loaded by the engine at runtime.
# ================================================================

if(NOT CMAKE_PROJECT_NAME OR CMAKE_PROJECT_NAME STREQUAL "SparkGameEngineEditor")
project(SparkGameEngineEditor LANGUAGES CXX)
set(SPARK_GAME_EE_STANDALONE TRUE)
else()
set(SPARK_GAME_EE_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_EE_STANDALONE)
if(NOT SPARK_ENGINE_DIR)
set(SPARK_ENGINE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." CACHE PATH
"Path to SparkEngine root directory")
endif()

message(STATUS "SparkGameEngineEditor 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 SparkGameEngineEditor source files
# ---------------------------------------------------------------------
file(GLOB_RECURSE SPARK_GAME_EE_SOURCES
CONFIGURE_DEPENDS
"Source/*.cpp"
"Source/*.h"
"Source/*.hpp"
)
list(FILTER SPARK_GAME_EE_SOURCES EXCLUDE REGEX ".*[Tt]est.*")
list(FILTER SPARK_GAME_EE_SOURCES EXCLUDE REGEX ".*[Ee]xample.*")

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

target_compile_definitions(SparkGameEngineEditor PRIVATE SPARK_GAME_DLL SPARK_MODULE_DLL)

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

# ---------------------------------------------------------------------
# Include directories
# ---------------------------------------------------------------------
if(SPARK_GAME_EE_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(SparkGameEngineEditor PRIVATE
"Source"
"${ENGINE_SOURCE_DIR}"
"${SPARK_SDK_INCLUDE_DIR}"
${THIRDPARTY_INCLUDE_DIRS}
)

# ---------------------------------------------------------------------
# Platform-specific libraries
# ---------------------------------------------------------------------
if(WIN32)
target_link_libraries(SparkGameEngineEditor 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(SparkGameEngineEditor PRIVATE
WIN32_LEAN_AND_MEAN NOMINMAX _CRT_SECURE_NO_WARNINGS SPARK_PLATFORM_WINDOWS
)
else()
find_package(Threads REQUIRED)
target_link_libraries(SparkGameEngineEditor PRIVATE
Threads::Threads
${CMAKE_DL_LIBS}
)
if(APPLE)
target_compile_definitions(SparkGameEngineEditor PRIVATE SPARK_PLATFORM_MACOS)
else()
target_compile_definitions(SparkGameEngineEditor PRIVATE SPARK_PLATFORM_LINUX)
endif()
endif()

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

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

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

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

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

# ---------------------------------------------------------------------
# Post-build: Asset directories
# ---------------------------------------------------------------------
add_custom_command(TARGET SparkGameEngineEditor POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:SparkGameEngineEditor>/Shaders"
COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:SparkGameEngineEditor>/Assets"
COMMENT "Creating SparkGameEngineEditor 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_EE_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 SparkGameEngineEditor POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${SHADER_FILE}
"$<TARGET_FILE_DIR:SparkGameEngineEditor>/Shaders/${SHADER_NAME}"
COMMENT "Copying shader ${SHADER_NAME}"
)
endforeach()
endif()

# ---------------------------------------------------------------------
# Visual Studio settings
# ---------------------------------------------------------------------
if(MSVC)
foreach(src ${SPARK_GAME_EE_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_EE_STANDALONE)
set_property(TARGET SparkGameEngineEditor PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${SPARK_ENGINE_DIR}")
else()
set_property(TARGET SparkGameEngineEditor PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
endif()
endif()

message(STATUS "SparkGameEngineEditor configured as SHARED LIBRARY (engine editor game module DLL)")
if(SPARK_GAME_EE_STANDALONE)
message(STATUS " Mode: Standalone build")
message(STATUS " Engine: ${SPARK_ENGINE_DIR}")
else()
message(STATUS " Mode: Sub-project of SparkEngine")
endif()
Loading
Loading