Checkpoint 1: implement native subsystems and begin the gameplay manual

This commit is contained in:
Emil
2026-09-18 03:01:30 +03:00
parent decf49084d
commit 903c97444b
73 changed files with 3932 additions and 6 deletions
+15
View File
@@ -0,0 +1,15 @@
add_library(faset_assets
${PROJECT_SOURCE_DIR}/src/assets/asset_pipeline.cpp
${PROJECT_SOURCE_DIR}/src/assets/cgltf.cpp)
target_compile_features(faset_assets PUBLIC cxx_std_20)
target_include_directories(faset_assets PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(faset_assets PUBLIC faset_core nlohmann_json::nlohmann_json PRIVATE faset_cgltf)
if(BUILD_TESTING)
add_executable(faset_assets_tests ${PROJECT_SOURCE_DIR}/tests/assets_pipeline.cpp)
target_link_libraries(faset_assets_tests PRIVATE faset_assets)
add_test(NAME assets_pipeline COMMAND faset_assets_tests)
find_package(Python3 COMPONENTS Interpreter QUIET)
if(Python3_Interpreter_FOUND)
add_test(NAME assets_blender_bundle COMMAND ${Python3_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tests/assets_bundle_test.py)
endif()
endif()
+8
View File
@@ -0,0 +1,8 @@
add_library(faset_authoring STATIC src/authoring/schema.cpp src/authoring/service.cpp src/authoring/templates.cpp)
target_include_directories(faset_authoring PUBLIC "${PROJECT_SOURCE_DIR}/include")
target_link_libraries(faset_authoring PUBLIC faset_core)
if(BUILD_TESTING)
add_executable(faset_authoring_tests tests/authoring_tests.cpp)
target_link_libraries(faset_authoring_tests PRIVATE faset_authoring)
add_test(NAME authoring COMMAND faset_authoring_tests)
endif()
+62
View File
@@ -0,0 +1,62 @@
include(FetchContent)
file(READ "${PROJECT_SOURCE_DIR}/dependencies.lock.json" FASET_DEPENDENCY_LOCK)
function(faset_dependency name)
string(JSON url GET "${FASET_DEPENDENCY_LOCK}" dependencies ${name} url)
string(JSON hash GET "${FASET_DEPENDENCY_LOCK}" dependencies ${name} sha256)
string(JSON commit GET "${FASET_DEPENDENCY_LOCK}" dependencies ${name} commit)
set(archive "${PROJECT_SOURCE_DIR}/.cache/downloads/${name}-${commit}.tar.gz")
if(EXISTS "${archive}")
set(url "${archive}")
endif()
FetchContent_Declare(${name} URL "${url}" URL_HASH "SHA256=${hash}" DOWNLOAD_EXTRACT_TIMESTAMP TRUE)
FetchContent_MakeAvailable(${name})
FetchContent_GetProperties(${name} SOURCE_DIR source)
set(FASET_${name}_SOURCE_DIR "${source}" PARENT_SCOPE)
endfunction()
set(JSON_BuildTests OFF CACHE BOOL "" FORCE)
set(JSON_Install OFF CACHE BOOL "" FORCE)
set(ENTT_BUILD_TESTING OFF CACHE BOOL "" FORCE)
set(BOX2D_SAMPLES OFF CACHE BOOL "" FORCE)
set(BOX2D_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(BOX2D_BENCHMARKS OFF CACHE BOOL "" FORCE)
set(BOX2D_AVX2 OFF CACHE BOOL "" FORCE)
set(BOX3D_SAMPLES OFF CACHE BOOL "" FORCE)
set(BOX3D_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(BOX3D_BENCHMARKS OFF CACHE BOOL "" FORCE)
set(BOX3D_BUILD_SHADERS OFF CACHE BOOL "" FORCE)
faset_dependency(json)
faset_dependency(entt)
faset_dependency(box2d)
faset_dependency(box3d)
faset_dependency(cgltf)
add_library(faset_cgltf INTERFACE)
target_include_directories(faset_cgltf INTERFACE "${FASET_cgltf_SOURCE_DIR}")
faset_dependency(stb)
add_library(faset_stb INTERFACE)
target_include_directories(faset_stb INTERFACE "${FASET_stb_SOURCE_DIR}")
# Keep the CRT compatible across Faset and physics libraries, including editor plugins.
if(MSVC)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
set_property(TARGET box2d box3d PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
endif()
if(FASET_BUILD_RENDERER)
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
set(SDL_STATIC ON CACHE BOOL "" FORCE)
set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
set(SDL_TESTS OFF CACHE BOOL "" FORCE)
set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)
set(SDL_INSTALL OFF CACHE BOOL "" FORCE)
faset_dependency(sdl3)
find_package(Vulkan 1.3 REQUIRED)
endif()
if(FASET_DEBUG_IMGUI)
faset_dependency(imgui)
add_library(faset_imgui STATIC
"${FASET_imgui_SOURCE_DIR}/imgui.cpp" "${FASET_imgui_SOURCE_DIR}/imgui_draw.cpp"
"${FASET_imgui_SOURCE_DIR}/imgui_tables.cpp" "${FASET_imgui_SOURCE_DIR}/imgui_widgets.cpp")
target_include_directories(faset_imgui PUBLIC "${FASET_imgui_SOURCE_DIR}")
endif()
+39
View File
@@ -0,0 +1,39 @@
find_package(Vulkan 1.3 REQUIRED)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
find_program(SLANGC_EXECUTABLE NAMES slangc HINTS "${PROJECT_SOURCE_DIR}/.cache/slang/bin" "$ENV{VULKAN_SDK}/bin")
if(NOT SLANGC_EXECUTABLE)
message(FATAL_ERROR "Slang compiler missing. Run: python tools/fetch_slang.py, or set SLANGC_EXECUTABLE.")
endif()
set(FASET_SHADER_DIRECTORY "${CMAKE_BINARY_DIR}/shaders")
file(MAKE_DIRECTORY "${FASET_SHADER_DIRECTORY}")
set(FASET_SHADER_OUTPUTS)
foreach(FASET_ENTRY vertexMain fragmentMain shadowMain)
set(FASET_SHADER_OUTPUT "${FASET_SHADER_DIRECTORY}/${FASET_ENTRY}.spv")
add_custom_command(OUTPUT "${FASET_SHADER_OUTPUT}"
COMMAND "${SLANGC_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/shaders/baseline.slang"
-entry "${FASET_ENTRY}" -target spirv -profile spirv_1_6 -matrix-layout-column-major
-o "${FASET_SHADER_OUTPUT}" -reflection-json "${FASET_SHADER_DIRECTORY}/${FASET_ENTRY}.reflection.json"
BYPRODUCTS "${FASET_SHADER_DIRECTORY}/${FASET_ENTRY}.reflection.json"
DEPENDS "${PROJECT_SOURCE_DIR}/shaders/baseline.slang" VERBATIM)
list(APPEND FASET_SHADER_OUTPUTS "${FASET_SHADER_OUTPUT}")
endforeach()
add_custom_command(OUTPUT "${FASET_SHADER_DIRECTORY}/compatibility.spv"
COMMAND "${SLANGC_EXECUTABLE}" "${PROJECT_SOURCE_DIR}/shaders/compatibility.hlsl"
-entry compatibilityMain -stage compute -target spirv -profile spirv_1_6
-o "${FASET_SHADER_DIRECTORY}/compatibility.spv"
DEPENDS "${PROJECT_SOURCE_DIR}/shaders/compatibility.hlsl" VERBATIM)
add_custom_target(faset_shaders DEPENDS ${FASET_SHADER_OUTPUTS} "${FASET_SHADER_DIRECTORY}/compatibility.spv")
add_library(faset_render "${PROJECT_SOURCE_DIR}/src/render/renderer.cpp" "${PROJECT_SOURCE_DIR}/src/render/math.cpp" "${PROJECT_SOURCE_DIR}/src/render/render_graph.cpp")
target_include_directories(faset_render PUBLIC "${PROJECT_SOURCE_DIR}/include")
target_compile_features(faset_render PUBLIC cxx_std_20)
target_link_libraries(faset_render PRIVATE Vulkan::Vulkan SDL3::SDL3)
target_compile_definitions(faset_render PRIVATE FASET_SHADER_DIRECTORY="${FASET_SHADER_DIRECTORY}")
add_dependencies(faset_render faset_shaders)
if(BUILD_TESTING)
add_executable(faset_render_tests "${PROJECT_SOURCE_DIR}/tests/render_tests.cpp")
target_link_libraries(faset_render_tests PRIVATE faset_render)
add_test(NAME render_graph COMMAND faset_render_tests --unit)
add_test(NAME render_offscreen COMMAND faset_render_tests --gpu "${CMAKE_BINARY_DIR}/render-test.ppm")
set_tests_properties(render_offscreen PROPERTIES LABELS "gpu")
endif()
install(FILES ${FASET_SHADER_OUTPUTS} DESTINATION shaders)
+18
View File
@@ -0,0 +1,18 @@
add_library(faset_runtime STATIC
${CMAKE_CURRENT_LIST_DIR}/../src/runtime/Runtime.cpp
${CMAKE_CURRENT_LIST_DIR}/../src/runtime/Physics.cpp)
add_library(Faset::Runtime ALIAS faset_runtime)
target_compile_features(faset_runtime PUBLIC cxx_std_20)
target_include_directories(faset_runtime PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../include)
target_link_libraries(faset_runtime PUBLIC nlohmann_json::nlohmann_json PRIVATE EnTT::EnTT box2d box3d)
add_library(faset_gameplay STATIC ${CMAKE_CURRENT_LIST_DIR}/../examples/gameplay/Gameplay.cpp)
add_library(Faset::Gameplay ALIAS faset_gameplay)
target_include_directories(faset_gameplay PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../examples/gameplay)
target_link_libraries(faset_gameplay PUBLIC faset_runtime)
if(BUILD_TESTING)
add_executable(faset_runtime_tests ${CMAKE_CURRENT_LIST_DIR}/../tests/runtime_tests.cpp)
target_link_libraries(faset_runtime_tests PRIVATE faset_runtime faset_gameplay)
add_test(NAME runtime_contracts COMMAND faset_runtime_tests)
endif()