From fa0940fe9020b45b6562cd7cef5455a18977c1da Mon Sep 17 00:00:00 2001 From: Matt Penny Date: Fri, 13 Sep 2024 00:53:55 -0400 Subject: [PATCH] Work on CMake conversion: test chambers Incidental changes along the way: * Move `export_level.lua` to `tools/level_scripts/` * Small reorganizations/fixes to existing `CMakeLists.txt` files * Support passing absolute paths to level export --- CMakeLists.txt | 3 + Makefile | 2 +- assets/CMakeLists.txt | 1 + assets/materials/CMakeLists.txt | 17 ++- assets/sound/CMakeLists.txt | 4 +- assets/test_chambers/CMakeLists.txt | 165 +++++++++++++++++++++ tools/{ => level_scripts}/export_level.lua | 0 tools/level_scripts/util.lua | 6 + tools/level_scripts/yaml_loader.lua | 9 +- 9 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 assets/test_chambers/CMakeLists.txt rename tools/{ => level_scripts}/export_level.lua (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index a0dccb7..1e8ba60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(portal64) # Tools # TODO: find automatically # TODO: test on Windows +set(BLENDER_3_6 "blender") set(FFMPEG "ffmpeg") set(IMAGEMAGICK_CONVERT "convert") set(MPG123 "mpg123") @@ -15,6 +16,8 @@ set(VPK "vpk") set(VTF2PNG "vtf2png") set(CONVERT_ASSET "${PROJECT_SOURCE_DIR}/tools/convert_asset.py") +set(EXPORT_FBX "${PROJECT_SOURCE_DIR}/tools/export_fbx.py") +set(GEN_LEVEL_LIST "${PROJECT_SOURCE_DIR}/tools/generate_level_list.js") set(GEN_SOUND_IDS "${PROJECT_SOURCE_DIR}/tools/generate_sound_ids.js") set(JSOX "${PROJECT_SOURCE_DIR}/tools/jsox.js") set(SKELETOOL64 "${PROJECT_SOURCE_DIR}/skelatool64/skeletool64") diff --git a/Makefile b/Makefile index fbe918e..56f7106 100644 --- a/Makefile +++ b/Makefile @@ -463,7 +463,7 @@ build/%.fbx: %.blend $(BLENDER_3_6) $< --background --python tools/export_fbx.py -- $@ build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c build/assets/test_chambers/%_anim.c: build/assets/test_chambers/%.fbx assets/test_chambers/%.yaml build/assets/materials/static.h build/src/audio/subtitles.h $(SKELATOOL64) $(TEXTURE_IMAGES) $(LUA_FILES) - $(SKELATOOL64) --script tools/export_level.lua --fixed-point-scale ${SCENE_SCALE} --model-scale 0.01 --name $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $< + $(SKELATOOL64) --script tools/level_scripts/export_level.lua --fixed-point-scale ${SCENE_SCALE} --model-scale 0.01 --name $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $< build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h @mkdir -p $(@D) diff --git a/assets/CMakeLists.txt b/assets/CMakeLists.txt index b3b4a6b..28e6b46 100644 --- a/assets/CMakeLists.txt +++ b/assets/CMakeLists.txt @@ -17,3 +17,4 @@ endif() add_subdirectory(materials) add_subdirectory(sound) +add_subdirectory(test_chambers) diff --git a/assets/materials/CMakeLists.txt b/assets/materials/CMakeLists.txt index 2d1fdbc..4206d07 100644 --- a/assets/materials/CMakeLists.txt +++ b/assets/materials/CMakeLists.txt @@ -174,7 +174,14 @@ function(_add_extract_frame_command INPUT_FILE OUTPUT_FILE SECONDS) COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} COMMAND - ${FFMPEG} -ss 00:00:${SECONDS} -i ${INPUT_FILE} -frames:v 1 -update true -q:v 2 -loglevel quiet -y ${OUTPUT_FILE} + ${FFMPEG} + -ss 00:00:${SECONDS} + -i ${INPUT_FILE} + -frames:v 1 + -update true + -q:v 2 + -loglevel error + -y ${OUTPUT_FILE} COMMAND ${IMAGEMAGICK_CONVERT} ${OUTPUT_FILE} -crop 491x369+265+202 -resize 160x120 ${OUTPUT_FILE} COMMENT @@ -230,7 +237,8 @@ function(_add_texture_transform_command TEXTURE_SCRIPT OUTPUT_LIST) OUTPUT ${OUTPUT_FILES} COMMAND - ${PYTHON3} ${CONVERT_ASSET} ${IMAGEMAGICK_CONVERT} ${INPUT_FILE} ${TEXTURE_SCRIPT} ${OUTPUT_FILE} + ${PYTHON3} ${CONVERT_ASSET} + ${IMAGEMAGICK_CONVERT} ${INPUT_FILE} ${TEXTURE_SCRIPT} ${OUTPUT_FILE} WORKING_DIRECTORY # TODO: Change this to PAK_MODIFIED_MATERIALS_DIR and update .ims files with relative path ${PROJECT_SOURCE_DIR} @@ -401,7 +409,10 @@ function(_add_material_generate_command INPUT_FILE OUTPUT_LIST) OUTPUT ${OUTPUT_FILE_H} ${OUTPUT_FILE_C} COMMAND - ${SKELETOOL64} --name ${MATERIAL_NAME} -m ${INPUT_FILE} --material-output -o ${OUTPUT_FILE_H} + ${SKELETOOL64} + --name ${MATERIAL_NAME} + -m ${INPUT_FILE} + --material-output -o ${OUTPUT_FILE_H} COMMENT "Generating materials for $" VERBATIM diff --git a/assets/sound/CMakeLists.txt b/assets/sound/CMakeLists.txt index c342442..9a2c6d5 100644 --- a/assets/sound/CMakeLists.txt +++ b/assets/sound/CMakeLists.txt @@ -27,7 +27,7 @@ function(_add_extract_video_audio_command INPUT_FILE OUTPUT_FILE) COMMAND ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} COMMAND - ${FFMPEG} -i ${INPUT_FILE} -vn -loglevel quiet -y ${OUTPUT_FILE} + ${FFMPEG} -i ${INPUT_FILE} -vn -loglevel error -y ${OUTPUT_FILE} COMMENT "Converting $" VERBATIM @@ -424,7 +424,7 @@ set(LANGUAGES_H "${BUILD_AUDIO_DIR}/languages.h") set(LANGUAGES_C "${BUILD_AUDIO_DIR}/languages.c") add_custom_command( DEPENDS - all_sounds ${SOUND_TABLE_DEPENDENCIES} + all_sounds ${GEN_SOUND_IDS} ${SOUND_TABLE_DEPENDENCIES} OUTPUT ${CLIPS_H} ${LANGUAGES_H} ${LANGUAGES_C} COMMAND diff --git a/assets/test_chambers/CMakeLists.txt b/assets/test_chambers/CMakeLists.txt new file mode 100644 index 0000000..69791d3 --- /dev/null +++ b/assets/test_chambers/CMakeLists.txt @@ -0,0 +1,165 @@ +cmake_path( + RELATIVE_PATH CMAKE_CURRENT_SOURCE_DIR + BASE_DIRECTORY "${PROJECT_SOURCE_DIR}" + OUTPUT_VARIABLE RELATIVE_CURRENT_DIR +) + +################## +## Level export ## +################## + +set(SCENE_SCALE 128) +set(MODEL_SCALE 0.01) + +set(LEVELS + test_chamber_00 + test_chamber_01 + test_chamber_02 + test_chamber_03 + test_chamber_04 + test_chamber_05 + test_chamber_06 + test_chamber_07 + test_chamber_08 + test_chamber_09 + test_chamber_10 +) + +set(LEVEL_MATERIALS + ${ASSETS_DIR}/materials/static.skm.yaml +) + +set(EXPORT_LEVEL ${PROJECT_SOURCE_DIR}/tools/level_scripts/export_level.lua) +set(EXPORT_SCRIPTS + ${PROJECT_SOURCE_DIR}/tools/level_scripts/animation.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/collision_export.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/dynamic_collision_export.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/entities.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/portal_surfaces.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/room_export.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/signals.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/static_export.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/trigger.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/util.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/world.lua + ${PROJECT_SOURCE_DIR}/tools/level_scripts/yaml_loader.lua +) + +function(_add_level_export_command LEVEL_NAME OUTPUT_VARIABLE) + set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${LEVEL_NAME}/${LEVEL_NAME}.blend") + set(OUTPUT_FILE "${CMAKE_BINARY_DIR}/${RELATIVE_CURRENT_DIR}/${LEVEL_NAME}/${LEVEL_NAME}.fbx") + + cmake_path( + GET OUTPUT_FILE PARENT_PATH + OUTPUT_DIR + ) + + add_custom_command( + DEPENDS + ${EXPORT_FBX} ${INPUT_FILE} + OUTPUT + ${OUTPUT_FILE} + COMMAND + ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} + COMMAND + ${BLENDER_3_6} ${INPUT_FILE} --background --python ${EXPORT_FBX} -- ${OUTPUT_FILE} + COMMENT + "Exporting $" + VERBATIM + ) + + set(${OUTPUT_VARIABLE} ${OUTPUT_FILE}) + return(PROPAGATE ${OUTPUT_VARIABLE}) +endfunction() + +function(_add_level_generate_command LEVEL_NAME LEVEL_FBX OUTPUT_LIST) + set(LEVEL_YAML "${CMAKE_CURRENT_SOURCE_DIR}/${LEVEL_NAME}/${LEVEL_NAME}.yaml") + + cmake_path( + REMOVE_EXTENSION LEVEL_FBX + OUTPUT_VARIABLE OUTPUT_FILE_NO_EXTENSION + ) + + set(OUTPUT_FILE_H "${OUTPUT_FILE_NO_EXTENSION}.h") + set(OUTPUT_FILE_GEO_C "${OUTPUT_FILE_NO_EXTENSION}_geo.c") + + # TODO: not all levels have animations + # set(OUTPUT_FILE_ANIM_C "${OUTPUT_FILE_NO_EXTENSION}_anim.c") + + set(MATERIAL_ARGS "") + foreach(MATERIAL ${LEVEL_MATERIALS}) + list(APPEND MATERIAL_ARGS + -m ${MATERIAL} + ) + endforeach() + + add_custom_command( + DEPENDS + ${EXPORT_LEVEL} ${LEVEL_FBX} ${LEVEL_YAML} ${LEVEL_MATERIALS} + OUTPUT + ${OUTPUT_FILE_H} ${OUTPUT_FILE_GEO_C} ${OUTPUT_FILE_ANIM_C} + COMMAND + ${SKELETOOL64} + --script ${EXPORT_LEVEL} + --fixed-point-scale ${SCENE_SCALE} + --model-scale ${MODEL_SCALE} + --name ${LEVEL_NAME} + ${MATERIAL_ARGS} + --output ${OUTPUT_FILE_H} + ${LEVEL_FBX} + WORKING_DIRECTORY + ${PROJECT_SOURCE_DIR} + COMMENT + "Generating level ${LEVEL_NAME}" + VERBATIM + ) + + list(APPEND ${OUTPUT_LIST} + ${OUTPUT_FILE_H} + ${OUTPUT_FILE_GEO_C} + ${OUTPUT_FILE_ANIM_C} + ) + return(PROPAGATE ${OUTPUT_LIST}) +endfunction() + +# Add commands for exporting level files + +set(LEVEL_GENERATED_FILES "") + +foreach(LEVEL ${LEVELS}) + _add_level_export_command(${LEVEL} LEVEL_FBX) + _add_level_generate_command(${LEVEL} ${LEVEL_FBX} LEVEL_GENERATED_FILES) +endforeach() + +add_custom_target( + all_levels + DEPENDS ${LEVEL_GENERATED_FILES} +) + +# Add command for generating level list header + +set(LEVEL_GENERATED_HEADERS ${LEVEL_GENERATED_FILES}) +list(FILTER LEVEL_GENERATED_HEADERS INCLUDE REGEX "\.h$") + +set(LEVEL_LIST_OUT_DIR "${CMAKE_BINARY_DIR}/${RELATIVE_CURRENT_DIR}") +set(LEVEL_LIST "${LEVEL_LIST_OUT_DIR}/level_list.h") + +add_custom_command( + DEPENDS + ${GENERATE_LEVEL_LIST} ${LEVEL_GENERATED_HEADERS} + OUTPUT + ${LEVEL_LIST} + COMMAND + ${NODEJS} ${GEN_LEVEL_LIST} ${LEVEL_LIST} ${LEVEL_GENERATED_HEADERS} + WORKING_DIRECTORY + ${LEVEL_LIST_OUT_DIR} + COMMENT + "Generating $" + VERBATIM +) + +# TODO: remove +add_custom_target( + level_list + DEPENDS ${LEVEL_LIST} +) diff --git a/tools/export_level.lua b/tools/level_scripts/export_level.lua similarity index 100% rename from tools/export_level.lua rename to tools/level_scripts/export_level.lua diff --git a/tools/level_scripts/util.lua b/tools/level_scripts/util.lua index b72f097..d9097cb 100644 --- a/tools/level_scripts/util.lua +++ b/tools/level_scripts/util.lua @@ -29,7 +29,13 @@ local function trim(inputstr) return string.sub(inputstr, start_index, end_index) end +local function path_join(...) + local dir_sep = package.config:sub(1,1) + return table.concat({...}, dir_sep) +end + return { string_split = string_split, trim = trim, + path_join = path_join } \ No newline at end of file diff --git a/tools/level_scripts/yaml_loader.lua b/tools/level_scripts/yaml_loader.lua index bcbe020..c4696f6 100644 --- a/tools/level_scripts/yaml_loader.lua +++ b/tools/level_scripts/yaml_loader.lua @@ -1,7 +1,14 @@ +local util = require('tools.level_scripts.util') local yaml = require('yaml') local sk_input = require('sk_input') -local file_location = string.sub(sk_input.input_filename, 7, -4) .. 'yaml' +local file_stem = sk_input.input_filename:match(".+[\\/]([^\\.]+)") +local file_location = util.path_join( + "assets", + "test_chambers", + file_stem, + file_stem .. ".yaml" +) local input_file = io.open(file_location, 'r') local json_contents = yaml.parse(input_file:read('a'))