--- /dev/null
+# 991337.xyz
+
+A small [Three.js](https://threejs.org/) experiment.
+
+All fonts were sourced from [Font Library](https://fontlibrary.org/) and transformed to JSON using [gero3's typeface.js generator](https://gero3.github.io/facetype.js/).
--- /dev/null
+{"glyphs":{"1":{"ha":500,"x_min":0,"x_max":0,"o":"m 222 1056 l 333 1111 l 333 111 l 444 0 l 56 0 l 167 111 l 167 833 l 0 833 l 0 889 l 111 944 "},"3":{"ha":889,"x_min":0,"x_max":0,"o":"m 611 611 l 722 556 l 833 444 l 833 278 l 722 111 l 500 0 l 389 0 l 167 56 l 56 167 l 56 278 l 167 389 l 222 389 l 222 222 l 278 111 l 444 56 l 556 111 l 667 333 l 667 444 l 611 500 l 444 556 l 278 500 l 333 667 l 444 611 l 556 667 l 611 833 l 556 944 l 444 1000 l 333 1000 l 222 944 l 167 778 l 111 778 l 111 889 l 167 1000 l 222 1056 l 333 1111 l 500 1111 l 667 1056 l 778 889 l 722 722 "},"7":{"ha":778,"x_min":0,"x_max":0,"o":"m 444 444 l 389 0 l 167 0 l 278 389 l 389 611 l 556 889 l 667 1056 l 333 1056 l 222 1000 l 222 778 l 167 778 l 56 944 l 56 1111 l 778 1111 l 778 1056 l 667 889 l 500 611 "},"9":{"ha":889,"x_min":0,"x_max":0,"o":"m 667 556 l 556 444 l 389 389 l 167 500 l 56 722 l 167 1000 l 389 1111 l 556 1111 l 722 1000 l 833 833 l 833 500 l 722 222 l 556 56 l 278 0 l 111 56 l 111 167 l 222 333 l 278 333 l 278 56 l 500 111 l 611 278 m 611 611 l 667 722 l 667 778 l 611 889 l 500 1000 l 389 1000 l 278 889 l 222 778 l 222 722 l 278 611 l 389 500 l 500 500 "},".":{"ha":278,"x_min":0,"x_max":0,"o":"m 111 0 l 0 56 l 0 111 l 56 222 l 111 222 l 222 167 l 222 111 l 167 0 "},"x":{"ha":778,"x_min":0,"x_max":0,"o":"m 667 111 l 778 0 l 444 0 l 500 111 l 389 278 l 278 111 l 333 0 l 0 0 l 333 333 l 111 611 l 0 722 l 333 722 l 278 611 l 389 444 l 500 611 l 444 722 l 778 722 l 444 389 "},"y":{"ha":889,"x_min":0,"x_max":0,"o":"m 389 56 l 111 611 l 0 722 l 389 722 l 278 611 l 444 167 l 667 611 l 556 722 l 889 722 l 778 611 l 222 -444 l 111 -444 l 56 -389 "},"z":{"ha":778,"x_min":0,"x_max":0,"o":"m 556 56 l 667 222 l 722 222 l 667 0 l 56 0 l 56 56 l 500 667 l 278 667 l 167 500 l 111 500 l 167 778 l 222 722 l 722 722 l 222 111 "}},"familyName":"Avara","ascender":1167,"descender":-444,"underlinePosition":-194,"underlineThickness":56,"boundingBox":{"yMin":-500,"xMin":-56,"yMax":1556,"xMax":2108},"resolution":1000,"original_font_information":{"format":0,"copyright":"Created by Raphael Bastide with FontForge 2.0 (http://fontforge.sf.net). Edited by Wei Huang and Lucas Le Bihan","fontFamily":"Avara","fontSubfamily":"Bold","uniqueID":"PfEd: AvaraTwo: 2013","fullName":"Avara-Bold","version":"Version 001.000 ","postScriptName":"Avara-Bold","trademark":"Please refer to the Copyright section for the font trademark attribution notices."},"cssFontWeight":"bold","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":411,"x_min":0,"x_max":0,"o":"m 43 624 l 36 626 l 36 650 l 228 711 l 233 706 l 233 0 l 204 0 l 204 672 l 204 672 "},"3":{"ha":507,"x_min":0,"x_max":0,"o":"m 56 629 b 138 688 83 656 111 676 b 222 707 164 701 193 707 b 335 669 269 707 306 694 b 379 565 365 643 379 609 b 346 462 379 529 368 495 b 254 385 324 429 293 403 l 254 381 b 373 319 306 369 346 349 b 414 203 400 289 414 250 b 396 119 414 172 408 144 b 346 55 384 94 367 73 b 268 13 325 37 299 23 b 168 -3 238 2 204 -3 b 116 0 152 -3 135 -2 b 63 7 97 2 79 4 l 60 32 l 63 35 b 116 28 79 32 97 30 b 168 26 135 27 152 26 b 326 74 234 26 287 42 b 386 203 366 106 386 149 b 334 319 386 253 369 291 b 186 364 299 346 250 361 l 129 364 l 126 368 l 128 390 l 179 390 b 235 403 197 390 216 394 b 290 438 255 411 274 423 b 332 492 307 453 321 472 b 349 560 343 513 349 536 b 314 645 349 595 337 623 b 221 678 291 667 260 678 b 67 603 168 678 117 653 l 61 603 "},"7":{"ha":497,"x_min":0,"x_max":0,"o":"m 49 672 l 43 679 l 47 704 l 125 703 l 404 703 l 446 704 l 447 678 l 189 94 l 147 -11 l 121 -3 l 119 3 l 417 674 l 117 674 l 117 674 "},"9":{"ha":536,"x_min":0,"x_max":0,"o":"m 247 301 b 111 351 189 301 144 318 b 63 496 79 385 63 433 b 117 656 63 565 81 619 b 272 711 153 693 205 711 b 422 646 337 711 387 689 b 474 457 456 602 474 539 b 381 176 474 350 443 256 b 117 -6 320 97 231 36 l 111 -6 l 97 10 l 97 17 b 329 158 195 52 273 99 b 438 369 386 218 422 288 l 435 372 b 348 321 408 351 379 334 b 247 301 317 308 283 301 m 272 685 b 138 636 214 685 169 669 b 90 496 106 604 90 557 b 133 372 90 441 104 400 b 250 329 161 343 200 329 b 352 351 285 329 319 336 b 443 410 385 365 415 385 b 445 433 444 417 445 425 b 446 457 446 442 446 450 b 401 626 446 530 431 586 b 272 685 372 665 329 685 "},".":{"ha":319,"x_min":0,"x_max":0,"o":"m 160 53 b 188 25 178 53 188 44 b 160 -3 188 6 178 -3 b 132 25 141 -3 132 6 b 160 53 132 44 141 53 "},"x":{"ha":700,"x_min":0,"x_max":0,"o":"m 64 0 l 324 350 l 79 703 l 118 703 l 143 663 l 342 374 l 538 657 l 564 703 l 601 703 l 360 350 l 622 0 l 585 0 l 557 43 l 342 328 l 125 42 l 100 0 l 100 0 "},"y":{"ha":621,"x_min":0,"x_max":0,"o":"m 286 260 l 56 703 l 90 703 l 103 672 l 297 303 l 303 303 l 514 672 l 528 703 l 563 703 l 314 258 l 314 0 l 286 0 l 286 0 "},"z":{"ha":632,"x_min":0,"x_max":0,"o":"m 94 0 l 51 -1 l 51 22 l 504 675 l 144 675 l 76 674 l 72 679 l 76 704 l 153 703 l 499 703 l 542 704 l 542 678 l 89 26 l 460 26 l 539 28 l 544 22 l 540 0 l 540 0 "}},"familyName":"Datalegreya","ascender":1111,"descender":-278,"underlinePosition":-278,"underlineThickness":28,"boundingBox":{"yMin":-368,"xMin":-340,"yMax":1186,"xMax":1371},"resolution":1000,"original_font_information":{"format":0,"copyright":"Copyright (c) 2016 by Figs Lab","fontFamily":"Datalegreya","fontSubfamily":"Gradient","uniqueID":"FigsLab: Datalegreya Dot: 2016","fullName":"Datalegreya Gradient","version":"Version 1.002;PS 001.002;hotconv 1.0.70;makeotf.lib2.5.58329 DEVELOPMENT","postScriptName":"Datalegreya-Gradient","manufacturer":"Figs Lab","designer":"Figs Lab","manufacturerURL":"www.figs-lab.com","designerURL":"www.figs-lab.com","licence":"This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL","licenceURL":"http://scripts.sil.org/OFL","compatibleFullName":"Datalegreya Gradient"},"cssFontWeight":"normal","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":791,"x_min":0,"x_max":0,"o":"m 378 0 l 378 848 l 214 848 l 214 933 l 475 958 l 475 0 "},"3":{"ha":791,"x_min":0,"x_max":0,"o":"m 395 612 b 705 300 586 612 705 471 b 393 -14 705 123 558 -14 b 81 301 228 -14 81 123 l 178 301 b 393 78 178 174 262 78 b 608 301 524 78 608 174 b 387 522 608 435 511 522 b 267 486 343 522 302 510 l 203 550 l 452 852 l 131 852 l 131 945 l 639 945 l 365 611 b 395 612 376 612 385 612 "},"7":{"ha":791,"x_min":0,"x_max":0,"o":"m 66 945 l 729 945 l 313 0 l 208 0 l 583 852 l 66 852 "},"9":{"ha":791,"x_min":0,"x_max":0,"o":"m 397 958 b 715 645 570 958 715 823 b 619 416 715 568 692 503 l 275 0 l 155 0 l 437 339 b 391 336 421 337 406 336 b 79 642 210 336 79 469 b 397 958 79 825 222 958 m 394 428 b 618 645 513 428 618 522 b 395 867 618 774 513 867 b 176 649 269 867 176 770 b 394 428 176 528 271 428 "},"x":{"ha":586,"x_min":0,"x_max":0,"o":"m 17 0 l 231 307 l 17 611 l 129 611 l 293 370 l 457 611 l 570 611 l 355 306 l 570 0 l 457 0 l 293 244 l 129 0 "},"y":{"ha":599,"x_min":0,"x_max":0,"o":"m 486 611 l 593 611 l 171 -347 l 64 -347 l 261 89 l 3 611 l 111 611 l 310 201 "},"z":{"ha":640,"x_min":0,"x_max":0,"o":"m 20 0 l 418 521 l 41 521 l 41 611 l 603 611 l 204 90 l 616 90 l 616 0 "},".":{"ha":401,"x_min":0,"x_max":0,"o":"m 200 -14 b 144 9 179 -14 160 -7 b 119 64 127 25 119 43 b 143 119 119 85 127 104 b 200 143 158 135 178 143 b 258 121 222 143 241 136 b 282 65 273 106 282 86 b 257 9 282 43 273 25 b 200 -14 240 -7 221 -14 "}},"familyName":"Glacial Indifference","ascender":1292,"descender":-347,"underlinePosition":-51,"underlineThickness":34,"boundingBox":{"yMin":-350,"xMin":-932,"yMax":1310,"xMax":1389},"resolution":1000,"original_font_information":{"format":0,"copyright":"Copyright © 2020 by Alfredo Marco Pradil. All rights reserved.","fontFamily":"Glacial Indifference","fontSubfamily":"Regular","uniqueID":"1.310;HDCO;GlacialIndifference-Regular","fullName":"Glacial Indifference Regular","version":"Version 1.310;hotconv 1.0.109;makeotfexe 2.5.65596","postScriptName":"GlacialIndifference-Regular","manufacturer":"Alfredo Marco Pradil","designer":"Alfredo Marco Pradil","description":"Copyright 2019 Alfredo Marco Pradil (https://hanken.co/), with Reserved Font Name \"Glacial Indifference\".\n\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL","manufacturerURL":"https://hanken.co","designerURL":"https://www.behance.net/pradil","licence":"Copyright 2019 Alfredo Marco Pradil (https://hanken.co/), with Reserved Font Name \"Glacial Indifference\".\n\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL","licenceURL":"http://scripts.sil.org/OFL"},"cssFontWeight":"normal","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":574,"x_min":0,"x_max":0,"o":"m 135 738 b -4 589 79 701 19 632 l -10 590 b 40 789 14 635 40 724 l 40 897 b 24 940 40 908 31 936 l 26 946 b 72 956 33 942 63 949 l 350 1135 b 363 1150 353 1136 363 1147 l 368 1153 b 388 1146 368 1150 383 1146 l 429 1146 b 519 1179 457 1146 504 1164 l 524 1175 b 490 1085 508 1160 490 1113 l 490 69 b 526 -33 490 36 510 -15 l 524 -36 b 421 0 506 -19 454 0 l 299 0 b 196 -36 265 0 214 -19 l 193 -33 b 229 69 210 -15 229 36 l 229 686 b 274 886 229 751 250 843 l 279 885 b 135 738 256 840 190 774 "},"3":{"ha":924,"x_min":0,"x_max":0,"o":"m 285 815 b 318 801 281 792 303 810 l 315 797 b 219 847 300 804 242 836 l 79 915 b 458 1167 79 915 138 1167 b 835 833 676 1167 835 1028 b 764 646 835 756 808 693 b 711 611 751 632 724 614 l 710 617 b 765 596 724 619 751 607 b 879 356 836 542 879 461 b 454 -21 879 136 700 -21 b 24 261 110 -21 28 247 b -1 246 18 279 13 253 l -4 251 b 75 286 10 257 58 278 l 265 379 b 453 204 265 379 281 204 b 618 356 549 204 618 258 b 453 524 618 454 544 524 b 403 515 426 524 406 517 b 406 510 399 514 406 513 l 400 510 b 403 528 400 513 403 524 l 403 658 b 386 699 403 671 393 692 l 390 703 b 432 686 397 696 418 686 l 460 686 b 597 831 529 686 597 747 b 456 957 597 904 529 957 b 285 815 315 957 286 822 "},"7":{"ha":1063,"x_min":0,"x_max":0,"o":"m 950 1146 b 1006 1167 968 1146 996 1157 l 1010 1163 b 989 1108 1000 1153 989 1125 l 989 1092 b 997 1075 989 1085 993 1074 l 999 1069 b 969 1043 993 1068 972 1049 b 401 54 732 713 524 383 b 399 -25 394 35 392 -12 l 394 -28 b 333 0 386 -15 353 0 l 182 0 b 1 -50 124 0 39 -26 l -1 -44 b 117 94 36 -21 93 40 b 490 788 221 332 319 569 b 717 983 549 863 653 951 l 718 978 b 439 917 656 946 533 917 l 179 917 b 76 881 146 917 93 897 l 72 883 b 110 986 90 901 110 953 l 110 1076 b 72 1179 110 1110 90 1161 l 76 1182 b 179 1146 93 1165 146 1146 l 950 1146 "},"9":{"ha":957,"x_min":0,"x_max":0,"o":"m 303 0 b 28 -60 211 0 90 -31 l 25 -54 b 250 115 88 -26 190 46 l 489 393 b 407 376 489 393 460 376 b 42 778 250 376 42 511 b 467 1167 42 1049 260 1167 b 924 778 724 1167 924 997 b 743 321 924 576 863 483 l 494 25 b 482 -11 489 18 479 -6 l 476 -14 b 442 0 474 -7 450 0 l 303 0 m 653 778 b 479 951 653 878 581 951 b 303 778 378 951 303 878 b 479 600 303 675 381 600 b 653 778 575 600 653 675 "},".":{"ha":436,"x_min":0,"x_max":0,"o":"m 100 122 b 218 244 100 189 154 244 b 336 122 282 244 336 189 b 218 0 336 56 282 0 b 100 122 154 0 100 56 "},"x":{"ha":908,"x_min":0,"x_max":0,"o":"m 815 114 b 1029 -54 871 44 969 -26 l 1026 -60 b 763 0 967 -31 850 0 l 644 0 b 607 -15 635 0 610 -8 l 601 -12 b 590 26 606 -6 596 19 l 508 131 b 451 272 481 168 451 236 l 457 272 b 400 131 457 236 428 168 l 318 26 b 307 -12 313 19 303 -6 l 301 -15 b 264 0 299 -8 274 0 l 146 0 b -118 -60 58 0 -58 -31 l -121 -54 b 93 114 -61 -26 38 44 l 269 329 b 339 375 283 347 321 375 l 339 369 b 271 415 321 369 285 397 l 129 601 b -71 765 78 668 -15 738 l -69 771 b 183 713 -12 743 100 713 l 296 713 b 335 728 306 713 332 721 l 340 725 b 351 685 336 718 346 693 l 399 622 b 457 472 428 582 457 510 l 451 472 b 510 622 451 510 481 582 l 557 685 b 568 725 563 693 572 718 l 574 728 b 613 713 576 721 603 713 l 725 713 b 978 771 808 713 921 743 l 979 765 b 779 601 924 738 831 668 l 638 415 b 569 369 624 397 588 369 l 569 375 b 639 329 588 375 625 347 l 815 114 "},"y":{"ha":879,"x_min":0,"x_max":0,"o":"m 606 672 b 608 731 611 686 615 721 l 613 735 b 668 713 619 724 651 713 l 793 713 b 989 765 858 713 947 740 l 992 761 b 854 611 950 736 885 669 l 367 -324 b 361 -378 360 -336 356 -369 l 356 -381 b 306 -361 350 -372 319 -361 l 178 -361 b -18 -414 113 -361 24 -389 l -21 -410 b 117 -260 21 -385 86 -318 l 293 78 b 328 114 297 89 318 114 l 328 108 b 292 144 318 108 297 133 l 31 610 b -118 763 -3 668 -74 736 l -115 767 b 90 713 -71 740 22 713 l 214 713 b 264 732 228 713 258 724 l 268 729 b 275 676 264 721 268 689 l 389 468 b 461 224 428 396 458 286 l 456 224 b 513 472 453 286 478 397 l 606 672 "},"z":{"ha":779,"x_min":0,"x_max":0,"o":"m 642 713 b 872 769 718 713 822 742 l 875 764 b 700 604 824 738 742 668 l 492 296 b 319 131 450 232 369 158 l 317 136 b 550 188 368 163 474 188 l 675 188 b 778 224 708 188 760 207 l 781 221 b 744 118 764 203 744 151 l 744 69 b 781 -33 744 36 764 -15 l 778 -36 b 675 0 760 -19 708 0 l 138 0 b -93 -57 61 0 -43 -29 l -96 -51 b 79 108 -44 -25 38 44 l 288 417 b 460 582 329 481 410 554 l 463 576 b 229 525 411 550 306 525 l 135 525 b 32 489 101 525 50 506 l 29 492 b 65 594 46 510 65 561 l 65 643 b 29 746 65 676 46 728 l 32 749 b 135 713 50 732 101 713 l 642 713 "}},"familyName":"Hussar Szturm","ascender":1250,"descender":-486,"underlinePosition":-104,"underlineThickness":69,"boundingBox":{"yMin":-511,"xMin":-294,"yMax":1756,"xMax":2188},"resolution":1000,"original_font_information":{"format":0,"copyright":"(c) 2014-2015, Robert Jablonski/Cannot Into Space Fonts, all rights reserved.","fontFamily":"Hussar Szturm","fontSubfamily":"Bold","uniqueID":"Hussar Szturm v2.00","fullName":"Hussar Szturm","version":"Version 2.00","postScriptName":"HussarSzturm","manufacturer":"Cannot Into Space Fonts","manufacturerURL":"cannotintospacefonts.blogspot.com","licence":"Copyright (c) 2015, Robert Jablonski/Cannot Into Space Fonts (cannotintospacefonts@gmail.com),\nwith Reserved Font Name Hussar Szturm.\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.","licenceURL":"http://scripts.sil.org/OFL","preferredFamily":"Hussar","preferredSubfamily":"Szturm","sampleText":"Confused Cats Run Along on the abandoned Railroad Tracks, Drinking Tea and Wearing Hats."},"cssFontWeight":"bold","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":550,"x_min":0,"x_max":0,"o":"m 438 42 b 479 0 460 42 479 23 b 438 -42 479 -23 460 -42 l 275 -42 l 113 -42 b 71 0 90 -42 71 -23 b 113 42 71 23 90 42 l 233 42 l 233 683 l 50 683 b 13 706 33 683 20 692 b 17 750 5 721 7 737 l 242 1047 b 288 1062 253 1062 270 1068 b 317 1022 306 1056 317 1041 l 317 42 l 438 42 m 134 767 l 233 767 l 233 898 "},"3":{"ha":885,"x_min":0,"x_max":0,"o":"m 217 982 b 428 1065 274 1035 351 1065 b 450 1064 436 1065 443 1064 b 641 981 521 1059 589 1029 b 738 798 692 933 727 868 b 742 748 741 782 742 765 b 707 601 742 697 730 646 b 695 579 703 593 699 586 b 733 532 709 565 722 549 b 794 337 772 475 793 406 l 794 332 b 678 64 794 231 751 133 b 411 -42 606 -4 509 -42 b 402 -42 408 -42 404 -42 b 147 58 308 -39 218 -4 b 14 296 77 119 30 204 b 49 344 11 319 26 340 b 97 310 71 348 93 332 b 202 120 109 237 147 169 b 404 42 257 72 331 43 b 411 42 404 42 408 42 b 621 124 488 42 566 72 b 711 332 677 177 711 255 l 711 336 b 664 486 710 381 698 436 b 642 514 657 495 650 505 b 565 460 619 492 593 474 b 419 425 520 437 469 425 b 368 429 402 425 385 427 b 190 521 301 440 238 472 b 189 579 173 537 173 562 b 369 679 238 629 300 664 b 442 687 393 684 417 687 b 573 661 487 687 532 678 b 630 633 593 653 612 644 l 633 639 b 659 748 650 672 659 710 b 656 785 659 760 658 773 b 584 920 648 836 622 885 b 444 981 546 955 495 977 b 428 981 439 981 434 981 b 273 921 378 981 319 963 b 200 755 228 879 200 817 b 158 714 200 732 181 714 b 117 756 135 714 117 733 b 217 982 117 835 150 921 m 576 567 b 542 584 565 574 554 579 b 442 603 511 597 476 603 b 386 598 423 603 404 602 b 283 551 349 590 314 573 b 381 512 313 531 346 517 b 419 509 393 510 406 509 b 528 534 456 509 494 518 b 576 567 545 543 562 554 "},"7":{"ha":746,"x_min":0,"x_max":0,"o":"m 193 981 l 484 673 l 605 981 m 229 558 b 188 600 206 558 188 577 b 229 642 188 623 206 642 l 399 642 l 66 994 b 58 1039 54 1006 51 1023 b 96 1064 64 1055 78 1064 l 667 1064 b 701 1046 681 1064 693 1058 b 705 1007 709 1034 711 1020 l 301 -15 b 247 -39 293 -37 269 -47 b 224 15 226 -30 215 -6 l 438 558 "},"9":{"ha":811,"x_min":0,"x_max":0,"o":"m 658 689 b 364 981 658 850 527 981 b 69 689 201 981 69 850 b 364 397 69 528 201 397 b 658 689 527 397 658 528 m 364 314 b -14 689 156 314 -14 482 b 364 1064 -14 896 156 1064 b 742 696 570 1064 738 900 b 744 681 743 691 744 686 b 744 673 744 678 744 675 b 556 183 744 494 676 316 b 167 -41 454 70 316 -9 b 118 -9 145 -46 122 -31 b 150 41 113 14 127 36 b 494 239 281 69 404 139 b 597 394 536 285 571 338 b 364 314 533 344 452 314 "},".":{"ha":319,"x_min":0,"x_max":0,"o":"m 178 131 b 237 131 195 148 221 148 b 237 72 254 115 254 89 l 208 43 l 238 13 b 238 -46 254 -3 254 -30 b 179 -46 222 -62 195 -62 l 149 -16 l 119 -46 b 60 -46 103 -62 76 -62 b 60 13 44 -30 44 -3 l 90 43 l 60 72 b 60 131 44 89 44 115 b 119 131 77 148 103 148 l 149 102 l 178 131 "},"x":{"ha":1157,"x_min":0,"x_max":0,"o":"m 926 41 l 581 470 l 237 41 m 1045 25 b 1050 -19 1055 12 1057 -4 b 1012 -42 1043 -34 1029 -42 l 150 -42 b 113 -19 133 -42 120 -34 b 118 25 105 -4 107 12 l 527 537 l 159 995 b 166 1054 145 1013 148 1039 b 224 1047 184 1068 210 1065 l 581 603 l 936 1047 b 995 1054 950 1065 977 1068 b 1001 995 1013 1039 1015 1013 l 634 537 "},"y":{"ha":1040,"x_min":0,"x_max":0,"o":"m 896 981 l 160 981 l 521 559 m 38 995 b 31 1040 26 1008 24 1024 b 69 1064 38 1055 52 1064 l 988 1064 b 1026 1039 1006 1064 1019 1055 b 1019 995 1033 1024 1031 1007 l 563 480 l 563 0 b 521 -42 563 -23 544 -42 b 479 0 498 -42 479 -23 l 479 480 l 38 995 "},"z":{"ha":1147,"x_min":0,"x_max":0,"o":"m 142 -42 b 104 -18 125 -42 111 -33 b 109 26 97 -3 99 13 l 534 563 l 206 997 b 202 1041 196 1010 194 1026 b 239 1064 209 1056 222 1064 l 950 1064 b 988 1040 967 1064 980 1055 b 983 996 995 1025 993 1010 l 228 42 l 1008 42 b 1050 0 1031 42 1050 23 b 1008 -42 1050 -23 1031 -42 l 142 -42 m 864 981 l 323 981 l 588 631 "}},"familyName":"Nemoy","ascender":1476,"descender":-450,"underlinePosition":-174,"underlineThickness":69,"boundingBox":{"yMin":-450,"xMin":-31,"yMax":1476,"xMax":1546},"resolution":1000,"original_font_information":{"format":0,"copyright":"Created by bastien,,,, with FontForge 2.0 (http://fontforge.sf.net)","fontFamily":"Nemoy","fontSubfamily":"Medium","uniqueID":"FontForge 2.0 : NemoyMedium : 23-9-2010","fullName":"NemoyMedium","version":"Version 001.000 ","postScriptName":"NemoyMedium","licence":"Copyright (c) 25/09/2010 , BSozoo (http://cargocollective.com/Sozoo|boataletr@gmail.com),\r\nwith Reserved Font Name \"Nemoy\".\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.","licenceURL":"http://scripts.sil.org/OFL"},"cssFontWeight":"normal","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":751,"x_min":0,"x_max":0,"o":"m 693 103 l 693 0 l 92 0 l 92 103 l 342 103 l 342 739 b 124 633 203 656 161 633 b 49 725 68 633 49 669 b 460 939 171 772 342 868 l 504 917 l 504 103 "},"3":{"ha":751,"x_min":0,"x_max":0,"o":"m 324 943 b 639 719 504 943 639 875 b 481 488 639 617 576 531 b 688 264 603 464 688 386 b 311 -31 688 85 535 -31 b 40 153 176 -31 40 18 b 75 225 40 182 49 213 b 310 97 121 132 204 97 b 513 264 439 97 513 151 b 332 424 513 371 439 418 b 240 419 303 425 269 424 l 240 507 b 474 686 365 511 474 561 b 296 815 474 772 407 815 b 107 678 201 815 135 768 b 53 760 67 690 53 718 b 324 943 53 886 197 943 "},"7":{"ha":751,"x_min":0,"x_max":0,"o":"m 725 815 l 342 -31 l 158 0 l 565 786 l 50 785 l 60 917 l 715 917 "},"9":{"ha":751,"x_min":0,"x_max":0,"o":"m 365 944 b 688 488 615 944 688 738 b 294 -31 688 224 558 -31 b 101 93 208 -31 101 7 b 138 153 101 121 114 138 b 283 96 181 108 235 96 b 515 401 450 96 508 235 b 308 290 479 328 397 290 b 51 601 138 290 51 431 b 365 944 51 796 169 944 m 365 847 b 226 611 260 847 226 717 b 365 393 226 515 260 393 b 503 611 474 393 503 503 b 365 847 503 717 471 847 "},"x":{"ha":619,"x_min":0,"x_max":0,"o":"m 168 0 l 7 0 l 239 351 l 24 708 l 201 708 l 329 478 l 446 708 l 607 708 l 389 374 l 614 0 l 436 0 l 297 249 "},"y":{"ha":588,"x_min":0,"x_max":0,"o":"m 272 -268 l 119 -250 l 257 67 l 188 67 l 11 708 l 169 708 l 301 160 l 443 708 l 588 708 "},"z":{"ha":528,"x_min":0,"x_max":0,"o":"m 504 626 l 179 93 l 514 104 l 504 0 l 24 0 l 14 85 l 336 614 l 26 596 l 38 708 l 494 708 "},".":{"ha":335,"x_min":0,"x_max":0,"o":"m 168 147 b 271 61 228 147 271 118 b 164 -28 271 1 224 -28 b 63 58 106 -28 63 1 b 168 147 63 118 110 147 "}},"familyName":"Sansita","ascender":1417,"descender":-250,"underlinePosition":-104,"underlineThickness":69,"boundingBox":{"yMin":-356,"xMin":-1254,"yMax":1278,"xMax":1758},"resolution":1000,"original_font_information":{"format":0,"copyright":"Copyright (c) 2011-2015, Omnibus-Type (www.omnibus-type.com omnibus.type@gmail.com)","fontFamily":"Sansita","fontSubfamily":"Regular","uniqueID":"1.005;OMNI;Sansita-Regular","fullName":"Sansita-Regular","version":"Version 1.005;PS 001.005;hotconv 1.0.70;makeotf.lib2.5.58329","postScriptName":"Sansita-Regular","manufacturer":"Omnibus-Type","designer":"Pablo Cosgaya","manufacturerURL":"www.omnibus-type.com","designerURL":"www.omnibus-type.com","licence":"This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL","licenceURL":"http://scripts.sil.org/OFL"},"cssFontWeight":"normal","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+{"glyphs":{"1":{"ha":1094,"x_min":0,"x_max":0,"o":"m 767 1389 l 767 0 l 560 0 l 560 1182 l 354 1182 l 560 1389 "},"3":{"ha":997,"x_min":0,"x_max":0,"o":"m 490 797 b 876 399 704 789 876 614 b 474 0 876 179 696 0 l 189 0 l 189 207 l 474 207 b 669 399 582 207 669 292 b 474 592 669 506 582 592 l 189 592 l 189 797 l 574 1182 l 189 1182 l 189 1389 l 876 1389 l 876 1182 l 490 797 "},"7":{"ha":942,"x_min":0,"x_max":0,"o":"m 982 1389 l 324 0 l 83 0 l 451 814 l 83 1182 l 83 1389 m 542 1015 l 618 1182 l 375 1182 "},"9":{"ha":1067,"x_min":0,"x_max":0,"o":"m 535 1389 b 936 990 756 1389 936 1210 b 879 785 936 990 936 915 l 376 0 l 131 0 l 511 592 b 133 990 300 604 133 778 b 535 1389 133 1210 314 1389 m 535 1183 b 340 990 428 1183 340 1097 b 535 797 340 883 428 797 b 731 990 643 797 731 883 b 535 1183 731 1097 643 1183 "},".":{"ha":382,"x_min":0,"x_max":0,"o":"m 229 207 l 229 0 l 22 0 l 22 207 "},"x":{"ha":1169,"x_min":0,"x_max":0,"o":"m 654 694 l 1068 0 l 0 0 l 414 694 l 0 1389 l 1068 1389 m 533 896 l 704 1182 l 363 1182 m 533 493 l 363 207 l 704 207 "},"y":{"ha":1393,"x_min":0,"x_max":0,"o":"m 742 785 l 742 0 l 535 0 l 535 785 l -69 1389 l 1344 1389 m 429 1182 l 638 974 l 847 1182 "},"z":{"ha":1258,"x_min":0,"x_max":0,"o":"m 860 1182 l 0 1182 l 0 1389 l 1135 1389 l 1135 1182 l 678 664 l 1135 207 l 1135 0 l 0 0 l 0 207 m 540 508 l 275 207 l 843 207 "}},"familyName":"Woodwarrior","ascender":1528,"descender":-139,"underlinePosition":-104,"underlineThickness":69,"boundingBox":{"yMin":0,"xMin":-89,"yMax":1389,"xMax":1654},"resolution":1000,"original_font_information":{"format":0,"copyright":"Copyright 2013 Adobe Systems Incorporated. All rights reserved.","fontFamily":"Woodwarrior","fontSubfamily":"Regular","uniqueID":"1.000;pyrs;Woodwarrior-Regular","fullName":"Woodwarrior-Regular","version":"Version 1.000;PS 001.001;hotconv 1.0.56","postScriptName":"Woodwarrior-Regular","trademark":"Please refer to the Copyright section for the font trademark attribution notices.","designer":"Anton Bohlin"},"cssFontWeight":"normal","cssFontStyle":"normal"}
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="UTF-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="icon" href="data:,">
+ <style>
+ body {
+ height: 100vh;
+ margin: 0;
+ }
+
+ canvas {
+ width: 100%;
+ height: 100%;
+ }
+
+ div {
+ position: fixed;
+ top: 1rem;
+ right: 1rem;
+ }
+ </style>
+ <title>991337.xyz</title>
+</head>
+
+<body>
+ <canvas></canvas>
+
+ <div>
+ <input id="auto-rotate" type="checkbox">
+ <label for="auto-rotate">Auto Rotate</label>
+ </div>
+
+ <script type="module">
+ // Importing from CDN is broken after v0.127.0
+ import * as THREE from 'https://unpkg.com/three@0.127.0/build/three.module.js';
+ import { OrbitControls } from 'https://unpkg.com/three@0.127.0/examples/jsm/controls/OrbitControls.js';
+
+ // Set up globals
+ const canvas = document.querySelector('canvas');
+ const renderer = new THREE.WebGLRenderer({ canvas });
+ const scene = new THREE.Scene();
+ const camera = new THREE.PerspectiveCamera(75, canvas.clientWidth / canvas.clientHeight, 0.1, 100000);
+ camera.position.set(0, 0, 500);
+ const controls = new OrbitControls(camera, canvas);
+ controls.autoRotateSpeed = 5;
+ const characters = []; // Array of THREE.Mesh objects that will be generated
+
+ // TODO: rewrite this to use actual math instead of eyeballing it
+ function placeCharacters() {
+ let x = -(canvas.clientWidth / 2) + (canvas.clientWidth / 10);
+ let y = 60 * Math.abs(Math.min(canvas.clientWidth, 1000) - 1000) / (canvas.clientHeight / 4);
+ let z = -(canvas.clientWidth / 5);
+ for (const mesh of characters) {
+ const width = mesh.geometry.boundingBox.max.x - mesh.geometry.boundingBox.min.x;
+ const height = mesh.geometry.boundingBox.max.y - mesh.geometry.boundingBox.min.y;
+ mesh.position.set(x, y, z);
+ x += width + 20;
+ if (x + width > canvas.clientWidth / 2 - (canvas.clientWidth / 10)) {
+ x = -(canvas.clientWidth / 2) + (canvas.clientWidth / 10);
+ y -= canvas.clientHeight / 4 + 20;
+ }
+ mesh.lookAt(camera.position);
+ }
+ }
+
+ // Randomized values
+ const backgrounds = [0xf7d4d4, 0xf7ebd4, 0xebf7d4, 0xd4f7d4, 0xd4f7eb, 0xd4ebf7, 0xd4d4f7, 0xebd4f7, 0xf7d4eb];
+ const fonts = await Promise.all(['Avara', 'Datalegreya', 'Glacial_Indifference', 'Hussar_Szturm', 'Nemoy', 'Sansita', 'Woodwarrior'].map(f => new THREE.FontLoader().loadAsync(`./fonts/${f}.json`)));
+ const materials = [0xe60000, 0xe69900, 0x99e600, 0x00e600, 0x00e699, 0x0099e6, 0x0000e6, 0x9900e6, 0xe60099].map(c => new THREE.MeshPhongMaterial({ color: c }));
+
+ let seed = new Uint8Array(21); // 1 background + font and material for 10 characters
+ window.crypto.getRandomValues(seed);
+ seed = [...seed]; // Need to spread the TypedArray into a normal Array to use .pop()
+
+ scene.background = new THREE.Color(backgrounds[seed.pop() % backgrounds.length]);
+ for (const c of ['9', '9', '1', '3', '3', '7', '.', 'x', 'y', 'z']) {
+ const geometry = new THREE.TextGeometry(c, { font: fonts[seed.pop() % fonts.length] });
+ const material = materials[seed.pop() % materials.length];
+ const mesh = new THREE.Mesh(geometry, material);
+ mesh.geometry.computeBoundingBox(); // Only needs to be called once. Required for placeCharacters()
+ characters.push(mesh);
+ scene.add(mesh);
+ placeCharacters();
+ }
+
+ // Light x and y position is updated in the animation loop
+ const light = new THREE.DirectionalLight()
+ light.position.set(0, 0, 500);
+ scene.add(light);
+
+ // Set up event handlers
+ document.querySelector('#auto-rotate').addEventListener('input', _ => controls.autoRotate = !controls.autoRotate);
+
+ new ResizeObserver(_ => {
+ placeCharacters();
+ renderer.setSize(canvas.clientWidth, canvas.clientHeight, false);
+ renderer.render(scene, camera);
+ camera.aspect = canvas.clientWidth / canvas.clientHeight;
+ camera.updateProjectionMatrix();
+ }).observe(canvas);
+
+ // Set up animation loop
+ let previousTimestamp = 0;
+ (function animate(timestamp) {
+ const delta = timestamp - previousTimestamp;
+ if (delta >= 15) { // 15 ms is about 60 FPS
+ previousTimestamp = timestamp;
+ light.position.x = 500 * Math.sin((timestamp % 5000) / 5000 * (2 * Math.PI));
+ light.position.y = 500 * Math.cos((timestamp % 5000) / 5000 * (2 * Math.PI));
+ controls.update();
+ renderer.render(scene, camera);
+ }
+ window.requestAnimationFrame(animate);
+ })();
+ </script>
+</body>
+
+</html>
\ No newline at end of file