Skip to content

Commit

Permalink
[CMake] Add option to download prebuilt texture packages
Browse files Browse the repository at this point in the history
Currently just terrain_overrides/high.wz
  • Loading branch information
past-due committed Sep 8, 2023
1 parent 78d890c commit 08685b3
Showing 1 changed file with 109 additions and 70 deletions.
179 changes: 109 additions & 70 deletions data/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,17 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
OPTION(WZ_INCLUDE_VIDEOS "Download & include videos in the application package" OFF)
endif()
OPTION(WZ_INCLUDE_TERRAIN_HIGH "Include high terrain texture pack" ON)
OPTION(WZ_DOWNLOAD_PREBUILT_PACKAGES "Download prebuilt texture packages (if OFF, will generate from scratch - this can take a while to encode textures)" ON)

find_package(ZIP REQUIRED)

###########################
# Prebuilt package DL info

# terrain_overrides/high.wz
set(PREBUILT_TERRAIN_HIGH_DL_URL "https://github.com/Warzone2100/data-terrain-high/releases/download/v1/high.wz")
set(PREBUILT_TERRAIN_HIGH_DL_SHA512 "44a39e585344b25ab0fa4ed769f2b48bf23a0e4fc4b23e0fab4e68643cc6e3ebeabba790e8b1e6c96493ad01b6a2f09e92b893063013077dcac2475f0b5373d6")

###########################
# GLSLC shader compilation

Expand Down Expand Up @@ -217,82 +225,113 @@ if (WZ_INCLUDE_TERRAIN_HIGH)

set(_terrain_overrides_high_base_path "${CMAKE_CURRENT_SOURCE_DIR}/terrain_overrides/high")

if(WZ_ENABLE_BASIS_UNIVERSAL AND NOT WZ_CI_DISABLE_BASIS_COMPRESS_TEXTURES)
if(NOT DEFINED BASIS_UNIVERSAL_CLI)
message(FATAL_ERROR "No basisu tool has been provided - set BASIS_UNIVERSAL_CLI to the path to basisu or disable WZ_ENABLE_BASIS_UNIVERSAL!")
if (WZ_ENABLE_BASIS_UNIVERSAL AND NOT WZ_CI_DISABLE_BASIS_COMPRESS_TEXTURES)

set(_build_package "OFF")
if (WZ_DOWNLOAD_PREBUILT_PACKAGES)
# Try to download the prebuilt package
file(DOWNLOAD "${PREBUILT_TERRAIN_HIGH_DL_URL}" "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz" INACTIVITY_TIMEOUT 60 SHOW_PROGRESS STATUS _dl_terrain_high_status TLS_VERIFY ON)
list(GET _dl_terrain_high_status 0 _dl_terrain_high_status_code)
list(GET _dl_terrain_high_status 1 _dl_terrain_high_error_message)
if ((NOT _dl_terrain_high_status_code EQUAL 0) OR (NOT EXISTS "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz"))
# Download failed
message(WARNING "Failed to download prebuilt package: ${PREBUILT_TERRAIN_HIGH_DL_URL}, with error: ${_dl_terrain_high_error_message}")
set(_build_package "ON")
else()
# Download allegedly succeeded - check hash
file(SHA512 "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz" _dl_terrain_high_sha512)
if("${_dl_terrain_high_sha512}" STREQUAL "${PREBUILT_TERRAIN_HIGH_DL_SHA512}")
message(STATUS "Downloaded prebuilt package: ${PREBUILT_TERRAIN_HIGH_DL_URL}, with hash: ${PREBUILT_TERRAIN_HIGH_DL_SHA512}")
else()
message(WARNING "Failed to download prebuilt package: ${PREBUILT_TERRAIN_HIGH_DL_URL}, with unexpected hash: ${_dl_terrain_high_sha512}")
set(_build_package "ON")
endif()
endif()
else()
set(_build_package "ON")
endif()

file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/texpages")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/tileset")

set(high_texture_folders "texpages")
file(GLOB tertiles_dirs LIST_DIRECTORIES true RELATIVE "${_terrain_overrides_high_base_path}" CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/texpages/tertilesc*hw-*")
list(APPEND high_texture_folders ${tertiles_dirs})
if (_build_package)
# Generate the package

foreach(tex_folder ${high_texture_folders})

file(GLOB ALL_TEXPAGES LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*.png")
# Split into _nm, _sm, and everything else (regular texpages)
file(GLOB TEXPAGES_NM LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*_nm.png")
file(GLOB TEXPAGES_SM LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*_sm.png")
unset(TEXPAGES_TEX)
list(APPEND TEXPAGES_TEX ${ALL_TEXPAGES})
list(REMOVE_ITEM TEXPAGES_TEX ${TEXPAGES_NM} ${TEXPAGES_SM})

set(_output_dir "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/${tex_folder}")
if (tex_folder STREQUAL "texpages")
set(_terrain_high_max_size 1024)
else()
set(_terrain_high_max_size 256) # decals are 256x256
if(NOT DEFINED BASIS_UNIVERSAL_CLI)
message(FATAL_ERROR "No basisu tool has been provided - set BASIS_UNIVERSAL_CLI to the path to basisu or disable WZ_ENABLE_BASIS_UNIVERSAL!")
endif()

WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "TEXTURE" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_TEX})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_TEX})
WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "NORMALMAP" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_NM})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_NM})
WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "SPECULARMAP" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_SM})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_SM})

endforeach()

set(_base_output_dir "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high")
file(GLOB_RECURSE ALL_TEXPAGES LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/texpages/*.*" "${_terrain_overrides_high_base_path}/tileset/*.*")
list(APPEND ALL_TEXPAGES_unprocessed ${ALL_TEXPAGES})
list(REMOVE_ITEM ALL_TEXPAGES_unprocessed ${PROCESSED_TEXTURE_FILES})
foreach(TEXPAGE_FILE ${ALL_TEXPAGES_unprocessed})
file(RELATIVE_PATH _output_name "${_terrain_overrides_high_base_path}" "${TEXPAGE_FILE}")
message(STATUS "Copy unprocessed image file: ${_output_name}")
add_custom_command(OUTPUT "${_base_output_dir}/${_output_name}"
COMMAND "${CMAKE_COMMAND}"
ARGS -E copy_if_different "${TEXPAGE_FILE}" "${_base_output_dir}/${_output_name}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/base/texpages"
DEPENDS "${TEXPAGE_FILE}"
VERBATIM
message(STATUS "Configuring to build high.wz package")

file(REMOVE_RECURSE "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/texpages")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/tileset")

set(high_texture_folders "texpages")
file(GLOB tertiles_dirs LIST_DIRECTORIES true RELATIVE "${_terrain_overrides_high_base_path}" CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/texpages/tertilesc*hw-*")
list(APPEND high_texture_folders ${tertiles_dirs})

foreach(tex_folder ${high_texture_folders})

file(GLOB ALL_TEXPAGES LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*.png")
# Split into _nm, _sm, and everything else (regular texpages)
file(GLOB TEXPAGES_NM LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*_nm.png")
file(GLOB TEXPAGES_SM LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/${tex_folder}/*_sm.png")
unset(TEXPAGES_TEX)
list(APPEND TEXPAGES_TEX ${ALL_TEXPAGES})
list(REMOVE_ITEM TEXPAGES_TEX ${TEXPAGES_NM} ${TEXPAGES_SM})

set(_output_dir "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high/${tex_folder}")
if (tex_folder STREQUAL "texpages")
set(_terrain_high_max_size 1024)
else()
set(_terrain_high_max_size 256) # decals are 256x256
endif()

WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "TEXTURE" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_TEX})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_TEX})
WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "NORMALMAP" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_NM})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_NM})
WZ_BASIS_ENCODE_TEXTURES(OUTPUT_DIR "${_output_dir}" TYPE "SPECULARMAP" RESIZE "${_terrain_high_max_size}" UASTC_LEVEL 3 ENCODING_TARGET texture_encoding_high TARGET_FOLDER data ALL FILES ${TEXPAGES_SM})
list(APPEND PROCESSED_TEXTURE_FILES ${TEXPAGES_SM})

endforeach()

set(_base_output_dir "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high")
file(GLOB_RECURSE ALL_TEXPAGES LIST_DIRECTORIES false CONFIGURE_DEPENDS "${_terrain_overrides_high_base_path}/texpages/*.*" "${_terrain_overrides_high_base_path}/tileset/*.*")
list(APPEND ALL_TEXPAGES_unprocessed ${ALL_TEXPAGES})
list(REMOVE_ITEM ALL_TEXPAGES_unprocessed ${PROCESSED_TEXTURE_FILES})
foreach(TEXPAGE_FILE ${ALL_TEXPAGES_unprocessed})
file(RELATIVE_PATH _output_name "${_terrain_overrides_high_base_path}" "${TEXPAGE_FILE}")
message(STATUS "Copy unprocessed image file: ${_output_name}")
add_custom_command(OUTPUT "${_base_output_dir}/${_output_name}"
COMMAND "${CMAKE_COMMAND}"
ARGS -E copy_if_different "${TEXPAGE_FILE}" "${_base_output_dir}/${_output_name}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/base/texpages"
DEPENDS "${TEXPAGE_FILE}"
VERBATIM
)
list(APPEND TEXTURE_UNPROCESSED_LIST "${_base_output_dir}/${_output_name}")
endforeach()

add_custom_target(texture_staging_high DEPENDS ${TEXTURE_UNPROCESSED_LIST})
set_property(TARGET texture_staging_high PROPERTY FOLDER "data")

unset(PROCESSED_TEXTURE_FILES)
unset(ALL_TEXPAGES)
unset(TEXTURE_UNPROCESSED_LIST)
unset(ALL_TEXPAGES_unprocessed)

COMPRESS_ZIP(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz"
COMPRESSION_LEVEL 0
PATHS
"texpages"
"tileset"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high"
BUILD_ALWAYS_TARGET data_terrain_overrides_high
IGNORE_GIT
QUIET
)
list(APPEND TEXTURE_UNPROCESSED_LIST "${_base_output_dir}/${_output_name}")
endforeach()

add_custom_target(texture_staging_high DEPENDS ${TEXTURE_UNPROCESSED_LIST})
set_property(TARGET texture_staging_high PROPERTY FOLDER "data")

unset(PROCESSED_TEXTURE_FILES)
unset(ALL_TEXPAGES)
unset(TEXTURE_UNPROCESSED_LIST)
unset(ALL_TEXPAGES_unprocessed)

COMPRESS_ZIP(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz"
COMPRESSION_LEVEL 0
PATHS
"texpages"
"tileset"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high"
BUILD_ALWAYS_TARGET data_terrain_overrides_high
IGNORE_GIT
QUIET
)
add_dependencies(data_terrain_overrides_high texture_encoding_high texture_staging_high)
add_dependencies(data_terrain_overrides_high texture_encoding_high texture_staging_high)

endif(_build_package)
else()
if(WZ_ENABLE_BASIS_UNIVERSAL AND WZ_CI_DISABLE_BASIS_COMPRESS_TEXTURES)
message(STATUS "WZ_CI_DISABLE_BASIS_COMPRESS_TEXTURES is set, textures will not be compressed as part of build. This should only be used for selected CI runs.")
Expand Down Expand Up @@ -448,7 +487,7 @@ install(FILES ${DATA_FILES}
set(DATA_TERRAIN_OVERRIDES_FILES
"${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/classic.wz"
)
if(TARGET data_terrain_overrides_high)
if(TARGET data_terrain_overrides_high OR EXISTS "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz")
list(APPEND DATA_TERRAIN_OVERRIDES_FILES "${CMAKE_CURRENT_BINARY_DIR}/terrain_overrides/high.wz")
endif()
install(FILES ${DATA_TERRAIN_OVERRIDES_FILES}
Expand Down

0 comments on commit 08685b3

Please sign in to comment.