import struct, math, numpy as np from PIL import Image data=open("content/VIDEO/GEO/TSPHERE.BGF","rb").read() verts=[]; faces=[] def parse(p,end): while p+3<=end: tw=struct.unpack_from("end:return ln=data[p] if lw==1 else(struct.unpack_from("end:return if cid==0x0089: for i in range(ln//32): o=p+i*32; x,y,z=struct.unpack_from("1e-5: sc=rI/r; x*=sc; y=8.25+dy*sc return [x,y,z] def tess(V,UV,F,passes): for _ in range(passes): nF=[]; mid={} def gm(a,b): k=(min(a,b),max(a,b)) if k in mid:return mid[k] pm=proj_cone([(V[a][0]+V[b][0])/2,(V[a][1]+V[b][1])/2,(V[a][2]+V[b][2])/2]) um=[(UV[a][0]+UV[b][0])/2,(UV[a][1]+UV[b][1])/2] V.append(pm); UV.append(um); mid[k]=len(V)-1; return len(V)-1 for (a,b,c) in F: ab=gm(a,b); bc=gm(b,c); ca=gm(c,a) nF+= [(a,ab,ca),(ab,b,bc),(ca,bc,c),(ab,bc,ca)] F=nF return V,UV,F V,UV,F=tess(V,UV,F,3) Va=np.array(V); UVa=np.array(UV) print("after tess: verts",len(V),"faces",len(F)) bd=open("content/VIDEO/TEX/BINTA.VTX","rb").read() w=h=64; off=57 tex=np.frombuffer(bd[off:off+w*h*3],dtype=np.uint8).astype(float).reshape(h,w,3)/255.0 texL=0.299*tex[:,:,0]+0.587*tex[:,:,1]+0.114*tex[:,:,2] def sample(u,v): return texL[np.clip(((v%1.0)*h).astype(int),0,h-1),np.clip(((u%1.0)*w).astype(int),0,w-1)] def clip_near(poly,zn=0.1): out=[];n=len(poly) for i in range(n): A=poly[i];B=poly[(i+1)%n] if A[2]>=zn: out.append(A) if (A[2]>=zn)!=(B[2]>=zn): t=(zn-A[2])/(B[2]-A[2]); out.append(tuple(A[k]+(B[k]-A[k])*t for k in range(5))) return out def render(eyeY=0.0,spin=0.0,fov=75.0,contrast=1.0,twist=0.0, LO=(0.15,0.12,0.35),HI=(0.98,0.94,1.0),W=320,H=240,radfreq=1.0): LO=np.array(LO);HI=np.array(HI) c,s=math.cos(spin),math.sin(spin) Vx=Va[:,0]*c-Va[:,1]*s; Vy=Va[:,0]*s+Va[:,1]*c P=np.stack([Vx,Vy-eyeY,Va[:,2]],axis=1) f=(H/2)/math.tan(math.radians(fov)/2) img=np.zeros((H,W,3)); zb=np.full((H,W),1e18) for (a,b,cc) in F: tri=[(P[i][0],P[i][1],P[i][2],UVa[i][0]+twist*UVa[i][1],UVa[i][1]*radfreq) for i in (a,b,cc)] cp=clip_near(tri) if len(cp)<3:continue for k in range(1,len(cp)-1): A,B,C=cp[0],cp[k],cp[k+1] def pr(p):return(W/2+f*p[0]/p[2],H/2-f*p[1]/p[2],p[2],p[3],p[4]) xa,ya,za,ua,vaa=pr(A);xb,yb,zb2,ub,vbb=pr(B);xc,yc,zc,uc,vcc=pr(C) minx=max(int(min(xa,xb,xc)),0);maxx=min(int(max(xa,xb,xc))+1,W-1) miny=max(int(min(ya,yb,yc)),0);maxy=min(int(max(ya,yb,yc))+1,H-1) if minx>=maxx or miny>=maxy:continue den=((yb-yc)*(xa-xc)+(xc-xb)*(ya-yc)) if abs(den)<1e-9:continue ys,xs=np.mgrid[miny:maxy+1,minx:maxx+1];xf=xs+.5;yf=ys+.5 l1=((yb-yc)*(xf-xc)+(xc-xb)*(yf-yc))/den l2=((yc-ya)*(xf-xc)+(xa-xc)*(yf-yc))/den l3=1-l1-l2; m=(l1>=0)&(l2>=0)&(l3>=0) if not m.any():continue iz=l1/za+l2/zb2+l3/zc; z=1/iz u=(l1*ua/za+l2*ub/zb2+l3*uc/zc)*z; v=(l1*vaa/za+l2*vbb/zb2+l3*vcc/zc)*z lum=np.clip((sample(u,v)-0.5)*contrast+0.5,0,1) col=LO[None,:]+(HI-LO)[None,:]*lum[...,None] yi=ys[m];xi=xs[m];zz=z[m];cl=zz=maxx or miny>=maxy:continue den=((yb-yc)*(xa-xc)+(xc-xb)*(ya-yc)) if abs(den)<1e-9:continue ys,xs=np.mgrid[miny:maxy+1,minx:maxx+1];xf=xs+.5;yf=ys+.5 l1=((yb-yc)*(xf-xc)+(xc-xb)*(yf-yc))/den l2=((yc-ya)*(xf-xc)+(xa-xc)*(yf-yc))/den l3=1-l1-l2; m=(l1>=0)&(l2>=0)&(l3>=0) if not m.any():continue iz=l1/za+l2/zb2+l3/zc; z=1/iz u=(l1*ua/za+l2*ub/zb2+l3*uc/zc)*z; v=(l1*vaa/za+l2*vbb/zb2+l3*vcc/zc)*z lum=np.clip((sample_bilin(u,v)-0.5)*contrast+0.5,0,1) col=LO[None,:]+(HI-LO)[None,:]*lum[...,None] yi=ys[m];xi=xs[m];zz=z[m];cl=zz=maxx or miny>=maxy:continue den=((yb-yc)*(xa-xc)+(xc-xb)*(ya-yc)) if abs(den)<1e-9:continue ys,xs=np.mgrid[miny:maxy+1,minx:maxx+1];xf=xs+.5;yf=ys+.5 l1=((yb-yc)*(xf-xc)+(xc-xb)*(yf-yc))/den l2=((yc-ya)*(xf-xc)+(xa-xc)*(yf-yc))/den l3=1-l1-l2; m=(l1>=0)&(l2>=0)&(l3>=0) if not m.any():continue iz=l1/za+l2/zb2+l3/zc; z=1/iz u=(l1*ua/za+l2*ub/zb2+l3*uc/zc)*z; v=(l1*vaa/za+l2*vbb/zb2+l3*vcc/zc)*z lum=np.clip((sample_bilin(u,v)-0.5)*contrast+0.5,0,1) col=LO[None,:]+(HI-LO)[None,:]*lum[...,None] yi=ys[m];xi=xs[m];zz=z[m];cl=zz