from cmath import exp from constants import I, BLACK from gyro import MobiusInt, MobiusAdd, MobiusDist, cDot from lines import cBetween 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): 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: try: # Function "LineIntersection" faults from time to time cInt = MobiusInt(j.pointA,j.pointB,gPlayer.cPos,rot) except: continue if cDot(rot,MobiusAdd(cInt,-gPlayer.cPos)) > 0: continue rDist = MobiusDist(cInt,gPlayer.cPos)*1.1 if j.isFinite and not cBetween(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