MetaCore/tools/bake_reflection_probe.sh
2026-07-22 16:08:48 +08:00

66 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
if [[ $# -lt 3 || $# -gt 4 ]]; then
echo "Usage: $0 <project-root> <probe-guid> <source.hdr|exr|png> [resolution]" >&2
exit 2
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENGINE_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
PROJECT_ROOT="$(cd "$1" && pwd)"
PROBE_GUID="$2"
SOURCE_PATH="$3"
RESOLUTION="${4:-256}"
if [[ "${SOURCE_PATH}" != /* ]]; then
SOURCE_PATH="${PROJECT_ROOT}/${SOURCE_PATH}"
fi
if [[ ! -f "${SOURCE_PATH}" ]]; then
echo "Reflection probe source does not exist: ${SOURCE_PATH}" >&2
exit 3
fi
if [[ ! "${PROBE_GUID}" =~ ^[0-9a-fA-F]{32}$ ]]; then
echo "Reflection probe GUID must contain exactly 32 hexadecimal digits." >&2
exit 4
fi
case "${RESOLUTION}" in
16|32|64|128|256|512|1024|2048) ;;
*) echo "Resolution must be a power of two between 16 and 2048." >&2; exit 5 ;;
esac
CMGEN="${METACORE_FILAMENT_CMGEN:-${ENGINE_ROOT}/build/filament-host-tools/install/bin/cmgen}"
if [[ ! -x "${CMGEN}" ]]; then
echo "A runnable cmgen was not found at ${CMGEN}; run tools/build_filament_host_tools.sh first." >&2
exit 6
fi
OUTPUT_ROOT="${PROJECT_ROOT}/Library/DerivedData/Rendering/Probes/${PROBE_GUID}"
TEMP_ROOT="$(mktemp -d "${PROJECT_ROOT}/Library/DerivedData/Rendering/.probe-${PROBE_GUID}.XXXXXX")"
cleanup() { rm -rf "${TEMP_ROOT}"; }
trap cleanup EXIT
"${CMGEN}" --quiet --format=ktx --size="${RESOLUTION}" --deploy="${TEMP_ROOT}" "${SOURCE_PATH}"
SOURCE_STEM="$(basename "${SOURCE_PATH}")"
SOURCE_STEM="${SOURCE_STEM%.*}"
IBL_SOURCE="${TEMP_ROOT}/${SOURCE_STEM}_ibl.ktx"
SKYBOX_SOURCE="${TEMP_ROOT}/${SOURCE_STEM}_skybox.ktx"
if [[ ! -s "${IBL_SOURCE}" || ! -s "${SKYBOX_SOURCE}" ]]; then
echo "cmgen did not produce the expected IBL and skybox KTX files." >&2
exit 7
fi
mkdir -p "${OUTPUT_ROOT}"
install -m 0644 "${IBL_SOURCE}" "${OUTPUT_ROOT}/probe_ibl.ktx"
install -m 0644 "${SKYBOX_SOURCE}" "${OUTPUT_ROOT}/probe_skybox.ktx"
if [[ -s "${TEMP_ROOT}/sh.txt" ]]; then
install -m 0644 "${TEMP_ROOT}/sh.txt" "${OUTPUT_ROOT}/sh.txt"
fi
SOURCE_HASH="$(sha256sum "${SOURCE_PATH}" | cut -d' ' -f1)"
HEADER_TEMP="${TEMP_ROOT}/probe.mcrprobe"
printf 'MCRPROBE 1 %s "%s" "%s" "%s"\n' \
"${PROBE_GUID}" "${SOURCE_HASH}" "probe_ibl.ktx" "probe_skybox.ktx" > "${HEADER_TEMP}"
install -m 0644 "${HEADER_TEMP}" "${OUTPUT_ROOT}/probe.mcrprobe"
echo "Reflection probe baked: ${OUTPUT_ROOT}"