File size: 2,428 Bytes
8604dd1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #!/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()
|