Compare commits
5613 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c2da48c49f | |||
| ca5cbf05be | |||
| dc6410e7b8 | |||
| e1572a2a5c | |||
| a3dddbfa24 | |||
| d88b93d56b | |||
| bd0bc42adc | |||
| 04ef3c60d5 | |||
| a14de5e255 | |||
| 90f377fa83 | |||
| c79952a4d6 | |||
| d7dc0b76e5 | |||
| 27b3538b2f | |||
| 74ca6b2c51 | |||
| d49def6f7e | |||
| 72d1d8f085 | |||
| d31fc32399 | |||
| 615ec636d4 | |||
| 5ee7b0d939 | |||
| 9f7ae5bb58 | |||
| 5f756a6ceb | |||
| 5d9e6b7364 | |||
| 9db3439d0d | |||
| 544eb03f7e | |||
| 9d640656e6 | |||
| 9a1fd12a85 | |||
| aaf349170c | |||
| 422f2323d2 | |||
| 10d9d53e47 | |||
| 94e5a8b7bc | |||
| bda94834f7 | |||
| df3969dae1 | |||
| 789dfac27c | |||
| 4f78f79201 | |||
| 28335478bd | |||
| 58618bd402 | |||
| 0ee6aad3ec | |||
| 9205352f94 | |||
| 5079ddd20a | |||
| 2bd2bd5081 | |||
| d5100373be | |||
| 8c006f6e11 | |||
| 804826fbc7 | |||
| 0498f1488e | |||
| 96589557b3 | |||
| 3119c50789 | |||
| 04c1cf469d | |||
| 70ab159dd4 | |||
| ac54838eea | |||
| 5e5ee8e039 | |||
| bb9711277a | |||
| 96a1f20bee | |||
| 32629b7a44 | |||
| 1b46c0921f | |||
| b581ec837c | |||
| c0a5417108 | |||
| 45a1d33689 | |||
| bb3cefbe54 | |||
| e7b62ad1c3 | |||
| 7997d2bc4e | |||
| c44e97c8bc | |||
| f7deac4b63 | |||
| 70136509a9 | |||
| 38451f7dce | |||
| 63a70758f2 | |||
| 890248edf2 | |||
| 9536c37623 | |||
| bf6daed6d2 | |||
| 864f5f77f5 | |||
| b16a6199d0 | |||
| 093928f2f9 | |||
| d3b96742e7 | |||
| fb6bc75e3a | |||
| 61bb41c878 | |||
| c52c23013c | |||
| 17aa4ea60d | |||
| 76e4e1b8d4 | |||
| fe8260fe14 | |||
| 90f9754781 | |||
| 75d5023354 | |||
| 0711710544 | |||
| 23a6a8b69f | |||
| 020b0a90d7 | |||
| 6013705988 | |||
| 65397621e9 | |||
| cbd1e5c837 | |||
| 9282bcfbbf | |||
| 1d8ae580b7 | |||
| 694f8fbaf3 | |||
| 623752e69b | |||
| 420525f688 | |||
| 9b570a46d2 | |||
| b8ee20c7dc | |||
| 4696ed4f8a | |||
| c37aee0a27 | |||
| 7b34ddc089 | |||
| 028ccfca2e | |||
| 072d70722c | |||
| 875dd30d57 | |||
| 9c2a04aa21 | |||
| 83485d2f52 | |||
| 74760a7661 | |||
| 2a109e50fb | |||
| 67dad80e15 | |||
| 64a7985376 | |||
| d3073f5251 | |||
| 62047d2d4c | |||
| 2020b8b011 | |||
| 87e96a9017 | |||
| 0e5335a806 | |||
| e8b07e1588 | |||
| 1c4901305c | |||
| 7106d958d7 | |||
| cd7ad4e5f8 | |||
| c0ba3b0edb | |||
| b82f19a0df | |||
| 6f487bcab5 | |||
| f7e3480d79 | |||
| 7ff3b565e5 | |||
| cc6f5f83ac | |||
| c38a2870dc | |||
| 287c9432b7 | |||
| 0e95700349 | |||
| a99282f86d | |||
| e17eed7029 | |||
| 46c406cc9e | |||
| 6a1552505e | |||
| 2190031ccf | |||
| 228ef4e130 | |||
| dd8817582a | |||
| 3b642c0370 | |||
| 16159a9d98 | |||
| c87b315fef | |||
| b07528d9ce | |||
| 9e2e6759bd | |||
| 2485987901 | |||
| 1a6e706e57 | |||
| 21a3081b9f | |||
| 8f9989dc65 | |||
| a3e3ee396a | |||
| cd68f2463b | |||
| d1f11bbdb2 | |||
| 3b6100837f | |||
| cc85450ed5 | |||
| 70470bc421 | |||
| f995d12686 | |||
| 3645377b15 | |||
| 1e804a0a81 | |||
| fadc5beb1c | |||
| 5f019dc79f | |||
| b57a3165fa | |||
| b13139c6cc | |||
| fea4b3fcba | |||
| 329a6ce0ef | |||
| 53587ad162 | |||
| 086e4c9835 | |||
| ee9627bc15 | |||
| 9de5ee5615 | |||
| 125591dc71 | |||
| b0134ab1ce | |||
| 9f313491b8 | |||
| 8f7da81621 | |||
| 55971167c8 | |||
| 9f50146e68 | |||
| bda71c067b | |||
| cc1e5873a6 | |||
| c652bab9b2 | |||
| 13b1c16213 | |||
| f1c98320fc | |||
| bdb65857bc | |||
| 164670cceb | |||
| d7ddb2ef6f | |||
| 326b6f000a | |||
| 7cc2c143ab | |||
| 37bf4bb34f | |||
| 534d2388f5 | |||
| d5cb34f1b4 | |||
| 6b8d8b7913 | |||
| 14d12418b6 | |||
| 979168e82c | |||
| 7140c4a2d8 | |||
| 5f8e5d44dc | |||
| 31c9b85a3f | |||
| 958c7b2181 | |||
| 652f8ccb8d | |||
| 26f4574358 | |||
| 0eadf2de1e | |||
| ec67d04a0a | |||
| 2df931e090 | |||
| f552dd0c28 | |||
| 8cf10bf71d | |||
| 621d408078 | |||
| 1fdc91255b | |||
| 524b55b6c1 | |||
| 5e07a42417 | |||
| ea4f97aad8 | |||
| e7804f9d02 | |||
| 092df84170 | |||
| 22288b0561 | |||
| 43c1e40461 | |||
| 8f76fe4049 | |||
| 60ddf0ea89 | |||
| b299ed3246 | |||
| 7c55d50507 | |||
| d798b10d4c | |||
| a6430692d2 | |||
| 3bbfe9de8a | |||
| 94abdfd734 | |||
| a0d6f3c22b | |||
| bbdc2bc876 | |||
| 9bda3aa52a | |||
| 9faf9e43fb | |||
| e5f3329e88 | |||
| a8cf4e95c5 | |||
| f345e0dffc | |||
| 26e09aebe3 | |||
| 892e091643 | |||
| ef823c0646 | |||
| c043e64b6b | |||
| 2382e2cbbc | |||
| 2a28126700 | |||
| f9251e41a4 | |||
| 1f11f287ec | |||
| 0476251638 | |||
| d71f89718b | |||
| 55f76999b4 | |||
| 393514c13d | |||
| 126ea687e6 | |||
| d83dcdebf3 | |||
| 248f78ed56 | |||
| ee7f2b3724 | |||
| 0b8c06b149 | |||
| 8b0dd039ca | |||
| f28a3572bb | |||
| 31c3171b72 | |||
| e000acd6fc | |||
| 8c0c6c0142 | |||
| c22eae0e2d | |||
| e32f4d5f8c | |||
| eda4def35b | |||
| ac0cf01404 | |||
| 50639e2378 | |||
| 88a5e07f2e | |||
| 9c93828976 | |||
| fcbe624f7c | |||
| efed1f5b1d | |||
| 4849a49ba4 | |||
| 424e832ec7 | |||
| dae05e0549 | |||
| 007edb4651 | |||
| 3953e6ddc0 | |||
| 40f5032898 | |||
| a2e2ef51be | |||
| c46f78885e | |||
| 5c67c4f5d4 | |||
| 70cb4d3cd9 | |||
| 5416d385d3 | |||
| 2c809389ad | |||
| 8bd4ad03de | |||
| 01688bc050 | |||
| d5c89cb3de | |||
| 9e07e80fa1 | |||
| 3e848d93da | |||
| d0bf176178 | |||
| fce41b95f6 | |||
| fb6a9728a3 | |||
| 6a482c987c | |||
| f60007da83 | |||
| 2149995116 | |||
| 44036a26d0 | |||
| f2ecefb7ee | |||
| 6b4340ce24 | |||
| e0d97486ec | |||
| b65c84c02e | |||
| 5a45ccf70d | |||
| f3393c46a5 | |||
| 587578ccfb | |||
| 522015c2d7 | |||
| 81ae687238 | |||
| 311637616b | |||
| 1cf97186dd | |||
| 62946f6359 | |||
| 9cdd1cbc45 | |||
| 482d516c2e | |||
| 3e906686db | |||
| b219aaf708 | |||
| b6f8876315 | |||
| 583a5d9223 | |||
| d42b9321f2 | |||
| 997dc53a49 | |||
| 95d89382c9 | |||
| ecc6f83130 | |||
| 7ac23e35f8 | |||
| eeb543c653 | |||
| bb567cafde | |||
| d71a9efd92 | |||
| a4d7693a2f | |||
| 42dbd8db0a | |||
| c9d48d00e7 | |||
| a21abaac84 | |||
| bca5e908f1 | |||
| 4e683dcc15 | |||
| bdf6a11491 | |||
| 91fdd60b07 | |||
| 9572073eda | |||
| 75f1c8baaa | |||
| e9250ab365 | |||
| a45f067719 | |||
| ad1c573678 | |||
| c2cd3b64ff | |||
| 48b18bf84e | |||
| 694980160b | |||
| 90d633fb2d | |||
| e10aa1ff58 | |||
| 7efb3e3f3d | |||
| 982639f215 | |||
| 9986d62a28 | |||
| 2c1f6e561a | |||
| c4f57d19db | |||
| 1a6e4bf14b | |||
| 47f9bc2017 | |||
| eb2fc0f02f | |||
| 8ba17f1026 | |||
| 914f7b842e | |||
| 4879b9bd90 | |||
| f5adbc08fa | |||
| 2881ca17a0 | |||
| 1b8b585367 | |||
| 2ae20c5fc4 | |||
| c92a3e566e | |||
| d5fcdf6edb | |||
| 3afec6c897 | |||
| ee83c19c7b | |||
| 144b72109b | |||
| 7b8c013918 | |||
| 3e792e6cd7 | |||
| ed70eb24c7 | |||
| f46d1a4aba | |||
| 306cedeb39 | |||
| 66f66c5481 | |||
| 8c20ba83de | |||
| cdee91f258 | |||
| 8f6ceece10 | |||
| f5d3e30972 | |||
| 408d620b17 | |||
| 1d079842f6 | |||
| b6395cf6f1 | |||
| d0f5d3270f | |||
| 6e6a427488 | |||
| 48f890dd80 | |||
| d4bd2d372c | |||
| 7a6c1b8b86 | |||
| 0d3bae3761 | |||
| 3e073c45ba | |||
| fc5ff3feb7 | |||
| 01365f995d | |||
| 712eaebb25 | |||
| 90603792d7 | |||
| 04d61eba3c | |||
| 24396031a7 | |||
| b244ffedd2 | |||
| ff3bc557b2 | |||
| f0564e0b06 | |||
| 31fb25a43d | |||
| a870513086 | |||
| 5cf3803860 | |||
| e045f096a9 | |||
| 70593177c7 | |||
| 953ae3e9bb | |||
| 64f3f1e9bc | |||
| 3fa9f9e9cf | |||
| 80511d5a19 | |||
| 4482fc0bcf | |||
| 73ee5676c6 | |||
| a3ab7cd14e | |||
| 818ee98b27 | |||
| 2a7a07d2fc | |||
| 4a165d0661 | |||
| 226b1307c0 | |||
| 1dd8aa3db8 | |||
| 1af69421fa | |||
| b43196cd1a | |||
| aab48f1cc1 | |||
| b402603b1d | |||
| 1195572318 | |||
| a2113d4acc | |||
| b57018f55c | |||
| eab14e28da | |||
| a8f670a9c9 | |||
| 2e5d89c8cd | |||
| cde4415052 | |||
| b5117af4b8 | |||
| d7327d62e2 | |||
| b1b1b88982 | |||
| 17b95e3ee5 | |||
| 3d36d1ce71 | |||
| 92b155dbb3 | |||
| 42c042c249 | |||
| 5c6de69e0e | |||
| b30f845924 | |||
| b8ed115f63 | |||
| cbe07b842f | |||
| de7c6483e0 | |||
| f94ae3f3fd | |||
| 4b4bf833a9 | |||
| d5237715a5 | |||
| 395a72b7d4 | |||
| f80ded2057 | |||
| a2d4207504 | |||
| 627b1cee10 | |||
| eb75f8a8ad | |||
| 5bc76de7d6 | |||
| 4e78b49cac | |||
| 637850d06c | |||
| 4144c22dc4 | |||
| 2ce727d994 | |||
| 1855ff133e | |||
| 51004bbd9d | |||
| 873d42344b | |||
| 27b6ba83a6 | |||
| eeaf7eb733 | |||
| 2b59cbf0f1 | |||
| ab2cfe89ce | |||
| aab3d494ff | |||
| fe4e8f3dd2 | |||
| 0c2c643ea8 | |||
| 3bff65d6b6 | |||
| 1069ff0c60 | |||
| 03ab243f9b | |||
| b9d8e2b336 | |||
| ac67813198 | |||
| 6c2ba51926 | |||
| c73897ce7f | |||
| 32bab1e7bf | |||
| e26d793976 | |||
| 9e3c0f5e26 | |||
| b14f5f5cd6 | |||
| 59c54db275 | |||
| 1ebf4d49e5 | |||
| c73ab05d70 | |||
| d29c2fc5af | |||
| ec04e858ef | |||
| 421db7fee2 | |||
| 3bf9c1cc10 | |||
| e68807d574 | |||
| e03516e22e | |||
| a403c4d9ee | |||
| d13c722ce3 | |||
| 2cf70453f8 | |||
| da149d32cf | |||
| 66de1e744a | |||
| cae07f3623 | |||
| c1fa9e595c | |||
| 80e6853f44 | |||
| ec60c90963 | |||
| 8edc154501 | |||
| 86d0ccb210 | |||
| 74af2e53a8 | |||
| 3ea771fe22 | |||
| ec6e459aa7 | |||
| 959fa185c3 | |||
| fa2171503b | |||
| 2c2b403da1 | |||
| 69cdb1268a | |||
| a5afa04f8f | |||
| aeda759086 | |||
| 0508d5a987 | |||
| 31a000b2b6 | |||
| 95daff3e96 | |||
| 04439d9dec | |||
| 681564189f | |||
| f6ee5123d7 | |||
| 296ac0b940 | |||
| 141555377b | |||
| c0428c3316 | |||
| e7249d9d94 | |||
| f3d7ad0aa9 | |||
| 5a66e90b56 | |||
| cffc3f7f5d | |||
| 0a5d37fd9b | |||
| 531d005169 | |||
| c717a102fc | |||
| 4c906f4040 | |||
| 159fb8f5ee | |||
| 0c3d1e3ec6 | |||
| dd7dc28828 | |||
| a99f792979 | |||
| 713cf0d4b2 | |||
| 10541ac743 | |||
| 7c6148dfd8 | |||
| fae6a1ebe9 | |||
| bc1cb402ab | |||
| e973c3ee67 | |||
| bcbbd98898 | |||
| 4131e15f0e | |||
| e8ec5794d2 | |||
| a9f1163743 | |||
| 4be02f5832 | |||
| efab20e335 | |||
| c47907c0c3 | |||
| 7faa9aa23a | |||
| 64515404e9 | |||
| db14c8a0a6 | |||
| 10bab59acc | |||
| 2affebd375 | |||
| 3f2f567364 | |||
| dee445c32c | |||
| d65fe3bae3 | |||
| 04daf10a92 | |||
| 1a3c6bfc73 | |||
| b797d3b0f0 | |||
| bcefaea416 | |||
| 12a2a69ad7 | |||
| 68151592a4 | |||
| 5d2a3482c7 | |||
| e93eb6aae6 | |||
| b7f269f9bd | |||
| bb4c459296 | |||
| 404340b02e | |||
| 50c6b23e35 | |||
| 95d798f49e | |||
| 42a9eaf72e | |||
| 86044fcc05 | |||
| 285a824858 | |||
| 37e8fa7b76 | |||
| 315df12fbe | |||
| 3a3e8e2ad5 | |||
| ec2226f06e | |||
| 22239bc2d1 | |||
| 238526bdc4 | |||
| b1988776ab | |||
| de1ba2de6f | |||
| 65a68131cc | |||
| c6ecf12c32 | |||
| 177d48acb5 | |||
| 695b630e79 | |||
| ea1b2ada50 | |||
| 912d1503e5 | |||
| 9c9bb7ca53 | |||
| c665cc99b9 | |||
| bd43ca236b | |||
| 9e7fb79859 | |||
| 9cd8a74bba | |||
| daa06cb320 | |||
| bc1da787de | |||
| 11a8bb59ce | |||
| a324e05e8f | |||
| 747abba4f7 | |||
| e9eb9890a0 | |||
| deaab07793 | |||
| 5e31a678bd | |||
| f0176c3520 | |||
| 142202f519 | |||
| 634053432e | |||
| 17fbfc969b | |||
| e8e3d5dfa6 | |||
| f82e4b332d | |||
| 433a398b45 | |||
| ca9d98f466 | |||
| e97653d3f3 | |||
| b98d3ae572 | |||
| 53223bb2ab | |||
| 848ab51753 | |||
| d56f7a211f | |||
| 98a5985ce9 | |||
| 71a5d56105 | |||
| c91bc0d8c6 | |||
| 57052b3b14 | |||
| a889d888ff | |||
| 2b2b4f6b6f | |||
| 273b6c0228 | |||
| 1c12e3d530 | |||
| 05ffaf7cef | |||
| 144287ba1c | |||
| f0da221621 | |||
| 518ce457df | |||
| 5efbfc86ad | |||
| 36a9ffe3aa | |||
| 65b63da93a | |||
| c900b6525d | |||
| 176f95fbbc | |||
| cfefe7a24c | |||
| 299ca398fa | |||
| bc9c9d2e72 | |||
| 6d7e23f254 | |||
| b89d32ce2b | |||
| 3136079ca3 | |||
| 7f741c04ed | |||
| 5a2831d0cb | |||
| 896f75b789 | |||
| ba319d8499 | |||
| 320955f8b7 | |||
| 6378f62acd | |||
| 7c0d1ab977 | |||
| 4d1ac04e5c | |||
| 385ef7361c | |||
| b6ceed5c6d | |||
| 6fd636b421 | |||
| 1978cb6df9 | |||
| 8de2e6a424 | |||
| 915f6a719d | |||
| 12f5157bfb | |||
| 968e1328dc | |||
| 6aaa5832a8 | |||
| cf6b9b7ab5 | |||
| 5b50562a9f | |||
| 89d34650c0 | |||
| 39b89ada6c | |||
| 698a9f1938 | |||
| c920b75142 | |||
| 5178caeda6 | |||
| 7158cfb5bf | |||
| 2c9541f6a0 | |||
| 0b3259fcc3 | |||
| 309302c212 | |||
| ce1b47979e | |||
| 85cfc73bbf | |||
| 65e477cfd0 | |||
| 107bea9c2e | |||
| 918140bc6d | |||
| 390460907d | |||
| 73ff053470 | |||
| 9377466ec8 | |||
| 37032810c9 | |||
| 9e222d222c | |||
| 55621054d8 | |||
| 8d057f5b8e | |||
| f04d723b29 | |||
| 2bd66cf625 | |||
| c9a2a17166 | |||
| c5b7d2fe8a | |||
| 978b3f835a | |||
| 765cd7a0f0 | |||
| f19e0628c5 | |||
| 2090cba743 | |||
| 8d0cfcf05d | |||
| 97e2e9a61d | |||
| a1f225d2ef | |||
| c93b41a88d | |||
| 3e8a29cdd5 | |||
| 3d16f97e4c | |||
| 2afa287b67 | |||
| 8457687025 | |||
| 76c6696ead | |||
| 5a94116c9b | |||
| eb613d3e8a | |||
| c8dc8396f9 | |||
| 8cfc14f4b1 | |||
| 1ffe8a7b60 | |||
| 094a3cfe5a | |||
| 8c638e7947 | |||
| d719ef8d03 | |||
| 6ec35e5175 | |||
| dd9fa6e949 | |||
| be204fd2f5 | |||
| 787414451e | |||
| 552ce3e495 | |||
| 29f5556634 | |||
| 1e1c296300 | |||
| 1b278f5c56 | |||
| c2117f0254 | |||
| 648520a6dc | |||
| 42c657cb58 | |||
| b6a46a5ec2 | |||
| 6fef9b09fa | |||
| 941237342d | |||
| 9501d23f35 | |||
| 0a13e01d95 | |||
| 1f2260048a | |||
| 44d78dccbb | |||
| 5eb888868f | |||
| 38b1203bb2 | |||
| 627de10e72 | |||
| 644eb35b97 | |||
| ca48d60627 | |||
| a500f88b4c | |||
| 808c741ed7 | |||
| 9eaef3447c | |||
| 364676ceae | |||
| e21756d685 | |||
| 7df206f533 | |||
| e3ceaa3f9a | |||
| 8b2d3db3f1 | |||
| 589941d6b2 | |||
| f046642ba7 | |||
| 3792aa1984 | |||
| 024dd74ae1 | |||
| cdc8e4adb8 | |||
| 8c02dfbb3f | |||
| 9a84f9e4ac | |||
| 9322a2006a | |||
| 67b373c6df | |||
| 0842a95dd6 | |||
| c3ef9f993b | |||
| 378e48e7aa | |||
| 7ad497ca3b | |||
| 0e3dedbc5b | |||
| 414bce38bb | |||
| 67da36a611 | |||
| dc32386590 | |||
| e9bdc8b319 | |||
| 4449f1ddcf | |||
| 6562a8769e | |||
| fcb71134c2 | |||
| b7dcf9576e | |||
| 2eea7abc27 | |||
| 71b5b528fd | |||
| d5b8e44572 | |||
| b85184eee0 | |||
| 2e1691c2f1 | |||
| c3cc78b7c2 | |||
| 297b4f2a81 | |||
| e1ea6a0676 | |||
| 4378b9e455 | |||
| f843b3858a | |||
| f5c9dce34a | |||
| 8a80a26523 | |||
| 2e22abaff9 | |||
| d38badb54b | |||
| 17aca44a3b | |||
| dbd5c71344 | |||
| 49e05bc206 | |||
| 2d51332bf7 | |||
| e4804db160 | |||
| 4e5795ab91 | |||
| acecda482d | |||
| da85771472 | |||
| e8aa2f922b | |||
| 62a335fab0 | |||
| d813078e91 | |||
| 685a68b7b8 | |||
| c420318267 | |||
| a52b352bd9 | |||
| b4d20e128b | |||
| 89704bebe9 | |||
| 62fdfe2519 | |||
| 7a01ccb5fb | |||
| 2c653f8c92 | |||
| e5f4a52be1 | |||
| 924ee9085f | |||
| 4bdeb26e74 | |||
| 91c017713c | |||
| a379c551cb | |||
| 8a44ea5a99 | |||
| f8bfc3520b | |||
| 31c35a7dd9 | |||
| a11ffb5ea5 | |||
| 01ced1cacd | |||
| 09ebd7462a | |||
| 0281c6dcde | |||
| 048c1f6985 | |||
| a9a7bc0b70 | |||
| 898a5c4561 | |||
| b0966c9114 | |||
| cffa9aa58e | |||
| 0652a1c367 | |||
| c5491eea97 | |||
| cf397e1cc7 | |||
| d9855f2ed6 | |||
| 047eb2eddf | |||
| 8c94b56080 | |||
| bedb056645 | |||
| e6de28bb6a | |||
| 2e5adca99a | |||
| 9e5a48af4b | |||
| abf68328e6 | |||
| 609217a3bb | |||
| f8cf82a005 | |||
| 3c1622fbfd | |||
| 0bea917ef1 | |||
| 4de3512e12 | |||
| b747031e2f | |||
| 66a140f402 | |||
| b40384c329 | |||
| 7c39e5726d | |||
| 338e3bbd42 | |||
| 99566a0f0f | |||
| 1a604e24a0 | |||
| 9ecfe90708 | |||
| f9e8ad7c12 | |||
| 68c6a01805 | |||
| 96609815ec | |||
| 558a7d99ff | |||
| e186adc90e | |||
| 7df5a7c646 | |||
| 06ba894e39 | |||
| 7b3152885d | |||
| a82856176e | |||
| 4e3d5ad11c | |||
| 133e192b98 | |||
| aa64da9869 | |||
| 92520a3c17 | |||
| 0c167f38b7 | |||
| f4e62afe8a | |||
| a9b706becf | |||
| 09bd7c696b | |||
| 2475706df4 | |||
| 8719bfe820 | |||
| cd2669230e | |||
| d8f996ddc7 | |||
| 1093818381 | |||
| 067ae8fc8e | |||
| f721284f70 | |||
| f930c9b5dc | |||
| bb7ca521c4 | |||
| 6c8b5e5e8a | |||
| ce45c92dae | |||
| 7de30bef7c | |||
| a8c6b2b619 | |||
| a236bc0b81 | |||
| 58d0ed18e6 | |||
| 0df9f5c797 | |||
| 0c4a608b65 | |||
| e48e15f02f | |||
| eda07ac57b | |||
| 820c18968a | |||
| be7da82cfc | |||
| bb84a51478 | |||
| 03b16875c7 | |||
| 84bb56d68b | |||
| d28be9cf44 | |||
| 58e5c988af | |||
| e995736012 | |||
| 493f3430bc | |||
| 350112a0d7 | |||
| 5ca6dae8c3 | |||
| 21f419dd4b | |||
| 0d082f5773 | |||
| a3517b273c | |||
| e1a0e51bc7 | |||
| 12f4dc74d2 | |||
| 2196a3d791 | |||
| c505561118 | |||
| 809a1041b3 | |||
| 29d0281932 | |||
| e562a7d72c | |||
| 7bec45dacf | |||
| 5a96c0e717 | |||
| a7c9c6142c | |||
| dfca248ebd | |||
| 4cc0807384 | |||
| 7cbafcd86b | |||
| 20ce4642ea | |||
| 4528cce71c | |||
| aeb0bf700f | |||
| bb27f85951 | |||
| 94e7531109 | |||
| fd23a61846 | |||
| de566a361a | |||
| d925c8dab8 | |||
| a25eae5d10 | |||
| 6f7b138488 | |||
| 52fb941237 | |||
| 0694f87b0d | |||
| ed13de2d5b | |||
| 8d7225c056 | |||
| 4755c42d70 | |||
| 510fc443e8 | |||
| 27ab8ea404 | |||
| eed2cdfe04 | |||
| 4c4a559125 | |||
| 4c1519ba1b | |||
| 2253b5713b | |||
| 7d4bf8356e | |||
| c31e4023c4 | |||
| 3bbc7faf11 | |||
| 497aca829d | |||
| 7e28db91c2 | |||
| c71a34a1e9 | |||
| 30e825db75 | |||
| ad536a945e | |||
| 5dbc5f42d2 | |||
| 154076a5d0 | |||
| d719c534d4 | |||
| d63c21ec41 | |||
| 1fa7397b32 | |||
| 5bf645252f | |||
| 9568237c8e | |||
| 0232197cdc | |||
| 773047dc69 | |||
| 98ebbf8b99 | |||
| 1a2eb48705 | |||
| c615ad18a8 | |||
| 0ba261d338 | |||
| dc29ee180e | |||
| 8d16fb21b9 | |||
| 33ac9c8811 | |||
| 4f10f852c7 | |||
| e11587e72e | |||
| 16131b2858 | |||
| e878f5be15 | |||
| 19d77f0d81 | |||
| 2f9e72e03e | |||
| 47e2c82551 | |||
| 9e4fd9fadb | |||
| edd4e37111 | |||
| 01d5c6a25b | |||
| 31a6c052f3 | |||
| 74758f5380 | |||
| b7a3b10498 | |||
| dad41d9e0e | |||
| 1c27674fd5 | |||
| c39242ecba | |||
| 9614110f10 | |||
| 39c3b760ac | |||
| 72659a481e | |||
| 55a439645c | |||
| eece05c118 | |||
| 7950c0d9d7 | |||
| 7cdd35cc8d | |||
| 6f304040b0 | |||
| d2a0438b71 | |||
| dea3319b9d | |||
| 58fab97447 | |||
| a41ad511f0 | |||
| 44b45faa9a | |||
| e747a345d8 | |||
| dadb9207b9 | |||
| 086c2f155d | |||
| cfa7cac149 | |||
| 95748744a4 | |||
| 34629d46f3 | |||
| af54b907d7 | |||
| 2930b0ad67 | |||
| e00bf92f05 | |||
| c1dcc52a6a | |||
| c351e58c6e | |||
| c60b2cb4d7 | |||
| 2c70b74814 | |||
| e83b8afdd3 | |||
| 4cf20efe2e | |||
| b7d4758dde | |||
| 559aef2ee3 | |||
| 7fce25a2e4 | |||
| aaaf7c5c37 | |||
| 4265ba12d7 | |||
| 85c5c7f309 | |||
| c838a800b6 | |||
| 22af41193e | |||
| b450c65c93 | |||
| 4ce89f56cc | |||
| 57014851a7 | |||
| e6b0cd69ae | |||
| 70e9410da0 | |||
| 38c027704e | |||
| 31411e334b | |||
| 987e680908 | |||
| d5df227df5 | |||
| 60f21d1a92 | |||
| a26d0d03eb | |||
| a7c5397641 | |||
| 0112f70c05 | |||
| 1647fff024 | |||
| 07afb0a020 | |||
| 5e6f33ff1e | |||
| 9fe54dc02c | |||
| 6691aaca1e | |||
| 82a22b2a87 | |||
| fcf412f64e | |||
| 2a4a283c4b | |||
| b2f7ffa545 | |||
| 127c575752 | |||
| 9df7489727 | |||
| 12b330e4ec | |||
| 2016297fce | |||
| fa6b621368 | |||
| a17981bc87 | |||
| f88dd50098 | |||
| fb06fa2c8b | |||
| ad4c2484f3 | |||
| 3be4e50b78 | |||
| 499df770cc | |||
| 9b74effe22 | |||
| 96e1f1e595 | |||
| 48a2ca5fe9 | |||
| b5558606b5 | |||
| 8003c30ed6 | |||
| b57cb13318 | |||
| 79dbddc48e | |||
| 2df70f16f9 | |||
| 68e04ca7e4 | |||
| 037ad94ae7 | |||
| 34aff4a2b6 | |||
| eab5ee93b9 | |||
| 6f9f40192e | |||
| 64752781ed | |||
| 87e9046e41 | |||
| 1c74e89f0d | |||
| bef4ba1829 | |||
| 3b797ab1dc | |||
| 272ffe2ea2 | |||
| d7e24f0168 | |||
| 0cf40729fa | |||
| b6aa38569f | |||
| 55d721f425 | |||
| 9429be0830 | |||
| c00769e2b8 | |||
| 1096daaeb7 | |||
| 9560bbe23e | |||
| 0d78a6ba67 | |||
| e07a07f13e | |||
| 0d813aee90 | |||
| 2c1409c2a4 | |||
| b44c7ab32c | |||
| c18cefbb0b | |||
| 5a7f678e4d | |||
| dc04d3dc0b | |||
| 7a5d84a216 | |||
| fe97429df8 | |||
| 5b23a4b318 | |||
| e644b65289 | |||
| 5911d098d1 | |||
| 8de8f3c1cd | |||
| 4f9d556a76 | |||
| cdde8665c1 | |||
| ef0f0e24a3 | |||
| 8327866205 | |||
| 89d649c049 | |||
| f0061e07b4 | |||
| 3ddaa6da1a | |||
| ffd5c8fd53 | |||
| eb364f51e0 | |||
| f77063f615 | |||
| d3578380e2 | |||
| 05cb02aa09 | |||
| 32565becd8 | |||
| 2f97db306a | |||
| 679757942f | |||
| 5dc63da4bf | |||
| 91247cc080 | |||
| aa1a0ea4a2 | |||
| 8b050cf87e | |||
| 660ecc185b | |||
| c91c690e86 | |||
| 2338e03554 | |||
| ec8df18ee4 | |||
| 74bdcf0749 | |||
| d5cdbdb808 | |||
| 2ea468d5da | |||
| 7dc83b5472 | |||
| 4b08cd3fd7 | |||
| 4af2b9e2a6 | |||
| 611d2d2745 | |||
| f8aa1cd5f8 | |||
| 969053a240 | |||
| 123b7f5433 | |||
| 067b8144ad | |||
| 51604302e2 | |||
| df000bc99e | |||
| 30fa911832 | |||
| c4b7f50609 | |||
| ac368863aa | |||
| 8695ba6fdb | |||
| 4fb336bc9e | |||
| 6c249172d4 | |||
| ab3e4afb53 | |||
| 419962ab04 | |||
| 54a056e5c3 | |||
| aad378a43d | |||
| e0f9e6e50f | |||
| 3c9d592d8b | |||
| 3b34ba79cb | |||
| 3218791830 | |||
| a48bfe9c82 | |||
| e7b69dea61 | |||
| 800cdd94e7 | |||
| 5038342384 | |||
| 5060b26dcc | |||
| df8cfdac56 | |||
| 55ea197d4f | |||
| d48f61ea33 | |||
| 7411e69223 | |||
| 0adc0f616e | |||
| d5f93b5c45 | |||
| dbfe640bac | |||
| 8b41c304f1 | |||
| d76d79fcc3 | |||
| bf7af8fa2c | |||
| e40f51cfc5 | |||
| e3cfe9f009 | |||
| c7d6aca2ad | |||
| 47afc7817f | |||
| 752fa64cc3 | |||
| 7d6472a160 | |||
| 835127ac21 | |||
| 77e19e148b | |||
| a70234c9b6 | |||
| 1034a15ddc | |||
| aad2ff51fc | |||
| 0031d9174d | |||
| 705a635059 | |||
| 8184d513e3 | |||
| 7ccc0b83ff | |||
| 19c24e2a4d | |||
| cb83de4769 | |||
| 46cfa01622 | |||
| 45a0b25ee4 | |||
| ac59cc4633 | |||
| cdc5106ef9 | |||
| dff13626c4 | |||
| 436d55932d | |||
| 2a6fb3ba81 | |||
| 4725a83406 | |||
| b4cce7db00 | |||
| e3a96fa724 | |||
| 6b634322ff | |||
| cc4864231f | |||
| 7fe7742430 | |||
| 9c98d9d01e | |||
| 6fb1e749bc | |||
| d58a77cc60 | |||
| 9b6ba67186 | |||
| 57178b8a5b | |||
| e9fa76c34a | |||
| a099bd25f6 | |||
| c785a17ca8 | |||
| 9197d583ce | |||
| 07ca64c8a0 | |||
| 07892ccf18 | |||
| b4ea70acbb | |||
| b8a7f36c85 | |||
| 82823d6945 | |||
| 12cb8fd59d | |||
| 39443bf4d1 | |||
| 3636cd6940 | |||
| 45866e6771 | |||
| 7b253311a0 | |||
| 73ac1c5d43 | |||
| e08713707b | |||
| 48d8e3bb24 | |||
| 8b6c3b2f5d | |||
| 78001b8298 | |||
| bd513eabc6 | |||
| 7fae0d9fb6 | |||
| bc4514c905 | |||
| c99525131a | |||
| d09dfd1f61 | |||
| ca81ee3967 | |||
| 533a6576b8 | |||
| 0366de36ce | |||
| d92da5ceba | |||
| 9bb8dcac3d | |||
| 8c13c64088 | |||
| 7a2023ead6 | |||
| e02c4b6f98 | |||
| b71665ae0d | |||
| 9a84811f35 | |||
| daff3abdc1 | |||
| a175e58107 | |||
| ea9dd48da9 | |||
| 547f4d1180 | |||
| 1ff49e1faf | |||
| 64f7c6bf64 | |||
| 0270772463 | |||
| 4b9bbfb663 | |||
| d5d5fb698f | |||
| e09ad39161 | |||
| b4087452d1 | |||
| c6ad0fc337 | |||
| c878c613c7 | |||
| 5c78e0d466 | |||
| 0f38fdda30 | |||
| e4afc49ac6 | |||
| ac45bbe53e | |||
| ea153d4cf6 | |||
| f085e8e199 | |||
| c09afe55a3 | |||
| c51a923160 | |||
| 591b45d2e8 | |||
| 19eaec336d | |||
| b113bdb774 | |||
| 03f299bc3b | |||
| 9c591b3c08 | |||
| f3b2011fef | |||
| a061347f5a | |||
| ffbd34c95a | |||
| 847a28d133 | |||
| 0ac5db45d1 | |||
| 2703401f08 | |||
| f4da984399 | |||
| dbee9f6816 | |||
| 2d98a46d94 | |||
| baf6048377 | |||
| d8a9b699ad | |||
| 873749b130 | |||
| 58e99ca469 | |||
| b84cb8428b | |||
| d9f1e4253f | |||
| cb867e7657 | |||
| b959ecd671 | |||
| 9c8f0c571d | |||
| 7c176f4b69 | |||
| 73ec370989 | |||
| aa8d6f7c79 | |||
| d7595f1ecc | |||
| 50faa49c0f | |||
| b64475bcfa | |||
| 36ba1d9953 | |||
| 2592841793 | |||
| b862126209 | |||
| ade0450c0e | |||
| baabc5d16f | |||
| ee19c8e856 | |||
| 45a30990ba | |||
| ab51ecddb4 | |||
| 836f72481b | |||
| 831af77eff | |||
| b071cdb843 | |||
| a0c6add732 | |||
| b93e97dd76 | |||
| 8c5d421c45 | |||
| 0709288eac | |||
| c46ea56af2 | |||
| c39d1283f8 | |||
| c9fce7e4aa | |||
| 5a30883082 | |||
| 9b3d15aa46 | |||
| 56c16c7078 | |||
| 238095b862 | |||
| a219a3d2eb | |||
| b0bc1fa310 | |||
| 6f8aee0c1c | |||
| 02c6354003 | |||
| 641e746ee1 | |||
| 4d9ffdb025 | |||
| a214c14a4d | |||
| 87549a3e6c | |||
| 9f7df23788 | |||
| c42ae97bb2 | |||
| e6e34a7baf | |||
| 1a4113009a | |||
| bc85c1b421 | |||
| f6aea86aeb | |||
| 86c5f3675b | |||
| db46d50eff | |||
| 4f71976958 | |||
| 2fd251e7b1 | |||
| adfe3ad165 | |||
| 82e9923be3 | |||
| 08ae1917e8 | |||
| e779c3ca17 | |||
| 173f4e8092 | |||
| de7edf9e78 | |||
| 6b6f1eeb9b | |||
| 0847ccc360 | |||
| 0461a78cdb | |||
| 997baa3b77 | |||
| e57481de7d | |||
| 6931161dce | |||
| 9fe4de811b | |||
| bde3b98582 | |||
| 617752ac34 | |||
| 29815e0dd6 | |||
| 03813259cf | |||
| 8e87ce6436 | |||
| 1a8f3d0e97 | |||
| c1e0d70646 | |||
| f5a37ec3b4 | |||
| acb1cef19d | |||
| 20c32ea6ed | |||
| 35ea0b5447 | |||
| e818d37dd6 | |||
| 048a4ac1e3 | |||
| f665642e71 | |||
| 6fb604a9a0 | |||
| 02e3697817 | |||
| 1c72798229 | |||
| 761d3735a7 | |||
| 71c2770df0 | |||
| c6be71c4ff | |||
| 754ccaa9b4 | |||
| 798b950046 | |||
| c9c35eb74e | |||
| f1f5dacb6f | |||
| bc7f9f7534 | |||
| 9e90cb260a | |||
| c854b657c1 | |||
| a72fbc00bb | |||
| 1a0b38bbfe | |||
| a853850116 | |||
| 405ae519dd | |||
| f3366178ea | |||
| 38fcfee9a4 | |||
| 25811ed6d4 | |||
| ff3277edc7 | |||
| e21c8e5fe9 | |||
| 3ca0ea2e50 | |||
| a917567e92 | |||
| 66fd5e716c | |||
| 634eb0973b | |||
| a91990138b | |||
| d752fcb127 | |||
| 66d5850a76 | |||
| df2d151063 | |||
| 31e27e84a9 | |||
| a7bccae5d3 | |||
| 286de25c15 | |||
| 5d601621cf | |||
| 56c9be6f8c | |||
| 64dcfa21b8 | |||
| 6c1ce82e5c | |||
| efe11d0105 | |||
| 85df496657 | |||
| d20bce9967 | |||
| f110926288 | |||
| fb12e63bb1 | |||
| 8669a291fb | |||
| c1c1f5d60e | |||
| 720dbabae1 | |||
| eaa63e679e | |||
| 689a042e88 | |||
| 04727cf2bc | |||
| ec2bdb7437 | |||
| df997c8e3c | |||
| 15fd2e884e | |||
| e2e7facad0 | |||
| 0abac8c5c4 | |||
| a633aa69c3 | |||
| 32440d6993 | |||
| 7b20bc38a4 | |||
| be720257ca | |||
| ee5a7cf1ef | |||
| fc65e5a7a6 | |||
| 99ce5cd4d4 | |||
| 4395bfd661 | |||
| 5babe8df3f | |||
| 5dd91d0cdc | |||
| 831fc80971 | |||
| eff24ed836 | |||
| 07e653468f | |||
| a2af46845d | |||
| 1e98fe2920 | |||
| 675aa92b53 | |||
| e40cdc8a7f | |||
| 50100a74bb | |||
| b89f2e39c9 | |||
| 0aec1340b2 | |||
| 3622b77034 | |||
| 7e62765a09 | |||
| ed3dd93a17 | |||
| 1d244f6689 | |||
| 1421e63aa8 | |||
| 50fb39d238 | |||
| f127bbebe1 | |||
| 20d8c9f4ee | |||
| 5e9d153c6a | |||
| 1a1fadcc2f | |||
| 87e69ca564 | |||
| 5c1d89b145 | |||
| 595d2235d3 | |||
| 38fc43cada | |||
| e8c8021fd5 | |||
| da63e843d8 | |||
| a450990ee2 | |||
| bfae240209 | |||
| 0fa58531e8 | |||
| 45c363685d | |||
| 8e354cc36e | |||
| 9eb0562844 | |||
| 26c7d3dadc | |||
| 986fa13585 | |||
| aa8ab65ae0 | |||
| 2d44ae3a4d | |||
| 810f7fb803 | |||
| abdc257332 | |||
| 59ba9102a6 | |||
| daa92db25c | |||
| 3df10d1d0a | |||
| 824ce1cacf | |||
| 4a8f336118 | |||
| 6ec6f9501b | |||
| b1ecb2f0eb | |||
| 474ce10e7e | |||
| 3c40c22049 | |||
| 9281db73a7 | |||
| 45a557f9c0 | |||
| 7698e79143 | |||
| 1c584e937a | |||
| 6ef5c76e1a | |||
| eebc4951de | |||
| a7e428a21c | |||
| 9626e9bbb6 | |||
| e7f40a4c0e | |||
| 6b076e4fd4 | |||
| 79864ffd5f | |||
| 4d6f758994 | |||
| 442641eeab | |||
| ca2e2e1f41 | |||
| a74b847e65 | |||
| 17f9219cd0 | |||
| 0595f38fe4 | |||
| e2aa6b8970 | |||
| 67c63f1410 | |||
| 70cce0e1ee | |||
| 7048281931 | |||
| 9f76e9e230 | |||
| 8c9a3055e1 | |||
| 0cd562c528 | |||
| 4e4f4e700b | |||
| bf60955e5e | |||
| c53af39c92 | |||
| d034874fb7 | |||
| 5ec9716eac | |||
| 4c671012bf | |||
| 8db75ffa36 | |||
| 58844622a0 | |||
| cfcf29a62e | |||
| 064994eb1a | |||
| c011e8af62 | |||
| b753b18682 | |||
| 8896ebadda | |||
| a6050e6f27 | |||
| 1e046c0033 | |||
| 34cc546f00 | |||
| b21aeedae2 | |||
| 0872002dae | |||
| c4e4e38c4f | |||
| 63d3c9b1e0 | |||
| ccd919d4d6 | |||
| 88bd5b2534 | |||
| 0b8d4850f0 | |||
| 4012434102 | |||
| 26f8e5aa9e | |||
| 06b2bf0094 | |||
| e596d48729 | |||
| ceacdc8d08 | |||
| b4faa128b7 | |||
| 9ffeb8031b | |||
| 6a2c5169a9 | |||
| dea307179f | |||
| 0ab6e29792 | |||
| e718766073 | |||
| d3cdca6b33 | |||
| e48b642101 | |||
| 9acb597d5d | |||
| 00d960d61e | |||
| 59568fb5c8 | |||
| bc7bf72660 | |||
| 5b4e209816 | |||
| 4afa59a783 | |||
| 084fe6f063 | |||
| 9554636971 | |||
| f246fc018d | |||
| 2df3574cfa | |||
| c976d190a5 | |||
| 18baab0c64 | |||
| b73bd519be | |||
| 21c67b4777 | |||
| 2f507091b2 | |||
| 081305fab7 | |||
| a10fb703fc | |||
| 6a46efcf45 | |||
| 0ca8fe2f45 | |||
| a253e01dbd | |||
| 8b80f73641 | |||
| 6a8483a898 | |||
| 71e2cbe856 | |||
| af7b53814d | |||
| 147cadee16 | |||
| 80baa13814 | |||
| 71aae620ea | |||
| 7c3d5d739a | |||
| cf908fcfeb | |||
| f52e76fe30 | |||
| 77478f9515 | |||
| 64809f553b | |||
| e2e66e0eec | |||
| a5e7ff6fc0 | |||
| 78a2f2e8f0 | |||
| 0e1da59f0c | |||
| 1d47374758 | |||
| c6bbfdc7f0 | |||
| 7184566b4b | |||
| 418aeb281c | |||
| 5a1192df16 | |||
| 4b79bcb8d2 | |||
| 5f83918c06 | |||
| da08b18ec5 | |||
| 9d3b8eeeaf | |||
| 607505a316 | |||
| e7cf10aea8 | |||
| 79562dc502 | |||
| 6ef49349ff | |||
| 28da925c52 | |||
| 9083f511b5 | |||
| c2bb717a69 | |||
| 2408aa48c1 | |||
| 45286468c9 | |||
| 6f8c007a66 | |||
| 0633ed6819 | |||
| 6c3864983f | |||
| dc6f6e2b93 | |||
| 63343d4224 | |||
| ca07c18b93 | |||
| b225b5a6e6 | |||
| 45564c940f | |||
| 69d391d985 | |||
| c38da8cabf | |||
| f8e3f2fdc0 | |||
| ae7352831b | |||
| 72bef6bc86 | |||
| 4eb2ac854e | |||
| 7539504a8c | |||
| 0220c8ced1 | |||
| ae700cfbb8 | |||
| 5a5a16c983 | |||
| c35a267cd3 | |||
| 46b65bc546 | |||
| c48a81a068 | |||
| 6f545beffe | |||
| 6e403abf75 | |||
| f297b4b391 | |||
| 16e7c429fc | |||
| 7fcd66588c | |||
| 8762e8ad15 | |||
| 3a393b6825 | |||
| 7859e64db1 | |||
| 163abb107c | |||
| 5c9a27a6d6 | |||
| aa0208072c | |||
| bdbf931046 | |||
| 320c8481e6 | |||
| cdf50b2560 | |||
| d930e2418f | |||
| 85f7d81ce4 | |||
| 6b0ead59d2 | |||
| 155b463f3f | |||
| 1d359d9ed2 | |||
| 3fdbfab98b | |||
| c2df2acb2c | |||
| 025345d99a | |||
| 601dea6d29 | |||
| c9f4b6e55c | |||
| 1d676314e2 | |||
| 5bccd010cb | |||
| 8735e0d99c | |||
| f007fb494a | |||
| df2e15fe8a | |||
| 31ecc8a49f | |||
| 25028e1d67 | |||
| d8f092b60b | |||
| 9050377526 | |||
| cb6590e7ef | |||
| 2c7a83f8b9 | |||
| 489c7b46ee | |||
| 762f460e23 | |||
| d3e02e23e5 | |||
| f12475ea99 | |||
| d966519d95 | |||
| 3f14d4bf64 | |||
| dfc69c9c8e | |||
| 53de6d018b | |||
| 8c78493a51 | |||
| 3e8e839cd1 | |||
| c53bf2b7e3 | |||
| 219ad40088 | |||
| d9042b3db2 | |||
| 9099197a88 | |||
| a2f52edd47 | |||
| bba136c9fe | |||
| c59586a934 | |||
| 7440cb0963 | |||
| d8805dc801 | |||
| 45b0bb24c4 | |||
| 759a9bd365 | |||
| 48214f925b | |||
| 2c0e9faa32 | |||
| 80c3056daf | |||
| fc0befd773 | |||
| 61bd491969 | |||
| 5022e05c25 | |||
| fd64a33d3e | |||
| d7d7c1e98f | |||
| 8918c71312 | |||
| 01612f1b47 | |||
| 2e502ce82a | |||
| 3c79be2910 | |||
| e03a819176 | |||
| 6a41ab0b6d | |||
| 22b4e25c02 | |||
| c5e558172d | |||
| e71e6835de | |||
| b449353d2f | |||
| 94c5211ee6 | |||
| 75130fcca3 | |||
| 96ec28c9a8 | |||
| 1a11238808 | |||
| dc81147681 | |||
| 3f172442be | |||
| b049688d31 | |||
| 04799c89dc | |||
| ac99dc0ac4 | |||
| 8dc5c4e00b | |||
| edac611444 | |||
| 37a8380521 | |||
| 60a1de42a2 | |||
| b2beeb653b | |||
| 6ff5dcfa50 | |||
| 9a5c105db9 | |||
| aea28ce499 | |||
| c8cc899128 | |||
| 55747edaae | |||
| 15af6502a0 | |||
| 8c4771a738 | |||
| cbef100a17 | |||
| e6900d9a17 | |||
| 2f6e793df4 | |||
| 0dd79fe10a | |||
| 84f2e652e4 | |||
| 757728c96c | |||
| a570d6d178 | |||
| 2fee75517d | |||
| 580f4120dc | |||
| f874a0ad57 | |||
| a56090e70f | |||
| f0d0e0637c | |||
| eae38fa0c6 | |||
| 93f0b0e2e8 | |||
| 979f8bcfee | |||
| b9f11298e8 | |||
| 84f8e3a4b4 | |||
| 551c58db4f | |||
| ff438a6219 | |||
| 84a68c5977 | |||
| 889eb7d846 | |||
| 6eaecc8793 | |||
| df6bf1e04d | |||
| ff1ccdb7ee | |||
| d7fc221a6b | |||
| e725533ba7 | |||
| a468053f46 | |||
| 1c85b30e9f | |||
| 1b919b9fae | |||
| 1cf6c5233e | |||
| 3fcbcacd43 | |||
| 6677177534 | |||
| c3f23d1390 | |||
| af5f3cbd95 | |||
| 86be1acd7a | |||
| b9244df8f7 | |||
| 63e7fb85ec | |||
| 79f4dfcaab | |||
| 713aa3e0f9 | |||
| de79e43fb1 | |||
| c38eda5799 | |||
| 188428a7a9 | |||
| c17477abff | |||
| ee019510ca | |||
| 7eab3fe5b3 | |||
| 8d9e3ded74 | |||
| 48b88af88a | |||
| 516e3fbc65 | |||
| 359e7d68d4 | |||
| d4601ecb44 | |||
| ed700cb070 | |||
| e5742772ae | |||
| a809a69ca0 | |||
| 202de3499f | |||
| 7f0c73606c | |||
| b33ce8d264 | |||
| a45f7a86f2 | |||
| ffc5a4d24f | |||
| 2e055d1909 | |||
| 1a3bcc5d27 | |||
| ad0aadbf29 | |||
| d544c43744 | |||
| 9c2104391b | |||
| df82a0f5d0 | |||
| 95db33e614 | |||
| f81740f28c | |||
| eab775b9a2 | |||
| 9b82860154 | |||
| f2c594569d | |||
| 3017010ef4 | |||
| f426c75696 | |||
| f918fa2a32 | |||
| 5a50656249 | |||
| d5fa2d48db | |||
| 125ce06e4c | |||
| f8734db1e1 | |||
| 7e434932ae | |||
| 7eae439624 | |||
| 5e5d88ed8e | |||
| a0a087fc91 | |||
| b85d58db85 | |||
| 2b6e3cf993 | |||
| df45ac46b1 | |||
| 950289db9f | |||
| 98c29c4a4e | |||
| 6458d7e0db | |||
| f61100deca | |||
| adcffab78a | |||
| eae8fd7ef9 | |||
| 0f19fc64fd | |||
| cfffc76aa6 | |||
| fcd1366d26 | |||
| 8cd90280c1 | |||
| 2968399f2d | |||
| 66d01d8d7f | |||
| 7486bc640f | |||
| 7d6926e19f | |||
| ce228c9003 | |||
| 12f8a15b8b | |||
| 8694d9f9b4 | |||
| a3a001633b | |||
| e4840d35d6 | |||
| e5b4ce06b9 | |||
| a819d657db | |||
| 96742404fd | |||
| 93a0facd93 | |||
| f5ed9292e7 | |||
| 4e4fb91a6f | |||
| 55e287c890 | |||
| cc7655d804 | |||
| ee84d53cdc | |||
| 9e1692e3e0 | |||
| 3f3697fbfa | |||
| 853fa482f6 | |||
| 8bf128dc0a | |||
| 69ad8bc672 | |||
| db6aab1cf6 | |||
| cfb25840f9 | |||
| 64debe08a8 | |||
| 460d0780a1 | |||
| d03363b376 | |||
| de2374ad40 | |||
| 676d87129c | |||
| 4a1c1ebe3a | |||
| 681b873ba6 | |||
| 86431d3d9a | |||
| 4a9a01a89e | |||
| 7cfde78198 | |||
| 3c963330e0 | |||
| cd23f88d36 | |||
| 5bff437640 | |||
| 08c035e7d8 | |||
| 3da7e8d7ba | |||
| bf190810dd | |||
| 2227642c13 | |||
| 76ee695a59 | |||
| 0d68e90b59 | |||
| 8e52e2fb10 | |||
| 373350df1e | |||
| 835a230323 | |||
| 3b80a01813 | |||
| 89ac54520a | |||
| 189575efec | |||
| 39dc439cd8 | |||
| dc08f49bbe | |||
| 9fb0b00e75 | |||
| 96dc279ebd | |||
| fe943ca010 | |||
| 3396e10613 | |||
| 6bfb0205fd | |||
| c4be764f61 | |||
| cb09fb570d | |||
| 7e80a4fe0f | |||
| 44d1527759 | |||
| 5e6fcc9669 | |||
| bdb27fef1b | |||
| c33fe04645 | |||
| 8707d658f1 | |||
| b1618a88be | |||
| b4fdb0cc26 | |||
| 66ce8abe01 | |||
| e6251ea4b0 | |||
| f9cb2ece6e | |||
| e713273942 | |||
| 18c4e34af8 | |||
| 63c4eb17e4 | |||
| 5cc66d60dc | |||
| 9076d3b82b | |||
| 6f95f162d0 | |||
| 33910eb310 | |||
| dbcb333ba9 | |||
| 76c1045444 | |||
| 90bf466495 | |||
| b581bf7bac | |||
| caeb999d6a | |||
| 45e2de86a0 | |||
| 2644b4d75a | |||
| 8e41711e82 | |||
| 073bd74b3c | |||
| 62cf8bebd0 | |||
| 2ad6eb0c72 | |||
| 2e46ebea7a | |||
| c55d38534d | |||
| 99c296ff3a | |||
| cae7f34ab2 | |||
| 258b0c777f | |||
| d1d48ec31d | |||
| ae56abc929 | |||
| b3cc973ade | |||
| cbb4b11660 | |||
| 71764eba03 | |||
| 17b7fcde27 | |||
| bcb890eab1 | |||
| 5a6f6d97a7 | |||
| af244718be | |||
| 6397381950 | |||
| c514aad9a3 | |||
| c5d1897acf | |||
| c21c57605a | |||
| 43d70c7fab | |||
| 864d4981ed | |||
| eeff5ea3ae | |||
| 93c0dd704e | |||
| b139ebfe88 | |||
| bed880248c | |||
| 1dfea17bce | |||
| 33e2fa7f9e | |||
| 4f38a87eed | |||
| 54e30c35e9 | |||
| 911ca7f995 | |||
| bdea0930da | |||
| ff8e002d33 | |||
| 26ff8e62eb | |||
| 84bd7da620 | |||
| 1b7a7dc15c | |||
| efb48697fa | |||
| 91ff0f76f8 | |||
| e113d5c549 | |||
| c0f596a00e | |||
| c41d67c4ac | |||
| 16ebc72099 | |||
| 20661fc902 | |||
| 3b4d91924f | |||
| eb281a7574 | |||
| a2670dc3b5 | |||
| ade5166977 | |||
| 68a5073b29 | |||
| 6c26cbe9ba | |||
| de6cd88870 | |||
| 6b4da88ef0 | |||
| 62cd59549d | |||
| 4515844219 | |||
| 6c18ca3f45 | |||
| eab45f0c48 | |||
| b47d95205f | |||
| 881880fc34 | |||
| 72244be201 | |||
| aa978ce0e4 | |||
| 4ba1531cda | |||
| c26e0f5923 | |||
| c73eb548c0 | |||
| 54ccf9edc7 | |||
| 29900a3cc0 | |||
| b02020f801 | |||
| ea5e38fdd1 | |||
| e53623e854 | |||
| 81c13825c5 | |||
| e98621b887 | |||
| 735b07f0d7 | |||
| 81f7f91d73 | |||
| 08f71f4469 | |||
| 299f5e8732 | |||
| ac89b395af | |||
| 3ac77121f5 | |||
| f2170a09cd | |||
| 9c7da16c1a | |||
| 183636289a | |||
| 14f64b5b20 | |||
| 6ace0961b3 | |||
| c817b63927 | |||
| de4d3d97f2 | |||
| 996d38b61d | |||
| e38ab163c4 | |||
| 007a5cb5ca | |||
| 2dca30305f | |||
| 0c9001e3d1 | |||
| b816e2b3a9 | |||
| 957a34866b | |||
| 70cfbada04 | |||
| 043beb03a9 | |||
| 7487b468d3 | |||
| 0f619c2cb6 | |||
| b2a9ee495a | |||
| a1e4400994 | |||
| 949f16fba8 | |||
| 5bd56cae81 | |||
| 6a61b692aa | |||
| 86b6b20200 | |||
| f37ed16270 | |||
| a0a3457733 | |||
| 8a98f466c5 | |||
| 1af0188a3c | |||
| a945e2c2a5 | |||
| a66c72a0c2 | |||
| ec62763e87 | |||
| 5f4aa39263 | |||
| 0898723a45 | |||
| 01a7ae8bd4 | |||
| 1d9f5e8cfe | |||
| 5e81d83648 | |||
| 2475b46375 | |||
| a90de82e45 | |||
| ecfcc88dda | |||
| 77b98f7081 | |||
| 00c5f7d5d4 | |||
| 050635b2cd | |||
| f1b67935b3 | |||
| 00be6ffb89 | |||
| 38d65d38d1 | |||
| ccd830a270 | |||
| e1836a222c | |||
| 7ddc1a1553 | |||
| 5fe1d3f12f | |||
| 76bc412fdd | |||
| 57e812d336 | |||
| 6379171fa6 | |||
| 50414d7fed | |||
| 40a04bc5d6 | |||
| 7535f22b10 | |||
| 4ba93d9d86 | |||
| f67d1412de | |||
| c41248f402 | |||
| 5cfe3b88c7 | |||
| bd562a374a | |||
| 284917796a | |||
| 27ad3c38b7 | |||
| eb52d333ae | |||
| e217d5e79b | |||
| 3c689a4697 | |||
| 4123e4cf69 | |||
| 2c2071285a | |||
| 3f135c832e | |||
| e8d39e706f | |||
| 52e0e70908 | |||
| 28dda32f0e | |||
| bff93de116 | |||
| c89929a940 | |||
| 312d1735ef | |||
| 5e60085371 | |||
| 3ede538fcb | |||
| 5c270810d0 | |||
| 0dec70847f | |||
| 19f1c4251c | |||
| d90245bf32 | |||
| 2c7d2893c8 | |||
| b3eb38009d | |||
| 3f1dba86a3 | |||
| 6a5efdeb29 | |||
| 8a46aec294 | |||
| fd831f569c | |||
| 2297ba3c86 | |||
| cd4d15e0e2 | |||
| 044e141848 | |||
| d73822046f | |||
| 148b15d473 | |||
| 748c58d52e | |||
| a79b642613 | |||
| 616379c54b | |||
| 91663f0202 | |||
| f078499dfb | |||
| 87a0c671f6 | |||
| 8a76d32ded | |||
| 30fdde614d | |||
| 494de7a9f4 | |||
| b8697e7204 | |||
| 479a83fdef | |||
| 437ed07368 | |||
| 771f8ad02b | |||
| 56c9ed3197 | |||
| 1ef16fde92 | |||
| b7b31aad8e | |||
| 2b514cc10e | |||
| 5cff11ce4a | |||
| 6f380a6f12 | |||
| 0ec76d678d | |||
| f29d779425 | |||
| 1fb19ee023 | |||
| 124c287537 | |||
| c43de26d83 | |||
| 3cb37bf7b0 | |||
| 0b461f05ca | |||
| 13be6b75f2 | |||
| 7636108844 | |||
| 1914fa519d | |||
| bfe51d6555 | |||
| 5341e355ce | |||
| de012a23ee | |||
| 108b13fd0d | |||
| 1c0f2f2b81 | |||
| 0a17ff3b3a | |||
| d89e31d155 | |||
| 5e5abcdc3f | |||
| 0422efcf03 | |||
| 70c53a4f67 | |||
| c6523ed9cd | |||
| 2a7e59ae5d | |||
| edf339a942 | |||
| b3bb860195 | |||
| 9bd13c8ed5 | |||
| 1c44c42b52 | |||
| ef77cdfe3f | |||
| 727d29ee07 | |||
| 52b1b19b02 | |||
| 8b446edc06 | |||
| 42d1f40b9c | |||
| b7b4391cff | |||
| 0765b82a39 | |||
| 8dec405f4f | |||
| 4d73638a8b | |||
| ca49454615 | |||
| b20967559b | |||
| e1dc5a2e81 | |||
| a4333dfcb6 | |||
| a65e812b45 | |||
| 32e052a87b | |||
| e5866a3ff4 | |||
| 78bd7713a9 | |||
| 5d8403be5b | |||
| dd20da89d7 | |||
| 191a75fd22 | |||
| dbcaf28f39 | |||
| 13150ea553 | |||
| 14a9c99496 | |||
| 3fd8c7f928 | |||
| 9f9cc0e1ec | |||
| e115aa2c4e | |||
| ff49401f3a | |||
| a5a39ac3d6 | |||
| 7621252f46 | |||
| 0c120494b4 | |||
| 76b14af7ec | |||
| dda4f26102 | |||
| 3a3a94b610 | |||
| 6c470c1247 | |||
| 456934c737 | |||
| 212fc0838a | |||
| 2c3007eb2b | |||
| ef34ad7600 | |||
| 546501a553 | |||
| 37c8aacd8b | |||
| f6857f66ba | |||
| 527ba719f4 | |||
| 2c12fffdf6 | |||
| 84009baeb0 | |||
| c12ea8428e | |||
| 5c24f8c365 | |||
| 0e45f16b19 | |||
| f22a71509b | |||
| ae04253ba4 | |||
| 7656c6981e | |||
| d1add033b1 | |||
| 3c9d9cd8d6 | |||
| 607afeee50 | |||
| e970b6fd04 | |||
| f4a96e2715 | |||
| 7a969b5d7b | |||
| faf7f8ad03 | |||
| 2d8eaa0e8c | |||
| f528ba59ec | |||
| 6985bd6375 | |||
| cbf7caafb3 | |||
| b0f4f8d636 | |||
| 77f8df02e5 | |||
| 09b35266f7 | |||
| ff34c7cc9b | |||
| 0b8a176ff8 | |||
| 187e56c6ba | |||
| 77c6daf240 | |||
| b626d3047d | |||
| 2af285e972 | |||
| 09e50bb0e1 | |||
| 3d574f4169 | |||
| 2efc97b64f | |||
| 93dc57c08f | |||
| 67c963f60d | |||
| 95e60ea68e | |||
| 52904cbe3e | |||
| ebd88a407d | |||
| 0ed41f97fc | |||
| 133d13ff3c | |||
| 7112c8e791 | |||
| d44606d205 | |||
| 8564c86236 | |||
| 77acdecb1b | |||
| fb5d693b54 | |||
| 1cba68401d | |||
| aabe905f63 | |||
| 8ac67536de | |||
| f4c4738617 | |||
| 4c71f40bc2 | |||
| 4d08dc77b2 | |||
| 7924a62db6 | |||
| 5faa11e0a2 | |||
| 72b1178011 | |||
| 6d6961d961 | |||
| 091fe0a40a | |||
| 2d42ca522d | |||
| 79ccda3883 | |||
| 020351e56b | |||
| 40f7980c18 | |||
| aca5522245 | |||
| cc168db81b | |||
| 0a91b8b360 | |||
| 61747bef85 | |||
| 6af6649f70 | |||
| 3867cb5e97 | |||
| e18002dd03 | |||
| c19ff9b2ef | |||
| 656fcf9847 | |||
| 4a301bd09e | |||
| 789ec55dbe | |||
| 5303da4b90 | |||
| 8f19fde27a | |||
| f237d424fa | |||
| ea9695ac16 | |||
| e98d2c8a27 | |||
| 5b212bb8bc | |||
| 7cae9b4ce5 | |||
| 76a66cf400 | |||
| 21db53e232 | |||
| ca4e017e02 | |||
| 75221baa19 | |||
| e6996ff22f | |||
| 0e523204d5 | |||
| f1adedd689 | |||
| 031b640343 | |||
| 66b452e90c | |||
| c553859c3b | |||
| 3347887432 | |||
| 9a19717556 | |||
| de1437102e | |||
| a006fcec40 | |||
| 10d66fb871 | |||
| 439f74c540 | |||
| 8694bd6af9 | |||
| c62efdc44a | |||
| 74ce1028ae | |||
| 4fa9b4a741 | |||
| 2c4d578f7c | |||
| 07ace480ed | |||
| d4e7cf75ce | |||
| f154bfcfc1 | |||
| 8b0d1b4a8c | |||
| dd8f923bf5 | |||
| 19d9cd282d | |||
| 3132998c5e | |||
| 0b78d2711c | |||
| c3c3586628 | |||
| 05064402b1 | |||
| 7559cb4d99 | |||
| 9a77517cb4 | |||
| 3abbafa530 | |||
| 2cd7967ec4 | |||
| 73d0fc4973 | |||
| 94cacc8abc | |||
| 74fe176d2d | |||
| 2736363d93 | |||
| 450eedda02 | |||
| b715220e5b | |||
| 8e6405bc7c | |||
| a66be45e72 | |||
| 45dfa52512 | |||
| 784605f974 | |||
| 7d09e67a5c | |||
| ab4f5d9a84 | |||
| 9ad4665270 | |||
| 4e541dc0ba | |||
| 569808af6d | |||
| c9726ab05b | |||
| fba60f05a0 | |||
| 1d7ba2210a | |||
| 8885412350 | |||
| d712a83c69 | |||
| 6f756acb33 | |||
| a1dea6a756 | |||
| 2b400a7f50 | |||
| 3499127b91 | |||
| 2cfd6c20e7 | |||
| 69a2d10c57 | |||
| cbd2561e22 | |||
| 88b46d1720 | |||
| 98616f443b | |||
| 2fb6ab4f44 | |||
| 57cb15486e | |||
| d50908e10b | |||
| 0b71549834 | |||
| 20ebe3ac85 | |||
| a545520d6b | |||
| f4516718a0 | |||
| 7c557d627a | |||
| 8f8df34342 | |||
| 04d44d8a15 | |||
| b2f22b2d87 | |||
| a19c17cfb9 | |||
| a3a44f0cef | |||
| 01eb42dd10 | |||
| bf30d7cd29 | |||
| ed7cc96889 | |||
| b17070adf5 | |||
| 698545006f | |||
| c7a3fb4341 | |||
| db6cd541c2 | |||
| 0b15c369d6 | |||
| 31fb4f6a15 | |||
| c43f724189 | |||
| ff87cdfebb | |||
| b8922ee846 | |||
| 1e8e5c0f7c | |||
| 9b816a321c | |||
| d8c224112b | |||
| 6c9b1f6be0 | |||
| 6a1378ebdb | |||
| 210342d337 | |||
| 49df15c021 | |||
| 07b02e6cf3 | |||
| 183e87d147 | |||
| 0eba11f1eb | |||
| a4cdca80fc | |||
| 5dadaf70f9 | |||
| bb7d4f7812 | |||
| 7af0dc1b43 | |||
| ad7a8e528a | |||
| ed9f3f3d55 | |||
| f781fd8ab6 | |||
| 9caf80bdc9 | |||
| b23cf5f1d8 | |||
| ce1465ae98 | |||
| 9d8f75d957 | |||
| 982e8df9b6 | |||
| 4c280ef015 | |||
| 142d81065a | |||
| 3089cc3b59 | |||
| 8d990018b5 | |||
| cc59a2b5fe | |||
| 4923d63a94 | |||
| 6f18a8a3ff | |||
| 8f895e54cd | |||
| ad37b8361b | |||
| 64609f823c | |||
| dbd48ac5b4 | |||
| e59de73948 | |||
| f16372efad | |||
| 94060e16b9 | |||
| 095f20ab6a | |||
| 9e9233fd76 | |||
| ba901d4453 | |||
| a6e9abfceb | |||
| fe1cab6a7f | |||
| 4915e9fea0 | |||
| 3601d36955 | |||
| 7953f6cb83 | |||
| 1d7e88635f | |||
| 20572c53af | |||
| 2104dbc682 | |||
| 1fdc43699c | |||
| 17b3434342 | |||
| 3b52914416 | |||
| 3a39dad30f | |||
| db24ea950e | |||
| d47b452808 | |||
| 03ecb23bae | |||
| 6cf91b1da4 | |||
| 22209108c9 | |||
| 0ac91fa34d | |||
| 4b6e75c0af | |||
| e16cbdbfd0 | |||
| bdb69d57dd | |||
| 6f35b27c29 | |||
| ceeefd1796 | |||
| bfec5d6a8d | |||
| 4197e7b21e | |||
| e1e32ecbfd | |||
| 41aefb1bda | |||
| 1ef8bb723c | |||
| 163704085a | |||
| 8c310b7c5c | |||
| 99d1c1903f | |||
| cced83ca96 | |||
| adaaaa3e3f | |||
| bbb5b68e91 | |||
| ff1fba403d | |||
| 8beb732cb9 | |||
| 9d26004864 | |||
| cfb98a39b0 | |||
| da616fc578 | |||
| 22367498da | |||
| 51c49cfac9 | |||
| 1f495205af | |||
| a4478b9497 | |||
| 5fea0cd693 | |||
| c25305e695 | |||
| 928d318f24 | |||
| 2dfd676c5e | |||
| 74e3d1ad8f | |||
| 47b255ed3e | |||
| 32fe383c10 | |||
| a590336118 | |||
| 1ae80da888 | |||
| 8d6fa34108 | |||
| 0a1d8f6b3b | |||
| 37fbc7600e | |||
| 1633d8ebb6 | |||
| b9cd6974fb | |||
| 2a3316ac5e | |||
| d33cf5f6d9 | |||
| 3d43586e0f | |||
| e4079f011d | |||
| 00f2548f1a | |||
| 3c94814e9f | |||
| 033c5eb188 | |||
| 726937dad7 | |||
| 2a53143bc4 | |||
| f90808749e | |||
| fd4af3964d | |||
| d77a7921b0 | |||
| 543c7efc0f | |||
| 2de20b93c7 | |||
| 1019550d4a | |||
| ea54505c6d | |||
| 7de42c1681 | |||
| 0af86d8cb8 | |||
| b184650835 | |||
| 9f7f764359 | |||
| 9ff0ad4734 | |||
| 63c9cdfc31 | |||
| e346fa1dca | |||
| 66d1015399 | |||
| b67649dfbd | |||
| 5c6b5ad948 | |||
| 6061a0a344 | |||
| fb3601dac6 | |||
| 60f868a08b | |||
| 3dbff3cab7 | |||
| b6652a61c6 | |||
| 5010903c78 | |||
| 25790bd0c9 | |||
| 3239150a61 | |||
| 9aff782907 | |||
| 7f3a32a69b | |||
| fe0e24357a | |||
| 1f1c3adaf1 | |||
| 2c12ea2fba | |||
| 5c5824bbb7 | |||
| d586269eec | |||
| 528a009b6b | |||
| ee0f54434e | |||
| 74f4f8e4da | |||
| 5f6d2b175d | |||
| 8440c596ac | |||
| 12558567ec | |||
| a2677a25a9 | |||
| a8579cadcc | |||
| 53baccaf96 | |||
| e210e58644 | |||
| 0d8ebd332e | |||
| 4cc7bb96f5 | |||
| 2b76c369ac | |||
| 85f351663b | |||
| 047821f7d2 | |||
| dda8912332 | |||
| 57279b14eb | |||
| b80f2118bd | |||
| 89688f93e1 | |||
| c27a1ddb41 | |||
| 7a15ed3e43 | |||
| 93fe79c0ac | |||
| 92eb19291d | |||
| 7b041bbaa5 | |||
| f89ba20d9c | |||
| 0ba1c124f7 | |||
| df48d71045 | |||
| 5437f7cc1a | |||
| f221bc6361 | |||
| 02dbd07506 | |||
| bd90280da7 | |||
| 9192375ddb | |||
| 4560b98336 | |||
| ec7aece135 | |||
| 511682db87 | |||
| 2e947ab85a | |||
| 8da4e546da | |||
| 3070493729 | |||
| e4a4e7926e | |||
| 64b2b23201 | |||
| 5a366bc1a0 | |||
| e34e4caf08 | |||
| cb92e3c54c | |||
| 039bf8253a | |||
| a8a34b391b | |||
| 5708f2ae0b | |||
| d9dc23afc1 | |||
| 62ff305fad | |||
| 98d8543334 | |||
| 400c4bb570 | |||
| d0955a5ac0 | |||
| 33513834df | |||
| 85fe22d7a7 | |||
| de2d041e47 | |||
| 07c6c5a841 | |||
| 427c3a9099 | |||
| e2319ceca3 | |||
| b40a890d31 | |||
| 4007c5e29c | |||
| 27515585db | |||
| db284c58a3 | |||
| 7ebdce5e42 | |||
| 2cd244fbd3 | |||
| 9fa2a5ff93 | |||
| 090225bef2 | |||
| 27d266546e | |||
| b1640515c4 | |||
| fe6226b276 | |||
| ea34207d07 | |||
| 56322005e2 | |||
| df691e62f8 | |||
| 5ee8785ede | |||
| 443ce106e2 | |||
| d861518d2e | |||
| d5a529e00a | |||
| d8e79101e7 | |||
| a7463872a8 | |||
| 5fdd8a4b72 | |||
| 982accde6d | |||
| 282b9066b8 | |||
| 787d788055 | |||
| 00498106fa | |||
| 5633d1bcb9 | |||
| a7b31fbf9b | |||
| b69e42b79c | |||
| 1dab45f407 | |||
| 4afb74c7b3 | |||
| 5d34575a91 | |||
| 134c8b99aa | |||
| 4637017707 | |||
| f3bd0e469c | |||
| 10adf1eba1 | |||
| da85c1f55c | |||
| f31ba5cad8 | |||
| 9cbaeb21f5 | |||
| 3238861f64 | |||
| 5239a2b410 | |||
| 41a58f3f2c | |||
| 1fbdabdcd0 | |||
| 2e2404dc5f | |||
| 1db65ac882 | |||
| 9f99d74e53 | |||
| 3c0e42ea78 | |||
| b8ff4ae2e0 | |||
| 2e06d1ce2a | |||
| 0872d10f43 | |||
| 1b4dded11e | |||
| 2bd3c0f74f | |||
| 02cb0f938b | |||
| 9ba117cde3 | |||
| 995e5bc6ff | |||
| e548dbfb19 | |||
| bc8cc75ad8 | |||
| 0d3ecd6dd2 | |||
| cf1f8487e7 | |||
| 62a39911dd | |||
| 84ddba5814 | |||
| 4386dc8774 | |||
| 37295e1ec7 | |||
| 7167a6d15a | |||
| 020e6f671c | |||
| 8158052ec7 | |||
| 857691983f | |||
| 6ec34a2dec | |||
| 69b69f9ea9 | |||
| 3925c6221c | |||
| 2bf6fac77d | |||
| b49e5e9984 | |||
| 7c923198e0 | |||
| 8eb59703bd | |||
| 47a3ac36cd | |||
| 98473487bc | |||
| 5dcde83f22 | |||
| d4d27b88f0 | |||
| 3294624849 | |||
| fc96620045 | |||
| 0729ffdafe | |||
| 4cabf9de53 | |||
| 2522d84a21 | |||
| c6e909c867 | |||
| 18cd7b657e | |||
| b815ba51a5 | |||
| b89e3bb0ff | |||
| 4967b27ff7 | |||
| ffce2005da | |||
| 37511c0e6b | |||
| eb1e39b3c4 | |||
| 6c45fff205 | |||
| e96e6bea86 | |||
| ca0c3eb7d6 | |||
| 78afe60343 | |||
| 1fc26a63a7 | |||
| e43515f653 | |||
| bc65057eb7 | |||
| a881c90b2e | |||
| 1978949b22 | |||
| d4839b9c78 | |||
| aa58665740 | |||
| f685c67275 | |||
| 3b27ae5fa9 | |||
| 3a8e5e0bbe | |||
| 211491f3d2 | |||
| 6a74ebd62e | |||
| dc2a9c0702 | |||
| 73d762cf0c | |||
| 5ee62be166 | |||
| c147e3bff4 | |||
| 1f1ed2bf60 | |||
| 31d9802cf4 | |||
| bbbfa4d5fe | |||
| 79220556df | |||
| befaf65ab1 | |||
| 54c322da7c | |||
| d05c09a33d | |||
| 641d04a50e | |||
| 81f62f58d7 | |||
| bdc7b3b754 | |||
| d0a6f82cc2 | |||
| eb6050cf27 | |||
| 48b3a34182 | |||
| 3377229966 | |||
| c2082925c7 | |||
| ec443b811b | |||
| f82e370392 | |||
| 1303740611 | |||
| edbf0761d2 | |||
| e6a06832bf | |||
| a116a1fb8d | |||
| c87f2f5b56 | |||
| e4e5745101 | |||
| e9c8584656 | |||
| b30d22fa45 | |||
| 85fd540b97 | |||
| b70bce1746 | |||
| d39b6d7120 | |||
| c0412cc4f4 | |||
| 89ac470733 | |||
| 72c0474397 | |||
| 375222a089 | |||
| 2eb51f9a83 | |||
| 785f8915b7 | |||
| f53a5ff536 | |||
| 5e6c518c39 | |||
| b7459c7311 | |||
| e43ef605c2 | |||
| ed908a260e | |||
| 2369b6a34a | |||
| 1a64df9116 | |||
| c3b2c55d51 | |||
| 04c0f19584 | |||
| 523d961f28 | |||
| 8c971cd11e | |||
| f9d5c74507 | |||
| 4a2e8d0a69 | |||
| 8125e406bb | |||
| c74b66f728 | |||
| 778e4e0ea7 | |||
| e72b2b385f | |||
| afbbe6cf3f | |||
| bdbced0bbc | |||
| 3d7d52e779 | |||
| 94f54abb62 | |||
| 05a7fd45c3 | |||
| 389dfb44de | |||
| f7e48d9b23 | |||
| 69b9c1b9ee | |||
| abcc319168 | |||
| f7955a5c4e | |||
| 70de677266 | |||
| 5525527ecd | |||
| 650d15a665 | |||
| a5bcff5231 | |||
| 782c3a0e3e | |||
| 8b1e0df222 | |||
| 1d228d28bf | |||
| 3523b1a85f | |||
| 1acac3845e | |||
| 78d6fe6b50 | |||
| 4cedd0f30c | |||
| 2d27e0997f | |||
| 21e6c2603c | |||
| 90906baae2 | |||
| 3766488114 | |||
| 7bb5ffc2a4 | |||
| ae63508049 | |||
| 7303377358 | |||
| 2a4057cbc2 | |||
| bc6b70f4f9 | |||
| 225cc38ea8 | |||
| 6e2b854544 | |||
| ab37cc72a9 | |||
| acd064c364 | |||
| 4b6fce7e5d | |||
| 551459022d | |||
| 04a7dab7e7 | |||
| 8e02d449fb | |||
| 1859d7c2f5 | |||
| 12d960e787 | |||
| 426b53e46d | |||
| 2935b85543 | |||
| 26d4ebd3d5 | |||
| 3546793e12 | |||
| c5135372ca | |||
| eb75a3c2fb | |||
| 74b23d0e00 | |||
| 7731db638f | |||
| 8428f28239 | |||
| 5465652466 | |||
| c5bfdc66a4 | |||
| a2eaab0ca3 | |||
| d76fd634a5 | |||
| 7e609984b4 | |||
| 1a711ea14f | |||
| 70b9db7598 | |||
| 3ec856778c | |||
| 158c29e598 | |||
| a7e512bd50 | |||
| 37a49c0d2e | |||
| 27a1dc8966 | |||
| 49aa4abc20 | |||
| 703152cb2f | |||
| 4524edb899 | |||
| 42bb4483b3 | |||
| 77dcc9b7a3 | |||
| 9d205cbb7d | |||
| cad9bad950 | |||
| ca935f4f08 | |||
| b3d18f3b0e | |||
| 5345d1f685 | |||
| 0a458d94c4 | |||
| 60d2670e2e | |||
| e44c09aa6e | |||
| 0b6d3a313e | |||
| 8ed2bb4179 | |||
| 1523fa98ec | |||
| fe430e81ad | |||
| b9652949b0 | |||
| c53a463bb1 | |||
| a6c14bd986 | |||
| 3c841b1be1 | |||
| ddb9b327d4 | |||
| 75b61f2bef | |||
| 8a01a31e8d | |||
| 493787d4d6 | |||
| 997d2a4db9 | |||
| 2b9aa0cf71 | |||
| 991abb1cf8 | |||
| 03524caebf | |||
| 4ac9406b90 | |||
| 47cc49a962 | |||
| d52e70af6c | |||
| e554b7f531 | |||
| 3d76b2c10f | |||
| a27d69f852 | |||
| 9fb4624b03 | |||
| 017492dbfa | |||
| 0668a23167 | |||
| 738e7d2516 | |||
| 96ed170871 | |||
| 58491e6d23 | |||
| e32ad93020 | |||
| 0a27d277a0 | |||
| 74b95a6ebb | |||
| db08204ead | |||
| c99793d2a4 | |||
| e8774ebd29 | |||
| db0cb04b83 | |||
| bd48829a09 | |||
| 52245d36d6 | |||
| 1eac02d173 | |||
| ea4224ba67 | |||
| 1d7448ec83 | |||
| c7c6acfc78 | |||
| 7735849b7f | |||
| fbc1e6c861 | |||
| 598876d8e3 | |||
| a9d66d6535 | |||
| da4008575b | |||
| 49a67be419 | |||
| 430ef09ab1 | |||
| 34c0d6c442 | |||
| 60d6e6b9ce | |||
| 5fc9cb154b | |||
| aba0e46073 | |||
| 016b96e9f0 | |||
| 8bf01146f1 | |||
| 4c98e0a335 | |||
| 3ded5326a2 | |||
| 52bb5803b3 | |||
| cff57e5697 | |||
| 251de1b643 | |||
| de8a6bea58 | |||
| 94799a9e28 | |||
| ceb64afd4a | |||
| 63b8b0cb50 | |||
| 787e7b423c | |||
| 9d56093381 | |||
| 26b2cb291e | |||
| f59ab696e2 | |||
| fd425363b6 | |||
| 3c4fd80f6e | |||
| 2b9a03d9bc | |||
| a9061eb44f | |||
| f3324ae2fd | |||
| 94fbc28ee0 | |||
| f10af9d8fb | |||
| 95e90d5c37 | |||
| 0ca6e70b66 | |||
| 8e79529e4e | |||
| 79669a8789 | |||
| c41a446ae9 | |||
| 446a6f22fa | |||
| 2b83975ea2 | |||
| fc138bbbbb | |||
| e56b280f5b | |||
| a685962d32 | |||
| 4938c7e64b | |||
| 3a9edabd03 | |||
| bcc4a2c0a4 | |||
| 5d0c27dff3 | |||
| 9a0d4ae53b | |||
| 6e6f2859ab | |||
| f608d2537f | |||
| 2bf0a7af8e | |||
| 5a0d8f44ff | |||
| 3e9b6caa1c | |||
| a917397090 | |||
| 6c4e61a924 | |||
| 1271a337c5 | |||
| a5af0a1c81 | |||
| 4a18185e81 | |||
| f8670a497e | |||
| b847b9ccba | |||
| dff1b37a3b | |||
| 80d7c854ab | |||
| d5297f9047 | |||
| 92ab3d005e | |||
| 67d1e43f6c | |||
| 67b6604a67 | |||
| a1fbf79ebf | |||
| b08d2001fd | |||
| e89e6edfb8 | |||
| b2e91b8a07 | |||
| 532203040f | |||
| bb2f8f34dc | |||
| d5060e9067 | |||
| 891d65dc87 | |||
| 832a4bf86a | |||
| 885d2f0771 | |||
| 18321937e4 | |||
| 6196bb31fe | |||
| 92f5377f70 | |||
| 9107897b76 | |||
| aa9161a16f | |||
| c10cdc3d90 | |||
| d58584e1fd | |||
| 8f99a3df76 | |||
| abbb0eb85c | |||
| 85f88efa95 | |||
| 8ed7b0f455 | |||
| 8d0a779ff4 | |||
| 8cca7f884b | |||
| 10d09711d9 | |||
| c85ee9ff52 | |||
| cd66981c1d | |||
| 3dac0d4786 | |||
| 3d35277a87 | |||
| 33fe5e7518 | |||
| e794911755 | |||
| b780e33a5b | |||
| 6da3dff5de | |||
| 8e28fef91f | |||
| aed6f0403d | |||
| 09c995d67b | |||
| 20075e0fbd | |||
| e52cf67447 | |||
| cdc74a9c49 | |||
| 3a1475fa9c | |||
| 4a9c746bed | |||
| 6738bc8dea | |||
| 57e408761d | |||
| 87cb553c61 | |||
| 5c443f305d | |||
| 07760f7acd | |||
| 748b857e57 | |||
| 8271a2b718 | |||
| d2c252879e | |||
| 58de04ccd6 | |||
| 6b84773190 | |||
| 3fe1e2c763 | |||
| 8c075c78cb | |||
| 8082f5f909 | |||
| 3a07d767fb | |||
| 111a2f3b25 | |||
| 4424d93d56 | |||
| 56491569df | |||
| 71b9324bcb | |||
| 1fa06546f4 | |||
| 749895f2ca | |||
| 8db4c3cfff | |||
| 5d4c168e1e | |||
| a857e6daa0 | |||
| 6b3e911b40 | |||
| 311b95b9fc | |||
| 7979831f5c | |||
| 9dc49f7165 | |||
| 788b1a7531 | |||
| 79cacbf36e | |||
| 1168176016 | |||
| 9a4aa20bbb | |||
| 69a1e007a6 | |||
| afed5a30bc | |||
| bac8058aa8 | |||
| 066a4c65bb | |||
| 3c9a5bcf1a | |||
| 88879e441e | |||
| 70ca42794a | |||
| 9a3a6c8a72 | |||
| f67371d524 | |||
| 7e2e764e1e | |||
| 3feeec1649 | |||
| 73976149da | |||
| 9cfc638ce0 | |||
| 748d69a3cb | |||
| a186d1a7fc | |||
| 2144a9d2fc | |||
| 9de470f670 | |||
| 01cb08a924 | |||
| 5e9dac49a8 | |||
| 26191935a7 | |||
| cf6fb07a05 | |||
| 9260b45e0e | |||
| d0e37ba6ef | |||
| f8eba66b5e | |||
| 8d47ea7d2f | |||
| 9b79d7df09 | |||
| e9fac4b504 | |||
| 7a08e035a5 | |||
| 6a614d66de | |||
| 1e83518c71 | |||
| 1907504ff6 | |||
| 4495737f94 | |||
| b09036b378 | |||
| 0caeffc3cd | |||
| 787051b12e | |||
| e11410c5d1 | |||
| e3c613e6e3 | |||
| 249a3332dc | |||
| 5dc304fcb4 | |||
| 500f76cb03 | |||
| 05b80d17c5 | |||
| ba2f58df6a | |||
| 757f8240d0 | |||
| b871bedb6c | |||
| 33eb3d8540 | |||
| 0cfb7e8cee | |||
| d86e4090b8 | |||
| 18b156ad44 | |||
| a1ff0318bd | |||
| dd1dc30136 | |||
| 05a935660d | |||
| 9d90b02c9a | |||
| 94da2c270c | |||
| f801e7ffd9 | |||
| d36c502287 | |||
| b998655e1a | |||
| 37e11a4b1f | |||
| a400568b51 | |||
| 427846f73b | |||
| f4f9d92c8e | |||
| b0e7066458 | |||
| a8ff3da908 | |||
| 200ac18335 | |||
| eeff3d7308 | |||
| f9eb709a18 | |||
| 2aa3624f81 | |||
| b6471d887b | |||
| dd5bad1dfe | |||
| 54db90e040 | |||
| 35d9016053 | |||
| 788afe611d | |||
| d013e04db9 | |||
| 1043bf00b0 | |||
| b2d5672785 | |||
| 59897db8fc | |||
| 80b3f2d8d9 | |||
| 2d12b037a0 | |||
| 30049bf1c1 | |||
| 2921faf06f | |||
| 9d3168abcf | |||
| e271f08606 | |||
| b7287de5a7 | |||
| 31dc2b25a0 | |||
| d54f2e615d | |||
| 8757430dc3 | |||
| b6f7b25407 | |||
| 526fa5a33d | |||
| 069d51305e | |||
| 08d449a370 | |||
| 84f07f8b83 | |||
| c94e1932eb | |||
| 465c857ff2 | |||
| abb0a3f0cc | |||
| 6380850670 | |||
| 34224eb015 | |||
| de93770789 | |||
| d15b0c9548 | |||
| 73b7c56ca8 | |||
| cfa5aa6a61 | |||
| 2df3997c8b | |||
| ff185a848d | |||
| a18faf4f7c | |||
| 19389748d0 | |||
| 4653e64ff4 | |||
| c9a779fea9 | |||
| b84744699e | |||
| 3cf2be8c37 | |||
| 992333fd64 | |||
| d032f18b71 | |||
| 8c2241c6dc | |||
| 08bebc0f89 | |||
| 5d7f8e2df9 | |||
| eea02b0e65 | |||
| a682b7c324 | |||
| dfa5e91322 | |||
| 6d676fd578 | |||
| 317a9d63bc | |||
| 464ac69de6 | |||
| 923cec3618 | |||
| dc9d060ae7 | |||
| dafa6bff2e | |||
| 495b309736 | |||
| 0bff47e9a2 | |||
| 4486ec3b72 | |||
| cf1af53ab8 | |||
| 8a3cfb36d0 | |||
| 7dd97a2d9f | |||
| d11166082c | |||
| cd72916838 | |||
| f3d05cd98e | |||
| 730933dd35 | |||
| 5ffdbe553b | |||
| 342e9d955e | |||
| a707847067 | |||
| 29c40f969f | |||
| 32de455cf7 | |||
| fc72b8c5aa | |||
| dc9e928894 | |||
| 98f9561d15 | |||
| 92289fccfd | |||
| 2ca070ea3a | |||
| 959446df20 | |||
| 7a32971212 | |||
| 840c0746b3 | |||
| c4b6865659 | |||
| 38b6b546c7 | |||
| 729bfcb941 | |||
| 892723c501 | |||
| 73f7688c58 | |||
| 844fad2ced | |||
| 82a43dea28 | |||
| 79200a784b | |||
| a2487c02d9 | |||
| 192af7ec14 | |||
| e144a6f69d | |||
| bbfe0446f0 | |||
| 779e41a686 | |||
| 751916151a | |||
| f4bbf0e348 | |||
| ff9b116522 | |||
| fa83869430 | |||
| 32c7d36fcd | |||
| 5e9b215548 | |||
| bc521978ce | |||
| 0f9f3905ed | |||
| 32a73727b0 | |||
| 68d8766c56 | |||
| 0abb303e8d | |||
| a83d223eec | |||
| d202c8b864 | |||
| c34cfe5b30 | |||
| 498040765b | |||
| a5884a2e07 | |||
| 2674086e0c | |||
| 32f225c922 | |||
| 77627f21f6 | |||
| 87c2aefe03 | |||
| a4e102672d | |||
| dd569b9f1e | |||
| 7471a819e1 | |||
| 8874a325f7 | |||
| ca62cd2661 | |||
| 9b991bcfdf | |||
| 45117e3445 | |||
| 6b3c6b6412 | |||
| d1e7805f7a | |||
| 9df132bd77 | |||
| 6b851fc9a9 | |||
| 6f4a01f6da | |||
| cc3617b5c2 | |||
| b9c7abcdf7 | |||
| ef40ccbe14 | |||
| 039f5f6e15 | |||
| d0d9bf751d | |||
| 6033b79471 | |||
| 25cc8c6ab2 | |||
| 5a3138fd7b | |||
| a8f91fefde | |||
| 1f4e2ad3dd | |||
| e361ab811a | |||
| 0dbbdc9149 | |||
| 378ddc66c7 | |||
| a1ef7ddcf7 | |||
| 2d0633c05a | |||
| 114cdedc9b | |||
| 22915489b7 | |||
| e296e94d2c | |||
| 7ef316f4f9 | |||
| d61eb9c096 | |||
| dfaa7a92b3 | |||
| d017dd14ca | |||
| 177696ee00 | |||
| 36a18a0b56 | |||
| 2b5f552c2c | |||
| ccff7a010d | |||
| f295cda27a | |||
| c72be46228 | |||
| 047cc38d69 | |||
| 216332ff53 | |||
| 73c22b75ea | |||
| 6b9a3c58d0 | |||
| ae8d6ba433 | |||
| e778fe8342 | |||
| af75751bf1 | |||
| c178afdf6b | |||
| 71212420f6 | |||
| 233de2d4a4 | |||
| 15c090126a | |||
| 6bca60654e | |||
| 1c34c7f293 | |||
| 3c3f2ae075 | |||
| 6f9f2ccdc0 | |||
| 821ba0ec3b | |||
| fc2a7d98fa | |||
| 8f51c7689f | |||
| 06305a8af6 | |||
| b88ac45b53 | |||
| 25c7909e30 | |||
| 5f4bfa36d8 | |||
| 793bb502f5 | |||
| 58967e739a | |||
| 224b9b8930 | |||
| 83046494a5 | |||
| f71dce08fc | |||
| a9aaed6f33 | |||
| 77e1ec530b | |||
| bb674b43f9 | |||
| 2ef0aabfbc | |||
| b2765533fb | |||
| c23ec9935f | |||
| cb575ffe04 | |||
| d5585a30fd | |||
| f1b3f71b09 | |||
| 79d393b3ef | |||
| 141022caf8 | |||
| 2b1e5e4958 | |||
| 2192852510 | |||
| fcb9bbbe72 | |||
| 4a8291d596 | |||
| 4f127761a0 | |||
| 822d8c947e | |||
| 9ba845c447 | |||
| 9c7b66ba70 | |||
| 1a001613a9 | |||
| 71c8fa2638 | |||
| dd92ae0ff4 | |||
| 6d1f2e5673 | |||
| c35465b274 | |||
| 55c015de4b | |||
| 10c6e34e06 | |||
| 43531a020a | |||
| 11b88cc621 | |||
| e09905b7f2 | |||
| e9557352a0 | |||
| 2daec98fd7 | |||
| 9ca7186e08 | |||
| 4a191f5f6c | |||
| 38606cb43a | |||
| 4b9001abf2 | |||
| 660c8ef95c | |||
| 1b34b3b63a | |||
| b44b8955b3 | |||
| 983d5dee31 | |||
| 1cc26c871d | |||
| ea71e8cbe6 | |||
| c0bcb54044 | |||
| 5d12554548 | |||
| 23303802ec | |||
| f4b62ce384 | |||
| 05a37447a7 | |||
| 17311e7c9e | |||
| d7d8eca9c8 | |||
| 25deea220c | |||
| 066207e925 | |||
| 0471d9072b | |||
| 1db43f079d | |||
| af2c5b3429 | |||
| 583b39fe6b | |||
| faaddccee4 | |||
| e17b6d1625 | |||
| 8d758ced15 | |||
| 6ed655f8c3 | |||
| f05f9d5ade | |||
| 3e2956a7bf | |||
| 653c209567 | |||
| aacc336c2c | |||
| 1b3790f60e | |||
| c0b4523b7b | |||
| 508896b313 | |||
| 0ab9f11e1d | |||
| ee6c42d3b1 | |||
| 6edc232696 | |||
| 2114002803 | |||
| 74f813ed3e | |||
| 8e61cf8fe1 | |||
| 1e034c904a | |||
| af305dc376 | |||
| 7d970de5ce | |||
| 05d0e1bdcc | |||
| ee56ae7dac | |||
| a9c56caf84 | |||
| 4322563eed | |||
| 136b1fc421 | |||
| be0059f0af | |||
| ff1ae0f5ed | |||
| 62285b7b73 | |||
| b9bdc64952 | |||
| 32fc3acc67 | |||
| fd150b3cc1 | |||
| e8b680c78b | |||
| d260681773 | |||
| f88b34a15f | |||
| 9ed7541ae7 | |||
| 84570ec9e0 | |||
| f3d93a4133 | |||
| 31bbd586db | |||
| 52d79ca15a | |||
| 3f3d8fc494 | |||
| 76e4a9e7b1 | |||
| 502a67a75a | |||
| cdcb2f8f7a | |||
| 2a2b70f83f | |||
| e16c7f3ac4 | |||
| 649059eba1 | |||
| 5447dc9e25 | |||
| 13deb4a54f | |||
| 4722b58a40 | |||
| d33829f5eb | |||
| e249fda1f2 | |||
| 336f4debf1 | |||
| d102f7f7f8 | |||
| 4e8cf63f51 | |||
| f69055d85a | |||
| 46934b086d | |||
| d39b043343 | |||
| d07ca3fcf4 | |||
| 80ef2befd5 | |||
| 1107173e60 | |||
| 8459d7f3ad | |||
| 0797ee2a1f | |||
| 6357cc6245 | |||
| 3648f8bef2 | |||
| e81a1aac9b | |||
| 073591aada | |||
| ea80992376 | |||
| 6f16195b08 | |||
| ac347f0029 | |||
| bbecddfde2 | |||
| a3bb66d09e | |||
| 1f5a18ea2d | |||
| dd85cb1676 | |||
| 1f09c19c8d | |||
| 13ab912bb4 | |||
| cb2ddc9472 | |||
| 5a0fdee09b | |||
| 35969dfd85 | |||
| c1e3db9d1d | |||
| dbdeddcd26 | |||
| e34d3285c2 | |||
| 4c4c6e8f03 | |||
| 884e7ce381 | |||
| 24e5d4635d | |||
| 7955a6bc35 | |||
| b3eb17f61e | |||
| 21e6e8bc7b | |||
| e857ae4d24 | |||
| ddbc76cc7d | |||
| 6f68f4e5b0 | |||
| 22fa954716 | |||
| 84f78e9a15 | |||
| 214e626ac5 | |||
| 1c579ae69c | |||
| fbdaa43126 | |||
| a37103af4a | |||
| 1f12e37412 | |||
| 18f9d782ae | |||
| e0d8a5be5d | |||
| 3793630375 | |||
| 5bd3032f78 | |||
| 406102fd25 | |||
| 7198539b33 | |||
| e3505a40db | |||
| 4b735a365b | |||
| 2b05b80b54 | |||
| d8775a3ae5 | |||
| 79df80ad0c | |||
| b0ca1cc652 | |||
| 568c70f2f7 | |||
| 6dfedd219b | |||
| d5f9e18107 | |||
| f303b1c061 | |||
| a45ecf7ec3 | |||
| 26e9ddc8e0 | |||
| 0f997dbc75 | |||
| 837747fea2 | |||
| 67f0056121 | |||
| 4875bfb336 | |||
| dfb739afcf | |||
| f6e8596e91 | |||
| bd531aa6c2 | |||
| fc55f6c7e9 | |||
| 2ee835d23b | |||
| 254ebd1e7f | |||
| 5f7112a404 | |||
| f8e63f2994 | |||
| 62b0d19866 | |||
| e90f06748c | |||
| 5e6b6133ca | |||
| fe28aa4f5e | |||
| e25915b9d1 | |||
| b79feda477 | |||
| 76e284e2ac | |||
| 7862fe9c38 | |||
| 7ca83858ab | |||
| 883a829590 | |||
| 69e2b8313b | |||
| 39c170cb2f | |||
| eb04fc39ea | |||
| cc7959a390 | |||
| 07a6e50d14 | |||
| b9e29520cf | |||
| 8fdfbfdfe2 | |||
| f87544bbaf | |||
| 7a0e2c01d4 | |||
| 8938f13a0b | |||
| 0b3d6b03ac | |||
| 7817ba24ab | |||
| 7018ada593 | |||
| 112fa7ec23 | |||
| c3c98ad20b | |||
| 3e8b45c4d9 | |||
| 061de0159d | |||
| 8eefe76bda | |||
| 8926fa57c1 | |||
| 11632872d6 | |||
| e048849298 | |||
| 3194e58fb9 | |||
| 14ab99595d | |||
| 8d77dd9f04 | |||
| 56ec927554 | |||
| 11e73e1b94 | |||
| a6cd97a8d3 | |||
| 5dbbfed654 | |||
| f91be91693 | |||
| ea1a47159b | |||
| 3838870b16 | |||
| 8bdf417b17 | |||
| 302ec73b18 | |||
| c7f1a2a77e | |||
| 9e582120d2 | |||
| ae24641e07 | |||
| 94c0dad4bc | |||
| 37f42a9234 | |||
| 78eab24c68 | |||
| 70f999f344 | |||
| be1598b1c6 | |||
| 7660ef59ff | |||
| 25be2902ac | |||
| a906e0c857 | |||
| e7edbacd69 | |||
| 2f6dee9735 | |||
| 41e4ce7b2e | |||
| 9763199dbb | |||
| e717d29401 | |||
| 6f84bffaad | |||
| b17332c5ba | |||
| ea05fa8f69 | |||
| 05ebf60dba | |||
| 3bb7f83729 | |||
| 6880785a72 | |||
| a9989f4001 | |||
| 4e6fa25877 | |||
| 8610db2e63 | |||
| 6dc40d0c93 | |||
| 9450111ae6 | |||
| a013c3dd04 | |||
| 54d5cf944b | |||
| 7880bbe7ec | |||
| bcbfaa347a | |||
| faf266800c | |||
| ee2c9a3970 | |||
| 65bee6bd0f | |||
| 7a86c5fde2 | |||
| 45e3da3f90 | |||
| f3b019e4db | |||
| 48a867ef16 | |||
| aef024f572 | |||
| b3764d1e70 | |||
| 5a35c4ad74 | |||
| 058e23f3ee | |||
| 78e093245d | |||
| aa3a6e2766 | |||
| fa441abf5c | |||
| 352abd1e41 | |||
| 6d72bfe149 | |||
| babe19a3d6 | |||
| 96a903afd1 | |||
| 1af5ec8492 | |||
| 949766e3a0 | |||
| f328fbefa9 | |||
| 88cf1bcd28 | |||
| bdd2dbb719 | |||
| 690e3ee3ca | |||
| fd8f7c76a2 | |||
| cc29e97fa3 | |||
| 397edf18b9 | |||
| 0bd5f63ae4 | |||
| 98ca7c1726 | |||
| c3fe366be8 | |||
| 195aed22b5 | |||
| 1b88f8ce3f | |||
| 3e04a15fe5 | |||
| 8f07a5285e | |||
| 3dff9196c2 | |||
| 0e8987b654 | |||
| 70ba71de79 | |||
| 77f2bd5115 | |||
| 590c75f4cb | |||
| a72ac91ebc | |||
| cabd06dd53 | |||
| 32794f89c7 | |||
| 5e3254435f | |||
| fc629ff5d9 | |||
| 41b774faf6 | |||
| d88306fc1c | |||
| e92c22585a | |||
| ecf926a537 | |||
| c3c0a4ef0d | |||
| 147e5ada46 | |||
| 51bcaeb812 | |||
| 2f64312a7d | |||
| 9ee0773ab1 | |||
| f25dae2da2 | |||
| 31c92cd94c | |||
| 06a4c30cc0 | |||
| 6150aaaa77 | |||
| 6657bc924b | |||
| 81390cf860 | |||
| eb928091b6 | |||
| 6107af3cca | |||
| ba8f7c5ab4 | |||
| b9ef09df96 | |||
| e2cd0393ac | |||
| fa82d818d8 | |||
| 050e12c756 | |||
| 805f862af6 | |||
| 8614e171c1 | |||
| 6ee5f5cc70 | |||
| 3d1213d669 | |||
| 5c60281814 | |||
| 2f77a94395 | |||
| e0aeae05be | |||
| 640c3075e6 | |||
| 0a60bd1d3b | |||
| 35b784f11d | |||
| f935678090 | |||
| e6ba2402b7 | |||
| 73e9e7d620 | |||
| e68ccb17d9 | |||
| 6d3170c665 | |||
| 777febc198 | |||
| 799d79bd2f | |||
| 5fe3dc6d13 | |||
| c3a83a001d | |||
| 4f050fe288 | |||
| bbe64a517c | |||
| 76a4d0652f | |||
| 8d512eb1d3 | |||
| ef78d9e9ed | |||
| 257f57f926 | |||
| 3976d95610 | |||
| d4d38e94cb | |||
| 5519739309 | |||
| a6459da693 | |||
| 0bae7022b1 | |||
| 59802246b2 | |||
| 8e6c7a6194 | |||
| 2a5a9e9581 | |||
| aa540c014e | |||
| 6f7fc3cfc6 | |||
| e1d9fbb742 | |||
| 53022ff013 | |||
| 9c76d0c3cb | |||
| 6e08c1aac9 | |||
| 24af916e52 | |||
| 81e3b9dd6a | |||
| 357b1c60a9 | |||
| 4d2d59617f | |||
| 9f18a27b0b | |||
| 0ec16de569 | |||
| f547e44d3d | |||
| 38fad38b0c | |||
| 77b0d194c7 | |||
| 134260ba52 | |||
| 7cd6486916 | |||
| 8363ab8b10 | |||
| 5308c42c1c | |||
| 628456bcc6 | |||
| e321c30c1d | |||
| 1a87f2ea1a | |||
| d19d0ef0e5 | |||
| 6dcc9f85c6 | |||
| 7ed3c61b53 | |||
| d7a7daa21d | |||
| b20fbe20e0 | |||
| e095bba98b | |||
| 47c95dee95 | |||
| 8af5c88a53 | |||
| 86c7ad2b2c | |||
| 8c9a0b2b2f | |||
| adadde0aa9 | |||
| 75cc7cbc4e | |||
| 0d5fa3e125 | |||
| d062601260 | |||
| ad0c39e4ac | |||
| 19ee939c5d | |||
| d8f72daf94 | |||
| 47e5be4103 | |||
| 3823d9a493 | |||
| 20558be2e0 | |||
| df10581bb2 | |||
| b29e1e9878 | |||
| 3e00bcca49 | |||
| 50bdffb381 | |||
| fab7bd48c5 | |||
| e3b98c902b | |||
| e284a88da4 | |||
| 074aa8c3fb | |||
| ab8e0fdd46 | |||
| 2e5491604b | |||
| 5c0723832e | |||
| 18a4ba22fe | |||
| cd2f5dc704 | |||
| ee07e3b298 | |||
| 98776a709e | |||
| 5d321c8c0c | |||
| c69e620e04 | |||
| 2b8259eb8a | |||
| d654d2d0ac | |||
| 610763b637 | |||
| e4cb87ea9e | |||
| 7f00fa4fd9 | |||
| 146626045f | |||
| 6b7f7c9b4b | |||
| 05fc1b8dd1 | |||
| d9410f9cdd | |||
| 87a08a7db6 | |||
| 782d29f427 | |||
| 7689db49ff | |||
| e22e919099 | |||
| 7198fdd74a | |||
| ba09d9111e | |||
| b85521decd | |||
| 64650367be | |||
| 2beb0e137b | |||
| aa75a2aeb0 | |||
| 0063ec3527 | |||
| 603c9fac07 | |||
| ee3f7aeb53 | |||
| 4172ca39dc | |||
| 4be0888776 | |||
| 6efa835898 | |||
| 883879a642 | |||
| f6becb0ee5 | |||
| 67d5fc6a2a | |||
| d493eb9ada | |||
| 79b7e76777 | |||
| 5b52e76fc9 | |||
| bbe9193686 | |||
| a04db5d4b4 | |||
| 86fa371e0b | |||
| 8e8cace43b | |||
| 5b05c6ceaa | |||
| ee29a1bc91 | |||
| 8e4c023b98 | |||
| b8c82ec47d | |||
| 96f4f676e4 | |||
| c0e8488b83 | |||
| 3be48c052f | |||
| 052366be66 | |||
| 347eaa9d07 | |||
| bee117f86b | |||
| 6fa1fc462f | |||
| ba5997683b | |||
| d4a4ae996e | |||
| e312485a34 | |||
| 7dfe709196 | |||
| 759845c37b | |||
| 5e3fe56aa7 | |||
| 4b506560e9 | |||
| 330c46b949 | |||
| b29d1f9902 | |||
| 15f60b33b1 | |||
| 1a54ea82b5 | |||
| 949bc67354 | |||
| d816af41b4 | |||
| a7880d73f3 | |||
| ac21c4d1e7 | |||
| ed8a10f276 | |||
| 8b8a83eb20 | |||
| 890ea38470 | |||
| 07d06c74b5 | |||
| ec18b01ef7 | |||
| 7a1817b099 | |||
| a2782515a2 | |||
| 9deb021a5e | |||
| 0bbb72e24d | |||
| 7656cf541d | |||
| d77ad33583 | |||
| 6f5605b7ca | |||
| 718ae78036 | |||
| f6eef82864 | |||
| 26d37103ba | |||
| d85c65bfc5 | |||
| 1943c64a33 | |||
| 9c1fa7c0ce | |||
| 14068307d1 | |||
| 670e48ec1c | |||
| e288104472 | |||
| 99b0cf71a8 | |||
| 2b7e6944e8 | |||
| 9e7ce69e9c | |||
| 8c97a645e9 | |||
| d194a06e59 | |||
| 783372c787 | |||
| 51016949b8 | |||
| 700b561ad1 | |||
| a59aec8425 | |||
| aaca4ecc69 | |||
| 078f56febe | |||
| 17f128afeb | |||
| aa224f6296 | |||
| 8136d2823f | |||
| 09e2b737f0 | |||
| 3cb4abab0d | |||
| 151454db2c | |||
| e3dac62bd9 | |||
| 9ed8621621 | |||
| d30e8c4c70 | |||
| a1bf4819cb | |||
| 39a4dab81f | |||
| a8c7705c3b | |||
| 4c1dbb7f8e | |||
| 066c668f6f | |||
| eab9a2c0ac | |||
| 7822266029 | |||
| fff2c3e038 | |||
| 540643972a | |||
| c20ead730b | |||
| 5aaf09018f | |||
| c8ceb4f86b | |||
| e655ee6b78 | |||
| 281673dd6b | |||
| eedca14e6f | |||
| 66657d798a | |||
| fc9e54b349 | |||
| 87be58b4fa | |||
| 3808c306a0 | |||
| dee4537f23 | |||
| 34132e3074 | |||
| bb4d94ee85 | |||
| 3248dd50f9 | |||
| d68189ae3d | |||
| 6a055bd4c5 | |||
| 96ae4d4583 | |||
| 6d21e2f413 | |||
| 442c0113ea | |||
| 9c16cdd2d1 | |||
| bc3eebdc71 | |||
| f2d235bc74 | |||
| b5f7c96c80 | |||
| 49524d7418 | |||
| 741714cd61 | |||
| 7593f9c4c4 | |||
| 17f0be4ad2 | |||
| def293f88b | |||
| 294a4d5477 | |||
| 6376b83327 | |||
| 775e8df752 | |||
| 487e04e811 | |||
| 151f551bc9 | |||
| 2b0b45d2fb | |||
| 3c2227dfda | |||
| 2e18db7bb8 | |||
| bc634e9d37 | |||
| 7fc144b07b | |||
| af22c7e96f | |||
| f44e5fb2fe | |||
| 4984ba1bb3 | |||
| 284baed1e3 | |||
| 8f56f7fdfe | |||
| 2d9627df33 | |||
| 8074bb2fbe | |||
| 8dc864d22f | |||
| 2948bfbed0 | |||
| 6e800ad7bb | |||
| c3b9f61b9f | |||
| ed6f857ff3 | |||
| 2c30f48900 | |||
| 69aac09be8 | |||
| b91800ad9d | |||
| 2799136ccb | |||
| 328027300d | |||
| 3aecbd75a3 | |||
| 98c43dba42 | |||
| 299d0493b9 | |||
| 70c729b171 | |||
| 3cf3f58db1 | |||
| 916c2733f0 | |||
| 921e716715 | |||
| d65a85e30c | |||
| 622951c6be | |||
| 799c4a4f17 | |||
| a497ef9d6f | |||
| 125d1aa08c | |||
| 9a522615e5 | |||
| 3115643397 | |||
| 27f2856e6d | |||
| 62c43f9f95 | |||
| c1b2fc19c1 | |||
| 94b4c20b35 | |||
| bd70e53806 | |||
| e4bd5c7251 | |||
| 64813c1c70 | |||
| 623f981bc1 | |||
| 09c11250b4 | |||
| fd01d37002 | |||
| f68321c9f5 | |||
| 9a590ae484 | |||
| aecc81f5e5 | |||
| 128cad49b9 | |||
| 65f9e9d0aa | |||
| 36df9757b1 | |||
| a0e1c7c37e | |||
| 847641f655 | |||
| cdca5b4a28 | |||
| 6609425880 | |||
| 6ac0d5d3f4 | |||
| bc46259286 | |||
| 50bccd52e7 | |||
| 84cca1ae98 | |||
| 71cf758ccf | |||
| edf98acae2 | |||
| a085531fda | |||
| 6b532d2fbc | |||
| 7862ff4670 | |||
| bc27890818 | |||
| 1c5754beff | |||
| 054def3d13 | |||
| e6d5d5330e | |||
| f430803ecc | |||
| fc762fdbdb | |||
| 6908aa4a8a | |||
| 6c70f2e14f | |||
| 3bc489a7b5 | |||
| d22380c7cf | |||
| c4102ba884 | |||
| baee3a60a6 | |||
| 5e2b4adff3 | |||
| 78d668c599 | |||
| e8b867430f | |||
| 1426b4ca49 | |||
| 9682ac4643 | |||
| d95cd24b76 | |||
| 25f48a3469 | |||
| 1b3c74c3eb | |||
| 425c23fea1 | |||
| 16654fa639 | |||
| 8c010a8a96 | |||
| bf2171ed74 | |||
| fae682e406 | |||
| c5b9654547 | |||
| a64d23b8ed | |||
| b4d879960f | |||
| 456a944482 | |||
| 23e94a259b | |||
| cb5c716fdb | |||
| 980aa860fc | |||
| 080b3b1136 | |||
| fc8c8b5c25 | |||
| 41b7897857 | |||
| 04c807aea5 | |||
| 1c9abef342 | |||
| 9464c509fa | |||
| 6ee6c8e0be | |||
| c9b87d9b76 | |||
| b5d2b39c3e | |||
| d4817a95d7 | |||
| 37cfe692f6 | |||
| 0e76bf22ed | |||
| f06054bc9d | |||
| 9012397593 | |||
| 429223c7e3 | |||
| 16c656cda2 | |||
| e1cac0b779 | |||
| 25487c17e3 | |||
| 563eecebda | |||
| c2de55f005 | |||
| 22551e9410 | |||
| c4a0b1c4d6 | |||
| e970d53787 | |||
| 752dc30cc5 | |||
| d8f555e8dc | |||
| 24782bdd2f | |||
| ee6ef85326 | |||
| 22d547e87b | |||
| ad7f5cf720 | |||
| 19da74f913 | |||
| 1f59c43b04 | |||
| f42d2b8a18 | |||
| 92b1e067b1 | |||
| 84f48e4a6f | |||
| fcd0841bc7 | |||
| 38249c362d | |||
| 5186cec942 | |||
| d505160444 | |||
| 3331753bcd | |||
| 0d9852be27 | |||
| 4c0435feef | |||
| efe898f151 | |||
| a713899a36 | |||
| 277e31c5dd | |||
| 2050429d6c | |||
| 6718b37ca1 | |||
| caaae8af78 | |||
| 135c0636bf | |||
| f49e20bdb5 | |||
| 9476a75f40 | |||
| 974fb528e9 | |||
| 9cde9b0743 | |||
| 91be427305 | |||
| 46a65f99fa | |||
| a7a7d816ac | |||
| 970456da91 | |||
| 1e6d4026da | |||
| e92bdf164c | |||
| 0bd41a748f | |||
| 6eea2cc675 | |||
| 2bf736e351 | |||
| 3a5c212985 | |||
| 383ea4d603 | |||
| b7a7bc891a | |||
| c17d86a134 | |||
| d26eabe2bf | |||
| 5a6853ba32 | |||
| 99eb3447ef | |||
| 36456bfe74 | |||
| cb21ff359b | |||
| 0794ab4ee5 | |||
| 88902bdb5d | |||
| 669b99f8e4 | |||
| 929bd2a8c8 | |||
| 5cbf091a7a | |||
| 09c7642819 | |||
| f7e47815ae | |||
| 3207d2a706 | |||
| 2c68c4f9f2 | |||
| fc31565f12 | |||
| 681c45dcbe | |||
| ba266f74ed | |||
| 36f6463028 | |||
| 4d136af7dd | |||
| dcd4a41f7d | |||
| 590ef32165 | |||
| cb59f2185c | |||
| 5f26fae19b | |||
| af1c683917 | |||
| 52ba7a7a08 | |||
| d0eed29f31 | |||
| 5852887e7d | |||
| 41a39d5088 | |||
| af8856188d | |||
| 8ae3c23ec8 | |||
| 73c283fdd4 | |||
| 2354bc9f4d | |||
| 4f03acb149 | |||
| 2711bfdc82 | |||
| fe2419cd11 | |||
| 27deeff079 | |||
| 50ffdcd9ca | |||
| 1062c0b3a0 | |||
| 6f8e18f5b3 | |||
| 42f05a5072 | |||
| 04c6ecc963 | |||
| 151b478a97 | |||
| 4fc55f4849 | |||
| 5b595eb056 | |||
| d7cca59315 | |||
| a7cb12f597 | |||
| 8b961f7239 | |||
| 8a66bd74cf | |||
| 7c96961e92 | |||
| dc935a1a32 | |||
| caeeae6a32 | |||
| e0be4e202a | |||
| 1ba84f55ae | |||
| 120ebbb59a | |||
| 0b9f33b4af | |||
| 1c03b21a43 | |||
| 38e2824415 | |||
| 16f7194f62 | |||
| ef163b80a7 | |||
| 121b08801a | |||
| 0a47477290 | |||
| 716b726589 | |||
| 27345e62a7 | |||
| 612d586e88 | |||
| a33b76f47f | |||
| 7d86aebf9c | |||
| 252b37ebfe | |||
| 1561eba6fb | |||
| 2783eb07b2 | |||
| c6e320b4aa | |||
| e95010b1b2 | |||
| 91cf85c50e | |||
| 8a003fbe99 | |||
| 0da56856e0 | |||
| 7fc3e65849 | |||
| 4fee75cf55 | |||
| a59429c954 | |||
| a928032f44 | |||
| 0515e41d89 | |||
| 8da7a17a66 | |||
| f052d788fe | |||
| 1eda04f695 | |||
| 929476a322 | |||
| e6ffcfb60d | |||
| d5db9dd00c | |||
| d86dfbb973 | |||
| 38bf3d87ed | |||
| 4765e1af12 | |||
| f5e5686853 | |||
| 446458d20c | |||
| 29be6b0068 | |||
| 254ce569fa | |||
| a3b3e6c799 | |||
| b149d91c35 | |||
| e62c76b0fb | |||
| 7e9f648a05 | |||
| f41e4c5fe1 | |||
| d1b7b2d26d | |||
| d7b47d7d05 | |||
| 6938821467 | |||
| afc5bb5731 | |||
| ec40a9ba75 | |||
| 3ae4a800cf | |||
| ecff38d58d | |||
| 2865cecca9 | |||
| d17a4af72e | |||
| 3cfdf8871f | |||
| 7985196155 | |||
| 6471f880ac | |||
| 6a2e833fca | |||
| e44bca597c | |||
| 248e35c121 | |||
| 9f9e5b49cc | |||
| bf67c62311 | |||
| a165b4aa79 | |||
| 9f9d946d69 | |||
| 1c012a202e | |||
| 43e5805e50 | |||
| 687fa325fa | |||
| 2585c02b68 | |||
| a84afc207e | |||
| 347bd7346a | |||
| a9acf733d9 | |||
| 44c4ab6580 | |||
| fe2e17e353 | |||
| c93c811375 | |||
| ba725f5456 | |||
| 2deac50c53 | |||
| d7332509f7 | |||
| e61ebaa71b | |||
| d9fe1b257f | |||
| 93838b4f25 | |||
| 98d29ff5dc | |||
| 85398cbf3d | |||
| 2556edb8d3 | |||
| b367be2b12 | |||
| 891961b03b | |||
| 22f4137703 | |||
| 18b35517aa | |||
| 57285ee3b5 | |||
| 404891fe01 | |||
| 7e8ebd758b | |||
| 18075bf34a | |||
| 15b14349f9 | |||
| 2f9147c36c | |||
| bfd50851f8 | |||
| e41139d1fa | |||
| 73c745b7fe | |||
| 63400247eb | |||
| 9e3d7cbbc9 | |||
| 36367c04af | |||
| 560d7153ae | |||
| e0a2904dbf | |||
| 419f8db538 | |||
| c4fc7b7e5d | |||
| 72599b18ce | |||
| ae58de44e3 | |||
| bdefa77226 | |||
| 2b891483a5 | |||
| a3dfb1c5d3 | |||
| add88a783b | |||
| 3c1fd427eb | |||
| 971449bef1 | |||
| ef831b8559 | |||
| 0c0a319499 | |||
| 2e7b1d588e | |||
| fca4f4ba40 | |||
| 742b73f774 | |||
| 95c86efd31 | |||
| a6ccbe3876 | |||
| 6aece4e388 | |||
| 25fe03f5a5 | |||
| c6a8488fe1 | |||
| d9aa9d1832 | |||
| 7692aaf547 | |||
| 3a722acc62 | |||
| 5234ae7a0d | |||
| 6772d447fa | |||
| 0f505f56ad | |||
| bf1a30c5c6 | |||
| bb75ee81d5 | |||
| 9d7bba04cb | |||
| 040c024dff | |||
| 94f50ce8cb | |||
| f5a6a18232 | |||
| 4681d8da56 | |||
| f582ca5051 | |||
| 41f0554484 | |||
| dc38a55218 | |||
| 47da355878 | |||
| a7f018a4da | |||
| 3b31fd7c71 | |||
| 2d88ed17d4 | |||
| f40bb309d5 | |||
| e0d41ab683 | |||
| 801e3c26d4 | |||
| 289515a78b | |||
| 4744fa05ef | |||
| 64501a8645 | |||
| 1fedad5dfe | |||
| b510e3fcc5 | |||
| 99012725dc | |||
| aa83af477a | |||
| 5ca2729a56 | |||
| f0cb979c5e | |||
| 30457d9af6 | |||
| 1237946a8d | |||
| c2590fc0d9 | |||
| 4de3d134c9 | |||
| e8348f2c7a | |||
| 1e08ed177b | |||
| 2068a58414 | |||
| d895789296 | |||
| 1dfcfb8aa9 | |||
| bf70a42d86 | |||
| d2d8a83461 | |||
| 2a73d18d14 | |||
| c91c8b66ce | |||
| 8816e4403d | |||
| a75e403b35 | |||
| f5cdb0abfd | |||
| 90105c421d | |||
| bbbcfb707d | |||
| e455ada90a | |||
| da0c8ffff9 | |||
| 428c43e707 | |||
| a8b0612a7f | |||
| e090d699ef | |||
| bb39e1d220 | |||
| aec071689a | |||
| 22c62439ee | |||
| 5ad222e896 | |||
| b225622eaa | |||
| 83e6319643 | |||
| 5408898e15 | |||
| 8e781ccf7b | |||
| 7e3b64b328 | |||
| 96089d5396 | |||
| eb6e3a7e8e | |||
| 63ef1e544a | |||
| 23709a1b11 | |||
| 4a92850d9a | |||
| 360f498e47 | |||
| d7e7dcc823 | |||
| 25c00a0d55 | |||
| 93cdb7ce8f | |||
| 47af31a8c4 | |||
| 41ad835d86 | |||
| b8ad4bdd2a | |||
| 544cb1ff6d | |||
| 07ad94de13 | |||
| 982b22b4b1 | |||
| e0b587251a | |||
| cdc85a1961 | |||
| 4cd31ce2b4 | |||
| 7c9e170a40 | |||
| 8f78ccf414 | |||
| 81fd026313 | |||
| 9c7378cf5b | |||
| 3a51320ea6 | |||
| dfa6f5c75f | |||
| 3d4309457b | |||
| 14bc9501c7 | |||
| 90d9f83f8c | |||
| 82a39e5d98 | |||
| 101e803ca6 | |||
| 907f289ea7 | |||
| 9fd62cf9aa | |||
| 05d095b35e | |||
| 5a710ccd7a | |||
| 4764ab17bf | |||
| ba7332f55c | |||
| c38b81d682 | |||
| 384172050d | |||
| f237d5d87d | |||
| 3c2b1a232c | |||
| a6ff0c3ed1 | |||
| 79b03f6b5c | |||
| 9614b7b014 | |||
| 484bc409d4 | |||
| 0ba4a0cabc | |||
| ebcf584117 | |||
| 2bc6ca089f | |||
| 39f50726a6 | |||
| 4c6fd783e1 | |||
| b300793009 | |||
| e0b5558399 | |||
| cfac2db5d2 | |||
| 9d9ecb3ba8 | |||
| ab55c145f1 | |||
| f7957be3e7 | |||
| 4b42e17372 | |||
| 36c4c3c86a | |||
| 3872d74bd2 | |||
| 39698c7694 | |||
| f4c8808d19 | |||
| fa1cd56a0d | |||
| cc47cb85e4 | |||
| 3c48484870 | |||
| 474add9d12 | |||
| f3652697ae | |||
| dfee74ad1f | |||
| 3a6b7ea80b | |||
| 9b55ffdf6c | |||
| e459707b0d | |||
| a1f985bc7d | |||
| 9629c48d99 | |||
| 46e7e6173a | |||
| 33b31f9155 | |||
| 398fc4be37 | |||
| d111b2ba03 | |||
| 0aa9c865ca | |||
| 0f01683c06 | |||
| bcca8c9291 | |||
| c30e338f0a | |||
| accbef6841 | |||
| c5405183c9 | |||
| 8a942922fe | |||
| 772172ed6b | |||
| 9b0b11f08f | |||
| 9618a57432 | |||
| f701e35c50 | |||
| 1789e879bf | |||
| a730c3b1af | |||
| 623299e59f | |||
| 6877e14b04 | |||
| 760b687b02 | |||
| 2c2c7744eb | |||
| 2c6f0be3cc | |||
| 4ffda55071 | |||
| 5e8da3ba5f | |||
| d436b71ef5 | |||
| 8eadd912f7 | |||
| a74f978f89 | |||
| d8cb1d15c7 | |||
| d2f339dba1 | |||
| 3c72abad37 | |||
| 2a3a15533c | |||
| 9c66ac4656 | |||
| 1bd109395a | |||
| 8a5f50dc49 | |||
| 4e65215b57 | |||
| 4a08ab11ad | |||
| 99c1b60493 | |||
| 97de7a627e | |||
| e06200926f | |||
| cc60814334 | |||
| c01a140077 | |||
| 23794c8875 | |||
| 97a5daf7e6 | |||
| 1e22d8e3f8 | |||
| 61af4c94bd | |||
| 6719e0b326 | |||
| ccef5f0d73 | |||
| 03014dcf08 | |||
| 241238d2d7 | |||
| e6074149e5 | |||
| 2bdebdb2ef | |||
| 44433bf3b4 | |||
| bf32034d91 | |||
| beb79f6107 | |||
| 518e248494 | |||
| b1572ecb91 | |||
| 845198ebe3 | |||
| e41dfe738b | |||
| 94ee82b58d | |||
| 77f9010b06 | |||
| 29860b838e | |||
| 969db604e5 | |||
| b9321a72b6 | |||
| a3f0f8ad8c | |||
| c327cba735 | |||
| a467c96e00 | |||
| b4860cee69 | |||
| 2abaa89907 | |||
| 96e0842d27 | |||
| 2db2d27f12 | |||
| a08e1576ce | |||
| d5a129cb1b | |||
| 9a9b97998c | |||
| 810623be61 | |||
| b3d9ec687d | |||
| 2a6f1df76e | |||
| 42dfc56bae | |||
| 2b7b9e4d5a | |||
| d1fbe42443 | |||
| a6ed117088 | |||
| 3031e3937c | |||
| 64a8408600 | |||
| bdab3b55bc | |||
| c33d4a9bfb | |||
| 2c7d62bb8e | |||
| 327ccec4cb | |||
| 3c939bbf40 | |||
| 2f12642405 | |||
| 1f3a86dca9 | |||
| ce3caede6c | |||
| 566756ecf2 | |||
| c78fb7995e | |||
| 198d9d9dd5 | |||
| 1a4277994b | |||
| c1f0fb750d | |||
| 4b67a24c66 | |||
| ba4979cfc2 | |||
| cd04007a71 | |||
| 5355e8c802 | |||
| d401f57080 | |||
| 6eb3bc0577 | |||
| 3a68e2891e | |||
| a9609c7993 | |||
| 94adc01f35 | |||
| b4533211a7 | |||
| 320a1a984e | |||
| 9e2867ed7d | |||
| 8ac8f9a6d1 | |||
| 8eb6fd2b6b | |||
| 316590ec59 | |||
| 62b47fa65b | |||
| 9fb2952996 | |||
| 66c1201786 | |||
| d7f03d2c7d | |||
| c01cd78225 | |||
| 5601be630e | |||
| 2293bd5fe0 | |||
| d3b920dfc1 | |||
| ec3972d511 | |||
| a69fa0b00d | |||
| 91672b55d8 | |||
| 09577d3021 | |||
| 9215ea4861 | |||
| b25ba6b229 | |||
| 3540e91cc4 | |||
| ce6fb185f4 | |||
| b925843baa | |||
| 9c2c401669 | |||
| 7f6f50cf29 | |||
| 7edf3e5b36 | |||
| 62cca0682c | |||
| 1a55e7c734 | |||
| d7e2ee986b | |||
| 3363f6ac0d | |||
| 3e3b0e7951 | |||
| 19bb7c2293 | |||
| 2eeefebcb2 | |||
| 4bb703e9bf | |||
| 1ec55ee088 | |||
| ead65f01ff | |||
| 7f6a6f9fff | |||
| 2e93a7fd08 | |||
| 9cba6bad6d | |||
| 5a7efe9019 | |||
| d0a75375f7 | |||
| 0a25b71437 | |||
| 267c5566d8 | |||
| 988d8bc2c5 | |||
| 33a53bd510 | |||
| ec806a2009 | |||
| ae970cf2c8 | |||
| fb7d2831cb | |||
| 224de66c49 | |||
| 7956ee1e2c | |||
| bd2af64a7e | |||
| 388ec655bf | |||
| 4392e07cd6 | |||
| 4b0967b45e | |||
| fd3d6abd61 | |||
| 3553d2f16b | |||
| 9a617c630b | |||
| 95a951a453 | |||
| 3599de7eb8 | |||
| b4a870933a | |||
| 5e401b6a78 | |||
| a89d5d1817 | |||
| 506df8c516 | |||
| d1b142db08 | |||
| c32add161b | |||
| dbb42e9805 | |||
| def45ce8bb | |||
| 82c9586846 | |||
| 6c93643f19 | |||
| 1adf14ca2b | |||
| 6232b8d557 | |||
| cc8e098183 | |||
| 78ee671607 | |||
| 46b1fd944e | |||
| fb7ef90fce | |||
| 8e31c49f1c | |||
| 8f1f88b3ba | |||
| 16e67780ad | |||
| 5745e4e522 | |||
| 67aa41afb1 | |||
| 12aa5f0b65 | |||
| 5f851d2433 | |||
| fbb9fa065a | |||
| 401bd1c125 | |||
| 2dff188eac | |||
| 303b9da684 | |||
| 42461f1b4a | |||
| f9b979f1c6 | |||
| 26dd1afd32 | |||
| 11704740fe | |||
| 443bd83b6f | |||
| 255255e45c | |||
| fdf6306060 | |||
| c95e5b0611 | |||
| 8dc9834f48 | |||
| 465cdae564 | |||
| 41447d4ba0 | |||
| 41905f9810 | |||
| 2065b949b0 | |||
| fd3553f668 | |||
| 13a6de8645 | |||
| 887b52c18a | |||
| d54efc73f1 | |||
| b2ecceab44 | |||
| fb5c45f474 | |||
| 899e749d2d | |||
| e00e9d1552 | |||
| 9a3884636b | |||
| e267583bad | |||
| 32806e8f4e | |||
| 389eee22e3 | |||
| 9fcac44faf | |||
| 03c95b5597 | |||
| 1f6fc02c24 | |||
| 94e0b3a747 | |||
| 94476783da | |||
| 480947e0a9 | |||
| a4a3074bb6 | |||
| 36d06ccaa3 | |||
| 0509f9710f | |||
| f71d58a081 | |||
| ba95ae5191 | |||
| 4c2465466c | |||
| 6db156513c | |||
| 6f55e01846 | |||
| 6343922b16 | |||
| 7d7ad06b80 | |||
| 90f06e74a8 | |||
| d302675d7e | |||
| 9195e37a23 | |||
| b6f33d1d45 | |||
| 0950ef1a20 | |||
| ac2e9cbcff | |||
| d8d514cec7 | |||
| c222838325 | |||
| 9a28e02fc6 | |||
| 4cb47251b3 | |||
| a8f0035b8b | |||
| 03cd86b4d7 | |||
| 166f7c2728 | |||
| 31a446cfab | |||
| 95c4004ad8 | |||
| 7506142dbb | |||
| 4764e7914d | |||
| 97338d61d2 | |||
| 78ed675eda | |||
| 954a11a1b0 | |||
| a5ec9d749b | |||
| ab3de4777c | |||
| 08ca326571 | |||
| ab5d789732 | |||
| cff8c57dba | |||
| 7ed39ef375 | |||
| c59b617106 | |||
| 98ca916197 | |||
| 74916dddfd | |||
| 0d6f81904d | |||
| 62394b4b1d | |||
| 9eaa6e622b | |||
| f9e1dc3ffb | |||
| 08a9a00330 | |||
| 62b095dde6 | |||
| 0a32e6bf7d | |||
| c8f8b33bd9 | |||
| 30624e7320 | |||
| 2c51f79c0a | |||
| e4de83f2ed | |||
| 17e3625e5d | |||
| aa7c467679 | |||
| f6137831ee | |||
| b57c0a9db1 | |||
| c4c1655f76 | |||
| 4e94c7c88c | |||
| c36d1a5680 | |||
| b984276bc6 | |||
| 28969a7de4 | |||
| 05c6a2214b | |||
| 71fc8c63fe | |||
| 543d1a3c0e | |||
| 1a261597c5 | |||
| 09671823e4 | |||
| fd595863dc | |||
| 05f919c50f | |||
| e2789214ae | |||
| 51e5dc0c00 | |||
| 7d9d6eb272 | |||
| 167f7e268d | |||
| c785f9106b | |||
| 0e75dba142 | |||
| 2f07b11bb6 | |||
| 346d0e3111 | |||
| 288bde7925 | |||
| f35902ed85 | |||
| 05ba9b8d45 | |||
| c996476a28 | |||
| eaa5716d6a | |||
| 2e5b89aa84 | |||
| d2ac0429d3 | |||
| c2afe0b6b2 | |||
| a9b5c5d32d | |||
| 238d0f42b1 | |||
| 4f97ae35bb | |||
| 4479035595 | |||
| c745e6f29b | |||
| f63849ed56 | |||
| 23d5a5e238 | |||
| 9b226926ed | |||
| 4ad8b8bb19 | |||
| cbea62ceb9 | |||
| cf799c2198 | |||
| f3be30a55e | |||
| c4fa30d39c | |||
| a02b5b8b57 | |||
| 6988333a8e | |||
| 3eef855c31 | |||
| d9f3915186 | |||
| 19941c3e88 | |||
| 877a6e6913 | |||
| 2051a724ae | |||
| 774c4b65fe | |||
| 3ef41e1e23 | |||
| b96f0efd9c | |||
| 801587ab6c | |||
| df1dfbec36 | |||
| 59af92bfc4 | |||
| 35f06bbf6e | |||
| 766a79af12 | |||
| 17467c81a4 | |||
| 5fc2f12139 | |||
| ae846debd4 | |||
| c01e5efe43 | |||
| 06be726a6f | |||
| bdde0af771 | |||
| c76f1f2432 | |||
| ed4eeee647 | |||
| 8c79c21e61 | |||
| ca56c5f9d0 | |||
| a22d5887bb | |||
| 2b41c8d24f | |||
| c519c00678 | |||
| 4c130bcba1 | |||
| 3fc7073046 | |||
| b73ff9aaf6 | |||
| 3c2c95d670 | |||
| 37ed8afb30 | |||
| 51a90dcd28 | |||
| 23e722a9fb | |||
| 27fbd896f7 | |||
| 0b16490719 | |||
| d36a36d439 | |||
| ac33ba432d | |||
| 6e885ece34 | |||
| 826581cb77 | |||
| d533dc5f5e | |||
| 66fac52905 | |||
| c28215b93e | |||
| bbfd80dcb1 | |||
| 81efa49951 | |||
| dc62586314 | |||
| 6a1b4e547c | |||
| d3c974a838 | |||
| 2b698ca8b0 | |||
| 3e945fbe34 | |||
| 8409f9d2d4 | |||
| 6821e3c370 | |||
| d4a27f38ff | |||
| ace8295ab7 | |||
| c23d2ad2c4 | |||
| b5e19d95bd | |||
| af34bafc5a | |||
| aa07d3b2fa | |||
| f7837f99c2 | |||
| 04836f037d | |||
| 64b6b4ebc9 | |||
| 2f1aeb6897 | |||
| d11a9d4d8f | |||
| 3ed55c89f0 | |||
| 9381d0f5f1 | |||
| a7a6dc7671 | |||
| 02856273ad | |||
| 8ba1affe9e | |||
| ba2b7939a3 | |||
| 7739078aad | |||
| 851c6d972c | |||
| 3410bd5380 | |||
| dc0f77ae2a | |||
| 3e73f40c0f | |||
| 7cfcacf0cd | |||
| 28c0552e0a | |||
| 9857fb12c4 | |||
| 5b31a8222c | |||
| 1eacb36256 | |||
| eabab8301d | |||
| 20331bc858 | |||
| 6387e87a30 | |||
| 221c4f0648 | |||
| 52815a4ab0 | |||
| 203d1d79dc | |||
| 480783b7fa | |||
| 3781228dd2 | |||
| 983190b9a0 | |||
| 4e01d110a1 | |||
| 08d08133c1 | |||
| b1ad70b6b2 | |||
| 6e9b5225d2 | |||
| 0d422ec169 | |||
| c5dd3674c1 | |||
| cf0a16e875 | |||
| 841a336581 | |||
| b2729e35c2 | |||
| e7f899309c | |||
| ed82787093 | |||
| acb4a10fd5 | |||
| 9927209293 | |||
| d5bc9b5e46 | |||
| 8aaa0a2d6b | |||
| ba8d506c14 | |||
| f1b82b788b | |||
| 029566b2ff | |||
| 35aaacd61b | |||
| eab3631c33 | |||
| cca8200794 | |||
| 0fb02a5aff | |||
| 7448383079 | |||
| e9215c1a9e | |||
| 69d3cb5b2b | |||
| e4d3989b71 | |||
| f9c6166b46 | |||
| ee691469b4 | |||
| 752e7e73bc | |||
| a9ec4566e7 | |||
| 653cdd8654 | |||
| 18901ba66f | |||
| 7bc0e3c14d | |||
| 7b2c034fba | |||
| 7dd2a8fac9 | |||
| 00cb802363 | |||
| 698ce4c0ce | |||
| 325433aaf8 | |||
| 7877f77242 | |||
| ac1eb8d58d | |||
| b2ae91e3b9 | |||
| 898a7002eb | |||
| 5d0da2c8c2 | |||
| df07529f21 | |||
| bc7660fbf8 | |||
| 857b7e522f | |||
| af9962c30f | |||
| a7e29c5784 | |||
| 3a03fe5f7f | |||
| f1eebd3835 | |||
| 40ed499889 | |||
| 55155630ca | |||
| 1e2a15d6c1 | |||
| 3bfeb1db76 | |||
| b2d041c9b3 | |||
| e5ab536db4 | |||
| c572d75d1d | |||
| f1bc3f58e2 | |||
| d774cb496a | |||
| ed1f0b8881 | |||
| 0dafa2f562 | |||
| 5ab554f61c | |||
| 8a725ec243 | |||
| cd1f57b634 | |||
| c47db14c83 | |||
| 81305a10cf | |||
| a58645da0f | |||
| cd707eb5a4 | |||
| 27400cffe4 | |||
| 5b1c5824c8 | |||
| c4af8ce0ca | |||
| 3e080c44c6 | |||
| eff5d0899d | |||
| 992f4b2303 | |||
| 8e7ff6f657 | |||
| 4e86f1c776 | |||
| 4b78551765 | |||
| 3579b86980 | |||
| 3f39212b7b | |||
| b0b6aeccd8 | |||
| 5b6a0a8d7f | |||
| 3bbeae15f2 | |||
| f6a6e298e0 | |||
| b4b41d6773 | |||
| 274dde0a7e | |||
| 7a5e5a63e1 | |||
| e55dd16b72 | |||
| 054b2cb9c7 | |||
| fed5805fcc | |||
| e9c5ffa736 | |||
| e912590bc6 | |||
| 9d3861ace2 | |||
| 0b1c1b3a8d | |||
| 4b22503ea2 | |||
| 54786a001a | |||
| 9cf6120b39 | |||
| 21f1930c2d | |||
| 053d55bf81 | |||
| 563ec32f06 | |||
| f8bc124752 | |||
| 529beaad08 | |||
| efbc7976b0 | |||
| 048612c65c | |||
| 866105631e | |||
| 6c4ca6c01a | |||
| a04d19d9f7 | |||
| f470a9aaf4 | |||
| 0bb1982bcd | |||
| d2cc4051ad | |||
| 224937cd09 | |||
| 8661c2af18 | |||
| 854b2492dd | |||
| 0f6e204c76 | |||
| 1e4c07f94c | |||
| 3185691077 | |||
| 42075f7b2a | |||
| a746e0c995 | |||
| ca0135724c | |||
| fa82555149 | |||
| 9a90b2fa42 | |||
| a3012d0b27 | |||
| 7f482330ca | |||
| 810691d540 | |||
| eb24c29f7e | |||
| 9a17f2141b | |||
| d073a13f57 | |||
| 7e622a69a6 | |||
| 6001eb88fa | |||
| 438135975f | |||
| 1610af3f3f | |||
| 60e926a62f | |||
| 25a9dcad8a | |||
| 1243927ad0 | |||
| fee47a99b3 | |||
| 7c54bb0155 | |||
| 9a0e3a7b6c | |||
| ff4f1277e7 | |||
| 6fba1a4ab9 | |||
| f24cb34e3f | |||
| 772af752d2 | |||
| dff1374378 | |||
| 7e5fd8e384 | |||
| 95ba2e9bab | |||
| 41a873450e | |||
| 7f5869e257 | |||
| c8c215abfd | |||
| ecc055d8b8 | |||
| 2622482b12 | |||
| ca6a075d8c | |||
| ca3d4a84ad | |||
| 6eec0b396d | |||
| 2d6f8cc406 | |||
| 80fc3d82b0 | |||
| 1bb64fdf5d | |||
| e7edb9d38c | |||
| c4dd5ef5c8 | |||
| 73e92e33fd | |||
| 3a5c3cabba | |||
| 0b4408bc78 | |||
| 2f42321551 | |||
| 98da5525f3 | |||
| 20f9bdc209 | |||
| df6dc6b21f | |||
| df10d6560b | |||
| a2825eac87 | |||
| 51926f517e | |||
| 382a35aabf | |||
| 93f23af92e | |||
| d8a4814542 | |||
| 6c37673787 | |||
| 77f9716932 | |||
| ece77065ca | |||
| 15186cafe0 | |||
| b35795f1ff | |||
| d667084d11 | |||
| f8d6f8ffb5 | |||
| a3ca6b0dca | |||
| 2524d93f6b | |||
| 4f690c17fa | |||
| 7af125b453 | |||
| b0fe4e9945 | |||
| a6d488c4ef | |||
| e01a0585a8 | |||
| 3e1356ba2d | |||
| 9581f7b10e | |||
| a83ee4014e | |||
| 4264a36dd0 | |||
| dd00c83f74 | |||
| 6ad8e8b133 | |||
| f17e347a15 | |||
| d95d3efe33 | |||
| d21ccac63e | |||
| 427541b488 | |||
| b27c832cb7 | |||
| 3162d4e770 | |||
| 2abb215034 | |||
| 12fd7274a9 | |||
| 7456bf38f7 | |||
| d85a020971 | |||
| 6f83330321 | |||
| 0a7f2fc043 | |||
| c32e869c56 | |||
| 23d38fc387 | |||
| 6d2092f9e8 | |||
| 0754434295 | |||
| 732f74e5c9 | |||
| 7de7c8806e | |||
| ebf2b0a2f3 | |||
| 97fd733c3e | |||
| c191815b82 | |||
| e21c9d24de | |||
| 2ce14b5e9c | |||
| 3f68a0576d | |||
| f216528f40 | |||
| 4562dde31f | |||
| 7cf464aabb | |||
| 1a8456ea57 | |||
| 4847479dae | |||
| dbe5886ffe | |||
| 16a4b0dd8a | |||
| 0be815cddd | |||
| 9f79d0e3c4 | |||
| d3bdc3cf8b | |||
| 5c495b987b | |||
| 2b741cae58 | |||
| 44fc1f9d05 | |||
| 6982997a2b | |||
| de2db94b85 | |||
| 3f230415c4 | |||
| b79f090364 | |||
| 9db2feb674 | |||
| 624d24d209 | |||
| 3dbbcc3a8c | |||
| 2c0520cc9d | |||
| 5ca717a231 | |||
| e2f9646b8f | |||
| b5e324673e | |||
| 20b65a08d9 | |||
| c0d0083cc2 | |||
| 934258aadb | |||
| 16f81cc184 | |||
| e8c9856665 | |||
| fad1e6fdfc | |||
| fcd86bccf5 | |||
| 319bee0838 | |||
| f92dd5d34a | |||
| d65ae8de96 | |||
| 40c537d114 | |||
| 39a6d0d292 | |||
| 78f8066d4d | |||
| b3e16a6b66 | |||
| cb96a87659 | |||
| 22812ad21e | |||
| a3eddd5b3b | |||
| e095b610fd | |||
| 851fd1a6d0 | |||
| 3bfb0e6cac | |||
| cec4db1531 | |||
| 1c140a5b0e | |||
| f413431667 | |||
| 160dfa5dc7 | |||
| 0d12ccef64 | |||
| 40a3fb96a2 | |||
| fac7c8aa6a | |||
| 7dd67b5ae3 | |||
| 59b975499f | |||
| 7010c52af3 | |||
| 29e06eb696 | |||
| 7ff5ebb45d | |||
| 54753a49ed | |||
| 4efd411045 | |||
| b5845d2e12 | |||
| f1b100841d | |||
| 8626350e5f | |||
| 4ae3fccfd9 | |||
| 255b2c85c8 | |||
| 8ef8b89fd5 | |||
| f70b116fcb | |||
| e0ae2984ae | |||
| 544a11562c | |||
| f688cd0c69 | |||
| f32ea92336 | |||
| 66c1b73635 | |||
| 759dc98737 | |||
| ac511cbadc | |||
| 7a12a6c280 | |||
| abe635ad9b | |||
| 960a122550 | |||
| 922201d1c0 | |||
| 5c171c8b58 | |||
| 6a6eb96793 | |||
| 968f536cdb | |||
| 8078b9543d | |||
| 00842e89cb | |||
| 8c021b0252 | |||
| 56b0d885a6 | |||
| 1f7a7a5488 | |||
| 845da14e6a | |||
| a21f6d1b9f | |||
| 42366ee66a | |||
| 1940707b06 | |||
| c8b57d417c | |||
| fb70368c8d | |||
| 5af3a22fd0 | |||
| df497bf684 | |||
| 675bb93fd5 | |||
| 960268f756 | |||
| 92cfcbff8c | |||
| 0c74e2ff9d | |||
| f194004ebf | |||
| 30615e842d | |||
| c4d457d7b7 | |||
| 518df5e62b | |||
| e6d3242670 | |||
| 2a2d9f54de | |||
| 0122bf68bf | |||
| aa1c200bf8 | |||
| 8fb27e6f83 | |||
| 4eeadf87fb | |||
| a479f1daf6 | |||
| 691df4cb80 | |||
| 878fee505f | |||
| 1262243af9 | |||
| b9ca496aff | |||
| 1567f8723d | |||
| 3e56cd2c70 | |||
| bb6bbe9793 | |||
| ec7d892412 | |||
| 5cad37fa50 | |||
| de02131d0a | |||
| b3887c0874 | |||
| 1d0faddd2a | |||
| d99aa3ef46 | |||
| a90b3bd7f6 | |||
| fb28cae2b4 | |||
| 97ab226d7e | |||
| 77461e45c0 | |||
| 99135759e3 | |||
| 4dbc770d75 | |||
| b151ab497f | |||
| 3fb0b56c10 | |||
| 85ab871d48 | |||
| c930d32b2b | |||
| c7c339957b | |||
| afea02d92f | |||
| b2c824b77e | |||
| 76e056698b | |||
| 1d575f51b6 | |||
| 3abea4ec23 | |||
| 146dffa732 | |||
| 54c10dd78d | |||
| c3c28413d7 | |||
| 802893a214 | |||
| 97e44aee61 | |||
| 3c5bbe5075 | |||
| 9ed0138a17 | |||
| bdd8242a0f | |||
| 2a8dc0ddba | |||
| ecb788b28a | |||
| 82a0039926 | |||
| 722861b929 | |||
| 1d6240aca5 | |||
| 437f7e6f9c | |||
| c18e5f522a | |||
| 5afe51d1b4 | |||
| 082d56f89a | |||
| 544a043c56 | |||
| a2be4bb74a | |||
| 4d85a5ac3d | |||
| 8db1a9b9ca | |||
| b4dcaef61a | |||
| b04321bdd2 | |||
| 6b7ca47f26 | |||
| 00d5a40443 | |||
| 87754f12ff | |||
| e7d99057ba | |||
| a1a9dfa6a2 | |||
| 6b614d5d57 | |||
| 1eafae8888 | |||
| 03f4e78158 | |||
| 339e5a5d91 | |||
| 2db1438ef4 | |||
| 42d31c0c65 | |||
| 64a5b01bd9 | |||
| ea7cdd00bd | |||
| 43e8a54e57 | |||
| 393595ea2d | |||
| b9f13804e0 | |||
| 1c511d112d | |||
| f86e22ba87 | |||
| c87feb69c4 | |||
| 75a02beda0 | |||
| 7106dc738b | |||
| 7525bf6435 | |||
| 8f653fa699 | |||
| ba75cabdda | |||
| cc5849100b | |||
| 6813cb607e | |||
| 74280b7411 | |||
| 4072796e54 | |||
| e09f4eb6dc | |||
| f82117c6fb | |||
| 48ae338fb2 | |||
| cc201e198d | |||
| ee33c97db6 | |||
| d672826808 | |||
| 0bf4ab9cb6 | |||
| 84265322d5 | |||
| 7fbb008ddd | |||
| d06433deed | |||
| 7b02a4b33b | |||
| b7814e119b | |||
| 0db1f5e965 | |||
| 33e88acf90 | |||
| fcc0ca1772 | |||
| 4502d29710 | |||
| 81f3a65a5f | |||
| 044234a55b | |||
| 2f7a84822a | |||
| aa28f9ef52 | |||
| c1b9dc4b2e | |||
| fc13351a2b | |||
| 5f7830d09e | |||
| 30b71b9d65 | |||
| f0e737fd4b | |||
| 5de2998774 | |||
| 85c29c3d2b | |||
| 0a59c61100 | |||
| d9a516206c | |||
| cbe97ef3f0 | |||
| 77b21de534 | |||
| 400cc97100 | |||
| 2b42e9256c | |||
| 862c02da6a | |||
| 4795ffdf3d | |||
| 406db6704f | |||
| 7cb0ac3603 | |||
| b8d03636dc | |||
| 2e687edd99 | |||
| a82c669504 | |||
| 8f4d88d607 | |||
| 28fea66282 | |||
| 268db124d9 | |||
| 180efe86e6 | |||
| dd1dd2ef8a | |||
| dbc88af339 | |||
| 89c966fee6 | |||
| 9f4c916016 | |||
| 86f3007887 | |||
| 758f260574 | |||
| 2e17a94216 | |||
| 96cd3e560c | |||
| 1dee615d6e | |||
| dfb502621d | |||
| 06f3d68716 | |||
| d7bf276deb | |||
| 117008babd | |||
| 68991d1222 | |||
| d09bd12e5b | |||
| 4593e4c669 | |||
| 3cba76277b | |||
| a7d0853519 | |||
| e04f482e52 | |||
| ae3ce49b92 | |||
| 512df5f673 | |||
| 69a3587f5d | |||
| 9f1c55edce | |||
| 8ccb4f5857 | |||
| 9c80354acf | |||
| 835cb93261 | |||
| 2193dfcbc1 | |||
| 1deadf84b1 | |||
| 8a9f86705b | |||
| 111eaf1cf9 | |||
| d6b566a3fe | |||
| e218cc417f | |||
| 99bc3289e8 | |||
| 31d1932d55 | |||
| 8f633523cd | |||
| 21d96c6baf | |||
| 489e8ddc42 | |||
| 113fe30d5a | |||
| 0ccffb7691 | |||
| 8750b61221 | |||
| db921bad10 | |||
| e0c6f7e8b2 | |||
| b4e09a9d55 | |||
| dbec1389e8 | |||
| a7bb25b7d5 | |||
| 90e385c3c3 | |||
| ce45070d63 | |||
| 1be5815df3 | |||
| 51e62c7e9d | |||
| b3fdc9eddd | |||
| 08a428416c | |||
| aaecb6f7fd | |||
| eb1a520986 | |||
| 7ec57f8ddb | |||
| 957b92eac7 | |||
| 19bf30558b | |||
| a0740c162a | |||
| 98a753267f | |||
| 657de4b62c | |||
| a293265058 | |||
| a1e7f4f689 | |||
| a1e8056070 | |||
| 86ce671c0d | |||
| 16056a00e0 | |||
| 89538cb5cd | |||
| 39e41d8528 | |||
| 0d82be3ac8 | |||
| f999f337b5 | |||
| af792ff677 | |||
| fbecd01435 | |||
| 8d40ab5883 | |||
| 4972092150 | |||
| 3472daf97d | |||
| f939eec924 | |||
| ab77e5ef31 | |||
| 20edcdc64b | |||
| 93541b6ed5 | |||
| ca3948ad69 | |||
| 88db7c2d5f | |||
| 8857a7a0ae | |||
| 1d5f98a730 | |||
| 84015f78fc | |||
| 6cea33caea | |||
| 233bffdf63 | |||
| 3bc664df37 | |||
| 05eac5aeb6 | |||
| 26244df222 | |||
| c3e3e70f96 | |||
| cdf66372e6 | |||
| bcf86d9d9f | |||
| 86c1823d4a | |||
| f3c608f2f3 | |||
| 09f8ad948a | |||
| 8b4a001641 | |||
| b402232a47 | |||
| 327fa6718e | |||
| e1497bcfe2 | |||
| 0a54b9e77e | |||
| ff70c16051 | |||
| a45b71617d | |||
| ebfa3822ef | |||
| 0334329c50 | |||
| e1387e92a3 | |||
| 13cc6eb7b9 | |||
| 70b0aa25b6 | |||
| 69162ad8d9 | |||
| 9ed0ace01e | |||
| fd802e54fb | |||
| 9265f23681 | |||
| e9adaa7c87 | |||
| 27d53b69dc | |||
| 4d73b271b8 | |||
| 26607c1d09 | |||
| 5d2fe5908b | |||
| 43d578deb2 | |||
| 529a82234b | |||
| 6f12dc8567 | |||
| b193a7abc4 | |||
| d41daee94c | |||
| bcc036f808 | |||
| 3da6f9186c | |||
| 1dbbbeced1 | |||
| d4b2171c19 | |||
| 5d7940f784 | |||
| 6f3e7bc253 | |||
| e66045029f | |||
| bc1b666b83 | |||
| 4cc7ec0461 | |||
| 706c4bd677 | |||
| 6ec58664e4 | |||
| 463251a7fa | |||
| f688f3ce20 | |||
| a21d1a91fc | |||
| c0f81a6f0a | |||
| 84ee882439 | |||
| 5a9ca6f130 | |||
| cf3ac7a26e | |||
| 747a9bcb98 | |||
| 63a6b704df | |||
| e160d719a9 | |||
| 87a290b45c | |||
| 3387da92ed | |||
| 12725ca4e1 | |||
| 6f40c66b31 | |||
| 3ddd64df2a | |||
| 24d31d024d | |||
| d01365d416 | |||
| 19c83e3b6e | |||
| 81fa876940 | |||
| 7fd542950f | |||
| e4794c5754 | |||
| 9d35068514 | |||
| a2f01ba638 | |||
| 07f7fee4a8 | |||
| f3216a9c96 | |||
| 0a9e9e6695 | |||
| 7f5903584e | |||
| 1ead4b1649 | |||
| 279d168b35 | |||
| 09651fa0fd | |||
| 3844aceba1 | |||
| 170d018f88 | |||
| 4c587ce870 | |||
| 89734760fa | |||
| 00b3760fbd | |||
| 2498d1d4f2 | |||
| 2a3003101e | |||
| 35b687bf3d | |||
| 6683cb299e | |||
| e79321241c | |||
| d018478255 | |||
| f2dc7346ad | |||
| 919bd4ee1b | |||
| 8b3fc9842d | |||
| a1d4e50e98 | |||
| 506ce69f53 | |||
| 67dd80e40d | |||
| 9752bfabee | |||
| cfb02692df | |||
| 3bc99c0949 | |||
| 12c503646d | |||
| 1b234fd32b | |||
| 5bdf4dc74e | |||
| 15028c60ba | |||
| 3c603d7f09 | |||
| 07f680eed2 | |||
| 68f6e0251c | |||
| 8e0493ee97 | |||
| 085186cfff | |||
| 9454f96e0b | |||
| 1745984d5a | |||
| e98380e0fa | |||
| 68b4fdb9c3 | |||
| a4409c729b | |||
| 597a9c537d | |||
| ae44ef0a79 | |||
| fec787b96b | |||
| 22b798928a | |||
| 1fb07a01d2 | |||
| d87f0df2a6 | |||
| 694b20148d | |||
| ee76440477 | |||
| 74d4bb8dc6 | |||
| 20ba37e223 | |||
| 92fafe877c | |||
| 52bc268ee7 | |||
| 49a0d66bfe | |||
| e2590b5f11 | |||
| 8fe656b88f | |||
| 05d5fd4fec | |||
| cd7642eeec | |||
| b133539c40 | |||
| c475e83aa3 | |||
| 78c5644de0 | |||
| db3552509a | |||
| 3da17918aa | |||
| 2f0c96abe2 | |||
| 5de034f073 | |||
| 161e9bd373 | |||
| e176ea749c | |||
| da24a474ea | |||
| 09be8994e9 | |||
| d866526dd8 | |||
| 6d7bd78816 | |||
| 3964fc7795 | |||
| 9f80b9853c | |||
| 2f12e67356 | |||
| ce9df56a97 | |||
| cc980fd70d | |||
| fe1d1b20f8 | |||
| c86508ef57 | |||
| c25abfda65 | |||
| cc0fe5bc28 | |||
| 115d6e46a8 | |||
| 5a03ef8e89 | |||
| 4aabb81c1f | |||
| bdfdb422fa | |||
| 81bb322fd2 | |||
| 915ac0122f | |||
| 7b0717094b | |||
| 64d7684551 | |||
| 431c21caa8 | |||
| d1f30a973d | |||
| 94381f356c | |||
| 0be22bf4b6 | |||
| 4ec2381716 | |||
| 4408e3bb3b | |||
| af0fb6c6fa | |||
| dc352edce7 | |||
| 74823a8bcf | |||
| 32c5a84576 | |||
| 161917977c | |||
| 9ee6104706 | |||
| 96846ea255 | |||
| f8290ea0c1 | |||
| 5507fea29d | |||
| 18095d5adc | |||
| f50022e88e | |||
| 0b54691f07 | |||
| 7ad64d0284 | |||
| 978ee84aea | |||
| 580e08b6ab | |||
| 88b575539a | |||
| c8a70ffda6 | |||
| 2609f9c21a | |||
| 622e608d76 | |||
| cd0a1a5fdd | |||
| ed04eece8a | |||
| cae0b5e91e | |||
| 1c1e9bb105 | |||
| d88335c51f | |||
| 62bfc94f24 | |||
| d896f4f699 | |||
| 57e4831a5f | |||
| d6546fb41c | |||
| 7cc5560adf | |||
| 25f61e931e | |||
| 654285e57f | |||
| bcc3b2bd59 | |||
| 6fd1580d67 | |||
| fc4dc8cb50 | |||
| 489672d346 | |||
| 1c5b779ae9 | |||
| bc229d0bb6 | |||
| c7894d7e54 | |||
| f4a587faf9 | |||
| 9144f6dcc9 | |||
| bc073b73cc | |||
| 588ad86f8e | |||
| 1530f91944 | |||
| d05204cb91 | |||
| c902e33d8a | |||
| 28a67f65b4 | |||
| f66b7ff785 | |||
| b742d0c326 | |||
| a98f867bd8 | |||
| 5f04f32097 | |||
| 3658611e0f | |||
| 537dde594d | |||
| 7221f7167f | |||
| fa332a3785 | |||
| 653e9609e4 | |||
| f11686a7b7 | |||
| 0841f5b479 | |||
| 81be73ad82 | |||
| 44afa732f1 | |||
| 26e3400a92 | |||
| a2e1346029 | |||
| bc6281ee63 | |||
| 134aec2d15 | |||
| b1f867f107 | |||
| 674e09e72b | |||
| 6987834b2d | |||
| 4e19b85e00 | |||
| 5714741a5d | |||
| cdd68c9a89 | |||
| 29f0834cc4 | |||
| 788907f3b1 | |||
| b6557cb15c | |||
| cd2a02a5c8 | |||
| c9ea812a24 | |||
| e42a6b0ccc | |||
| 312e4ad010 | |||
| 2357b60d0e | |||
| 3e608e6dec | |||
| 9cccdc1e89 | |||
| 025ae99901 | |||
| c68e3af566 | |||
| ff44622624 | |||
| da943f7604 | |||
| b4bf488e3c | |||
| f82ef8c065 | |||
| 865f2b871d | |||
| a947dc0cc3 | |||
| 17a738d2ce | |||
| a9ac758abd | |||
| 3bbda838a2 | |||
| 6bdc31df5a | |||
| ed1a3c2964 | |||
| a485622c2a | |||
| ac8c185056 | |||
| ccc60af4b6 | |||
| 311793dd7e | |||
| bd5897eaab | |||
| 55194edd2c | |||
| 8661091337 | |||
| 34b6cfebc3 | |||
| 74c1ac89c8 | |||
| 4dd8e19f79 | |||
| 9fd5e8928c | |||
| 17d0f40e1c | |||
| 0e78d13146 | |||
| 80e2aee92b | |||
| 5a23df6478 | |||
| 62acae10a5 | |||
| 04b650cbc3 | |||
| 4ba82047e0 | |||
| 49758fbfff | |||
| 8158c94d26 | |||
| 4c673bec9b | |||
| 2263b3db52 | |||
| 3a3c66b916 | |||
| 6c253ce892 | |||
| 29521b1b03 | |||
| 8bce445ab0 | |||
| 5cb2322270 | |||
| 81e41d51c8 | |||
| adbb467206 | |||
| 191694725a | |||
| 73efa35008 | |||
| b8420feed1 | |||
| cad7887957 | |||
| 01f2cc1dcc | |||
| 6906db499e | |||
| 8fe04d6db4 | |||
| 4ce6882fc0 | |||
| dc63d908b8 | |||
| 6673d70d0a | |||
| cb6b96dea6 | |||
| 042694f45e | |||
| d4f959b681 | |||
| 15c4b7df54 | |||
| 311dad7b82 | |||
| 2b962e4389 | |||
| 05a7b911f1 | |||
| e8dc48690e | |||
| be7024784e | |||
| b30ab38ef2 | |||
| dfe7963436 | |||
| 034890ee7c | |||
| 58350c87e2 | |||
| c9860f21ec | |||
| 85167b2d4b | |||
| 8e87c98644 | |||
| da784e98e5 | |||
| 20d9c7181f | |||
| 8f8f0266ce | |||
| c7feeb624d | |||
| 57f9e42486 | |||
| 103d630d80 | |||
| 2f34bfbeff | |||
| 57fab6a7f7 | |||
| 2325de3ddc | |||
| 96f1d9e820 | |||
| 04bb83fe31 | |||
| 5768eefe49 | |||
| 8c1f56b7db | |||
| 9f3be80f9c | |||
| 6ea897b0f5 | |||
| f9deb97229 | |||
| f5b48e03e9 | |||
| ca6afc0c2d | |||
| 08abc798cc | |||
| 0f4edbcc6f | |||
| 5529bd7bc0 | |||
| 0242e29873 | |||
| a246825b3d | |||
| 8d3f4aa9d9 | |||
| 6e5a13111a | |||
| 9ddb077e7c | |||
| 46b15551b4 | |||
| 522e1eb769 | |||
| 633357cc9b | |||
| 5cb0da3340 | |||
| 25f35b22be | |||
| f5d1ad5a9b | |||
| 5b32756536 | |||
| 8a567f0849 | |||
| d27edbf5a9 | |||
| 1e811324eb | |||
| 42393eb316 | |||
| 6b660c846b | |||
| 43692f514a | |||
| 78e4ba2f17 | |||
| 2fbfe61f2c | |||
| 0e57b32082 | |||
| 5a561b1278 | |||
| d8304a2178 | |||
| 300f948515 | |||
| 2da9ed4556 | |||
| 089f0dab3a | |||
| 01777a2c1b | |||
| 3661b19d6c | |||
| db55f5ea3f | |||
| ae785267c2 | |||
| 7868c6505d | |||
| b5847eb0d6 | |||
| 9e6243adcc | |||
| 2a3b6edf50 | |||
| 7e612d89cb | |||
| 21b311df17 | |||
| 880a8c9f58 | |||
| e3142e6408 | |||
| 4949ea4b3b | |||
| 9c348b284f | |||
| 85c219369d | |||
| 6ffa497c0a | |||
| ba0f07b57e | |||
| a572e581e5 | |||
| c3b36062ed | |||
| 8e4a0e9e97 | |||
| a560b19cbc | |||
| 28f53339e7 | |||
| 0c17ca82b7 | |||
| f048254d82 | |||
| fb74aef541 | |||
| 81cc8cf69c | |||
| 00fab5cfd6 | |||
| 85a6f485f1 | |||
| d2dba5680b | |||
| c00b32364a | |||
| 23652d1bc5 | |||
| 5d535fad6a | |||
| 1a11f1a231 | |||
| 107edfb958 | |||
| 2fe6129fcd | |||
| 7ddcf8507a | |||
| 1aab96676d | |||
| 1bd639c86d | |||
| 62f2ccb942 | |||
| e2cefc7407 | |||
| efea842486 | |||
| 1ae898918c | |||
| c3d9c52f1f | |||
| b22805f866 | |||
| d69b005792 | |||
| 69790f3576 | |||
| bab236c081 | |||
| bf80827bfd | |||
| 283714a39f | |||
| fecf7d7804 | |||
| 011b5f3e51 | |||
| 5c2d3cbe7b | |||
| f2ac6a970c | |||
| ed10c15069 | |||
| f77d0cc8fc | |||
| d059027a47 | |||
| 7fca8ae4bb | |||
| 28d16fd620 | |||
| bc6de6932b | |||
| e75ca148c0 | |||
| a5d6db6a18 | |||
| 33ce17c3fa | |||
| bd18286fbd | |||
| 7c85ac61b8 | |||
| 9cdbbf590a | |||
| bd93e46624 | |||
| f0c7fbb0cf | |||
| 560b6cf5da | |||
| c0e8b735ad | |||
| 5a402df3ff | |||
| 3dc6afef62 | |||
| 590fcebaec | |||
| 37e3a85080 | |||
| fd96957819 | |||
| d0c0259ee2 | |||
| 53601d8a85 | |||
| 1d19d38c38 | |||
| cd2ae08da0 | |||
| a876e56339 | |||
| c8b0773661 | |||
| 5f85e9ae96 | |||
| 09049990bd | |||
| 674d1fbcc5 | |||
| 254bdacc73 | |||
| 0c68cd8a10 | |||
| c20f0fa430 | |||
| 54b9eaa969 | |||
| aaac0aec96 | |||
| af1dfc0d08 | |||
| 15d24308e8 | |||
| 8ac0e7491a | |||
| 2bcbf23bca | |||
| 01a3a80103 | |||
| 2119075240 | |||
| 1df47bd8c5 | |||
| a51d47a4bb | |||
| 1b2dd0aff5 | |||
| ecb20afaa4 | |||
| 45ba154877 | |||
| 51a2c1e868 | |||
| 8180877269 | |||
| aa2eeb8243 | |||
| 937248794a | |||
| b674aae970 | |||
| dda5f26d89 | |||
| 023cdced0a | |||
| 029d9acaa2 | |||
| bbabd09983 | |||
| 67a8246077 | |||
| 330a588260 | |||
| 8e2a8c045c | |||
| a32658beea | |||
| c2af9164d6 | |||
| 27a62f4411 | |||
| 6dd699cbab | |||
| 206461e80e | |||
| 5bc1773dc5 | |||
| baa273f589 | |||
| dae366f04c | |||
| 075b049bb1 | |||
| fe78fa7575 | |||
| 6ef65734cd | |||
| ad621b824a | |||
| 6e193d4d0d | |||
| b4f791e0ca | |||
| 9b2c940896 | |||
| 3ab54bd7e1 | |||
| 9b300fe074 | |||
| 86b5fa9321 | |||
| 261aeb9245 | |||
| b3388d6fc7 | |||
| c9bab2c521 | |||
| 4a71fe6727 | |||
| 3250ca9fad | |||
| c9655eee8f | |||
| 54da2c8de0 | |||
| 3c1a69eb6f | |||
| a60e1ab8bb | |||
| c53fe681f5 | |||
| 125b4347da | |||
| aa97296123 | |||
| d76c167ad9 | |||
| 6cbeac6537 | |||
| cbbfb16628 | |||
| 4042d466d3 | |||
| c2f745397a | |||
| a4763f630e | |||
| 178f0b9e3a | |||
| d93a2803cc | |||
| 57d7508e25 | |||
| 9ae79b8307 | |||
| f8bf87e0b1 | |||
| ef240ce986 | |||
| e58332723a | |||
| 81daaf663b | |||
| a9e4d6d908 | |||
| 5f7f53304d | |||
| 3e0b753498 | |||
| 4bd76b70f2 | |||
| d19c31555b | |||
| e0f1f18998 | |||
| f80c33f381 | |||
| 2bfcc15f66 | |||
| fdc8e371c4 | |||
| ba050b9eaa | |||
| c1216a4318 | |||
| 2ae78b9afd | |||
| f33a2d8fe5 | |||
| 1943de62e9 | |||
| fcc4b371b9 | |||
| 837174582b | |||
| 6b0d34a21d | |||
| 01a30faa62 | |||
| 070faf12da | |||
| 65d3883f03 | |||
| 2c2c1af97f | |||
| d7949b5405 | |||
| f8624ae768 | |||
| 98d272a903 | |||
| 00c40e279c | |||
| 7835259a83 | |||
| 93aa265b20 | |||
| 8e44e6b23c | |||
| 437018e614 | |||
| 75c3388c00 | |||
| 31dd5b852e | |||
| 6649f0d4c2 | |||
| 604c583c36 | |||
| b2a2652b56 | |||
| af692605ab | |||
| d1a282e228 | |||
| 88bddfb141 | |||
| 29c3e2d54b | |||
| 27ed23c1b9 | |||
| 783b910700 | |||
| dba43c4e9f | |||
| eaba489ba2 | |||
| 40c7fe3f77 | |||
| a6d5fb318a | |||
| d20cbf434f | |||
| 45211fa61c | |||
| f8feccc27d | |||
| 0dc9d3a59a | |||
| 7bbf089e9f | |||
| 8d7d2431df | |||
| 09720ee758 | |||
| ee1b7bad56 | |||
| c7547b3a46 | |||
| d2888d0007 | |||
| efa5d05f5f | |||
| 153cfad507 | |||
| d7224670c5 | |||
| 31bab88a5b | |||
| 1e383fde5c | |||
| f5b9a95522 | |||
| 199683897a | |||
| be319c446d | |||
| cc8e78b505 | |||
| b38ccb0fbd | |||
| 953f8da84d | |||
| cd8a27ca26 | |||
| c5568c8eae | |||
| 8dc5b11f51 | |||
| e4936547e3 | |||
| 429b71b63f | |||
| 969367dc3e | |||
| e242dbf89f | |||
| ce6c360d29 | |||
| 07fb8e034f | |||
| 16cd75d179 | |||
| 4665e8fbdb | |||
| f25064fae8 | |||
| 5e77925492 | |||
| 7798a7f6d5 | |||
| 41b938b3cd | |||
| 4d2d801bf4 | |||
| cea1a67749 | |||
| aa7711dc31 | |||
| 585c752d72 | |||
| 3a314d97eb | |||
| 0e6ead938e | |||
| 93c35a19f5 | |||
| a36a54adcd | |||
| 4c0c7cc394 | |||
| 4a79df860d |
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||||
* text=auto
|
* text=auto eol=lf
|
||||||
|
|
||||||
# Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
|
# Explicitly declare text files you want to always be normalized and converted to native line endings on checkout.
|
||||||
*.c text diff=cpp
|
*.c text diff=cpp
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
name: Install Vulkan SDK
|
||||||
|
description: Downloads and installs Vulkan SDK.
|
||||||
|
inputs:
|
||||||
|
vulkan-version:
|
||||||
|
description: 'Vulkan SDK release version (e.g. 1.2.198.1).'
|
||||||
|
default: '1.2.198.1'
|
||||||
|
required: false
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Install Vulkan SDK
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
export VULKAN_SDK_VER=${{ inputs.vulkan-version }}
|
||||||
|
echo VULKAN_SDK_VER=$VULKAN_SDK_VER >> $GITHUB_ENV
|
||||||
|
echo "Downloading Vulkan SDK version $VULKAN_SDK_VER"
|
||||||
|
case `uname -s` in
|
||||||
|
Linux)
|
||||||
|
export VULKAN_SDK_ROOT=`pwd`/../VulkanSDK
|
||||||
|
wget "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VER/linux/vulkan-sdk.tar.gz" --no-verbose -O vulkan-sdk.tar.gz
|
||||||
|
mkdir $VULKAN_SDK_ROOT
|
||||||
|
tar -xf vulkan-sdk.tar.gz -C $VULKAN_SDK_ROOT
|
||||||
|
export VULKAN_SDK=$VULKAN_SDK_ROOT/$VULKAN_SDK_VER/x86_64
|
||||||
|
;;
|
||||||
|
Darwin)
|
||||||
|
export VULKAN_SDK_ROOT=`pwd`/../VulkanSDK
|
||||||
|
curl -LO "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VER/mac/vulkan-sdk.dmg"
|
||||||
|
hdiutil attach vulkan-sdk.dmg -mountpoint /Volumes/vulkan-sdk
|
||||||
|
sudo "/Volumes/vulkan-sdk/InstallVulkan.app/Contents/MacOS/InstallVulkan" --root $VULKAN_SDK_ROOT --accept-licenses --default-answer --confirm-command install
|
||||||
|
export VULKAN_SDK=$VULKAN_SDK_ROOT/macOS
|
||||||
|
;;
|
||||||
|
*) # Windows
|
||||||
|
curl -L -o vulkan-sdk.exe https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VER/windows/VulkanSDK-$VULKAN_SDK_VER-Installer.exe
|
||||||
|
./vulkan-sdk.exe --root "C:\VulkanSDK" --accept-licenses --default-answer --confirm-command install
|
||||||
|
export VULKAN_SDK="C:\VulkanSDK"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo VULKAN_SDK=$VULKAN_SDK >> $GITHUB_ENV
|
||||||
|
echo "Vulkan SDK installed to $VULKAN_SDK"
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: Build Android
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Game
|
||||||
|
game-windows:
|
||||||
|
name: Game (Android, Release ARM64)
|
||||||
|
runs-on: "windows-2022"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Setup .NET Workload
|
||||||
|
run: |
|
||||||
|
dotnet workload install android
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=ARM64 -platform=Android -configuration=Release -buildtargets=FlaxGame
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
name: Build iOS
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Game
|
||||||
|
game-windows:
|
||||||
|
name: Game (iOS, Release ARM64)
|
||||||
|
runs-on: "macos-latest"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Setup .NET Workload
|
||||||
|
run: |
|
||||||
|
dotnet workload install ios
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Mac/CallBuildTool.sh -build -log -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
name: Build Linux
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
# Game
|
|
||||||
game-linux:
|
|
||||||
name: Game (Linux, Release x64)
|
|
||||||
runs-on: "ubuntu-20.04"
|
|
||||||
steps:
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
- name: Checkout LFS
|
|
||||||
run: |
|
|
||||||
git lfs version
|
|
||||||
git lfs pull
|
|
||||||
- name: Build
|
|
||||||
run: |
|
|
||||||
./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Release -buildtargets=FlaxGame
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
name: Build Linux
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Editor
|
||||||
|
editor-linux:
|
||||||
|
name: Editor (Linux, Development x64)
|
||||||
|
runs-on: "ubuntu-20.04"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo rm -f /etc/apt/sources.list.d/*
|
||||||
|
sudo cp -f .github/workflows/build_linux_sources.list /etc/apt/sources.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Linux/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxEditor
|
||||||
|
|
||||||
|
# Game
|
||||||
|
game-linux:
|
||||||
|
name: Game (Linux, Release x64)
|
||||||
|
runs-on: "ubuntu-20.04"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Linux/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Linux -configuration=Release -buildtargets=FlaxGame
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
|
||||||
|
deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
name: Build macOS
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Editor
|
||||||
|
editor-mac:
|
||||||
|
name: Editor (Mac, Development x64)
|
||||||
|
runs-on: "macos-latest"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Mac/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Mac -configuration=Development -buildtargets=FlaxEditor
|
||||||
|
|
||||||
|
# Game
|
||||||
|
game-mac:
|
||||||
|
name: Game (Mac, Release x64)
|
||||||
|
runs-on: "macos-latest"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Mac/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Mac -configuration=Release -buildtargets=FlaxGame
|
||||||
@@ -1,34 +1,58 @@
|
|||||||
name: Build Windows
|
name: Build Windows
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
# Editor
|
# Editor
|
||||||
editor-windows:
|
editor-windows:
|
||||||
name: Editor (Windows, Development x64)
|
name: Editor (Windows, Development x64)
|
||||||
runs-on: "windows-latest"
|
runs-on: "windows-2022"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
- name: Checkout LFS
|
- name: Checkout LFS
|
||||||
run: |
|
run: |
|
||||||
git lfs version
|
git lfs version
|
||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor
|
||||||
|
|
||||||
# Game
|
# Game
|
||||||
game-windows:
|
game-windows:
|
||||||
name: Game (Windows, Release x64)
|
name: Game (Windows, Release x64)
|
||||||
runs-on: "windows-latest"
|
runs-on: "windows-2022"
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repo
|
- name: Checkout repo
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
- name: Checkout LFS
|
- name: Checkout LFS
|
||||||
run: |
|
run: |
|
||||||
git lfs version
|
git lfs version
|
||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame
|
||||||
|
|||||||
@@ -0,0 +1,202 @@
|
|||||||
|
name: Continuous Deployment
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '15 4 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
package-windows-editor:
|
||||||
|
name: Editor (Windows)
|
||||||
|
runs-on: "windows-2022"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
.\PackageEditor.bat -arch=x64 -platform=Windows -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Windows-Editor
|
||||||
|
path: Output/Editor.zip
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Windows-EditorDebugSymbols
|
||||||
|
path: Output/EditorDebugSymbols.zip
|
||||||
|
package-windows-game:
|
||||||
|
name: Game (Windows)
|
||||||
|
runs-on: "windows-2022"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
.\PackagePlatforms.bat -arch=x64 -platform=Windows -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Windows-Game
|
||||||
|
path: Output/Windows.zip
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
package-linux-editor:
|
||||||
|
name: Editor (Linux)
|
||||||
|
runs-on: "ubuntu-20.04"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo rm -f /etc/apt/sources.list.d/*
|
||||||
|
sudo cp -f .github/workflows/build_linux_sources.list /etc/apt/sources.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./PackageEditor.sh -arch=x64 -platform=Linux -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Linux-Editor
|
||||||
|
path: Output/FlaxEditorLinux.zip
|
||||||
|
package-linux-game:
|
||||||
|
name: Game (Linux)
|
||||||
|
runs-on: "ubuntu-20.04"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo rm -f /etc/apt/sources.list.d/*
|
||||||
|
sudo cp -f .github/workflows/build_linux_sources.list /etc/apt/sources.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./PackagePlatforms.sh -arch=x64 -platform=Linux -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Linux-Game
|
||||||
|
path: Output/Linux.zip
|
||||||
|
|
||||||
|
# Mac
|
||||||
|
package-mac-editor:
|
||||||
|
name: Editor (Mac)
|
||||||
|
runs-on: "macos-latest"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./PackageEditor.command -arch=x64 -platform=Mac -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Mac-Editor
|
||||||
|
path: Output/FlaxEditorMac.zip
|
||||||
|
package-mac-game:
|
||||||
|
name: Game (Mac)
|
||||||
|
runs-on: "macos-latest"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Setup Vulkan
|
||||||
|
uses: ./.github/actions/vulkan
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./PackagePlatforms.command -arch=x64 -platform=Mac -deployOutput=Output
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: Mac-Game
|
||||||
|
path: Output/Mac.zip
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
name: Tests
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOTNET_NOLOGO: true
|
||||||
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# Tests on Linux
|
||||||
|
tests-linux:
|
||||||
|
name: Tests (Linux)
|
||||||
|
runs-on: "ubuntu-20.04"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo rm -f /etc/apt/sources.list.d/*
|
||||||
|
sudo cp -f .github/workflows/build_linux_sources.list /etc/apt/sources.list
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs
|
||||||
|
./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget
|
||||||
|
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
|
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
|
- name: Test
|
||||||
|
run: |
|
||||||
|
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests
|
||||||
|
dotnet test -f net7.0 Binaries/Tests/Flax.Build.Tests.dll
|
||||||
|
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests
|
||||||
|
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests
|
||||||
|
cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests
|
||||||
|
dotnet test -f net7.0 Binaries/Tests/FlaxEngine.CSharp.dll
|
||||||
|
- name: Test UseLargeWorlds
|
||||||
|
run: |
|
||||||
|
./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true
|
||||||
|
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests
|
||||||
|
|
||||||
|
# Tests on Windows
|
||||||
|
tests-windows:
|
||||||
|
name: Tests (Windows)
|
||||||
|
runs-on: "windows-2022"
|
||||||
|
steps:
|
||||||
|
- name: Checkout repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v3
|
||||||
|
with:
|
||||||
|
dotnet-version: 7.0.x
|
||||||
|
- name: Print .NET info
|
||||||
|
run: |
|
||||||
|
dotnet --info
|
||||||
|
dotnet workload --info
|
||||||
|
- name: Checkout LFS
|
||||||
|
run: |
|
||||||
|
git lfs version
|
||||||
|
git lfs pull
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
.\GenerateProjectFiles.bat -vs2022 -log -verbose -printSDKs
|
||||||
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxTestsTarget
|
||||||
|
dotnet msbuild Source\Tools\Flax.Build.Tests\Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
|
- name: Test
|
||||||
|
run: |
|
||||||
|
.\Binaries\Editor\Win64\Development\FlaxTests.exe
|
||||||
|
dotnet test -f net7.0 Binaries\Tests\Flax.Build.Tests.dll
|
||||||
|
xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests
|
||||||
|
xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.runtimeconfig.json Binaries\Tests
|
||||||
|
xcopy /y Binaries\Editor\Win64\Development\Newtonsoft.Json.dll Binaries\Tests
|
||||||
|
dotnet test -f net7.0 Binaries\Tests\FlaxEngine.CSharp.dll
|
||||||
+11
-40
@@ -5,9 +5,15 @@
|
|||||||
obj/
|
obj/
|
||||||
Cache/
|
Cache/
|
||||||
Binaries/
|
Binaries/
|
||||||
|
Output/
|
||||||
Logs/
|
Logs/
|
||||||
|
Source/*.Gen.*
|
||||||
Source/*.csproj
|
Source/*.csproj
|
||||||
|
/Package_*/
|
||||||
!Source/Engine/Debug
|
!Source/Engine/Debug
|
||||||
|
/Source/Platforms/Editor/Linux/Mono/etc/mono/registry
|
||||||
|
PackageEditor_Cert.bat
|
||||||
|
PackagePlatforms_Cert.bat
|
||||||
|
|
||||||
# User-specific files
|
# User-specific files
|
||||||
*.suo
|
*.suo
|
||||||
@@ -17,16 +23,14 @@ Source/*.csproj
|
|||||||
*.tlog
|
*.tlog
|
||||||
*.lastbuilddate
|
*.lastbuilddate
|
||||||
*.opendb
|
*.opendb
|
||||||
|
*.DS_Store
|
||||||
|
*.xcodeproj
|
||||||
|
launchSettings.json
|
||||||
|
|
||||||
# NUNIT
|
# NUNIT
|
||||||
*.VisualState.xml
|
*.VisualState.xml
|
||||||
TestResult.xml
|
TestResult.xml
|
||||||
|
|
||||||
# Build Results of an ATL Project
|
|
||||||
[Dd]ebugPS/
|
|
||||||
[Rr]eleasePS/
|
|
||||||
dlldata.c
|
|
||||||
|
|
||||||
# NuGet Packages Directory
|
# NuGet Packages Directory
|
||||||
packages/**/*
|
packages/**/*
|
||||||
!packages/repositories.config
|
!packages/repositories.config
|
||||||
@@ -56,9 +60,6 @@ packages/**/*
|
|||||||
*.svclog
|
*.svclog
|
||||||
*.scc
|
*.scc
|
||||||
|
|
||||||
# Chutzpah Test files
|
|
||||||
_Chutzpah*
|
|
||||||
|
|
||||||
# Visual C++ cache files
|
# Visual C++ cache files
|
||||||
ipch/
|
ipch/
|
||||||
*.aps
|
*.aps
|
||||||
@@ -72,12 +73,6 @@ ipch/
|
|||||||
*.vsp
|
*.vsp
|
||||||
*.vspx
|
*.vspx
|
||||||
|
|
||||||
# TFS 2012 Local Workspace
|
|
||||||
$tf/
|
|
||||||
|
|
||||||
# Guidance Automation Toolkit
|
|
||||||
*.gpState
|
|
||||||
|
|
||||||
# ReSharper is a .NET coding add-in
|
# ReSharper is a .NET coding add-in
|
||||||
_ReSharper*/
|
_ReSharper*/
|
||||||
*.[Rr]e[Ss]harper
|
*.[Rr]e[Ss]harper
|
||||||
@@ -100,9 +95,6 @@ _NCrunch_*
|
|||||||
*.mm.*
|
*.mm.*
|
||||||
AutoTest.Net/
|
AutoTest.Net/
|
||||||
|
|
||||||
# Web workbench (sass)
|
|
||||||
.sass-cache/
|
|
||||||
|
|
||||||
# Installshield output folder
|
# Installshield output folder
|
||||||
[Ee]xpress/
|
[Ee]xpress/
|
||||||
|
|
||||||
@@ -149,32 +141,9 @@ ClientBin/
|
|||||||
*.publishsettings
|
*.publishsettings
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
# RIA/Silverlight projects
|
|
||||||
Generated_Code/
|
|
||||||
|
|
||||||
# Backup & report files from converting an old project files
|
|
||||||
_UpgradeReport_Files/
|
|
||||||
Backup*/
|
|
||||||
UpgradeLog*.XML
|
|
||||||
UpgradeLog*.htm
|
|
||||||
|
|
||||||
# SQL Server files
|
|
||||||
*.mdf
|
|
||||||
*.ldf
|
|
||||||
|
|
||||||
# Business Intelligence projects
|
|
||||||
*.rdl.data
|
|
||||||
*.bim.layout
|
|
||||||
*.bim_*.settings
|
|
||||||
|
|
||||||
# Microsoft Fakes
|
# Microsoft Fakes
|
||||||
FakesAssemblies/
|
FakesAssemblies/
|
||||||
|
|
||||||
# LightSwitch generated files
|
|
||||||
GeneratedArtifacts/
|
|
||||||
_Pvt_Extensions/
|
|
||||||
ModelManifest.xml
|
|
||||||
|
|
||||||
# IDE files
|
# IDE files
|
||||||
*.VC.db
|
*.VC.db
|
||||||
enc_temp_folder/
|
enc_temp_folder/
|
||||||
@@ -184,4 +153,6 @@ bin/
|
|||||||
obj/
|
obj/
|
||||||
*.vcxproj.filters
|
*.vcxproj.filters
|
||||||
.vscode/
|
.vscode/
|
||||||
|
.idea/
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
|
omnisharp.json
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ Instances of abusive, harassing, or otherwise unacceptable behavior may be repor
|
|||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
Using Flax source code is strictly governed by the Flax Engine End User License Agreement. If you don't agree to those terms, as amended from time to time, you are not permitted to access or use Flax Engine.
|
||||||
|
|
||||||
|
We welcome any contributions to Flax Engine development through pull requests on GitHub. Most of our active development is in the master branch, so we prefer to take pull requests there (particularly for new features). We try to make sure that all new code adheres to the Flax coding standards. All contributions are governed by the terms of the [EULA](https://flaxengine.com/licensing/).
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
|
|||||||
@@ -32,3 +32,19 @@ Go check out our [Trello](https://trello.com/b/NQjLXRCP/flax-roadmap).
|
|||||||
|
|
||||||
|
|
||||||
Thank you for taking interest in contributing to Flax!
|
Thank you for taking interest in contributing to Flax!
|
||||||
|
|
||||||
|
## **Common issues**
|
||||||
|
|
||||||
|
Below are some common issues that someone working with the FlaxEngine source code might run into. Hopefully some of those issues will get fixed in the future. If you know how, please contribute!
|
||||||
|
|
||||||
|
* Missing MSVC toolset
|
||||||
|
* Install it through the Visual Studio Installer
|
||||||
|
* Building or attaching fails
|
||||||
|
* Run `GenerateProjectFiles.bat`
|
||||||
|
* Rebuild `Flax.Build`
|
||||||
|
* Make sure that there isn't a stray FlaxEngine process running in the background
|
||||||
|
* First start Flax and then attach the C# debugger
|
||||||
|
* Configure the C# FlaxEngine project by going into the project properties, then the debug tab and selecting "Start external program" `Flax\FlaxEngine\Binaries\Editor\Win64\Debug\FlaxEditor.exe`
|
||||||
|
* Then you can also set command line arguments such as `-project "C:\Users\PROFILE\Documents\Flax Projects\FlaxSamples\BasicTemplate"`
|
||||||
|
* Git LFS
|
||||||
|
* Push with `git push --no-verify`
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -2,6 +2,7 @@
|
|||||||
// Version: @0
|
// Version: @0
|
||||||
|
|
||||||
#define MATERIAL 1
|
#define MATERIAL 1
|
||||||
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
@3
|
@3
|
||||||
|
|
||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
@@ -10,17 +11,9 @@
|
|||||||
@7
|
@7
|
||||||
// Primary constant buffer (with additional material parameters)
|
// Primary constant buffer (with additional material parameters)
|
||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
float4x4 ViewProjectionMatrix;
|
|
||||||
float4x4 WorldMatrix;
|
float4x4 WorldMatrix;
|
||||||
float4x4 ViewMatrix;
|
|
||||||
float4x4 InvWorld;
|
float4x4 InvWorld;
|
||||||
float4x4 SVPositionToWorld;
|
float4x4 SVPositionToWorld;
|
||||||
float3 ViewPos;
|
|
||||||
float ViewFar;
|
|
||||||
float3 ViewDir;
|
|
||||||
float TimeParam;
|
|
||||||
float4 ViewInfo;
|
|
||||||
float4 ScreenSize;
|
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Use depth buffer for per-pixel decal layering
|
// Use depth buffer for per-pixel decal layering
|
||||||
@@ -108,15 +101,14 @@ float4 GetVertexColor(MaterialInput input)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
// Get material properties function (for pixel shader)
|
// Get material properties function (for pixel shader)
|
||||||
Material GetMaterialPS(MaterialInput input)
|
Material GetMaterialPS(MaterialInput input)
|
||||||
{
|
{
|
||||||
@4
|
@4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix line for errors/warnings for shader code from template
|
|
||||||
#line 1000
|
|
||||||
|
|
||||||
// Input macro specified by the material: DECAL_BLEND_MODE
|
// Input macro specified by the material: DECAL_BLEND_MODE
|
||||||
|
|
||||||
#define DECAL_BLEND_MODE_TRANSLUCENT 0
|
#define DECAL_BLEND_MODE_TRANSLUCENT 0
|
||||||
@@ -195,19 +187,21 @@ void PS_Decal(
|
|||||||
Out2 = float4(material.Emissive, material.Opacity);
|
Out2 = float4(material.Emissive, material.Opacity);
|
||||||
#if USE_NORMAL
|
#if USE_NORMAL
|
||||||
// GBuffer1
|
// GBuffer1
|
||||||
Out3 = float4(material.WorldNormal * 0.5f + 0.5f, 1);
|
Out3 = float4(material.WorldNormal * 0.5f + 0.5f, material.Opacity);
|
||||||
#endif
|
#endif
|
||||||
#elif USE_NORMAL
|
#elif USE_NORMAL
|
||||||
// GBuffer1
|
// GBuffer1
|
||||||
Out2 = float4(material.WorldNormal * 0.5f + 0.5f, 1);
|
Out2 = float4(material.WorldNormal * 0.5f + 0.5f, material.Opacity);
|
||||||
#endif
|
#endif
|
||||||
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_STAIN
|
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_STAIN
|
||||||
Out0 = float4(material.Color, material.Opacity);
|
Out0 = float4(material.Color, material.Opacity);
|
||||||
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_NORMAL
|
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_NORMAL
|
||||||
Out0 = float4(material.WorldNormal * 0.5f + 0.5f, 1);
|
Out0 = float4(material.WorldNormal * 0.5f + 0.5f, material.Opacity);
|
||||||
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_EMISSIVE
|
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_EMISSIVE
|
||||||
Out0 = float4(material.Emissive * material.Opacity, material.Opacity);
|
Out0 = float4(material.Emissive * material.Opacity, material.Opacity);
|
||||||
#else
|
#else
|
||||||
#error "Invalid decal blending mode"
|
#error "Invalid decal blending mode"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@9
|
||||||
|
|||||||
@@ -0,0 +1,383 @@
|
|||||||
|
// File generated by Flax Materials Editor
|
||||||
|
// Version: @0
|
||||||
|
|
||||||
|
#define MATERIAL 1
|
||||||
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
|
@3
|
||||||
|
#include "./Flax/Common.hlsl"
|
||||||
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
|
@7
|
||||||
|
// Primary constant buffer (with additional material parameters)
|
||||||
|
META_CB_BEGIN(0, Data)
|
||||||
|
float4x4 WorldMatrix;
|
||||||
|
float4x4 LocalMatrix;
|
||||||
|
float3 Dummy0;
|
||||||
|
float WorldDeterminantSign;
|
||||||
|
float MeshMinZ;
|
||||||
|
float Segment;
|
||||||
|
float ChunksPerSegment;
|
||||||
|
float PerInstanceRandom;
|
||||||
|
float3 GeometrySize;
|
||||||
|
float MeshMaxZ;
|
||||||
|
@1META_CB_END
|
||||||
|
|
||||||
|
// Shader resources
|
||||||
|
@2
|
||||||
|
// The spline deformation buffer (stored as 4x3, 3 float4 behind each other)
|
||||||
|
Buffer<float4> SplineDeformation : register(t0);
|
||||||
|
|
||||||
|
// Geometry data passed though the graphics rendering stages up to the pixel shader
|
||||||
|
struct GeometryData
|
||||||
|
{
|
||||||
|
float3 WorldPosition : TEXCOORD0;
|
||||||
|
float2 TexCoord : TEXCOORD1;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
half4 VertexColor : COLOR;
|
||||||
|
#endif
|
||||||
|
float3 WorldNormal : TEXCOORD2;
|
||||||
|
float4 WorldTangent : TEXCOORD3;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Interpolants passed from the vertex shader
|
||||||
|
struct VertexOutput
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
|
#endif
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
float TessellationMultiplier : TESS;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// Interpolants passed to the pixel shader
|
||||||
|
struct PixelInput
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
|
#endif
|
||||||
|
bool IsFrontFace : SV_IsFrontFace;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Material properties generation input
|
||||||
|
struct MaterialInput
|
||||||
|
{
|
||||||
|
float3 WorldPosition;
|
||||||
|
float TwoSidedSign;
|
||||||
|
float2 TexCoord;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
half4 VertexColor;
|
||||||
|
#endif
|
||||||
|
float3x3 TBN;
|
||||||
|
float4 SvPosition;
|
||||||
|
float3 PreSkinnedPosition;
|
||||||
|
float3 PreSkinnedNormal;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// Extracts geometry data to the material input
|
||||||
|
MaterialInput GetGeometryMaterialInput(GeometryData geometry)
|
||||||
|
{
|
||||||
|
MaterialInput output = (MaterialInput)0;
|
||||||
|
output.WorldPosition = geometry.WorldPosition;
|
||||||
|
output.TexCoord = geometry.TexCoord;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.VertexColor = geometry.VertexColor;
|
||||||
|
#endif
|
||||||
|
output.TBN = CalcTangentBasis(geometry.WorldNormal, geometry.WorldTangent);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
|
||||||
|
// Interpolates the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define InterpolateGeometryPositions(output, p0, w0, p1, w1, p2, w2, offset) output.WorldPosition = p0.WorldPosition * w0 + p1.WorldPosition * w1 + p2.WorldPosition * w2 + offset
|
||||||
|
|
||||||
|
// Offsets the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define OffsetGeometryPositions(geometry, offset) geometry.WorldPosition += offset
|
||||||
|
|
||||||
|
// Applies the Phong tessallation to the geometry positions (used by the tessallation when doing Phong tess)
|
||||||
|
#define ApplyGeometryPositionsPhongTess(geometry, p0, p1, p2, U, V, W) \
|
||||||
|
float3 posProjectedU = TessalationProjectOntoPlane(p0.WorldNormal, p0.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedV = TessalationProjectOntoPlane(p1.WorldNormal, p1.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedW = TessalationProjectOntoPlane(p2.WorldNormal, p2.WorldPosition, geometry.WorldPosition); \
|
||||||
|
geometry.WorldPosition = U * posProjectedU + V * posProjectedV + W * posProjectedW
|
||||||
|
|
||||||
|
// Interpolates the geometry data except positions (used by the tessallation when generating vertices)
|
||||||
|
GeometryData InterpolateGeometry(GeometryData p0, float w0, GeometryData p1, float w1, GeometryData p2, float w2)
|
||||||
|
{
|
||||||
|
GeometryData output = (GeometryData)0;
|
||||||
|
output.TexCoord = p0.TexCoord * w0 + p1.TexCoord * w1 + p2.TexCoord * w2;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.VertexColor = p0.VertexColor * w0 + p1.VertexColor * w1 + p2.VertexColor * w2;
|
||||||
|
#endif
|
||||||
|
output.WorldNormal = p0.WorldNormal * w0 + p1.WorldNormal * w1 + p2.WorldNormal * w2;
|
||||||
|
output.WorldNormal = normalize(output.WorldNormal);
|
||||||
|
output.WorldTangent = p0.WorldTangent * w0 + p1.WorldTangent * w1 + p2.WorldTangent * w2;
|
||||||
|
output.WorldTangent.xyz = normalize(output.WorldTangent.xyz);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MaterialInput GetMaterialInput(PixelInput input)
|
||||||
|
{
|
||||||
|
MaterialInput output = GetGeometryMaterialInput(input.Geometry);
|
||||||
|
output.TwoSidedSign = WorldDeterminantSign * (input.IsFrontFace ? 1.0 : -1.0);
|
||||||
|
output.SvPosition = input.Position;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = input.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Removes the scale vector from the local to world transformation matrix
|
||||||
|
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||||
|
{
|
||||||
|
// Extract per axis scales from localToWorld transform
|
||||||
|
float scaleX = length(localToWorld[0]);
|
||||||
|
float scaleY = length(localToWorld[1]);
|
||||||
|
float scaleZ = length(localToWorld[2]);
|
||||||
|
float3 invScale = float3(
|
||||||
|
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
|
||||||
|
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
|
||||||
|
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);
|
||||||
|
localToWorld[0] *= invScale.x;
|
||||||
|
localToWorld[1] *= invScale.y;
|
||||||
|
localToWorld[2] *= invScale.z;
|
||||||
|
return localToWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from tangent space to world space
|
||||||
|
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
||||||
|
{
|
||||||
|
return mul(tangentVector, input.TBN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to tangent space
|
||||||
|
float3 TransformWorldVectorToTangent(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(input.TBN, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to view space
|
||||||
|
float3 TransformWorldVectorToView(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(worldVector, (float3x3)ViewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from view space to world space
|
||||||
|
float3 TransformViewVectorToWorld(MaterialInput input, float3 viewVector)
|
||||||
|
{
|
||||||
|
return mul((float3x3)ViewMatrix, viewVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformLocalVectorToWorld(MaterialInput input, float3 localVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)WorldMatrix;
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localVector, localToWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformWorldVectorToLocal(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)WorldMatrix;
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localToWorld, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object position
|
||||||
|
float3 GetObjectPosition(MaterialInput input)
|
||||||
|
{
|
||||||
|
return WorldMatrix[3].xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object size
|
||||||
|
float3 GetObjectSize(MaterialInput input)
|
||||||
|
{
|
||||||
|
float4x4 world = WorldMatrix;
|
||||||
|
return GeometrySize * float3(world._m00, world._m11, world._m22);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object random value
|
||||||
|
float GetPerInstanceRandom(MaterialInput input)
|
||||||
|
{
|
||||||
|
return PerInstanceRandom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object LOD transition dither factor
|
||||||
|
float GetLODDitherFactor(MaterialInput input)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the interpolated vertex color (in linear space)
|
||||||
|
float4 GetVertexColor(MaterialInput input)
|
||||||
|
{
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
return input.VertexColor;
|
||||||
|
#else
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 SampleLightmap(Material material, MaterialInput materialInput)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
|
// Get material properties function (for vertex shader)
|
||||||
|
Material GetMaterialVS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@5
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for domain shader)
|
||||||
|
Material GetMaterialDS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@6
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for pixel shader)
|
||||||
|
Material GetMaterialPS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@4
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculates the transform matrix from mesh tangent space to local space
|
||||||
|
float3x3 CalcTangentToLocal(ModelInput input)
|
||||||
|
{
|
||||||
|
float bitangentSign = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
float3 normal = input.Normal.xyz * 2.0 - 1.0;
|
||||||
|
float3 tangent = input.Tangent.xyz * 2.0 - 1.0;
|
||||||
|
float3 bitangent = cross(normal, tangent) * bitangentSign;
|
||||||
|
return float3x3(tangent, bitangent, normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertex Shader function for GBuffer Pass and Depth Pass (with full vertex data)
|
||||||
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
|
META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 0, R16G16_FLOAT, 1, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(NORMAL, 0, R10G10B10A2_UNORM, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TANGENT, 0, R10G10B10A2_UNORM, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 1, R16G16_FLOAT, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(COLOR, 0, R8G8B8A8_UNORM, 2, 0, PER_VERTEX, 0, USE_VERTEX_COLOR)
|
||||||
|
VertexOutput VS_SplineModel(ModelInput input)
|
||||||
|
{
|
||||||
|
VertexOutput output;
|
||||||
|
|
||||||
|
// Apply local transformation of the geometry before deformation
|
||||||
|
float3 position = mul(float4(input.Position, 1), LocalMatrix).xyz;
|
||||||
|
float4x4 world = LocalMatrix;
|
||||||
|
|
||||||
|
// Apply spline curve deformation
|
||||||
|
float splineAlpha = saturate((position.z - MeshMinZ) / (MeshMaxZ - MeshMinZ));
|
||||||
|
int splineIndex = (int)((Segment + splineAlpha) * ChunksPerSegment);
|
||||||
|
position.z = splineAlpha;
|
||||||
|
float3x4 splineMatrix = float3x4(SplineDeformation[splineIndex * 3], SplineDeformation[splineIndex * 3 + 1], SplineDeformation[splineIndex * 3 + 2]);
|
||||||
|
position = mul(splineMatrix, float4(position, 1));
|
||||||
|
float4x3 splineMatrixT = transpose(splineMatrix);
|
||||||
|
world = mul(world, float4x4(float4(splineMatrixT[0], 0), float4(splineMatrixT[1], 0), float4(splineMatrixT[2], 0), float4(splineMatrixT[3], 1)));
|
||||||
|
|
||||||
|
// Compute world space vertex position
|
||||||
|
output.Geometry.WorldPosition = mul(float4(position, 1), WorldMatrix).xyz;
|
||||||
|
world = mul(world, WorldMatrix);
|
||||||
|
|
||||||
|
// Compute clip space position
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
|
// Pass vertex attributes
|
||||||
|
output.Geometry.TexCoord = input.TexCoord;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.Geometry.VertexColor = input.Color;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate tanget space to world space transformation matrix for unit vectors
|
||||||
|
float3x3 tangentToLocal = CalcTangentToLocal(input);
|
||||||
|
float3x3 localToWorld = RemoveScaleFromLocalToWorld((float3x3)world);
|
||||||
|
float3x3 tangentToWorld = mul(tangentToLocal, localToWorld);
|
||||||
|
output.Geometry.WorldNormal = tangentToWorld[2];
|
||||||
|
output.Geometry.WorldTangent.xyz = tangentToWorld[0];
|
||||||
|
output.Geometry.WorldTangent.w = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
|
||||||
|
// Get material input params if need to evaluate any material property
|
||||||
|
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
MaterialInput materialInput = GetGeometryMaterialInput(output.Geometry);
|
||||||
|
materialInput.TwoSidedSign = WorldDeterminantSign;
|
||||||
|
materialInput.SvPosition = output.Position;
|
||||||
|
materialInput.PreSkinnedPosition = input.Position.xyz;
|
||||||
|
materialInput.PreSkinnedNormal = tangentToLocal[2].xyz;
|
||||||
|
Material material = GetMaterialVS(materialInput);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Apply world position offset per-vertex
|
||||||
|
#if USE_POSITION_OFFSET
|
||||||
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get tessalation multiplier (per vertex)
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
output.TessellationMultiplier = material.TessellationMultiplier;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Copy interpolants for other shader stages
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = material.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
|
||||||
|
void ClipLODTransition(PixelInput input)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Pixel Shader function for Depth Pass
|
||||||
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
|
void PS_Depth(PixelInput input)
|
||||||
|
{
|
||||||
|
#if MATERIAL_MASKED || MATERIAL_BLEND != MATERIAL_BLEND_OPAQUE
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Perform per pixel clipping
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
#if MATERIAL_BLEND != MATERIAL_BLEND_OPAQUE
|
||||||
|
clip(material.Opacity - MATERIAL_OPACITY_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if _PS_QuadOverdraw
|
||||||
|
|
||||||
|
#include "./Flax/Editor/QuadOverdraw.hlsl"
|
||||||
|
|
||||||
|
// Pixel Shader function for Quad Overdraw Pass (editor-only)
|
||||||
|
[earlydepthstencil]
|
||||||
|
META_PS(USE_EDITOR, FEATURE_LEVEL_SM5)
|
||||||
|
void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID)
|
||||||
|
{
|
||||||
|
DoQuadOverdraw(svPos, primId);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@9
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Deferred Shading: Defines
|
||||||
|
@1// Deferred Shading: Includes
|
||||||
|
@2// Deferred Shading: Constants
|
||||||
|
@3// Deferred Shading: Resources
|
||||||
|
@4// Deferred Shading: Utilities
|
||||||
|
@5// Deferred Shading: Shaders
|
||||||
|
|
||||||
|
// Pixel Shader function for GBuffer Pass
|
||||||
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
|
META_PERMUTATION_1(USE_LIGHTMAP=0)
|
||||||
|
META_PERMUTATION_1(USE_LIGHTMAP=1)
|
||||||
|
void PS_GBuffer(
|
||||||
|
in PixelInput input
|
||||||
|
,out float4 Light : SV_Target0
|
||||||
|
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
||||||
|
// GBuffer
|
||||||
|
,out float4 RT0 : SV_Target1
|
||||||
|
,out float4 RT1 : SV_Target2
|
||||||
|
,out float4 RT2 : SV_Target3
|
||||||
|
#if USE_GBUFFER_CUSTOM_DATA
|
||||||
|
,out float4 RT3 : SV_Target4
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Light = float4(0, 0, 0, 1);
|
||||||
|
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
// LOD masking
|
||||||
|
ClipLODTransition(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Masking
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
float3 diffuseColor = GetDiffuseColor(material.Color, material.Metalness);
|
||||||
|
float3 specularColor = GetSpecularColor(material.Color, material.Specular, material.Metalness);
|
||||||
|
|
||||||
|
// Sample lightmap
|
||||||
|
float3 diffuseIndirectLighting = SampleLightmap(material, materialInput);
|
||||||
|
|
||||||
|
// Apply static indirect light
|
||||||
|
Light.rgb = diffuseColor * diffuseIndirectLighting * AOMultiBounce(material.AO, diffuseColor);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
||||||
|
|
||||||
|
// Pack material properties to GBuffer
|
||||||
|
RT0 = float4(material.Color, material.AO);
|
||||||
|
RT1 = float4(material.WorldNormal * 0.5 + 0.5, MATERIAL_SHADING_MODEL * (1.0 / 3.0));
|
||||||
|
RT2 = float4(material.Roughness, material.Metalness, material.Specular, 0);
|
||||||
|
|
||||||
|
// Custom data
|
||||||
|
#if USE_GBUFFER_CUSTOM_DATA
|
||||||
|
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
||||||
|
RT3 = float4(material.SubsurfaceColor, material.Opacity);
|
||||||
|
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
||||||
|
RT3 = float4(material.SubsurfaceColor, material.Opacity);
|
||||||
|
#else
|
||||||
|
RT3 = float4(0, 0, 0, 0);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Add light emission
|
||||||
|
#if USE_EMISSIVE
|
||||||
|
Light.rgb += material.Emissive;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
// Handle blending as faked forward pass (use Light buffer and skip GBuffer modification)
|
||||||
|
Light = float4(material.Emissive, material.Opacity);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Distortion: Defines
|
||||||
|
@1// Distortion: Includes
|
||||||
|
@2// Distortion: Constants
|
||||||
|
@3// Distortion: Resources
|
||||||
|
@4// Distortion: Utilities
|
||||||
|
@5// Distortion: Shaders
|
||||||
|
#if USE_DISTORTION
|
||||||
|
|
||||||
|
// Pixel Shader function for Distortion Pass
|
||||||
|
META_PS(USE_DISTORTION, FEATURE_LEVEL_ES2)
|
||||||
|
float4 PS_Distortion(PixelInput input) : SV_Target0
|
||||||
|
{
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
// LOD masking
|
||||||
|
ClipLODTransition(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Masking
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float3 viewNormal = normalize(TransformWorldVectorToView(materialInput, material.WorldNormal));
|
||||||
|
float airIOR = 1.0f;
|
||||||
|
#if USE_PIXEL_NORMAL_OFFSET_REFRACTION
|
||||||
|
float3 viewVertexNormal = TransformWorldVectorToView(materialInput, TransformTangentVectorToWorld(materialInput, float3(0, 0, 1)));
|
||||||
|
float2 distortion = (viewVertexNormal.xy - viewNormal.xy) * (material.Refraction - airIOR);
|
||||||
|
#else
|
||||||
|
float2 distortion = viewNormal.xy * (material.Refraction - airIOR);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Clip if the distortion distance (squared) is too small to be noticed
|
||||||
|
clip(dot(distortion, distortion) - 0.00001);
|
||||||
|
|
||||||
|
// Scale up for better precision in low/subtle refractions at the expense of artefacts at higher refraction
|
||||||
|
distortion *= 4.0f;
|
||||||
|
|
||||||
|
// Use separate storage for positive and negative offsets
|
||||||
|
float2 addOffset = max(distortion, 0);
|
||||||
|
float2 subOffset = abs(min(distortion, 0));
|
||||||
|
return float4(addOffset.x, addOffset.y, subOffset.x, subOffset.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Forward Shading: Defines
|
||||||
|
#define MAX_LOCAL_LIGHTS 4
|
||||||
|
@1// Forward Shading: Includes
|
||||||
|
#include "./Flax/LightingCommon.hlsl"
|
||||||
|
#if USE_REFLECTIONS
|
||||||
|
#include "./Flax/ReflectionsCommon.hlsl"
|
||||||
|
#define MATERIAL_REFLECTIONS_SSR 1
|
||||||
|
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
||||||
|
#include "./Flax/SSR.hlsl"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#include "./Flax/Lighting.hlsl"
|
||||||
|
#include "./Flax/ShadowsSampling.hlsl"
|
||||||
|
#include "./Flax/ExponentialHeightFog.hlsl"
|
||||||
|
@2// Forward Shading: Constants
|
||||||
|
LightData DirectionalLight;
|
||||||
|
LightShadowData DirectionalLightShadow;
|
||||||
|
LightData SkyLight;
|
||||||
|
ProbeData EnvironmentProbe;
|
||||||
|
ExponentialHeightFogData ExponentialHeightFog;
|
||||||
|
float3 Dummy2;
|
||||||
|
uint LocalLightsCount;
|
||||||
|
LightData LocalLights[MAX_LOCAL_LIGHTS];
|
||||||
|
@3// Forward Shading: Resources
|
||||||
|
TextureCube EnvProbe : register(t__SRV__);
|
||||||
|
TextureCube SkyLightTexture : register(t__SRV__);
|
||||||
|
Texture2DArray DirectionalLightShadowMap : register(t__SRV__);
|
||||||
|
@4// Forward Shading: Utilities
|
||||||
|
DECLARE_LIGHTSHADOWDATA_ACCESS(DirectionalLightShadow);
|
||||||
|
@5// Forward Shading: Shaders
|
||||||
|
|
||||||
|
// Pixel Shader function for Forward Pass
|
||||||
|
META_PS(USE_FORWARD, FEATURE_LEVEL_ES2)
|
||||||
|
void PS_Forward(
|
||||||
|
in PixelInput input
|
||||||
|
,out float4 output : SV_Target0
|
||||||
|
)
|
||||||
|
{
|
||||||
|
output = 0;
|
||||||
|
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
// LOD masking
|
||||||
|
ClipLODTransition(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Masking
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Add emissive light
|
||||||
|
output = float4(material.Emissive, material.Opacity);
|
||||||
|
|
||||||
|
#if MATERIAL_SHADING_MODEL != SHADING_MODEL_UNLIT
|
||||||
|
|
||||||
|
// Setup GBuffer data as proxy for lighting
|
||||||
|
GBufferSample gBuffer;
|
||||||
|
gBuffer.Normal = material.WorldNormal;
|
||||||
|
gBuffer.Roughness = material.Roughness;
|
||||||
|
gBuffer.Metalness = material.Metalness;
|
||||||
|
gBuffer.Color = material.Color;
|
||||||
|
gBuffer.Specular = material.Specular;
|
||||||
|
gBuffer.AO = material.AO;
|
||||||
|
gBuffer.ViewPos = mul(float4(materialInput.WorldPosition, 1), ViewMatrix).xyz;
|
||||||
|
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
||||||
|
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
||||||
|
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
||||||
|
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
||||||
|
#else
|
||||||
|
gBuffer.CustomData = float4(0, 0, 0, 0);
|
||||||
|
#endif
|
||||||
|
gBuffer.WorldPos = materialInput.WorldPosition;
|
||||||
|
gBuffer.ShadingModel = MATERIAL_SHADING_MODEL;
|
||||||
|
|
||||||
|
// Calculate lighting from a single directional light
|
||||||
|
float4 shadowMask = 1.0f;
|
||||||
|
if (DirectionalLight.CastShadows > 0)
|
||||||
|
{
|
||||||
|
LightShadowData directionalLightShadowData = GetDirectionalLightShadowData();
|
||||||
|
shadowMask.r = SampleShadow(DirectionalLight, directionalLightShadowData, DirectionalLightShadowMap, gBuffer, shadowMask.g);
|
||||||
|
}
|
||||||
|
float4 light = GetLighting(ViewPos, DirectionalLight, gBuffer, shadowMask, false, false);
|
||||||
|
|
||||||
|
// Calculate lighting from sky light
|
||||||
|
light += GetSkyLightLighting(SkyLight, gBuffer, SkyLightTexture);
|
||||||
|
|
||||||
|
// Calculate lighting from local lights
|
||||||
|
LOOP
|
||||||
|
for (uint localLightIndex = 0; localLightIndex < LocalLightsCount; localLightIndex++)
|
||||||
|
{
|
||||||
|
const LightData localLight = LocalLights[localLightIndex];
|
||||||
|
bool isSpotLight = localLight.SpotAngles.x > -2.0f;
|
||||||
|
shadowMask = 1.0f;
|
||||||
|
light += GetLighting(ViewPos, localLight, gBuffer, shadowMask, true, isSpotLight);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate lighting from Global Illumination
|
||||||
|
#if USE_GI
|
||||||
|
light += GetGlobalIlluminationLighting(gBuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate reflections
|
||||||
|
#if USE_REFLECTIONS
|
||||||
|
float3 reflections = SampleReflectionProbe(ViewPos, EnvProbe, EnvironmentProbe, gBuffer.WorldPos, gBuffer.Normal, gBuffer.Roughness).rgb;
|
||||||
|
|
||||||
|
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
||||||
|
// Screen Space Reflections
|
||||||
|
Texture2D sceneDepthTexture = MATERIAL_REFLECTIONS_SSR_DEPTH; // Material Generator inserts depth and color buffers and plugs it via internal define
|
||||||
|
Texture2D sceneColorTexture = MATERIAL_REFLECTIONS_SSR_COLOR;
|
||||||
|
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
||||||
|
float stepSize = ScreenSize.z; // 1 / screenWidth
|
||||||
|
float maxSamples = 48;
|
||||||
|
float worldAntiSelfOcclusionBias = 0.1f;
|
||||||
|
float brdfBias = 0.82f;
|
||||||
|
float drawDistance = 5000.0f;
|
||||||
|
float3 hit = TraceScreenSpaceReflection(screenUV, gBuffer, sceneDepthTexture, ViewPos, ViewMatrix, ViewProjectionMatrix, stepSize, maxSamples, false, 0.0f, worldAntiSelfOcclusionBias, brdfBias, drawDistance);
|
||||||
|
if (hit.z > 0)
|
||||||
|
{
|
||||||
|
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
||||||
|
reflections = lerp(reflections, screenColor, hit.z);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
light.rgb += reflections * GetReflectionSpecularLighting(ViewPos, gBuffer) * light.a;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Add lighting (apply ambient occlusion)
|
||||||
|
output.rgb += light.rgb * gBuffer.AO;
|
||||||
|
|
||||||
|
#if USE_FOG
|
||||||
|
// Calculate exponential height fog
|
||||||
|
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, 0);
|
||||||
|
|
||||||
|
// Apply fog to the output color
|
||||||
|
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
||||||
|
output = float4(output.rgb * fog.a + fog.rgb, output.a);
|
||||||
|
#elif MATERIAL_BLEND == MATERIAL_BLEND_TRANSPARENT
|
||||||
|
output = float4(output.rgb * fog.a + fog.rgb, output.a);
|
||||||
|
#elif MATERIAL_BLEND == MATERIAL_BLEND_ADDITIVE
|
||||||
|
output = float4(output.rgb * fog.a + fog.rgb, output.a * fog.a);
|
||||||
|
#elif MATERIAL_BLEND == MATERIAL_BLEND_MULTIPLY
|
||||||
|
output = float4(lerp(float3(1, 1, 1), output.rgb, fog.aaa * fog.aaa), output.a);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Global Illumination: Defines
|
||||||
|
#define USE_GI 1
|
||||||
|
@1// Global Illumination: Includes
|
||||||
|
#include "./Flax/GI/DDGI.hlsl"
|
||||||
|
#include "./Flax/LightingCommon.hlsl"
|
||||||
|
@2// Global Illumination: Constants
|
||||||
|
DDGIData DDGI;
|
||||||
|
@3// Global Illumination: Resources
|
||||||
|
Texture2D<snorm float4> ProbesState : register(t__SRV__);
|
||||||
|
Texture2D<float4> ProbesDistance : register(t__SRV__);
|
||||||
|
Texture2D<float4> ProbesIrradiance : register(t__SRV__);
|
||||||
|
@4// Global Illumination: Utilities
|
||||||
|
float4 GetGlobalIlluminationLighting(GBufferSample gBuffer)
|
||||||
|
{
|
||||||
|
float3 irradiance = SampleDDGIIrradiance(DDGI, ProbesState, ProbesDistance, ProbesIrradiance, gBuffer.WorldPos, gBuffer.Normal);
|
||||||
|
float3 diffuseColor = GetDiffuseColor(gBuffer);
|
||||||
|
float3 diffuse = Diffuse_Lambert(diffuseColor);
|
||||||
|
return float4(diffuse * irradiance, saturate(length(irradiance)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@5// Global Illumination: Shaders
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Lightmap: Defines
|
||||||
|
#define CAN_USE_LIGHTMAP 1
|
||||||
|
@1// Lightmap: Includes
|
||||||
|
@2// Lightmap: Constants
|
||||||
|
float4 LightmapArea;
|
||||||
|
@3// Lightmap: Resources
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
// Irradiance and directionality prebaked lightmaps
|
||||||
|
Texture2D Lightmap0 : register(t__SRV__);
|
||||||
|
Texture2D Lightmap1 : register(t__SRV__);
|
||||||
|
Texture2D Lightmap2 : register(t__SRV__);
|
||||||
|
#endif
|
||||||
|
@4// Lightmap: Utilities
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
|
||||||
|
// Evaluates the H-Basis coefficients in the tangent space normal direction
|
||||||
|
float3 GetHBasisIrradiance(float3 n, float3 h0, float3 h1, float3 h2, float3 h3)
|
||||||
|
{
|
||||||
|
// Band 0
|
||||||
|
float3 color = h0 * (1.0f / sqrt(2.0f * PI));
|
||||||
|
|
||||||
|
// Band 1
|
||||||
|
color += h1 * -sqrt(1.5f / PI) * n.y;
|
||||||
|
color += h2 * sqrt(1.5f / PI) * (2 * n.z - 1.0f);
|
||||||
|
color += h3 * -sqrt(1.5f / PI) * n.x;
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 SampleLightmap(Material material, MaterialInput materialInput)
|
||||||
|
{
|
||||||
|
// Sample lightmaps
|
||||||
|
float4 lightmap0 = Lightmap0.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
||||||
|
float4 lightmap1 = Lightmap1.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
||||||
|
float4 lightmap2 = Lightmap2.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
||||||
|
|
||||||
|
// Unpack H-basis
|
||||||
|
float3 h0 = float3(lightmap0.x, lightmap1.x, lightmap2.x);
|
||||||
|
float3 h1 = float3(lightmap0.y, lightmap1.y, lightmap2.y);
|
||||||
|
float3 h2 = float3(lightmap0.z, lightmap1.z, lightmap2.z);
|
||||||
|
float3 h3 = float3(lightmap0.w, lightmap1.w, lightmap2.w);
|
||||||
|
|
||||||
|
// Sample baked diffuse irradiance from the H-basis coefficients
|
||||||
|
float3 normal = material.TangentNormal;
|
||||||
|
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
||||||
|
normal *= material.TangentNormal;
|
||||||
|
#endif
|
||||||
|
return GetHBasisIrradiance(normal, h0, h1, h2, h3) / PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@5// Lightmap: Shaders
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Motion Vectors: Defines
|
||||||
|
@1// Motion Vectors: Includes
|
||||||
|
@2// Motion Vectors: Constants
|
||||||
|
@3// Motion Vectors: Resources
|
||||||
|
@4// Motion Vectors: Utilities
|
||||||
|
@5// Motion Vectors: Shaders
|
||||||
|
|
||||||
|
// Pixel Shader function for Motion Vectors Pass
|
||||||
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
|
float4 PS_MotionVectors(PixelInput input) : SV_Target0
|
||||||
|
{
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
// LOD masking
|
||||||
|
ClipLODTransition(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
// Perform per pixel clipping if material requries it
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate this and previosu frame pixel locations in clip space
|
||||||
|
float4 prevClipPos = mul(float4(input.Geometry.PrevWorldPosition, 1), PrevViewProjectionMatrix);
|
||||||
|
float4 curClipPos = mul(float4(input.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
float2 prevHPos = prevClipPos.xy / prevClipPos.w;
|
||||||
|
float2 curHPos = curClipPos.xy / curClipPos.w;
|
||||||
|
|
||||||
|
// Revert temporal jitter offset
|
||||||
|
prevHPos -= TemporalAAJitter.zw;
|
||||||
|
curHPos -= TemporalAAJitter.xy;
|
||||||
|
|
||||||
|
// Clip Space -> UV Space
|
||||||
|
float2 vPosPrev = prevHPos.xy * 0.5f + 0.5f;
|
||||||
|
float2 vPosCur = curHPos.xy * 0.5f + 0.5f;
|
||||||
|
vPosPrev.y = 1.0 - vPosPrev.y;
|
||||||
|
vPosCur.y = 1.0 - vPosCur.y;
|
||||||
|
|
||||||
|
// Calculate per-pixel motion vector
|
||||||
|
return float4(vPosCur - vPosPrev, 0, 1);
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
@0// Tessellation: Defines
|
||||||
|
#define TessalationProjectOntoPlane(planeNormal, planePosition, pointToProject) pointToProject - dot(pointToProject - planePosition, planeNormal) * planeNormal
|
||||||
|
@1// Tessellation: Includes
|
||||||
|
@2// Tessellation: Constants
|
||||||
|
@3// Tessellation: Resources
|
||||||
|
@4// Tessellation: Utilities
|
||||||
|
@5// Tessellation: Shaders
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
|
||||||
|
// Interpolants passed from the hull shader to the domain shader
|
||||||
|
struct TessalationHSToDS
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
|
#endif
|
||||||
|
float TessellationMultiplier : TESS;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Interpolants passed from the domain shader and to the pixel shader
|
||||||
|
struct TessalationDSToPS
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
MaterialInput GetMaterialInput(TessalationDSToPS input)
|
||||||
|
{
|
||||||
|
MaterialInput output = GetGeometryMaterialInput(input.Geometry);
|
||||||
|
output.SvPosition = input.Position;
|
||||||
|
output.TwoSidedSign = WorldDeterminantSign;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = input.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TessalationPatch
|
||||||
|
{
|
||||||
|
float EdgeTessFactor[3] : SV_TessFactor;
|
||||||
|
float InsideTessFactor : SV_InsideTessFactor;
|
||||||
|
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
||||||
|
float3 B210 : POSITION4;
|
||||||
|
float3 B120 : POSITION5;
|
||||||
|
float3 B021 : POSITION6;
|
||||||
|
float3 B012 : POSITION7;
|
||||||
|
float3 B102 : POSITION8;
|
||||||
|
float3 B201 : POSITION9;
|
||||||
|
float3 B111 : CENTER;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
TessalationPatch HS_PatchConstant(InputPatch<VertexOutput, 3> input)
|
||||||
|
{
|
||||||
|
TessalationPatch output;
|
||||||
|
|
||||||
|
// Average tess factors along edges, and pick an edge tess factor for the interior tessellation
|
||||||
|
float4 tessellationMultipliers;
|
||||||
|
tessellationMultipliers.x = 0.5f * (input[1].TessellationMultiplier + input[2].TessellationMultiplier);
|
||||||
|
tessellationMultipliers.y = 0.5f * (input[2].TessellationMultiplier + input[0].TessellationMultiplier);
|
||||||
|
tessellationMultipliers.z = 0.5f * (input[0].TessellationMultiplier + input[1].TessellationMultiplier);
|
||||||
|
tessellationMultipliers.w = 0.333f * (input[0].TessellationMultiplier + input[1].TessellationMultiplier + input[2].TessellationMultiplier);
|
||||||
|
tessellationMultipliers = clamp(tessellationMultipliers, 1, MAX_TESSELLATION_FACTOR);
|
||||||
|
|
||||||
|
output.EdgeTessFactor[0] = tessellationMultipliers.x; // 1->2 edge
|
||||||
|
output.EdgeTessFactor[1] = tessellationMultipliers.y; // 2->0 edge
|
||||||
|
output.EdgeTessFactor[2] = tessellationMultipliers.z; // 0->1 edge
|
||||||
|
output.InsideTessFactor = tessellationMultipliers.w;
|
||||||
|
|
||||||
|
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
||||||
|
// Calculate PN Triangle control points
|
||||||
|
// Reference: [Vlachos 2001]
|
||||||
|
float3 p1 = input[0].Geometry.WorldPosition;
|
||||||
|
float3 p2 = input[1].Geometry.WorldPosition;
|
||||||
|
float3 p3 = input[2].Geometry.WorldPosition;
|
||||||
|
float3 n1 = input[0].Geometry.WorldNormal;
|
||||||
|
float3 n2 = input[1].Geometry.WorldNormal;
|
||||||
|
float3 n3 = input[2].Geometry.WorldNormal;
|
||||||
|
output.B210 = (2.0f * p1 + p2 - dot((p2 - p1), n1) * n1) / 3.0f;
|
||||||
|
output.B120 = (2.0f * p2 + p1 - dot((p1 - p2), n2) * n2) / 3.0f;
|
||||||
|
output.B021 = (2.0f * p2 + p3 - dot((p3 - p2), n2) * n2) / 3.0f;
|
||||||
|
output.B012 = (2.0f * p3 + p2 - dot((p2 - p3), n3) * n3) / 3.0f;
|
||||||
|
output.B102 = (2.0f * p3 + p1 - dot((p1 - p3), n3) * n3) / 3.0f;
|
||||||
|
output.B201 = (2.0f * p1 + p3 - dot((p3 - p1), n1) * n1) / 3.0f;
|
||||||
|
float3 e = (output.B210 + output.B120 + output.B021 + output.B012 + output.B102 + output.B201) / 6.0f;
|
||||||
|
float3 v = (p1 + p2 + p3) / 3.0f;
|
||||||
|
output.B111 = e + ((e - v) / 2.0f);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
META_HS(USE_TESSELLATION, FEATURE_LEVEL_SM5)
|
||||||
|
META_HS_PATCH(TESSELLATION_IN_CONTROL_POINTS)
|
||||||
|
[domain("tri")]
|
||||||
|
[partitioning("fractional_odd")]
|
||||||
|
[outputtopology("triangle_cw")]
|
||||||
|
[maxtessfactor(MAX_TESSELLATION_FACTOR)]
|
||||||
|
[outputcontrolpoints(3)]
|
||||||
|
[patchconstantfunc("HS_PatchConstant")]
|
||||||
|
TessalationHSToDS HS(InputPatch<VertexOutput, TESSELLATION_IN_CONTROL_POINTS> input, uint ControlPointID : SV_OutputControlPointID)
|
||||||
|
{
|
||||||
|
TessalationHSToDS output;
|
||||||
|
|
||||||
|
// Pass through shader
|
||||||
|
#define COPY(thing) output.thing = input[ControlPointID].thing;
|
||||||
|
COPY(Position);
|
||||||
|
COPY(Geometry);
|
||||||
|
COPY(TessellationMultiplier);
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
COPY(CustomVSToPS);
|
||||||
|
#endif
|
||||||
|
#undef COPY
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
META_DS(USE_TESSELLATION, FEATURE_LEVEL_SM5)
|
||||||
|
[domain("tri")]
|
||||||
|
TessalationDSToPS DS(TessalationPatch constantData, float3 barycentricCoords : SV_DomainLocation, const OutputPatch<TessalationHSToDS, 3> input)
|
||||||
|
{
|
||||||
|
TessalationDSToPS output;
|
||||||
|
|
||||||
|
// Get the barycentric coords
|
||||||
|
float U = barycentricCoords.x;
|
||||||
|
float V = barycentricCoords.y;
|
||||||
|
float W = barycentricCoords.z;
|
||||||
|
|
||||||
|
// Interpolate patch attributes to generated vertices
|
||||||
|
output.Geometry = InterpolateGeometry(input[0].Geometry, U, input[1].Geometry, V, input[2].Geometry, W);
|
||||||
|
#define INTERPOLATE(thing) output.thing = U * input[0].thing + V * input[1].thing + W * input[2].thing
|
||||||
|
INTERPOLATE(Position);
|
||||||
|
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
||||||
|
// Interpolate using barycentric coordinates and PN Triangle control points
|
||||||
|
float UU = U * U;
|
||||||
|
float VV = V * V;
|
||||||
|
float WW = W * W;
|
||||||
|
float UU3 = UU * 3.0f;
|
||||||
|
float VV3 = VV * 3.0f;
|
||||||
|
float WW3 = WW * 3.0f;
|
||||||
|
float3 offset =
|
||||||
|
constantData.B210 * UU3 * V +
|
||||||
|
constantData.B120 * VV3 * U +
|
||||||
|
constantData.B021 * VV3 * W +
|
||||||
|
constantData.B012 * WW3 * V +
|
||||||
|
constantData.B102 * WW3 * U +
|
||||||
|
constantData.B201 * UU3 * W +
|
||||||
|
constantData.B111 * 6.0f * W * U * V;
|
||||||
|
InterpolateGeometryPositions(output.Geometry, input[0].Geometry, UU * U, input[1].Geometry, VV * V, input[2].Geometry, WW * W, offset);
|
||||||
|
#else
|
||||||
|
InterpolateGeometryPositions(output.Geometry, input[0].Geometry, U, input[1].Geometry, V, input[2].Geometry, W, float3(0, 0, 0));
|
||||||
|
#endif
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
UNROLL
|
||||||
|
for (int i = 0; i < CUSTOM_VERTEX_INTERPOLATORS_COUNT; i++)
|
||||||
|
INTERPOLATE(CustomVSToPS[i]);
|
||||||
|
#endif
|
||||||
|
#undef INTERPOLATE
|
||||||
|
|
||||||
|
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PHONG
|
||||||
|
// Orthogonal projection in the tangent planes with interpolation
|
||||||
|
ApplyGeometryPositionsPhongTess(output.Geometry, input[0].Geometry, input[1].Geometry, input[2].Geometry, U, V, W);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Perform displacement mapping
|
||||||
|
#if USE_DISPLACEMENT
|
||||||
|
MaterialInput materialInput = GetMaterialInput(output);
|
||||||
|
Material material = GetMaterialDS(materialInput);
|
||||||
|
OffsetGeometryPositions(output.Geometry, material.WorldDisplacement);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Recalculate the clip space position
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
#include "./Flax/GBufferCommon.hlsl"
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
#include "./Flax/Matrix.hlsl"
|
#include "./Flax/Matrix.hlsl"
|
||||||
|
#include "./Flax/Noise.hlsl"
|
||||||
@7
|
@7
|
||||||
// Primary constant buffer
|
// Primary constant buffer
|
||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
@@ -62,68 +63,6 @@ float Rand(inout uint seed)
|
|||||||
return asfloat((seed >> 9) | 0x3f800000) - 1.0f;
|
return asfloat((seed >> 9) | 0x3f800000) - 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
float4 Mod289(float4 x)
|
|
||||||
{
|
|
||||||
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
float4 Perm(float4 x)
|
|
||||||
{
|
|
||||||
return Mod289(((x * 34.0) + 1.0) * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
float Noise(float3 p)
|
|
||||||
{
|
|
||||||
float3 a = floor(p);
|
|
||||||
float3 d = p - a;
|
|
||||||
d = d * d * (3.0 - 2.0 * d);
|
|
||||||
|
|
||||||
float4 b = a.xxyy + float4(0.0, 1.0, 0.0, 1.0);
|
|
||||||
float4 k1 = Perm(b.xyxy);
|
|
||||||
float4 k2 = Perm(k1.xyxy + b.zzww);
|
|
||||||
|
|
||||||
float4 c = k2 + a.zzzz;
|
|
||||||
float4 k3 = Perm(c);
|
|
||||||
float4 k4 = Perm(c + 1.0);
|
|
||||||
|
|
||||||
float4 o1 = frac(k3 * (1.0 / 41.0));
|
|
||||||
float4 o2 = frac(k4 * (1.0 / 41.0));
|
|
||||||
|
|
||||||
float4 o3 = o2 * d.z + o1 * (1.0 - d.z);
|
|
||||||
float2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x);
|
|
||||||
|
|
||||||
return o4.y * d.y + o4.x * (1.0 - d.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
float3 Noise3D(float3 p)
|
|
||||||
{
|
|
||||||
float o = Noise(p);
|
|
||||||
float a = Noise(p + float3(0.0001f, 0.0f, 0.0f));
|
|
||||||
float b = Noise(p + float3(0.0f, 0.0001f, 0.0f));
|
|
||||||
float c = Noise(p + float3(0.0f, 0.0f, 0.0001f));
|
|
||||||
|
|
||||||
float3 grad = float3(o - a, o - b, o - c);
|
|
||||||
float3 other = abs(grad.zxy);
|
|
||||||
return normalize(cross(grad,other));
|
|
||||||
}
|
|
||||||
|
|
||||||
float3 Noise3D(float3 position, int octaves, float roughness)
|
|
||||||
{
|
|
||||||
float weight = 0.0f;
|
|
||||||
float3 noise = float3(0.0, 0.0, 0.0);
|
|
||||||
float scale = 1.0f;
|
|
||||||
for (int i = 0; i < octaves; i++)
|
|
||||||
{
|
|
||||||
float curWeight = pow((1.0-((float)i / octaves)), lerp(2.0, 0.2, roughness));
|
|
||||||
|
|
||||||
noise += Noise3D(position * scale) * curWeight;
|
|
||||||
weight += curWeight;
|
|
||||||
|
|
||||||
scale *= 1.72531;
|
|
||||||
}
|
|
||||||
return noise / weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reprojects the world space position from the given UV and raw device depth
|
// Reprojects the world space position from the given UV and raw device depth
|
||||||
float3 ReprojectPosition(float2 uv, float rawDepth)
|
float3 ReprojectPosition(float2 uv, float rawDepth)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#define MATERIAL 1
|
#define MATERIAL 1
|
||||||
@3
|
@3
|
||||||
|
|
||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
#include "./Flax/MaterialCommon.hlsl"
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
#include "./Flax/GBufferCommon.hlsl"
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
@@ -20,9 +19,10 @@ float3 ViewDir;
|
|||||||
float TimeParam;
|
float TimeParam;
|
||||||
float4 ViewInfo;
|
float4 ViewInfo;
|
||||||
float4 ScreenSize;
|
float4 ScreenSize;
|
||||||
|
float4 ViewSize;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Material shader resources
|
// Shader resources
|
||||||
@2
|
@2
|
||||||
// Interpolants passed from the vertex shader
|
// Interpolants passed from the vertex shader
|
||||||
struct VertexOutput
|
struct VertexOutput
|
||||||
@@ -185,6 +185,8 @@ float4 GetVertexColor(MaterialInput input)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
// Get material properties function (for vertex shader)
|
// Get material properties function (for vertex shader)
|
||||||
Material GetMaterialVS(MaterialInput input)
|
Material GetMaterialVS(MaterialInput input)
|
||||||
{
|
{
|
||||||
@@ -197,9 +199,6 @@ Material GetMaterialPS(MaterialInput input)
|
|||||||
@4
|
@4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix line for errors/warnings for shader code from template
|
|
||||||
#line 1000
|
|
||||||
|
|
||||||
// Vertex Shader function for GUI materials rendering
|
// Vertex Shader function for GUI materials rendering
|
||||||
META_VS(true, FEATURE_LEVEL_ES2)
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
META_VS_IN_ELEMENT(POSITION, 0, R32G32_FLOAT, 0, ALIGN, PER_VERTEX, 0, true)
|
META_VS_IN_ELEMENT(POSITION, 0, R32G32_FLOAT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
@@ -257,3 +256,5 @@ float4 PS_GUI(PixelInput input) : SV_Target0
|
|||||||
|
|
||||||
return float4(material.Emissive, material.Opacity);
|
return float4(material.Emissive, material.Opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@9
|
||||||
|
|||||||
@@ -2,19 +2,12 @@
|
|||||||
// Version: @0
|
// Version: @0
|
||||||
|
|
||||||
#define MATERIAL 1
|
#define MATERIAL 1
|
||||||
#define MAX_LOCAL_LIGHTS 4
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
@3
|
@3
|
||||||
|
|
||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
#include "./Flax/MaterialCommon.hlsl"
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
#include "./Flax/GBufferCommon.hlsl"
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
#include "./Flax/LightingCommon.hlsl"
|
|
||||||
#if USE_REFLECTIONS
|
|
||||||
#include "./Flax/ReflectionsCommon.hlsl"
|
|
||||||
#endif
|
|
||||||
#include "./Flax/Lighting.hlsl"
|
|
||||||
#include "./Flax/ShadowsSampling.hlsl"
|
|
||||||
#include "./Flax/ExponentialHeightFog.hlsl"
|
|
||||||
#include "./Flax/Matrix.hlsl"
|
#include "./Flax/Matrix.hlsl"
|
||||||
@7
|
@7
|
||||||
struct SpriteInput
|
struct SpriteInput
|
||||||
@@ -23,17 +16,17 @@ struct SpriteInput
|
|||||||
float2 TexCoord : TEXCOORD;
|
float2 TexCoord : TEXCOORD;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RibbonInput
|
||||||
|
{
|
||||||
|
uint Order : TEXCOORD0;
|
||||||
|
uint ParticleIndex : TEXCOORD1;
|
||||||
|
uint PrevParticleIndex : TEXCOORD2;
|
||||||
|
float Distance : TEXCOORD3;
|
||||||
|
};
|
||||||
|
|
||||||
// Primary constant buffer (with additional material parameters)
|
// Primary constant buffer (with additional material parameters)
|
||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
float4x4 ViewProjectionMatrix;
|
|
||||||
float4x4 WorldMatrix;
|
float4x4 WorldMatrix;
|
||||||
float4x4 ViewMatrix;
|
|
||||||
float3 ViewPos;
|
|
||||||
float ViewFar;
|
|
||||||
float3 ViewDir;
|
|
||||||
float TimeParam;
|
|
||||||
float4 ViewInfo;
|
|
||||||
float4 ScreenSize;
|
|
||||||
uint SortedIndicesOffset;
|
uint SortedIndicesOffset;
|
||||||
float PerInstanceRandom;
|
float PerInstanceRandom;
|
||||||
int ParticleStride;
|
int ParticleStride;
|
||||||
@@ -55,44 +48,14 @@ uint RibbonSegmentCount;
|
|||||||
float4x4 WorldMatrixInverseTransposed;
|
float4x4 WorldMatrixInverseTransposed;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Secondary constantant buffer (for lighting)
|
|
||||||
META_CB_BEGIN(1, LightingData)
|
|
||||||
LightData DirectionalLight;
|
|
||||||
LightShadowData DirectionalLightShadow;
|
|
||||||
LightData SkyLight;
|
|
||||||
ProbeData EnvironmentProbe;
|
|
||||||
ExponentialHeightFogData ExponentialHeightFog;
|
|
||||||
float3 Dummy1;
|
|
||||||
uint LocalLightsCount;
|
|
||||||
LightData LocalLights[MAX_LOCAL_LIGHTS];
|
|
||||||
META_CB_END
|
|
||||||
|
|
||||||
DECLARE_LIGHTSHADOWDATA_ACCESS(DirectionalLightShadow);
|
|
||||||
|
|
||||||
// Particles attributes buffer
|
// Particles attributes buffer
|
||||||
ByteAddressBuffer ParticlesData : register(t0);
|
ByteAddressBuffer ParticlesData : register(t0);
|
||||||
|
|
||||||
// Ribbons don't use sorted indices so overlap the segment distances buffer on the slot
|
|
||||||
#define HAS_SORTED_INDICES (!defined(_VS_Ribbon))
|
|
||||||
|
|
||||||
#if HAS_SORTED_INDICES
|
|
||||||
|
|
||||||
// Sorted particles indices
|
// Sorted particles indices
|
||||||
Buffer<uint> SortedIndices : register(t1);
|
Buffer<uint> SortedIndices : register(t1);
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Ribbon particles segments distances buffer
|
|
||||||
Buffer<float> SegmentDistances : register(t1);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Shader resources
|
// Shader resources
|
||||||
TextureCube EnvProbe : register(t2);
|
|
||||||
TextureCube SkyLightTexture : register(t3);
|
|
||||||
Texture2DArray DirectionalLightShadowMap : register(t4);
|
|
||||||
@2
|
@2
|
||||||
|
|
||||||
// Interpolants passed from the vertex shader
|
// Interpolants passed from the vertex shader
|
||||||
struct VertexOutput
|
struct VertexOutput
|
||||||
{
|
{
|
||||||
@@ -107,8 +70,8 @@ struct VertexOutput
|
|||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
float3 InstanceOrigin : TEXCOORD6;
|
nointerpolation float3 InstanceOrigin : TEXCOORD6;
|
||||||
float InstanceParams : TEXCOORD7; // x-PerInstanceRandom
|
nointerpolation float InstanceParams : TEXCOORD7; // x-PerInstanceRandom
|
||||||
};
|
};
|
||||||
|
|
||||||
// Interpolants passed to the pixel shader
|
// Interpolants passed to the pixel shader
|
||||||
@@ -125,8 +88,8 @@ struct PixelInput
|
|||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
float3 InstanceOrigin : TEXCOORD6;
|
nointerpolation float3 InstanceOrigin : TEXCOORD6;
|
||||||
float InstanceParams : TEXCOORD7; // x-PerInstanceRandom
|
nointerpolation float InstanceParams : TEXCOORD7; // x-PerInstanceRandom
|
||||||
bool IsFrontFace : SV_IsFrontFace;
|
bool IsFrontFace : SV_IsFrontFace;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -172,14 +135,11 @@ MaterialInput GetMaterialInput(PixelInput input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Gets the local to world transform matrix (supports instancing)
|
// Gets the local to world transform matrix (supports instancing)
|
||||||
float4x4 GetInstanceTransform(ModelInput input)
|
#if USE_INSTANCING
|
||||||
{
|
#define GetInstanceTransform(input) float4x4(float4(input.InstanceTransform1.xyz, 0.0f), float4(input.InstanceTransform2.xyz, 0.0f), float4(input.InstanceTransform3.xyz, 0.0f), float4(input.InstanceOrigin.xyz, 1.0f))
|
||||||
return WorldMatrix;
|
#else
|
||||||
}
|
#define GetInstanceTransform(input) WorldMatrix;
|
||||||
float4x4 GetInstanceTransform(MaterialInput input)
|
#endif
|
||||||
{
|
|
||||||
return WorldMatrix;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
||||||
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||||
@@ -312,6 +272,8 @@ float3 TransformParticleVector(float3 input)
|
|||||||
return mul(float4(input, 0.0f), WorldMatrixInverseTransposed).xyz;
|
return mul(float4(input, 0.0f), WorldMatrixInverseTransposed).xyz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
// Get material properties function (for vertex shader)
|
// Get material properties function (for vertex shader)
|
||||||
Material GetMaterialVS(MaterialInput input)
|
Material GetMaterialVS(MaterialInput input)
|
||||||
{
|
{
|
||||||
@@ -330,9 +292,6 @@ Material GetMaterialPS(MaterialInput input)
|
|||||||
@4
|
@4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix line for errors/warnings for shader code from template
|
|
||||||
#line 1000
|
|
||||||
|
|
||||||
// Calculates the transform matrix from mesh tangent space to local space
|
// Calculates the transform matrix from mesh tangent space to local space
|
||||||
half3x3 CalcTangentToLocal(ModelInput input)
|
half3x3 CalcTangentToLocal(ModelInput input)
|
||||||
{
|
{
|
||||||
@@ -362,13 +321,11 @@ VertexOutput VS_Sprite(SpriteInput input, uint particleIndex : SV_InstanceID)
|
|||||||
{
|
{
|
||||||
VertexOutput output;
|
VertexOutput output;
|
||||||
|
|
||||||
#if HAS_SORTED_INDICES
|
|
||||||
// Sorted particles mapping
|
// Sorted particles mapping
|
||||||
if (SortedIndicesOffset != 0xFFFFFFFF)
|
if (SortedIndicesOffset != 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
particleIndex = SortedIndices[SortedIndicesOffset + particleIndex];
|
particleIndex = SortedIndices[SortedIndicesOffset + particleIndex];
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Read particle data
|
// Read particle data
|
||||||
float3 particlePosition = GetParticleVec3(particleIndex, PositionOffset);
|
float3 particlePosition = GetParticleVec3(particleIndex, PositionOffset);
|
||||||
@@ -499,13 +456,11 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
|
|||||||
{
|
{
|
||||||
VertexOutput output;
|
VertexOutput output;
|
||||||
|
|
||||||
#if HAS_SORTED_INDICES
|
|
||||||
// Sorted particles mapping
|
// Sorted particles mapping
|
||||||
if (SortedIndicesOffset != 0xFFFFFFFF)
|
if (SortedIndicesOffset != 0xFFFFFFFF)
|
||||||
{
|
{
|
||||||
particleIndex = SortedIndices[SortedIndicesOffset + particleIndex];
|
particleIndex = SortedIndices[SortedIndicesOffset + particleIndex];
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Read particle data
|
// Read particle data
|
||||||
float3 particlePosition = GetParticleVec3(particleIndex, PositionOffset);
|
float3 particlePosition = GetParticleVec3(particleIndex, PositionOffset);
|
||||||
@@ -608,12 +563,16 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
|
|||||||
|
|
||||||
// Vertex Shader function for Ribbon Rendering
|
// Vertex Shader function for Ribbon Rendering
|
||||||
META_VS(true, FEATURE_LEVEL_ES2)
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
VertexOutput VS_Ribbon(uint vertexIndex : SV_VertexID)
|
META_VS_IN_ELEMENT(TEXCOORD, 0, R32_UINT, 0, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 1, R32_UINT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 2, R32_UINT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 3, R32_FLOAT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
|
||||||
{
|
{
|
||||||
VertexOutput output;
|
VertexOutput output;
|
||||||
|
|
||||||
// Get particle data
|
// Get particle data
|
||||||
uint particleIndex = vertexIndex / 2;
|
uint particleIndex = input.ParticleIndex;
|
||||||
int vertexSign = (((int)vertexIndex & 0x1) * 2) - 1;
|
int vertexSign = (((int)vertexIndex & 0x1) * 2) - 1;
|
||||||
float3 position = GetParticlePosition(particleIndex);
|
float3 position = GetParticlePosition(particleIndex);
|
||||||
float ribbonWidth = RibbonWidthOffset != -1 ? GetParticleFloat(particleIndex, RibbonWidthOffset) : 20.0f;
|
float ribbonWidth = RibbonWidthOffset != -1 ? GetParticleFloat(particleIndex, RibbonWidthOffset) : 20.0f;
|
||||||
@@ -621,15 +580,13 @@ VertexOutput VS_Ribbon(uint vertexIndex : SV_VertexID)
|
|||||||
|
|
||||||
// Calculate ribbon direction
|
// Calculate ribbon direction
|
||||||
float3 direction;
|
float3 direction;
|
||||||
if (particleIndex == 0)
|
if (input.Order == 0)
|
||||||
{
|
{
|
||||||
float3 nextParticlePos = GetParticlePosition(particleIndex + 1);
|
direction = GetParticlePosition(input.PrevParticleIndex) - position;
|
||||||
direction = nextParticlePos - position;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float3 previousParticlePos = GetParticlePosition(particleIndex - 1);
|
direction = position - GetParticlePosition(input.PrevParticleIndex);
|
||||||
direction = position - previousParticlePos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate particle orientation (tangent vectors)
|
// Calculate particle orientation (tangent vectors)
|
||||||
@@ -646,19 +603,16 @@ VertexOutput VS_Ribbon(uint vertexIndex : SV_VertexID)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculate texture coordinates
|
// Calculate texture coordinates
|
||||||
float texCoordU;
|
|
||||||
#ifdef _VS_Ribbon
|
|
||||||
if (RibbonUVTilingDistance != 0.0f)
|
if (RibbonUVTilingDistance != 0.0f)
|
||||||
{
|
{
|
||||||
texCoordU = SegmentDistances[particleIndex] / RibbonUVTilingDistance;
|
output.TexCoord.x = input.Distance / RibbonUVTilingDistance;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
texCoordU = (float)particleIndex / RibbonSegmentCount;
|
output.TexCoord.x = (float)input.Order / (float)RibbonSegmentCount;
|
||||||
}
|
}
|
||||||
float texCoordV = (vertexIndex + 1) & 0x1;
|
output.TexCoord.y = (vertexIndex + 1) & 0x1;
|
||||||
output.TexCoord = float2(texCoordU, texCoordV) * RibbonUVScale + RibbonUVOffset;
|
output.TexCoord = output.TexCoord * RibbonUVScale + RibbonUVOffset;
|
||||||
|
|
||||||
// Compute world space vertex position
|
// Compute world space vertex position
|
||||||
output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f);
|
output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f);
|
||||||
@@ -712,142 +666,9 @@ VertexOutput VS_Ribbon(uint vertexIndex : SV_VertexID)
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pixel Shader function for Forward Pass
|
|
||||||
META_PS(USE_FORWARD, FEATURE_LEVEL_ES2)
|
|
||||||
float4 PS_Forward(PixelInput input) : SV_Target0
|
|
||||||
{
|
|
||||||
float4 output = 0;
|
|
||||||
|
|
||||||
// Get material parameters
|
|
||||||
MaterialInput materialInput = GetMaterialInput(input);
|
|
||||||
Material material = GetMaterialPS(materialInput);
|
|
||||||
|
|
||||||
// Masking
|
|
||||||
#if MATERIAL_MASKED
|
|
||||||
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Add emissive light
|
|
||||||
output = float4(material.Emissive, material.Opacity);
|
|
||||||
|
|
||||||
#if MATERIAL_SHADING_MODEL != SHADING_MODEL_UNLIT
|
|
||||||
|
|
||||||
// Setup GBuffer data as proxy for lighting
|
|
||||||
GBufferSample gBuffer;
|
|
||||||
gBuffer.Normal = material.WorldNormal;
|
|
||||||
gBuffer.Roughness = material.Roughness;
|
|
||||||
gBuffer.Metalness = material.Metalness;
|
|
||||||
gBuffer.Color = material.Color;
|
|
||||||
gBuffer.Specular = material.Specular;
|
|
||||||
gBuffer.AO = material.AO;
|
|
||||||
gBuffer.ViewPos = mul(float4(materialInput.WorldPosition, 1), ViewMatrix).xyz;
|
|
||||||
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
|
||||||
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
|
||||||
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
|
||||||
gBuffer.CustomData = float4(material.SubsurfaceColor, material.Opacity);
|
|
||||||
#else
|
|
||||||
gBuffer.CustomData = float4(0, 0, 0, 0);
|
|
||||||
#endif
|
|
||||||
gBuffer.WorldPos = materialInput.WorldPosition;
|
|
||||||
gBuffer.ShadingModel = MATERIAL_SHADING_MODEL;
|
|
||||||
|
|
||||||
// Calculate lighting from a single directional light
|
|
||||||
float4 shadowMask = 1.0f;
|
|
||||||
if (DirectionalLight.CastShadows > 0)
|
|
||||||
{
|
|
||||||
LightShadowData directionalLightShadowData = GetDirectionalLightShadowData();
|
|
||||||
shadowMask.r = SampleShadow(DirectionalLight, directionalLightShadowData, DirectionalLightShadowMap, gBuffer, shadowMask.g);
|
|
||||||
}
|
|
||||||
float4 light = GetLighting(ViewPos, DirectionalLight, gBuffer, shadowMask, false, false);
|
|
||||||
|
|
||||||
// Calculate lighting from sky light
|
|
||||||
light += GetSkyLightLighting(SkyLight, gBuffer, SkyLightTexture);
|
|
||||||
|
|
||||||
// Calculate lighting from local lights
|
|
||||||
LOOP
|
|
||||||
for (uint localLightIndex = 0; localLightIndex < LocalLightsCount; localLightIndex++)
|
|
||||||
{
|
|
||||||
const LightData localLight = LocalLights[localLightIndex];
|
|
||||||
bool isSpotLight = localLight.SpotAngles.x > -2.0f;
|
|
||||||
shadowMask = 1.0f;
|
|
||||||
light += GetLighting(ViewPos, localLight, gBuffer, shadowMask, true, isSpotLight);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USE_REFLECTIONS
|
|
||||||
// Calculate reflections
|
|
||||||
light.rgb += GetEnvProbeLighting(ViewPos, EnvProbe, EnvironmentProbe, gBuffer) * light.a;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Add lighting (apply ambient occlusion)
|
|
||||||
output.rgb += light.rgb * gBuffer.AO;
|
|
||||||
|
|
||||||
#if USE_FOG
|
|
||||||
// Calculate exponential height fog
|
|
||||||
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, 0);
|
|
||||||
|
|
||||||
// Apply fog to the output color
|
|
||||||
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
|
||||||
output = float4(output.rgb * fog.a + fog.rgb, output.a);
|
|
||||||
#elif MATERIAL_BLEND == MATERIAL_BLEND_TRANSPARENT
|
|
||||||
output = float4(output.rgb * fog.a + fog.rgb, output.a);
|
|
||||||
#elif MATERIAL_BLEND == MATERIAL_BLEND_ADDITIVE
|
|
||||||
output = float4(output.rgb * fog.a + fog.rgb, output.a * fog.a);
|
|
||||||
#elif MATERIAL_BLEND == MATERIAL_BLEND_MULTIPLY
|
|
||||||
output = float4(lerp(float3(1, 1, 1), output.rgb, fog.aaa * fog.aaa), output.a);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USE_DISTORTION
|
|
||||||
|
|
||||||
// Pixel Shader function for Distortion Pass
|
|
||||||
META_PS(USE_DISTORTION, FEATURE_LEVEL_ES2)
|
|
||||||
float4 PS_Distortion(PixelInput input) : SV_Target0
|
|
||||||
{
|
|
||||||
// Get material parameters
|
|
||||||
MaterialInput materialInput = GetMaterialInput(input);
|
|
||||||
Material material = GetMaterialPS(materialInput);
|
|
||||||
|
|
||||||
// Masking
|
|
||||||
#if MATERIAL_MASKED
|
|
||||||
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
float3 viewNormal = normalize(TransformWorldVectorToView(materialInput, material.WorldNormal));
|
|
||||||
float airIOR = 1.0f;
|
|
||||||
#if USE_PIXEL_NORMAL_OFFSET_REFRACTION
|
|
||||||
float3 viewVertexNormal = TransformWorldVectorToView(materialInput, TransformTangentVectorToWorld(materialInput, float3(0, 0, 1)));
|
|
||||||
float2 distortion = (viewVertexNormal.xy - viewNormal.xy) * (material.Refraction - airIOR);
|
|
||||||
#else
|
|
||||||
float2 distortion = viewNormal.xy * (material.Refraction - airIOR);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Clip if the distortion distance (squared) is too small to be noticed
|
|
||||||
clip(dot(distortion, distortion) - 0.00001);
|
|
||||||
|
|
||||||
// Scale up for better precision in low/subtle refractions at the expense of artefacts at higher refraction
|
|
||||||
distortion *= 4.0f;
|
|
||||||
|
|
||||||
// Use separate storage for positive and negative offsets
|
|
||||||
float2 addOffset = max(distortion, 0);
|
|
||||||
float2 subOffset = abs(min(distortion, 0));
|
|
||||||
return float4(addOffset.x, addOffset.y, subOffset.x, subOffset.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Pixel Shader function for Depth Pass
|
// Pixel Shader function for Depth Pass
|
||||||
META_PS(true, FEATURE_LEVEL_ES2)
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
void PS_Depth(PixelInput input
|
void PS_Depth(PixelInput input)
|
||||||
#if GLSL
|
|
||||||
, out float4 OutColor : SV_Target0
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
// Get material parameters
|
// Get material parameters
|
||||||
MaterialInput materialInput = GetMaterialInput(input);
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
@@ -860,8 +681,20 @@ void PS_Depth(PixelInput input
|
|||||||
#if MATERIAL_BLEND == MATERIAL_BLEND_TRANSPARENT
|
#if MATERIAL_BLEND == MATERIAL_BLEND_TRANSPARENT
|
||||||
clip(material.Opacity - MATERIAL_OPACITY_THRESHOLD);
|
clip(material.Opacity - MATERIAL_OPACITY_THRESHOLD);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if GLSL
|
|
||||||
OutColor = 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _PS_QuadOverdraw
|
||||||
|
|
||||||
|
#include "./Flax/Editor/QuadOverdraw.hlsl"
|
||||||
|
|
||||||
|
// Pixel Shader function for Quad Overdraw Pass (editor-only)
|
||||||
|
[earlydepthstencil]
|
||||||
|
META_PS(USE_EDITOR, FEATURE_LEVEL_SM5)
|
||||||
|
void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID)
|
||||||
|
{
|
||||||
|
DoQuadOverdraw(svPos, primId);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@9
|
||||||
|
|||||||
@@ -18,9 +18,10 @@ float TimeParam;
|
|||||||
float4 ViewInfo;
|
float4 ViewInfo;
|
||||||
float4 ScreenSize;
|
float4 ScreenSize;
|
||||||
float4 TemporalAAJitter;
|
float4 TemporalAAJitter;
|
||||||
|
float4x4 InverseViewProjectionMatrix;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Material shader resources
|
// Shader resources
|
||||||
@2
|
@2
|
||||||
// Interpolants passed to the pixel shader
|
// Interpolants passed to the pixel shader
|
||||||
struct PixelInput
|
struct PixelInput
|
||||||
@@ -62,6 +63,14 @@ MaterialInput GetMaterialInput(PixelInput input)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gets world space position at given pixel coordinate with given device depth
|
||||||
|
float3 GetWorldPos(float2 uv, float deviceDepth)
|
||||||
|
{
|
||||||
|
float4 clipPos = float4(uv * float2(2.0, -2.0) + float2(-1.0, 1.0), deviceDepth, 1.0);
|
||||||
|
float4 wsPos = mul(clipPos, InverseViewProjectionMatrix);
|
||||||
|
return wsPos.xyz / wsPos.w;
|
||||||
|
}
|
||||||
|
|
||||||
// Transforms a vector from tangent space to world space
|
// Transforms a vector from tangent space to world space
|
||||||
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
||||||
{
|
{
|
||||||
@@ -128,15 +137,14 @@ float4 GetVertexColor(MaterialInput input)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
// Get material properties function (for pixel shader)
|
// Get material properties function (for pixel shader)
|
||||||
Material GetMaterialPS(MaterialInput input)
|
Material GetMaterialPS(MaterialInput input)
|
||||||
{
|
{
|
||||||
@4
|
@4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix line for errors/warnings for shader code from template
|
|
||||||
#line 1000
|
|
||||||
|
|
||||||
// Pixel Shader function for PostFx materials rendering
|
// Pixel Shader function for PostFx materials rendering
|
||||||
META_PS(true, FEATURE_LEVEL_ES2)
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
float4 PS_PostFx(PixelInput input) : SV_Target0
|
float4 PS_PostFx(PixelInput input) : SV_Target0
|
||||||
@@ -147,3 +155,5 @@ float4 PS_PostFx(PixelInput input) : SV_Target0
|
|||||||
|
|
||||||
return float4(material.Emissive, material.Opacity);
|
return float4(material.Emissive, material.Opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@9
|
||||||
|
|||||||
@@ -0,0 +1,626 @@
|
|||||||
|
// File generated by Flax Materials Editor
|
||||||
|
// Version: @0
|
||||||
|
|
||||||
|
#define MATERIAL 1
|
||||||
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
|
@3
|
||||||
|
#include "./Flax/Common.hlsl"
|
||||||
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
|
@7
|
||||||
|
// Primary constant buffer (with additional material parameters)
|
||||||
|
META_CB_BEGIN(0, Data)
|
||||||
|
float4x4 WorldMatrix;
|
||||||
|
float4x4 PrevWorldMatrix;
|
||||||
|
float2 Dummy0;
|
||||||
|
float LODDitherFactor;
|
||||||
|
float PerInstanceRandom;
|
||||||
|
float3 GeometrySize;
|
||||||
|
float WorldDeterminantSign;
|
||||||
|
@1META_CB_END
|
||||||
|
|
||||||
|
// Shader resources
|
||||||
|
@2
|
||||||
|
// Geometry data passed though the graphics rendering stages up to the pixel shader
|
||||||
|
struct GeometryData
|
||||||
|
{
|
||||||
|
float3 WorldPosition : TEXCOORD0;
|
||||||
|
float2 TexCoord : TEXCOORD1;
|
||||||
|
float2 LightmapUV : TEXCOORD2;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
half4 VertexColor : COLOR;
|
||||||
|
#endif
|
||||||
|
float3 WorldNormal : TEXCOORD3;
|
||||||
|
float4 WorldTangent : TEXCOORD4;
|
||||||
|
nointerpolation float3 InstanceOrigin : TEXCOORD5;
|
||||||
|
nointerpolation float2 InstanceParams : TEXCOORD6; // x-PerInstanceRandom, y-LODDitherFactor
|
||||||
|
float3 PrevWorldPosition : TEXCOORD7;
|
||||||
|
nointerpolation float3 InstanceTransform1 : TEXCOORD8;
|
||||||
|
nointerpolation float3 InstanceTransform2 : TEXCOORD9;
|
||||||
|
nointerpolation float3 InstanceTransform3 : TEXCOORD10;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Interpolants passed from the vertex shader
|
||||||
|
struct VertexOutput
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD11;
|
||||||
|
#endif
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
float TessellationMultiplier : TESS;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// Interpolants passed to the pixel shader
|
||||||
|
struct PixelInput
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
GeometryData Geometry;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD11;
|
||||||
|
#endif
|
||||||
|
bool IsFrontFace : SV_IsFrontFace;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Material properties generation input
|
||||||
|
struct MaterialInput
|
||||||
|
{
|
||||||
|
float3 WorldPosition;
|
||||||
|
float TwoSidedSign;
|
||||||
|
float2 TexCoord;
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
float2 LightmapUV;
|
||||||
|
#endif
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
half4 VertexColor;
|
||||||
|
#endif
|
||||||
|
float3x3 TBN;
|
||||||
|
float4 SvPosition;
|
||||||
|
float3 PreSkinnedPosition;
|
||||||
|
float3 PreSkinnedNormal;
|
||||||
|
float3 InstanceOrigin;
|
||||||
|
float2 InstanceParams;
|
||||||
|
float3 InstanceTransform1;
|
||||||
|
float3 InstanceTransform2;
|
||||||
|
float3 InstanceTransform3;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
// Extracts geometry data to the material input
|
||||||
|
MaterialInput GetGeometryMaterialInput(GeometryData geometry)
|
||||||
|
{
|
||||||
|
MaterialInput output = (MaterialInput)0;
|
||||||
|
output.WorldPosition = geometry.WorldPosition;
|
||||||
|
output.TexCoord = geometry.TexCoord;
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
output.LightmapUV = geometry.LightmapUV;
|
||||||
|
#endif
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.VertexColor = geometry.VertexColor;
|
||||||
|
#endif
|
||||||
|
output.TBN = CalcTangentBasis(geometry.WorldNormal, geometry.WorldTangent);
|
||||||
|
output.InstanceOrigin = geometry.InstanceOrigin;
|
||||||
|
output.InstanceParams = geometry.InstanceParams;
|
||||||
|
output.InstanceTransform1 = geometry.InstanceTransform1;
|
||||||
|
output.InstanceTransform2 = geometry.InstanceTransform2;
|
||||||
|
output.InstanceTransform3 = geometry.InstanceTransform3;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
|
||||||
|
// Interpolates the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define InterpolateGeometryPositions(output, p0, w0, p1, w1, p2, w2, offset) output.WorldPosition = p0.WorldPosition * w0 + p1.WorldPosition * w1 + p2.WorldPosition * w2 + offset; output.PrevWorldPosition = p0.PrevWorldPosition * w0 + p1.PrevWorldPosition * w1 + p2.PrevWorldPosition * w2 + offset
|
||||||
|
|
||||||
|
// Offsets the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define OffsetGeometryPositions(geometry, offset) geometry.WorldPosition += offset; geometry.PrevWorldPosition += offset
|
||||||
|
|
||||||
|
// Applies the Phong tessallation to the geometry positions (used by the tessallation when doing Phong tess)
|
||||||
|
#define ApplyGeometryPositionsPhongTess(geometry, p0, p1, p2, U, V, W) \
|
||||||
|
float3 posProjectedU = TessalationProjectOntoPlane(p0.WorldNormal, p0.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedV = TessalationProjectOntoPlane(p1.WorldNormal, p1.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedW = TessalationProjectOntoPlane(p2.WorldNormal, p2.WorldPosition, geometry.WorldPosition); \
|
||||||
|
geometry.WorldPosition = U * posProjectedU + V * posProjectedV + W * posProjectedW; \
|
||||||
|
posProjectedU = TessalationProjectOntoPlane(p0.WorldNormal, p0.PrevWorldPosition, geometry.PrevWorldPosition); \
|
||||||
|
posProjectedV = TessalationProjectOntoPlane(p1.WorldNormal, p1.PrevWorldPosition, geometry.PrevWorldPosition); \
|
||||||
|
posProjectedW = TessalationProjectOntoPlane(p2.WorldNormal, p2.PrevWorldPosition, geometry.PrevWorldPosition); \
|
||||||
|
geometry.PrevWorldPosition = U * posProjectedU + V * posProjectedV + W * posProjectedW
|
||||||
|
|
||||||
|
// Interpolates the geometry data except positions (used by the tessallation when generating vertices)
|
||||||
|
GeometryData InterpolateGeometry(GeometryData p0, float w0, GeometryData p1, float w1, GeometryData p2, float w2)
|
||||||
|
{
|
||||||
|
GeometryData output = (GeometryData)0;
|
||||||
|
output.TexCoord = p0.TexCoord * w0 + p1.TexCoord * w1 + p2.TexCoord * w2;
|
||||||
|
output.LightmapUV = p0.LightmapUV * w0 + p1.LightmapUV * w1 + p2.LightmapUV * w2;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.VertexColor = p0.VertexColor * w0 + p1.VertexColor * w1 + p2.VertexColor * w2;
|
||||||
|
#endif
|
||||||
|
output.WorldNormal = p0.WorldNormal * w0 + p1.WorldNormal * w1 + p2.WorldNormal * w2;
|
||||||
|
output.WorldNormal = normalize(output.WorldNormal);
|
||||||
|
output.WorldTangent = p0.WorldTangent * w0 + p1.WorldTangent * w1 + p2.WorldTangent * w2;
|
||||||
|
output.WorldTangent.xyz = normalize(output.WorldTangent.xyz);
|
||||||
|
output.InstanceOrigin = p0.InstanceOrigin;
|
||||||
|
output.InstanceParams = p0.InstanceParams;
|
||||||
|
output.InstanceTransform1 = p0.InstanceTransform1;
|
||||||
|
output.InstanceTransform2 = p0.InstanceTransform2;
|
||||||
|
output.InstanceTransform3 = p0.InstanceTransform3;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MaterialInput GetMaterialInput(PixelInput input)
|
||||||
|
{
|
||||||
|
MaterialInput output = GetGeometryMaterialInput(input.Geometry);
|
||||||
|
output.TwoSidedSign = WorldDeterminantSign * (input.IsFrontFace ? 1.0 : -1.0);
|
||||||
|
output.SvPosition = input.Position;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = input.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the local to world transform matrix
|
||||||
|
#define GetInstanceTransform(input) float4x4(float4(input.InstanceTransform1.xyz, 0.0f), float4(input.InstanceTransform2.xyz, 0.0f), float4(input.InstanceTransform3.xyz, 0.0f), float4(input.InstanceOrigin.xyz, 1.0f))
|
||||||
|
|
||||||
|
// Extarcts the world matrix and instancce transform vector
|
||||||
|
#if USE_INSTANCING
|
||||||
|
#define CalculateInstanceTransform(input) float4x4 world = GetInstanceTransform(input); output.Geometry.InstanceTransform1 = input.InstanceTransform1.xyz; output.Geometry.InstanceTransform2 = input.InstanceTransform2.xyz; output.Geometry.InstanceTransform3 = input.InstanceTransform3.xyz;
|
||||||
|
#else
|
||||||
|
#define CalculateInstanceTransform(input) float4x4 world = WorldMatrix; output.Geometry.InstanceTransform1 = world[0].xyz; output.Geometry.InstanceTransform2 = world[1].xyz; output.Geometry.InstanceTransform3 = world[2].xyz;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
||||||
|
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||||
|
{
|
||||||
|
// Extract per axis scales from localToWorld transform
|
||||||
|
float scaleX = length(localToWorld[0]);
|
||||||
|
float scaleY = length(localToWorld[1]);
|
||||||
|
float scaleZ = length(localToWorld[2]);
|
||||||
|
float3 invScale = float3(
|
||||||
|
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
|
||||||
|
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
|
||||||
|
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);
|
||||||
|
localToWorld[0] *= invScale.x;
|
||||||
|
localToWorld[1] *= invScale.y;
|
||||||
|
localToWorld[2] *= invScale.z;
|
||||||
|
return localToWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from tangent space to world space
|
||||||
|
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
||||||
|
{
|
||||||
|
return mul(tangentVector, input.TBN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to tangent space
|
||||||
|
float3 TransformWorldVectorToTangent(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(input.TBN, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to view space
|
||||||
|
float3 TransformWorldVectorToView(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(worldVector, (float3x3)ViewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from view space to world space
|
||||||
|
float3 TransformViewVectorToWorld(MaterialInput input, float3 viewVector)
|
||||||
|
{
|
||||||
|
return mul((float3x3)ViewMatrix, viewVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformLocalVectorToWorld(MaterialInput input, float3 localVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)GetInstanceTransform(input);
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localVector, localToWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformWorldVectorToLocal(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)GetInstanceTransform(input);
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localToWorld, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object position (supports instancing)
|
||||||
|
float3 GetObjectPosition(MaterialInput input)
|
||||||
|
{
|
||||||
|
return input.InstanceOrigin.xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object size (supports instancing)
|
||||||
|
float3 GetObjectSize(MaterialInput input)
|
||||||
|
{
|
||||||
|
float4x4 world = GetInstanceTransform(input);
|
||||||
|
return GeometrySize * float3(world._m00, world._m11, world._m22);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object random value (supports instancing)
|
||||||
|
float GetPerInstanceRandom(MaterialInput input)
|
||||||
|
{
|
||||||
|
return input.InstanceParams.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object LOD transition dither factor (supports instancing)
|
||||||
|
float GetLODDitherFactor(MaterialInput input)
|
||||||
|
{
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
return input.InstanceParams.y;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the interpolated vertex color (in linear space)
|
||||||
|
float4 GetVertexColor(MaterialInput input)
|
||||||
|
{
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
return input.VertexColor;
|
||||||
|
#else
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
|
// Get material properties function (for vertex shader)
|
||||||
|
Material GetMaterialVS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@5
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for domain shader)
|
||||||
|
Material GetMaterialDS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@6
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for pixel shader)
|
||||||
|
Material GetMaterialPS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@4
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculates the transform matrix from mesh tangent space to local space
|
||||||
|
float3x3 CalcTangentToLocal(ModelInput input)
|
||||||
|
{
|
||||||
|
float bitangentSign = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
float3 normal = input.Normal.xyz * 2.0 - 1.0;
|
||||||
|
float3 tangent = input.Tangent.xyz * 2.0 - 1.0;
|
||||||
|
float3 bitangent = cross(normal, tangent) * bitangentSign;
|
||||||
|
return float3x3(tangent, bitangent, normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3x3 CalcTangentToWorld(float4x4 world, float3x3 tangentToLocal)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = RemoveScaleFromLocalToWorld((float3x3)world);
|
||||||
|
return mul(tangentToLocal, localToWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertex Shader function for GBuffer Pass and Depth Pass (with full vertex data)
|
||||||
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
|
META_PERMUTATION_1(USE_INSTANCING=0)
|
||||||
|
META_PERMUTATION_1(USE_INSTANCING=1)
|
||||||
|
META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 0, R16G16_FLOAT, 1, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(NORMAL, 0, R10G10B10A2_UNORM, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TANGENT, 0, R10G10B10A2_UNORM, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 1, R16G16_FLOAT, 1, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(COLOR, 0, R8G8B8A8_UNORM, 2, 0, PER_VERTEX, 0, USE_VERTEX_COLOR)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,0, R32G32B32A32_FLOAT,3, 0, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,1, R32G32B32A32_FLOAT,3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,2, R32G32B32_FLOAT, 3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,3, R32G32B32_FLOAT, 3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,4, R16G16B16A16_FLOAT,3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
VertexOutput VS(ModelInput input)
|
||||||
|
{
|
||||||
|
VertexOutput output;
|
||||||
|
|
||||||
|
// Compute world space vertex position
|
||||||
|
CalculateInstanceTransform(input);
|
||||||
|
output.Geometry.WorldPosition = mul(float4(input.Position.xyz, 1), world).xyz;
|
||||||
|
output.Geometry.PrevWorldPosition = mul(float4(input.Position.xyz, 1), PrevWorldMatrix).xyz;
|
||||||
|
|
||||||
|
// Compute clip space position
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
|
// Pass vertex attributes
|
||||||
|
output.Geometry.TexCoord = input.TexCoord;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.Geometry.VertexColor = input.Color;
|
||||||
|
#endif
|
||||||
|
output.Geometry.InstanceOrigin = world[3].xyz;
|
||||||
|
#if USE_INSTANCING
|
||||||
|
output.Geometry.LightmapUV = input.LightmapUV * input.InstanceLightmapArea.zw + input.InstanceLightmapArea.xy;
|
||||||
|
output.Geometry.InstanceParams = float2(input.InstanceOrigin.w, input.InstanceTransform1.w);
|
||||||
|
#else
|
||||||
|
#if CAN_USE_LIGHTMAP
|
||||||
|
output.Geometry.LightmapUV = input.LightmapUV * LightmapArea.zw + LightmapArea.xy;
|
||||||
|
#else
|
||||||
|
output.Geometry.LightmapUV = input.LightmapUV;
|
||||||
|
#endif
|
||||||
|
output.Geometry.InstanceParams = float2(PerInstanceRandom, LODDitherFactor);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate tanget space to world space transformation matrix for unit vectors
|
||||||
|
float3x3 tangentToLocal = CalcTangentToLocal(input);
|
||||||
|
float3x3 tangentToWorld = CalcTangentToWorld(world, tangentToLocal);
|
||||||
|
output.Geometry.WorldNormal = tangentToWorld[2];
|
||||||
|
output.Geometry.WorldTangent.xyz = tangentToWorld[0];
|
||||||
|
output.Geometry.WorldTangent.w = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
|
||||||
|
// Get material input params if need to evaluate any material property
|
||||||
|
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
MaterialInput materialInput = GetGeometryMaterialInput(output.Geometry);
|
||||||
|
materialInput.TwoSidedSign = WorldDeterminantSign;
|
||||||
|
materialInput.SvPosition = output.Position;
|
||||||
|
materialInput.PreSkinnedPosition = input.Position.xyz;
|
||||||
|
materialInput.PreSkinnedNormal = tangentToLocal[2].xyz;
|
||||||
|
Material material = GetMaterialVS(materialInput);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Apply world position offset per-vertex
|
||||||
|
#if USE_POSITION_OFFSET
|
||||||
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get tessalation multiplier (per vertex)
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
output.TessellationMultiplier = material.TessellationMultiplier;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Copy interpolants for other shader stages
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = material.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertex Shader function for Depth Pass
|
||||||
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
|
META_PERMUTATION_1(USE_INSTANCING=0)
|
||||||
|
META_PERMUTATION_1(USE_INSTANCING=1)
|
||||||
|
META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,0, R32G32B32A32_FLOAT,3, 0, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,1, R32G32B32A32_FLOAT,3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,2, R32G32B32_FLOAT, 3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,3, R32G32B32_FLOAT, 3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
META_VS_IN_ELEMENT(ATTRIBUTE,4, R16G16B16A16_FLOAT,3, ALIGN, PER_INSTANCE, 1, USE_INSTANCING)
|
||||||
|
float4 VS_Depth(ModelInput_PosOnly input) : SV_Position
|
||||||
|
{
|
||||||
|
#if USE_INSTANCING
|
||||||
|
float4x4 world = GetInstanceTransform(input);
|
||||||
|
#else
|
||||||
|
float4x4 world = WorldMatrix;
|
||||||
|
#endif
|
||||||
|
float3 worldPosition = mul(float4(input.Position.xyz, 1), world).xyz;
|
||||||
|
float4 position = mul(float4(worldPosition, 1), ViewProjectionMatrix);
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_SKINNING
|
||||||
|
|
||||||
|
// The skeletal bones matrix buffer (stored as 4x3, 3 float4 behind each other)
|
||||||
|
Buffer<float4> BoneMatrices : register(t0);
|
||||||
|
|
||||||
|
#if PER_BONE_MOTION_BLUR
|
||||||
|
|
||||||
|
// The skeletal bones matrix buffer from the previous frame
|
||||||
|
Buffer<float4> PrevBoneMatrices : register(t1);
|
||||||
|
|
||||||
|
float3x4 GetPrevBoneMatrix(int index)
|
||||||
|
{
|
||||||
|
float4 a = PrevBoneMatrices[index * 3];
|
||||||
|
float4 b = PrevBoneMatrices[index * 3 + 1];
|
||||||
|
float4 c = PrevBoneMatrices[index * 3 + 2];
|
||||||
|
return float3x4(a, b, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 SkinPrevPosition(ModelInput_Skinned input)
|
||||||
|
{
|
||||||
|
float4 position = float4(input.Position.xyz, 1);
|
||||||
|
float3x4 boneMatrix = input.BlendWeights.x * GetPrevBoneMatrix(input.BlendIndices.x);
|
||||||
|
boneMatrix += input.BlendWeights.y * GetPrevBoneMatrix(input.BlendIndices.y);
|
||||||
|
boneMatrix += input.BlendWeights.z * GetPrevBoneMatrix(input.BlendIndices.z);
|
||||||
|
boneMatrix += input.BlendWeights.w * GetPrevBoneMatrix(input.BlendIndices.w);
|
||||||
|
return mul(boneMatrix, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Cached skinning data to avoid multiple calculation
|
||||||
|
struct SkinningData
|
||||||
|
{
|
||||||
|
float3x4 BlendMatrix;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Calculates the transposed transform matrix for the given bone index
|
||||||
|
float3x4 GetBoneMatrix(int index)
|
||||||
|
{
|
||||||
|
float4 a = BoneMatrices[index * 3];
|
||||||
|
float4 b = BoneMatrices[index * 3 + 1];
|
||||||
|
float4 c = BoneMatrices[index * 3 + 2];
|
||||||
|
return float3x4(a, b, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculates the transposed transform matrix for the given vertex (uses blending)
|
||||||
|
float3x4 GetBoneMatrix(ModelInput_Skinned input)
|
||||||
|
{
|
||||||
|
float3x4 boneMatrix = input.BlendWeights.x * GetBoneMatrix(input.BlendIndices.x);
|
||||||
|
boneMatrix += input.BlendWeights.y * GetBoneMatrix(input.BlendIndices.y);
|
||||||
|
boneMatrix += input.BlendWeights.z * GetBoneMatrix(input.BlendIndices.z);
|
||||||
|
boneMatrix += input.BlendWeights.w * GetBoneMatrix(input.BlendIndices.w);
|
||||||
|
return boneMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms the vertex position by weighted sum of the skinning matrices
|
||||||
|
float3 SkinPosition(ModelInput_Skinned input, SkinningData data)
|
||||||
|
{
|
||||||
|
return mul(data.BlendMatrix, float4(input.Position.xyz, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms the vertex position by weighted sum of the skinning matrices
|
||||||
|
float3x3 SkinTangents(ModelInput_Skinned input, SkinningData data)
|
||||||
|
{
|
||||||
|
// Unpack vertex tangent frame
|
||||||
|
float bitangentSign = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
float3 normal = input.Normal.xyz * 2.0 - 1.0;
|
||||||
|
float3 tangent = input.Tangent.xyz * 2.0 - 1.0;
|
||||||
|
|
||||||
|
// Apply skinning
|
||||||
|
tangent = mul(data.BlendMatrix, float4(tangent, 0));
|
||||||
|
normal = mul(data.BlendMatrix, float4(normal, 0));
|
||||||
|
|
||||||
|
float3 bitangent = cross(normal, tangent) * bitangentSign;
|
||||||
|
return float3x3(tangent, bitangent, normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertex Shader function for GBuffers/Depth Pass (skinned mesh rendering)
|
||||||
|
META_VS(true, FEATURE_LEVEL_ES2)
|
||||||
|
META_PERMUTATION_1(USE_SKINNING=1)
|
||||||
|
META_PERMUTATION_2(USE_SKINNING=1, PER_BONE_MOTION_BLUR=1)
|
||||||
|
META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TEXCOORD, 0, R16G16_FLOAT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(NORMAL, 0, R10G10B10A2_UNORM, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(TANGENT, 0, R10G10B10A2_UNORM, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(BLENDINDICES, 0, R8G8B8A8_UINT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
META_VS_IN_ELEMENT(BLENDWEIGHT, 0, R16G16B16A16_FLOAT,0, ALIGN, PER_VERTEX, 0, true)
|
||||||
|
VertexOutput VS_Skinned(ModelInput_Skinned input)
|
||||||
|
{
|
||||||
|
VertexOutput output;
|
||||||
|
|
||||||
|
// Perform skinning
|
||||||
|
SkinningData data;
|
||||||
|
data.BlendMatrix = GetBoneMatrix(input);
|
||||||
|
float3 position = SkinPosition(input, data);
|
||||||
|
float3x3 tangentToLocal = SkinTangents(input, data);
|
||||||
|
|
||||||
|
// Compute world space vertex position
|
||||||
|
CalculateInstanceTransform(input);
|
||||||
|
output.Geometry.WorldPosition = mul(float4(position, 1), world).xyz;
|
||||||
|
#if PER_BONE_MOTION_BLUR
|
||||||
|
float3 prevPosition = SkinPrevPosition(input);
|
||||||
|
output.Geometry.PrevWorldPosition = mul(float4(prevPosition, 1), PrevWorldMatrix).xyz;
|
||||||
|
#else
|
||||||
|
output.Geometry.PrevWorldPosition = mul(float4(position, 1), PrevWorldMatrix).xyz;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Compute clip space position
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
|
// Pass vertex attributes
|
||||||
|
output.Geometry.TexCoord = input.TexCoord;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
output.Geometry.VertexColor = float4(0, 0, 0, 1);
|
||||||
|
#endif
|
||||||
|
output.Geometry.LightmapUV = float2(0, 0);
|
||||||
|
output.Geometry.InstanceOrigin = world[3].xyz;
|
||||||
|
#if USE_INSTANCING
|
||||||
|
output.Geometry.InstanceParams = float2(input.InstanceOrigin.w, input.InstanceTransform1.w);
|
||||||
|
#else
|
||||||
|
output.Geometry.InstanceParams = float2(PerInstanceRandom, LODDitherFactor);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate tanget space to world space transformation matrix for unit vectors
|
||||||
|
float3x3 tangentToWorld = CalcTangentToWorld(world, tangentToLocal);
|
||||||
|
output.Geometry.WorldNormal = tangentToWorld[2];
|
||||||
|
output.Geometry.WorldTangent.xyz = tangentToWorld[0];
|
||||||
|
output.Geometry.WorldTangent.w = input.Tangent.w ? -1.0f : +1.0f;
|
||||||
|
|
||||||
|
// Get material input params if need to evaluate any material property
|
||||||
|
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
MaterialInput materialInput = GetGeometryMaterialInput(output.Geometry);
|
||||||
|
materialInput.TwoSidedSign = WorldDeterminantSign;
|
||||||
|
materialInput.SvPosition = output.Position;
|
||||||
|
materialInput.PreSkinnedPosition = input.Position.xyz;
|
||||||
|
materialInput.PreSkinnedNormal = tangentToLocal[2].xyz;
|
||||||
|
Material material = GetMaterialVS(materialInput);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Apply world position offset per-vertex
|
||||||
|
#if USE_POSITION_OFFSET
|
||||||
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Get tessalation multiplier (per vertex)
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
output.TessellationMultiplier = material.TessellationMultiplier;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Copy interpolants for other shader stages
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
output.CustomVSToPS = material.CustomVSToPS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
|
||||||
|
void ClipLODTransition(PixelInput input)
|
||||||
|
{
|
||||||
|
float ditherFactor = input.Geometry.InstanceParams.y;
|
||||||
|
if (abs(ditherFactor) > 0.001)
|
||||||
|
{
|
||||||
|
float randGrid = cos(dot(floor(input.Position.xy), float2(347.83452793, 3343.28371863)));
|
||||||
|
float randGridFrac = frac(randGrid * 1000.0);
|
||||||
|
half mask = (ditherFactor < 0.0) ? (ditherFactor + 1.0 > randGridFrac) : (ditherFactor < randGridFrac);
|
||||||
|
clip(mask - 0.001);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Pixel Shader function for Depth Pass
|
||||||
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
|
void PS_Depth(PixelInput input)
|
||||||
|
{
|
||||||
|
#if USE_DITHERED_LOD_TRANSITION
|
||||||
|
// LOD masking
|
||||||
|
ClipLODTransition(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MATERIAL_MASKED || MATERIAL_BLEND != MATERIAL_BLEND_OPAQUE
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = GetMaterialInput(input);
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Perform per pixel clipping
|
||||||
|
#if MATERIAL_MASKED
|
||||||
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
#if MATERIAL_BLEND != MATERIAL_BLEND_OPAQUE
|
||||||
|
clip(material.Opacity - MATERIAL_OPACITY_THRESHOLD);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if _PS_QuadOverdraw
|
||||||
|
|
||||||
|
#include "./Flax/Editor/QuadOverdraw.hlsl"
|
||||||
|
|
||||||
|
// Pixel Shader function for Quad Overdraw Pass (editor-only)
|
||||||
|
[earlydepthstencil]
|
||||||
|
META_PS(USE_EDITOR, FEATURE_LEVEL_SM5)
|
||||||
|
void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID)
|
||||||
|
{
|
||||||
|
DoQuadOverdraw(svPos, primId);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@9
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
|||||||
// Version: @0
|
// Version: @0
|
||||||
|
|
||||||
#define MATERIAL 1
|
#define MATERIAL 1
|
||||||
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
@3
|
@3
|
||||||
|
|
||||||
// Enables/disables smooth terrain chunks LOD transitions (with morphing higher LOD near edges to the lower LOD in the neighbour)
|
// Enables/disables smooth terrain chunks LOD transitions (with morphing higher LOD near edges to the lower LOD in the neighbour)
|
||||||
#define USE_SMOOTH_LOD_TRANSITION 1
|
#define USE_SMOOTH_LOD_TRANSITION 1
|
||||||
|
|
||||||
@@ -17,16 +17,7 @@
|
|||||||
@7
|
@7
|
||||||
// Primary constant buffer (with additional material parameters)
|
// Primary constant buffer (with additional material parameters)
|
||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
float4x4 ViewProjectionMatrix;
|
|
||||||
float4x4 WorldMatrix;
|
float4x4 WorldMatrix;
|
||||||
float4x4 ViewMatrix;
|
|
||||||
float3 ViewPos;
|
|
||||||
float ViewFar;
|
|
||||||
float3 ViewDir;
|
|
||||||
float TimeParam;
|
|
||||||
float4 ViewInfo;
|
|
||||||
float4 ScreenSize;
|
|
||||||
float4 LightmapArea;
|
|
||||||
float3 WorldInvScale;
|
float3 WorldInvScale;
|
||||||
float WorldDeterminantSign;
|
float WorldDeterminantSign;
|
||||||
float PerInstanceRandom;
|
float PerInstanceRandom;
|
||||||
@@ -39,35 +30,31 @@ float2 OffsetUV;
|
|||||||
float2 Dummy0;
|
float2 Dummy0;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
#if CAN_USE_LIGHTMAP
|
|
||||||
|
|
||||||
// Irradiance and directionality prebaked lightmaps
|
|
||||||
Texture2D Lightmap0 : register(t0);
|
|
||||||
Texture2D Lightmap1 : register(t1);
|
|
||||||
Texture2D Lightmap2 : register(t2);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Terrain data
|
// Terrain data
|
||||||
Texture2D Heightmap : register(t3);
|
Texture2D Heightmap : register(t0);
|
||||||
Texture2D Splatmap0 : register(t4);
|
Texture2D Splatmap0 : register(t1);
|
||||||
Texture2D Splatmap1 : register(t5);
|
Texture2D Splatmap1 : register(t2);
|
||||||
|
|
||||||
// Material shader resources
|
// Shader resources
|
||||||
@2
|
@2
|
||||||
|
// Geometry data passed though the graphics rendering stages up to the pixel shader
|
||||||
|
struct GeometryData
|
||||||
|
{
|
||||||
|
float3 WorldPosition : TEXCOORD0;
|
||||||
|
float2 TexCoord : TEXCOORD1;
|
||||||
|
float2 LightmapUV : TEXCOORD2;
|
||||||
|
float3 WorldNormal : TEXCOORD3;
|
||||||
|
float HolesMask : TEXCOORD4;
|
||||||
|
#if USE_TERRAIN_LAYERS
|
||||||
|
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
// Interpolants passed from the vertex shader
|
// Interpolants passed from the vertex shader
|
||||||
struct VertexOutput
|
struct VertexOutput
|
||||||
{
|
{
|
||||||
float4 Position : SV_Position;
|
float4 Position : SV_Position;
|
||||||
float3 WorldPosition : TEXCOORD0;
|
GeometryData Geometry;
|
||||||
float2 TexCoord : TEXCOORD1;
|
|
||||||
float2 LightmapUV : TEXCOORD2;
|
|
||||||
float3 WorldNormal : TEXCOORD3;
|
|
||||||
float HolesMask : TEXCOORD4;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
@@ -79,19 +66,12 @@ struct VertexOutput
|
|||||||
// Interpolants passed to the pixel shader
|
// Interpolants passed to the pixel shader
|
||||||
struct PixelInput
|
struct PixelInput
|
||||||
{
|
{
|
||||||
float4 Position : SV_Position;
|
float4 Position : SV_Position;
|
||||||
float3 WorldPosition : TEXCOORD0;
|
GeometryData Geometry;
|
||||||
float2 TexCoord : TEXCOORD1;
|
|
||||||
float2 LightmapUV : TEXCOORD2;
|
|
||||||
float3 WorldNormal : TEXCOORD3;
|
|
||||||
float HolesMask : TEXCOORD4;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
bool IsFrontFace : SV_IsFrontFace;
|
bool IsFrontFace : SV_IsFrontFace;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Material properties generation input
|
// Material properties generation input
|
||||||
@@ -116,25 +96,66 @@ struct MaterialInput
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Extracts geometry data to the material input
|
||||||
|
MaterialInput GetGeometryMaterialInput(GeometryData geometry)
|
||||||
|
{
|
||||||
|
MaterialInput output = (MaterialInput)0;
|
||||||
|
output.WorldPosition = geometry.WorldPosition;
|
||||||
|
output.TexCoord = geometry.TexCoord;
|
||||||
|
#if USE_LIGHTMAP
|
||||||
|
output.LightmapUV = geometry.LightmapUV;
|
||||||
|
#endif
|
||||||
|
output.TBN = CalcTangentBasis(geometry.WorldNormal, geometry.WorldPosition, geometry.TexCoord);
|
||||||
|
output.HolesMask = geometry.HolesMask;
|
||||||
|
#if USE_TERRAIN_LAYERS
|
||||||
|
output.Layers = geometry.Layers;
|
||||||
|
#endif
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USE_TESSELLATION
|
||||||
|
|
||||||
|
// Interpolates the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define InterpolateGeometryPositions(output, p0, w0, p1, w1, p2, w2, offset) output.WorldPosition = p0.WorldPosition * w0 + p1.WorldPosition * w1 + p2.WorldPosition * w2 + offset
|
||||||
|
|
||||||
|
// Offsets the geometry positions data only (used by the tessallation when generating vertices)
|
||||||
|
#define OffsetGeometryPositions(geometry, offset) geometry.WorldPosition += offset
|
||||||
|
|
||||||
|
// Applies the Phong tessallation to the geometry positions (used by the tessallation when doing Phong tess)
|
||||||
|
#define ApplyGeometryPositionsPhongTess(geometry, p0, p1, p2, U, V, W) \
|
||||||
|
float3 posProjectedU = TessalationProjectOntoPlane(p0.WorldNormal, p0.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedV = TessalationProjectOntoPlane(p1.WorldNormal, p1.WorldPosition, geometry.WorldPosition); \
|
||||||
|
float3 posProjectedW = TessalationProjectOntoPlane(p2.WorldNormal, p2.WorldPosition, geometry.WorldPosition); \
|
||||||
|
geometry.WorldPosition = U * posProjectedU + V * posProjectedV + W * posProjectedW
|
||||||
|
|
||||||
|
// Interpolates the geometry data except positions (used by the tessallation when generating vertices)
|
||||||
|
GeometryData InterpolateGeometry(GeometryData p0, float w0, GeometryData p1, float w1, GeometryData p2, float w2)
|
||||||
|
{
|
||||||
|
GeometryData output = (GeometryData)0;
|
||||||
|
output.TexCoord = p0.TexCoord * w0 + p1.TexCoord * w1 + p2.TexCoord * w2;
|
||||||
|
output.LightmapUV = p0.LightmapUV * w0 + p1.LightmapUV * w1 + p2.LightmapUV * w2;
|
||||||
|
output.WorldNormal = p0.WorldNormal * w0 + p1.WorldNormal * w1 + p2.WorldNormal * w2;
|
||||||
|
output.WorldNormal = normalize(output.WorldNormal);
|
||||||
|
output.HolesMask = p0.HolesMask * w0 + p1.HolesMask * w1 + p2.HolesMask * w2;
|
||||||
|
#if USE_TERRAIN_LAYERS
|
||||||
|
UNROLL
|
||||||
|
for (int i = 0; i < TERRAIN_LAYERS_DATA_SIZE; i++)
|
||||||
|
output.Layers[i] = p0.Layers[i] * w0 + p1.Layers[i] * w1 + p2.Layers[i] * w2;
|
||||||
|
#endif
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
MaterialInput GetMaterialInput(PixelInput input)
|
MaterialInput GetMaterialInput(PixelInput input)
|
||||||
{
|
{
|
||||||
MaterialInput result = (MaterialInput)0;
|
MaterialInput output = GetGeometryMaterialInput(input.Geometry);
|
||||||
result.WorldPosition = input.WorldPosition;
|
output.TwoSidedSign = WorldDeterminantSign * (input.IsFrontFace ? 1.0 : -1.0);
|
||||||
result.TexCoord = input.TexCoord;
|
output.SvPosition = input.Position;
|
||||||
#if USE_LIGHTMAP
|
|
||||||
result.LightmapUV = input.LightmapUV;
|
|
||||||
#endif
|
|
||||||
result.TBN = CalcTangentBasisFromWorldNormal(input.WorldNormal);
|
|
||||||
result.TwoSidedSign = WorldDeterminantSign * (input.IsFrontFace ? 1.0 : -1.0);
|
|
||||||
result.SvPosition = input.Position;
|
|
||||||
result.HolesMask = input.HolesMask;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
result.Layers = input.Layers;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
result.CustomVSToPS = input.CustomVSToPS;
|
output.CustomVSToPS = input.CustomVSToPS;
|
||||||
#endif
|
#endif
|
||||||
return result;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Removes the scale vector from the local to world transformation matrix
|
// Removes the scale vector from the local to world transformation matrix
|
||||||
@@ -216,6 +237,8 @@ float4 GetVertexColor(MaterialInput input)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
// Get material properties function (for vertex shader)
|
// Get material properties function (for vertex shader)
|
||||||
Material GetMaterialVS(MaterialInput input)
|
Material GetMaterialVS(MaterialInput input)
|
||||||
{
|
{
|
||||||
@@ -234,9 +257,6 @@ Material GetMaterialPS(MaterialInput input)
|
|||||||
@4
|
@4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix line for errors/warnings for shader code from template
|
|
||||||
#line 1000
|
|
||||||
|
|
||||||
// Calculates LOD value (with fractional part for blending)
|
// Calculates LOD value (with fractional part for blending)
|
||||||
float CalcLOD(float2 xy, float4 morph)
|
float CalcLOD(float2 xy, float4 morph)
|
||||||
{
|
{
|
||||||
@@ -249,24 +269,16 @@ float CalcLOD(float2 xy, float4 morph)
|
|||||||
if ((xy.x + xy.y) > 1)
|
if ((xy.x + xy.y) > 1)
|
||||||
{
|
{
|
||||||
if (xy.x < xy.y)
|
if (xy.x < xy.y)
|
||||||
{
|
|
||||||
lod = lodCalculated.w;
|
lod = lodCalculated.w;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
lod = lodCalculated.z;
|
lod = lodCalculated.z;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (xy.x < xy.y)
|
if (xy.x < xy.y)
|
||||||
{
|
|
||||||
lod = lodCalculated.y;
|
lod = lodCalculated.y;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
lod = lodCalculated.x;
|
lod = lodCalculated.x;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return lod;
|
return lod;
|
||||||
@@ -285,7 +297,7 @@ float3x3 CalcTangentToWorld(float4x4 world, float3x3 tangentToLocal)
|
|||||||
struct TerrainVertexInput
|
struct TerrainVertexInput
|
||||||
{
|
{
|
||||||
float2 TexCoord : TEXCOORD0;
|
float2 TexCoord : TEXCOORD0;
|
||||||
float4 Morph : TEXCOORD1;
|
float4 Morph : TEXCOORD1;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Vertex Shader function for terrain rendering
|
// Vertex Shader function for terrain rendering
|
||||||
@@ -336,7 +348,7 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
float2 normalTemp = float2(heightmapValue.b, heightmapValue.a) * 2.0f - 1.0f;
|
float2 normalTemp = float2(heightmapValue.b, heightmapValue.a) * 2.0f - 1.0f;
|
||||||
float3 normal = float3(normalTemp.x, sqrt(1.0 - saturate(dot(normalTemp, normalTemp))), normalTemp.y);
|
float3 normal = float3(normalTemp.x, sqrt(1.0 - saturate(dot(normalTemp, normalTemp))), normalTemp.y);
|
||||||
normal = normalize(normal);
|
normal = normalize(normal);
|
||||||
output.HolesMask = isHole ? 0 : 1;
|
output.Geometry.HolesMask = isHole ? 0 : 1;
|
||||||
if (isHole)
|
if (isHole)
|
||||||
{
|
{
|
||||||
normal = float3(0, 1, 0);
|
normal = float3(0, 1, 0);
|
||||||
@@ -353,10 +365,10 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
float3 position = float3(positionXZ.x, height, positionXZ.y);
|
float3 position = float3(positionXZ.x, height, positionXZ.y);
|
||||||
|
|
||||||
// Compute world space vertex position
|
// Compute world space vertex position
|
||||||
output.WorldPosition = mul(float4(position, 1), WorldMatrix).xyz;
|
output.Geometry.WorldPosition = mul(float4(position, 1), WorldMatrix).xyz;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
#if USE_SMOOTH_LOD_TRANSITION
|
#if USE_SMOOTH_LOD_TRANSITION
|
||||||
@@ -364,46 +376,46 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
#else
|
#else
|
||||||
float2 texCoord = input.TexCoord;
|
float2 texCoord = input.TexCoord;
|
||||||
#endif
|
#endif
|
||||||
output.TexCoord = positionXZ * (1.0f / TerrainChunkSizeLOD0) + OffsetUV;
|
output.Geometry.TexCoord = positionXZ * (1.0f / TerrainChunkSizeLOD0) + OffsetUV;
|
||||||
output.LightmapUV = texCoord * LightmapArea.zw + LightmapArea.xy;
|
output.Geometry.LightmapUV = texCoord * LightmapArea.zw + LightmapArea.xy;
|
||||||
|
|
||||||
// Extract terrain layers weights from the splatmap
|
// Extract terrain layers weights from the splatmap
|
||||||
#if USE_TERRAIN_LAYERS
|
#if USE_TERRAIN_LAYERS
|
||||||
output.Layers[0] = splatmap0Value;
|
output.Geometry.Layers[0] = splatmap0Value;
|
||||||
#if TERRAIN_LAYERS_DATA_SIZE > 1
|
#if TERRAIN_LAYERS_DATA_SIZE > 1
|
||||||
output.Layers[1] = splatmap1Value;
|
output.Geometry.Layers[1] = splatmap1Value;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Compute world space normal vector
|
// Compute world space normal vector
|
||||||
float3x3 tangentToLocal = CalcTangentBasisFromWorldNormal(normal);
|
float3x3 tangentToLocal = CalcTangentBasisFromWorldNormal(normal);
|
||||||
float3x3 tangentToWorld = CalcTangentToWorld(WorldMatrix, tangentToLocal);
|
float3x3 tangentToWorld = CalcTangentToWorld(WorldMatrix, tangentToLocal);
|
||||||
output.WorldNormal = tangentToWorld[2];
|
output.Geometry.WorldNormal = tangentToWorld[2];
|
||||||
|
|
||||||
// Get material input params if need to evaluate any material property
|
// Get material input params if need to evaluate any material property
|
||||||
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
MaterialInput materialInput = (MaterialInput)0;
|
MaterialInput materialInput = (MaterialInput)0;
|
||||||
materialInput.WorldPosition = output.WorldPosition;
|
materialInput.WorldPosition = output.Geometry.WorldPosition;
|
||||||
materialInput.TexCoord = output.TexCoord;
|
materialInput.TexCoord = output.Geometry.TexCoord;
|
||||||
#if USE_LIGHTMAP
|
#if USE_LIGHTMAP
|
||||||
materialInput.LightmapUV = output.LightmapUV;
|
materialInput.LightmapUV = output.Geometry.LightmapUV;
|
||||||
#endif
|
#endif
|
||||||
materialInput.TBN = CalcTangentBasisFromWorldNormal(output.WorldNormal);
|
materialInput.TBN = tangentToWorld;
|
||||||
materialInput.TwoSidedSign = WorldDeterminantSign;
|
materialInput.TwoSidedSign = WorldDeterminantSign;
|
||||||
materialInput.SvPosition = output.Position;
|
materialInput.SvPosition = output.Position;
|
||||||
materialInput.PreSkinnedPosition = position;
|
materialInput.PreSkinnedPosition = position;
|
||||||
materialInput.PreSkinnedNormal = normal;
|
materialInput.PreSkinnedNormal = normal;
|
||||||
materialInput.HolesMask = output.HolesMask;
|
materialInput.HolesMask = output.Geometry.HolesMask;
|
||||||
#if USE_TERRAIN_LAYERS
|
#if USE_TERRAIN_LAYERS
|
||||||
materialInput.Layers = output.Layers;
|
materialInput.Layers = output.Geometry.Layers;
|
||||||
#endif
|
#endif
|
||||||
Material material = GetMaterialVS(materialInput);
|
Material material = GetMaterialVS(materialInput);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.WorldPosition += material.PositionOffset;
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Get tessalation multiplier (per vertex)
|
// Get tessalation multiplier (per vertex)
|
||||||
@@ -419,356 +431,9 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_TESSELLATION
|
|
||||||
|
|
||||||
// Interpolants passed from the hull shader to the domain shader
|
|
||||||
struct TessalationHSToDS
|
|
||||||
{
|
|
||||||
float4 Position : SV_Position;
|
|
||||||
float3 WorldPosition : TEXCOORD0;
|
|
||||||
float2 TexCoord : TEXCOORD1;
|
|
||||||
float2 LightmapUV : TEXCOORD2;
|
|
||||||
float3 WorldNormal : TEXCOORD3;
|
|
||||||
float HolesMask : TEXCOORD4;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
|
||||||
#endif
|
|
||||||
float TessellationMultiplier : TESS;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Interpolants passed from the domain shader and to the pixel shader
|
|
||||||
struct TessalationDSToPS
|
|
||||||
{
|
|
||||||
float4 Position : SV_Position;
|
|
||||||
float3 WorldPosition : TEXCOORD0;
|
|
||||||
float2 TexCoord : TEXCOORD1;
|
|
||||||
float2 LightmapUV : TEXCOORD2;
|
|
||||||
float3 WorldNormal : TEXCOORD3;
|
|
||||||
float HolesMask : TEXCOORD4;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
MaterialInput GetMaterialInput(TessalationDSToPS input)
|
|
||||||
{
|
|
||||||
MaterialInput result = (MaterialInput)0;
|
|
||||||
result.WorldPosition = input.WorldPosition;
|
|
||||||
result.TexCoord = input.TexCoord;
|
|
||||||
#if USE_LIGHTMAP
|
|
||||||
result.LightmapUV = input.LightmapUV;
|
|
||||||
#endif
|
|
||||||
result.TBN = CalcTangentBasisFromWorldNormal(input.WorldNormal);
|
|
||||||
result.TwoSidedSign = WorldDeterminantSign;
|
|
||||||
result.SvPosition = input.Position;
|
|
||||||
result.HolesMask = input.HolesMask;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
result.Layers = input.Layers;
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
|
||||||
result.CustomVSToPS = input.CustomVSToPS;
|
|
||||||
#endif
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct TessalationPatch
|
|
||||||
{
|
|
||||||
float EdgeTessFactor[3] : SV_TessFactor;
|
|
||||||
float InsideTessFactor : SV_InsideTessFactor;
|
|
||||||
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
|
||||||
float3 B210 : POSITION4;
|
|
||||||
float3 B120 : POSITION5;
|
|
||||||
float3 B021 : POSITION6;
|
|
||||||
float3 B012 : POSITION7;
|
|
||||||
float3 B102 : POSITION8;
|
|
||||||
float3 B201 : POSITION9;
|
|
||||||
float3 B111 : CENTER;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
TessalationPatch HS_PatchConstant(InputPatch<VertexOutput, 3> input)
|
|
||||||
{
|
|
||||||
TessalationPatch output;
|
|
||||||
|
|
||||||
// Average tess factors along edges, and pick an edge tess factor for the interior tessellation
|
|
||||||
float4 TessellationMultipliers;
|
|
||||||
TessellationMultipliers.x = 0.5f * (input[1].TessellationMultiplier + input[2].TessellationMultiplier);
|
|
||||||
TessellationMultipliers.y = 0.5f * (input[2].TessellationMultiplier + input[0].TessellationMultiplier);
|
|
||||||
TessellationMultipliers.z = 0.5f * (input[0].TessellationMultiplier + input[1].TessellationMultiplier);
|
|
||||||
TessellationMultipliers.w = 0.333f * (input[0].TessellationMultiplier + input[1].TessellationMultiplier + input[2].TessellationMultiplier);
|
|
||||||
|
|
||||||
TessellationMultipliers = clamp(TessellationMultipliers, 1, MAX_TESSELLATION_FACTOR);
|
|
||||||
|
|
||||||
output.EdgeTessFactor[0] = TessellationMultipliers.x; // 1->2 edge
|
|
||||||
output.EdgeTessFactor[1] = TessellationMultipliers.y; // 2->0 edge
|
|
||||||
output.EdgeTessFactor[2] = TessellationMultipliers.z; // 0->1 edge
|
|
||||||
output.InsideTessFactor = TessellationMultipliers.w;
|
|
||||||
|
|
||||||
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
|
||||||
// Calculate PN-Triangle coefficients
|
|
||||||
// Refer to Vlachos 2001 for the original formula
|
|
||||||
float3 p1 = input[0].WorldPosition;
|
|
||||||
float3 p2 = input[1].WorldPosition;
|
|
||||||
float3 p3 = input[2].WorldPosition;
|
|
||||||
float3 n1 = input[0].WorldNormal;
|
|
||||||
float3 n2 = input[1].WorldNormal;
|
|
||||||
float3 n3 = input[2].WorldNormal;
|
|
||||||
|
|
||||||
// Calculate control points
|
|
||||||
output.B210 = (2.0f * p1 + p2 - dot((p2 - p1), n1) * n1) / 3.0f;
|
|
||||||
output.B120 = (2.0f * p2 + p1 - dot((p1 - p2), n2) * n2) / 3.0f;
|
|
||||||
output.B021 = (2.0f * p2 + p3 - dot((p3 - p2), n2) * n2) / 3.0f;
|
|
||||||
output.B012 = (2.0f * p3 + p2 - dot((p2 - p3), n3) * n3) / 3.0f;
|
|
||||||
output.B102 = (2.0f * p3 + p1 - dot((p1 - p3), n3) * n3) / 3.0f;
|
|
||||||
output.B201 = (2.0f * p1 + p3 - dot((p3 - p1), n1) * n1) / 3.0f;
|
|
||||||
float3 e = (output.B210 + output.B120 + output.B021 +
|
|
||||||
output.B012 + output.B102 + output.B201) / 6.0f;
|
|
||||||
float3 v = (p1 + p2 + p3) / 3.0f;
|
|
||||||
output.B111 = e + ((e - v) / 2.0f);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
META_HS(USE_TESSELLATION, FEATURE_LEVEL_SM5)
|
|
||||||
META_HS_PATCH(TESSELLATION_IN_CONTROL_POINTS)
|
|
||||||
[domain("tri")]
|
|
||||||
[partitioning("fractional_odd")]
|
|
||||||
[outputtopology("triangle_cw")]
|
|
||||||
[maxtessfactor(MAX_TESSELLATION_FACTOR)]
|
|
||||||
[outputcontrolpoints(3)]
|
|
||||||
[patchconstantfunc("HS_PatchConstant")]
|
|
||||||
TessalationHSToDS HS(InputPatch<VertexOutput, TESSELLATION_IN_CONTROL_POINTS> input, uint ControlPointID : SV_OutputControlPointID)
|
|
||||||
{
|
|
||||||
TessalationHSToDS output;
|
|
||||||
|
|
||||||
// Pass through shader
|
|
||||||
#define COPY(thing) output.thing = input[ControlPointID].thing;
|
|
||||||
COPY(Position);
|
|
||||||
COPY(WorldPosition);
|
|
||||||
COPY(TexCoord);
|
|
||||||
COPY(LightmapUV);
|
|
||||||
COPY(WorldNormal);
|
|
||||||
COPY(HolesMask);
|
|
||||||
COPY(TessellationMultiplier);
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
COPY(Layers);
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
|
||||||
COPY(CustomVSToPS);
|
|
||||||
#endif
|
|
||||||
#undef COPY
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PHONG
|
|
||||||
|
|
||||||
// Orthogonal projection on to plane
|
|
||||||
float3 ProjectOntoPlane(float3 planeNormal, float3 planePoint, float3 pointToProject)
|
|
||||||
{
|
|
||||||
return pointToProject - dot(pointToProject-planePoint, planeNormal) * planeNormal;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
META_DS(USE_TESSELLATION, FEATURE_LEVEL_SM5)
|
|
||||||
[domain("tri")]
|
|
||||||
TessalationDSToPS DS(TessalationPatch constantData, float3 barycentricCoords : SV_DomainLocation, const OutputPatch<TessalationHSToDS, 3> input)
|
|
||||||
{
|
|
||||||
TessalationDSToPS output;
|
|
||||||
|
|
||||||
// Get the barycentric coords
|
|
||||||
float U = barycentricCoords.x;
|
|
||||||
float V = barycentricCoords.y;
|
|
||||||
float W = barycentricCoords.z;
|
|
||||||
|
|
||||||
// Interpolate patch attributes to generated vertices
|
|
||||||
#define INTERPOLATE(thing) output.thing = U * input[0].thing + V * input[1].thing + W * input[2].thing
|
|
||||||
#define COPY(thing) output.thing = input[0].thing
|
|
||||||
INTERPOLATE(Position);
|
|
||||||
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PN
|
|
||||||
float UU = U * U;
|
|
||||||
float VV = V * V;
|
|
||||||
float WW = W * W;
|
|
||||||
float UU3 = UU * 3.0f;
|
|
||||||
float VV3 = VV * 3.0f;
|
|
||||||
float WW3 = WW * 3.0f;
|
|
||||||
|
|
||||||
// Interpolate using barycentric coordinates and PN Triangle control points
|
|
||||||
output.WorldPosition =
|
|
||||||
input[0].WorldPosition * UU * U +
|
|
||||||
input[1].WorldPosition * VV * V +
|
|
||||||
input[2].WorldPosition * WW * W +
|
|
||||||
constantData.B210 * UU3 * V +
|
|
||||||
constantData.B120 * VV3 * U +
|
|
||||||
constantData.B021 * VV3 * W +
|
|
||||||
constantData.B012 * WW3 * V +
|
|
||||||
constantData.B102 * WW3 * U +
|
|
||||||
constantData.B201 * UU3 * W +
|
|
||||||
constantData.B111 * 6.0f * W * U * V;
|
|
||||||
#else
|
|
||||||
INTERPOLATE(WorldPosition);
|
|
||||||
#endif
|
|
||||||
INTERPOLATE(TexCoord);
|
|
||||||
INTERPOLATE(LightmapUV);
|
|
||||||
INTERPOLATE(WorldNormal);
|
|
||||||
INTERPOLATE(HolesMask);
|
|
||||||
#if USE_TERRAIN_LAYERS
|
|
||||||
UNROLL
|
|
||||||
for (int i = 0; i < TERRAIN_LAYERS_DATA_SIZE; i++)
|
|
||||||
{
|
|
||||||
INTERPOLATE(Layers[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
|
||||||
UNROLL
|
|
||||||
for (int i = 0; i < CUSTOM_VERTEX_INTERPOLATORS_COUNT; i++)
|
|
||||||
{
|
|
||||||
INTERPOLATE(CustomVSToPS[i]);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#undef INTERPOLATE
|
|
||||||
#undef COPY
|
|
||||||
|
|
||||||
// Interpolating normal can unnormalize it, so normalize it
|
|
||||||
output.WorldNormal = normalize(output.WorldNormal);
|
|
||||||
|
|
||||||
#if MATERIAL_TESSELLATION == MATERIAL_TESSELLATION_PHONG
|
|
||||||
// Orthogonal projection in the tangent planes
|
|
||||||
float3 posProjectedU = ProjectOntoPlane(input[0].WorldNormal, input[0].WorldPosition, output.WorldPosition);
|
|
||||||
float3 posProjectedV = ProjectOntoPlane(input[1].WorldNormal, input[1].WorldPosition, output.WorldPosition);
|
|
||||||
float3 posProjectedW = ProjectOntoPlane(input[2].WorldNormal, input[2].WorldPosition, output.WorldPosition);
|
|
||||||
|
|
||||||
// Interpolate the projected points
|
|
||||||
output.WorldPosition = U * posProjectedU + V * posProjectedV + W * posProjectedW;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Perform displacement mapping
|
|
||||||
#if USE_DISPLACEMENT
|
|
||||||
MaterialInput materialInput = GetMaterialInput(output);
|
|
||||||
Material material = GetMaterialDS(materialInput);
|
|
||||||
output.WorldPosition += material.WorldDisplacement;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Recalculate the clip space position
|
|
||||||
output.Position = mul(float4(output.WorldPosition, 1), ViewProjectionMatrix);
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_LIGHTMAP
|
|
||||||
|
|
||||||
float3 SampleLightmap(Material material, MaterialInput materialInput)
|
|
||||||
{
|
|
||||||
// Sample lightmaps
|
|
||||||
float4 lightmap0 = Lightmap0.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
|
||||||
float4 lightmap1 = Lightmap1.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
|
||||||
float4 lightmap2 = Lightmap2.Sample(SamplerLinearClamp, materialInput.LightmapUV);
|
|
||||||
|
|
||||||
// Unpack H-basis
|
|
||||||
float3 h0 = float3(lightmap0.x, lightmap1.x, lightmap2.x);
|
|
||||||
float3 h1 = float3(lightmap0.y, lightmap1.y, lightmap2.y);
|
|
||||||
float3 h2 = float3(lightmap0.z, lightmap1.z, lightmap2.z);
|
|
||||||
float3 h3 = float3(lightmap0.w, lightmap1.w, lightmap2.w);
|
|
||||||
|
|
||||||
// Sample baked diffuse irradiance from the H-basis coefficients
|
|
||||||
float3 normal = material.TangentNormal;
|
|
||||||
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
|
||||||
normal *= material.TangentNormal;
|
|
||||||
#endif
|
|
||||||
return GetHBasisIrradiance(normal, h0, h1, h2, h3) / PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Pixel Shader function for GBuffer Pass
|
|
||||||
META_PS(true, FEATURE_LEVEL_ES2)
|
|
||||||
META_PERMUTATION_1(USE_LIGHTMAP=0)
|
|
||||||
META_PERMUTATION_1(USE_LIGHTMAP=1)
|
|
||||||
void PS_GBuffer(
|
|
||||||
in PixelInput input
|
|
||||||
,out float4 Light : SV_Target0
|
|
||||||
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
|
||||||
,out float4 RT0 : SV_Target1
|
|
||||||
,out float4 RT1 : SV_Target2
|
|
||||||
,out float4 RT2 : SV_Target3
|
|
||||||
#if USE_GBUFFER_CUSTOM_DATA
|
|
||||||
,out float4 RT3 : SV_Target4
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
|
||||||
Light = 0;
|
|
||||||
|
|
||||||
// Get material parameters
|
|
||||||
MaterialInput materialInput = GetMaterialInput(input);
|
|
||||||
Material material = GetMaterialPS(materialInput);
|
|
||||||
|
|
||||||
// Masking
|
|
||||||
#if MATERIAL_MASKED
|
|
||||||
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_LIGHTMAP
|
|
||||||
|
|
||||||
float3 diffuseColor = GetDiffuseColor(material.Color, material.Metalness);
|
|
||||||
float3 specularColor = GetSpecularColor(material.Color, material.Specular, material.Metalness);
|
|
||||||
|
|
||||||
// Sample lightmap
|
|
||||||
float3 diffuseIndirectLighting = SampleLightmap(material, materialInput);
|
|
||||||
|
|
||||||
// Apply static indirect light
|
|
||||||
Light.rgb = diffuseColor * diffuseIndirectLighting * AOMultiBounce(material.AO, diffuseColor);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
|
||||||
|
|
||||||
// Pack material properties to GBuffer
|
|
||||||
RT0 = float4(material.Color, material.AO);
|
|
||||||
RT1 = float4(material.WorldNormal * 0.5 + 0.5, MATERIAL_SHADING_MODEL * (1.0 / 3.0));
|
|
||||||
RT2 = float4(material.Roughness, material.Metalness, material.Specular, 0);
|
|
||||||
|
|
||||||
// Custom data
|
|
||||||
#if USE_GBUFFER_CUSTOM_DATA
|
|
||||||
#if MATERIAL_SHADING_MODEL == SHADING_MODEL_SUBSURFACE
|
|
||||||
RT3 = float4(material.SubsurfaceColor, material.Opacity);
|
|
||||||
#elif MATERIAL_SHADING_MODEL == SHADING_MODEL_FOLIAGE
|
|
||||||
RT3 = float4(material.SubsurfaceColor, material.Opacity);
|
|
||||||
#else
|
|
||||||
RT3 = float4(0, 0, 0, 0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Add light emission
|
|
||||||
#if USE_EMISSIVE
|
|
||||||
Light.rgb += material.Emissive;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Handle blending as faked forward pass (use Light buffer and skip GBuffer modification)
|
|
||||||
Light = float4(material.Emissive, material.Opacity);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pixel Shader function for Depth Pass
|
// Pixel Shader function for Depth Pass
|
||||||
META_PS(true, FEATURE_LEVEL_ES2)
|
META_PS(true, FEATURE_LEVEL_ES2)
|
||||||
void PS_Depth(PixelInput input
|
void PS_Depth(PixelInput input)
|
||||||
#if GLSL
|
|
||||||
, out float4 OutColor : SV_Target0
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
#if MATERIAL_MASKED
|
#if MATERIAL_MASKED
|
||||||
// Perform per pixel clipping if material requries it
|
// Perform per pixel clipping if material requries it
|
||||||
@@ -776,8 +441,20 @@ void PS_Depth(PixelInput input
|
|||||||
Material material = GetMaterialPS(materialInput);
|
Material material = GetMaterialPS(materialInput);
|
||||||
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if GLSL
|
|
||||||
OutColor = 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if _PS_QuadOverdraw
|
||||||
|
|
||||||
|
#include "./Flax/Editor/QuadOverdraw.hlsl"
|
||||||
|
|
||||||
|
// Pixel Shader function for Quad Overdraw Pass (editor-only)
|
||||||
|
[earlydepthstencil]
|
||||||
|
META_PS(USE_EDITOR, FEATURE_LEVEL_SM5)
|
||||||
|
void PS_QuadOverdraw(float4 svPos : SV_Position, uint primId : SV_PrimitiveID)
|
||||||
|
{
|
||||||
|
DoQuadOverdraw(svPos, primId);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@9
|
||||||
|
|||||||
@@ -0,0 +1,239 @@
|
|||||||
|
// File generated by Flax Materials Editor
|
||||||
|
// Version: @0
|
||||||
|
|
||||||
|
#define MATERIAL 1
|
||||||
|
#define USE_PER_VIEW_CONSTANTS 1
|
||||||
|
@3
|
||||||
|
|
||||||
|
#include "./Flax/Common.hlsl"
|
||||||
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
|
@7
|
||||||
|
|
||||||
|
// Primary constant buffer (with additional material parameters)
|
||||||
|
META_CB_BEGIN(0, Data)
|
||||||
|
float4x4 InverseViewProjectionMatrix;
|
||||||
|
float4x4 WorldMatrix;
|
||||||
|
float4x4 WorldMatrixInverseTransposed;
|
||||||
|
float3 GridSize;
|
||||||
|
float PerInstanceRandom;
|
||||||
|
float Dummy0;
|
||||||
|
float VolumetricFogMaxDistance;
|
||||||
|
int ParticleStride;
|
||||||
|
int ParticleIndex;
|
||||||
|
@1META_CB_END
|
||||||
|
|
||||||
|
// Particles attributes buffer
|
||||||
|
ByteAddressBuffer ParticlesData : register(t0);
|
||||||
|
|
||||||
|
// Shader resources
|
||||||
|
@2
|
||||||
|
// Material properties generation input
|
||||||
|
struct MaterialInput
|
||||||
|
{
|
||||||
|
float3 WorldPosition;
|
||||||
|
float TwoSidedSign;
|
||||||
|
float2 TexCoord;
|
||||||
|
uint ParticleIndex;
|
||||||
|
#if USE_VERTEX_COLOR
|
||||||
|
half4 VertexColor;
|
||||||
|
#endif
|
||||||
|
float3x3 TBN;
|
||||||
|
float4 SvPosition;
|
||||||
|
float3 PreSkinnedPosition;
|
||||||
|
float3 PreSkinnedNormal;
|
||||||
|
float3 InstanceOrigin;
|
||||||
|
float InstanceParams;
|
||||||
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#define GetInstanceTransform(input) WorldMatrix;
|
||||||
|
|
||||||
|
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
||||||
|
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||||
|
{
|
||||||
|
// Extract per axis scales from localToWorld transform
|
||||||
|
float scaleX = length(localToWorld[0]);
|
||||||
|
float scaleY = length(localToWorld[1]);
|
||||||
|
float scaleZ = length(localToWorld[2]);
|
||||||
|
float3 invScale = float3(
|
||||||
|
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
|
||||||
|
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
|
||||||
|
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);
|
||||||
|
localToWorld[0] *= invScale.x;
|
||||||
|
localToWorld[1] *= invScale.y;
|
||||||
|
localToWorld[2] *= invScale.z;
|
||||||
|
return localToWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from tangent space to world space
|
||||||
|
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
||||||
|
{
|
||||||
|
return mul(tangentVector, input.TBN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to tangent space
|
||||||
|
float3 TransformWorldVectorToTangent(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(input.TBN, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from world space to view space
|
||||||
|
float3 TransformWorldVectorToView(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
return mul(worldVector, (float3x3)ViewMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from view space to world space
|
||||||
|
float3 TransformViewVectorToWorld(MaterialInput input, float3 viewVector)
|
||||||
|
{
|
||||||
|
return mul((float3x3)ViewMatrix, viewVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformLocalVectorToWorld(MaterialInput input, float3 localVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)GetInstanceTransform(input);
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localVector, localToWorld);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transforms a vector from local space to world space
|
||||||
|
float3 TransformWorldVectorToLocal(MaterialInput input, float3 worldVector)
|
||||||
|
{
|
||||||
|
float3x3 localToWorld = (float3x3)GetInstanceTransform(input);
|
||||||
|
//localToWorld = RemoveScaleFromLocalToWorld(localToWorld);
|
||||||
|
return mul(localToWorld, worldVector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object position (supports instancing)
|
||||||
|
float3 GetObjectPosition(MaterialInput input)
|
||||||
|
{
|
||||||
|
return input.InstanceOrigin.xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the current object size
|
||||||
|
float3 GetObjectSize(MaterialInput input)
|
||||||
|
{
|
||||||
|
return float3(1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object random value (supports instancing)
|
||||||
|
float GetPerInstanceRandom(MaterialInput input)
|
||||||
|
{
|
||||||
|
return input.InstanceParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the current object LOD transition dither factor (supports instancing)
|
||||||
|
float GetLODDitherFactor(MaterialInput input)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gets the interpolated vertex color (in linear space)
|
||||||
|
float4 GetVertexColor(MaterialInput input)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint GetParticleUint(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return ParticlesData.Load(particleIndex * ParticleStride + offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetParticleInt(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return asint(ParticlesData.Load(particleIndex * ParticleStride + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
float GetParticleFloat(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return asfloat(ParticlesData.Load(particleIndex * ParticleStride + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
float2 GetParticleVec2(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return asfloat(ParticlesData.Load2(particleIndex * ParticleStride + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 GetParticleVec3(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return asfloat(ParticlesData.Load3(particleIndex * ParticleStride + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
float4 GetParticleVec4(uint particleIndex, int offset)
|
||||||
|
{
|
||||||
|
return asfloat(ParticlesData.Load4(particleIndex * ParticleStride + offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 TransformParticlePosition(float3 input)
|
||||||
|
{
|
||||||
|
return mul(float4(input, 1.0f), WorldMatrix).xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 TransformParticleVector(float3 input)
|
||||||
|
{
|
||||||
|
return mul(float4(input, 0.0f), WorldMatrixInverseTransposed).xyz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@8
|
||||||
|
|
||||||
|
// Get material properties function (for vertex shader)
|
||||||
|
Material GetMaterialVS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@5
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for domain shader)
|
||||||
|
Material GetMaterialDS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@6
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get material properties function (for pixel shader)
|
||||||
|
Material GetMaterialPS(MaterialInput input)
|
||||||
|
{
|
||||||
|
@4
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel Shader function for Volumetric Fog material injection (local fog)
|
||||||
|
META_PS(true, FEATURE_LEVEL_SM5)
|
||||||
|
void PS_VolumetricFog(Quad_GS2PS input, out float4 VBufferA : SV_Target0, out float4 VBufferB : SV_Target1)
|
||||||
|
{
|
||||||
|
uint3 gridCoordinate = uint3(input.Vertex.Position.xy, input.LayerIndex);
|
||||||
|
float3 cellOffset = 0.5f;
|
||||||
|
float2 volumeUV = (gridCoordinate.xy + cellOffset.xy) / GridSize.xy;
|
||||||
|
float zSlice = gridCoordinate.z + cellOffset.z;
|
||||||
|
float sceneDepth = (zSlice / GridSize.z) * VolumetricFogMaxDistance / ViewFar;
|
||||||
|
float deviceDepth = (ViewInfo.w / sceneDepth) + ViewInfo.z;
|
||||||
|
float4 clipPos = float4(volumeUV * float2(2.0, -2.0) + float2(-1.0, 1.0), deviceDepth, 1.0);
|
||||||
|
float4 wsPos = mul(clipPos, InverseViewProjectionMatrix);
|
||||||
|
float3 positionWS = wsPos.xyz / wsPos.w;
|
||||||
|
|
||||||
|
// Get material parameters
|
||||||
|
MaterialInput materialInput = (MaterialInput)0;
|
||||||
|
materialInput.WorldPosition = positionWS;
|
||||||
|
materialInput.TexCoord = input.Vertex.TexCoord;
|
||||||
|
materialInput.ParticleIndex = ParticleIndex;
|
||||||
|
materialInput.TBN = float3x3(float3(1, 0, 0), float3(0, 1, 0), float3(0, 0, 1));
|
||||||
|
materialInput.TwoSidedSign = 1.0f;
|
||||||
|
materialInput.InstanceOrigin = WorldMatrix[3].xyz;
|
||||||
|
materialInput.InstanceParams = PerInstanceRandom;
|
||||||
|
materialInput.SvPosition = clipPos;
|
||||||
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
|
// Compute fog properties
|
||||||
|
float3 albedo = material.Color;
|
||||||
|
float extinction = material.Opacity * material.Mask * 0.001f;
|
||||||
|
float3 emission = material.Emissive;
|
||||||
|
float3 scattering = albedo * extinction;
|
||||||
|
float absorption = max(0.0f, extinction - Luminance(scattering));
|
||||||
|
|
||||||
|
// Write fog properties
|
||||||
|
VBufferA = float4(scattering, absorption);
|
||||||
|
VBufferB = float4(emission, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@9
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,22 @@
|
|||||||
|
%copyright%#pragma once
|
||||||
|
|
||||||
|
#include "Engine/Core/ISerializable.h"
|
||||||
|
#include "Engine/Core/Types/BaseTypes.h"
|
||||||
|
#include "Engine/Content/Assets/Model.h"
|
||||||
|
#include "Engine/Scripting/ScriptingType.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// %class% Json Asset.
|
||||||
|
/// </summary>
|
||||||
|
API_CLASS() class %module%%class% : public ISerializable
|
||||||
|
{
|
||||||
|
API_AUTO_SERIALIZATION();
|
||||||
|
DECLARE_SCRIPTING_TYPE_NO_SPAWN(%class%);
|
||||||
|
public:
|
||||||
|
// Custom float value.
|
||||||
|
API_FIELD(Attributes = "Range(0, 20), EditorOrder(0), EditorDisplay(\"Data\")")
|
||||||
|
float FloatValue = 20.0f;
|
||||||
|
// Custom vector data.
|
||||||
|
API_FIELD(Attributes = "EditorOrder(1), EditorDisplay(\"Data\")")
|
||||||
|
Vector3 Vector3Value = Vector3(0.1f);
|
||||||
|
};
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
%copyright%#include "%filename%.h"
|
||||||
|
#include "Engine/Core/Log.h"
|
||||||
|
|
||||||
|
void %class%::RunNativeAction(Vector4 data)
|
||||||
|
{
|
||||||
|
LOG(Warning, "Data in RunNativeAction: {0}", data);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
%copyright%#pragma once
|
||||||
|
|
||||||
|
#include "Engine/Scripting/Script.h"
|
||||||
|
#include "Engine/Core/Math/Vector4.h"
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// %class% Function Library
|
||||||
|
/// </summary>
|
||||||
|
API_CLASS(Static) class %module%%class%
|
||||||
|
{
|
||||||
|
DECLARE_SCRIPTING_TYPE_MINIMAL(%class%);
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Logs the function parameter natively.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">Data to pass to native code</param>
|
||||||
|
API_FUNCTION() static void RunNativeAction(Vector4 data);
|
||||||
|
};
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
%copyright%
|
%copyright%#include "%filename%.h"
|
||||||
#include "%filename%.h"
|
|
||||||
|
|
||||||
%class%::%class%(const SpawnParams& params)
|
%class%::%class%(const SpawnParams& params)
|
||||||
: Script(params)
|
: Script(params)
|
||||||
|
|||||||
@@ -4,23 +4,30 @@ using FlaxEngine;
|
|||||||
|
|
||||||
namespace %namespace%
|
namespace %namespace%
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// %class% Script.
|
||||||
|
/// </summary>
|
||||||
public class %class% : Script
|
public class %class% : Script
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void OnStart()
|
public override void OnStart()
|
||||||
{
|
{
|
||||||
// Here you can add code that needs to be called when script is created, just before the first game update
|
// Here you can add code that needs to be called when script is created, just before the first game update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void OnEnable()
|
public override void OnEnable()
|
||||||
{
|
{
|
||||||
// Here you can add code that needs to be called when script is enabled (eg. register for events)
|
// Here you can add code that needs to be called when script is enabled (eg. register for events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void OnDisable()
|
public override void OnDisable()
|
||||||
{
|
{
|
||||||
// Here you can add code that needs to be called when script is disabled (eg. unregister from events)
|
// Here you can add code that needs to be called when script is disabled (eg. unregister from events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
public override void OnUpdate()
|
public override void OnUpdate()
|
||||||
{
|
{
|
||||||
// Here you can add code that needs to be called every frame
|
// Here you can add code that needs to be called every frame
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
%copyright%
|
%copyright%#pragma once
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Engine/Scripting/Script.h"
|
#include "Engine/Scripting/Script.h"
|
||||||
|
|
||||||
API_CLASS() class %module%%class% : public Script
|
API_CLASS() class %module%%class% : public Script
|
||||||
{
|
{
|
||||||
|
API_AUTO_SERIALIZATION();
|
||||||
DECLARE_SCRIPTING_TYPE(%class%);
|
DECLARE_SCRIPTING_TYPE(%class%);
|
||||||
|
|
||||||
// [Script]
|
// [Script]
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user