Files
llamamod/tools/floorre/corners.py
T

26 lines
1.1 KiB
Python

import sys,struct,numpy as np; sys.path.insert(0,'.'); from floor import *
t=443; x,y,z,rot,mi,_=mp['A'][t]; recs=[r for g in trak[mi].coll for r in g]
def planes(r):
return [struct.unpack_from('<bbbBh',r,2+6*k) for k in range(5)]
def corners(r):
P=planes(r); ne=4 if r[0]&1 else 3; E=P[1:1+ne]; S=P[0]; pts=[]
for i in range(ne):
a,b=E[i],E[(i+1)%ne]
A=np.array([S[:3],a[:3],b[:3]],float); B=np.array([S[4],a[4],b[4]],float)/32
pts.append(np.linalg.solve(A,B)) # n127*32*p = d -> n127.p = d/32 (p in units)...
return pts
# local (engine) -> world: local=(lz_w', -lx_w') for rot 3072 => dx=-lz, dz=lx
a=-rot/4096*2*math.pi
def toworld(p):
lx,ly,lz=p
# invert lx=c*dx+s*dz, lz=c*dz-s*dx with s=sin(a'),c=cos(a'), a'=(-rot)*2pi/4096
s,c=math.sin(a),math.cos(a)
dx=c*lx-s*lz; dz=s*lx+c*lz
return (x+dx,y+ly,-z+dz)
for i in [int(v) for v in sys.argv[1:]]:
r=recs[i]; P=planes(r)
print('poly',i,'type',r[0],'surface n',[v/127 for v in P[0][:3]])
for p in corners(r):
print(' local',np.round(p,4),' world',np.round(toworld(p),4))