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
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
|
|
|