You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

220 lines
6.9 KiB

@echo off
setlocal enabledelayedexpansion
title Animation Optimizer - Unreal FBX to Web GLB
mode con: cols=104 lines=45 >nul 2>&1
cls
REM ===========================================================================
REM optimize_all.bat
REM
REM Ordnerstruktur (alles neben dieser .bat):
REM Original\ FBX aus Unreal hier reinlegen
REM Optimized\ GLB landen hier, gleiche Basisnamen
REM optimize_log.txt vollstaendiges Protokoll des letzten Laufs
REM
REM Aufruf:
REM optimize_all.bat interaktiv
REM optimize_all.bat --force ohne Nachfrage alles neu bauen
REM optimize_all.bat --report Key-Verteilung pro Bone ins Log
REM optimize_all.bat --verbose Blender-Ausgabe auf der Konsole
REM optimize_all.bat --rot-tol 0.5 Toleranz ueberschreiben
REM
REM Zusaetzliche Argumente werden an anim_optimize.py durchgereicht.
REM ===========================================================================
set BLENDER="C:\Program Files\Blender Foundation\Blender 4.5\blender.exe"
REM gltfpack (meshoptimizer) - optionaler zweiter Durchlauf.
REM Leer lassen zum Deaktivieren, oder Pfad zur gltfpack.exe eintragen.
REM Liegt sie neben dieser .bat oder im PATH, wird sie automatisch gefunden.
set GLTFPACK=
REM Kompression: -cc = EXT_meshopt_compression (three.js r122+ mit
REM setMeshoptDecoder). -cz = KHR_meshopt_compression, kleiner, aber neuer -
REM erst umstellen, wenn dein three.js das liest. Kennt dein gltfpack -cz
REM nicht, ersetzt das Skript es automatisch durch -cc.
set PACKOPTS=-cc -kn -af 30
REM --- ANSI-Farben. Faellt sauber auf farblos zurueck, wenn nicht verfuegbar.
set "ESC="
for /f %%a in ('echo prompt $E^| cmd') do set "ESC=%%a"
if defined ESC (
set "R=!ESC![0m" & set "B=!ESC![1m"
set "DIM=!ESC![90m" & set "CY=!ESC![96m"
set "GN=!ESC![92m" & set "YE=!ESC![93m"
set "RD=!ESC![91m" & set "WH=!ESC![97m"
) else (
set "R=" & set "B=" & set "DIM=" & set "CY=" & set "GN=" & set "YE=" & set "RD=" & set "WH="
)
set "LINE=------------------------------------------------------------------------------"
set "DBL==============================================================================="
REM ROOT = mit abschliessendem Backslash, fuer Pfad-Verkettung
REM ROOTA = OHNE Backslash, zum Uebergeben als Argument. Ein Backslash direkt
REM vor dem schliessenden " wuerde das Anfuehrungszeichen escapen und
REM die restliche Kommandozeile in ein Argument ziehen.
set ROOT=%~dp0
set ROOTA=%ROOT:~0,-1%
set IN=%ROOT%Original
set OUT=%ROOT%Optimized
echo.
echo %CY%%DBL%%R%
echo %B%%WH%ANIMATION OPTIMIZER%R% %DIM%Unreal FBX -^> Web GLB%R%
echo %CY%%DBL%%R%
echo.
REM --- Blender finden --------------------------------------------------------
if not exist %BLENDER% (
for /d %%D in ("C:\Program Files\Blender Foundation\Blender *") do (
if exist "%%D\blender.exe" set BLENDER="%%D\blender.exe"
)
)
if not exist %BLENDER% (
for %%P in (blender.exe) do if not "%%~$PATH:P"=="" set BLENDER="%%~$PATH:P"
)
if not exist %BLENDER% (
echo %RD%[ FEHLER ]%R% Blender nicht gefunden.
echo Pfad oben in dieser .bat anpassen ^(Variable BLENDER^).
echo.
pause
exit /b 1
)
if not exist "%ROOT%anim_optimize.py" (
echo %RD%[ FEHLER ]%R% anim_optimize.py fehlt.
echo Die .py muss neben dieser .bat liegen:
echo %DIM%%ROOTA%%R%
echo.
pause
exit /b 1
)
REM --- gltfpack suchen -------------------------------------------------------
if not defined GLTFPACK (
if exist "%ROOT%gltfpack.exe" set GLTFPACK=%ROOT%gltfpack.exe
)
if not defined GLTFPACK (
for %%P in (gltfpack.exe) do if not "%%~$PATH:P"=="" set GLTFPACK=%%~$PATH:P
)
set PACKARG=
if defined GLTFPACK set PACKARG=--gltfpack "%GLTFPACK%" --gltfpack-args "%PACKOPTS%"
if not exist "%IN%" mkdir "%IN%"
if not exist "%OUT%" mkdir "%OUT%"
REM --- Bestand pruefen -------------------------------------------------------
set /a TOTAL=0
set /a EXISTING=0
for %%F in ("%IN%\*.fbx") do (
set /a TOTAL+=1
if exist "%OUT%\%%~nF.glb" set /a EXISTING+=1
)
set /a REST=TOTAL-EXISTING
echo %DIM%Quelle %R% Original\ %B%%TOTAL%%R% FBX gefunden
echo %DIM%Ziel %R% Optimized\ %B%%EXISTING%%R% davon bereits gebaut
echo %DIM%Blender %R% %DIM%%BLENDER%%R%
if defined GLTFPACK (
echo %DIM%gltfpack%R% %GN%aktiv%R% %DIM%%PACKOPTS%%R%
) else (
echo %DIM%gltfpack%R% %DIM%nicht gefunden - Schritt wird uebersprungen%R%
)
echo %DIM%%LINE%%R%
if %TOTAL%==0 (
echo.
echo %YE%[ NICHTS ZU TUN ]%R% Keine FBX in Original\ gefunden.
echo Exporte aus Unreal dort ablegen und neu starten.
echo.
pause
exit /b 0
)
REM --- Wurde --force schon per Kommandozeile mitgegeben? ---------------------
set EXTRA=%*
set PREFORCE=
echo.%EXTRA%| find /i "--force" >nul && set PREFORCE=1
REM --- Nachfrage -------------------------------------------------------------
if defined PREFORCE goto :run
if %EXISTING%==0 goto :run
echo.
echo %YE%%EXISTING% von %TOTAL% Animationen liegen bereits in Optimized\%R%
echo.
echo %B%[J]%R% neu optimieren und ueberschreiben %DIM%alle %TOTAL%%R%
echo %B%[N]%R% vorhandene behalten %DIM%nur die restlichen %REST%%R%
echo %B%[A]%R% abbrechen
echo.
where choice >nul 2>&1
if errorlevel 1 goto :fallback
choice /c JNA /n /m " Auswahl [J/N/A]: "
if errorlevel 3 goto :abort
if errorlevel 2 goto :run
set EXTRA=%EXTRA% --force
goto :run
:fallback
set ANSWER=
set /p ANSWER=" Auswahl [J/N/A]: "
if /i "%ANSWER%"=="A" goto :abort
if /i "%ANSWER%"=="J" set EXTRA=%EXTRA% --force
if /i "%ANSWER%"=="Y" set EXTRA=%EXTRA% --force
goto :run
REM --- Lauf ------------------------------------------------------------------
:run
echo.
%BLENDER% -b -noaudio --factory-startup --python "%ROOT%anim_optimize.py" -- ^
--root "%ROOTA%" ^
--in-dir Original ^
--out-dir Optimized ^
--format GLB ^
--rot-tol 0.25 ^
--loc-tol-mm 0.5 ^
--loose-rot-tol 1.0 ^
--loose-bones twist ^
--expect-fps 30 ^
--scale-tol 0.0005 ^
--scale-snap 0.001 ^
--anim-only ^
--round 4 ^
--log optimize_log.txt ^
%PACKARG% ^
%EXTRA%
set RC=%errorlevel%
echo %DIM%%LINE%%R%
if %RC%==0 (
echo %GN%[ FERTIG ]%R% Alle Animationen gebaut.
) else (
echo %RD%[ FEHLER ]%R% Mindestens eine Datei ist fehlgeschlagen.
echo Details stehen im Protokoll:
echo %DIM%%ROOT%optimize_log.txt%R%
)
echo.
where choice >nul 2>&1
if errorlevel 1 goto :end
choice /c LON /n /t 15 /d N /m " [L]og oeffnen [O]rdner oeffnen [N]ichts (15s) "
if errorlevel 3 goto :end
if errorlevel 2 goto :openfolder
start "" notepad "%ROOT%optimize_log.txt"
goto :end
:openfolder
start "" explorer "%OUT%"
:end
echo.
exit /b %RC%
:abort
echo.
echo %DIM%Abgebrochen.%R%
echo.
timeout /t 2 >nul
exit /b 0