function
pointInTriangle
ax
ay
az
c1x
c1y
c1z
c2x
c2y
c2z
c3x
c3y
c3z
call
sameSide
ax
ay
az
c1x
c1y
c1z
c2x
c2y
c2z
c3x
c3y
c3z
if
then
else
isSameSide
call
sameSide
ax
ay
az
c2x
c2y
c2z
c1x
c1y
c1z
c3x
c3y
c3z
if
then
else
isSameSide
call
sameSide
ax
ay
az
c3x
c3y
c3z
c1x
c1y
c1z
c2x
c2y
c2z
isSameSide
set
isPointInTriangle
to
false
set
isPointInTriangle
to
false
set
isPointInTriangle
to
function
sameSide
ax
ay
az
bx
by
bz
cx
cy
cz
dx
dy
dx
cx
-
dy
cy
-
dz
cz
-
cx
ax
-
cy
ay
-
cz
az
-
sy
caz
×
sz
cay
×
-
sz
cax
×
sx
caz
×
-
sx
cay
×
sy
cax
×
-
cx
bx
-
cy
by
-
cz
bz
-
sy
cbz
×
sz
cby
×
-
sz
cbx
×
sx
cbz
×
-
sx
cby
×
sy
cbx
×
-
cp1x
cp2x
×
cp1y
cp2y
×
cp1z
cp2z
×
dotx
doty
+
dotz
+
0
≥
set
isSameSide
to
set
dotz
to
set
doty
to
set
dotx
to
set
cp2z
to
set
cp2y
to
set
cp2x
to
set
cbz
to
set
cby
to
set
cbx
to
set
cp1z
to
set
cp1y
to
set
cp1x
to
set
caz
to
set
cay
to
set
cax
to
set
sz
to
set
sy
to
set
sx
to
dz
function
getIntersectionDistance
linePointX
linePointY
linePointZ
lineAngleX
lineAngleY
lineAngleZ
planeA
planeB
planeC
planeK
tc1x
tc1y
tc1z
tc2x
tc2y
tc2z
tc3x
tc3y
tc3z
tminx
tminy
tminz
tmaxx
tmaxy
tmaxz
0
call
getLambda
planeA
planeB
planeC
planeK
linePointX
linePointY
linePointZ
lineAngleX
lineAngleY
lineAngleZ
lambda
linePointX
lambda
lineAngleX
×
+
z
tminx
≥
z
tmaxx
≤
linePointY
lambda
lineAngleY
×
+
a
tminy
≥
a
tmaxy
≤
linePointZ
lambda
lineAngleZ
×
+
b
tminz
≥
b
tmaxz
≤
call
pointInTriangle
z
a
b
tc1x
tc1y
tc1z
tc2x
tc2y
tc2z
tc3x
tc3y
tc3z
isPointInTriangle
lambda
set
intersectionDistance
to
if
then
if
then
if
then
set
b
to
if
then
if
then
set
a
to
if
then
if
then
set
z
to
if
then
set
intersectionDistance
to
function
getLambda
planeA
planeB
planeC
planeK
linePointX
linePointY
linePointZ
lineAngleX
lineAngleY
lineAngleZ
call
getScale
planeA
planeB
planeC
lineAngleX
lineAngleY
lineAngleZ
scale
0
planeA
linePointX
×
planeB
linePointY
×
+
planeC
linePointZ
×
+
planeK
+
-
scale
÷
set
lambda
to
if
then
function
render
screenSize
cameraRays
×
rays
1
-
2
÷
0
0
1
call
rotateInX
cameraPitch
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
viewWidth
rays
÷
0
0
call
rotateInX
cameraPitch
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
0
viewWidth
rays
÷
0
call
rotateInX
cameraPitch
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
cameraVectorX
xIncVectorX
raysExtreme
×
-
yIncVectorX
raysExtreme
×
-
cameraVectorY
xIncVectorY
raysExtreme
×
-
yIncVectorY
raysExtreme
×
-
cameraVectorZ
xIncVectorZ
raysExtreme
×
-
yIncVectorZ
raysExtreme
×
-
call
resetPixels
y
rays
1
-
x
rays
1
-
x
cameraRays
÷
floor
y
cameraRays
÷
floor
rayStartVectorX
xIncVectorX
x
×
+
yIncVectorX
y
×
+
rayStartVectorY
xIncVectorY
x
×
+
yIncVectorY
y
×
+
rayStartVectorZ
xIncVectorZ
x
×
+
yIncVectorZ
y
×
+
call
traceRay
xPx
yPx
cameraCoordX
cameraCoordY
cameraCoordZ
rayVectorX
rayVectorY
rayStartVectorZ
set
rayVectorZ
to
set
rayVectorY
to
set
rayVectorX
to
set
yPx
to
set
xPx
to
for
from 0 to
do
call
display
for
from 0 to
do
set
rayStartVectorZ
to
set
rayStartVectorY
to
set
rayStartVectorX
to
set
yIncVectorZ
to
set
yIncVectorY
to
set
yIncVectorX
to
set
vectorZ
to
set
vectorY
to
set
vectorX
to
set
xIncVectorZ
to
set
xIncVectorY
to
set
xIncVectorX
to
set
vectorZ
to
set
vectorY
to
set
vectorX
to
set
cameraVectorZ
to
set
cameraVectorY
to
set
cameraVectorX
to
set
vectorZ
to
set
vectorY
to
set
vectorX
to
set
raysExtreme
to
set
rays
to
function
getScale
planeA
planeB
planeC
angleX
angleY
angleZ
planeA
angleX
×
planeB
angleY
×
+
planeC
angleZ
×
+
set
scale
to
function
rotateInY
rads
vectorX
cos
rads
×
vectorZ
sin
rads
×
+
0
vectorX
-
sin
rads
×
vectorZ
cos
rads
×
+
newX
newZ2
set
vectorZ
to
set
vectorX
to
set
newZ2
to
set
newX
to
let scale: number;
let lambda: number;
let intersectionDistance: number;
let isSameSide: boolean;
let isPointInTriangle: boolean;
1
5
1
0.05
let triangleCoords: number[][];
empty array
let triangle1: number[];
empty array
triangle1
-1
triangle1
0
triangle1
2
triangle1
0
triangle1
-2
triangle1
3
triangle1
1
triangle1
0
triangle1
2
triangle1
bright
triangleCoords
triangle1
let triangle2: number[];
empty array
triangle2
-1
triangle2
0
triangle2
4
triangle2
0
triangle2
-2
triangle2
3
triangle2
1
triangle2
0
triangle2
4
triangle2
dim
triangleCoords
triangle2
let triangle3: number[];
empty array
triangle3
-1
triangle3
0
triangle3
2
triangle3
0
triangle3
-2
triangle3
3
triangle3
-1
triangle3
0
triangle3
4
triangle3
dim
triangleCoords
triangle3
let triangle4: number[];
empty array
triangle4
1
triangle4
0
triangle4
2
triangle4
0
triangle4
-2
triangle4
3
triangle4
1
triangle4
0
triangle4
4
triangle4
bright
triangleCoords
triangle4
let triangleBrightness: number[];
let triangleC1X: number[];
let triangleC1Y: number[];
let triangleC1Z: number[];
let triangleC2X: number[];
let triangleC2Y: number[];
let triangleC2Z: number[];
let triangleC3X: number[];
let triangleC3Y: number[];
let triangleC3Z: number[];
let triangleMinX: number[];
let triangleMinY: number[];
let triangleMinZ: number[];
let triangleMaxX: number[];
let triangleMaxY: number[];
let triangleMaxZ: number[];
let trianglePlaneA: number[];
let trianglePlaneB: number[];
let trianglePlaneC: number[];
let trianglePlaneK: number[];
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
empty array
triangle
triangleCoords
triangleC1X
triangle
0
get value at
triangleC1Y
triangle
1
get value at
triangleC1Z
triangle
2
get value at
triangleC2X
triangle
3
get value at
triangleC2Y
triangle
4
get value at
triangleC2Z
triangle
5
get value at
triangleC3X
triangle
6
get value at
triangleC3Y
triangle
7
get value at
triangleC3Z
triangle
8
get value at
triangleBrightness
triangle
9
get value at
triangle
3
get value at
triangle
0
get value at
-
triangle
4
get value at
triangle
1
get value at
-
triangle
5
get value at
triangle
2
get value at
-
triangle
6
get value at
triangle
0
get value at
-
triangle
7
get value at
triangle
1
get value at
-
triangle
8
get value at
triangle
2
get value at
-
v1y
v2z
×
v1z
v2y
×
-
v1z
v2x
×
v1x
v2z
×
-
v1x
v2y
×
v1y
v2x
×
-
trianglePlaneA
nx
trianglePlaneB
ny
trianglePlaneC
nz
trianglePlaneK
0
nx
triangle
0
get value at
×
ny
triangle
1
get value at
×
+
nz
triangle
2
get value at
×
+
-
triangleMinX
triangle
0
get value at
triangle
3
get value at
triangle
6
get value at
min
of
and
min
of
and
triangleMinY
triangle
1
get value at
triangle
4
get value at
triangle
7
get value at
min
of
and
min
of
and
triangleMinZ
triangle
2
get value at
triangle
5
get value at
triangle
8
get value at
min
of
and
min
of
and
triangleMaxX
triangle
0
get value at
triangle
3
get value at
triangle
6
get value at
max
of
and
max
of
and
triangleMaxY
triangle
1
get value at
triangle
4
get value at
triangle
7
get value at
max
of
and
max
of
and
triangleMaxZ
triangle
2
get value at
triangle
5
get value at
triangle
8
get value at
max
of
and
max
of
and
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
set
nz
to
set
ny
to
set
nx
to
set
v2z
to
set
v2y
to
set
v2x
to
set
v1z
to
set
v1y
to
set
v1x
to
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
-1
-1.5
let pixelLightLevel: number[];
empty array
0.5
call
render
set
viewWidth
to
set
pixelLightLevel
to
set
cameraCoordZ
to
set
cameraCoordY
to
for element
of
do
set
trianglePlaneK
to
set
trianglePlaneC
to
set
trianglePlaneB
to
set
trianglePlaneA
to
set
triangleMaxZ
to
set
triangleMaxY
to
set
triangleMaxX
to
set
triangleMinZ
to
set
triangleMinY
to
set
triangleMinX
to
set
triangleC3Z
to
set
triangleC3Y
to
set
triangleC3X
to
set
triangleC2Z
to
set
triangleC2Y
to
set
triangleC2X
to
set
triangleC1Z
to
set
triangleC1Y
to
set
triangleC1X
to
set
triangleBrightness
to
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
set
triangle4
to
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
set
triangle3
to
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
set
triangle2
to
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
add value
to end
set
triangle1
to
set
triangleCoords
to
set
dim
to
set
bright
to
set
screenSize
to
set
cameraRays
to
on start
function
traceRay
pixelX
pixelY
rayPointX
rayPointY
rayPointZ
rayAngleX
rayAngleY
rayAngleZ
let minLambda: number;
let currentBrightness;
k
triangleC1X
length of array
1
-
trianglePlaneA
k
get value at
trianglePlaneB
k
get value at
trianglePlaneC
k
get value at
trianglePlaneK
k
get value at
triangleC1X
k
get value at
triangleC1Y
k
get value at
triangleC1Z
k
get value at
triangleC2X
k
get value at
triangleC2Y
k
get value at
triangleC2Z
k
get value at
triangleC3X
k
get value at
triangleC3Y
k
get value at
triangleC3Z
k
get value at
triangleMinX
k
get value at
triangleMinY
k
get value at
triangleMinZ
k
get value at
triangleMaxX
k
get value at
triangleMaxY
k
get value at
triangleMaxZ
k
get value at
call
getIntersectionDistance
rayPointX
rayPointY
rayPointZ
rayAngleX
rayAngleY
rayAngleZ
planeA
planeB
planeC
planeK
c1x
c1y
c1z
c2x
c2y
c2z
c3x
c3y
c3z
minX
minY
minZ
maxX
maxY
maxZ
intersectionDistance
minLambda
not
intersectionDistance
minLambda
<
or
intersectionDistance
triangleBrightness
k
get value at
set
currentBrightness
to
set
minLambda
to
if
then
if
then
set
maxZ
to
set
maxY
to
set
maxX
to
set
minZ
to
set
minY
to
set
minX
to
set
c3z
to
set
c3y
to
set
c3x
to
set
c2z
to
set
c2y
to
set
c2x
to
set
c1z
to
set
c1y
to
set
c1x
to
set
planeK
to
set
planeC
to
set
planeB
to
set
planeA
to
currentBrightness
pixelLightLevel[pixelX + pixelY * screenSize] += currentBrightness;
if
then
for
from 0 to
do
-0.5
0
0
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
call
render
change
cameraCoordZ
by
change
cameraCoordY
by
change
cameraCoordX
by
set
vectorZ
to
set
vectorY
to
set
vectorX
to
on button
A
pressed
0.5
0
0
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
call
render
change
cameraCoordZ
by
change
cameraCoordY
by
change
cameraCoordX
by
set
vectorZ
to
set
vectorY
to
set
vectorX
to
on button
B
pressed
0
0
0.5
call
rotateInY
cameraYaw
vectorX
vectorY
vectorZ
call
render
change
cameraCoordZ
by
change
cameraCoordY
by
change
cameraCoordX
by
set
vectorZ
to
set
vectorY
to
set
vectorX
to
on button
A+B
pressed
0.1
call
render
change
cameraYaw
by
on
tilt left
0
0.1
-
call
render
change
cameraYaw
by
on
tilt right
0
0.1
-
call
render
change
cameraPitch
by
on
logo down
function
rotateInX
rads
vectorY
cos
rads
×
vectorZ
sin
rads
×
-
vectorY
sin
rads
×
vectorZ
cos
rads
×
+
newY
newZ
set
vectorZ
to
set
vectorY
to
set
newZ
to
set
newY
to
0.1
call
render
change
cameraPitch
by
on
logo up
function
resetPixels
i
screenSize
screenSize
×
1
-
pixelLightLevel
i
0
set value at
to
clear screen
for
from 0 to
do
function
display
cameraRays
cameraRays
×
j
screenSize
screenSize
×
1
-
255
pixelLightLevel
j
get value at
×
maxBrightness
÷
j
screenSize
remainder of
÷
j
screenSize
÷
floor
normalised
plot
x
y
brightness
set
normalised
to
for
from 0 to
do
set
maxBrightness
to