Compare commits
1260 Commits
zed_editor
...
sdl_mac_fi
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e969649ae | |||
| 3288fe4006 | |||
| fd334769b2 | |||
| 576130f74f | |||
| b99c8ddda7 | |||
|
|
2fc95bdf57 | ||
|
|
9a7abd751f | ||
|
|
cabae8142d | ||
|
|
2d0da37907 | ||
|
|
42ec33bd9a | ||
|
|
806027408a | ||
|
|
dc6d53de7c | ||
|
|
70f2eee172 | ||
|
|
7737dbc77f | ||
|
|
9d9d582598 | ||
|
|
f1796dc8c8 | ||
|
|
ebb4ff1dc2 | ||
|
|
ea5e7f1416 | ||
|
|
917e62621d | ||
|
|
a88e3265cd | ||
|
|
b2d1d0f1d9 | ||
|
|
c6204fc274 | ||
|
|
8b383d4dbe | ||
|
|
7b695bf6bf | ||
|
|
327547a895 | ||
|
|
e2fbd83086 | ||
|
|
d96e1297f7 | ||
|
|
2748216190 | ||
|
|
b2457b6ee6 | ||
|
|
bf20f5d2bf | ||
|
|
767854a2af | ||
|
|
243173df3c | ||
|
|
408c6d96b1 | ||
|
|
039407b6ee | ||
|
|
71ff0c6362 | ||
|
|
b3aeab777f | ||
|
|
b8110e9db3 | ||
|
|
f500fcd6fd | ||
|
|
bda0dee371 | ||
|
|
ec756fe626 | ||
|
|
b78ff57f6a | ||
|
|
9fa9e75e08 | ||
|
|
095f7277e2 | ||
|
|
f26dbf530c | ||
|
|
76378156f7 | ||
|
|
c12948c6cc | ||
|
|
e99dc8dce4 | ||
|
|
258ba233d5 | ||
|
|
2b538e4864 | ||
|
|
a0dc300a7b | ||
|
|
9f54bca831 | ||
|
|
bb2ee7260f | ||
|
|
1bef4d00ad | ||
|
|
81176c98a1 | ||
|
|
6c4fc44163 | ||
|
|
a41f2e9260 | ||
|
|
cc9e41fe44 | ||
|
|
4d77ced41d | ||
|
|
54202eeb8a | ||
|
|
0e1c5cd6f8 | ||
|
|
8f50d9faec | ||
|
|
5249864af4 | ||
|
|
3e5ceb1e1e | ||
|
|
ed46025a11 | ||
|
|
706b24e1c8 | ||
|
|
f5651de725 | ||
|
|
51ff2969e1 | ||
|
|
5773dc47f4 | ||
|
|
c30c56e8eb | ||
|
|
eab7794e3b | ||
|
|
b347cd2f54 | ||
|
|
78052fbaec | ||
|
|
557dc9b649 | ||
|
|
9fbcce13b3 | ||
|
|
6d433d4ef7 | ||
|
|
7531b1fdbd | ||
|
|
58586ca4f0 | ||
|
|
09a0573932 | ||
|
|
b6789ee523 | ||
|
|
f1b6c13ba9 | ||
|
|
ccc8d209da | ||
|
|
e624e1ba69 | ||
|
|
d0cc88f82a | ||
|
|
a48ce78733 | ||
|
|
d1f6440a76 | ||
|
|
5ccc33719e | ||
|
|
0f09cad1cf | ||
|
|
f92ec30e1b | ||
|
|
a9fbbaa88e | ||
|
|
3db3eb58a3 | ||
|
|
e455c874c6 | ||
|
|
32af903a2d | ||
|
|
c12553812c | ||
|
|
c9df03d293 | ||
|
|
c71e1d78e0 | ||
|
|
a84109df2c | ||
|
|
9d0e4e9768 | ||
|
|
3f2e6d82c9 | ||
|
|
56b208ad85 | ||
|
|
842b25f80f | ||
|
|
27a1db617c | ||
|
|
8356009526 | ||
|
|
0cbb2f0525 | ||
|
|
0ac5e85cd9 | ||
|
|
9b5dbe858c | ||
|
|
914e0869b1 | ||
|
|
2c742bee41 | ||
|
|
a9ac4d427f | ||
|
|
0f332e331d | ||
|
|
be69453bfd | ||
|
|
5e6723aa22 | ||
|
|
c7449c8f95 | ||
|
|
e23cbd1de9 | ||
|
|
0fe297c390 | ||
|
|
b10303cd8d | ||
|
|
9e9715a2ea | ||
|
|
a04995174f | ||
|
|
e4a97258f3 | ||
|
|
912f5fb4f3 | ||
|
|
4d9898770a | ||
|
|
508ccb714c | ||
|
|
0c1da8e13b | ||
|
|
d40573df5b | ||
|
|
707d19284d | ||
|
|
5a6b07e4c5 | ||
|
|
935645d553 | ||
|
|
d9f2931b9e | ||
|
|
0770f4a216 | ||
|
|
ecc9406968 | ||
|
|
d06be3d1d6 | ||
|
|
aeecadffb0 | ||
|
|
f3e23b6420 | ||
|
|
7c5b1942e6 | ||
|
|
9850761b5c | ||
|
|
1e1f7ce56d | ||
|
|
64005c2774 | ||
|
|
22ad2d1fab | ||
|
|
9d478b570f | ||
|
|
35fb320ff0 | ||
|
|
e000a6727e | ||
|
|
3a3b997e97 | ||
|
|
f3c957481c | ||
|
|
e8134803c4 | ||
|
|
7b3cfd989f | ||
|
|
13f5222ec7 | ||
|
|
29abfbcdc9 | ||
|
|
a63e05d444 | ||
|
|
f0f1c57ff1 | ||
|
|
d2ef0671e3 | ||
|
|
5383de10b8 | ||
|
|
1318dde3ca | ||
|
|
90e96678a6 | ||
|
|
2e13c6043d | ||
|
|
32d0241f54 | ||
|
|
e8fe1cd044 | ||
|
|
956a9b8fab | ||
|
|
5732290c29 | ||
|
|
601b40dd86 | ||
|
|
7f1add4bdd | ||
|
|
fa17d83501 | ||
|
|
99d3da467e | ||
|
|
b54794255a | ||
|
|
ce5dd6bc16 | ||
|
|
45feda8f07 | ||
|
|
bd4c20d9ce | ||
|
|
cc89a1e1ca | ||
|
|
df6b550c3d | ||
|
|
0cb5e3421a | ||
|
|
4d5bf4ec0c | ||
|
|
88fe9ba186 | ||
|
|
b756c16018 | ||
|
|
1e44bb1832 | ||
|
|
3baec506e2 | ||
|
|
90a0cc0e03 | ||
|
|
a346e258d3 | ||
|
|
c673e9f52d | ||
|
|
1bd86ca28b | ||
|
|
4594a84753 | ||
|
|
a1af870874 | ||
|
|
b8d5ea595e | ||
|
|
5404dff5c2 | ||
|
|
a5ec8565e4 | ||
|
|
e5d526c9af | ||
|
|
cb9e09c21b | ||
|
|
750fd1f941 | ||
|
|
1308465280 | ||
|
|
a38633c453 | ||
|
|
3949cba83c | ||
|
|
e10d784e83 | ||
|
|
0f5c5dcf3e | ||
|
|
ed3a827b5f | ||
|
|
7f49cae9af | ||
|
|
427f4647fc | ||
|
|
d5d10aa329 | ||
|
|
5b2b1930d2 | ||
|
|
5655cc8f42 | ||
|
|
8bad080d59 | ||
|
|
0237235dcb | ||
|
|
a5bbf0dbde | ||
|
|
5ec018b904 | ||
|
|
f2a13b64d4 | ||
|
|
44ecac7ffc | ||
|
|
60076d48c7 | ||
|
|
2fbeac6077 | ||
|
|
57355a741e | ||
|
|
14d6273a2f | ||
|
|
0cec65f35f | ||
|
|
fcdd05dede | ||
|
|
e008c7e2b4 | ||
|
|
f42a9a760a | ||
|
|
80767d65ae | ||
|
|
21b2e59fbb | ||
|
|
5fb1ad078b | ||
|
|
1fc5316d12 | ||
|
|
1ceb781903 | ||
|
|
d3891688f0 | ||
|
|
f876068086 | ||
|
|
6ae68bc6cc | ||
|
|
a8e7faec3c | ||
|
|
ab6e291976 | ||
|
|
2cb12e3c0f | ||
|
|
c91c209974 | ||
|
|
45a8d82a83 | ||
|
|
b41d25cbce | ||
|
|
3d201ec73f | ||
|
|
fa91e3e3ab | ||
|
|
38c87c158a | ||
|
|
241d37130a | ||
|
|
21981f666f | ||
|
|
afe917a7f3 | ||
|
|
d2a03b90ec | ||
|
|
88587fb6a4 | ||
|
|
895758d27d | ||
|
|
48d86ac7ae | ||
|
|
bc3cddc774 | ||
|
|
d784fddf95 | ||
|
|
fc7abbf541 | ||
|
|
8b4f8de988 | ||
|
|
549ed76e7c | ||
|
|
e7016564b1 | ||
|
|
8318a9c1d0 | ||
|
|
6b1490dac4 | ||
|
|
5c51652e16 | ||
|
|
6736f2f77a | ||
|
|
ab685ccc8c | ||
|
|
b5d841ffc9 | ||
|
|
cb17bcd2ff | ||
|
|
f17b7b3c79 | ||
|
|
1374a0440b | ||
|
|
7fa40eba83 | ||
|
|
62e492452d | ||
|
|
30d7588d9c | ||
|
|
e736048fab | ||
|
|
14e59281e4 | ||
|
|
895dcf4aa6 | ||
|
|
6d9d606085 | ||
|
|
a94b9f9426 | ||
|
|
ace84ae29f | ||
|
|
22c88eb59d | ||
|
|
96bbae8e28 | ||
|
|
479c5f896c | ||
|
|
0d3642f39d | ||
|
|
e47e1998a1 | ||
|
|
62492c7607 | ||
|
|
c3aecc1a11 | ||
|
|
6629ead842 | ||
|
|
14dd70fb3d | ||
|
|
2000a95fa7 | ||
|
|
68ac2f4c79 | ||
|
|
05aaf0dc99 | ||
|
|
f33db8647a | ||
|
|
0ade65036e | ||
|
|
b8bb40fcf8 | ||
|
|
0d133cfbdc | ||
|
|
337fea0f69 | ||
|
|
ee23196548 | ||
|
|
394dc31bb0 | ||
|
|
deadb6f6d0 | ||
|
|
a6c6be9c2e | ||
|
|
93a38566ea | ||
|
|
2a2f046f30 | ||
|
|
73b4b0dcee | ||
|
|
b930ae0ca9 | ||
|
|
8cdb6d77ab | ||
|
|
afc4d0f3d3 | ||
|
|
3bbaa7025a | ||
|
|
5509bc4989 | ||
|
|
3cfa110a48 | ||
|
|
1ab3917332 | ||
|
|
2fb1e5bef7 | ||
|
|
a4cb839c6f | ||
|
|
3b1960b977 | ||
|
|
116f15f4ae | ||
|
|
a0bb8efc2b | ||
|
|
90ffc4e5f9 | ||
|
|
bf11575346 | ||
|
|
8dc8371a7f | ||
|
|
ee38f88562 | ||
|
|
e90de5d815 | ||
|
|
7fe7a8dd0e | ||
|
|
8afc25b19c | ||
|
|
37a39e750f | ||
|
|
59a9137a54 | ||
|
|
f4c1e81f64 | ||
|
|
7391af1c37 | ||
|
|
c376f220ca | ||
|
|
5ce0a1535f | ||
|
|
06bf9def8e | ||
|
|
57489abc3a | ||
|
|
200aca93d3 | ||
|
|
f8eae517f0 | ||
|
|
3a651bc660 | ||
|
|
4b7828f686 | ||
|
|
befb74297a | ||
|
|
c0e16cd34a | ||
|
|
e710a6e2d1 | ||
|
|
c378cd1d47 | ||
|
|
cd74b300f1 | ||
|
|
26cd07933e | ||
|
|
c4342b0a20 | ||
|
|
3038c56af4 | ||
|
|
3dc3e25649 | ||
|
|
e7071fbe43 | ||
|
|
01670ec6ae | ||
|
|
4d4571ee55 | ||
|
|
83bbb4f6ba | ||
|
|
a406d6dba2 | ||
|
|
72bd624384 | ||
|
|
82a02698df | ||
|
|
befac36a4f | ||
|
|
1282dffca9 | ||
|
|
b291cd93c3 | ||
|
|
28257296b9 | ||
|
|
164e380672 | ||
|
|
438a9e4c3d | ||
|
|
5942209114 | ||
|
|
06788055fe | ||
|
|
26838609db | ||
|
|
b408a8ce21 | ||
|
|
6fcc963cf6 | ||
|
|
0fa3472f24 | ||
|
|
c0056f3d9d | ||
|
|
b8fcb51aa3 | ||
|
|
341dc08f7c | ||
|
|
f0873411df | ||
|
|
94789712e8 | ||
|
|
d163064f95 | ||
|
|
64c2d64d84 | ||
|
|
a9c510c296 | ||
|
|
1ef35c3f94 | ||
|
|
23c3edcab9 | ||
|
|
2c98d80506 | ||
|
|
ac36840037 | ||
|
|
dfdcd47ad7 | ||
|
|
414c650550 | ||
|
|
2d9ca4c335 | ||
|
|
6c19996f95 | ||
|
|
377d5c00aa | ||
|
|
93ca9f1cb0 | ||
|
|
c62b3f7624 | ||
|
|
5fb9cf3be1 | ||
|
|
ceebc68d18 | ||
|
|
66b4c64f98 | ||
|
|
aff8090adb | ||
|
|
cee1b72f2f | ||
|
|
b9b11b3c2a | ||
|
|
feca1c7994 | ||
|
|
bd39e449d7 | ||
|
|
836e1d4f39 | ||
|
|
792393345d | ||
|
|
66be7ebc50 | ||
|
|
f8b161c04e | ||
|
|
bac361baf6 | ||
|
|
10bcf9c9a3 | ||
|
|
075727ab53 | ||
|
|
5a4e94d263 | ||
|
|
ad3c2be510 | ||
|
|
5641bf63e8 | ||
|
|
79a17d8fe3 | ||
|
|
6814a43418 | ||
|
|
6891256afe | ||
|
|
17b097b1a3 | ||
|
|
a96c7e631e | ||
|
|
9df5da2a88 | ||
|
|
3e63551e90 | ||
|
|
2a426e2812 | ||
|
|
c4f4983f6d | ||
|
|
a925c7410a | ||
|
|
f7e2f3a4d5 | ||
|
|
b1befacb84 | ||
|
|
23ebb0e754 | ||
| 5f9e8dedec | |||
|
|
3b2015e816 | ||
|
|
f1e851e1b8 | ||
|
|
b191d3918e | ||
|
|
db46050b16 | ||
|
|
24a11ac2a8 | ||
|
|
1cf69361a1 | ||
|
|
689fab2ba4 | ||
|
|
b36c757753 | ||
|
|
63f19aa4d6 | ||
|
|
8728d88dde | ||
|
|
f6888b099e | ||
|
|
239ceb75a9 | ||
|
|
20c9ed27fb | ||
|
|
ac4526744a | ||
|
|
d2a8ac54cf | ||
|
|
153b16ebd7 | ||
|
|
b535791c66 | ||
|
|
6ed7e8fa40 | ||
|
|
9d95bbaa8c | ||
|
|
e41ec4ebfd | ||
|
|
195d5b1aa2 | ||
|
|
7ea3fb1500 | ||
|
|
9be8589437 | ||
|
|
ff81d339ef | ||
|
|
7858225565 | ||
|
|
83bd1deafd | ||
|
|
9158e1c270 | ||
|
|
f0d182771d | ||
|
|
6081ed35bc | ||
|
|
4ca10c7869 | ||
|
|
9fc31b1021 | ||
|
|
366a5162b7 | ||
|
|
6fd58c418e | ||
|
|
08d9ae0ae6 | ||
|
|
27eb53e1a1 | ||
|
|
31b5685251 | ||
|
|
894cf2c886 | ||
|
|
5b3079acde | ||
|
|
0f49503abd | ||
|
|
be4e1edc3e | ||
|
|
1982694ef0 | ||
|
|
8b475e9f54 | ||
|
|
2b546eb4b3 | ||
|
|
69cefb6822 | ||
|
|
9772227146 | ||
|
|
34bddc7db1 | ||
|
|
7ff4ce18ff | ||
|
|
6e7a7c9350 | ||
|
|
2a9c6bbd1d | ||
|
|
0835a6559c | ||
|
|
489c4a3661 | ||
|
|
43dca143fa | ||
|
|
6bd13feba6 | ||
|
|
d1557e5292 | ||
|
|
c9fbafe014 | ||
|
|
0612b923e1 | ||
|
|
6f13a33be2 | ||
|
|
4ccf969f7a | ||
|
|
3d206e06d0 | ||
|
|
25e90deed6 | ||
|
|
7bc687194f | ||
|
|
d3bd377264 | ||
|
|
974c55418b | ||
|
|
0870a86a3a | ||
|
|
dd2e2c5b3a | ||
|
|
75a1b14beb | ||
|
|
8a760dc1e2 | ||
|
|
fc0b885a14 | ||
|
|
f12ad5c874 | ||
|
|
fd0584b406 | ||
|
|
374f6e40bb | ||
|
|
9c9e17a9d9 | ||
|
|
865a26cbbe | ||
|
|
56e825cad4 | ||
|
|
1df608e902 | ||
|
|
07f031e4c5 | ||
|
|
06c31a39f2 | ||
|
|
2a6e38e020 | ||
|
|
cc69e5d966 | ||
|
|
d68969dbe2 | ||
|
|
c4d20f06ee | ||
|
|
3c5c6f9883 | ||
|
|
8e7dc2a91e | ||
|
|
4ddbc8ba5c | ||
|
|
15f379e87f | ||
|
|
d4a7b3074e | ||
|
|
a3492e59ef | ||
|
|
515ad56fa2 | ||
|
|
ebd20dd816 | ||
|
|
019a9f6089 | ||
|
|
273b110db4 | ||
|
|
0bea701a83 | ||
|
|
ee22b9dc25 | ||
|
|
a1096aaf92 | ||
|
|
c631c37a34 | ||
|
|
885ee15767 | ||
|
|
c978ab2b84 | ||
|
|
f045b5b6b6 | ||
|
|
c51a023e61 | ||
|
|
645df4fb06 | ||
|
|
b53028782f | ||
|
|
ef551c36ae | ||
|
|
e851efa0a8 | ||
| 0084bc051c | |||
|
|
07b6d3558a | ||
|
|
9c8023d64f | ||
|
|
6d02f5d9da | ||
|
|
1f9f281c31 | ||
|
|
846b64048f | ||
|
|
55f73b6cf7 | ||
|
|
0f6c1aea62 | ||
|
|
d2ee61ef8d | ||
|
|
a1399c5157 | ||
|
|
7b7a92758f | ||
|
|
2a21141dd4 | ||
|
|
eac9f67bc1 | ||
|
|
bd300651ec | ||
|
|
a2b0d0714e | ||
|
|
3d66316716 | ||
|
|
9c32f978fb | ||
|
|
b19611e3d2 | ||
|
|
37e776e407 | ||
|
|
ed5ad91a32 | ||
|
|
ecddb8aae5 | ||
|
|
a855b17cc0 | ||
|
|
27dd1bda25 | ||
|
|
4afd9fd8df | ||
|
|
73c19b278f | ||
|
|
b4cb1028ed | ||
|
|
4a7f1a5fde | ||
|
|
5d0fdc8313 | ||
|
|
70b324cdec | ||
|
|
20516bb8bc | ||
|
|
c18b9163ca | ||
|
|
db5b65beac | ||
|
|
78e5baf6a5 | ||
|
|
05a0a6b539 | ||
|
|
4833c19366 | ||
|
|
65fd22f5b6 | ||
|
|
f57df83d26 | ||
|
|
66894b71fa | ||
|
|
7e9ee0610a | ||
|
|
3adda3629e | ||
|
|
f733611213 | ||
|
|
a57fe6c04d | ||
|
|
29b043342a | ||
|
|
8d8bf87c69 | ||
|
|
ca54313bd8 | ||
|
|
780e78f056 | ||
|
|
4d447b7544 | ||
|
|
7a96c1ff76 | ||
|
|
83c15c05bb | ||
|
|
9a44902949 | ||
|
|
e84b5410ec | ||
|
|
9ac19cbd2f | ||
|
|
39a2bc2535 | ||
|
|
15771355cb | ||
|
|
ab88a6339a | ||
|
|
f3111e855d | ||
|
|
3c6838ee35 | ||
|
|
36ab08e60d | ||
|
|
834c4553b2 | ||
|
|
5a95336601 | ||
|
|
f26fae2daf | ||
|
|
20df4289c2 | ||
|
|
217701ae05 | ||
|
|
f1509bab28 | ||
|
|
30fdd7336e | ||
|
|
3b120cc5a4 | ||
|
|
4cf0c38940 | ||
|
|
0f383d2fc6 | ||
| 483df22929 | |||
|
|
07f21a1520 | ||
| f870fc3ae2 | |||
|
|
bbb5354e9c | ||
|
|
21e2c830e5 | ||
|
|
c828c90161 | ||
|
|
f725f4c0b9 | ||
|
|
1535f95cf1 | ||
|
|
b1f85b7462 | ||
|
|
3a0af54f48 | ||
|
|
4e3e9386cc | ||
|
|
b27e556363 | ||
|
|
449fc597b5 | ||
|
|
b0a0c5b66c | ||
|
|
f1d5c0257f | ||
|
|
ae46520edf | ||
|
|
0e91a2d25b | ||
|
|
aba995a42f | ||
|
|
bf0c7fe0dc | ||
|
|
2ab8b9dd55 | ||
|
|
e1ffdee57a | ||
|
|
7c44767d4d | ||
|
|
87ccaa9dd8 | ||
|
|
e8c2f18a4d | ||
|
|
6b36543717 | ||
|
|
bb2a883dc7 | ||
|
|
be7e88de36 | ||
|
|
4a1490f0b1 | ||
|
|
e0d0acc33c | ||
|
|
e2f2d3e6f6 | ||
|
|
afc04dc41c | ||
|
|
bdfa503c05 | ||
|
|
205a8b2ebe | ||
|
|
d18c245730 | ||
|
|
e4eb064562 | ||
|
|
9fc9382e58 | ||
|
|
2bf9efaf30 | ||
|
|
528b4c89ce | ||
|
|
277dabc8b4 | ||
|
|
9a5bc444ba | ||
|
|
e834fc5a42 | ||
|
|
6b87985a44 | ||
|
|
a65a74b866 | ||
|
|
b2124201d5 | ||
|
|
29b8326042 | ||
|
|
81bfa6edc9 | ||
|
|
8ed6a92022 | ||
|
|
c9d16e16cc | ||
|
|
d9f9401c5a | ||
|
|
1e9918b9cc | ||
|
|
6c84b7a259 | ||
|
|
43b337e163 | ||
|
|
45306ca20e | ||
|
|
259d93f95c | ||
|
|
61b6aeb252 | ||
|
|
d694c35db4 | ||
|
|
f105d6f84f | ||
|
|
b1b6953200 | ||
|
|
fa428e343b | ||
|
|
5d9d64e6e7 | ||
|
|
dbbb67f398 | ||
|
|
a9bddfa784 | ||
|
|
f9b784a42a | ||
|
|
d47bd5d6e7 | ||
|
|
e1013aec94 | ||
|
|
1c294059df | ||
|
|
305296883d | ||
|
|
a7016d1186 | ||
|
|
004e02af73 | ||
|
|
143d714037 | ||
|
|
da8376bba1 | ||
|
|
4e8f54bb61 | ||
|
|
0eac545271 | ||
|
|
f773a0755d | ||
|
|
d8343dae8e | ||
|
|
b09fbe2d9b | ||
|
|
6dbfd25bdb | ||
|
|
ecfd03f79c | ||
|
|
66a295d5af | ||
|
|
d7458d81a5 | ||
|
|
cc5e4c19e1 | ||
|
|
0c5cb59875 | ||
|
|
85ed0ecb06 | ||
|
|
95b9392f51 | ||
|
|
c7c1bbe35f | ||
|
|
192d3d1a8e | ||
|
|
877d57681d | ||
|
|
0a9bc084f4 | ||
|
|
ec4f8ce239 | ||
|
|
d049a16882 | ||
|
|
ee75cab73e | ||
|
|
0072e21ffa | ||
|
|
f44dde89db | ||
|
|
e6fd761b80 | ||
|
|
62a378e01a | ||
|
|
e67b705397 | ||
|
|
847f6411e7 | ||
|
|
0d7c04682d | ||
|
|
baf068330c | ||
|
|
593646061e | ||
|
|
9ac231c403 | ||
|
|
d2d7a871ce | ||
|
|
b172b08782 | ||
|
|
18778aa511 | ||
|
|
b7e32e13ab | ||
|
|
610c76578b | ||
|
|
e721fbd89f | ||
|
|
ff2c5290b5 | ||
|
|
2b4dc97a97 | ||
|
|
14842183f2 | ||
|
|
b4b13d8dd4 | ||
|
|
e3d1e8a5ea | ||
|
|
d9f90f726b | ||
|
|
e0062a6ff1 | ||
|
|
e494c9ec76 | ||
|
|
2501095500 | ||
|
|
ec0877004c | ||
|
|
3cfc5db54a | ||
|
|
840835fad2 | ||
|
|
41f136ce0f | ||
|
|
32cae3aacd | ||
|
|
832c524c3c | ||
|
|
a18ca9a4ad | ||
|
|
05e7e6630c | ||
|
|
788d8660b8 | ||
|
|
ab806b2a9b | ||
|
|
610ba00915 | ||
|
|
e60bd165f4 | ||
|
|
223d4f64eb | ||
|
|
827ad85651 | ||
|
|
69c5d65318 | ||
|
|
b834dddb11 | ||
|
|
baddfec6d1 | ||
|
|
fc2f56aca6 | ||
|
|
0364fd629b | ||
|
|
5dbaf3f94e | ||
|
|
c5b7ea9c44 | ||
|
|
7b856fdc95 | ||
|
|
890df65970 | ||
|
|
ab6dfca36e | ||
|
|
72bb2dd932 | ||
|
|
ca09852898 | ||
|
|
e21cb9154a | ||
|
|
af124ce163 | ||
|
|
c28381fb09 | ||
|
|
973ff0efa0 | ||
|
|
27896b6410 | ||
|
|
4bb9de21b4 | ||
|
|
890538c667 | ||
|
|
4b9fa0dcf5 | ||
|
|
14d1b7dd24 | ||
|
|
6788844270 | ||
|
|
b2f2537338 | ||
|
|
450b998a29 | ||
|
|
688d9c77cb | ||
|
|
d71ea5a72b | ||
|
|
01e3ece2af | ||
|
|
afc65f7557 | ||
|
|
d60484b917 | ||
| feceb4e00f | |||
| 67b33a575a | |||
|
|
76b869146d | ||
|
|
32e725392b | ||
|
|
0975ac2a25 | ||
|
|
cf3bcc4549 | ||
|
|
11ea889fa9 | ||
|
|
c5a28a5734 | ||
|
|
b171071893 | ||
|
|
6c79a17c7a | ||
|
|
b24d98df9e | ||
|
|
400e2f1b0e | ||
|
|
22e6139ca3 | ||
|
|
859fa16a74 | ||
|
|
8facb46def | ||
|
|
b87f8b96e1 | ||
|
|
37df16a3e4 | ||
|
|
ce45fa3d54 | ||
|
|
7f56d9456b | ||
|
|
91fd32b708 | ||
|
|
1cad2489a3 | ||
|
|
7cdc2456cd | ||
|
|
6b0ee3eeed | ||
|
|
57330e39ca | ||
|
|
af29f2f3dc | ||
|
|
1bdb577b60 | ||
|
|
329ea1c9b4 | ||
|
|
728da6354f | ||
|
|
d5456d6eb3 | ||
|
|
e65714988f | ||
|
|
4e4df736f9 | ||
|
|
5bfe5b0035 | ||
|
|
b30553ea65 | ||
|
|
2550763808 | ||
|
|
6f6dd2f4a3 | ||
|
|
c30d457b1c | ||
|
|
b786fa1c22 | ||
|
|
bbcbe305a8 | ||
|
|
222df16f11 | ||
|
|
8b924d13c1 | ||
|
|
66e25c81b0 | ||
|
|
e12f99ee53 | ||
|
|
387f0cf457 | ||
|
|
f11acdf5db | ||
|
|
3af7dddcc2 | ||
|
|
543e2ecd13 | ||
| 35f8051a62 | |||
| 4453453d46 | |||
|
|
23f5f4d85f | ||
|
|
90a21696f6 | ||
|
|
fa38f0ac91 | ||
|
|
3279016067 | ||
|
|
a92d2b6ca2 | ||
|
|
a98a76f6e5 | ||
| e3f5af530b | |||
|
|
564c9ff0ca | ||
|
|
38d8832468 | ||
|
|
c68aa3b371 | ||
| d031649bbd | |||
| 21b8d1838d | |||
| c8ee2fc155 | |||
|
|
dc22fa4061 | ||
| 3eb690fe58 | |||
| 52e2327527 | |||
| f95cbb0e52 | |||
| 518a19c857 | |||
| c0b54be692 | |||
|
|
c2c92eba82 | ||
| d64c28f672 | |||
|
|
21d46dad07 | ||
| 71b222e0b0 | |||
| 5921f60af2 | |||
| 39269583c3 | |||
| cba3899c62 | |||
|
|
cfda18ea9d | ||
|
|
31b1ceb9f0 | ||
|
|
d3d67fddcc | ||
|
|
e272870803 | ||
|
|
d8c90184b9 | ||
| 2a959d0531 | |||
|
|
5b1ca13225 | ||
|
|
0d8ac5b7ac | ||
|
|
b714668f4c | ||
| f6e9cf644a | |||
| 604bfb5fe6 | |||
| b3ea47b989 | |||
| 5d368e59a0 | |||
| 3afd3ce2d5 | |||
|
|
4504d0ae96 | ||
| f14ba6ace6 | |||
| 518f9dc9dc | |||
| 8db29a30e0 | |||
|
|
1b9f6ed20f | ||
|
|
2c5cc7fcc0 | ||
|
|
b9f177d1ab | ||
|
|
0e76585709 | ||
|
|
8bf51512ac | ||
|
|
779e8e7169 | ||
|
|
3c8b80152b | ||
|
|
f280412ef4 | ||
|
|
9708601d3b | ||
|
|
d671f57952 | ||
|
|
56e6df261d | ||
|
|
88b02105b3 | ||
| 1327fa40cb | |||
| b70ab01308 | |||
| 46fd5a5855 | |||
| 74c1e200ce | |||
| 31945a53a2 | |||
| 3e91ba3fb2 | |||
|
|
0094216ff8 | ||
|
|
298ee284e1 | ||
|
|
7f2f73afd8 | ||
|
|
e257f9e4a0 | ||
|
|
056de752ed | ||
|
|
76700c0b24 | ||
|
|
9fdcff657d | ||
|
|
2b6339c05c | ||
|
|
bb91202439 | ||
|
|
f25e9f262a | ||
|
|
ee51077f49 | ||
|
|
950e958a58 | ||
|
|
5fdbed2b56 | ||
|
|
0e627577fc | ||
|
|
4846d4b024 | ||
|
|
5e5293bf7b | ||
|
|
d88477dcae | ||
| ae03bc2dd2 | |||
| 5cd27032b4 | |||
| 7445064d97 | |||
| 9f8b15f0d5 | |||
|
|
bb2e22ecf2 | ||
|
|
bd58bd91b4 | ||
|
|
7ce0d88bdc | ||
|
|
98bb2d40d6 | ||
|
|
f4bc620bbd | ||
|
|
0313bf32c9 | ||
|
|
0c887cd29e | ||
|
|
5bd9bce634 | ||
|
|
2a53d0a462 | ||
|
|
b5b1d84b3f | ||
| 82bd915274 | |||
|
|
e47fc5a54a | ||
|
|
26e24769be | ||
|
|
71391cf1cc | ||
|
|
b5286af526 | ||
|
|
9f07a2a54e | ||
|
|
4b62395d69 | ||
|
|
c39c642b60 | ||
|
|
02cff3973a | ||
|
|
a63b97d31d | ||
|
|
ca52122656 | ||
|
|
20a7fcf6a0 | ||
|
|
43665aa7eb | ||
|
|
3b9b49950c | ||
|
|
0a8752ec0a | ||
|
|
47685dc2be | ||
|
|
517ee5bb25 | ||
|
|
3ab01d3576 | ||
|
|
31b6d4d658 | ||
|
|
08f840d642 | ||
|
|
776b6259cd | ||
|
|
5c81c71116 | ||
|
|
188b635ea0 | ||
|
|
56066a3212 | ||
|
|
ed50ce9c90 | ||
|
|
a7e77f6e21 | ||
|
|
56278b17ee | ||
|
|
bd78db72b9 | ||
|
|
32bd72fecd | ||
|
|
3a798a70fa | ||
|
|
02429266b1 | ||
|
|
77aea0c69c | ||
|
|
6a3ce862cb | ||
|
|
93217da619 | ||
|
|
bbaa2dfc73 | ||
|
|
ab22b88a53 | ||
|
|
63def54dad | ||
|
|
00f9a28729 | ||
| 092beb6ae9 | |||
| eb69186271 | |||
|
|
56beca0db4 | ||
|
|
64cd898a65 | ||
|
|
394860656a | ||
|
|
90472a4b31 | ||
|
|
a1999183f2 | ||
|
|
1e3ce48024 | ||
|
|
0007185b5f | ||
|
|
403d2cedc0 | ||
|
|
c8839b8587 | ||
|
|
cf048c9804 | ||
|
|
bea75f51bd | ||
|
|
1bf6612002 | ||
|
|
d9a18b1d31 | ||
|
|
465f30661f | ||
|
|
a62ca5452e | ||
|
|
b07d74d28d | ||
|
|
dacb3b0891 | ||
|
|
92254eefcc | ||
|
|
2d56411e5f | ||
|
|
f8dc8ab903 | ||
|
|
2a55cda583 | ||
|
|
7c91c03adf | ||
|
|
caa902ea9b | ||
|
|
fb07071e24 | ||
|
|
a1cb7dcbe7 | ||
|
|
a8db0086b1 | ||
|
|
e46b6d5b06 | ||
|
|
dfc8c1fac2 | ||
|
|
f8de118288 | ||
|
|
032f698c7b | ||
| 0ac3ab2329 | |||
|
|
e2aaef9b88 | ||
|
|
ee0303bcfb | ||
|
|
1523c7b4ce | ||
|
|
a16a8eaded | ||
|
|
9ff9d48ffd | ||
|
|
dfb1fb91a5 | ||
|
|
8f56ab9534 | ||
|
|
c0dda45c7b | ||
|
|
3efb981f00 | ||
|
|
ed408917c6 | ||
|
|
2ca435a414 | ||
|
|
de9e282bad | ||
|
|
c437daf9be | ||
|
|
1e4f96486f | ||
|
|
e03d0f3322 | ||
|
|
5f0e1253cc | ||
|
|
7e6b040258 | ||
|
|
329ebb6482 | ||
|
|
7a9c58003d | ||
|
|
371a16e37b | ||
|
|
95629e792d | ||
|
|
e79af2fd60 | ||
|
|
4aba0153f8 | ||
|
|
f91c33e17c | ||
|
|
6c29877b20 | ||
|
|
3abde6ecfc | ||
|
|
b42168eee5 | ||
|
|
ac3b2c0ef2 | ||
|
|
f640452b7b | ||
|
|
2f670495ac | ||
|
|
2a36edf528 | ||
|
|
5e690abd76 | ||
|
|
4008e19ca9 | ||
|
|
e9070b30a0 | ||
|
|
636a1ff930 | ||
|
|
887311d1f1 | ||
|
|
3888c4ba21 | ||
|
|
69173803bf | ||
|
|
13e31650be | ||
|
|
3563287f17 | ||
|
|
91ee9f5e05 | ||
| 49918a1067 | |||
| 466f9a4797 | |||
|
|
c7997e0c2f | ||
|
|
4805dfbdba | ||
|
|
62424215c1 | ||
|
|
97ae13759e | ||
|
|
108678d94f | ||
|
|
66dbba5c16 | ||
|
|
d84cef0c18 | ||
|
|
077cefc60e | ||
|
|
35acc668c9 | ||
|
|
ebbe0f12ed | ||
|
|
6a8b76278a | ||
|
|
8ac99ef28f | ||
|
|
547cf7f600 | ||
|
|
b8b8b118c9 | ||
|
|
76247323eb | ||
|
|
0ff20c7c85 | ||
|
|
dd690e7495 | ||
|
|
ca500548a3 | ||
|
|
c0b73375b1 | ||
|
|
9c6d6a0b07 | ||
|
|
179f6014bf | ||
|
|
b580c6ec8e | ||
|
|
dd60cf0040 | ||
|
|
cc851b29fc | ||
|
|
59643b2fb9 | ||
|
|
3a5bb81d39 | ||
|
|
5ec860015d | ||
|
|
0f701ec08e | ||
|
|
387c3ea2f4 | ||
|
|
85b134b7be | ||
|
|
5d17d2509d | ||
|
|
036d4b2f4b | ||
|
|
f8e4f54c77 | ||
|
|
206b948ee1 | ||
|
|
fbad6ba75c | ||
|
|
bf3403449d | ||
|
|
d13b98b205 | ||
|
|
1188150163 | ||
|
|
e78191cc82 | ||
|
|
eb978c767e | ||
|
|
661dc8ea1c | ||
|
|
93f12b73d8 | ||
|
|
1091bc6e2c | ||
|
|
594c0fb8e7 | ||
|
|
b6696564f5 | ||
|
|
316e5b2845 | ||
|
|
c1738bcb0a | ||
|
|
7b3e41efae | ||
| ea20dc6da0 | |||
| 9becddd84f | |||
| b08c765400 | |||
| afd59d7eb3 | |||
| 47cdd0582c | |||
| af54d04f9d | |||
| 1d2b3bc858 | |||
| 4b552563be | |||
| ebd929176c | |||
| 430e685a7c | |||
| d5bd857c45 | |||
| b8b9ba3069 | |||
| 84c79d5192 | |||
| 028f3a7871 | |||
| 0c462315f0 | |||
| 26261a2090 | |||
| 3fc1895b56 | |||
|
|
a70d7cf1f9 | ||
|
|
1f592ba1a1 | ||
|
|
a43daf025d | ||
|
|
296a2afa95 | ||
|
|
a7e879a3a4 | ||
|
|
27b160b464 | ||
|
|
7c3c4f1a63 | ||
| c61ecc0545 | |||
|
|
fbae93b532 | ||
|
|
35d6e5fd21 | ||
|
|
114828adcb | ||
|
|
b5de4d78ad | ||
|
|
0913e6f738 | ||
|
|
053e52c91f | ||
|
|
5a587a8582 | ||
|
|
3cef8cfd61 | ||
|
|
09964df198 | ||
|
|
dd8e6bf694 | ||
|
|
58cd3e82f6 | ||
| 22ba7f2ee5 | |||
|
|
99c26ff9af | ||
|
|
a2d91d989d | ||
|
|
881154e9f4 | ||
| f52f3920cb | |||
| f99a244b8e | |||
|
|
5dd9171316 | ||
|
|
5ec2476aec | ||
|
|
a9fc5f720d | ||
|
|
d323b1c7e2 | ||
|
|
d6b1478bf1 | ||
|
|
79351f0c4d | ||
|
|
e5bd90f58b | ||
|
|
7377bad721 | ||
|
|
25744986a3 | ||
| 668a4dbb4d | |||
|
|
d1972a56e2 | ||
|
|
df28b0d977 | ||
|
|
48100cf9fc | ||
|
|
69a7e1f25c | ||
|
|
b43ed886b9 | ||
|
|
59fb83a469 | ||
|
|
76f0768b99 | ||
|
|
7544500be1 | ||
|
|
b2b855200f | ||
|
|
241a8bc764 | ||
|
|
18a0e8d612 | ||
|
|
ec08a6ca72 | ||
|
|
7b7d7aaf3d | ||
|
|
2d4843b1f4 | ||
|
|
7ba01a413f | ||
|
|
2516820e4a | ||
|
|
0917a743cd | ||
|
|
13dd80d429 | ||
|
|
6e9902a966 | ||
|
|
fd1e0a4e80 | ||
|
|
b130b81863 | ||
|
|
1dd96ae9cb | ||
|
|
07c1dfc613 | ||
|
|
fb5cedc575 | ||
|
|
b38a7e6eb2 | ||
|
|
4f3f1cd163 | ||
|
|
4d77646f26 | ||
|
|
187592b673 | ||
|
|
215467ae42 | ||
|
|
facd7d39dc | ||
|
|
6810e5f2a4 | ||
|
|
ee6fae8956 | ||
|
|
bb6c3233d2 | ||
|
|
499228cc98 | ||
|
|
05f08db66e | ||
|
|
52ee8b3953 | ||
|
|
a8768f918e | ||
| 1d8f221f1b | |||
| d70a003617 | |||
| b443b74d18 | |||
|
|
e52b7170ce | ||
|
|
dd7233aaf7 | ||
|
|
cd0878f810 | ||
|
|
f588d6da51 | ||
|
|
9a363e2882 | ||
|
|
2901e3898c | ||
| fc341a86e7 | |||
|
|
f2699892e0 | ||
|
|
c63200cba0 | ||
|
|
c8a02ac607 | ||
|
|
09a304c214 | ||
| 68da28ffe8 | |||
|
|
427e76e76e | ||
| b183b5bcfc | |||
| 51feaa0730 | |||
| 8e69aa8bd6 | |||
| 90b2fded48 | |||
| 9125ffeb9e | |||
| 28980e5fbf | |||
| aab0d772a4 | |||
| 6296e1a9eb | |||
| 1586bb0702 | |||
| edeaf6af09 | |||
| 951edd95db | |||
| 9951211596 | |||
| 6d337464f7 | |||
| d0b552d74a | |||
| 83512822b1 | |||
| ccb78103ec | |||
| 6e79ffea34 | |||
| 4f03d37a17 | |||
| 6fb8419b3c | |||
| a4272d6ca9 | |||
| 4654117d5e | |||
| 6ff260d052 | |||
| 88d2b72822 | |||
|
|
4bacceb19f | ||
|
|
846065007b | ||
| 29868531ad | |||
| 95dfb6fdc6 | |||
| 8df3999f85 | |||
| 149b189629 | |||
| b1fd86e6b5 | |||
| 5e8fdf879d | |||
|
|
c45cba18a6 | ||
|
|
fccd43502b | ||
| 84ada18299 | |||
| 635fe8017e | |||
| 834380ff05 | |||
| dd65fc2289 | |||
| 86125bb625 | |||
| 09a9d8b380 | |||
| 86b223ec93 | |||
| 78f6080321 | |||
| c7be6f6e0e | |||
| c40c31fbb7 | |||
| f5fbc1e32d | |||
| 0a20378acd | |||
| d4e87877b6 | |||
| 7eb7236b8a | |||
| dc0e4ffce2 | |||
| 86fe93943d | |||
| 3258113ef8 | |||
| ebf3999cfe | |||
| a1ccbbb5b9 | |||
| 35072c40d8 | |||
| 5c51021388 | |||
| 95fd527515 | |||
| 113d851cea | |||
| 72f0c460f9 | |||
| 13ddd15b44 | |||
| c9e24aaf5f | |||
| 68c0ac0ffc | |||
| bebda275a9 | |||
| 287eaae850 | |||
| 7e59c3b9a7 | |||
| 38658a5b8c | |||
| 88c75b8672 | |||
| 17ab1e6830 | |||
| 1f45110e5f | |||
| 5401166a07 | |||
| bfa8188782 | |||
| e777a71784 | |||
| c13e91a0d0 | |||
| aac5d57352 | |||
| ceca13c7b6 | |||
| 2905470330 | |||
| 2c17033822 | |||
| 0a4cb9e9b1 | |||
| 096651f4c1 | |||
| 275a08506b | |||
| 4cd61cb381 | |||
| 9ad1147581 | |||
| 35e09def1b | |||
| 0469607a71 | |||
| d115d22ee6 | |||
| 8120ae621d | |||
| f873c2fa9f | |||
| c3ffbe2f42 | |||
| 55a0a39881 | |||
| 592215dd30 | |||
| ef0c2a2785 | |||
| 37979e452a | |||
| e9671bb727 | |||
| aa328bd591 | |||
| 188e4313f9 | |||
| df02c70e31 | |||
| 257f54b323 | |||
| fb4b5b2575 | |||
| 4e1251276d | |||
| a7b200dc57 | |||
| 8cadbae80e | |||
| c3bae49aae | |||
|
|
6fa4fc6149 | ||
| f1ffe1acaa | |||
| 5c9ddf7f00 | |||
| 431767a150 | |||
| 8ba4e442a6 | |||
| 2f8d19c267 | |||
| f2fd98f742 | |||
| 3ce35d6e81 | |||
| 796dbaa836 | |||
| 84b209ec7f | |||
| fa976b34dc | |||
| e7cda362b7 | |||
| a41a09c162 | |||
| e82f84f0ab | |||
| f1d387ceea | |||
| 3893d4d1f8 | |||
| cf7ac50faf | |||
| 3f6bf15554 | |||
| dac74829b4 | |||
| 94d6f213a0 | |||
| 8f2550ef61 | |||
| b622a1cc5e | |||
| c83a3c32c7 | |||
| e7dcf7f7e7 | |||
| 398785a2be | |||
| 05dba0f1f5 | |||
| 39dbd32b2e | |||
| 23a34a455a | |||
| 4308328b48 | |||
|
|
d2dba124df |
10
.github/ISSUE_TEMPLATE/1-bug.yaml
vendored
10
.github/ISSUE_TEMPLATE/1-bug.yaml
vendored
@@ -5,7 +5,7 @@ body:
|
|||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
Thanks for taking the time to fill out this bug report! Please attach any minimal reproduction projects!
|
Thanks for taking the time to fill out this bug report! Please attach a minimal reproduction project if available!
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description-area
|
id: description-area
|
||||||
attributes:
|
attributes:
|
||||||
@@ -17,21 +17,21 @@ body:
|
|||||||
id: steps-area
|
id: steps-area
|
||||||
attributes:
|
attributes:
|
||||||
label: Steps to reproduce
|
label: Steps to reproduce
|
||||||
description: Please provide reproduction steps if possible.
|
description: Please provide reproduction steps if available.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
id: version
|
id: version
|
||||||
attributes:
|
attributes:
|
||||||
label: Version
|
label: Version
|
||||||
description: What version of Flax are you running?
|
description: What version of Flax did you experience the bug in?
|
||||||
options:
|
options:
|
||||||
- '1.8'
|
|
||||||
- '1.9'
|
- '1.9'
|
||||||
- '1.10'
|
- '1.10'
|
||||||
- '1.11'
|
- '1.11'
|
||||||
|
- '1.12'
|
||||||
- master branch
|
- master branch
|
||||||
default: 2
|
default: 3
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ body:
|
|||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
value: |
|
value: |
|
||||||
Thanks for taking the time to fill out a feature request!
|
Thank you for taking the time to submit this feature request!
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: description-area
|
id: description-area
|
||||||
attributes:
|
attributes:
|
||||||
@@ -17,6 +17,6 @@ body:
|
|||||||
id: benefits-area
|
id: benefits-area
|
||||||
attributes:
|
attributes:
|
||||||
label: Benefits
|
label: Benefits
|
||||||
description: Please provide what benefits this feature would provide to the engine!
|
description: Please list what benefits this feature would provide to the engine!
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
18
.github/data/bt.sh
vendored
Normal file
18
.github/data/bt.sh
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# https://gist.github.com/ongardie/aa15f1f0d0e6b59890a9
|
||||||
|
gdb -q --batch \
|
||||||
|
-ex 'handle SIGHUP nostop pass' \
|
||||||
|
-ex 'handle SIGQUIT nostop pass' \
|
||||||
|
-ex 'handle SIGPIPE nostop pass' \
|
||||||
|
-ex 'handle SIGALRM nostop pass' \
|
||||||
|
-ex 'handle SIGTERM nostop pass' \
|
||||||
|
-ex 'handle SIGUSR1 nostop pass' \
|
||||||
|
-ex 'handle SIGUSR2 nostop pass' \
|
||||||
|
-ex 'handle SIGCHLD nostop pass' \
|
||||||
|
-ex 'handle SIG34 nostop pass' \
|
||||||
|
-ex 'set print thread-events off' \
|
||||||
|
-return-child-result \
|
||||||
|
-ex 'run' \
|
||||||
|
-ex 'thread apply all bt' \
|
||||||
|
--tty=/dev/stdout \
|
||||||
|
--args $*
|
||||||
6
.github/workflows/build_android.yml
vendored
6
.github/workflows/build_android.yml
vendored
@@ -4,6 +4,7 @@ on: [push, pull_request]
|
|||||||
env:
|
env:
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
DOTNET_ROLL_FORWARD: 'minor'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Setup .NET Workload
|
- name: Setup .NET Workload
|
||||||
run: |
|
run: |
|
||||||
dotnet workload install android
|
dotnet workload install android
|
||||||
@@ -33,4 +34,7 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=ARM64 -platform=Android -configuration=Release -buildtargets=FlaxGame
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=ARM64 -platform=Android -configuration=Release -buildtargets=FlaxGame
|
||||||
|
|||||||
6
.github/workflows/build_linux.yml
vendored
6
.github/workflows/build_linux.yml
vendored
@@ -16,7 +16,8 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
|
||||||
- name: Setup Vulkan
|
- name: Setup Vulkan
|
||||||
uses: ./.github/actions/vulkan
|
uses: ./.github/actions/vulkan
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
@@ -44,7 +45,8 @@ jobs:
|
|||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
|
||||||
- name: Setup Vulkan
|
- name: Setup Vulkan
|
||||||
uses: ./.github/actions/vulkan
|
uses: ./.github/actions/vulkan
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
|
|||||||
11
.github/workflows/build_windows.yml
vendored
11
.github/workflows/build_windows.yml
vendored
@@ -4,6 +4,7 @@ on: [push, pull_request]
|
|||||||
env:
|
env:
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
DOTNET_ROLL_FORWARD: 'minor'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Print .NET info
|
- name: Print .NET info
|
||||||
run: |
|
run: |
|
||||||
dotnet --info
|
dotnet --info
|
||||||
@@ -30,6 +31,9 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor
|
||||||
|
|
||||||
# Game
|
# Game
|
||||||
@@ -44,7 +48,7 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Print .NET info
|
- name: Print .NET info
|
||||||
run: |
|
run: |
|
||||||
dotnet --info
|
dotnet --info
|
||||||
@@ -55,4 +59,7 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -dotnet=8 -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame
|
||||||
|
|||||||
17
.github/workflows/cd.yml
vendored
17
.github/workflows/cd.yml
vendored
@@ -7,6 +7,7 @@ on:
|
|||||||
env:
|
env:
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
DOTNET_ROLL_FORWARD: 'minor'
|
||||||
GIT_LFS_PULL_OPTIONS: '-c lfs.concurrenttransfers=1 -c lfs.transfer.maxretries=2 -c http.version="HTTP/1.1" -c lfs.activitytimeout=60'
|
GIT_LFS_PULL_OPTIONS: '-c lfs.concurrenttransfers=1 -c lfs.transfer.maxretries=2 -c http.version="HTTP/1.1" -c lfs.activitytimeout=60'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -27,13 +28,16 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Print .NET info
|
- name: Print .NET info
|
||||||
run: |
|
run: |
|
||||||
dotnet --info
|
dotnet --info
|
||||||
dotnet workload --info
|
dotnet workload --info
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\PackageEditor.bat -arch=x64 -platform=Windows -deployOutput=Output -dotnet=8
|
.\PackageEditor.bat -arch=x64 -platform=Windows -deployOutput=Output -dotnet=8
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -60,13 +64,16 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Print .NET info
|
- name: Print .NET info
|
||||||
run: |
|
run: |
|
||||||
dotnet --info
|
dotnet --info
|
||||||
dotnet workload --info
|
dotnet workload --info
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\PackagePlatforms.bat -arch=x64 -platform=Windows -deployOutput=Output -dotnet=8
|
.\PackagePlatforms.bat -arch=x64 -platform=Windows -deployOutput=Output -dotnet=8
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -87,7 +94,8 @@ jobs:
|
|||||||
git ${{ env.GIT_LFS_PULL_OPTIONS }} lfs pull
|
git ${{ env.GIT_LFS_PULL_OPTIONS }} lfs pull
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
|
||||||
- name: Setup Vulkan
|
- name: Setup Vulkan
|
||||||
uses: ./.github/actions/vulkan
|
uses: ./.github/actions/vulkan
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
@@ -118,7 +126,8 @@ jobs:
|
|||||||
git ${{ env.GIT_LFS_PULL_OPTIONS }} lfs pull
|
git ${{ env.GIT_LFS_PULL_OPTIONS }} lfs pull
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev
|
||||||
- name: Setup Vulkan
|
- name: Setup Vulkan
|
||||||
uses: ./.github/actions/vulkan
|
uses: ./.github/actions/vulkan
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
|
|||||||
20
.github/workflows/tests.yml
vendored
20
.github/workflows/tests.yml
vendored
@@ -4,6 +4,7 @@ on: [push, pull_request]
|
|||||||
env:
|
env:
|
||||||
DOTNET_NOLOGO: true
|
DOTNET_NOLOGO: true
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
DOTNET_CLI_TELEMETRY_OPTOUT: false
|
||||||
|
DOTNET_ROLL_FORWARD: 'minor'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
@@ -28,25 +29,23 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y --fix-missing libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev libwayland-dev gdb
|
||||||
|
chmod +x .github/data/bt.sh
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs -dotnet=8
|
./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs -dotnet=8
|
||||||
./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget
|
./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true
|
||||||
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
- name: Test
|
- name: Test
|
||||||
run: |
|
run: |
|
||||||
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests
|
${GITHUB_WORKSPACE}/.github/data/bt.sh ./Binaries/Editor/Linux/Development/FlaxTests -headless
|
||||||
dotnet test -f net8.0 Binaries/Tests/Flax.Build.Tests.dll
|
dotnet test -f net8.0 Binaries/Tests/Flax.Build.Tests.dll
|
||||||
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests
|
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests
|
||||||
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests
|
cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests
|
||||||
cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests
|
cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests
|
||||||
dotnet test -f net8.0 Binaries/Tests/FlaxEngine.CSharp.dll
|
dotnet test -f net8.0 Binaries/Tests/FlaxEngine.CSharp.dll
|
||||||
- name: Test UseLargeWorlds
|
|
||||||
run: |
|
|
||||||
./Development/Scripts/Linux/CallBuildTool.sh -build -log -dotnet=8 -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true
|
|
||||||
${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests
|
|
||||||
|
|
||||||
# Tests on Windows
|
# Tests on Windows
|
||||||
tests-windows:
|
tests-windows:
|
||||||
@@ -58,7 +57,7 @@ jobs:
|
|||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@v3
|
uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
dotnet-version: 8.0.x
|
dotnet-version: 8.0.419
|
||||||
- name: Print .NET info
|
- name: Print .NET info
|
||||||
run: |
|
run: |
|
||||||
dotnet --info
|
dotnet --info
|
||||||
@@ -69,6 +68,9 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
PowerShell "(Get-Content global.json).Replace('latestMajor', 'minor') | Set-Content global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/global.json).Replace('latestMajor', 'minor') | Set-Content Source/Tools/Flax.Build/global.json"
|
||||||
|
PowerShell "(Get-Content Source/Tools/Flax.Build/Flax.Build.csproj).Replace('LatestMajor', 'Minor') | Set-Content Source/Tools/Flax.Build/Flax.Build.csproj"
|
||||||
.\GenerateProjectFiles.bat -vs2022 -log -verbose -printSDKs -dotnet=8
|
.\GenerateProjectFiles.bat -vs2022 -log -verbose -printSDKs -dotnet=8
|
||||||
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -dotnet=8 -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxTestsTarget
|
.\Development\Scripts\Windows\CallBuildTool.bat -build -log -dotnet=8 -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxTestsTarget
|
||||||
dotnet msbuild Source\Tools\Flax.Build.Tests\Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
dotnet msbuild Source\Tools\Flax.Build.Tests\Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo
|
||||||
@@ -76,7 +78,7 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
.\Binaries\Editor\Win64\Development\FlaxTests.exe
|
.\Binaries\Editor\Win64\Development\FlaxTests.exe -headless
|
||||||
if(!$?) { Write-Host "Tests failed with exit code $LastExitCode" -ForegroundColor Red; Exit $LastExitCode }
|
if(!$?) { Write-Host "Tests failed with exit code $LastExitCode" -ForegroundColor Red; Exit $LastExitCode }
|
||||||
dotnet test -f net8.0 Binaries\Tests\Flax.Build.Tests.dll
|
dotnet test -f net8.0 Binaries\Tests\Flax.Build.Tests.dll
|
||||||
xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests
|
xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests
|
||||||
|
|||||||
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
Content/Editor/HSWheel.flax
LFS
Normal file
BIN
Content/Editor/HSWheel.flax
LFS
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Content/Editor/IconsAtlas.flax
LFS
BIN
Content/Editor/IconsAtlas.flax
LFS
Binary file not shown.
Binary file not shown.
@@ -42,10 +42,10 @@ struct MaterialInput
|
|||||||
float2 SvPositionToDecalUV(float4 svPosition)
|
float2 SvPositionToDecalUV(float4 svPosition)
|
||||||
{
|
{
|
||||||
float2 screenUV = svPosition.xy * ScreenSize.zw;
|
float2 screenUV = svPosition.xy * ScreenSize.zw;
|
||||||
svPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r;
|
svPosition.z = SAMPLE_RT_DEPTH(DepthBuffer, screenUV);
|
||||||
float4 positionHS = mul(float4(svPosition.xyz, 1), SvPositionToWorld);
|
float4 positionHS = PROJECT_POINT(float4(svPosition.xyz, 1), SvPositionToWorld);
|
||||||
float3 positionWS = positionHS.xyz / positionHS.w;
|
float3 positionWS = positionHS.xyz / positionHS.w;
|
||||||
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz;
|
float3 positionOS = PROJECT_POINT(float4(positionWS, 1), InvWorld).xyz;
|
||||||
return positionOS.xz + 0.5f;
|
return positionOS.xz + 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,10 +182,10 @@ META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
|
|||||||
void VS_Decal(in float3 Position : POSITION0, out float4 SvPosition : SV_Position)
|
void VS_Decal(in float3 Position : POSITION0, out float4 SvPosition : SV_Position)
|
||||||
{
|
{
|
||||||
// Compute world space vertex position
|
// Compute world space vertex position
|
||||||
float3 worldPosition = mul(float4(Position.xyz, 1), WorldMatrix).xyz;
|
float3 worldPosition = PROJECT_POINT(float4(Position.xyz, 1), WorldMatrix).xyz;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
SvPosition = mul(float4(worldPosition.xyz, 1), ViewProjectionMatrix);
|
SvPosition = PROJECT_POINT(float4(worldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pixel Shader function for decals rendering
|
// Pixel Shader function for decals rendering
|
||||||
@@ -213,11 +213,11 @@ void PS_Decal(
|
|||||||
}
|
}
|
||||||
|
|
||||||
float2 screenUV = SvPosition.xy * ScreenSize.zw;
|
float2 screenUV = SvPosition.xy * ScreenSize.zw;
|
||||||
SvPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r;
|
SvPosition.z = SAMPLE_RT_DEPTH(DepthBuffer, screenUV);
|
||||||
|
|
||||||
float4 positionHS = mul(float4(SvPosition.xyz, 1), SvPositionToWorld);
|
float4 positionHS = PROJECT_POINT(float4(SvPosition.xyz, 1), SvPositionToWorld);
|
||||||
float3 positionWS = positionHS.xyz / positionHS.w;
|
float3 positionWS = positionHS.xyz / positionHS.w;
|
||||||
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz;
|
float3 positionOS = PROJECT_POINT(float4(positionWS, 1), InvWorld).xyz;
|
||||||
|
|
||||||
clip(0.5 - abs(positionOS.xyz));
|
clip(0.5 - abs(positionOS.xyz));
|
||||||
float2 decalUVs = positionOS.xz + 0.5f;
|
float2 decalUVs = positionOS.xz + 0.5f;
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ VertexOutput VS_SplineModel(ModelInput input)
|
|||||||
world = mul(world, WorldMatrix);
|
world = mul(world, WorldMatrix);
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.Geometry.TexCoord = input.TexCoord0;
|
output.Geometry.TexCoord = input.TexCoord0;
|
||||||
@@ -337,8 +337,7 @@ VertexOutput VS_SplineModel(ModelInput input)
|
|||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.Geometry.WorldPosition += material.PositionOffset;
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
output.Geometry.PrevWorldPosition += material.PositionOffset;
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Get tessalation multiplier (per vertex)
|
// Get tessalation multiplier (per vertex)
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#define MAX_LOCAL_LIGHTS 4
|
#define MAX_LOCAL_LIGHTS 4
|
||||||
@1// Forward Shading: Includes
|
@1// Forward Shading: Includes
|
||||||
#include "./Flax/LightingCommon.hlsl"
|
#include "./Flax/LightingCommon.hlsl"
|
||||||
#if USE_REFLECTIONS
|
|
||||||
#include "./Flax/ReflectionsCommon.hlsl"
|
#include "./Flax/ReflectionsCommon.hlsl"
|
||||||
|
#if USE_REFLECTIONS
|
||||||
#define MATERIAL_REFLECTIONS_SSR 1
|
#define MATERIAL_REFLECTIONS_SSR 1
|
||||||
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
||||||
#include "./Flax/SSR.hlsl"
|
#include "./Flax/SSR.hlsl"
|
||||||
@@ -14,11 +14,13 @@
|
|||||||
#include "./Flax/Lighting.hlsl"
|
#include "./Flax/Lighting.hlsl"
|
||||||
#include "./Flax/ShadowsSampling.hlsl"
|
#include "./Flax/ShadowsSampling.hlsl"
|
||||||
#include "./Flax/ExponentialHeightFog.hlsl"
|
#include "./Flax/ExponentialHeightFog.hlsl"
|
||||||
|
#include "./Flax/VolumetricFog.hlsl"
|
||||||
@2// Forward Shading: Constants
|
@2// Forward Shading: Constants
|
||||||
LightData DirectionalLight;
|
LightData DirectionalLight;
|
||||||
LightData SkyLight;
|
LightData SkyLight;
|
||||||
ProbeData EnvironmentProbe;
|
EnvProbeData EnvironmentProbe;
|
||||||
ExponentialHeightFogData ExponentialHeightFog;
|
ExponentialHeightFogData ExponentialHeightFog;
|
||||||
|
VolumetricFogData VolumetricFog;
|
||||||
float3 Dummy2;
|
float3 Dummy2;
|
||||||
uint LocalLightsCount;
|
uint LocalLightsCount;
|
||||||
LightData LocalLights[MAX_LOCAL_LIGHTS];
|
LightData LocalLights[MAX_LOCAL_LIGHTS];
|
||||||
@@ -28,12 +30,14 @@ TextureCube SkyLightTexture : register(t__SRV__);
|
|||||||
Buffer<float4> ShadowsBuffer : register(t__SRV__);
|
Buffer<float4> ShadowsBuffer : register(t__SRV__);
|
||||||
Texture2D<float> ShadowMap : register(t__SRV__);
|
Texture2D<float> ShadowMap : register(t__SRV__);
|
||||||
Texture3D VolumetricFogTexture : register(t__SRV__);
|
Texture3D VolumetricFogTexture : register(t__SRV__);
|
||||||
|
Texture2D PreIntegratedGF : register(t__SRV__);
|
||||||
@4// Forward Shading: Utilities
|
@4// Forward Shading: Utilities
|
||||||
// Public accessors for lighting data, use them as data binding might change but those methods will remain.
|
// Public accessors for lighting data, use them as data binding might change but those methods will remain.
|
||||||
LightData GetDirectionalLight() { return DirectionalLight; }
|
LightData GetDirectionalLight() { return DirectionalLight; }
|
||||||
LightData GetSkyLight() { return SkyLight; }
|
LightData GetSkyLight() { return SkyLight; }
|
||||||
ProbeData GetEnvironmentProbe() { return EnvironmentProbe; }
|
EnvProbeData GetEnvironmentProbe() { return EnvironmentProbe; }
|
||||||
ExponentialHeightFogData GetExponentialHeightFog() { return ExponentialHeightFog; }
|
ExponentialHeightFogData GetExponentialHeightFog() { return ExponentialHeightFog; }
|
||||||
|
VolumetricFogData GetVolumetricFog() { return VolumetricFog; }
|
||||||
uint GetLocalLightsCount() { return LocalLightsCount; }
|
uint GetLocalLightsCount() { return LocalLightsCount; }
|
||||||
LightData GetLocalLight(uint i) { return LocalLights[i]; }
|
LightData GetLocalLight(uint i) { return LocalLights[i]; }
|
||||||
@5// Forward Shading: Shaders
|
@5// Forward Shading: Shaders
|
||||||
@@ -108,7 +112,8 @@ void PS_Forward(
|
|||||||
|
|
||||||
// Calculate reflections
|
// Calculate reflections
|
||||||
#if USE_REFLECTIONS
|
#if USE_REFLECTIONS
|
||||||
float3 reflections = SampleReflectionProbe(ViewPos, EnvProbe, EnvironmentProbe, gBuffer.WorldPos, gBuffer.Normal, gBuffer.Roughness).rgb;
|
float4 reflections = SampleReflectionProbe(ViewPos, EnvProbe, EnvironmentProbe, gBuffer.WorldPos, gBuffer.Normal, gBuffer.Roughness);
|
||||||
|
reflections.rgb *= reflections.a;
|
||||||
|
|
||||||
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
#if MATERIAL_REFLECTIONS == MATERIAL_REFLECTIONS_SSR
|
||||||
// Screen Space Reflections
|
// Screen Space Reflections
|
||||||
@@ -116,7 +121,7 @@ void PS_Forward(
|
|||||||
Texture2D sceneColorTexture = MATERIAL_REFLECTIONS_SSR_COLOR;
|
Texture2D sceneColorTexture = MATERIAL_REFLECTIONS_SSR_COLOR;
|
||||||
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
||||||
float stepSize = ScreenSize.z; // 1 / screenWidth
|
float stepSize = ScreenSize.z; // 1 / screenWidth
|
||||||
float maxSamples = 48;
|
float maxSamples = 50;
|
||||||
float worldAntiSelfOcclusionBias = 0.1f;
|
float worldAntiSelfOcclusionBias = 0.1f;
|
||||||
float brdfBias = 0.82f;
|
float brdfBias = 0.82f;
|
||||||
float drawDistance = 5000.0f;
|
float drawDistance = 5000.0f;
|
||||||
@@ -124,7 +129,7 @@ void PS_Forward(
|
|||||||
if (hit.z > 0)
|
if (hit.z > 0)
|
||||||
{
|
{
|
||||||
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
||||||
reflections = lerp(reflections, screenColor, hit.z);
|
reflections.rgb = lerp(reflections.rgb, screenColor, hit.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback to software tracing if possible
|
// Fallback to software tracing if possible
|
||||||
@@ -136,17 +141,17 @@ void PS_Forward(
|
|||||||
if (TraceSDFSoftwareReflections(gBuffer, reflectWS, surfaceAtlas))
|
if (TraceSDFSoftwareReflections(gBuffer, reflectWS, surfaceAtlas))
|
||||||
{
|
{
|
||||||
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
float3 screenColor = sceneColorTexture.SampleLevel(SamplerPointClamp, hit.xy, 0).rgb;
|
||||||
reflections = lerp(surfaceAtlas, float4(screenColor, 1), hit.z);
|
reflections.rgb = lerp(surfaceAtlas, float4(screenColor, 1), hit.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
light.rgb += reflections * GetReflectionSpecularLighting(ViewPos, gBuffer) * light.a;
|
light.rgb += reflections.rgb * GetReflectionSpecularLighting(PreIntegratedGF, ViewPos, gBuffer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add lighting (apply ambient occlusion)
|
// Add lighting
|
||||||
output.rgb += light.rgb * gBuffer.AO;
|
output.rgb += light.rgb;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -158,17 +163,13 @@ void PS_Forward(
|
|||||||
#else
|
#else
|
||||||
float fogSceneDistance = gBuffer.ViewPos.z;
|
float fogSceneDistance = gBuffer.ViewPos.z;
|
||||||
#endif
|
#endif
|
||||||
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, 0, fogSceneDistance);
|
float fogSkipDistance = max(ExponentialHeightFog.VolumetricFogMaxDistance - 100, 0);
|
||||||
|
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, fogSkipDistance, fogSceneDistance);
|
||||||
if (ExponentialHeightFog.VolumetricFogMaxDistance > 0)
|
if (ExponentialHeightFog.VolumetricFogMaxDistance > 0)
|
||||||
{
|
{
|
||||||
// Sample volumetric fog and mix it in
|
// Sample volumetric fog and mix it in
|
||||||
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
||||||
float3 viewVector = materialInput.WorldPosition - ViewPos;
|
float4 volumetricFog = SampleVolumetricFog(VolumetricFogTexture, VolumetricFog, materialInput.WorldPosition - ViewPos, screenUV, TemporalAAJitter);
|
||||||
float sceneDepth = length(viewVector);
|
|
||||||
float depthSlice = sceneDepth / ExponentialHeightFog.VolumetricFogMaxDistance;
|
|
||||||
float3 volumeUV = float3(screenUV, depthSlice);
|
|
||||||
float4 volumetricFog = VolumetricFogTexture.SampleLevel(SamplerLinearClamp, volumeUV, 0);
|
|
||||||
fog = CombineVolumetricFog(fog, volumetricFog);
|
fog = CombineVolumetricFog(fog, volumetricFog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ float Rand(inout uint seed)
|
|||||||
float3 ReprojectPosition(float2 uv, float rawDepth)
|
float3 ReprojectPosition(float2 uv, float rawDepth)
|
||||||
{
|
{
|
||||||
uv = uv * float2(2.0, -2.0) + float2(-1.0, 1.0);
|
uv = uv * float2(2.0, -2.0) + float2(-1.0, 1.0);
|
||||||
float4 pos = mul(float4(uv.x, uv.y, rawDepth, 1.0f), InvViewProjectionMatrix);
|
float4 pos = PROJECT_POINT(float4(uv.x, uv.y, rawDepth, 1.0f), InvViewProjectionMatrix);
|
||||||
return pos.xyz / pos.w;
|
return pos.xyz / pos.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ void SpawnParticle(Context context)
|
|||||||
@4}
|
@4}
|
||||||
|
|
||||||
// Main entry point for the particles simulation and spawning
|
// Main entry point for the particles simulation and spawning
|
||||||
META_CS(true, FEATURE_LEVEL_SM5)
|
META_CS(true, AUTO)
|
||||||
[numthreads(THREAD_GROUP_SIZE, 1, 1)]
|
[numthreads(THREAD_GROUP_SIZE, 1, 1)]
|
||||||
void CS_Main(uint3 dispatchThreadId : SV_DispatchThreadID)
|
void CS_Main(uint3 dispatchThreadId : SV_DispatchThreadID)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ struct VertexOutput
|
|||||||
#endif
|
#endif
|
||||||
float4 ClipExtents : TEXCOORD3;
|
float4 ClipExtents : TEXCOORD3;
|
||||||
float2 ClipOrigin : TEXCOORD4;
|
float2 ClipOrigin : TEXCOORD4;
|
||||||
|
float2 CustomData : TEXCOORD5; // x-per-geometry type, y-features mask
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
@@ -55,6 +56,7 @@ struct PixelInput
|
|||||||
#endif
|
#endif
|
||||||
float4 ClipExtents : TEXCOORD3;
|
float4 ClipExtents : TEXCOORD3;
|
||||||
float2 ClipOrigin : TEXCOORD4;
|
float2 ClipOrigin : TEXCOORD4;
|
||||||
|
float2 CustomData : TEXCOORD5; // x-per-geometry type, y-features mask
|
||||||
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
#if USE_CUSTOM_VERTEX_INTERPOLATORS
|
||||||
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
float4 CustomVSToPS[CUSTOM_VERTEX_INTERPOLATORS_COUNT] : TEXCOORD9;
|
||||||
#endif
|
#endif
|
||||||
@@ -67,6 +69,7 @@ struct MaterialInput
|
|||||||
float3 WorldPosition;
|
float3 WorldPosition;
|
||||||
float TwoSidedSign;
|
float TwoSidedSign;
|
||||||
float2 TexCoord;
|
float2 TexCoord;
|
||||||
|
float2 CustomData; // x-per-geometry type, y-features mask
|
||||||
#if USE_VERTEX_COLOR
|
#if USE_VERTEX_COLOR
|
||||||
half4 VertexColor;
|
half4 VertexColor;
|
||||||
#endif
|
#endif
|
||||||
@@ -84,6 +87,7 @@ MaterialInput GetMaterialInput(Render2DVertex input, VertexOutput output)
|
|||||||
MaterialInput result;
|
MaterialInput result;
|
||||||
result.WorldPosition = output.WorldPosition;
|
result.WorldPosition = output.WorldPosition;
|
||||||
result.TexCoord = output.TexCoord;
|
result.TexCoord = output.TexCoord;
|
||||||
|
result.CustomData = input.CustomDataAndClipOrigin.xy;
|
||||||
#if USE_VERTEX_COLOR
|
#if USE_VERTEX_COLOR
|
||||||
result.VertexColor = output.VertexColor;
|
result.VertexColor = output.VertexColor;
|
||||||
#endif
|
#endif
|
||||||
@@ -103,6 +107,7 @@ MaterialInput GetMaterialInput(PixelInput input)
|
|||||||
MaterialInput result;
|
MaterialInput result;
|
||||||
result.WorldPosition = input.WorldPosition;
|
result.WorldPosition = input.WorldPosition;
|
||||||
result.TexCoord = input.TexCoord;
|
result.TexCoord = input.TexCoord;
|
||||||
|
result.CustomData = input.CustomData;
|
||||||
#if USE_VERTEX_COLOR
|
#if USE_VERTEX_COLOR
|
||||||
result.VertexColor = input.VertexColor;
|
result.VertexColor = input.VertexColor;
|
||||||
#endif
|
#endif
|
||||||
@@ -222,13 +227,14 @@ VertexOutput VS_GUI(Render2DVertex input)
|
|||||||
if ((int)input.CustomDataAndClipOrigin.y & 1)
|
if ((int)input.CustomDataAndClipOrigin.y & 1)
|
||||||
input.Position = (int2)input.Position;
|
input.Position = (int2)input.Position;
|
||||||
|
|
||||||
output.Position = mul(float4(input.Position, 0, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(input.Position, 0, 1), ViewProjectionMatrix);
|
||||||
output.WorldPosition = mul(float4(input.Position, 0, 1), WorldMatrix).xyz;
|
output.WorldPosition = mul(float4(input.Position, 0, 1), WorldMatrix).xyz;
|
||||||
output.TexCoord = input.TexCoord;
|
output.TexCoord = input.TexCoord;
|
||||||
output.WindowPos = input.Position;
|
output.WindowPos = input.Position;
|
||||||
#if USE_VERTEX_COLOR
|
#if USE_VERTEX_COLOR
|
||||||
output.VertexColor = input.Color;
|
output.VertexColor = input.Color;
|
||||||
#endif
|
#endif
|
||||||
|
output.CustomData = input.CustomDataAndClipOrigin.xy;
|
||||||
output.ClipOrigin = input.CustomDataAndClipOrigin.zw;
|
output.ClipOrigin = input.CustomDataAndClipOrigin.zw;
|
||||||
output.ClipExtents = input.ClipExtents;
|
output.ClipExtents = input.ClipExtents;
|
||||||
|
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ VertexOutput VS_Sprite(SpriteInput input, uint particleIndex : SV_InstanceID)
|
|||||||
output.WorldPosition = position + spriteVertexPosition;
|
output.WorldPosition = position + spriteVertexPosition;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.TexCoord = input.TexCoord;
|
output.TexCoord = input.TexCoord;
|
||||||
@@ -431,7 +431,7 @@ VertexOutput VS_Sprite(SpriteInput input, uint particleIndex : SV_InstanceID)
|
|||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.WorldPosition += material.PositionOffset;
|
output.WorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Copy interpolants for other shader stages
|
// Copy interpolants for other shader stages
|
||||||
@@ -511,7 +511,7 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
|
|||||||
output.WorldPosition = mul(float4(input.Position, 1), world).xyz;
|
output.WorldPosition = mul(float4(input.Position, 1), world).xyz;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.TexCoord = input.TexCoord0;
|
output.TexCoord = input.TexCoord0;
|
||||||
@@ -549,7 +549,7 @@ VertexOutput VS_Model(ModelInput input, uint particleIndex : SV_InstanceID)
|
|||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.WorldPosition += material.PositionOffset;
|
output.WorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Copy interpolants for other shader stages
|
// Copy interpolants for other shader stages
|
||||||
@@ -617,7 +617,7 @@ VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
|
|||||||
output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f);
|
output.WorldPosition = position + tangentRight * vertexSign * (ribbonWidth.xxx * 0.5f);
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.ParticleIndex = particleIndex;
|
output.ParticleIndex = particleIndex;
|
||||||
@@ -655,7 +655,7 @@ VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
|
|||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.WorldPosition += material.PositionOffset;
|
output.WorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.WorldPosition.xyz, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Copy interpolants for other shader stages
|
// Copy interpolants for other shader stages
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ VertexOutput VS(ModelInput input)
|
|||||||
output.Geometry.PrevWorldPosition = mul(float4(input.Position.xyz, 1), object.PrevWorldMatrix).xyz;
|
output.Geometry.PrevWorldPosition = mul(float4(input.Position.xyz, 1), object.PrevWorldMatrix).xyz;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
|
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
|
||||||
@@ -378,7 +378,7 @@ VertexOutput VS(ModelInput input)
|
|||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.Geometry.WorldPosition += material.PositionOffset;
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
output.Geometry.PrevWorldPosition += material.PositionOffset;
|
output.Geometry.PrevWorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Get tessalation multiplier (per vertex)
|
// Get tessalation multiplier (per vertex)
|
||||||
@@ -412,7 +412,7 @@ float4 VS_Depth(ModelInput_PosOnly input) : SV_Position
|
|||||||
|
|
||||||
// Transform vertex position into the screen
|
// Transform vertex position into the screen
|
||||||
float3 worldPosition = mul(float4(input.Position.xyz, 1), object.WorldMatrix).xyz;
|
float3 worldPosition = mul(float4(input.Position.xyz, 1), object.WorldMatrix).xyz;
|
||||||
float4 position = mul(float4(worldPosition, 1), ViewProjectionMatrix);
|
float4 position = PROJECT_POINT(float4(worldPosition, 1), ViewProjectionMatrix);
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,7 +518,7 @@ VertexOutput VS_Skinned(ModelInput_Skinned input)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
|
output.Geometry.TexCoords01 = float4(input.TexCoord0, input.TexCoord1);
|
||||||
@@ -549,7 +549,7 @@ VertexOutput VS_Skinned(ModelInput_Skinned input)
|
|||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.Geometry.WorldPosition += material.PositionOffset;
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
output.Geometry.PrevWorldPosition += material.PositionOffset;
|
output.Geometry.PrevWorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Get tessalation multiplier (per vertex)
|
// Get tessalation multiplier (per vertex)
|
||||||
|
|||||||
@@ -388,7 +388,7 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
output.Geometry.WorldPosition = mul(float4(position, 1), worldMatrix).xyz;
|
output.Geometry.WorldPosition = mul(float4(position, 1), worldMatrix).xyz;
|
||||||
|
|
||||||
// Compute clip space position
|
// Compute clip space position
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
|
|
||||||
// Pass vertex attributes
|
// Pass vertex attributes
|
||||||
#if USE_SMOOTH_LOD_TRANSITION
|
#if USE_SMOOTH_LOD_TRANSITION
|
||||||
@@ -436,7 +436,7 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
// Apply world position offset per-vertex
|
// Apply world position offset per-vertex
|
||||||
#if USE_POSITION_OFFSET
|
#if USE_POSITION_OFFSET
|
||||||
output.Geometry.WorldPosition += material.PositionOffset;
|
output.Geometry.WorldPosition += material.PositionOffset;
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = PROJECT_POINT(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Get tessalation multiplier (per vertex)
|
// Get tessalation multiplier (per vertex)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
#include "./Flax/MaterialCommon.hlsl"
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
#include "./Flax/GBufferCommon.hlsl"
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
|
#include "./Flax/VolumetricFog.hlsl"
|
||||||
@7
|
@7
|
||||||
|
|
||||||
// Primary constant buffer (with additional material parameters)
|
// Primary constant buffer (with additional material parameters)
|
||||||
@@ -21,6 +22,7 @@ float Dummy0;
|
|||||||
float VolumetricFogMaxDistance;
|
float VolumetricFogMaxDistance;
|
||||||
int ParticleStride;
|
int ParticleStride;
|
||||||
int ParticleIndex;
|
int ParticleIndex;
|
||||||
|
float4 GridSliceParameters;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Particles attributes buffer
|
// Particles attributes buffer
|
||||||
@@ -202,19 +204,19 @@ Material GetMaterialPS(MaterialInput input)
|
|||||||
META_PS(true, FEATURE_LEVEL_SM5)
|
META_PS(true, FEATURE_LEVEL_SM5)
|
||||||
void PS_VolumetricFog(Quad_GS2PS input, out float4 VBufferA : SV_Target0, out float4 VBufferB : SV_Target1)
|
void PS_VolumetricFog(Quad_GS2PS input, out float4 VBufferA : SV_Target0, out float4 VBufferB : SV_Target1)
|
||||||
{
|
{
|
||||||
|
// Reproject grid position back to the screen and world space
|
||||||
uint3 gridCoordinate = uint3(input.Vertex.Position.xy, input.LayerIndex);
|
uint3 gridCoordinate = uint3(input.Vertex.Position.xy, input.LayerIndex);
|
||||||
float3 cellOffset = 0.5f;
|
float3 cellOffset = 0.5f;
|
||||||
float2 volumeUV = (gridCoordinate.xy + cellOffset.xy) / GridSize.xy;
|
float2 volumeUV = (gridCoordinate.xy + cellOffset.xy) / GridSize.xy;
|
||||||
float zSlice = gridCoordinate.z + cellOffset.z;
|
float sceneDepth = GetDepthFromSlice(GridSliceParameters, gridCoordinate.z + cellOffset.z) / ViewFar;
|
||||||
float sceneDepth = (zSlice / GridSize.z) * VolumetricFogMaxDistance / ViewFar;
|
|
||||||
float deviceDepth = (ViewInfo.w / sceneDepth) + ViewInfo.z;
|
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 clipPos = float4(volumeUV * float2(2.0, -2.0) + float2(-1.0, 1.0), deviceDepth, 1.0);
|
||||||
float4 wsPos = mul(clipPos, InverseViewProjectionMatrix);
|
float4 wsPos = mul(clipPos, InverseViewProjectionMatrix);
|
||||||
float3 positionWS = wsPos.xyz / wsPos.w;
|
wsPos.xyz /= wsPos.w;
|
||||||
|
|
||||||
// Get material parameters
|
// Get material parameters
|
||||||
MaterialInput materialInput = (MaterialInput)0;
|
MaterialInput materialInput = (MaterialInput)0;
|
||||||
materialInput.WorldPosition = positionWS;
|
materialInput.WorldPosition = wsPos.xyz;
|
||||||
materialInput.TexCoord = input.Vertex.TexCoord;
|
materialInput.TexCoord = input.Vertex.TexCoord;
|
||||||
materialInput.ParticleIndex = ParticleIndex;
|
materialInput.ParticleIndex = ParticleIndex;
|
||||||
materialInput.TBN = float3x3(float3(1, 0, 0), float3(0, 1, 0), float3(0, 0, 1));
|
materialInput.TBN = float3x3(float3(1, 0, 0), float3(0, 1, 0), float3(0, 0, 1));
|
||||||
@@ -225,9 +227,10 @@ void PS_VolumetricFog(Quad_GS2PS input, out float4 VBufferA : SV_Target0, out fl
|
|||||||
Material material = GetMaterialPS(materialInput);
|
Material material = GetMaterialPS(materialInput);
|
||||||
|
|
||||||
// Compute fog properties
|
// Compute fog properties
|
||||||
|
material.Opacity *= material.Mask;
|
||||||
float3 albedo = material.Color;
|
float3 albedo = material.Color;
|
||||||
float extinction = material.Opacity * material.Mask * 0.001f;
|
float extinction = material.Opacity * 0.001f;
|
||||||
float3 emission = material.Emissive;
|
float3 emission = material.Emissive * material.Opacity;
|
||||||
float3 scattering = albedo * extinction;
|
float3 scattering = albedo * extinction;
|
||||||
float absorption = max(0.0f, extinction - Luminance(scattering));
|
float absorption = max(0.0f, extinction - Luminance(scattering));
|
||||||
|
|
||||||
|
|||||||
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
Content/Shaders/BitonicSort.flax
LFS
BIN
Content/Shaders/BitonicSort.flax
LFS
Binary file not shown.
Binary file not shown.
BIN
Content/Shaders/DebugDraw.flax
LFS
BIN
Content/Shaders/DebugDraw.flax
LFS
Binary file not shown.
Binary file not shown.
BIN
Content/Shaders/Fog.flax
LFS
BIN
Content/Shaders/Fog.flax
LFS
Binary file not shown.
BIN
Content/Shaders/GI/DDGI.flax
LFS
BIN
Content/Shaders/GI/DDGI.flax
LFS
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Content/Shaders/GUI.flax
LFS
BIN
Content/Shaders/GUI.flax
LFS
Binary file not shown.
Binary file not shown.
BIN
Content/Shaders/Histogram.flax
LFS
BIN
Content/Shaders/Histogram.flax
LFS
Binary file not shown.
BIN
Content/Shaders/Lights.flax
LFS
BIN
Content/Shaders/Lights.flax
LFS
Binary file not shown.
BIN
Content/Shaders/MotionBlur.flax
LFS
BIN
Content/Shaders/MotionBlur.flax
LFS
Binary file not shown.
BIN
Content/Shaders/MultiScaler.flax
LFS
BIN
Content/Shaders/MultiScaler.flax
LFS
Binary file not shown.
Binary file not shown.
BIN
Content/Shaders/Quad.flax
LFS
BIN
Content/Shaders/Quad.flax
LFS
Binary file not shown.
BIN
Content/Shaders/Reflections.flax
LFS
BIN
Content/Shaders/Reflections.flax
LFS
Binary file not shown.
BIN
Content/Shaders/SDF.flax
LFS
BIN
Content/Shaders/SDF.flax
LFS
Binary file not shown.
BIN
Content/Shaders/SSAO.flax
LFS
BIN
Content/Shaders/SSAO.flax
LFS
Binary file not shown.
BIN
Content/Shaders/SSR.flax
LFS
BIN
Content/Shaders/SSR.flax
LFS
Binary file not shown.
BIN
Content/Shaders/Shadows.flax
LFS
BIN
Content/Shaders/Shadows.flax
LFS
Binary file not shown.
BIN
Content/Shaders/Sky.flax
LFS
BIN
Content/Shaders/Sky.flax
LFS
Binary file not shown.
BIN
Content/Shaders/TAA.flax
LFS
BIN
Content/Shaders/TAA.flax
LFS
Binary file not shown.
Binary file not shown.
@@ -2,17 +2,26 @@
|
|||||||
"Name": "Flax",
|
"Name": "Flax",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": 1,
|
"Major": 1,
|
||||||
"Minor": 11,
|
"Minor": 12,
|
||||||
"Revision": 0,
|
"Revision": 0,
|
||||||
"Build": 6802
|
"Build": 6910
|
||||||
},
|
},
|
||||||
"Company": "Flax",
|
"Company": "Flax",
|
||||||
"Copyright": "Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.",
|
"Copyright": "Copyright (c) 2012-2026 Wojciech Figat. All rights reserved.",
|
||||||
"GameTarget": "FlaxGame",
|
"GameTarget": "FlaxGame",
|
||||||
"EditorTarget": "FlaxEditor",
|
"EditorTarget": "FlaxEditor",
|
||||||
"Configuration": {
|
"Configuration": {
|
||||||
"UseCSharp": true,
|
"UseCSharp": true,
|
||||||
"UseLargeWorlds": false,
|
"UseLargeWorlds": false,
|
||||||
"UseDotNet": true
|
"UseDotNet": true,
|
||||||
|
"Windows": {
|
||||||
|
"UseSDL": false,
|
||||||
|
},
|
||||||
|
"Mac": {
|
||||||
|
"UseSDL": false,
|
||||||
|
},
|
||||||
|
"Linux": {
|
||||||
|
"UseSDL": true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -188,7 +188,7 @@
|
|||||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE/@EntryValue">False</s:Boolean>
|
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE/@EntryValue">False</s:Boolean>
|
||||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
|
||||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_ACCESSOR_ATTRIBUTE_ON_SAME_LINE/@EntryValue">False</s:Boolean>
|
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_ACCESSOR_ATTRIBUTE_ON_SAME_LINE/@EntryValue">False</s:Boolean>
|
||||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_CASE_STATEMENT_ON_SAME_LINE/@EntryValue">ALWAYS</s:String>
|
|
||||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_EMBEDDED_STATEMENT_ON_SAME_LINE/@EntryValue">NEVER</s:String>
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_SIMPLE_EMBEDDED_STATEMENT_ON_SAME_LINE/@EntryValue">NEVER</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SIMPLE_CASE_STATEMENT_STYLE/@EntryValue">ON_SINGLE_LINE</s:String>
|
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SIMPLE_CASE_STATEMENT_STYLE/@EntryValue">ON_SINGLE_LINE</s:String>
|
||||||
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue">False</s:Boolean>
|
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue">False</s:Boolean>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace FlaxEditor.Content.GUI
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the target node.
|
/// Gets the target node.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ContentTreeNode TargetNode { get; }
|
public ContentFolderTreeNode TargetNode { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ContentNavigationButton"/> class.
|
/// Initializes a new instance of the <see cref="ContentNavigationButton"/> class.
|
||||||
@@ -28,7 +28,7 @@ namespace FlaxEditor.Content.GUI
|
|||||||
/// <param name="x">The x position.</param>
|
/// <param name="x">The x position.</param>
|
||||||
/// <param name="y">The y position.</param>
|
/// <param name="y">The y position.</param>
|
||||||
/// <param name="height">The height.</param>
|
/// <param name="height">The height.</param>
|
||||||
public ContentNavigationButton(ContentTreeNode targetNode, float x, float y, float height)
|
public ContentNavigationButton(ContentFolderTreeNode targetNode, float x, float y, float height)
|
||||||
: base(x, y, height)
|
: base(x, y, height)
|
||||||
{
|
{
|
||||||
TargetNode = targetNode;
|
TargetNode = targetNode;
|
||||||
@@ -147,7 +147,7 @@ namespace FlaxEditor.Content.GUI
|
|||||||
ClearItems();
|
ClearItems();
|
||||||
foreach (var child in Target.TargetNode.Children)
|
foreach (var child in Target.TargetNode.Children)
|
||||||
{
|
{
|
||||||
if (child is ContentTreeNode node)
|
if (child is ContentFolderTreeNode node)
|
||||||
{
|
{
|
||||||
if (node.Folder.VisibleInHierarchy) // Respect the filter set by ContentFilterConfig.Filter(...)
|
if (node.Folder.VisibleInHierarchy) // Respect the filter set by ContentFilterConfig.Filter(...)
|
||||||
AddItem(node.Folder.ShortName);
|
AddItem(node.Folder.ShortName);
|
||||||
@@ -180,7 +180,7 @@ namespace FlaxEditor.Content.GUI
|
|||||||
var item = _items[index];
|
var item = _items[index];
|
||||||
foreach (var child in Target.TargetNode.Children)
|
foreach (var child in Target.TargetNode.Children)
|
||||||
{
|
{
|
||||||
if (child is ContentTreeNode node && node.Folder.ShortName == item)
|
if (child is ContentFolderTreeNode node && node.Folder.ShortName == item)
|
||||||
{
|
{
|
||||||
Editor.Instance.Windows.ContentWin.Navigate(node);
|
Editor.Instance.Windows.ContentWin.Navigate(node);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -187,6 +187,11 @@ namespace FlaxEditor.Content.Import
|
|||||||
// Glossiness, metalness, ambient occlusion, displacement, height, cavity or specular
|
// Glossiness, metalness, ambient occlusion, displacement, height, cavity or specular
|
||||||
_settings.Settings.Type = TextureFormatType.GrayScale;
|
_settings.Settings.Type = TextureFormatType.GrayScale;
|
||||||
}
|
}
|
||||||
|
else if (_settings.Settings.Type == TextureFormatType.ColorRGB)
|
||||||
|
{
|
||||||
|
// Blind guess that common color texture is sRGB
|
||||||
|
_settings.Settings.sRGB = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Try to restore target asset texture import options (useful for fast reimport)
|
// Try to restore target asset texture import options (useful for fast reimport)
|
||||||
Editor.TryRestoreImportOptions(ref _settings.Settings, ResultUrl);
|
Editor.TryRestoreImportOptions(ref _settings.Settings, ResultUrl);
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ namespace FlaxEditor.Content
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the content node.
|
/// Gets the content node.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ContentTreeNode Node { get; }
|
public ContentFolderTreeNode Node { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The subitems of this folder.
|
/// The subitems of this folder.
|
||||||
@@ -72,7 +72,7 @@ namespace FlaxEditor.Content
|
|||||||
/// <param name="type">The folder type.</param>
|
/// <param name="type">The folder type.</param>
|
||||||
/// <param name="path">The path to the item.</param>
|
/// <param name="path">The path to the item.</param>
|
||||||
/// <param name="node">The folder parent node.</param>
|
/// <param name="node">The folder parent node.</param>
|
||||||
internal ContentFolder(ContentFolderType type, string path, ContentTreeNode node)
|
internal ContentFolder(ContentFolderType type, string path, ContentFolderTreeNode node)
|
||||||
: base(path)
|
: base(path)
|
||||||
{
|
{
|
||||||
FolderType = type;
|
FolderType = type;
|
||||||
@@ -118,7 +118,7 @@ namespace FlaxEditor.Content
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
var hasParentFolder = ParentFolder != null;
|
var hasParentFolder = ParentFolder != null;
|
||||||
var isContentFolder = Node is MainContentTreeNode;
|
var isContentFolder = Node is MainContentFolderTreeNode;
|
||||||
return hasParentFolder && !isContentFolder;
|
return hasParentFolder && !isContentFolder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,7 +282,7 @@ namespace FlaxEditor.Content
|
|||||||
|
|
||||||
if (data is DragDataFiles)
|
if (data is DragDataFiles)
|
||||||
return DragDropEffect.Copy;
|
return DragDropEffect.Copy;
|
||||||
return _dragOverItems.Effect;
|
return _dragOverItems?.Effect ?? DragDropEffect.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace FlaxEditor.Content
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string TypeDescription => Path.EndsWith(".h") ? "C++ Header File" : "C++ Source Code";
|
public override string TypeDescription => Path.EndsWith(".h") || Path.EndsWith(".hpp") ? "C++ Header File" : "C++ Source Code";
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override SpriteHandle DefaultThumbnail => Editor.Instance.Icons.CPPScript128;
|
public override SpriteHandle DefaultThumbnail => Editor.Instance.Icons.CPPScript128;
|
||||||
|
|||||||
@@ -281,6 +281,13 @@ namespace FlaxEditor.Content
|
|||||||
|
|
||||||
private void CacheData()
|
private void CacheData()
|
||||||
{
|
{
|
||||||
|
if (!_asset)
|
||||||
|
{
|
||||||
|
_parameters = Utils.GetEmptyArray<ScriptMemberInfo>();
|
||||||
|
_methods = Utils.GetEmptyArray<ScriptMemberInfo>();
|
||||||
|
_attributes = Utils.GetEmptyArray<Attribute>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (_parameters != null)
|
if (_parameters != null)
|
||||||
return;
|
return;
|
||||||
if (_asset.WaitForLoaded())
|
if (_asset.WaitForLoaded())
|
||||||
@@ -344,13 +351,13 @@ namespace FlaxEditor.Content
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string Name => Path.GetFileNameWithoutExtension(_asset.Path);
|
public string Name => _asset ? Path.GetFileNameWithoutExtension(_asset.Path) : null;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string Namespace => string.Empty;
|
public string Namespace => string.Empty;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string TypeName => JsonSerializer.GetStringID(_asset.ID);
|
public string TypeName => _asset ? JsonSerializer.GetStringID(_asset.ID) : null;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool IsPublic => true;
|
public bool IsPublic => true;
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ namespace FlaxEditor.Content.Thumbnails
|
|||||||
{
|
{
|
||||||
if (item == null)
|
if (item == null)
|
||||||
throw new ArgumentNullException();
|
throw new ArgumentNullException();
|
||||||
|
if (_task == null)
|
||||||
|
return;
|
||||||
|
|
||||||
// Check if use default icon
|
// Check if use default icon
|
||||||
var defaultThumbnail = item.DefaultThumbnail;
|
var defaultThumbnail = item.DefaultThumbnail;
|
||||||
@@ -223,11 +225,12 @@ namespace FlaxEditor.Content.Thumbnails
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void OnInit()
|
public override void OnInit()
|
||||||
{
|
{
|
||||||
|
if (Editor.IsHeadlessMode || (GPUDevice.Instance != null && GPUDevice.Instance.RendererType == RendererType.Null))
|
||||||
|
return;
|
||||||
|
|
||||||
// Create cache folder
|
// Create cache folder
|
||||||
if (!Directory.Exists(_cacheFolder))
|
if (!Directory.Exists(_cacheFolder))
|
||||||
{
|
|
||||||
Directory.CreateDirectory(_cacheFolder);
|
Directory.CreateDirectory(_cacheFolder);
|
||||||
}
|
|
||||||
|
|
||||||
// Find atlases in a Editor cache directory
|
// Find atlases in a Editor cache directory
|
||||||
var files = Directory.GetFiles(_cacheFolder, "cache_*.flax", SearchOption.TopDirectoryOnly);
|
var files = Directory.GetFiles(_cacheFolder, "cache_*.flax", SearchOption.TopDirectoryOnly);
|
||||||
@@ -482,7 +485,7 @@ namespace FlaxEditor.Content.Thumbnails
|
|||||||
public override void OnUpdate()
|
public override void OnUpdate()
|
||||||
{
|
{
|
||||||
// Wait some frames before start generating previews (late init feature)
|
// Wait some frames before start generating previews (late init feature)
|
||||||
if (Time.TimeSinceStartup < 1.0f || HasAllAtlasesLoaded() == false)
|
if (Time.TimeSinceStartup < 1.0f || HasAllAtlasesLoaded() == false || _task == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lock (_requests)
|
lock (_requests)
|
||||||
|
|||||||
433
Source/Editor/Content/Tree/ContentFolderTreeNode.cs
Normal file
433
Source/Editor/Content/Tree/ContentFolderTreeNode.cs
Normal file
@@ -0,0 +1,433 @@
|
|||||||
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using FlaxEditor.GUI;
|
||||||
|
using FlaxEditor.GUI.Drag;
|
||||||
|
using FlaxEditor.GUI.Tree;
|
||||||
|
using FlaxEditor.SceneGraph;
|
||||||
|
using FlaxEditor.Utilities;
|
||||||
|
using FlaxEngine;
|
||||||
|
using FlaxEngine.GUI;
|
||||||
|
|
||||||
|
namespace FlaxEditor.Content;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Content folder tree node.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="TreeNode" />
|
||||||
|
public class ContentFolderTreeNode : TreeNode
|
||||||
|
{
|
||||||
|
private DragItems _dragOverItems;
|
||||||
|
private DragActors _dragActors;
|
||||||
|
private List<Rectangle> _highlights;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The folder.
|
||||||
|
/// </summary>
|
||||||
|
protected ContentFolder _folder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether this node can be deleted.
|
||||||
|
/// </summary>
|
||||||
|
public virtual bool CanDelete => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether this node can be duplicated.
|
||||||
|
/// </summary>
|
||||||
|
public virtual bool CanDuplicate => true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the content folder item.
|
||||||
|
/// </summary>
|
||||||
|
public ContentFolder Folder => _folder;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the type of the folder.
|
||||||
|
/// </summary>
|
||||||
|
public ContentFolderType FolderType => _folder.FolderType;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if that folder can import/manage scripts.
|
||||||
|
/// </summary>
|
||||||
|
public bool CanHaveScripts => _folder.CanHaveScripts;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if that folder can import/manage assets.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True if can contain assets for project, otherwise false</returns>
|
||||||
|
public bool CanHaveAssets => _folder.CanHaveAssets;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the parent node.
|
||||||
|
/// </summary>
|
||||||
|
public ContentFolderTreeNode ParentNode => Parent as ContentFolderTreeNode;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the folder path.
|
||||||
|
/// </summary>
|
||||||
|
public string Path => _folder.Path;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the navigation button label.
|
||||||
|
/// </summary>
|
||||||
|
public virtual string NavButtonLabel => _folder.ShortName;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ContentFolderTreeNode"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parent">The parent node.</param>
|
||||||
|
/// <param name="path">The folder path.</param>
|
||||||
|
public ContentFolderTreeNode(ContentFolderTreeNode parent, string path)
|
||||||
|
: this(parent, parent?.FolderType ?? ContentFolderType.Other, path)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ContentFolderTreeNode"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="parent">The parent node.</param>
|
||||||
|
/// <param name="type">The folder type.</param>
|
||||||
|
/// <param name="path">The folder path.</param>
|
||||||
|
protected ContentFolderTreeNode(ContentFolderTreeNode parent, ContentFolderType type, string path)
|
||||||
|
: base(false, Editor.Instance.Icons.FolderClosed32, Editor.Instance.Icons.FolderOpen32)
|
||||||
|
{
|
||||||
|
_folder = new ContentFolder(type, path, this);
|
||||||
|
Text = _folder.ShortName;
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
Folder.ParentFolder = parent.Folder;
|
||||||
|
Parent = parent;
|
||||||
|
}
|
||||||
|
IconColor = Color.Transparent; // Hide default icon, we draw scaled icon manually
|
||||||
|
UpdateCustomArrowRect();
|
||||||
|
Editor.Instance?.Windows?.ContentWin?.TryAutoExpandContentNode(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the custom arrow rectangle so it stays aligned with the current layout.
|
||||||
|
/// </summary>
|
||||||
|
private void UpdateCustomArrowRect()
|
||||||
|
{
|
||||||
|
var contentWindow = Editor.Instance?.Windows?.ContentWin;
|
||||||
|
var scale = contentWindow != null && contentWindow.IsTreeOnlyMode ? contentWindow.View.ViewScale : 1.0f;
|
||||||
|
var arrowSize = Mathf.Clamp(12.0f * scale, 10.0f, 20.0f);
|
||||||
|
var iconSize = Mathf.Clamp(16.0f * scale, 12.0f, 28.0f);
|
||||||
|
|
||||||
|
// Use the current text layout, not just cached values.
|
||||||
|
var textRect = TextRect;
|
||||||
|
var iconLeft = textRect.Left - iconSize - 2.0f;
|
||||||
|
var x = Mathf.Max(iconLeft - arrowSize - 2.0f, 0.0f);
|
||||||
|
var y = Mathf.Max((HeaderHeight - arrowSize) * 0.5f, 0.0f);
|
||||||
|
|
||||||
|
CustomArrowRect = new Rectangle(x, y, arrowSize, arrowSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void PerformLayout(bool force = false)
|
||||||
|
{
|
||||||
|
base.PerformLayout(force);
|
||||||
|
UpdateCustomArrowRect();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Shows the rename popup for the item.
|
||||||
|
/// </summary>
|
||||||
|
public void StartRenaming()
|
||||||
|
{
|
||||||
|
if (!_folder.CanRename)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Start renaming the folder
|
||||||
|
Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(false);
|
||||||
|
var dialog = RenamePopup.Show(this, TextRect, _folder.ShortName, false);
|
||||||
|
dialog.Tag = _folder;
|
||||||
|
dialog.Renamed += popup =>
|
||||||
|
{
|
||||||
|
Editor.Instance.Windows.ContentWin.Rename((ContentFolder)popup.Tag, popup.Text);
|
||||||
|
Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true);
|
||||||
|
};
|
||||||
|
dialog.Closed += popup => { Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true); };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the query search filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterText">The filter text.</param>
|
||||||
|
public void UpdateFilter(string filterText)
|
||||||
|
{
|
||||||
|
bool noFilter = string.IsNullOrWhiteSpace(filterText);
|
||||||
|
|
||||||
|
// Update itself
|
||||||
|
bool isThisVisible;
|
||||||
|
if (noFilter)
|
||||||
|
{
|
||||||
|
// Clear filter
|
||||||
|
_highlights?.Clear();
|
||||||
|
isThisVisible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var text = Text;
|
||||||
|
if (QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
|
||||||
|
{
|
||||||
|
// Update highlights
|
||||||
|
if (_highlights == null)
|
||||||
|
_highlights = new List<Rectangle>(ranges.Length);
|
||||||
|
else
|
||||||
|
_highlights.Clear();
|
||||||
|
var style = Style.Current;
|
||||||
|
var font = style.FontSmall;
|
||||||
|
var textRect = TextRect;
|
||||||
|
for (int i = 0; i < ranges.Length; i++)
|
||||||
|
{
|
||||||
|
var start = font.GetCharPosition(text, ranges[i].StartIndex);
|
||||||
|
var end = font.GetCharPosition(text, ranges[i].EndIndex);
|
||||||
|
_highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
|
||||||
|
}
|
||||||
|
isThisVisible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Hide
|
||||||
|
_highlights?.Clear();
|
||||||
|
isThisVisible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update children
|
||||||
|
bool isAnyChildVisible = false;
|
||||||
|
for (int i = 0; i < _children.Count; i++)
|
||||||
|
{
|
||||||
|
if (_children[i] is ContentFolderTreeNode child)
|
||||||
|
{
|
||||||
|
child.UpdateFilter(filterText);
|
||||||
|
isAnyChildVisible |= child.Visible;
|
||||||
|
}
|
||||||
|
else if (_children[i] is ContentItemTreeNode itemNode)
|
||||||
|
{
|
||||||
|
itemNode.UpdateFilter(filterText);
|
||||||
|
isAnyChildVisible |= itemNode.Visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!noFilter)
|
||||||
|
{
|
||||||
|
bool isExpanded = isAnyChildVisible;
|
||||||
|
if (isExpanded)
|
||||||
|
Expand(true);
|
||||||
|
else
|
||||||
|
Collapse(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Visible = isThisVisible | isAnyChildVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override int Compare(Control other)
|
||||||
|
{
|
||||||
|
if (other is ContentItemTreeNode)
|
||||||
|
return -1;
|
||||||
|
if (other is ContentFolderTreeNode otherNode)
|
||||||
|
return string.Compare(Text, otherNode.Text, StringComparison.Ordinal);
|
||||||
|
return base.Compare(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Draw()
|
||||||
|
{
|
||||||
|
base.Draw();
|
||||||
|
|
||||||
|
// Draw all highlights
|
||||||
|
if (_highlights != null)
|
||||||
|
{
|
||||||
|
var style = Style.Current;
|
||||||
|
var color = style.ProgressNormal * 0.6f;
|
||||||
|
for (int i = 0; i < _highlights.Count; i++)
|
||||||
|
Render2D.FillRectangle(_highlights[i], color);
|
||||||
|
}
|
||||||
|
|
||||||
|
var contentWindow = Editor.Instance.Windows.ContentWin;
|
||||||
|
var scale = contentWindow != null && contentWindow.IsTreeOnlyMode ? contentWindow.View.ViewScale : 1.0f;
|
||||||
|
var icon = IsExpanded ? Editor.Instance.Icons.FolderOpen32 : Editor.Instance.Icons.FolderClosed32;
|
||||||
|
var iconSize = Mathf.Clamp(16.0f * scale, 12.0f, 28.0f);
|
||||||
|
var iconRect = new Rectangle(TextRect.Left - iconSize - 2.0f, (HeaderHeight - iconSize) * 0.5f, iconSize, iconSize);
|
||||||
|
Render2D.DrawSprite(icon, iconRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void OnDestroy()
|
||||||
|
{
|
||||||
|
// Delete folder item
|
||||||
|
_folder.Dispose();
|
||||||
|
|
||||||
|
base.OnDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void OnExpandedChanged()
|
||||||
|
{
|
||||||
|
base.OnExpandedChanged();
|
||||||
|
|
||||||
|
Editor.Instance?.Windows?.ContentWin?.OnContentTreeNodeExpandedChanged(this, IsExpanded);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DragDropEffect GetDragEffect(DragData data)
|
||||||
|
{
|
||||||
|
if (_dragActors != null && _dragActors.HasValidDrag)
|
||||||
|
return DragDropEffect.Move;
|
||||||
|
if (data is DragDataFiles)
|
||||||
|
{
|
||||||
|
if (_folder.CanHaveAssets)
|
||||||
|
return DragDropEffect.Copy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_dragOverItems != null && _dragOverItems.HasValidDrag)
|
||||||
|
return DragDropEffect.Move;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DragDropEffect.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ValidateDragItem(ContentItem item)
|
||||||
|
{
|
||||||
|
// Reject itself and any parent
|
||||||
|
return item != _folder && !item.Find(_folder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ValidateDragActors(ActorNode actor)
|
||||||
|
{
|
||||||
|
return actor.CanCreatePrefab && _folder.CanHaveAssets;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ImportActors(DragActors actors)
|
||||||
|
{
|
||||||
|
Select();
|
||||||
|
foreach (var actorNode in actors.Objects)
|
||||||
|
{
|
||||||
|
var actor = actorNode.Actor;
|
||||||
|
if (actors.Objects.Contains(actorNode.ParentNode as ActorNode))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Editor.Instance.Prefabs.CreatePrefab(actor, false);
|
||||||
|
}
|
||||||
|
Editor.Instance.Windows.ContentWin.RefreshView();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override DragDropEffect OnDragEnterHeader(DragData data)
|
||||||
|
{
|
||||||
|
if (data is DragDataFiles)
|
||||||
|
return _folder.CanHaveAssets ? DragDropEffect.Copy : DragDropEffect.None;
|
||||||
|
|
||||||
|
if (_dragActors == null)
|
||||||
|
_dragActors = new DragActors(ValidateDragActors);
|
||||||
|
if (_dragActors.OnDragEnter(data))
|
||||||
|
return DragDropEffect.Move;
|
||||||
|
|
||||||
|
if (_dragOverItems == null)
|
||||||
|
_dragOverItems = new DragItems(ValidateDragItem);
|
||||||
|
|
||||||
|
_dragOverItems.OnDragEnter(data);
|
||||||
|
return GetDragEffect(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override DragDropEffect OnDragMoveHeader(DragData data)
|
||||||
|
{
|
||||||
|
if (data is DragDataFiles)
|
||||||
|
return _folder.CanHaveAssets ? DragDropEffect.Copy : DragDropEffect.None;
|
||||||
|
if (_dragActors != null && _dragActors.HasValidDrag)
|
||||||
|
return DragDropEffect.Move;
|
||||||
|
return GetDragEffect(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void OnDragLeaveHeader()
|
||||||
|
{
|
||||||
|
_dragOverItems?.OnDragLeave();
|
||||||
|
_dragActors?.OnDragLeave();
|
||||||
|
base.OnDragLeaveHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override DragDropEffect OnDragDropHeader(DragData data)
|
||||||
|
{
|
||||||
|
var result = DragDropEffect.None;
|
||||||
|
|
||||||
|
// Check if drop element or files
|
||||||
|
if (data is DragDataFiles files)
|
||||||
|
{
|
||||||
|
// Import files
|
||||||
|
Editor.Instance.ContentImporting.Import(files.Files, _folder);
|
||||||
|
result = DragDropEffect.Copy;
|
||||||
|
|
||||||
|
Expand();
|
||||||
|
}
|
||||||
|
else if (_dragActors != null && _dragActors.HasValidDrag)
|
||||||
|
{
|
||||||
|
ImportActors(_dragActors);
|
||||||
|
_dragActors.OnDragDrop();
|
||||||
|
result = DragDropEffect.Move;
|
||||||
|
|
||||||
|
Expand();
|
||||||
|
}
|
||||||
|
else if (_dragOverItems != null && _dragOverItems.HasValidDrag)
|
||||||
|
{
|
||||||
|
// Move items
|
||||||
|
Editor.Instance.ContentDatabase.Move(_dragOverItems.Objects, _folder);
|
||||||
|
result = DragDropEffect.Move;
|
||||||
|
|
||||||
|
Expand();
|
||||||
|
}
|
||||||
|
|
||||||
|
_dragOverItems?.OnDragDrop();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void DoDragDrop()
|
||||||
|
{
|
||||||
|
DoDragDrop(DragItems.GetDragData(_folder));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void OnLongPress()
|
||||||
|
{
|
||||||
|
Select();
|
||||||
|
|
||||||
|
StartRenaming();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool OnKeyDown(KeyboardKeys key)
|
||||||
|
{
|
||||||
|
if (IsFocused)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case KeyboardKeys.F2:
|
||||||
|
StartRenaming();
|
||||||
|
return true;
|
||||||
|
case KeyboardKeys.Delete:
|
||||||
|
if (Folder.Exists && CanDelete)
|
||||||
|
Editor.Instance.Windows.ContentWin.Delete(Folder);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (RootWindow.GetKey(KeyboardKeys.Control))
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case KeyboardKeys.D:
|
||||||
|
if (Folder.Exists && CanDuplicate)
|
||||||
|
Editor.Instance.Windows.ContentWin.Duplicate(Folder);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnKeyDown(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
224
Source/Editor/Content/Tree/ContentItemTreeNode.cs
Normal file
224
Source/Editor/Content/Tree/ContentItemTreeNode.cs
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using FlaxEditor.Content.GUI;
|
||||||
|
using FlaxEditor.GUI.Drag;
|
||||||
|
using FlaxEditor.GUI.Tree;
|
||||||
|
using FlaxEditor.Utilities;
|
||||||
|
using FlaxEngine;
|
||||||
|
using FlaxEngine.GUI;
|
||||||
|
|
||||||
|
namespace FlaxEditor.Content;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tree node for non-folder content items.
|
||||||
|
/// </summary>
|
||||||
|
public sealed class ContentItemTreeNode : TreeNode, IContentItemOwner
|
||||||
|
{
|
||||||
|
private List<Rectangle> _highlights;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The content item.
|
||||||
|
/// </summary>
|
||||||
|
public ContentItem Item { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ContentItemTreeNode"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The content item.</param>
|
||||||
|
public ContentItemTreeNode(ContentItem item)
|
||||||
|
: base(false, Editor.Instance.Icons.Document128, Editor.Instance.Icons.Document128)
|
||||||
|
{
|
||||||
|
Item = item ?? throw new ArgumentNullException(nameof(item));
|
||||||
|
UpdateDisplayedName();
|
||||||
|
IconColor = Color.Transparent; // Reserve icon space but draw custom thumbnail.
|
||||||
|
Item.AddReference(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SpriteHandle GetIcon(ContentItem item)
|
||||||
|
{
|
||||||
|
if (item == null)
|
||||||
|
return SpriteHandle.Invalid;
|
||||||
|
var icon = item.Thumbnail;
|
||||||
|
if (!icon.IsValid)
|
||||||
|
icon = item.DefaultThumbnail;
|
||||||
|
if (!icon.IsValid)
|
||||||
|
icon = Editor.Instance.Icons.Document128;
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the query search filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filterText">The filter text.</param>
|
||||||
|
public void UpdateFilter(string filterText)
|
||||||
|
{
|
||||||
|
bool noFilter = string.IsNullOrWhiteSpace(filterText);
|
||||||
|
bool isVisible;
|
||||||
|
if (noFilter)
|
||||||
|
{
|
||||||
|
_highlights?.Clear();
|
||||||
|
isVisible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var text = Text;
|
||||||
|
if (QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
|
||||||
|
{
|
||||||
|
if (_highlights == null)
|
||||||
|
_highlights = new List<Rectangle>(ranges.Length);
|
||||||
|
else
|
||||||
|
_highlights.Clear();
|
||||||
|
var style = Style.Current;
|
||||||
|
var font = style.FontSmall;
|
||||||
|
var textRect = TextRect;
|
||||||
|
for (int i = 0; i < ranges.Length; i++)
|
||||||
|
{
|
||||||
|
var start = font.GetCharPosition(text, ranges[i].StartIndex);
|
||||||
|
var end = font.GetCharPosition(text, ranges[i].EndIndex);
|
||||||
|
_highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
|
||||||
|
}
|
||||||
|
isVisible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_highlights?.Clear();
|
||||||
|
isVisible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Visible = isVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Draw()
|
||||||
|
{
|
||||||
|
base.Draw();
|
||||||
|
|
||||||
|
var icon = GetIcon(Item);
|
||||||
|
if (icon.IsValid)
|
||||||
|
{
|
||||||
|
var contentWindow = Editor.Instance.Windows.ContentWin;
|
||||||
|
var scale = contentWindow != null && contentWindow.IsTreeOnlyMode ? contentWindow.View.ViewScale : 1.0f;
|
||||||
|
var iconSize = Mathf.Clamp(16.0f * scale, 12.0f, 28.0f);
|
||||||
|
var textRect = TextRect;
|
||||||
|
var iconRect = new Rectangle(textRect.Left - iconSize - 2.0f, (HeaderHeight - iconSize) * 0.5f, iconSize, iconSize);
|
||||||
|
Render2D.DrawSprite(icon, iconRect);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_highlights != null)
|
||||||
|
{
|
||||||
|
var style = Style.Current;
|
||||||
|
var color = style.ProgressNormal * 0.6f;
|
||||||
|
for (int i = 0; i < _highlights.Count; i++)
|
||||||
|
Render2D.FillRectangle(_highlights[i], color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override bool OnMouseDoubleClickHeader(ref Float2 location, MouseButton button)
|
||||||
|
{
|
||||||
|
if (button == MouseButton.Left)
|
||||||
|
{
|
||||||
|
Editor.Instance.Windows.ContentWin.Open(Item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnMouseDoubleClickHeader(ref location, button);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool OnKeyDown(KeyboardKeys key)
|
||||||
|
{
|
||||||
|
if (IsFocused)
|
||||||
|
{
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case KeyboardKeys.Return:
|
||||||
|
Editor.Instance.Windows.ContentWin.Open(Item);
|
||||||
|
return true;
|
||||||
|
case KeyboardKeys.F2:
|
||||||
|
Editor.Instance.Windows.ContentWin.Rename(Item);
|
||||||
|
return true;
|
||||||
|
case KeyboardKeys.Delete:
|
||||||
|
Editor.Instance.Windows.ContentWin.Delete(Item);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.OnKeyDown(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void DoDragDrop()
|
||||||
|
{
|
||||||
|
DoDragDrop(DragItems.GetDragData(Item));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool OnShowTooltip(out string text, out Float2 location, out Rectangle area)
|
||||||
|
{
|
||||||
|
Item.UpdateTooltipText();
|
||||||
|
TooltipText = Item.TooltipText;
|
||||||
|
return base.OnShowTooltip(out text, out location, out area);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
void IContentItemOwner.OnItemDeleted(ContentItem item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
void IContentItemOwner.OnItemRenamed(ContentItem item)
|
||||||
|
{
|
||||||
|
UpdateDisplayedName();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
void IContentItemOwner.OnItemReimported(ContentItem item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
void IContentItemOwner.OnItemDispose(ContentItem item)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override int Compare(Control other)
|
||||||
|
{
|
||||||
|
if (other is ContentFolderTreeNode)
|
||||||
|
return 1;
|
||||||
|
if (other is ContentItemTreeNode otherItem)
|
||||||
|
return ApplySortOrder(string.Compare(Text, otherItem.Text, StringComparison.InvariantCulture));
|
||||||
|
return base.Compare(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void OnDestroy()
|
||||||
|
{
|
||||||
|
Item.RemoveReference(this);
|
||||||
|
base.OnDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the text of the node.
|
||||||
|
/// </summary>
|
||||||
|
public void UpdateDisplayedName()
|
||||||
|
{
|
||||||
|
var contentWindow = Editor.Instance?.Windows?.ContentWin;
|
||||||
|
var showExtensions = contentWindow?.View?.ShowFileExtensions ?? true;
|
||||||
|
Text = Item.ShowFileExtension || showExtensions ? Item.FileName : Item.ShortName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SortType GetSortType()
|
||||||
|
{
|
||||||
|
return Editor.Instance?.Windows?.ContentWin?.CurrentSortType ?? SortType.AlphabeticOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ApplySortOrder(int result)
|
||||||
|
{
|
||||||
|
return GetSortType() == SortType.AlphabeticReverse ? -result : result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,333 +0,0 @@
|
|||||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using FlaxEditor.GUI;
|
|
||||||
using FlaxEditor.GUI.Drag;
|
|
||||||
using FlaxEditor.GUI.Tree;
|
|
||||||
using FlaxEditor.Utilities;
|
|
||||||
using FlaxEngine;
|
|
||||||
using FlaxEngine.GUI;
|
|
||||||
|
|
||||||
namespace FlaxEditor.Content
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Content folder tree node.
|
|
||||||
/// </summary>
|
|
||||||
/// <seealso cref="TreeNode" />
|
|
||||||
public class ContentTreeNode : TreeNode
|
|
||||||
{
|
|
||||||
private DragItems _dragOverItems;
|
|
||||||
private List<Rectangle> _highlights;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The folder.
|
|
||||||
/// </summary>
|
|
||||||
protected ContentFolder _folder;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Whether this node can be deleted.
|
|
||||||
/// </summary>
|
|
||||||
public virtual bool CanDelete => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Whether this node can be duplicated.
|
|
||||||
/// </summary>
|
|
||||||
public virtual bool CanDuplicate => true;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the content folder item.
|
|
||||||
/// </summary>
|
|
||||||
public ContentFolder Folder => _folder;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the type of the folder.
|
|
||||||
/// </summary>
|
|
||||||
public ContentFolderType FolderType => _folder.FolderType;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns true if that folder can import/manage scripts.
|
|
||||||
/// </summary>
|
|
||||||
public bool CanHaveScripts => _folder.CanHaveScripts;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns true if that folder can import/manage assets.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>True if can contain assets for project, otherwise false</returns>
|
|
||||||
public bool CanHaveAssets => _folder.CanHaveAssets;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the parent node.
|
|
||||||
/// </summary>
|
|
||||||
public ContentTreeNode ParentNode => Parent as ContentTreeNode;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the folder path.
|
|
||||||
/// </summary>
|
|
||||||
public string Path => _folder.Path;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the navigation button label.
|
|
||||||
/// </summary>
|
|
||||||
public virtual string NavButtonLabel => _folder.ShortName;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="ContentTreeNode"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent">The parent node.</param>
|
|
||||||
/// <param name="path">The folder path.</param>
|
|
||||||
public ContentTreeNode(ContentTreeNode parent, string path)
|
|
||||||
: this(parent, parent?.FolderType ?? ContentFolderType.Other, path)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="ContentTreeNode"/> class.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="parent">The parent node.</param>
|
|
||||||
/// <param name="type">The folder type.</param>
|
|
||||||
/// <param name="path">The folder path.</param>
|
|
||||||
protected ContentTreeNode(ContentTreeNode parent, ContentFolderType type, string path)
|
|
||||||
: base(false, Editor.Instance.Icons.FolderClosed32, Editor.Instance.Icons.FolderOpen32)
|
|
||||||
{
|
|
||||||
_folder = new ContentFolder(type, path, this);
|
|
||||||
Text = _folder.ShortName;
|
|
||||||
if (parent != null)
|
|
||||||
{
|
|
||||||
Folder.ParentFolder = parent.Folder;
|
|
||||||
Parent = parent;
|
|
||||||
}
|
|
||||||
IconColor = Style.Current.Foreground;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Shows the rename popup for the item.
|
|
||||||
/// </summary>
|
|
||||||
public void StartRenaming()
|
|
||||||
{
|
|
||||||
if (!_folder.CanRename)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Start renaming the folder
|
|
||||||
Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(false);
|
|
||||||
var dialog = RenamePopup.Show(this, TextRect, _folder.ShortName, false);
|
|
||||||
dialog.Tag = _folder;
|
|
||||||
dialog.Renamed += popup =>
|
|
||||||
{
|
|
||||||
Editor.Instance.Windows.ContentWin.Rename((ContentFolder)popup.Tag, popup.Text);
|
|
||||||
Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true);
|
|
||||||
};
|
|
||||||
dialog.Closed += popup => { Editor.Instance.Windows.ContentWin.ScrollingOnTreeView(true); };
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates the query search filter.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="filterText">The filter text.</param>
|
|
||||||
public void UpdateFilter(string filterText)
|
|
||||||
{
|
|
||||||
bool noFilter = string.IsNullOrWhiteSpace(filterText);
|
|
||||||
|
|
||||||
// Update itself
|
|
||||||
bool isThisVisible;
|
|
||||||
if (noFilter)
|
|
||||||
{
|
|
||||||
// Clear filter
|
|
||||||
_highlights?.Clear();
|
|
||||||
isThisVisible = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var text = Text;
|
|
||||||
if (QueryFilterHelper.Match(filterText, text, out QueryFilterHelper.Range[] ranges))
|
|
||||||
{
|
|
||||||
// Update highlights
|
|
||||||
if (_highlights == null)
|
|
||||||
_highlights = new List<Rectangle>(ranges.Length);
|
|
||||||
else
|
|
||||||
_highlights.Clear();
|
|
||||||
var style = Style.Current;
|
|
||||||
var font = style.FontSmall;
|
|
||||||
var textRect = TextRect;
|
|
||||||
for (int i = 0; i < ranges.Length; i++)
|
|
||||||
{
|
|
||||||
var start = font.GetCharPosition(text, ranges[i].StartIndex);
|
|
||||||
var end = font.GetCharPosition(text, ranges[i].EndIndex);
|
|
||||||
_highlights.Add(new Rectangle(start.X + textRect.X, textRect.Y, end.X - start.X, textRect.Height));
|
|
||||||
}
|
|
||||||
isThisVisible = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Hide
|
|
||||||
_highlights?.Clear();
|
|
||||||
isThisVisible = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update children
|
|
||||||
bool isAnyChildVisible = false;
|
|
||||||
for (int i = 0; i < _children.Count; i++)
|
|
||||||
{
|
|
||||||
if (_children[i] is ContentTreeNode child)
|
|
||||||
{
|
|
||||||
child.UpdateFilter(filterText);
|
|
||||||
isAnyChildVisible |= child.Visible;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isExpanded = isAnyChildVisible;
|
|
||||||
|
|
||||||
if (isExpanded)
|
|
||||||
{
|
|
||||||
Expand(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Collapse(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Visible = isThisVisible | isAnyChildVisible;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void Draw()
|
|
||||||
{
|
|
||||||
base.Draw();
|
|
||||||
|
|
||||||
// Draw all highlights
|
|
||||||
if (_highlights != null)
|
|
||||||
{
|
|
||||||
var style = Style.Current;
|
|
||||||
var color = style.ProgressNormal * 0.6f;
|
|
||||||
for (int i = 0; i < _highlights.Count; i++)
|
|
||||||
Render2D.FillRectangle(_highlights[i], color);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override void OnDestroy()
|
|
||||||
{
|
|
||||||
// Delete folder item
|
|
||||||
_folder.Dispose();
|
|
||||||
|
|
||||||
base.OnDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
private DragDropEffect GetDragEffect(DragData data)
|
|
||||||
{
|
|
||||||
if (data is DragDataFiles)
|
|
||||||
{
|
|
||||||
if (_folder.CanHaveAssets)
|
|
||||||
return DragDropEffect.Copy;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (_dragOverItems.HasValidDrag)
|
|
||||||
return DragDropEffect.Move;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DragDropEffect.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool ValidateDragItem(ContentItem item)
|
|
||||||
{
|
|
||||||
// Reject itself and any parent
|
|
||||||
return item != _folder && !item.Find(_folder);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override DragDropEffect OnDragEnterHeader(DragData data)
|
|
||||||
{
|
|
||||||
if (_dragOverItems == null)
|
|
||||||
_dragOverItems = new DragItems(ValidateDragItem);
|
|
||||||
|
|
||||||
_dragOverItems.OnDragEnter(data);
|
|
||||||
return GetDragEffect(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override DragDropEffect OnDragMoveHeader(DragData data)
|
|
||||||
{
|
|
||||||
return GetDragEffect(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void OnDragLeaveHeader()
|
|
||||||
{
|
|
||||||
_dragOverItems.OnDragLeave();
|
|
||||||
base.OnDragLeaveHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override DragDropEffect OnDragDropHeader(DragData data)
|
|
||||||
{
|
|
||||||
var result = DragDropEffect.None;
|
|
||||||
|
|
||||||
// Check if drop element or files
|
|
||||||
if (data is DragDataFiles files)
|
|
||||||
{
|
|
||||||
// Import files
|
|
||||||
Editor.Instance.ContentImporting.Import(files.Files, _folder);
|
|
||||||
result = DragDropEffect.Copy;
|
|
||||||
|
|
||||||
Expand();
|
|
||||||
}
|
|
||||||
else if (_dragOverItems.HasValidDrag)
|
|
||||||
{
|
|
||||||
// Move items
|
|
||||||
Editor.Instance.ContentDatabase.Move(_dragOverItems.Objects, _folder);
|
|
||||||
result = DragDropEffect.Move;
|
|
||||||
|
|
||||||
Expand();
|
|
||||||
}
|
|
||||||
|
|
||||||
_dragOverItems.OnDragDrop();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void DoDragDrop()
|
|
||||||
{
|
|
||||||
DoDragDrop(DragItems.GetDragData(_folder));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void OnLongPress()
|
|
||||||
{
|
|
||||||
Select();
|
|
||||||
|
|
||||||
StartRenaming();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override bool OnKeyDown(KeyboardKeys key)
|
|
||||||
{
|
|
||||||
if (IsFocused)
|
|
||||||
{
|
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case KeyboardKeys.F2:
|
|
||||||
StartRenaming();
|
|
||||||
return true;
|
|
||||||
case KeyboardKeys.Delete:
|
|
||||||
if (Folder.Exists && CanDelete)
|
|
||||||
Editor.Instance.Windows.ContentWin.Delete(Folder);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (RootWindow.GetKey(KeyboardKeys.Control))
|
|
||||||
{
|
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case KeyboardKeys.D:
|
|
||||||
if (Folder.Exists && CanDuplicate)
|
|
||||||
Editor.Instance.Windows.ContentWin.Duplicate(Folder);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.OnKeyDown(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,8 +7,8 @@ namespace FlaxEditor.Content
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Content tree node used for main directories.
|
/// Content tree node used for main directories.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="FlaxEditor.Content.ContentTreeNode" />
|
/// <seealso cref="ContentFolderTreeNode" />
|
||||||
public class MainContentTreeNode : ContentTreeNode
|
public class MainContentFolderTreeNode : ContentFolderTreeNode
|
||||||
{
|
{
|
||||||
private FileSystemWatcher _watcher;
|
private FileSystemWatcher _watcher;
|
||||||
|
|
||||||
@@ -19,12 +19,12 @@ namespace FlaxEditor.Content
|
|||||||
public override bool CanDuplicate => false;
|
public override bool CanDuplicate => false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="MainContentTreeNode"/> class.
|
/// Initializes a new instance of the <see cref="MainContentFolderTreeNode"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="parent">The parent project.</param>
|
/// <param name="parent">The parent project.</param>
|
||||||
/// <param name="type">The folder type.</param>
|
/// <param name="type">The folder type.</param>
|
||||||
/// <param name="path">The folder path.</param>
|
/// <param name="path">The folder path.</param>
|
||||||
public MainContentTreeNode(ProjectTreeNode parent, ContentFolderType type, string path)
|
public MainContentFolderTreeNode(ProjectFolderTreeNode parent, ContentFolderType type, string path)
|
||||||
: base(parent, type, path)
|
: base(parent, type, path)
|
||||||
{
|
{
|
||||||
_watcher = new FileSystemWatcher(path)
|
_watcher = new FileSystemWatcher(path)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using System;
|
||||||
using FlaxEngine.GUI;
|
using FlaxEngine.GUI;
|
||||||
|
|
||||||
namespace FlaxEditor.Content
|
namespace FlaxEditor.Content
|
||||||
@@ -7,8 +8,8 @@ namespace FlaxEditor.Content
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Root tree node for the project workspace.
|
/// Root tree node for the project workspace.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="FlaxEditor.Content.ContentTreeNode" />
|
/// <seealso cref="ContentFolderTreeNode" />
|
||||||
public sealed class ProjectTreeNode : ContentTreeNode
|
public sealed class ProjectFolderTreeNode : ContentFolderTreeNode
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The project/
|
/// The project/
|
||||||
@@ -18,18 +19,18 @@ namespace FlaxEditor.Content
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The project content directory.
|
/// The project content directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MainContentTreeNode Content;
|
public MainContentFolderTreeNode Content;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The project source code directory.
|
/// The project source code directory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MainContentTreeNode Source;
|
public MainContentFolderTreeNode Source;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ProjectTreeNode"/> class.
|
/// Initializes a new instance of the <see cref="ProjectFolderTreeNode"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="project">The project.</param>
|
/// <param name="project">The project.</param>
|
||||||
public ProjectTreeNode(ProjectInfo project)
|
public ProjectFolderTreeNode(ProjectInfo project)
|
||||||
: base(null, project.ProjectFolderPath)
|
: base(null, project.ProjectFolderPath)
|
||||||
{
|
{
|
||||||
Project = project;
|
Project = project;
|
||||||
@@ -48,9 +49,29 @@ namespace FlaxEditor.Content
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override int Compare(Control other)
|
public override int Compare(Control other)
|
||||||
{
|
{
|
||||||
// Move the main game project to the top
|
if (other is ProjectFolderTreeNode otherProject)
|
||||||
if (Project.Name == Editor.Instance.GameProject.Name)
|
{
|
||||||
return -1;
|
var gameProject = Editor.Instance.GameProject;
|
||||||
|
var engineProject = Editor.Instance.EngineProject;
|
||||||
|
bool isGame = Project == gameProject;
|
||||||
|
bool isEngine = Project == engineProject;
|
||||||
|
bool otherIsGame = otherProject.Project == gameProject;
|
||||||
|
bool otherIsEngine = otherProject.Project == engineProject;
|
||||||
|
|
||||||
|
// Main game project at the top
|
||||||
|
if (isGame && !otherIsGame)
|
||||||
|
return -1;
|
||||||
|
if (!isGame && otherIsGame)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Engine project at the bottom (when distinct)
|
||||||
|
if (isEngine && !otherIsEngine)
|
||||||
|
return 1;
|
||||||
|
if (!isEngine && otherIsEngine)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return string.CompareOrdinal(Project.Name, otherProject.Project.Name);
|
||||||
|
}
|
||||||
return base.Compare(other);
|
return base.Compare(other);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,13 @@ namespace FlaxEditor.Content
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Root tree node for the content workspace.
|
/// Root tree node for the content workspace.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="FlaxEditor.Content.ContentTreeNode" />
|
/// <seealso cref="ContentFolderTreeNode" />
|
||||||
public sealed class RootContentTreeNode : ContentTreeNode
|
public sealed class RootContentFolderTreeNode : ContentFolderTreeNode
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="RootContentTreeNode"/> class.
|
/// Initializes a new instance of the <see cref="RootContentFolderTreeNode"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public RootContentTreeNode()
|
public RootContentFolderTreeNode()
|
||||||
: base(null, string.Empty)
|
: base(null, string.Empty)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,6 +141,11 @@ API_ENUM() enum class BuildPlatform
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
API_ENUM(Attributes="EditorDisplay(null, \"Windows ARM64\")")
|
API_ENUM(Attributes="EditorDisplay(null, \"Windows ARM64\")")
|
||||||
WindowsARM64 = 15,
|
WindowsARM64 = 15,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Web
|
||||||
|
/// </summary>
|
||||||
|
Web = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -188,6 +193,11 @@ enum class DotNetAOTModes
|
|||||||
/// Use Mono AOT to cross-compile all used C# assemblies into native platform static libraries which can be linked into a single shared library.
|
/// Use Mono AOT to cross-compile all used C# assemblies into native platform static libraries which can be linked into a single shared library.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
MonoAOTStatic,
|
MonoAOTStatic,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Target platform doesn't support .NET or it has been disabled.
|
||||||
|
/// </summary>
|
||||||
|
NoDotnet,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform);
|
extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform);
|
||||||
|
|||||||
@@ -69,6 +69,10 @@
|
|||||||
#include "Platform/iOS/iOSPlatformTools.h"
|
#include "Platform/iOS/iOSPlatformTools.h"
|
||||||
#include "Engine/Platform/iOS/iOSPlatformSettings.h"
|
#include "Engine/Platform/iOS/iOSPlatformSettings.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if PLATFORM_TOOLS_WEB
|
||||||
|
#include "Platform/Web/WebPlatformTools.h"
|
||||||
|
#include "Engine/Platform/Web/WebPlatformSettings.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace GameCookerImpl
|
namespace GameCookerImpl
|
||||||
{
|
{
|
||||||
@@ -151,6 +155,8 @@ const Char* ToString(const BuildPlatform platform)
|
|||||||
return TEXT("iOS ARM64");
|
return TEXT("iOS ARM64");
|
||||||
case BuildPlatform::WindowsARM64:
|
case BuildPlatform::WindowsARM64:
|
||||||
return TEXT("Windows ARM64");
|
return TEXT("Windows ARM64");
|
||||||
|
case BuildPlatform::Web:
|
||||||
|
return TEXT("Web");
|
||||||
default:
|
default:
|
||||||
return TEXT("");
|
return TEXT("");
|
||||||
}
|
}
|
||||||
@@ -183,6 +189,8 @@ const Char* ToString(const DotNetAOTModes mode)
|
|||||||
return TEXT("MonoAOTDynamic");
|
return TEXT("MonoAOTDynamic");
|
||||||
case DotNetAOTModes::MonoAOTStatic:
|
case DotNetAOTModes::MonoAOTStatic:
|
||||||
return TEXT("MonoAOTStatic");
|
return TEXT("MonoAOTStatic");
|
||||||
|
case DotNetAOTModes::NoDotnet:
|
||||||
|
return TEXT("NoDotnet");
|
||||||
default:
|
default:
|
||||||
return TEXT("");
|
return TEXT("");
|
||||||
}
|
}
|
||||||
@@ -307,6 +315,10 @@ void CookingData::GetBuildPlatformName(const Char*& platform, const Char*& archi
|
|||||||
platform = TEXT("Windows");
|
platform = TEXT("Windows");
|
||||||
architecture = TEXT("ARM64");
|
architecture = TEXT("ARM64");
|
||||||
break;
|
break;
|
||||||
|
case BuildPlatform::Web:
|
||||||
|
platform = TEXT("Web");
|
||||||
|
architecture = TEXT("x86");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
LOG(Fatal, "Unknown or unsupported build platform.");
|
LOG(Fatal, "Unknown or unsupported build platform.");
|
||||||
}
|
}
|
||||||
@@ -461,6 +473,11 @@ PlatformTools* GameCooker::GetTools(BuildPlatform platform)
|
|||||||
case BuildPlatform::iOSARM64:
|
case BuildPlatform::iOSARM64:
|
||||||
result = New<iOSPlatformTools>();
|
result = New<iOSPlatformTools>();
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#if PLATFORM_TOOLS_WEB
|
||||||
|
case BuildPlatform::Web:
|
||||||
|
result = New<WebPlatformTools>();
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
Tools.Add(platform, result);
|
Tools.Add(platform, result);
|
||||||
@@ -518,7 +535,8 @@ bool GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration,
|
|||||||
{
|
{
|
||||||
Function<int32()> f;
|
Function<int32()> f;
|
||||||
f.Bind(ThreadFunction);
|
f.Bind(ThreadFunction);
|
||||||
const auto thread = ThreadSpawner::Start(f, GameCookerServiceInstance.Name, ThreadPriority::Highest);
|
uint32 stackSize = 4 * 1024 * 1024; // Larger stack
|
||||||
|
const auto thread = ThreadSpawner::Start(f, GameCookerServiceInstance.Name, ThreadPriority::Highest, stackSize);
|
||||||
if (thread == nullptr)
|
if (thread == nullptr)
|
||||||
{
|
{
|
||||||
GameCookerImpl::IsRunning = false;
|
GameCookerImpl::IsRunning = false;
|
||||||
@@ -604,6 +622,9 @@ void GameCooker::GetCurrentPlatform(PlatformType& platform, BuildPlatform& build
|
|||||||
case PlatformType::iOS:
|
case PlatformType::iOS:
|
||||||
buildPlatform = BuildPlatform::iOSARM64;
|
buildPlatform = BuildPlatform::iOSARM64;
|
||||||
break;
|
break;
|
||||||
|
case PlatformType::Web:
|
||||||
|
buildPlatform = BuildPlatform::Web;
|
||||||
|
break;
|
||||||
default: ;
|
default: ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ namespace FlaxEditor
|
|||||||
case BuildPlatform.MacOSARM64:
|
case BuildPlatform.MacOSARM64:
|
||||||
case BuildPlatform.MacOSx64: return PlatformType.Mac;
|
case BuildPlatform.MacOSx64: return PlatformType.Mac;
|
||||||
case BuildPlatform.iOSARM64: return PlatformType.iOS;
|
case BuildPlatform.iOSARM64: return PlatformType.iOS;
|
||||||
|
case BuildPlatform.Web: return PlatformType.Web;
|
||||||
default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null);
|
default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ Array<byte> AndroidPlatformTools::SaveCache(CookingData& data, IBuildCache* cach
|
|||||||
result.Add((const byte*)&platformCache, sizeof(platformCache));
|
result.Add((const byte*)&platformCache, sizeof(platformCache));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidPlatformTools::OnBuildStarted(CookingData& data)
|
void AndroidPlatformTools::OnBuildStarted(CookingData& data)
|
||||||
{
|
{
|
||||||
// Adjust the cooking output folder to be located inside the Gradle assets directory
|
// Adjust the cooking output folder to be located inside the Gradle assets directory
|
||||||
@@ -411,7 +412,6 @@ bool AndroidPlatformTools::OnPostProcess(CookingData& data)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
LOG(Info, "Output Android APK application package: {0} (size: {1} MB)", outputApk, FileSystem::GetFileSize(outputApk) / 1024 / 1024);
|
LOG(Info, "Output Android APK application package: {0} (size: {1} MB)", outputApk, FileSystem::GetFileSize(outputApk) / 1024 / 1024);
|
||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,26 +15,32 @@
|
|||||||
#include "Editor/ProjectInfo.h"
|
#include "Editor/ProjectInfo.h"
|
||||||
#include "Editor/Utilities/EditorUtilities.h"
|
#include "Editor/Utilities/EditorUtilities.h"
|
||||||
|
|
||||||
GDKPlatformTools::GDKPlatformTools()
|
String GetGDK()
|
||||||
{
|
{
|
||||||
// Find GDK
|
String gdk;
|
||||||
Platform::GetEnvironmentVariable(TEXT("GameDKLatest"), _gdkPath);
|
Platform::GetEnvironmentVariable(TEXT("GameDKLatest"), gdk);
|
||||||
if (_gdkPath.IsEmpty() || !FileSystem::DirectoryExists(_gdkPath))
|
if (gdk.IsEmpty() || !FileSystem::DirectoryExists(gdk))
|
||||||
{
|
{
|
||||||
_gdkPath.Clear();
|
gdk.Clear();
|
||||||
Platform::GetEnvironmentVariable(TEXT("GRDKLatest"), _gdkPath);
|
Platform::GetEnvironmentVariable(TEXT("GRDKLatest"), gdk);
|
||||||
if (_gdkPath.IsEmpty() || !FileSystem::DirectoryExists(_gdkPath))
|
if (gdk.IsEmpty() || !FileSystem::DirectoryExists(gdk))
|
||||||
{
|
{
|
||||||
_gdkPath.Clear();
|
gdk.Clear();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_gdkPath.EndsWith(TEXT("GRDK\\")))
|
if (gdk.EndsWith(TEXT("GRDK\\")))
|
||||||
_gdkPath.Remove(_gdkPath.Length() - 6);
|
gdk.Remove(gdk.Length() - 6);
|
||||||
else if (_gdkPath.EndsWith(TEXT("GRDK")))
|
else if (gdk.EndsWith(TEXT("GRDK")))
|
||||||
_gdkPath.Remove(_gdkPath.Length() - 5);
|
gdk.Remove(gdk.Length() - 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return gdk;
|
||||||
|
}
|
||||||
|
|
||||||
|
GDKPlatformTools::GDKPlatformTools()
|
||||||
|
{
|
||||||
|
_gdkPath = GetGDK();
|
||||||
}
|
}
|
||||||
|
|
||||||
DotNetAOTModes GDKPlatformTools::UseAOT() const
|
DotNetAOTModes GDKPlatformTools::UseAOT() const
|
||||||
@@ -121,7 +127,7 @@ bool GDKPlatformTools::OnPostProcess(CookingData& data, GDKPlatformSettings* pla
|
|||||||
validName.Add('\0');
|
validName.Add('\0');
|
||||||
|
|
||||||
sb.Append(TEXT("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
|
sb.Append(TEXT("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
|
||||||
sb.Append(TEXT("<Game configVersion=\"0\">\n"));
|
sb.Append(TEXT("<Game configVersion=\"1\">\n"));
|
||||||
sb.AppendFormat(TEXT(" <Identity Name=\"{0}\" Publisher=\"{1}\" Version=\"{2}\"/>\n"),
|
sb.AppendFormat(TEXT(" <Identity Name=\"{0}\" Publisher=\"{1}\" Version=\"{2}\"/>\n"),
|
||||||
validName.Get(),
|
validName.Get(),
|
||||||
platformSettings->PublisherName.HasChars() ? platformSettings->PublisherName : TEXT("CN=") + gameSettings->CompanyName,
|
platformSettings->PublisherName.HasChars() ? platformSettings->PublisherName : TEXT("CN=") + gameSettings->CompanyName,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user