Compare commits
2375 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c328d2b559 | |||
| 65747c9ddf | |||
| 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 | |||
| 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 | |||
| 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 | |||
| f15f7ff59f | |||
| 0d0279a1f8 | |||
| bb8a6e5c8d | |||
| beecbffdc3 | |||
| 06f07c2903 | |||
| 164da0f87a | |||
| a250a23259 | |||
| 50f6a01f83 | |||
| bd18286fbd | |||
| aedc619009 | |||
| a226ff8762 | |||
| a1cee0f0bf | |||
| bb84ad0f79 | |||
| 0de380ad3a | |||
| 4b11725226 | |||
| 971ab7b8e7 | |||
| b57ce2bd56 | |||
| 876a728b41 | |||
| b411539717 | |||
| 4cb5574a2e | |||
| 1aceab3783 | |||
| c583b6a1a7 | |||
| 3c3b47f5b4 | |||
| 36bd398136 | |||
| c820e87d4a | |||
| f00ae7fb21 | |||
| 18e3d51914 | |||
| 7c85ac61b8 | |||
| 9cdbbf590a | |||
| bd93e46624 | |||
| f0c7fbb0cf | |||
| 560b6cf5da | |||
| c0e8b735ad | |||
| 5a402df3ff | |||
| 691d9d9b88 | |||
| 81865bd97e | |||
| 80e0b0b0e5 | |||
| da3a54d184 | |||
| 3dc6afef62 | |||
| 590fcebaec | |||
| 37e3a85080 | |||
| fd96957819 | |||
| d0c0259ee2 | |||
| 53601d8a85 | |||
| 1d19d38c38 | |||
| cd2ae08da0 | |||
| a876e56339 | |||
| 1925fe5724 | |||
| c8b0773661 | |||
| f1763840c9 | |||
| bbeab83b29 | |||
| cb8ba2d757 | |||
| 1679458094 | |||
| c9992ef7d0 | |||
| 02dde50071 | |||
| 854d0147dd | |||
| 59858ecb27 | |||
| 269f1fc8c1 | |||
| 4330eb5e4a | |||
| 5f85e9ae96 | |||
| 09049990bd | |||
| 674d1fbcc5 | |||
| db17c80e0a | |||
| 62b3f7c9c2 | |||
| 96e5e20e66 | |||
| 254bdacc73 | |||
| 0c68cd8a10 | |||
| c20f0fa430 | |||
| 54b9eaa969 | |||
| aaac0aec96 | |||
| af1dfc0d08 | |||
| 15d24308e8 | |||
| 8ac0e7491a | |||
| 2bcbf23bca | |||
| 01a3a80103 | |||
| 2119075240 | |||
| 1df47bd8c5 | |||
| a51d47a4bb | |||
| 1b2dd0aff5 | |||
| ecb20afaa4 | |||
| 45ba154877 | |||
| 51a2c1e868 | |||
| 8180877269 | |||
| aa2eeb8243 | |||
| 937248794a | |||
| b674aae970 | |||
| dda5f26d89 | |||
| 023cdced0a | |||
| 054aa18e31 | |||
| b6fe228b85 | |||
| c703064add | |||
| 4be7e2ad46 | |||
| 5260efc7b8 | |||
| 44d636520b | |||
| c5934e0dfe | |||
| 571c802d49 | |||
| d098c6cee7 | |||
| 31e53d5efa | |||
| ca32d0d825 | |||
| 5b4dbfa121 | |||
| 602fb44a23 | |||
| 5845bc3fca | |||
| f331191e3d | |||
| 029d9acaa2 | |||
| bbabd09983 | |||
| 67a8246077 | |||
| 330a588260 | |||
| 8e2a8c045c | |||
| a32658beea | |||
| c2af9164d6 | |||
| 27a62f4411 | |||
| 6dd699cbab | |||
| 206461e80e | |||
| 5bc1773dc5 | |||
| baa273f589 | |||
| dae366f04c | |||
| c0c2da34d7 | |||
| 075b049bb1 | |||
| fe78fa7575 | |||
| ee166bafed | |||
| 6ef65734cd | |||
| f6085c7479 | |||
| ad621b824a | |||
| 6e193d4d0d | |||
| f714afc180 | |||
| f6065c4463 | |||
| 1824715626 | |||
| b59008182f | |||
| e99c4abe5e | |||
| f9ba789af3 | |||
| 6f0a556af8 | |||
| bcb38dc2ca | |||
| 3a33d6ff84 | |||
| cb0518d75a | |||
| 31ae464d93 | |||
| 8ff12d079c | |||
| 1969854ed0 | |||
| 4c05f8a222 | |||
| 6313c8520c | |||
| f1819ee35c | |||
| 2563409e6f | |||
| f64eead2d7 | |||
| 67b0e0410c | |||
| 6a6e7195f5 | |||
| b04e1381dc | |||
| 47bff456e0 | |||
| 7de56304c8 | |||
| 843a04604d | |||
| 018e751bf6 | |||
| b4f791e0ca | |||
| 9b2c940896 | |||
| 4457bcf4a7 | |||
| 3ab54bd7e1 | |||
| 9b300fe074 | |||
| 86b5fa9321 | |||
| 261aeb9245 | |||
| b3388d6fc7 | |||
| c9bab2c521 | |||
| 4a71fe6727 | |||
| 3250ca9fad | |||
| c9655eee8f | |||
| 54da2c8de0 | |||
| 3c1a69eb6f | |||
| a60e1ab8bb | |||
| bf147ba13a | |||
| 9674f276d3 | |||
| c53fe681f5 | |||
| 125b4347da | |||
| aa97296123 | |||
| d76c167ad9 | |||
| 71110c9f29 | |||
| 54e544a0f2 | |||
| f3f25836e2 | |||
| 1a51752ca4 | |||
| 8c6dbf2e30 | |||
| d901c11570 | |||
| b208b7066b | |||
| 83ceb31967 | |||
| 049450e31b | |||
| e4fced44a9 | |||
| 19c65bec33 | |||
| 0db0fb24c9 | |||
| 704d42869d | |||
| 236a5a2f6f | |||
| 6cbeac6537 | |||
| cbbfb16628 | |||
| 4042d466d3 | |||
| c2f745397a | |||
| a4763f630e | |||
| 178f0b9e3a | |||
| d93a2803cc | |||
| 57d7508e25 | |||
| 8680aba897 | |||
| 8dce3c0fb7 | |||
| f236338311 | |||
| 0b1ac3d0fe | |||
| ec4ccaeba5 | |||
| 214ae3c440 | |||
| ef5e98efaa | |||
| ea489fbf2a | |||
| 9ae79b8307 | |||
| f8bf87e0b1 | |||
| 75d197cb84 | |||
| 6b5ce8c6e2 | |||
| db6a02e20f | |||
| 0a0c856a64 | |||
| bd7a681700 | |||
| c4e6d013c1 | |||
| d17d93c8a5 | |||
| 6caffdc23f | |||
| 99b011df8b | |||
| c02faf51a0 | |||
| ef240ce986 | |||
| e58332723a | |||
| 81daaf663b | |||
| a9e4d6d908 | |||
| 5f7f53304d | |||
| 3e0b753498 | |||
| 4bd76b70f2 | |||
| d19c31555b | |||
| e0f1f18998 | |||
| f80c33f381 | |||
| 2bfcc15f66 | |||
| fdc8e371c4 | |||
| ba050b9eaa | |||
| c1216a4318 | |||
| 2ae78b9afd | |||
| f33a2d8fe5 | |||
| 1943de62e9 | |||
| fcc4b371b9 | |||
| 837174582b | |||
| 6b0d34a21d | |||
| 50f87c8bfb | |||
| edb103f8e7 | |||
| 8fd0af3f39 | |||
| 4db3c6ca71 | |||
| aa4ecab271 | |||
| 3356013858 | |||
| 8003055ba6 | |||
| c112274666 | |||
| 01a30faa62 | |||
| 070faf12da | |||
| 65d3883f03 | |||
| 2c2c1af97f | |||
| f80f7cdd33 | |||
| b76d5d34ea | |||
| d7949b5405 | |||
| f8624ae768 | |||
| 98d272a903 | |||
| 00c40e279c | |||
| 7835259a83 | |||
| 93aa265b20 | |||
| 8e44e6b23c | |||
| 437018e614 | |||
| 75c3388c00 | |||
| 31dd5b852e | |||
| 6649f0d4c2 | |||
| 604c583c36 | |||
| b2a2652b56 | |||
| af692605ab | |||
| d1a282e228 | |||
| 88bddfb141 | |||
| 29c3e2d54b | |||
| 27ed23c1b9 | |||
| 9e3c413c91 | |||
| fd6158e1a9 | |||
| 932de300e4 | |||
| 783b910700 | |||
| a3fa8ff9f0 | |||
| 259c419c36 | |||
| d7696c4765 | |||
| 89f25516fc | |||
| fd268f4e15 | |||
| dba43c4e9f | |||
| eaba489ba2 | |||
| 40c7fe3f77 | |||
| a6d5fb318a | |||
| d20cbf434f | |||
| 5679d86683 | |||
| 45211fa61c | |||
| 6252c111b4 | |||
| ab4195ab6c | |||
| 1d2e2e5575 | |||
| 7de0010772 | |||
| ebe0b9c8c9 | |||
| fa3b2af0ca | |||
| b446790438 | |||
| 7ddf98abaa | |||
| fb84aa2c4b | |||
| 023c4f4726 | |||
| ba1a246a90 | |||
| a664e27772 | |||
| 75b8e0a0f2 | |||
| fc38aff46b | |||
| 1ca31224e2 | |||
| c89479b5e7 | |||
| a691f15e1f | |||
| f0f1863124 | |||
| 0823e00dfe | |||
| 43631ceb93 | |||
| 4bd383f412 | |||
| caa426767c | |||
| 7112160de5 | |||
| f8feccc27d | |||
| 0dc9d3a59a | |||
| 7bbf089e9f | |||
| 8d7d2431df | |||
| 09720ee758 | |||
| 419ca4e630 | |||
| ee1b7bad56 | |||
| c7547b3a46 | |||
| 01e904e702 | |||
| d2888d0007 | |||
| 9e1c1ecb9a | |||
| cd5db384a4 | |||
| d586f828b2 | |||
| f073e07de7 | |||
| 3f278b603d | |||
| 6d0f2b9083 | |||
| 3060a2664d | |||
| 698cfd0c0a | |||
| e6bffde301 | |||
| 1b0e57408c | |||
| 442135047f | |||
| ef2dbb7818 | |||
| 2d2d45f568 | |||
| 617e25eb4c | |||
| 24874376c3 | |||
| 0d0340e11a | |||
| 2252cd73f9 | |||
| 6deb64e587 | |||
| 0e768694b5 | |||
| dca6736a6f | |||
| 6f727aa483 | |||
| eec6957b08 | |||
| 6da5c704b1 | |||
| f10c6b4ff6 | |||
| efa5d05f5f | |||
| 336a3bd484 | |||
| 6adb489276 | |||
| 12f34f33b3 | |||
| 4992d21747 | |||
| 0c1d797511 | |||
| bd3f2b3019 | |||
| 153cfad507 | |||
| d7224670c5 | |||
| 31bab88a5b | |||
| 1e383fde5c | |||
| f5b9a95522 | |||
| 199683897a | |||
| be319c446d | |||
| 4d8cc9aef7 | |||
| 6ab300025b | |||
| f7c17d96ce | |||
| f5ac18915a | |||
| ed92489a60 | |||
| 946d69a3ef | |||
| cc8e78b505 | |||
| b38ccb0fbd | |||
| 953f8da84d | |||
| cd8a27ca26 | |||
| c5568c8eae | |||
| 8dc5b11f51 | |||
| 10cdbc8fbc | |||
| d715c0c0dd | |||
| 7bbdd25a9e | |||
| 566a653c0a | |||
| 464523f318 | |||
| e68b54159d | |||
| 0d4ac16d18 | |||
| 9d66d5f6a7 | |||
| 717d02f073 | |||
| 786f057971 | |||
| c1a83662d9 | |||
| e62ccd55ba | |||
| 1f9888b88c | |||
| 0b3232d94b | |||
| 6c7529f6b3 | |||
| bf9204f146 | |||
| 4043e35b10 | |||
| add539392a | |||
| 7e4afbc4ff | |||
| c39b201d3a | |||
| 6fdb30b6af | |||
| cc399b51f0 | |||
| c5ce32d66d | |||
| 20969b5d3d | |||
| fee0a458d0 | |||
| af9e710763 | |||
| 23b2094dd4 | |||
| 23c51694c7 | |||
| f59fe297ea | |||
| 21ec0f103e | |||
| 3ed2e010fa | |||
| 096d6297fe | |||
| 03eb39afe6 | |||
| b63753b4d5 | |||
| e9f72dbbbf | |||
| 624ab4b8dd | |||
| a4607385fd | |||
| 0f2e579674 | |||
| 463e981d39 | |||
| e5286510d1 | |||
| 66e8560b51 | |||
| 3877f100c3 | |||
| d94e777feb | |||
| 9b891d0c55 | |||
| 3ab04598da | |||
| f7808dc7ca | |||
| 99f1ac1cc5 | |||
| 3973452ec3 | |||
| 29a8abd996 | |||
| 7de3632c7e | |||
| fa381c5493 | |||
| a293be2121 | |||
| e19b10f790 | |||
| 05790ab9a1 | |||
| 5e469a0ae3 | |||
| 4c205be617 | |||
| 96dbd3a937 | |||
| 265cc13971 | |||
| 4ec3e6aed9 | |||
| a082d52543 | |||
| 1a0c12191d | |||
| 82cade649b | |||
| 72ab8a5363 | |||
| 8998eb2330 | |||
| 000e2c96a5 | |||
| 7b7ba7d73e | |||
| 826c0206cb | |||
| a2371dab83 | |||
| 8dd915ec01 | |||
| 45e86f7591 | |||
| de70ac3e36 | |||
| e95e79cabf | |||
| 7335cd39ca | |||
| 65ab9cac50 | |||
| ae8d6a6000 | |||
| 8b2a8d22b3 | |||
| 8a7cb34e93 | |||
| 967b6585e1 | |||
| 1c4ebe9ab6 | |||
| d65e922cca | |||
| d69bdbe1ef | |||
| 3975efc9e4 | |||
| fb22d1dd32 | |||
| 9a9996bd51 | |||
| 140fae3fa1 | |||
| 4c372c0b76 | |||
| 97586fe936 | |||
| 3ed30b81d6 | |||
| 13102254f9 | |||
| e0c362856e | |||
| a4c1bf104c | |||
| 2f313c6b43 | |||
| dc1360422f | |||
| 8d0018c42d | |||
| cb6179dbb7 | |||
| aff2c154a9 | |||
| c6664c7d1e | |||
| 3bf54bac85 | |||
| c0cc89201e | |||
| 16fab80f86 | |||
| 08ebd99ed4 | |||
| da389eea03 | |||
| 8347e15413 | |||
| 8ea5dcb110 | |||
| c9989e0aff | |||
| 3f73d63edb | |||
| 05b358f44e | |||
| 4a068a3b86 | |||
| e4936547e3 | |||
| 429b71b63f | |||
| 969367dc3e | |||
| 87e026bd4f | |||
| 0679aebfac | |||
| 310140e91b | |||
| e242dbf89f | |||
| ce6c360d29 | |||
| 07fb8e034f | |||
| 2acad9963f | |||
| 8198b73297 | |||
| 38cd840a66 | |||
| aa2a131956 | |||
| 4f9df89fd3 | |||
| 94822b57d9 | |||
| a388df2f74 | |||
| 2c6a70b744 | |||
| 566f8f5810 | |||
| 21cbfec533 | |||
| 4279b3f482 | |||
| 4c212400d8 | |||
| cf0aeb79bf | |||
| 4fe91d57b7 | |||
| 760d586923 | |||
| 5e239f5d87 | |||
| 16cd75d179 | |||
| 4665e8fbdb | |||
| f25064fae8 | |||
| 5e77925492 | |||
| 70d0c0ea8a | |||
| 1fccefb07f | |||
| 59fb6eb875 | |||
| bdbb16d759 | |||
| 0f18fd9610 | |||
| 2a29abcc39 | |||
| d322015e6e | |||
| 4f954c2eb4 | |||
| d0e509a8fc | |||
| bc1a5b99ac | |||
| 47c0797028 | |||
| 31f6e94da2 | |||
| 15e3cc0e0b | |||
| 810c1fb574 | |||
| cac33d8f72 | |||
| 666aeca4ea | |||
| 596943c913 | |||
| fd5835e3c8 | |||
| 965352c3f4 | |||
| 4a3092d0e8 | |||
| 39491663ee | |||
| 7798a7f6d5 | |||
| 41b938b3cd | |||
| 4d2d801bf4 | |||
| cea1a67749 | |||
| aa7711dc31 | |||
| 585c752d72 | |||
| 3a314d97eb | |||
| 8ac2d7069d | |||
| 3c60f2691d | |||
| c83cc35b93 | |||
| 4508f5b77f | |||
| ed5450d7e6 | |||
| c987acb709 | |||
| 89b78e598e | |||
| c496f2a9db | |||
| 0688e9c6c3 | |||
| 34d74477e4 | |||
| 1798bf003b | |||
| 07f58558e3 | |||
| 96457a0adc | |||
| 9c55518744 | |||
| f35c666ea8 | |||
| 0da02b99cc | |||
| 7e6b236661 | |||
| 8a870a07ae | |||
| afeaaee376 | |||
| 973af724f4 | |||
| 5cab22e20d | |||
| af39369661 | |||
| 3bdd2e4e5b | |||
| 6cefab801f | |||
| 84628b8f6b | |||
| 68e3b279fa | |||
| def3698423 | |||
| 0e6ead938e | |||
| 93c35a19f5 | |||
| a36a54adcd | |||
| 4c0c7cc394 | |||
| 4a79df860d |
@@ -0,0 +1,43 @@
|
||||
name: Build Linux
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
|
||||
# Editor
|
||||
editor-linux:
|
||||
name: Editor (Linux, Development 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: 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: |
|
||||
./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxEditor
|
||||
|
||||
# Game
|
||||
game-linux:
|
||||
name: Game (Linux, Release x64)
|
||||
runs-on: "ubuntu-20.04"
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev
|
||||
- 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,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,34 @@
|
||||
name: Build Windows
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
|
||||
# Editor
|
||||
editor-windows:
|
||||
name: Editor (Windows, Development x64)
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout LFS
|
||||
run: |
|
||||
git lfs version
|
||||
git lfs pull
|
||||
- name: Build
|
||||
run: |
|
||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor
|
||||
|
||||
# Game
|
||||
game-windows:
|
||||
name: Game (Windows, Release x64)
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout LFS
|
||||
run: |
|
||||
git lfs version
|
||||
git lfs pull
|
||||
- name: Build
|
||||
run: |
|
||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame
|
||||
@@ -0,0 +1,100 @@
|
||||
name: Continuous Deployment
|
||||
on:
|
||||
schedule:
|
||||
- cron: '15 4 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
||||
# Windows
|
||||
package-windows-editor:
|
||||
name: Editor (Windows)
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout LFS
|
||||
run: |
|
||||
git lfs version
|
||||
git lfs pull
|
||||
- name: Build
|
||||
run: |
|
||||
.\PackageEditor.bat -arch=x64 -platform=Windows -deployOutput=Output
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Windows-Editor
|
||||
path: Output/Editor.zip
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Windows-EditorDebugSymbols
|
||||
path: Output/EditorDebugSymbols.zip
|
||||
package-windows-game:
|
||||
name: Game (Windows)
|
||||
runs-on: "windows-latest"
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout LFS
|
||||
run: |
|
||||
git lfs version
|
||||
git lfs pull
|
||||
- name: Build
|
||||
run: |
|
||||
.\PackagePlatforms.bat -arch=x64 -platform=Windows -deployOutput=Output
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
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@v2
|
||||
- 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: |
|
||||
./PackageEditor.sh -arch=x64 -platform=Linux -deployOutput=Output
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
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@v2
|
||||
- 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: |
|
||||
./PackagePlatforms.sh -arch=x64 -platform=Linux -deployOutput=Output
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Linux-Game
|
||||
path: Output/Linux.zip
|
||||
+3
-40
@@ -7,7 +7,9 @@ Cache/
|
||||
Binaries/
|
||||
Logs/
|
||||
Source/*.csproj
|
||||
/Package_*/
|
||||
!Source/Engine/Debug
|
||||
/Source/Platforms/Editor/Linux/Mono/etc/mono/registry
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
@@ -22,11 +24,6 @@ Source/*.csproj
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# NuGet Packages Directory
|
||||
packages/**/*
|
||||
!packages/repositories.config
|
||||
@@ -56,9 +53,6 @@ packages/**/*
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
@@ -72,12 +66,6 @@ ipch/
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
@@ -100,9 +88,6 @@ _NCrunch_*
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
@@ -149,32 +134,9 @@ ClientBin/
|
||||
*.publishsettings
|
||||
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
|
||||
FakesAssemblies/
|
||||
|
||||
# LightSwitch generated files
|
||||
GeneratedArtifacts/
|
||||
_Pvt_Extensions/
|
||||
ModelManifest.xml
|
||||
|
||||
# IDE files
|
||||
*.VC.db
|
||||
enc_temp_folder/
|
||||
@@ -185,3 +147,4 @@ obj/
|
||||
*.vcxproj.filters
|
||||
.vscode/
|
||||
*.code-workspace
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# Redirect to our own Git LFS server
|
||||
[lfs]
|
||||
url="https://gitlab.flaxengine.com/flax/flaxengine.git/info/lfs"
|
||||
locksverify = false
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# How to contribute to the FlaxEngine
|
||||
|
||||
For any questions, suggestions or help join our discord!
|
||||
|
||||
<a href="https://flaxengine.com/discord"><img src="https://discordapp.com/api/guilds/437989205315158016/widget.png"/></a>
|
||||
|
||||
Want to see whats planned for Flax?
|
||||
|
||||
Go check out our [Trello](https://trello.com/b/NQjLXRCP/flax-roadmap).
|
||||
|
||||
## **Found a bug?**
|
||||
|
||||
* Avoid opening any new issues without having checked if your problem has already been reported. If there are no currently open issues that fit your problem's description, feel free to [add it](https://github.com/FlaxEngine/FlaxEngine/issues/new).
|
||||
|
||||
* When writing an issue make sure to include a clear title and description as well as having filled out all the necessary information, depending on the severity of the issue also include the necessary log files and minidump.
|
||||
|
||||
* Try to following the given template when writing a new issue if possible.
|
||||
|
||||
## **Want to contribute?**
|
||||
|
||||
* Fork the FlaxEngine, create a new branch and push your changes there. Then, create a pull request.
|
||||
|
||||
* When creating a PR for fixing an issue/bug make sure to describe as to what led to the fix for better understanding, for small and obvious fixes this is not really needed.
|
||||
However make sure to mention the relevant issue where it was first reported if possible.
|
||||
|
||||
* For feature PR's the first thing you should evaluate is the value of your contribution, as in, what would it bring to this engine? Is it really required?
|
||||
If its a small change you could preferably suggest it to us on our discord, else feel free to open up a PR for it.
|
||||
|
||||
* Ensure when creating a PR that your contribution is well explained with a adequate description and title.
|
||||
|
||||
* Generally, good code quality is expected, make sure your contribution works as intended and is appropriately commented where necessary.
|
||||
|
||||
|
||||
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.
@@ -108,16 +108,14 @@ float4 GetVertexColor(MaterialInput input)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@8
|
||||
|
||||
// Get material properties function (for pixel shader)
|
||||
Material GetMaterialPS(MaterialInput input)
|
||||
{
|
||||
@4
|
||||
}
|
||||
|
||||
// Programmatically set the line number after all the material inputs which have a variable number of line endings
|
||||
// This allows shader error line numbers after this point to be the same regardless of which material is being compiled
|
||||
#line 1000
|
||||
|
||||
// Input macro specified by the material: DECAL_BLEND_MODE
|
||||
|
||||
#define DECAL_BLEND_MODE_TRANSLUCENT 0
|
||||
@@ -160,10 +158,7 @@ void PS_Decal(
|
||||
float3 positionWS = positionHS.xyz / positionHS.w;
|
||||
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz;
|
||||
|
||||
// Clip content outside the decal
|
||||
clip(0.5 - abs(positionOS.xyz));
|
||||
|
||||
// By default, map textures using the vectors perpendicular to the projection direction
|
||||
float2 decalUVs = positionOS.xz + 0.5f;
|
||||
|
||||
// Setup material input
|
||||
@@ -199,19 +194,21 @@ void PS_Decal(
|
||||
Out2 = float4(material.Emissive, material.Opacity);
|
||||
#if USE_NORMAL
|
||||
// GBuffer1
|
||||
Out3 = float4(material.WorldNormal * 0.5f + 0.5f, 1);
|
||||
Out3 = float4(material.WorldNormal * 0.5f + 0.5f, material.Opacity);
|
||||
#endif
|
||||
#elif USE_NORMAL
|
||||
// GBuffer1
|
||||
Out2 = float4(material.WorldNormal * 0.5f + 0.5f, 1);
|
||||
Out2 = float4(material.WorldNormal * 0.5f + 0.5f, material.Opacity);
|
||||
#endif
|
||||
#elif DECAL_BLEND_MODE == DECAL_BLEND_MODE_STAIN
|
||||
Out0 = float4(material.Color, material.Opacity);
|
||||
#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
|
||||
Out0 = float4(material.Emissive * material.Opacity, material.Opacity);
|
||||
#else
|
||||
#error "Invalid decal blending mode"
|
||||
#endif
|
||||
}
|
||||
|
||||
@9
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
// File generated by Flax Materials Editor
|
||||
// Version: @0
|
||||
|
||||
#define MATERIAL 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 ViewProjectionMatrix;
|
||||
float4x4 WorldMatrix;
|
||||
float4x4 LocalMatrix;
|
||||
float4x4 ViewMatrix;
|
||||
float3 ViewPos;
|
||||
float ViewFar;
|
||||
float3 ViewDir;
|
||||
float TimeParam;
|
||||
float4 ViewInfo;
|
||||
float4 ScreenSize;
|
||||
float3 Dummy0;
|
||||
float WorldDeterminantSign;
|
||||
float MeshMinZ;
|
||||
float Segment;
|
||||
float ChunksPerSegment;
|
||||
float PerInstanceRandom;
|
||||
float4 TemporalAAJitter;
|
||||
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
|
||||
}
|
||||
|
||||
@9
|
||||
@@ -0,0 +1,84 @@
|
||||
// Copyright (c) 2012-2021 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 = 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
|
||||
|
||||
#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-2021 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,124 @@
|
||||
// Copyright (c) 2012-2021 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"
|
||||
#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)
|
||||
float4 PS_Forward(PixelInput input) : SV_Target0
|
||||
{
|
||||
float4 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);
|
||||
}
|
||||
|
||||
#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;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2012-2021 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-2021 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-2021 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
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
#define MATERIAL 1
|
||||
@3
|
||||
|
||||
#include "./Flax/Common.hlsl"
|
||||
#include "./Flax/MaterialCommon.hlsl"
|
||||
#include "./Flax/GBufferCommon.hlsl"
|
||||
@@ -22,7 +21,7 @@ float4 ViewInfo;
|
||||
float4 ScreenSize;
|
||||
@1META_CB_END
|
||||
|
||||
// Material shader resources
|
||||
// Shader resources
|
||||
@2
|
||||
// Interpolants passed from the vertex shader
|
||||
struct VertexOutput
|
||||
@@ -185,6 +184,8 @@ float4 GetVertexColor(MaterialInput input)
|
||||
#endif
|
||||
}
|
||||
|
||||
@8
|
||||
|
||||
// Get material properties function (for vertex shader)
|
||||
Material GetMaterialVS(MaterialInput input)
|
||||
{
|
||||
@@ -197,10 +198,6 @@ Material GetMaterialPS(MaterialInput input)
|
||||
@4
|
||||
}
|
||||
|
||||
// Programmatically set the line number after all the material inputs which have a variable number of line endings
|
||||
// This allows shader error line numbers after this point to be the same regardless of which material is being compiled
|
||||
#line 1000
|
||||
|
||||
// Vertex Shader function for GUI materials rendering
|
||||
META_VS(true, FEATURE_LEVEL_ES2)
|
||||
META_VS_IN_ELEMENT(POSITION, 0, R32G32_FLOAT, 0, ALIGN, PER_VERTEX, 0, true)
|
||||
@@ -258,3 +255,5 @@ float4 PS_GUI(PixelInput input) : SV_Target0
|
||||
|
||||
return float4(material.Emissive, material.Opacity);
|
||||
}
|
||||
|
||||
@9
|
||||
|
||||
@@ -2,19 +2,13 @@
|
||||
// Version: @0
|
||||
|
||||
#define MATERIAL 1
|
||||
#define MAX_LOCAL_LIGHTS 4
|
||||
@3
|
||||
// Ribbons don't use sorted indices so overlap the segment distances buffer on the slot
|
||||
#define HAS_SORTED_INDICES (!defined(_VS_Ribbon))
|
||||
|
||||
#include "./Flax/Common.hlsl"
|
||||
#include "./Flax/MaterialCommon.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"
|
||||
@7
|
||||
struct SpriteInput
|
||||
@@ -55,44 +49,19 @@ uint RibbonSegmentCount;
|
||||
float4x4 WorldMatrixInverseTransposed;
|
||||
@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
|
||||
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
|
||||
Buffer<uint> SortedIndices : register(t1);
|
||||
|
||||
#else
|
||||
|
||||
// Ribbon particles segments distances buffer
|
||||
Buffer<float> SegmentDistances : register(t1);
|
||||
|
||||
#endif
|
||||
|
||||
// Shader resources
|
||||
TextureCube EnvProbe : register(t2);
|
||||
TextureCube SkyLightTexture : register(t3);
|
||||
Texture2DArray DirectionalLightShadowMap : register(t4);
|
||||
@2
|
||||
|
||||
// Interpolants passed from the vertex shader
|
||||
struct VertexOutput
|
||||
{
|
||||
@@ -172,14 +141,11 @@ MaterialInput GetMaterialInput(PixelInput input)
|
||||
}
|
||||
|
||||
// Gets the local to world transform matrix (supports instancing)
|
||||
float4x4 GetInstanceTransform(ModelInput input)
|
||||
{
|
||||
return WorldMatrix;
|
||||
}
|
||||
float4x4 GetInstanceTransform(MaterialInput input)
|
||||
{
|
||||
return WorldMatrix;
|
||||
}
|
||||
#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))
|
||||
#else
|
||||
#define GetInstanceTransform(input) WorldMatrix;
|
||||
#endif
|
||||
|
||||
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
||||
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||
@@ -312,6 +278,8 @@ float3 TransformParticleVector(float3 input)
|
||||
return mul(float4(input, 0.0f), WorldMatrixInverseTransposed).xyz;
|
||||
}
|
||||
|
||||
@8
|
||||
|
||||
// Get material properties function (for vertex shader)
|
||||
Material GetMaterialVS(MaterialInput input)
|
||||
{
|
||||
@@ -330,10 +298,6 @@ Material GetMaterialPS(MaterialInput input)
|
||||
@4
|
||||
}
|
||||
|
||||
// Programmatically set the line number after all the material inputs which have a variable number of line endings
|
||||
// This allows shader error line numbers after this point to be the same regardless of which material is being compiled
|
||||
#line 1000
|
||||
|
||||
// Calculates the transform matrix from mesh tangent space to local space
|
||||
half3x3 CalcTangentToLocal(ModelInput input)
|
||||
{
|
||||
@@ -713,142 +677,9 @@ VertexOutput VS_Ribbon(uint vertexIndex : SV_VertexID)
|
||||
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;
|
||||
|
||||
// Store positive and negative offsets separately
|
||||
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
|
||||
META_PS(true, FEATURE_LEVEL_ES2)
|
||||
void PS_Depth(PixelInput input
|
||||
#if GLSL
|
||||
, out float4 OutColor : SV_Target0
|
||||
#endif
|
||||
)
|
||||
void PS_Depth(PixelInput input)
|
||||
{
|
||||
// Get material parameters
|
||||
MaterialInput materialInput = GetMaterialInput(input);
|
||||
@@ -861,8 +692,6 @@ void PS_Depth(PixelInput input
|
||||
#if MATERIAL_BLEND == MATERIAL_BLEND_TRANSPARENT
|
||||
clip(material.Opacity - MATERIAL_OPACITY_THRESHOLD);
|
||||
#endif
|
||||
|
||||
#if GLSL
|
||||
OutColor = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@9
|
||||
|
||||
@@ -20,7 +20,7 @@ float4 ScreenSize;
|
||||
float4 TemporalAAJitter;
|
||||
@1META_CB_END
|
||||
|
||||
// Material shader resources
|
||||
// Shader resources
|
||||
@2
|
||||
// Interpolants passed to the pixel shader
|
||||
struct PixelInput
|
||||
@@ -128,16 +128,14 @@ float4 GetVertexColor(MaterialInput input)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@8
|
||||
|
||||
// Get material properties function (for pixel shader)
|
||||
Material GetMaterialPS(MaterialInput input)
|
||||
{
|
||||
@4
|
||||
}
|
||||
|
||||
// Programmatically set the line number after all the material inputs which have a variable number of line endings
|
||||
// This allows shader error line numbers after this point to be the same regardless of which material is being compiled
|
||||
#line 1000
|
||||
|
||||
// Pixel Shader function for PostFx materials rendering
|
||||
META_PS(true, FEATURE_LEVEL_ES2)
|
||||
float4 PS_PostFx(PixelInput input) : SV_Target0
|
||||
@@ -148,3 +146,5 @@ float4 PS_PostFx(PixelInput input) : SV_Target0
|
||||
|
||||
return float4(material.Emissive, material.Opacity);
|
||||
}
|
||||
|
||||
@9
|
||||
|
||||
@@ -0,0 +1,618 @@
|
||||
// File generated by Flax Materials Editor
|
||||
// Version: @0
|
||||
|
||||
#define MATERIAL 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 ViewProjectionMatrix;
|
||||
float4x4 WorldMatrix;
|
||||
float4x4 ViewMatrix;
|
||||
float4x4 PrevViewProjectionMatrix;
|
||||
float4x4 PrevWorldMatrix;
|
||||
float3 ViewPos;
|
||||
float ViewFar;
|
||||
float3 ViewDir;
|
||||
float TimeParam;
|
||||
float4 ViewInfo;
|
||||
float4 ScreenSize;
|
||||
float3 WorldInvScale;
|
||||
float WorldDeterminantSign;
|
||||
float2 Dummy0;
|
||||
float LODDitherFactor;
|
||||
float PerInstanceRandom;
|
||||
float4 TemporalAAJitter;
|
||||
float3 GeometrySize;
|
||||
float Dummy1;
|
||||
@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;
|
||||
float3 InstanceOrigin : TEXCOORD5;
|
||||
float2 InstanceParams : TEXCOORD6; // x-PerInstanceRandom, y-LODDitherFactor
|
||||
float3 PrevWorldPosition : TEXCOORD7;
|
||||
};
|
||||
|
||||
// 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_LIGHTMAP
|
||||
float2 LightmapUV;
|
||||
#endif
|
||||
#if USE_VERTEX_COLOR
|
||||
half4 VertexColor;
|
||||
#endif
|
||||
float3x3 TBN;
|
||||
float4 SvPosition;
|
||||
float3 PreSkinnedPosition;
|
||||
float3 PreSkinnedNormal;
|
||||
float3 InstanceOrigin;
|
||||
float2 InstanceParams;
|
||||
#if USE_INSTANCING
|
||||
float3 InstanceTransform1;
|
||||
float3 InstanceTransform2;
|
||||
float3 InstanceTransform3;
|
||||
#endif
|
||||
#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;
|
||||
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;
|
||||
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 (supports instancing)
|
||||
#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))
|
||||
#else
|
||||
#define GetInstanceTransform(input) WorldMatrix;
|
||||
#endif
|
||||
|
||||
// Removes the scale vector from the local to world transformation matrix (supports instancing)
|
||||
float3x3 RemoveScaleFromLocalToWorld(float3x3 localToWorld)
|
||||
{
|
||||
#if USE_INSTANCING
|
||||
// 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);
|
||||
#else
|
||||
float3 invScale = WorldInvScale;
|
||||
#endif
|
||||
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
|
||||
float4x4 world = GetInstanceTransform(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;
|
||||
#if USE_INSTANCING
|
||||
materialInput.InstanceTransform1 = input.InstanceTransform1.xyz;
|
||||
materialInput.InstanceTransform2 = input.InstanceTransform2.xyz;
|
||||
materialInput.InstanceTransform3 = input.InstanceTransform3.xyz;
|
||||
#endif
|
||||
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
|
||||
{
|
||||
float4x4 world = GetInstanceTransform(input);
|
||||
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
|
||||
float4x4 world = GetInstanceTransform(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
|
||||
}
|
||||
|
||||
@9
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,6 @@
|
||||
|
||||
#define MATERIAL 1
|
||||
@3
|
||||
|
||||
// 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
|
||||
|
||||
@@ -26,7 +25,6 @@ float3 ViewDir;
|
||||
float TimeParam;
|
||||
float4 ViewInfo;
|
||||
float4 ScreenSize;
|
||||
float4 LightmapArea;
|
||||
float3 WorldInvScale;
|
||||
float WorldDeterminantSign;
|
||||
float PerInstanceRandom;
|
||||
@@ -39,27 +37,16 @@ float2 OffsetUV;
|
||||
float2 Dummy0;
|
||||
@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
|
||||
Texture2D Heightmap : register(t3);
|
||||
Texture2D Splatmap0 : register(t4);
|
||||
Texture2D Splatmap1 : register(t5);
|
||||
Texture2D Heightmap : register(t0);
|
||||
Texture2D Splatmap0 : register(t1);
|
||||
Texture2D Splatmap1 : register(t2);
|
||||
|
||||
// Material shader resources
|
||||
// Shader resources
|
||||
@2
|
||||
|
||||
// Interpolants passed from the vertex shader
|
||||
struct VertexOutput
|
||||
// Geometry data passed though the graphics rendering stages up to the pixel shader
|
||||
struct GeometryData
|
||||
{
|
||||
float4 Position : SV_Position;
|
||||
float3 WorldPosition : TEXCOORD0;
|
||||
float2 TexCoord : TEXCOORD1;
|
||||
float2 LightmapUV : TEXCOORD2;
|
||||
@@ -68,6 +55,13 @@ struct VertexOutput
|
||||
#if USE_TERRAIN_LAYERS
|
||||
float4 Layers[TERRAIN_LAYERS_DATA_SIZE] : TEXCOORD5;
|
||||
#endif
|
||||
};
|
||||
|
||||
// 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
|
||||
@@ -80,14 +74,7 @@ struct VertexOutput
|
||||
struct PixelInput
|
||||
{
|
||||
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
|
||||
GeometryData Geometry;
|
||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||
#endif
|
||||
@@ -116,25 +103,66 @@ struct MaterialInput
|
||||
#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 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 * (input.IsFrontFace ? 1.0 : -1.0);
|
||||
result.SvPosition = input.Position;
|
||||
result.HolesMask = input.HolesMask;
|
||||
#if USE_TERRAIN_LAYERS
|
||||
result.Layers = input.Layers;
|
||||
#endif
|
||||
MaterialInput output = GetGeometryMaterialInput(input.Geometry);
|
||||
output.TwoSidedSign = WorldDeterminantSign * (input.IsFrontFace ? 1.0 : -1.0);
|
||||
output.SvPosition = input.Position;
|
||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||
result.CustomVSToPS = input.CustomVSToPS;
|
||||
output.CustomVSToPS = input.CustomVSToPS;
|
||||
#endif
|
||||
return result;
|
||||
return output;
|
||||
}
|
||||
|
||||
// Removes the scale vector from the local to world transformation matrix
|
||||
@@ -216,6 +244,8 @@ float4 GetVertexColor(MaterialInput input)
|
||||
return 1;
|
||||
}
|
||||
|
||||
@8
|
||||
|
||||
// Get material properties function (for vertex shader)
|
||||
Material GetMaterialVS(MaterialInput input)
|
||||
{
|
||||
@@ -234,10 +264,6 @@ Material GetMaterialPS(MaterialInput input)
|
||||
@4
|
||||
}
|
||||
|
||||
// Programmatically set the line number after all the material inputs which have a variable number of line endings
|
||||
// This allows shader error line numbers after this point to be the same regardless of which material is being compiled
|
||||
#line 1000
|
||||
|
||||
// Calculates LOD value (with fractional part for blending)
|
||||
float CalcLOD(float2 xy, float4 morph)
|
||||
{
|
||||
@@ -337,7 +363,7 @@ VertexOutput VS(TerrainVertexInput input)
|
||||
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);
|
||||
normal = normalize(normal);
|
||||
output.HolesMask = isHole ? 0 : 1;
|
||||
output.Geometry.HolesMask = isHole ? 0 : 1;
|
||||
if (isHole)
|
||||
{
|
||||
normal = float3(0, 1, 0);
|
||||
@@ -354,10 +380,10 @@ VertexOutput VS(TerrainVertexInput input)
|
||||
float3 position = float3(positionXZ.x, height, positionXZ.y);
|
||||
|
||||
// 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
|
||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||
|
||||
// Pass vertex attributes
|
||||
#if USE_SMOOTH_LOD_TRANSITION
|
||||
@@ -365,46 +391,46 @@ VertexOutput VS(TerrainVertexInput input)
|
||||
#else
|
||||
float2 texCoord = input.TexCoord;
|
||||
#endif
|
||||
output.TexCoord = positionXZ * (1.0f / TerrainChunkSizeLOD0) + OffsetUV;
|
||||
output.LightmapUV = texCoord * LightmapArea.zw + LightmapArea.xy;
|
||||
output.Geometry.TexCoord = positionXZ * (1.0f / TerrainChunkSizeLOD0) + OffsetUV;
|
||||
output.Geometry.LightmapUV = texCoord * LightmapArea.zw + LightmapArea.xy;
|
||||
|
||||
// Extract terrain layers weights from the splatmap
|
||||
#if USE_TERRAIN_LAYERS
|
||||
output.Layers[0] = splatmap0Value;
|
||||
output.Geometry.Layers[0] = splatmap0Value;
|
||||
#if TERRAIN_LAYERS_DATA_SIZE > 1
|
||||
output.Layers[1] = splatmap1Value;
|
||||
output.Geometry.Layers[1] = splatmap1Value;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Compute world space normal vector
|
||||
float3x3 tangentToLocal = CalcTangentBasisFromWorldNormal(normal);
|
||||
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
|
||||
#if USE_POSITION_OFFSET || USE_TESSELLATION || USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||
MaterialInput materialInput = (MaterialInput)0;
|
||||
materialInput.WorldPosition = output.WorldPosition;
|
||||
materialInput.TexCoord = output.TexCoord;
|
||||
materialInput.WorldPosition = output.Geometry.WorldPosition;
|
||||
materialInput.TexCoord = output.Geometry.TexCoord;
|
||||
#if USE_LIGHTMAP
|
||||
materialInput.LightmapUV = output.LightmapUV;
|
||||
materialInput.LightmapUV = output.Geometry.LightmapUV;
|
||||
#endif
|
||||
materialInput.TBN = CalcTangentBasisFromWorldNormal(output.WorldNormal);
|
||||
materialInput.TBN = tangentToWorld;
|
||||
materialInput.TwoSidedSign = WorldDeterminantSign;
|
||||
materialInput.SvPosition = output.Position;
|
||||
materialInput.PreSkinnedPosition = position;
|
||||
materialInput.PreSkinnedNormal = normal;
|
||||
materialInput.HolesMask = output.HolesMask;
|
||||
materialInput.HolesMask = output.Geometry.HolesMask;
|
||||
#if USE_TERRAIN_LAYERS
|
||||
materialInput.Layers = output.Layers;
|
||||
materialInput.Layers = output.Geometry.Layers;
|
||||
#endif
|
||||
Material material = GetMaterialVS(materialInput);
|
||||
#endif
|
||||
|
||||
// Apply world position offset per-vertex
|
||||
#if USE_POSITION_OFFSET
|
||||
output.WorldPosition += material.PositionOffset;
|
||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||
output.Geometry.WorldPosition += material.PositionOffset;
|
||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||
#endif
|
||||
|
||||
// Get tessalation multiplier (per vertex)
|
||||
@@ -420,357 +446,9 @@ VertexOutput VS(TerrainVertexInput input)
|
||||
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
|
||||
// Precompute squares and squares * 3
|
||||
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
|
||||
META_PS(true, FEATURE_LEVEL_ES2)
|
||||
void PS_Depth(PixelInput input
|
||||
#if GLSL
|
||||
, out float4 OutColor : SV_Target0
|
||||
#endif
|
||||
)
|
||||
void PS_Depth(PixelInput input)
|
||||
{
|
||||
#if MATERIAL_MASKED
|
||||
// Perform per pixel clipping if material requries it
|
||||
@@ -778,8 +456,6 @@ void PS_Depth(PixelInput input
|
||||
Material material = GetMaterialPS(materialInput);
|
||||
clip(material.Mask - MATERIAL_MASK_THRESHOLD);
|
||||
#endif
|
||||
|
||||
#if GLSL
|
||||
OutColor = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
@9
|
||||
|
||||
@@ -0,0 +1,246 @@
|
||||
// File generated by Flax Materials Editor
|
||||
// Version: @0
|
||||
|
||||
#define MATERIAL 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 ViewProjectionMatrix;
|
||||
float4x4 InverseViewProjectionMatrix;
|
||||
float4x4 ViewMatrix;
|
||||
float4x4 WorldMatrix;
|
||||
float4x4 WorldMatrixInverseTransposed;
|
||||
float3 ViewPos;
|
||||
float ViewFar;
|
||||
float3 ViewDir;
|
||||
float TimeParam;
|
||||
float4 ViewInfo;
|
||||
float4 ScreenSize;
|
||||
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.
@@ -0,0 +1,23 @@
|
||||
%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,8 @@
|
||||
%copyright%
|
||||
#include "%filename%.h"
|
||||
#include "Engine/Core/Log.h"
|
||||
|
||||
void %class%::RunNativeAction(Vector4 data)
|
||||
{
|
||||
LOG(Warning, "Data in RunNativeAction: {0}", data);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
%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);
|
||||
};
|
||||
@@ -4,23 +4,30 @@ using FlaxEngine;
|
||||
|
||||
namespace %namespace%
|
||||
{
|
||||
/// <summary>
|
||||
/// %class% Script.
|
||||
/// </summary>
|
||||
public class %class% : Script
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override void OnStart()
|
||||
{
|
||||
// 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()
|
||||
{
|
||||
// Here you can add code that needs to be called when script is enabled (eg. register for events)
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void OnDisable()
|
||||
{
|
||||
// Here you can add code that needs to be called when script is disabled (eg. unregister from events)
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void OnUpdate()
|
||||
{
|
||||
// Here you can add code that needs to be called every frame
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
API_CLASS() class %module%%class% : public Script
|
||||
{
|
||||
API_AUTO_SERIALIZATION();
|
||||
DECLARE_SCRIPTING_TYPE(%class%);
|
||||
|
||||
// [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.
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.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,15 @@
|
||||
## Mono
|
||||
|
||||
Custom fork: [https://github.com/FlaxEngine/mono](https://github.com/FlaxEngine/mono) with custom features for C# assemblies hot-reloading at runtime without domain unload (more: [https://flaxengine.com/blog/flax-facts-16-scripts-hot-reload/](https://flaxengine.com/blog/flax-facts-16-scripts-hot-reload/)).
|
||||
|
||||
### Notes
|
||||
|
||||
Some useful notes and tips for devs:
|
||||
* Use `-monolog` to print Mono logs to Flax logs
|
||||
* When working with mono fork set `localRepoPath` to local repo location in `Source\Tools\Flax.Build\Deps\Dependencies\mono.cs`
|
||||
* To update mono deps when developing/updating use `.\Development\Scripts\Windows\CallBuildTool.bat -log -ReBuildDeps -verbose -depsToBuild=mono -platform=Windows`, then build engine and run it
|
||||
* `MONO_GC_DEBUG=check-remset-consistency` - it will do additional checks at each collection to see if there are any missing write barriers
|
||||
* `MONO_GC_DEBUG=nursery-canaries` - it might catch some buffer overflows in case of problems in code.
|
||||
* `MONO_GC_DEBUG=<log-level>:<log-file>` - will print GC debug to the log file (eg. `4:sgen-gc`).
|
||||
* Methods `mono_custom_attrs_from_property` and `mono_custom_attrs_get_attr` are internally cached
|
||||
* If C++ mono call a method in c# that will throw an error, error will be handled but, not completly. Calling relase domain will return random `Access memory violation`. First search for error in c# code. No workaround yet.
|
||||
Regular → Executable
+6
@@ -3,6 +3,12 @@
|
||||
|
||||
set -e
|
||||
|
||||
testfilesize=$(wc -c < 'Source/Logo.png')
|
||||
if [ $testfilesize -le 1000 ]; then
|
||||
echo "CallBuildTool ERROR: Repository was not cloned using Git LFS" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Compile the build tool.
|
||||
xbuild /nologo /verbosity:quiet "Source/Tools/Flax.Build/Flax.Build.csproj" /property:Configuration=Release /property:Platform=AnyCPU /target:Build
|
||||
|
||||
|
||||
@@ -2,93 +2,55 @@
|
||||
|
||||
rem Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
||||
|
||||
rem Make sure the batch file exists in the root folder.
|
||||
if not exist "Development\Scripts\Windows\GetMSBuildPath.bat" goto Error_BatchFileInWrongLocation
|
||||
if not exist "Development\Scripts\Windows\GetMSBuildPath.bat" goto Error_InvalidLocation
|
||||
|
||||
for %%I in (Source\Logo.png) do if %%~zI LSS 2000 (
|
||||
goto Error_MissingLFS
|
||||
)
|
||||
|
||||
rem Get the path to MSBuild executable.
|
||||
call "Development\Scripts\Windows\GetMSBuildPath.bat"
|
||||
if errorlevel 1 goto Error_NoVisualStudioEnvironment
|
||||
|
||||
rem If using VS2017, check that NuGet package manager is installed.
|
||||
if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto NoVsWhere
|
||||
|
||||
set MSBUILD_15_EXE=
|
||||
if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto Compile
|
||||
for /f "delims=" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath') do (
|
||||
for %%j in (15.0, Current) do (
|
||||
if exist "%%i\MSBuild\%%j\Bin\MSBuild.exe" (
|
||||
set MSBUILD_15_EXE="%%i\MSBuild\%%j\Bin\MSBuild.exe"
|
||||
goto FoundMsBuild15
|
||||
set MSBUILD_PATH="%%i\MSBuild\%%j\Bin\MSBuild.exe"
|
||||
goto Compile
|
||||
)
|
||||
)
|
||||
)
|
||||
:FoundMsBuild15
|
||||
|
||||
set MSBUILD_15_EXE_WITH_NUGET=
|
||||
for /f "delims=" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -products * -requires Microsoft.Component.MSBuild -requires Microsoft.VisualStudio.Component.NuGet -property installationPath') do (
|
||||
if exist "%%i\MSBuild\15.0\Bin\MSBuild.exe" (
|
||||
set MSBUILD_15_EXE_WITH_NUGET="%%i\MSBuild\15.0\Bin\MSBuild.exe"
|
||||
goto FoundMsBuild15WithNuget
|
||||
)
|
||||
)
|
||||
:FoundMsBuild15WithNuget
|
||||
|
||||
if not [%MSBUILD_15_EXE%] == [] (
|
||||
set MSBUILD_EXE=%MSBUILD_15_EXE%
|
||||
goto NoVsWhere
|
||||
)
|
||||
|
||||
if not [%MSBUILD_EXE%] == [%MSBUILD_15_EXE_WITH_NUGET%] goto Error_RequireNugetPackageManager
|
||||
|
||||
:NoVsWhere
|
||||
|
||||
rem Check to see if the build tool source files have changed. Some can be included conditionally based on NDA access.
|
||||
:Compile
|
||||
md Cache\Intermediate >nul 2>nul
|
||||
dir /s /b Source\Tools\Flax.Build\*.cs >Cache\Intermediate\Flax.Build.Files.txt
|
||||
fc /b Cache\Intermediate\Build\Flax.Build.Files.txt Cache\Intermediate\Build\Flax.Build.PrevFiles.txt >nul 2>nul
|
||||
if not errorlevel 1 goto SkipClean
|
||||
copy /y Cache\Intermediate\Build\Flax.Build.Files.txt Cache\Intermediate\Build\Flax.Build.PrevFiles.txt >nul
|
||||
%MSBUILD_EXE% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Clean
|
||||
:SkipClean
|
||||
%MSBUILD_EXE% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Build
|
||||
if errorlevel 1 goto Error_CompileFailed
|
||||
|
||||
rem Run the build tool using the provided arguments.
|
||||
copy /y Cache\Intermediate\Build\Flax.Build.Files.txt Cache\Intermediate\Build\Flax.Build.PrevFiles.txt >nul
|
||||
%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Clean
|
||||
:SkipClean
|
||||
%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Build
|
||||
if errorlevel 1 goto Error_CompilationFailed
|
||||
|
||||
Binaries\Tools\Flax.Build.exe %*
|
||||
if errorlevel 1 goto Error_FlaxBuildFailed
|
||||
|
||||
rem Done.
|
||||
exit /B 0
|
||||
|
||||
:Error_BatchFileInWrongLocation
|
||||
echo.
|
||||
echo CallBuildTool ERROR: The batch file does not appear to be located in the root directory. This script must be run from within that directory.
|
||||
echo.
|
||||
:Error_MissingLFS
|
||||
echo CallBuildTool ERROR: Repository was not cloned using Git LFS
|
||||
goto Exit
|
||||
:Error_InvalidLocation
|
||||
echo CallBuildTool ERROR: The script is in invalid directory.
|
||||
goto Exit
|
||||
|
||||
:Error_NoVisualStudioEnvironment
|
||||
echo.
|
||||
echo CallBuildTool ERROR: We couldn't find a valid installation of Visual Studio. This program requires Visual Studio 2015. Please check that you have Visual Studio installed, then verify that the HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\InstallDir (or HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\InstallDir on 32-bit machines) registry value is set. Visual Studio configures this value when it is installed, and this program expects it to be set to the '\Common7\IDE\' sub-folder under a valid Visual Studio installation directory.
|
||||
echo.
|
||||
echo CallBuildTool ERROR: Missing Visual Studio 2015 or newer.
|
||||
goto Exit
|
||||
|
||||
:Error_RequireNugetPackageManager
|
||||
echo.
|
||||
echo CallBuildTool ERROR: NuGet Package Manager is requried to be installed to use %MSBUILD_EXE%. Please run the Visual Studio Installer and add it from the individual components list (in the 'Code Tools' category).
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Error_CompileFailed
|
||||
echo.
|
||||
:Error_CompilationFailed
|
||||
echo CallBuildTool ERROR: Failed to compile Flax.Build project.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Error_FlaxBuildFailed
|
||||
echo.
|
||||
echo CallBuildTool ERROR: Flax.Build tool failed.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Exit
|
||||
rem Exit with error.
|
||||
exit /B 1
|
||||
|
||||
@@ -2,72 +2,57 @@
|
||||
|
||||
rem Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
||||
|
||||
set MSBUILD_EXE=
|
||||
set MSBUILD_PATH=
|
||||
|
||||
rem Try to get the MSBuild 15 path using vswhere (see https://github.com/Microsoft/vswhere).
|
||||
if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto no_vswhere
|
||||
if not exist "%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" goto VsWhereNotFound
|
||||
for /f "delims=" %%i in ('"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath') do (
|
||||
if exist "%%i\MSBuild\15.0\Bin\MSBuild.exe" (
|
||||
set MSBUILD_EXE="%%i\MSBuild\15.0\Bin\MSBuild.exe"
|
||||
goto Succeeded
|
||||
set MSBUILD_PATH="%%i\MSBuild\15.0\Bin\MSBuild.exe"
|
||||
goto End
|
||||
)
|
||||
)
|
||||
:no_vswhere
|
||||
:VsWhereNotFound
|
||||
|
||||
rem Check for MSBuild 15. This is installed alongside Visual Studio 2017, so we get the path relative to that.
|
||||
call :ReadInstallPath Microsoft\VisualStudio\SxS\VS7 15.0 MSBuild\15.0\bin\MSBuild.exe
|
||||
if not errorlevel 1 goto Succeeded
|
||||
|
||||
rem Try to get the MSBuild 14.0 path directly (see https://msdn.microsoft.com/en-us/library/hh162058(v=vs.120).aspx).
|
||||
if exist "%ProgramFiles(x86)%\MSBuild\14.0\bin\MSBuild.exe" (
|
||||
set MSBUILD_EXE="%ProgramFiles(x86)%\MSBuild\14.0\bin\MSBuild.exe"
|
||||
goto Succeeded
|
||||
set MSBUILD_PATH="%ProgramFiles(x86)%\MSBuild\14.0\bin\MSBuild.exe"
|
||||
goto End
|
||||
)
|
||||
|
||||
rem Try to get the MSBuild 14.0 path from the registry.
|
||||
call :ReadInstallPath Microsoft\MSBuild\ToolsVersions\14.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto Succeeded
|
||||
call :GetInstallPath Microsoft\VisualStudio\SxS\VS7 15.0 MSBuild\15.0\bin\MSBuild.exe
|
||||
if not errorlevel 1 goto End
|
||||
call :GetInstallPath Microsoft\MSBuild\ToolsVersions\14.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto End
|
||||
call :GetInstallPath Microsoft\MSBuild\ToolsVersions\12.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto End
|
||||
call :GetInstallPath Microsoft\MSBuild\ToolsVersions\4.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto End
|
||||
|
||||
rem Check for older versions of MSBuild. These are registered as separate versions in the registry.
|
||||
call :ReadInstallPath Microsoft\MSBuild\ToolsVersions\12.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto Succeeded
|
||||
call :ReadInstallPath Microsoft\MSBuild\ToolsVersions\4.0 MSBuildToolsPath MSBuild.exe
|
||||
if not errorlevel 1 goto Succeeded
|
||||
|
||||
rem Searching failed.
|
||||
exit /B 1
|
||||
|
||||
rem Searching done!
|
||||
:Succeeded
|
||||
:End
|
||||
exit /B 0
|
||||
|
||||
rem Subroutine to query the registry under HKCU/HKLM Win32/Wow64 software registry keys for a certain install directory.
|
||||
rem Arguments:
|
||||
rem %1 = Registry path under the 'SOFTWARE' registry key
|
||||
rem %2 = Value name
|
||||
rem %3 = Relative path under this directory to look for an installed executable.
|
||||
:ReadInstallPath
|
||||
:GetInstallPath
|
||||
for /f "tokens=2,*" %%A in ('REG.exe query HKCU\SOFTWARE\%1 /v %2 2^>Nul') do (
|
||||
if exist "%%B%%3" (
|
||||
set MSBUILD_EXE="%%B%3"
|
||||
set MSBUILD_PATH="%%B%3"
|
||||
exit /B 0
|
||||
)
|
||||
)
|
||||
for /f "tokens=2,*" %%A in ('REG.exe query HKLM\SOFTWARE\%1 /v %2 2^>Nul') do (
|
||||
if exist "%%B%3" (
|
||||
set MSBUILD_EXE="%%B%3"
|
||||
set MSBUILD_PATH="%%B%3"
|
||||
exit /B 0
|
||||
)
|
||||
)
|
||||
for /f "tokens=2,*" %%A in ('REG.exe query HKCU\SOFTWARE\Wow6432Node\%1 /v %2 2^>Nul') do (
|
||||
if exist "%%B%%3" (
|
||||
set MSBUILD_EXE="%%B%3"
|
||||
set MSBUILD_PATH="%%B%3"
|
||||
exit /B 0
|
||||
)
|
||||
)
|
||||
for /f "tokens=2,*" %%A in ('REG.exe query HKLM\SOFTWARE\Wow6432Node\%1 /v %2 2^>Nul') do (
|
||||
if exist "%%B%3" (
|
||||
set MSBUILD_EXE="%%B%3"
|
||||
set MSBUILD_PATH="%%B%3"
|
||||
exit /B 0
|
||||
)
|
||||
)
|
||||
|
||||
+3
-3
@@ -2,11 +2,11 @@
|
||||
"Name": "Flax",
|
||||
"Version": {
|
||||
"Major": 1,
|
||||
"Minor": 0,
|
||||
"Build": 6214
|
||||
"Minor": 2,
|
||||
"Build": 6224
|
||||
},
|
||||
"Company": "Flax",
|
||||
"Copyright": "Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.",
|
||||
"Copyright": "Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.",
|
||||
"GameTarget": "FlaxGame",
|
||||
"EditorTarget": "FlaxEditor"
|
||||
}
|
||||
@@ -234,6 +234,7 @@
|
||||
<s:String x:Key="/Default/PatternsAndTemplates/Todo/TodoPatterns/=EEA05B0ED8200E4BA9D2D3F1052EBFFD/Name/@EntryValue">Deprecated</s:String>
|
||||
<s:String x:Key="/Default/PatternsAndTemplates/Todo/TodoPatterns/=EEA05B0ED8200E4BA9D2D3F1052EBFFD/Pattern/@EntryValue">(?<=\W|^)(?<TAG>\[Deprecated)(\W|$)(.*)</s:String>
|
||||
<s:String x:Key="/Default/PatternsAndTemplates/Todo/TodoPatterns/=EEA05B0ED8200E4BA9D2D3F1052EBFFD/TodoIconStyle/@EntryValue">Normal</s:String>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ackermann/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=analytics/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Antialiasing/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=backbuffer/@EntryIndexedValue">True</s:Boolean>
|
||||
|
||||
@@ -6,34 +6,19 @@ setlocal
|
||||
pushd
|
||||
echo Generating Flax Engine project files...
|
||||
|
||||
rem Make sure the batch file exists in the root folder.
|
||||
if not exist "%~dp0\Source" goto Error_BatchFileInWrongLocation
|
||||
if not exist "Development\Scripts\Windows\CallBuildTool.bat" goto Error_BatchFileInWrongLocation
|
||||
|
||||
rem Run Flax.Build to generate Visual Studio solution and project files (also pass the arguments)
|
||||
call "Development\Scripts\Windows\CallBuildTool.bat" -genproject %*
|
||||
if errorlevel 1 goto Error_BuildToolFailed
|
||||
if errorlevel 1 goto BuildToolFailed
|
||||
|
||||
rem Done.
|
||||
popd
|
||||
echo Done!
|
||||
exit /B 0
|
||||
|
||||
:Error_BatchFileInWrongLocation
|
||||
echo.
|
||||
echo The batch file does not appear to be located in the root directory. This script must be run from within that directory.
|
||||
echo.
|
||||
pause
|
||||
goto Exit
|
||||
|
||||
:Error_BuildToolFailed
|
||||
echo.
|
||||
:BuildToolFailed
|
||||
echo Flax.Build tool failed.
|
||||
echo.
|
||||
pause
|
||||
goto Exit
|
||||
|
||||
:Exit
|
||||
rem Restore original directory before exit.
|
||||
popd
|
||||
exit /B 1
|
||||
|
||||
Regular → Executable
+2
-16
@@ -6,32 +6,18 @@ setlocal
|
||||
pushd
|
||||
echo Performing the full package...
|
||||
|
||||
rem Make sure the batch file exists in the root folder.
|
||||
if not exist "%~dp0\Source" goto Error_BatchFileInWrongLocation
|
||||
if not exist "Development\Scripts\Windows\CallBuildTool.bat" goto Error_BatchFileInWrongLocation
|
||||
|
||||
rem Run the build tool.
|
||||
call "Development\Scripts\Windows\CallBuildTool.bat" -deploy -deployEditor -deployPlatforms -verbose -log -logFile="Cache\Intermediate\PackageLog.txt" %*
|
||||
if errorlevel 1 goto Error_BuildToolFailed
|
||||
if errorlevel 1 goto BuildToolFailed
|
||||
|
||||
rem Done.
|
||||
popd
|
||||
echo Done!
|
||||
exit /B 0
|
||||
|
||||
:Error_BatchFileInWrongLocation
|
||||
echo.
|
||||
echo The batch file does not appear to be located in the root directory. This script must be run from within that directory.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Error_BuildToolFailed
|
||||
echo.
|
||||
:BuildToolFailed
|
||||
echo Flax.Build tool failed.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Exit
|
||||
rem Restore original directory before exit.
|
||||
popd
|
||||
exit /B 1
|
||||
|
||||
+3
-17
@@ -6,32 +6,18 @@ setlocal
|
||||
pushd
|
||||
echo Building and packaging Flax Editor...
|
||||
|
||||
rem Make sure the batch file exists in the root folder.
|
||||
if not exist "%~dp0\Source" goto Error_BatchFileInWrongLocation
|
||||
if not exist "Development\Scripts\Windows\CallBuildTool.bat" goto Error_BatchFileInWrongLocation
|
||||
|
||||
rem Run Flax.Build to generate Visual Studio solution and project files (also pass the arguments)
|
||||
rem Run the build tool.
|
||||
call "Development\Scripts\Windows\CallBuildTool.bat" -deploy -deployEditor -verbose -log -logFile="Cache\Intermediate\PackageLog.txt" %*
|
||||
if errorlevel 1 goto Error_BuildToolFailed
|
||||
if errorlevel 1 goto BuildToolFailed
|
||||
|
||||
rem Done.
|
||||
popd
|
||||
echo Done!
|
||||
exit /B 0
|
||||
|
||||
:Error_BatchFileInWrongLocation
|
||||
echo.
|
||||
echo The batch file does not appear to be located in the root directory. This script must be run from within that directory.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Error_BuildToolFailed
|
||||
echo.
|
||||
:BuildToolFailed
|
||||
echo Flax.Build tool failed.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Exit
|
||||
rem Restore original directory before exit.
|
||||
popd
|
||||
exit /B 1
|
||||
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
||||
|
||||
set -e
|
||||
|
||||
echo Building and packaging Flax Editor...
|
||||
|
||||
# Change the path to the script root
|
||||
cd "`dirname "$0"`"
|
||||
|
||||
# Run Flax.Build (also pass the arguments)
|
||||
bash ./Development/Scripts/Linux/CallBuildTool.sh --deploy --deployEditor --verbose --log --logFile="Cache/Intermediate/PackageLog.txt" "$@"
|
||||
+3
-17
@@ -6,32 +6,18 @@ setlocal
|
||||
pushd
|
||||
echo Building and packaging platforms data...
|
||||
|
||||
rem Make sure the batch file exists in the root folder.
|
||||
if not exist "%~dp0\Source" goto Error_BatchFileInWrongLocation
|
||||
if not exist "Development\Scripts\Windows\CallBuildTool.bat" goto Error_BatchFileInWrongLocation
|
||||
|
||||
rem Run Flax.Build to generate Visual Studio solution and project files (also pass the arguments)
|
||||
rem Run the build tool.
|
||||
call "Development\Scripts\Windows\CallBuildTool.bat" -deploy -deployPlatforms -verbose -log -logFile="Cache\Intermediate\PackageLog.txt" %*
|
||||
if errorlevel 1 goto Error_BuildToolFailed
|
||||
if errorlevel 1 goto BuildToolFailed
|
||||
|
||||
rem Done.
|
||||
popd
|
||||
echo Done!
|
||||
exit /B 0
|
||||
|
||||
:Error_BatchFileInWrongLocation
|
||||
echo.
|
||||
echo The batch file does not appear to be located in the root directory. This script must be run from within that directory.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Error_BuildToolFailed
|
||||
echo.
|
||||
:BuildToolFailed
|
||||
echo Flax.Build tool failed.
|
||||
echo.
|
||||
goto Exit
|
||||
|
||||
:Exit
|
||||
rem Restore original directory before exit.
|
||||
popd
|
||||
exit /B 1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user