@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