#!/usr/bin/env python3 """Original player MD3 surfaces through complete23092 geometry and classification.""" import hashlib,math from pathlib import Path from qvm_research_support import source from md3 import MD3 from md3_vm import map_md3 from md3_qvm_support import describe,node_record from analyze_md3_contract import selected from analyze_qvm_surface_category import support from analyze_qvm_complete_leaf import leaf,words,CONTEXT,ORIGIN,DIRECTION,NODE from analyze_qvm_acceleration import word from analyze_qvm import write_json ADDRESS=0x70000000 def aimed_ray(model,frame): for s in model.surfaces: for j in range(s.triangles): v=[model.vertex(s,frame,k)['position'] for k in model.triangle(s,j)];a=[v[1][k]-v[0][k] for k in range(3)];b=[v[2][k]-v[0][k] for k in range(3)];normal=[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]];length=math.sqrt(sum(x*x for x in normal)) if length>1e-4: n=[x/length for x in normal];point=[sum(p[k] for p in v)/3 for k in range(3)];return [point[k]+10*n[k] for k in range(3)],[-x for x in n] raise ValueError('no nondegenerate original triangle') def main(): q,raw,h,ins=source();rows=[] for path in selected(): data=path.read_bytes();model=MD3(data) for frame in sorted({0,model.frames-1}): for hit in [False,True]: m,bs=support(raw,h);map_md3(m,bs,model,ADDRESS,[frame]);node_record(m,NODE,ADDRESS,frame) for o in range(0,308,4):m[CONTEXT+o]=0 origin,direction=aimed_ray(model,frame) if hit else ((10000,10000,10000),(1,0,0)) for p,v in [(ORIGIN,origin),(DIRECTION,direction)]: for j,x in enumerate(v):m[p+4*j]=word(x) args={8:NODE,12:ORIGIN,16:DIRECTION,20:CONTEXT};inputs=describe(m,args,model);m,r=leaf(ins,m,bs,args,limit=1000000);r.update({'path':str(path),'sha256':hashlib.sha256(data).hexdigest(),'frame':frame,'aimed_at_original_triangle':hit,'input':inputs});rows.append(r) write_json(Path('docs/research/md3-original-leaf.json'),{'source':q['source'],'sha256':q['sha256'],'probes':rows,'limits':'Complete23092 on unmodified original selected MD3 bytes, first/last static frames and explicit identity nodes/rays. Native sqrt modeled; no original loader/process/native trace parity. Geometric outcomes are actual source results.'}) if __name__=='__main__':main()