Files
AIGame/Tools/model_tools/bl_prepare_studio_trial.py

38 lines
2.0 KiB
Python

"""Convert the completed Studio/bake mesh to project Y-up FBX without touching its UVs."""
import sys,json,shutil,hashlib
from pathlib import Path
import bpy
import numpy as np
sys.path.insert(0,str(Path(__file__).resolve().parent))
from bl_decimate import prepare_game_export,export_fbx_source_yup
argv=sys.argv[sys.argv.index('--')+1:]
folder=Path(argv[0]).resolve()
# Optional output actor name; GreatHornStudio keeps the original trial invocation working.
name=argv[1] if len(argv)>1 else 'GreatHornStudio'
out=folder/'static';out.mkdir(parents=True,exist_ok=True)
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.import_scene.gltf(filepath=str(folder/'model_ex.glb'))
meshes=[o for o in bpy.context.scene.objects if o.type=='MESH']
assert len(meshes)==1,'Expected one final Studio mesh'
low=meshes[0]
def uv_hash():return hashlib.sha256(np.array([tuple(v.uv) for v in low.data.uv_layers.active.data],dtype='<f4').tobytes()).hexdigest()
before=uv_hash()
low.name=name
# Pure mesh plus conventionally named maps lets the project XPbr converter
# consume the existing five baked maps without generating another UV layout.
low.data.materials.clear()
prepare_game_export(low,restore_axis=True)
assert uv_hash()==before,'Coordinate conversion changed Studio UVs'
bpy.ops.object.select_all(action='DESELECT');low.select_set(True);bpy.context.view_layer.objects.active=low
axes=export_fbx_source_yup(str(out/(name+'.fbx')))
mapping={'diffuse':'color','normal':'normal','ao':'ao','metallic':'metallic','roughness':'roughness'}
for src,dest in mapping.items():
candidates=list((folder/'bake_maps').glob(src+'*.png'))
assert len(candidates)==1,(src,candidates)
shutil.copy2(candidates[0],out/(name+'_'+dest+'.png'))
report=dict(uvHashBefore=before,uvHashAfter=uv_hash(),uvPreserved=True,vertices=len(low.data.vertices),triangles=sum(len(p.vertices)-2 for p in low.data.polygons),fbxAxes=axes)
(folder/'static_export.json').write_text(json.dumps(report,indent=2),encoding='utf-8')
print('MT_SUMMARY '+json.dumps(report))