rustic-zen 0.3.0

Photon-Garden raytracer for creating artistic renderings
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

/*
 * Lookup table for converting a wavelength, in nm, to a linear
 * color in sRGB. Generated by a snippet of python using colorpy:
 *
from colorpy.ciexyz import _CIEXYZ_1931_table as table
from colorpy.colormodels import srgb_rgb_from_xyz_matrix as xyz2rgb
for (nm, x, y, z) in table:
    r, g, b = map(int, 8192.0 * xyz2rgb.dot([x, y, z]))
    print "    (%6d, %6d, %6d,),  // %d nm" % (r, g, b, nm)
 *
 */

pub const FIRST_WAVELENGTH: f64 = 360.0;
pub const LAST_WAVELENGTH: f64 = 780.0;

pub const WAVELENGTH_TO_RGB: [(i16, i16, i16); 421] = [
    (0, 0, 5),             // 360 nm
    (1, 0, 5),             // 361 nm
    (1, 0, 6),             // 362 nm
    (1, -1, 7),            // 363 nm
    (1, -1, 8),            // 364 nm
    (1, -1, 9),            // 365 nm
    (1, -1, 10),           // 366 nm
    (2, -1, 12),           // 367 nm
    (2, -1, 13),           // 368 nm
    (2, -2, 15),           // 369 nm
    (2, -2, 17),           // 370 nm
    (3, -2, 19),           // 371 nm
    (3, -3, 21),           // 372 nm
    (4, -3, 23),           // 373 nm
    (4, -3, 26),           // 374 nm
    (5, -4, 30),           // 375 nm
    (5, -4, 34),           // 376 nm
    (6, -5, 39),           // 377 nm
    (7, -6, 45),           // 378 nm
    (8, -7, 50),           // 379 nm
    (9, -8, 56),           // 380 nm
    (10, -8, 61),          // 381 nm
    (11, -9, 67),          // 382 nm
    (12, -10, 74),         // 383 nm
    (13, -11, 82),         // 384 nm
    (15, -13, 92),         // 385 nm
    (17, -14, 104),        // 386 nm
    (19, -17, 119),        // 387 nm
    (22, -19, 136),        // 388 nm
    (25, -22, 155),        // 389 nm
    (29, -25, 175),        // 390 nm
    (32, -28, 196),        // 391 nm
    (36, -31, 220),        // 392 nm
    (41, -35, 247),        // 393 nm
    (46, -39, 278),        // 394 nm
    (52, -45, 316),        // 395 nm
    (59, -51, 362),        // 396 nm
    (68, -59, 415),        // 397 nm
    (78, -67, 473),        // 398 nm
    (88, -75, 533),        // 399 nm
    (97, -84, 593),        // 400 nm
    (107, -92, 651),       // 401 nm
    (116, -101, 711),      // 402 nm
    (127, -110, 779),      // 403 nm
    (141, -122, 861),      // 404 nm
    (157, -136, 963),      // 405 nm
    (177, -154, 1089),     // 406 nm
    (201, -175, 1239),     // 407 nm
    (228, -199, 1410),     // 408 nm
    (259, -226, 1602),     // 409 nm
    (292, -256, 1813),     // 410 nm
    (329, -288, 2043),     // 411 nm
    (368, -323, 2296),     // 412 nm
    (412, -363, 2577),     // 413 nm
    (462, -407, 2892),     // 414 nm
    (517, -456, 3246),     // 415 nm
    (577, -510, 3639),     // 416 nm
    (644, -570, 4070),     // 417 nm
    (716, -635, 4544),     // 418 nm
    (794, -707, 5067),     // 419 nm
    (880, -785, 5644),     // 420 nm
    (973, -871, 6281),     // 421 nm
    (1072, -962, 6965),    // 422 nm
    (1172, -1056, 7674),   // 423 nm
    (1271, -1149, 8387),   // 424 nm
    (1366, -1238, 9082),   // 425 nm
    (1453, -1323, 9749),   // 426 nm
    (1534, -1402, 10387),  // 427 nm
    (1608, -1475, 10995),  // 428 nm
    (1674, -1542, 11569),  // 429 nm
    (1732, -1603, 12107),  // 430 nm
    (1779, -1656, 12605),  // 431 nm
    (1818, -1702, 13059),  // 432 nm
    (1847, -1740, 13472),  // 433 nm
    (1868, -1772, 13843),  // 434 nm
    (1880, -1796, 14174),  // 435 nm
    (1884, -1813, 14464),  // 436 nm
    (1880, -1823, 14715),  // 437 nm
    (1868, -1827, 14927),  // 438 nm
    (1848, -1824, 15104),  // 439 nm
    (1821, -1816, 15247),  // 440 nm
    (1787, -1802, 15358),  // 441 nm
    (1745, -1783, 15439),  // 442 nm
    (1698, -1759, 15494),  // 443 nm
    (1644, -1730, 15528),  // 444 nm
    (1584, -1698, 15544),  // 445 nm
    (1519, -1661, 15544),  // 446 nm
    (1448, -1620, 15529),  // 447 nm
    (1373, -1576, 15503),  // 448 nm
    (1293, -1530, 15471),  // 449 nm
    (1209, -1481, 15434),  // 450 nm
    (1122, -1430, 15396),  // 451 nm
    (1031, -1377, 15355),  // 452 nm
    (936, -1321, 15306),   // 453 nm
    (837, -1261, 15244),   // 454 nm
    (733, -1198, 15167),   // 455 nm
    (623, -1130, 15069),   // 456 nm
    (509, -1058, 14953),   // 457 nm
    (392, -981, 14817),    // 458 nm
    (270, -901, 14662),    // 459 nm
    (147, -817, 14485),    // 460 nm
    (21, -731, 14290),     // 461 nm
    (-105, -640, 14073),   // 462 nm
    (-236, -545, 13828),   // 463 nm
    (-369, -444, 13547),   // 464 nm
    (-505, -337, 13222),   // 465 nm
    (-645, -222, 12849),   // 466 nm
    (-788, -100, 12435),   // 467 nm
    (-931, 25, 11994),     // 468 nm
    (-1075, 154, 11540),   // 469 nm
    (-1218, 285, 11086),   // 470 nm
    (-1358, 417, 10640),   // 471 nm
    (-1497, 550, 10198),   // 472 nm
    (-1633, 684, 9761),    // 473 nm
    (-1768, 820, 9328),    // 474 nm
    (-1901, 957, 8898),    // 475 nm
    (-2031, 1095, 8472),   // 476 nm
    (-2160, 1234, 8053),   // 477 nm
    (-2286, 1374, 7643),   // 478 nm
    (-2410, 1514, 7241),   // 479 nm
    (-2532, 1654, 6850),   // 480 nm
    (-2651, 1792, 6469),   // 481 nm
    (-2768, 1931, 6100),   // 482 nm
    (-2884, 2070, 5745),   // 483 nm
    (-2998, 2210, 5404),   // 484 nm
    (-3110, 2351, 5079),   // 485 nm
    (-3221, 2495, 4771),   // 486 nm
    (-3331, 2641, 4480),   // 487 nm
    (-3441, 2790, 4204),   // 488 nm
    (-3554, 2943, 3943),   // 489 nm
    (-3670, 3101, 3694),   // 490 nm
    (-3790, 3265, 3459),   // 491 nm
    (-3914, 3434, 3235),   // 492 nm
    (-4042, 3610, 3024),   // 493 nm
    (-4174, 3791, 2823),   // 494 nm
    (-4309, 3977, 2633),   // 495 nm
    (-4447, 4169, 2453),   // 496 nm
    (-4588, 4367, 2282),   // 497 nm
    (-4735, 4573, 2119),   // 498 nm
    (-4888, 4789, 1965),   // 499 nm
    (-5048, 5017, 1817),   // 500 nm
    (-5218, 5258, 1677),   // 501 nm
    (-5395, 5511, 1542),   // 502 nm
    (-5575, 5773, 1412),   // 503 nm
    (-5756, 6041, 1285),   // 504 nm
    (-5933, 6312, 1158),   // 505 nm
    (-6104, 6586, 1031),   // 506 nm
    (-6270, 6862, 905),    // 507 nm
    (-6430, 7141, 779),    // 508 nm
    (-6585, 7423, 655),    // 509 nm
    (-6734, 7710, 533),    // 510 nm
    (-6876, 8000, 413),    // 511 nm
    (-7010, 8291, 295),    // 512 nm
    (-7134, 8582, 180),    // 513 nm
    (-7245, 8871, 69),     // 514 nm
    (-7343, 9153, -35),    // 515 nm
    (-7426, 9430, -136),   // 516 nm
    (-7493, 9700, -231),   // 517 nm
    (-7542, 9959, -320),   // 518 nm
    (-7572, 10205, -403),  // 519 nm
    (-7581, 10435, -480),  // 520 nm
    (-7568, 10647, -550),  // 521 nm
    (-7532, 10840, -614),  // 522 nm
    (-7477, 11019, -673),  // 523 nm
    (-7404, 11185, -728),  // 524 nm
    (-7313, 11339, -779),  // 525 nm
    (-7207, 11483, -829),  // 526 nm
    (-7084, 11616, -875),  // 527 nm
    (-6947, 11738, -919),  // 528 nm
    (-6797, 11848, -960),  // 529 nm
    (-6634, 11947, -1000), // 530 nm
    (-6460, 12034, -1037), // 531 nm
    (-6274, 12111, -1072), // 532 nm
    (-6077, 12176, -1106), // 533 nm
    (-5869, 12231, -1138), // 534 nm
    (-5650, 12277, -1167), // 535 nm
    (-5419, 12313, -1195), // 536 nm
    (-5178, 12339, -1220), // 537 nm
    (-4925, 12357, -1244), // 538 nm
    (-4662, 12364, -1266), // 539 nm
    (-4387, 12362, -1286), // 540 nm
    (-4101, 12350, -1304), // 541 nm
    (-3805, 12330, -1320), // 542 nm
    (-3497, 12300, -1334), // 543 nm
    (-3179, 12261, -1347), // 544 nm
    (-2850, 12214, -1358), // 545 nm
    (-2512, 12157, -1367), // 546 nm
    (-2163, 12093, -1375), // 547 nm
    (-1804, 12020, -1381), // 548 nm
    (-1436, 11939, -1386), // 549 nm
    (-1058, 11852, -1389), // 550 nm
    (-670, 11757, -1391),  // 551 nm
    (-272, 11654, -1392),  // 552 nm
    (134, 11545, -1392),   // 553 nm
    (551, 11428, -1390),   // 554 nm
    (977, 11304, -1388),   // 555 nm
    (1412, 11173, -1384),  // 556 nm
    (1856, 11034, -1379),  // 557 nm
    (2308, 10888, -1373),  // 558 nm
    (2768, 10734, -1366),  // 559 nm
    (3236, 10572, -1358),  // 560 nm
    (3712, 10402, -1349),  // 561 nm
    (4193, 10225, -1338),  // 562 nm
    (4682, 10041, -1327),  // 563 nm
    (5176, 9851, -1315),   // 564 nm
    (5675, 9653, -1302),   // 565 nm
    (6180, 9450, -1288),   // 566 nm
    (6689, 9241, -1274),   // 567 nm
    (7201, 9026, -1258),   // 568 nm
    (7717, 8806, -1242),   // 569 nm
    (8235, 8580, -1225),   // 570 nm
    (8754, 8349, -1207),   // 571 nm
    (9275, 8113, -1189),   // 572 nm
    (9795, 7872, -1170),   // 573 nm
    (10314, 7627, -1150),  // 574 nm
    (10832, 7379, -1130),  // 575 nm
    (11347, 7127, -1109),  // 576 nm
    (11860, 6873, -1088),  // 577 nm
    (12367, 6616, -1066),  // 578 nm
    (12869, 6357, -1044),  // 579 nm
    (13364, 6095, -1022),  // 580 nm
    (13850, 5832, -999),   // 581 nm
    (14327, 5568, -976),   // 582 nm
    (14794, 5304, -953),   // 583 nm
    (15251, 5039, -929),   // 584 nm
    (15695, 4775, -906),   // 585 nm
    (16127, 4513, -882),   // 586 nm
    (16544, 4252, -859),   // 587 nm
    (16948, 3994, -835),   // 588 nm
    (17336, 3738, -811),   // 589 nm
    (17710, 3485, -788),   // 590 nm
    (18068, 3236, -764),   // 591 nm
    (18409, 2991, -740),   // 592 nm
    (18730, 2751, -717),   // 593 nm
    (19028, 2517, -694),   // 594 nm
    (19299, 2289, -671),   // 595 nm
    (19541, 2070, -649),   // 596 nm
    (19755, 1858, -627),   // 597 nm
    (19943, 1653, -605),   // 598 nm
    (20108, 1455, -584),   // 599 nm
    (20251, 1264, -563),   // 600 nm
    (20374, 1078, -543),   // 601 nm
    (20475, 899, -523),    // 602 nm
    (20551, 727, -503),    // 603 nm
    (20600, 563, -484),    // 604 nm
    (20620, 409, -465),    // 605 nm
    (20607, 263, -447),    // 606 nm
    (20565, 127, -430),    // 607 nm
    (20496, 0, -413),      // 608 nm
    (20401, -118, -396),   // 609 nm
    (20282, -230, -380),   // 610 nm
    (20142, -333, -365),   // 611 nm
    (19979, -429, -350),   // 612 nm
    (19794, -516, -335),   // 613 nm
    (19587, -597, -321),   // 614 nm
    (19357, -670, -307),   // 615 nm
    (19106, -735, -294),   // 616 nm
    (18834, -794, -281),   // 617 nm
    (18541, -845, -269),   // 618 nm
    (18225, -890, -257),   // 619 nm
    (17886, -928, -245),   // 620 nm
    (17524, -960, -234),   // 621 nm
    (17142, -986, -223),   // 622 nm
    (16743, -1006, -213),  // 623 nm
    (16330, -1022, -203),  // 624 nm
    (15906, -1032, -193),  // 625 nm
    (15474, -1038, -183),  // 626 nm
    (15035, -1040, -174),  // 627 nm
    (14593, -1039, -166),  // 628 nm
    (14152, -1034, -157),  // 629 nm
    (13718, -1027, -149),  // 630 nm
    (13292, -1019, -142),  // 631 nm
    (12875, -1009, -135),  // 632 nm
    (12464, -997, -128),   // 633 nm
    (12058, -983, -121),   // 634 nm
    (11654, -967, -115),   // 635 nm
    (11253, -950, -109),   // 636 nm
    (10855, -931, -103),   // 637 nm
    (10462, -910, -98),    // 638 nm
    (10073, -889, -93),    // 639 nm
    (9687, -866, -88),     // 640 nm
    (9306, -843, -83),     // 641 nm
    (8930, -818, -78),     // 642 nm
    (8560, -793, -74),     // 643 nm
    (8195, -767, -70),     // 644 nm
    (7838, -740, -66),     // 645 nm
    (7489, -713, -62),     // 646 nm
    (7147, -686, -59),     // 647 nm
    (6814, -659, -55),     // 648 nm
    (6491, -632, -52),     // 649 nm
    (6179, -606, -49),     // 650 nm
    (5878, -580, -46),     // 651 nm
    (5588, -555, -44),     // 652 nm
    (5309, -530, -41),     // 653 nm
    (5039, -506, -39),     // 654 nm
    (4778, -482, -36),     // 655 nm
    (4527, -459, -34),     // 656 nm
    (4284, -436, -32),     // 657 nm
    (4050, -414, -30),     // 658 nm
    (3826, -392, -28),     // 659 nm
    (3609, -371, -26),     // 660 nm
    (3402, -351, -25),     // 661 nm
    (3202, -331, -23),     // 662 nm
    (3012, -312, -22),     // 663 nm
    (2830, -294, -20),     // 664 nm
    (2656, -277, -19),     // 665 nm
    (2491, -260, -18),     // 666 nm
    (2334, -244, -16),     // 667 nm
    (2186, -229, -15),     // 668 nm
    (2047, -215, -14),     // 669 nm
    (1917, -202, -13),     // 670 nm
    (1797, -189, -12),     // 671 nm
    (1685, -178, -11),     // 672 nm
    (1582, -167, -11),     // 673 nm
    (1485, -157, -10),     // 674 nm
    (1396, -148, -9),      // 675 nm
    (1313, -139, -9),      // 676 nm
    (1236, -131, -8),      // 677 nm
    (1163, -124, -8),      // 678 nm
    (1094, -117, -7),      // 679 nm
    (1027, -110, -7),      // 680 nm
    (962, -103, -6),       // 681 nm
    (898, -96, -6),        // 682 nm
    (836, -90, -5),        // 683 nm
    (778, -83, -5),        // 684 nm
    (723, -78, -4),        // 685 nm
    (672, -72, -4),        // 686 nm
    (624, -67, -4),        // 687 nm
    (579, -62, -3),        // 688 nm
    (537, -58, -3),        // 689 nm
    (499, -54, -3),        // 690 nm
    (463, -50, -3),        // 691 nm
    (431, -46, -2),        // 692 nm
    (401, -43, -2),        // 693 nm
    (373, -40, -2),        // 694 nm
    (348, -37, -2),        // 695 nm
    (325, -35, -2),        // 696 nm
    (304, -33, -2),        // 697 nm
    (284, -30, -1),        // 698 nm
    (266, -28, -1),        // 699 nm
    (249, -27, -1),        // 700 nm
    (233, -25, -1),        // 701 nm
    (218, -23, -1),        // 702 nm
    (204, -22, -1),        // 703 nm
    (190, -20, -1),        // 704 nm
    (178, -19, -1),        // 705 nm
    (166, -18, -1),        // 706 nm
    (155, -16, -1),        // 707 nm
    (145, -15, 0),         // 708 nm
    (136, -14, 0),         // 709 nm
    (127, -13, 0),         // 710 nm
    (119, -12, 0),         // 711 nm
    (111, -12, 0),         // 712 nm
    (103, -11, 0),         // 713 nm
    (96, -10, 0),          // 714 nm
    (90, -9, 0),           // 715 nm
    (84, -9, 0),           // 716 nm
    (78, -8, 0),           // 717 nm
    (73, -7, 0),           // 718 nm
    (68, -7, 0),           // 719 nm
    (63, -6, 0),           // 720 nm
    (59, -6, 0),           // 721 nm
    (55, -6, 0),           // 722 nm
    (51, -5, 0),           // 723 nm
    (48, -5, 0),           // 724 nm
    (45, -4, 0),           // 725 nm
    (42, -4, 0),           // 726 nm
    (39, -4, 0),           // 727 nm
    (36, -3, 0),           // 728 nm
    (34, -3, 0),           // 729 nm
    (31, -3, 0),           // 730 nm
    (29, -3, 0),           // 731 nm
    (27, -2, 0),           // 732 nm
    (25, -2, 0),           // 733 nm
    (23, -2, 0),           // 734 nm
    (22, -2, 0),           // 735 nm
    (20, -2, 0),           // 736 nm
    (18, -2, 0),           // 737 nm
    (17, -1, 0),           // 738 nm
    (16, -1, 0),           // 739 nm
    (15, -1, 0),           // 740 nm
    (14, -1, 0),           // 741 nm
    (13, -1, 0),           // 742 nm
    (12, -1, 0),           // 743 nm
    (11, -1, 0),           // 744 nm
    (10, -1, 0),           // 745 nm
    (9, -1, 0),            // 746 nm
    (9, 0, 0),             // 747 nm
    (8, 0, 0),             // 748 nm
    (7, 0, 0),             // 749 nm
    (7, 0, 0),             // 750 nm
    (6, 0, 0),             // 751 nm
    (6, 0, 0),             // 752 nm
    (5, 0, 0),             // 753 nm
    (5, 0, 0),             // 754 nm
    (5, 0, 0),             // 755 nm
    (4, 0, 0),             // 756 nm
    (4, 0, 0),             // 757 nm
    (4, 0, 0),             // 758 nm
    (3, 0, 0),             // 759 nm
    (3, 0, 0),             // 760 nm
    (3, 0, 0),             // 761 nm
    (3, 0, 0),             // 762 nm
    (2, 0, 0),             // 763 nm
    (2, 0, 0),             // 764 nm
    (2, 0, 0),             // 765 nm
    (2, 0, 0),             // 766 nm
    (2, 0, 0),             // 767 nm
    (2, 0, 0),             // 768 nm
    (1, 0, 0),             // 769 nm
    (1, 0, 0),             // 770 nm
    (1, 0, 0),             // 771 nm
    (1, 0, 0),             // 772 nm
    (1, 0, 0),             // 773 nm
    (1, 0, 0),             // 774 nm
    (1, 0, 0),             // 775 nm
    (1, 0, 0),             // 776 nm
    (1, 0, 0),             // 777 nm
    (1, 0, 0),             // 778 nm
    (0, 0, 0),             // 779 nm
    (0, 0, 0),             // 780 nm
];