diff --git a/build.bat b/build.bat index 9153492..b169f39 100644 --- a/build.bat +++ b/build.bat @@ -11,9 +11,11 @@ set cuda_root=D:/lib/cudatoolkit/lib/x64 set CudaSources=../src/main.cu +set CudaRemoveWarnings=-diag-suppress 177 + IF NOT EXIST .\build mkdir .\build pushd .\build -nvcc %CudaSources% -o program.exe +nvcc %CudaSources% %CudaRemoveWarnings% -o program.exe set LastError=%ERRORLEVEL% popd diff --git a/ray_ws.sublime-workspace b/ray_ws.sublime-workspace new file mode 100644 index 0000000..1d6e592 --- /dev/null +++ b/ray_ws.sublime-workspace @@ -0,0 +1,2249 @@ +{ + "auto_complete": + { + "selected_items": + [ + ] + }, + "buffers": + [ + { + "file": "src/main.cu", + "settings": + { + "buffer_size": 22877, + "encoding": "UTF-8", + "line_ending": "Windows" + }, + "undo_stack": + [ + [ + 15, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAFQLAAAAAAAAVQsAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABUCwAAAAAAAFQLAAAAAAAAAAAAAAAA8L8" + ], + [ + 18, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAOcLAAAAAAAA6AsAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADnCwAAAAAAAOcLAAAAAAAAAAAAAAAA8L8" + ], + [ + 21, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAJQMAAAAAAAAlQwAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACUDAAAAAAAAJQMAAAAAAAAAAAAAAAA8L8" + ], + [ + 24, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAD0NAAAAAAAAPg0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA9DQAAAAAAAD0NAAAAAAAAAAAAAAAA8L8" + ], + [ + 27, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAM8NAAAAAAAA0A0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADPDQAAAAAAAM8NAAAAAAAAAAAAAAAA8L8" + ], + [ + 30, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAADgOAAAAAAAAOQ4AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA4DgAAAAAAADgOAAAAAAAAAAAAAAAA8L8" + ], + [ + 33, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAMsOAAAAAAAAzA4AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADLDgAAAAAAAMsOAAAAAAAAAAAAAAAA8L8" + ], + [ + 36, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAABgPAAAAAAAAGQ8AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAYDwAAAAAAABgPAAAAAAAAAAAAAAAA8L8" + ], + [ + 39, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAIYPAAAAAAAAhw8AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACGDwAAAAAAAIYPAAAAAAAAAAAAAAAA8L8" + ], + [ + 42, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAHYQAAAAAAAAdxAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB2EAAAAAAAAHYQAAAAAAAAAAAAAAAA8L8" + ], + [ + 47, + 1, + "insert", + { + "characters": "a" + }, + "AQAAAHgQAAAAAAAAeRAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB4EAAAAAAAAHgQAAAAAAAAAAAAAAAA8L8" + ], + [ + 50, + 2, + "left_delete", + null, + "AgAAAHgQAAAAAAAAeBAAAAAAAAABAAAAYXcQAAAAAAAAdxAAAAAAAAABAAAAIA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB5EAAAAAAAAHkQAAAAAAAAAAAAAAAA8L8" + ], + [ + 61, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAC4YAAAAAAAALxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAuGAAAAAAAAC4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 89, + 1, + "insert", + { + "characters": "d" + }, + "AgAAAGoYAAAAAAAAaxgAAAAAAAAAAAAAaxgAAAAAAABrGAAAAAAAABUAAAAgICAgICAgICAgICAgICAgICAgICA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB/GAAAAAAAAGoYAAAAAAAAAAAAAAAA8L8" + ], + [ + 90, + 2, + "left_delete", + null, + "AgAAAGoYAAAAAAAAahgAAAAAAAABAAAAZGkYAAAAAAAAaRgAAAAAAAABAAAAIA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABrGAAAAAAAAGsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 93, + 1, + "right_delete", + null, + "AQAAAGkYAAAAAAAAaRgAAAAAAAABAAAAIA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABpGAAAAAAAAGkYAAAAAAAAAAAAAAAAZUA" + ], + [ + 95, + 13, + "right_delete", + null, + "DQAAAI8YAAAAAAAAjxgAAAAAAAACAAAAICCPGAAAAAAAAI8YAAAAAAAAAgAAACAgjxgAAAAAAACPGAAAAAAAAAIAAAAgII8YAAAAAAAAjxgAAAAAAAACAAAAICCPGAAAAAAAAI8YAAAAAAAAAgAAACAgjxgAAAAAAACPGAAAAAAAAAIAAAAgII8YAAAAAAAAjxgAAAAAAAACAAAAICCPGAAAAAAAAI8YAAAAAAAAAgAAACAgjxgAAAAAAACPGAAAAAAAAAIAAAAgII8YAAAAAAAAjxgAAAAAAAACAAAAICCPGAAAAAAAAI8YAAAAAAAAAgAAACAgjxgAAAAAAACPGAAAAAAAAAEAAAAgjxgAAAAAAACPGAAAAAAAAAEAAABV", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACPGAAAAAAAAI8YAAAAAAAAAAAAAAAAZUA" + ], + [ + 96, + 1, + "insert", + { + "characters": "I" + }, + "AQAAAI8YAAAAAAAAkBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACPGAAAAAAAAI8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 97, + 1, + "left_delete", + null, + "AQAAAI8YAAAAAAAAjxgAAAAAAAABAAAASQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACQGAAAAAAAAJAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 98, + 1, + "insert", + { + "characters": "U" + }, + "AQAAAI8YAAAAAAAAkBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACPGAAAAAAAAI8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 291, + 1, + "paste_and_indent", + null, + "AQAAAB5AAAAAAAAAH0AAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAeQAAAAAAAAB5AAAAAAAAAAAAAAAAA8L8" + ], + [ + 292, + 1, + "left_delete", + null, + "AQAAAB5AAAAAAAAAHkAAAAAAAAABAAAACg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAfQAAAAAAAAB9AAAAAAAAAAAAAAAAA8L8" + ], + [ + 309, + 2, + "right_delete", + null, + "AgAAAEU4AAAAAAAARTgAAAAAAAACAAAAICBFOAAAAAAAAEU4AAAAAAAAAQAAAF8", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABFOAAAAAAAAEU4AAAAAAAAAAAAAAAAAAA" + ], + [ + 312, + 1, + "insert", + { + "characters": "_" + }, + "AQAAAEU4AAAAAAAARjgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABFOAAAAAAAAEU4AAAAAAAAAAAAAAAAAAA" + ], + [ + 384, + 1, + "insert", + { + "characters": "a" + }, + "AQAAALM0AAAAAAAAtDQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACzNAAAAAAAALM0AAAAAAAAAAAAAAAA8L8" + ], + [ + 385, + 1, + "left_delete", + null, + "AQAAALM0AAAAAAAAszQAAAAAAAABAAAAYQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC0NAAAAAAAALQ0AAAAAAAAAAAAAAAA8L8" + ], + [ + 386, + 1, + "insert", + { + "characters": "vec3" + }, + "BAAAALM0AAAAAAAAtDQAAAAAAAAAAAAAtDQAAAAAAAC1NAAAAAAAAAAAAAC1NAAAAAAAALY0AAAAAAAAAAAAALY0AAAAAAAAtzQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACzNAAAAAAAALM0AAAAAAAAAAAAAAAA8L8" + ], + [ + 387, + 3, + "left_delete", + null, + "AwAAALY0AAAAAAAAtjQAAAAAAAABAAAAM7U0AAAAAAAAtTQAAAAAAAABAAAAY7Q0AAAAAAAAtDQAAAAAAAABAAAAZQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC3NAAAAAAAALc0AAAAAAAAAAAAAAAA8L8" + ], + [ + 388, + 1, + "insert", + { + "characters": "V" + }, + "AQAAALQ0AAAAAAAAtTQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC0NAAAAAAAALQ0AAAAAAAAAAAAAAAA8L8" + ], + [ + 389, + 2, + "left_delete", + null, + "AgAAALQ0AAAAAAAAtDQAAAAAAAABAAAAVrM0AAAAAAAAszQAAAAAAAABAAAAdg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC1NAAAAAAAALU0AAAAAAAAAAAAAAAA8L8" + ], + [ + 390, + 1, + "insert", + { + "characters": "V" + }, + "AQAAALM0AAAAAAAAtDQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACzNAAAAAAAALM0AAAAAAAAAAAAAAAA8L8" + ], + [ + 391, + 1, + "left_delete", + null, + "AQAAALM0AAAAAAAAszQAAAAAAAABAAAAVg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC0NAAAAAAAALQ0AAAAAAAAAAAAAAAA8L8" + ], + [ + 392, + 1, + "insert", + { + "characters": "add_V" + }, + "BQAAALM0AAAAAAAAtDQAAAAAAAAAAAAAtDQAAAAAAAC1NAAAAAAAAAAAAAC1NAAAAAAAALY0AAAAAAAAAAAAALY0AAAAAAAAtzQAAAAAAAAAAAAAtzQAAAAAAAC4NAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACzNAAAAAAAALM0AAAAAAAAAAAAAAAA8L8" + ], + [ + 393, + 1, + "insert_completion", + { + "completion": "add_V3F32", + "format": "text", + "keep_prefix": false, + "must_insert": false, + "trigger": "add_V3F32" + }, + "AgAAALM0AAAAAAAAszQAAAAAAAAFAAAAYWRkX1azNAAAAAAAALw0AAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC4NAAAAAAAALg0AAAAAAAAAAAAAAAA8L8" + ], + [ + 394, + 1, + "insert", + { + "characters": "(" + }, + "AQAAALw0AAAAAAAAvTQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC8NAAAAAAAALw0AAAAAAAAAAAAAAAA8L8" + ], + [ + 396, + 1, + "insert", + { + "characters": "," + }, + "AQAAAMU0AAAAAAAAxjQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADFNAAAAAAAAMU0AAAAAAAAAAAAAAAA8L8" + ], + [ + 397, + 1, + "insert", + { + "characters": " hit_rec." + }, + "CQAAAMY0AAAAAAAAxzQAAAAAAAAAAAAAxzQAAAAAAADINAAAAAAAAAAAAADINAAAAAAAAMk0AAAAAAAAAAAAAMk0AAAAAAAAyjQAAAAAAAAAAAAAyjQAAAAAAADLNAAAAAAAAAAAAADLNAAAAAAAAMw0AAAAAAAAAAAAAMw0AAAAAAAAzTQAAAAAAAAAAAAAzTQAAAAAAADONAAAAAAAAAAAAADONAAAAAAAAM80AAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADGNAAAAAAAAMY0AAAAAAAAAAAAAAAA8L8" + ], + [ + 398, + 1, + "insert", + { + "characters": "bn" + }, + "AgAAAM80AAAAAAAA0DQAAAAAAAAAAAAA0DQAAAAAAADRNAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADPNAAAAAAAAM80AAAAAAAAAAAAAAAA8L8" + ], + [ + 399, + 2, + "left_delete", + null, + "AgAAANA0AAAAAAAA0DQAAAAAAAABAAAAbs80AAAAAAAAzzQAAAAAAAABAAAAYg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADRNAAAAAAAANE0AAAAAAAAAAAAAAAA8L8" + ], + [ + 400, + 1, + "insert", + { + "characters": "normal):w" + }, + "CQAAAM80AAAAAAAA0DQAAAAAAAAAAAAA0DQAAAAAAADRNAAAAAAAAAAAAADRNAAAAAAAANI0AAAAAAAAAAAAANI0AAAAAAAA0zQAAAAAAAAAAAAA0zQAAAAAAADUNAAAAAAAAAAAAADUNAAAAAAAANU0AAAAAAAAAAAAANU0AAAAAAAA1jQAAAAAAAAAAAAA1jQAAAAAAADXNAAAAAAAAAAAAADXNAAAAAAAANg0AAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADPNAAAAAAAAM80AAAAAAAAAAAAAAAA8L8" + ], + [ + 401, + 1, + "insert_completion", + { + "completion": "width", + "format": "text", + "keep_prefix": false, + "must_insert": false, + "trigger": "width" + }, + "AgAAANc0AAAAAAAA1zQAAAAAAAABAAAAd9c0AAAAAAAA3DQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADYNAAAAAAAANg0AAAAAAAAAAAAAAAA8L8" + ], + [ + 402, + 6, + "left_delete", + null, + "BgAAANs0AAAAAAAA2zQAAAAAAAABAAAAaNo0AAAAAAAA2jQAAAAAAAABAAAAdNk0AAAAAAAA2TQAAAAAAAABAAAAZNg0AAAAAAAA2DQAAAAAAAABAAAAadc0AAAAAAAA1zQAAAAAAAABAAAAd9Y0AAAAAAAA1jQAAAAAAAABAAAAOg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADcNAAAAAAAANw0AAAAAAAAAAAAAAAA8L8" + ], + [ + 420, + 1, + "insert", + { + "characters": "a" + }, + "AQAAABYYAAAAAAAAFxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAWGAAAAAAAABYYAAAAAAAAAAAAAAAAAAA" + ], + [ + 421, + 1, + "left_delete", + null, + "AQAAABYYAAAAAAAAFhgAAAAAAAABAAAAYQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAXGAAAAAAAABcYAAAAAAAAAAAAAAAA8L8" + ], + [ + 422, + 1, + "insert", + { + "characters": "\n\n" + }, + "AgAAABYYAAAAAAAAFxgAAAAAAAAAAAAAFxgAAAAAAAAYGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAWGAAAAAAAABYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 424, + 1, + "insert", + { + "characters": "\n__host__" + }, + "CQAAABcYAAAAAAAAGBgAAAAAAAAAAAAAGBgAAAAAAAAZGAAAAAAAAAAAAAAZGAAAAAAAABoYAAAAAAAAAAAAABoYAAAAAAAAGxgAAAAAAAAAAAAAGxgAAAAAAAAcGAAAAAAAAAAAAAAcGAAAAAAAAB0YAAAAAAAAAAAAAB0YAAAAAAAAHhgAAAAAAAAAAAAAHhgAAAAAAAAfGAAAAAAAAAAAAAAfGAAAAAAAACAYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAXGAAAAAAAABcYAAAAAAAAAAAAAAAAAAA" + ], + [ + 425, + 1, + "insert", + { + "characters": " f" + }, + "AgAAACAYAAAAAAAAIRgAAAAAAAAAAAAAIRgAAAAAAAAiGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAgGAAAAAAAACAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 426, + 3, + "left_delete", + null, + "AwAAACEYAAAAAAAAIRgAAAAAAAABAAAAZiAYAAAAAAAAIBgAAAAAAAABAAAAIB8YAAAAAAAAHxgAAAAAAAABAAAAXw", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAiGAAAAAAAACIYAAAAAAAAAAAAAAAA8L8" + ], + [ + 427, + 1, + "insert", + { + "characters": " function" + }, + "CQAAAB8YAAAAAAAAIBgAAAAAAAAAAAAAIBgAAAAAAAAhGAAAAAAAAAAAAAAhGAAAAAAAACIYAAAAAAAAAAAAACIYAAAAAAAAIxgAAAAAAAAAAAAAIxgAAAAAAAAkGAAAAAAAAAAAAAAkGAAAAAAAACUYAAAAAAAAAAAAACUYAAAAAAAAJhgAAAAAAAAAAAAAJhgAAAAAAAAnGAAAAAAAAAAAAAAnGAAAAAAAACgYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAfGAAAAAAAAB8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 428, + 1, + "insert", + { + "characters": " " + }, + "AQAAACgYAAAAAAAAKRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAoGAAAAAAAACgYAAAAAAAAAAAAAAAA8L8" + ], + [ + 429, + 1, + "insert", + { + "characters": "F342" + }, + "BAAAACkYAAAAAAAAKhgAAAAAAAAAAAAAKhgAAAAAAAArGAAAAAAAAAAAAAArGAAAAAAAACwYAAAAAAAAAAAAACwYAAAAAAAALRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAApGAAAAAAAACkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 430, + 1, + "left_delete", + null, + "AQAAACwYAAAAAAAALBgAAAAAAAABAAAAMg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAtGAAAAAAAAC0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 431, + 1, + "insert", + { + "characters": "2" + }, + "AQAAACwYAAAAAAAALRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAsGAAAAAAAACwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 432, + 2, + "left_delete", + null, + "AgAAACwYAAAAAAAALBgAAAAAAAABAAAAMisYAAAAAAAAKxgAAAAAAAABAAAANA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAtGAAAAAAAAC0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 433, + 1, + "insert", + { + "characters": "2" + }, + "AQAAACsYAAAAAAAALBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAArGAAAAAAAACsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 434, + 1, + "insert", + { + "characters": " linear_to_ga" + }, + "DQAAACwYAAAAAAAALRgAAAAAAAAAAAAALRgAAAAAAAAuGAAAAAAAAAAAAAAuGAAAAAAAAC8YAAAAAAAAAAAAAC8YAAAAAAAAMBgAAAAAAAAAAAAAMBgAAAAAAAAxGAAAAAAAAAAAAAAxGAAAAAAAADIYAAAAAAAAAAAAADIYAAAAAAAAMxgAAAAAAAAAAAAAMxgAAAAAAAA0GAAAAAAAAAAAAAA0GAAAAAAAADUYAAAAAAAAAAAAADUYAAAAAAAANhgAAAAAAAAAAAAANhgAAAAAAAA3GAAAAAAAAAAAAAA3GAAAAAAAADgYAAAAAAAAAAAAADgYAAAAAAAAORgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAsGAAAAAAAACwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 435, + 1, + "insert", + { + "characters": "mma" + }, + "AwAAADkYAAAAAAAAOhgAAAAAAAAAAAAAOhgAAAAAAAA7GAAAAAAAAAAAAAA7GAAAAAAAADwYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA5GAAAAAAAADkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 436, + 1, + "insert_snippet", + { + "contents": "($0)" + }, + "AQAAADwYAAAAAAAAPhgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA8GAAAAAAAADwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 437, + 1, + "insert", + { + "characters": "F32" + }, + "AwAAAD0YAAAAAAAAPhgAAAAAAAAAAAAAPhgAAAAAAAA/GAAAAAAAAAAAAAA/GAAAAAAAAEAYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA9GAAAAAAAAD0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 438, + 1, + "insert", + { + "characters": " val" + }, + "BAAAAEAYAAAAAAAAQRgAAAAAAAAAAAAAQRgAAAAAAABCGAAAAAAAAAAAAABCGAAAAAAAAEMYAAAAAAAAAAAAAEMYAAAAAAAARBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABAGAAAAAAAAEAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 440, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAEUYAAAAAAAARhgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABFGAAAAAAAAEUYAAAAAAAAAAAAAAAA8L8" + ], + [ + 441, + 1, + "insert_snippet", + { + "contents": "{$0}" + }, + "AQAAAEYYAAAAAAAASBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABGGAAAAAAAAEYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 444, + 1, + "run_macro_file", + { + "file": "res://Packages/Default/Add Line in Braces.sublime-macro" + }, + "AwAAAEcYAAAAAAAASBgAAAAAAAAAAAAASBgAAAAAAABJGAAAAAAAAAAAAABIGAAAAAAAAEoYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABHGAAAAAAAAEcYAAAAAAAAAAAAAAAA8L8" + ], + [ + 445, + 1, + "insert", + { + "characters": "//" + }, + "AgAAAEoYAAAAAAAASxgAAAAAAAAAAAAASxgAAAAAAABMGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABKGAAAAAAAAEoYAAAAAAAAAAAAAAAA8L8" + ], + [ + 446, + 1, + "insert", + { + "characters": " We" + }, + "AwAAAEwYAAAAAAAATRgAAAAAAAAAAAAATRgAAAAAAABOGAAAAAAAAAAAAABOGAAAAAAAAE8YAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABMGAAAAAAAAEwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 447, + 1, + "insert", + { + "characters": " assum" + }, + "BgAAAE8YAAAAAAAAUBgAAAAAAAAAAAAAUBgAAAAAAABRGAAAAAAAAAAAAABRGAAAAAAAAFIYAAAAAAAAAAAAAFIYAAAAAAAAUxgAAAAAAAAAAAAAUxgAAAAAAABUGAAAAAAAAAAAAABUGAAAAAAAAFUYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABPGAAAAAAAAE8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 448, + 5, + "left_delete", + null, + "BQAAAFQYAAAAAAAAVBgAAAAAAAABAAAAbVMYAAAAAAAAUxgAAAAAAAABAAAAdVIYAAAAAAAAUhgAAAAAAAABAAAAc1EYAAAAAAAAURgAAAAAAAABAAAAc1AYAAAAAAAAUBgAAAAAAAABAAAAYQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABVGAAAAAAAAFUYAAAAAAAAAAAAAAAA8L8" + ], + [ + 449, + 1, + "insert", + { + "characters": "assume" + }, + "BgAAAFAYAAAAAAAAURgAAAAAAAAAAAAAURgAAAAAAABSGAAAAAAAAAAAAABSGAAAAAAAAFMYAAAAAAAAAAAAAFMYAAAAAAAAVBgAAAAAAAAAAAAAVBgAAAAAAABVGAAAAAAAAAAAAABVGAAAAAAAAFYYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABQGAAAAAAAAFAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 450, + 1, + "insert", + { + "characters": " that" + }, + "BQAAAFYYAAAAAAAAVxgAAAAAAAAAAAAAVxgAAAAAAABYGAAAAAAAAAAAAABYGAAAAAAAAFkYAAAAAAAAAAAAAFkYAAAAAAAAWhgAAAAAAAAAAAAAWhgAAAAAAABbGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABWGAAAAAAAAFYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 451, + 1, + "insert", + { + "characters": " the" + }, + "BAAAAFsYAAAAAAAAXBgAAAAAAAAAAAAAXBgAAAAAAABdGAAAAAAAAAAAAABdGAAAAAAAAF4YAAAAAAAAAAAAAF4YAAAAAAAAXxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABbGAAAAAAAAFsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 452, + 1, + "insert", + { + "characters": " input" + }, + "BgAAAF8YAAAAAAAAYBgAAAAAAAAAAAAAYBgAAAAAAABhGAAAAAAAAAAAAABhGAAAAAAAAGIYAAAAAAAAAAAAAGIYAAAAAAAAYxgAAAAAAAAAAAAAYxgAAAAAAABkGAAAAAAAAAAAAABkGAAAAAAAAGUYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABfGAAAAAAAAF8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 453, + 1, + "insert", + { + "characters": " value" + }, + "BgAAAGUYAAAAAAAAZhgAAAAAAAAAAAAAZhgAAAAAAABnGAAAAAAAAAAAAABnGAAAAAAAAGgYAAAAAAAAAAAAAGgYAAAAAAAAaRgAAAAAAAAAAAAAaRgAAAAAAABqGAAAAAAAAAAAAABqGAAAAAAAAGsYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABlGAAAAAAAAGUYAAAAAAAAAAAAAAAA8L8" + ], + [ + 454, + 1, + "insert", + { + "characters": " is" + }, + "AwAAAGsYAAAAAAAAbBgAAAAAAAAAAAAAbBgAAAAAAABtGAAAAAAAAAAAAABtGAAAAAAAAG4YAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABrGAAAAAAAAGsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 455, + 1, + "insert", + { + "characters": " in" + }, + "AwAAAG4YAAAAAAAAbxgAAAAAAAAAAAAAbxgAAAAAAABwGAAAAAAAAAAAAABwGAAAAAAAAHEYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABuGAAAAAAAAG4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 456, + 1, + "insert", + { + "characters": " linear" + }, + "BwAAAHEYAAAAAAAAchgAAAAAAAAAAAAAchgAAAAAAABzGAAAAAAAAAAAAABzGAAAAAAAAHQYAAAAAAAAAAAAAHQYAAAAAAAAdRgAAAAAAAAAAAAAdRgAAAAAAAB2GAAAAAAAAAAAAAB2GAAAAAAAAHcYAAAAAAAAAAAAAHcYAAAAAAAAeBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABxGAAAAAAAAHEYAAAAAAAAAAAAAAAA8L8" + ], + [ + 457, + 1, + "insert", + { + "characters": " space," + }, + "BwAAAHgYAAAAAAAAeRgAAAAAAAAAAAAAeRgAAAAAAAB6GAAAAAAAAAAAAAB6GAAAAAAAAHsYAAAAAAAAAAAAAHsYAAAAAAAAfBgAAAAAAAAAAAAAfBgAAAAAAAB9GAAAAAAAAAAAAAB9GAAAAAAAAH4YAAAAAAAAAAAAAH4YAAAAAAAAfxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB4GAAAAAAAAHgYAAAAAAAAAAAAAAAA8L8" + ], + [ + 458, + 1, + "insert", + { + "characters": " and" + }, + "BAAAAH8YAAAAAAAAgBgAAAAAAAAAAAAAgBgAAAAAAACBGAAAAAAAAAAAAACBGAAAAAAAAIIYAAAAAAAAAAAAAIIYAAAAAAAAgxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB/GAAAAAAAAH8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 459, + 1, + "insert", + { + "characters": " " + }, + "AQAAAIMYAAAAAAAAhBgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACDGAAAAAAAAIMYAAAAAAAAAAAAAAAA8L8" + ], + [ + 460, + 1, + "insert", + { + "characters": "\n//" + }, + "BAAAAIQYAAAAAAAAhRgAAAAAAAAAAAAAhRgAAAAAAACHGAAAAAAAAAAAAACHGAAAAAAAAIgYAAAAAAAAAAAAAIgYAAAAAAAAiRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACEGAAAAAAAAIQYAAAAAAAAAAAAAAAA8L8" + ], + [ + 461, + 1, + "insert", + { + "characters": " we" + }, + "AwAAAIkYAAAAAAAAihgAAAAAAAAAAAAAihgAAAAAAACLGAAAAAAAAAAAAACLGAAAAAAAAIwYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACJGAAAAAAAAIkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 462, + 1, + "insert", + { + "characters": " transform" + }, + "CgAAAIwYAAAAAAAAjRgAAAAAAAAAAAAAjRgAAAAAAACOGAAAAAAAAAAAAACOGAAAAAAAAI8YAAAAAAAAAAAAAI8YAAAAAAAAkBgAAAAAAAAAAAAAkBgAAAAAAACRGAAAAAAAAAAAAACRGAAAAAAAAJIYAAAAAAAAAAAAAJIYAAAAAAAAkxgAAAAAAAAAAAAAkxgAAAAAAACUGAAAAAAAAAAAAACUGAAAAAAAAJUYAAAAAAAAAAAAAJUYAAAAAAAAlhgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACMGAAAAAAAAIwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 463, + 1, + "insert", + { + "characters": " it" + }, + "AwAAAJYYAAAAAAAAlxgAAAAAAAAAAAAAlxgAAAAAAACYGAAAAAAAAAAAAACYGAAAAAAAAJkYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACWGAAAAAAAAJYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 464, + 1, + "insert", + { + "characters": " to" + }, + "AwAAAJkYAAAAAAAAmhgAAAAAAAAAAAAAmhgAAAAAAACbGAAAAAAAAAAAAACbGAAAAAAAAJwYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACZGAAAAAAAAJkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 465, + 1, + "insert", + { + "characters": " " + }, + "AQAAAJwYAAAAAAAAnRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACcGAAAAAAAAJwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 466, + 1, + "insert", + { + "characters": "srgb" + }, + "BAAAAJ0YAAAAAAAAnhgAAAAAAAAAAAAAnhgAAAAAAACfGAAAAAAAAAAAAACfGAAAAAAAAKAYAAAAAAAAAAAAAKAYAAAAAAAAoRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACdGAAAAAAAAJ0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 467, + 1, + "insert", + { + "characters": " just" + }, + "BQAAAKEYAAAAAAAAohgAAAAAAAAAAAAAohgAAAAAAACjGAAAAAAAAAAAAACjGAAAAAAAAKQYAAAAAAAAAAAAAKQYAAAAAAAApRgAAAAAAAAAAAAApRgAAAAAAACmGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAChGAAAAAAAAKEYAAAAAAAAAAAAAAAA8L8" + ], + [ + 468, + 1, + "insert", + { + "characters": " by" + }, + "AwAAAKYYAAAAAAAApxgAAAAAAAAAAAAApxgAAAAAAACoGAAAAAAAAAAAAACoGAAAAAAAAKkYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACmGAAAAAAAAKYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 469, + 1, + "insert", + { + "characters": " ap" + }, + "AwAAAKkYAAAAAAAAqhgAAAAAAAAAAAAAqhgAAAAAAACrGAAAAAAAAAAAAACrGAAAAAAAAKwYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACpGAAAAAAAAKkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 470, + 15, + "left_delete", + null, + "DwAAAKsYAAAAAAAAqxgAAAAAAAABAAAAcKoYAAAAAAAAqhgAAAAAAAABAAAAYakYAAAAAAAAqRgAAAAAAAABAAAAIKgYAAAAAAAAqBgAAAAAAAABAAAAeacYAAAAAAAApxgAAAAAAAABAAAAYqYYAAAAAAAAphgAAAAAAAABAAAAIKUYAAAAAAAApRgAAAAAAAABAAAAdKQYAAAAAAAApBgAAAAAAAABAAAAc6MYAAAAAAAAoxgAAAAAAAABAAAAdaIYAAAAAAAAohgAAAAAAAABAAAAaqEYAAAAAAAAoRgAAAAAAAABAAAAIKAYAAAAAAAAoBgAAAAAAAABAAAAYp8YAAAAAAAAnxgAAAAAAAABAAAAZ54YAAAAAAAAnhgAAAAAAAABAAAAcp0YAAAAAAAAnRgAAAAAAAABAAAAcw", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACsGAAAAAAAAKwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 471, + 1, + "insert", + { + "characters": "approximate" + }, + "CwAAAJ0YAAAAAAAAnhgAAAAAAAAAAAAAnhgAAAAAAACfGAAAAAAAAAAAAACfGAAAAAAAAKAYAAAAAAAAAAAAAKAYAAAAAAAAoRgAAAAAAAAAAAAAoRgAAAAAAACiGAAAAAAAAAAAAACiGAAAAAAAAKMYAAAAAAAAAAAAAKMYAAAAAAAApBgAAAAAAAAAAAAApBgAAAAAAAClGAAAAAAAAAAAAAClGAAAAAAAAKYYAAAAAAAAAAAAAKYYAAAAAAAApxgAAAAAAAAAAAAApxgAAAAAAACoGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACdGAAAAAAAAJ0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 472, + 1, + "insert", + { + "characters": " srgb" + }, + "BQAAAKgYAAAAAAAAqRgAAAAAAAAAAAAAqRgAAAAAAACqGAAAAAAAAAAAAACqGAAAAAAAAKsYAAAAAAAAAAAAAKsYAAAAAAAArBgAAAAAAAAAAAAArBgAAAAAAACtGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACoGAAAAAAAAKgYAAAAAAAAAAAAAAAA8L8" + ], + [ + 473, + 1, + "insert", + { + "characters": " p" + }, + "AgAAAK0YAAAAAAAArhgAAAAAAAAAAAAArhgAAAAAAACvGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACtGAAAAAAAAK0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 474, + 1, + "left_delete", + null, + "AQAAAK4YAAAAAAAArhgAAAAAAAABAAAAcA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACvGAAAAAAAAK8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 475, + 1, + "insert", + { + "characters": "space" + }, + "BQAAAK4YAAAAAAAArxgAAAAAAAAAAAAArxgAAAAAAACwGAAAAAAAAAAAAACwGAAAAAAAALEYAAAAAAAAAAAAALEYAAAAAAAAshgAAAAAAAAAAAAAshgAAAAAAACzGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACuGAAAAAAAAK4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 476, + 1, + "insert", + { + "characters": " by" + }, + "AwAAALMYAAAAAAAAtBgAAAAAAAAAAAAAtBgAAAAAAAC1GAAAAAAAAAAAAAC1GAAAAAAAALYYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACzGAAAAAAAALMYAAAAAAAAAAAAAAAA8L8" + ], + [ + 477, + 1, + "insert", + { + "characters": " " + }, + "AQAAALYYAAAAAAAAtxgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC2GAAAAAAAALYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 478, + 1, + "insert", + { + "characters": "letting" + }, + "BwAAALcYAAAAAAAAuBgAAAAAAAAAAAAAuBgAAAAAAAC5GAAAAAAAAAAAAAC5GAAAAAAAALoYAAAAAAAAAAAAALoYAAAAAAAAuxgAAAAAAAAAAAAAuxgAAAAAAAC8GAAAAAAAAAAAAAC8GAAAAAAAAL0YAAAAAAAAAAAAAL0YAAAAAAAAvhgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC3GAAAAAAAALcYAAAAAAAAAAAAAAAA8L8" + ], + [ + 479, + 7, + "left_delete", + null, + "BwAAAL0YAAAAAAAAvRgAAAAAAAABAAAAZ7wYAAAAAAAAvBgAAAAAAAABAAAAbrsYAAAAAAAAuxgAAAAAAAABAAAAaboYAAAAAAAAuhgAAAAAAAABAAAAdLkYAAAAAAAAuRgAAAAAAAABAAAAdLgYAAAAAAAAuBgAAAAAAAABAAAAZbcYAAAAAAAAtxgAAAAAAAABAAAAbA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC+GAAAAAAAAL4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 480, + 1, + "insert", + { + "characters": "taking" + }, + "BgAAALcYAAAAAAAAuBgAAAAAAAAAAAAAuBgAAAAAAAC5GAAAAAAAAAAAAAC5GAAAAAAAALoYAAAAAAAAAAAAALoYAAAAAAAAuxgAAAAAAAAAAAAAuxgAAAAAAAC8GAAAAAAAAAAAAAC8GAAAAAAAAL0YAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC3GAAAAAAAALcYAAAAAAAAAAAAAAAA8L8" + ], + [ + 481, + 1, + "insert", + { + "characters": " the" + }, + "BAAAAL0YAAAAAAAAvhgAAAAAAAAAAAAAvhgAAAAAAAC/GAAAAAAAAAAAAAC/GAAAAAAAAMAYAAAAAAAAAAAAAMAYAAAAAAAAwRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC9GAAAAAAAAL0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 482, + 1, + "insert", + { + "characters": " sqrt" + }, + "BQAAAMEYAAAAAAAAwhgAAAAAAAAAAAAAwhgAAAAAAADDGAAAAAAAAAAAAADDGAAAAAAAAMQYAAAAAAAAAAAAAMQYAAAAAAAAxRgAAAAAAAAAAAAAxRgAAAAAAADGGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADBGAAAAAAAAMEYAAAAAAAAAAAAAAAA8L8" + ], + [ + 483, + 1, + "insert", + { + "characters": "\n" + }, + "AgAAAMYYAAAAAAAAxxgAAAAAAAAAAAAAxxgAAAAAAADJGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADGGAAAAAAAAMYYAAAAAAAAAAAAAAAA8L8" + ], + [ + 496, + 1, + "insert", + { + "characters": "\n" + }, + "AgAAADoAAAAAAAAAOwAAAAAAAAAAAAAAyBgAAAAAAADIGAAAAAAAAAIAAAAgIA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA6AAAAAAAAADoAAAAAAAAAAAAAAAAAAAA" + ], + [ + 498, + 1, + "insert", + { + "characters": "#incl" + }, + "BQAAADoAAAAAAAAAOwAAAAAAAAAAAAAAOwAAAAAAAAA8AAAAAAAAAAAAAAA8AAAAAAAAAD0AAAAAAAAAAAAAAD0AAAAAAAAAPgAAAAAAAAAAAAAAPgAAAAAAAAA/AAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA6AAAAAAAAADoAAAAAAAAAAAAAAAAAAAA" + ], + [ + 499, + 1, + "insert_completion", + { + "completion": "include", + "format": "text", + "keep_prefix": false, + "must_insert": false, + "trigger": "include" + }, + "AgAAADsAAAAAAAAAOwAAAAAAAAAEAAAAaW5jbDsAAAAAAAAAQgAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAA/AAAAAAAAAD8AAAAAAAAAAAAAAAAA8L8" + ], + [ + 500, + 1, + "insert", + { + "characters": " " + }, + "AQAAAEIAAAAAAAAAQwAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABCAAAAAAAAAEIAAAAAAAAAAAAAAAAA8L8" + ], + [ + 501, + 1, + "insert_snippet", + { + "contents": "<$0>" + }, + "AQAAAEMAAAAAAAAARQAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABDAAAAAAAAAEMAAAAAAAAAAAAAAAAA8L8" + ], + [ + 502, + 1, + "insert", + { + "characters": "math.h" + }, + "BgAAAEQAAAAAAAAARQAAAAAAAAAAAAAARQAAAAAAAABGAAAAAAAAAAAAAABGAAAAAAAAAEcAAAAAAAAAAAAAAEcAAAAAAAAASAAAAAAAAAAAAAAASAAAAAAAAABJAAAAAAAAAAAAAABJAAAAAAAAAEoAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABEAAAAAAAAAEQAAAAAAAAAAAAAAAAA8L8" + ], + [ + 503, + 1, + "insert_completion", + { + "completion": "tgmath.h", + "format": "snippet", + "keep_prefix": false, + "must_insert": false, + "trigger": "tgmath.h" + }, + "AgAAAEQAAAAAAAAARAAAAAAAAAAGAAAAbWF0aC5oRAAAAAAAAABMAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABKAAAAAAAAAEoAAAAAAAAAAAAAAAAA8L8" + ], + [ + 505, + 9, + "left_delete", + null, + "CQAAAEwAAAAAAAAATAAAAAAAAAABAAAAPksAAAAAAAAASwAAAAAAAAABAAAAaEoAAAAAAAAASgAAAAAAAAABAAAALkkAAAAAAAAASQAAAAAAAAABAAAAaEgAAAAAAAAASAAAAAAAAAABAAAAdEcAAAAAAAAARwAAAAAAAAABAAAAYUYAAAAAAAAARgAAAAAAAAABAAAAbUUAAAAAAAAARQAAAAAAAAABAAAAZ0QAAAAAAAAARAAAAAAAAAABAAAAdA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABNAAAAAAAAAE0AAAAAAAAAAAAAAAAA8L8" + ], + [ + 506, + 1, + "insert", + { + "characters": "mat" + }, + "AwAAAEQAAAAAAAAARQAAAAAAAAAAAAAARQAAAAAAAABGAAAAAAAAAAAAAABGAAAAAAAAAEcAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABEAAAAAAAAAEQAAAAAAAAAAAAAAAAA8L8" + ], + [ + 507, + 1, + "insert_completion", + { + "completion": "math.h", + "format": "snippet", + "keep_prefix": false, + "must_insert": false, + "trigger": "math.h" + }, + "AgAAAEQAAAAAAAAARAAAAAAAAAADAAAAbWF0RAAAAAAAAABKAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABHAAAAAAAAAEcAAAAAAAAAAAAAAAAA8L8" + ], + [ + 508, + 1, + "left_delete", + null, + "AQAAAEkAAAAAAAAASQAAAAAAAAABAAAAaA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABKAAAAAAAAAEoAAAAAAAAAAAAAAAAA8L8" + ], + [ + 509, + 1, + "insert", + { + "characters": "\t." + }, + "AgAAAEkAAAAAAAAASgAAAAAAAAAAAAAASgAAAAAAAABLAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABJAAAAAAAAAEkAAAAAAAAAAAAAAAAA8L8" + ], + [ + 510, + 2, + "left_delete", + null, + "AgAAAEoAAAAAAAAASgAAAAAAAAABAAAALkkAAAAAAAAASQAAAAAAAAABAAAAIA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABLAAAAAAAAAEsAAAAAAAAAAAAAAAAA8L8" + ], + [ + 511, + 1, + "insert", + { + "characters": "h>" + }, + "AgAAAEkAAAAAAAAASgAAAAAAAAAAAAAASgAAAAAAAABLAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABJAAAAAAAAAEkAAAAAAAAAAAAAAAAA8L8" + ], + [ + 516, + 1, + "insert", + { + "characters": "j" + }, + "AQAAACY5AAAAAAAAJzkAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAmOQAAAAAAACY5AAAAAAAAAAAAAAAA8L8" + ], + [ + 517, + 1, + "left_delete", + null, + "AQAAACY5AAAAAAAAJjkAAAAAAAABAAAAag", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAnOQAAAAAAACc5AAAAAAAAAAAAAAAA8L8" + ], + [ + 542, + 1, + "insert", + { + "characters": " " + }, + "AgAAANkYAAAAAAAA2hgAAAAAAAAAAAAA2hgAAAAAAADbGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADZGAAAAAAAANkYAAAAAAAAAAAAAAAAAAA" + ], + [ + 547, + 1, + "insert", + { + "characters": "a" + }, + "AQAAANsYAAAAAAAA3BgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADbGAAAAAAAANsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 548, + 1, + "left_delete", + null, + "AQAAANsYAAAAAAAA2xgAAAAAAAABAAAAYQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADcGAAAAAAAANwYAAAAAAAAAAAAAAAA8L8" + ], + [ + 549, + 1, + "insert", + { + "characters": "if" + }, + "AgAAANsYAAAAAAAA3BgAAAAAAAAAAAAA3BgAAAAAAADdGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADbGAAAAAAAANsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 550, + 1, + "insert", + { + "characters": " " + }, + "AQAAAN0YAAAAAAAA3hgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADdGAAAAAAAAN0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 551, + 1, + "insert_snippet", + { + "contents": "($0)" + }, + "AQAAAN4YAAAAAAAA4BgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADeGAAAAAAAAN4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 552, + 1, + "insert", + { + "characters": "val" + }, + "AwAAAN8YAAAAAAAA4BgAAAAAAAAAAAAA4BgAAAAAAADhGAAAAAAAAAAAAADhGAAAAAAAAOIYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADfGAAAAAAAAN8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 553, + 1, + "insert", + { + "characters": " >" + }, + "AgAAAOIYAAAAAAAA4xgAAAAAAAAAAAAA4xgAAAAAAADkGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADiGAAAAAAAAOIYAAAAAAAAAAAAAAAA8L8" + ], + [ + 554, + 1, + "insert", + { + "characters": " 0.0f" + }, + "BQAAAOQYAAAAAAAA5RgAAAAAAAAAAAAA5RgAAAAAAADmGAAAAAAAAAAAAADmGAAAAAAAAOcYAAAAAAAAAAAAAOcYAAAAAAAA6BgAAAAAAAAAAAAA6BgAAAAAAADpGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADkGAAAAAAAAOQYAAAAAAAAAAAAAAAA8L8" + ], + [ + 556, + 1, + "insert", + { + "characters": "\n" + }, + "BAAAAOoYAAAAAAAA6xgAAAAAAAAAAAAA6xgAAAAAAADtGAAAAAAAAAAAAADrGAAAAAAAAOsYAAAAAAAAAgAAACAg6xgAAAAAAADvGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADqGAAAAAAAAOoYAAAAAAAAAAAAAAAA8L8" + ], + [ + 557, + 1, + "insert_snippet", + { + "contents": "{$0}" + }, + "AwAAAO8YAAAAAAAA8RgAAAAAAAAAAAAA6xgAAAAAAADrGAAAAAAAAAQAAAAgICAg6xgAAAAAAADtGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADvGAAAAAAAAO8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 560, + 1, + "run_macro_file", + { + "file": "res://Packages/Default/Add Line in Braces.sublime-macro" + }, + "BgAAAO4YAAAAAAAA7xgAAAAAAAAAAAAA7xgAAAAAAADxGAAAAAAAAAAAAADxGAAAAAAAAPIYAAAAAAAAAAAAAPIYAAAAAAAA9BgAAAAAAAAAAAAA7xgAAAAAAADvGAAAAAAAAAIAAAAgIO8YAAAAAAAA8xgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADuGAAAAAAAAO4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 563, + 1, + "insert", + { + "characters": "return" + }, + "BgAAAPMYAAAAAAAA9BgAAAAAAAAAAAAA9BgAAAAAAAD1GAAAAAAAAAAAAAD1GAAAAAAAAPYYAAAAAAAAAAAAAPYYAAAAAAAA9xgAAAAAAAAAAAAA9xgAAAAAAAD4GAAAAAAAAAAAAAD4GAAAAAAAAPkYAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADzGAAAAAAAAPMYAAAAAAAAAAAAAAAAQkA" + ], + [ + 564, + 1, + "insert", + { + "characters": " " + }, + "AQAAAPkYAAAAAAAA+hgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAD5GAAAAAAAAPkYAAAAAAAAAAAAAAAA8L8" + ], + [ + 565, + 7, + "left_delete", + null, + "BwAAAPkYAAAAAAAA+RgAAAAAAAABAAAAIPgYAAAAAAAA+BgAAAAAAAABAAAAbvcYAAAAAAAA9xgAAAAAAAABAAAAcvYYAAAAAAAA9hgAAAAAAAABAAAAdfUYAAAAAAAA9RgAAAAAAAABAAAAdPQYAAAAAAAA9BgAAAAAAAABAAAAZfMYAAAAAAAA8xgAAAAAAAABAAAAcg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAD6GAAAAAAAAPoYAAAAAAAAAAAAAAAA8L8" + ], + [ + 568, + 1, + "insert", + { + "characters": "\n" + }, + "AwAAANsYAAAAAAAA3BgAAAAAAAAAAAAA3BgAAAAAAADeGAAAAAAAAAAAAADyGAAAAAAAAPIYAAAAAAAABAAAACAgICA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADbGAAAAAAAANsYAAAAAAAAAAAAAAAA8L8" + ], + [ + 570, + 1, + "insert", + { + "characters": "F342" + }, + "BAAAANsYAAAAAAAA3BgAAAAAAAAAAAAA3BgAAAAAAADdGAAAAAAAAAAAAADdGAAAAAAAAN4YAAAAAAAAAAAAAN4YAAAAAAAA3xgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADbGAAAAAAAANsYAAAAAAAAAAAAAAAAMkA" + ], + [ + 571, + 1, + "insert", + { + "characters": " " + }, + "AQAAAN8YAAAAAAAA4BgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADfGAAAAAAAAN8YAAAAAAAAAAAAAAAA8L8" + ], + [ + 572, + 3, + "left_delete", + null, + "AwAAAN8YAAAAAAAA3xgAAAAAAAABAAAAIN4YAAAAAAAA3hgAAAAAAAABAAAAMt0YAAAAAAAA3RgAAAAAAAABAAAANA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADgGAAAAAAAAOAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 573, + 1, + "insert", + { + "characters": "2" + }, + "AQAAAN0YAAAAAAAA3hgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADdGAAAAAAAAN0YAAAAAAAAAAAAAAAA8L8" + ], + [ + 574, + 1, + "insert", + { + "characters": " out" + }, + "BAAAAN4YAAAAAAAA3xgAAAAAAAAAAAAA3xgAAAAAAADgGAAAAAAAAAAAAADgGAAAAAAAAOEYAAAAAAAAAAAAAOEYAAAAAAAA4hgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADeGAAAAAAAAN4YAAAAAAAAAAAAAAAA8L8" + ], + [ + 575, + 1, + "insert", + { + "characters": " =" + }, + "AgAAAOIYAAAAAAAA4xgAAAAAAAAAAAAA4xgAAAAAAADkGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADiGAAAAAAAAOIYAAAAAAAAAAAAAAAA8L8" + ], + [ + 576, + 1, + "insert", + { + "characters": " val;" + }, + "BQAAAOQYAAAAAAAA5RgAAAAAAAAAAAAA5RgAAAAAAADmGAAAAAAAAAAAAADmGAAAAAAAAOcYAAAAAAAAAAAAAOcYAAAAAAAA6BgAAAAAAAAAAAAA6BgAAAAAAADpGAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADkGAAAAAAAAOQYAAAAAAAAAAAAAAAA8L8" + ], + [ + 578, + 1, + "insert", + { + "characters": " " + }, + "BAAAAAAZAAAAAAAAARkAAAAAAAAAAAAAARkAAAAAAAACGQAAAAAAAAAAAAACGQAAAAAAAAMZAAAAAAAAAAAAAAMZAAAAAAAABBkAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAGQAAAAAAAAAZAAAAAAAAAAAAAAAAYkA" + ], + [ + 579, + 1, + "insert", + { + "characters": "out" + }, + "AwAAAAQZAAAAAAAABRkAAAAAAAAAAAAABRkAAAAAAAAGGQAAAAAAAAAAAAAGGQAAAAAAAAcZAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAEGQAAAAAAAAQZAAAAAAAAAAAAAAAA8L8" + ], + [ + 580, + 1, + "insert", + { + "characters": " =" + }, + "AgAAAAcZAAAAAAAACBkAAAAAAAAAAAAACBkAAAAAAAAJGQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAHGQAAAAAAAAcZAAAAAAAAAAAAAAAA8L8" + ], + [ + 581, + 1, + "insert", + { + "characters": " sqrtf" + }, + "BgAAAAkZAAAAAAAAChkAAAAAAAAAAAAAChkAAAAAAAALGQAAAAAAAAAAAAALGQAAAAAAAAwZAAAAAAAAAAAAAAwZAAAAAAAADRkAAAAAAAAAAAAADRkAAAAAAAAOGQAAAAAAAAAAAAAOGQAAAAAAAA8ZAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAJGQAAAAAAAAkZAAAAAAAAAAAAAAAA8L8" + ], + [ + 582, + 1, + "insert_snippet", + { + "contents": "($0)" + }, + "AQAAAA8ZAAAAAAAAERkAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAPGQAAAAAAAA8ZAAAAAAAAAAAAAAAA8L8" + ], + [ + 583, + 1, + "insert", + { + "characters": "val" + }, + "AwAAABAZAAAAAAAAERkAAAAAAAAAAAAAERkAAAAAAAASGQAAAAAAAAAAAAASGQAAAAAAABMZAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAQGQAAAAAAABAZAAAAAAAAAAAAAAAA8L8" + ], + [ + 585, + 1, + "insert", + { + "characters": ";" + }, + "AQAAABQZAAAAAAAAFRkAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAUGQAAAAAAABQZAAAAAAAAAAAAAAAA8L8" + ], + [ + 587, + 1, + "insert", + { + "characters": "\nreturn" + }, + "CAAAABkZAAAAAAAAGhkAAAAAAAAAAAAAGhkAAAAAAAAcGQAAAAAAAAAAAAAcGQAAAAAAAB0ZAAAAAAAAAAAAAB0ZAAAAAAAAHhkAAAAAAAAAAAAAHhkAAAAAAAAfGQAAAAAAAAAAAAAfGQAAAAAAACAZAAAAAAAAAAAAACAZAAAAAAAAIRkAAAAAAAAAAAAAIRkAAAAAAAAiGQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAZGQAAAAAAABkZAAAAAAAAAAAAAACgZ0A" + ], + [ + 588, + 1, + "insert", + { + "characters": " out;" + }, + "BQAAACIZAAAAAAAAIxkAAAAAAAAAAAAAIxkAAAAAAAAkGQAAAAAAAAAAAAAkGQAAAAAAACUZAAAAAAAAAAAAACUZAAAAAAAAJhkAAAAAAAAAAAAAJhkAAAAAAAAnGQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAiGQAAAAAAACIZAAAAAAAAAAAAAAAA8L8" + ], + [ + 593, + 1, + "insert", + { + "characters": "_" + }, + "AQAAADAYAAAAAAAAMRgAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAwGAAAAAAAADAYAAAAAAAAAAAAAAAA8L8" + ], + [ + 604, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAG0dAAAAAAAAbh0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABtHQAAAAAAAG0dAAAAAAAAAAAAAABAVEA" + ], + [ + 606, + 1, + "insert", + { + "characters": " " + }, + "BgAAAG0dAAAAAAAAbh0AAAAAAAAAAAAAbh0AAAAAAABvHQAAAAAAAAAAAABvHQAAAAAAAHAdAAAAAAAAAAAAAHAdAAAAAAAAcR0AAAAAAAAAAAAAcR0AAAAAAAByHQAAAAAAAAAAAAByHQAAAAAAAHMdAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABtHQAAAAAAAG0dAAAAAAAAAAAAAAAAAAA" + ], + [ + 607, + 1, + "insert", + { + "characters": "\nr" + }, + "AwAAAHMdAAAAAAAAdB0AAAAAAAAAAAAAdB0AAAAAAAB6HQAAAAAAAAAAAAB6HQAAAAAAAHsdAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAABzHQAAAAAAAHMdAAAAAAAAAAAAAAAA8L8" + ], + [ + 608, + 1, + "insert", + { + "characters": " =" + }, + "AgAAAHsdAAAAAAAAfB0AAAAAAAAAAAAAfB0AAAAAAAB9HQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB7HQAAAAAAAHsdAAAAAAAAAAAAAAAA8L8" + ], + [ + 609, + 1, + "insert", + { + "characters": " linear_" + }, + "CAAAAH0dAAAAAAAAfh0AAAAAAAAAAAAAfh0AAAAAAAB/HQAAAAAAAAAAAAB/HQAAAAAAAIAdAAAAAAAAAAAAAIAdAAAAAAAAgR0AAAAAAAAAAAAAgR0AAAAAAACCHQAAAAAAAAAAAACCHQAAAAAAAIMdAAAAAAAAAAAAAIMdAAAAAAAAhB0AAAAAAAAAAAAAhB0AAAAAAACFHQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAB9HQAAAAAAAH0dAAAAAAAAAAAAAAAA8L8" + ], + [ + 610, + 1, + "insert_completion", + { + "completion": "linear_to_gamma", + "format": "text", + "keep_prefix": false, + "must_insert": false, + "trigger": "linear_to_gamma" + }, + "AgAAAH4dAAAAAAAAfh0AAAAAAAAHAAAAbGluZWFyX34dAAAAAAAAjR0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACFHQAAAAAAAIUdAAAAAAAAAAAAAAAA8L8" + ], + [ + 611, + 1, + "insert_snippet", + { + "contents": "($0)" + }, + "AQAAAI0dAAAAAAAAjx0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACNHQAAAAAAAI0dAAAAAAAAAAAAAAAA8L8" + ], + [ + 612, + 1, + "insert", + { + "characters": "r" + }, + "AQAAAI4dAAAAAAAAjx0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACOHQAAAAAAAI4dAAAAAAAAAAAAAAAA8L8" + ], + [ + 614, + 1, + "insert", + { + "characters": ";" + }, + "AQAAAJAdAAAAAAAAkR0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACQHQAAAAAAAJAdAAAAAAAAAAAAAAAA8L8" + ], + [ + 619, + 2, + "duplicate_line", + null, + "AgAAAJIdAAAAAAAAsB0AAAAAAAAAAAAAsB0AAAAAAADOHQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACNHQAAAAAAAI0dAAAAAAAAAAAAAAAA8L8" + ], + [ + 625, + 1, + "insert", + { + "characters": "a" + }, + "AQAAAJkdAAAAAAAAmh0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACZHQAAAAAAAJkdAAAAAAAAAAAAAAAA8L8" + ], + [ + 626, + 2, + "left_delete", + null, + "AgAAAJkdAAAAAAAAmR0AAAAAAAABAAAAYZgdAAAAAAAAmB0AAAAAAAABAAAAcg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACaHQAAAAAAAJodAAAAAAAAAAAAAAAA8L8" + ], + [ + 627, + 1, + "insert", + { + "characters": "b" + }, + "AQAAAJgdAAAAAAAAmR0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACYHQAAAAAAAJgdAAAAAAAAAAAAAAAA8L8" + ], + [ + 628, + 1, + "left_delete", + null, + "AQAAAJgdAAAAAAAAmB0AAAAAAAABAAAAYg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACZHQAAAAAAAJkdAAAAAAAAAAAAAAAA8L8" + ], + [ + 629, + 1, + "insert", + { + "characters": "ag" + }, + "AgAAAJgdAAAAAAAAmR0AAAAAAAAAAAAAmR0AAAAAAACaHQAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACYHQAAAAAAAJgdAAAAAAAAAAAAAAAA8L8" + ], + [ + 630, + 2, + "left_delete", + null, + "AgAAAJkdAAAAAAAAmR0AAAAAAAABAAAAZ5gdAAAAAAAAmB0AAAAAAAABAAAAYQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACaHQAAAAAAAJodAAAAAAAAAAAAAAAA8L8" + ], + [ + 631, + 1, + "insert", + { + "characters": "g" + }, + "AQAAAJgdAAAAAAAAmR0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACYHQAAAAAAAJgdAAAAAAAAAAAAAAAA8L8" + ], + [ + 635, + 1, + "left_delete", + null, + "AQAAAKwdAAAAAAAArB0AAAAAAAABAAAAcg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACtHQAAAAAAAK0dAAAAAAAAAAAAAAAA8L8" + ], + [ + 636, + 1, + "insert", + { + "characters": "g" + }, + "AQAAAKwdAAAAAAAArR0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAACsHQAAAAAAAKwdAAAAAAAAAAAAAAAA8L8" + ], + [ + 638, + 1, + "left_delete", + null, + "AQAAAModAAAAAAAAyh0AAAAAAAABAAAAcg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADLHQAAAAAAAMsdAAAAAAAAAAAAAABgbkA" + ], + [ + 639, + 1, + "insert", + { + "characters": "b" + }, + "AQAAAModAAAAAAAAyx0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAADKHQAAAAAAAModAAAAAAAAAAAAAAAA8L8" + ], + [ + 642, + 1, + "left_delete", + null, + "AQAAALYdAAAAAAAAth0AAAAAAAABAAAAcg", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC3HQAAAAAAALcdAAAAAAAAAAAAAAAA8L8" + ], + [ + 643, + 1, + "insert", + { + "characters": "b" + }, + "AQAAALYdAAAAAAAAtx0AAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAC2HQAAAAAAALYdAAAAAAAAAAAAAAAA8L8" + ] + ] + }, + { + "file": "run.bat", + "settings": + { + "buffer_size": 26, + "encoding": "UTF-8", + "line_ending": "Windows", + "name": "cd build" + }, + "undo_stack": + [ + [ + 1, + 1, + "insert", + { + "characters": "cd" + }, + "AgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8" + ], + [ + 2, + 1, + "insert", + { + "characters": " build/" + }, + "BwAAAAIAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAAUAAAAAAAAAAAAAAAUAAAAAAAAABgAAAAAAAAAAAAAABgAAAAAAAAAHAAAAAAAAAAAAAAAHAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAACQAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAA8L8" + ], + [ + 3, + 1, + "left_delete", + null, + "AQAAAAgAAAAAAAAACAAAAAAAAAABAAAALw", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAJAAAAAAAAAAkAAAAAAAAAAAAAAAAA8L8" + ], + [ + 4, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAAgAAAAAAAAACQAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAA8L8" + ], + [ + 5, + 1, + "insert", + { + "characters": "p" + }, + "AQAAAAkAAAAAAAAACgAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAJAAAAAAAAAAkAAAAAAAAAAAAAAAAA8L8" + ], + [ + 6, + 1, + "left_delete", + null, + "AQAAAAkAAAAAAAAACQAAAAAAAAABAAAAcA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAKAAAAAAAAAAoAAAAAAAAAAAAAAAAA8L8" + ], + [ + 7, + 1, + "insert", + { + "characters": "program.exe" + }, + "CwAAAAkAAAAAAAAACgAAAAAAAAAAAAAACgAAAAAAAAALAAAAAAAAAAAAAAALAAAAAAAAAAwAAAAAAAAAAAAAAAwAAAAAAAAADQAAAAAAAAAAAAAADQAAAAAAAAAOAAAAAAAAAAAAAAAOAAAAAAAAAA8AAAAAAAAAAAAAAA8AAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAARAAAAAAAAAAAAAAARAAAAAAAAABIAAAAAAAAAAAAAABIAAAAAAAAAEwAAAAAAAAAAAAAAEwAAAAAAAAAUAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAJAAAAAAAAAAkAAAAAAAAAAAAAAAAA8L8" + ], + [ + 8, + 1, + "insert", + { + "characters": "\ncd" + }, + "AwAAABQAAAAAAAAAFQAAAAAAAAAAAAAAFQAAAAAAAAAWAAAAAAAAAAAAAAAWAAAAAAAAABcAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAUAAAAAAAAABQAAAAAAAAAAAAAAAAA8L8" + ], + [ + 9, + 1, + "insert", + { + "characters": " .." + }, + "AwAAABcAAAAAAAAAGAAAAAAAAAAAAAAAGAAAAAAAAAAZAAAAAAAAAAAAAAAZAAAAAAAAABoAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAXAAAAAAAAABcAAAAAAAAAAAAAAAAA8L8" + ], + [ + 21, + 1, + "insert", + { + "characters": "\n" + }, + "AQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8" + ], + [ + 23, + 1, + "insert", + { + "characters": "ee" + }, + "AgAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + ], + [ + 24, + 2, + "left_delete", + null, + "AgAAAAEAAAAAAAAAAQAAAAAAAAABAAAAZQAAAAAAAAAAAAAAAAAAAAABAAAAZQ", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAACAAAAAAAAAAIAAAAAAAAAAAAAAAAA8L8" + ], + [ + 25, + 1, + "insert", + { + "characters": "echo" + }, + "BAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAMAAAAAAAAAAAAAAAMAAAAAAAAABAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8" + ], + [ + 26, + 1, + "insert", + { + "characters": " cwd" + }, + "BAAAAAQAAAAAAAAABQAAAAAAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAAAAAAGAAAAAAAAAAcAAAAAAAAAAAAAAAcAAAAAAAAACAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAA8L8" + ], + [ + 41, + 1, + "insert", + { + "characters": "dd" + }, + "AgAAAAgAAAAAAAAACQAAAAAAAAAAAAAACQAAAAAAAAAKAAAAAAAAAAAAAAA", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAIAAAAAAAAAAgAAAAAAAAAAAAAAAAA8L8" + ], + [ + 44, + 1, + "run_macro_file", + { + "file": "res://Packages/Default/Delete Line.sublime-macro" + }, + "AQAAAAAAAAAAAAAAAAAAAAAAAAALAAAAZWNobyBjd2RkZAo", + "AgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC/AAAAAAEAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAA8L8" + ] + ] + } + ], + "build_system": "Packages/User/buildbat.sublime-build", + "build_system_choices": + [ + [ + [ + [ + "Packages/C++/C Single File.sublime-build", + "" + ], + [ + "Packages/C++/C Single File.sublime-build", + "Run" + ], + [ + "Packages/User/buildbat.sublime-build", + "" + ] + ], + [ + "Packages/User/buildbat.sublime-build", + "" + ] + ] + ], + "build_varint": "", + "command_palette": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + [ + "View", + "View Package File" + ], + [ + "Color", + "Colorsublime: Install Theme" + ], + [ + "Pack", + "Package Control: Install Package" + ], + [ + "Install Pack", + "Package Control: Install Package" + ], + [ + "Package Insta", + "Package Control: Install Package" + ], + [ + "Color Sch", + "UI: Select Color Scheme" + ], + [ + "Install Pac", + "Package Control: Install Package" + ], + [ + "Package", + "Install Package Control" + ], + [ + "View ", + "View Package File" + ] + ], + "width": 0.0 + }, + "console": + { + "height": 562.0, + "history": + [ + "dir", + "ls", + "build.bat" + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/W/rayt" + ], + "file_history": + [ + "/C/Users/anton/AppData/Roaming/Sublime Text 3/Packages/User/rayt.sublime-build", + "/W/rayt/build/output.ppm", + "/W/rayt/src/main.cu", + "/D/dev/eigsol_gpu/eigsol_gpu.sublime-project", + "/D/repos/raddebugger/src/base/base_arena.h", + "/D/repos/raddebugger/src/base/base_core.h", + "/D/repos/raddebugger/src/base/base_command_line.c", + "/C/Users/anton/AppData/Roaming/Sublime Text 3/Packages/Default/Default (Windows).sublime-keymap", + "/C/sbs/sb1/java/guidesign/src/com/comsol/guidesign/views/%USER%", + "/C/Users/antonlj/AppData/Roaming/Sublime Text 3/Packages/Colorsublime/Colorsublime.sublime-settings", + "/C/Users/antonlj/AppData/Roaming/Sublime Text 3/Packages/User/Colorsublime.sublime-settings", + "/C/sbs/sb1/java/guidesign/src/com/comsol/guidesign/actions/DesignCreatorActionFactory.java", + "/C/sbs/sb1/java/design/src/com/comsol/design/operations/DesignOperation.java", + "/C/Users/antonlj/AppData/Roaming/Sublime Text 3/Packages/Default/symbol.py", + "/C/Program Files/Sublime Text 3/Packages/Default.sublime-package", + "/C/Users/antonlj/AppData/Roaming/Sublime Text 3/Packages/User/Preferences.sublime-settings", + "/C/sbs/sb1/java/testgui/src/com/comsol/testgui/builder/TBuilderFeatures.java", + "/C/Users/antonlj/AppData/Roaming/Sublime Text 3/Packages/Default/Preferences.sublime-settings" + ], + "find": + { + "height": 26.0 + }, + "find_in_files": + { + "height": 103.333333333, + "where_history": + [ + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "discriminant", + ";\n" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + ], + "reverse": false, + "scrollbar_highlights": true, + "show_context": true, + "use_buffer2": true, + "use_gitignore": true, + "whole_word": false, + "wrap": true + }, + "folders": + [ + { + "path": "W:\\rayt" + } + ], + "groups": + [ + { + "sheets": + [ + { + "buffer": 0, + "file": "src/main.cu", + "selected": true, + "semi_transient": false, + "settings": + { + "buffer_size": 22877, + "regions": + { + "mark": + { + "flags": 144, + "icon": "Packages/Theme - Default/common/dot.png", + "regions": + [ + [ + 16511, + 16511 + ] + ], + "scope": "mark" + } + }, + "selection": + [ + [ + 5754, + 5754 + ] + ], + "settings": + { + "syntax": "Packages/C++/C.sublime-syntax", + "tab_size": 2, + "translate_tabs_to_spaces": true + }, + "translation.x": 0.0, + "translation.y": 4623.0, + "zoom_level": 1.0 + }, + "stack_index": 0, + "stack_multiselect": false, + "type": "text" + }, + { + "buffer": 1, + "file": "run.bat", + "semi_transient": false, + "settings": + { + "buffer_size": 26, + "regions": + { + }, + "selection": + [ + [ + 26, + 26 + ] + ], + "settings": + { + "auto_name": "cd build", + "syntax": "Packages/Batch File/Batch File.sublime-syntax" + }, + "translation.x": 0.0, + "translation.y": 0.0, + "zoom_level": 1.0 + }, + "stack_index": 1, + "stack_multiselect": false, + "type": "text" + } + ] + } + ], + "incremental_find": + { + "height": 26.0 + }, + "input": + { + "height": 0.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.exec": + { + "height": 425.0 + }, + "output.find_results": + { + "height": 0.0 + }, + "pinned_build_system": "Packages/User/rayt.sublime-build", + "project": "", + "replace": + { + "height": 48.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + [ + "", + "build\\output.ppm" + ], + [ + "main", + "src\\main.cu" + ], + [ + "build", + "build.bat" + ], + [ + "base_are", + "src\\base\\base_arena.h" + ], + [ + "base_core", + "src\\base\\base_core.h" + ], + [ + "BuilderInf", + "design\\src\\com\\comsol\\design\\util\\link\\BuilderInfoVisitor.java" + ], + [ + "DesignPhysicsM", + "design\\src\\com\\comsol\\design\\DesignPhysicsMaker.java" + ], + [ + "TBuilderFeat", + "testgui\\src\\com\\comsol\\testgui\\builder\\TBuilderFeatures.java" + ] + ], + "width": 0.0 + }, + "select_project": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_symbol": + { + "height": 323.0, + "last_filter": "", + "selected_items": + [ + [ + "", + "RayF32" + ], + [ + "DesignPhysicsMak", + "DesignPhysicsMaker" + ], + [ + "DeviceModelFeatu", + "DeviceModelFeatureOperation" + ] + ], + "width": 592.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": false, + "show_open_files": true, + "show_tabs": true, + "side_bar_visible": false, + "side_bar_width": 145.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..969ee64 --- /dev/null +++ b/run.bat @@ -0,0 +1,3 @@ +cd build +program.exe +cd .. \ No newline at end of file diff --git a/src/base_core.h b/src/base_core.h new file mode 100644 index 0000000..f4ec8b7 --- /dev/null +++ b/src/base_core.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include + +#include + +//------------------------------------------------------------------------------------------ +//~ base defines + +#define host_global static +#define function static + +//~ typedefs +typedef int32_t S32; +typedef uint32_t U32; +typedef uint64_t U64; +typedef float F32; + +//~ utility defines + +#define CUDA_CHECK(err) do { \ + if (err != cudaSuccess) { \ + fprintf(stderr, "CUDA ERROR: %s at %s:%d\n", \ + cudaGetErrorString(err), __FILE__, __LINE__); \ + exit(EXIT_FAILURE); \ + } \ +} while (0) + +#define LOG printf + +#define F32_MAX FLT_MAX +#define F32_MIN FLT_MIN diff --git a/src/base_math.c b/src/base_math.c new file mode 100644 index 0000000..f87f443 --- /dev/null +++ b/src/base_math.c @@ -0,0 +1,139 @@ + +__host__ __device__ inline function Vec3F32 +vec3F32(F32 x, F32 y, F32 z) +{ + Vec3F32 out = {0}; + out.x = x; + out.y = y; + out.z = z; + return out; +} + + +__host__ __device__ inline function Vec3F32 +add_V3F32(Vec3F32 a, Vec3F32 b) +{ + Vec3F32 out = {0}; + out.x = a.x + b.x; + out.y = a.y + b.y; + out.z = a.z + b.z; + return out; +} + +__host__ __device__ inline function Vec3F32 +sub_V3F32(Vec3F32 a, Vec3F32 b) +{ + Vec3F32 out = {0}; + out.x = a.x-b.x; + out.y = a.y-b.y; + out.z = a.z-b.z; + return out; +} + +__host__ __device__ inline function Vec3F32 +scale_V3F32(F32 s, Vec3F32 v) +{ + Vec3F32 out = {0}; + out.x = s*v.x; + out.y = s*v.y; + out.z = s*v.z; + return out; +} + +__host__ __device__ inline function F32 +dot_V3F32(Vec3F32 a, Vec3F32 b) +{ + return a.x*b.x + a.y*b.y + a.z*b.z; +} + + +__host__ __device__ inline function Vec3F32 +ray_point_F32(F32 t, RayF32 ray) +{ + Vec3F32 out = add_V3F32(ray.origin, scale_V3F32(t, ray.direction)); + return out; +} + +__host__ __device__ inline function F32 +mag_V3F32(Vec3F32 a) +{ + return dot_V3F32(a, a); +} + +__host__ function F32 +h_norm_V3F32(Vec3F32 a) +{ + F32 mag = mag_V3F32(a); + return sqrtf(mag); +} +__device__ function F32 +norm_V3F32(Vec3F32 a) +{ + F32 mag = mag_V3F32(a); + return __fsqrt_rn(mag); +} + +__host__ __device__ function Vec3F32 +lerp_V3F32(F32 s, Vec3F32 a, Vec3F32 b) +{ + Vec3F32 lerp_term1 = scale_V3F32(1.0f-s, a); + Vec3F32 lerp_term2 = scale_V3F32(s, b); + Vec3F32 lerp_result = add_V3F32(lerp_term1, lerp_term2); + + return lerp_result; +} + +__device__ function Vec3F32 +rand_uniform_V3F32(curandState *local_rand_state) +{ + Vec3F32 out = {0}; + out.x = curand_uniform(local_rand_state); + out.y = curand_uniform(local_rand_state); + out.z = curand_uniform(local_rand_state); + return out; +} + +__device__ function Vec3F32 +rand_uniform_range_V3F32(RngF32 rng, curandState *local_rand_state) +{ + Vec3F32 out = {0}; + out.x = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); + out.y = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); + out.z = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); + return out; +} + + +__host__ function F32 +linear_to_gamma(F32 val) +{ + // We assume that the input value is in linear space, and + // we transform it to approximate srgb space by taking the sqrt + F32 out = val; + if (val > 0.0f) + { + out = sqrtf(val); + } + return out; +} + + +__device__ function F32 +clamp_F32(RngF32 rng, F32 val) +{ + F32 out = fmaxf(rng.min, val); + out = fminf(val, rng.max); + return out; +} + +__device__ function Vec3F32 +clamp_V3F32(RngF32 rng, Vec3F32 v) +{ + Vec3F32 out = {0}; + out.x = clamp_F32(rng, v.x); + out.y = clamp_F32(rng, v.y); + out.z = clamp_F32(rng, v.z); + return out; +} + + diff --git a/src/base_math.h b/src/base_math.h new file mode 100644 index 0000000..960f7c3 --- /dev/null +++ b/src/base_math.h @@ -0,0 +1,63 @@ +#pragma once + +//------------------------------------------------------------------------------------------ +//~ structs + +typedef union Vec3F32 Vec3F32; +union Vec3F32 +{ + struct + { + F32 x; + F32 y; + F32 z; + }; + struct + { + F32 r; + F32 g; + F32 b; + }; + F32 v[3]; +}; + +typedef struct RngF32 RngF32; +struct RngF32 +{ + F32 min; + F32 max; +}; + +typedef struct RayF32 RayF32; +struct RayF32 +{ + Vec3F32 origin; + Vec3F32 direction; +}; + + +//------------------------------------------------------------------------------------------ +//~ forward declarations + + +__host__ __device__ inline function Vec3F32 vec3F32(F32 x, F32 y, F32 z); +__host__ __device__ inline function Vec3F32 add_V3F32(Vec3F32 a, Vec3F32 b); +__host__ __device__ inline function Vec3F32 sub_V3F32(Vec3F32 a, Vec3F32 b); +__host__ __device__ inline function Vec3F32 scale_V3F32(F32 s, Vec3F32 v); + + +__host__ __device__ inline function Vec3F32 ray_point_F32(F32 t, RayF32 *ray); +__host__ __device__ inline function F32 mag_V3F32(Vec3F32 a); +__host__ __device__ inline function F32 dot_V3F32(Vec3F32 a, Vec3F32 b); +__device__ inline function F32 norm_V3F32(Vec3F32 a); + +__host__ __device__ function Vec3F32 lerp_V3F32(F32 s, Vec3F32 a, Vec3F32 b); + +__device__ function Vec3F32 rand_uniform_V3F32(curandState *local_rand_state); +__device__ function Vec3F32 rand_uniform_range_V3F32(RngF32 rng, curandState *local_rand_state); + +__host__ function F32 linear_to_gamma(F32 val); +__host__ inline function F32 h_norm_V3F32(Vec3F32 a); + +__device__ function F32 clamp_F32(RngF32 rng, F32 val); +__device__ function Vec3F32 clamp_V3F32(RngF32 rng, Vec3F32 v); diff --git a/src/main.cu b/src/main.cu index cb56bfe..9698786 100644 --- a/src/main.cu +++ b/src/main.cu @@ -1,36 +1,6 @@ -#include -#include -#include - -#include - -//------------------------------------------------------------------------------------------ -//~ base defines - -#define host_global static -#define function static - -//~ typedefs -typedef int32_t S32; -typedef uint32_t U32; -typedef uint64_t U64; -typedef float F32; - -//~ utility defines - -#define CUDA_CHECK(err) do { \ - if (err != cudaSuccess) { \ - fprintf(stderr, "CUDA ERROR: %s at %s:%d\n", \ - cudaGetErrorString(err), __FILE__, __LINE__); \ - exit(EXIT_FAILURE); \ - } \ -} while (0) - -#define LOG printf - -#define F32_MAX FLT_MAX -#define F32_MIN FLT_MIN - +#include "base_core.h" +#include "base_math.h" +#include "rayt_core.h" //------------------------------------------------------------------------------------------ //~ Program parameter defines @@ -47,522 +17,16 @@ typedef float F32; #define SAMPLES_PER_PIXEL 64 #define MAX_DIFFUSE_DEPTH 8 -//------------------------------------------------------------------------------------------ -//~ structs - -typedef union Vec3F32 Vec3F32; -union Vec3F32 -{ - struct - { - F32 x; - F32 y; - F32 z; - }; - struct - { - F32 r; - F32 g; - F32 b; - }; - F32 v[3]; -}; - -typedef struct RngF32 RngF32; -struct RngF32 -{ - F32 min; - F32 max; -}; - -typedef struct RayF32 RayF32; -struct RayF32 -{ - Vec3F32 origin; - Vec3F32 direction; -}; - - -typedef struct ViewportF32 ViewportF32; - -struct ViewportF32 -{ - F32 width; - F32 height; - F32 aspect_ratio; - Vec3F32 u; // along horizontal edge, right from top left corner - Vec3F32 v; // along vertical edge, down from top left corner - Vec3F32 upper_left; - Vec3F32 pixel_origin; - Vec3F32 pixel_delta_u; - Vec3F32 pixel_delta_v; -}; - -typedef struct CameraF32 CameraF32; -struct CameraF32 -{ - Vec3F32 center; - Vec3F32 up; - F32 focal_length; - F32 pixel_sample_scale; -}; - -typedef struct ImageF32 ImageF32; -struct ImageF32 -{ - U32 width; - U32 height; - F32 aspect_ratio; - U32 total_num_pixels; -}; - -enum EntityKind -{ - EntityKind_Nil, - EntityKind_Sphere, - Num_EntityKinds -}; - -typedef struct HitRecord HitRecord; -struct HitRecord -{ - Vec3F32 point; - Vec3F32 normal; - F32 t; // Root parameter for hit sphere - F32 hit; // Hit true or false - F32 front_face; -}; - -typedef struct Entity Entity; -struct Entity -{ - EntityKind kind; - Vec3F32 center; - F32 radius; -}; +#include "base_math.c" +#include "rayt_core.c" //------------------------------------------------------------------------------------------ //~ host globals -host_global Entity nil_entity = {EntityKind_Nil, {0.0f, 0.0f, 0.0f}, 0.0f}; -//~ device globals +host_global CameraF32 h_camera; +host_global ViewportF32 h_viewport; +host_global ImageF32 h_image; -__constant__ CameraF32 camera; -__constant__ ViewportF32 viewport; -__constant__ ImageF32 image; - -//------------------------------------------------------------------------------------------ -//~ routines - - -__host__ __device__ function Vec3F32 vec3F32(F32 x, F32 y, F32 z) -{ - Vec3F32 out = {0}; - out.x = x; - out.y = y; - out.z = z; - return out; -} - - -__host__ __device__ function Vec3F32 add_V3F32(Vec3F32 a, Vec3F32 b) -{ - Vec3F32 out = {0}; - out.x = a.x + b.x; - out.y = a.y + b.y; - out.z = a.z + b.z; - return out; -} - -__host__ __device__ function Vec3F32 sub_V3F32(Vec3F32 a, Vec3F32 b) -{ - Vec3F32 out = {0}; - out.x = a.x-b.x; - out.y = a.y-b.y; - out.z = a.z-b.z; - return out; -} - - - -__host__ __device__ function Vec3F32 scale_V3F32(F32 s, Vec3F32 v) -{ - Vec3F32 out = {0}; - out.x = s*v.x; - out.y = s*v.y; - out.z = s*v.z; - return out; -} - -__device__ function F32 dot_V3F32(Vec3F32 a, Vec3F32 b) -{ - return a.x*b.x + a.y*b.y + a.z*b.z; -} - - -__device__ function Vec3F32 ray_point_F32(F32 t, RayF32 ray) -{ - Vec3F32 out = add_V3F32(ray.origin, scale_V3F32(t, ray.direction)); - return out; -} - -__device__ function F32 mag_V3F32(Vec3F32 a) -{ - return dot_V3F32(a, a); -} - -__device__ function F32 norm_V3F32(Vec3F32 a) -{ - F32 mag = mag_V3F32(a); - return __fsqrt_rn(mag); -} - -__device__ function Vec3F32 lerp_V3F32(F32 s, Vec3F32 a, Vec3F32 b) -{ - Vec3F32 lerp_term1 = scale_V3F32(1.0f-s, a); - Vec3F32 lerp_term2 = scale_V3F32(s, b); - Vec3F32 lerp_result = add_V3F32(lerp_term1, lerp_term2); - - return lerp_result; -} - -__device__ function F32 surrounds_RngF32(RngF32 rng, F32 val) -{ - F32 out = (rng.min < val) && (val < rng.max); - return out; -} - -// -//__device__ function F32 contains_RngF32(RngF32 rng, F32 val) -//{ -// F32 out = (rng.min <= val) && (val <= rng.max); -// return out; -//} -// -//__device__ function F32 size_RngF32(RngF32 rng) -//{ -// return rng.max-rng.min; -//} -// - -__device__ function Vec3F32 -rand_uniform_V3F32(curandState *local_rand_state) -{ - Vec3F32 out = {0}; - out.x = curand_uniform(local_rand_state); - out.y = curand_uniform(local_rand_state); - out.z = curand_uniform(local_rand_state); - return out; -} - -__device__ function Vec3F32 -rand_uniform_rng_V3F32(RngF32 rng, curandState *local_rand_state) -{ - Vec3F32 out = {0}; - out.x = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); - out.y = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); - out.z = rng.min + (rng.max-rng.min) * curand_uniform(local_rand_state); - return out; -} - -__device__ function Vec3F32 -rand_unit_vector_on_sphere_F32(curandState *local_rand_state) -{ - Vec3F32 out = {0}; - RngF32 range = {-1.0f, 1.0f}; // Cube bounding the unit sphere - F32 inner_bound = 1e-8f; // Don't want too small vectors - for(U32 i = 0; i < MAX_RANDOM_UNIT_VECTOR_ITERATIONS; i += 1) - { - out = rand_uniform_rng_V3F32(range, local_rand_state); - F32 normsqrd = dot_V3F32(out, out); - if(inner_bound < normsqrd && normsqrd <= 1.0f) - { - F32 norm = __fsqrt_rn(normsqrd); - out = scale_V3F32(1.0f/norm, out); - break; - } - } - - return out; -} - -__device__ function Vec3F32 -rand_unit_vector_on_hemisphere_F32(curandState *local_rand_state, Vec3F32 normal) -{ - - Vec3F32 out = {0}; - Vec3F32 vec_on_unit_sphere = rand_unit_vector_on_sphere_F32(local_rand_state); - if(dot_V3F32(vec_on_unit_sphere, normal) > 0.0f) - { - // same hemisphere - out = vec_on_unit_sphere; - } - else - { - out = scale_V3F32(-1.0f, vec_on_unit_sphere); - } - - return out; -} - -__host__ function void write_buffer_to_ppm(Vec3F32 *buffer, - U32 image_width, - U32 image_height) -{ - - const char *filename = "output.ppm"; - FILE *file = fopen(filename, "w"); - if(!file) - { - LOG("Error opening file %s \n", filename); - } - - // Write PPM header. First it has "P3" by itself to indicate ASCII colors, - fprintf(file, "P3\n"); - // The row below will say the dimensions of the image: - // (width, height) <-> (num columns, num rows) - fprintf(file, "%i %i\n", image_width, image_height); - // Then we have a value for the maximum pixel color - fprintf(file, "255\n"); - // Then we have all the lines with pixel data, - // it will be three values for each column j on a row i, - // corresponding to a pixel with index (i,j). - for(U32 i = 0; i < image_height; i += 1) - { - for(U32 j = 0; j < image_width; j +=1) - { - // We represent RGB values by floats internally and scale to integer values - U32 idx = i * image_width + j; - - F32 r = buffer[idx].r; - F32 g = buffer[idx].g; - F32 b = buffer[idx].b; - - U32 ir = int(255.999f * r); - U32 ig = int(255.999f * g); - U32 ib = int(255.999f * b); - - fprintf(file, "%i %i %i ", ir, ig, ib); - } - fprintf(file, "\n"); - } - - fclose(file); -} - -__device__ function F32 -clamp_F32(RngF32 rng, F32 val) -{ - F32 out = fmaxf(rng.min, val); - out = fminf(val, rng.max); - return out; -} - -__device__ function Vec3F32 -clamp_V3F32(RngF32 rng, Vec3F32 v) -{ - Vec3F32 out = {0}; - out.x = clamp_F32(rng, v.x); - out.y = clamp_F32(rng, v.y); - out.z = clamp_F32(rng, v.z); - return out; -} - -__device__ function HitRecord -hit_sphere(Vec3F32 center, F32 radius, RayF32 ray, RngF32 range) -{ - HitRecord out = {0}; - // We take the quadratic formula -b/2a +- sqrt(b*b-4ac) / 2a, - // and we calculate only the sqrt part. If there is a hit with the sphere we either - // have two solutions (positive sqrt), one solution (zero sqrt) - // or no solution (negative sqrt). - // If we have no solution we have no hit on - // the sphere centered at center, with the given radius. - - // Note that we can simplify this, since we always get b = -2(D . (C-Q)), and if - // we say b = -2h in the quadradic formula, we get - // -(-2h)/2a +- sqrt((-2h)**2 - 4ac) / 2a which expands to - // 2h/2a +- 2sqrt(h*h - ac)/2a, simplifying to (h +- sqrt(h*h - ac))/a. - // So we use this simplification to optimise away some operations - - // Compare lines with RTIOW - // (C-Q) - Vec3F32 oc = sub_V3F32(center, ray.origin); - // a = D.D - F32 a = dot_V3F32(ray.direction, ray.direction); - // h = D . (C-Q) - F32 h = dot_V3F32(ray.direction, oc); - // c = (C-Q) . (C-Q) - r*r - F32 c = dot_V3F32(oc, oc) - radius*radius; - - F32 discriminant = h*h - a*c; - - // We are actually solving for the parameter t in the expression of a point P(t) that - // intersects the sphere. This is the quadratic problem we get by solving for t in - // (C - P(t)) . (C - P(t)) = r*r, r being the radius and P(t) = tD+Q, - // where D is the direction of the ray and Q the origin of the ray. - F32 hit_true = 0.0f; - - // Branching version - // TODO(anton): Maybe try to make a branchless version - F32 root = 0.0f; - if(discriminant < 0.0f) - { - hit_true = 0.0f; - } - else - { - // t = (h += sqrt(h*h-ac))/a, and here we take the smallest solution to get the point - // on the sphere closest to the ray origin. - F32 sqrtd = __fsqrt_rn(discriminant); - root = (h - sqrtd)/a; - if(!surrounds_RngF32(range, root)) - { - root = (h + sqrtd)/a; - if(!surrounds_RngF32(range, root)) - { - hit_true = 0.0f; - } - else - { - hit_true = 1.0f; - } - } - else - { - hit_true = 1.0f; - } - } - - out.hit = hit_true; - out.t = root; - - // t is the parameter of the (closest) sphere-ray intersection point P(t) = tD+Q, - // where Q is the ray origin and D the ray direction. - out.point = ray_point_F32(out.t, ray); // intersection point - Vec3F32 N = sub_V3F32(out.point, center); - N = scale_V3F32(1.0f/radius, N); - - F32 front_face = dot_V3F32(ray.direction, N) < 0.0f; - out.normal = front_face ? N : scale_V3F32(-1.0f, N); - out.front_face = front_face; - - return out; -} - -__device__ function RayF32 -ray_get_F32(F32 x, F32 y, Vec3F32 cam_center, curandState *local_rand_state) -{ - - RayF32 out = {0}; - - // We have unit vectors delta_u and delta_v in the horizontal and vertical viewport directions. - Vec3F32 px_u = scale_V3F32(x, viewport.pixel_delta_u); - Vec3F32 px_v = scale_V3F32(y, viewport.pixel_delta_v); - Vec3F32 pixel_center = add_V3F32(viewport.pixel_origin, add_V3F32(px_u, px_v)); - - // To get anti-aliasing we make a random offset from the pixel center - F32 rand_u = curand_uniform(local_rand_state) - 0.5f; - F32 rand_v = curand_uniform(local_rand_state) - 0.5f; - // the rand u and rand v are offsets from a pixel in the [-0.5, 0.5] square. - // We need to put that into the world space of our viewport - Vec3F32 offset_u = scale_V3F32(rand_u, viewport.pixel_delta_u); - Vec3F32 offset_v = scale_V3F32(rand_v, viewport.pixel_delta_v); - - // Then we shift the pixel center with the offsets in both directions - Vec3F32 pixel_sample = add_V3F32(pixel_center, add_V3F32(offset_u, offset_v)); - // With a randomised point around the pixel center we can define the ray direction - // as the vector from the camera center to the point on the viewport. - Vec3F32 ray_direction = sub_V3F32(pixel_sample, camera.center); - - out.origin = camera.center; - out.direction = ray_direction; - return out; -} - -// Trace a ray and get a pixel color sample -__device__ function Vec3F32 -get_sample_color(RayF32 ray, Entity *entities, curandState *local_rand_state) -{ - - RayF32 current_ray = ray; - Vec3F32 out = {0}; - - F32 current_attenuation = 1.0f; - F32 attenuation_factor = 0.5f; - Vec3F32 sample_pixel_color = vec3F32(0.0f, 0.0f, 0.0f); - for(U32 bounce_idx = 0; - bounce_idx < MAX_DIFFUSE_DEPTH; - bounce_idx += 1) - { - - RngF32 hit_range = {0.001f, F32_MAX}; - HitRecord hit_rec = {0}; - for(U32 entity_idx = 0; entity_idx < MAX_NUM_ENTITIES; entity_idx += 1) - { - Entity *entity = &entities[entity_idx]; - switch(entity->kind) - { - case EntityKind_Nil: - { - // no op - } break; - - case EntityKind_Sphere: - { - HitRecord temp_hit_rec = hit_sphere(entity->center, entity->radius, - current_ray, hit_range); - if(temp_hit_rec.hit) - { - hit_rec = temp_hit_rec; - hit_range.max = hit_rec.t; - } - - } break; - } // end switch entity kind - - } - - if(hit_rec.hit) - { - // "Paint entity" - // For a diffuse color we actually just update the attenuation here and - // bounce rays around... Then when we are not hitting anything anymore we will sample - // the background gradient and use the computed attenuation. Since the rays are - // bouncing diffusely this will shade nicely. - Vec3F32 rand_dir = rand_unit_vector_on_hemisphere_F32(local_rand_state, hit_rec.normal); - current_attenuation = current_attenuation * attenuation_factor; - - current_ray.origin = hit_rec.point; - current_ray.direction = rand_dir; - //sample_pixel_color = add_V3F32(hit_rec.normal, vec3F32(1.0f, 1.0f, 1.0f)); - //sample_pixel_color = scale_V3F32(0.5f, sample_pixel_color); - // debug - //sample_pixel_color = vec3F32(1.0f, 0.0f, 0.0f); - } - else - { - // Paint background gradient - F32 norm = norm_V3F32(ray.direction); - Vec3F32 unit_dir = scale_V3F32(1.0f/norm, ray.direction); - Vec3F32 white = vec3F32(1.0f, 1.0f, 1.0f); - Vec3F32 light_blue = vec3F32(0.5f, 0.7f, 1.0f); - - // Lerp between white and light blue depending on y position - F32 blend = 0.5f*(unit_dir.y + 1.0f); - - sample_pixel_color = lerp_V3F32(blend, white, light_blue); - // Scale by the current attenuation for diffuse shading using background color - sample_pixel_color = scale_V3F32(current_attenuation, sample_pixel_color); - break; - } - - } - - out = sample_pixel_color; - return out; -} - - __global__ void +__global__ void cuda_main(Entity *entities, Vec3F32 *pixelbuffer, curandState *rand_state) { @@ -582,44 +46,12 @@ cuda_main(Entity *entities, Vec3F32 *pixelbuffer, curandState *rand_state) // we initialise the color for this pixel to black. // Loop over all pixel samples Vec3F32 pixel_color = vec3F32(0.0f, 0.0f, 0.0f); - for(U32 sample_idx = 0; sample_idx < SAMPLES_PER_PIXEL; sample_idx += 1) - { - - // TODO(anton): Maybe we can randomise things directly here as the - // nvidia accelerated version, where we just put the x, y indices with a - // randomised shift and normalise to viewport space by dividing by max x, max y - RayF32 ray = ray_get_F32((F32)x, (F32)y, camera.center, &local_rand_state); - - Vec3F32 sample_pixel_color = get_sample_color(ray, entities, &local_rand_state); - - F32 debug_sample = curand_uniform(&rand_state[idx]); - Vec3F32 debug = vec3F32(debug_sample, debug_sample, debug_sample); - //pixel_color = add_V3F32(pixel_color, debug); - pixel_color = add_V3F32(pixel_color, sample_pixel_color); - } - - pixel_color = scale_V3F32(1.0f/(F32)SAMPLES_PER_PIXEL, pixel_color); - RngF32 clamp_range = {0.0f, 1.0f}; - //pixel_color = clamp_V3F32(clamp_range, pixel_color); + pixelbuffer[idx] = pixel_color; } } -__global__ void cuda_init_state(curandState *rand_state) -{ - - U32 x = threadIdx.x + blockIdx.x * blockDim.x; - U32 y = threadIdx.y + blockIdx.y * blockDim.y; - - if(x < image.width && y < image.height) - { - U32 idx = y * image.width + x; - curand_init(CURAND_SEED, idx, 0, &rand_state[idx]); - } - -} - //------------------------------------------------------------------------------------------ //~ Main int main() @@ -630,7 +62,7 @@ int main() // Define image, camera and viewport on the CPU // and then copy to constant globals on device // ------------- - ImageF32 h_image = {0}; + h_image = {0}; h_image.width = IMAGE_WIDTH; h_image.aspect_ratio = ASPECT_RATIO; U32 height = U32((F32)h_image.width/h_image.aspect_ratio) + 1; @@ -642,7 +74,7 @@ int main() h_image.width, h_image.height, h_image.aspect_ratio); // ------------- - CameraF32 h_camera = {0}; + h_camera = {0}; h_camera.focal_length = 1.0f; F32 samples_per_pixel = (F32)SAMPLES_PER_PIXEL; h_camera.pixel_sample_scale = 1.0f/samples_per_pixel; @@ -652,7 +84,7 @@ int main() CUDA_CHECK(cuErr); // ------------- - ViewportF32 h_viewport = {0}; + h_viewport = {0}; h_viewport.height = 2.0f; h_viewport.width = h_viewport.height * ((F32)h_image.width/(F32)h_image.height); h_viewport.aspect_ratio = h_viewport.width/h_viewport.height; @@ -685,14 +117,13 @@ int main() ////////////////////////////////////////////////////////////////////////////////////////// // Setup entities and copy to device - U64 entity_list_size = sizeof(Entity)*MAX_NUM_ENTITIES; - Entity *h_entities = (Entity *)malloc(entity_list_size); + U64 entity_list_byte_size = sizeof(Entity)*MAX_NUM_ENTITIES; + Entity *h_entities = (Entity *)malloc(entity_list_byte_size); + memset(h_entities, 0, entity_list_byte_size); for(U32 i = 0; i < MAX_NUM_ENTITIES; i += 1) { // Init all entities to nil - //h_entities[i] = {0}; - //h_entities[i].kind = EntityKind_Nil; - h_entities[i] = nil_entity; + h_entities[i].kind = EntityKind_Nil; } // Manual spheres @@ -708,9 +139,9 @@ int main() // Copy to device Entity *entities = 0; - cuErr = cudaMalloc(&entities, entity_list_size); + cuErr = cudaMalloc(&entities, entity_list_byte_size); CUDA_CHECK(cuErr); - cuErr = cudaMemcpy(entities, h_entities, entity_list_size, cudaMemcpyHostToDevice); + cuErr = cudaMemcpy(entities, h_entities, entity_list_byte_size, cudaMemcpyHostToDevice); CUDA_CHECK(cuErr); diff --git a/src/rayt_core.c b/src/rayt_core.c new file mode 100644 index 0000000..0085b8d --- /dev/null +++ b/src/rayt_core.c @@ -0,0 +1,150 @@ +//~ device globals +__constant__ CameraF32 camera; +__constant__ ViewportF32 viewport; +__constant__ ImageF32 image; + + +__host__ function void +write_buffer_to_ppm(Vec3F32 *buffer, + U32 image_width, + U32 image_height) +{ + + const char *filename = "output.ppm"; + FILE *file = fopen(filename, "w"); + if(!file) + { + LOG("Error opening file %s \n", filename); + } + + // Write PPM header. First it has "P3" by itself to indicate ASCII colors, + fprintf(file, "P3\n"); + // The row below will say the dimensions of the image: + // (width, height) <-> (num columns, num rows) + fprintf(file, "%i %i\n", image_width, image_height); + // Then we have a value for the maximum pixel color + fprintf(file, "255\n"); + // Then we have all the lines with pixel data, + // it will be three values for each column j on a row i, + // corresponding to a pixel with index (i,j). + for(U32 i = 0; i < image_height; i += 1) + { + for(U32 j = 0; j < image_width; j +=1) + { + // We represent RGB values by floats internally and scale to integer values + U32 idx = i * image_width + j; + + F32 r = buffer[idx].r; + F32 g = buffer[idx].g; + F32 b = buffer[idx].b; + + r = linear_to_gamma(r); + g = linear_to_gamma(g); + b = linear_to_gamma(b); + + U32 ir = int(255.999f * r); + U32 ig = int(255.999f * g); + U32 ib = int(255.999f * b); + + fprintf(file, "%i %i %i ", ir, ig, ib); + } + fprintf(file, "\n"); + + + } + + fclose(file); +} + +__device__ function RayF32 +ray_get_F32(F32 x, F32 y, Vec3F32 cam_center, curandState *local_rand_state) +{ + + RayF32 out = {0}; + + // We have unit vectors delta_u and delta_v in the horizontal and vertical viewport directions. + Vec3F32 px_u = scale_V3F32(x, viewport.pixel_delta_u); + Vec3F32 px_v = scale_V3F32(y, viewport.pixel_delta_v); + Vec3F32 pixel_center = add_V3F32(viewport.pixel_origin, add_V3F32(px_u, px_v)); + + // To get anti-aliasing we make a random offset from the pixel center + F32 rand_u = curand_uniform(local_rand_state) - 0.5f; + F32 rand_v = curand_uniform(local_rand_state) - 0.5f; + // the rand u and rand v are offsets from a pixel in the [-0.5, 0.5] square. + // We need to put that into the world space of our viewport + Vec3F32 offset_u = scale_V3F32(rand_u, viewport.pixel_delta_u); + Vec3F32 offset_v = scale_V3F32(rand_v, viewport.pixel_delta_v); + + // Then we shift the pixel center with the offsets in both directions + Vec3F32 pixel_sample = add_V3F32(pixel_center, add_V3F32(offset_u, offset_v)); + // With a randomised point around the pixel center we can define the ray direction + // as the vector from the camera center to the point on the viewport. + Vec3F32 ray_direction = sub_V3F32(pixel_sample, camera.center); + + out.origin = camera.center; + out.direction = ray_direction; + return out; +} + +// Trace a ray and get a pixel color sample +__device__ function Vec3F32 +get_sample_color(RayF32 ray, Entity *entities, curandState *local_rand_state) +{ + + RayF32 current_ray = ray; + Vec3F32 out = {0}; + + F32 current_attenuation = 1.0f; + F32 attenuation_factor = 0.5f; + Vec3F32 sample_pixel_color = vec3F32(0.0f, 0.0f, 0.0f); + for(U32 bounce_idx = 0; + bounce_idx < MAX_DIFFUSE_DEPTH; + bounce_idx += 1) + { + + RngF32 hit_range = {0.001f, F32_MAX}; + HitRecord hit_rec = {0}; + + + if(hit_rec.hit) + { + + } + else + { + // Paint background gradient + F32 norm = norm_V3F32(ray.direction); + Vec3F32 unit_dir = scale_V3F32(1.0f/norm, ray.direction); + Vec3F32 white = vec3F32(1.0f, 1.0f, 1.0f); + Vec3F32 light_blue = vec3F32(0.5f, 0.7f, 1.0f); + + // Lerp between white and light blue depending on y position + F32 blend = 0.5f*(unit_dir.y + 1.0f); + + sample_pixel_color = lerp_V3F32(blend, white, light_blue); + // Scale by the current attenuation for diffuse shading using background color + sample_pixel_color = scale_V3F32(current_attenuation, sample_pixel_color); + break; + } + + } + + out = sample_pixel_color; + return out; +} + + +__global__ void +cuda_init_state(curandState *rand_state) +{ + + U32 x = threadIdx.x + blockIdx.x * blockDim.x; + U32 y = threadIdx.y + blockIdx.y * blockDim.y; + + if(x < image.width && y < image.height) + { + U32 idx = y * image.width + x; + curand_init(CURAND_SEED, idx, 0, &rand_state[idx]); + } + +} diff --git a/src/rayt_core.h b/src/rayt_core.h new file mode 100644 index 0000000..2ad3b9d --- /dev/null +++ b/src/rayt_core.h @@ -0,0 +1,67 @@ +#pragma once + + + +typedef struct ViewportF32 ViewportF32; +struct ViewportF32 +{ + F32 width; + F32 height; + F32 aspect_ratio; + Vec3F32 u; // along horizontal edge, right from top left corner + Vec3F32 v; // along vertical edge, down from top left corner + Vec3F32 upper_left; + Vec3F32 pixel_origin; + Vec3F32 pixel_delta_u; + Vec3F32 pixel_delta_v; +}; + +typedef struct CameraF32 CameraF32; +struct CameraF32 +{ + Vec3F32 center; + Vec3F32 up; + F32 focal_length; + F32 pixel_sample_scale; +}; + +typedef struct ImageF32 ImageF32; +struct ImageF32 +{ + U32 width; + U32 height; + F32 aspect_ratio; + U32 total_num_pixels; +}; + +enum EntityKind +{ + EntityKind_Nil, + EntityKind_Sphere, + Num_EntityKinds +}; + +typedef struct HitRecord HitRecord; +struct HitRecord +{ + Vec3F32 point; + Vec3F32 normal; + F32 t; // Root parameter for hit sphere + F32 hit; // Hit true or false + F32 front_face; +}; + +typedef struct Entity Entity; +struct Entity +{ + EntityKind kind; + Vec3F32 center; + F32 radius; +}; + + + +__host__ function void write_buffer_to_ppm(Vec3F32 *buffer, U32 image_width, U32 image_height); + +__device__ function RayF32 ray_get_F32(F32 x, F32 y, Vec3F32 cam_center, curandState *local_rand_state); +__global__ void cuda_init_state(curandState *rand_state); \ No newline at end of file diff --git a/timeBuild.ctm b/timeBuild.ctm index 619dfc0..57cf5e3 100644 Binary files a/timeBuild.ctm and b/timeBuild.ctm differ