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