- ra3.client::display: shared interactive loops; SDL and Vulkan backends implement only the primitives (init/present/poll_event/window_size/ key_down/present_terrain). ra3.display picks the backend. - Menu: maps by localized name (gamestrings.csf), red/gold theme, hover highlight, mouse + keyboard, wheel scroll, fullscreen and FPS/vsync options, loading progress bar. - Terrain: continuous tile sampling via a texture array (REPEAT, uv = cell/(2*cellSize)) removes per-cell grid seams; SAGE blend ramp for material transitions; FPS label + top-right minimap overlays. - Skip the skirmish sim for map views; reuse the Vulkan texture; no idle terrain redraw.
55 lines
2.6 KiB
CMake
55 lines
2.6 KiB
CMake
# Extract the retail assets into OUT using the ra3tools scripts. Driven by the
|
|
# openra3_assets target and run with `cmake -P`, so it needs only Python and the
|
|
# game install - no target executable, and therefore works for a cross-build too
|
|
# (mount the install into the container and pass RA3_GAME_DIR).
|
|
#
|
|
# Variables (all required unless noted):
|
|
# GAME_DIR Red Alert 3 install root
|
|
# OUT destination folder (next to the executable)
|
|
# PYTHON python interpreter
|
|
# RA3TOOLS path to ra3-headless/ra3tools
|
|
# EXTRACT_ALL ON to also dump every asset (models/textures/audio/movies)
|
|
# STAMP stamp file to write on completion
|
|
|
|
function(run)
|
|
execute_process(COMMAND ${ARGN} RESULT_VARIABLE _rc)
|
|
if(NOT _rc EQUAL 0)
|
|
message(WARNING "extract step failed (${_rc}): ${ARGN}")
|
|
endif()
|
|
endfunction()
|
|
|
|
file(MAKE_DIRECTORY "${OUT}")
|
|
|
|
if(NOT EXISTS "${RA3TOOLS}/ra3_big.py")
|
|
message(WARNING "ra3tools not found at '${RA3TOOLS}'; skipping asset extraction")
|
|
else()
|
|
# Maps + overview art: raw .big payloads; the engine unwraps EAR/RefPack.
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_big.py" extract "${GAME_DIR}/Data/MapsMultiplayer.big" --match "*.map" --out "${OUT}/maps")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_big.py" extract "${GAME_DIR}/Data/MapsMultiplayer.big" --match "*_art.tga" --out "${OUT}/maps")
|
|
|
|
# Terrain tile textures (the engine samples these for the map).
|
|
foreach(archive Terrain.big Core11.big)
|
|
if(EXISTS "${GAME_DIR}/Data/${archive}")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_big.py" extract "${GAME_DIR}/Data/${archive}" --match "*.tga" --out "${OUT}/terrain")
|
|
endif()
|
|
endforeach()
|
|
|
|
if(EXTRACT_ALL)
|
|
message(STATUS "extracting every .big entry to ${OUT}/raw")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_big.py" extract-all --game-dir "${GAME_DIR}" --out "${OUT}/raw" --match "*")
|
|
|
|
if(EXISTS "${RA3TOOLS}/ra3_binary.py")
|
|
message(STATUS "extracting models + textures (static stream)")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_binary.py" export "${GAME_DIR}/Data/StaticStream.big" --models --textures --png --by-source --out "${OUT}/art")
|
|
|
|
message(STATUS "extracting audio (sound effects + voice)")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_binary.py" export "${GAME_DIR}/Data/EnglishAudio.big" --stream audio --audio --out "${OUT}/audio")
|
|
|
|
message(STATUS "extracting movie audio")
|
|
run("${PYTHON}" "${RA3TOOLS}/ra3_big.py" extract "${GAME_DIR}/Data/EnglishMovieAudio.big" --match "*.snd" --out "${OUT}/movies")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
file(TOUCH "${STAMP}")
|