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()