'Wireframe 3D engine
'Programmed by Ben Wagner

SCREEN 12
CLS
WINDOW (320, 240)-(-320, -240)
TIME = TIMER

'Prism in 3D
vertex1x = 20
vertex1y = 35
vertex1z = 25
vertex2x = 10
vertex2y = 10
vertex2z = 20
vertex3x = 30
vertex3y = 10
vertex3z = 20
vertex4x = 20
vertex4y = 10
vertex4z = 30


DO

x = x + .0025

'Camera Position in 3D
CameraX = 0
CameraY = -1
CameraZ = -1

'Screen Position
Screenz = 0

vertex1x = SIN(x) * 10 + 20
vertex1z = COS(x) * 10 + 25
vertex2x = SIN(x) * 10 + 10
vertex2z = COS(x) * 10 + 20
vertex3x = SIN(x) * 10 + 30
vertex3z = COS(x) * 10 + 20
vertex4x = SIN(x) * 10 + 20
vertex4z = COS(x) * 10 + 30


'Ray of light slope calculations
n1 = (vertex1y - CameraY) / (vertex1z - CameraZ)
o1 = (vertex1x - CameraX) / (vertex1z - CameraZ)
n2 = (vertex2y - CameraY) / (vertex2z - CameraZ)
o2 = (vertex2x - CameraX) / (vertex2z - CameraZ)
n3 = (vertex3y - CameraY) / (vertex3z - CameraZ)
o3 = (vertex3x - CameraX) / (vertex3z - CameraZ)
n4 = (vertex4y - CameraY) / (vertex4z - CameraZ)
o4 = (vertex4x - CameraX) / (vertex4z - CameraZ)


'Work out where ray of light crosses screen
e1 = vertex1x - (o1 * (vertex1z - Screenz))
d1 = vertex1y - (n1 * (vertex1z - Screenz))
e2 = vertex2x - (o2 * (vertex2z - Screenz))
d2 = vertex2y - (n2 * (vertex2z - Screenz))
e3 = vertex3x - (o3 * (vertex3z - Screenz))
d3 = vertex3y - (n3 * (vertex3z - Screenz))
e4 = vertex4x - (o4 * (vertex4z - Screenz))
d4 = vertex4y - (n4 * (vertex4z - Screenz))


'Clear shape
LINE (olde1 * 100, oldd1 * 100)-(olde2 * 100, oldd2 * 100), 0
LINE (olde1 * 100, oldd1 * 100)-(olde3 * 100, oldd3 * 100), 0
LINE (olde1 * 100, oldd1 * 100)-(olde4 * 100, oldd4 * 100), 0
LINE (olde2 * 100, oldd2 * 100)-(olde3 * 100, oldd3 * 100), 0
LINE (olde2 * 100, oldd2 * 100)-(olde4 * 100, oldd4 * 100), 0
LINE (olde3 * 100, oldd3 * 100)-(olde4 * 100, oldd4 * 100), 0


'Draw shape
LINE (e1 * 100, d1 * 100)-(e2 * 100, d2 * 100)
LINE (e1 * 100, d1 * 100)-(e3 * 100, d3 * 100)
LINE (e1 * 100, d1 * 100)-(e4 * 100, d4 * 100)
LINE (e2 * 100, d2 * 100)-(e3 * 100, d3 * 100)
LINE (e2 * 100, d2 * 100)-(e4 * 100, d4 * 100)
LINE (e3 * 100, d3 * 100)-(e4 * 100, d4 * 100)

'2D representation
PSET (CameraX * 5, CameraZ * 5)

LINE (-320, Screenz)-(320, Screenz)

LINE (oldvertex4x * 5, oldvertex4z * 5)-(oldvertex2x * 5, oldvertex2z * 5), 0
LINE (oldvertex2x * 5, oldvertex2z * 5)-(oldvertex3x * 5, oldvertex3z * 5), 0
LINE (oldvertex3x * 5, oldvertex3z * 5)-(oldvertex4x * 5, oldvertex4z * 5), 0


LINE (vertex4x * 5, vertex4z * 5)-(vertex2x * 5, vertex2z * 5)
LINE (vertex2x * 5, vertex2z * 5)-(vertex3x * 5, vertex3z * 5)
LINE (vertex3x * 5, vertex3z * 5)-(vertex4x * 5, vertex4z * 5)


olde1 = e1
olde2 = e2
olde3 = e3
olde4 = e4
oldd1 = d1
oldd2 = d2
oldd3 = d3
oldd4 = d4


oldvertex4x = vertex4x
oldvertex2x = vertex2x
oldvertex3x = vertex3x
oldvertex4z = vertex4z
oldvertex2z = vertex2z
oldvertex3z = vertex3z



'Frame count
FRAMES = FRAMES + 1

LOOP WHILE INKEY$ = ""

'Frame rate calculations
TIMEEND = TIMER - TIME
FPS = FRAMES / TIMEEND

PRINT "Time taken="; TIMEEND
PRINT "Frames ="; FRAMES
PRINT "FPS="; FPS
