mirror of
https://github.com/godotengine/godot.git
synced 2025-10-15 02:49:24 +00:00
Compare commits
593 Commits
3.1
...
3.0.5-stab
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6a88e22423 | ||
![]() |
861d341dff | ||
![]() |
a34daf6851 | ||
![]() |
59a00c3cdd | ||
![]() |
e86ef017f2 | ||
![]() |
d4a226500b | ||
![]() |
16550339ba | ||
![]() |
84e1551c64 | ||
![]() |
af902dc042 | ||
![]() |
d99b247cc7 | ||
![]() |
139185e543 | ||
![]() |
64bcefb7cd | ||
![]() |
4ac9932128 | ||
![]() |
9190ae2be7 | ||
![]() |
a03cf8964f | ||
![]() |
4bf441c32b | ||
![]() |
b116a45f07 | ||
![]() |
d91613592b | ||
![]() |
e6df472e8f | ||
![]() |
f6abffdb4a | ||
![]() |
a1930b1772 | ||
![]() |
9530ce9d3f | ||
![]() |
3d8e49d9e8 | ||
![]() |
64419a2ea1 | ||
![]() |
34eabc0602 | ||
![]() |
ade470352c | ||
![]() |
ae48b1b94a | ||
![]() |
394838901d | ||
![]() |
f49fcc960b | ||
![]() |
2f3e4c1a7a | ||
![]() |
d04cc2855a | ||
![]() |
909eaede4c | ||
![]() |
4d7aa0b762 | ||
![]() |
98609279b6 | ||
![]() |
25047050b7 | ||
![]() |
38e6ba10b4 | ||
![]() |
e649ec71df | ||
![]() |
711aa196af | ||
![]() |
518a691231 | ||
![]() |
e8bfc09b81 | ||
![]() |
74808e71d2 | ||
![]() |
403f7dc35f | ||
![]() |
e09170dffa | ||
![]() |
f640639867 | ||
![]() |
d24f77be99 | ||
![]() |
f697b53eba | ||
![]() |
8231b3cef8 | ||
![]() |
b95cc40640 | ||
![]() |
9294978596 | ||
![]() |
3d3e4e62af | ||
![]() |
d00926894e | ||
![]() |
5d2ad1e5c7 | ||
![]() |
9945da3efc | ||
![]() |
d1e5677fe6 | ||
![]() |
49ddd7b0e7 | ||
![]() |
e29800ea7b | ||
![]() |
97ad6b813a | ||
![]() |
77542276f8 | ||
![]() |
0a3779135d | ||
![]() |
edf423a7aa | ||
![]() |
02b1586de2 | ||
![]() |
a2a136ea02 | ||
![]() |
9b8388dab1 | ||
![]() |
fbad7c2dd9 | ||
![]() |
12fe774844 | ||
![]() |
8dc021925f | ||
![]() |
6843ccf462 | ||
![]() |
b27352a401 | ||
![]() |
8461d6b5f9 | ||
![]() |
0febfa9eea | ||
![]() |
232a3a524b | ||
![]() |
b04c9a1b66 | ||
![]() |
dd026c77e3 | ||
![]() |
00bf66d7f2 | ||
![]() |
6224f02c56 | ||
![]() |
31ce9ba07f | ||
![]() |
94b4bb2a12 | ||
![]() |
188bfd2ac9 | ||
![]() |
04defcca4f | ||
![]() |
81eb60434a | ||
![]() |
6635f2a108 | ||
![]() |
1d3be8c453 | ||
![]() |
4de1d0905a | ||
![]() |
c461b15720 | ||
![]() |
5c93f887ba | ||
![]() |
9dc5ca0e7c | ||
![]() |
c7b141d20a | ||
![]() |
0b3b3de2cd | ||
![]() |
5e551a584e | ||
![]() |
fd95935fef | ||
![]() |
4fbb460a02 | ||
![]() |
4aad40d249 | ||
![]() |
8ccb27ce18 | ||
![]() |
9a0a40042e | ||
![]() |
09277c8fd8 | ||
![]() |
faceb5b75d | ||
![]() |
9dc5ba1aaf | ||
![]() |
a187fb381e | ||
![]() |
868c44b239 | ||
![]() |
10c12b37ec | ||
![]() |
ae32bcf4c3 | ||
![]() |
3491e776dd | ||
![]() |
5f632391ca | ||
![]() |
2e61ca6193 | ||
![]() |
3013f4cf2b | ||
![]() |
31c4b743cb | ||
![]() |
78e2e48d57 | ||
![]() |
736e574a5e | ||
![]() |
664052824e | ||
![]() |
0b9f61c9a6 | ||
![]() |
41bb321962 | ||
![]() |
0c030d6e08 | ||
![]() |
c8ce9c0080 | ||
![]() |
a519dcd576 | ||
![]() |
66c0be642f | ||
![]() |
2fa54c1df6 | ||
![]() |
7f65584f28 | ||
![]() |
7e09206e5c | ||
![]() |
ecb4c4268c | ||
![]() |
db76c54117 | ||
![]() |
c2a8eb2081 | ||
![]() |
5917063192 | ||
![]() |
bcb38393a5 | ||
![]() |
1905e1c8a2 | ||
![]() |
a6c9527c2f | ||
![]() |
f4c469f1b7 | ||
![]() |
196107cd9e | ||
![]() |
33b78c0ad6 | ||
![]() |
fa19d01c7b | ||
![]() |
f847837fb2 | ||
![]() |
056348a8c0 | ||
![]() |
ddbe559c04 | ||
![]() |
63e70e3cd1 | ||
![]() |
4866733a74 | ||
![]() |
01e64eb247 | ||
![]() |
4fe0a8efd8 | ||
![]() |
0551c5c2cd | ||
![]() |
e10a2e5999 | ||
![]() |
cd9b0d7cc3 | ||
![]() |
8e301c69cb | ||
![]() |
3ee4d6af2e | ||
![]() |
00c55bb2eb | ||
![]() |
fe9da69f96 | ||
![]() |
c358e4c728 | ||
![]() |
7645c539c8 | ||
![]() |
e7837828f6 | ||
![]() |
272fb05270 | ||
![]() |
41f360f9c2 | ||
![]() |
4ce6a8f5f9 | ||
![]() |
dfe6d42a01 | ||
![]() |
c20776945d | ||
![]() |
0d6c64b38a | ||
![]() |
c968c787e5 | ||
![]() |
6e658fdcc1 | ||
![]() |
aedc4a4e80 | ||
![]() |
7417b6adb4 | ||
![]() |
66b36235c9 | ||
![]() |
e317ab9abe | ||
![]() |
6a48c552e2 | ||
![]() |
a1fd60f7d2 | ||
![]() |
b5ecdd8ce8 | ||
![]() |
20ea59332f | ||
![]() |
57b895338b | ||
![]() |
2f82b67071 | ||
![]() |
56b8c4b0eb | ||
![]() |
bae5f9feb8 | ||
![]() |
e95f542204 | ||
![]() |
e7c42f132c | ||
![]() |
1608f04851 | ||
![]() |
93ebac318b | ||
![]() |
c4d66d087f | ||
![]() |
feee8ddd3c | ||
![]() |
659df8cbd8 | ||
![]() |
19a010cc3a | ||
![]() |
307fcb2713 | ||
![]() |
ec017f4c01 | ||
![]() |
f12db4013e | ||
![]() |
e53f01a7af | ||
![]() |
46de6afc40 | ||
![]() |
90bf0b7aec | ||
![]() |
6cdf6d3044 | ||
![]() |
1da969736f | ||
![]() |
486f4d2769 | ||
![]() |
199a54d5ac | ||
![]() |
57c281557a | ||
![]() |
d330bee1c2 | ||
![]() |
72bcacf2b6 | ||
![]() |
3876a8776e | ||
![]() |
37ce381e3d | ||
![]() |
939d50243b | ||
![]() |
57f18194f5 | ||
![]() |
58f2953ddf | ||
![]() |
31171ea5a2 | ||
![]() |
e7b97af276 | ||
![]() |
95004aafb2 | ||
![]() |
3f6ea30f8d | ||
![]() |
58918b629d | ||
![]() |
736d8db007 | ||
![]() |
1e8ff7460a | ||
![]() |
b5425e3d87 | ||
![]() |
3acd6fb728 | ||
![]() |
94ddb499df | ||
![]() |
5a947ebc42 | ||
![]() |
44f4c8e745 | ||
![]() |
4eed7cb9b2 | ||
![]() |
ca00323e7f | ||
![]() |
d49fc76ab8 | ||
![]() |
d89015cfe3 | ||
![]() |
826108efec | ||
![]() |
739c14b07d | ||
![]() |
7f64090401 | ||
![]() |
3bda257163 | ||
![]() |
02f767fe0d | ||
![]() |
20fa30bde6 | ||
![]() |
b5b0e42b85 | ||
![]() |
a525ea128d | ||
![]() |
3b57b95efb | ||
![]() |
4002da9603 | ||
![]() |
e5a17617e6 | ||
![]() |
4e756d61c8 | ||
![]() |
0f5a3d23ea | ||
![]() |
2e31c9fe10 | ||
![]() |
cf3c1d878d | ||
![]() |
c5dfe6824c | ||
![]() |
640063334d | ||
![]() |
ac9e87aae3 | ||
![]() |
5e09cf3e89 | ||
![]() |
6989a7ac53 | ||
![]() |
060f9f2cd7 | ||
![]() |
4c19fc2eb1 | ||
![]() |
5e70e4469a | ||
![]() |
287f169f2a | ||
![]() |
60bc0f79a7 | ||
![]() |
c8d0d38cab | ||
![]() |
d3ffc8ad0c | ||
![]() |
393e1ef4ee | ||
![]() |
78b44eab0a | ||
![]() |
0f6626977b | ||
![]() |
71885e5ae4 | ||
![]() |
038c4d3a83 | ||
![]() |
de66976ff0 | ||
![]() |
b08aa6fb3c | ||
![]() |
ce944bc3fb | ||
![]() |
5485939233 | ||
![]() |
3cc2eee4e8 | ||
![]() |
56395b03e1 | ||
![]() |
448d281222 | ||
![]() |
c07d588e80 | ||
![]() |
52c710f25a | ||
![]() |
29a02a78df | ||
![]() |
91525e3075 | ||
![]() |
7563c17113 | ||
![]() |
43dcf23990 | ||
![]() |
1182637ec9 | ||
![]() |
d40f40e1c9 | ||
![]() |
fa831f0224 | ||
![]() |
141e389c3f | ||
![]() |
72350eebb2 | ||
![]() |
80fbea28fb | ||
![]() |
7ec8a6e756 | ||
![]() |
ddb31e9c5a | ||
![]() |
dc97f91a18 | ||
![]() |
171542d96a | ||
![]() |
b855bc44ae | ||
![]() |
c39e32ae60 | ||
![]() |
5eef26b64e | ||
![]() |
0d2a2a9300 | ||
![]() |
6d767b0f9a | ||
![]() |
d49579b038 | ||
![]() |
a3ba1b0280 | ||
![]() |
c2e02e2066 | ||
![]() |
3503ee4be6 | ||
![]() |
069b429795 | ||
![]() |
2f7aa6c2aa | ||
![]() |
a29680c25a | ||
![]() |
3a430e46b9 | ||
![]() |
b4733a1da9 | ||
![]() |
8ebd4bb874 | ||
![]() |
63a88c69ac | ||
![]() |
bfc94dd4c9 | ||
![]() |
6472d8c7d4 | ||
![]() |
e4fadebc3b | ||
![]() |
548ec63f76 | ||
![]() |
9e4d34aebb | ||
![]() |
d02c891a4b | ||
![]() |
3bd414786c | ||
![]() |
c7adcc8dca | ||
![]() |
577f3ccaf9 | ||
![]() |
bffd4f0548 | ||
![]() |
4c8c383876 | ||
![]() |
125b403c0f | ||
![]() |
5f5ec7e162 | ||
![]() |
a91d9cb918 | ||
![]() |
a7ea441504 | ||
![]() |
4b5472b100 | ||
![]() |
3dc4447cb8 | ||
![]() |
9a21f964ba | ||
![]() |
1f07f71b6c | ||
![]() |
259b9664ef | ||
![]() |
b5a55810c5 | ||
![]() |
4fc6256010 | ||
![]() |
ce1b62a01f | ||
![]() |
28d4271e3e | ||
![]() |
30b5265417 | ||
![]() |
2f53325bed | ||
![]() |
7ad6a9aeea | ||
![]() |
8018dc6599 | ||
![]() |
aaed3ef5ed | ||
![]() |
99cf2ffb19 | ||
![]() |
3b200c55b6 | ||
![]() |
13e9b605cf | ||
![]() |
5d7b7f798a | ||
![]() |
710b57d493 | ||
![]() |
ef44ed93a7 | ||
![]() |
4f0b5f7307 | ||
![]() |
1c25e50490 | ||
![]() |
a9ec1e3913 | ||
![]() |
46101928bd | ||
![]() |
74e72c995d | ||
![]() |
b6f30f1b5b | ||
![]() |
b09d06fcf7 | ||
![]() |
9567297a66 | ||
![]() |
607884139c | ||
![]() |
42f351db0d | ||
![]() |
9ab9dd73b0 | ||
![]() |
fa9e03996c | ||
![]() |
814b610ed3 | ||
![]() |
a5ccaa919e | ||
![]() |
5042d0c30a | ||
![]() |
27f5e404a7 | ||
![]() |
2e9c9f7d74 | ||
![]() |
6063e74e06 | ||
![]() |
449e75455b | ||
![]() |
73cc3a96c0 | ||
![]() |
683511310e | ||
![]() |
12336dc253 | ||
![]() |
8da76f3bb8 | ||
![]() |
8289f8628d | ||
![]() |
91bc845152 | ||
![]() |
d8a0b6ba63 | ||
![]() |
bf4d8ee69c | ||
![]() |
2c93def09d | ||
![]() |
9cbcff4e91 | ||
![]() |
985b84689f | ||
![]() |
89e4125241 | ||
![]() |
209acbaac7 | ||
![]() |
8a0966a8cb | ||
![]() |
99331ca395 | ||
![]() |
ec362d54a9 | ||
![]() |
5e8e2a8730 | ||
![]() |
df7d60a9d3 | ||
![]() |
fe20a1e35b | ||
![]() |
55a66efa38 | ||
![]() |
5eebe51014 | ||
![]() |
9febb6f747 | ||
![]() |
626525d23a | ||
![]() |
a026e2626c | ||
![]() |
cf2e30b30c | ||
![]() |
f7efa9d43a | ||
![]() |
dfb739aff0 | ||
![]() |
89bff17cd2 | ||
![]() |
3e1716b2c3 | ||
![]() |
e6200de73a | ||
![]() |
593e616a48 | ||
![]() |
eeb7385f02 | ||
![]() |
2ff3b08583 | ||
![]() |
6ab8fb04af | ||
![]() |
498d177cfe | ||
![]() |
06a60bb6ef | ||
![]() |
c0132f30c4 | ||
![]() |
649cb70ddb | ||
![]() |
65d214d3da | ||
![]() |
9ee98e999b | ||
![]() |
5bcc7f88b6 | ||
![]() |
93e99846b0 | ||
![]() |
5c2e554853 | ||
![]() |
c4468aef5d | ||
![]() |
f967334f53 | ||
![]() |
4132f2ea7e | ||
![]() |
262c97098d | ||
![]() |
cee20e24bd | ||
![]() |
87476c057a | ||
![]() |
53693e393d | ||
![]() |
3f7e036c4f | ||
![]() |
0aab429453 | ||
![]() |
61fd30c00e | ||
![]() |
44b206a3fa | ||
![]() |
675899a521 | ||
![]() |
61a9ef5d81 | ||
![]() |
9c27e4d885 | ||
![]() |
c800653c6f | ||
![]() |
3e931e258c | ||
![]() |
7e5a374825 | ||
![]() |
a850ebf352 | ||
![]() |
4e1d19b20c | ||
![]() |
d7430ef077 | ||
![]() |
17408bea9c | ||
![]() |
2c55064708 | ||
![]() |
42e82b9377 | ||
![]() |
a4b077a0ba | ||
![]() |
f6c65d9d15 | ||
![]() |
990bddcf36 | ||
![]() |
c730a6ce44 | ||
![]() |
115c0a7415 | ||
![]() |
87242c7b92 | ||
![]() |
4eb9ee9355 | ||
![]() |
48ed52184d | ||
![]() |
69274ef368 | ||
![]() |
039fc750d5 | ||
![]() |
58a7d78c22 | ||
![]() |
c0386f0124 | ||
![]() |
b6f958965b | ||
![]() |
dde14e15c6 | ||
![]() |
1ea805a4aa | ||
![]() |
3b96b3fd12 | ||
![]() |
e499b9b4b6 | ||
![]() |
8ea709a7a9 | ||
![]() |
f2e19a26f5 | ||
![]() |
be771e7165 | ||
![]() |
cb65617897 | ||
![]() |
bcbe7a8a6f | ||
![]() |
ae540c2efe | ||
![]() |
5f15642fde | ||
![]() |
17d7084780 | ||
![]() |
fe38b648b0 | ||
![]() |
ad325be5a0 | ||
![]() |
d69d58deea | ||
![]() |
34591f9451 | ||
![]() |
d79a7a2773 | ||
![]() |
05fec82f31 | ||
![]() |
370f84f41c | ||
![]() |
689dfcd9ec | ||
![]() |
46b594054c | ||
![]() |
07e2461995 | ||
![]() |
ca5f3b9f8d | ||
![]() |
3d804778fd | ||
![]() |
3e8c214a19 | ||
![]() |
e9d8dfbf0e | ||
![]() |
3687faa78f | ||
![]() |
eacd66e784 | ||
![]() |
b5f8c1a53b | ||
![]() |
f04cd405ac | ||
![]() |
f55b376d78 | ||
![]() |
fdac09a0aa | ||
![]() |
751806b5c7 | ||
![]() |
40018e995c | ||
![]() |
be6323d848 | ||
![]() |
29089b715d | ||
![]() |
7e89cc46dd | ||
![]() |
a86829211a | ||
![]() |
f01821b60a | ||
![]() |
245c11be08 | ||
![]() |
fa98637aca | ||
![]() |
723613dbc3 | ||
![]() |
99efa7ce62 | ||
![]() |
c7040f3218 | ||
![]() |
5975b44ded | ||
![]() |
8efb9c8cdd | ||
![]() |
75289b4017 | ||
![]() |
ccf27376a6 | ||
![]() |
23b9f09c58 | ||
![]() |
e1fc7776f6 | ||
![]() |
c6a96fc360 | ||
![]() |
4383fae5a4 | ||
![]() |
9cfcf102a0 | ||
![]() |
8dc946c89c | ||
![]() |
327fea741a | ||
![]() |
317cb336eb | ||
![]() |
83b76a8171 | ||
![]() |
70b082c0d9 | ||
![]() |
bbfec2a7cc | ||
![]() |
8849377f6d | ||
![]() |
149ffcb1a4 | ||
![]() |
fb4a784319 | ||
![]() |
8f231d82bb | ||
![]() |
cc280545dc | ||
![]() |
fa02b58b46 | ||
![]() |
000caef623 | ||
![]() |
b7faa76485 | ||
![]() |
a76dfe9c72 | ||
![]() |
a423adbee6 | ||
![]() |
c5b5fd61d4 | ||
![]() |
5bb269d01d | ||
![]() |
d5535d9357 | ||
![]() |
2714b851bf | ||
![]() |
2abbdcaa20 | ||
![]() |
9cba5ef772 | ||
![]() |
416cd9c8b8 | ||
![]() |
7a20495a80 | ||
![]() |
bafbd73b51 | ||
![]() |
ac6811c4fa | ||
![]() |
8372a404bb | ||
![]() |
5b04dcfabd | ||
![]() |
4b581104e7 | ||
![]() |
f49601a934 | ||
![]() |
3e6ab9f3d5 | ||
![]() |
9f9731da3a | ||
![]() |
18735ff6f2 | ||
![]() |
237cf72f89 | ||
![]() |
5c2b2ca95b | ||
![]() |
57f707f951 | ||
![]() |
2f87e7ffe9 | ||
![]() |
12da8dcdeb | ||
![]() |
c5388fb0cf | ||
![]() |
02e910275c | ||
![]() |
285f47f037 | ||
![]() |
9fb843db06 | ||
![]() |
4bdcee2b9d | ||
![]() |
fd033473c7 | ||
![]() |
a39930c5b9 | ||
![]() |
c94d8e6577 | ||
![]() |
eb5e5200cc | ||
![]() |
d54ac732ae | ||
![]() |
62fcd772be | ||
![]() |
150423203b | ||
![]() |
ef60123938 | ||
![]() |
0d03b5f162 | ||
![]() |
148e059940 | ||
![]() |
7af43c4ca3 | ||
![]() |
5b32be4701 | ||
![]() |
47b49200b0 | ||
![]() |
a7d7f763d0 | ||
![]() |
eda94419df | ||
![]() |
e6252bda5e | ||
![]() |
069658f1be | ||
![]() |
a0e59a7259 | ||
![]() |
82b9a13e0c | ||
![]() |
79ef5f92a9 | ||
![]() |
5d7867082d | ||
![]() |
fda35b3f42 | ||
![]() |
a0e9d751a3 | ||
![]() |
d4a70c6c08 | ||
![]() |
65aa9063c4 | ||
![]() |
9eb546e7ff | ||
![]() |
f031e2f665 | ||
![]() |
4bed14f69b | ||
![]() |
91692ce72a | ||
![]() |
05e97db6f2 | ||
![]() |
617bcd1b91 | ||
![]() |
34d8625d82 | ||
![]() |
79b931d093 | ||
![]() |
9173819b71 | ||
![]() |
8787850286 | ||
![]() |
2515d42a14 | ||
![]() |
1a9a40fe31 | ||
![]() |
eda3169cd1 | ||
![]() |
d7f73031fb | ||
![]() |
ba36ef5465 | ||
![]() |
41f9904e71 | ||
![]() |
a206d3d2fc | ||
![]() |
a6ca62ac79 | ||
![]() |
85dedc09a8 | ||
![]() |
9e7c3016d1 | ||
![]() |
906cf28dae | ||
![]() |
801b544ee1 | ||
![]() |
097f95993f | ||
![]() |
c04d868476 | ||
![]() |
50674dbe15 | ||
![]() |
71607d9198 | ||
![]() |
3548f71cc4 | ||
![]() |
a1455f6a03 | ||
![]() |
f64b68d870 | ||
![]() |
f1d26c1c72 | ||
![]() |
7f5fde6459 | ||
![]() |
611caa06a5 | ||
![]() |
3f6e8d70cf | ||
![]() |
40c779fb70 | ||
![]() |
532abf228c | ||
![]() |
248fea2a79 | ||
![]() |
7de47fbabb | ||
![]() |
62dc7ba82f | ||
![]() |
4a3a597377 | ||
![]() |
501880e9ba | ||
![]() |
bd02969263 | ||
![]() |
0fa4325153 | ||
![]() |
acf01c955f | ||
![]() |
0a75a38db4 | ||
![]() |
845f44b976 | ||
![]() |
77ee4ced30 | ||
![]() |
780a7a281b | ||
![]() |
5481ece976 | ||
![]() |
ef49c166f6 | ||
![]() |
77cc0a023b | ||
![]() |
1036a76bc5 | ||
![]() |
e44bef4404 | ||
![]() |
c77047d6a3 | ||
![]() |
a34afa3820 | ||
![]() |
77d27053c3 | ||
![]() |
187c40d64d | ||
![]() |
e69b30b276 | ||
![]() |
99e72894a2 | ||
![]() |
258119a9cf | ||
![]() |
3f6694b894 |
@@ -17,7 +17,8 @@ cache:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
- SET "PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
|
- SET "PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
|
||||||
- pip install --egg scons # it will fail on AppVeyor without --egg flag
|
- pip install -U wheel # needed for pip install scons to work, otherwise a flag is missing
|
||||||
|
- pip install scons
|
||||||
- if defined VS call "%VS%" %ARCH% # if defined - so we can also use mingw
|
- if defined VS call "%VS%" %ARCH% # if defined - so we can also use mingw
|
||||||
|
|
||||||
before_build:
|
before_build:
|
||||||
|
@@ -4,6 +4,7 @@ root = true
|
|||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
indent_style = tab
|
indent_style = tab
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
[*.{cpp,hpp,c,h,mm}]
|
[*.{cpp,hpp,c,h,mm}]
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -17,6 +17,8 @@ platform/android/java/build.gradle
|
|||||||
platform/android/java/AndroidManifest.xml
|
platform/android/java/AndroidManifest.xml
|
||||||
platform/android/java/libs/*
|
platform/android/java/libs/*
|
||||||
platform/android/java/assets
|
platform/android/java/assets
|
||||||
|
platform/android/java/.idea/*
|
||||||
|
platform/android/java/*.iml
|
||||||
|
|
||||||
# General c++ generated files
|
# General c++ generated files
|
||||||
*.lib
|
*.lib
|
||||||
@@ -44,6 +46,7 @@ gmon.out
|
|||||||
# QT project files
|
# QT project files
|
||||||
*.config
|
*.config
|
||||||
*.creator
|
*.creator
|
||||||
|
*.creator.*
|
||||||
*.files
|
*.files
|
||||||
*.includes
|
*.includes
|
||||||
|
|
||||||
|
@@ -36,6 +36,9 @@ matrix:
|
|||||||
#- env: GODOT_TARGET=iphone TOOLS=no CACHE_NAME=${GODOT_TARGET}-clang
|
#- env: GODOT_TARGET=iphone TOOLS=no CACHE_NAME=${GODOT_TARGET}-clang
|
||||||
# os: osx
|
# os: osx
|
||||||
# compiler: clang
|
# compiler: clang
|
||||||
|
- env: GODOT_TARGET=server TOOLS=no CACHE_NAME=${GODOT_TARGET}-clang"
|
||||||
|
os: linux
|
||||||
|
compiler: clang
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
|
12
AUTHORS.md
12
AUTHORS.md
@@ -38,6 +38,7 @@ name is available.
|
|||||||
Ariel Manzur (punto-)
|
Ariel Manzur (punto-)
|
||||||
Bastiaan Olij (BastiaanOlij)
|
Bastiaan Olij (BastiaanOlij)
|
||||||
Ben Brookshire (sheepandshepherd)
|
Ben Brookshire (sheepandshepherd)
|
||||||
|
Benjamin (Nallebeorn)
|
||||||
Bernard Liebl (poke1024)
|
Bernard Liebl (poke1024)
|
||||||
Bojidar Marinov (bojidar-bg)
|
Bojidar Marinov (bojidar-bg)
|
||||||
Błażej Szczygieł (zaps166)
|
Błażej Szczygieł (zaps166)
|
||||||
@@ -61,6 +62,7 @@ name is available.
|
|||||||
Hubert Jarosz (Marqin)
|
Hubert Jarosz (Marqin)
|
||||||
Hugo Locurcio (Calinou)
|
Hugo Locurcio (Calinou)
|
||||||
Ian Bishop (ianb96)
|
Ian Bishop (ianb96)
|
||||||
|
Ibrahn Sahir (ibrahn)
|
||||||
Ignacio Etcheverry (neikeq)
|
Ignacio Etcheverry (neikeq)
|
||||||
Indah Sylvia (ISylvox)
|
Indah Sylvia (ISylvox)
|
||||||
J08nY
|
J08nY
|
||||||
@@ -70,12 +72,15 @@ name is available.
|
|||||||
Joshua Grams (JoshuaGrams)
|
Joshua Grams (JoshuaGrams)
|
||||||
Juan Linietsky (reduz)
|
Juan Linietsky (reduz)
|
||||||
Julian Murgia (StraToN)
|
Julian Murgia (StraToN)
|
||||||
|
Justo Delgado (mrcdk)
|
||||||
|
Kelly Thomas (KellyThomas)
|
||||||
Kostadin Damyanov (Max-Might)
|
Kostadin Damyanov (Max-Might)
|
||||||
Leon Krause (eska014)
|
Leon Krause (eska014)
|
||||||
Marc Gilleron (Zylann)
|
Marc Gilleron (Zylann)
|
||||||
Marcelo Fernandez (marcelofg55)
|
Marcelo Fernandez (marcelofg55)
|
||||||
Mariano Javier Suligoy (MarianoGnu)
|
Mariano Javier Suligoy (MarianoGnu)
|
||||||
Mario Schlack (hurikhan)
|
Mario Schlack (hurikhan)
|
||||||
|
Martin Sjursen (binbitten)
|
||||||
Masoud BH (masoudbh3)
|
Masoud BH (masoudbh3)
|
||||||
Matthias Hölzl (hoelzl)
|
Matthias Hölzl (hoelzl)
|
||||||
Max Hilbrunner (mhilbrunner)
|
Max Hilbrunner (mhilbrunner)
|
||||||
@@ -83,16 +88,20 @@ name is available.
|
|||||||
Nathan Warden (NathanWarden)
|
Nathan Warden (NathanWarden)
|
||||||
Nuno Donato (nunodonato)
|
Nuno Donato (nunodonato)
|
||||||
Ovnuniarchos
|
Ovnuniarchos
|
||||||
|
Pascal Richter (ShyRed)
|
||||||
Patrick (firefly2442)
|
Patrick (firefly2442)
|
||||||
Paul Batty (Paulb23)
|
Paul Batty (Paulb23)
|
||||||
|
Paul Joannon (paulloz)
|
||||||
Pawel Kowal (pkowal1982)
|
Pawel Kowal (pkowal1982)
|
||||||
Pedro J. Estébanez (RandomShaper)
|
Pedro J. Estébanez (RandomShaper)
|
||||||
|
Pieter-Jan Briers (PJB3005)
|
||||||
Poommetee Ketson (Noshyaar)
|
Poommetee Ketson (Noshyaar)
|
||||||
Przemysław Gołąb (n-pigeon)
|
Przemysław Gołąb (n-pigeon)
|
||||||
Ralf Hölzemer (rollenrolm)
|
Ralf Hölzemer (rollenrolm)
|
||||||
Ramesh Ravone (RameshRavone)
|
Ramesh Ravone (RameshRavone)
|
||||||
Ray Koopa (RayKoopa)
|
Ray Koopa (RayKoopa)
|
||||||
Rémi Verschelde (akien-mga)
|
Rémi Verschelde (akien-mga)
|
||||||
|
Roberto F. Arroyo (robfram)
|
||||||
Ruslan Mustakov (endragor)
|
Ruslan Mustakov (endragor)
|
||||||
Saniko (sanikoyes)
|
Saniko (sanikoyes)
|
||||||
SaracenOne
|
SaracenOne
|
||||||
@@ -104,6 +113,7 @@ name is available.
|
|||||||
Wilhem Barbier (nounoursheureux)
|
Wilhem Barbier (nounoursheureux)
|
||||||
Will Nations (willnationsdev)
|
Will Nations (willnationsdev)
|
||||||
Wilson E. Alvarez (Rubonnek)
|
Wilson E. Alvarez (Rubonnek)
|
||||||
|
Xavier Cho (mysticfall)
|
||||||
Yuri Roubinski (Chaosus)
|
Yuri Roubinski (Chaosus)
|
||||||
Zher Huei Lee (leezh)
|
Zher Huei Lee (leezh)
|
||||||
ZuBsPaCe
|
ZuBsPaCe
|
||||||
@@ -113,7 +123,7 @@ name is available.
|
|||||||
m4nu3lf
|
m4nu3lf
|
||||||
marynate
|
marynate
|
||||||
mrezai
|
mrezai
|
||||||
rraallvv
|
|
||||||
romulox-x
|
romulox-x
|
||||||
|
rraallvv
|
||||||
sersoong
|
sersoong
|
||||||
yg2f (SuperUserNameMan)
|
yg2f (SuperUserNameMan)
|
||||||
|
270
CHANGELOG.md
Normal file
270
CHANGELOG.md
Normal file
@@ -0,0 +1,270 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
|
## [3.0.5] - 2016-07-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- 'android_add_asset_dir('...') method to Android module gradle build config.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Android exporter no longer writes unnecessary permissions to the exported APK.
|
||||||
|
- Segfault when quitting the editor.
|
||||||
|
- Debugger 'focus stealing' now works more reliably.
|
||||||
|
- Subresources are now always saved when saving a scene.
|
||||||
|
- WebAssembly: Supply proper CORS heards.
|
||||||
|
- Mono: Annotated signal loading in exported projects.
|
||||||
|
- Mono: Serveral fixes.
|
||||||
|
|
||||||
|
## [3.0.4] - 2018-06-23
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Fix for Bullet's heightmap collider.
|
||||||
|
- Several documentation fixes.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Threading problem causing asset library to crash on low threadcount systems.
|
||||||
|
|
||||||
|
## [3.0.3] - 2018-06-13
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- C# projects can now be exported for Windows, Linux, and MacOS targets.
|
||||||
|
- Universal translation of touch to mouse.
|
||||||
|
- Dynamic fonts can now have a hinting mode set.
|
||||||
|
- print_tree_pretty() was added allowing a graphical view of the scene tree.
|
||||||
|
- Restore purchases feature for iOS.
|
||||||
|
- AudioStreamPlayer, AudioStreamPlayer2D, and AudioStreamPlayer3D now have a pitch scale property.
|
||||||
|
- Show origin and Show viewport setting in 2D editor.
|
||||||
|
- You can now set Godot windows as 'always on top'.
|
||||||
|
- --print-fps options to print FPS to stdout.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Mono: Signal parameters no longer crash the engine.
|
||||||
|
- Asset library thread usage, this makes the asset library more responsive.
|
||||||
|
- Several GLTF import fixes.
|
||||||
|
- Several memory leaks.
|
||||||
|
- iPhone X support.
|
||||||
|
- Several fixes to audio drivers (WASAPI and PulseAudio).
|
||||||
|
- Several crashes.
|
||||||
|
- Export PCK/ZIP now works again.
|
||||||
|
|
||||||
|
## [3.0.2] - 2018-03-03
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Mono: We now display stack traces for inner exceptions.
|
||||||
|
- Mono: Bundle mscorlib.dll with Godot to improve portability.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Running a scene from a project with a main scene now works again (regression in 3.0.1).
|
||||||
|
- Correct line spacing in RichTextLabel (regression in 3.0.1).
|
||||||
|
- TextureProgress now correctly displays when progress > 62 (regression in 3.0.1).
|
||||||
|
- The editor no longer complains about using an enum from an autoloaded resource (regression in 3.0.1).
|
||||||
|
- Pressing Escape no longer closes unexpected subwindows (regression in 3.0.1).
|
||||||
|
- Fix spelling of `apply_torque_impulse()` and deprecate the misspelled method.
|
||||||
|
- Gizmos are now properly hidden on scene load if the object they control is hidden.
|
||||||
|
- Remove spurious errors when using a PanoramaSky without textures.
|
||||||
|
- Show tooltips in the editor when physics object picking is disabled.
|
||||||
|
- Fix a serialization bug that could cause tscn files to grow very large.
|
||||||
|
- Do not show the project manager unless no project was found at all.
|
||||||
|
- The animation editor time offset indicator no longer 'walks' when resizing the editor.
|
||||||
|
- Allow creation of an in-tscn file GDScript function even if the filename suggested already exists.
|
||||||
|
- Mono: Godot no longer crashes when opening a project created with an older release.
|
||||||
|
- Mono: Fix builds of tools=no builds.
|
||||||
|
- Mono: Fix transformation regression since 3.0.1
|
||||||
|
- Android: We now require GLESv3 support in the manifest.
|
||||||
|
- Android: Fix intermittent audio driver crash.
|
||||||
|
|
||||||
|
## [3.0.1] - 2018-02-25
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The 'server' platform is back as it was in Godot 2.1.
|
||||||
|
- It is now again possible to run a headless Godot on Linux.
|
||||||
|
- New CLI options
|
||||||
|
- --build-solutions: build C# solutions without starting the editor.
|
||||||
|
- --quit: quit the engine after the first main loop iteration.
|
||||||
|
- It is now possible to scale an .obj mesh when importing.
|
||||||
|
- Type icons can now be enabled in the editor again.
|
||||||
|
- New GLSL built-in functions in the shader language
|
||||||
|
- radians
|
||||||
|
- degrees
|
||||||
|
- asinh
|
||||||
|
- acosh
|
||||||
|
- atanh
|
||||||
|
- exp2
|
||||||
|
- log2
|
||||||
|
- roundEven
|
||||||
|
- New GDScript features
|
||||||
|
- `OS.center_window()`.
|
||||||
|
- `StreamPeerTCP.set_no_delay()`.
|
||||||
|
- `EditorPlugin.remove_control_from_container()`.
|
||||||
|
- A button has been added to the debugger to copy the error messages.
|
||||||
|
- The Ctrl toggles snapping in the 3D viewport.
|
||||||
|
- Support has been added for a new .escn, for use with the new Blender exporter.
|
||||||
|
- CA certificates have been updated to the latest Mozilla bundle.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Copy/pasting from the editor on X11 will now work more reliably.
|
||||||
|
- The lightmap baker will now use all available cores on Windows.
|
||||||
|
- Fixed missing text in some FileDialog buttons.
|
||||||
|
- Fixes to HTTP requests on the HTML5 platform.
|
||||||
|
- Many, many fixes and improvements to C# support (including a [Signal] attribute).
|
||||||
|
- Static linking of `libgcc_s` as well as `libstdc++` for better Linux binary portability.
|
||||||
|
- Fix broken APK expansion on Android.
|
||||||
|
- Several crashes in the editor have been fixed.
|
||||||
|
- Many documentation fixes.
|
||||||
|
- Several hiDPI fixes.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Bullet physics now correctly calculates effective gravity on KinematicBodies.
|
||||||
|
- Setting the color `v` member now correctly sets the `s` member.
|
||||||
|
- RichTextLabels now correctly determine the baseline for all fonts.
|
||||||
|
- SpinBoxes now correctly calculate their initial size.
|
||||||
|
- OGG streams now correctly signal the end of playback.
|
||||||
|
|
||||||
|
## [3.0] - 2018-01-29
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Physically-based renderer using OpenGL ES 3.0.
|
||||||
|
- Uses the Disney PBR model, with clearcoat, sheen and anisotropy parameters available.
|
||||||
|
- Uses a forward renderer, supporting multi-sample anti-aliasing (MSAA).
|
||||||
|
- Parallax occlusion mapping.
|
||||||
|
- Reflection probes.
|
||||||
|
- Screen-space reflections.
|
||||||
|
- Real-time global illumination using voxel cone tracing (GIProbe).
|
||||||
|
- Proximity fade and distance fade (useful for creating soft particles and various effects).
|
||||||
|
- [Lightmapper](https://godotengine.org/article/introducing-new-last-minute-lightmapper) for lower-end desktop and mobile platforms, as an alternative to GIProbe.
|
||||||
|
- New SpatialMaterial resource, replacing FixedMaterial.
|
||||||
|
- Multiple passes can now be specified (with an optional "grow" property), allowing for effects such as cel shading.
|
||||||
|
- Brand new 3D post-processing system.
|
||||||
|
- Depth of field (near and far).
|
||||||
|
- Fog, supporting light transmittance, sun-oriented fog, depth fog and height fog.
|
||||||
|
- Tonemapping and Auto-exposure.
|
||||||
|
- Screen-space ambient occlusion.
|
||||||
|
- Multi-stage glow and bloom, supporting optional bicubic upscaling for better quality.
|
||||||
|
- Color grading and various adjustments.
|
||||||
|
- Rewritten audio engine from scratch.
|
||||||
|
- Supports audio routing with arbitrary number of channels, including Area-based audio redirection ([video](https://youtu.be/K2XOBaJ5OQ0)).
|
||||||
|
- More than a dozen of audio effects included.
|
||||||
|
- Rewritten 3D physics using [Bullet](http://bulletphysics.org/).
|
||||||
|
- UDP-based high-level networking API using [ENet](http://enet.bespin.org/).
|
||||||
|
- IPv6 support for all of the engine's networking APIs.
|
||||||
|
- Visual scripting.
|
||||||
|
- Rewritten import system.
|
||||||
|
- Assets are now referenced with their source files, then imported in a transparent manner by the engine.
|
||||||
|
- Imported assets are now cached in a `.import` directory, making distribution and versioning easier.
|
||||||
|
- Support for ETC2 compression.
|
||||||
|
- Support for uncompressed Targa (.tga) textures, allowing for faster importing.
|
||||||
|
- Rewritten export system.
|
||||||
|
- GPU-based texture compression can now be tweaked per-target.
|
||||||
|
- Support for exporting resource packs to build DLC / content addons.
|
||||||
|
- Improved GDScript.
|
||||||
|
- Pattern matching using the `match` keyword.
|
||||||
|
- `$` shorthand for `get_node()`.
|
||||||
|
- Setters and getters for node properties.
|
||||||
|
- Underscores in number literals are now allowed for improved readability (for example,`1_000_000`).
|
||||||
|
- Improved performance (+20% to +40%, based on various benchmarks).
|
||||||
|
- [Feature tags](http://docs.godotengine.org/en/latest/learning/workflow/export/feature_tags.html) in the Project Settings, for custom per-platform settings.
|
||||||
|
- Full support for the [glTF 2.0](https://www.khronos.org/gltf/) 3D interchange format.
|
||||||
|
- Freelook and fly navigation to the 3D editor.
|
||||||
|
- Built-in editor logging (logging standard output to a file), disabled by default.
|
||||||
|
- Improved, more intuitive file chooser in the editor.
|
||||||
|
- Smoothed out 3D editor zooming, panning and movement.
|
||||||
|
- Toggleable rendering information box in the 3D editor viewport.
|
||||||
|
- FPS display can also be enabled in the editor viewport.
|
||||||
|
- Ability to render the 3D editor viewport at half resolution to achieve better performance.
|
||||||
|
- GDNative for binding languages like C++ to Godot as dynamic libraries.
|
||||||
|
- Community bindings for [D](https://github.com/GodotNativeTools/godot-d), [Nim](https://github.com/pragmagic/godot-nim) and [Python](https://github.com/touilleMan/godot-python) are available.
|
||||||
|
- Editor settings and export templates are now versioned, making it easier to use several Godot versions on the same system.
|
||||||
|
- Optional soft shadows for 2D rendering.
|
||||||
|
- HDR sky support.
|
||||||
|
- Ability to toggle V-Sync while the project is running.
|
||||||
|
- Panorama sky support (sphere maps).
|
||||||
|
- Support for WebM videos (VP8/VP9 with Vorbis/Opus).
|
||||||
|
- Exporting to HTML5 using WebAssembly.
|
||||||
|
- C# support using Mono.
|
||||||
|
- The Mono module is disabled by default, and needs to be compiled in at build-time.
|
||||||
|
- The latest Mono version (5.4) can be used, fully supporting C# 7.0.
|
||||||
|
- Support for rasterizing SVG to images on-the-fly, using the nanosvg library.
|
||||||
|
- Editor icons are now in SVG format, making them better-looking at non-integer scales.
|
||||||
|
- Due to the library used, only simpler SVGs are well-supported, more complex SVGs may not render correctly.
|
||||||
|
- Support for oversampling DynamicFonts, keeping them sharp when scaled to high resolutions.
|
||||||
|
- Improved StyleBoxFlat.
|
||||||
|
- Border widths can now be set per-corner.
|
||||||
|
- Support for anti-aliased rounded and beveled corners.
|
||||||
|
- Support for soft drop shadows.
|
||||||
|
- VeryLoDPI (75%) and MiDPI (150%) scaling modes for the editor.
|
||||||
|
- Improved internationalization support for projects.
|
||||||
|
- Language changes are now effective without reloading the current scene.
|
||||||
|
- Implemented missing features in the HTML5 platform.
|
||||||
|
- Cursor style changes.
|
||||||
|
- Cursor capturing and hiding.
|
||||||
|
- Improved styling and presentation of HTML5 exports.
|
||||||
|
- A spinner is now displayed during loading.
|
||||||
|
- Rewritten the 2D and 3D particle systems.
|
||||||
|
- Particles are now GPU-based, allowing their use in much higher quantities than before.
|
||||||
|
- Meshes can now be used as particles.
|
||||||
|
- Particles can now be emitted from a mesh's shape.
|
||||||
|
- Properties can now be modified over time using an editable curve.
|
||||||
|
- Custom particle shaders can now be used.
|
||||||
|
- New editor theme, with customizable base color, highlight color and contrast.
|
||||||
|
- A light editor theme option is now available, with icons suited to light backgrounds.
|
||||||
|
- Alternative dark gray and Arc colors are available out of the box.
|
||||||
|
- New adaptive text editor theme, adjusting automatically based on the editor colors.
|
||||||
|
- Support for macOS trackpad gestures in the editor.
|
||||||
|
- Exporting to macOS now creates a `.dmg` disk image if exporting from an editor running on macOS.
|
||||||
|
- Signing the macOS export now is possible if running macOS (requires a valid code signing certificate).
|
||||||
|
- Exporting to Windows now changes the exported project's icon using `rcedit` (requires WINE if exporting from Linux or macOS).
|
||||||
|
- Improved build system.
|
||||||
|
- Support for compiling using Visual Studio 2017.
|
||||||
|
- [SCons](http://scons.org/) 3.0 and Python 3 are now supported (SCons 2.5 and Python 2.7 still work).
|
||||||
|
- Link-time optimization can now be enabled by passing `use_lto=yes` to the SCons command line.
|
||||||
|
- Produces faster and sometimes smaller binaries.
|
||||||
|
- Currently only supported with GCC and MSVC.
|
||||||
|
- Added a progress percentage when compiling Godot.
|
||||||
|
- `.zip` archives are automatically created when compiling HTML5 export templates.
|
||||||
|
- Easier and more powerful way to create editor plugins with EditorPlugin and related APIs.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Increased the default low-processor-usage mode FPS limit (60 → 125).
|
||||||
|
- This makes the editor smoother and more responsive.
|
||||||
|
- Increased the default 3D editor camera's field of view (55 → 70).
|
||||||
|
- Increased the default 3D Camera node's field of view (65 → 70).
|
||||||
|
- Changed the default editor font (Droid Sans → [Noto Sans](https://www.google.com/get/noto/)).
|
||||||
|
- Changed the default script editor font (Source Code Pro → [Hack](http://sourcefoundry.org/hack/))
|
||||||
|
- Renamed `engine.cfg` to `project.godot`.
|
||||||
|
- This allows users to open a project by double-clicking the file if Godot is associated to `.godot` files.
|
||||||
|
- Some methods from the `OS` singleton were moved to the new `Engine` singleton.
|
||||||
|
- Switched from [GLEW](http://glew.sourceforge.net/) to [GLAD](http://glad.dav1d.de/) for OpenGL wrapping.
|
||||||
|
- Changed the SCons build flag for simple logs (`colored=yes` → `verbose=no`).
|
||||||
|
- The HTML5 platform now uses WebGL 2.0 (instead of 1.0).
|
||||||
|
- Redesigned the Godot logo to be more legible at small sizes.
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- `opacity` and `self_opacity` are replaced by `modulate` and `self_modulate` in all 2D nodes, allowing for full color changes in addition to opacity changes.
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
- Skybox support.
|
||||||
|
- Replaced with panorama skies, which are easier to import.
|
||||||
|
- Opus audio codec support.
|
||||||
|
- This is due to the way the new audio engine is designed.
|
||||||
|
- HTML5 export using asm.js.
|
||||||
|
- Only WebAssembly is supported now, since all browsers supporting WebGL 2.0 also support WebAssembly.
|
||||||
|
|
||||||
|
[3.0]: https://github.com/godotengine/godot/compare/2.1-stable...3.0-stable
|
@@ -157,7 +157,7 @@ License: OFL-1.1
|
|||||||
|
|
||||||
Files: ./thirdparty/fonts/Hack_Regular.ttf
|
Files: ./thirdparty/fonts/Hack_Regular.ttf
|
||||||
Comment: Hack font
|
Comment: Hack font
|
||||||
Copyright: 2017, Source Foundry Authors
|
Copyright: 2018, Source Foundry Authors
|
||||||
2003, Bitstream Inc.
|
2003, Bitstream Inc.
|
||||||
License: Expat and Bitstream Vera Fonts Copyright
|
License: Expat and Bitstream Vera Fonts Copyright
|
||||||
|
|
||||||
|
172
DONORS.md
172
DONORS.md
@@ -18,25 +18,32 @@ generous deed immortalized in the next stable release of Godot Engine.
|
|||||||
|
|
||||||
Gamblify <https://www.gamblify.com>
|
Gamblify <https://www.gamblify.com>
|
||||||
GameDev.TV <https://www.gamedev.tv>
|
GameDev.TV <https://www.gamedev.tv>
|
||||||
|
Skirmish <https://skirmish.io>
|
||||||
|
|
||||||
## Mini sponsors
|
## Mini sponsors
|
||||||
|
|
||||||
Andreas
|
|
||||||
Brandon Lamb
|
Brandon Lamb
|
||||||
Christian Uldall Pedersen
|
Christian Uldall Pedersen
|
||||||
|
Christopher Igoe
|
||||||
Christoph Woinke
|
Christoph Woinke
|
||||||
|
Claudiu Dumitru
|
||||||
E Hewert
|
E Hewert
|
||||||
Hein-Pieter van Braam
|
Hein-Pieter van Braam
|
||||||
|
Igors Vaitkus
|
||||||
Jamal Alyafei
|
Jamal Alyafei
|
||||||
Jordan M Lucas
|
Jay Sistar
|
||||||
Matthieu Huvé
|
Matthieu Huvé
|
||||||
|
Mike King
|
||||||
Nathan Warden
|
Nathan Warden
|
||||||
Neal Gompa (Conan Kudo)
|
Neal Gompa (Conan Kudo)
|
||||||
Pascal Julien
|
Pascal Julien
|
||||||
Ruslan Mustakov
|
Ruslan Mustakov
|
||||||
|
Sébastien Manin
|
||||||
Slobodan Milnovic
|
Slobodan Milnovic
|
||||||
Stephan Lanfermann
|
Stephan Lanfermann
|
||||||
|
Stoney Meyerhoeffer
|
||||||
Thomas Mathews
|
Thomas Mathews
|
||||||
|
VilliHaukka
|
||||||
|
|
||||||
## Gold donors
|
## Gold donors
|
||||||
|
|
||||||
@@ -44,169 +51,240 @@ generous deed immortalized in the next stable release of Godot Engine.
|
|||||||
Alexander Otto
|
Alexander Otto
|
||||||
Asdf
|
Asdf
|
||||||
cheese65536
|
cheese65536
|
||||||
Jake Bo
|
K9Kraken
|
||||||
|
Kris Michael
|
||||||
Manuele Finocchiaro
|
Manuele Finocchiaro
|
||||||
|
Nathanael Beisiegel
|
||||||
Officine Pixel S.n.c.
|
Officine Pixel S.n.c.
|
||||||
Rémi Verschelde
|
|
||||||
Zaven Muradyan
|
Zaven Muradyan
|
||||||
|
|
||||||
|
Allen Schade
|
||||||
Andreas Schüle
|
Andreas Schüle
|
||||||
Austen McRae
|
Austen McRae
|
||||||
Benjamin Botwin
|
|
||||||
Bernhard Liebl
|
Bernhard Liebl
|
||||||
Cody Brocious
|
Catalin Moldovan
|
||||||
Gerald E Butler
|
DeepSquid
|
||||||
Jahn Johansen
|
Fidget Sinner
|
||||||
|
Florian Breisch
|
||||||
|
Gary Oberbrunner
|
||||||
Johannes Wuensch
|
Johannes Wuensch
|
||||||
Kris Michael
|
Josep G. Camarasa
|
||||||
|
Joshua Lesperance
|
||||||
Libre-Dépanne
|
Libre-Dépanne
|
||||||
|
Matthew Bennett
|
||||||
|
Olafur Gislason
|
||||||
|
Paul LaMotte
|
||||||
Ranoller
|
Ranoller
|
||||||
Svenne Krap
|
Svenne Krap
|
||||||
|
Timothy Hagberg
|
||||||
|
|
||||||
BanjoNode2D
|
BanjoNode2D
|
||||||
|
Beliar
|
||||||
Chris Serino
|
Chris Serino
|
||||||
Conrad Curry
|
Conrad Curry
|
||||||
Craig Smith
|
Craig Smith
|
||||||
|
Daniel Egger
|
||||||
David Churchill
|
David Churchill
|
||||||
Dean Harmon
|
Dean Harmon
|
||||||
|
Dexter Miguel
|
||||||
Guilherme Felipe de C. G. da Silva
|
Guilherme Felipe de C. G. da Silva
|
||||||
Henrique Alves
|
John
|
||||||
|
Justo Delgado Baudí
|
||||||
|
KTL
|
||||||
Laurence Bannister
|
Laurence Bannister
|
||||||
Przemysław Gołąb (n-pigeon)
|
Rami
|
||||||
Robert Willes
|
Robert Willes
|
||||||
Robin Arys
|
Robin Arys
|
||||||
|
Ronnie Ashlock
|
||||||
|
Rufus Xavier Sarsaparilla
|
||||||
ScottMakesGames
|
ScottMakesGames
|
||||||
summerblind
|
|
||||||
Testus Maximus
|
|
||||||
Thomas Bjarnelöf
|
Thomas Bjarnelöf
|
||||||
|
William Connell
|
||||||
|
Wojciech Chojnacki
|
||||||
Xavier Tan
|
Xavier Tan
|
||||||
Zaq Poi
|
Zaq Poi
|
||||||
|
|
||||||
|
Alessandra Pereyra
|
||||||
|
Alexey Dyadchenko
|
||||||
Amanda Haldy
|
Amanda Haldy
|
||||||
Andreas Haas
|
|
||||||
Arnaud Verstuyf
|
|
||||||
Chris Brown
|
Chris Brown
|
||||||
|
Chris Petrich
|
||||||
|
Chris Wilson
|
||||||
Cody Parker
|
Cody Parker
|
||||||
|
Corey Auger
|
||||||
D
|
D
|
||||||
Daniel Eliasinski
|
Daniel Eliasinski
|
||||||
Daniel Langegger
|
E.G.
|
||||||
Eric Monson
|
Eric Monson
|
||||||
Ezra Theunissen
|
|
||||||
flesk
|
flesk
|
||||||
François Cantin
|
G Barnes
|
||||||
|
GGGames.org
|
||||||
Giovanni Solimeno
|
Giovanni Solimeno
|
||||||
|
Hasen Judy
|
||||||
|
Heath Hayes
|
||||||
|
Jay Horton
|
||||||
Jeppe Zapp
|
Jeppe Zapp
|
||||||
joe513
|
joe513
|
||||||
|
Jordan M Lucas
|
||||||
|
Juraj Móza
|
||||||
Justin Arnold
|
Justin Arnold
|
||||||
Justo Delgado Baudí
|
|
||||||
Leandro Voltolino
|
Leandro Voltolino
|
||||||
Lucien Boudy
|
Lisandro Lorea
|
||||||
Markus Wiesner
|
Markus Wiesner
|
||||||
|
Marvin
|
||||||
|
Mohammad Taleb
|
||||||
|
Nick Nikitin
|
||||||
Pablo Cholaky
|
Pablo Cholaky
|
||||||
Patrick Schnorbus
|
Patrick Schnorbus
|
||||||
Pete Goodwin
|
Pete Goodwin
|
||||||
Ryan Estes
|
Phyronnaz
|
||||||
|
Ruben Soares Luis
|
||||||
|
Sofox
|
||||||
|
Stoned Xander
|
||||||
Ted
|
Ted
|
||||||
Travis Womack
|
Tim Dalporto
|
||||||
Trent McPheron
|
Trent McPheron
|
||||||
|
Vladimir
|
||||||
|
|
||||||
## Silver donors
|
## Silver donors
|
||||||
|
|
||||||
1D_Inc
|
1D_Inc
|
||||||
|
Adam Carr
|
||||||
|
Adam Smeltzer
|
||||||
Alder Stefano
|
Alder Stefano
|
||||||
Alessandro Senese
|
Alessandro Senese
|
||||||
Alex Barsukov
|
|
||||||
Álvaro Domínguez López
|
Álvaro Domínguez López
|
||||||
Andres Cuevas
|
Anders Jensen-Urstad
|
||||||
Anthony Bongiovanni
|
Anthony Bongiovanni
|
||||||
|
Arda Erol
|
||||||
|
Arthur S. Muszynski
|
||||||
|
Aubrey Falconer
|
||||||
Avencherus
|
Avencherus
|
||||||
|
Bailey
|
||||||
Bastian Böhm
|
Bastian Böhm
|
||||||
|
Benedikt
|
||||||
|
Benjamin Beshara
|
||||||
Ben Vercammen
|
Ben Vercammen
|
||||||
Blair Allen
|
Blair Allen
|
||||||
Bryanna M
|
Brandon
|
||||||
Bryan Stevenson
|
Bryan Stevenson
|
||||||
|
Carwyn Edwards
|
||||||
Casey Foote
|
Casey Foote
|
||||||
|
Chris Chapin
|
||||||
Christian Baune
|
Christian Baune
|
||||||
Christian Winter
|
Christian Winter
|
||||||
|
Christopher Schmitt
|
||||||
Collin Shooltz
|
Collin Shooltz
|
||||||
Daniel Egger
|
Daniel Delgado Corona
|
||||||
|
Daniel Johnson
|
||||||
Daniel Kaplan
|
Daniel Kaplan
|
||||||
|
DanielMaximiano
|
||||||
Daniel Mircea
|
Daniel Mircea
|
||||||
|
David
|
||||||
David Cravens
|
David Cravens
|
||||||
David May
|
David May
|
||||||
Diego Moreira Guimarães
|
|
||||||
Dominik Wetzel
|
Dominik Wetzel
|
||||||
|
Duy Kevin Nguyen
|
||||||
|
Edward Herbert
|
||||||
Eric Martini
|
Eric Martini
|
||||||
Fabian Becker
|
Fabian Becker
|
||||||
fengjiongmax
|
fengjiongmax
|
||||||
Francesco Lisi
|
Francesco Lisi
|
||||||
Fredy Romero Sam
|
|
||||||
G3Dev sàrl
|
G3Dev sàrl
|
||||||
Geequlim
|
|
||||||
Gerrit Großkopf
|
Gerrit Großkopf
|
||||||
|
Gerrit Procee
|
||||||
Gilberto K. Otubo
|
Gilberto K. Otubo
|
||||||
Guldoman
|
Guldoman
|
||||||
HardRound
|
Gumichan01
|
||||||
HeartBeast
|
|
||||||
Heribert Hirth
|
Heribert Hirth
|
||||||
|
hubert jenkins
|
||||||
Hunter Jones
|
Hunter Jones
|
||||||
|
ialex32x
|
||||||
|
Ivan Vodopiviz
|
||||||
|
Jahn Johansen
|
||||||
Jaime Ruiz-Borau Vizárraga
|
Jaime Ruiz-Borau Vizárraga
|
||||||
|
Jed
|
||||||
Jeff Hungerford
|
Jeff Hungerford
|
||||||
Jerry Chen
|
Joel Fivat
|
||||||
Jesse Liles
|
Johan Lindberg
|
||||||
|
Jonas Rudlang
|
||||||
|
Jonas Yamazaki
|
||||||
|
Jonathan Martin
|
||||||
|
Jonathan Nieto
|
||||||
Jonathon
|
Jonathon
|
||||||
Josh 'Cheeseness' Bush
|
Josh 'Cheeseness' Bush
|
||||||
Juan Negrier
|
Juan Negrier
|
||||||
JuDelCo
|
Judd
|
||||||
Julian Murgia
|
Julian Murgia
|
||||||
Juraj Móza
|
Justin Luk
|
||||||
Karonis
|
|
||||||
KC Chan
|
KC Chan
|
||||||
Kevin Boyer
|
Kevin Boyer
|
||||||
Kevin Kamper Meejach Petersen
|
Kevin Kamper Meejach Petersen
|
||||||
Klavdij Voncina
|
Klavdij Voncina
|
||||||
|
Krzysztof Jankowski
|
||||||
|
Lars pfeffer
|
||||||
Linus Lind Lundgren
|
Linus Lind Lundgren
|
||||||
Lisandro Lorea
|
Luis Moraes
|
||||||
|
Macil
|
||||||
magodev
|
magodev
|
||||||
Martin Novák
|
Martin Eigel
|
||||||
|
Martins Odabi
|
||||||
Matthew Fitzpatrick
|
Matthew Fitzpatrick
|
||||||
Matthias Hölzl
|
|
||||||
Max R.R. Collada
|
Max R.R. Collada
|
||||||
memoryruins
|
Maxwell
|
||||||
mhilbrunner
|
mhilbrunner
|
||||||
|
Michael Dürwald
|
||||||
Michael Gringauz
|
Michael Gringauz
|
||||||
|
Michael Labbe
|
||||||
Mikael Olsson
|
Mikael Olsson
|
||||||
MoM
|
MoM
|
||||||
monokrome
|
|
||||||
Moritz Laass
|
Moritz Laass
|
||||||
|
Natrim
|
||||||
nee
|
nee
|
||||||
Neil Blakey-Milner
|
Neil Blakey-Milner
|
||||||
Nik Lee
|
Nick Pavlica
|
||||||
|
Niclas Eriksen
|
||||||
|
Nicolas SAN AGUSTIN
|
||||||
Niko Leopold
|
Niko Leopold
|
||||||
|
nivardus
|
||||||
|
Noi Sek
|
||||||
Oleg Tyshchenko
|
Oleg Tyshchenko
|
||||||
|
Oleksandr Yemets
|
||||||
Pablo Seibelt
|
Pablo Seibelt
|
||||||
Pan Ip
|
Pan Ip
|
||||||
Pat LaBine
|
Pat LaBine
|
||||||
Patrick Nafarrete
|
Patrick Nafarrete
|
||||||
|
Patric Vormstein
|
||||||
Paul Mason
|
Paul Mason
|
||||||
Paweł Kowal
|
Paweł Kowal
|
||||||
Pierre-Igor Berthet
|
Pierre-Igor Berthet
|
||||||
Pietro Vertechi
|
Pietro Vertechi
|
||||||
|
Piotr Kaczmarski
|
||||||
|
Rea
|
||||||
|
Rémi Verschelde
|
||||||
Richman Stewart
|
Richman Stewart
|
||||||
Rodolfo Baeza
|
|
||||||
Roger Burgess
|
Roger Burgess
|
||||||
Roger Smith
|
Roger Smith
|
||||||
Roman Tinkov
|
Roman Tinkov
|
||||||
|
Ryan Whited
|
||||||
|
Samuel El-Borai
|
||||||
Sasori Olkof
|
Sasori Olkof
|
||||||
Scott D. Yelich
|
|
||||||
Sootstone
|
Sootstone
|
||||||
Stephen Traskal
|
Stefan Butucea
|
||||||
Theo Cranmore
|
Theo Cranmore
|
||||||
Thomas Norman
|
Thibault Barbaroux
|
||||||
|
Thomas Bell
|
||||||
|
Thomas Kurz
|
||||||
|
Tomasz Wacławek
|
||||||
Tom Larrow
|
Tom Larrow
|
||||||
|
Tyler Stafos
|
||||||
UltyX
|
UltyX
|
||||||
|
Victor
|
||||||
|
Victor Gonzalez Fernandez
|
||||||
|
Viktor Ferenczi
|
||||||
|
werner mendizabal
|
||||||
Wout Standaert
|
Wout Standaert
|
||||||
Xananax & karroffel
|
Yu He
|
||||||
|
|
||||||
## Bronze donors
|
## Bronze donors
|
||||||
|
|
||||||
|
227
SConstruct
227
SConstruct
@@ -81,6 +81,7 @@ env_base.android_gradle_plugins = []
|
|||||||
env_base.android_gradle_classpath = []
|
env_base.android_gradle_classpath = []
|
||||||
env_base.android_java_dirs = []
|
env_base.android_java_dirs = []
|
||||||
env_base.android_res_dirs = []
|
env_base.android_res_dirs = []
|
||||||
|
env_base.android_asset_dirs = []
|
||||||
env_base.android_aidl_dirs = []
|
env_base.android_aidl_dirs = []
|
||||||
env_base.android_jni_dirs = []
|
env_base.android_jni_dirs = []
|
||||||
env_base.android_default_config = []
|
env_base.android_default_config = []
|
||||||
@@ -106,6 +107,7 @@ env_base.__class__.android_add_flat_dir = methods.android_add_flat_dir
|
|||||||
env_base.__class__.android_add_dependency = methods.android_add_dependency
|
env_base.__class__.android_add_dependency = methods.android_add_dependency
|
||||||
env_base.__class__.android_add_java_dir = methods.android_add_java_dir
|
env_base.__class__.android_add_java_dir = methods.android_add_java_dir
|
||||||
env_base.__class__.android_add_res_dir = methods.android_add_res_dir
|
env_base.__class__.android_add_res_dir = methods.android_add_res_dir
|
||||||
|
env_base.__class__.android_add_asset_dir = methods.android_add_asset_dir
|
||||||
env_base.__class__.android_add_aidl_dir = methods.android_add_aidl_dir
|
env_base.__class__.android_add_aidl_dir = methods.android_add_aidl_dir
|
||||||
env_base.__class__.android_add_jni_dir = methods.android_add_jni_dir
|
env_base.__class__.android_add_jni_dir = methods.android_add_jni_dir
|
||||||
env_base.__class__.android_add_default_config = methods.android_add_default_config
|
env_base.__class__.android_add_default_config = methods.android_add_default_config
|
||||||
@@ -125,6 +127,7 @@ env_base.__class__.split_lib = methods.split_lib
|
|||||||
env_base.__class__.add_shared_library = methods.add_shared_library
|
env_base.__class__.add_shared_library = methods.add_shared_library
|
||||||
env_base.__class__.add_library = methods.add_library
|
env_base.__class__.add_library = methods.add_library
|
||||||
env_base.__class__.add_program = methods.add_program
|
env_base.__class__.add_program = methods.add_program
|
||||||
|
env_base.__class__.CommandNoCache = methods.CommandNoCache
|
||||||
|
|
||||||
env_base["x86_libtheora_opt_gcc"] = False
|
env_base["x86_libtheora_opt_gcc"] = False
|
||||||
env_base["x86_libtheora_opt_vc"] = False
|
env_base["x86_libtheora_opt_vc"] = False
|
||||||
@@ -161,11 +164,11 @@ opts.Add(BoolVariable('xml', "XML format support for resources", True))
|
|||||||
|
|
||||||
# Advanced options
|
# Advanced options
|
||||||
opts.Add(BoolVariable('disable_3d', "Disable 3D nodes for smaller executable", False))
|
opts.Add(BoolVariable('disable_3d', "Disable 3D nodes for smaller executable", False))
|
||||||
opts.Add(BoolVariable('disable_advanced_gui', "Disable advance 3D gui nodes and behaviors", False))
|
opts.Add(BoolVariable('disable_advanced_gui', "Disable advanced 3D gui nodes and behaviors", False))
|
||||||
opts.Add('extra_suffix', "Custom extra suffix added to the base filename of all generated binary files", '')
|
opts.Add('extra_suffix', "Custom extra suffix added to the base filename of all generated binary files", '')
|
||||||
opts.Add('unix_global_settings_path', "UNIX-specific path to system-wide settings. Currently only used for templates", '')
|
opts.Add('unix_global_settings_path', "UNIX-specific path to system-wide settings. Currently only used for templates", '')
|
||||||
opts.Add(BoolVariable('verbose', "Enable verbose output for the compilation", False))
|
opts.Add(BoolVariable('verbose', "Enable verbose output for the compilation", False))
|
||||||
opts.Add(BoolVariable('vsproj', "Generate Visual Studio Project.", False))
|
opts.Add(BoolVariable('vsproj', "Generate Visual Studio Project", False))
|
||||||
opts.Add(EnumVariable('warnings', "Set the level of warnings emitted during compilation", 'no', ('extra', 'all', 'moderate', 'no')))
|
opts.Add(EnumVariable('warnings', "Set the level of warnings emitted during compilation", 'no', ('extra', 'all', 'moderate', 'no')))
|
||||||
opts.Add(BoolVariable('progress', "Show a progress indicator during build", True))
|
opts.Add(BoolVariable('progress', "Show a progress indicator during build", True))
|
||||||
opts.Add(BoolVariable('dev', "If yes, alias for verbose=yes warnings=all", False))
|
opts.Add(BoolVariable('dev', "If yes, alias for verbose=yes warnings=all", False))
|
||||||
@@ -353,6 +356,7 @@ if selected_platform in platform_list:
|
|||||||
env.Append(CCFLAGS=['-Wall', '-Wno-unused'])
|
env.Append(CCFLAGS=['-Wall', '-Wno-unused'])
|
||||||
else: # 'no'
|
else: # 'no'
|
||||||
env.Append(CCFLAGS=['-w'])
|
env.Append(CCFLAGS=['-w'])
|
||||||
|
env.Append(CCFLAGS=['-Werror=return-type'])
|
||||||
|
|
||||||
#env['platform_libsuffix'] = env['LIBSUFFIX']
|
#env['platform_libsuffix'] = env['LIBSUFFIX']
|
||||||
|
|
||||||
@@ -445,7 +449,7 @@ if selected_platform in platform_list:
|
|||||||
if not env['verbose']:
|
if not env['verbose']:
|
||||||
methods.no_verbose(sys, env)
|
methods.no_verbose(sys, env)
|
||||||
|
|
||||||
if (True): # FIXME: detect GLES3
|
if (not env["platform"] == "server"): # FIXME: detect GLES3
|
||||||
env.Append( BUILDERS = { 'GLES3_GLSL' : env.Builder(action = methods.build_gles3_headers, suffix = 'glsl.gen.h',src_suffix = '.glsl') } )
|
env.Append( BUILDERS = { 'GLES3_GLSL' : env.Builder(action = methods.build_gles3_headers, suffix = 'glsl.gen.h',src_suffix = '.glsl') } )
|
||||||
|
|
||||||
scons_cache_path = os.environ.get("SCONS_CACHE")
|
scons_cache_path = os.environ.get("SCONS_CACHE")
|
||||||
@@ -494,127 +498,118 @@ else:
|
|||||||
print("\nPlease run scons again with argument: platform=<string>")
|
print("\nPlease run scons again with argument: platform=<string>")
|
||||||
|
|
||||||
|
|
||||||
screen = sys.stdout
|
# The following only makes sense when the env is defined, and assumes it is
|
||||||
node_count = 0
|
if 'env' in locals():
|
||||||
node_count_max = 0
|
screen = sys.stdout
|
||||||
node_count_interval = 1
|
# Progress reporting is not available in non-TTY environments since it
|
||||||
node_pruning = 8 # Number of nodes to process before prunning the cache
|
# messes with the output (for example, when writing to a file)
|
||||||
if ('env' in locals()):
|
show_progress = (env['progress'] and sys.stdout.isatty())
|
||||||
|
node_count = 0
|
||||||
|
node_count_max = 0
|
||||||
|
node_count_interval = 1
|
||||||
node_count_fname = str(env.Dir('#')) + '/.scons_node_count'
|
node_count_fname = str(env.Dir('#')) + '/.scons_node_count'
|
||||||
# Progress reporting is not available in non-TTY environments since it
|
|
||||||
# messes with the output (for example, when writing to a file)
|
|
||||||
if sys.stdout.isatty():
|
|
||||||
show_progress = env['progress']
|
|
||||||
else:
|
|
||||||
show_progress = False
|
|
||||||
|
|
||||||
import time, math
|
import time, math
|
||||||
|
|
||||||
class cache_progress:
|
class cache_progress:
|
||||||
# The default is 1 GB cache and 12 hours half life
|
# The default is 1 GB cache and 12 hours half life
|
||||||
def __init__(self, path = None, limit = 1073741824, half_life = 43200):
|
def __init__(self, path = None, limit = 1073741824, half_life = 43200):
|
||||||
global node_pruning
|
self.path = path
|
||||||
self.path = path
|
self.limit = limit
|
||||||
self.limit = limit
|
self.exponent_scale = math.log(2) / half_life
|
||||||
self.exponent_scale = math.log(2) / half_life
|
if env['verbose'] and path != None:
|
||||||
if env['verbose'] and path != None:
|
screen.write('Current cache limit is ' + self.convert_size(limit) + ' (used: ' + self.convert_size(self.get_size(path)) + ')\n')
|
||||||
screen.write('Current cache limit is ' + self.convert_size(limit) + ' (used: ' + self.convert_size(self.get_size(path)) + ')\n')
|
|
||||||
self.pruning = node_pruning
|
|
||||||
self.delete(self.file_list())
|
|
||||||
|
|
||||||
def __call__(self, node, *args, **kw):
|
|
||||||
global node_count, node_count_max, node_count_interval, node_count_fname, node_pruning, show_progress
|
|
||||||
if show_progress:
|
|
||||||
# Print the progress percentage
|
|
||||||
node_count += node_count_interval
|
|
||||||
if (node_count_max > 0 and node_count <= node_count_max):
|
|
||||||
screen.write('\r[%3d%%] ' % (node_count * 100 / node_count_max))
|
|
||||||
screen.flush()
|
|
||||||
elif (node_count_max > 0 and node_count > node_count_max):
|
|
||||||
screen.write('\r[100%] ')
|
|
||||||
screen.flush()
|
|
||||||
else:
|
|
||||||
screen.write('\r[Initial build] ')
|
|
||||||
screen.flush()
|
|
||||||
# Prune if the number of nodes processed is 'node_pruning' or bigger
|
|
||||||
self.pruning -= node_count_interval
|
|
||||||
if self.pruning <= 0:
|
|
||||||
self.pruning = node_pruning
|
|
||||||
self.delete(self.file_list())
|
self.delete(self.file_list())
|
||||||
|
|
||||||
def delete(self, files):
|
def __call__(self, node, *args, **kw):
|
||||||
if len(files) == 0:
|
global node_count, node_count_max, node_count_interval, node_count_fname, show_progress
|
||||||
return
|
if show_progress:
|
||||||
if env['verbose']:
|
# Print the progress percentage
|
||||||
# Utter something
|
node_count += node_count_interval
|
||||||
screen.write('\rPurging %d %s from cache...\n' % (len(files), len(files) > 1 and 'files' or 'file'))
|
if (node_count_max > 0 and node_count <= node_count_max):
|
||||||
map(os.remove, files)
|
screen.write('\r[%3d%%] ' % (node_count * 100 / node_count_max))
|
||||||
|
screen.flush()
|
||||||
|
elif (node_count_max > 0 and node_count > node_count_max):
|
||||||
|
screen.write('\r[100%] ')
|
||||||
|
screen.flush()
|
||||||
|
else:
|
||||||
|
screen.write('\r[Initial build] ')
|
||||||
|
screen.flush()
|
||||||
|
|
||||||
def file_list(self):
|
def delete(self, files):
|
||||||
if self.path == None:
|
if len(files) == 0:
|
||||||
# Nothing to do
|
return
|
||||||
return []
|
if env['verbose']:
|
||||||
# Gather a list of (filename, (size, atime)) within the
|
# Utter something
|
||||||
# cache directory
|
screen.write('\rPurging %d %s from cache...\n' % (len(files), len(files) > 1 and 'files' or 'file'))
|
||||||
file_stat = [(x, os.stat(x)[6:8]) for x in glob.glob(os.path.join(self.path, '*', '*'))]
|
[os.remove(f) for f in files]
|
||||||
if file_stat == []:
|
|
||||||
# Nothing to do
|
|
||||||
return []
|
|
||||||
# Weight the cache files by size (assumed to be roughly
|
|
||||||
# proportional to the recompilation time) times an exponential
|
|
||||||
# decay since the ctime, and return a list with the entries
|
|
||||||
# (filename, size, weight).
|
|
||||||
current_time = time.time()
|
|
||||||
file_stat = [(x[0], x[1][0], (current_time - x[1][1])) for x in file_stat]
|
|
||||||
# Sort by the most resently accessed files (most sensible to keep) first
|
|
||||||
file_stat.sort(key=lambda x: x[2])
|
|
||||||
# Search for the first entry where the storage limit is
|
|
||||||
# reached
|
|
||||||
sum, mark = 0, None
|
|
||||||
for i,x in enumerate(file_stat):
|
|
||||||
sum += x[1]
|
|
||||||
if sum > self.limit:
|
|
||||||
mark = i
|
|
||||||
break
|
|
||||||
if mark == None:
|
|
||||||
return []
|
|
||||||
else:
|
|
||||||
return [x[0] for x in file_stat[mark:]]
|
|
||||||
|
|
||||||
def convert_size(self, size_bytes):
|
def file_list(self):
|
||||||
if size_bytes == 0:
|
if self.path == None:
|
||||||
return "0 bytes"
|
# Nothing to do
|
||||||
size_name = ("bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
|
return []
|
||||||
i = int(math.floor(math.log(size_bytes, 1024)))
|
# Gather a list of (filename, (size, atime)) within the
|
||||||
p = math.pow(1024, i)
|
# cache directory
|
||||||
s = round(size_bytes / p, 2)
|
file_stat = [(x, os.stat(x)[6:8]) for x in glob.glob(os.path.join(self.path, '*', '*'))]
|
||||||
return "%s %s" % (int(s) if i == 0 else s, size_name[i])
|
if file_stat == []:
|
||||||
|
# Nothing to do
|
||||||
|
return []
|
||||||
|
# Weight the cache files by size (assumed to be roughly
|
||||||
|
# proportional to the recompilation time) times an exponential
|
||||||
|
# decay since the ctime, and return a list with the entries
|
||||||
|
# (filename, size, weight).
|
||||||
|
current_time = time.time()
|
||||||
|
file_stat = [(x[0], x[1][0], (current_time - x[1][1])) for x in file_stat]
|
||||||
|
# Sort by the most resently accessed files (most sensible to keep) first
|
||||||
|
file_stat.sort(key=lambda x: x[2])
|
||||||
|
# Search for the first entry where the storage limit is
|
||||||
|
# reached
|
||||||
|
sum, mark = 0, None
|
||||||
|
for i,x in enumerate(file_stat):
|
||||||
|
sum += x[1]
|
||||||
|
if sum > self.limit:
|
||||||
|
mark = i
|
||||||
|
break
|
||||||
|
if mark == None:
|
||||||
|
return []
|
||||||
|
else:
|
||||||
|
return [x[0] for x in file_stat[mark:]]
|
||||||
|
|
||||||
def get_size(self, start_path = '.'):
|
def convert_size(self, size_bytes):
|
||||||
total_size = 0
|
if size_bytes == 0:
|
||||||
for dirpath, dirnames, filenames in os.walk(start_path):
|
return "0 bytes"
|
||||||
for f in filenames:
|
size_name = ("bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
|
||||||
fp = os.path.join(dirpath, f)
|
i = int(math.floor(math.log(size_bytes, 1024)))
|
||||||
total_size += os.path.getsize(fp)
|
p = math.pow(1024, i)
|
||||||
return total_size
|
s = round(size_bytes / p, 2)
|
||||||
|
return "%s %s" % (int(s) if i == 0 else s, size_name[i])
|
||||||
|
|
||||||
def progress_finish(target, source, env):
|
def get_size(self, start_path = '.'):
|
||||||
global node_count, progressor
|
total_size = 0
|
||||||
with open(node_count_fname, 'w') as f:
|
for dirpath, dirnames, filenames in os.walk(start_path):
|
||||||
f.write('%d\n' % node_count)
|
for f in filenames:
|
||||||
progressor.delete(progressor.file_list())
|
fp = os.path.join(dirpath, f)
|
||||||
|
total_size += os.path.getsize(fp)
|
||||||
|
return total_size
|
||||||
|
|
||||||
try:
|
def progress_finish(target, source, env):
|
||||||
with open(node_count_fname) as f:
|
global node_count, progressor
|
||||||
node_count_max = int(f.readline())
|
with open(node_count_fname, 'w') as f:
|
||||||
except:
|
f.write('%d\n' % node_count)
|
||||||
pass
|
progressor.delete(progressor.file_list())
|
||||||
cache_directory = os.environ.get("SCONS_CACHE")
|
|
||||||
# Simple cache pruning, attached to SCons' progress callback. Trim the
|
|
||||||
# cache directory to a size not larger than cache_limit.
|
|
||||||
cache_limit = float(os.getenv("SCONS_CACHE_LIMIT", 1024)) * 1024 * 1024
|
|
||||||
progressor = cache_progress(cache_directory, cache_limit)
|
|
||||||
Progress(progressor, interval = node_count_interval)
|
|
||||||
|
|
||||||
progress_finish_command = Command('progress_finish', [], progress_finish)
|
try:
|
||||||
AlwaysBuild(progress_finish_command)
|
with open(node_count_fname) as f:
|
||||||
|
node_count_max = int(f.readline())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
cache_directory = os.environ.get("SCONS_CACHE")
|
||||||
|
# Simple cache pruning, attached to SCons' progress callback. Trim the
|
||||||
|
# cache directory to a size not larger than cache_limit.
|
||||||
|
cache_limit = float(os.getenv("SCONS_CACHE_LIMIT", 1024)) * 1024 * 1024
|
||||||
|
progressor = cache_progress(cache_directory, cache_limit)
|
||||||
|
Progress(progressor, interval = node_count_interval)
|
||||||
|
|
||||||
|
progress_finish_command = Command('progress_finish', [], progress_finish)
|
||||||
|
AlwaysBuild(progress_finish_command)
|
||||||
|
@@ -93,7 +93,7 @@ env.add_source_files(env.core_sources, "*.cpp")
|
|||||||
|
|
||||||
# Make binders
|
# Make binders
|
||||||
import make_binders
|
import make_binders
|
||||||
env.Command(['method_bind.gen.inc', 'method_bind_ext.gen.inc'], 'make_binders.py', make_binders.run)
|
env.CommandNoCache(['method_bind.gen.inc', 'method_bind_ext.gen.inc'], 'make_binders.py', make_binders.run)
|
||||||
|
|
||||||
|
|
||||||
# Chain load SCsubs
|
# Chain load SCsubs
|
||||||
|
@@ -264,10 +264,18 @@ Size2 _OS::get_window_size() const {
|
|||||||
return OS::get_singleton()->get_window_size();
|
return OS::get_singleton()->get_window_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Size2 _OS::get_real_window_size() const {
|
||||||
|
return OS::get_singleton()->get_real_window_size();
|
||||||
|
}
|
||||||
|
|
||||||
void _OS::set_window_size(const Size2 &p_size) {
|
void _OS::set_window_size(const Size2 &p_size) {
|
||||||
OS::get_singleton()->set_window_size(p_size);
|
OS::get_singleton()->set_window_size(p_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rect2 _OS::get_window_safe_area() const {
|
||||||
|
return OS::get_singleton()->get_window_safe_area();
|
||||||
|
}
|
||||||
|
|
||||||
void _OS::set_window_fullscreen(bool p_enabled) {
|
void _OS::set_window_fullscreen(bool p_enabled) {
|
||||||
OS::get_singleton()->set_window_fullscreen(p_enabled);
|
OS::get_singleton()->set_window_fullscreen(p_enabled);
|
||||||
}
|
}
|
||||||
@@ -300,6 +308,14 @@ bool _OS::is_window_maximized() const {
|
|||||||
return OS::get_singleton()->is_window_maximized();
|
return OS::get_singleton()->is_window_maximized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _OS::set_window_always_on_top(bool p_enabled) {
|
||||||
|
OS::get_singleton()->set_window_always_on_top(p_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _OS::is_window_always_on_top() const {
|
||||||
|
return OS::get_singleton()->is_window_always_on_top();
|
||||||
|
}
|
||||||
|
|
||||||
void _OS::set_borderless_window(bool p_borderless) {
|
void _OS::set_borderless_window(bool p_borderless) {
|
||||||
OS::get_singleton()->set_borderless_window(p_borderless);
|
OS::get_singleton()->set_borderless_window(p_borderless);
|
||||||
}
|
}
|
||||||
@@ -607,8 +623,8 @@ uint64_t _OS::get_unix_time_from_datetime(Dictionary datetime) const {
|
|||||||
unsigned int second = ((datetime.has(SECOND_KEY)) ? static_cast<unsigned int>(datetime[SECOND_KEY]) : 0);
|
unsigned int second = ((datetime.has(SECOND_KEY)) ? static_cast<unsigned int>(datetime[SECOND_KEY]) : 0);
|
||||||
unsigned int minute = ((datetime.has(MINUTE_KEY)) ? static_cast<unsigned int>(datetime[MINUTE_KEY]) : 0);
|
unsigned int minute = ((datetime.has(MINUTE_KEY)) ? static_cast<unsigned int>(datetime[MINUTE_KEY]) : 0);
|
||||||
unsigned int hour = ((datetime.has(HOUR_KEY)) ? static_cast<unsigned int>(datetime[HOUR_KEY]) : 0);
|
unsigned int hour = ((datetime.has(HOUR_KEY)) ? static_cast<unsigned int>(datetime[HOUR_KEY]) : 0);
|
||||||
unsigned int day = ((datetime.has(DAY_KEY)) ? static_cast<unsigned int>(datetime[DAY_KEY]) : 0);
|
unsigned int day = ((datetime.has(DAY_KEY)) ? static_cast<unsigned int>(datetime[DAY_KEY]) : 1);
|
||||||
unsigned int month = ((datetime.has(MONTH_KEY)) ? static_cast<unsigned int>(datetime[MONTH_KEY]) - 1 : 0);
|
unsigned int month = ((datetime.has(MONTH_KEY)) ? static_cast<unsigned int>(datetime[MONTH_KEY]) : 1);
|
||||||
unsigned int year = ((datetime.has(YEAR_KEY)) ? static_cast<unsigned int>(datetime[YEAR_KEY]) : 0);
|
unsigned int year = ((datetime.has(YEAR_KEY)) ? static_cast<unsigned int>(datetime[YEAR_KEY]) : 0);
|
||||||
|
|
||||||
/// How many days come before each month (0-12)
|
/// How many days come before each month (0-12)
|
||||||
@@ -628,15 +644,15 @@ uint64_t _OS::get_unix_time_from_datetime(Dictionary datetime) const {
|
|||||||
ERR_EXPLAIN("Invalid hour value of: " + itos(hour));
|
ERR_EXPLAIN("Invalid hour value of: " + itos(hour));
|
||||||
ERR_FAIL_COND_V(hour > 23, 0);
|
ERR_FAIL_COND_V(hour > 23, 0);
|
||||||
|
|
||||||
ERR_EXPLAIN("Invalid month value of: " + itos(month + 1));
|
ERR_EXPLAIN("Invalid month value of: " + itos(month));
|
||||||
ERR_FAIL_COND_V(month + 1 > 12, 0);
|
ERR_FAIL_COND_V(month > 12 || month == 0, 0);
|
||||||
|
|
||||||
// Do this check after month is tested as valid
|
// Do this check after month is tested as valid
|
||||||
ERR_EXPLAIN("Invalid day value of: " + itos(day) + " which is larger than " + itos(MONTH_DAYS_TABLE[LEAPYEAR(year)][month]));
|
ERR_EXPLAIN("Invalid day value of: " + itos(day) + " which is larger than " + itos(MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1]) + " or 0");
|
||||||
ERR_FAIL_COND_V(day > MONTH_DAYS_TABLE[LEAPYEAR(year)][month], 0);
|
ERR_FAIL_COND_V(day > MONTH_DAYS_TABLE[LEAPYEAR(year)][month - 1] || day == 0, 0);
|
||||||
|
|
||||||
// Calculate all the seconds from months past in this year
|
// Calculate all the seconds from months past in this year
|
||||||
uint64_t SECONDS_FROM_MONTHS_PAST_THIS_YEAR = DAYS_PAST_THIS_YEAR_TABLE[LEAPYEAR(year)][month] * SECONDS_PER_DAY;
|
uint64_t SECONDS_FROM_MONTHS_PAST_THIS_YEAR = DAYS_PAST_THIS_YEAR_TABLE[LEAPYEAR(year)][month - 1] * SECONDS_PER_DAY;
|
||||||
|
|
||||||
uint64_t SECONDS_FROM_YEARS_PAST = 0;
|
uint64_t SECONDS_FROM_YEARS_PAST = 0;
|
||||||
for (unsigned int iyear = EPOCH_YR; iyear < year; iyear++) {
|
for (unsigned int iyear = EPOCH_YR; iyear < year; iyear++) {
|
||||||
@@ -929,6 +945,11 @@ void _OS::request_attention() {
|
|||||||
OS::get_singleton()->request_attention();
|
OS::get_singleton()->request_attention();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _OS::center_window() {
|
||||||
|
|
||||||
|
OS::get_singleton()->center_window();
|
||||||
|
}
|
||||||
|
|
||||||
bool _OS::is_debug_build() const {
|
bool _OS::is_debug_build() const {
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
@@ -1008,6 +1029,7 @@ void _OS::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_window_position", "position"), &_OS::set_window_position);
|
ClassDB::bind_method(D_METHOD("set_window_position", "position"), &_OS::set_window_position);
|
||||||
ClassDB::bind_method(D_METHOD("get_window_size"), &_OS::get_window_size);
|
ClassDB::bind_method(D_METHOD("get_window_size"), &_OS::get_window_size);
|
||||||
ClassDB::bind_method(D_METHOD("set_window_size", "size"), &_OS::set_window_size);
|
ClassDB::bind_method(D_METHOD("set_window_size", "size"), &_OS::set_window_size);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_window_safe_area"), &_OS::get_window_safe_area);
|
||||||
ClassDB::bind_method(D_METHOD("set_window_fullscreen", "enabled"), &_OS::set_window_fullscreen);
|
ClassDB::bind_method(D_METHOD("set_window_fullscreen", "enabled"), &_OS::set_window_fullscreen);
|
||||||
ClassDB::bind_method(D_METHOD("is_window_fullscreen"), &_OS::is_window_fullscreen);
|
ClassDB::bind_method(D_METHOD("is_window_fullscreen"), &_OS::is_window_fullscreen);
|
||||||
ClassDB::bind_method(D_METHOD("set_window_resizable", "enabled"), &_OS::set_window_resizable);
|
ClassDB::bind_method(D_METHOD("set_window_resizable", "enabled"), &_OS::set_window_resizable);
|
||||||
@@ -1016,7 +1038,11 @@ void _OS::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("is_window_minimized"), &_OS::is_window_minimized);
|
ClassDB::bind_method(D_METHOD("is_window_minimized"), &_OS::is_window_minimized);
|
||||||
ClassDB::bind_method(D_METHOD("set_window_maximized", "enabled"), &_OS::set_window_maximized);
|
ClassDB::bind_method(D_METHOD("set_window_maximized", "enabled"), &_OS::set_window_maximized);
|
||||||
ClassDB::bind_method(D_METHOD("is_window_maximized"), &_OS::is_window_maximized);
|
ClassDB::bind_method(D_METHOD("is_window_maximized"), &_OS::is_window_maximized);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_window_always_on_top", "enabled"), &_OS::set_window_always_on_top);
|
||||||
|
ClassDB::bind_method(D_METHOD("is_window_always_on_top"), &_OS::is_window_always_on_top);
|
||||||
ClassDB::bind_method(D_METHOD("request_attention"), &_OS::request_attention);
|
ClassDB::bind_method(D_METHOD("request_attention"), &_OS::request_attention);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_real_window_size"), &_OS::get_real_window_size);
|
||||||
|
ClassDB::bind_method(D_METHOD("center_window"), &_OS::center_window);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_borderless_window", "borderless"), &_OS::set_borderless_window);
|
ClassDB::bind_method(D_METHOD("set_borderless_window", "borderless"), &_OS::set_borderless_window);
|
||||||
ClassDB::bind_method(D_METHOD("get_borderless_window"), &_OS::get_borderless_window);
|
ClassDB::bind_method(D_METHOD("get_borderless_window"), &_OS::get_borderless_window);
|
||||||
@@ -1493,6 +1519,17 @@ bool _File::is_open() const {
|
|||||||
|
|
||||||
return f != NULL;
|
return f != NULL;
|
||||||
}
|
}
|
||||||
|
String _File::get_path() const {
|
||||||
|
|
||||||
|
ERR_FAIL_COND_V(!f, "");
|
||||||
|
return f->get_path();
|
||||||
|
}
|
||||||
|
|
||||||
|
String _File::get_path_absolute() const {
|
||||||
|
|
||||||
|
ERR_FAIL_COND_V(!f, "");
|
||||||
|
return f->get_path_absolute();
|
||||||
|
}
|
||||||
|
|
||||||
void _File::seek(int64_t p_position) {
|
void _File::seek(int64_t p_position) {
|
||||||
|
|
||||||
@@ -1782,6 +1819,8 @@ void _File::_bind_methods() {
|
|||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("open", "path", "flags"), &_File::open);
|
ClassDB::bind_method(D_METHOD("open", "path", "flags"), &_File::open);
|
||||||
ClassDB::bind_method(D_METHOD("close"), &_File::close);
|
ClassDB::bind_method(D_METHOD("close"), &_File::close);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_path"), &_File::get_path);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_path_absolute"), &_File::get_path_absolute);
|
||||||
ClassDB::bind_method(D_METHOD("is_open"), &_File::is_open);
|
ClassDB::bind_method(D_METHOD("is_open"), &_File::is_open);
|
||||||
ClassDB::bind_method(D_METHOD("seek", "position"), &_File::seek);
|
ClassDB::bind_method(D_METHOD("seek", "position"), &_File::seek);
|
||||||
ClassDB::bind_method(D_METHOD("seek_end", "position"), &_File::seek_end, DEFVAL(0));
|
ClassDB::bind_method(D_METHOD("seek_end", "position"), &_File::seek_end, DEFVAL(0));
|
||||||
@@ -2353,7 +2392,7 @@ _Thread::_Thread() {
|
|||||||
_Thread::~_Thread() {
|
_Thread::~_Thread() {
|
||||||
|
|
||||||
if (active) {
|
if (active) {
|
||||||
ERR_EXPLAIN("Reference to a Thread object object was lost while the thread is still running..");
|
ERR_EXPLAIN("Reference to a Thread object object was lost while the thread is still running...");
|
||||||
}
|
}
|
||||||
ERR_FAIL_COND(active == true);
|
ERR_FAIL_COND(active == true);
|
||||||
}
|
}
|
||||||
|
@@ -155,6 +155,8 @@ public:
|
|||||||
virtual Point2 get_window_position() const;
|
virtual Point2 get_window_position() const;
|
||||||
virtual void set_window_position(const Point2 &p_position);
|
virtual void set_window_position(const Point2 &p_position);
|
||||||
virtual Size2 get_window_size() const;
|
virtual Size2 get_window_size() const;
|
||||||
|
virtual Size2 get_real_window_size() const;
|
||||||
|
virtual Rect2 get_window_safe_area() const;
|
||||||
virtual void set_window_size(const Size2 &p_size);
|
virtual void set_window_size(const Size2 &p_size);
|
||||||
virtual void set_window_fullscreen(bool p_enabled);
|
virtual void set_window_fullscreen(bool p_enabled);
|
||||||
virtual bool is_window_fullscreen() const;
|
virtual bool is_window_fullscreen() const;
|
||||||
@@ -164,7 +166,10 @@ public:
|
|||||||
virtual bool is_window_minimized() const;
|
virtual bool is_window_minimized() const;
|
||||||
virtual void set_window_maximized(bool p_enabled);
|
virtual void set_window_maximized(bool p_enabled);
|
||||||
virtual bool is_window_maximized() const;
|
virtual bool is_window_maximized() const;
|
||||||
|
virtual void set_window_always_on_top(bool p_enabled);
|
||||||
|
virtual bool is_window_always_on_top() const;
|
||||||
virtual void request_attention();
|
virtual void request_attention();
|
||||||
|
virtual void center_window();
|
||||||
|
|
||||||
virtual void set_borderless_window(bool p_borderless);
|
virtual void set_borderless_window(bool p_borderless);
|
||||||
virtual bool get_borderless_window() const;
|
virtual bool get_borderless_window() const;
|
||||||
@@ -405,6 +410,9 @@ public:
|
|||||||
void close(); ///< close a file
|
void close(); ///< close a file
|
||||||
bool is_open() const; ///< true when file is open
|
bool is_open() const; ///< true when file is open
|
||||||
|
|
||||||
|
String get_path() const; /// returns the path for the current open file
|
||||||
|
String get_path_absolute() const; /// returns the absolute path for the current open file
|
||||||
|
|
||||||
void seek(int64_t p_position); ///< seek to a given position
|
void seek(int64_t p_position); ///< seek to a given position
|
||||||
void seek_end(int64_t p_position = 0); ///< seek from the end of file
|
void seek_end(int64_t p_position = 0); ///< seek from the end of file
|
||||||
int64_t get_position() const; ///< get position in the file
|
int64_t get_position() const; ///< get position in the file
|
||||||
|
@@ -207,6 +207,47 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12) {
|
||||||
|
|
||||||
|
MethodDefinition md;
|
||||||
|
md.name = StaticCString::create(p_name);
|
||||||
|
md.args.resize(12);
|
||||||
|
md.args[0] = StaticCString::create(p_arg1);
|
||||||
|
md.args[1] = StaticCString::create(p_arg2);
|
||||||
|
md.args[2] = StaticCString::create(p_arg3);
|
||||||
|
md.args[3] = StaticCString::create(p_arg4);
|
||||||
|
md.args[4] = StaticCString::create(p_arg5);
|
||||||
|
md.args[5] = StaticCString::create(p_arg6);
|
||||||
|
md.args[6] = StaticCString::create(p_arg7);
|
||||||
|
md.args[7] = StaticCString::create(p_arg8);
|
||||||
|
md.args[8] = StaticCString::create(p_arg9);
|
||||||
|
md.args[9] = StaticCString::create(p_arg10);
|
||||||
|
md.args[10] = StaticCString::create(p_arg11);
|
||||||
|
md.args[11] = StaticCString::create(p_arg12);
|
||||||
|
return md;
|
||||||
|
}
|
||||||
|
|
||||||
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12, const char *p_arg13) {
|
||||||
|
|
||||||
|
MethodDefinition md;
|
||||||
|
md.name = StaticCString::create(p_name);
|
||||||
|
md.args.resize(13);
|
||||||
|
md.args[0] = StaticCString::create(p_arg1);
|
||||||
|
md.args[1] = StaticCString::create(p_arg2);
|
||||||
|
md.args[2] = StaticCString::create(p_arg3);
|
||||||
|
md.args[3] = StaticCString::create(p_arg4);
|
||||||
|
md.args[4] = StaticCString::create(p_arg5);
|
||||||
|
md.args[5] = StaticCString::create(p_arg6);
|
||||||
|
md.args[6] = StaticCString::create(p_arg7);
|
||||||
|
md.args[7] = StaticCString::create(p_arg8);
|
||||||
|
md.args[8] = StaticCString::create(p_arg9);
|
||||||
|
md.args[9] = StaticCString::create(p_arg10);
|
||||||
|
md.args[10] = StaticCString::create(p_arg11);
|
||||||
|
md.args[11] = StaticCString::create(p_arg12);
|
||||||
|
md.args[12] = StaticCString::create(p_arg13);
|
||||||
|
return md;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ClassDB::APIType ClassDB::current_api = API_CORE;
|
ClassDB::APIType ClassDB::current_api = API_CORE;
|
||||||
@@ -306,7 +347,7 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|||||||
OBJTYPE_RLOCK;
|
OBJTYPE_RLOCK;
|
||||||
#ifdef DEBUG_METHODS_ENABLED
|
#ifdef DEBUG_METHODS_ENABLED
|
||||||
|
|
||||||
uint64_t hash = hash_djb2_one_64(HashMapHasherDefault::hash(VERSION_FULL_NAME));
|
uint64_t hash = hash_djb2_one_64(HashMapHasherDefault::hash(VERSION_FULL_CONFIG));
|
||||||
|
|
||||||
List<StringName> names;
|
List<StringName> names;
|
||||||
|
|
||||||
@@ -323,7 +364,7 @@ uint64_t ClassDB::get_api_hash(APIType p_api) {
|
|||||||
|
|
||||||
ClassInfo *t = classes.getptr(E->get());
|
ClassInfo *t = classes.getptr(E->get());
|
||||||
ERR_FAIL_COND_V(!t, 0);
|
ERR_FAIL_COND_V(!t, 0);
|
||||||
if (t->api != p_api)
|
if (t->api != p_api || !t->exposed)
|
||||||
continue;
|
continue;
|
||||||
hash = hash_djb2_one_64(t->name.hash(), hash);
|
hash = hash_djb2_one_64(t->name.hash(), hash);
|
||||||
hash = hash_djb2_one_64(t->inherits.hash(), hash);
|
hash = hash_djb2_one_64(t->inherits.hash(), hash);
|
||||||
|
@@ -68,6 +68,8 @@ MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_
|
|||||||
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9);
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9);
|
||||||
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10);
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10);
|
||||||
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11);
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11);
|
||||||
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12);
|
||||||
|
MethodDefinition D_METHOD(const char *p_name, const char *p_arg1, const char *p_arg2, const char *p_arg3, const char *p_arg4, const char *p_arg5, const char *p_arg6, const char *p_arg7, const char *p_arg8, const char *p_arg9, const char *p_arg10, const char *p_arg11, const char *p_arg12, const char *p_arg13);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@@ -55,7 +55,7 @@
|
|||||||
#define _COMMA_11 ,
|
#define _COMMA_11 ,
|
||||||
#define _COMMA_12 ,
|
#define _COMMA_12 ,
|
||||||
|
|
||||||
// 1-based comma separed list of ITEMs
|
// 1-based comma separated list of ITEMs
|
||||||
#define COMMA_SEP_LIST(ITEM, LENGTH) _COMMA_SEP_LIST_##LENGTH(ITEM)
|
#define COMMA_SEP_LIST(ITEM, LENGTH) _COMMA_SEP_LIST_##LENGTH(ITEM)
|
||||||
#define _COMMA_SEP_LIST_12(ITEM) \
|
#define _COMMA_SEP_LIST_12(ITEM) \
|
||||||
_COMMA_SEP_LIST_11(ITEM) \
|
_COMMA_SEP_LIST_11(ITEM) \
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
ITEM(1)
|
ITEM(1)
|
||||||
#define _COMMA_SEP_LIST_0(ITEM)
|
#define _COMMA_SEP_LIST_0(ITEM)
|
||||||
|
|
||||||
// 1-based semicolon separed list of ITEMs
|
// 1-based semicolon separated list of ITEMs
|
||||||
#define SEMIC_SEP_LIST(ITEM, LENGTH) _SEMIC_SEP_LIST_##LENGTH(ITEM)
|
#define SEMIC_SEP_LIST(ITEM, LENGTH) _SEMIC_SEP_LIST_##LENGTH(ITEM)
|
||||||
#define _SEMIC_SEP_LIST_12(ITEM) \
|
#define _SEMIC_SEP_LIST_12(ITEM) \
|
||||||
_SEMIC_SEP_LIST_11(ITEM); \
|
_SEMIC_SEP_LIST_11(ITEM); \
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
ITEM(1)
|
ITEM(1)
|
||||||
#define _SEMIC_SEP_LIST_0(ITEM)
|
#define _SEMIC_SEP_LIST_0(ITEM)
|
||||||
|
|
||||||
// 1-based space separed list of ITEMs
|
// 1-based space separated list of ITEMs
|
||||||
#define SPACE_SEP_LIST(ITEM, LENGTH) _SPACE_SEP_LIST_##LENGTH(ITEM)
|
#define SPACE_SEP_LIST(ITEM, LENGTH) _SPACE_SEP_LIST_##LENGTH(ITEM)
|
||||||
#define _SPACE_SEP_LIST_12(ITEM) \
|
#define _SPACE_SEP_LIST_12(ITEM) \
|
||||||
_SPACE_SEP_LIST_11(ITEM) \
|
_SPACE_SEP_LIST_11(ITEM) \
|
||||||
@@ -309,9 +309,9 @@ class CommandQueueMT {
|
|||||||
};
|
};
|
||||||
|
|
||||||
uint8_t command_mem[COMMAND_MEM_SIZE];
|
uint8_t command_mem[COMMAND_MEM_SIZE];
|
||||||
uint32_t read_ptr;
|
uint32_t read_ptr = 0;
|
||||||
uint32_t write_ptr;
|
uint32_t write_ptr = 0;
|
||||||
uint32_t dealloc_ptr;
|
uint32_t dealloc_ptr = 0;
|
||||||
SyncSemaphore sync_sems[SYNC_SEMAPHORES];
|
SyncSemaphore sync_sems[SYNC_SEMAPHORES];
|
||||||
Mutex *mutex;
|
Mutex *mutex;
|
||||||
Semaphore *sync;
|
Semaphore *sync;
|
||||||
|
@@ -38,7 +38,7 @@ class PHashTranslation : public Translation {
|
|||||||
GDCLASS(PHashTranslation, Translation);
|
GDCLASS(PHashTranslation, Translation);
|
||||||
|
|
||||||
//this translation uses a sort of modified perfect hash algorithm
|
//this translation uses a sort of modified perfect hash algorithm
|
||||||
//it requieres hashing strings twice and then does a binary search,
|
//it requires hashing strings twice and then does a binary search,
|
||||||
//so it's slower, but at the same time it has an extreemly high chance
|
//so it's slower, but at the same time it has an extreemly high chance
|
||||||
//of catching untranslated strings
|
//of catching untranslated strings
|
||||||
|
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
#include "typedefs.h"
|
#include "typedefs.h"
|
||||||
/**
|
/**
|
||||||
* Error macros. Unlike exceptions and asserts, these macros try to mantain consistency and stability
|
* Error macros. Unlike exceptions and asserts, these macros try to maintain consistency and stability
|
||||||
* inside the code. It is recommended to always return processable data, so in case of an error, the
|
* inside the code. It is recommended to always return processable data, so in case of an error, the
|
||||||
* engine can stay working well.
|
* engine can stay working well.
|
||||||
* In most cases, bugs and/or invalid data are not fatal and should never allow a perfectly running application
|
* In most cases, bugs and/or invalid data are not fatal and should never allow a perfectly running application
|
||||||
|
@@ -580,7 +580,7 @@ void register_global_constants() {
|
|||||||
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("TYPE_COLOR_ARRAY", Variant::POOL_COLOR_ARRAY);
|
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("TYPE_COLOR_ARRAY", Variant::POOL_COLOR_ARRAY);
|
||||||
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("TYPE_MAX", Variant::VARIANT_MAX);
|
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("TYPE_MAX", Variant::VARIANT_MAX);
|
||||||
|
|
||||||
//comparation
|
//comparison
|
||||||
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_EQUAL", Variant::OP_EQUAL);
|
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_EQUAL", Variant::OP_EQUAL);
|
||||||
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_NOT_EQUAL", Variant::OP_NOT_EQUAL);
|
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_NOT_EQUAL", Variant::OP_NOT_EQUAL);
|
||||||
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_LESS", Variant::OP_LESS);
|
BIND_GLOBAL_ENUM_CONSTANT_CUSTOM("OP_LESS", Variant::OP_LESS);
|
||||||
|
@@ -1166,6 +1166,9 @@ PoolVector<uint8_t> Image::get_data() const {
|
|||||||
|
|
||||||
void Image::create(int p_width, int p_height, bool p_use_mipmaps, Format p_format) {
|
void Image::create(int p_width, int p_height, bool p_use_mipmaps, Format p_format) {
|
||||||
|
|
||||||
|
ERR_FAIL_INDEX(p_width - 1, MAX_WIDTH);
|
||||||
|
ERR_FAIL_INDEX(p_height - 1, MAX_HEIGHT);
|
||||||
|
|
||||||
int mm = 0;
|
int mm = 0;
|
||||||
int size = _get_dst_image_size(p_width, p_height, p_format, mm, p_use_mipmaps ? -1 : 0);
|
int size = _get_dst_image_size(p_width, p_height, p_format, mm, p_use_mipmaps ? -1 : 0);
|
||||||
data.resize(size);
|
data.resize(size);
|
||||||
|
@@ -83,7 +83,7 @@ int64_t FileAccessNetworkClient::get_64() {
|
|||||||
|
|
||||||
void FileAccessNetworkClient::_thread_func() {
|
void FileAccessNetworkClient::_thread_func() {
|
||||||
|
|
||||||
client->set_nodelay(true);
|
client->set_no_delay(true);
|
||||||
while (!quit) {
|
while (!quit) {
|
||||||
|
|
||||||
DEBUG_PRINT("SEM WAIT - " + itos(sem->get()));
|
DEBUG_PRINT("SEM WAIT - " + itos(sem->get()));
|
||||||
@@ -418,8 +418,6 @@ int FileAccessNetwork::get_buffer(uint8_t *p_dst, int p_length) const {
|
|||||||
if (page != last_page) {
|
if (page != last_page) {
|
||||||
buffer_mutex->lock();
|
buffer_mutex->lock();
|
||||||
if (pages[page].buffer.empty()) {
|
if (pages[page].buffer.empty()) {
|
||||||
//fuck
|
|
||||||
|
|
||||||
waiting_on_page = page;
|
waiting_on_page = page;
|
||||||
for (int j = 0; j < read_ahead; j++) {
|
for (int j = 0; j < read_ahead; j++) {
|
||||||
|
|
||||||
|
@@ -88,7 +88,11 @@ void PackedData::add_path(const String &pkg_path, const String &path, uint64_t o
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cd->files.insert(path.get_file());
|
String filename = path.get_file();
|
||||||
|
// Don't add as a file if the path points to a directoryy
|
||||||
|
if (!filename.empty()) {
|
||||||
|
cd->files.insert(filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include "http_client.h"
|
#include "http_client.h"
|
||||||
#include "io/stream_peer_ssl.h"
|
#include "io/stream_peer_ssl.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
const char *HTTPClient::_methods[METHOD_MAX] = {
|
const char *HTTPClient::_methods[METHOD_MAX] = {
|
||||||
"GET",
|
"GET",
|
||||||
@@ -121,16 +122,30 @@ Error HTTPClient::request_raw(Method p_method, const String &p_url, const Vector
|
|||||||
request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n";
|
request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n";
|
||||||
}
|
}
|
||||||
bool add_clen = p_body.size() > 0;
|
bool add_clen = p_body.size() > 0;
|
||||||
|
bool add_uagent = true;
|
||||||
|
bool add_accept = true;
|
||||||
for (int i = 0; i < p_headers.size(); i++) {
|
for (int i = 0; i < p_headers.size(); i++) {
|
||||||
request += p_headers[i] + "\r\n";
|
request += p_headers[i] + "\r\n";
|
||||||
if (add_clen && p_headers[i].find("Content-Length:") == 0) {
|
if (add_clen && p_headers[i].findn("Content-Length:") == 0) {
|
||||||
add_clen = false;
|
add_clen = false;
|
||||||
}
|
}
|
||||||
|
if (add_uagent && p_headers[i].findn("User-Agent:") == 0) {
|
||||||
|
add_uagent = false;
|
||||||
|
}
|
||||||
|
if (add_accept && p_headers[i].findn("Accept:") == 0) {
|
||||||
|
add_accept = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (add_clen) {
|
if (add_clen) {
|
||||||
request += "Content-Length: " + itos(p_body.size()) + "\r\n";
|
request += "Content-Length: " + itos(p_body.size()) + "\r\n";
|
||||||
// Should it add utf8 encoding?
|
// Should it add utf8 encoding?
|
||||||
}
|
}
|
||||||
|
if (add_uagent) {
|
||||||
|
request += "User-Agent: GodotEngine/" + String(VERSION_FULL_BUILD) + " (" + OS::get_singleton()->get_name() + ")\r\n";
|
||||||
|
}
|
||||||
|
if (add_accept) {
|
||||||
|
request += "Accept: */*\r\n";
|
||||||
|
}
|
||||||
request += "\r\n";
|
request += "\r\n";
|
||||||
CharString cs = request.utf8();
|
CharString cs = request.utf8();
|
||||||
|
|
||||||
@@ -173,17 +188,31 @@ Error HTTPClient::request(Method p_method, const String &p_url, const Vector<Str
|
|||||||
} else {
|
} else {
|
||||||
request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n";
|
request += "Host: " + conn_host + ":" + itos(conn_port) + "\r\n";
|
||||||
}
|
}
|
||||||
|
bool add_uagent = true;
|
||||||
|
bool add_accept = true;
|
||||||
bool add_clen = p_body.length() > 0;
|
bool add_clen = p_body.length() > 0;
|
||||||
for (int i = 0; i < p_headers.size(); i++) {
|
for (int i = 0; i < p_headers.size(); i++) {
|
||||||
request += p_headers[i] + "\r\n";
|
request += p_headers[i] + "\r\n";
|
||||||
if (add_clen && p_headers[i].find("Content-Length:") == 0) {
|
if (add_clen && p_headers[i].findn("Content-Length:") == 0) {
|
||||||
add_clen = false;
|
add_clen = false;
|
||||||
}
|
}
|
||||||
|
if (add_uagent && p_headers[i].findn("User-Agent:") == 0) {
|
||||||
|
add_uagent = false;
|
||||||
|
}
|
||||||
|
if (add_accept && p_headers[i].findn("Accept:") == 0) {
|
||||||
|
add_accept = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (add_clen) {
|
if (add_clen) {
|
||||||
request += "Content-Length: " + itos(p_body.utf8().length()) + "\r\n";
|
request += "Content-Length: " + itos(p_body.utf8().length()) + "\r\n";
|
||||||
// Should it add utf8 encoding?
|
// Should it add utf8 encoding?
|
||||||
}
|
}
|
||||||
|
if (add_uagent) {
|
||||||
|
request += "User-Agent: GodotEngine/" + String(VERSION_FULL_BUILD) + " (" + OS::get_singleton()->get_name() + ")\r\n";
|
||||||
|
}
|
||||||
|
if (add_accept) {
|
||||||
|
request += "Accept: */*\r\n";
|
||||||
|
}
|
||||||
request += "\r\n";
|
request += "\r\n";
|
||||||
request += p_body;
|
request += p_body;
|
||||||
|
|
||||||
@@ -298,7 +327,7 @@ Error HTTPClient::poll() {
|
|||||||
case StreamPeerTCP::STATUS_CONNECTED: {
|
case StreamPeerTCP::STATUS_CONNECTED: {
|
||||||
if (ssl) {
|
if (ssl) {
|
||||||
Ref<StreamPeerSSL> ssl = StreamPeerSSL::create();
|
Ref<StreamPeerSSL> ssl = StreamPeerSSL::create();
|
||||||
Error err = ssl->connect_to_stream(tcp_connection, ssl_verify_host, ssl_verify_host ? conn_host : String());
|
Error err = ssl->connect_to_stream(tcp_connection, ssl_verify_host, conn_host);
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
close();
|
close();
|
||||||
status = STATUS_SSL_HANDSHAKE_ERROR;
|
status = STATUS_SSL_HANDSHAKE_ERROR;
|
||||||
@@ -618,7 +647,27 @@ String HTTPClient::query_string_from_dict(const Dictionary &p_dict) {
|
|||||||
String query = "";
|
String query = "";
|
||||||
Array keys = p_dict.keys();
|
Array keys = p_dict.keys();
|
||||||
for (int i = 0; i < keys.size(); ++i) {
|
for (int i = 0; i < keys.size(); ++i) {
|
||||||
query += "&" + String(keys[i]).http_escape() + "=" + String(p_dict[keys[i]]).http_escape();
|
String encoded_key = String(keys[i]).http_escape();
|
||||||
|
Variant value = p_dict[keys[i]];
|
||||||
|
switch (value.get_type()) {
|
||||||
|
case Variant::ARRAY: {
|
||||||
|
// Repeat the key with every values
|
||||||
|
Array values = value;
|
||||||
|
for (int j = 0; j < values.size(); ++j) {
|
||||||
|
query += "&" + encoded_key + "=" + String(values[j]).http_escape();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Variant::NIL: {
|
||||||
|
// Add the key with no value
|
||||||
|
query += "&" + encoded_key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
// Add the key-value pair
|
||||||
|
query += "&" + encoded_key + "=" + String(value).http_escape();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
query.erase(0, 1);
|
query.erase(0, 1);
|
||||||
return query;
|
return query;
|
||||||
|
@@ -37,7 +37,7 @@ bool ImageFormatLoader::recognize(const String &p_extension) const {
|
|||||||
get_recognized_extensions(&extensions);
|
get_recognized_extensions(&extensions);
|
||||||
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
|
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
|
||||||
|
|
||||||
if (E->get().nocasecmp_to(p_extension.get_extension()) == 0)
|
if (E->get().nocasecmp_to(p_extension) == 0)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -211,7 +211,7 @@ IP_Address::IP_Address(const String &p_string) {
|
|||||||
clear();
|
clear();
|
||||||
|
|
||||||
if (p_string == "*") {
|
if (p_string == "*") {
|
||||||
// Wildcard (not a vaild IP)
|
// Wildcard (not a valid IP)
|
||||||
wildcard = true;
|
wildcard = true;
|
||||||
|
|
||||||
} else if (p_string.find(":") >= 0) {
|
} else if (p_string.find(":") >= 0) {
|
||||||
|
@@ -813,7 +813,7 @@ static void _encode_string(const String &p_string, uint8_t *&buf, int &r_len) {
|
|||||||
while (r_len % 4) {
|
while (r_len % 4) {
|
||||||
r_len++; //pad
|
r_len++; //pad
|
||||||
if (buf) {
|
if (buf) {
|
||||||
buf++;
|
*(buf++) = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -29,8 +29,8 @@
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
#include "pck_packer.h"
|
#include "pck_packer.h"
|
||||||
|
|
||||||
#include "core/os/file_access.h"
|
#include "core/os/file_access.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
static uint64_t _align(uint64_t p_n, int p_alignment) {
|
static uint64_t _align(uint64_t p_n, int p_alignment) {
|
||||||
|
|
||||||
@@ -70,9 +70,9 @@ Error PCKPacker::pck_start(const String &p_file, int p_alignment) {
|
|||||||
alignment = p_alignment;
|
alignment = p_alignment;
|
||||||
|
|
||||||
file->store_32(0x43504447); // MAGIC
|
file->store_32(0x43504447); // MAGIC
|
||||||
file->store_32(0); // # version
|
file->store_32(1); // # version
|
||||||
file->store_32(0); // # major
|
file->store_32(VERSION_MAJOR); // # major
|
||||||
file->store_32(0); // # minor
|
file->store_32(VERSION_MINOR); // # minor
|
||||||
file->store_32(0); // # revision
|
file->store_32(0); // # revision
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
|
@@ -1124,7 +1124,7 @@ Error ResourceFormatLoaderBinary::rename_dependencies(const String &p_path, cons
|
|||||||
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||||
da->remove(p_path + ".depren");
|
da->remove(p_path + ".depren");
|
||||||
memdelete(da);
|
memdelete(da);
|
||||||
//fuck it, use the old approach;
|
//use the old approach
|
||||||
|
|
||||||
WARN_PRINT(("This file is old, so it can't refactor dependencies, opening and resaving: " + p_path).utf8().get_data());
|
WARN_PRINT(("This file is old, so it can't refactor dependencies, opening and resaving: " + p_path).utf8().get_data());
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ Error ResourceSaver::save(const String &p_path, const RES &p_resource, uint32_t
|
|||||||
|
|
||||||
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
|
for (List<String>::Element *E = extensions.front(); E; E = E->next()) {
|
||||||
|
|
||||||
if (E->get().nocasecmp_to(extension.get_extension()) == 0)
|
if (E->get().nocasecmp_to(extension) == 0)
|
||||||
recognized = true;
|
recognized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -310,7 +310,7 @@ float StreamPeer::get_float() {
|
|||||||
return decode_float(buf);
|
return decode_float(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
float StreamPeer::get_double() {
|
double StreamPeer::get_double() {
|
||||||
|
|
||||||
uint8_t buf[8];
|
uint8_t buf[8];
|
||||||
get_data(buf, 8);
|
get_data(buf, 8);
|
||||||
|
@@ -83,7 +83,7 @@ public:
|
|||||||
uint64_t get_u64();
|
uint64_t get_u64();
|
||||||
int64_t get_64();
|
int64_t get_64();
|
||||||
float get_float();
|
float get_float();
|
||||||
float get_double();
|
double get_double();
|
||||||
String get_string(int p_bytes);
|
String get_string(int p_bytes);
|
||||||
String get_utf8_string(int p_bytes);
|
String get_utf8_string(int p_bytes);
|
||||||
Variant get_var();
|
Variant get_var();
|
||||||
|
@@ -55,6 +55,7 @@ void StreamPeerTCP::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("get_connected_host"), &StreamPeerTCP::get_connected_host);
|
ClassDB::bind_method(D_METHOD("get_connected_host"), &StreamPeerTCP::get_connected_host);
|
||||||
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
|
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
|
||||||
ClassDB::bind_method(D_METHOD("disconnect_from_host"), &StreamPeerTCP::disconnect_from_host);
|
ClassDB::bind_method(D_METHOD("disconnect_from_host"), &StreamPeerTCP::disconnect_from_host);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_no_delay", "enabled"), &StreamPeerTCP::set_no_delay);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(STATUS_NONE);
|
BIND_ENUM_CONSTANT(STATUS_NONE);
|
||||||
BIND_ENUM_CONSTANT(STATUS_CONNECTING);
|
BIND_ENUM_CONSTANT(STATUS_CONNECTING);
|
||||||
|
@@ -65,7 +65,7 @@ public:
|
|||||||
virtual void disconnect_from_host() = 0;
|
virtual void disconnect_from_host() = 0;
|
||||||
virtual IP_Address get_connected_host() const = 0;
|
virtual IP_Address get_connected_host() const = 0;
|
||||||
virtual uint16_t get_connected_port() const = 0;
|
virtual uint16_t get_connected_port() const = 0;
|
||||||
virtual void set_nodelay(bool p_enabled) = 0;
|
virtual void set_no_delay(bool p_enabled) = 0;
|
||||||
|
|
||||||
static Ref<StreamPeerTCP> create_ref();
|
static Ref<StreamPeerTCP> create_ref();
|
||||||
static StreamPeerTCP *create();
|
static StreamPeerTCP *create();
|
||||||
|
@@ -244,7 +244,7 @@ def make_version(template, nargs, argmax, const, ret):
|
|||||||
|
|
||||||
def run(target, source, env):
|
def run(target, source, env):
|
||||||
|
|
||||||
versions = 11
|
versions = 13
|
||||||
versions_ext = 6
|
versions_ext = 6
|
||||||
text = ""
|
text = ""
|
||||||
text_ext = ""
|
text_ext = ""
|
||||||
|
@@ -197,7 +197,7 @@ private:
|
|||||||
if (node->right != _data._nil) {
|
if (node->right != _data._nil) {
|
||||||
|
|
||||||
node = node->right;
|
node = node->right;
|
||||||
while (node->left != _data._nil) { /* returns the minium of the right subtree of node */
|
while (node->left != _data._nil) { /* returns the minimum of the right subtree of node */
|
||||||
node = node->left;
|
node = node->left;
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
@@ -219,7 +219,7 @@ private:
|
|||||||
if (node->left != _data._nil) {
|
if (node->left != _data._nil) {
|
||||||
|
|
||||||
node = node->left;
|
node = node->left;
|
||||||
while (node->right != _data._nil) { /* returns the minium of the left subtree of node */
|
while (node->right != _data._nil) { /* returns the minimum of the left subtree of node */
|
||||||
node = node->right;
|
node = node->right;
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
|
@@ -108,6 +108,16 @@ Vector2 Vector2::floor() const {
|
|||||||
return Vector2(Math::floor(x), Math::floor(y));
|
return Vector2(Math::floor(x), Math::floor(y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector2 Vector2::ceil() const {
|
||||||
|
|
||||||
|
return Vector2(Math::ceil(x), Math::ceil(y));
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 Vector2::round() const {
|
||||||
|
|
||||||
|
return Vector2(Math::round(x), Math::round(y));
|
||||||
|
}
|
||||||
|
|
||||||
Vector2 Vector2::rotated(real_t p_by) const {
|
Vector2 Vector2::rotated(real_t p_by) const {
|
||||||
|
|
||||||
Vector2 v;
|
Vector2 v;
|
||||||
|
@@ -163,6 +163,8 @@ struct Vector2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Vector2 floor() const;
|
Vector2 floor() const;
|
||||||
|
Vector2 ceil() const;
|
||||||
|
Vector2 round() const;
|
||||||
Vector2 snapped(const Vector2 &p_by) const;
|
Vector2 snapped(const Vector2 &p_by) const;
|
||||||
real_t aspect() const { return width / height; }
|
real_t aspect() const { return width / height; }
|
||||||
|
|
||||||
@@ -304,7 +306,7 @@ struct Rect2 {
|
|||||||
|
|
||||||
inline real_t distance_to(const Vector2 &p_point) const {
|
inline real_t distance_to(const Vector2 &p_point) const {
|
||||||
|
|
||||||
real_t dist;
|
real_t dist = 0.0;
|
||||||
bool inside = true;
|
bool inside = true;
|
||||||
|
|
||||||
if (p_point.x < position.x) {
|
if (p_point.x < position.x) {
|
||||||
|
@@ -89,7 +89,7 @@ void Quat::set_euler_yxz(const Vector3 &p_euler) {
|
|||||||
|
|
||||||
set(sin_a1 * cos_a2 * sin_a3 + cos_a1 * sin_a2 * cos_a3,
|
set(sin_a1 * cos_a2 * sin_a3 + cos_a1 * sin_a2 * cos_a3,
|
||||||
sin_a1 * cos_a2 * cos_a3 - cos_a1 * sin_a2 * sin_a3,
|
sin_a1 * cos_a2 * cos_a3 - cos_a1 * sin_a2 * sin_a3,
|
||||||
-sin_a1 * sin_a2 * cos_a3 + cos_a1 * sin_a2 * sin_a3,
|
-sin_a1 * sin_a2 * cos_a3 + cos_a1 * cos_a2 * sin_a3,
|
||||||
sin_a1 * sin_a2 * sin_a3 + cos_a1 * cos_a2 * cos_a3);
|
sin_a1 * sin_a2 * sin_a3 + cos_a1 * cos_a2 * cos_a3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -51,7 +51,8 @@ real_t Triangulate::get_area(const Vector<Vector2> &contour) {
|
|||||||
bool Triangulate::is_inside_triangle(real_t Ax, real_t Ay,
|
bool Triangulate::is_inside_triangle(real_t Ax, real_t Ay,
|
||||||
real_t Bx, real_t By,
|
real_t Bx, real_t By,
|
||||||
real_t Cx, real_t Cy,
|
real_t Cx, real_t Cy,
|
||||||
real_t Px, real_t Py)
|
real_t Px, real_t Py,
|
||||||
|
bool include_edges)
|
||||||
|
|
||||||
{
|
{
|
||||||
real_t ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy;
|
real_t ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy;
|
||||||
@@ -74,10 +75,14 @@ bool Triangulate::is_inside_triangle(real_t Ax, real_t Ay,
|
|||||||
cCROSSap = cx * apy - cy * apx;
|
cCROSSap = cx * apy - cy * apx;
|
||||||
bCROSScp = bx * cpy - by * cpx;
|
bCROSScp = bx * cpy - by * cpx;
|
||||||
|
|
||||||
return ((aCROSSbp >= 0.0) && (bCROSScp >= 0.0) && (cCROSSap >= 0.0));
|
if (include_edges) {
|
||||||
|
return ((aCROSSbp > 0.0) && (bCROSScp > 0.0) && (cCROSSap > 0.0));
|
||||||
|
} else {
|
||||||
|
return ((aCROSSbp >= 0.0) && (bCROSScp >= 0.0) && (cCROSSap >= 0.0));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool Triangulate::snip(const Vector<Vector2> &p_contour, int u, int v, int w, int n, const Vector<int> &V) {
|
bool Triangulate::snip(const Vector<Vector2> &p_contour, int u, int v, int w, int n, const Vector<int> &V, bool relaxed) {
|
||||||
int p;
|
int p;
|
||||||
real_t Ax, Ay, Bx, By, Cx, Cy, Px, Py;
|
real_t Ax, Ay, Bx, By, Cx, Cy, Px, Py;
|
||||||
const Vector2 *contour = &p_contour[0];
|
const Vector2 *contour = &p_contour[0];
|
||||||
@@ -91,13 +96,20 @@ bool Triangulate::snip(const Vector<Vector2> &p_contour, int u, int v, int w, in
|
|||||||
Cx = contour[V[w]].x;
|
Cx = contour[V[w]].x;
|
||||||
Cy = contour[V[w]].y;
|
Cy = contour[V[w]].y;
|
||||||
|
|
||||||
if (CMP_EPSILON > (((Bx - Ax) * (Cy - Ay)) - ((By - Ay) * (Cx - Ax)))) return false;
|
// It can happen that the triangulation ends up with three aligned vertices to deal with.
|
||||||
|
// In this scenario, making the check below strict may reject the possibility of
|
||||||
|
// forming a last triangle with these aligned vertices, preventing the triangulatiom
|
||||||
|
// from completing.
|
||||||
|
// To avoid that we allow zero-area triangles if all else failed.
|
||||||
|
float threshold = relaxed ? -CMP_EPSILON : CMP_EPSILON;
|
||||||
|
|
||||||
|
if (threshold > (((Bx - Ax) * (Cy - Ay)) - ((By - Ay) * (Cx - Ax)))) return false;
|
||||||
|
|
||||||
for (p = 0; p < n; p++) {
|
for (p = 0; p < n; p++) {
|
||||||
if ((p == u) || (p == v) || (p == w)) continue;
|
if ((p == u) || (p == v) || (p == w)) continue;
|
||||||
Px = contour[V[p]].x;
|
Px = contour[V[p]].x;
|
||||||
Py = contour[V[p]].y;
|
Py = contour[V[p]].y;
|
||||||
if (is_inside_triangle(Ax, Ay, Bx, By, Cx, Cy, Px, Py)) return false;
|
if (is_inside_triangle(Ax, Ay, Bx, By, Cx, Cy, Px, Py, relaxed)) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -121,6 +133,8 @@ bool Triangulate::triangulate(const Vector<Vector2> &contour, Vector<int> &resul
|
|||||||
for (int v = 0; v < n; v++)
|
for (int v = 0; v < n; v++)
|
||||||
V[v] = (n - 1) - v;
|
V[v] = (n - 1) - v;
|
||||||
|
|
||||||
|
bool relaxed = false;
|
||||||
|
|
||||||
int nv = n;
|
int nv = n;
|
||||||
|
|
||||||
/* remove nv-2 Vertices, creating 1 triangle every time */
|
/* remove nv-2 Vertices, creating 1 triangle every time */
|
||||||
@@ -129,8 +143,20 @@ bool Triangulate::triangulate(const Vector<Vector2> &contour, Vector<int> &resul
|
|||||||
for (int v = nv - 1; nv > 2;) {
|
for (int v = nv - 1; nv > 2;) {
|
||||||
/* if we loop, it is probably a non-simple polygon */
|
/* if we loop, it is probably a non-simple polygon */
|
||||||
if (0 >= (count--)) {
|
if (0 >= (count--)) {
|
||||||
//** Triangulate: ERROR - probable bad polygon!
|
if (relaxed) {
|
||||||
return false;
|
//** Triangulate: ERROR - probable bad polygon!
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// There may be aligned vertices that the strict
|
||||||
|
// checks prevent from triangulating. In this situation
|
||||||
|
// we are better off adding flat triangles than
|
||||||
|
// failing, so we relax the checks and try one last
|
||||||
|
// round.
|
||||||
|
// Only relaxing the constraints as a last resort avoids
|
||||||
|
// degenerate triangles when they aren't necessary.
|
||||||
|
count = 2 * nv;
|
||||||
|
relaxed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* three consecutive vertices in current polygon, <u,v,w> */
|
/* three consecutive vertices in current polygon, <u,v,w> */
|
||||||
@@ -141,7 +167,7 @@ bool Triangulate::triangulate(const Vector<Vector2> &contour, Vector<int> &resul
|
|||||||
int w = v + 1;
|
int w = v + 1;
|
||||||
if (nv <= w) w = 0; /* next */
|
if (nv <= w) w = 0; /* next */
|
||||||
|
|
||||||
if (snip(contour, u, v, w, nv, V)) {
|
if (snip(contour, u, v, w, nv, V, relaxed)) {
|
||||||
int a, b, c, s, t;
|
int a, b, c, s, t;
|
||||||
|
|
||||||
/* true names of the vertices */
|
/* true names of the vertices */
|
||||||
|
@@ -51,10 +51,11 @@ public:
|
|||||||
static bool is_inside_triangle(real_t Ax, real_t Ay,
|
static bool is_inside_triangle(real_t Ax, real_t Ay,
|
||||||
real_t Bx, real_t By,
|
real_t Bx, real_t By,
|
||||||
real_t Cx, real_t Cy,
|
real_t Cx, real_t Cy,
|
||||||
real_t Px, real_t Py);
|
real_t Px, real_t Py,
|
||||||
|
bool include_edges);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool snip(const Vector<Vector2> &p_contour, int u, int v, int w, int n, const Vector<int> &V);
|
static bool snip(const Vector<Vector2> &p_contour, int u, int v, int w, int n, const Vector<int> &V, bool relaxed);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -103,6 +103,7 @@ struct Vector3 {
|
|||||||
_FORCE_INLINE_ Vector3 floor() const;
|
_FORCE_INLINE_ Vector3 floor() const;
|
||||||
_FORCE_INLINE_ Vector3 sign() const;
|
_FORCE_INLINE_ Vector3 sign() const;
|
||||||
_FORCE_INLINE_ Vector3 ceil() const;
|
_FORCE_INLINE_ Vector3 ceil() const;
|
||||||
|
_FORCE_INLINE_ Vector3 round() const;
|
||||||
|
|
||||||
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_b) const;
|
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_b) const;
|
||||||
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_b) const;
|
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_b) const;
|
||||||
@@ -204,6 +205,11 @@ Vector3 Vector3::ceil() const {
|
|||||||
return Vector3(Math::ceil(x), Math::ceil(y), Math::ceil(z));
|
return Vector3(Math::ceil(x), Math::ceil(y), Math::ceil(z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector3 Vector3::round() const {
|
||||||
|
|
||||||
|
return Vector3(Math::round(x), Math::round(y), Math::round(z));
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const {
|
Vector3 Vector3::linear_interpolate(const Vector3 &p_b, real_t p_t) const {
|
||||||
|
|
||||||
return Vector3(
|
return Vector3(
|
||||||
|
@@ -278,7 +278,7 @@ void MessageQueue::flush() {
|
|||||||
|
|
||||||
while (read_pos < buffer_end) {
|
while (read_pos < buffer_end) {
|
||||||
|
|
||||||
//lock on each interation, so a call can re-add itself to the message queue
|
//lock on each iteration, so a call can re-add itself to the message queue
|
||||||
|
|
||||||
Message *message = (Message *)&buffer[read_pos];
|
Message *message = (Message *)&buffer[read_pos];
|
||||||
|
|
||||||
|
@@ -301,8 +301,8 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {
|
|||||||
FileAccess *fsrc = FileAccess::open(p_from, FileAccess::READ, &err);
|
FileAccess *fsrc = FileAccess::open(p_from, FileAccess::READ, &err);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
|
ERR_PRINTS("Failed to open " + p_from);
|
||||||
ERR_FAIL_COND_V(err, err);
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileAccess *fdst = FileAccess::open(p_to, FileAccess::WRITE, &err);
|
FileAccess *fdst = FileAccess::open(p_to, FileAccess::WRITE, &err);
|
||||||
@@ -310,7 +310,8 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {
|
|||||||
|
|
||||||
fsrc->close();
|
fsrc->close();
|
||||||
memdelete(fsrc);
|
memdelete(fsrc);
|
||||||
ERR_FAIL_COND_V(err, err);
|
ERR_PRINTS("Failed to open " + p_to);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
fsrc->seek_end(0);
|
fsrc->seek_end(0);
|
||||||
|
@@ -479,6 +479,9 @@ void FileAccess::store_double(double p_dest) {
|
|||||||
|
|
||||||
uint64_t FileAccess::get_modified_time(const String &p_file) {
|
uint64_t FileAccess::get_modified_time(const String &p_file) {
|
||||||
|
|
||||||
|
if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file))
|
||||||
|
return 0;
|
||||||
|
|
||||||
FileAccess *fa = create_for_path(p_file);
|
FileAccess *fa = create_for_path(p_file);
|
||||||
ERR_FAIL_COND_V(!fa, 0);
|
ERR_FAIL_COND_V(!fa, 0);
|
||||||
|
|
||||||
|
@@ -89,6 +89,9 @@ public:
|
|||||||
virtual void close() = 0; ///< close a file
|
virtual void close() = 0; ///< close a file
|
||||||
virtual bool is_open() const = 0; ///< true when file is open
|
virtual bool is_open() const = 0; ///< true when file is open
|
||||||
|
|
||||||
|
virtual String get_path() const { return ""; } /// returns the path for the current open file
|
||||||
|
virtual String get_path_absolute() const { return ""; } /// returns the absolute path for the current open file
|
||||||
|
|
||||||
virtual void seek(size_t p_position) = 0; ///< seek to a given position
|
virtual void seek(size_t p_position) = 0; ///< seek to a given position
|
||||||
virtual void seek_end(int64_t p_position = 0) = 0; ///< seek from the end of file
|
virtual void seek_end(int64_t p_position = 0) = 0; ///< seek from the end of file
|
||||||
virtual size_t get_position() const = 0; ///< get position in the file
|
virtual size_t get_position() const = 0; ///< get position in the file
|
||||||
|
@@ -118,6 +118,7 @@ public:
|
|||||||
void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const;
|
void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const;
|
||||||
|
|
||||||
virtual bool is_emulating_touchscreen() const = 0;
|
virtual bool is_emulating_touchscreen() const = 0;
|
||||||
|
virtual bool is_emulating_mouse_from_touch() const = 0;
|
||||||
|
|
||||||
virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()) = 0;
|
virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape = CURSOR_ARROW, const Vector2 &p_hotspot = Vector2()) = 0;
|
||||||
virtual void set_mouse_in_window(bool p_in_window) = 0;
|
virtual void set_mouse_in_window(bool p_in_window) = 0;
|
||||||
|
@@ -962,6 +962,11 @@ Ref<InputEvent> InputEventMagnifyGesture::xformed_by(const Transform2D &p_xform,
|
|||||||
return ev;
|
return ev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String InputEventMagnifyGesture::as_text() const {
|
||||||
|
|
||||||
|
return "InputEventMagnifyGesture : factor=" + rtos(get_factor()) + ", position=(" + String(get_position()) + ")";
|
||||||
|
}
|
||||||
|
|
||||||
void InputEventMagnifyGesture::_bind_methods() {
|
void InputEventMagnifyGesture::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_factor", "factor"), &InputEventMagnifyGesture::set_factor);
|
ClassDB::bind_method(D_METHOD("set_factor", "factor"), &InputEventMagnifyGesture::set_factor);
|
||||||
@@ -999,6 +1004,11 @@ Ref<InputEvent> InputEventPanGesture::xformed_by(const Transform2D &p_xform, con
|
|||||||
return ev;
|
return ev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String InputEventPanGesture::as_text() const {
|
||||||
|
|
||||||
|
return "InputEventPanGesture : delta=(" + String(get_delta()) + "), position=(" + String(get_position()) + ")";
|
||||||
|
}
|
||||||
|
|
||||||
void InputEventPanGesture::_bind_methods() {
|
void InputEventPanGesture::_bind_methods() {
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_delta", "delta"), &InputEventPanGesture::set_delta);
|
ClassDB::bind_method(D_METHOD("set_delta", "delta"), &InputEventPanGesture::set_delta);
|
||||||
|
@@ -494,6 +494,7 @@ public:
|
|||||||
real_t get_factor() const;
|
real_t get_factor() const;
|
||||||
|
|
||||||
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const;
|
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const;
|
||||||
|
virtual String as_text() const;
|
||||||
|
|
||||||
InputEventMagnifyGesture();
|
InputEventMagnifyGesture();
|
||||||
};
|
};
|
||||||
@@ -511,6 +512,7 @@ public:
|
|||||||
Vector2 get_delta() const;
|
Vector2 get_delta() const;
|
||||||
|
|
||||||
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const;
|
virtual Ref<InputEvent> xformed_by(const Transform2D &p_xform, const Vector2 &p_local_ofs = Vector2()) const;
|
||||||
|
virtual String as_text() const;
|
||||||
|
|
||||||
InputEventPanGesture();
|
InputEventPanGesture();
|
||||||
};
|
};
|
||||||
|
@@ -616,6 +616,17 @@ bool OS::has_feature(const String &p_feature) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OS::center_window() {
|
||||||
|
|
||||||
|
if (is_window_fullscreen()) return;
|
||||||
|
|
||||||
|
Size2 scr = get_screen_size(get_current_screen());
|
||||||
|
Size2 wnd = get_real_window_size();
|
||||||
|
int x = scr.width / 2 - wnd.width / 2;
|
||||||
|
int y = scr.height / 2 - wnd.height / 2;
|
||||||
|
set_window_position(Vector2(x, y));
|
||||||
|
}
|
||||||
|
|
||||||
OS::OS() {
|
OS::OS() {
|
||||||
void *volatile stack_bottom;
|
void *volatile stack_bottom;
|
||||||
|
|
||||||
|
20
core/os/os.h
20
core/os/os.h
@@ -94,15 +94,17 @@ public:
|
|||||||
bool resizable;
|
bool resizable;
|
||||||
bool borderless_window;
|
bool borderless_window;
|
||||||
bool maximized;
|
bool maximized;
|
||||||
|
bool always_on_top;
|
||||||
bool use_vsync;
|
bool use_vsync;
|
||||||
float get_aspect() const { return (float)width / (float)height; }
|
float get_aspect() const { return (float)width / (float)height; }
|
||||||
VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false, bool p_use_vsync = false) {
|
VideoMode(int p_width = 1024, int p_height = 600, bool p_fullscreen = false, bool p_resizable = true, bool p_borderless_window = false, bool p_maximized = false, bool p_always_on_top = false, bool p_use_vsync = false) {
|
||||||
width = p_width;
|
width = p_width;
|
||||||
height = p_height;
|
height = p_height;
|
||||||
fullscreen = p_fullscreen;
|
fullscreen = p_fullscreen;
|
||||||
resizable = p_resizable;
|
resizable = p_resizable;
|
||||||
borderless_window = p_borderless_window;
|
borderless_window = p_borderless_window;
|
||||||
maximized = p_maximized;
|
maximized = p_maximized;
|
||||||
|
always_on_top = p_always_on_top;
|
||||||
use_vsync = p_use_vsync;
|
use_vsync = p_use_vsync;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -182,6 +184,7 @@ public:
|
|||||||
virtual Point2 get_window_position() const { return Vector2(); }
|
virtual Point2 get_window_position() const { return Vector2(); }
|
||||||
virtual void set_window_position(const Point2 &p_position) {}
|
virtual void set_window_position(const Point2 &p_position) {}
|
||||||
virtual Size2 get_window_size() const = 0;
|
virtual Size2 get_window_size() const = 0;
|
||||||
|
virtual Size2 get_real_window_size() const { return get_window_size(); }
|
||||||
virtual void set_window_size(const Size2 p_size) {}
|
virtual void set_window_size(const Size2 p_size) {}
|
||||||
virtual void set_window_fullscreen(bool p_enabled) {}
|
virtual void set_window_fullscreen(bool p_enabled) {}
|
||||||
virtual bool is_window_fullscreen() const { return true; }
|
virtual bool is_window_fullscreen() const { return true; }
|
||||||
@@ -191,7 +194,22 @@ public:
|
|||||||
virtual bool is_window_minimized() const { return false; }
|
virtual bool is_window_minimized() const { return false; }
|
||||||
virtual void set_window_maximized(bool p_enabled) {}
|
virtual void set_window_maximized(bool p_enabled) {}
|
||||||
virtual bool is_window_maximized() const { return true; }
|
virtual bool is_window_maximized() const { return true; }
|
||||||
|
virtual void set_window_always_on_top(bool p_enabled) {}
|
||||||
|
virtual bool is_window_always_on_top() const { return false; }
|
||||||
virtual void request_attention() {}
|
virtual void request_attention() {}
|
||||||
|
virtual void center_window();
|
||||||
|
|
||||||
|
// Returns window area free of hardware controls and other obstacles.
|
||||||
|
// The application should use this to determine where to place UI elements.
|
||||||
|
//
|
||||||
|
// Keep in mind the area returned is in window coordinates rather than
|
||||||
|
// viewport coordinates - you should perform the conversion on your own.
|
||||||
|
//
|
||||||
|
// The maximum size of the area is Rect2(0, 0, window_size.width, window_size.height).
|
||||||
|
virtual Rect2 get_window_safe_area() const {
|
||||||
|
Size2 window_size = get_window_size();
|
||||||
|
return Rect2(0, 0, window_size.width, window_size.height);
|
||||||
|
}
|
||||||
|
|
||||||
virtual void set_borderless_window(bool p_borderless) {}
|
virtual void set_borderless_window(bool p_borderless) {}
|
||||||
virtual bool get_borderless_window() { return 0; }
|
virtual bool get_borderless_window() { return 0; }
|
||||||
|
@@ -90,7 +90,7 @@ bool PoolAllocator::find_hole(EntryArrayPos *p_pos, int p_for_size) {
|
|||||||
|
|
||||||
int hole_size = entry.pos - prev_entry_end_pos;
|
int hole_size = entry.pos - prev_entry_end_pos;
|
||||||
|
|
||||||
/* detemine if what we want fits in that hole */
|
/* determine if what we want fits in that hole */
|
||||||
if (hole_size >= p_for_size) {
|
if (hole_size >= p_for_size) {
|
||||||
*p_pos = i;
|
*p_pos = i;
|
||||||
return true;
|
return true;
|
||||||
@@ -100,7 +100,7 @@ bool PoolAllocator::find_hole(EntryArrayPos *p_pos, int p_for_size) {
|
|||||||
prev_entry_end_pos = entry_end(entry);
|
prev_entry_end_pos = entry_end(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No holes between entrys, check at the end..*/
|
/* No holes between entries, check at the end..*/
|
||||||
|
|
||||||
if ((pool_size - prev_entry_end_pos) >= p_for_size) {
|
if ((pool_size - prev_entry_end_pos) >= p_for_size) {
|
||||||
*p_pos = entry_count;
|
*p_pos = entry_count;
|
||||||
|
@@ -268,12 +268,12 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
|
|
||||||
if (FileAccessNetworkClient::get_singleton()) {
|
if (FileAccessNetworkClient::get_singleton()) {
|
||||||
|
|
||||||
if (_load_settings("res://project.godot") == OK || _load_settings_binary("res://project.binary") == OK) {
|
Error err = _load_settings_text_or_binary("res://project.godot", "res://project.binary");
|
||||||
|
if (err == OK) {
|
||||||
_load_settings("res://override.cfg");
|
// Optional, we don't mind if it fails
|
||||||
|
_load_settings_text("res://override.cfg");
|
||||||
}
|
}
|
||||||
|
return err;
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String exec_path = OS::get_singleton()->get_executable_path();
|
String exec_path = OS::get_singleton()->get_executable_path();
|
||||||
@@ -285,12 +285,13 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
bool ok = _load_resource_pack(p_main_pack);
|
bool ok = _load_resource_pack(p_main_pack);
|
||||||
ERR_FAIL_COND_V(!ok, ERR_CANT_OPEN);
|
ERR_FAIL_COND_V(!ok, ERR_CANT_OPEN);
|
||||||
|
|
||||||
if (_load_settings("res://project.godot") == OK || _load_settings_binary("res://project.binary") == OK) {
|
Error err = _load_settings_text_or_binary("res://project.godot", "res://project.binary");
|
||||||
//load override from location of the main pack
|
if (err == OK) {
|
||||||
_load_settings(p_main_pack.get_base_dir().plus_file("override.cfg"));
|
// Load override from location of the main pack
|
||||||
|
// Optional, we don't mind if it fails
|
||||||
|
_load_settings_text(p_main_pack.get_base_dir().plus_file("override.cfg"));
|
||||||
}
|
}
|
||||||
|
return err;
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Attempt with execname.pck
|
//Attempt with execname.pck
|
||||||
@@ -313,12 +314,13 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
|
|
||||||
// if we opened our package, try and load our project...
|
// if we opened our package, try and load our project...
|
||||||
if (found) {
|
if (found) {
|
||||||
if (_load_settings("res://project.godot") == OK || _load_settings_binary("res://project.binary") == OK) {
|
Error err = _load_settings_text_or_binary("res://project.godot", "res://project.binary");
|
||||||
// load override from location of executable
|
if (err == OK) {
|
||||||
_load_settings(exec_path.get_base_dir().plus_file("override.cfg"));
|
// Load override from location of executable
|
||||||
|
// Optional, we don't mind if it fails
|
||||||
|
_load_settings_text(exec_path.get_base_dir().plus_file("override.cfg"));
|
||||||
}
|
}
|
||||||
|
return err;
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,11 +336,13 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
// data.pck and data.zip are deprecated and no longer supported, apologies.
|
// data.pck and data.zip are deprecated and no longer supported, apologies.
|
||||||
// make sure this is loaded from the resource path
|
// make sure this is loaded from the resource path
|
||||||
|
|
||||||
if (_load_settings("res://project.godot") == OK || _load_settings_binary("res://project.binary") == OK) {
|
Error err = _load_settings_text_or_binary("res://project.godot", "res://project.binary");
|
||||||
_load_settings("res://override.cfg");
|
if (err == OK) {
|
||||||
|
// Optional, we don't mind if it fails
|
||||||
|
_load_settings_text("res://override.cfg");
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Nothing was found, try to find a project.godot somewhere!
|
//Nothing was found, try to find a project.godot somewhere!
|
||||||
@@ -350,20 +354,23 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
|
|
||||||
String candidate = d->get_current_dir();
|
String candidate = d->get_current_dir();
|
||||||
String current_dir = d->get_current_dir();
|
String current_dir = d->get_current_dir();
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
Error err;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
//try to load settings in ascending through dirs shape!
|
|
||||||
|
|
||||||
if (_load_settings(current_dir + "/project.godot") == OK || _load_settings_binary(current_dir + "/project.binary") == OK) {
|
err = _load_settings_text_or_binary(current_dir.plus_file("project.godot"), current_dir.plus_file("project.binary"));
|
||||||
|
if (err == OK) {
|
||||||
_load_settings(current_dir + "/override.cfg");
|
// Optional, we don't mind if it fails
|
||||||
|
_load_settings_text(current_dir.plus_file("override.cfg"));
|
||||||
candidate = current_dir;
|
candidate = current_dir;
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_upwards) {
|
if (p_upwards) {
|
||||||
|
// Try to load settings ascending through dirs shape!
|
||||||
d->change_dir("..");
|
d->change_dir("..");
|
||||||
if (d->get_current_dir() == current_dir)
|
if (d->get_current_dir() == current_dir)
|
||||||
break; //not doing anything useful
|
break; //not doing anything useful
|
||||||
@@ -378,7 +385,7 @@ Error ProjectSettings::setup(const String &p_path, const String &p_main_pack, bo
|
|||||||
memdelete(d);
|
memdelete(d);
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
return ERR_FILE_NOT_FOUND;
|
return err;
|
||||||
|
|
||||||
if (resource_path.length() && resource_path[resource_path.length() - 1] == '/')
|
if (resource_path.length() && resource_path[resource_path.length() - 1] == '/')
|
||||||
resource_path = resource_path.substr(0, resource_path.length() - 1); // chop end
|
resource_path = resource_path.substr(0, resource_path.length() - 1); // chop end
|
||||||
@@ -440,13 +447,17 @@ Error ProjectSettings::_load_settings_binary(const String p_path) {
|
|||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
Error ProjectSettings::_load_settings(const String p_path) {
|
|
||||||
|
Error ProjectSettings::_load_settings_text(const String p_path) {
|
||||||
|
|
||||||
Error err;
|
Error err;
|
||||||
FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
|
FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err);
|
||||||
|
|
||||||
if (!f)
|
if (!f) {
|
||||||
return ERR_CANT_OPEN;
|
// FIXME: Above 'err' error code is ERR_FILE_CANT_OPEN if the file is missing
|
||||||
|
// This needs to be streamlined if we want decent error reporting
|
||||||
|
return ERR_FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
VariantParser::StreamFile stream;
|
VariantParser::StreamFile stream;
|
||||||
stream.f = f;
|
stream.f = f;
|
||||||
@@ -471,7 +482,7 @@ Error ProjectSettings::_load_settings(const String p_path) {
|
|||||||
memdelete(f);
|
memdelete(f);
|
||||||
return OK;
|
return OK;
|
||||||
} else if (err != OK) {
|
} else if (err != OK) {
|
||||||
ERR_PRINTS("ProjectSettings::load - " + p_path + ":" + itos(lines) + " error: " + error_text);
|
ERR_PRINTS("Error parsing " + p_path + " at line " + itos(lines) + ": " + error_text + " File might be corrupted.");
|
||||||
memdelete(f);
|
memdelete(f);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -497,6 +508,23 @@ Error ProjectSettings::_load_settings(const String p_path) {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Error ProjectSettings::_load_settings_text_or_binary(const String p_text_path, const String p_bin_path) {
|
||||||
|
|
||||||
|
// Attempt first to load the text-based project.godot file
|
||||||
|
Error err_text = _load_settings_text(p_text_path);
|
||||||
|
if (err_text == OK) {
|
||||||
|
return OK;
|
||||||
|
} else if (err_text != ERR_FILE_NOT_FOUND) {
|
||||||
|
// If the text-based file exists but can't be loaded, we want to know it
|
||||||
|
ERR_PRINTS("Couldn't load file '" + p_text_path + "', error code " + itos(err_text) + ".");
|
||||||
|
return err_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to binary project.binary file if text-based was not found
|
||||||
|
Error err_bin = _load_settings_binary(p_bin_path);
|
||||||
|
return err_bin;
|
||||||
|
}
|
||||||
|
|
||||||
int ProjectSettings::get_order(const String &p_name) const {
|
int ProjectSettings::get_order(const String &p_name) const {
|
||||||
|
|
||||||
ERR_FAIL_COND_V(!props.has(p_name), -1);
|
ERR_FAIL_COND_V(!props.has(p_name), -1);
|
||||||
@@ -525,7 +553,7 @@ void ProjectSettings::clear(const String &p_name) {
|
|||||||
|
|
||||||
Error ProjectSettings::save() {
|
Error ProjectSettings::save() {
|
||||||
|
|
||||||
return save_custom(get_resource_path() + "/project.godot");
|
return save_custom(get_resource_path().plus_file("project.godot"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Error ProjectSettings::_save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom, const String &p_custom_features) {
|
Error ProjectSettings::_save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom, const String &p_custom_features) {
|
||||||
@@ -664,7 +692,10 @@ Error ProjectSettings::_save_settings_text(const String &p_file, const Map<Strin
|
|||||||
|
|
||||||
String vstr;
|
String vstr;
|
||||||
VariantWriter::write_to_string(value, vstr);
|
VariantWriter::write_to_string(value, vstr);
|
||||||
file->store_string(F->get() + "=" + vstr + "\n");
|
if (F->get().find(" ") != -1)
|
||||||
|
file->store_string(F->get().quote() + "=" + vstr + "\n");
|
||||||
|
else
|
||||||
|
file->store_string(F->get() + "=" + vstr + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -93,8 +93,9 @@ protected:
|
|||||||
|
|
||||||
static ProjectSettings *singleton;
|
static ProjectSettings *singleton;
|
||||||
|
|
||||||
Error _load_settings(const String p_path);
|
Error _load_settings_text(const String p_path);
|
||||||
Error _load_settings_binary(const String p_path);
|
Error _load_settings_binary(const String p_path);
|
||||||
|
Error _load_settings_text_or_binary(const String p_text_path, const String p_bin_path);
|
||||||
|
|
||||||
Error _save_settings_text(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String());
|
Error _save_settings_text(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String());
|
||||||
Error _save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String());
|
Error _save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom = CustomMap(), const String &p_custom_features = String());
|
||||||
|
@@ -119,8 +119,8 @@ _ALWAYS_INLINE_ uint64_t _atomic_exchange_if_greater_impl(register uint64_t *pw,
|
|||||||
|
|
||||||
// The actual advertised functions; they'll call the right implementation
|
// The actual advertised functions; they'll call the right implementation
|
||||||
|
|
||||||
uint32_t atomic_conditional_increment(register uint32_t *counter) {
|
uint32_t atomic_conditional_increment(register uint32_t *pw) {
|
||||||
return _atomic_conditional_increment_impl(counter);
|
return _atomic_conditional_increment_impl(pw);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t atomic_decrement(register uint32_t *pw) {
|
uint32_t atomic_decrement(register uint32_t *pw) {
|
||||||
@@ -143,8 +143,8 @@ uint32_t atomic_exchange_if_greater(register uint32_t *pw, register uint32_t val
|
|||||||
return _atomic_exchange_if_greater_impl(pw, val);
|
return _atomic_exchange_if_greater_impl(pw, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t atomic_conditional_increment(register uint64_t *counter) {
|
uint64_t atomic_conditional_increment(register uint64_t *pw) {
|
||||||
return _atomic_conditional_increment_impl(counter);
|
return _atomic_conditional_increment_impl(pw);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t atomic_decrement(register uint64_t *pw) {
|
uint64_t atomic_decrement(register uint64_t *pw) {
|
||||||
|
@@ -158,6 +158,10 @@ void ScriptDebuggerRemote::debug(ScriptLanguage *p_script, bool p_can_continue)
|
|||||||
ERR_FAIL();
|
ERR_FAIL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (allow_focus_steal_pid) {
|
||||||
|
OS::get_singleton()->enable_for_stealing_focus(allow_focus_steal_pid);
|
||||||
|
}
|
||||||
|
|
||||||
packet_peer_stream->put_var("debug_enter");
|
packet_peer_stream->put_var("debug_enter");
|
||||||
packet_peer_stream->put_var(2);
|
packet_peer_stream->put_var(2);
|
||||||
packet_peer_stream->put_var(p_can_continue);
|
packet_peer_stream->put_var(p_can_continue);
|
||||||
@@ -598,7 +602,13 @@ void ScriptDebuggerRemote::_send_object_id(ObjectID p_id) {
|
|||||||
Array send_props;
|
Array send_props;
|
||||||
for (int i = 0; i < properties.size(); i++) {
|
for (int i = 0; i < properties.size(); i++) {
|
||||||
const PropertyInfo &pi = properties[i].first;
|
const PropertyInfo &pi = properties[i].first;
|
||||||
const Variant &var = properties[i].second;
|
Variant &var = properties[i].second;
|
||||||
|
|
||||||
|
WeakRef *ref = Object::cast_to<WeakRef>(var);
|
||||||
|
if (ref) {
|
||||||
|
var = ref->get_ref();
|
||||||
|
}
|
||||||
|
|
||||||
RES res = var;
|
RES res = var;
|
||||||
|
|
||||||
Array prop;
|
Array prop;
|
||||||
@@ -1010,11 +1020,11 @@ void ScriptDebuggerRemote::add_profiling_frame_data(const StringName &p_name, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ScriptDebuggerRemote::profiling_start() {
|
void ScriptDebuggerRemote::profiling_start() {
|
||||||
//ignores this, uses it via connnection
|
//ignores this, uses it via connection
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptDebuggerRemote::profiling_end() {
|
void ScriptDebuggerRemote::profiling_end() {
|
||||||
//ignores this, uses it via connnection
|
//ignores this, uses it via connection
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptDebuggerRemote::profiling_set_frame_times(float p_frame_time, float p_idle_time, float p_physics_time, float p_physics_frame_time) {
|
void ScriptDebuggerRemote::profiling_set_frame_times(float p_frame_time, float p_idle_time, float p_physics_time, float p_physics_frame_time) {
|
||||||
@@ -1025,6 +1035,10 @@ void ScriptDebuggerRemote::profiling_set_frame_times(float p_frame_time, float p
|
|||||||
physics_frame_time = p_physics_frame_time;
|
physics_frame_time = p_physics_frame_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScriptDebuggerRemote::set_allow_focus_steal_pid(OS::ProcessID p_pid) {
|
||||||
|
allow_focus_steal_pid = p_pid;
|
||||||
|
}
|
||||||
|
|
||||||
ScriptDebuggerRemote::ResourceUsageFunc ScriptDebuggerRemote::resource_usage_func = NULL;
|
ScriptDebuggerRemote::ResourceUsageFunc ScriptDebuggerRemote::resource_usage_func = NULL;
|
||||||
|
|
||||||
ScriptDebuggerRemote::ScriptDebuggerRemote() :
|
ScriptDebuggerRemote::ScriptDebuggerRemote() :
|
||||||
@@ -1046,6 +1060,7 @@ ScriptDebuggerRemote::ScriptDebuggerRemote() :
|
|||||||
n_errors_dropped(0),
|
n_errors_dropped(0),
|
||||||
last_msec(0),
|
last_msec(0),
|
||||||
msec_count(0),
|
msec_count(0),
|
||||||
|
allow_focus_steal_pid(0),
|
||||||
locking(false),
|
locking(false),
|
||||||
poll_every(0),
|
poll_every(0),
|
||||||
request_scene_tree(NULL),
|
request_scene_tree(NULL),
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include "io/packet_peer.h"
|
#include "io/packet_peer.h"
|
||||||
#include "io/stream_peer_tcp.h"
|
#include "io/stream_peer_tcp.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
|
#include "os/os.h"
|
||||||
#include "script_language.h"
|
#include "script_language.h"
|
||||||
|
|
||||||
class ScriptDebuggerRemote : public ScriptDebugger {
|
class ScriptDebuggerRemote : public ScriptDebugger {
|
||||||
@@ -98,6 +99,8 @@ class ScriptDebuggerRemote : public ScriptDebugger {
|
|||||||
uint64_t last_msec;
|
uint64_t last_msec;
|
||||||
uint64_t msec_count;
|
uint64_t msec_count;
|
||||||
|
|
||||||
|
OS::ProcessID allow_focus_steal_pid;
|
||||||
|
|
||||||
bool locking; //hack to avoid a deadloop
|
bool locking; //hack to avoid a deadloop
|
||||||
static void _print_handler(void *p_this, const String &p_string, bool p_error);
|
static void _print_handler(void *p_this, const String &p_string, bool p_error);
|
||||||
|
|
||||||
@@ -169,6 +172,8 @@ public:
|
|||||||
virtual void profiling_end();
|
virtual void profiling_end();
|
||||||
virtual void profiling_set_frame_times(float p_frame_time, float p_idle_time, float p_physics_time, float p_physics_frame_time);
|
virtual void profiling_set_frame_times(float p_frame_time, float p_idle_time, float p_physics_time, float p_physics_frame_time);
|
||||||
|
|
||||||
|
void set_allow_focus_steal_pid(OS::ProcessID p_pid);
|
||||||
|
|
||||||
ScriptDebuggerRemote();
|
ScriptDebuggerRemote();
|
||||||
~ScriptDebuggerRemote();
|
~ScriptDebuggerRemote();
|
||||||
};
|
};
|
||||||
|
@@ -203,6 +203,7 @@ public:
|
|||||||
virtual void make_template(const String &p_class_name, const String &p_base_class_name, Ref<Script> &p_script) {}
|
virtual void make_template(const String &p_class_name, const String &p_base_class_name, Ref<Script> &p_script) {}
|
||||||
virtual bool is_using_templates() { return false; }
|
virtual bool is_using_templates() { return false; }
|
||||||
virtual bool validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path = "", List<String> *r_functions = NULL) const = 0;
|
virtual bool validate(const String &p_script, int &r_line_error, int &r_col_error, String &r_test_error, const String &p_path = "", List<String> *r_functions = NULL) const = 0;
|
||||||
|
virtual String validate_path(const String &p_path) const { return ""; }
|
||||||
virtual Script *create_script() const = 0;
|
virtual Script *create_script() const = 0;
|
||||||
virtual bool has_named_classes() const = 0;
|
virtual bool has_named_classes() const = 0;
|
||||||
virtual bool supports_builtin_mode() const = 0;
|
virtual bool supports_builtin_mode() const = 0;
|
||||||
|
@@ -185,7 +185,7 @@ private:
|
|||||||
if (node->right != _data._nil) {
|
if (node->right != _data._nil) {
|
||||||
|
|
||||||
node = node->right;
|
node = node->right;
|
||||||
while (node->left != _data._nil) { /* returns the minium of the right subtree of node */
|
while (node->left != _data._nil) { /* returns the minimum of the right subtree of node */
|
||||||
node = node->left;
|
node = node->left;
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
@@ -207,7 +207,7 @@ private:
|
|||||||
if (node->left != _data._nil) {
|
if (node->left != _data._nil) {
|
||||||
|
|
||||||
node = node->left;
|
node = node->left;
|
||||||
while (node->right != _data._nil) { /* returns the minium of the left subtree of node */
|
while (node->right != _data._nil) { /* returns the minimum of the left subtree of node */
|
||||||
node = node->right;
|
node = node->right;
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
|
@@ -34,6 +34,14 @@
|
|||||||
#include "os/os.h"
|
#include "os/os.h"
|
||||||
#include "project_settings.h"
|
#include "project_settings.h"
|
||||||
|
|
||||||
|
// ISO 639-1 language codes, with the addition of glibc locales with their
|
||||||
|
// regional identifiers. This list must match the language names (in English)
|
||||||
|
// of locale_names.
|
||||||
|
//
|
||||||
|
// References:
|
||||||
|
// - https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
|
||||||
|
// - https://lh.2xlibre.net/locales/
|
||||||
|
|
||||||
static const char *locale_list[] = {
|
static const char *locale_list[] = {
|
||||||
"aa", // Afar
|
"aa", // Afar
|
||||||
"aa_DJ", // Afar (Djibouti)
|
"aa_DJ", // Afar (Djibouti)
|
||||||
@@ -756,8 +764,17 @@ static const char *locale_names[] = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Windows has some weird locale identifiers which do not honor the ISO 639-1
|
||||||
|
// standardized nomenclature. Whenever those don't conflict with existing ISO
|
||||||
|
// identifiers, we override them.
|
||||||
|
//
|
||||||
|
// Reference:
|
||||||
|
// - https://msdn.microsoft.com/en-us/library/windows/desktop/ms693062(v=vs.85).aspx
|
||||||
|
|
||||||
static const char *locale_renames[][2] = {
|
static const char *locale_renames[][2] = {
|
||||||
{ "no", "nb" },
|
{ "in", "id" }, // Indonesian
|
||||||
|
{ "iw", "he" }, // Hebrew
|
||||||
|
{ "no", "nb" }, // Norwegian Bokmål
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1135,6 +1135,36 @@ String String::num_int64(int64_t p_num, int base, bool capitalize_hex) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String String::num_uint64(uint64_t p_num, int base, bool capitalize_hex) {
|
||||||
|
|
||||||
|
uint64_t n = p_num;
|
||||||
|
|
||||||
|
int chars = 0;
|
||||||
|
do {
|
||||||
|
n /= base;
|
||||||
|
chars++;
|
||||||
|
} while (n);
|
||||||
|
|
||||||
|
String s;
|
||||||
|
s.resize(chars + 1);
|
||||||
|
CharType *c = s.ptrw();
|
||||||
|
c[chars] = 0;
|
||||||
|
n = p_num;
|
||||||
|
do {
|
||||||
|
int mod = ABS(n % base);
|
||||||
|
if (mod >= 10) {
|
||||||
|
char a = (capitalize_hex ? 'A' : 'a');
|
||||||
|
c[--chars] = a + (mod - 10);
|
||||||
|
} else {
|
||||||
|
c[--chars] = '0' + mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
n /= base;
|
||||||
|
} while (n);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
String String::num_real(double p_num) {
|
String String::num_real(double p_num) {
|
||||||
|
|
||||||
String s;
|
String s;
|
||||||
@@ -3138,8 +3168,8 @@ String String::word_wrap(int p_chars_per_line) const {
|
|||||||
String String::http_escape() const {
|
String String::http_escape() const {
|
||||||
const CharString temp = utf8();
|
const CharString temp = utf8();
|
||||||
String res;
|
String res;
|
||||||
for (int i = 0; i < length(); ++i) {
|
for (int i = 0; i < temp.length(); ++i) {
|
||||||
CharType ord = temp[i];
|
char ord = temp[i];
|
||||||
if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
|
if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
|
||||||
(ord >= 'a' && ord <= 'z') ||
|
(ord >= 'a' && ord <= 'z') ||
|
||||||
(ord >= 'A' && ord <= 'Z') ||
|
(ord >= 'A' && ord <= 'Z') ||
|
||||||
@@ -3148,9 +3178,9 @@ String String::http_escape() const {
|
|||||||
} else {
|
} else {
|
||||||
char h_Val[3];
|
char h_Val[3];
|
||||||
#if defined(__GNUC__) || defined(_MSC_VER)
|
#if defined(__GNUC__) || defined(_MSC_VER)
|
||||||
snprintf(h_Val, 3, "%.2X", ord);
|
snprintf(h_Val, 3, "%hhX", ord);
|
||||||
#else
|
#else
|
||||||
sprintf(h_Val, "%.2X", ord);
|
sprintf(h_Val, "%hhX", ord);
|
||||||
#endif
|
#endif
|
||||||
res += "%";
|
res += "%";
|
||||||
res += h_Val;
|
res += h_Val;
|
||||||
@@ -3683,8 +3713,8 @@ String String::get_file() const {
|
|||||||
String String::get_extension() const {
|
String String::get_extension() const {
|
||||||
|
|
||||||
int pos = find_last(".");
|
int pos = find_last(".");
|
||||||
if (pos < 0)
|
if (pos < 0 || pos < MAX(find_last("/"), find_last("\\")))
|
||||||
return *this;
|
return "";
|
||||||
|
|
||||||
return substr(pos + 1, length());
|
return substr(pos + 1, length());
|
||||||
}
|
}
|
||||||
@@ -3762,7 +3792,7 @@ String String::percent_decode() const {
|
|||||||
String String::get_basename() const {
|
String String::get_basename() const {
|
||||||
|
|
||||||
int pos = find_last(".");
|
int pos = find_last(".");
|
||||||
if (pos < 0)
|
if (pos < 0 || pos < MAX(find_last("/"), find_last("\\")))
|
||||||
return *this;
|
return *this;
|
||||||
|
|
||||||
return substr(0, pos);
|
return substr(0, pos);
|
||||||
|
@@ -146,6 +146,7 @@ public:
|
|||||||
static String num_scientific(double p_num);
|
static String num_scientific(double p_num);
|
||||||
static String num_real(double p_num);
|
static String num_real(double p_num);
|
||||||
static String num_int64(int64_t p_num, int base = 10, bool capitalize_hex = false);
|
static String num_int64(int64_t p_num, int base = 10, bool capitalize_hex = false);
|
||||||
|
static String num_uint64(uint64_t p_num, int base = 10, bool capitalize_hex = false);
|
||||||
static String chr(CharType p_char);
|
static String chr(CharType p_char);
|
||||||
static String md5(const uint8_t *p_md5);
|
static String md5(const uint8_t *p_md5);
|
||||||
static String hex_encode_buffer(const uint8_t *p_buffer, int p_len);
|
static String hex_encode_buffer(const uint8_t *p_buffer, int p_len);
|
||||||
|
@@ -293,7 +293,7 @@ public:
|
|||||||
// If this changes the table in variant_op must be updated
|
// If this changes the table in variant_op must be updated
|
||||||
enum Operator {
|
enum Operator {
|
||||||
|
|
||||||
//comparation
|
//comparison
|
||||||
OP_EQUAL,
|
OP_EQUAL,
|
||||||
OP_NOT_EQUAL,
|
OP_NOT_EQUAL,
|
||||||
OP_LESS,
|
OP_LESS,
|
||||||
|
@@ -153,9 +153,9 @@ struct _VariantCall {
|
|||||||
funcdata.func = p_func;
|
funcdata.func = p_func;
|
||||||
funcdata.default_args = p_defaultarg;
|
funcdata.default_args = p_defaultarg;
|
||||||
funcdata._const = p_const;
|
funcdata._const = p_const;
|
||||||
|
funcdata.returns = p_has_return;
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
funcdata.return_type = p_return;
|
funcdata.return_type = p_return;
|
||||||
funcdata.returns = p_has_return;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (p_argtype1.name) {
|
if (p_argtype1.name) {
|
||||||
@@ -340,6 +340,8 @@ struct _VariantCall {
|
|||||||
VCALL_LOCALMEM1R(Vector2, rotated);
|
VCALL_LOCALMEM1R(Vector2, rotated);
|
||||||
VCALL_LOCALMEM0R(Vector2, tangent);
|
VCALL_LOCALMEM0R(Vector2, tangent);
|
||||||
VCALL_LOCALMEM0R(Vector2, floor);
|
VCALL_LOCALMEM0R(Vector2, floor);
|
||||||
|
VCALL_LOCALMEM0R(Vector2, ceil);
|
||||||
|
VCALL_LOCALMEM0R(Vector2, round);
|
||||||
VCALL_LOCALMEM1R(Vector2, snapped);
|
VCALL_LOCALMEM1R(Vector2, snapped);
|
||||||
VCALL_LOCALMEM0R(Vector2, aspect);
|
VCALL_LOCALMEM0R(Vector2, aspect);
|
||||||
VCALL_LOCALMEM1R(Vector2, dot);
|
VCALL_LOCALMEM1R(Vector2, dot);
|
||||||
@@ -382,6 +384,7 @@ struct _VariantCall {
|
|||||||
VCALL_LOCALMEM0R(Vector3, abs);
|
VCALL_LOCALMEM0R(Vector3, abs);
|
||||||
VCALL_LOCALMEM0R(Vector3, floor);
|
VCALL_LOCALMEM0R(Vector3, floor);
|
||||||
VCALL_LOCALMEM0R(Vector3, ceil);
|
VCALL_LOCALMEM0R(Vector3, ceil);
|
||||||
|
VCALL_LOCALMEM0R(Vector3, round);
|
||||||
VCALL_LOCALMEM1R(Vector3, distance_to);
|
VCALL_LOCALMEM1R(Vector3, distance_to);
|
||||||
VCALL_LOCALMEM1R(Vector3, distance_squared_to);
|
VCALL_LOCALMEM1R(Vector3, distance_squared_to);
|
||||||
VCALL_LOCALMEM1R(Vector3, angle_to);
|
VCALL_LOCALMEM1R(Vector3, angle_to);
|
||||||
@@ -1509,6 +1512,8 @@ void register_variant_methods() {
|
|||||||
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, rotated, REAL, "phi", varray());
|
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, rotated, REAL, "phi", varray());
|
||||||
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, tangent, varray());
|
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, tangent, varray());
|
||||||
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, floor, varray());
|
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, floor, varray());
|
||||||
|
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, ceil, varray());
|
||||||
|
ADDFUNC0R(VECTOR2, VECTOR2, Vector2, round, varray());
|
||||||
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, snapped, VECTOR2, "by", varray());
|
ADDFUNC1R(VECTOR2, VECTOR2, Vector2, snapped, VECTOR2, "by", varray());
|
||||||
ADDFUNC0R(VECTOR2, REAL, Vector2, aspect, varray());
|
ADDFUNC0R(VECTOR2, REAL, Vector2, aspect, varray());
|
||||||
ADDFUNC1R(VECTOR2, REAL, Vector2, dot, VECTOR2, "with", varray());
|
ADDFUNC1R(VECTOR2, REAL, Vector2, dot, VECTOR2, "with", varray());
|
||||||
@@ -1550,6 +1555,7 @@ void register_variant_methods() {
|
|||||||
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, abs, varray());
|
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, abs, varray());
|
||||||
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, floor, varray());
|
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, floor, varray());
|
||||||
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, ceil, varray());
|
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, ceil, varray());
|
||||||
|
ADDFUNC0R(VECTOR3, VECTOR3, Vector3, round, varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_to, VECTOR3, "b", varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, distance_squared_to, VECTOR3, "b", varray());
|
||||||
ADDFUNC1R(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
|
ADDFUNC1R(VECTOR3, REAL, Vector3, angle_to, VECTOR3, "to", varray());
|
||||||
|
@@ -147,7 +147,7 @@ Variant::operator bool() const {
|
|||||||
return booleanize();
|
return booleanize();
|
||||||
}
|
}
|
||||||
|
|
||||||
// We consider all unitialized or empty types to be false based on the type's
|
// We consider all uninitialized or empty types to be false based on the type's
|
||||||
// zeroiness.
|
// zeroiness.
|
||||||
bool Variant::booleanize() const {
|
bool Variant::booleanize() const {
|
||||||
return !is_zero();
|
return !is_zero();
|
||||||
@@ -177,7 +177,7 @@ bool Variant::booleanize() const {
|
|||||||
CASE_TYPE(m_prefix, m_op_name, m_name) { \
|
CASE_TYPE(m_prefix, m_op_name, m_name) { \
|
||||||
if (p_b.type == INT) _RETURN(p_a._data.m_type m_op p_b._data._int); \
|
if (p_b.type == INT) _RETURN(p_a._data.m_type m_op p_b._data._int); \
|
||||||
if (p_b.type == REAL) _RETURN(p_a._data.m_type m_op p_b._data._real); \
|
if (p_b.type == REAL) _RETURN(p_a._data.m_type m_op p_b._data._real); \
|
||||||
if (p_b.type == NIL) _RETURN(!p_b.type m_op NIL); \
|
if (p_b.type == NIL) _RETURN(!(p_b.type m_op NIL)); \
|
||||||
\
|
\
|
||||||
_RETURN_FAIL \
|
_RETURN_FAIL \
|
||||||
};
|
};
|
||||||
@@ -252,7 +252,7 @@ bool Variant::booleanize() const {
|
|||||||
CASE_TYPE(m_prefix, m_op_name, m_name) { \
|
CASE_TYPE(m_prefix, m_op_name, m_name) { \
|
||||||
if (p_b.type == STRING) _RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const String *>(p_b._data._mem)); \
|
if (p_b.type == STRING) _RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const String *>(p_b._data._mem)); \
|
||||||
if (p_b.type == NODE_PATH) _RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const NodePath *>(p_b._data._mem)); \
|
if (p_b.type == NODE_PATH) _RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const NodePath *>(p_b._data._mem)); \
|
||||||
if (p_b.type == NIL) _RETURN(!p_b.type m_op NIL); \
|
if (p_b.type == NIL) _RETURN(!(p_b.type m_op NIL)); \
|
||||||
\
|
\
|
||||||
_RETURN_FAIL \
|
_RETURN_FAIL \
|
||||||
};
|
};
|
||||||
@@ -278,7 +278,7 @@ bool Variant::booleanize() const {
|
|||||||
if (p_b.type == m_name) \
|
if (p_b.type == m_name) \
|
||||||
_RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const m_type *>(p_b._data._mem)); \
|
_RETURN(*reinterpret_cast<const m_type *>(p_a._data._mem) m_op *reinterpret_cast<const m_type *>(p_b._data._mem)); \
|
||||||
if (p_b.type == NIL) \
|
if (p_b.type == NIL) \
|
||||||
_RETURN(!p_b.type m_op NIL); \
|
_RETURN(!(p_b.type m_op NIL)); \
|
||||||
\
|
\
|
||||||
_RETURN_FAIL \
|
_RETURN_FAIL \
|
||||||
};
|
};
|
||||||
@@ -323,7 +323,7 @@ bool Variant::booleanize() const {
|
|||||||
if (p_b.type == m_name) \
|
if (p_b.type == m_name) \
|
||||||
_RETURN(*p_a._data.m_sub m_op *p_b._data.m_sub); \
|
_RETURN(*p_a._data.m_sub m_op *p_b._data.m_sub); \
|
||||||
if (p_b.type == NIL) \
|
if (p_b.type == NIL) \
|
||||||
_RETURN(!p_b.type m_op NIL); \
|
_RETURN(!(p_b.type m_op NIL)); \
|
||||||
\
|
\
|
||||||
_RETURN_FAIL \
|
_RETURN_FAIL \
|
||||||
}
|
}
|
||||||
@@ -1501,7 +1501,7 @@ void Variant::set_named(const StringName &p_index, const Variant &p_value, bool
|
|||||||
v->set_hsv(v->get_h(), p_value._data._real, v->get_v());
|
v->set_hsv(v->get_h(), p_value._data._real, v->get_v());
|
||||||
valid = true;
|
valid = true;
|
||||||
} else if (p_index == CoreStringNames::singleton->v) {
|
} else if (p_index == CoreStringNames::singleton->v) {
|
||||||
v->set_hsv(v->get_h(), v->get_v(), p_value._data._real);
|
v->set_hsv(v->get_h(), v->get_s(), p_value._data._real);
|
||||||
valid = true;
|
valid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3715,8 +3715,9 @@ static const char *_op_names[Variant::OP_MAX] = {
|
|||||||
"*",
|
"*",
|
||||||
"/",
|
"/",
|
||||||
"- (negation)",
|
"- (negation)",
|
||||||
|
"+ (positive)",
|
||||||
"%",
|
"%",
|
||||||
"..",
|
"+ (concatenation)",
|
||||||
"<<",
|
"<<",
|
||||||
">>",
|
">>",
|
||||||
"&",
|
"&",
|
||||||
|
@@ -30,9 +30,32 @@
|
|||||||
|
|
||||||
#include "version_generated.gen.h"
|
#include "version_generated.gen.h"
|
||||||
|
|
||||||
|
// Godot versions are of the form <major>.<minor> for the initial release,
|
||||||
|
// and then <major>.<minor>.<patch> for subsequent bugfix releases where <patch> != 0
|
||||||
|
// That's arbitrary, but we find it pretty and it's the current policy.
|
||||||
|
|
||||||
|
// Defines the main "branch" version. Patch versions in this branch should be
|
||||||
|
// forward-compatible.
|
||||||
|
// Example: "3.1"
|
||||||
|
#define VERSION_BRANCH "" _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR)
|
||||||
#ifdef VERSION_PATCH
|
#ifdef VERSION_PATCH
|
||||||
#define VERSION_MKSTRING "" _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR) "." _MKSTR(VERSION_PATCH) "." VERSION_STATUS "." VERSION_BUILD VERSION_MODULE_CONFIG
|
// Example: "3.1.4"
|
||||||
|
#define VERSION_NUMBER "" VERSION_BRANCH "." _MKSTR(VERSION_PATCH)
|
||||||
#else
|
#else
|
||||||
#define VERSION_MKSTRING "" _MKSTR(VERSION_MAJOR) "." _MKSTR(VERSION_MINOR) "." VERSION_STATUS "." VERSION_BUILD VERSION_MODULE_CONFIG
|
// Example: "3.1"
|
||||||
|
#define VERSION_NUMBER "" VERSION_BRANCH
|
||||||
#endif // VERSION_PATCH
|
#endif // VERSION_PATCH
|
||||||
#define VERSION_FULL_NAME "" VERSION_NAME " v" VERSION_MKSTRING
|
|
||||||
|
// Describes the full configuration of that Godot version, including the version number,
|
||||||
|
// the status (beta, stable, etc.) and potential module-specific features (e.g. mono).
|
||||||
|
// Example: "3.1.4.stable.mono"
|
||||||
|
#define VERSION_FULL_CONFIG "" VERSION_NUMBER "." VERSION_STATUS VERSION_MODULE_CONFIG
|
||||||
|
|
||||||
|
// Similar to VERSION_FULL_CONFIG, but also includes the (potentially custom) VERSION_BUILD
|
||||||
|
// description (e.g. official, custom_build, etc.).
|
||||||
|
// Example: "3.1.4.stable.mono.official"
|
||||||
|
#define VERSION_FULL_BUILD "" VERSION_FULL_CONFIG "." VERSION_BUILD
|
||||||
|
|
||||||
|
// Same as above, but prepended with Godot's name and a cosmetic "v" for "version".
|
||||||
|
// Example: "Godot v3.1.4.stable.official.mono"
|
||||||
|
#define VERSION_FULL_NAME "" VERSION_NAME " v" VERSION_FULL_BUILD
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="@GDScript" category="Core" version="3.0-stable">
|
<class name="@GDScript" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Built-in GDScript functions.
|
Built-in GDScript functions.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
This contains the list of built-in gdscript functions. Mostly math functions and other utilities. Everything else is expanded by objects.
|
List of core built-in GDScript functions. Math functions and other utilities. Everything else is provided by objects. (Keywords: builtin, built in, global functions.)
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
</argument>
|
</argument>
|
||||||
<argument index="2" name="b8" type="int">
|
<argument index="2" name="b8" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="3" name="a8" type="int">
|
<argument index="3" name="a8" type="int" default="255">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Returns a 32 bit color with red, green, blue and alpha channels. Each channel has 8 bits of information ranging from 0 to 255.
|
Returns a 32 bit color with red, green, blue and alpha channels. Each channel has 8 bits of information ranging from 0 to 255.
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
</return>
|
</return>
|
||||||
<argument index="0" name="name" type="String">
|
<argument index="0" name="name" type="String">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="alpha" type="float">
|
<argument index="1" name="alpha" type="float" default="1.0">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Returns a color according to the standardised [code]name[/code] with [code]alpha[/code] ranging from 0 to 1.
|
Returns a color according to the standardised [code]name[/code] with [code]alpha[/code] ranging from 0 to 1.
|
||||||
@@ -326,7 +326,8 @@
|
|||||||
<argument index="0" name="s" type="float">
|
<argument index="0" name="s" type="float">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Raises the Euler's constant [b]e[/b] to the power of [code]s[/code] and returns it. [b]e[/b] has an approximate value of 2.71828.
|
The natural exponential function. It raises the mathematical constant [b]e[/b] to the power of [code]s[/code] and returns it.
|
||||||
|
[b]e[/b] has an approximate value of 2.71828.
|
||||||
[codeblock]
|
[codeblock]
|
||||||
a = exp(2) # approximately 7.39
|
a = exp(2) # approximately 7.39
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
@@ -608,6 +609,7 @@
|
|||||||
<description>
|
<description>
|
||||||
Parse JSON text to a Variant (use [method typeof] to check if it is what you expect).
|
Parse JSON text to a Variant (use [method typeof] to check if it is what you expect).
|
||||||
Be aware that the JSON specification does not define integer or float types, but only a number type. Therefore, parsing a JSON text will convert all numerical values to [float] types.
|
Be aware that the JSON specification does not define integer or float types, but only a number type. Therefore, parsing a JSON text will convert all numerical values to [float] types.
|
||||||
|
Note that JSON objects do not preserve key order like Godot dictionaries, thus you should not rely on keys being in a certain order if a dictionary is constructed from JSON. In contrast, JSON arrays retain the order of their elements:
|
||||||
[codeblock]
|
[codeblock]
|
||||||
p = parse_json('["a", "b", "c"]')
|
p = parse_json('["a", "b", "c"]')
|
||||||
if typeof(p) == TYPE_ARRAY:
|
if typeof(p) == TYPE_ARRAY:
|
||||||
@@ -1130,9 +1132,9 @@
|
|||||||
<method name="yield">
|
<method name="yield">
|
||||||
<return type="GDScriptFunctionState">
|
<return type="GDScriptFunctionState">
|
||||||
</return>
|
</return>
|
||||||
<argument index="0" name="object" type="Object">
|
<argument index="0" name="object" type="Object" default="null">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="signal" type="String">
|
<argument index="1" name="signal" type="String" default="""">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Stops the function execution and returns the current state. Call [method GDScriptFunctionState.resume] on the state to resume execution. This invalidates the state.
|
Stops the function execution and returns the current state. Call [method GDScriptFunctionState.resume] on the state to resume execution. This invalidates the state.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="@GlobalScope" category="Core" version="3.0-stable">
|
<class name="@GlobalScope" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Global scope constants and variables.
|
Global scope constants and variables.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -30,7 +30,6 @@
|
|||||||
[Geometry] singleton
|
[Geometry] singleton
|
||||||
</member>
|
</member>
|
||||||
<member name="GodotSharp" type="GodotSharp" setter="" getter="">
|
<member name="GodotSharp" type="GodotSharp" setter="" getter="">
|
||||||
[GodotSharp] singleton
|
|
||||||
</member>
|
</member>
|
||||||
<member name="IP" type="IP" setter="" getter="">
|
<member name="IP" type="IP" setter="" getter="">
|
||||||
[IP] singleton
|
[IP] singleton
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="@NativeScript" category="Core" version="3.0-stable">
|
<class name="@NativeScript" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="@VisualScript" category="Core" version="3.0-stable">
|
<class name="@VisualScript" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Built-in visual script functions.
|
Built-in visual script functions.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AABB" category="Built-In Types" version="3.0-stable">
|
<class name="AABB" category="Built-In Types" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Axis-Aligned Bounding Box.
|
Axis-Aligned Bounding Box.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRAnchor" inherits="Spatial" category="Core" version="3.0-stable">
|
<class name="ARVRAnchor" inherits="Spatial" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Anchor point in AR Space
|
Anchor point in AR Space.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
The ARVR Anchor point is a spatial node that maps a real world location identified by the AR platform to a position within the game world. For example, as long as plane detection in ARKit is on, ARKit will identify and update the position of planes (tables, floors, etc) and create anchors for them.
|
The ARVR Anchor point is a spatial node that maps a real world location identified by the AR platform to a position within the game world. For example, as long as plane detection in ARKit is on, ARKit will identify and update the position of planes (tables, floors, etc) and create anchors for them.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRCamera" inherits="Camera" category="Core" version="3.0-stable">
|
<class name="ARVRCamera" inherits="Camera" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
A camera node with a few overrules for AR/VR applied such as location tracking.
|
A camera node with a few overrules for AR/VR applied such as location tracking.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRController" inherits="Spatial" category="Core" version="3.0-stable">
|
<class name="ARVRController" inherits="Spatial" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
A spatial node representing a spatially tracked controller.
|
A spatial node representing a spatially tracked controller.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRInterface" inherits="Reference" category="Core" version="3.0-stable">
|
<class name="ARVRInterface" inherits="Reference" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Base class for ARVR interface implementation.
|
Base class for ARVR interface implementation.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVROrigin" inherits="Spatial" category="Core" version="3.0-stable">
|
<class name="ARVROrigin" inherits="Spatial" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Our origin point in AR/VR.
|
Our origin point in AR/VR.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRPositionalTracker" inherits="Object" category="Core" version="3.0-stable">
|
<class name="ARVRPositionalTracker" inherits="Object" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
A tracked object
|
A tracked object
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ARVRServer" inherits="Object" category="Core" version="3.0-stable">
|
<class name="ARVRServer" inherits="Object" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
This is our AR/VR Server.
|
This is our AR/VR Server.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -36,6 +36,12 @@
|
|||||||
Find an interface by its name. Say that you're making a game that uses specific capabilities of an AR/VR platform you can find the interface for that platform by name and initialize it.
|
Find an interface by its name. Say that you're making a game that uses specific capabilities of an AR/VR platform you can find the interface for that platform by name and initialize it.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="get_hmd_transform">
|
||||||
|
<return type="Transform">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_interface" qualifiers="const">
|
<method name="get_interface" qualifiers="const">
|
||||||
<return type="ARVRInterface">
|
<return type="ARVRInterface">
|
||||||
</return>
|
</return>
|
||||||
@@ -59,6 +65,30 @@
|
|||||||
Returns a list of available interfaces with both id and name of the interface.
|
Returns a list of available interfaces with both id and name of the interface.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="get_last_commit_usec">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_last_frame_usec">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_last_process_usec">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_primary_interface" qualifiers="const">
|
||||||
|
<return type="ARVRInterface">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="get_reference_frame" qualifiers="const">
|
<method name="get_reference_frame" qualifiers="const">
|
||||||
<return type="Transform">
|
<return type="Transform">
|
||||||
</return>
|
</return>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AStar" inherits="Reference" category="Core" version="3.0-stable">
|
<class name="AStar" inherits="Reference" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
AStar class representation that uses vectors as edges.
|
AStar class representation that uses vectors as edges.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AcceptDialog" inherits="WindowDialog" category="Core" version="3.0-stable">
|
<class name="AcceptDialog" inherits="WindowDialog" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Base dialog for user notification.
|
Base dialog for user notification.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<argument index="2" name="action" type="String" default="""">
|
<argument index="2" name="action" type="String" default="""">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Adds a button with label [i]text[/i] and a custom [i]action[/i] to the dialog and returns the created button. [i]action[/i] will be passed to the [custom_action] signal when pressed.
|
Adds a button with label [i]text[/i] and a custom [i]action[/i] to the dialog and returns the created button. [i]action[/i] will be passed to the [signal custom_action] signal when pressed.
|
||||||
If [code]true[/code], [i]right[/i] will place the button to the right of any sibling buttons. Default value: [code]false[/code].
|
If [code]true[/code], [i]right[/i] will place the button to the right of any sibling buttons. Default value: [code]false[/code].
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimatedSprite" inherits="Node2D" category="Core" version="3.0-stable">
|
<class name="AnimatedSprite" inherits="Node2D" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Sprite node that can use multiple textures for animation.
|
Sprite node that can use multiple textures for animation.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimatedSprite3D" inherits="SpriteBase3D" category="Core" version="3.0-stable">
|
<class name="AnimatedSprite3D" inherits="SpriteBase3D" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
2D sprite node in 3D world, that can use multiple 2D textures for animation.
|
2D sprite node in 3D world, that can use multiple 2D textures for animation.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="Animation" inherits="Resource" category="Core" version="3.0-stable">
|
<class name="Animation" inherits="Resource" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Contains data used to animate everything in the engine.
|
Contains data used to animate everything in the engine.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimationPlayer" inherits="Node" category="Core" version="3.0-stable">
|
<class name="AnimationPlayer" inherits="Node" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Container and player of [Animation] resources.
|
Container and player of [Animation] resources.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
http://docs.godotengine.org/en/3.0/getting_started/step_by_step/animations.html
|
http://docs.godotengine.org/en/3.0/getting_started/step_by_step/animations.html
|
||||||
http://docs.godotengine.org/en/3.0/tutorials/animation/index.html
|
http://docs.godotengine.org/en/3.0/tutorials/animation/index.html
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<demos>
|
<demos>
|
||||||
</demos>
|
</demos>
|
||||||
@@ -131,8 +131,7 @@
|
|||||||
<argument index="3" name="from_end" type="bool" default="false">
|
<argument index="3" name="from_end" type="bool" default="false">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the
|
Play the animation with key [code]name[/code]. Custom speed and blend times can be set. If custom speed is negative (-1), 'from_end' being true can play the animation backwards.
|
||||||
animation backwards.
|
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="play_backwards">
|
<method name="play_backwards">
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AnimationTreePlayer" inherits="Node" category="Core" version="3.0-stable">
|
<class name="AnimationTreePlayer" inherits="Node" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Animation Player that uses a node graph for blending Animations.
|
Animation Player that uses a node graph for blending Animations.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="Area" inherits="CollisionObject" category="Core" version="3.0-stable">
|
<class name="Area" inherits="CollisionObject" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
General purpose area node for detection and 3D physics influence.
|
General purpose area node for detection and 3D physics influence.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -192,7 +192,7 @@
|
|||||||
<argument index="0" name="body" type="Object">
|
<argument index="0" name="body" type="Object">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Emitted when a [PhysicsBody2D] object exits.
|
Emitted when a [PhysicsBody] object exits.
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_entered">
|
<signal name="body_shape_entered">
|
||||||
@@ -205,7 +205,7 @@
|
|||||||
<argument index="3" name="area_shape" type="int">
|
<argument index="3" name="area_shape" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Emitted when a [PhysicsBody2D] object enters, reporting which shapes overlapped.
|
Emitted when a [PhysicsBody] object enters, reporting which shapes overlapped.
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
<signal name="body_shape_exited">
|
<signal name="body_shape_exited">
|
||||||
@@ -218,7 +218,7 @@
|
|||||||
<argument index="3" name="area_shape" type="int">
|
<argument index="3" name="area_shape" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Emitted when a [PhysicsBody2D] object exits, reporting which shapes were overlapping.
|
Emitted when a [PhysicsBody] object exits, reporting which shapes were overlapping.
|
||||||
</description>
|
</description>
|
||||||
</signal>
|
</signal>
|
||||||
</signals>
|
</signals>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="Area2D" inherits="CollisionObject2D" category="Core" version="3.0-stable">
|
<class name="Area2D" inherits="CollisionObject2D" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
2D area for detection and 2D physics influence.
|
2D area for detection and 2D physics influence.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="Array" category="Built-In Types" version="3.0-stable">
|
<class name="Array" category="Built-In Types" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Generic array datatype.
|
Generic array datatype.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
</method>
|
</method>
|
||||||
<method name="sort">
|
<method name="sort">
|
||||||
<description>
|
<description>
|
||||||
Sort the array using natural order and return reference to the array.
|
Sort the array using natural order.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="sort_custom">
|
<method name="sort_custom">
|
||||||
@@ -283,7 +283,7 @@
|
|||||||
<argument index="1" name="func" type="String">
|
<argument index="1" name="func" type="String">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Sort the array using a custom method and return reference to the array. The arguments are an object that holds the method and the name of such method. The custom method receives two arguments (a pair of elements from the array) and must return true if the first argument is less than the second, and return false otherwise. Note: you cannot randomize the return value as the heapsort algorithm expects a deterministic result. Doing so will result in unexpected behavior.
|
Sort the array using a custom method. The arguments are an object that holds the method and the name of such method. The custom method receives two arguments (a pair of elements from the array) and must return true if the first argument is less than the second, and return false otherwise. Note: you cannot randomize the return value as the heapsort algorithm expects a deterministic result. Doing so will result in unexpected behavior.
|
||||||
[codeblock]
|
[codeblock]
|
||||||
class MyCustomSorter:
|
class MyCustomSorter:
|
||||||
static func sort(a, b):
|
static func sort(a, b):
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="ArrayMesh" inherits="Mesh" category="Core" version="3.0-stable">
|
<class name="ArrayMesh" inherits="Mesh" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
@@ -29,8 +29,11 @@
|
|||||||
<argument index="3" name="compress_flags" type="int" default="97792">
|
<argument index="3" name="compress_flags" type="int" default="97792">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Create a new surface ([method get_surface_count] that will become surf_idx for this.
|
Creates a new surface.
|
||||||
Surfaces are created to be rendered using a "primitive", which may be PRIMITIVE_POINTS, PRIMITIVE_LINES, PRIMITIVE_LINE_STRIP, PRIMITIVE_LINE_LOOP, PRIMITIVE_TRIANGLES, PRIMITIVE_TRIANGLE_STRIP, PRIMITIVE_TRIANGLE_FAN. (As a note, when using indices, it is recommended to only use just points, lines or triangles).
|
Surfaces are created to be rendered using a "primitive", which may be PRIMITIVE_POINTS, PRIMITIVE_LINES, PRIMITIVE_LINE_STRIP, PRIMITIVE_LINE_LOOP, PRIMITIVE_TRIANGLES, PRIMITIVE_TRIANGLE_STRIP, PRIMITIVE_TRIANGLE_FAN. See [Mesh] for details. (As a note, when using indices, it is recommended to only use points, lines or triangles). [method get_surface_count] will become the surf_idx for this new surface.
|
||||||
|
The [code]arrays[/code] argument is an array of arrays. See [enum ArrayType] for the values used in this array. For example, [code]arrays[0][/code] is the array of vertices. That first vertex sub-array is always required; the others are optional. Adding an index array puts this function into "index mode" where the vertex and other arrays become the sources of data and the index array defines the vertex order. All sub-arrays must have the same length as the vertex array or be empty, except for [code]ARRAY_INDEX[/code] if it is used.
|
||||||
|
Adding an index array puts this function into "index mode" where the vertex and other arrays become the sources of data, and the index array defines the order of the vertices.
|
||||||
|
Godot uses clockwise winding order for front faces of triangle primitive modes.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="center_geometry">
|
<method name="center_geometry">
|
||||||
@@ -66,6 +69,16 @@
|
|||||||
Return the amount of surfaces that the [code]ArrayMesh[/code] holds.
|
Return the amount of surfaces that the [code]ArrayMesh[/code] holds.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
<method name="lightmap_unwrap">
|
||||||
|
<return type="int" enum="Error">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="arg0" type="Transform">
|
||||||
|
</argument>
|
||||||
|
<argument index="1" name="arg1" type="float">
|
||||||
|
</argument>
|
||||||
|
<description>
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
<method name="regen_normalmaps">
|
<method name="regen_normalmaps">
|
||||||
<return type="void">
|
<return type="void">
|
||||||
</return>
|
</return>
|
||||||
@@ -78,7 +91,7 @@
|
|||||||
<argument index="0" name="surf_idx" type="int">
|
<argument index="0" name="surf_idx" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Return the length in indices of the index array in the requested surface (see [method add_surface]).
|
Return the length in indices of the index array in the requested surface (see [method add_surface_from_arrays]).
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="surface_get_array_len" qualifiers="const">
|
<method name="surface_get_array_len" qualifiers="const">
|
||||||
@@ -87,7 +100,7 @@
|
|||||||
<argument index="0" name="surf_idx" type="int">
|
<argument index="0" name="surf_idx" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Return the length in vertices of the vertex array in the requested surface (see [method add_surface]).
|
Return the length in vertices of the vertex array in the requested surface (see [method add_surface_from_arrays]).
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="surface_get_arrays" qualifiers="const">
|
<method name="surface_get_arrays" qualifiers="const">
|
||||||
@@ -112,7 +125,7 @@
|
|||||||
<argument index="0" name="surf_idx" type="int">
|
<argument index="0" name="surf_idx" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Return the format mask of the requested surface (see [method add_surface]).
|
Return the format mask of the requested surface (see [method add_surface_from_arrays]).
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="surface_get_material" qualifiers="const">
|
<method name="surface_get_material" qualifiers="const">
|
||||||
@@ -138,7 +151,7 @@
|
|||||||
<argument index="0" name="surf_idx" type="int">
|
<argument index="0" name="surf_idx" type="int">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Return the primitive type of the requested surface (see [method add_surface]).
|
Return the primitive type of the requested surface (see [method add_surface_from_arrays]).
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="surface_remove">
|
<method name="surface_remove">
|
||||||
@@ -222,7 +235,8 @@
|
|||||||
Array of bone weights, as a float array. Each element in groups of 4 floats.
|
Array of bone weights, as a float array. Each element in groups of 4 floats.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ARRAY_INDEX" value="8" enum="ArrayType">
|
<constant name="ARRAY_INDEX" value="8" enum="ArrayType">
|
||||||
Array of integers, used as indices referencing vertices. No index can be beyond the vertex array size.
|
[Array] of integers used as indices referencing vertices, colors, normals, tangents, and textures. All of those arrays must have the same number of elements as the vertex array. No index can be beyond the vertex array size. When this index array is present, it puts the function into "index mode," where the index selects the *i*'th vertex, normal, tangent, color, UV, etc. This means if you want to have different normals or colors along an edge, you have to duplicate the vertices.
|
||||||
|
For triangles, the index array is interpreted as triples, referring to the vertices of each triangle. For lines, the index array is in pairs indicating the start and end of each line.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="ARRAY_MAX" value="9" enum="ArrayType">
|
<constant name="ARRAY_MAX" value="9" enum="ArrayType">
|
||||||
</constant>
|
</constant>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AtlasTexture" inherits="Texture" category="Core" version="3.0-stable">
|
<class name="AtlasTexture" inherits="Texture" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Packs multiple small textures in a single, bigger one. Helps to optimize video memory costs and render calls.
|
Packs multiple small textures in a single, bigger one. Helps to optimize video memory costs and render calls.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioBusLayout" inherits="Resource" category="Core" version="3.0-stable">
|
<class name="AudioBusLayout" inherits="Resource" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Stores information about the audiobusses.
|
Stores information about the audiobusses.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffect" inherits="Resource" category="Core" version="3.0-stable">
|
<class name="AudioEffect" inherits="Resource" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Audio Effect For Audio.
|
Audio Effect For Audio.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectAmplify" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectAmplify" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a Amplify audio effect to an Audio bus.
|
Adds a Amplify audio effect to an Audio bus.
|
||||||
Increases or decreases the volume of the selected audio bus.
|
Increases or decreases the volume of the selected audio bus.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectBandLimitFilter" inherits="AudioEffectFilter" category="Core" version="3.0-stable">
|
<class name="AudioEffectBandLimitFilter" inherits="AudioEffectFilter" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a band limit filter to the Audio Bus.
|
Adds a band limit filter to the Audio Bus.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectBandPassFilter" inherits="AudioEffectFilter" category="Core" version="3.0-stable">
|
<class name="AudioEffectBandPassFilter" inherits="AudioEffectFilter" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a band pass filter to the Audio Bus.
|
Adds a band pass filter to the Audio Bus.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectChorus" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectChorus" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a chorus audio effect.
|
Adds a chorus audio effect.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectCompressor" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectCompressor" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a Compressor audio effect to an Audio bus.
|
Adds a Compressor audio effect to an Audio bus.
|
||||||
Reduces sounds that exceed a certain threshold level, smooths out the dynamics and increases the overall volume.
|
Reduces sounds that exceed a certain threshold level, smooths out the dynamics and increases the overall volume.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectDelay" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectDelay" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a Delay audio effect to an Audio bus. Plays input signal back after a period of time.
|
Adds a Delay audio effect to an Audio bus. Plays input signal back after a period of time.
|
||||||
Two tap delay and feedback options.
|
Two tap delay and feedback options.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectDistortion" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectDistortion" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a Distortion audio effect to an Audio bus.
|
Adds a Distortion audio effect to an Audio bus.
|
||||||
Modify the sound to make it dirty.
|
Modify the sound to make it dirty.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectEQ" inherits="AudioEffect" category="Core" version="3.0-stable">
|
<class name="AudioEffectEQ" inherits="AudioEffect" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Base class for audio equalizers. Gives you control over frequencies.
|
Base class for audio equalizers. Gives you control over frequencies.
|
||||||
Use it to create a custom equalizer if [AudioEffectEQ6], [AudioEffectEQ10] or [AudioEffectEQ21] don't fit your needs.
|
Use it to create a custom equalizer if [AudioEffectEQ6], [AudioEffectEQ10] or [AudioEffectEQ21] don't fit your needs.
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectEQ10" inherits="AudioEffectEQ" category="Core" version="3.0-stable">
|
<class name="AudioEffectEQ10" inherits="AudioEffectEQ" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a 10-band equalizer audio effect to an Audio bus. Gives you control over frequencies from 31 Hz to 16000 Hz.
|
Adds a 10-band equalizer audio effect to an Audio bus. Gives you control over frequencies from 31 Hz to 16000 Hz.
|
||||||
Each frequency can be modulated between -60/+24 dB.
|
Each frequency can be modulated between -60/+24 dB.
|
||||||
@@ -16,7 +16,6 @@
|
|||||||
Band 8 : 4000 Hz
|
Band 8 : 4000 Hz
|
||||||
Band 9 : 8000 Hz
|
Band 9 : 8000 Hz
|
||||||
Band 10 : 16000 Hz
|
Band 10 : 16000 Hz
|
||||||
|
|
||||||
See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ21].
|
See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ21].
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="AudioEffectEQ21" inherits="AudioEffectEQ" category="Core" version="3.0-stable">
|
<class name="AudioEffectEQ21" inherits="AudioEffectEQ" category="Core" version="3.0.5">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Adds a 21-band equalizer audio effect to an Audio bus. Gives you control over frequencies from 22 Hz to 22000 Hz.
|
Adds a 21-band equalizer audio effect to an Audio bus. Gives you control over frequencies from 22 Hz to 22000 Hz.
|
||||||
Each frequency can be modulated between -60/+24 dB.
|
Each frequency can be modulated between -60/+24 dB.
|
||||||
@@ -27,7 +27,6 @@
|
|||||||
Band 19 : 11000 Hz
|
Band 19 : 11000 Hz
|
||||||
Band 20 : 16000 Hz
|
Band 20 : 16000 Hz
|
||||||
Band 21 : 22000 Hz
|
Band 21 : 22000 Hz
|
||||||
|
|
||||||
See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ10].
|
See also [AudioEffectEQ], [AudioEffectEQ6], [AudioEffectEQ10].
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user