Add LOLCODE support

This commit is contained in:
William Di Luigi
2014-10-25 13:06:46 +02:00
parent c8038d1c80
commit 3504a36c3e
2 changed files with 802 additions and 0 deletions

View File

@@ -1292,6 +1292,13 @@ LLVM:
extensions:
- .ll
LOLCODE:
type: programming
lexer: Text only
extensions:
- .lol
color: "#cc9900"
LSL:
type: programming
lexer: LSL

View File

@@ -0,0 +1,795 @@
HAI 1.3
OBTW
Author: Logan Kelly (logan.kelly@gmail.com)
Github: https://github.com/LoganKelly/LOLTracer
TLDR
OBTW prev is the number used in the randin function.
I had to declare it in global scope so that it
would retain its value between calls to randin.
TLDR
I HAS A prev ITZ 0
I HAS A rand_max ITZ 104729
OBTW Equivalent to C's rand() function, except returns
a number in the range of 0 to rand_max.
TLDR
HOW IZ I randin
I HAS A a ITZ 33083
I HAS A c ITZ 67607
prev R MOD OF SUM OF PRODUKT OF prev AN a AN c AN rand_max
FOUND YR prev
IF U SAY SO
BTW Returns a random number within the range of 0-1.
HOW IZ I rand_onein
I HAS A rand_num ITZ I IZ randin MKAY
rand_num IS NOW A NUMBAR
I HAS A rand_max_float ITZ MAEK rand_max A NUMBAR
FOUND YR QUOSHUNT OF rand_num AN rand_max_float
IF U SAY SO
OBTW Equivalent to C ceil() function. Returns the next
largest integer for the given number.
TLDR
HOW IZ I ceilin YR num
I HAS A int_num ITZ num
int_num IS NOW A NUMBR
BOTH SAEM int_num AN num, O RLY?
YA RLY, FOUND YR num
OIC
DIFFRINT num AN SMALLR OF num AN 0, O RLY?
YA RLY
int_num R SUM OF int_num AN 1
FOUND YR MAEK int_num A NUMBAR
OIC
DIFFRINT num AN BIGGR OF num AN 0, O RLY?
YA RLY
FOUND YR MAEK int_num A NUMBAR
OIC
IF U SAY SO
OBTW Convert a number to hexadecimal. This
is returned as a string.
TLDR
HOW IZ I decimal_to_hex YR num
I HAS A i ITZ 0
I HAS A rem
I HAS A hex_num ITZ A BUKKIT
I HAS A decimal_num ITZ num
IM IN YR num_loop
rem R MOD OF decimal_num AN 16
I HAS A hex_digit
rem, WTF?
OMG 10, hex_digit R "A", GTFO
OMG 11, hex_digit R "B", GTFO
OMG 12, hex_digit R "C", GTFO
OMG 13, hex_digit R "D", GTFO
OMG 14, hex_digit R "E", GTFO
OMG 15, hex_digit R "F", GTFO
OMGWTF, hex_digit R rem
OIC
hex_num HAS A SRS i ITZ hex_digit
decimal_num R QUOSHUNT OF decimal_num AN 16
BOTH SAEM decimal_num AN 0, O RLY?
YA RLY, GTFO
NO WAI, i R SUM OF i AN 1
OIC
IM OUTTA YR num_loop
I HAS A hex_string ITZ A YARN
IM IN YR string_reverse
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
YA RLY, GTFO
OIC
hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY
i R DIFF OF i AN 1
IM OUTTA YR string_reverse
FOUND YR hex_string
IF U SAY SO
OBTW Convert a number to binary. This is returned
as a bukkit which has slots number 0-N where
n is equal to the number of binary digits - 1.
It also has a length slot which is equal to
the number of binary digits.
TLDR
HOW IZ I decimal_to_binary YR num
I HAS A i ITZ 0
I HAS A decimal_num ITZ num
I HAS A binary_num ITZ A BUKKIT
IM IN YR num_loop
binary_num HAS A SRS i ITZ MOD OF decimal_num AN 2
decimal_num R QUOSHUNT OF decimal_num AN 2
BOTH SAEM decimal_num AN 0, O RLY?
YA RLY
I HAS A length ITZ SUM OF i AN 1
binary_num HAS A length ITZ length
GTFO
NO WAI, i R SUM OF i AN 1
OIC
IM OUTTA YR num_loop
FOUND YR binary_num
IF U SAY SO
OBTW Bitwise and two binary numbers. The numbers
must be provided in the format returned by
decimal_to_binary.
TLDR
HOW IZ I bitwise_andin YR first_num AN YR second_num
I HAS A binary_first_num ITZ I IZ decimal_to_binary YR first_num MKAY
I HAS A binary_second_num ITZ I IZ decimal_to_binary YR second_num MKAY
I HAS A first_length ITZ binary_first_num'Z length
I HAS A second_length ITZ binary_second_num'Z length
I HAS A max_length ITZ BIGGR OF first_length AN second_length
I HAS A final_binary ITZ A BUKKIT
I HAS A final_length ITZ 0
I HAS A i ITZ 0
IM IN YR num_loop
BOTH SAEM i AN max_length, O RLY?
YA RLY, GTFO
OIC
I HAS A first_binary ITZ 0
I HAS A second_binary ITZ 0
DIFFRINT i AN BIGGR OF i AN first_length, O RLY?
YA RLY, first_binary R binary_first_num'Z SRS i
OIC
DIFFRINT i AN BIGGR OF i AN second_length, O RLY?
YA RLY, second_binary R binary_second_num'Z SRS i
OIC
EITHER OF BOTH SAEM first_binary AN 0 AN ...
BOTH SAEM second_binary AN 0, O RLY?
YA RLY, final_binary HAS A SRS i ITZ 0
NO WAI
final_binary HAS A SRS i ITZ 1
final_length R SUM OF i AN 1
OIC
i R SUM OF i AN 1
IM OUTTA YR num_loop
final_binary HAS A length ITZ final_length
FOUND YR final_binary
IF U SAY SO
OBTW Bitshift left a binary number by num_bits.
The binary number must be provided in the format
returned by decimal_to_binary.
TLDR
HOW IZ I bit_shift_leftin YR num AN YR num_bits
I HAS A binary_num ITZ num
I HAS A length ITZ binary_num'Z length
I HAS A i ITZ SUM OF DIFF OF length AN 1 AN num_bits
I HAS A shifted_binary_num ITZ A BUKKIT
IM IN YR num_loop
BOTH SAEM i AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A unshifted_index ITZ DIFF OF i AN num_bits
BOTH SAEM unshifted_index AN BIGGR OF unshifted_index AN 0, O RLY?
YA RLY
shifted_binary_num HAS A SRS i ITZ binary_num'Z SRS unshifted_index
NO WAI
shifted_binary_num HAS A SRS i ITZ 0
OIC
i R DIFF OF i AN 1
IM OUTTA YR num_loop
shifted_binary_num HAS A length ITZ SUM OF binary_num'Z length AN num_bits
FOUND YR shifted_binary_num
IF U SAY SO
OBTW Convert a binary number into a decimal number.
The binary number must be provided in the format
return by decimal_to_binary.
TLDR
HOW IZ I binary_to_decimal YR binary_num
I HAS A length ITZ binary_num'Z length
I HAS A decimal_num ITZ 0
I HAS A i ITZ 0
IM IN YR num_loop
BOTH SAEM i AN length, O RLY?
YA RLY, GTFO
OIC
I HAS A binary_value ITZ binary_num'Z SRS i
I HAS A decimal_value ITZ 0
BOTH SAEM binary_value AN 1, O RLY?
YA RLY, decimal_value R I IZ power_of YR 2 AN YR i MKAY
OIC
decimal_num R SUM OF decimal_num AN decimal_value
i R SUM OF i AN 1
IM OUTTA YR num_loop
FOUND YR decimal_num
IF U SAY SO
OBTW Equivalent to C's pow() function. Raises
base to the power of exponent.
TLDR
HOW IZ I power_of YR base AN YR exponent
I HAS A i ITZ 0
I HAS A num ITZ 1
IM IN YR num_loop
BOTH SAEM i AN exponent, O RLY?
YA RLY, GTFO
OIC
num R PRODUKT OF num AN base
i R SUM OF i AN 1
IM OUTTA YR num_loop
FOUND YR num
IF U SAY SO
OBTW Return a binary number as a YARN.
The binary number must be provided in the format
return by decimal_to_binary.
TLDR
HOW IZ I binary_to_string YR binary_num
I HAS A binary_string ITZ A YARN
I HAS A i ITZ DIFF OF binary_num'Z length AN 1
IM IN YR string_reverse
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
YA RLY, GTFO
OIC
binary_string R SMOOSH binary_string AN binary_num'Z SRS i MKAY
i R DIFF OF i AN 1
IM OUTTA YR string_reverse
FOUND YR binary_string
IF U SAY SO
OBTW Converts a hexadecimal number to the character
equivalent in UNICODE. This was originally used
in an attempt to write out to the P6 format of PPM,
but the string produced by VISIBLE didn't seem to be
properly formatted for some reason. Instead I fell back
to P3 of PPM and wrote out to regular ascii format.
TLDR
HOW IZ I hex_to_char YR hex_string
OBTW This is a hack I found for converting hexadecimal strings
into their unicode character equivalents. Instead of using
the ":" character directly, we escape it and get it using its
unicode hex value (3A). This allows us to assemble the string
with our inserted hex value without errors.
TLDR
FOUND YR SMOOSH ":(3A)" AN "(" AN hex_string AN ")" MKAY
IF U SAY SO
OBTW Equivalent to C's square() function. However it will only
produce accurate results if the number is no larger than
1048576. See the note below. This is based upon Newton's
Approximation Method as adapted in C at this website (#11):
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
TLDR
HOW IZ I square_rootin YR number
OBTW Forcing a comparison between the accuracy and a number
which is so big that its precision is larger than the
accuracy causes an infinite loop to occur. For this
reason we have to set any number larger than 2^20 to
a value below it.
TLDR
BOTH SAEM number AN BIGGR OF number AN 1048576.00, O RLY?
YA RLY, number R 1048575.00
OIC
I HAS A accuracy ITZ 0.0001
I HAS A lower ITZ A NUMBAR
I HAS A upper ITZ A NUMBAR
I HAS A guess ITZ A NUMBAR
DIFFRINT number AN BIGGR OF number AN 1.0, O RLY?
YA RLY
lower R number
upper R 1.0
NO WAI
lower R 1.0
upper R number
OIC
IM IN YR LOOP
I HAS A delta ITZ DIFF OF upper AN lower
BOTH SAEM delta AN SMALLR OF delta AN accuracy, O RLY?
YA RLY, GTFO
OIC
I HAS A guess ITZ QUOSHUNT OF SUM OF lower AN upper AN 2.0
I HAS A guess_squared ITZ PRODUKT OF guess AN guess
DIFFRINT guess_squared AN SMALLR OF guess_squared AN number, O RLY?
YA RLY
upper R guess
NO WAI
lower R guess
OIC
IM OUTTA YR LOOP
FOUND YR QUOSHUNT OF SUM OF lower AN upper AN 2.0
IF U SAY SO
OBTW
The intersection test for line [o, d]
Return 2 if a hit was found (and also return distance t and bouncing ray n).
Return 0 if no hit was found but ray goes upward
Return 1 if no hit was found but ray goes downward
TLDR
HOW IZ I tracin YR o AN YR d
I HAS A t ITZ 1000000000
I HAS A m ITZ 0
BOTH SAEM d'Z z AN 0, O RLY?
YA RLY, d'Z z R 0.00001
OIC
I HAS A p ITZ QUOSHUNT OF DIFF OF 0 AN o'Z z AN d'Z z
I HAS A n ITZ LIEK A Vector
DIFFRINT p AN SMALLR OF p AN 0.01, O RLY?
YA RLY
t R p
n R Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
m R 1
OIC
BTW The world is encoded in sphere_positions, with 9 lines and 19 columns
I HAS A k ITZ 18
IM IN YR column_loop BTW For each column of objects
BOTH SAEM k AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A j ITZ 8
IM IN YR line_loop BTW For each line on that column
BOTH SAEM j AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A sphere_positions_line ITZ sphere_positions'Z SRS j
sphere_positions_line'Z SRS k, O RLY?
YA RLY
BTW There is a sphere, but does the ray hit it?
p R Vector IZ addin YR o AN YR ...
Vector IZ constructin YR DIFF OF 0 AN k AN ...
YR 0 AN ...
YR DIFF OF DIFF OF 0 AN j AN 4 MKAY ...
MKAY
I HAS A b ITZ Vector IZ dot_productin YR p AN YR d MKAY
I HAS A q_c ITZ DIFF OF Vector IZ dot_productin YR p AN YR p MKAY AN 1
I HAS A q ITZ DIFF OF PRODUKT OF b AN b AN q_c
DIFFRINT q AN SMALLR OF q AN 0, O RLY?
YA RLY
BTW It does, compute the distance camera-sphere
I HAS A s ITZ DIFF OF DIFF OF 0 AN b AN I IZ square_rootin YR q MKAY
BOTH OF DIFFRINT s AN BIGGR OF s AN t AN ...
DIFFRINT s AN SMALLR OF s AN 0.01, O RLY?
YA RLY
BTW So far this is the minimum distance, save it. And
BTW also compute the bouncing ray vector into 'n'
t R s
I HAS A bouncing_ray ITZ Vector IZ scalin YR direction AN YR t MKAY
bouncing_ray R Vector IZ addin YR p AN YR bouncing_ray MKAY
n R Vector IZ normalizin YR bouncing_ray MKAY
m R 2
OIC
OIC
OIC
j R DIFF OF j AN 1
IM OUTTA YR line_loop
k R DIFF OF k AN 1
IM OUTTA YR column_loop
I HAS A result ITZ A BUKKIT
result HAS A m ITZ m
result HAS A t ITZ t
result HAS A n ITZ n
FOUND YR result
IF U SAY SO
OBTW
Sample the world and return the pixel color for
a ray [o, d]
TLDR
HOW IZ I samplin YR o AN YR d
BTW Search for an intersection ray Vs. world
I HAS A result ITZ I IZ tracin YR o AN YR d MKAY
I HAS A m ITZ result'Z m
I HAS A t ITZ result'Z t
I HAS A n ITZ result'Z n
BOTH SAEM m AN 0, O RLY?
YA RLY
BTW No sphere found and the ray goes upward: Generate a sky color
I HAS A vec_result ITZ Vector IZ constructin YR 0.7 AN YR 0.6 AN YR 1.0 MKAY
I HAS A z_component ITZ d'Z z
DIFFRINT z_component AN BIGGR OF z_component AN 0, O RLY?
YA RLY, z_component R 0
OIC
I HAS A vec_num ITZ DIFF OF 1 AN z_component
vec_num R I IZ power_of YR vec_num AN YR 4 MKAY
FOUND YR Vector IZ scalin YR vec_result AN YR vec_num MKAY
OIC
BTW h = intersection coordinate
I HAS A h ITZ Vector IZ scalin YR d AN YR t MKAY
h R Vector IZ addin YR o AN YR h MKAY
BTW l = direction to light (with random delta for soft shadows)
I HAS A l ITZ LIEK A Vector
l HAS A x ITZ SUM OF 9 AN I IZ rand_onein MKAY
l HAS A y ITZ SUM OF 9 AN I IZ rand_onein MKAY
l HAS A z ITZ 16
I HAS A l_two ITZ Vector IZ scalin YR h AN YR -1.0 MKAY
l R Vector IZ addin YR l AN YR l_two MKAY
l R Vector IZ normalizin YR l MKAY
BTW r = The half-vector
I HAS A r ITZ Vector IZ dot_productin YR n AN YR d MKAY
r R PRODUKT OF r AN -2
r R Vector IZ scalin YR n AN YR r MKAY
r R Vector IZ addin YR d AN YR r MKAY
BTW Calculate the lambertian factor
I HAS A b ITZ Vector IZ dot_productin YR l AN YR n MKAY
BTW Calculate illumination factor (lambertian coefficient > 0 or in shadow)?
I HAS A illumination_result ITZ I IZ tracin YR h AN YR l MKAY
I HAS A i_m ITZ illumination_result'Z m
EITHER OF DIFFRINT b AN BIGGR OF b AN 0 AN BOTH SAEM i_m AN 2, O RLY?
YA RLY, b R 0
OIC
BTW Calculate the color 'p' with diffuse and specular component
I HAS A base
DIFFRINT b AN SMALLR OF b AN 0, O RLY?
YA RLY, base R 1
NO WAI, base R 0
OIC
base R Vector IZ scalin YR r AN YR base MKAY
base R Vector IZ dot_productin YR l AN YR r MKAY
I HAS A p ITZ I IZ power_of YR base AN YR 99 MKAY
BOTH SAEM m AN 1, O RLY?
YA RLY
BTW No sphere was hit and the ray was going downward: Generate a floor color
h R Vector IZ scalin YR h AN YR 0.2 MKAY
I HAS A ceil_h_x ITZ I IZ ceilin YR h'Z x MKAY
I HAS A ceil_h_y ITZ I IZ ceilin YR h'Z y MKAY
I HAS A ceil_h ITZ SUM OF ceil_h_x AN ceil_h_y
ceil_h IS NOW A NUMBR
I HAS A color_choice ITZ MOD OF ceil_h AN 2
I HAS A color ITZ LIEK A Vector
color_choice, O RLY?
YA RLY
color HAS A x ITZ 3
color HAS A y ITZ 1
color HAS A z ITZ 1
NO WAI
color HAS A x ITZ 3
color HAS A y ITZ 3
color HAS A z ITZ 3
OIC
FOUND YR Vector IZ scalin YR color AN YR SUM OF PRODUKT OF b AN 0.2 AN 0.1 MKAY
OIC
BTW m == 2 A sphere was hit. Cast a ray bouncing from the sphere surface.
I HAS A sphere_color ITZ LIEK A Vector
sphere_color HAS A x ITZ p
sphere_color HAS A y ITZ p
sphere_color HAS A z ITZ p
I HAS A recursive_color ITZ I IZ samplin YR h AN YR r MKAY
BTW Attenuate color by 50% since it is bouncing (* .5)
recursive_color R Vector IZ scalin YR recursive_color AN YR 0.5 MKAY
FOUND YR Vector IZ addin YR sphere_color AN YR recursive_color MKAY
IF U SAY SO
OBTW The vector class provides functionality for all the common
linear algebra operations performed on vectors.
TLDR
O HAI IM Vector
I HAS A x ITZ 0
I HAS A y ITZ 0
I HAS A z ITZ 0
BTW Add vector_one and vector_two
HOW IZ I addin YR vector_one AN YR vector_two
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R SUM OF vector_one'Z x AN vector_two'Z x
result'Z y R SUM OF vector_one'Z y AN vector_two'Z y
result'Z z R SUM OF vector_one'Z z AN vector_two'Z z
FOUND YR result
IF U SAY SO
BTW Scale vector_one by value
HOW IZ I scalin YR vector_one AN YR value
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R PRODUKT OF vector_one'Z x AN value
result'Z y R PRODUKT OF vector_one'Z y AN value
result'Z z R PRODUKT OF vector_one'Z z AN value
FOUND YR result
IF U SAY SO
BTW Dot product of vector_one and vector_two
HOW IZ I dot_productin YR vector_one AN YR vector_two
FOUND YR SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_two'Z x AN ...
PRODUKT OF vector_one'Z y AN vector_two'Z y AN ...
PRODUKT OF vector_one'Z z AN vector_two'Z z
IF U SAY SO
BTW Cross product of vector_one and vector_two
HOW IZ I cross_productin YR vector_one AN YR vector_two
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R DIFF OF PRODUKT OF vector_one'Z y AN vector_two'Z z AN ...
PRODUKT OF vector_one'Z z AN vector_two'Z y
result'Z y R DIFF OF PRODUKT OF vector_one'Z z AN vector_two'Z x AN ...
PRODUKT OF vector_one'Z x AN vector_two'Z z
result'Z z R DIFF OF PRODUKT OF vector_one'Z x AN vector_two'Z y AN ...
PRODUKT OF vector_one'Z y AN vector_two'Z x
FOUND YR result
IF U SAY SO
BTW Length of vector_one
HOW IZ I lengthin YR vector_one
FOUND YR I IZ square_rootin YR ...
SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_one'Z x AN ...
PRODUKT OF vector_one'Z y AN vector_one'Z y AN ...
PRODUKT OF vector_one'Z z AN vector_one'Z z MKAY
IF U SAY SO
BTW Normalize vector_one
HOW IZ I normalizin YR vector_one
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
I HAS A length ITZ Vector IZ lengthin YR vector_one MKAY
BOTH SAEM length AN 0, O RLY?
YA RLY
length R 1
OIC
result'Z x R QUOSHUNT OF vector_one'Z x AN length
result'Z y R QUOSHUNT OF vector_one'Z y AN length
result'Z z R QUOSHUNT OF vector_one'Z z AN length
FOUND YR result
IF U SAY SO
BTW Printable YARN version of vector
HOW IZ I to_stringin YR vector
FOUND YR SMOOSH "[" AN vector'Z x AN ", " ...
AN vector'Z y AN ", " ...
AN vector'Z z AN "]" MKAY
IF U SAY SO
BTW Create and return a vector with components x, y, and z
HOW IZ I constructin YR x AN YR y AN YR z
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ x
result HAS A y ITZ y
result HAS A z ITZ z
FOUND YR result
IF U SAY SO
KTHX
OBTW The positions of the spheres are essentially
stored in a 2-D array. This differs from Kensler's
version where he used bit flags to store the
positions in a compressed and quickly accessed
manner. Unfortunately for us, bit operations
in LOLCODE were too slow for this to be a tenable
solution.
TLDR
I HAS A sphere_positions ITZ A BUKKIT
I HAS A sphere_positions_0 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_0 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 0 ITZ sphere_positions_0
I HAS A sphere_positions_1 ITZ A BUKKIT
sphere_positions_1 HAS A SRS 0 ITZ WIN
BTW sphere_positions_1 HAS A SRS 0 ITZ FAIL
sphere_positions_1 HAS A SRS 1 ITZ FAIL
sphere_positions_1 HAS A SRS 2 ITZ WIN
BTW sphere_positions_1 HAS A SRS 2 ITZ FAIL
sphere_positions_1 HAS A SRS 3 ITZ FAIL
sphere_positions_1 HAS A SRS 4 ITZ WIN
BTW sphere_positions_1 HAS A SRS 4 ITZ FAIL
sphere_positions_1 HAS A SRS 5 ITZ FAIL
sphere_positions_1 HAS A SRS 6 ITZ FAIL
sphere_positions_1 HAS A SRS 7 ITZ WIN
BTW sphere_positions_1 HAS A SRS 7 ITZ FAIL
sphere_positions_1 HAS A SRS 8 ITZ FAIL
sphere_positions_1 HAS A SRS 9 ITZ WIN
BTW sphere_positions_1 HAS A SRS 9 ITZ FAIL
sphere_positions_1 HAS A SRS 10 ITZ FAIL
sphere_positions_1 HAS A SRS 11 ITZ WIN
BTW sphere_positions_1 HAS A SRS 11 ITZ FAIL
sphere_positions_1 HAS A SRS 12 ITZ FAIL
sphere_positions_1 HAS A SRS 13 ITZ FAIL
sphere_positions_1 HAS A SRS 14 ITZ WIN
BTWsphere_positions_1 HAS A SRS 14 ITZ FAIL
sphere_positions_1 HAS A SRS 15 ITZ FAIL
sphere_positions_1 HAS A SRS 16 ITZ WIN
BTW sphere_positions_1 HAS A SRS 16 ITZ FAIL
sphere_positions_1 HAS A SRS 17 ITZ FAIL
sphere_positions_1 HAS A SRS 18 ITZ WIN
BTW sphere_positions_1 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 1 ITZ sphere_positions_1
I HAS A sphere_positions_2 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_2 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 2 ITZ sphere_positions_2
I HAS A sphere_positions_3 ITZ A BUKKIT
sphere_positions_3 HAS A SRS 0 ITZ FAIL
sphere_positions_3 HAS A SRS 1 ITZ FAIL
sphere_positions_3 HAS A SRS 2 ITZ FAIL
sphere_positions_3 HAS A SRS 3 ITZ FAIL
sphere_positions_3 HAS A SRS 4 ITZ WIN
BTW sphere_positions_3 HAS A SRS 4 ITZ FAIL
sphere_positions_3 HAS A SRS 5 ITZ FAIL
sphere_positions_3 HAS A SRS 6 ITZ FAIL
sphere_positions_3 HAS A SRS 7 ITZ WIN
BTW sphere_positions_3 HAS A SRS 7 ITZ FAIL
sphere_positions_3 HAS A SRS 8 ITZ FAIL
sphere_positions_3 HAS A SRS 9 ITZ FAIL
sphere_positions_3 HAS A SRS 10 ITZ FAIL
sphere_positions_3 HAS A SRS 11 ITZ WIN
sphere_positions_3 HAS A SRS 12 ITZ FAIL
sphere_positions_3 HAS A SRS 13 ITZ FAIL
sphere_positions_3 HAS A SRS 14 ITZ FAIL
sphere_positions_3 HAS A SRS 15 ITZ FAIL
sphere_positions_3 HAS A SRS 16 ITZ FAIL
sphere_positions_3 HAS A SRS 17 ITZ FAIL
sphere_positions_3 HAS A SRS 18 ITZ WIN
BTW sphere_positions_3 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 3 ITZ sphere_positions_3
I HAS A sphere_positions_4 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_4 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 4 ITZ sphere_positions_4
I HAS A sphere_positions_5 ITZ A BUKKIT
sphere_positions_5 HAS A SRS 0 ITZ FAIL
sphere_positions_5 HAS A SRS 1 ITZ FAIL
sphere_positions_5 HAS A SRS 2 ITZ FAIL
sphere_positions_5 HAS A SRS 3 ITZ FAIL
sphere_positions_5 HAS A SRS 4 ITZ WIN
BTW sphere_positions_5 HAS A SRS 4 ITZ FAIL
sphere_positions_5 HAS A SRS 5 ITZ FAIL
sphere_positions_5 HAS A SRS 6 ITZ FAIL
sphere_positions_5 HAS A SRS 7 ITZ WIN
BTW sphere_positions_5 HAS A SRS 7 ITZ FAIL
sphere_positions_5 HAS A SRS 8 ITZ FAIL
sphere_positions_5 HAS A SRS 9 ITZ WIN
BTW sphere_positions_5 HAS A SRS 9 ITZ FAIL
sphere_positions_5 HAS A SRS 10 ITZ FAIL
sphere_positions_5 HAS A SRS 11 ITZ WIN
BTW sphere_positions_5 HAS A SRS 11 ITZ FAIL
sphere_positions_5 HAS A SRS 12 ITZ FAIL
sphere_positions_5 HAS A SRS 13 ITZ FAIL
sphere_positions_5 HAS A SRS 14 ITZ FAIL
sphere_positions_5 HAS A SRS 15 ITZ FAIL
sphere_positions_5 HAS A SRS 16 ITZ FAIL
sphere_positions_5 HAS A SRS 17 ITZ FAIL
sphere_positions_5 HAS A SRS 18 ITZ WIN
BTW sphere_positions_5 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 5 ITZ sphere_positions_5
I HAS A sphere_positions_6 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_6 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 6 ITZ sphere_positions_6
I HAS A sphere_positions_7 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_7 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 7 ITZ sphere_positions_7
I HAS A sphere_positions_8 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_8 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 8 ITZ sphere_positions_8
BTW Camera direction
I HAS A g ITZ Vector IZ constructin YR -6.0 AN YR -16.0 AN YR 0.0 MKAY
g R Vector IZ normalizin YR g MKAY
BTW Camera up vector
I HAS A a ITZ Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
a R Vector IZ cross_productin YR a AN YR g MKAY
a R Vector IZ normalizin YR a MKAY
a R Vector IZ scalin YR a AN YR 0.002 MKAY
BTW Camera right vector
I HAS A b ITZ Vector IZ cross_productin YR g AN YR a MKAY
b R Vector IZ normalizin YR b MKAY
b R Vector IZ scalin YR b AN YR 0.002 MKAY
BTW Camera eye offset
I HAS A c ITZ Vector IZ addin YR a AN YR b MKAY
c R Vector IZ scalin YR c AN YR -256.0 MKAY
c R Vector IZ addin YR c AN YR g MKAY
I HAS A max_x ITZ 511
I HAS A max_y ITZ max_x
BTW Issue the PPM Header info
VISIBLE "P3 " SUM OF max_x AN 1 " " SUM OF max_y AN 1 " 255"!
I HAS A viewpoint ITZ Vector IZ constructin YR 17 AN YR 16 AN YR 8 MKAY
I HAS A y ITZ max_y
IM IN YR y_loop
BOTH SAEM y AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A x ITZ max_x
IM IN YR x_loop
BOTH SAEM x AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A pixel_color ITZ Vector IZ constructin YR 13 AN YR 13 AN YR 13 MKAY
I HAS A rays ITZ 64
IM IN YR ray_loop
BOTH SAEM rays AN 0, O RLY?
YA RLY, GTFO
OIC
BTW The delta to apply to the origin of the view (For Depth of View blur).
I HAS A a_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
I HAS A t_a ITZ Vector IZ scalin YR a AN YR a_rand MKAY
t_a R Vector IZ scalin YR t_a AN YR 99.0 MKAY
I HAS A b_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
I HAS A t_b ITZ Vector IZ scalin YR b AN YR b_rand MKAY
t_b R Vector IZ scalin YR t_b AN YR 99.0 MKAY
I HAS A t ITZ Vector IZ addin YR t_a AN YR t_b MKAY
I HAS A origin ITZ Vector IZ addin YR viewpoint AN YR t MKAY
BTW Ray direction with random deltas for stochastic sampling
I HAS A direction_up ITZ SUM OF I IZ rand_onein MKAY AN x
direction_up R Vector IZ scalin YR a AN YR direction_up MKAY
I HAS A direction_right ITZ SUM OF I IZ rand_onein MKAY AN y
direction_right R Vector IZ scalin YR b AN YR direction_right MKAY
I HAS A direction_t ITZ Vector IZ scalin YR t AN YR -1 MKAY
I HAS A direction ITZ Vector IZ addin YR direction_right AN YR direction_up MKAY
direction R Vector IZ addin YR direction AN YR c MKAY
direction R Vector IZ scalin YR direction AN YR 16 MKAY
direction R Vector IZ addin YR direction AN YR direction_t MKAY
direction R Vector IZ normalizin YR direction MKAY
I HAS A sample_color ITZ I IZ samplin YR origin AN YR direction MKAY
sample_color R Vector IZ scalin YR sample_color AN YR 3.5 MKAY
BTW + pixel_color for color accumulation
pixel_color R Vector IZ addin YR sample_color AN YR pixel_color MKAY
rays R DIFF OF rays AN 1
IM OUTTA YR ray_loop
I HAS A write_color ITZ pixel_color
write_color'Z x IS NOW A NUMBR
write_color'Z y IS NOW A NUMBR
write_color'Z z IS NOW A NUMBR
DIFFRINT write_color'Z x AN BIGGR OF write_color'Z x AN 0, O RLY?
YA RLY, write_color'Z x R 0
OIC
DIFFRINT write_color'Z y AN BIGGR OF write_color'Z y AN 0, O RLY?
YA RLY, write_color'Z y R 0
OIC
DIFFRINT write_color'Z z AN BIGGR OF write_color'Z z AN 0, O RLY?
YA RLY, write_color'Z z R 0
OIC
VISIBLE " " write_color'Z x " " ...
" " write_color'Z y " " ...
" " write_color'Z z " "!
x R DIFF OF x AN 1
IM OUTTA YR x_loop
y R DIFF OF y AN 1
IM OUTTA YR y_loop
KTHXBYE