"""Prepare the CC0 NewDLC wolf, then transfer the Quaternius quadruped rig.
The original textured anatomy replaces generated geometry. All clips are authored source clips.
"""
import bpy,sys,json,math
from pathlib import Path
from mathutils import Vector,Matrix
P=Path(sys.argv[sys.argv.index('--')+1]);mode=sys.argv[sys.argv.index('--')+2]
source=P/'sources/realwolf'
bpy.ops.wm.open_mainfile(filepath=str(source/'dog2.blend'))
mesh=bpy.data.objects.get('dog2');oldrig=bpy.data.objects.get('Armature')
oldrig.data.pose_position='REST';bpy.context.view_layer.update()
# Keep native skin group names/weights for an anatomy-aware transfer later.
dg=bpy.context.evaluated_depsgraph_get();ev=mesh.evaluated_get(dg);evaluated=ev.to_mesh()
worldverts=[ev.matrix_world@v.co for v in evaluated.vertices];ev.to_mesh_clear()
oldbones={b.name:{'head':oldrig.matrix_world@b.head_local,'tail':oldrig.matrix_world@b.tail_local} for b in oldrig.data.bones}
mesh.parent=None;mesh.matrix_world=Matrix.Identity(4)
for v,p in zip(mesh.data.vertices,worldverts):v.co=p
for m in list(mesh.modifiers):mesh.modifiers.remove(m)
for o in list(bpy.data.objects):
 if o!=mesh:bpy.data.objects.remove(o,do_unlink=True)
lo=Vector([min(v.co[i] for v in mesh.data.vertices) for i in range(3)]);hi=Vector([max(v.co[i] for v in mesh.data.vertices) for i in range(3)])
scale=.95/(hi.z-lo.z);offset=Vector((-(lo.x+hi.x)/2,-(lo.y+hi.y)/2,-lo.z))
for v in mesh.data.vertices:v.co=(v.co+offset)*scale
for val in oldbones.values():
 for k in val:val[k]=(val[k]+offset)*scale
# Replace obsolete Blender Internal material with portable PBR texture nodes.
mat=bpy.data.materials.new('WolfFur');mat.use_nodes=True;bs=mat.node_tree.nodes.get('Principled BSDF');bs.inputs['Roughness'].default_value=.85
for filename,socket,normal in [('dog2Color.png','Base Color',False),('dog2Roughness.png','Roughness',False),('dog2Normal.png','Normal',True)]:
 im=bpy.data.images.load(str(source/filename),check_existing=False)
 if socket!='Base Color':im.colorspace_settings.name='Non-Color'
 # Limit packed texture memory/download size without changing anatomy.
 im.scale(512,512);im.file_format='PNG';im.pack()
 node=mat.node_tree.nodes.new('ShaderNodeTexImage');node.image=im
 if normal:
  n=mat.node_tree.nodes.new('ShaderNodeNormalMap');n.inputs['Strength'].default_value=.6;mat.node_tree.links.new(node.outputs['Color'],n.inputs['Color']);mat.node_tree.links.new(n.outputs['Normal'],bs.inputs['Normal'])
 else:mat.node_tree.links.new(node.outputs['Color'],bs.inputs[socket])
mesh.data.materials.clear();mesh.data.materials.append(mat)
for p in mesh.data.polygons:p.material_index=0;p.use_smooth=True
mesh.name='Wolf_Realistic'
if mode=='source':
 bpy.ops.object.select_all(action='DESELECT');mesh.select_set(True);bpy.context.view_layer.objects.active=mesh
 bpy.ops.export_scene.gltf(filepath=str(source/'source.glb'),export_format='GLB',use_selection=True,export_yup=True)
 (P/'evidence/realwolf-bind.json').write_text(json.dumps({'bounds_before':[list(lo),list(hi)],'scale':scale,'bones':{n:{k:list(v) for k,v in vals.items()} for n,vals in oldbones.items()}},indent=2))
else:
 raise ValueError('Rig transfer not implemented yet')
