p3he/draw.py

47 lines
1.4 KiB
Python

from cmath import exp
from constants import I, BLACK
from gyro import MobiusInt, MobiusAdd, MobiusBetween, MobiusDist, cDot, Poincare2Klein
from numba import jit, byte, double, prange, optional
from numba.types import UniTuple
from numba.typed import List as nlist
from numba.experimental import jitclass
from numpy import full
drawnsegmentsig = [
('dist', double),
('color', UniTuple(byte, 3))
]
@jitclass(drawnsegmentsig)
class DrawnSegment:
def __init__(self,dist,color):
self.dist = dist
self.color = color
@jit#(cache=True,parallel=True)
def draw(level,gPlayer,fov,res,dscale):
EMPTYDRAWN = DrawnSegment(0, BLACK)
drawn = [EMPTYDRAWN] * res
irot = exp(fov/res*I)
iprot = gPlayer.cRot
for i in range(res):
m = None
rot = irot**(i-(res/2)) * iprot
for j in level:
cInt = MobiusInt(j.pointA,j.pointB,gPlayer.cPos,rot)
if cDot(rot,MobiusAdd(cInt,-gPlayer.cPos)) > 0:
continue
rDist = MobiusDist(cInt,gPlayer.cPos) * dscale
if j.isFinite and not MobiusBetween(j.pointA,j.pointB,cInt):
continue
if m is None:
m = DrawnSegment(rDist,j.color)
continue
if m.dist > rDist:
m = DrawnSegment(rDist,j.color)
drawn[i] = (m if m is not None else EMPTYDRAWN)
return drawn