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
This commit is contained in:
Matt Penny 2024-09-13 00:53:55 -04:00
parent dea0c3591d
commit fa0940fe90
9 changed files with 200 additions and 7 deletions

View file

@ -4,6 +4,7 @@ project(portal64)
# Tools # Tools
# TODO: find automatically # TODO: find automatically
# TODO: test on Windows # TODO: test on Windows
set(BLENDER_3_6 "blender")
set(FFMPEG "ffmpeg") set(FFMPEG "ffmpeg")
set(IMAGEMAGICK_CONVERT "convert") set(IMAGEMAGICK_CONVERT "convert")
set(MPG123 "mpg123") set(MPG123 "mpg123")
@ -15,6 +16,8 @@ set(VPK "vpk")
set(VTF2PNG "vtf2png") set(VTF2PNG "vtf2png")
set(CONVERT_ASSET "${PROJECT_SOURCE_DIR}/tools/convert_asset.py") 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(GEN_SOUND_IDS "${PROJECT_SOURCE_DIR}/tools/generate_sound_ids.js")
set(JSOX "${PROJECT_SOURCE_DIR}/tools/jsox.js") set(JSOX "${PROJECT_SOURCE_DIR}/tools/jsox.js")
set(SKELETOOL64 "${PROJECT_SOURCE_DIR}/skelatool64/skeletool64") set(SKELETOOL64 "${PROJECT_SOURCE_DIR}/skelatool64/skeletool64")

View file

@ -463,7 +463,7 @@ build/%.fbx: %.blend
$(BLENDER_3_6) $< --background --python tools/export_fbx.py -- $@ $(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) 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 build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h
@mkdir -p $(@D) @mkdir -p $(@D)

View file

@ -17,3 +17,4 @@ endif()
add_subdirectory(materials) add_subdirectory(materials)
add_subdirectory(sound) add_subdirectory(sound)
add_subdirectory(test_chambers)

View file

@ -174,7 +174,14 @@ function(_add_extract_frame_command INPUT_FILE OUTPUT_FILE SECONDS)
COMMAND COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND 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 COMMAND
${IMAGEMAGICK_CONVERT} ${OUTPUT_FILE} -crop 491x369+265+202 -resize 160x120 ${OUTPUT_FILE} ${IMAGEMAGICK_CONVERT} ${OUTPUT_FILE} -crop 491x369+265+202 -resize 160x120 ${OUTPUT_FILE}
COMMENT COMMENT
@ -230,7 +237,8 @@ function(_add_texture_transform_command TEXTURE_SCRIPT OUTPUT_LIST)
OUTPUT OUTPUT
${OUTPUT_FILES} ${OUTPUT_FILES}
COMMAND 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 WORKING_DIRECTORY
# TODO: Change this to PAK_MODIFIED_MATERIALS_DIR and update .ims files with relative path # TODO: Change this to PAK_MODIFIED_MATERIALS_DIR and update .ims files with relative path
${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}
@ -401,7 +409,10 @@ function(_add_material_generate_command INPUT_FILE OUTPUT_LIST)
OUTPUT OUTPUT
${OUTPUT_FILE_H} ${OUTPUT_FILE_C} ${OUTPUT_FILE_H} ${OUTPUT_FILE_C}
COMMAND 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 COMMENT
"Generating materials for $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>" "Generating materials for $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM VERBATIM

View file

@ -27,7 +27,7 @@ function(_add_extract_video_audio_command INPUT_FILE OUTPUT_FILE)
COMMAND COMMAND
${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR} ${CMAKE_COMMAND} -E make_directory ${OUTPUT_DIR}
COMMAND COMMAND
${FFMPEG} -i ${INPUT_FILE} -vn -loglevel quiet -y ${OUTPUT_FILE} ${FFMPEG} -i ${INPUT_FILE} -vn -loglevel error -y ${OUTPUT_FILE}
COMMENT COMMENT
"Converting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>" "Converting $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
VERBATIM VERBATIM
@ -424,7 +424,7 @@ set(LANGUAGES_H "${BUILD_AUDIO_DIR}/languages.h")
set(LANGUAGES_C "${BUILD_AUDIO_DIR}/languages.c") set(LANGUAGES_C "${BUILD_AUDIO_DIR}/languages.c")
add_custom_command( add_custom_command(
DEPENDS DEPENDS
all_sounds ${SOUND_TABLE_DEPENDENCIES} all_sounds ${GEN_SOUND_IDS} ${SOUND_TABLE_DEPENDENCIES}
OUTPUT OUTPUT
${CLIPS_H} ${LANGUAGES_H} ${LANGUAGES_C} ${CLIPS_H} ${LANGUAGES_H} ${LANGUAGES_C}
COMMAND COMMAND

View file

@ -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 $<PATH:RELATIVE_PATH,${INPUT_FILE},${PROJECT_SOURCE_DIR}>"
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 $<PATH:RELATIVE_PATH,${LEVEL_LIST},${PROJECT_SOURCE_DIR}>"
VERBATIM
)
# TODO: remove
add_custom_target(
level_list
DEPENDS ${LEVEL_LIST}
)

View file

@ -29,7 +29,13 @@ local function trim(inputstr)
return string.sub(inputstr, start_index, end_index) return string.sub(inputstr, start_index, end_index)
end end
local function path_join(...)
local dir_sep = package.config:sub(1,1)
return table.concat({...}, dir_sep)
end
return { return {
string_split = string_split, string_split = string_split,
trim = trim, trim = trim,
path_join = path_join
} }

View file

@ -1,7 +1,14 @@
local util = require('tools.level_scripts.util')
local yaml = require('yaml') local yaml = require('yaml')
local sk_input = require('sk_input') 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 input_file = io.open(file_location, 'r')
local json_contents = yaml.parse(input_file:read('a')) local json_contents = yaml.parse(input_file:read('a'))