Files
metabuilder/gameengine/CMakeLists.txt
johndoe6345789 8bed50f43d feat(gameengine): fix BSP winding + decompose loader into 7 chainable workflow steps
Fix CW→CCW winding bug on polygon/mesh faces (types 1,3) that caused
backface culling to discard half the geometry. Decompose the monolithic
bsp.load step (1028 lines) into atomic workflow steps chainable via
JSON connections — each step only runs when connected:

- bsp.load: open pk3, read + validate BSP, store raw data in context
- bsp.lightmap_atlas: build lightmap atlas, upload to GPU
- bsp.parse_spawn: parse entity lump for spawn point
- bsp.build_geometry: build face geometry with CW→CCW winding fix
- bsp.extract_textures: load textures from pk3 with mipmaps
- bsp.upload_geometry: upload merged VB/IB to GPU
- bsp.build_collision: create Bullet physics convex hull collision

Shared BSP structs extracted to bsp_types.hpp. Workflow JSON updated
to chain: load → lightmap → geometry → textures → upload → collision → spawn.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 13:27:55 +00:00

395 lines
22 KiB
CMake

cmake_minimum_required(VERSION 3.24)
option(BUILD_SDL3_APP "Build the SDL3 GPU demo" ON)
option(ENABLE_CLANG_TIDY "Automatically run clang-tidy on every target" OFF)
set(SDL_VERSION "SDL3" CACHE STRING "SDL version to use")
set_property(CACHE SDL_VERSION PROPERTY STRINGS SDL3 sdl)
project(SDL3App LANGUAGES CXX)
# Build type configuration
if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type" FORCE)
endif()
# C++ standard
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Warning flags - enforce no macros culture
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(
-Wmacro-redefined
-Wreserved-id-macro
)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
add_compile_options(
-Wbuiltin-macro-redefined
)
endif()
if(MSVC)
add_compile_options(/we4005) # macro redefinition
endif()
# Conan toolchain
if(EXISTS "${CMAKE_BINARY_DIR}/conan_toolchain.cmake")
include("${CMAKE_BINARY_DIR}/conan_toolchain.cmake")
endif()
# Ninja generator fixes
if(CMAKE_GENERATOR MATCHES "Ninja" OR CMAKE_GENERATOR MATCHES "Ninja Multi-Config")
if(DEFINED CMAKE_GENERATOR_PLATFORM)
set(CMAKE_GENERATOR_PLATFORM "" CACHE STRING "" FORCE)
endif()
if(DEFINED CMAKE_GENERATOR_TOOLSET)
set(CMAKE_GENERATOR_TOOLSET "" CACHE STRING "" FORCE)
endif()
endif()
# Windows Chocolatey paths
list(APPEND CMAKE_PROGRAM_PATH "C:/ProgramData/chocolatey/bin")
# Clang-tidy support
if(ENABLE_CLANG_TIDY)
find_program(CLANG_TIDY_EXE NAMES clang-tidy clang-tidy.exe HINTS "C:/Program Files/LLVM/bin" "C:/ProgramData/chocolatey/bin")
if(CLANG_TIDY_EXE)
if(WIN32)
set(CLANG_TIDY_WRAPPER "${CMAKE_CURRENT_BINARY_DIR}/clang_tidy_wrapper.bat")
file(WRITE ${CLANG_TIDY_WRAPPER}
"@echo off\nsetlocal\nset \"CLANG_TIDY_EXE=${CLANG_TIDY_EXE}\"\necho [clang-tidy] starting %*\n\"%CLANG_TIDY_EXE%\" %*\nset RET=%ERRORLEVEL%\necho [clang-tidy] finished (exit %RET%)\nexit /b %RET%\n"
)
else()
set(CLANG_TIDY_WRAPPER "${CMAKE_CURRENT_BINARY_DIR}/clang_tidy_wrapper.sh")
file(WRITE ${CLANG_TIDY_WRAPPER}
"#!/bin/sh\necho \"[clang-tidy] starting $@\"\n\"${CLANG_TIDY_EXE}\" \"$@\"\nret=$?\necho \"[clang-tidy] finished (exit $ret)\"\nexit $ret\n"
)
execute_process(COMMAND ${CMAKE_COMMAND} -E chmod +x ${CLANG_TIDY_WRAPPER})
endif()
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${CLANG_TIDY_WRAPPER})
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_WRAPPER}")
else()
message(WARNING "clang-tidy requested but not found")
endif()
endif()
# SDL selection
if(SDL_VERSION STREQUAL "SDL3")
find_package(SDL3 CONFIG REQUIRED)
set(SDL_TARGET SDL3::SDL3)
elseif(SDL_VERSION STREQUAL "sdl")
find_package(SDL CONFIG REQUIRED)
set(SDL_TARGET SDL::SDL)
else()
message(FATAL_ERROR "Invalid SDL_VERSION: ${SDL_VERSION}")
endif()
# Find all required packages
find_package(RapidJSON CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
find_package(Bullet CONFIG REQUIRED)
find_package(glm CONFIG REQUIRED)
find_package(stb CONFIG REQUIRED)
find_package(EnTT CONFIG REQUIRED)
find_package(assimp CONFIG REQUIRED)
find_package(libzip CONFIG REQUIRED)
# Build render stack library group
set(SDL3CPP_RENDER_STACK_LIBS EnTT::EnTT)
# Freetype library group
set(SDL3CPP_FREETYPE_LIBS)
if(TARGET Freetype::Freetype)
list(APPEND SDL3CPP_FREETYPE_LIBS Freetype::Freetype)
elseif(TARGET freetype::freetype)
list(APPEND SDL3CPP_FREETYPE_LIBS freetype::freetype)
endif()
# libzip library group
set(SDL3CPP_ZIP_LIBS)
if(TARGET libzip::zip)
list(APPEND SDL3CPP_ZIP_LIBS libzip::zip)
elseif(TARGET libzip::libzip)
list(APPEND SDL3CPP_ZIP_LIBS libzip::libzip)
endif()
# stb library group
set(SDL3CPP_STB_LIBS)
if(TARGET stb::stb_image)
list(APPEND SDL3CPP_STB_LIBS stb::stb_image)
elseif(TARGET stb::stb)
list(APPEND SDL3CPP_STB_LIBS stb::stb)
elseif(TARGET stb)
list(APPEND SDL3CPP_STB_LIBS stb)
endif()
# ============================================================================
# SOURCE FILE GROUPINGS
# ============================================================================
# Auto-discover source files from key directories using file(GLOB)
# JSON config service sources
file(GLOB JSON_CONFIG_SOURCES src/config/json_config*.cpp)
# Workflow service sources (all workflow steps in main workflow directory)
file(GLOB WORKFLOW_SOURCES src/services/impl/workflow/*.cpp)
# Remove problematic files with missing dependencies or incomplete implementations
list(REMOVE_ITEM WORKFLOW_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/tests/"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/config/"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/workflow_config_load_step.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/workflow_config_migration_step.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/workflow_config_schema_step.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/workflow_config_version_step.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/workflow_config_pipeline.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/graphics/workflow_graphics_shader_load_step.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/src/services/impl/workflow/rendering/workflow_render_cube_grid_step.cpp"
)
# Frame-specific workflow steps
file(GLOB FRAME_WORKFLOW_SOURCES src/services/impl/workflow/frame/*.cpp)
# Apply same exclusions to frame sources
list(REMOVE_ITEM FRAME_WORKFLOW_SOURCES
)
# Generic workflow steps (atomic, reusable steps)
file(GLOB GENERIC_WORKFLOW_SOURCES src/services/impl/workflow/generic_steps/*.cpp)
# ============================================================================
# EXECUTABLE TARGETS
# ============================================================================
if(BUILD_SDL3_APP)
add_executable(sdl3_app
src/main.cpp
src/services/impl/diagnostics/logger_service.cpp
src/services/impl/workflow/workflow_executor.cpp
src/services/impl/workflow/workflow_step_registry.cpp
src/services/impl/workflow/workflow_exit_step.cpp
src/services/impl/workflow/workflow_parameter_reader.cpp
src/services/impl/workflow/workflow_step_io_resolver.cpp
src/services/impl/workflow/workflow_step_parameter_resolver.cpp
src/services/impl/workflow/workflow_registrar.cpp
src/services/impl/workflow/workflow_sdl_init_step.cpp
src/services/impl/workflow/workflow_sdl_window_create_step.cpp
src/services/impl/workflow/workflow_app_init_step.cpp
src/services/impl/workflow/workflow_load_workflow_step.cpp
src/services/impl/workflow/workflow_definition_parser.cpp
src/services/impl/workflow/workflow_definition_parser_nodes.cpp
src/services/impl/workflow/workflow_definition_parser_variables.cpp
src/services/impl/workflow/workflow_connection_resolver.cpp
src/services/impl/workflow/workflow_execute_step.cpp
src/stb_image.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_array_append_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_array_create_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_pause_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_play_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_resume_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_seek_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_set_looping_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_set_volume_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_audio_stop_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_bool_and_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_bool_not_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_bool_or_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_build_view_state_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_fps_update_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_look_at_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_set_fov_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_set_pose_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_setup_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_camera_teleport_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_eq_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_gt_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_gte_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_lt_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_lte_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_compare_ne_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_control_for_each_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_control_if_else_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_control_switch_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_control_while_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_debug_log_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_debug_metrics_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_gamepad_axis_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_gamepad_button_pressed_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_key_pressed_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_mouse_button_pressed_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_mouse_grab_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_mouse_position_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_input_poll_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_append_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_concat_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_count_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_filter_equals_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_filter_gt_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_literal_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_map_add_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_map_mul_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_reduce_max_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_reduce_min_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_list_reduce_sum_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_model_despawn_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_model_set_transform_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_abs_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_add_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_clamp_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_div_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_max_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_min_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_mul_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_round_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_number_sub_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_particle_emit_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_particle_update_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_physics_body_add_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_physics_fps_move_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_physics_step_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_physics_sync_transforms_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_physics_world_create_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_concat_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_contains_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_equals_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_format_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_join_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_lower_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_replace_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_split_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_trim_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_string_upper_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_try_catch_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_assert_exists_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_assert_type_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_clear_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_copy_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_default_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_value_literal_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_variable_get_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_variable_set_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_vfx_destroy_step.cpp
src/services/impl/workflow/workflow_generic_steps/workflow_vfx_spawn_step.cpp
src/services/impl/workflow/geometry/workflow_geometry_create_cube_step.cpp
src/services/impl/workflow/geometry/workflow_geometry_create_plane_step.cpp
src/services/impl/workflow/geometry/workflow_geometry_cube_generate_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_load_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_lightmap_atlas_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_parse_spawn_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_build_geometry_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_extract_textures_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_upload_geometry_step.cpp
src/services/impl/workflow/rendering/workflow_bsp_build_collision_step.cpp
src/services/impl/workflow/rendering/workflow_draw_map_step.cpp
src/services/impl/workflow/rendering/workflow_draw_textured_box_step.cpp
src/services/impl/workflow/rendering/workflow_draw_textured_step.cpp
src/services/impl/workflow/rendering/workflow_draw_viewmodel_step.cpp
src/services/impl/workflow/rendering/workflow_frame_begin_gpu_step.cpp
src/services/impl/workflow/rendering/workflow_frame_begin_offscreen_step.cpp
src/services/impl/workflow/rendering/workflow_frame_draw_bodies_step.cpp
src/services/impl/workflow/rendering/workflow_frame_end_gpu_step.cpp
src/services/impl/workflow/rendering/workflow_frame_end_scene_step.cpp
src/services/impl/workflow/rendering/workflow_geometry_create_flashlight_step.cpp
src/services/impl/workflow/rendering/workflow_lighting_setup_step.cpp
src/services/impl/workflow/rendering/workflow_map_load_step.cpp
src/services/impl/workflow/rendering/workflow_model_load_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_bloom_blur_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_bloom_extract_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_composite_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_setup_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_ssao_step.cpp
src/services/impl/workflow/rendering/workflow_postfx_taa_step.cpp
src/services/impl/workflow/rendering/workflow_render_grid_draw_step.cpp
src/services/impl/workflow/rendering/workflow_render_grid_setup_step.cpp
src/services/impl/workflow/rendering/workflow_render_prepare_step.cpp
src/services/impl/workflow/rendering/workflow_shadow_pass_step.cpp
src/services/impl/workflow/rendering/workflow_shadow_setup_step.cpp
src/services/impl/workflow/rendering/workflow_spawn_apply_step.cpp
src/services/impl/workflow/rendering/workflow_spotlight_setup_step.cpp
src/services/impl/workflow/rendering/workflow_spotlight_update_step.cpp
src/services/impl/workflow/graphics/workflow_gpu_pipeline_create_step.cpp
src/services/impl/workflow/graphics/workflow_gpu_shader_compile_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_buffer_create_index_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_buffer_create_vertex_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_buffer_upload_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_draw_submit_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_frame_begin_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_frame_end_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_framebuffer_readback_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_gpu_init_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_init_renderer_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_init_viewport_step.cpp
src/services/impl/workflow/graphics/workflow_graphics_screenshot_request_step.cpp
src/services/impl/workflow/graphics/workflow_texture_load_step.cpp
src/services/impl/workflow/input/workflow_input_axis_combine_step.cpp
src/services/impl/workflow/input/workflow_input_button_combine_step.cpp
src/services/impl/workflow/input/workflow_input_gamepad_poll_step.cpp
src/services/impl/workflow/input/workflow_input_keyboard_poll_step.cpp
src/services/impl/workflow/input/workflow_input_mouse_poll_step.cpp
src/services/impl/workflow/input/workflow_input_poll_all_step.cpp
src/services/impl/workflow/scene/workflow_scene_add_geometry_step.cpp
src/services/impl/workflow/scene/workflow_scene_clear_step.cpp
src/services/impl/workflow/scene/workflow_scene_create_step.cpp
src/services/impl/workflow/scene/workflow_scene_get_bounds_step.cpp
src/services/impl/workflow/scene/workflow_scene_load_step.cpp
src/services/impl/workflow/scene/workflow_scene_remove_geometry_step.cpp
src/services/impl/workflow/scene/workflow_scene_set_active_step.cpp
src/services/impl/workflow/scene/workflow_scene_update_step.cpp
src/services/impl/workflow/compute/workflow_compute_pipeline_create_step.cpp
src/services/impl/workflow/compute/workflow_compute_tessellate_dispatch_step.cpp
src/services/impl/workflow/compute/workflow_compute_tessellate_step.cpp
src/services/impl/workflow/workflow_camera_view_state_builder.cpp
src/services/impl/workflow/workflow_cmdline_args_step.cpp
src/services/impl/workflow/workflow_data_deserialize_step.cpp
src/services/impl/workflow/workflow_data_serialize_step.cpp
src/services/impl/workflow/workflow_graphics_init_device_step.cpp
src/services/impl/workflow/workflow_graphics_init_swapchain_step.cpp
src/services/impl/workflow/workflow_media_catalog_scan_step.cpp
src/services/impl/workflow/workflow_media_item_select_step.cpp
src/services/impl/workflow/workflow_network_connect_step.cpp
src/services/impl/workflow/workflow_network_receive_step.cpp
src/services/impl/workflow/workflow_network_send_step.cpp
src/services/impl/workflow/workflow_package_shader_loader_step.cpp
src/services/impl/workflow/workflow_shader_builtin_constant_color_step.cpp
src/services/impl/workflow/workflow_shader_compile_step.cpp
src/services/impl/workflow/workflow_shader_system_initialize_step.cpp
src/services/impl/workflow/workflow_shader_system_set_step.cpp
src/services/impl/workflow/workflow_state_clear_step.cpp
src/services/impl/workflow/workflow_state_load_step.cpp
src/services/impl/workflow/workflow_state_save_step.cpp
src/services/impl/workflow/workflow_template_resolver.cpp
)
target_include_directories(sdl3_app PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/src"
)
target_link_libraries(sdl3_app PRIVATE
${SDL_TARGET}
rapidjson
nlohmann_json::nlohmann_json
Bullet::Bullet
glm::glm
stb::stb
EnTT::EnTT
libzip::zip
assimp::assimp
)
endif()
# ============================================================================
# FILE COPYING
# ============================================================================
if(BUILD_SDL3_APP)
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/packages")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/packages" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
endif()
endif()