File size: 1,263 Bytes
7f999fd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env python3
"""Parse original player LOD3 model layout against the recovered QVM offsets."""
import hashlib
from dataclasses import asdict
from pathlib import Path
from md3 import MD3
from analyze_qvm import write_json
def selected():return sorted(p for p in Path('assets/extracted').rglob('*') if p.is_file() and '/models/players/' in str(p) and p.parent.name in ['athena','orion'] and p.name.lower() in ['lower_3.md3','upper_3.md3','head_3.md3','helmet_3.md3'])
def main():
rows=[]
for p in selected():
raw=p.read_bytes();m=MD3(raw);rows.append({'path':str(p),'sha256':hashlib.sha256(raw).hexdigest(),'bytes':len(raw),'name':m.name,'frames':m.frames,'tags':m.tags,'surfaces':[asdict(s) for s in m.surfaces],'offsets':{'frames':m.frames_offset,'tags':m.tags_offset,'surfaces':m.surfaces_offset,'end':m.end},'first_frame':m.frame(0),'first_tags':[m.tag(0,j) for j in range(m.tags)]})
write_json(Path('docs/research/md3-contract.json'),{'models':rows,'limits':'Original bytes parsed only; version15/declared ranges/surface chain/frame counts/triangle indices checked. No renderer/full runtime. Coordinate scale and fields are cross-linked to recovered QVM offsets, not external format assumptions.'})
if __name__=='__main__':main()
|