Files
llamamod/tools/floorre/floor.py
T

41 lines
1.9 KiB
Python

import sys,struct,math; sys.path.insert(0,'/home/elias/projects/llamamod/tools'); import geomlib as G
ch,wf,trak,mp=G.load_level(__import__('os').environ.get('WAD','/home/elias/.claude/jobs/90c6eed7/tmp/exitre/t1l4m002.wad'))
_exe=open('/home/elias/projects/llamamod/re/groove.exe','rb').read()
SIN=list(struct.unpack_from('<4096i',_exe,0x174318))
def c8(b): return b-256 if b>127 else b
def floor_test(px,py,pz,tx,ty,tz,rot,recs,dbg=False,probe_add=0x400):
"""exact re-implementation of FUN_004036d0 floor branch (flags 0x200000 off). ints 20.12"""
lx=px-tx; lz=pz-tz; ly=py-ty+probe_add
u=(-rot)&0xffffffff
if u:
s=SIN[u&0xfff]; c=SIN[(u+0x400)&0xfff]
lx,lz=(s*lz+c*lx)>>12,(c*lz-s*lx)>>12
out=[]
for i,r in enumerate(recs):
if r[1]==0x11: continue
ny=c8(r[3]); n14=ny*32
if n14<=0: continue
h=(((struct.unpack_from('<h',r,6)[0]*4096 - c8(r[4])*32*lz - c8(r[2])*32*lx) - n14*ly))
q=abs(h)//abs(n14); i6= q if (h>=0)==(n14>=0) else -q # C truncating division
i7=-i6
Y=ly+i6
tol=-0x40-((ny*-0x20+0x1000)>>6)
ne=4 if r[0]&1 else 3
vals=[]
ok=True
for k in range(ne):
nx,nyy,nz,_,d=struct.unpack_from('<bbbBh',r,8+6*k)
v=((nyy*32*Y+nz*32*lz+nx*32*lx)>>12)-d
vals.append(v)
if v<tol: ok=False
out.append((i,i7,ok,vals,tol,ty+Y))
return (lx,ly,lz),out
if __name__=='__main__':
t=443; x,y,z,rot,mi,_=mp['A'][t]
recs=[r for g in trak[mi].coll for r in g]
P=[float(a) for a in sys.argv[1:4]]
loc,out=floor_test(*[int(round(v*4096)) for v in P],int(round(x*4096)),int(round(y*4096)),int(round(-z*4096)),rot,recs)
print('local',[v/4096 for v in loc])
for i,i7,ok,vals,tol,Y in out:
if i7>=-0x80: print(f'poly {i:2d} dist {i7/4096:+.4f} planeY {Y/4096:.4f} pass={ok} edges {vals} tol {tol}')