使用osgconv&bat脚本批量转换Osgb为Obj

使用osgconv&bat脚本批量转换Osgb为Obj

@echo off
setlocal enabledelayedexpansion

@REM 获取当前目录(根目录)
set "rootFolder=%cd%"
set "outputFolder=%cd%"
set "outputName=HK"
set "osgconvPath=D:\software\OpenSceneGraph-3.6.5-VC2022-64-Release-2023-01\bin\osgconv.exe"
set "osgconvOptions=-O OutputTextureFiles"
set "levels=;"
set "osgbFileObjects="
set /a osgbFileObjectsIndex=0

echo 提取层级...
@REM 遍历当前目录(根目录)下所有切片文件夹
for /d %%A in ("%rootFolder%\*") do (
    set "tileFolderPath=%%A"
    @REM 取出子文件夹名称(不含路径)
    set "tileFolderName=%%~nxA"
    @REM 计算文件夹名称的长度
    call :strlen tileFolderName tileFolderNameLen

    @REM echo 处理切片文件夹: !tileFolderPath! ...
    @REM echo 切片文件夹名称: !tileFolderName!
    @REM echo 切片文件夹名称长度:!tileFolderNameLen!

    @REM 遍历当前切片文件夹中的所有 .osgb 文件
    for %%B in ("!tileFolderPath!\*.osgb") do (
            set "osgbFilePath=%%B"
            set "osgbFileName=%%~nxB"
            call :strlen osgbFileName osgbFileNameLen
            set /a minLen=!tileFolderNameLen!+5
            set /a levelStartIndex=!tileFolderNameLen!+2
            if !osgbFileNameLen! GEQ !minLen! (
                call set "osgbFileNamePrefix=%%osgbFileName:~0,!tileFolderNameLen!%%"
                set "rootOsgbFileName=!tileFolderName!.osgb"
                if /I "!osgbFileName!"=="!rootOsgbFileName!" (
                    @REM 根文件
                    @REM echo 根文件:!osgbFileName!
                ) ^
                else if /I "!osgbFileNamePrefix!"=="!tileFolderName!" (
                    call set "levelPrefix=%%osgbFileName:~!tileFolderNameLen!,2%%"
                    if /I "!levelPrefix!"=="_L" (
                        call set "level=%%osgbFileName:~!levelStartIndex!,2%%"
                        
                        set "osgbFileObjects[!osgbFileObjectsIndex!].level=!level!"
                        set "osgbFileObjects[!osgbFileObjectsIndex!].path=!tileFolderName!\!osgbFileName!"
                        set /a osgbFileObjectsIndex+=1

                        @REM echo 层级:!level!
                        @REM 检查元素是否存在(不区分大小写)
                        echo !levels! | find /i ";!level!;" >nul
                        if errorlevel 1 (
                            set "levels=!levels!!level!;"
                            @REM echo [成功] 添加: !level!
                        ) else (
                            @REM echo [跳过] 已存在: !level!
                        )
                    )
                )
            )
        )
    @REM echo 所有文件名称:
    @REM for /L %%B in (1,1,!osgbFileNamesIndex!) do (
    @REM     echo !osgbFileNames[%%B]!
    @REM )
)
set /a osgbFileObjectsIndex-=1
set "levels=%levels:~1,-1%"
set "levels=%levels:;= %"
echo 所有层级: %levels%

@REM for /L %%A in (0,1,!osgbFileObjectsIndex!) do (
@REM     set "level=!osgbFileObjects[%%A].level!"
@REM     set "path=!osgbFileObjects[%%A].path!"
@REM     echo 层级:!level! 路径:!path! 
@REM )

call :strlen osgconvPath osgconvPathLen
call :strlen osgconvOptions osgconvOptionsLen
call :strlen outputFolder outputFolderLen
call :strlen outputName outputNameLen

set /a baseCmdLen=!osgconvPathLen!+!osgconvOptionsLen!+!outputFolderLen!+!outputNameLen!+9
@REM echo 基础命令长度:!baseCmdLen!
set /a osgbFileParamsMaxLen=8000-!baseCmdLen!
echo 参数最大长度:!osgbFileParamsMaxLen!
for %%A in (%levels%) do (
    set "level=%%A"
    echo 处理层级:!level! ...
    set "osgbFileParams="
    set /a osgbFileParamsLen=0
    
    set /a splitSuffix=1
    for /L %%B in (0,1,!osgbFileObjectsIndex!) do (
        if /I "!osgbFileObjects[%%B].level!"=="!level!" (
            set "osgbFilePath=!osgbFileObjects[%%B].path!"
            call :strlen osgbFilePath osgbFilePathLen
            set /a mergeLen=!osgbFileParamsLen!+!osgbFilePathLen!
            if !mergeLen! LEQ !osgbFileParamsMaxLen! (
                set "osgbFileParams=!osgbFileParams! !osgbFilePath!"
                set /a osgbFileParamsLen+=!osgbFilePathLen!
            ) else (
                echo 分批执行 - !splitSuffix!:
                set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!_!splitSuffix!.obj"
                @REM echo !cmdText!
                call !cmdText!
                echo 分批 - !splitSuffix! 执行完成!
                set "osgbFileParams="
                set /a osgbFileParamsLen=0
                set /a splitSuffix+=1
            )
        )
    )
    if !osgbFileParamsLen! GTR 0 (
        if !splitSuffix!==1 (
            echo 执行:
            set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!.obj"
            @REM echo !cmdText!
            call !cmdText!
            echo 执行完成!
        ) else (
            echo 分批执行 - !splitSuffix!:
            set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!_!splitSuffix!.obj"
            @REM echo !cmdText!
            call !cmdText!
            echo 分批 - !splitSuffix! 执行完成!
        )
    )
)

pause

goto :EOF
:strlen
rem 用于计算传入字符串的长度
rem 参数1:变量名(包含字符串)  参数2:输出变量名(存放长度)
setlocal enabledelayedexpansion
set "s=!%1!"
set "len=0"
:strlen_loop
if defined s (
    set "s=!s:~1!"
    set /a len+=1
    goto strlen_loop
)
endlocal & set "%2=%len%"
goto :EOF
提取层级...
所有层级: 12 13 14 15 16 17 18 19 20 21 22
参数最大长度:7864
处理层级:12 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L12.obj'.
执行完成!
处理层级:13 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L13.obj'.
执行完成!
处理层级:14 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L14.obj'.
执行完成!
处理层级:15 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L15.obj'.
执行完成!
处理层级:16 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L16.obj'.
执行完成!
处理层级:17 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L17.obj'.
执行完成!
处理层级:18 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L18.obj'.
执行完成!
处理层级:19 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L19_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L19_2.obj'.
分批 - 2 执行完成!
处理层级:20 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_2.obj'.
分批 - 2 执行完成!
分批执行 - 3:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_3.obj'.
分批 - 3 执行完成!
分批执行 - 4:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_4.obj'.
分批 - 4 执行完成!
分批执行 - 5:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_5.obj'.
分批 - 5 执行完成!
分批执行 - 6:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_6.obj'.
分批 - 6 执行完成!
分批执行 - 7:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_7.obj'.
分批 - 7 执行完成!
处理层级:21 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_2.obj'.
分批 - 2 执行完成!
分批执行 - 3:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_3.obj'.
分批 - 3 执行完成!
分批执行 - 4:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_4.obj'.
分批 - 4 执行完成!
分批执行 - 5:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_5.obj'.
分批 - 5 执行完成!
分批执行 - 6:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_6.obj'.
分批 - 6 执行完成!
分批执行 - 7:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_7.obj'.
分批 - 7 执行完成!
分批执行 - 8:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_8.obj'.
分批 - 8 执行完成!
处理层级:22 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L22.obj'.
执行完成!
请按任意键继续. . . 
\TestData\osgb\osgb2obj\HK_L21_7.obj'.
分批 - 7 执行完成!
分批执行 - 8:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_8.obj'.
分批 - 8 执行完成!
处理层级:22 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L22.obj'.
执行完成!
请按任意键继续. . . 
```=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Winemonk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值