Compare commits
1091 Commits
mac_change
...
master_fix
| Author | SHA1 | Date | |
|---|---|---|---|
| 824ff7050e | |||
| 042843fe42 | |||
| 8631b389c1 | |||
| e3f5af530b | |||
|
|
e257f9e4a0 | ||
|
|
056de752ed | ||
|
|
76700c0b24 | ||
|
|
9fdcff657d | ||
|
|
2b6339c05c | ||
|
|
bb91202439 | ||
|
|
f25e9f262a | ||
|
|
ee51077f49 | ||
|
|
950e958a58 | ||
|
|
5fdbed2b56 | ||
|
|
0e627577fc | ||
|
|
4846d4b024 | ||
|
|
5e5293bf7b | ||
|
|
d88477dcae | ||
|
|
bd58bd91b4 | ||
|
|
7ce0d88bdc | ||
|
|
98bb2d40d6 | ||
|
|
f4bc620bbd | ||
|
|
0313bf32c9 | ||
|
|
0c887cd29e | ||
|
|
5bd9bce634 | ||
|
|
2a53d0a462 | ||
| 82bd915274 | |||
|
|
71391cf1cc | ||
|
|
b5286af526 | ||
|
|
9f07a2a54e | ||
|
|
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 | ||
|
|
63def54dad | ||
|
|
00f9a28729 | ||
|
|
56beca0db4 | ||
|
|
64cd898a65 | ||
|
|
90472a4b31 | ||
|
|
a1999183f2 | ||
|
|
1e3ce48024 | ||
|
|
0007185b5f | ||
|
|
403d2cedc0 | ||
|
|
c8839b8587 | ||
|
|
cf048c9804 | ||
|
|
bea75f51bd | ||
|
|
1bf6612002 | ||
|
|
d9a18b1d31 | ||
|
|
465f30661f | ||
|
|
a62ca5452e | ||
|
|
92254eefcc | ||
|
|
2d56411e5f | ||
|
|
f8dc8ab903 | ||
|
|
2a55cda583 | ||
|
|
7c91c03adf | ||
|
|
caa902ea9b | ||
|
|
fb07071e24 | ||
|
|
a1cb7dcbe7 | ||
|
|
032f698c7b | ||
|
|
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 | ||
|
|
3888c4ba21 | ||
|
|
69173803bf | ||
|
|
13e31650be | ||
|
|
3563287f17 | ||
|
|
91ee9f5e05 | ||
| 49918a1067 | |||
|
|
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 | ||
|
|
93f12b73d8 | ||
|
|
1091bc6e2c | ||
|
|
594c0fb8e7 | ||
| 3fc1895b56 | |||
|
|
a70d7cf1f9 | ||
|
|
1f592ba1a1 | ||
|
|
a43daf025d | ||
|
|
296a2afa95 | ||
|
|
a7e879a3a4 | ||
|
|
27b160b464 | ||
|
|
7c3c4f1a63 | ||
|
|
fbae93b532 | ||
|
|
35d6e5fd21 | ||
|
|
114828adcb | ||
|
|
053e52c91f | ||
|
|
d24bd7dfd0 | ||
| 2c8c9b1637 | |||
|
|
05a8c841da | ||
|
|
c4fcaa999c | ||
|
|
70c9dd6608 | ||
|
|
802e2ac7c2 | ||
|
|
0ca60062d9 | ||
|
|
5a587a8582 | ||
|
|
22515c37b5 | ||
|
|
38a48cf1d4 | ||
|
|
cd66d00219 | ||
|
|
c944bd9bed | ||
|
|
a0689f3f00 | ||
|
|
2ee2c97f1e | ||
|
|
fd19e83a46 | ||
|
|
755702b65a | ||
|
|
72e200a7fc | ||
|
|
6353e5f4f2 | ||
|
|
b184022d15 | ||
|
|
26dce69404 | ||
| 2841ac22df | |||
|
|
516f22c3c0 | ||
|
|
5a8c4cd0a5 | ||
|
|
f53b7e3323 | ||
|
|
c1439c646e | ||
| 280035e54f | |||
| 0d140c4f39 | |||
| 32b4efc175 | |||
|
|
d1774cac28 | ||
|
|
2629511224 | ||
|
|
bcf7226946 | ||
|
|
f5c9e00beb | ||
|
|
6353514188 | ||
|
|
8467315a1e | ||
|
|
be5dbbb95f | ||
| 6b9c727a6a | |||
| 91c0ba1986 | |||
|
|
e4bb8001b2 | ||
|
|
a9fc5f720d | ||
|
|
d323b1c7e2 | ||
|
|
d93c32db9c | ||
|
|
08abdc159e | ||
|
|
708b9c6767 | ||
|
|
ed26a4c182 | ||
|
|
a239984908 | ||
|
|
fc3ea44c69 | ||
|
|
fdecad0d29 | ||
|
|
c7437ed533 | ||
|
|
dab44f5ceb | ||
|
|
c635d93b3c | ||
|
|
7377bad721 | ||
|
|
09fa3ce4be | ||
|
|
bd0daf7580 | ||
|
|
e1b3429b4c | ||
|
|
efa963be68 | ||
|
|
e19be4c0c6 | ||
|
|
2d5fdfef2f | ||
|
|
46ee6bc193 | ||
|
|
a2ee2ec6ac | ||
|
|
2caaef02ad | ||
|
|
df28b0d977 | ||
|
|
b62f331b08 | ||
|
|
f7b306532b | ||
|
|
212abe7d90 | ||
|
|
7dfc37f652 | ||
|
|
12decc3320 | ||
|
|
d7a528cdbc | ||
|
|
18364d2a8b | ||
|
|
5a9eedfadb | ||
|
|
be7871c292 | ||
|
|
59fb83a469 | ||
|
|
7544500be1 | ||
|
|
abdeaa9354 | ||
|
|
d3389604b0 | ||
|
|
d426c5b0d9 | ||
|
|
8da0d2c4ce | ||
|
|
20f576783b | ||
|
|
2bf62cc54f | ||
|
|
ef2c551cee | ||
|
|
65cf59642c | ||
|
|
e2fc8a6283 | ||
|
|
73976f3ed9 | ||
|
|
7ab6bafe39 | ||
|
|
deb2ad7c8f | ||
|
|
cd7fc3242e | ||
|
|
31a0a77e7c | ||
|
|
f0ec4a901a | ||
|
|
8cb67f017a | ||
|
|
7b643e9685 | ||
|
|
39803ce6b2 | ||
|
|
2f1f380062 | ||
|
|
f8dbf363b6 | ||
|
|
fc1451254d | ||
|
|
d3c54e590a | ||
|
|
361fc3ecfb | ||
|
|
3682159da6 | ||
|
|
e9f83f77bb | ||
|
|
823ed247d2 | ||
|
|
8f3b80492e | ||
|
|
c61c013517 | ||
|
|
a2170ffd8a | ||
|
|
4f1f77fb32 | ||
|
|
6ae370f8fc | ||
|
|
da5c8555e5 | ||
|
|
c4c7ee941f | ||
|
|
4f45b3c1d0 | ||
|
|
4c640b915f | ||
|
|
1f3f1ea67e | ||
|
|
60c19303f6 | ||
|
|
adcfc50218 | ||
|
|
9b812ec34a | ||
|
|
7e1ac5e167 | ||
|
|
028b5fedec | ||
|
|
9cc2c1da40 | ||
|
|
93219793d5 | ||
|
|
32f2ef3f06 | ||
|
|
5ed8564293 | ||
|
|
7c87ade12b | ||
|
|
7f87678282 | ||
|
|
e429d29d17 | ||
|
|
086a49f45d | ||
|
|
c46e1164d6 | ||
|
|
2a5898c1de | ||
|
|
f09d6aa0eb | ||
|
|
0848f1fa83 | ||
|
|
537d8b57ca | ||
|
|
02c5ad3fa4 | ||
|
|
41e851298d | ||
|
|
4a3fb41035 | ||
|
|
d57eec3403 | ||
|
|
87e2c4c4d5 | ||
|
|
797cb3c3f2 | ||
|
|
47670251ef | ||
|
|
cf1ef91246 | ||
|
|
7060cb5696 | ||
|
|
c449833d35 | ||
|
|
284aeca51a | ||
|
|
d8f7199c11 | ||
|
|
dc05bbbbcd | ||
|
|
3fcc9ed01f | ||
|
|
70ba750a5e | ||
|
|
50271199ac | ||
|
|
d1a99c9396 | ||
|
|
4ae3d57adc | ||
|
|
99b9967806 | ||
|
|
2f7e84253a | ||
|
|
2f55cb938f | ||
|
|
a86661a855 | ||
|
|
a68ce6633a | ||
|
|
5d57afe3aa | ||
|
|
6705138247 | ||
|
|
276caf771c | ||
|
|
5eea5a72c9 | ||
|
|
e9a7b1c8eb | ||
|
|
a151c78412 | ||
|
|
5f1e905e8f | ||
|
|
a0f764a774 | ||
|
|
7da5ce3ed4 | ||
|
|
1186833b2d | ||
|
|
bb180b0f59 | ||
|
|
5d1c79929a | ||
|
|
3f5a4cc4c9 | ||
|
|
62fd8ac967 | ||
|
|
d904b92f2e | ||
|
|
87e2b76ffa | ||
|
|
c5e11aed15 | ||
|
|
85d61b334b | ||
|
|
26e94f6f8e | ||
|
|
902744a0ce | ||
|
|
1c581bceaf | ||
|
|
9cc44825c6 | ||
|
|
92f4327fc2 | ||
|
|
47711ec5be | ||
|
|
d1fbc66cb9 | ||
|
|
7183a3306e | ||
|
|
fd191f7ffb | ||
|
|
2604d58687 | ||
|
|
01d1d634c2 | ||
|
|
c7e403661d | ||
|
|
1196db6d17 | ||
|
|
553a007508 | ||
|
|
de2ee36529 | ||
|
|
eea44ac897 | ||
|
|
c124713e99 | ||
|
|
364a523375 | ||
|
|
afdd264e63 | ||
|
|
8ec54f7b1c | ||
|
|
521518bde4 | ||
|
|
56077a268a | ||
|
|
a0ca000793 | ||
|
|
ae4ae7a638 | ||
|
|
e2a4c8ab03 | ||
|
|
7a40722964 | ||
|
|
1de8909d05 | ||
|
|
9749487e24 | ||
|
|
55968a8ddc | ||
|
|
e325b190ea | ||
|
|
ada6b9140f | ||
|
|
5582579173 | ||
|
|
88773e71e5 | ||
|
|
9e1f488f22 | ||
|
|
a471861e92 | ||
|
|
3d182c89f3 | ||
|
|
e3810a9938 | ||
|
|
f323fdb592 | ||
| f0dea9d528 | |||
|
|
b537a80031 | ||
|
|
5e52bf6469 | ||
|
|
8482f93a0f | ||
|
|
64c62f269c | ||
|
|
19d0d3b683 | ||
|
|
1f56c75821 | ||
|
|
64e127a47a | ||
|
|
8921cf5156 | ||
|
|
24e088fc08 | ||
|
|
14a69a11df | ||
|
|
42b542d190 | ||
|
|
576b0710e0 | ||
|
|
44e70692a2 | ||
|
|
857b0c5ac3 | ||
|
|
1f6d837117 | ||
|
|
67220d3f80 | ||
|
|
c5d06b2c8b | ||
|
|
3b19e1b40c | ||
|
|
831fb0f442 | ||
|
|
cd22cd059d | ||
|
|
3e363c8275 | ||
|
|
c44d939c08 | ||
|
|
c0c9df49dc | ||
|
|
80de56f469 | ||
|
|
f1ecbf828e | ||
|
|
f1c4fd464a | ||
|
|
212b0de29b | ||
|
|
5a2555f845 | ||
|
|
c57e128ff1 | ||
|
|
eff5f84185 | ||
|
|
ad1163bccc | ||
|
|
1042ad4e7d | ||
|
|
8fdda1a71a | ||
|
|
3f7fe635d8 | ||
|
|
fcebc57ed0 | ||
|
|
c40e447bb7 | ||
|
|
e6f94bb154 | ||
|
|
adbc546978 | ||
|
|
2d171967e9 | ||
|
|
33a0e6ac7d | ||
|
|
848cc38bf1 | ||
|
|
91cd1e8065 | ||
|
|
9fafb47abb | ||
|
|
5222f1d35c | ||
|
|
785649f9d5 | ||
|
|
d47ac95681 | ||
|
|
703e0cb7ca | ||
|
|
ef7c7f2d30 | ||
|
|
f3d375e356 | ||
|
|
a3073321cf | ||
|
|
824b49dd88 | ||
|
|
d0e7bff03a | ||
|
|
d314d5b324 | ||
|
|
a027ed3b63 | ||
|
|
bcedb05a2c | ||
|
|
b36be95947 | ||
|
|
826009c1b4 | ||
|
|
4ca399af71 | ||
|
|
c1f022520d | ||
|
|
2efd20f223 | ||
|
|
00dd432fbc | ||
|
|
f707508d70 | ||
|
|
b965ca6c8c | ||
|
|
26f4bcbc25 | ||
|
|
6fea9eefaa | ||
|
|
47caa6af28 | ||
|
|
9aedb37ac2 | ||
|
|
e4bc2c69c7 | ||
|
|
6db9265112 | ||
|
|
21a84c5b84 | ||
|
|
633b5857c9 | ||
|
|
9f9dac1543 | ||
|
|
df6f8fd8ae | ||
|
|
4bd8ce37ac | ||
|
|
40e204839f | ||
|
|
d6c75b3f86 | ||
|
|
687c283533 | ||
|
|
70ee8501a5 | ||
|
|
2c34bd2308 | ||
|
|
5023e3277b | ||
|
|
9003d855b3 | ||
|
|
75906719d4 | ||
|
|
9a59925a36 | ||
|
|
d5ca80c2c1 | ||
|
|
cb07ee77aa | ||
|
|
680783f2b0 | ||
|
|
4a28b4bd6c | ||
|
|
4bf36f3467 | ||
|
|
2c1713d300 | ||
|
|
8136691914 | ||
|
|
da23e287c0 | ||
|
|
e0825d870d | ||
|
|
86dbe6b93d | ||
|
|
e71b74c625 | ||
|
|
45f6ef29e9 | ||
|
|
0fabca19cd | ||
|
|
0bc242c738 | ||
|
|
8c548ceff2 | ||
|
|
46fda05000 | ||
|
|
1fee95be1c | ||
|
|
8c66ae99a3 | ||
|
|
1cf98e2188 | ||
|
|
6a8553a277 | ||
|
|
a02b7d4a1a | ||
|
|
606dfa4e2e | ||
|
|
b6f853a01c | ||
|
|
fc2112ec93 | ||
|
|
6ccfbfeff1 | ||
|
|
f21accd466 | ||
|
|
38b4ace1a8 | ||
|
|
774b6bd72c | ||
|
|
9c4606fefc | ||
|
|
0e50e47cce | ||
|
|
285fa870d0 | ||
|
|
69ed0bf56f | ||
|
|
237b9bccd5 | ||
|
|
f5fd7319e1 | ||
|
|
e04c0c4ace | ||
|
|
f6d0b073da | ||
|
|
68a7cf4f18 | ||
|
|
a91360529f | ||
|
|
bf9ca14deb | ||
|
|
cb92a2b8cb | ||
|
|
8a73d79936 | ||
|
|
2f7d7a0f2a | ||
|
|
d43c0c593f | ||
|
|
1087bd2445 | ||
|
|
5e19a9729b | ||
|
|
69e12d77be | ||
|
|
cdb09847ec | ||
|
|
169d3e964d | ||
|
|
cf503cf921 | ||
|
|
6fd4ef735e | ||
|
|
303087c4c4 | ||
|
|
278dead0bd | ||
|
|
cdff7708fb | ||
|
|
b4d501cd6a | ||
|
|
9cf9fae453 | ||
|
|
7fcf6f9c97 | ||
|
|
1bedfd3adf | ||
|
|
80d19a002f | ||
|
|
99707b6586 | ||
|
|
9f14bb7279 | ||
|
|
a18314c669 | ||
|
|
c946fa239e | ||
|
|
d109e5ca9f | ||
|
|
bc0e1f81e7 | ||
|
|
c1c806490f | ||
|
|
4fd6343fb9 | ||
|
|
a2e9d8d77b | ||
|
|
ff3d785483 | ||
|
|
82231981dc | ||
|
|
1915e1e7f4 | ||
|
|
b5a431d2f5 | ||
|
|
3907bc4957 | ||
|
|
854f3acd4c | ||
|
|
519a9c0a14 | ||
|
|
0ea555b041 | ||
|
|
90d1e63b58 | ||
|
|
0369d9b2cb | ||
|
|
9fabc1028a | ||
|
|
2a9260ddd5 | ||
|
|
3d84380175 | ||
|
|
545df6ce35 | ||
|
|
d4355e31d8 | ||
|
|
3ffb067e55 | ||
|
|
959371a995 | ||
|
|
cf9c203855 | ||
|
|
a5838f739d | ||
|
|
b1710c4d01 | ||
|
|
baf0cfce8e | ||
|
|
a1a6d4738f | ||
|
|
761ea094d6 | ||
|
|
8e043e533e | ||
|
|
1a88fefd76 | ||
|
|
abe496fe12 | ||
|
|
c9e0637b0f | ||
|
|
db660721ce | ||
|
|
2730d63257 | ||
|
|
31764d6d4e | ||
|
|
34ba45cd5a | ||
|
|
5de5d8f683 | ||
|
|
744c94b3cc | ||
|
|
e27880c1e6 | ||
|
|
b26d6ea108 | ||
|
|
5c5341e346 | ||
|
|
6f15ef7690 | ||
|
|
0e3a22faa0 | ||
|
|
0dc1e04c89 | ||
|
|
5c7712daad | ||
|
|
0f81c64964 | ||
|
|
7603109dce | ||
|
|
01617ae684 | ||
|
|
4aa2676084 | ||
|
|
a8b9211c32 | ||
|
|
9c5060584d | ||
|
|
846a0b5685 | ||
|
|
08154d8fe5 | ||
|
|
a53a438c3c | ||
|
|
bb8f569c41 | ||
|
|
6307ad7979 | ||
|
|
b6229350a3 | ||
|
|
5dc4ebade1 | ||
|
|
3cd5890db1 | ||
|
|
522d8d89e6 | ||
|
|
492a5f979d | ||
|
|
5e4d564338 | ||
|
|
8fcbef863e | ||
|
|
c68b75a298 | ||
|
|
8f63a99a2c | ||
|
|
6d05bf16b1 | ||
|
|
b8218e9ab4 | ||
|
|
99323c1d2f | ||
|
|
17c0892ff1 | ||
|
|
ad6764e6d7 | ||
|
|
0bfd38e065 | ||
|
|
a00ffe6ec3 | ||
|
|
a7ffd9e57f | ||
|
|
354eaac56c | ||
|
|
8c51ea511a | ||
|
|
2af266727f | ||
|
|
f37b75df7b | ||
|
|
6132e45e25 | ||
|
|
753035c452 | ||
|
|
acc1777638 | ||
|
|
69585618ed | ||
|
|
af0ea65d78 | ||
|
|
751d179cdb | ||
|
|
2dc44ac1a6 | ||
|
|
2550b9f88e | ||
|
|
c3cf8fba98 | ||
|
|
6f172f8f2c | ||
|
|
735d611de1 | ||
|
|
d6a33d5a1c | ||
|
|
6cbd40e6d8 | ||
|
|
8ac2385447 | ||
|
|
b8e00f2ed1 | ||
|
|
b6e18ccae5 | ||
|
|
1fb6586dff | ||
|
|
e6265105b5 | ||
|
|
892e2e0d1e | ||
|
|
90551b32bc | ||
|
|
cd08eeaf95 | ||
|
|
f8dadac453 | ||
|
|
f87e2c2229 | ||
|
|
18035a8604 | ||
|
|
fc46219a82 | ||
|
|
2546e19d65 | ||
|
|
6763436eff | ||
|
|
2754d61c05 | ||
|
|
7fd278a689 | ||
|
|
2d2c5411cd | ||
|
|
3e0c085bf3 | ||
|
|
c882b547c8 | ||
|
|
9646dd3fc2 | ||
|
|
c0cce748cc | ||
|
|
ab8612a914 | ||
|
|
20f1e67700 | ||
|
|
eda7f7e90f | ||
|
|
a22b33d3bb | ||
|
|
8ed2d6da56 | ||
|
|
bb37f980ed | ||
|
|
349547f66c | ||
|
|
a1e4ed05c4 | ||
|
|
10e9aee8ce | ||
|
|
4af26a5516 | ||
|
|
3e82e550f3 | ||
|
|
33b540ed9e | ||
|
|
50871d8885 | ||
|
|
c27a9808c4 | ||
|
|
bdaf31b54f | ||
|
|
3abbf08f1f | ||
|
|
a8eb4fc140 | ||
|
|
83374164db | ||
|
|
c5bfc6bc3d | ||
|
|
d698bf96cc | ||
|
|
b3f88e156c | ||
|
|
7418d60f24 | ||
|
|
3981d5090c | ||
|
|
48c6339ebb | ||
|
|
2dd34b288c | ||
|
|
0bc595f16f | ||
|
|
7abed93972 | ||
|
|
4b10d7057a | ||
|
|
85aed8c4d7 | ||
|
|
da08be42b4 | ||
| a93a940630 | |||
| 3e353db1fa | |||
|
|
056fea9a8c | ||
|
|
bf345f13ce | ||
|
|
a138c6b062 | ||
|
|
33e58c12cb | ||
|
|
094a6562b8 | ||
|
|
7f783bb7da | ||
|
|
b08f218f30 | ||
|
|
c6640be04a | ||
|
|
eff3c50d9c | ||
|
|
3fa099ad06 | ||
|
|
5e47a861f3 | ||
|
|
37b4b25ead | ||
|
|
edfd145226 | ||
|
|
763ede4bd9 | ||
|
|
284da341e1 | ||
|
|
53ed2431b5 | ||
|
|
b4ab39b3bf | ||
|
|
de61e3efb5 | ||
|
|
29fb36fcd6 | ||
|
|
78f0ff75f2 | ||
|
|
6efd456eaf | ||
|
|
e0c96c0cde | ||
|
|
ada269568a | ||
|
|
dd256ad518 | ||
|
|
12c8bb4f31 | ||
|
|
4e4d380267 | ||
|
|
448eb48c23 | ||
|
|
78d519cb9a | ||
|
|
43d11264f8 | ||
|
|
f126a83b79 | ||
|
|
bdd7bae459 | ||
|
|
75647d149a | ||
|
|
52b64540ab | ||
|
|
d7ab497b0e | ||
|
|
683a48a6e3 | ||
|
|
a41fc51f92 | ||
|
|
b9cfd054c1 | ||
|
|
53d4ea51af | ||
|
|
3dc7546dd4 | ||
|
|
185151b025 | ||
|
|
8cdec15fa6 | ||
|
|
1b40775d62 | ||
|
|
45e82d21f4 | ||
|
|
5c37584eca | ||
|
|
674fda7375 | ||
|
|
bf10d0949e | ||
|
|
d1c43ec1fe | ||
|
|
dbd8297612 | ||
|
|
8d62a13cbc | ||
|
|
5a05038a9b | ||
|
|
109d4423bb | ||
|
|
6c1e380a3e | ||
|
|
c57a1a7205 | ||
|
|
867ae2ceaa | ||
|
|
ef5d45874a | ||
|
|
169db79b2a | ||
|
|
9e4c1da032 | ||
|
|
c8622d1801 | ||
|
|
d7df403e5e | ||
|
|
d3a50cdacb | ||
|
|
fdd22c3380 | ||
|
|
53761df85e | ||
|
|
ecaae2b458 | ||
|
|
3cb74d48ca | ||
|
|
8633ed2124 | ||
|
|
2e10d776e9 | ||
|
|
4ac870f701 | ||
|
|
6144f6c74e | ||
|
|
edb6884942 | ||
|
|
62e329ac6e | ||
|
|
68dce7e4dd | ||
|
|
6479a3d3c6 | ||
|
|
e41c48f9e5 | ||
|
|
9cfcbfa9d2 | ||
|
|
bcd2b1f0f2 | ||
|
|
eb6010cba7 | ||
|
|
bd2add7edd | ||
|
|
986693757c | ||
|
|
5a23060e05 | ||
|
|
b92c18cf25 | ||
|
|
6a82eb114d | ||
|
|
97b37b3ce4 | ||
|
|
bbe54969b0 | ||
|
|
8164ce924f | ||
|
|
22911bbc45 | ||
|
|
cae2720585 | ||
|
|
90b6293bc2 | ||
|
|
d110237423 | ||
|
|
117f890612 | ||
|
|
a6a2fd2c66 | ||
|
|
a05ca12770 | ||
|
|
abe7785e94 | ||
|
|
2cedac8d96 | ||
|
|
ea854a0f7b | ||
|
|
d0817809ff | ||
|
|
95f2216f97 | ||
|
|
7e5edf1b33 | ||
|
|
c649a4f4b2 | ||
|
|
cd7233d559 | ||
|
|
3c74b315a8 | ||
|
|
f841575378 | ||
|
|
d90377ed62 | ||
|
|
c8d622bda9 | ||
|
|
fbf2d8f567 | ||
|
|
42687a792c | ||
|
|
5c43d35146 | ||
|
|
c1e1dee975 | ||
|
|
742d74a2d0 | ||
|
|
614ffa70a0 | ||
|
|
4b4331fd70 | ||
|
|
e221f7204b | ||
|
|
18fa8e1c47 | ||
|
|
2f02ec52ed | ||
|
|
9464f97e16 | ||
|
|
54467a4a5e | ||
|
|
3a9e175043 | ||
|
|
9dff048cb5 | ||
|
|
f376fd50a9 | ||
|
|
e27cf04f91 | ||
|
|
648504ceb1 | ||
|
|
a4d3ede368 | ||
|
|
92edb996f2 | ||
|
|
2e0c35e6e4 | ||
|
|
baba151d8a | ||
|
|
b44d4107c0 | ||
|
|
f40c67ddf0 | ||
|
|
ec154b4998 | ||
|
|
e2f741cab9 | ||
|
|
766091045b | ||
|
|
47e1547d29 | ||
|
|
e2d9452994 | ||
|
|
eadb4411ff | ||
|
|
bdc87c7bc6 | ||
|
|
7606c9ac12 | ||
|
|
4240646ec7 | ||
|
|
28eaac37dc | ||
|
|
214ec9f2b1 | ||
|
|
0fa53f860a | ||
|
|
27ac755bbe | ||
|
|
8ec138399a | ||
|
|
5b6859a66f | ||
|
|
bed1f6e9cc | ||
|
|
00055ef663 | ||
|
|
aa59a6faf7 | ||
|
|
e9835766bc | ||
|
|
d6eb647d59 | ||
|
|
6997cbeb47 | ||
|
|
b50f3fcb64 | ||
|
|
d6b4992991 | ||
|
|
fc561b5ec5 | ||
|
|
dacc0068e0 | ||
|
|
e7d2025010 | ||
|
|
b418ab5275 | ||
|
|
c1e782bb32 | ||
|
|
cfd2f42b0c | ||
|
|
e1a2a36978 | ||
|
|
793bc33b2f | ||
|
|
2109a2d261 | ||
|
|
89c7f4b0a3 | ||
|
|
d7ff9fdade | ||
|
|
9e50a39ebf | ||
|
|
7fc564a0ac | ||
|
|
8dfb564fb3 | ||
|
|
f8daff273a | ||
|
|
112e728465 | ||
|
|
057ec9d41e | ||
|
|
7fa4efcac5 | ||
|
|
6547e7ee9c | ||
|
|
907c593671 | ||
|
|
9c9d560ce5 | ||
|
|
f1945552ab | ||
|
|
65ab42158d | ||
|
|
99841e2e8d | ||
|
|
73c30d3d89 | ||
|
|
ecd5559aad | ||
|
|
1fa83639c2 | ||
|
|
568719b615 | ||
|
|
74000fa766 | ||
|
|
1d63067614 | ||
|
|
85fd1389db | ||
|
|
cce042045e | ||
|
|
53e3cee196 | ||
|
|
6ee3b23261 | ||
|
|
1a77ba4552 | ||
|
|
bffb175a9b | ||
|
|
125a973ff2 | ||
|
|
462f75abd0 | ||
|
|
d95cd2f0be | ||
|
|
091f76bbf2 | ||
|
|
e8b60060ab | ||
|
|
cd637e8a7a | ||
|
|
9d8e75caa3 | ||
|
|
eee4e55cf0 | ||
|
|
0670c0bbd3 | ||
|
|
f462a2187f | ||
|
|
c2cbaeed30 | ||
|
|
e982a23ed3 | ||
|
|
f6feae5cf2 | ||
|
|
ba75fd5882 | ||
|
|
1eaf40f2f7 | ||
|
|
fe98a23cb4 | ||
|
|
77bf03128e | ||
|
|
8f49a492d8 | ||
|
|
dd4bb2f7f1 | ||
|
|
6b78b498f7 | ||
|
|
c4130aa20f | ||
|
|
496856d12e | ||
|
|
e97d683545 | ||
|
|
71991ff8c7 | ||
|
|
ae44d47043 | ||
|
|
8b88def9d0 | ||
|
|
fa97229830 | ||
|
|
1946caac6e | ||
|
|
6f5308126b | ||
|
|
6a0c734cec | ||
|
|
13b8863f0c | ||
|
|
f2aaad0048 | ||
|
|
55b441e9fa | ||
|
|
6fece4ca38 | ||
|
|
2fd9b4a62a | ||
|
|
077f7a3cd1 | ||
|
|
c9fe9213b3 | ||
|
|
608839b6a5 | ||
|
|
7da69f18d4 | ||
| 6c63c2f650 | |||
|
|
fd8a8b5a4d | ||
|
|
fa89e710d8 | ||
|
|
b51ba58063 | ||
|
|
057489e5b9 | ||
|
|
5bae695ae9 | ||
|
|
5b3ed1fbc3 | ||
|
|
f5092e5262 | ||
|
|
3bd6160c3b | ||
|
|
1d0a0a409d | ||
|
|
eb90ab84f2 | ||
|
|
6f37525674 | ||
|
|
eeb8a7ea41 | ||
|
|
df0b571c50 | ||
|
|
ec22427acd | ||
|
|
6c499e877f | ||
|
|
4d9407e4e9 | ||
|
|
28c70f5078 | ||
|
|
14806a1ac7 | ||
|
|
1ebb3e67d6 | ||
|
|
991cdbb9a0 | ||
|
|
278b177c46 | ||
|
|
0630b6257a | ||
|
|
f86d9c47b7 | ||
|
|
ae2088bb9d | ||
|
|
9340c42f2b | ||
|
|
8d7dfd5946 | ||
|
|
894cb273aa | ||
|
|
2996e0c53c | ||
|
|
79ce82d8a0 | ||
|
|
3c8e59c114 | ||
|
|
1493571810 | ||
|
|
a613d89f47 | ||
|
|
5471c59d5f | ||
|
|
ac42223f9e | ||
|
|
c21c9c13ad | ||
|
|
8251509607 | ||
|
|
3083e3f611 | ||
|
|
66add1f3bd | ||
|
|
b8a680df57 | ||
|
|
e969b7fffb | ||
|
|
5d9657781a | ||
|
|
2cd03787cd | ||
|
|
619c5ac3b0 | ||
|
|
89baa91552 | ||
|
|
83b3b1af76 | ||
|
|
19148f21ac | ||
|
|
2da8e392db | ||
|
|
a812b8b108 | ||
|
|
3dc96352e6 | ||
|
|
c2b590d2cf | ||
|
|
842d6969fe | ||
|
|
0f3044ae72 | ||
|
|
11dec8e868 | ||
|
|
d6b1f06721 | ||
|
|
14fcc593c7 | ||
|
|
08ed5ae483 | ||
|
|
b065e6c989 | ||
|
|
372a23cf3a | ||
|
|
4721e8109f | ||
|
|
b58aaccc53 | ||
|
|
294dd3d363 | ||
|
|
e00f552baf | ||
|
|
8eff098850 | ||
|
|
4fe9fdded6 | ||
|
|
03d52d4eb9 | ||
|
|
ab61ed5a37 | ||
|
|
72ee80242d | ||
|
|
9dc4dbc6d7 | ||
|
|
a74c5e7943 | ||
|
|
8f9fa6995e | ||
|
|
98e59450f1 | ||
|
|
8c62f1120f | ||
|
|
9aaba955d0 | ||
|
|
410ec0465c | ||
|
|
ae9ded504d | ||
|
|
f9cb4ddae2 | ||
|
|
9753e579c1 | ||
|
|
954cf3eb5b | ||
|
|
2e996c8e91 | ||
|
|
545a43de32 | ||
|
|
e606c35093 | ||
|
|
21ae2d5d40 | ||
|
|
4649298605 | ||
|
|
ae9622d271 | ||
|
|
4366976015 | ||
|
|
5b2a966ac6 | ||
|
|
bb855e2663 | ||
|
|
d24f9d1e1e | ||
|
|
c1b1f4afc4 | ||
|
|
c639a3103c | ||
|
|
32bc73610f | ||
|
|
66dcfafa2e | ||
|
|
9215f2662f | ||
|
|
2dc404cbd3 | ||
|
|
59308df250 | ||
|
|
9ba1c4c338 | ||
|
|
ec2957bf38 | ||
|
|
8bb5655b2f | ||
|
|
c24ecaaab1 | ||
|
|
483a33996f | ||
|
|
245d7de818 | ||
|
|
49e0cc937e | ||
|
|
6be8158209 | ||
|
|
8e7fcd3cad | ||
|
|
a792a8a533 | ||
|
|
25d8c4645e | ||
|
|
64c552d69d | ||
|
|
fafa400db0 | ||
|
|
0b20a5342e | ||
|
|
f71bdd0962 | ||
|
|
fa4e56a32a | ||
|
|
212bd7a011 | ||
|
|
943864004f | ||
|
|
8ce4d94a96 | ||
|
|
6be193bfbf | ||
|
|
5d3947f117 | ||
|
|
c7bb7be20f | ||
|
|
f74b96bcb6 | ||
|
|
cecfea1ecf | ||
|
|
09ce2b5a6d | ||
|
|
2f9cdadb11 | ||
|
|
e218ce2d85 | ||
|
|
5ec6993342 | ||
|
|
87787cb5bf | ||
|
|
5b618b4f31 | ||
|
|
08a86066d0 | ||
|
|
388eb654a5 | ||
|
|
d8059c3db3 | ||
| 559d17e6c3 | |||
|
|
dfe177447c | ||
|
|
2a5aed6c15 | ||
|
|
f5ad8566eb | ||
| 7c5628d47e | |||
| 9645008460 | |||
| 12dbf09164 | |||
| f09fd7ad34 | |||
| 8986290b12 | |||
| 9a4d3a56a3 | |||
|
|
b0048d6540 | ||
|
|
b1b36ea1a3 | ||
|
|
e568e6e17b | ||
|
|
af955ba418 | ||
|
|
a56e2e7b1e | ||
|
|
a0cdb08893 | ||
|
|
fbb829a915 | ||
|
|
5790da6167 | ||
|
|
c6e4fbd966 | ||
|
|
101ea44051 | ||
|
|
d6c6936f6d | ||
|
|
4929e8172c | ||
|
|
8c83156133 | ||
|
|
d587921a83 | ||
|
|
47a6da9e40 | ||
|
|
6fe6ba20fb | ||
|
|
2ea3cde203 | ||
|
|
059fe98c67 | ||
|
|
1ab05b620a | ||
|
|
4b387d040d | ||
|
|
9d527ab4a6 | ||
|
|
bbc221086a | ||
|
|
e5b7e58a07 | ||
|
|
1704cfba4d | ||
|
|
40dae18b76 | ||
|
|
cfef93134e | ||
|
|
4e44831bbe | ||
|
|
0c1e0e48d4 | ||
|
|
6884df02fd | ||
|
|
63655d18c5 | ||
|
|
4170699348 | ||
|
|
d58a9beb3d | ||
|
|
5049f3b2d8 | ||
|
|
6e44eebb9e | ||
|
|
aecbab5613 | ||
|
|
6bf90f29c5 | ||
|
|
19edce1770 | ||
|
|
e17b96b2d6 | ||
|
|
9b6feb9367 | ||
| fc96b248cb | |||
| 36c1909111 | |||
| 643fe639e5 | |||
| 78dffc9ad1 | |||
|
|
1dfd717093 | ||
|
|
68ef6f08c6 | ||
|
|
a0b80c6096 | ||
|
|
59ac8a3f60 | ||
|
|
dd281bbca8 | ||
|
|
2e48be97b6 | ||
|
|
0b7550e5ca | ||
|
|
391c67b1a9 | ||
|
|
975cc79085 | ||
|
|
468babae87 | ||
|
|
051d363358 | ||
|
|
9b495bbc68 | ||
|
|
516d4263c9 | ||
|
|
ba35123420 | ||
|
|
409703d675 | ||
|
|
570c3f7462 | ||
|
|
42d02a9e63 | ||
|
|
819c93f6fb | ||
|
|
0c645cbc78 | ||
|
|
e665cc7500 | ||
|
|
0a516ac98d |
42
.github/ISSUE_TEMPLATE/1-bug.yaml
vendored
Normal file
42
.github/ISSUE_TEMPLATE/1-bug.yaml
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: File a bug report.
|
||||||
|
title: "[Bug]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this bug report! Please attach any minimal reproduction projects!
|
||||||
|
- type: textarea
|
||||||
|
id: description-area
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: Please provide a description of the bug and what you expected to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: steps-area
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: Please provide reproduction steps if possible.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version
|
||||||
|
description: What version of Flax are you running?
|
||||||
|
options:
|
||||||
|
- '1.8'
|
||||||
|
- '1.9'
|
||||||
|
- '1.10'
|
||||||
|
- '1.11'
|
||||||
|
- master branch
|
||||||
|
default: 3
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant logs
|
||||||
|
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||||
|
render: shell
|
||||||
22
.github/ISSUE_TEMPLATE/2-feature-request.yaml
vendored
Normal file
22
.github/ISSUE_TEMPLATE/2-feature-request.yaml
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: File a feature request.
|
||||||
|
title: "[Request]: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out a feature request!
|
||||||
|
- type: textarea
|
||||||
|
id: description-area
|
||||||
|
attributes:
|
||||||
|
label: Description
|
||||||
|
description: Please provide a description of the feature!
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: benefits-area
|
||||||
|
attributes:
|
||||||
|
label: Benefits
|
||||||
|
description: Please provide what benefits this feature would provide to the engine!
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
4
.github/workflows/build_ios.yml
vendored
4
.github/workflows/build_ios.yml
vendored
@@ -19,7 +19,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: 9.0.x
|
||||||
- name: Setup .NET Workload
|
- name: Setup .NET Workload
|
||||||
run: |
|
run: |
|
||||||
dotnet workload install ios
|
dotnet workload install ios
|
||||||
@@ -33,4 +33,4 @@ jobs:
|
|||||||
git lfs pull
|
git lfs pull
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
./Development/Scripts/Mac/CallBuildTool.sh -build -log -dotnet=8 -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame
|
./Development/Scripts/Mac/CallBuildTool.sh -build -log -dotnet=9 -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame
|
||||||
|
|||||||
BIN
Content/Editor/Camera/M_Camera.flax
(Stored with Git LFS)
BIN
Content/Editor/Camera/M_Camera.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/CubeTexturePreviewMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/CubeTexturePreviewMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/DDGIDebugProbes.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/DDGIDebugProbes.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/SingleColor/Decal.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/SingleColor/Decal.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/SingleColor/Particle.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/SingleColor/Particle.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/SingleColor/Surface.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/SingleColor/Surface.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/SingleColor/SurfaceAdditive.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/SingleColor/SurfaceAdditive.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DebugMaterials/SingleColor/Terrain.flax
(Stored with Git LFS)
BIN
Content/Editor/DebugMaterials/SingleColor/Terrain.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/DefaultFontMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/DefaultFontMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/FoliageBrushMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/FoliageBrushMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/MaterialAxisLocked.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/MaterialAxisLocked.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/MaterialWire.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/MaterialWire.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/SelectionOutlineMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/SelectionOutlineMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Gizmo/VertexColorsPreviewMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/Gizmo/VertexColorsPreviewMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Highlight Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Highlight Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Icons/IconsMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/Icons/IconsMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/IconsAtlas.flax
(Stored with Git LFS)
BIN
Content/Editor/IconsAtlas.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/IesProfilePreviewMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/IesProfilePreviewMaterial.flax
(Stored with Git LFS)
Binary file not shown.
@@ -6,6 +6,7 @@
|
|||||||
@3
|
@3
|
||||||
|
|
||||||
#include "./Flax/Common.hlsl"
|
#include "./Flax/Common.hlsl"
|
||||||
|
#include "./Flax/Stencil.hlsl"
|
||||||
#include "./Flax/MaterialCommon.hlsl"
|
#include "./Flax/MaterialCommon.hlsl"
|
||||||
#include "./Flax/GBufferCommon.hlsl"
|
#include "./Flax/GBufferCommon.hlsl"
|
||||||
@7
|
@7
|
||||||
@@ -13,11 +14,14 @@
|
|||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
float4x4 WorldMatrix;
|
float4x4 WorldMatrix;
|
||||||
float4x4 InvWorld;
|
float4x4 InvWorld;
|
||||||
float4x4 SVPositionToWorld;
|
float4x4 SvPositionToWorld;
|
||||||
|
float3 Padding0;
|
||||||
|
uint RenderLayersMask;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Use depth buffer for per-pixel decal layering
|
// Use depth buffer for per-pixel decal layering
|
||||||
Texture2D DepthBuffer : register(t0);
|
Texture2D DepthBuffer : register(t0);
|
||||||
|
Texture2D<uint2> StencilBuffer : register(t1);
|
||||||
|
|
||||||
// Material shader resources
|
// Material shader resources
|
||||||
@2
|
@2
|
||||||
@@ -27,12 +31,63 @@ struct MaterialInput
|
|||||||
float3 WorldPosition;
|
float3 WorldPosition;
|
||||||
float TwoSidedSign;
|
float TwoSidedSign;
|
||||||
float2 TexCoord;
|
float2 TexCoord;
|
||||||
|
float4 TexCoord_DDX_DDY;
|
||||||
float3x3 TBN;
|
float3x3 TBN;
|
||||||
float4 SvPosition;
|
float4 SvPosition;
|
||||||
float3 PreSkinnedPosition;
|
float3 PreSkinnedPosition;
|
||||||
float3 PreSkinnedNormal;
|
float3 PreSkinnedNormal;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Calculates decal texcoords for a given pixel position (sampels depth buffer and projects value to decal space).
|
||||||
|
float2 SvPositionToDecalUV(float4 svPosition)
|
||||||
|
{
|
||||||
|
float2 screenUV = svPosition.xy * ScreenSize.zw;
|
||||||
|
svPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r;
|
||||||
|
float4 positionHS = mul(float4(svPosition.xyz, 1), SvPositionToWorld);
|
||||||
|
float3 positionWS = positionHS.xyz / positionHS.w;
|
||||||
|
float3 positionOS = mul(float4(positionWS, 1), InvWorld).xyz;
|
||||||
|
return positionOS.xz + 0.5f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manually compute ddx/ddy for decal texture cooordinates to avoid the 2x2 pixels artifacts on the edges of geometry under decal
|
||||||
|
// [Reference: https://www.humus.name/index.php?page=3D&ID=84]
|
||||||
|
float4 CalculateTextureDerivatives(float4 svPosition, float2 texCoord)
|
||||||
|
{
|
||||||
|
float4 svDiffX = float4(1, 0, 0, 0);
|
||||||
|
float2 uvDiffX0 = texCoord - SvPositionToDecalUV(svPosition - svDiffX);
|
||||||
|
float2 uvDiffX1 = SvPositionToDecalUV(svPosition + svDiffX) - texCoord;
|
||||||
|
float2 dx = dot(uvDiffX0, uvDiffX0) < dot(uvDiffX1, uvDiffX1) ? uvDiffX0 : uvDiffX1;
|
||||||
|
|
||||||
|
float4 svDiffY = float4(0, 1, 0, 0);
|
||||||
|
float2 uvDiffY0 = texCoord - SvPositionToDecalUV(svPosition - svDiffY);
|
||||||
|
float2 uvDiffY1 = SvPositionToDecalUV(svPosition + svDiffY) - texCoord;
|
||||||
|
float2 dy = dot(uvDiffY0, uvDiffY0) < dot(uvDiffY1, uvDiffY1) ? uvDiffY0 : uvDiffY1;
|
||||||
|
|
||||||
|
return float4(dx, dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Computes the mipmap level for a specific texture dimensions to be sampled at decal texture cooordinates.
|
||||||
|
// [Reference: https://hugi.scene.org/online/coding/hugi%2014%20-%20comipmap.htm]
|
||||||
|
float CalculateTextureMipmap(MaterialInput input, float2 textureSize)
|
||||||
|
{
|
||||||
|
float2 dx = input.TexCoord_DDX_DDY.xy * textureSize;
|
||||||
|
float2 dy = input.TexCoord_DDX_DDY.zw * textureSize;
|
||||||
|
float d = max(dot(dx, dx), dot(dy, dy));
|
||||||
|
return (0.5 * 0.5) * log2(d); // Hardcoded half-mip rate reduction to avoid artifacts when decal is moved over dither texture
|
||||||
|
}
|
||||||
|
float CalculateTextureMipmap(MaterialInput input, Texture2D t)
|
||||||
|
{
|
||||||
|
float2 textureSize;
|
||||||
|
t.GetDimensions(textureSize.x, textureSize.y);
|
||||||
|
return CalculateTextureMipmap(input, textureSize);
|
||||||
|
}
|
||||||
|
float CalculateTextureMipmap(MaterialInput input, TextureCube t)
|
||||||
|
{
|
||||||
|
float2 textureSize;
|
||||||
|
t.GetDimensions(textureSize.x, textureSize.y);
|
||||||
|
return CalculateTextureMipmap(input, textureSize);
|
||||||
|
}
|
||||||
|
|
||||||
// Transforms a vector from tangent space to world space
|
// Transforms a vector from tangent space to world space
|
||||||
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
float3 TransformTangentVectorToWorld(MaterialInput input, float3 tangentVector)
|
||||||
{
|
{
|
||||||
@@ -116,7 +171,6 @@ Material GetMaterialPS(MaterialInput input)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Input macro specified by the material: DECAL_BLEND_MODE
|
// Input macro specified by the material: DECAL_BLEND_MODE
|
||||||
|
|
||||||
#define DECAL_BLEND_MODE_TRANSLUCENT 0
|
#define DECAL_BLEND_MODE_TRANSLUCENT 0
|
||||||
#define DECAL_BLEND_MODE_STAIN 1
|
#define DECAL_BLEND_MODE_STAIN 1
|
||||||
#define DECAL_BLEND_MODE_NORMAL 2
|
#define DECAL_BLEND_MODE_NORMAL 2
|
||||||
@@ -150,10 +204,18 @@ void PS_Decal(
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
// Stencil masking
|
||||||
|
uint stencilObjectLayer = STENCIL_BUFFER_OBJECT_LAYER(STENCIL_BUFFER_LOAD(StencilBuffer, SvPosition.xy));
|
||||||
|
if ((RenderLayersMask & (1 << stencilObjectLayer)) == 0)
|
||||||
|
{
|
||||||
|
clip(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
float2 screenUV = SvPosition.xy * ScreenSize.zw;
|
float2 screenUV = SvPosition.xy * ScreenSize.zw;
|
||||||
SvPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r;
|
SvPosition.z = SAMPLE_RT(DepthBuffer, screenUV).r;
|
||||||
|
|
||||||
float4 positionHS = mul(float4(SvPosition.xyz, 1), SVPositionToWorld);
|
float4 positionHS = mul(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 = mul(float4(positionWS, 1), InvWorld).xyz;
|
||||||
|
|
||||||
@@ -166,8 +228,9 @@ void PS_Decal(
|
|||||||
materialInput.TexCoord = decalUVs;
|
materialInput.TexCoord = decalUVs;
|
||||||
materialInput.TwoSidedSign = 1;
|
materialInput.TwoSidedSign = 1;
|
||||||
materialInput.SvPosition = SvPosition;
|
materialInput.SvPosition = SvPosition;
|
||||||
|
materialInput.TexCoord_DDX_DDY = CalculateTextureDerivatives(materialInput.SvPosition, materialInput.TexCoord);
|
||||||
// Build tangent to world transformation matrix
|
|
||||||
|
// Calculate tangent-space
|
||||||
float3 ddxWp = ddx(positionWS);
|
float3 ddxWp = ddx(positionWS);
|
||||||
float3 ddyWp = ddy(positionWS);
|
float3 ddyWp = ddy(positionWS);
|
||||||
materialInput.TBN[0] = normalize(ddyWp);
|
materialInput.TBN[0] = normalize(ddyWp);
|
||||||
|
|||||||
@@ -27,7 +27,15 @@ TextureCube EnvProbe : register(t__SRV__);
|
|||||||
TextureCube SkyLightTexture : register(t__SRV__);
|
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__);
|
||||||
@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.
|
||||||
|
LightData GetDirectionalLight() { return DirectionalLight; }
|
||||||
|
LightData GetSkyLight() { return SkyLight; }
|
||||||
|
ProbeData GetEnvironmentProbe() { return EnvironmentProbe; }
|
||||||
|
ExponentialHeightFogData GetExponentialHeightFog() { return ExponentialHeightFog; }
|
||||||
|
uint GetLocalLightsCount() { return LocalLightsCount; }
|
||||||
|
LightData GetLocalLight(uint i) { return LocalLights[i]; }
|
||||||
@5// Forward Shading: Shaders
|
@5// Forward Shading: Shaders
|
||||||
|
|
||||||
// Pixel Shader function for Forward Pass
|
// Pixel Shader function for Forward Pass
|
||||||
@@ -76,9 +84,8 @@ void PS_Forward(
|
|||||||
gBuffer.ShadingModel = MATERIAL_SHADING_MODEL;
|
gBuffer.ShadingModel = MATERIAL_SHADING_MODEL;
|
||||||
|
|
||||||
// Calculate lighting from a single directional light
|
// Calculate lighting from a single directional light
|
||||||
float4 shadowMask = 1.0f;
|
|
||||||
ShadowSample shadow = SampleDirectionalLightShadow(DirectionalLight, ShadowsBuffer, ShadowMap, gBuffer);
|
ShadowSample shadow = SampleDirectionalLightShadow(DirectionalLight, ShadowsBuffer, ShadowMap, gBuffer);
|
||||||
shadowMask = GetShadowMask(shadow);
|
float4 shadowMask = GetShadowMask(shadow);
|
||||||
float4 light = GetLighting(ViewPos, DirectionalLight, gBuffer, shadowMask, false, false);
|
float4 light = GetLighting(ViewPos, DirectionalLight, gBuffer, shadowMask, false, false);
|
||||||
|
|
||||||
// Calculate lighting from sky light
|
// Calculate lighting from sky light
|
||||||
@@ -143,9 +150,27 @@ void PS_Forward(
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USE_FOG
|
#if USE_FOG && MATERIAL_SHADING_MODEL != SHADING_MODEL_UNLIT
|
||||||
// Calculate exponential height fog
|
// Calculate exponential height fog
|
||||||
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, 0);
|
#if DIRECTX && FEATURE_LEVEL < FEATURE_LEVEL_SM6
|
||||||
|
// TODO: fix D3D11/D3D10 bug with incorrect distance
|
||||||
|
float fogSceneDistance = distance(materialInput.WorldPosition, ViewPos);
|
||||||
|
#else
|
||||||
|
float fogSceneDistance = gBuffer.ViewPos.z;
|
||||||
|
#endif
|
||||||
|
float4 fog = GetExponentialHeightFog(ExponentialHeightFog, materialInput.WorldPosition, ViewPos, 0, fogSceneDistance);
|
||||||
|
|
||||||
|
if (ExponentialHeightFog.VolumetricFogMaxDistance > 0)
|
||||||
|
{
|
||||||
|
// Sample volumetric fog and mix it in
|
||||||
|
float2 screenUV = materialInput.SvPosition.xy * ScreenSize.zw;
|
||||||
|
float3 viewVector = materialInput.WorldPosition - ViewPos;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
// Apply fog to the output color
|
// Apply fog to the output color
|
||||||
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
#if MATERIAL_BLEND == MATERIAL_BLEND_OPAQUE
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ float TimeParam;
|
|||||||
float4 ViewInfo;
|
float4 ViewInfo;
|
||||||
float4 ScreenSize;
|
float4 ScreenSize;
|
||||||
float4 ViewSize;
|
float4 ViewSize;
|
||||||
|
float3 ViewPadding0;
|
||||||
|
float ScaledTimeParam;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Shader resources
|
// Shader resources
|
||||||
|
|||||||
@@ -645,7 +645,7 @@ VertexOutput VS_Ribbon(RibbonInput input, uint vertexIndex : SV_VertexID)
|
|||||||
materialInput.TBN = output.TBN;
|
materialInput.TBN = output.TBN;
|
||||||
materialInput.TwoSidedSign = 1;
|
materialInput.TwoSidedSign = 1;
|
||||||
materialInput.SvPosition = output.Position;
|
materialInput.SvPosition = output.Position;
|
||||||
materialInput.PreSkinnedPosition = Position;
|
materialInput.PreSkinnedPosition = position;
|
||||||
materialInput.PreSkinnedNormal = tangentToLocal[2].xyz;
|
materialInput.PreSkinnedNormal = tangentToLocal[2].xyz;
|
||||||
materialInput.InstanceOrigin = output.InstanceOrigin;
|
materialInput.InstanceOrigin = output.InstanceOrigin;
|
||||||
materialInput.InstanceParams = output.InstanceParams;
|
materialInput.InstanceParams = output.InstanceParams;
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ float4 ViewInfo;
|
|||||||
float4 ScreenSize;
|
float4 ScreenSize;
|
||||||
float4 TemporalAAJitter;
|
float4 TemporalAAJitter;
|
||||||
float4x4 InverseViewProjectionMatrix;
|
float4x4 InverseViewProjectionMatrix;
|
||||||
|
float3 ViewPadding0;
|
||||||
|
float ScaledTimeParam;
|
||||||
@1META_CB_END
|
@1META_CB_END
|
||||||
|
|
||||||
// Shader resources
|
// Shader resources
|
||||||
|
|||||||
@@ -15,6 +15,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/TerrainCommon.hlsl"
|
||||||
@7
|
@7
|
||||||
// Primary constant buffer (with additional material parameters)
|
// Primary constant buffer (with additional material parameters)
|
||||||
META_CB_BEGIN(0, Data)
|
META_CB_BEGIN(0, Data)
|
||||||
@@ -334,7 +335,7 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
float lodValue = CurrentLOD;
|
float lodValue = CurrentLOD;
|
||||||
float morphAlpha = lodCalculated - CurrentLOD;
|
float morphAlpha = lodCalculated - CurrentLOD;
|
||||||
|
|
||||||
// Sample heightmap
|
// Sample heightmap and splatmaps
|
||||||
float2 heightmapUVs = input.TexCoord * HeightmapUVScaleBias.xy + HeightmapUVScaleBias.zw;
|
float2 heightmapUVs = input.TexCoord * HeightmapUVScaleBias.xy + HeightmapUVScaleBias.zw;
|
||||||
#if USE_SMOOTH_LOD_TRANSITION
|
#if USE_SMOOTH_LOD_TRANSITION
|
||||||
float4 heightmapValueThisLOD = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
float4 heightmapValueThisLOD = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
||||||
@@ -342,7 +343,6 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
float2 heightmapUVsNextLOD = nextLODPos * HeightmapUVScaleBias.xy + HeightmapUVScaleBias.zw;
|
float2 heightmapUVsNextLOD = nextLODPos * HeightmapUVScaleBias.xy + HeightmapUVScaleBias.zw;
|
||||||
float4 heightmapValueNextLOD = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVsNextLOD, lodValue + 1);
|
float4 heightmapValueNextLOD = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVsNextLOD, lodValue + 1);
|
||||||
float4 heightmapValue = lerp(heightmapValueThisLOD, heightmapValueNextLOD, morphAlpha);
|
float4 heightmapValue = lerp(heightmapValueThisLOD, heightmapValueNextLOD, morphAlpha);
|
||||||
bool isHole = max(heightmapValueThisLOD.b + heightmapValueThisLOD.a, heightmapValueNextLOD.b + heightmapValueNextLOD.a) >= 1.9f;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
#if USE_TERRAIN_LAYERS
|
||||||
float4 splatmapValueThisLOD = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
float4 splatmapValueThisLOD = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
||||||
float4 splatmapValueNextLOD = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVsNextLOD, lodValue + 1);
|
float4 splatmapValueNextLOD = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVsNextLOD, lodValue + 1);
|
||||||
@@ -355,7 +355,6 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
float4 heightmapValue = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
float4 heightmapValue = Heightmap.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
||||||
bool isHole = (heightmapValue.b + heightmapValue.a) >= 1.9f;
|
|
||||||
#if USE_TERRAIN_LAYERS
|
#if USE_TERRAIN_LAYERS
|
||||||
float4 splatmap0Value = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
float4 splatmap0Value = Splatmap0.SampleLevel(SamplerPointClamp, heightmapUVs, lodValue);
|
||||||
#if TERRAIN_LAYERS_DATA_SIZE > 1
|
#if TERRAIN_LAYERS_DATA_SIZE > 1
|
||||||
@@ -363,12 +362,11 @@ VertexOutput VS(TerrainVertexInput input)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
float height = (float)((int)(heightmapValue.x * 255.0) + ((int)(heightmapValue.y * 255) << 8)) / 65535.0;
|
float height = DecodeHeightmapHeight(heightmapValue);
|
||||||
|
|
||||||
// Extract normal and the holes mask
|
// Extract normal and the holes mask
|
||||||
float2 normalTemp = float2(heightmapValue.b, heightmapValue.a) * 2.0f - 1.0f;
|
bool isHole;
|
||||||
float3 normal = float3(normalTemp.x, sqrt(1.0 - saturate(dot(normalTemp, normalTemp))), normalTemp.y);
|
float3 normal = DecodeHeightmapNormal(heightmapValue, isHole);
|
||||||
normal = normalize(normal);
|
|
||||||
output.Geometry.HolesMask = isHole ? 0 : 1;
|
output.Geometry.HolesMask = isHole ? 0 : 1;
|
||||||
if (isHole)
|
if (isHole)
|
||||||
{
|
{
|
||||||
@@ -438,7 +436,6 @@ 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.Geometry.PrevWorldPosition += material.PositionOffset;
|
|
||||||
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
output.Position = mul(float4(output.Geometry.WorldPosition, 1), ViewProjectionMatrix);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
BIN
Content/Editor/Particles/Particle Material Color.flax
(Stored with Git LFS)
BIN
Content/Editor/Particles/Particle Material Color.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Particles/Smoke Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Particles/Smoke Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Primitives/Cube.flax
(Stored with Git LFS)
BIN
Content/Editor/Primitives/Cube.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/SpriteMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/SpriteMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Terrain/Circle Brush Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Terrain/Circle Brush Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Terrain/Highlight Terrain Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Terrain/Highlight Terrain Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/TexturePreviewMaterial.flax
(Stored with Git LFS)
BIN
Content/Editor/TexturePreviewMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Editor/Wires Debug Material.flax
(Stored with Git LFS)
BIN
Content/Editor/Wires Debug Material.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/DefaultDeformableMaterial.flax
(Stored with Git LFS)
BIN
Content/Engine/DefaultDeformableMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/DefaultMaterial.flax
(Stored with Git LFS)
BIN
Content/Engine/DefaultMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/DefaultRadialMenu.flax
(Stored with Git LFS)
BIN
Content/Engine/DefaultRadialMenu.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/DefaultTerrainMaterial.flax
(Stored with Git LFS)
BIN
Content/Engine/DefaultTerrainMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/SingleColorMaterial.flax
(Stored with Git LFS)
BIN
Content/Engine/SingleColorMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/SkyboxMaterial.flax
(Stored with Git LFS)
BIN
Content/Engine/SkyboxMaterial.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Engine/Textures/PreIntegratedGF.flax
(Stored with Git LFS)
BIN
Content/Engine/Textures/PreIntegratedGF.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/BitonicSort.flax
(Stored with Git LFS)
BIN
Content/Shaders/BitonicSort.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/ColorGrading.flax
(Stored with Git LFS)
BIN
Content/Shaders/ColorGrading.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/Editor/Grid.flax
(Stored with Git LFS)
BIN
Content/Shaders/Editor/Grid.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/Fog.flax
(Stored with Git LFS)
BIN
Content/Shaders/Fog.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/GI/GlobalSurfaceAtlas.flax
(Stored with Git LFS)
BIN
Content/Shaders/GI/GlobalSurfaceAtlas.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/GPUParticlesSorting.flax
(Stored with Git LFS)
BIN
Content/Shaders/GPUParticlesSorting.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/GlobalSignDistanceField.flax
(Stored with Git LFS)
BIN
Content/Shaders/GlobalSignDistanceField.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/MotionBlur.flax
(Stored with Git LFS)
BIN
Content/Shaders/MotionBlur.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/PostProcessing.flax
(Stored with Git LFS)
BIN
Content/Shaders/PostProcessing.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/ProbesFilter.flax
(Stored with Git LFS)
BIN
Content/Shaders/ProbesFilter.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/Reflections.flax
(Stored with Git LFS)
BIN
Content/Shaders/Reflections.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/SDF.flax
(Stored with Git LFS)
BIN
Content/Shaders/SDF.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/SSAO.flax
(Stored with Git LFS)
BIN
Content/Shaders/SSAO.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/SSR.flax
(Stored with Git LFS)
BIN
Content/Shaders/SSR.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/Sky.flax
(Stored with Git LFS)
BIN
Content/Shaders/Sky.flax
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Shaders/VolumetricFog.flax
(Stored with Git LFS)
BIN
Content/Shaders/VolumetricFog.flax
(Stored with Git LFS)
Binary file not shown.
@@ -2,9 +2,9 @@
|
|||||||
"Name": "Flax",
|
"Name": "Flax",
|
||||||
"Version": {
|
"Version": {
|
||||||
"Major": 1,
|
"Major": 1,
|
||||||
"Minor": 10,
|
"Minor": 11,
|
||||||
"Revision": 0,
|
"Revision": 0,
|
||||||
"Build": 6705
|
"Build": 6805
|
||||||
},
|
},
|
||||||
"Company": "Flax",
|
"Company": "Flax",
|
||||||
"Copyright": "Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.",
|
"Copyright": "Copyright (c) 2012-2025 Wojciech Figat. All rights reserved.",
|
||||||
|
|||||||
@@ -73,6 +73,24 @@
|
|||||||
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=TYPEDEF/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=TYPEDEF/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=UNION/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=UNION/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=UNION_005FMEMBER/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNaming/UserRules/=UNION_005FMEMBER/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="aa_bb" /></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Abbreviations/=CCD/@EntryIndexedValue">CCD</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Abbreviations/=GPU/@EntryIndexedValue">GPU</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=175CE9C669E52F4D92FD2C07848740BD/@EntryIndexedValue"><NamingElement Priority="11" Title="Class and struct public fields"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="PUBLIC"><type Name="class field" /><type Name="struct field" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=32EB6D69783B3E4481A733193E338089/@EntryIndexedValue"><NamingElement Priority="9" Title="Class and struct methods"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="member function" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=3C4E0D59F298854F9608A9B454E8FF5E/@EntryIndexedValue"><NamingElement Priority="17" Title="Typedefs"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="type alias" /><type Name="typedef" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=499C9026DADA2B448BCD0B2C54746A59/@EntryIndexedValue"><NamingElement Priority="14" Title="Other constants"><Descriptor Static="True" Constexpr="Indeterminate" Const="True" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="class field" /><type Name="local variable" /><type Name="struct field" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=50D2535711CE1A43A3B06EF841C36CFD/@EntryIndexedValue"><NamingElement Priority="13" Title="Enum members"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="scoped enumerator" /><type Name="unscoped enumerator" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=6AD3BADA1260CC4D840AB26323C51827/@EntryIndexedValue"><NamingElement Priority="15" Title="Global constants"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="True" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global variable" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=904CDCA174AACE4AA52660A247CDF9A0/@EntryIndexedValue"><NamingElement Priority="7" Title="Global variables"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global variable" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=95BCDE767C97B64DB3DAE800DBBBC758/@EntryIndexedValue"><NamingElement Priority="5" Title="Parameters"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="function parameter" /><type Name="lambda parameter" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=C03AE454FC2CBA43819AC75E4D6C9C8C/@EntryIndexedValue"><NamingElement Priority="1" Title="Classes and structs"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="__interface" /><type Name="class" /><type Name="struct" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=D49E31C610641E4CAD0407DB79ACC851/@EntryIndexedValue"><NamingElement Priority="8" Title="Global functions"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="global function" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=D73FBB3529BC5449B6C85BB37B26A8D4/@EntryIndexedValue"><NamingElement Priority="16" Title="Namespaces"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="namespace" /><type Name="namespace alias" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=DA41807CE47AEB4CBE1724C44D0B786E/@EntryIndexedValue"><NamingElement Priority="6" Title="Local variables"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="local variable" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=DDF30C9A1DA74B4DBBC56D25FDF886AA/@EntryIndexedValue"><NamingElement Priority="10" Title="Class and struct fields"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="class field" /><type Name="struct field" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="_" Suffix="" Style="aaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=EF70A6BF54ACE446971DDB32344C25A3/@EntryIndexedValue"><NamingElement Priority="12" Title="Union members"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="union member" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
|
<s:String x:Key="/Default/CodeStyle/Naming/CppNamingOptions/Rules/=F37818C54C323A4A80B1A478629985AE/@EntryIndexedValue"><NamingElement Priority="2" Title="Enums"><Descriptor Static="Indeterminate" Constexpr="Indeterminate" Const="Indeterminate" Volatile="Indeterminate" Accessibility="NOT_APPLICABLE"><type Name="enum" /></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="AaBb" /></NamingElement></s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AI/@EntryIndexedValue">AI</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AI/@EntryIndexedValue">AI</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ARGB/@EntryIndexedValue">ARGB</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ARGB/@EntryIndexedValue">ARGB</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LO/@EntryIndexedValue">LO</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LO/@EntryIndexedValue">LO</s:String>
|
||||||
@@ -213,6 +231,7 @@
|
|||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YZ/@EntryIndexedValue">YZ</s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YZ/@EntryIndexedValue">YZ</s:String>
|
||||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PublicFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy></s:String>
|
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PublicFields/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy></s:String>
|
||||||
<s:String x:Key="/Default/Environment/Hierarchy/PsiConfigurationSettingsKey/CustomLocation/@EntryValue">C:\Users\Wojtek\AppData\Local\JetBrains\Transient\ReSharperPlatformVs15\v08_f9eacea9\SolutionCaches</s:String>
|
<s:String x:Key="/Default/Environment/Hierarchy/PsiConfigurationSettingsKey/CustomLocation/@EntryValue">C:\Users\Wojtek\AppData\Local\JetBrains\Transient\ReSharperPlatformVs15\v08_f9eacea9\SolutionCaches</s:String>
|
||||||
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002ECodeStyle_002ENaming_002ECppNamingOptionsMigration/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002ECodeStyle_002ESettingsUpgrade_002EFunctionReturnStyleSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002ECodeStyle_002ESettingsUpgrade_002EFunctionReturnStyleSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002ECodeStyle_002ESettingsUpgrade_002ENamespaceIndentationSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EFeature_002EServices_002ECpp_002ECodeStyle_002ESettingsUpgrade_002ENamespaceIndentationSettingsUpgrader/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
|
||||||
@@ -267,6 +286,7 @@
|
|||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=comperand/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=comperand/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=coord/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=coord/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=cubemap/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=cubemap/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=DDGI/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Deformer/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=Deformer/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=deformers/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=deformers/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=defragmentation/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/UserDictionary/Words/=defragmentation/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
<!-- Please search existing issues for potential duplicates before filing yours:
|
|
||||||
https://github.com/flaxengine/FlaxEngine/issues?q=is%3Aissue
|
|
||||||
-->
|
|
||||||
|
|
||||||
**Issue description:**
|
|
||||||
<!-- What happened, and what was expected. -->
|
|
||||||
<!-- Log file, can be found in the project directory's `Logs` folder (optional) -->
|
|
||||||
|
|
||||||
**Steps to reproduce:**
|
|
||||||
<!-- Enter minimal reproduction steps if available. -->
|
|
||||||
|
|
||||||
|
|
||||||
**Minimal reproduction project:**
|
|
||||||
<!-- Recommended as it greatly speeds up debugging. Drag and drop a zip archive to upload it. -->
|
|
||||||
|
|
||||||
|
|
||||||
**Flax version:**
|
|
||||||
<!-- Specify version number. -->
|
|
||||||
|
|
||||||
13
README.md
13
README.md
@@ -6,7 +6,7 @@
|
|||||||
Flax Engine is a high quality modern 3D game engine written in C++ and C#.
|
Flax Engine is a high quality modern 3D game engine written in C++ and C#.
|
||||||
From stunning graphics to powerful scripts, it's designed for fast workflow with many ready-to-use features waiting for you right now. To learn more see the website ([www.flaxengine.com](https://flaxengine.com)).
|
From stunning graphics to powerful scripts, it's designed for fast workflow with many ready-to-use features waiting for you right now. To learn more see the website ([www.flaxengine.com](https://flaxengine.com)).
|
||||||
|
|
||||||
This repository contains full source code of the Flax Engine (excluding NDA-protected platforms support). Anyone is welcome to contribute or use the modified source in Flax-based games.
|
This repository contains full source code of the Flax Engine (excluding NDA-protected platforms support). Documentation source is also available in a separate repository. Anyone is welcome to contribute or use the modified source in Flax-based games.
|
||||||
|
|
||||||
# Development
|
# Development
|
||||||
|
|
||||||
@@ -46,21 +46,26 @@ Follow the instructions below to compile and run the engine from source.
|
|||||||
* Install Visual Studio Code
|
* Install Visual Studio Code
|
||||||
* Install .NET 8 or 9 SDK ([https://dotnet.microsoft.com/en-us/download/dotnet/8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0))
|
* Install .NET 8 or 9 SDK ([https://dotnet.microsoft.com/en-us/download/dotnet/8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0))
|
||||||
* Ubuntu: `sudo apt install dotnet-sdk-8.0`
|
* Ubuntu: `sudo apt install dotnet-sdk-8.0`
|
||||||
|
* Fedora: `sudo dnf install dotnet-sdk-8.0`
|
||||||
* Arch: `sudo pacman -S dotnet-sdk-8.0 dotnet-runtime-8.0 dotnet-targeting-pack-8.0 dotnet-host`
|
* Arch: `sudo pacman -S dotnet-sdk-8.0 dotnet-runtime-8.0 dotnet-targeting-pack-8.0 dotnet-host`
|
||||||
* Install Vulkan SDK ([https://vulkan.lunarg.com/](https://vulkan.lunarg.com/))
|
* Install Vulkan SDK ([https://vulkan.lunarg.com/](https://vulkan.lunarg.com/))
|
||||||
* Ubuntu: `sudo apt install vulkan-sdk`
|
* Ubuntu: `sudo apt install vulkan-sdk` (deprecated, follow official docs)
|
||||||
* Arch: `sudo pacman -S spirv-tools vulkan-headers vulkan-tools vulkan-validation-layers`
|
* Fedora: `sudo dnf install vulkan-headers vulkan-tools vulkan-validation-layers`
|
||||||
|
* Arch: `sudo pacman -S vulkan-headers vulkan-tools vulkan-validation-layers`
|
||||||
* Install Git with LFS
|
* Install Git with LFS
|
||||||
* Ubuntu: `sudo apt-get install git git-lfs`
|
* Ubuntu: `sudo apt-get install git git-lfs`
|
||||||
* Arch: `sudo pacman -S git git-lfs`
|
* Arch: `sudo pacman -S git git-lfs`
|
||||||
* `git-lfs install`
|
* `git-lfs install`
|
||||||
* Install the required packages:
|
* Install the required packages:
|
||||||
* Ubuntu: `sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev zlib1g-dev`
|
* Ubuntu: `sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev zlib1g-dev`
|
||||||
|
* Fedora: `sudo dnf install libX11-devel libXcursor-devel libXinerama-devel ghc-zlib-devel`
|
||||||
* Arch: `sudo pacman -S base-devel libx11 libxcursor libxinerama zlib`
|
* Arch: `sudo pacman -S base-devel libx11 libxcursor libxinerama zlib`
|
||||||
* Install Clang compiler (version 6 or later):
|
* Install Clang compiler (version 14 or later):
|
||||||
* Ubuntu: `sudo apt-get install clang lldb lld`
|
* Ubuntu: `sudo apt-get install clang lldb lld`
|
||||||
|
* Fedora: `sudo dnf install clang llvm lldb lld`
|
||||||
* Arch: `sudo pacman -S clang lldb lld`
|
* Arch: `sudo pacman -S clang lldb lld`
|
||||||
* Clone the repository (with LFS)
|
* Clone the repository (with LFS)
|
||||||
|
* git-lfs clone https://github.com/FlaxEngine/FlaxEngine.git
|
||||||
* Run `./GenerateProjectFiles.sh`
|
* Run `./GenerateProjectFiles.sh`
|
||||||
* Open workspace with Visual Code
|
* Open workspace with Visual Code
|
||||||
* Build and run (configuration and task named `Flax|Editor.Linux.Development|x64`)
|
* Build and run (configuration and task named `Flax|Editor.Linux.Development|x64`)
|
||||||
|
|||||||
@@ -174,7 +174,9 @@ void EditorAnalytics::StartSession()
|
|||||||
// Bind events
|
// Bind events
|
||||||
GameCooker::OnEvent.Bind<RegisterGameCookingStart>();
|
GameCooker::OnEvent.Bind<RegisterGameCookingStart>();
|
||||||
ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Bind<RegisterLightmapsBuildingStart>();
|
ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Bind<RegisterLightmapsBuildingStart>();
|
||||||
|
#if LOG_ENABLE
|
||||||
Log::Logger::OnError.Bind<RegisterError>();
|
Log::Logger::OnError.Bind<RegisterError>();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditorAnalytics::EndSession()
|
void EditorAnalytics::EndSession()
|
||||||
@@ -187,7 +189,9 @@ void EditorAnalytics::EndSession()
|
|||||||
// Unbind events
|
// Unbind events
|
||||||
GameCooker::OnEvent.Unbind<RegisterGameCookingStart>();
|
GameCooker::OnEvent.Unbind<RegisterGameCookingStart>();
|
||||||
ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Unbind<RegisterLightmapsBuildingStart>();
|
ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Unbind<RegisterLightmapsBuildingStart>();
|
||||||
|
#if LOG_ENABLE
|
||||||
Log::Logger::OnError.Unbind<RegisterError>();
|
Log::Logger::OnError.Unbind<RegisterError>();
|
||||||
|
#endif
|
||||||
|
|
||||||
// End session
|
// End session
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string ResultUrl { get; }
|
public string ResultUrl { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a value indicating wether a file can be created based on the current settings.
|
||||||
|
/// </summary>
|
||||||
|
public abstract bool CanBeCreated { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether this entry has settings to modify.
|
/// Gets a value indicating whether this entry has settings to modify.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ namespace FlaxEditor.Content.Create
|
|||||||
Text = "Create",
|
Text = "Create",
|
||||||
AnchorPreset = AnchorPresets.BottomRight,
|
AnchorPreset = AnchorPresets.BottomRight,
|
||||||
Offsets = new Margin(-ButtonsWidth - ButtonsMargin, ButtonsWidth, -ButtonsHeight - ButtonsMargin, ButtonsHeight),
|
Offsets = new Margin(-ButtonsWidth - ButtonsMargin, ButtonsWidth, -ButtonsHeight - ButtonsMargin, ButtonsHeight),
|
||||||
Parent = this
|
Parent = this,
|
||||||
|
Enabled = entry.CanBeCreated,
|
||||||
};
|
};
|
||||||
createButton.Clicked += OnSubmit;
|
createButton.Clicked += OnSubmit;
|
||||||
var cancelButton = new Button
|
var cancelButton = new Button
|
||||||
@@ -68,7 +69,7 @@ namespace FlaxEditor.Content.Create
|
|||||||
Text = "Cancel",
|
Text = "Cancel",
|
||||||
AnchorPreset = AnchorPresets.BottomRight,
|
AnchorPreset = AnchorPresets.BottomRight,
|
||||||
Offsets = new Margin(-ButtonsWidth - ButtonsMargin - ButtonsWidth - ButtonsMargin, ButtonsWidth, -ButtonsHeight - ButtonsMargin, ButtonsHeight),
|
Offsets = new Margin(-ButtonsWidth - ButtonsMargin - ButtonsWidth - ButtonsMargin, ButtonsWidth, -ButtonsHeight - ButtonsMargin, ButtonsHeight),
|
||||||
Parent = this
|
Parent = this,
|
||||||
};
|
};
|
||||||
cancelButton.Clicked += OnCancel;
|
cancelButton.Clicked += OnCancel;
|
||||||
|
|
||||||
@@ -77,7 +78,7 @@ namespace FlaxEditor.Content.Create
|
|||||||
{
|
{
|
||||||
AnchorPreset = AnchorPresets.HorizontalStretchTop,
|
AnchorPreset = AnchorPresets.HorizontalStretchTop,
|
||||||
Offsets = new Margin(2, 2, infoLabel.Bottom + 2, EditorHeight),
|
Offsets = new Margin(2, 2, infoLabel.Bottom + 2, EditorHeight),
|
||||||
Parent = this
|
Parent = this,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Settings editor
|
// Settings editor
|
||||||
@@ -87,6 +88,7 @@ namespace FlaxEditor.Content.Create
|
|||||||
_dialogSize = new Float2(TotalWidth, panel.Bottom);
|
_dialogSize = new Float2(TotalWidth, panel.Bottom);
|
||||||
|
|
||||||
_settingsEditor.Select(_entry.Settings);
|
_settingsEditor.Select(_entry.Settings);
|
||||||
|
_settingsEditor.Modified += () => createButton.Enabled = _entry.CanBeCreated;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
public class ParticleEmitterCreateEntry : CreateFileEntry
|
public class ParticleEmitterCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override bool CanBeCreated => true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Types of the emitter templates that can be created.
|
/// Types of the emitter templates that can be created.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
public class PrefabCreateEntry : CreateFileEntry
|
public class PrefabCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool CanBeCreated => _options.RootActorType != null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The create options.
|
/// The create options.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -73,6 +76,9 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
public class WidgetCreateEntry : CreateFileEntry
|
public class WidgetCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override bool CanBeCreated => _options.RootControlType != null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The create options.
|
/// The create options.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -111,7 +117,8 @@ namespace FlaxEditor.Content.Create
|
|||||||
|
|
||||||
private static bool IsValid(Type type)
|
private static bool IsValid(Type type)
|
||||||
{
|
{
|
||||||
return (type.IsPublic || type.IsNestedPublic) && !type.IsAbstract && !type.IsGenericType;
|
var controlTypes = Editor.Instance.CodeEditing.Controls.Get();
|
||||||
|
return (type.IsPublic || type.IsNestedPublic) && !type.IsAbstract && !type.IsGenericType && controlTypes.Contains(new ScriptType(type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
internal class SettingsCreateEntry : CreateFileEntry
|
internal class SettingsCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
public override bool CanBeCreated => _options.Type != null;
|
||||||
|
|
||||||
internal class Options
|
internal class Options
|
||||||
{
|
{
|
||||||
[Tooltip("The settings type.")]
|
[Tooltip("The settings type.")]
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ namespace FlaxEditor.Content.Create
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
public class VisualScriptCreateEntry : CreateFileEntry
|
public class VisualScriptCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override bool CanBeCreated => _options.BaseClass != null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The create options.
|
/// The create options.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ namespace FlaxEditor.Content.GUI
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
value = Mathf.Clamp(value, 0.3f, 3.0f);
|
value = Mathf.Clamp(value, 0.3f, 3.0f);
|
||||||
if (!Mathf.NearEqual(value, _viewScale))
|
if (value != _viewScale)
|
||||||
{
|
{
|
||||||
_viewScale = value;
|
_viewScale = value;
|
||||||
ViewScaleChanged?.Invoke();
|
ViewScaleChanged?.Invoke();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -130,6 +130,11 @@ namespace FlaxEditor.Content
|
|||||||
eyeAdaptation.Mode = EyeAdaptationMode.None;
|
eyeAdaptation.Mode = EyeAdaptationMode.None;
|
||||||
eyeAdaptation.OverrideFlags |= EyeAdaptationSettingsOverride.Mode;
|
eyeAdaptation.OverrideFlags |= EyeAdaptationSettingsOverride.Mode;
|
||||||
preview.PostFxVolume.EyeAdaptation = eyeAdaptation;
|
preview.PostFxVolume.EyeAdaptation = eyeAdaptation;
|
||||||
|
|
||||||
|
var antiAliasing = preview.PostFxVolume.AntiAliasing;
|
||||||
|
antiAliasing.Mode = AntialiasingMode.FastApproximateAntialiasing;
|
||||||
|
antiAliasing.OverrideFlags |= AntiAliasingSettingsOverride.Mode;
|
||||||
|
preview.PostFxVolume.AntiAliasing = antiAliasing;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,9 @@ namespace FlaxEditor.Content
|
|||||||
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
/// <seealso cref="FlaxEditor.Content.Create.CreateFileEntry" />
|
||||||
public class GenericJsonCreateEntry : CreateFileEntry
|
public class GenericJsonCreateEntry : CreateFileEntry
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public override bool CanBeCreated => _options.Type != null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The create options.
|
/// The create options.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,11 +10,9 @@ using FlaxEngine;
|
|||||||
namespace FlaxEditor.Content
|
namespace FlaxEditor.Content
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Context proxy object for shader source files (represented by <see cref="ShaderSourceItem"/>).
|
/// Base class for shader source files.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="FlaxEditor.Content.ContentProxy" />
|
public abstract class ShaderBaseProxy : ContentProxy
|
||||||
[ContentContextMenu("New/Shader Source")]
|
|
||||||
public class ShaderSourceProxy : ContentProxy
|
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool CanCreate(ContentFolder targetLocation)
|
public override bool CanCreate(ContentFolder targetLocation)
|
||||||
@@ -29,6 +27,21 @@ namespace FlaxEditor.Content
|
|||||||
return targetLocation.ShortName == "Source" && prevTargetLocation.ShortName == "Shaders";
|
return targetLocation.ShortName == "Source" && prevTargetLocation.ShortName == "Shaders";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override EditorWindow Open(Editor editor, ContentItem item)
|
||||||
|
{
|
||||||
|
Editor.Instance.CodeEditing.OpenFile(item.Path);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Context proxy object for shader source files (represented by <see cref="ShaderSourceItem"/>).
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="FlaxEditor.Content.ContentProxy" />
|
||||||
|
[ContentContextMenu("New/Shader Source (.shader)")]
|
||||||
|
public class ShaderSourceProxy : ShaderBaseProxy
|
||||||
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Create(string outputPath, object arg)
|
public override void Create(string outputPath, object arg)
|
||||||
{
|
{
|
||||||
@@ -44,13 +57,6 @@ namespace FlaxEditor.Content
|
|||||||
File.WriteAllText(outputPath, shaderTemplate, Encoding.UTF8);
|
File.WriteAllText(outputPath, shaderTemplate, Encoding.UTF8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public override EditorWindow Open(Editor editor, ContentItem item)
|
|
||||||
{
|
|
||||||
Editor.Instance.CodeEditing.OpenFile(item.Path);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override Color AccentColor => Color.FromRGB(0x7542f5);
|
public override Color AccentColor => Color.FromRGB(0x7542f5);
|
||||||
|
|
||||||
@@ -66,4 +72,33 @@ namespace FlaxEditor.Content
|
|||||||
return item is ShaderSourceItem;
|
return item is ShaderSourceItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Context proxy object for shader header files.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="FlaxEditor.Content.ContentProxy" />
|
||||||
|
[ContentContextMenu("New/Shader Header (.hlsl)")]
|
||||||
|
public class ShaderHeaderProxy : ShaderBaseProxy
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Create(string outputPath, object arg)
|
||||||
|
{
|
||||||
|
File.WriteAllText(outputPath, "\n", Encoding.UTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Color AccentColor => Color.FromRGB(0x2545a5);
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override string FileExtension => "hlsl";
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override string Name => "Shader Header";
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override bool IsProxyFor(ContentItem item)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,13 +20,6 @@ class PlatformTools;
|
|||||||
#define GAME_BUILD_DOTNET_RUNTIME_MAX_VER 9
|
#define GAME_BUILD_DOTNET_RUNTIME_MAX_VER 9
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OFFICIAL_BUILD
|
|
||||||
// Use the fixed .NET SDK version in packaged builds for compatibility (FlaxGame is precompiled with it)
|
|
||||||
#define GAME_BUILD_DOTNET_VER TEXT("-dotnet=" MACRO_TO_STR(GAME_BUILD_DOTNET_RUNTIME_MIN_VER))
|
|
||||||
#else
|
|
||||||
#define GAME_BUILD_DOTNET_VER TEXT("")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Game building options. Used as flags.
|
/// Game building options. Used as flags.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -374,6 +367,8 @@ public:
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void GetBuildPlatformName(const Char*& platform, const Char*& architecture) const;
|
void GetBuildPlatformName(const Char*& platform, const Char*& architecture) const;
|
||||||
|
|
||||||
|
String GetDotnetCommandArg() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "Engine/Scripting/ManagedCLR/MAssembly.h"
|
#include "Engine/Scripting/ManagedCLR/MAssembly.h"
|
||||||
#include "Engine/Content/JsonAsset.h"
|
#include "Engine/Content/JsonAsset.h"
|
||||||
#include "Engine/Content/AssetReference.h"
|
#include "Engine/Content/AssetReference.h"
|
||||||
|
#include "Engine/Profiler/ProfilerMemory.h"
|
||||||
#if PLATFORM_TOOLS_WINDOWS
|
#if PLATFORM_TOOLS_WINDOWS
|
||||||
#include "Platform/Windows/WindowsPlatformTools.h"
|
#include "Platform/Windows/WindowsPlatformTools.h"
|
||||||
#include "Engine/Platform/Windows/WindowsPlatformSettings.h"
|
#include "Engine/Platform/Windows/WindowsPlatformSettings.h"
|
||||||
@@ -311,6 +312,14 @@ void CookingData::GetBuildPlatformName(const Char*& platform, const Char*& archi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String CookingData::GetDotnetCommandArg() const
|
||||||
|
{
|
||||||
|
int32 version = Tools->GetDotnetVersion();
|
||||||
|
if (version == 0)
|
||||||
|
return String::Empty;
|
||||||
|
return String::Format(TEXT("-dotnet={}"), version);
|
||||||
|
}
|
||||||
|
|
||||||
void CookingData::StepProgress(const String& info, const float stepProgress) const
|
void CookingData::StepProgress(const String& info, const float stepProgress) const
|
||||||
{
|
{
|
||||||
const float singleStepProgress = 1.0f / (StepsCount + 1);
|
const float singleStepProgress = 1.0f / (StepsCount + 1);
|
||||||
@@ -380,6 +389,7 @@ bool GameCooker::IsCancelRequested()
|
|||||||
|
|
||||||
PlatformTools* GameCooker::GetTools(BuildPlatform platform)
|
PlatformTools* GameCooker::GetTools(BuildPlatform platform)
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
PlatformTools* result = nullptr;
|
PlatformTools* result = nullptr;
|
||||||
if (!Tools.TryGet(platform, result))
|
if (!Tools.TryGet(platform, result))
|
||||||
{
|
{
|
||||||
@@ -471,6 +481,7 @@ bool GameCooker::Build(BuildPlatform platform, BuildConfiguration configuration,
|
|||||||
LOG(Error, "Build platform {0} is not supported.", ::ToString(platform));
|
LOG(Error, "Build platform {0} is not supported.", ::ToString(platform));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
|
|
||||||
// Setup
|
// Setup
|
||||||
CancelFlag = 0;
|
CancelFlag = 0;
|
||||||
@@ -624,6 +635,7 @@ void GameCookerImpl::ReportProgress(const String& info, float totalProgress)
|
|||||||
|
|
||||||
void GameCookerImpl::OnCollectAssets(HashSet<Guid>& assets)
|
void GameCookerImpl::OnCollectAssets(HashSet<Guid>& assets)
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
if (Internal_OnCollectAssets == nullptr)
|
if (Internal_OnCollectAssets == nullptr)
|
||||||
{
|
{
|
||||||
auto c = GameCooker::GetStaticClass();
|
auto c = GameCooker::GetStaticClass();
|
||||||
@@ -651,6 +663,7 @@ void GameCookerImpl::OnCollectAssets(HashSet<Guid>& assets)
|
|||||||
|
|
||||||
bool GameCookerImpl::Build()
|
bool GameCookerImpl::Build()
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
CookingData& data = *Data;
|
CookingData& data = *Data;
|
||||||
LOG(Info, "Starting Game Cooker...");
|
LOG(Info, "Starting Game Cooker...");
|
||||||
LOG(Info, "Platform: {0}, Configuration: {2}, Options: {1}", ::ToString(data.Platform), (int32)data.Options, ::ToString(data.Configuration));
|
LOG(Info, "Platform: {0}, Configuration: {2}, Options: {1}", ::ToString(data.Platform), (int32)data.Options, ::ToString(data.Configuration));
|
||||||
@@ -670,8 +683,7 @@ bool GameCookerImpl::Build()
|
|||||||
|
|
||||||
MCore::Thread::Attach();
|
MCore::Thread::Attach();
|
||||||
|
|
||||||
// Build Started
|
// Build start
|
||||||
if (!EnumHasAnyFlags(data.Options, BuildOptions::NoCook))
|
|
||||||
{
|
{
|
||||||
CallEvent(GameCooker::EventType::BuildStarted);
|
CallEvent(GameCooker::EventType::BuildStarted);
|
||||||
data.Tools->OnBuildStarted(data);
|
data.Tools->OnBuildStarted(data);
|
||||||
@@ -744,8 +756,8 @@ bool GameCookerImpl::Build()
|
|||||||
}
|
}
|
||||||
IsRunning = false;
|
IsRunning = false;
|
||||||
CancelFlag = 0;
|
CancelFlag = 0;
|
||||||
if (!EnumHasAnyFlags(data.Options, BuildOptions::NoCook))
|
|
||||||
{
|
{
|
||||||
|
// Build end
|
||||||
for (int32 stepIndex = 0; stepIndex < Steps.Count(); stepIndex++)
|
for (int32 stepIndex = 0; stepIndex < Steps.Count(); stepIndex++)
|
||||||
Steps[stepIndex]->OnBuildEnded(data, failed);
|
Steps[stepIndex]->OnBuildEnded(data, failed);
|
||||||
data.Tools->OnBuildEnded(data, failed);
|
data.Tools->OnBuildEnded(data, failed);
|
||||||
@@ -778,6 +790,8 @@ int32 GameCookerImpl::ThreadFunction()
|
|||||||
|
|
||||||
bool GameCookerService::Init()
|
bool GameCookerService::Init()
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
|
|
||||||
auto editorAssembly = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly;
|
auto editorAssembly = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly;
|
||||||
editorAssembly->Unloading.Bind(OnEditorAssemblyUnloading);
|
editorAssembly->Unloading.Bind(OnEditorAssemblyUnloading);
|
||||||
GameCooker::OnCollectAssets.Bind(OnCollectAssets);
|
GameCooker::OnCollectAssets.Bind(OnCollectAssets);
|
||||||
@@ -789,6 +803,7 @@ void GameCookerService::Update()
|
|||||||
{
|
{
|
||||||
if (IsRunning)
|
if (IsRunning)
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
ScopeLock lock(ProgressLocker);
|
ScopeLock lock(ProgressLocker);
|
||||||
|
|
||||||
if (ProgressMsg.HasChars())
|
if (ProgressMsg.HasChars())
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -195,4 +201,9 @@ bool GDKPlatformTools::OnPostProcess(CookingData& data, GDKPlatformSettings* pla
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32 GDKPlatformTools::GetDotnetVersion() const
|
||||||
|
{
|
||||||
|
return GAME_BUILD_DOTNET_RUNTIME_MIN_VER;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
// [PlatformTools]
|
// [PlatformTools]
|
||||||
|
int32 GetDotnetVersion() const override;
|
||||||
DotNetAOTModes UseAOT() const override;
|
DotNetAOTModes UseAOT() const override;
|
||||||
bool OnDeployBinaries(CookingData& data) override;
|
bool OnDeployBinaries(CookingData& data) override;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ bool MacPlatformTools::OnPostProcess(CookingData& data)
|
|||||||
ADD_ENTRY("CFBundlePackageType", "APPL");
|
ADD_ENTRY("CFBundlePackageType", "APPL");
|
||||||
ADD_ENTRY("NSPrincipalClass", "NSApplication");
|
ADD_ENTRY("NSPrincipalClass", "NSApplication");
|
||||||
ADD_ENTRY("LSApplicationCategoryType", "public.app-category.games");
|
ADD_ENTRY("LSApplicationCategoryType", "public.app-category.games");
|
||||||
ADD_ENTRY("LSMinimumSystemVersion", "10.15");
|
ADD_ENTRY("LSMinimumSystemVersion", "13");
|
||||||
ADD_ENTRY("CFBundleIconFile", "icon.icns");
|
ADD_ENTRY("CFBundleIconFile", "icon.icns");
|
||||||
ADD_ENTRY_STR("CFBundleExecutable", executableName);
|
ADD_ENTRY_STR("CFBundleExecutable", executableName);
|
||||||
ADD_ENTRY_STR("CFBundleIdentifier", appIdentifier);
|
ADD_ENTRY_STR("CFBundleIdentifier", appIdentifier);
|
||||||
@@ -231,6 +231,8 @@ bool MacPlatformTools::OnPostProcess(CookingData& data)
|
|||||||
LOG(Info, "Building app package...");
|
LOG(Info, "Building app package...");
|
||||||
{
|
{
|
||||||
const String dmgPath = data.OriginalOutputPath / appName + TEXT(".dmg");
|
const String dmgPath = data.OriginalOutputPath / appName + TEXT(".dmg");
|
||||||
|
if (FileSystem::FileExists(dmgPath))
|
||||||
|
FileSystem::DeleteFile(dmgPath);
|
||||||
CreateProcessSettings procSettings;
|
CreateProcessSettings procSettings;
|
||||||
procSettings.HiddenWindow = true;
|
procSettings.HiddenWindow = true;
|
||||||
procSettings.WorkingDirectory = data.OriginalOutputPath;
|
procSettings.WorkingDirectory = data.OriginalOutputPath;
|
||||||
|
|||||||
@@ -528,6 +528,9 @@ bool WindowsPlatformTools::OnDeployBinaries(CookingData& data)
|
|||||||
|
|
||||||
void WindowsPlatformTools::OnBuildStarted(CookingData& data)
|
void WindowsPlatformTools::OnBuildStarted(CookingData& data)
|
||||||
{
|
{
|
||||||
|
if (EnumHasAllFlags(data.Options, BuildOptions::NoCook))
|
||||||
|
return;
|
||||||
|
|
||||||
// Remove old executable
|
// Remove old executable
|
||||||
Array<String> files;
|
Array<String> files;
|
||||||
FileSystem::DirectoryGetFiles(files, data.NativeCodeOutputPath, TEXT("*.exe"), DirectorySearchOption::TopDirectoryOnly);
|
FileSystem::DirectoryGetFiles(files, data.NativeCodeOutputPath, TEXT("*.exe"), DirectorySearchOption::TopDirectoryOnly);
|
||||||
|
|||||||
@@ -70,6 +70,20 @@ public:
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
virtual ArchitectureType GetArchitecture() const = 0;
|
virtual ArchitectureType GetArchitecture() const = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the .Net version to use for the cooked game.
|
||||||
|
/// </summary>
|
||||||
|
virtual int32 GetDotnetVersion() const
|
||||||
|
{
|
||||||
|
#if OFFICIAL_BUILD
|
||||||
|
// Use the fixed .NET SDK version in packaged builds for compatibility (FlaxGame is precompiled with it)
|
||||||
|
return GAME_BUILD_DOTNET_RUNTIME_MIN_VER;
|
||||||
|
#else
|
||||||
|
// Use the highest version found on a system (Flax.Build will decide)
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the value indicating whenever platform requires AOT (needs C# assemblies to be precompiled).
|
/// Gets the value indicating whenever platform requires AOT (needs C# assemblies to be precompiled).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,9 +10,10 @@
|
|||||||
#include "Engine/Serialization/JsonTools.h"
|
#include "Engine/Serialization/JsonTools.h"
|
||||||
#include "Engine/Serialization/JsonWriters.h"
|
#include "Engine/Serialization/JsonWriters.h"
|
||||||
#include "Editor/Cooker/PlatformTools.h"
|
#include "Editor/Cooker/PlatformTools.h"
|
||||||
|
#include "Engine/Engine/Globals.h"
|
||||||
#include "Editor/Editor.h"
|
#include "Editor/Editor.h"
|
||||||
#include "Editor/ProjectInfo.h"
|
#include "Editor/ProjectInfo.h"
|
||||||
#include "Engine/Engine/Globals.h"
|
#include "Editor/Utilities/EditorUtilities.h"
|
||||||
#if PLATFORM_MAC
|
#if PLATFORM_MAC
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -127,7 +128,7 @@ bool CompileScriptsStep::DeployBinaries(CookingData& data, const String& path, c
|
|||||||
const String dst = dstPath / StringUtils::GetFileName(file);
|
const String dst = dstPath / StringUtils::GetFileName(file);
|
||||||
if (dst == file)
|
if (dst == file)
|
||||||
continue;
|
continue;
|
||||||
if (FileSystem::CopyFile(dst, file))
|
if (EditorUtilities::CopyFileIfNewer(dst, file))
|
||||||
{
|
{
|
||||||
data.Error(String::Format(TEXT("Failed to copy file from {0} to {1}."), file, dst));
|
data.Error(String::Format(TEXT("Failed to copy file from {0} to {1}."), file, dst));
|
||||||
return true;
|
return true;
|
||||||
@@ -189,7 +190,7 @@ bool CompileScriptsStep::Perform(CookingData& data)
|
|||||||
const String logFile = data.CacheDirectory / TEXT("CompileLog.txt");
|
const String logFile = data.CacheDirectory / TEXT("CompileLog.txt");
|
||||||
auto args = String::Format(
|
auto args = String::Format(
|
||||||
TEXT("-log -logfile=\"{4}\" -build -mutex -buildtargets={0} -platform={1} -arch={2} -configuration={3} -aotMode={5} {6}"),
|
TEXT("-log -logfile=\"{4}\" -build -mutex -buildtargets={0} -platform={1} -arch={2} -configuration={3} -aotMode={5} {6}"),
|
||||||
target, platform, architecture, configuration, logFile, ToString(data.Tools->UseAOT()), GAME_BUILD_DOTNET_VER);
|
target, platform, architecture, configuration, logFile, ToString(data.Tools->UseAOT()), data.GetDotnetCommandArg());
|
||||||
#if PLATFORM_WINDOWS
|
#if PLATFORM_WINDOWS
|
||||||
if (data.Platform == BuildPlatform::LinuxX64)
|
if (data.Platform == BuildPlatform::LinuxX64)
|
||||||
#elif PLATFORM_LINUX
|
#elif PLATFORM_LINUX
|
||||||
|
|||||||
@@ -36,6 +36,7 @@
|
|||||||
#include "Engine/Engine/Base/GameBase.h"
|
#include "Engine/Engine/Base/GameBase.h"
|
||||||
#include "Engine/Engine/Globals.h"
|
#include "Engine/Engine/Globals.h"
|
||||||
#include "Engine/Tools/TextureTool/TextureTool.h"
|
#include "Engine/Tools/TextureTool/TextureTool.h"
|
||||||
|
#include "Engine/Threading/Threading.h"
|
||||||
#include "Engine/Profiler/ProfilerCPU.h"
|
#include "Engine/Profiler/ProfilerCPU.h"
|
||||||
#include "Engine/Scripting/Enums.h"
|
#include "Engine/Scripting/Enums.h"
|
||||||
#if PLATFORM_TOOLS_WINDOWS
|
#if PLATFORM_TOOLS_WINDOWS
|
||||||
@@ -525,6 +526,7 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass
|
|||||||
#if PLATFORM_TOOLS_XBOX_SCARLETT
|
#if PLATFORM_TOOLS_XBOX_SCARLETT
|
||||||
case BuildPlatform::XboxScarlett:
|
case BuildPlatform::XboxScarlett:
|
||||||
{
|
{
|
||||||
|
options.Platform = PlatformType::XboxScarlett;
|
||||||
const char* platformDefineName = "PLATFORM_XBOX_SCARLETT";
|
const char* platformDefineName = "PLATFORM_XBOX_SCARLETT";
|
||||||
COMPILE_PROFILE(DirectX_SM6, SHADER_FILE_CHUNK_INTERNAL_D3D_SM6_CACHE);
|
COMPILE_PROFILE(DirectX_SM6, SHADER_FILE_CHUNK_INTERNAL_D3D_SM6_CACHE);
|
||||||
break;
|
break;
|
||||||
@@ -1366,7 +1368,10 @@ bool CookAssetsStep::Perform(CookingData& data)
|
|||||||
{
|
{
|
||||||
typeName = e.TypeName;
|
typeName = e.TypeName;
|
||||||
}
|
}
|
||||||
LOG(Info, "{0}: {1:>4} assets of total size {2}", typeName, e.Count, Utilities::BytesToText(e.ContentSize));
|
if (e.Count == 1)
|
||||||
|
LOG(Info, "{0}: 1 asset of total size {1}", typeName, Utilities::BytesToText(e.ContentSize));
|
||||||
|
else
|
||||||
|
LOG(Info, "{0}: {1:>4} assets of total size {2}", typeName, e.Count, Utilities::BytesToText(e.ContentSize));
|
||||||
}
|
}
|
||||||
LOG(Info, "");
|
LOG(Info, "");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ bool DeployDataStep::Perform(CookingData& data)
|
|||||||
{
|
{
|
||||||
// Ask Flax.Build to provide .NET SDK location for the current platform
|
// Ask Flax.Build to provide .NET SDK location for the current platform
|
||||||
String sdks;
|
String sdks;
|
||||||
bool failed = ScriptsBuilder::RunBuildTool(String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs {}"), GAME_BUILD_DOTNET_VER), data.CacheDirectory);
|
bool failed = ScriptsBuilder::RunBuildTool(String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs {}"), data.GetDotnetCommandArg()), data.CacheDirectory);
|
||||||
failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks);
|
failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks);
|
||||||
int32 idx = sdks.Find(TEXT("DotNetSdk, "), StringSearchCase::CaseSensitive);
|
int32 idx = sdks.Find(TEXT("DotNetSdk, "), StringSearchCase::CaseSensitive);
|
||||||
if (idx != -1)
|
if (idx != -1)
|
||||||
@@ -200,7 +200,7 @@ bool DeployDataStep::Perform(CookingData& data)
|
|||||||
String sdks;
|
String sdks;
|
||||||
const Char *platformName, *archName;
|
const Char *platformName, *archName;
|
||||||
data.GetBuildPlatformName(platformName, archName);
|
data.GetBuildPlatformName(platformName, archName);
|
||||||
String args = String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printDotNetRuntime -platform={} -arch={} {}"), platformName, archName, GAME_BUILD_DOTNET_VER);
|
String args = String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printDotNetRuntime -platform={} -arch={} {}"), platformName, archName, data.GetDotnetCommandArg());
|
||||||
bool failed = ScriptsBuilder::RunBuildTool(args, data.CacheDirectory);
|
bool failed = ScriptsBuilder::RunBuildTool(args, data.CacheDirectory);
|
||||||
failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks);
|
failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks);
|
||||||
Array<String> parts;
|
Array<String> parts;
|
||||||
@@ -244,10 +244,13 @@ bool DeployDataStep::Perform(CookingData& data)
|
|||||||
}
|
}
|
||||||
if (version.IsEmpty())
|
if (version.IsEmpty())
|
||||||
{
|
{
|
||||||
|
int32 minVer = GAME_BUILD_DOTNET_RUNTIME_MIN_VER, maxVer = GAME_BUILD_DOTNET_RUNTIME_MAX_VER;
|
||||||
if (srcDotnetFromEngine)
|
if (srcDotnetFromEngine)
|
||||||
{
|
{
|
||||||
// Detect version from runtime files inside Engine Platform folder
|
// Detect version from runtime files inside Engine Platform folder
|
||||||
for (int32 i = GAME_BUILD_DOTNET_RUNTIME_MAX_VER; i >= GAME_BUILD_DOTNET_RUNTIME_MIN_VER; i--)
|
if (data.Tools->GetDotnetVersion() != 0)
|
||||||
|
minVer = maxVer = data.Tools->GetDotnetVersion();
|
||||||
|
for (int32 i = maxVer; i >= minVer; i--)
|
||||||
{
|
{
|
||||||
// Check runtime files inside Engine Platform folder
|
// Check runtime files inside Engine Platform folder
|
||||||
String testPath1 = srcDotnet / String::Format(TEXT("lib/net{}.0"), i);
|
String testPath1 = srcDotnet / String::Format(TEXT("lib/net{}.0"), i);
|
||||||
@@ -262,7 +265,7 @@ bool DeployDataStep::Perform(CookingData& data)
|
|||||||
}
|
}
|
||||||
if (version.IsEmpty())
|
if (version.IsEmpty())
|
||||||
{
|
{
|
||||||
data.Error(String::Format(TEXT("Failed to find supported .NET {} version for the current host platform."), GAME_BUILD_DOTNET_RUNTIME_MIN_VER));
|
data.Error(String::Format(TEXT("Failed to find supported .NET {} version (min {}) for {} platform."), maxVer, minVer, platformName));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,7 +367,7 @@ bool DeployDataStep::Perform(CookingData& data)
|
|||||||
const String logFile = data.CacheDirectory / TEXT("StripDotnetLibs.txt");
|
const String logFile = data.CacheDirectory / TEXT("StripDotnetLibs.txt");
|
||||||
String args = String::Format(
|
String args = String::Format(
|
||||||
TEXT("-log -logfile=\"{}\" -runDotNetClassLibStripping -mutex -binaries=\"{}\" {}"),
|
TEXT("-log -logfile=\"{}\" -runDotNetClassLibStripping -mutex -binaries=\"{}\" {}"),
|
||||||
logFile, data.DataOutputPath, GAME_BUILD_DOTNET_VER);
|
logFile, data.DataOutputPath, data.GetDotnetCommandArg());
|
||||||
for (const String& define : data.CustomDefines)
|
for (const String& define : data.CustomDefines)
|
||||||
{
|
{
|
||||||
args += TEXT(" -D");
|
args += TEXT(" -D");
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
void PrecompileAssembliesStep::OnBuildStarted(CookingData& data)
|
void PrecompileAssembliesStep::OnBuildStarted(CookingData& data)
|
||||||
{
|
{
|
||||||
const DotNetAOTModes aotMode = data.Tools->UseAOT();
|
const DotNetAOTModes aotMode = data.Tools->UseAOT();
|
||||||
if (aotMode == DotNetAOTModes::None)
|
if (aotMode == DotNetAOTModes::None || EnumHasAllFlags(data.Options, BuildOptions::NoCook))
|
||||||
return;
|
return;
|
||||||
const auto& buildSettings = *BuildSettings::Get();
|
const auto& buildSettings = *BuildSettings::Get();
|
||||||
|
|
||||||
@@ -59,6 +59,7 @@ bool PrecompileAssembliesStep::Perform(CookingData& data)
|
|||||||
data.StepProgress(infoMsg, 0);
|
data.StepProgress(infoMsg, 0);
|
||||||
|
|
||||||
// Override Newtonsoft.Json with AOT-version (one that doesn't use System.Reflection.Emit)
|
// Override Newtonsoft.Json with AOT-version (one that doesn't use System.Reflection.Emit)
|
||||||
|
// TODO: remove it since EngineModule does properly reference AOT lib now
|
||||||
EditorUtilities::CopyFileIfNewer(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.dll"), Globals::StartupFolder / TEXT("Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll"));
|
EditorUtilities::CopyFileIfNewer(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.dll"), Globals::StartupFolder / TEXT("Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll"));
|
||||||
FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.xml"));
|
FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.xml"));
|
||||||
FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.pdb"));
|
FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.pdb"));
|
||||||
@@ -69,7 +70,7 @@ bool PrecompileAssembliesStep::Perform(CookingData& data)
|
|||||||
const String logFile = data.CacheDirectory / TEXT("AOTLog.txt");
|
const String logFile = data.CacheDirectory / TEXT("AOTLog.txt");
|
||||||
String args = String::Format(
|
String args = String::Format(
|
||||||
TEXT("-log -logfile=\"{}\" -runDotNetAOT -mutex -platform={} -arch={} -configuration={} -aotMode={} -binaries=\"{}\" -intermediate=\"{}\" {}"),
|
TEXT("-log -logfile=\"{}\" -runDotNetAOT -mutex -platform={} -arch={} -configuration={} -aotMode={} -binaries=\"{}\" -intermediate=\"{}\" {}"),
|
||||||
logFile, platform, architecture, configuration, ToString(aotMode), data.DataOutputPath, data.ManagedCodeOutputPath, GAME_BUILD_DOTNET_VER);
|
logFile, platform, architecture, configuration, ToString(aotMode), data.DataOutputPath, data.ManagedCodeOutputPath, data.GetDotnetCommandArg());
|
||||||
if (!buildSettings.SkipUnusedDotnetLibsPackaging)
|
if (!buildSettings.SkipUnusedDotnetLibsPackaging)
|
||||||
args += TEXT(" -skipUnusedDotnetLibs=false"); // Run AOT on whole class library (not just used libs)
|
args += TEXT(" -skipUnusedDotnetLibs=false"); // Run AOT on whole class library (not just used libs)
|
||||||
for (const String& define : data.CustomDefines)
|
for (const String& define : data.CustomDefines)
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ namespace FlaxEditor
|
|||||||
private readonly CustomEditorPresenter _presenter;
|
private readonly CustomEditorPresenter _presenter;
|
||||||
private CustomEditorWindow _customEditor;
|
private CustomEditorWindow _customEditor;
|
||||||
|
|
||||||
public Win(CustomEditorWindow customEditor)
|
public Win(CustomEditorWindow customEditor, bool hideOnClose, ScrollBars scrollBars)
|
||||||
: base(Editor.Instance, false, ScrollBars.Vertical)
|
: base(Editor.Instance, hideOnClose, scrollBars)
|
||||||
{
|
{
|
||||||
Title = customEditor.GetType().Name;
|
Title = customEditor.GetType().Name;
|
||||||
_customEditor = customEditor;
|
_customEditor = customEditor;
|
||||||
@@ -64,9 +64,9 @@ namespace FlaxEditor
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="CustomEditorWindow"/> class.
|
/// Initializes a new instance of the <see cref="CustomEditorWindow"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected CustomEditorWindow()
|
protected CustomEditorWindow(bool hideOnClose = false, ScrollBars scrollBars = ScrollBars.Vertical)
|
||||||
{
|
{
|
||||||
_win = new Win(this);
|
_win = new Win(this, hideOnClose, scrollBars);
|
||||||
ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin;
|
ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -749,6 +749,15 @@ namespace FlaxEditor.CustomEditors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Actor FindActor(CustomEditor editor)
|
||||||
|
{
|
||||||
|
if (editor.Values[0] is Actor actor)
|
||||||
|
return actor;
|
||||||
|
if (editor.ParentEditor != null)
|
||||||
|
return FindActor(editor.ParentEditor);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private Actor FindPrefabRoot(CustomEditor editor)
|
private Actor FindPrefabRoot(CustomEditor editor)
|
||||||
{
|
{
|
||||||
if (editor.Values[0] is Actor actor)
|
if (editor.Values[0] is Actor actor)
|
||||||
@@ -767,32 +776,35 @@ namespace FlaxEditor.CustomEditors
|
|||||||
return FindPrefabRoot(actor.Parent);
|
return FindPrefabRoot(actor.Parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private SceneObject FindObjectWithPrefabObjectId(Actor actor, ref Guid prefabObjectId)
|
private SceneObject FindObjectWithPrefabObjectId(Actor actor, ref Guid prefabObjectId, Actor endPoint)
|
||||||
{
|
{
|
||||||
|
var visited = new HashSet<Actor>();
|
||||||
|
return FindObjectWithPrefabObjectId(actor, ref prefabObjectId, endPoint, visited);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SceneObject FindObjectWithPrefabObjectId(Actor actor, ref Guid prefabObjectId, Actor endPoint, HashSet<Actor> visited)
|
||||||
|
{
|
||||||
|
if (visited.Contains(actor) || actor is Scene || actor == endPoint)
|
||||||
|
return null;
|
||||||
if (actor.PrefabObjectID == prefabObjectId)
|
if (actor.PrefabObjectID == prefabObjectId)
|
||||||
return actor;
|
return actor;
|
||||||
|
|
||||||
for (int i = 0; i < actor.ScriptsCount; i++)
|
for (int i = 0; i < actor.ScriptsCount; i++)
|
||||||
{
|
{
|
||||||
if (actor.GetScript(i).PrefabObjectID == prefabObjectId)
|
var script = actor.GetScript(i);
|
||||||
{
|
if (script != null && script.PrefabObjectID == prefabObjectId)
|
||||||
var a = actor.GetScript(i);
|
return script;
|
||||||
if (a != null)
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < actor.ChildrenCount; i++)
|
for (int i = 0; i < actor.ChildrenCount; i++)
|
||||||
{
|
{
|
||||||
if (actor.GetChild(i).PrefabObjectID == prefabObjectId)
|
var child = actor.GetChild(i);
|
||||||
{
|
if (child != null && child.PrefabObjectID == prefabObjectId)
|
||||||
var a = actor.GetChild(i);
|
return child;
|
||||||
if (a != null)
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
// Go up in the hierarchy
|
||||||
|
return FindObjectWithPrefabObjectId(actor.Parent, ref prefabObjectId, endPoint, visited);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -826,7 +838,7 @@ namespace FlaxEditor.CustomEditors
|
|||||||
}
|
}
|
||||||
|
|
||||||
var prefabObjectId = referenceSceneObject.PrefabObjectID;
|
var prefabObjectId = referenceSceneObject.PrefabObjectID;
|
||||||
var prefabInstanceRef = FindObjectWithPrefabObjectId(prefabInstanceRoot, ref prefabObjectId);
|
var prefabInstanceRef = FindObjectWithPrefabObjectId(FindActor(this), ref prefabObjectId, prefabInstanceRoot);
|
||||||
if (prefabInstanceRef == null)
|
if (prefabInstanceRef == null)
|
||||||
{
|
{
|
||||||
Editor.LogWarning("Missing prefab instance reference in the prefab instance. Cannot revert to it.");
|
Editor.LogWarning("Missing prefab instance reference in the prefab instance. Cannot revert to it.");
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using FlaxEditor.SceneGraph;
|
||||||
using FlaxEditor.Scripting;
|
using FlaxEditor.Scripting;
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
using FlaxEngine.GUI;
|
using FlaxEngine.GUI;
|
||||||
@@ -52,6 +53,21 @@ namespace FlaxEditor.CustomEditors
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="nodes">The nodes to select</param>
|
/// <param name="nodes">The nodes to select</param>
|
||||||
public void Select(List<SceneGraph.SceneGraphNode> nodes);
|
public void Select(List<SceneGraph.SceneGraphNode> nodes);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the current selection.
|
||||||
|
/// </summary>
|
||||||
|
public List<SceneGraphNode> Selection { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indication of if the properties window is locked on specific objects.
|
||||||
|
/// </summary>
|
||||||
|
public bool LockSelection { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the scene editing context.
|
||||||
|
/// </summary>
|
||||||
|
public ISceneEditingContext SceneContext { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -81,6 +97,8 @@ namespace FlaxEditor.CustomEditors
|
|||||||
Offsets = Margin.Zero;
|
Offsets = Margin.Zero;
|
||||||
Pivot = Float2.Zero;
|
Pivot = Float2.Zero;
|
||||||
IsScrollable = true;
|
IsScrollable = true;
|
||||||
|
Spacing = Utilities.Constants.UIMargin;
|
||||||
|
Margin = new Margin(Utilities.Constants.UIMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -95,7 +113,7 @@ namespace FlaxEditor.CustomEditors
|
|||||||
{
|
{
|
||||||
FlaxEditor.Editor.LogWarning(ex);
|
FlaxEditor.Editor.LogWarning(ex);
|
||||||
|
|
||||||
// Refresh layout on errors to reduce lgo spam
|
// Refresh layout on errors to reduce log spam
|
||||||
_presenter.BuildLayout();
|
_presenter.BuildLayout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#include "Engine/Core/Types/TimeSpan.h"
|
#include "Engine/Core/Types/TimeSpan.h"
|
||||||
#include "Engine/Core/Types/Stopwatch.h"
|
#include "Engine/Core/Types/Stopwatch.h"
|
||||||
#include "Engine/Core/Collections/Dictionary.h"
|
#include "Engine/Core/Collections/Dictionary.h"
|
||||||
|
#include "Engine/Profiler/ProfilerCPU.h"
|
||||||
|
#include "Engine/Profiler/ProfilerMemory.h"
|
||||||
#include "Engine/Engine/EngineService.h"
|
#include "Engine/Engine/EngineService.h"
|
||||||
#include "Engine/Scripting/Scripting.h"
|
#include "Engine/Scripting/Scripting.h"
|
||||||
#include "Engine/Scripting/BinaryModule.h"
|
#include "Engine/Scripting/BinaryModule.h"
|
||||||
@@ -69,6 +71,7 @@ MTypeObject* CustomEditorsUtil::GetCustomEditor(MTypeObject* refType)
|
|||||||
|
|
||||||
bool CustomEditorsUtilService::Init()
|
bool CustomEditorsUtilService::Init()
|
||||||
{
|
{
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
TRACK_ASSEMBLY(((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly);
|
TRACK_ASSEMBLY(((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly);
|
||||||
Scripting::BinaryModuleLoaded.Bind(&OnBinaryModuleLoaded);
|
Scripting::BinaryModuleLoaded.Bind(&OnBinaryModuleLoaded);
|
||||||
|
|
||||||
@@ -77,6 +80,8 @@ bool CustomEditorsUtilService::Init()
|
|||||||
|
|
||||||
void OnAssemblyLoaded(MAssembly* assembly)
|
void OnAssemblyLoaded(MAssembly* assembly)
|
||||||
{
|
{
|
||||||
|
PROFILE_CPU_NAMED("CustomEditors.OnAssemblyLoaded");
|
||||||
|
PROFILE_MEM(Editor);
|
||||||
Stopwatch stopwatch;
|
Stopwatch stopwatch;
|
||||||
|
|
||||||
// Prepare FlaxEngine
|
// Prepare FlaxEngine
|
||||||
|
|||||||
@@ -87,8 +87,11 @@ namespace FlaxEditor.CustomEditors
|
|||||||
var targetTypeType = TypeUtils.GetType(targetType);
|
var targetTypeType = TypeUtils.GetType(targetType);
|
||||||
if (canUseRefPicker)
|
if (canUseRefPicker)
|
||||||
{
|
{
|
||||||
|
// TODO: add generic way of CustomEditor for ref pickers (use it on AssetRefEditor/GPUTextureEditor/...)
|
||||||
if (typeof(Asset).IsAssignableFrom(targetTypeType))
|
if (typeof(Asset).IsAssignableFrom(targetTypeType))
|
||||||
return new AssetRefEditor();
|
return new AssetRefEditor();
|
||||||
|
if (typeof(GPUTexture).IsAssignableFrom(targetTypeType))
|
||||||
|
return new GPUTextureEditor();
|
||||||
if (typeof(FlaxEngine.Object).IsAssignableFrom(targetTypeType))
|
if (typeof(FlaxEngine.Object).IsAssignableFrom(targetTypeType))
|
||||||
return new FlaxObjectRefEditor();
|
return new FlaxObjectRefEditor();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,20 @@
|
|||||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using FlaxEditor.Actions;
|
using FlaxEditor.Actions;
|
||||||
using FlaxEditor.CustomEditors.Editors;
|
using FlaxEditor.CustomEditors.Editors;
|
||||||
using FlaxEditor.CustomEditors.Elements;
|
using FlaxEditor.CustomEditors.Elements;
|
||||||
using FlaxEditor.GUI;
|
using FlaxEditor.GUI;
|
||||||
using FlaxEditor.GUI.ContextMenu;
|
using FlaxEditor.GUI.ContextMenu;
|
||||||
using FlaxEditor.GUI.Tree;
|
using FlaxEditor.GUI.Tree;
|
||||||
using FlaxEditor.Modules;
|
|
||||||
using FlaxEditor.Scripting;
|
using FlaxEditor.Scripting;
|
||||||
using FlaxEditor.Windows;
|
|
||||||
using FlaxEditor.Windows.Assets;
|
using FlaxEditor.Windows.Assets;
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
using FlaxEngine.GUI;
|
using FlaxEngine.GUI;
|
||||||
using FlaxEngine.Json;
|
using FlaxEngine.Json;
|
||||||
using FlaxEngine.Utilities;
|
using FlaxEngine.Utilities;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace FlaxEditor.CustomEditors.Dedicated
|
namespace FlaxEditor.CustomEditors.Dedicated
|
||||||
{
|
{
|
||||||
@@ -71,14 +69,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
// Display prefab UI (when displaying object inside Prefab Window then display only nested prefabs)
|
// Display prefab UI (when displaying object inside Prefab Window then display only nested prefabs)
|
||||||
prefab.GetNestedObject(ref prefabObjectId, out var nestedPrefabId, out var nestedPrefabObjectId);
|
prefab.GetNestedObject(ref prefabObjectId, out var nestedPrefabId, out var nestedPrefabObjectId);
|
||||||
var nestedPrefab = FlaxEngine.Content.Load<Prefab>(nestedPrefabId);
|
var nestedPrefab = FlaxEngine.Content.Load<Prefab>(nestedPrefabId);
|
||||||
var panel = layout.CustomContainer<UniformGridPanel>();
|
var panel = layout.UniformGrid();
|
||||||
panel.CustomControl.Height = 20.0f;
|
panel.CustomControl.Height = 20.0f;
|
||||||
panel.CustomControl.SlotsVertically = 1;
|
panel.CustomControl.SlotsVertically = 1;
|
||||||
if (Presenter == Editor.Instance.Windows.PropertiesWin.Presenter || nestedPrefab)
|
if (Presenter == Editor.Instance.Windows.PropertiesWin.Presenter || nestedPrefab)
|
||||||
{
|
{
|
||||||
var targetPrefab = nestedPrefab ?? prefab;
|
var targetPrefab = nestedPrefab ?? prefab;
|
||||||
panel.CustomControl.SlotsHorizontally = 3;
|
panel.CustomControl.SlotsHorizontally = 3;
|
||||||
|
|
||||||
// Selecting actor prefab asset
|
// Selecting actor prefab asset
|
||||||
var selectPrefab = panel.Button("Select Prefab");
|
var selectPrefab = panel.Button("Select Prefab");
|
||||||
selectPrefab.Button.Clicked += () =>
|
selectPrefab.Button.Clicked += () =>
|
||||||
@@ -133,35 +131,22 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
var actor = (Actor)Values[0];
|
var actor = (Actor)Values[0];
|
||||||
var scriptType = TypeUtils.GetType(actor.TypeName);
|
var scriptType = TypeUtils.GetType(actor.TypeName);
|
||||||
var item = scriptType.ContentItem;
|
var item = scriptType.ContentItem;
|
||||||
if (Presenter.Owner is PropertiesWindow propertiesWindow)
|
if (Presenter.Owner != null)
|
||||||
{
|
{
|
||||||
var lockButton = cm.AddButton(propertiesWindow.LockObjects ? "Unlock" : "Lock");
|
var lockButton = cm.AddButton(Presenter.Owner.LockSelection ? "Unlock" : "Lock");
|
||||||
lockButton.ButtonClicked += button =>
|
lockButton.ButtonClicked += button =>
|
||||||
{
|
{
|
||||||
propertiesWindow.LockObjects = !propertiesWindow.LockObjects;
|
var owner = Presenter?.Owner;
|
||||||
|
if (owner == null)
|
||||||
|
return;
|
||||||
|
owner.LockSelection = !owner.LockSelection;
|
||||||
|
|
||||||
// Reselect current selection
|
// Reselect current selection
|
||||||
if (!propertiesWindow.LockObjects && Editor.Instance.SceneEditing.SelectionCount > 0)
|
if (!owner.LockSelection && owner.Selection.Count > 0)
|
||||||
{
|
{
|
||||||
var cachedSelection = Editor.Instance.SceneEditing.Selection.ToArray();
|
var cachedSelection = owner.Selection.ToList();
|
||||||
Editor.Instance.SceneEditing.Select(null);
|
owner.Select(null);
|
||||||
Editor.Instance.SceneEditing.Select(cachedSelection);
|
owner.Select(cachedSelection);
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else if (Presenter.Owner is PrefabWindow prefabWindow)
|
|
||||||
{
|
|
||||||
var lockButton = cm.AddButton(prefabWindow.LockSelectedObjects ? "Unlock" : "Lock");
|
|
||||||
lockButton.ButtonClicked += button =>
|
|
||||||
{
|
|
||||||
prefabWindow.LockSelectedObjects = !prefabWindow.LockSelectedObjects;
|
|
||||||
|
|
||||||
// Reselect current selection
|
|
||||||
if (!prefabWindow.LockSelectedObjects && prefabWindow.Selection.Count > 0)
|
|
||||||
{
|
|
||||||
var cachedSelection = prefabWindow.Selection.ToList();
|
|
||||||
prefabWindow.Select(null);
|
|
||||||
prefabWindow.Select(cachedSelection);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -254,11 +239,27 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
node.TextColor = Color.OrangeRed;
|
node.TextColor = Color.OrangeRed;
|
||||||
node.Text = Utilities.Utils.GetPropertyNameUI(removed.PrefabObject.GetType().Name);
|
node.Text = Utilities.Utils.GetPropertyNameUI(removed.PrefabObject.GetType().Name);
|
||||||
}
|
}
|
||||||
|
// Removed Actor
|
||||||
|
else if (editor is RemovedActorDummy removedActor)
|
||||||
|
{
|
||||||
|
node.TextColor = Color.OrangeRed;
|
||||||
|
node.Text = $"{removedActor.PrefabObject.Name} ({Utilities.Utils.GetPropertyNameUI(removedActor.PrefabObject.GetType().Name)})";
|
||||||
|
}
|
||||||
// Actor or Script
|
// Actor or Script
|
||||||
else if (editor.Values[0] is SceneObject sceneObject)
|
else if (editor.Values[0] is SceneObject sceneObject)
|
||||||
{
|
{
|
||||||
node.TextColor = sceneObject.HasPrefabLink ? FlaxEngine.GUI.Style.Current.ProgressNormal : FlaxEngine.GUI.Style.Current.BackgroundSelected;
|
node.TextColor = sceneObject.HasPrefabLink ? FlaxEngine.GUI.Style.Current.ProgressNormal : FlaxEngine.GUI.Style.Current.BackgroundSelected;
|
||||||
node.Text = Utilities.Utils.GetPropertyNameUI(sceneObject.GetType().Name);
|
if (editor.Values.Info != ScriptMemberInfo.Null)
|
||||||
|
{
|
||||||
|
if (editor.Values.GetAttributes().FirstOrDefault(x => x is EditorDisplayAttribute) is EditorDisplayAttribute editorDisplayAttribute && !string.IsNullOrEmpty(editorDisplayAttribute.Name))
|
||||||
|
node.Text = $"{Utilities.Utils.GetPropertyNameUI(editorDisplayAttribute.Name)} ({Utilities.Utils.GetPropertyNameUI(editor.Values.Info.Name)})";
|
||||||
|
else
|
||||||
|
node.Text = Utilities.Utils.GetPropertyNameUI(editor.Values.Info.Name);
|
||||||
|
}
|
||||||
|
else if (sceneObject is Actor actor)
|
||||||
|
node.Text = $"{actor.Name} ({Utilities.Utils.GetPropertyNameUI(sceneObject.GetType().Name)})";
|
||||||
|
else
|
||||||
|
node.Text = Utilities.Utils.GetPropertyNameUI(sceneObject.GetType().Name);
|
||||||
}
|
}
|
||||||
// Array Item
|
// Array Item
|
||||||
else if (editor.ParentEditor is CollectionEditor)
|
else if (editor.ParentEditor is CollectionEditor)
|
||||||
@@ -268,7 +269,12 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
// Common type
|
// Common type
|
||||||
else if (editor.Values.Info != ScriptMemberInfo.Null)
|
else if (editor.Values.Info != ScriptMemberInfo.Null)
|
||||||
{
|
{
|
||||||
node.Text = Utilities.Utils.GetPropertyNameUI(editor.Values.Info.Name);
|
if (editor.Values.GetAttributes().FirstOrDefault(x => x is EditorDisplayAttribute) is EditorDisplayAttribute editorDisplayAttribute
|
||||||
|
&& !string.IsNullOrEmpty(editorDisplayAttribute.Name)
|
||||||
|
&& !editorDisplayAttribute.Name.Contains("_inline"))
|
||||||
|
node.Text = $"{Utilities.Utils.GetPropertyNameUI(editorDisplayAttribute.Name)} ({Utilities.Utils.GetPropertyNameUI(editor.Values.Info.Name)})";
|
||||||
|
else
|
||||||
|
node.Text = Utilities.Utils.GetPropertyNameUI(editor.Values.Info.Name);
|
||||||
}
|
}
|
||||||
// Custom type
|
// Custom type
|
||||||
else if (editor.Values[0] != null)
|
else if (editor.Values[0] != null)
|
||||||
@@ -294,16 +300,40 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
// Not used
|
// Not used
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class RemovedActorDummy : CustomEditor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The removed prefab object (from the prefab default instance).
|
||||||
|
/// </summary>
|
||||||
|
public Actor PrefabObject;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The prefab instance's parent.
|
||||||
|
/// </summary>
|
||||||
|
public Actor ParentActor;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The order of the removed actor in the parent.
|
||||||
|
/// </summary>
|
||||||
|
public int OrderInParent;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Initialize(LayoutElementsContainer layout)
|
||||||
|
{
|
||||||
|
// Not used
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private TreeNode ProcessDiff(CustomEditor editor, bool skipIfNotModified = true)
|
private TreeNode ProcessDiff(CustomEditor editor, bool skipIfNotModified = true)
|
||||||
{
|
{
|
||||||
// Special case for new Script added to actor
|
// Special case for new Script or child actor added to actor
|
||||||
if (editor.Values[0] is Script script && !script.HasPrefabLink)
|
if ((editor.Values[0] is Script script && !script.HasPrefabLink) || (editor.Values[0] is Actor a && !a.HasPrefabLink))
|
||||||
return CreateDiffNode(editor);
|
return CreateDiffNode(editor);
|
||||||
|
|
||||||
// Skip if no change detected
|
// Skip if no change detected
|
||||||
var isRefEdited = editor.Values.IsReferenceValueModified;
|
var isRefEdited = editor.Values.IsReferenceValueModified;
|
||||||
if (!isRefEdited && skipIfNotModified)
|
if (!isRefEdited && skipIfNotModified && editor is not ScriptsEditor)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
TreeNode result = null;
|
TreeNode result = null;
|
||||||
@@ -316,7 +346,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
var childEditor = editor.ChildrenEditors[i];
|
var childEditor = editor.ChildrenEditors[i];
|
||||||
|
|
||||||
// Special case for root actor transformation (can be applied only in Prefab editor, not in Level)
|
// Special case for root actor transformation (can be applied only in Prefab editor, not in Level)
|
||||||
if (isActorEditorInLevel && childEditor.Values.Info.Name is "LocalPosition" or "LocalOrientation" or "LocalScale")
|
if (isActorEditorInLevel && childEditor.Values.Info.Name is "LocalPosition" or "LocalOrientation" or "LocalScale" or "Name")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var child = ProcessDiff(childEditor, !isScriptEditorWithRefValue);
|
var child = ProcessDiff(childEditor, !isScriptEditorWithRefValue);
|
||||||
@@ -358,16 +388,80 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compare child actors for removed actors.
|
||||||
|
if (editor is ActorEditor && editor.Values.HasReferenceValue && editor.Values.ReferenceValue is Actor prefabObjectActor)
|
||||||
|
{
|
||||||
|
var thisActor = editor.Values[0] as Actor;
|
||||||
|
for (int i = 0; i < prefabObjectActor.ChildrenCount; i++)
|
||||||
|
{
|
||||||
|
var prefabActorChild = prefabObjectActor.Children[i];
|
||||||
|
if (thisActor == null)
|
||||||
|
continue;
|
||||||
|
bool isRemoved = true;
|
||||||
|
for (int j = 0; j < thisActor.ChildrenCount; j++)
|
||||||
|
{
|
||||||
|
var actorChild = thisActor.Children[j];
|
||||||
|
if (actorChild.PrefabObjectID == prefabActorChild.PrefabObjectID)
|
||||||
|
{
|
||||||
|
isRemoved = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isRemoved)
|
||||||
|
{
|
||||||
|
var dummy = new RemovedActorDummy
|
||||||
|
{
|
||||||
|
PrefabObject = prefabActorChild,
|
||||||
|
ParentActor = thisActor,
|
||||||
|
OrderInParent = prefabActorChild.OrderInParent,
|
||||||
|
};
|
||||||
|
var child = CreateDiffNode(dummy);
|
||||||
|
if (result == null)
|
||||||
|
result = CreateDiffNode(editor);
|
||||||
|
result.AddChild(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (editor is ScriptsEditor && result != null && result.ChildrenCount == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private TreeNode CreateDiffTree(Actor actor, CustomEditorPresenter presenter, LayoutElementsContainer layout)
|
||||||
|
{
|
||||||
|
var actorNode = Editor.Instance.Scene.GetActorNode(actor);
|
||||||
|
ValueContainer vc = new ValueContainer(ScriptMemberInfo.Null);
|
||||||
|
vc.SetType(new ScriptType(actorNode.EditableObject.GetType()));
|
||||||
|
vc.Add(actorNode.EditableObject);
|
||||||
|
var editor = CustomEditorsUtil.CreateEditor(vc, null, false);
|
||||||
|
editor.Initialize(presenter, layout, vc);
|
||||||
|
var node = ProcessDiff(editor, false);
|
||||||
|
layout.ClearLayout();
|
||||||
|
foreach (var child in actor.Children)
|
||||||
|
{
|
||||||
|
var childNode = CreateDiffTree(child, presenter, layout);
|
||||||
|
if (childNode == null)
|
||||||
|
continue;
|
||||||
|
if (node == null)
|
||||||
|
node = CreateDiffNode(editor);
|
||||||
|
node.AddChild(childNode);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
private void ViewChanges(Control target, Float2 targetLocation)
|
private void ViewChanges(Control target, Float2 targetLocation)
|
||||||
{
|
{
|
||||||
// Build a tree out of modified properties
|
// Build a tree out of modified properties
|
||||||
var rootNode = ProcessDiff(this, false);
|
var thisActor = (Actor)Values[0];
|
||||||
|
var rootActor = thisActor.IsPrefabRoot ? thisActor : thisActor.GetPrefabRoot();
|
||||||
|
var presenter = new CustomEditorPresenter(null);
|
||||||
|
var layout = new CustomElementsContainer<ContainerControl>();
|
||||||
|
var rootNode = CreateDiffTree(rootActor, presenter, layout);
|
||||||
|
|
||||||
// Skip if no changes detected
|
// Skip if no changes detected
|
||||||
if (rootNode == null || rootNode.ChildrenCount == 0)
|
if (rootNode == null)
|
||||||
{
|
{
|
||||||
var cm1 = new ContextMenu();
|
var cm1 = new ContextMenu();
|
||||||
cm1.AddButton("No changes detected");
|
cm1.AddButton("No changes detected");
|
||||||
@@ -411,6 +505,15 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
Presenter.BuildLayoutOnUpdate();
|
Presenter.BuildLayoutOnUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void GetAllPrefabObjects(List<object> objects, Actor actor)
|
||||||
|
{
|
||||||
|
objects.Add(actor);
|
||||||
|
objects.AddRange(actor.Scripts);
|
||||||
|
var children = actor.Children;
|
||||||
|
foreach (var child in children)
|
||||||
|
GetAllPrefabObjects(objects, child);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnDiffRevert(CustomEditor editor)
|
private void OnDiffRevert(CustomEditor editor)
|
||||||
{
|
{
|
||||||
// Special case for removed Script from actor
|
// Special case for removed Script from actor
|
||||||
@@ -432,6 +535,22 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special case for reverting removed Actors
|
||||||
|
if (editor is RemovedActorDummy removedActor)
|
||||||
|
{
|
||||||
|
Editor.Log("Reverting removed actor changes to prefab (adding it)");
|
||||||
|
|
||||||
|
var parentActor = removedActor.ParentActor;
|
||||||
|
var restored = parentActor.AddChild(removedActor.PrefabObject.GetType());
|
||||||
|
var prefabId = parentActor.PrefabID;
|
||||||
|
var prefabObjectId = removedActor.PrefabObject.PrefabObjectID;
|
||||||
|
string data = JsonSerializer.Serialize(removedActor.PrefabObject);
|
||||||
|
JsonSerializer.Deserialize(restored, data);
|
||||||
|
Presenter.Owner.SceneContext.Spawn(restored, parentActor, removedActor.OrderInParent);
|
||||||
|
Actor.Internal_LinkPrefab(FlaxEngine.Object.GetUnmanagedPtr(restored), ref prefabId, ref prefabObjectId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Special case for new Script added to actor
|
// Special case for new Script added to actor
|
||||||
if (editor.Values[0] is Script script && !script.HasPrefabLink)
|
if (editor.Values[0] is Script script && !script.HasPrefabLink)
|
||||||
{
|
{
|
||||||
@@ -443,8 +562,37 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special case for new Actor added to actor
|
||||||
|
if (editor.Values[0] is Actor a && !a.HasPrefabLink)
|
||||||
|
{
|
||||||
|
Editor.Log("Reverting added actor changes to prefab (removing it)");
|
||||||
|
|
||||||
editor.RevertToReferenceValue();
|
// TODO: Keep previous selection.
|
||||||
|
var context = Presenter.Owner.SceneContext;
|
||||||
|
context.Select(SceneGraph.SceneGraphFactory.FindNode(a.ID));
|
||||||
|
context.DeleteSelection();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Presenter.Undo != null && Presenter.Undo.Enabled)
|
||||||
|
{
|
||||||
|
var thisActor = (Actor)Values[0];
|
||||||
|
var rootActor = thisActor.IsPrefabRoot ? thisActor : thisActor.GetPrefabRoot();
|
||||||
|
var prefabObjects = new List<object>();
|
||||||
|
GetAllPrefabObjects(prefabObjects, rootActor);
|
||||||
|
using (new UndoMultiBlock(Presenter.Undo, prefabObjects, "Revert to Prefab"))
|
||||||
|
{
|
||||||
|
editor.RevertToReferenceValue();
|
||||||
|
editor.RefreshInternal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
editor.RevertToReferenceValue();
|
||||||
|
editor.RefreshInternal();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
public class AudioSourceEditor : ActorEditor
|
public class AudioSourceEditor : ActorEditor
|
||||||
{
|
{
|
||||||
private Label _infoLabel;
|
private Label _infoLabel;
|
||||||
|
private Slider _slider;
|
||||||
|
private AudioSource.States _slideStartState;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Initialize(LayoutElementsContainer layout)
|
public override void Initialize(LayoutElementsContainer layout)
|
||||||
@@ -28,7 +30,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
_infoLabel = playbackGroup.Label(string.Empty).Label;
|
_infoLabel = playbackGroup.Label(string.Empty).Label;
|
||||||
_infoLabel.AutoHeight = true;
|
_infoLabel.AutoHeight = true;
|
||||||
|
|
||||||
var grid = playbackGroup.CustomContainer<UniformGridPanel>();
|
// Play back slider
|
||||||
|
var sliderElement = playbackGroup.CustomContainer<Slider>();
|
||||||
|
_slider = sliderElement.CustomControl;
|
||||||
|
_slider.ThumbSize = new Float2(_slider.ThumbSize.X * 0.5f, _slider.ThumbSize.Y);
|
||||||
|
_slider.SlidingStart += OnSlidingStart;
|
||||||
|
_slider.SlidingEnd += OnSlidingEnd;
|
||||||
|
|
||||||
|
var grid = playbackGroup.UniformGrid();
|
||||||
var gridControl = grid.CustomControl;
|
var gridControl = grid.CustomControl;
|
||||||
gridControl.ClipChildren = false;
|
gridControl.ClipChildren = false;
|
||||||
gridControl.Height = Button.DefaultHeight;
|
gridControl.Height = Button.DefaultHeight;
|
||||||
@@ -40,6 +49,38 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnSlidingEnd()
|
||||||
|
{
|
||||||
|
foreach (var value in Values)
|
||||||
|
{
|
||||||
|
if (value is AudioSource audioSource && audioSource.Clip)
|
||||||
|
{
|
||||||
|
switch (_slideStartState)
|
||||||
|
{
|
||||||
|
case AudioSource.States.Playing:
|
||||||
|
audioSource.Play();
|
||||||
|
break;
|
||||||
|
case AudioSource.States.Paused:
|
||||||
|
case AudioSource.States.Stopped:
|
||||||
|
audioSource.Pause();
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSlidingStart()
|
||||||
|
{
|
||||||
|
foreach (var value in Values)
|
||||||
|
{
|
||||||
|
if (value is AudioSource audioSource && audioSource.Clip)
|
||||||
|
{
|
||||||
|
_slideStartState = audioSource.State;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Refresh()
|
public override void Refresh()
|
||||||
{
|
{
|
||||||
@@ -51,7 +92,29 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
foreach (var value in Values)
|
foreach (var value in Values)
|
||||||
{
|
{
|
||||||
if (value is AudioSource audioSource && audioSource.Clip)
|
if (value is AudioSource audioSource && audioSource.Clip)
|
||||||
|
{
|
||||||
text += $"Time: {audioSource.Time:##0.0}s / {audioSource.Clip.Length:##0.0}s\n";
|
text += $"Time: {audioSource.Time:##0.0}s / {audioSource.Clip.Length:##0.0}s\n";
|
||||||
|
_slider.Maximum = audioSource.Clip.Length;
|
||||||
|
_slider.Minimum = 0;
|
||||||
|
if (_slider.IsSliding)
|
||||||
|
{
|
||||||
|
if (audioSource.State != AudioSource.States.Playing)
|
||||||
|
{
|
||||||
|
// Play to move slider correctly
|
||||||
|
audioSource.Play();
|
||||||
|
audioSource.Time = _slider.Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
audioSource.Time = _slider.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_slider.Value = audioSource.Time;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_infoLabel.Text = text;
|
_infoLabel.Text = text;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
var paintValue = new ReadOnlyValueContainer(new ScriptType(typeof(ClothPaintingGizmoMode)), _gizmoMode);
|
var paintValue = new ReadOnlyValueContainer(new ScriptType(typeof(ClothPaintingGizmoMode)), _gizmoMode);
|
||||||
paintGroup.Object(paintValue);
|
paintGroup.Object(paintValue);
|
||||||
{
|
{
|
||||||
var grid = paintGroup.CustomContainer<UniformGridPanel>();
|
var grid = paintGroup.UniformGrid();
|
||||||
var gridControl = grid.CustomControl;
|
var gridControl = grid.CustomControl;
|
||||||
gridControl.ClipChildren = false;
|
gridControl.ClipChildren = false;
|
||||||
gridControl.Height = Button.DefaultHeight;
|
gridControl.Height = Button.DefaultHeight;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
|
using FlaxEngine.GUI;
|
||||||
|
|
||||||
namespace FlaxEditor.CustomEditors.Dedicated
|
namespace FlaxEditor.CustomEditors.Dedicated
|
||||||
{
|
{
|
||||||
@@ -11,7 +12,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
[CustomEditor(typeof(EnvironmentProbe)), DefaultEditor]
|
[CustomEditor(typeof(EnvironmentProbe)), DefaultEditor]
|
||||||
public class EnvironmentProbeEditor : ActorEditor
|
public class EnvironmentProbeEditor : ActorEditor
|
||||||
{
|
{
|
||||||
private FlaxEngine.GUI.Button _bake;
|
private Button _bake;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Initialize(LayoutElementsContainer layout)
|
public override void Initialize(LayoutElementsContainer layout)
|
||||||
@@ -20,8 +21,9 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
|
|
||||||
if (Values.HasDifferentTypes == false)
|
if (Values.HasDifferentTypes == false)
|
||||||
{
|
{
|
||||||
layout.Space(10);
|
var group = layout.Group("Bake");
|
||||||
_bake = layout.Button("Bake").Button;
|
group.Panel.ItemsMargin = new Margin(Utilities.Constants.UIMargin * 2);
|
||||||
|
_bake = group.Button("Bake").Button;
|
||||||
_bake.Clicked += BakeButtonClicked;
|
_bake.Clicked += BakeButtonClicked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
68
Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs
Normal file
68
Source/Editor/CustomEditors/Dedicated/GPUTextureEditor.cs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using FlaxEditor.GUI.ContextMenu;
|
||||||
|
using FlaxEngine;
|
||||||
|
using FlaxEngine.GUI;
|
||||||
|
|
||||||
|
namespace FlaxEditor.CustomEditors.Dedicated
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Basic editor/viewer for <see cref="GPUTexture"/>.
|
||||||
|
/// </summary>
|
||||||
|
[CustomEditor(typeof(GPUTexture)), DefaultEditor]
|
||||||
|
public class GPUTextureEditor : CustomEditor
|
||||||
|
{
|
||||||
|
private Image _image;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override DisplayStyle Style => DisplayStyle.Inline;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Initialize(LayoutElementsContainer layout)
|
||||||
|
{
|
||||||
|
_image = new Image
|
||||||
|
{
|
||||||
|
Brush = new GPUTextureBrush(),
|
||||||
|
Size = new Float2(200, 100),
|
||||||
|
Parent = layout.ContainerControl,
|
||||||
|
};
|
||||||
|
_image.Clicked += OnImageClicked;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnImageClicked(Image image, MouseButton button)
|
||||||
|
{
|
||||||
|
var texture = Values[0] as GPUTexture;
|
||||||
|
if (!texture || button != MouseButton.Right)
|
||||||
|
return;
|
||||||
|
var menu = new ContextMenu();
|
||||||
|
menu.AddButton("Save...", () => Screenshot.Capture(Values[0] as GPUTexture));
|
||||||
|
menu.AddButton("Enlarge", () => _image.Size *= 2);
|
||||||
|
menu.AddButton("Shrink", () => _image.Size /= 2).Enabled = _image.Height > 32;
|
||||||
|
var location = image.PointFromScreen(Input.MouseScreenPosition);
|
||||||
|
menu.Show(image, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Refresh()
|
||||||
|
{
|
||||||
|
base.Refresh();
|
||||||
|
|
||||||
|
var texture = Values[0] as GPUTexture;
|
||||||
|
((GPUTextureBrush)_image.Brush).Texture = texture;
|
||||||
|
if (texture)
|
||||||
|
{
|
||||||
|
var desc = texture.Description;
|
||||||
|
#if BUILD_RELEASE
|
||||||
|
var name = string.Empty;
|
||||||
|
#else
|
||||||
|
var name = texture.Name;
|
||||||
|
#endif
|
||||||
|
_image.TooltipText = $"{name}\nType: {texture.ResourceType}\nSize: {desc.Width}x{desc.Height}\nFormat: {desc.Format}\nMemory: {Utilities.Utils.FormatBytesCount(texture.MemoryUsage)}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_image.TooltipText = "None";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
// Copyright (c) Wojciech Figat. All rights reserved.
|
// Copyright (c) Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using FlaxEditor.Content.Settings;
|
using FlaxEditor.Content.Settings;
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
@@ -16,6 +15,11 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
{
|
{
|
||||||
private int _layersCount;
|
private int _layersCount;
|
||||||
private List<CheckBox> _checkBoxes;
|
private List<CheckBox> _checkBoxes;
|
||||||
|
private VerticalPanel _upperRightCell;
|
||||||
|
private VerticalPanel _bottomLeftCell;
|
||||||
|
private UniformGridPanel _grid;
|
||||||
|
private Border _horizontalHighlight;
|
||||||
|
private Border _verticalHighlight;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override DisplayStyle Style => DisplayStyle.InlineIntoParent;
|
public override DisplayStyle Style => DisplayStyle.InlineIntoParent;
|
||||||
@@ -37,12 +41,29 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
Parent = panel,
|
Parent = panel,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var style = FlaxEngine.GUI.Style.Current;
|
||||||
|
_horizontalHighlight = new Border()
|
||||||
|
{
|
||||||
|
Parent = panel,
|
||||||
|
BorderColor = style.Foreground,
|
||||||
|
BorderWidth = 1.0f,
|
||||||
|
Visible = false,
|
||||||
|
};
|
||||||
|
|
||||||
|
_verticalHighlight = new Border()
|
||||||
|
{
|
||||||
|
Parent = panel,
|
||||||
|
BorderColor = style.Foreground,
|
||||||
|
BorderWidth = 1.0f,
|
||||||
|
Visible = false,
|
||||||
|
};
|
||||||
|
|
||||||
var upperLeftCell = new Label
|
var upperLeftCell = new Label
|
||||||
{
|
{
|
||||||
Parent = gridPanel,
|
Parent = gridPanel,
|
||||||
};
|
};
|
||||||
|
|
||||||
var upperRightCell = new VerticalPanel
|
_upperRightCell = new VerticalPanel
|
||||||
{
|
{
|
||||||
ClipChildren = false,
|
ClipChildren = false,
|
||||||
Pivot = new Float2(0.00001f, 0.0f),
|
Pivot = new Float2(0.00001f, 0.0f),
|
||||||
@@ -54,7 +75,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
Parent = gridPanel,
|
Parent = gridPanel,
|
||||||
};
|
};
|
||||||
|
|
||||||
var bottomLeftCell = new VerticalPanel
|
_bottomLeftCell = new VerticalPanel
|
||||||
{
|
{
|
||||||
Pivot = Float2.Zero,
|
Pivot = Float2.Zero,
|
||||||
Spacing = 0,
|
Spacing = 0,
|
||||||
@@ -63,7 +84,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
Parent = gridPanel,
|
Parent = gridPanel,
|
||||||
};
|
};
|
||||||
|
|
||||||
var grid = new UniformGridPanel(0)
|
_grid = new UniformGridPanel(0)
|
||||||
{
|
{
|
||||||
SlotsHorizontally = layersCount,
|
SlotsHorizontally = layersCount,
|
||||||
SlotsVertically = layersCount,
|
SlotsVertically = layersCount,
|
||||||
@@ -74,13 +95,13 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
int layerIndex = 0;
|
int layerIndex = 0;
|
||||||
for (; layerIndex < layerNames.Length; layerIndex++)
|
for (; layerIndex < layerNames.Length; layerIndex++)
|
||||||
{
|
{
|
||||||
upperRightCell.AddChild(new Label
|
_upperRightCell.AddChild(new Label
|
||||||
{
|
{
|
||||||
Height = labelsHeight,
|
Height = labelsHeight,
|
||||||
Text = layerNames[layerNames.Length - layerIndex - 1],
|
Text = layerNames[layerNames.Length - layerIndex - 1],
|
||||||
HorizontalAlignment = TextAlignment.Near,
|
HorizontalAlignment = TextAlignment.Near,
|
||||||
});
|
});
|
||||||
bottomLeftCell.AddChild(new Label
|
_bottomLeftCell.AddChild(new Label
|
||||||
{
|
{
|
||||||
Height = labelsHeight,
|
Height = labelsHeight,
|
||||||
Text = layerNames[layerIndex],
|
Text = layerNames[layerIndex],
|
||||||
@@ -90,13 +111,13 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
for (; layerIndex < layersCount; layerIndex++)
|
for (; layerIndex < layersCount; layerIndex++)
|
||||||
{
|
{
|
||||||
string name = "Layer " + layerIndex;
|
string name = "Layer " + layerIndex;
|
||||||
upperRightCell.AddChild(new Label
|
_upperRightCell.AddChild(new Label
|
||||||
{
|
{
|
||||||
Height = labelsHeight,
|
Height = labelsHeight,
|
||||||
Text = name,
|
Text = name,
|
||||||
HorizontalAlignment = TextAlignment.Near,
|
HorizontalAlignment = TextAlignment.Near,
|
||||||
});
|
});
|
||||||
bottomLeftCell.AddChild(new Label
|
_bottomLeftCell.AddChild(new Label
|
||||||
{
|
{
|
||||||
Height = labelsHeight,
|
Height = labelsHeight,
|
||||||
Text = name,
|
Text = name,
|
||||||
@@ -118,7 +139,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
var box = new CheckBox(0, 0, true)
|
var box = new CheckBox(0, 0, true)
|
||||||
{
|
{
|
||||||
Tag = new Float2(_layersCount - column - 1, row),
|
Tag = new Float2(_layersCount - column - 1, row),
|
||||||
Parent = grid,
|
Parent = _grid,
|
||||||
Checked = GetBit(column, row),
|
Checked = GetBit(column, row),
|
||||||
};
|
};
|
||||||
box.StateChanged += OnCheckBoxChanged;
|
box.StateChanged += OnCheckBoxChanged;
|
||||||
@@ -126,7 +147,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
}
|
}
|
||||||
for (; column < layersCount; column++)
|
for (; column < layersCount; column++)
|
||||||
{
|
{
|
||||||
grid.AddChild(new Label());
|
_grid.AddChild(new Label());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,6 +162,18 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Refresh()
|
public override void Refresh()
|
||||||
{
|
{
|
||||||
|
int selectedColumn = -1;
|
||||||
|
int selectedRow = -1;
|
||||||
|
var style = FlaxEngine.GUI.Style.Current;
|
||||||
|
bool mouseOverGrid = _grid.IsMouseOver;
|
||||||
|
|
||||||
|
// Only hide highlights if mouse is not over the grid to reduce flickering
|
||||||
|
if (!mouseOverGrid)
|
||||||
|
{
|
||||||
|
_horizontalHighlight.Visible = false;
|
||||||
|
_verticalHighlight.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Sync check boxes
|
// Sync check boxes
|
||||||
for (int i = 0; i < _checkBoxes.Count; i++)
|
for (int i = 0; i < _checkBoxes.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -148,6 +181,39 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
int column = (int)((Float2)box.Tag).X;
|
int column = (int)((Float2)box.Tag).X;
|
||||||
int row = (int)((Float2)box.Tag).Y;
|
int row = (int)((Float2)box.Tag).Y;
|
||||||
box.Checked = GetBit(column, row);
|
box.Checked = GetBit(column, row);
|
||||||
|
|
||||||
|
if (box.IsMouseOver)
|
||||||
|
{
|
||||||
|
selectedColumn = column;
|
||||||
|
selectedRow = row;
|
||||||
|
|
||||||
|
_horizontalHighlight.X = _grid.X - _bottomLeftCell.Width;
|
||||||
|
_horizontalHighlight.Y = _grid.Y + box.Y;
|
||||||
|
_horizontalHighlight.Width = _bottomLeftCell.Width + box.Width + box.X;
|
||||||
|
_horizontalHighlight.Height = box.Height;
|
||||||
|
_horizontalHighlight.Visible = true;
|
||||||
|
|
||||||
|
_verticalHighlight.X = _grid.X + box.X;
|
||||||
|
_verticalHighlight.Y = _grid.Y - _upperRightCell.Height;
|
||||||
|
_verticalHighlight.Width = box.Width;
|
||||||
|
_verticalHighlight.Height = _upperRightCell.Height + box.Height + box.Y;
|
||||||
|
_verticalHighlight.Visible = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < _checkBoxes.Count; i++)
|
||||||
|
{
|
||||||
|
var box = _checkBoxes[i];
|
||||||
|
int column = (int)((Float2)box.Tag).X;
|
||||||
|
int row = (int)((Float2)box.Tag).Y;
|
||||||
|
|
||||||
|
if (!mouseOverGrid)
|
||||||
|
box.ImageColor = style.BorderSelected;
|
||||||
|
else if (selectedColumn > -1 && selectedRow > -1)
|
||||||
|
{
|
||||||
|
bool isRowOrColumn = column == selectedColumn || row == selectedRow;
|
||||||
|
box.ImageColor = style.BorderSelected * (isRowOrColumn ? 1.2f : 0.75f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,12 +92,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
|
|
||||||
// Update add button
|
// Update add button
|
||||||
var update = group.Button("Update").Button;
|
var update = group.Button("Update").Button;
|
||||||
|
group.Space(0);
|
||||||
update.TooltipText = "Refreshes the dashboard statistics";
|
update.TooltipText = "Refreshes the dashboard statistics";
|
||||||
update.Height = 16.0f;
|
update.Height = 16.0f;
|
||||||
update.Clicked += RebuildLayout;
|
update.Clicked += RebuildLayout;
|
||||||
|
|
||||||
// New locale add button
|
// New locale add button
|
||||||
var addLocale = group.Button("Add Locale...").Button;
|
var addLocale = group.Button("Add Locale...").Button;
|
||||||
|
group.Space(0);
|
||||||
addLocale.TooltipText = "Shows a locale picker and creates new localization for it with not translated string tables";
|
addLocale.TooltipText = "Shows a locale picker and creates new localization for it with not translated string tables";
|
||||||
addLocale.Height = 16.0f;
|
addLocale.Height = 16.0f;
|
||||||
addLocale.ButtonClicked += delegate(Button button)
|
addLocale.ButtonClicked += delegate(Button button)
|
||||||
@@ -167,12 +169,14 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
|
|
||||||
// Export button
|
// Export button
|
||||||
var exportLocalization = group.Button("Export...").Button;
|
var exportLocalization = group.Button("Export...").Button;
|
||||||
|
group.Space(0);
|
||||||
exportLocalization.TooltipText = "Exports the localization strings into .pot file for translation";
|
exportLocalization.TooltipText = "Exports the localization strings into .pot file for translation";
|
||||||
exportLocalization.Height = 16.0f;
|
exportLocalization.Height = 16.0f;
|
||||||
exportLocalization.Clicked += () => Export(tableEntries, allKeys);
|
exportLocalization.Clicked += () => Export(tableEntries, allKeys);
|
||||||
|
|
||||||
// Find localized strings in code button
|
// Find localized strings in code button
|
||||||
var findStringsCode = group.Button("Find localized strings in code").Button;
|
var findStringsCode = group.Button("Find localized strings in code").Button;
|
||||||
|
group.Space(0);
|
||||||
findStringsCode.TooltipText = "Searches for localized string usage in inside a project source files";
|
findStringsCode.TooltipText = "Searches for localized string usage in inside a project source files";
|
||||||
findStringsCode.Height = 16.0f;
|
findStringsCode.Height = 16.0f;
|
||||||
findStringsCode.Clicked += delegate
|
findStringsCode.Clicked += delegate
|
||||||
|
|||||||
@@ -54,7 +54,8 @@ public class ModelPrefabEditor : GenericEditor
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates the import path UI
|
// Creates the import path UI
|
||||||
Utilities.Utils.CreateImportPathUI(layout, modelPrefab.ImportPath, false);
|
var group = layout.Group("Import Path");
|
||||||
|
Utilities.Utils.CreateImportPathUI(group, modelPrefab.ImportPath);
|
||||||
|
|
||||||
var button = layout.Button("Reimport", "Reimports the source asset as prefab.");
|
var button = layout.Button("Reimport", "Reimports the source asset as prefab.");
|
||||||
_reimportButton = button.Button;
|
_reimportButton = button.Button;
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
|||||||
_infoLabel = playbackGroup.Label(string.Empty).Label;
|
_infoLabel = playbackGroup.Label(string.Empty).Label;
|
||||||
_infoLabel.AutoHeight = true;
|
_infoLabel.AutoHeight = true;
|
||||||
|
|
||||||
var grid = playbackGroup.CustomContainer<UniformGridPanel>();
|
var grid = playbackGroup.UniformGrid();
|
||||||
var gridControl = grid.CustomControl;
|
var gridControl = grid.CustomControl;
|
||||||
gridControl.ClipChildren = false;
|
gridControl.ClipChildren = false;
|
||||||
gridControl.Height = Button.DefaultHeight;
|
gridControl.Height = Button.DefaultHeight;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user