Compare commits
1453 Commits
thermion_f
...
thermion_f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e04d8e76c2 | ||
|
|
353b33b7c3 | ||
|
|
3c1b26af2c | ||
|
|
b4ea80a84c | ||
|
|
db44bc6f74 | ||
|
|
c668549fb0 | ||
|
|
a66703b61c | ||
|
|
cb8943ff72 | ||
|
|
9f59577f90 | ||
|
|
b86145d4c6 | ||
|
|
cb8672f120 | ||
|
|
92578426ac | ||
|
|
4a6479c4d8 | ||
|
|
2244d3fcb6 | ||
|
|
003fd59269 | ||
|
|
77e6ef7568 | ||
|
|
6f07d406f8 | ||
|
|
bf5551e278 | ||
|
|
64577af352 | ||
|
|
951894be41 | ||
|
|
c64b2b8659 | ||
|
|
322e77d2b7 | ||
|
|
a8a52bb2f4 | ||
|
|
c7dfd293e2 | ||
|
|
cf2498b45f | ||
|
|
edb7538c36 | ||
|
|
b023e2fb97 | ||
|
|
b51cc4b1d1 | ||
|
|
d995ed8843 | ||
|
|
b0d34bf6a8 | ||
|
|
2e28b0379d | ||
|
|
c899e30a7b | ||
|
|
37f8558794 | ||
|
|
3cfa26d284 | ||
|
|
b22a82e181 | ||
|
|
3d072594b5 | ||
|
|
75590c5dde | ||
|
|
b52d47bb41 | ||
|
|
397c575631 | ||
|
|
ddc5af376a | ||
|
|
77f843568f | ||
|
|
f706f54eb2 | ||
|
|
c12ec892f3 | ||
|
|
8e88252337 | ||
|
|
23e34e6da4 | ||
|
|
5aa14ff5f6 | ||
|
|
c0cc9fc26a | ||
|
|
946a6ae9d2 | ||
|
|
73e6597301 | ||
|
|
e731556e6f | ||
|
|
f9a7ac49a1 | ||
|
|
83e4a5142a | ||
|
|
bb913644f4 | ||
|
|
4b9870244a | ||
|
|
ce2dc9b1cb | ||
|
|
1a2b3b7b59 | ||
|
|
c0ed7cbc90 | ||
|
|
a5eab305da | ||
|
|
c467e3ca69 | ||
|
|
e984d8cf71 | ||
|
|
0693a2a95b | ||
|
|
a2883fbee9 | ||
|
|
dbcf463fd1 | ||
|
|
6ab1411801 | ||
|
|
a9b5ca786e | ||
|
|
4379313932 | ||
|
|
8a997d533a | ||
|
|
b7e79b1ac5 | ||
|
|
9a5b737391 | ||
|
|
215515a4fc | ||
|
|
3ca1cc0747 | ||
|
|
0c2e4e6faa | ||
|
|
e50a1b6002 | ||
|
|
70c67b59f7 | ||
|
|
2022fa97cc | ||
|
|
809f84e1fa | ||
|
|
932971c872 | ||
|
|
7ed120e854 | ||
|
|
45c4cea6aa | ||
|
|
2545bbbd35 | ||
|
|
5b41d594da | ||
|
|
584abd6086 | ||
|
|
4b9c20eaa6 | ||
|
|
d35a7a6de2 | ||
|
|
0f9d2492e6 | ||
|
|
96ef070be7 | ||
|
|
506d2fb562 | ||
|
|
0b18caf4ff | ||
|
|
b3b0e2bae1 | ||
|
|
35369b890f | ||
|
|
53a2a116aa | ||
|
|
80ceb5988e | ||
|
|
9dc81781d1 | ||
|
|
3e8189ecd4 | ||
|
|
31acdecedf | ||
|
|
feeb757a10 | ||
|
|
1bbf9d26ac | ||
|
|
40e206fc94 | ||
|
|
48b631b0a8 | ||
|
|
5ac4da5075 | ||
|
|
bc392bd933 | ||
|
|
ceba3915a7 | ||
|
|
c46ac2383c | ||
|
|
a9083d9ba0 | ||
|
|
d9436b8141 | ||
|
|
72cc9b932a | ||
|
|
2c7425fbdb | ||
|
|
b5e699c781 | ||
|
|
a7b0ed6f21 | ||
|
|
b5d9a06422 | ||
|
|
6b9b13682b | ||
|
|
fab3240ecf | ||
|
|
2613ba2423 | ||
|
|
85e3c98b28 | ||
|
|
9d4802c270 | ||
|
|
e7227d5f91 | ||
|
|
ccc0a53abc | ||
|
|
b983c6bb90 | ||
|
|
854f1545d3 | ||
|
|
ca110b2b01 | ||
|
|
ced0667a21 | ||
|
|
240a2d5345 | ||
|
|
cb4479d8ce | ||
|
|
f4b473b9ae | ||
|
|
fac0c727e4 | ||
|
|
f0cf20d904 | ||
|
|
ebb73a29e1 | ||
|
|
e92e59fab4 | ||
|
|
be47ec0f8b | ||
|
|
3657428025 | ||
|
|
33f8faac04 | ||
|
|
e9f0d5b745 | ||
|
|
682881e133 | ||
|
|
3e2405aa76 | ||
|
|
52038084f3 | ||
|
|
af9c2a93dc | ||
|
|
e99ccb3100 | ||
|
|
ed21eec66e | ||
|
|
05c62d5fa0 | ||
|
|
bec34e5b0b | ||
|
|
634c6d6877 | ||
|
|
b47e7f206c | ||
|
|
1fe1889fa2 | ||
|
|
4a43c6169a | ||
|
|
6075608bda | ||
|
|
8a1f320bb7 | ||
|
|
ed5fb03aa4 | ||
|
|
21ccb52ab9 | ||
|
|
ff48ce94a3 | ||
|
|
d20ff0a6f1 | ||
|
|
c7d4d9cb33 | ||
|
|
9aec83fd70 | ||
|
|
4dbd761d16 | ||
|
|
fc365744ef | ||
|
|
900e43b5ec | ||
|
|
c78cd45b8a | ||
|
|
1268970ba7 | ||
|
|
f93e44abd5 | ||
|
|
d41f29c06d | ||
|
|
e27be37378 | ||
|
|
a8a7f11d44 | ||
|
|
c81f2f225c | ||
|
|
a89c6d0eb3 | ||
|
|
34c9d5a279 | ||
|
|
57999bec3c | ||
|
|
69400f8b68 | ||
|
|
18b6b2e5f0 | ||
|
|
7e802f7b23 | ||
|
|
ce23b9f3cd | ||
|
|
45d8c7b929 | ||
|
|
7a484ee794 | ||
|
|
832319ee1b | ||
|
|
668c001b49 | ||
|
|
e503dd2e8b | ||
|
|
e1c34cc4d9 | ||
|
|
b035d45ada | ||
|
|
75d34f0afb | ||
|
|
d053bfd6da | ||
|
|
920f81c514 | ||
|
|
b64a505ffc | ||
|
|
00debf509d | ||
|
|
73b32f9c1e | ||
|
|
abd1a1fd55 | ||
|
|
e8721b6133 | ||
|
|
a01bf36576 | ||
|
|
5f92c7feab | ||
|
|
e1cb517417 | ||
|
|
37c35906d6 | ||
|
|
355999562f | ||
|
|
c208972ed7 | ||
|
|
6a7ca3cd42 | ||
|
|
b6d869275a | ||
|
|
64eeacc029 | ||
|
|
3783081456 | ||
|
|
0a9b1a82e2 | ||
|
|
9322122dac | ||
|
|
a823718bcd | ||
|
|
7446b0545a | ||
|
|
3c4bedd43b | ||
|
|
21e8cf0d11 | ||
|
|
86e0f7740f | ||
|
|
a5a3c73708 | ||
|
|
a44cb9a9cc | ||
|
|
6f97bf3993 | ||
|
|
42f9538040 | ||
|
|
df393b075b | ||
|
|
13f9a8370b | ||
|
|
558978a0f2 | ||
|
|
a29b194612 | ||
|
|
3e04bf427f | ||
|
|
65ca59ff22 | ||
|
|
a91aaae131 | ||
|
|
71bae61015 | ||
|
|
288acb019e | ||
|
|
b9354531b2 | ||
|
|
388b8556e5 | ||
|
|
59d9d87d2f | ||
|
|
d5824466f7 | ||
|
|
3e11f09d63 | ||
|
|
6bbab332be | ||
|
|
85b86c5f13 | ||
|
|
d8652e8709 | ||
|
|
fe5279f942 | ||
|
|
828354abe5 | ||
|
|
48d9d6751b | ||
|
|
4bde3d34cf | ||
|
|
7f2ad7c4e4 | ||
|
|
47807d560f | ||
|
|
ad26fc4563 | ||
|
|
f252c86152 | ||
|
|
e5bcde3ade | ||
|
|
9436666d34 | ||
|
|
32fe54ac09 | ||
|
|
0461bb364a | ||
|
|
f78c6f258f | ||
|
|
b0796f493f | ||
|
|
8998f1f740 | ||
|
|
6362efcd61 | ||
|
|
dc5c1161cc | ||
|
|
3e6f95e0bf | ||
|
|
f053c2f852 | ||
|
|
8f1da5e7bd | ||
|
|
641d92515e | ||
|
|
d447fb8e2a | ||
|
|
ac87420a87 | ||
|
|
5669ac5c55 | ||
|
|
ae9ce197c1 | ||
|
|
37c67c2da8 | ||
|
|
66d3bf65fd | ||
|
|
dba40fb82b | ||
|
|
95db6d7ebb | ||
|
|
fef48940fc | ||
|
|
4086c9bd01 | ||
|
|
928517f80f | ||
|
|
4a9b91c411 | ||
|
|
9054879722 | ||
|
|
4c95bc5b70 | ||
|
|
8866ffe210 | ||
|
|
c33eaef713 | ||
|
|
78e14574ef | ||
|
|
073976b40e | ||
|
|
6d0844f873 | ||
|
|
983d1373ba | ||
|
|
0dd64a07bb | ||
|
|
6055bd3fa7 | ||
|
|
f3a576005a | ||
|
|
ff559997dd | ||
|
|
79fea25d1b | ||
|
|
9ae7c784df | ||
|
|
acf03ea0c7 | ||
|
|
a9553da1d4 | ||
|
|
fc4686b20f | ||
|
|
ab4743da90 | ||
|
|
7406662853 | ||
|
|
aa2f19442b | ||
|
|
cc99905eb8 | ||
|
|
1d697037c0 | ||
|
|
c024efb8cd | ||
|
|
150c0227c8 | ||
|
|
e594a42496 | ||
|
|
c484eeb37f | ||
|
|
655ba89b0f | ||
|
|
840f3599e7 | ||
|
|
d0da7f49f3 | ||
|
|
886a4a37aa | ||
|
|
6db82d00c2 | ||
|
|
0fb4fd0004 | ||
|
|
e147e59d8d | ||
|
|
28aef7e5cc | ||
|
|
b1617004d7 | ||
|
|
32b6b1c227 | ||
|
|
1c500fe925 | ||
|
|
3fd15ab91b | ||
|
|
2191f9d44b | ||
|
|
87b63301f2 | ||
|
|
0d5b42c908 | ||
|
|
12e2dca873 | ||
|
|
8eae6bf90c | ||
|
|
873244879f | ||
|
|
2ab1732b6b | ||
|
|
5eb83a80b3 | ||
|
|
7141a01101 | ||
|
|
24aaffda9c | ||
|
|
82aba605f9 | ||
|
|
7b80723560 | ||
|
|
39a302c23e | ||
|
|
059926fe98 | ||
|
|
3c9b607109 | ||
|
|
70e2933c4b | ||
|
|
4fb85eb45a | ||
|
|
afecacfcf0 | ||
|
|
2f7f363db9 | ||
|
|
7f0ec01937 | ||
|
|
ccdf2ecda6 | ||
|
|
5f9a7bb959 | ||
|
|
764fea836b | ||
|
|
27d6bd0f4a | ||
|
|
7e810b8265 | ||
|
|
6ad3bfab13 | ||
|
|
5ed00164a9 | ||
|
|
86894cf583 | ||
|
|
c789e75af5 | ||
|
|
6ad76b6217 | ||
|
|
2e097f7ec6 | ||
|
|
beeb45609c | ||
|
|
94eacec27e | ||
|
|
11f7ac459b | ||
|
|
afd47f9b24 | ||
|
|
aab2b0b769 | ||
|
|
ffc7717149 | ||
|
|
ff5921a505 | ||
|
|
45c7831a17 | ||
|
|
fcf57e8850 | ||
|
|
a875f370e5 | ||
|
|
b00f37ddaa | ||
|
|
a98d7550ae | ||
|
|
b12dc80cfd | ||
|
|
f7d6d4786a | ||
|
|
5db9fe2c9e | ||
|
|
d298b0d091 | ||
|
|
4a7a366fc6 | ||
|
|
c6ceea4f8b | ||
|
|
679af95901 | ||
|
|
1e812ebe93 | ||
|
|
75a9950909 | ||
|
|
81fb0fb583 | ||
|
|
4d6c008299 | ||
|
|
4505cbe325 | ||
|
|
60cfe32672 | ||
|
|
0decb6b9f1 | ||
|
|
d799ef0ca0 | ||
|
|
5a72bc835d | ||
|
|
3e44716e8c | ||
|
|
bf295394a8 | ||
|
|
64bc7f8bf3 | ||
|
|
63ba231996 | ||
|
|
562c221461 | ||
|
|
f123bbf930 | ||
|
|
1765350cbe | ||
|
|
94683ab5a9 | ||
|
|
5a74345fe1 | ||
|
|
195a625738 | ||
|
|
725f36a860 | ||
|
|
51212bdeed | ||
|
|
96694be017 | ||
|
|
a31f11151e | ||
|
|
10136c8cde | ||
|
|
c712804bb1 | ||
|
|
1373ce5a32 | ||
|
|
1b3d46533c | ||
|
|
5733bc125b | ||
|
|
943de8f77b | ||
|
|
9a4fd1141e | ||
|
|
2bf77f123f | ||
|
|
9785576866 | ||
|
|
3007dec127 | ||
|
|
1008452198 | ||
|
|
1f58c13179 | ||
|
|
5ce2efa638 | ||
|
|
e75805ba06 | ||
|
|
73f04eb0d4 | ||
|
|
097d991ea8 | ||
|
|
5cf494def9 | ||
|
|
23d6e3a819 | ||
|
|
9a6bacc73f | ||
|
|
e432b0be1d | ||
|
|
2dad04a354 | ||
|
|
1fb68b20e9 | ||
|
|
d61723dee2 | ||
|
|
1afd5ff257 | ||
|
|
04b8b333d4 | ||
|
|
fdd3853121 | ||
|
|
bdba92c842 | ||
|
|
66f3e20489 | ||
|
|
871a327d99 | ||
|
|
c53266f12f | ||
|
|
11ff6c9053 | ||
|
|
d392daa2e6 | ||
|
|
fc75aab94b | ||
|
|
760ae8ed8b | ||
|
|
25ada92574 | ||
|
|
12c8031f2b | ||
|
|
8c78e8e629 | ||
|
|
dc5cdcb7e1 | ||
|
|
383fc221d9 | ||
|
|
e4942bad2f | ||
|
|
460000308a | ||
|
|
826a22f348 | ||
|
|
43442e10de | ||
|
|
b710e0ace3 | ||
|
|
b0087d8d54 | ||
|
|
dcef1a5749 | ||
|
|
1c0a7f6b1e | ||
|
|
2444e9a980 | ||
|
|
417ee4648f | ||
|
|
4b2342979f | ||
|
|
ee306549d8 | ||
|
|
d3ec825688 | ||
|
|
fe11479b08 | ||
|
|
c98e604e76 | ||
|
|
f9d09e17ef | ||
|
|
27eb117466 | ||
|
|
46e87fb6a4 | ||
|
|
6d95180870 | ||
|
|
c7ad70b81c | ||
|
|
62bf3876f8 | ||
|
|
cff0893d53 | ||
|
|
6135c5eecc | ||
|
|
170fb4bf6d | ||
|
|
2f5ce65684 | ||
|
|
bb272f2579 | ||
|
|
56e132ec15 | ||
|
|
5379ae7d74 | ||
|
|
9d7e96e996 | ||
|
|
8bbe2f0dfb | ||
|
|
0794e0ad84 | ||
|
|
3f0f15b441 | ||
|
|
90f17e3bc9 | ||
|
|
8311c95100 | ||
|
|
97da08ae8b | ||
|
|
12a96cceee | ||
|
|
fac7e9a894 | ||
|
|
c47cfe9b57 | ||
|
|
671949a5cd | ||
|
|
602e220024 | ||
|
|
ebab1f528d | ||
|
|
4a5a1d0157 | ||
|
|
906f5bf931 | ||
|
|
9ef6d46958 | ||
|
|
50c1c871a8 | ||
|
|
8a6ba637a7 | ||
|
|
abde201bda | ||
|
|
428a613b65 | ||
|
|
1ddeac2d31 | ||
|
|
7961ed06f7 | ||
|
|
cedcb45484 | ||
|
|
cf6abdcf01 | ||
|
|
04d3aee2e9 | ||
|
|
5af18cb99b | ||
|
|
87396ec859 | ||
|
|
2f16908992 | ||
|
|
63e2dcd0ca | ||
|
|
afd8bff58e | ||
|
|
2ab56b86bc | ||
|
|
e9628511fc | ||
|
|
3402c02d6a | ||
|
|
fdf278cd79 | ||
|
|
e5b75debed | ||
|
|
eedfbbb934 | ||
|
|
2a5a149e83 | ||
|
|
4cb725d47e | ||
|
|
8228486ef3 | ||
|
|
c66dc40bab | ||
|
|
4f1a9fb0d5 | ||
|
|
454ec14b40 | ||
|
|
b4f3d865b4 | ||
|
|
86779cb629 | ||
|
|
e1d5d14ff7 | ||
|
|
1be1979c05 | ||
|
|
2b6693a826 | ||
|
|
7d369ad813 | ||
|
|
81a28a2f2e | ||
|
|
6b008bd433 | ||
|
|
241c0fe07c | ||
|
|
12b6a8c8a5 | ||
|
|
426d6c4ed6 | ||
|
|
4002425c0d | ||
|
|
230bb5f9f6 | ||
|
|
8a35060653 | ||
|
|
2b00d374e0 | ||
|
|
da87442b3a | ||
|
|
3c68731fe0 | ||
|
|
ef775b2e2c | ||
|
|
0759590f4c | ||
|
|
e7092c416b | ||
|
|
f272410803 | ||
|
|
b128f385e5 | ||
|
|
a4227df098 | ||
|
|
230af0ae17 | ||
|
|
aeb644cf16 | ||
|
|
c3e583ac5a | ||
|
|
48654f0e8f | ||
|
|
a772b86f09 | ||
|
|
026893d2fe | ||
|
|
2d4342607d | ||
|
|
02b6bc4ee6 | ||
|
|
0194eb5cd5 | ||
|
|
9ceedb4e1c | ||
|
|
85a0451f1b | ||
|
|
dfda0eb476 | ||
|
|
b160932ff3 | ||
|
|
f9c5ee5896 | ||
|
|
5097373a22 | ||
|
|
10dd66c7f8 | ||
|
|
b6e5d2c834 | ||
|
|
726f9b8c80 | ||
|
|
7349fa2298 | ||
|
|
143c4a436d | ||
|
|
60e025e78d | ||
|
|
de5bc5c02e | ||
|
|
a1ab4186b4 | ||
|
|
d3b9ae45cf | ||
|
|
7dfb8a4b19 | ||
|
|
2bd64805a9 | ||
|
|
b17b732c55 | ||
|
|
8157f3318b | ||
|
|
fbbb4ed792 | ||
|
|
ec3e7ed3ba | ||
|
|
585e0ad087 | ||
|
|
4815b0309e | ||
|
|
9d593b8c3b | ||
|
|
aaa74f0267 | ||
|
|
cf8e0f6ed2 | ||
|
|
303174117f | ||
|
|
ccda475073 | ||
|
|
ddba3c35ab | ||
|
|
87d04fc2c1 | ||
|
|
a3f05e353d | ||
|
|
69ce7b1a15 | ||
|
|
3922ee536b | ||
|
|
cf372f4dc2 | ||
|
|
854b142973 | ||
|
|
7d8f7a726b | ||
|
|
e0b2e1c3b9 | ||
|
|
f7a7b6bedf | ||
|
|
7b0550c713 | ||
|
|
ec8248e10c | ||
|
|
374d2e5697 | ||
|
|
e407e75389 | ||
|
|
342ff58cbe | ||
|
|
68842fb4ce | ||
|
|
88f229481d | ||
|
|
09b2a924af | ||
|
|
06715f0618 | ||
|
|
38d190f582 | ||
|
|
73cb20a2dd | ||
|
|
a08cc7aa62 | ||
|
|
9d4fd4d6d4 | ||
|
|
e8aa68beb4 | ||
|
|
178da458ad | ||
|
|
508c184f1a | ||
|
|
a8cf071f2f | ||
|
|
89768c9303 | ||
|
|
a31142de6d | ||
|
|
66ddcac412 | ||
|
|
645ba97c1d | ||
|
|
a26eacb247 | ||
|
|
667397ad83 | ||
|
|
99217499f9 | ||
|
|
b083c62bd4 | ||
|
|
d0b297b015 | ||
|
|
ddc5fedc4d | ||
|
|
968e2e508d | ||
|
|
7c936547aa | ||
|
|
4ac1b5329c | ||
|
|
bf44ca7ddd | ||
|
|
e25d7805d9 | ||
|
|
5aaf212d9a | ||
|
|
99bd993f25 | ||
|
|
a153bc9916 | ||
|
|
77ff8ff4c3 | ||
|
|
709fe35852 | ||
|
|
ecb8d8672a | ||
|
|
a79e1a86f8 | ||
|
|
4bdbb170a7 | ||
|
|
7960b55dbd | ||
|
|
77465baaf4 | ||
|
|
dcf13fd53f | ||
|
|
973804ed14 | ||
|
|
9978d9d75c | ||
|
|
e4f436fab1 | ||
|
|
ac5b5b89f6 | ||
|
|
b69977929c | ||
|
|
548dccf776 | ||
|
|
b4e4eb349c | ||
|
|
7a5fdb0b77 | ||
|
|
51e51db229 | ||
|
|
faba1b3087 | ||
|
|
123543a985 | ||
|
|
cd9332063c | ||
|
|
54a0a0befb | ||
|
|
289749115b | ||
|
|
cd1c2f3827 | ||
|
|
e8169e86d1 | ||
|
|
cac063324d | ||
|
|
aebaa8425c | ||
|
|
1b902e36f4 | ||
|
|
396b7ed6dc | ||
|
|
d6666d6388 | ||
|
|
7d5b183dea | ||
|
|
6c25a3c405 | ||
|
|
999b1e613f | ||
|
|
0cbbc058e0 | ||
|
|
a67f42f0de | ||
|
|
4ef74c4c70 | ||
|
|
255c0edd49 | ||
|
|
1177a71f73 | ||
|
|
e6bdcb687a | ||
|
|
cbff4cd805 | ||
|
|
a8a2f14b34 | ||
|
|
931aab5159 | ||
|
|
a310498c5a | ||
|
|
6744c02019 | ||
|
|
124f923720 | ||
|
|
e2048c3efd | ||
|
|
ac86dc7ad7 | ||
|
|
e73cb9c7d6 | ||
|
|
102429e090 | ||
|
|
627447f8b0 | ||
|
|
d5bffd5ad2 | ||
|
|
951f5daa2d | ||
|
|
77fe40848b | ||
|
|
07b80071a4 | ||
|
|
03f7764da2 | ||
|
|
231b03cd17 | ||
|
|
b271b7e433 | ||
|
|
746ef07e42 | ||
|
|
bff76f184e | ||
|
|
2244359edd | ||
|
|
b94edf0951 | ||
|
|
988e22fe95 | ||
|
|
401048e6a8 | ||
|
|
232289003e | ||
|
|
e18d1246f6 | ||
|
|
95c9e5be66 | ||
|
|
e1203df087 | ||
|
|
09678c6cdc | ||
|
|
f2ce4a4044 | ||
|
|
c23b991c9c | ||
|
|
4205b86f13 | ||
|
|
d710ab810c | ||
|
|
4e5a9be97a | ||
|
|
342a53ae7b | ||
|
|
a0e1971958 | ||
|
|
74502ba5b3 | ||
|
|
09b6aca08f | ||
|
|
03c4afb031 | ||
|
|
f923b94b84 | ||
|
|
20ea43a809 | ||
|
|
8b34934755 | ||
|
|
5ad187d54f | ||
|
|
711abe11bd | ||
|
|
a16c3c7580 | ||
|
|
e1446c7eb8 | ||
|
|
1f4af8c946 | ||
|
|
75bee32e54 | ||
|
|
1d49db4767 | ||
|
|
d39b57f054 | ||
|
|
e91d1ca0aa | ||
|
|
7d87d229d0 | ||
|
|
7ed7ff48b9 | ||
|
|
9d311220b1 | ||
|
|
e4de0f3ae0 | ||
|
|
72711ee64f | ||
|
|
c52052c1b9 | ||
|
|
aa26f4d0df | ||
|
|
be61d5e5ca | ||
|
|
1a3d902d23 | ||
|
|
35bddd2bb2 | ||
|
|
74ee35bfcd | ||
|
|
2915655695 | ||
|
|
5b80dd3a3d | ||
|
|
593bca3365 | ||
|
|
cca9fba79f | ||
|
|
a245cf2915 | ||
|
|
15134c335b | ||
|
|
85215f6760 | ||
|
|
9abb192148 | ||
|
|
f7fa02180a | ||
|
|
fc7f5d7b93 | ||
|
|
5dca42c3c1 | ||
|
|
665c2fb39d | ||
|
|
3ac79b2080 | ||
|
|
8d52690c97 | ||
|
|
2a8931e1ac | ||
|
|
94d77ff21b | ||
|
|
7a707cda67 | ||
|
|
8993d888b1 | ||
|
|
ffc256228a | ||
|
|
1b1de0b7c0 | ||
|
|
4c1480864e | ||
|
|
06cc114daa | ||
|
|
1258751dda | ||
|
|
67ca24a7d9 | ||
|
|
282ee6d103 | ||
|
|
bb5a8f495d | ||
|
|
c400ca3993 | ||
|
|
d7d7fa7c0b | ||
|
|
c1be084e3e | ||
|
|
178e59a618 | ||
|
|
7fe9c06a7f | ||
|
|
0f4531d3d7 | ||
|
|
c5228dff7e | ||
|
|
7131e7ab86 | ||
|
|
16ff7ef008 | ||
|
|
a178035796 | ||
|
|
61abed2fb7 | ||
|
|
30060578ef | ||
|
|
2c2beb0e76 | ||
|
|
2b864f6f44 | ||
|
|
0b1da2a15d | ||
|
|
ad70ef1461 | ||
|
|
6f110a56dd | ||
|
|
0e5253f7b3 | ||
|
|
124eed0264 | ||
|
|
9a055174e6 | ||
|
|
3a231697e5 | ||
|
|
3e74c8faea | ||
|
|
18b0bf19b9 | ||
|
|
020bfbcbf6 | ||
|
|
b1c0d4b2e8 | ||
|
|
6cefe44c64 | ||
|
|
4aa8889834 | ||
|
|
aee9c767dd | ||
|
|
916ecd5629 | ||
|
|
d3a6f6e22a | ||
|
|
86ecd53de7 | ||
|
|
8653ca8398 | ||
|
|
1d615e7568 | ||
|
|
4cb118ad65 | ||
|
|
4e64c4976f | ||
|
|
04adbc39e0 | ||
|
|
744e39e8dd | ||
|
|
baf86d1ade | ||
|
|
3e181b6aff | ||
|
|
8e0ba8ac4e | ||
|
|
3e39aa3630 | ||
|
|
cc1b55b6c9 | ||
|
|
242041c9f6 | ||
|
|
7717387909 | ||
|
|
31e453a4e6 | ||
|
|
9b988537e0 | ||
|
|
d9338f4341 | ||
|
|
b6397b5f73 | ||
|
|
584ace23b4 | ||
|
|
5e89dc43e8 | ||
|
|
024643e3a1 | ||
|
|
96fe2c89ea | ||
|
|
8d8acef481 | ||
|
|
51bdca7158 | ||
|
|
658984e784 | ||
|
|
f8ae90b631 | ||
|
|
b158062ce8 | ||
|
|
dc690bb93a | ||
|
|
342264eba9 | ||
|
|
453ce9d1ea | ||
|
|
e9c14139c2 | ||
|
|
d92d47faa5 | ||
|
|
b6bde0c9d9 | ||
|
|
f873f7da66 | ||
|
|
aabea985bd | ||
|
|
9f9b34f662 | ||
|
|
fc4842ed6d | ||
|
|
eb4e70a7cf | ||
|
|
19ffa91164 | ||
|
|
a519701510 | ||
|
|
5fb5e42b98 | ||
|
|
ba3636a203 | ||
|
|
e0b4ebc349 | ||
|
|
1d1a3cbfe6 | ||
|
|
7aa0367a3b | ||
|
|
0817efc33e | ||
|
|
0facb3f906 | ||
|
|
355c28477b | ||
|
|
c1a294315a | ||
|
|
f27628e719 | ||
|
|
fd1faa6023 | ||
|
|
8fa43e5306 | ||
|
|
94863134fc | ||
|
|
1b979252db | ||
|
|
852cb58ba9 | ||
|
|
7cf1468f38 | ||
|
|
62cd85c148 | ||
|
|
771f851784 | ||
|
|
def85614d8 | ||
|
|
0ad73d06e0 | ||
|
|
6c236da675 | ||
|
|
6b883f3352 | ||
|
|
ffa0f77a42 | ||
|
|
26ae21910f | ||
|
|
5c3af255e4 | ||
|
|
29c35f9037 | ||
|
|
1e1d6fdcc9 | ||
|
|
113f769160 | ||
|
|
278575c3e2 | ||
|
|
27e150ebf6 | ||
|
|
fe0f63c4cb | ||
|
|
b94aeb8b4a | ||
|
|
8b9b299786 | ||
|
|
6ce743057b | ||
|
|
fbb53f9033 | ||
|
|
8a894f7e88 | ||
|
|
5e88a710ae | ||
|
|
6b36d67ed7 | ||
|
|
5564be9ce9 | ||
|
|
9f676f42b9 | ||
|
|
981fd63963 | ||
|
|
cb9320f3a1 | ||
|
|
6d5bc305dc | ||
|
|
1c5b5c890b | ||
|
|
e43e1c9cbd | ||
|
|
5fe985d2c7 | ||
|
|
80ca4b97a9 | ||
|
|
d3b4bed654 | ||
|
|
c117555b2c | ||
|
|
abbf2d5391 | ||
|
|
a31c800204 | ||
|
|
877e8def80 | ||
|
|
fb650dbd52 | ||
|
|
c34c7d5545 | ||
|
|
fe37d45e1a | ||
|
|
bf3d4f7c0e | ||
|
|
69643e26f6 | ||
|
|
44b502a1e4 | ||
|
|
6d36dc7923 | ||
|
|
151935913f | ||
|
|
d72ed58436 | ||
|
|
d53a8b20b8 | ||
|
|
600ab1ad28 | ||
|
|
aa7350c419 | ||
|
|
c2077cb6b1 | ||
|
|
bedd50ec38 | ||
|
|
8a3525d879 | ||
|
|
853f1d1a68 | ||
|
|
7e50f0317e | ||
|
|
724d7532e2 | ||
|
|
45a548afd2 | ||
|
|
e8b4b7806b | ||
|
|
133367669d | ||
|
|
60a09a1cd9 | ||
|
|
9128fbbd61 | ||
|
|
c3c6465908 | ||
|
|
ed444b0615 | ||
|
|
9ada6aae64 | ||
|
|
0ef0f37bbf | ||
|
|
df37f5e95f | ||
|
|
468cada6c6 | ||
|
|
e60ab51b79 | ||
|
|
d58a48061c | ||
|
|
cabb62043d | ||
|
|
b7bc46b94a | ||
|
|
bc8edb7eb4 | ||
|
|
5deb2ad7cf | ||
|
|
dcc523edff | ||
|
|
26eba7ae09 | ||
|
|
9692c07da9 | ||
|
|
2860db3fbd | ||
|
|
1ce5bd3bcf | ||
|
|
9d3f87218e | ||
|
|
505b4bb156 | ||
|
|
25320f45af | ||
|
|
0b9f3160d9 | ||
|
|
bb27f40cb2 | ||
|
|
9853d6b721 | ||
|
|
52f041afba | ||
|
|
646814126f | ||
|
|
05cb4325da | ||
|
|
e8b3468a3a | ||
|
|
741607b78b | ||
|
|
70414bb83c | ||
|
|
436873a455 | ||
|
|
b59cadc061 | ||
|
|
bdcbd90ec6 | ||
|
|
f3e96fe94a | ||
|
|
ef97f0e6c2 | ||
|
|
8976eb9621 | ||
|
|
e2cfe9247e | ||
|
|
6472670ec3 | ||
|
|
0eb81114dd | ||
|
|
31c5ef41eb | ||
|
|
73470fa504 | ||
|
|
14b815e009 | ||
|
|
5ae028f1e9 | ||
|
|
859a514bc5 | ||
|
|
4d97126ef6 | ||
|
|
cc34cb20bd | ||
|
|
9c555c9ec0 | ||
|
|
9537f75bc2 | ||
|
|
30e0012da6 | ||
|
|
1892235d5c | ||
|
|
82bd84b60d | ||
|
|
814adf8567 | ||
|
|
671880b405 | ||
|
|
6ce2e22fac | ||
|
|
51d3dae1db | ||
|
|
a33a18da42 | ||
|
|
6ff04fb76a | ||
|
|
124938dbc2 | ||
|
|
902f67e97d | ||
|
|
08c02c1590 | ||
|
|
4650ae1295 | ||
|
|
c77ede9109 | ||
|
|
0f56cbe7e7 | ||
|
|
708e90117d | ||
|
|
33e5350605 | ||
|
|
d1924cfdf4 | ||
|
|
dff214259a | ||
|
|
d25edfc097 | ||
|
|
8c2b8a6cba | ||
|
|
eccbde4ebb | ||
|
|
27e1456b9f | ||
|
|
9c6b2a92ac | ||
|
|
1d6cb9cad2 | ||
|
|
d31e6c8183 | ||
|
|
cf1a50c2e5 | ||
|
|
7c15125a97 | ||
|
|
b7c14ebbda | ||
|
|
2969321b8c | ||
|
|
036369a8dc | ||
|
|
7be2b43c35 | ||
|
|
e5fe6d95e9 | ||
|
|
a8480a9eee | ||
|
|
1a4f53a3f9 | ||
|
|
11c374c25d | ||
|
|
618d633602 | ||
|
|
3effb837b7 | ||
|
|
68d363388d | ||
|
|
10fd78276c | ||
|
|
4d778326c6 | ||
|
|
e2d381b6b7 | ||
|
|
4fc819e9b9 | ||
|
|
f0feb8aeb1 | ||
|
|
85013743fe | ||
|
|
e5a1585c25 | ||
|
|
dd8bf920a5 | ||
|
|
b70c144784 | ||
|
|
d9849717de | ||
|
|
ec4fd5fd44 | ||
|
|
52b83d933d | ||
|
|
f1f2a237bb | ||
|
|
4a90031054 | ||
|
|
cf34b7867d | ||
|
|
e49330c34a | ||
|
|
53ff1de23c | ||
|
|
7165b13d48 | ||
|
|
f330721c0c | ||
|
|
01fe469a28 | ||
|
|
e716b55b5c | ||
|
|
e7ebf6e8b2 | ||
|
|
16e34bf76a | ||
|
|
3dce7a61a8 | ||
|
|
5dac06d335 | ||
|
|
a8d21fe316 | ||
|
|
d784efa44a | ||
|
|
b2a4955d54 | ||
|
|
02d7a0acfd | ||
|
|
ee5c08f795 | ||
|
|
d7debf981c | ||
|
|
2b4a73f355 | ||
|
|
06b20ec6fc | ||
|
|
a3b6d60e16 | ||
|
|
37608a8fbe | ||
|
|
2713286ca5 | ||
|
|
6f648702e9 | ||
|
|
5e17e0c6d1 | ||
|
|
0fcc44bff8 | ||
|
|
f65324e555 | ||
|
|
1ba4b2a5be | ||
|
|
de4733edf1 | ||
|
|
75936c75d0 | ||
|
|
6f6ee807cf | ||
|
|
7a1ce5c281 | ||
|
|
d4a3985a65 | ||
|
|
d73e723003 | ||
|
|
02c3876131 | ||
|
|
641ed45b59 | ||
|
|
aa7306fc4c | ||
|
|
d8296f85bf | ||
|
|
b96dda26c0 | ||
|
|
3ba16e019c | ||
|
|
12f97cf78f | ||
|
|
219dfa801f | ||
|
|
1826c23692 | ||
|
|
b5dd62a614 | ||
|
|
59e7d7c7c3 | ||
|
|
e66cb35899 | ||
|
|
d9aa90350c | ||
|
|
4a9d28e59d | ||
|
|
636e1961dd | ||
|
|
ff27652fb6 | ||
|
|
3b6285cff8 | ||
|
|
0d865977b4 | ||
|
|
a6872f5a77 | ||
|
|
d26d786f67 | ||
|
|
71aa4be3b1 | ||
|
|
70507a5919 | ||
|
|
b99886095b | ||
|
|
8dabe08792 | ||
|
|
de4fd3b8d0 | ||
|
|
7778afe3ec | ||
|
|
f817406dbc | ||
|
|
a16e3fcd3c | ||
|
|
2bbaff5f15 | ||
|
|
18023f1606 | ||
|
|
707793c6b2 | ||
|
|
f080720712 | ||
|
|
cf7d8e45f4 | ||
|
|
a5c3d7b215 | ||
|
|
68053b0f5a | ||
|
|
39762c8132 | ||
|
|
e27a8ee601 | ||
|
|
0a10dc426b | ||
|
|
53ee466fb6 | ||
|
|
33acc73ab7 | ||
|
|
dbbb4d7123 | ||
|
|
de39af13d0 | ||
|
|
9244009350 | ||
|
|
bb10a75f0e | ||
|
|
6cf4efdf31 | ||
|
|
83fe74253f | ||
|
|
4be95072fd | ||
|
|
9a8c245e31 | ||
|
|
f2e0f32054 | ||
|
|
a6c9ee60a9 | ||
|
|
9cef768dfc | ||
|
|
75d5fb2f8d | ||
|
|
e417756971 | ||
|
|
9d961af8ed | ||
|
|
ac25475155 | ||
|
|
983228a8ac | ||
|
|
6e627d8f9f | ||
|
|
dd82d5d3e7 | ||
|
|
df319f007f | ||
|
|
880551aaa3 | ||
|
|
b8c76a16cc | ||
|
|
a52f835288 | ||
|
|
bd9295bc90 | ||
|
|
a43ee8fa3a | ||
|
|
d8a42a4136 | ||
|
|
e2d11014d0 | ||
|
|
6d1e56caac | ||
|
|
c322c6aff9 | ||
|
|
7631aec796 | ||
|
|
033e863750 | ||
|
|
05b96c6972 | ||
|
|
9fc26a2078 | ||
|
|
c894925db1 | ||
|
|
b0da2f63a8 | ||
|
|
1c05793f03 | ||
|
|
bd123ba2f1 | ||
|
|
4aad34ce93 | ||
|
|
b2bd8ee66f | ||
|
|
018434ea57 | ||
|
|
71c230552d | ||
|
|
2a4b440db2 | ||
|
|
22eeb492b0 | ||
|
|
19a1bc0f1d | ||
|
|
58010dafde | ||
|
|
6e64cc3617 | ||
|
|
056ba55f1c | ||
|
|
abd1fdefca | ||
|
|
1fc3807fa8 | ||
|
|
ae91e09943 | ||
|
|
5087cc48f5 | ||
|
|
f7da303d29 | ||
|
|
f90bc7b165 | ||
|
|
9a1354d287 | ||
|
|
b3721122f0 | ||
|
|
3c9ee7f82f | ||
|
|
6ec57d02fd | ||
|
|
99f0bb8468 | ||
|
|
a6738a8493 | ||
|
|
17d6ca9459 | ||
|
|
11fa485440 | ||
|
|
3e67b64b90 | ||
|
|
021180dbe3 | ||
|
|
4f012662e6 | ||
|
|
4adcf7bca5 | ||
|
|
8ddaf24a94 | ||
|
|
50ed0bdfda | ||
|
|
e1efd5e4e0 | ||
|
|
fbd54a2a09 | ||
|
|
22020d8607 | ||
|
|
767aa88930 | ||
|
|
3596723d3d | ||
|
|
03ab646713 | ||
|
|
a5ca6132f0 | ||
|
|
ef5b12af4f | ||
|
|
11f668e163 | ||
|
|
bb303f98d2 | ||
|
|
56061e6471 | ||
|
|
faabe2f2a2 | ||
|
|
6dd09a12da | ||
|
|
68ccd983a0 | ||
|
|
89cdf5e52d | ||
|
|
dc27396c6f | ||
|
|
e2eb1137d2 | ||
|
|
b5d47ae2a5 | ||
|
|
c2b1d8660e | ||
|
|
b2024d38b5 | ||
|
|
589201ad39 | ||
|
|
34c0d87703 | ||
|
|
f71078e112 | ||
|
|
fb8c82d838 | ||
|
|
41432a07ed | ||
|
|
2408104bd0 | ||
|
|
d1cd68cda6 | ||
|
|
3dffaddfe8 | ||
|
|
f023810859 | ||
|
|
256d5d4eb1 | ||
|
|
7edbf8fc8d | ||
|
|
2a20075797 | ||
|
|
c91cbeba1a | ||
|
|
9da4710d54 | ||
|
|
2d1ee3bbbe | ||
|
|
758704d464 | ||
|
|
9639caf019 | ||
|
|
0d45365ba3 | ||
|
|
c19a1b3154 | ||
|
|
ac45bd2963 | ||
|
|
f2d94878da | ||
|
|
532eadf434 | ||
|
|
673842acbc | ||
|
|
aaca5ad372 | ||
|
|
f6906ac3fd | ||
|
|
38a5395c78 | ||
|
|
85dcd5a5b9 | ||
|
|
92fbe2e5d5 | ||
|
|
779d5cba1c | ||
|
|
f4217401e2 | ||
|
|
e99bf6b14b | ||
|
|
84775f7e2a | ||
|
|
8c6bc456a8 | ||
|
|
d58d8bbc35 | ||
|
|
0738f32751 | ||
|
|
110962cc37 | ||
|
|
70e529605c | ||
|
|
aa02e04091 | ||
|
|
a670ce1cf0 | ||
|
|
f552e61157 | ||
|
|
e397b68060 | ||
|
|
cb5580d770 | ||
|
|
0cd4ecf701 | ||
|
|
46291d4a63 | ||
|
|
1344d1c424 | ||
|
|
bb0f3d417f | ||
|
|
0f6d02a83f | ||
|
|
56e00c9c55 | ||
|
|
943ca26eae | ||
|
|
8e1c611e92 | ||
|
|
ed5f23faf2 | ||
|
|
60bd7498ea | ||
|
|
ab1de78b74 | ||
|
|
493d547c7b | ||
|
|
7bcfd0f805 | ||
|
|
3e1b151488 | ||
|
|
820ad7cb28 | ||
|
|
686b4800aa | ||
|
|
cb7828820d | ||
|
|
a6d457f664 | ||
|
|
fd95c634f1 | ||
|
|
df0a744cc9 | ||
|
|
af55ef56c9 | ||
|
|
6c6991f0a9 | ||
|
|
d248a85aee | ||
|
|
64642204fc | ||
|
|
5bb84618c3 | ||
|
|
fc5cce71b7 | ||
|
|
b00aa0696f | ||
|
|
02aa14d7b7 | ||
|
|
f9dfb68e9f | ||
|
|
208eb4ad06 | ||
|
|
5608abdf79 | ||
|
|
2e404f2087 | ||
|
|
024201a7b7 | ||
|
|
7dde3b5d27 | ||
|
|
834726b49e | ||
|
|
204f8204f1 | ||
|
|
3cf4790148 | ||
|
|
180f3f08dc | ||
|
|
67698775a3 | ||
|
|
22f97beeaa | ||
|
|
9f98f21d38 | ||
|
|
94ff71281f | ||
|
|
4a96df1574 | ||
|
|
80448d4a24 | ||
|
|
257c4b29f2 | ||
|
|
3f9db33340 | ||
|
|
2c42fbd38d | ||
|
|
8eca3ec76b | ||
|
|
0b64bc580d | ||
|
|
ce2266d0ed | ||
|
|
60530fad6b | ||
|
|
b8f94ed8a9 | ||
|
|
330b1ca5d8 | ||
|
|
40a7f86cef | ||
|
|
a9b3050265 | ||
|
|
b7e64b3abe | ||
|
|
56baa44c99 | ||
|
|
357d815489 | ||
|
|
e542855639 | ||
|
|
6fc3f49152 | ||
|
|
e67c77b322 | ||
|
|
c3291f672e | ||
|
|
176036402a | ||
|
|
9d5488b82d | ||
|
|
a2618dab31 | ||
|
|
bb46241f98 | ||
|
|
ff7fee2d94 | ||
|
|
9a23a24bd3 | ||
|
|
a62762be92 | ||
|
|
60dbc4ffd6 | ||
|
|
773077ab9c | ||
|
|
679d208c8d | ||
|
|
19bec9a9cf | ||
|
|
a7f6ae19f0 | ||
|
|
475f90d224 | ||
|
|
285c9016d7 | ||
|
|
5923d07abc | ||
|
|
91cece81fb | ||
|
|
b714d421f6 | ||
|
|
20852c7ae5 | ||
|
|
f18f04734d | ||
|
|
2eb7cc286b | ||
|
|
ae91e3e2c1 | ||
|
|
d73b437104 | ||
|
|
04b9d9e400 | ||
|
|
6e7741706e | ||
|
|
af0ee0584d | ||
|
|
cabed69c48 | ||
|
|
2832686193 | ||
|
|
d7149c8282 | ||
|
|
571c7e60aa | ||
|
|
a434829a6c | ||
|
|
60b8716315 | ||
|
|
7aba6d15b7 | ||
|
|
48ada59a2f | ||
|
|
c5aa1abb30 | ||
|
|
daeedd6f73 | ||
|
|
cac80159ff | ||
|
|
a5cb23c32e | ||
|
|
0f5b7e5e6d | ||
|
|
12aaebd154 | ||
|
|
8899d4b960 | ||
|
|
1ba91a1fd6 | ||
|
|
c34d89affd | ||
|
|
e07a4fac97 | ||
|
|
76428b2e70 | ||
|
|
78a0763ad7 | ||
|
|
32591f5af7 | ||
|
|
c1898b97c9 | ||
|
|
5c82b6351c | ||
|
|
14f62a6427 | ||
|
|
2a30a6f2e1 | ||
|
|
7b96ee0d9c | ||
|
|
5994908197 | ||
|
|
d6c3badbba | ||
|
|
9aa9e84bc0 | ||
|
|
f3637eab3f | ||
|
|
9f9ee09f9c | ||
|
|
08b986c5e3 | ||
|
|
c8f6c2582b | ||
|
|
ae1c8dbdfc | ||
|
|
3b5c91b15c | ||
|
|
7a6e9cd598 | ||
|
|
6a8f0bda09 | ||
|
|
05305aa27d | ||
|
|
ae59288b1f | ||
|
|
7269a5e527 | ||
|
|
02dffaade5 | ||
|
|
9686650987 | ||
|
|
eefa3cbe98 | ||
|
|
0a4b5c8676 | ||
|
|
dff3cc21fa | ||
|
|
d7bb0e492c | ||
|
|
af92c26124 | ||
|
|
d1ffa246a9 | ||
|
|
4e7b79f98d | ||
|
|
9cff791ce5 | ||
|
|
fdb2d75cf0 | ||
|
|
825c6e1a80 | ||
|
|
ec9366d72b | ||
|
|
ff304ad3d4 | ||
|
|
b71ba411fd | ||
|
|
dfe7b4e6c6 | ||
|
|
96e2de6de1 | ||
|
|
d4d4dc4fd7 | ||
|
|
2ccbb4c0c4 | ||
|
|
709b098054 | ||
|
|
53ff6c72f0 | ||
|
|
8044adcc50 | ||
|
|
9b91da3798 | ||
|
|
286910e722 | ||
|
|
8fe4322536 | ||
|
|
a7005d13df | ||
|
|
8ca4205d2c | ||
|
|
af30b27724 | ||
|
|
2d688e74f2 | ||
|
|
0a4e3501dc | ||
|
|
1b50ca2b57 | ||
|
|
b454bbd662 | ||
|
|
1480920938 | ||
|
|
65a6231f23 | ||
|
|
4b70116754 | ||
|
|
e136b0a9f1 | ||
|
|
e45cc0267f | ||
|
|
d17cce2ca4 | ||
|
|
c93cc296a0 | ||
|
|
f63d42a75b | ||
|
|
1ae7be0846 | ||
|
|
c3388f2a48 | ||
|
|
4909f4395d | ||
|
|
2a8122e280 | ||
|
|
937eaaaaa1 | ||
|
|
f0974509bf | ||
|
|
0d71b0d8fe | ||
|
|
cf0a76c343 | ||
|
|
0f5b90998e | ||
|
|
8963b79db0 | ||
|
|
dc0a698330 | ||
|
|
6e54ed096f | ||
|
|
a552c11983 | ||
|
|
1bdf6888c6 | ||
|
|
f69fcbb783 | ||
|
|
6771431038 | ||
|
|
712568d118 | ||
|
|
4916c4cc50 | ||
|
|
8ed26c72e2 | ||
|
|
919010235c | ||
|
|
580d795054 | ||
|
|
329193f2f2 | ||
|
|
b20acaec6f | ||
|
|
516d420a1e | ||
|
|
b92b34a8ad | ||
|
|
7d7596bbdd | ||
|
|
acac2dba90 | ||
|
|
727ac7d9df | ||
|
|
2fc54ae343 | ||
|
|
e04cd0488e | ||
|
|
f867e21647 | ||
|
|
ec27935d81 | ||
|
|
08ae0387a9 | ||
|
|
ca69c783d3 | ||
|
|
12198dd6df | ||
|
|
d1fbbe1167 | ||
|
|
65e79b0d07 | ||
|
|
9fb9df1843 | ||
|
|
b15166a599 | ||
|
|
bf81dfe806 | ||
|
|
f588b3b6e7 | ||
|
|
c29db74b1d | ||
|
|
213fc3da91 | ||
|
|
ab4f721914 | ||
|
|
8ac9876ec3 | ||
|
|
4fbc113fcb | ||
|
|
4d3d744cd6 | ||
|
|
21416fa8c8 | ||
|
|
f2f973bf00 | ||
|
|
0c655dbfd4 | ||
|
|
ebac947c92 | ||
|
|
ce85a9d0b1 | ||
|
|
f114ca33d5 | ||
|
|
850628f7f6 | ||
|
|
8681d58ffb | ||
|
|
8f2cd5a353 | ||
|
|
f6f12e2566 | ||
|
|
3512ed6da3 | ||
|
|
4a29a77a78 | ||
|
|
aa17962936 | ||
|
|
10cab8dcb4 | ||
|
|
0a720fae72 | ||
|
|
0153b5be22 | ||
|
|
479a9ead03 | ||
|
|
b207a48175 | ||
|
|
9e3311c6f9 | ||
|
|
88257c7e03 | ||
|
|
a30e2f295f | ||
|
|
96ad9dee18 | ||
|
|
8800195c2c | ||
|
|
74b7c938a8 | ||
|
|
3dcacfe631 | ||
|
|
bf02406bf4 | ||
|
|
4371dbda3c | ||
|
|
c6640cef96 | ||
|
|
11ca6972c6 | ||
|
|
e235d22c7c | ||
|
|
512d74568a | ||
|
|
617c2ba578 | ||
|
|
5476c6248c | ||
|
|
916366bd10 | ||
|
|
5e66893719 | ||
|
|
16964b4987 | ||
|
|
73846ffa9b | ||
|
|
d5824239f5 | ||
|
|
c4270fc918 | ||
|
|
a29a1605a7 | ||
|
|
22868a594f | ||
|
|
aed64a27e8 | ||
|
|
2b338a63ba | ||
|
|
cda4027f83 | ||
|
|
7814269e15 | ||
|
|
e2175db7cb | ||
|
|
f1828b0c92 | ||
|
|
5cf9fab4f2 | ||
|
|
c3764df4e2 | ||
|
|
a2a1033701 | ||
|
|
2536f7fc6f | ||
|
|
b6fe78b82c | ||
|
|
f8cddf0bce | ||
|
|
2c7a32b47e | ||
|
|
e6dd4c6cfe | ||
|
|
fb756fe9ba | ||
|
|
c21e890b48 | ||
|
|
3720aa98df | ||
|
|
640aa7854a | ||
|
|
9689690730 | ||
|
|
a08620d7c9 | ||
|
|
fdbdc8e3f3 | ||
|
|
071d3b3023 | ||
|
|
f6b12d946a | ||
|
|
11572b4939 | ||
|
|
0c75b9a994 | ||
|
|
ed44aad076 | ||
|
|
6dc00bff74 | ||
|
|
5f2407baeb | ||
|
|
45f41f3cf7 | ||
|
|
0c29d61a35 | ||
|
|
58e549e3b3 | ||
|
|
2ae4f6b338 | ||
|
|
e28e41c1d9 | ||
|
|
05dfe51260 | ||
|
|
ec6e94f4ca | ||
|
|
bdb332bd79 | ||
|
|
9295dfc7c1 | ||
|
|
fb4bee4801 | ||
|
|
8b7c2aa48d | ||
|
|
9bec96f160 | ||
|
|
3e1d785f58 | ||
|
|
7a362411b1 | ||
|
|
e95dfe4671 | ||
|
|
e7b79bb6b9 | ||
|
|
59bc309f5b | ||
|
|
d2fb40f317 |
392
.gitattributes
vendored
@@ -1,392 +0,0 @@
|
|||||||
thermion_dart/native/lib/macos/debug/libbackendtest_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libsdl2.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmathio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libspirv-cross-msl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV-Tools.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libimageio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libOGLCompiler.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV-Tools-diff.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmathio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libassimp.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmatlang.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/swift/ThermionTexture.h filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbasis_encoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libimgui.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libimageio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbackend_test.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgetopt.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgtest.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libpng.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libsuzanne-resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmath.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libpng16.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbenchmark_main.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbluegl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/swift/build.sh filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libbluegl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libpng.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libglslang.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbenchmark.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgltf-demo-resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV-Tools-lint.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilagui.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libsample-resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libOSDependent.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libspirv-cross-glsl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libgltfio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libpng.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libgltfio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libspirv-cross-core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilagui.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmath.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/swift/libdartfilamenttexture.dylib filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV-Tools-link.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libz.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/swift filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libSPIRV-Tools-reduce.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/debug/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/ios/libimageio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
materials/Makefile filter=lfs diff=lfs merge=lfs -text
|
|
||||||
materials/gizmo.filamat filter=lfs diff=lfs merge=lfs -text
|
|
||||||
materials/image.filamat filter=lfs diff=lfs merge=lfs -text
|
|
||||||
materials/unlit_opaque.mat filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64 filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86 filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/arm64-v8a/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/armeabi-v7a/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86_64/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/android/x86/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_flutter_federated/thermion_flutter/example/web/thermion_dart.wasm filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_flutter_federated/thermion_flutter/example/web/main.unopt.wasm filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_flutter_federated/thermion_flutter/example/web/main.wasm filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_flutter_federated/thermion_flutter/example/web/thermion_dart.js filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_flutter_federated/thermion_flutter/example/web/thermion_dart.worker.js filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libimage.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libviewer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilagui.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libshaders.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libcamutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilamat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libibl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libutils.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libzstd.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libgltfio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libimageio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libbluevk.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libdracodec.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libktxreader.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmathio.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libbackend.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libbluegl.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilament.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libgeometry.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libstb.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libpng.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/native/lib/macos/release/libmath.a filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/default_env/default_env_skybox.ktx filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/shapes.gltf filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/3.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/Boden_baseColor.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet.bin filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet.gltf filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic1.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/default_env filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/Boden_metallicRoughness.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_baseColor3.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic4.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/README.md filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/default_env/default_env_ibl.ktx filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/shapes.blend filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/2.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_normal.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_normal1.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic3.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/background.ktx filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/scene.bin filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_baseColor4.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_normal4.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/shapes.blend1 filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/solidcolor.mat filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/body_baseColor.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/body_emissive.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic2.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/solidcolor.filamat filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/1.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/scene.gltf filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_normal2.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/texture_test.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_normal3.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/Boden_normal.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/body_normal.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/material_metallicRoughness.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_baseColor.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_baseColor2.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/shapes/shapes.bin filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/body_metallicRoughness.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/material_baseColor.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/BusterDrone/textures/material_normal.jpg filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/FlightHelmet/FlightHelmet_baseColor1.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/assets/background.png filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/App.framework/Versions/A/Resources/flutter_assets/assets/shapes/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/assets/debug/flutter_assets/assets/2.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/assets/debug/flutter_assets/assets/3.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/example.app/Contents/Frameworks/App.framework/Versions/A/Resources/flutter_assets/assets/shapes/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/assets/debug/flutter_assets/assets/1.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/flutter/debug/flutter_assets/assets/shapes/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/example.app/Contents/Frameworks/App.framework/Versions/A/Resources/flutter_assets/assets/1.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/example.app/Contents/Frameworks/App.framework/Versions/A/Resources/flutter_assets/assets/3.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
thermion_dart/test/assets/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/flutter/debug/flutter_assets/assets/1.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/App.framework/Versions/A/Resources/flutter_assets/assets/1.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/flutter/debug/flutter_assets/assets/3.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/App.framework/Versions/A/Resources/flutter_assets/assets/2.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/App.framework/Versions/A/Resources/flutter_assets/assets/3.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/macos/Build/Products/Debug/example.app/Contents/Frameworks/App.framework/Versions/A/Resources/flutter_assets/assets/2.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/assets/debug/flutter_assets/assets/shapes/shapes.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
examples/flutter/example/build/app/intermediates/flutter/debug/flutter_assets/assets/2.glb filter=lfs diff=lfs merge=lfs -text
|
|
||||||
29
.github/actions/setup-build-env/action.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
name: 'Setup Build Environment'
|
||||||
|
description: 'Set up LLVM, MESA, and Flutter for builds'
|
||||||
|
runs:
|
||||||
|
using: 'composite'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Setup LLVM
|
||||||
|
uses: KyleMayes/install-llvm-action@v1
|
||||||
|
with:
|
||||||
|
version: "16"
|
||||||
|
- name: Add LLVM to PATH
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "${{ github.workspace }}/llvm/bin" >> $GITHUB_PATH
|
||||||
|
echo "LD_LIBRARY_PATH=${{ github.workspace }}/llvm/lib/x86_64-unknown-linux-gnu/" >> $GITHUB_ENV
|
||||||
|
- name: Verify installation
|
||||||
|
shell: bash
|
||||||
|
run: clang --version
|
||||||
|
- name: Install MESA
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y xvfb
|
||||||
|
sudo apt-get install -y libosmesa6-dev
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: master
|
||||||
|
architecture: X64
|
||||||
183
.github/workflows/dart.yml
vendored
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
name: Dart
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "develop" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "develop" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
compile-web-wasm:
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Setup CMake
|
||||||
|
uses: jwlawson/actions-setup-cmake@v2
|
||||||
|
with:
|
||||||
|
cmake-version: '3.25.0' # or 'latest'
|
||||||
|
- name: Setup Emscripten
|
||||||
|
uses: mymindstorm/setup-emsdk@v14
|
||||||
|
with:
|
||||||
|
version: 'latest'
|
||||||
|
- name: Compile web
|
||||||
|
run: make wasm
|
||||||
|
dart-tests:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: ./.github/actions/setup-build-env
|
||||||
|
- run: |
|
||||||
|
cd thermion_dart
|
||||||
|
dart pub get
|
||||||
|
xvfb-run dart --enable-experiment=native-assets test \
|
||||||
|
test/asset_tests.dart \
|
||||||
|
test/instancing_tests.dart \
|
||||||
|
test/light_tests.dart \
|
||||||
|
test/entity_tests.dart \
|
||||||
|
test/geometry_tests.dart \
|
||||||
|
test/view_tests.dart \
|
||||||
|
test/postprocessing_tests.dart \
|
||||||
|
test/scene_tests.dart \
|
||||||
|
test/picking_tests.dart \
|
||||||
|
--concurrency=1
|
||||||
|
#test/overlay_tests.dart \
|
||||||
|
- name: Zip output
|
||||||
|
run: zip -r output.zip ./thermion_dart/test/output
|
||||||
|
- name: Upload test output
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: golden-images-${{ github.sha }}
|
||||||
|
path: output.zip
|
||||||
|
- name: Download golden images from previous run
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
gh run download 15990504915 \
|
||||||
|
--name golden-images-4b9870244a529bf086280331d38c55e294425b4f \
|
||||||
|
--dir ./thermion_dart/test/golden-downloads
|
||||||
|
- name: Unzip golden images
|
||||||
|
run: |
|
||||||
|
cd thermion_dart/test/golden-downloads && unzip output.zip
|
||||||
|
- name: Install Python dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install Pillow numpy
|
||||||
|
- name: Compare golden images
|
||||||
|
run: cd thermion_dart/test && python compare_goldens.py
|
||||||
|
- name: Upload logs
|
||||||
|
if: failure() || steps.build.outcome == 'failure'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-logs
|
||||||
|
path: |
|
||||||
|
${{ github.workspace }}/thermion_dart/.dart_tool/thermion_dart/log/build.log
|
||||||
|
retention-days: 5
|
||||||
|
flutter_examples:
|
||||||
|
name: flutter_examples
|
||||||
|
runs-on: macos-latest
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: examples/flutter
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Set up Flutter
|
||||||
|
uses: subosito/flutter-action@v2
|
||||||
|
with:
|
||||||
|
channel: master
|
||||||
|
architecture: ARM64
|
||||||
|
- name: Set up JDK 17
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '17'
|
||||||
|
distribution: 'temurin'
|
||||||
|
- name: Install Android SDK
|
||||||
|
uses: android-actions/setup-android@v3
|
||||||
|
with:
|
||||||
|
api-level: 34
|
||||||
|
build-tools: 34.0.0
|
||||||
|
cmake-version: 3.22.1
|
||||||
|
ndk-version: 25.1.893739
|
||||||
|
- name: Accept Android SDK licenses
|
||||||
|
run: |
|
||||||
|
yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses
|
||||||
|
- run: cd quickstart && flutter pub get && flutter build macos
|
||||||
|
# - run: cd quickstart && flutter pub get && flutter build ios
|
||||||
|
- run: cd quickstart && flutter pub get && flutter build appbundle
|
||||||
|
- run: cd quickstart && flutter build web
|
||||||
|
- run: cd picking && flutter pub get && flutter build macos
|
||||||
|
# - run: cd picking && flutter pub get && flutter build ios
|
||||||
|
- run: cd picking && flutter pub get && flutter build appbundle
|
||||||
|
- run: cd picking && flutter build web
|
||||||
|
- name: Upload logs
|
||||||
|
if: failure() || steps.build.outcome == 'failure'
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: build-logs
|
||||||
|
path: |
|
||||||
|
# D:\a\thermion\thermion\thermion_dart\.dart_tool\thermion_dart\log\build.log
|
||||||
|
/Users/runner/work/thermion/thermion/thermion_dart/.dart_tool/thermion_dart/log/build.log
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
|
||||||
|
# thermion_dart:
|
||||||
|
# name: thermion_dart
|
||||||
|
# runs-on: macos-latest
|
||||||
|
# defaults:
|
||||||
|
# run:
|
||||||
|
# working-directory: thermion_dart
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v4
|
||||||
|
# - name: Set up Flutter
|
||||||
|
# uses: subosito/flutter-action@v2
|
||||||
|
# with:
|
||||||
|
# channel: master
|
||||||
|
# - run: flutter pub get
|
||||||
|
# - run: dart --enable-experiment=native-assets test -j1 test/light_tests.dart
|
||||||
|
# thermion_flutter:
|
||||||
|
# name: thermion_flutter
|
||||||
|
# runs-on: macos-13
|
||||||
|
# defaults:
|
||||||
|
# run:
|
||||||
|
# working-directory: thermion_flutter/thermion_flutter # Adjust this path
|
||||||
|
# steps:
|
||||||
|
# - uses: actions/checkout@v4
|
||||||
|
# - uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603
|
||||||
|
# - name: Install dependencies
|
||||||
|
# run: dart pub get
|
||||||
|
#
|
||||||
|
#
|
||||||
|
##- uses: actions/checkout@v4
|
||||||
|
#- name: Setup LLVM
|
||||||
|
# uses: KyleMayes/install-llvm-action@v1
|
||||||
|
# with:
|
||||||
|
# version: "16"
|
||||||
|
#- name: Add LLVM to PATH
|
||||||
|
# run: |
|
||||||
|
# echo "${{ github.workspace }}/llvm/bin" >> $GITHUB_PATH
|
||||||
|
# echo "LD_LIBRARY_PATH=${{ github.workspace }}/llvm/lib/x86_64-unknown-linux-gnu/" >> $GITHUB_ENV
|
||||||
|
#- name: Verify installation
|
||||||
|
# run: clang --version
|
||||||
|
#- name: Install MESA
|
||||||
|
# run: |
|
||||||
|
# sudo apt-get update
|
||||||
|
# sudo apt-get install -y xvfb
|
||||||
|
# sudo apt-get install -y libosmesa6-dev
|
||||||
|
# #sudo apt-get -y build-dep mesa
|
||||||
|
# #git clone https://gitlab.freedesktop.org/mesa/mesa.git
|
||||||
|
# #cd mesa
|
||||||
|
# #git checkout mesa-23.2.1
|
||||||
|
# #mkdir -p out
|
||||||
|
# #meson setup builddir/ -Dprefix="$(pwd)/out" -Dosmesa=true -Dglx=xlib -Dgallium-drivers=swrast -Dvulkan-drivers=swrast
|
||||||
|
# #meson install -C builddir/
|
||||||
|
#- name: Install Vulkan SDK and dependencies
|
||||||
|
# run: |
|
||||||
|
# wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
|
||||||
|
# sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-jammy.list https://packages.lunarg.com/vulkan/lunarg-vulkan-jammy.list
|
||||||
|
# sudo apt-get update
|
||||||
|
# sudo apt-get install -y vulkan-sdk
|
||||||
|
#- name: Set up Flutter
|
||||||
|
# uses: subosito/flutter-action@v2
|
||||||
|
# with:
|
||||||
|
# channel: master
|
||||||
|
# architecture: X64
|
||||||
|
|
||||||
2
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
**/*/.cxx
|
**/*/.cxx
|
||||||
**/.github
|
|
||||||
**/.idea
|
**/.idea
|
||||||
.dart_tool
|
.dart_tool
|
||||||
**/.dart_tool
|
**/.dart_tool
|
||||||
@@ -10,3 +9,4 @@
|
|||||||
pubspec_overrides.yaml
|
pubspec_overrides.yaml
|
||||||
/pubspec.lock
|
/pubspec.lock
|
||||||
*.iml
|
*.iml
|
||||||
|
**/*/*.filamat
|
||||||
|
|||||||
903
CHANGELOG.md
@@ -3,6 +3,909 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## 2025-07-08
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.3.1`](#thermion_dart---v031)
|
||||||
|
- [`thermion_flutter` - `v0.3.1`](#thermion_flutter---v031)
|
||||||
|
- [`thermion_flutter_method_channel` - `v0.3.1`](#thermion_flutter_method_channel---v031)
|
||||||
|
- [`thermion_flutter_web` - `v0.3.1`](#thermion_flutter_web---v031)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.3.1`](#thermion_flutter_platform_interface---v031)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.3.1`
|
||||||
|
|
||||||
|
- **REFACTOR**: remove covariant keyword from createInstance args.
|
||||||
|
- **FIX**: add flush() to skybox/IBL destroy methods to ensure that textre upload callbacks are completed to avoid stalling.
|
||||||
|
- **FIX**: duplicate setting for _grid.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.3.1`
|
||||||
|
|
||||||
|
- **FIX**: addDestroySwapchain argument to createViewer() (true by default). This is only used on iOS/macOS where a single swapchain is shared between all render targets.
|
||||||
|
- **DOCS**: fix typo in link.
|
||||||
|
- **DOCS**: remove code from thermion_flutter README.md and point to docs/repository example instead.
|
||||||
|
|
||||||
|
#### `thermion_flutter_method_channel` - `v0.3.1`
|
||||||
|
|
||||||
|
- **FIX**: addDestroySwapchain argument to createViewer() (true by default). This is only used on iOS/macOS where a single swapchain is shared between all render targets.
|
||||||
|
|
||||||
|
#### `thermion_flutter_web` - `v0.3.1`
|
||||||
|
|
||||||
|
#### `thermion_flutter_platform_interface` - `v0.3.1`
|
||||||
|
|
||||||
|
- **FIX**: addDestroySwapchain argument to createViewer() (true by default). This is only used on iOS/macOS where a single swapchain is shared between all render targets.
|
||||||
|
|
||||||
|
# Change Log
|
||||||
|
|
||||||
|
#### v0.3.0
|
||||||
|
|
||||||
|
This release involved considerable internal refactoring, allowing us to expose more Filament functionality on the Dart side. Previously, most of this functionality was
|
||||||
|
rigidly implemented in C++ and didn't allow for end-users to take advantage of Filament directly.
|
||||||
|
|
||||||
|
This also means there are a number of breaking changes from `0.2.1`. To summarize:
|
||||||
|
|
||||||
|
- `ViewerWidget` has been introduced. This is a Flutter widget for users who only need basic rendering and don't need/want to deal with camera/materials/etc directly.
|
||||||
|
- Users who want more fine-grained control than a `ViewerWidget` can still work with `ThermionViewer` and `ThermionWidget`.
|
||||||
|
- The singleton `FilamentApp.instance` exposes methods for working almost directly with the underlying Filament engine (e.g. loading custom materials from `Uint8List`, creating textures, etc).
|
||||||
|
- New interfaces have been added for `Material`, `MaterialInstance`, `Texture`, `View`, `Scene` and `Camera`.
|
||||||
|
- `ThermionAsset` replaces `ThermionEntity` as the main interface for scene objects.
|
||||||
|
- Transforms/material instances should be set directly by `asset.setTransform`, `asset.setMaterialInstanceAt`
|
||||||
|
- Material properties can be set directly on the `MaterialInstance`, e.g. `materialInstance.setParameterFloat4("baseColorFactor", 1.0, 0.0, 0.0, 1.0);
|
||||||
|
- Linux binaries have been added to `thermion_dart`. This package can be run on Linux (which we are using for CI and automated testing) but there are not yet any Flutter bindings, so `thermion_flutter` cannot run on Linux yet.
|
||||||
|
- On Windows, `thermion_flutter` now uses the Vulkan backend. This is still experimental and will have limited supported on older hardware (pre-2018).
|
||||||
|
- Web support for `thermion_dart` has now reached parity with other platforms, though should still be considered experimental. Some manual steps are required to run in a Flutter app or a Dart web app.
|
||||||
|
|
||||||
|
## 2025-01-08
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.20.0`](#thermion_dart---v021-dev200)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.20.0`](#thermion_flutter---v021-dev200)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.20.0`](#thermion_flutter_platform_interface---v021-dev200)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.20.0`](#thermion_flutter_ffi---v021-dev200)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+11`](#thermion_flutter_web---v02011)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+11`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.20.0`
|
||||||
|
|
||||||
|
- **FIX**: only use Windows-style ndkRoot when building on Windows.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.20.0`
|
||||||
|
|
||||||
|
- Bump "thermion_flutter" to `0.2.1-dev.20.0`.
|
||||||
|
|
||||||
|
#### `thermion_flutter_platform_interface` - `v0.2.1-dev.20.0`
|
||||||
|
|
||||||
|
- Bump "thermion_flutter_platform_interface" to `0.2.1-dev.20.0`.
|
||||||
|
|
||||||
|
#### `thermion_flutter_ffi` - `v0.2.1-dev.20.0`
|
||||||
|
|
||||||
|
- Bump "thermion_flutter_ffi" to `0.2.1-dev.20.0`.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-11-21
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.19.0`](#thermion_dart---v021-dev190)
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.19.0`](#thermion_flutter---v021-dev190)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+10`](#thermion_flutter_web---v02010)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.19.0`](#thermion_flutter_platform_interface---v021-dev190)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.19.0`](#thermion_flutter_ffi---v021-dev190)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter` - `v0.2.1-dev.19.0`
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+10`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.19.0`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.19.0`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.19.0`
|
||||||
|
|
||||||
|
- **FEAT**: use InputAction.ZOOM for scroll wheel in free flight handler.
|
||||||
|
- **FEAT**: free flight camera improvements.
|
||||||
|
- **BREAKING** **FIX**: update Makefile & rebuild materials for Vulkan.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-11-18
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.18.0`](#thermion_dart---v021-dev180)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.18.0`](#thermion_flutter---v021-dev180)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+9`](#thermion_flutter_web---v0209)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.18.0`](#thermion_flutter_platform_interface---v021-dev180)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.18.0`](#thermion_flutter_ffi---v021-dev180)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+9`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.18.0`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.18.0`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.18.0`
|
||||||
|
|
||||||
|
- **FEAT**: add MaterialInstance.setDepthFunc.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.18.0`
|
||||||
|
|
||||||
|
- **FIX**: fix windows import header.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-11-15
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.17`](#thermion_dart---v021-dev0017)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.17`](#thermion_flutter---v021-dev17)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+8`](#thermion_flutter_web---v0208)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.17`](#thermion_flutter_platform_interface---v021-dev17)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.17`](#thermion_flutter_ffi---v021-dev17)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+8`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.17`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.17`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.17`
|
||||||
|
|
||||||
|
- **FIX**: remove superfluous ceil() calls for picking coordinates.
|
||||||
|
- **FIX**: remove superfluous ceil() calls for picking coordinates.
|
||||||
|
- **FIX**: reduce size of pick functor for compatibility with armeabi-v7a.
|
||||||
|
- **FIX**: reduce size of pick functor for compatibility with armeabi-v7a.
|
||||||
|
- **FEAT**: add Dart methods for getRenderableBoundingBox, setParameterInt and setParameterFloat4.
|
||||||
|
- **FEAT**: Rename Gizmo material to UnlitFixedSize, and expose methods for using this material on other entities. Also exposes new methods for setting single float parameters.
|
||||||
|
- **FEAT**: expose zoomSensitivity argument for flight input handler.
|
||||||
|
- **FEAT**: Rename Gizmo material to UnlitFixedSize, and expose methods for using this material on other entities. Also exposes new methods for setting single float parameters.
|
||||||
|
- **FEAT**: expose zoomSensitivity argument for flight input handler.
|
||||||
|
- **FEAT**: sanitize file paths in build.dart for Windows compatibility.
|
||||||
|
- **FEAT**: pass through fragment coordinates for picking.
|
||||||
|
- **FEAT**: sanitize file paths in build.dart for Windows compatibility.
|
||||||
|
- **FEAT**: pass through fragment coordinates for picking.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.17`
|
||||||
|
|
||||||
|
- **FIX**: multiply coordinates by pixelRatio for scale events.
|
||||||
|
- **FIX**: multiply coordinates by pixelRatio for scale events.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-31
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.16`](#thermion_dart---v021-dev0016)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.16`](#thermion_flutter---v021-dev16)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+7`](#thermion_flutter_web---v0207)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.16`](#thermion_flutter_platform_interface---v021-dev16)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.16`](#thermion_flutter_ffi---v021-dev16)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter` - `v0.2.1-dev.16`
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+7`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.16`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.16`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.16`
|
||||||
|
|
||||||
|
- **FEAT**: Rename Gizmo material to UnlitFixedSize, and expose methods for using this material on other entities. Also exposes new methods for setting single float parameters.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-31
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.15`](#thermion_dart---v021-dev0015)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.15`](#thermion_flutter---v021-dev15)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+6`](#thermion_flutter_web---v0206)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.15`](#thermion_flutter_platform_interface---v021-dev15)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.15`](#thermion_flutter_ffi---v021-dev15)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+6`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.15`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.15`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.15`
|
||||||
|
|
||||||
|
- **FIX**: remove superfluous ceil() calls for picking coordinates.
|
||||||
|
- **FEAT**: expose zoomSensitivity argument for flight input handler.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.15`
|
||||||
|
|
||||||
|
- **FIX**: multiply coordinates by pixelRatio for scale events.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-30
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.14`](#thermion_dart---v021-dev0014)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.14`](#thermion_flutter---v021-dev14)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.14`](#thermion_flutter_platform_interface---v021-dev14)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.14`](#thermion_flutter_ffi---v021-dev14)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+5`](#thermion_flutter_web---v0205)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter` - `v0.2.1-dev.14`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.14`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.14`
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+5`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.14`
|
||||||
|
|
||||||
|
- **FIX**: reduce size of pick functor for compatibility with armeabi-v7a.
|
||||||
|
- **FEAT**: sanitize file paths in build.dart for Windows compatibility.
|
||||||
|
- **FEAT**: pass through fragment coordinates for picking.
|
||||||
|
- **FEAT**: pass through fragment coordinates for picking.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-29
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.13`](#thermion_dart---v021-dev0013)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+4`](#thermion_flutter_web---v0204)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.13`](#thermion_flutter---v021-dev13)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.13`](#thermion_flutter_ffi---v021-dev13)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.13`](#thermion_flutter_platform_interface---v021-dev13)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+4`
|
||||||
|
- `thermion_flutter` - `v0.2.1-dev.13`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.13`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.13`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.13`
|
||||||
|
|
||||||
|
- **FIX**: properly pass through loadResourcesAsync flag for loadGlbFromBuffer.
|
||||||
|
- **FIX**: properly pass through loadResourcesAsync flag for loadGlbFromBuffer.
|
||||||
|
- **FEAT**: pass through fragment coordinates for picking.
|
||||||
|
- **FEAT**: add SCALE2_MOVE InputType.
|
||||||
|
- **FEAT**: add SCALE2_MOVE InputType.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-25
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.12`](#thermion_dart---v021-dev0012)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.12`](#thermion_flutter---v021-dev12)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+3`](#thermion_flutter_web---v0203)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.12`](#thermion_flutter_platform_interface---v021-dev12)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.12`](#thermion_flutter_ffi---v021-dev12)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+3`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.12`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.12`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.12`
|
||||||
|
|
||||||
|
- **FIX**: properly pass through loadResourcesAsync flag for loadGlbFromBuffer.
|
||||||
|
- **FIX**: properly pass through loadResourcesAsync flag for loadGlbFromBuffer.
|
||||||
|
- **FEAT**: add SCALE2_MOVE InputType.
|
||||||
|
- **FEAT**: add SCALE2_MOVE InputType.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.12`
|
||||||
|
|
||||||
|
- **FIX**: (flutter) (windows) remove deleted source file from Windows CMakeLists.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-25
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- There are no breaking changes in this release.
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.12`](#thermion_dart---v021-dev0012)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+2`](#thermion_flutter_web---v0202)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.11`](#thermion_flutter_platform_interface---v021-dev11)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.11`](#thermion_flutter_ffi---v021-dev11)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.11`](#thermion_flutter---v021-dev11)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+2`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.11`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.11`
|
||||||
|
- `thermion_flutter` - `v0.2.1-dev.11`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.12`
|
||||||
|
|
||||||
|
- **FIX**: properly pass through loadResourcesAsync flag for loadGlbFromBuffer.
|
||||||
|
- **FEAT**: add SCALE2_MOVE InputType.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-24
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.11`](#thermion_dart---v021-dev0011)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.10`](#thermion_flutter---v021-dev10)
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0+1`](#thermion_flutter_web---v0201)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.10`](#thermion_flutter_platform_interface---v021-dev10)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.10`](#thermion_flutter_ffi---v021-dev10)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_web` - `v0.2.0+1`
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.10`
|
||||||
|
- `thermion_flutter_ffi` - `v0.2.1-dev.10`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.11`
|
||||||
|
|
||||||
|
- **FEAT**: add SCALE2_ROTATE to InputHandler.
|
||||||
|
- **BREAKING** **FEAT**: expose velocity, rotation and timestamp for scale events in listener. accept rotationSensitivity/zoomSensitivity for FixedOrbitRotateInputHandlerDelegate.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.10`
|
||||||
|
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **FIX**: fix all Windows warnings so apps will compile with /WX.
|
||||||
|
- **FIX**: use internal Set for determining first ThermionTextureWidget to call requestFrame and cleanup destruction logic.
|
||||||
|
- **FIX**: (flutter) pass ThermionFlutterOptions to ThermionWidget, use dpr for resizeTexture, delete unnecessary TransparencyPainter class.
|
||||||
|
- **FIX**: (flutter/web) use window.devicePixelRatio for viewport.
|
||||||
|
- **FIX**: (flutter) desktop gesture detector changes for new Gizmo methods.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add Destroy() to BackingWindow.
|
||||||
|
- **FEAT**: camera and resizing improvements.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: add rendering check to ThermionWidget ticker.
|
||||||
|
- **FEAT**: allow passing null options to ThermionWidget.
|
||||||
|
- **FEAT**: (flutter) (web) if importCanvasAsWidget is false, render transparency.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: highlight gizmo on hover.
|
||||||
|
- **BREAKING** **FIX**: remove EntityControllerMouseWidget (replace with GestureHandler).
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FEAT**: expose velocity, rotation and timestamp for scale events in listener. accept rotationSensitivity/zoomSensitivity for FixedOrbitRotateInputHandlerDelegate.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: resize canvas on web.
|
||||||
|
- **BREAKING** **CHORE**: remove superseded HardwareKeyboard* classes.
|
||||||
|
- **BREAKING** **CHORE**: (flutter) cleanup for pub.dev publishing.
|
||||||
|
- **BREAKING** **CHORE**: remove EntityListWidget - will replace with new Scene.
|
||||||
|
- **BREAKING** **CHORE**: rename controller to viewer in gesture detector widgets.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-23
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.10`](#thermion_dart---v021-dev0010)
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.9`](#thermion_flutter---v021-dev9)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.9`](#thermion_flutter_ffi---v021-dev9)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.9`](#thermion_flutter_platform_interface---v021-dev9)
|
||||||
|
- [`thermion_flutter_web` - `v0.2.0`](#thermion_flutter_web---v020)
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- There are no other changes in this release.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.10`
|
||||||
|
|
||||||
|
- Change defaults for DelegateInputHandler
|
||||||
|
|
||||||
|
- **REFACTOR**: move native types to own header, add methods for create/destroy material instance, add priority/layer to load_glb_from_buffer.
|
||||||
|
- **REFACTOR**: native types.
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **REFACTOR**: native types.
|
||||||
|
- **REFACTOR**: move native types to own header, add methods for create/destroy material instance, add priority/layer to load_glb_from_buffer.
|
||||||
|
- **REFACTOR**: Dart types.
|
||||||
|
- **REFACTOR**: Dart types.
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **REFACTOR**: native types.
|
||||||
|
- **REFACTOR**: native types.
|
||||||
|
- **FIX**: set render target to null for each view and then destroy render targets when viewer disposed.
|
||||||
|
- **FIX**: add check for nan NDC coordinates for viewport translation.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: properly destroy entities/material/etc in Gizmo on destruction, remove custom scene creation logic.
|
||||||
|
- **FIX**: dont calculate surface orientation for non-triangle geometry.
|
||||||
|
- **FIX**: set View render target to nullptr if Dart renderTarget is null.
|
||||||
|
- **FIX**: properly destroy entities/material/etc in Gizmo on destruction, remove custom scene creation logic.
|
||||||
|
- **FIX**: add Fence to capture() and set stencil buffer by default.
|
||||||
|
- **FIX**: emscripten export visibility for add_light.
|
||||||
|
- **FIX**: (wasm) use correct coords for pick, free memory correctly, keep pixelratio copy.
|
||||||
|
- **FIX**: add more nan checks for gizmo manipulation.
|
||||||
|
- **FIX**: add check for nan NDC coordinates for viewport translation.
|
||||||
|
- **FIX**: (web) add emscripten guards for flushAndWait call when swapchain destroyed.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: dont calculate surface orientation for non-triangle geometry.
|
||||||
|
- **FIX**: add more nan checks for gizmo manipulation.
|
||||||
|
- **FIX**: set View render target to nullptr if Dart renderTarget is null.
|
||||||
|
- **FIX**: set render target to null for each view and then destroy render targets when viewer disposed.
|
||||||
|
- **FIX**: move ThermionWin32.h to include.
|
||||||
|
- **FIX**: move ThermionWin32.h to include.
|
||||||
|
- **FIX**: (wasm) use correct coords for pick, free memory correctly, keep pixelratio copy.
|
||||||
|
- **FIX**: emscripten export visibility for add_light.
|
||||||
|
- **FIX**: ignore pick results directly on axis.
|
||||||
|
- **FIX**: add Fence to capture() and set stencil buffer by default.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: (web) add emscripten guards for flushAndWait call when swapchain destroyed.
|
||||||
|
- **FIX**: ignore pick results directly on axis.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FEAT**: download WASM module directly on web (no need to embed in index.html any more) and expose updateViewportAndCameraProjection.
|
||||||
|
- **FEAT**: layers, grid.
|
||||||
|
- **FEAT**: simplify FixedOrbitCameraRotationDelegate.
|
||||||
|
- **FEAT**: produce debug symbols on Windows.
|
||||||
|
- **FEAT**: move HighlightOverlay to nested class, move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector.
|
||||||
|
- **FEAT**: set InputType.SCALE1 to ROTATE by default for DelegateInputHandler.fixedOrbit.
|
||||||
|
- **FEAT**: parent the cloned entity instance when setting stencil highlight.
|
||||||
|
- **FEAT**: add getAncestor method.
|
||||||
|
- **FEAT**: add getAncestor method.
|
||||||
|
- **FEAT**: set stencil highlight on gizmo attach.
|
||||||
|
- **FEAT**: move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector and removeStencilHighlight.
|
||||||
|
- **FEAT**: download WASM module directly on web (no need to embed in index.html any more) and expose updateViewportAndCameraProjection.
|
||||||
|
- **FEAT**: move HighlightOverlay to nested class, move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector.
|
||||||
|
- **FEAT**: add removeStencilHighlight, accept color param for setStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionDartApi.
|
||||||
|
- **FEAT**: add removeStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionViewer.
|
||||||
|
- **FEAT**: camera and resizing improvements.
|
||||||
|
- **FEAT**: add flag for keepData for gltf instancing, add highlightScene, add stencilHighlight method.
|
||||||
|
- **FEAT**: grid uses own material.
|
||||||
|
- **FEAT**: set SCALE2:InputAction.ZOOM by default.
|
||||||
|
- **FEAT**: add grid material.
|
||||||
|
- **FEAT**: expose setLightDirection and setLightPosition.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: add setGizmoVisibility/pickGizmo methods to ThermionViewer.
|
||||||
|
- **FEAT**: remove gizmo view references, exclude gizmo entities from picking, add createIbl.
|
||||||
|
- **FEAT**: createIbl.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: expose API methods for create_ibl, pick/set gizmo visibility.
|
||||||
|
- **FEAT**: create transparent overlay for gizmo for easier picking.
|
||||||
|
- **FEAT**: rescale gizmo based on distance from camera.
|
||||||
|
- **FEAT**: rescale gizmo based on distance from camera.
|
||||||
|
- **FEAT**: track zoom delta for DelegateInputHandler.
|
||||||
|
- **FEAT**: expose setLayerEnabled, viewportDimensions and getCameraFov on ThermionView.
|
||||||
|
- **FEAT**: layers, grid.
|
||||||
|
- **FEAT**: add capture() function and expose viewportDimensions on ThermionViewer (allows easier saving of captured images to PNG).
|
||||||
|
- **FEAT**: ignore grid overlay and gizmo center when picking, implement highlighting.
|
||||||
|
- **FEAT**: SceneManager updates (setLayer, add grid, queueRelativePositionUpdateWorld.
|
||||||
|
- **FEAT**: expose set_layer_enabled, get_camera_fov and queue_relative_position_updateg_world_axis to ThermionDartApi.h.
|
||||||
|
- **FEAT**: add getCameraFov to FilamentViewer.
|
||||||
|
- **FEAT**: add new grid overlay files to web CmakeLists.
|
||||||
|
- **FEAT**: re-implement (native) Gizmo class, expose preserveScaling parameter for setParent, add methods for getting viewport bounding box from renderable entity.
|
||||||
|
- **FEAT**: more work on multiple views/swapchains.
|
||||||
|
- **FEAT**: rescale gizmo based on distance from camera.
|
||||||
|
- **FEAT**: add capture() function and expose viewportDimensions on ThermionViewer (allows easier saving of captured images to PNG).
|
||||||
|
- **FEAT**: (web) allow table growth in emscripten module for passing C-style callback function pointers.
|
||||||
|
- **FEAT**: (web) add capture() method and missing camera navigation controls.
|
||||||
|
- **FEAT**: rescale gizmo based on distance from camera.
|
||||||
|
- **FEAT**: add grid material.
|
||||||
|
- **FEAT**: add startOffset parameter to gltf playAnimation.
|
||||||
|
- **FEAT**: create transparent overlay for gizmo for easier picking.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: produce debug symbols on Windows.
|
||||||
|
- **FEAT**: (web) add capture() method and missing camera navigation controls.
|
||||||
|
- **FEAT**: re-implement (native) Gizmo class, expose preserveScaling parameter for setParent, add methods for getting viewport bounding box from renderable entity.
|
||||||
|
- **FEAT**: add new grid overlay files to web CmakeLists.
|
||||||
|
- **FEAT**: expose API methods for create_ibl, pick/set gizmo visibility.
|
||||||
|
- **FEAT**: add setParameterFloat2 method.
|
||||||
|
- **FEAT**: createIbl.
|
||||||
|
- **FEAT**: simplify FixedOrbitCameraRotationDelegate.
|
||||||
|
- **FEAT**: add setParameterFloat2 method.
|
||||||
|
- **FEAT**: expose setLayerEnabled, viewportDimensions and getCameraFov on ThermionView.
|
||||||
|
- **FEAT**: (web) allow table growth in emscripten module for passing C-style callback function pointers.
|
||||||
|
- **FEAT**: add getCameraFov to FilamentViewer.
|
||||||
|
- **FEAT**: camera and resizing improvements.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: add removeStencilHighlight, accept color param for setStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionDartApi.
|
||||||
|
- **FEAT**: expose set_layer_enabled, get_camera_fov and queue_relative_position_updateg_world_axis to ThermionDartApi.h.
|
||||||
|
- **FEAT**: more work on multiple views/swapchains.
|
||||||
|
- **FEAT**: move createGeometry to SceneManager, add queueRelativePositionUpdateFromViewportVector and removeStencilHighlight.
|
||||||
|
- **FEAT**: remove gizmo view references, exclude gizmo entities from picking, add createIbl.
|
||||||
|
- **FEAT**: add setGizmoVisibility/pickGizmo methods to ThermionViewer.
|
||||||
|
- **FEAT**: add uvScale to unlit material.
|
||||||
|
- **FEAT**: add setParameterFloat2 method.
|
||||||
|
- **FEAT**: add setParameterFloat2 method.
|
||||||
|
- **FEAT**: set stencil highlight on gizmo attach.
|
||||||
|
- **FEAT**: add startOffset parameter to gltf playAnimation.
|
||||||
|
- **FEAT**: add ThirdPersonCameraDelegate.
|
||||||
|
- **FEAT**: add uvScale to unlit material.
|
||||||
|
- **FEAT**: add ThirdPersonCameraDelegate.
|
||||||
|
- **FEAT**: expose setLightDirection and setLightPosition.
|
||||||
|
- **FEAT**: set camera model matrix directly.
|
||||||
|
- **FEAT**: expose more camera methods.
|
||||||
|
- **FEAT**: add getAncestor method.
|
||||||
|
- **FEAT**: grid uses own material.
|
||||||
|
- **FEAT**: add flag for keepData for gltf instancing, add highlightScene, add stencilHighlight method.
|
||||||
|
- **FEAT**: set camera model matrix directly.
|
||||||
|
- **FEAT**: add removeStencilHighlight, queuePositionUpdateFromViewportCoords to ThermionViewer.
|
||||||
|
- **FEAT**: expose more camera methods.
|
||||||
|
- **FEAT**: ignore grid overlay and gizmo center when picking, implement highlighting.
|
||||||
|
- **FEAT**: layers, grid.
|
||||||
|
- **FEAT**: layers, grid.
|
||||||
|
- **FEAT**: parent the cloned entity instance when setting stencil highlight.
|
||||||
|
- **FEAT**: add getAncestor method.
|
||||||
|
- **FEAT**: SceneManager updates (setLayer, add grid, queueRelativePositionUpdateWorld.
|
||||||
|
- **DOCS**: add quickstart to README.
|
||||||
|
- **DOCS**: add quickstart to README.
|
||||||
|
- **BREAKING** **REFACTOR**: remove RenderThread methods no longer needed.
|
||||||
|
- **BREAKING** **REFACTOR**: refactor to support multiple Views/Render Targets.
|
||||||
|
- **BREAKING** **REFACTOR**: refactor to support multiple Views/Render Targets.
|
||||||
|
- **BREAKING** **REFACTOR**: remove RenderThread methods no longer needed.
|
||||||
|
- **BREAKING** **FIX**: Dart-only release mode builds on Window.
|
||||||
|
- **BREAKING** **FIX**: (windows) add flushAndWait call to capture() to prevent stalling on Windows; use provided buffer as pixelBuffer rather than duplicate allocation.
|
||||||
|
- **BREAKING** **FIX**: fix min SDK for thermion_dart.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: add meshoptimizer lib on Windows.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: Dart-only release mode builds on Window.
|
||||||
|
- **BREAKING** **FIX**: (web/wasm) free pick callbacks on dispose.
|
||||||
|
- **BREAKING** **FIX**: (windows) add flushAndWait call to capture() to prevent stalling on Windows; use provided buffer as pixelBuffer rather than duplicate allocation.
|
||||||
|
- **BREAKING** **FIX**: add meshoptimizer lib on Windows.
|
||||||
|
- **BREAKING** **FIX**: (web/wasm) free pick callbacks on dispose.
|
||||||
|
- **BREAKING** **FIX**: fix min SDK for thermion_dart.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FIX**: replace queuePosition/Rotation with queueTransforms.
|
||||||
|
- **BREAKING** **FEAT**: update web/http dependencies.
|
||||||
|
- **BREAKING** **FEAT**: big refactor to support multiple swapchains.
|
||||||
|
- **BREAKING** **FEAT**: update web/http dependencies.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: set baseColorIndex to -1 by default in unlit materialss.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: big refactor to support multiple swapchains.
|
||||||
|
- **BREAKING** **FEAT**: set baseColorIndex to -1 by default in unlit materialss.
|
||||||
|
- **BREAKING** **CHORE**: cleanup deleted export.
|
||||||
|
- **BREAKING** **CHORE**: remove EntityTransformController (requires replacement).
|
||||||
|
- **BREAKING** **CHORE**: restructure viewer folders as libraries to only export the public interface.
|
||||||
|
- **BREAKING** **CHORE**: View.getCamera returns Future<Camera>.
|
||||||
|
- **BREAKING** **CHORE**: cleanup deleted export.
|
||||||
|
- **BREAKING** **CHORE**: remove EntityTransformController (requires replacement).
|
||||||
|
- **BREAKING** **CHORE**: View.getCamera returns Future<Camera>.
|
||||||
|
- **BREAKING** **CHORE**: restructure viewer folders as libraries to only export the public interface.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.9`
|
||||||
|
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **FIX**: (flutter) pass ThermionFlutterOptions to ThermionWidget, use dpr for resizeTexture, delete unnecessary TransparencyPainter class.
|
||||||
|
- **FIX**: (flutter/web) use window.devicePixelRatio for viewport.
|
||||||
|
- **FIX**: use internal Set for determining first ThermionTextureWidget to call requestFrame and cleanup destruction logic.
|
||||||
|
- **FIX**: (flutter) pass ThermionFlutterOptions to ThermionWidget, use dpr for resizeTexture, delete unnecessary TransparencyPainter class.
|
||||||
|
- **FIX**: fix all Windows warnings so apps will compile with /WX.
|
||||||
|
- **FIX**: (flutter) desktop gesture detector changes for new Gizmo methods.
|
||||||
|
- **FIX**: (flutter/web) use window.devicePixelRatio for viewport.
|
||||||
|
- **FIX**: use internal Set for determining first ThermionTextureWidget to call requestFrame and cleanup destruction logic.
|
||||||
|
- **FIX**: fix all Windows warnings so apps will compile with /WX.
|
||||||
|
- **FIX**: (flutter) desktop gesture detector changes for new Gizmo methods.
|
||||||
|
- **FEAT**: highlight gizmo on hover.
|
||||||
|
- **FEAT**: add rendering check to ThermionWidget ticker.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: allow passing null options to ThermionWidget.
|
||||||
|
- **FEAT**: (flutter) (web) if importCanvasAsWidget is false, render transparency.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: highlight gizmo on hover.
|
||||||
|
- **FEAT**: (flutter) (web) if importCanvasAsWidget is false, render transparency.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: add rendering check to ThermionWidget ticker.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: camera and resizing improvements.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add Destroy() to BackingWindow.
|
||||||
|
- **FEAT**: (flutter) (windows) add Destroy() to BackingWindow.
|
||||||
|
- **FEAT**: camera and resizing improvements.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: allow passing null options to ThermionWidget.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **BREAKING** **FIX**: remove EntityControllerMouseWidget (replace with GestureHandler).
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: remove EntityControllerMouseWidget (replace with GestureHandler).
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: resize canvas on web.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: resize canvas on web.
|
||||||
|
- **BREAKING** **CHORE**: remove superseded HardwareKeyboard* classes.
|
||||||
|
- **BREAKING** **CHORE**: (flutter) cleanup for pub.dev publishing.
|
||||||
|
- **BREAKING** **CHORE**: remove EntityListWidget - will replace with new Scene.
|
||||||
|
- **BREAKING** **CHORE**: rename controller to viewer in gesture detector widgets.
|
||||||
|
- **BREAKING** **CHORE**: rename controller to viewer in gesture detector widgets.
|
||||||
|
- **BREAKING** **CHORE**: remove EntityListWidget - will replace with new Scene.
|
||||||
|
- **BREAKING** **CHORE**: (flutter) cleanup for pub.dev publishing.
|
||||||
|
- **BREAKING** **CHORE**: remove superseded HardwareKeyboard* classes.
|
||||||
|
|
||||||
|
#### `thermion_flutter_ffi` - `v0.2.1-dev.9`
|
||||||
|
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **FIX**: on resize, destroy swapchain if destroySwapChainOnResize is true.
|
||||||
|
- **FIX**: add listener in ThermionFlutterTextureBackedPlatform to unset viewer on dispose.
|
||||||
|
- **FIX**: add listener in ThermionFlutterMethodChannelInterface to unset viewer on dispose.
|
||||||
|
- **FIX**: clean up destruction logic for FlutterPlatformTexture.
|
||||||
|
- **FIX**: on resize, destroy swapchain if destroySwapChainOnResize is true.
|
||||||
|
- **FIX**: add listener in ThermionFlutterTextureBackedPlatform to unset viewer on dispose.
|
||||||
|
- **FIX**: add listener in ThermionFlutterMethodChannelInterface to unset viewer on dispose.
|
||||||
|
- **FIX**: clean up destruction logic for FlutterPlatformTexture.
|
||||||
|
- **FIX**: web/JS bool checks need to compare to int.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: (flutter) move DPR calculation to resizeTexture and add createViewerWithOptions method to ThermionFlutterFFI.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: use imported texture on iOS.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: (flutter) move DPR calculation to resizeTexture and add createViewerWithOptions method to ThermionFlutterFFI.
|
||||||
|
- **BREAKING** **REFACTOR**: refactor to support multiple Views/Render Targets.
|
||||||
|
- **BREAKING** **REFACTOR**: refactor to support multiple Views/Render Targets.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FEAT**: big refactor to support multiple swapchains.
|
||||||
|
- **BREAKING** **FEAT**: big refactor to support multiple swapchains.
|
||||||
|
|
||||||
|
#### `thermion_flutter_platform_interface` - `v0.2.1-dev.9`
|
||||||
|
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **REFACTOR**: continual refactor to support multiple render targets.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: add ThermionFlutterOptions classes, rename interface parameter for offsetTop and ensure pixelRatio is passed to resizeTexture.
|
||||||
|
- **FEAT**: support multiple ThermionWidget on Android.
|
||||||
|
- **FEAT**: working implementation of multiple widgets on macos.
|
||||||
|
- **FEAT**: add createViewerWithOptions to ThermionFlutterPlugin and mark createViewer as deprecated.
|
||||||
|
- **FEAT**: add ThermionFlutterOptions classes, rename interface parameter for offsetTop and ensure pixelRatio is passed to resizeTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
- **BREAKING** **FIX**: (flutter) pass pixelRatio to createTexture.
|
||||||
|
|
||||||
|
#### `thermion_flutter_web` - `v0.2.0`
|
||||||
|
|
||||||
|
- **FIX**: (flutter/web) use window.devicePixelRatio for viewport.
|
||||||
|
- **FIX**: (flutter/web) use window.devicePixelRatio for viewport.
|
||||||
|
- **FEAT**: (flutter) (web) use options to determine whether to create canvas, and set fixed position + offset.
|
||||||
|
- **FEAT**: add ThermionFlutterOptions classes, rename interface parameter for offsetTop and ensure pixelRatio is passed to resizeTexture.
|
||||||
|
- **FEAT**: (flutter) (web) use options to determine whether to create canvas, and set fixed position + offset.
|
||||||
|
- **FEAT**: add ThermionFlutterOptions classes, rename interface parameter for offsetTop and ensure pixelRatio is passed to resizeTexture.
|
||||||
|
- **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths.
|
||||||
|
- **BREAKING** **FEAT**: (flutter) (web) upgrade package:web dep to 1.0.0.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: resize canvas on web.
|
||||||
|
- **BREAKING** **FEAT**: (flutter) (web) upgrade package:web dep to 1.0.0.
|
||||||
|
- **BREAKING** **FEAT**: (web) (flutter) create canvas when createViewer is called (no longer need to manually add canvas element to web HTML).
|
||||||
|
- **BREAKING** **FEAT**: resize canvas on web.
|
||||||
|
- **BREAKING** **CHORE**: restructure viewer folders as libraries to only export the public interface.
|
||||||
|
- **BREAKING** **CHORE**: restructure viewer folders as libraries to only export the public interface.
|
||||||
|
|
||||||
|
|
||||||
|
## 2024-10-23
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Packages with breaking changes:
|
||||||
|
|
||||||
|
- [`thermion_dart` - `v0.2.1-dev.0.0.9`](#thermion_dart---v021-dev009)
|
||||||
|
|
||||||
|
Packages with other changes:
|
||||||
|
|
||||||
|
- [`thermion_flutter` - `v0.2.1-dev.8`](#thermion_flutter---v021-dev8)
|
||||||
|
- [`thermion_flutter_ffi` - `v0.2.1-dev.8`](#thermion_flutter_ffi---v021-dev8)
|
||||||
|
- [`thermion_flutter_web` - `v0.1.1`](#thermion_flutter_web---v011)
|
||||||
|
- [`thermion_flutter_platform_interface` - `v0.2.1-dev.8`](#thermion_flutter_platform_interface---v021-dev8)
|
||||||
|
|
||||||
|
Packages with dependency updates only:
|
||||||
|
|
||||||
|
> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project.
|
||||||
|
|
||||||
|
- `thermion_flutter_platform_interface` - `v0.2.1-dev.8`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### `thermion_dart` - `v0.2.1-dev.0.0.9`
|
||||||
|
|
||||||
|
- Fix release builds on Windows
|
||||||
|
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: move createUnlitMaterialInstance and createGeometry to render thread.
|
||||||
|
- **FIX**: dont calculate surface orientation for non-triangle geometry.
|
||||||
|
- **FIX**: set View render target to nullptr if Dart renderTarget is null.
|
||||||
|
- **FIX**: set render target to null for each view and then destroy render targets when viewer disposed.
|
||||||
|
- **FEAT**: produce debug symbols on Windows.
|
||||||
|
- **FEAT**: simplify FixedOrbitCameraRotationDelegate.
|
||||||
|
- **DOCS**: add quickstart to README.
|
||||||
|
- **BREAKING** **FIX**: (windows) add flushAndWait call to capture() to prevent stalling on Windows; use provided buffer as pixelBuffer rather than duplicate allocation.
|
||||||
|
- **BREAKING** **FIX**: add meshoptimizer lib on Windows.
|
||||||
|
- **BREAKING** **FIX**: Dart-only release mode builds on Window.
|
||||||
|
- **BREAKING** **CHORE**: View.getCamera returns Future<Camera>.
|
||||||
|
|
||||||
|
#### `thermion_flutter` - `v0.2.1-dev.8`
|
||||||
|
|
||||||
|
- **FIX**: fix all Windows warnings so apps will compile with /WX.
|
||||||
|
- **FIX**: use internal Set for determining first ThermionTextureWidget to call requestFrame and cleanup destruction logic.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add DestroyRenderingSurface method.
|
||||||
|
- **FEAT**: (flutter) (windows) add Destroy() to BackingWindow.
|
||||||
|
|
||||||
|
#### `thermion_flutter_ffi` - `v0.2.1-dev.8`
|
||||||
|
|
||||||
|
- **FIX**: on resize, destroy swapchain if destroySwapChainOnResize is true.
|
||||||
|
- **FIX**: add listener in ThermionFlutterTextureBackedPlatform to unset viewer on dispose.
|
||||||
|
- **FIX**: add listener in ThermionFlutterMethodChannelInterface to unset viewer on dispose.
|
||||||
|
- **FIX**: clean up destruction logic for FlutterPlatformTexture.
|
||||||
|
- **FIX**: web/JS bool checks need to compare to int.
|
||||||
|
|
||||||
|
#### `thermion_flutter_web` - `v0.1.1`
|
||||||
|
|
||||||
|
- **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths.
|
||||||
|
|
||||||
|
|
||||||
## 2024-10-14
|
## 2024-10-14
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
76
Dockerfile
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Set non-interactive mode for apt
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
# Install dependencies and add LLVM repository
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
git \
|
||||||
|
build-essential \
|
||||||
|
cmake \
|
||||||
|
ninja-build \
|
||||||
|
libgl1-mesa-dev \
|
||||||
|
libc++-dev \
|
||||||
|
libc++abi-dev \
|
||||||
|
libsdl2-dev \
|
||||||
|
libxi-dev \
|
||||||
|
libtbb-dev \
|
||||||
|
libassimp-dev \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
software-properties-common \
|
||||||
|
lsb-release \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Add LLVM repository and install Clang 16
|
||||||
|
RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - \
|
||||||
|
&& add-apt-repository "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main" \
|
||||||
|
&& apt-get update \
|
||||||
|
&& apt-get install -y \
|
||||||
|
clang-16 \
|
||||||
|
clang++-16 \
|
||||||
|
libc++-16-dev \
|
||||||
|
libc++abi-16-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Set Clang 16 as default
|
||||||
|
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-16 100 \
|
||||||
|
&& update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-16 100
|
||||||
|
|
||||||
|
# Set environment variables for Clang
|
||||||
|
ENV CC=clang-16
|
||||||
|
ENV CXX=clang++-16
|
||||||
|
|
||||||
|
# Set working directory
|
||||||
|
WORKDIR /opt
|
||||||
|
|
||||||
|
# Clone the filament repository
|
||||||
|
RUN git clone https://github.com/google/filament.git
|
||||||
|
|
||||||
|
# Change to filament directory
|
||||||
|
WORKDIR /opt/filament
|
||||||
|
|
||||||
|
# Checkout the specific version
|
||||||
|
RUN git checkout v1.58.0
|
||||||
|
|
||||||
|
# Add CMAKE_POSITION_INDEPENDENT_CODE setting after project() line
|
||||||
|
RUN sed -i '/^project(/a set(CMAKE_POSITION_INDEPENDENT_CODE ON)\nadd_compile_definitions(GLTFIO_USE_FILESYSTEM=0)' CMakeLists.txt
|
||||||
|
RUN sed -i -e '/^#define GLTFIO_USE_FILESYSTEM 1$/i\
|
||||||
|
#ifndef GLTFIO_USE_FILESYSTEM' -e '/^#define GLTFIO_USE_FILESYSTEM 1$/a\
|
||||||
|
#endif' libs/gltfio/src/FFilamentAsset.h
|
||||||
|
|
||||||
|
# Make build script executable
|
||||||
|
RUN chmod +x build.sh
|
||||||
|
|
||||||
|
# Run the build commands
|
||||||
|
RUN ./build.sh -l -i -f -p desktop release
|
||||||
|
RUN ./build.sh -l -i -f -p desktop release zstd
|
||||||
|
RUN ./build.sh -l -i -f -p desktop release tinyexr
|
||||||
|
RUN ./build.sh -l -i -f -p desktop release imageio
|
||||||
|
RUN zip -r filament-v1.58.0-linux-release.zip /opt/filament/out/release/filament/lib/x86_64/*.a /opt/filament/out/cmake-release/third_party/tinyexr/tnt/libtinyexr.a /opt/filament/out/cmake-release/libs/imageio/libimageio.a
|
||||||
|
# Set the working directory to the build output
|
||||||
|
WORKDIR /opt/filament/out/release
|
||||||
|
|
||||||
|
CMD ["/bin/bash"]
|
||||||
57
Makefile
@@ -1,36 +1,59 @@
|
|||||||
dart-web:
|
wasm:
|
||||||
cd thermion_dart/native/web; mkdir -p build && cd build && emcmake cmake .. && emmake make
|
@if [ ! -f thermion_dart/native/web/lib/release/filament-v1.58.0-web-release.zip ]; then \
|
||||||
dart-web-clean:
|
echo "Downloading filament-v1.58.0-web-release.zip..."; \
|
||||||
|
mkdir -p thermion_dart/native/web/lib/release; \
|
||||||
|
curl -L -o thermion_dart/native/web/lib/release/filament-v1.58.0-web-release.zip \
|
||||||
|
https://pub-c8b6266320924116aaddce03b5313c0a.r2.dev/filament-v1.58.0-web-release.zip; \
|
||||||
|
echo "Extracting filament-v1.58.0-web-release.zip..."; \
|
||||||
|
cd thermion_dart/native/web/lib/release && \
|
||||||
|
unzip filament-v1.58.0-web-release.zip; \
|
||||||
|
fi
|
||||||
|
cd thermion_dart/native/web && \
|
||||||
|
mkdir -p build && \
|
||||||
|
cd build && \
|
||||||
|
emcmake cmake .. && \
|
||||||
|
emmake make
|
||||||
|
wasm-clean:
|
||||||
cd thermion_dart/native/web && rm -rf build
|
cd thermion_dart/native/web && rm -rf build
|
||||||
dart-wasm-cli-example: dart-web-clean dart-web
|
wasm-example-web:
|
||||||
cd thermion_dart/examples/cli_wasm/bin && dart compile wasm example_cli.dart && node main.js
|
cd examples/dart/js_wasm
|
||||||
dart-web-example: dart-web
|
mkdir -p build
|
||||||
cp thermion_dart/native/web/build/build/out/thermion_dart* examples/web_wasm/bin
|
dart compile js web/example.dart -o build/example.dart.js
|
||||||
cd thermion_dart/examples/web_wasm/bin && dart compile wasm example_web.dart
|
|
||||||
flutter-example-web: dart-web-clean dart-web
|
flutter-example-web: dart-web-clean dart-web
|
||||||
cd thermion_flutter_federated/thermion_flutter/example/web && dart compile wasm main.dart && cd .. && flutter build web --wasm --profile
|
cd thermion_flutter_federated/thermion_flutter/example/web && dart compile wasm main.dart && cd .. && flutter build web --wasm --profile
|
||||||
flutter-example-macos:
|
flutter-example-macos:
|
||||||
cd thermion_flutter_federated/thermion_flutter/example/web && flutter run -d macos
|
cd thermion_flutter_federated/thermion_flutter/example/web && flutter run -d macos
|
||||||
swift-bindings:
|
swift-bindings:
|
||||||
swiftc -c thermion_flutter/thermion_flutter/macos/Classes/ThermionTexture.swift -module-name swift_module -emit-objc-header-path thermion_dart/native/include/generated/ThermionTextureSwiftObjCAPI.h -emit-library -o thermion_dart/test/libThermionTextureSwift.dylib
|
swiftc -c thermion_dart/native/macos/ThermionTexture.swift -module-name swift_module -emit-objc-header-path thermion_dart/native/include/generated/ThermionTextureSwiftObjCAPI.h -emit-library -o thermion_dart/test/generated/libThermionTextureSwift.dylib
|
||||||
cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/swift.yaml
|
cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/swift.yaml
|
||||||
bindings:
|
bindings:
|
||||||
cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/native.yaml
|
cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/native.yaml
|
||||||
|
shared:
|
||||||
|
cd thermion_dart/native && make
|
||||||
|
|
||||||
# We compile a small set of custom materials for various helpers (background image, gizmo, etc)
|
# We compile a small set of custom materials for various helpers (background image, gizmo, etc)
|
||||||
# You must specify the `FILAMENT_PATH` environment variable, either the path /out/release
|
# You must specify the `FILAMENT_PATH` environment variable, either the path /out/release
|
||||||
# eg: FILAMENT_PATH=/path/to/filament/out/release/bin make materials
|
# eg: FILAMENT_PATH=/path/to/filament/out/release/bin make materials
|
||||||
#
|
#
|
||||||
materials: FORCE
|
materials: FORCE
|
||||||
|
ifndef FILAMENT_PATH
|
||||||
|
@echo "FILAMENT_PATH is not set"
|
||||||
|
else
|
||||||
@echo "Using Filament build from ${FILAMENT_PATH}"
|
@echo "Using Filament build from ${FILAMENT_PATH}"
|
||||||
@for material in unlit image gizmo grid; do \
|
./materials/build.sh
|
||||||
${FILAMENT_PATH}/matc -a opengl -a metal -o materials/$$material.filamat materials/$$material.mat; \
|
endif
|
||||||
$(FILAMENT_PATH)/resgen -c -p $$material -x thermion_dart/native/include/material/ materials/$$material.filamat; \
|
|
||||||
echo '#include "'$$material'.h"' | cat - thermion_dart/native/include/material/$$material.c > thermion_dart/native/include/material/$$material.c.new; \
|
|
||||||
mv thermion_dart/native/include/material/$$material.c.new thermion_dart/native/include/material/$$material.c; \
|
|
||||||
done
|
|
||||||
|
|
||||||
#rm materials/*.filamat
|
resources: FORCE
|
||||||
|
ifndef FILAMENT_PATH
|
||||||
|
@echo "FILAMENT_PATH is not set"
|
||||||
|
else
|
||||||
|
@echo "Using Filament build from ${FILAMENT_PATH}"
|
||||||
|
@for gizmo in translation rotation; do \
|
||||||
|
$(FILAMENT_PATH)/resgen -c -p $${gizmo}_gizmo_glb -x thermion_dart/native/include/resources assets/$${gizmo}_gizmo.glb || exit 1; \
|
||||||
|
echo '#include "'$${gizmo}_gizmo_glb.h'"' | cat - thermion_dart/native/include/resources/$${gizmo}_gizmo_glb.c > thermion_dart/native/include/resources/$${gizmo}_gizmo_glb.c.new; \
|
||||||
|
mv thermion_dart/native/include/resources/$${gizmo}_gizmo_glb.c.new thermion_dart/native/include/resources/$${gizmo}_gizmo_glb.c; \
|
||||||
|
done
|
||||||
|
endif
|
||||||
|
|
||||||
FORCE: ;
|
FORCE: ;
|
||||||
|
|
||||||
|
|||||||
46
README.md
@@ -3,7 +3,7 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://thermion.dev/quickstart">Quickstart (Flutter)</a> •
|
<a href="https://thermion.dev/quickstart">Quickstart (Flutter)</a> •
|
||||||
<a href="https://thermion.dev/">Documentation</a> •
|
<a href="https://thermion.dev/">Documentation</a> •
|
||||||
<a href="https://thermion.dev/examples">Showcase</a> •
|
<a href="https://thermion.dev/showcase">Showcase</a> •
|
||||||
<a href="https://dartpad.thermion.dev/">Playground</a> •
|
<a href="https://dartpad.thermion.dev/">Playground</a> •
|
||||||
<a href="https://discord.gg/h2VdDK3EAQ">Discord</a>
|
<a href="https://discord.gg/h2VdDK3EAQ">Discord</a>
|
||||||
</p>
|
</p>
|
||||||
@@ -15,6 +15,8 @@
|
|||||||
<a href="https://discord.gg/h2VdDK3EAQ"><img src="https://img.shields.io/discord/993167615587520602?logo=discord&logoColor=fff&labelColor=333940" alt="discord"></a>
|
<a href="https://discord.gg/h2VdDK3EAQ"><img src="https://img.shields.io/discord/993167615587520602?logo=discord&logoColor=fff&labelColor=333940" alt="discord"></a>
|
||||||
<a href="https://github.com/nmfisher/thermion"><img src="https://img.shields.io/github/contributors/nmfisher/flutter_filament?logo=github&labelColor=333940" alt="contributors"></a>
|
<a href="https://github.com/nmfisher/thermion"><img src="https://img.shields.io/github/contributors/nmfisher/flutter_filament?logo=github&labelColor=333940" alt="contributors"></a>
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/b0c07b5a-6156-4e42-a09b-5f9bd85fbf32
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
- Supports iOS (arm64), MacOS (arm64/x64), Android (arm64), Windows (x64) (>= 10), Web/WASM
|
- Supports iOS (arm64), MacOS (arm64/x64), Android (arm64), Windows (x64) (>= 10), Web/WASM
|
||||||
@@ -22,6 +24,47 @@
|
|||||||
- camera/entity manipulation with mouse (desktop) and gestures (mobile)
|
- camera/entity manipulation with mouse (desktop) and gestures (mobile)
|
||||||
- skinning + morph animations
|
- skinning + morph animations
|
||||||
|
|
||||||
|
Uses the Filament PBR engine (currently v1.56.4).
|
||||||
|
|
||||||
|
### Quickstart (Flutter)
|
||||||
|
|
||||||
|
From the command line:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
flutter channel master
|
||||||
|
flutter upgrade
|
||||||
|
flutter config --enable-native-assets
|
||||||
|
```
|
||||||
|
|
||||||
|
In your Flutter app:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
body: Stack(children: [
|
||||||
|
Positioned.fill(
|
||||||
|
child: ViewerWidget(
|
||||||
|
assetPath: "assets/cube.glb",
|
||||||
|
skyboxPath: "assets/default_env_skybox.ktx",
|
||||||
|
iblPath: "assets/default_env_ibl.ktx",
|
||||||
|
transformToUnitCube: true,
|
||||||
|
initialCameraPosition: Vector3(0, 0, 6),
|
||||||
|
background: Colors.blue,
|
||||||
|
manipulatorType: ManipulatorType.ORBIT,
|
||||||
|
onViewerAvailable: (viewer) async {
|
||||||
|
await Future.delayed(const Duration(seconds: 5));
|
||||||
|
await viewer.removeSkybox();
|
||||||
|
},
|
||||||
|
initial: Container(
|
||||||
|
color: Colors.red,
|
||||||
|
),
|
||||||
|
))]));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> the first time you build an app that consumes this package, the Dart native-assets build system will download static binaries from Cloudflare. This may take a few minutes (depending on which platform you are compiling for). These will be cached, so subsequent builds will be much faster.
|
||||||
|
|
||||||
### Sponsors, Contributors & Acknowledgments
|
### Sponsors, Contributors & Acknowledgments
|
||||||
|
|
||||||
Thermion uses the [Filament](https://github.com/google/filament) Physically Based Rendering engine under the hood.
|
Thermion uses the [Filament](https://github.com/google/filament) Physically Based Rendering engine under the hood.
|
||||||
@@ -35,4 +78,5 @@ Thank you to the following people:
|
|||||||
- @daverin for MacOS library contributions
|
- @daverin for MacOS library contributions
|
||||||
- @LukasPoque for CI/refactoring work
|
- @LukasPoque for CI/refactoring work
|
||||||
- @alexmercerind for his work on integrating ANGLE textures on Flutter Windows
|
- @alexmercerind for his work on integrating ANGLE textures on Flutter Windows
|
||||||
|
- @BrutalCoding for documentation fixes
|
||||||
|
|
||||||
|
|||||||
BIN
assets/rotation_gizmo.glb
Normal file
BIN
assets/translation_gizmo.glb
Normal file
@@ -7,14 +7,21 @@
|
|||||||
"Getting Started",
|
"Getting Started",
|
||||||
[
|
[
|
||||||
["Overview", "/"],
|
["Overview", "/"],
|
||||||
["Quick Start", "/quickstart"]
|
["Getting Started", "/getting_started"],
|
||||||
|
["Quick Start", "/quickstart"],
|
||||||
|
["Viewer", "/viewer"],
|
||||||
|
["Camera Manipulation", "/camera_manipulation"]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
["Misc.", [
|
["Misc.", [
|
||||||
|
["Debugging", "/debugging"],
|
||||||
["Playground", "https://dartpad.thermion.dev"],
|
["Playground", "https://dartpad.thermion.dev"],
|
||||||
["Showcase", "/showcase"],
|
["Showcase", "/showcase"],
|
||||||
["Windows", "/windows"],
|
["Windows", "/windows"],
|
||||||
["Android", "/android"],
|
["Android", "/android"],
|
||||||
|
["iOS", "/ios"],
|
||||||
|
["Web", "/web"],
|
||||||
|
["Linux", "/linux"],
|
||||||
["Contributing", "/contributing"],
|
["Contributing", "/contributing"],
|
||||||
["Discord", "https://discord.gg/h2VdDK3EAQ"]
|
["Discord", "https://discord.gg/h2VdDK3EAQ"]
|
||||||
]]
|
]]
|
||||||
|
|||||||
@@ -12,15 +12,3 @@ Thermion requires Android SDK version 22, so change your `app/android/build.grad
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Shrink/Minify Resources
|
|
||||||
|
|
||||||
In release mode, you must add the following to your `app/build.gradle`:
|
|
||||||
|
|
||||||
```
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
shrinkResources false
|
|
||||||
minifyEnabled false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
27
docs/debugging.mdx
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Debugging
|
||||||
|
|
||||||
|
If something is crashing or not working as expected, you can enable verbose logging and/or debug builds (particularly useful for debugging with lldb or getting legible stack traces):
|
||||||
|
|
||||||
|
Add a `hooks` section to your app's `pubspec.yaml`, e.g.
|
||||||
|
```
|
||||||
|
name: example_cli
|
||||||
|
description: A sample command-line application.
|
||||||
|
version: 1.0.0
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ^3.3.0
|
||||||
|
|
||||||
|
# Add the below
|
||||||
|
hooks:
|
||||||
|
user_defines:
|
||||||
|
thermion_dart:
|
||||||
|
mode: debug
|
||||||
|
tracing: enabled
|
||||||
|
```
|
||||||
|
|
||||||
|
After changing the `hooks` section, make sure you run `flutter clean` to propagate the changes correctly.
|
||||||
|
|
||||||
|
> [!CAUTION]
|
||||||
|
> Debug builds won't work for Android. This is a known upstream issue with Filament.
|
||||||
|
|
||||||
|
Unless `mode: debug` is specified in your `pubspec.yaml`, Thermion will use release builds under the hood, even if your app is compiled/runing in debug mode.
|
||||||
40
docs/getting_started.mdx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
## Getting Started
|
||||||
|
|
||||||
|
Thermion currently requires the Flutter `master` channel with the `native-assets` experiment enabled.
|
||||||
|
|
||||||
|
1. Switch to Flutter master channel, upgrade Flutter, create a new project, then add `thermion_flutter` as a dependency
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ flutter channel master
|
||||||
|
$ flutter upgrade
|
||||||
|
$ flutter config --enable-native-assets
|
||||||
|
$ cd your_flutter_project
|
||||||
|
$ flutter pub add thermion_flutter
|
||||||
|
```
|
||||||
|
|
||||||
|
2. If running on iOS or MacOS, change the minimum deployment target to OSX 13
|
||||||
|
|
||||||
|
<Accordion title="Click to open iOS/MacOS instructions">
|
||||||
|
|
||||||
|
Make sure the `platform` entry refers to `13.0` in your Podfile.
|
||||||
|
|
||||||
|
In `macos/Podfile` (for macOS):
|
||||||
|
```
|
||||||
|
platform :osx, '13.0'
|
||||||
|
```
|
||||||
|
|
||||||
|
In `ios/Podfile`, (for iOS):
|
||||||
|
```
|
||||||
|
platform :ios, '13.0'
|
||||||
|
```
|
||||||
|
|
||||||
|
Then open XCode:
|
||||||
|
```
|
||||||
|
open macos/Runner.xcworkspace
|
||||||
|
```
|
||||||
|
|
||||||
|
and change the minimum deployment target to 13.0:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
</Accordion>
|
||||||
@@ -16,7 +16,7 @@ Thermion is divided into two packages:
|
|||||||
|
|
||||||
With this structure, the Flutter-specific components are not coupled to the Dart components, meaning Thermion can be used for rendering in both Flutter and non-Flutter applications.
|
With this structure, the Flutter-specific components are not coupled to the Dart components, meaning Thermion can be used for rendering in both Flutter and non-Flutter applications.
|
||||||
|
|
||||||
For example, Thermion ships with examples for rendering with Dart only (no Flutter) with a CLI/headless application on MacOS, and with a Javascript/WASM/HTML applicaiton in browsers.
|
For example, Thermion ships with examples for rendering with Dart only (no Flutter) with a CLI/headless application on MacOS, and with a Javascript/WASM/HTML application in browsers.
|
||||||
|
|
||||||
`thermion_flutter` exports `thermion_dart`, so if you are working with a Flutter application, you will only need to import `thermion_fluttter`.
|
`thermion_flutter` exports `thermion_dart`, so if you are working with a Flutter application, you will only need to import `thermion_fluttter`.
|
||||||
|
|
||||||
|
|||||||
55
docs/ios.mdx
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
## iOS
|
||||||
|
|
||||||
|
### Min iOS version
|
||||||
|
|
||||||
|
Thermion requires a minimum iOS version of 13.0. When building a Flutter application, ensure your application's `ios/Podfile` contains the following:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
platform :ios, '13.0'
|
||||||
|
```
|
||||||
|
|
||||||
|
and in ios/Info.plist:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>13.0</string>
|
||||||
|
```
|
||||||
|
|
||||||
|
When submitting to the App Store, you may encounter an error saying `thermion_dart.framework does not supported the minimum deployment target in Info.plist`.
|
||||||
|
|
||||||
|
This is because Flutter hardcodes a deployment target of iOS 12.0 when invoking the native assets build, which conflicts with actual requirement.
|
||||||
|
|
||||||
|
After running `flutter build ios` (but before archiving the build and submitting to the App Store), run the following script to replace the `MinimumOSVersion`:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/zsh
|
||||||
|
|
||||||
|
# Array of directories containing Info.plist files
|
||||||
|
directories=(
|
||||||
|
"./build/ios/iphoneos/Runner.app/Frameworks/thermion_dart.framework"
|
||||||
|
"./build/ios/Release-iphoneos/Runner.app/Frameworks/thermion_dart.framework"
|
||||||
|
"./build/native_assets/ios/thermion_dart.framework"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Loop through each directory
|
||||||
|
for dir in "${directories[@]}"; do
|
||||||
|
plist_path="$dir/Info.plist"
|
||||||
|
|
||||||
|
# Check if Info.plist exists in the directory
|
||||||
|
if [[ -f "$plist_path" ]]; then
|
||||||
|
echo "Processing: $plist_path"
|
||||||
|
|
||||||
|
# Use PlistBuddy to change the MinimumOSVersion
|
||||||
|
/usr/libexec/PlistBuddy -c "Set :MinimumOSVersion 13.0" "$plist_path" 2>/dev/null
|
||||||
|
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
echo "✓ Successfully updated version to 13.0"
|
||||||
|
else
|
||||||
|
echo "✗ Failed to update version in $plist_path"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "✗ Info.plist not found in $dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
10
docs/linux.mdx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
## Linux support
|
||||||
|
|
||||||
|
Currently, only the Dart package (`thermion_dart`) will work on Linux (primarily for the automated build/testing pipeline).
|
||||||
|
|
||||||
|
Filament has been built for Ubuntu 22.04; other distributions may work, but YMMV.
|
||||||
|
|
||||||
|
The Flutter package (`thermion_flutter`) won't work; it's missing the platform glue code necessary to set up the render target. Support will eventually be added, but there is currently no estimated timeline.
|
||||||
|
|
||||||
|
Contributions are welcome and it's actually not a lot of work. Join the Discord if you want to help out.
|
||||||
|
|
||||||
@@ -1,221 +1,197 @@
|
|||||||
## Quickstart (Flutter)
|
# Quick Start
|
||||||
|
|
||||||
> You can find the entire project below in the [flutter/quickstart](https://github.com/nmfisher/thermion_examples/tree/master/flutter/quickstart) folder of the `thermion_examples` repository.
|
If all you need is a quick and easy route to rendering a single 3D model in your Flutter application, start with `ViewerWidget`.
|
||||||
|
|
||||||
1. Switch to Flutter master channel, upgrade Flutter, create a new project, then add `thermion_flutter` as a dependency
|
This is a simplified, Flutter-only wrapper around the underlying 3D rendering API with sane defaults for most people.
|
||||||
|
|
||||||
```bash
|
`ViewerWidget` handles all the setup and configuration of the underlying Thermion API, including:
|
||||||
$ flutter channel master
|
- Loading 3D models (glTF assets)
|
||||||
$ flutter upgrade
|
- Configuring skyboxes and image-based lighting
|
||||||
$ flutter config --enable-native-assets
|
- Setting up camera positions and manipulators
|
||||||
$ flutter create thermion_sample_project && cd thermion_sample_project
|
- Managing the rendering lifecycle
|
||||||
$ flutter pub add thermion_flutter
|
|
||||||
```
|
|
||||||
|
|
||||||
2. If running on iOS or MacOS, change the minimum deployment target to OSX 13
|
## Setup
|
||||||
|
|
||||||
<Accordion title="Click to open iOS/MacOS instructions">
|
Follow the steps listed in [Getting Started](./getting_started) to configure your Flutter installation and project.
|
||||||
|
|
||||||
Make sure the `platform` entry refers to `13.0` in your Podfile.
|
## Basic Usage
|
||||||
|
|
||||||
In `macos/Podfile` (for macOS):
|
|
||||||
```
|
|
||||||
platform :osx, '13.0'
|
|
||||||
```
|
|
||||||
|
|
||||||
In `ios/Podfile`, (for iOS):
|
|
||||||
```
|
|
||||||
platform :ios, '13.0'
|
|
||||||
```
|
|
||||||
|
|
||||||
Then open XCode:
|
|
||||||
```
|
|
||||||
open macos/Runner.xcworkspace
|
|
||||||
```
|
|
||||||
|
|
||||||
and change the minimum deployment target to 13.0:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
<Accordion title="Click to open Windows instructions">
|
|
||||||
See the [/windows](/windows) page for steps needed to build on Windows.
|
|
||||||
</Accordion>
|
|
||||||
|
|
||||||
|
|
||||||
2. Add a folder containing your assets (glTF model + skybox ktx) to your `pubspec.yaml` asset list
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
...
|
|
||||||
flutter
|
|
||||||
uses-material-design: true
|
|
||||||
assets:
|
|
||||||
- assets/
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Create an instance of `ThermionFlutterPlugin` in your app.
|
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:thermion_flutter/thermion_flutter.dart';
|
||||||
|
import 'path_to_your_viewer_widget.dart';
|
||||||
|
|
||||||
class _MyAppState extends State<MyApp> {
|
class MyApp extends StatelessWidget {
|
||||||
late ThermionFlutterPlugin _thermionFlutterPlugin;
|
@override
|
||||||
late Future<ThermionViewer> _thermionViewer;
|
Widget build(BuildContext context) {
|
||||||
void initState() {
|
return MaterialApp(
|
||||||
_thermionFlutterPlugin = ThermionFlutterPlugin();
|
home: Scaffold(
|
||||||
_thermionViewer = _thermionFlutterPlugin.createViewer();
|
body: ViewerWidget(
|
||||||
|
assetPath: 'assets/my_model.glb',
|
||||||
|
initialCameraPosition: Vector3(0, 0, 5),
|
||||||
|
manipulatorType: ManipulatorType.ORBIT,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Properties
|
||||||
|
|
||||||
4. Add a `ThermionWidget` to your widget hierarchy
|
| Property | Type | Default | Description |
|
||||||
|
|----------|------|---------|-------------|
|
||||||
|
| `initial` | `Widget` | Red decorated box | Widget to display while the viewer is loading |
|
||||||
|
| `initialCameraPosition` | `Vector3` | `Vector3(0, 0, 5)` | The starting position for the camera (looking towards origin) |
|
||||||
|
| `showFpsCounter` | `bool` | `false` | Whether to show an FPS counter overlay |
|
||||||
|
| `assetPath` | `String?` | `null` | Path to the glTF asset to load |
|
||||||
|
| `skyboxPath` | `String?` | `null` | Path to a KTX skybox image |
|
||||||
|
| `iblPath` | `String?` | `null` | Path to a KTX image for image-based lighting |
|
||||||
|
| `directLightType` | `LightType?` | `null` | Type of direct light to add to the scene |
|
||||||
|
| `transformToUnitCube` | `bool` | `true` | If true, rescales the model to fit within a 1x1x1 cube |
|
||||||
|
| `postProcessing` | `bool` | `true` | Enables ACES tone mapping and basic anti-aliasing |
|
||||||
|
| `background` | `Color?` | `null` | Background color (not visible when skybox is provided) |
|
||||||
|
| `destroyEngineOnUnload` | `bool` | `false` | If true, disposes the engine when widget is disposed |
|
||||||
|
| `manipulatorType` | `ManipulatorType` | `ORBIT` | Type of camera control to use |
|
||||||
|
| `onViewerAvailable` | `Future Function(ThermionViewer)?` | `null` | Callback when viewer is ready |
|
||||||
|
|
||||||
|
## Camera Manipulators
|
||||||
|
|
||||||
|
`ViewerWidget` supports three different camera manipulation modes:
|
||||||
|
|
||||||
|
- `ManipulatorType.NONE`: No camera controls, static view
|
||||||
|
- `ManipulatorType.ORBIT`: Orbit controls (pinch to zoom, swipe to rotate)
|
||||||
|
- `ManipulatorType.FREE_FLIGHT`: Free flight controls for unrestricted movement
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
|
ViewerWidget(
|
||||||
|
assetPath: 'assets/model.glb',
|
||||||
|
manipulatorType: ManipulatorType.FREE_FLIGHT,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
class _MyAppState extends State<MyApp> {
|
## Lighting
|
||||||
|
|
||||||
|
You can set up lighting in multiple ways:
|
||||||
|
|
||||||
|
### Image-Based Lighting
|
||||||
|
|
||||||
|
```dart
|
||||||
|
ViewerWidget(
|
||||||
|
assetPath: 'assets/model.glb',
|
||||||
|
iblPath: 'assets/environment.ktx',
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Direct Light
|
||||||
|
|
||||||
|
```dart
|
||||||
|
ViewerWidget(
|
||||||
|
assetPath: 'assets/model.glb',
|
||||||
|
directLightType: LightType.SUN,
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Advanced Usage
|
||||||
|
|
||||||
|
### Accessing the Viewer
|
||||||
|
|
||||||
|
You can get access to the underlying `ThermionViewer` object for more advanced control:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
ViewerWidget(
|
||||||
|
assetPath: 'assets/model.glb',
|
||||||
|
onViewerAvailable: (viewer) async {
|
||||||
|
// Now you can use the viewer directly
|
||||||
|
final camera = await viewer.getActiveCamera();
|
||||||
|
await camera.lookAt(Vector3(0, 1, 5));
|
||||||
|
|
||||||
ThermionViewer? _thermionViewer;
|
// Add custom lights, manipulate materials, etc.
|
||||||
void initState() {
|
},
|
||||||
_thermionFlutterPlugin.createViewer().then((viewer) {
|
)
|
||||||
setState(() {
|
```
|
||||||
_thermionViewer = viewer;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
### Changing Manipulator at Runtime
|
||||||
return Stack(children:[
|
|
||||||
if(_thermionViewer != null)
|
The `manipulatorType` is the only property that can be changed after the widget is created:
|
||||||
Positioned.fill(
|
|
||||||
child:ThermionWidget(
|
```dart
|
||||||
plugin:_thermionViewer!
|
class _MyWidgetState extends State<MyWidget> {
|
||||||
)
|
ManipulatorType _manipulatorType = ManipulatorType.ORBIT;
|
||||||
)
|
|
||||||
]);
|
@override
|
||||||
}
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ViewerWidget(
|
||||||
|
assetPath: 'assets/model.glb',
|
||||||
|
manipulatorType: _manipulatorType,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
_manipulatorType = ManipulatorType.ORBIT;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Text('Orbit'),
|
||||||
|
),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
_manipulatorType = ManipulatorType.FREE_FLIGHT;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Text('Free Flight'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Add a button to load the model when pressed
|
## Limitations
|
||||||
|
|
||||||
|
- Only the `manipulatorType` property can be changed at runtime. For any other property changes, create a new widget.
|
||||||
|
- The widget requires that you have the correct environment setup for Thermion (Flutter master channel with native assets enabled).
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Here's a complete example showing how to use `ViewerWidget` with multiple configuration options:
|
||||||
|
|
||||||
```dart
|
```dart
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:thermion_flutter/thermion_flutter.dart';
|
||||||
|
import 'package:vector_math/vector_math_64.dart';
|
||||||
|
|
||||||
...
|
class ModelViewer extends StatelessWidget {
|
||||||
|
@override
|
||||||
class _MyAppState extends State<MyApp> {
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
...
|
appBar: AppBar(title: Text('3D Model Viewer')),
|
||||||
|
body: ViewerWidget(
|
||||||
bool _loaded = false;
|
assetPath: 'assets/robot.glb',
|
||||||
|
skyboxPath: 'assets/studio_skybox.ktx',
|
||||||
Widget build(BuildContext context) {
|
iblPath: 'assets/studio_ibl.ktx',
|
||||||
return Stack(children:[
|
initialCameraPosition: Vector3(0, 1.5, 3),
|
||||||
if(_thermionViewer != null)
|
manipulatorType: ManipulatorType.ORBIT,
|
||||||
Positioned.fill(
|
showFpsCounter: true,
|
||||||
child:ThermionWidget(
|
background: Colors.grey,
|
||||||
plugin:_thermionViewer!
|
postProcessing: true,
|
||||||
)
|
transformToUnitCube: true,
|
||||||
),
|
onViewerAvailable: (viewer) async {
|
||||||
if (!_loaded)
|
// You can perform additional setup here
|
||||||
Center(
|
print('Viewer is ready!');
|
||||||
child: ElevatedButton(
|
},
|
||||||
child: const Text("Load"),
|
),
|
||||||
onPressed: () async {
|
);
|
||||||
// TODO
|
}
|
||||||
_loaded = true;
|
|
||||||
setState(() {});
|
|
||||||
}))
|
|
||||||
]);
|
|
||||||
}}
|
|
||||||
```
|
|
||||||
|
|
||||||
5. When the button is pressed, load a skybox, lighting and the glb asset
|
|
||||||
|
|
||||||
You will need to import the `dart:math` and `package:vector_math` libraries.
|
|
||||||
|
|
||||||
```dart
|
|
||||||
import 'package:vector_math/vector_math_64.dart' as v;
|
|
||||||
import 'dart:math';
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
class _MyAppState extends State<MyApp> {
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Stack(children:[
|
|
||||||
...
|
|
||||||
if(!_loaded)
|
|
||||||
Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
child: const Text("Load"),
|
|
||||||
onPressed: () async {
|
|
||||||
var viewer = await _thermionViewer;
|
|
||||||
await viewer.loadIbl("assets/default_env_ibl.ktx");
|
|
||||||
await viewer.loadSkybox("assets/default_env_skybox.ktx");
|
|
||||||
await viewer.loadGlb("assets/cube.glb");
|
|
||||||
|
|
||||||
await viewer.setCameraPosition(0, 1, 10);
|
|
||||||
await viewer.setCameraRotation(v.Quaternion.axisAngle(
|
|
||||||
v.Vector3(1, 0, 0), -30 / 180 * pi) *
|
|
||||||
v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
|
|
||||||
await viewer.addLight(
|
|
||||||
LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
|
|
||||||
await viewer.setRendering(true);
|
|
||||||
_loaded = true;
|
|
||||||
setState(() {});
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Here, we've added a skybox (the background (cube) image rendered behind all other elements in the scene), image-based lighting (where an image is used to determine the direction and intensity of a light source) and a directional light (Sun).
|
|
||||||
|
|
||||||
Anything added to the scene is referred to as an "entity" (including lights and cameras).
|
|
||||||
|
|
||||||
Entities are always added to the scene at position (0,0,0).
|
|
||||||
|
|
||||||
The default scene camera is located at (0,0,0) (and is looking at -Z, or "into" the screen), so by adding a cube at (0,0,0), the camera will now be inside the cube.
|
|
||||||
|
|
||||||
We need to move the camera outside the cube so it's visible.
|
|
||||||
|
|
||||||
6. Change the camera orientation
|
|
||||||
```dart
|
|
||||||
var viewer = await _thermionViewer;
|
|
||||||
await viewer.loadSkybox("assets/default_env_skybox.ktx");
|
|
||||||
await viewer.loadGlb("assets/cube.glb");
|
|
||||||
|
|
||||||
await viewer.setCameraPosition(0, 1, 10);
|
|
||||||
await viewer.setCameraRotation(v.Quaternion.axisAngle(
|
|
||||||
v.Vector3(1, 0, 0), -30 / 180 * pi) *
|
|
||||||
v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
|
|
||||||
```
|
|
||||||
|
|
||||||
The cube still won't be visible until we add a light to the scene and tell Thermion to start rendering.
|
|
||||||
|
|
||||||
7. Add a light and turn rendering on
|
|
||||||
```dart
|
|
||||||
...
|
|
||||||
await viewer.addLight(
|
|
||||||
LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
|
|
||||||
await viewer.setRendering(true);
|
|
||||||
...
|
|
||||||
````
|
|
||||||
|
|
||||||
8. Run the project
|
|
||||||
```
|
|
||||||
$ flutter run -d macos
|
|
||||||
```
|
|
||||||
|
|
||||||
> You may experience a noticeable delay the very first time you run the project. Don't panic, it's not frozen! This is due to the build system downloading the prebuilt Filament binaries from Cloudflare, which can take some time (particularly on Windows). These binaries will be cached after first download, so subsequent runs will be much faster (though every time you run flutter clean, the binaries will be re-downloaded).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Your first Thermion project is complete!
|
|
||||||
@@ -1,18 +1,25 @@
|
|||||||
## Showcase
|
## Showcase
|
||||||
|
|
||||||
|
## KTX Viewer
|
||||||
|
|
||||||
|
https://ktxviewer.com
|
||||||
|
|
||||||
|
A basic HTML + Dart site for viewing KTX textures in browser.
|
||||||
|
|
||||||
## DartPad Playground
|
## DartPad Playground
|
||||||
|
|
||||||
A custom DartPad that lets you experiment with Thermion from your browser (currently, only Chrome is supported).
|
A custom DartPad that lets you experiment with Thermion from your browser (currently, only Chrome is supported).
|
||||||
|
|
||||||
[](https://dartpad.thermion.dev)
|
[](https://dartpad.thermion.dev)
|
||||||
|
|
||||||
|
(Outdated, needs to be upgraded to Thermion `0.3.0`);
|
||||||
|
|
||||||
## mixreel (Flutter/Web)
|
## mixreel (Flutter/Web)
|
||||||
|
|
||||||
Create 3D worlds and translate to AI video.
|
Create 3D worlds and translate to AI video.
|
||||||
|
|
||||||
[](https://mixreel.ai)
|
[](https://mixreel.ai)
|
||||||
|
|
||||||
|
|
||||||
## Nick Fisher
|
## Nick Fisher
|
||||||
|
|
||||||
My personal website, where I create an interactive clone of myself with Avaturn & Cartesia (no Flutter, made with Thermion and the [Jaspr Dart UI framework](https://github.com/schultek/jaspr)).
|
My personal website, where I create an interactive clone of myself with Avaturn & Cartesia (no Flutter, made with Thermion and the [Jaspr Dart UI framework](https://github.com/schultek/jaspr)).
|
||||||
@@ -21,3 +28,4 @@ My personal website, where I create an interactive clone of myself with Avaturn
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
186
docs/viewer.mdx
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
## ThermionViewer (Flutter)
|
||||||
|
|
||||||
|
If you just want to display a 3D object in the viewport with some basic camera controls, use the [ViewerWidget described in the Quickstart section](./quickstart).
|
||||||
|
|
||||||
|
If you need want more fine-grained control
|
||||||
|
|
||||||
|
> You can find the entire project below in the [examples/flutter/viewer](https://github.com/nmfisher/thermion/tree/master/examples/flutter/viewer) folder of the repository.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Add a folder containing your assets (glTF model + skybox ktx) to your `pubspec.yaml` asset list
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
...
|
||||||
|
flutter
|
||||||
|
assets:
|
||||||
|
- assets/
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create an instance of `ThermionFlutterPlugin` in your app.
|
||||||
|
|
||||||
|
```dart
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> {
|
||||||
|
late Future<ThermionViewer> _thermionViewer;
|
||||||
|
void initState() {
|
||||||
|
ThermionFlutterPlugin.createViewer().then((viewer) {
|
||||||
|
_thermionViewer = viewer;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
4. Add a `ThermionWidget` to your widget hierarchy
|
||||||
|
|
||||||
|
```dart
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> {
|
||||||
|
|
||||||
|
ThermionViewer? _thermionViewer;
|
||||||
|
void initState() {
|
||||||
|
_thermionFlutterPlugin.createViewer().then((viewer) {
|
||||||
|
setState(() {
|
||||||
|
_thermionViewer = viewer;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(children:[
|
||||||
|
if(_thermionViewer != null)
|
||||||
|
Positioned.fill(
|
||||||
|
child:ThermionWidget(
|
||||||
|
plugin:_thermionViewer!
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Add a button to load the model when pressed
|
||||||
|
|
||||||
|
```dart
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> {
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
bool _loaded = false;
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(children:[
|
||||||
|
if(_thermionViewer != null)
|
||||||
|
Positioned.fill(
|
||||||
|
child:ThermionWidget(
|
||||||
|
plugin:_thermionViewer!
|
||||||
|
)
|
||||||
|
),
|
||||||
|
if (!_loaded)
|
||||||
|
Center(
|
||||||
|
child: ElevatedButton(
|
||||||
|
child: const Text("Load"),
|
||||||
|
onPressed: () async {
|
||||||
|
// TODO
|
||||||
|
_loaded = true;
|
||||||
|
setState(() {});
|
||||||
|
}))
|
||||||
|
]);
|
||||||
|
}}
|
||||||
|
```
|
||||||
|
|
||||||
|
5. When the button is pressed, load a skybox, lighting and the glb asset
|
||||||
|
|
||||||
|
You will need to import the `dart:math` and `package:vector_math` libraries.
|
||||||
|
|
||||||
|
```dart
|
||||||
|
import 'package:vector_math/vector_math_64.dart' as v;
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
class _MyAppState extends State<MyApp> {
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(children:[
|
||||||
|
...
|
||||||
|
if(!_loaded)
|
||||||
|
Center(
|
||||||
|
child: ElevatedButton(
|
||||||
|
child: const Text("Load"),
|
||||||
|
onPressed: () async {
|
||||||
|
var viewer = await _thermionViewer;
|
||||||
|
await viewer.loadIbl("assets/default_env_ibl.ktx");
|
||||||
|
await viewer.loadSkybox("assets/default_env_skybox.ktx");
|
||||||
|
await viewer.loadGlb("assets/cube.glb");
|
||||||
|
|
||||||
|
await viewer.setCameraPosition(0, 1, 10);
|
||||||
|
await viewer.setCameraRotation(v.Quaternion.axisAngle(
|
||||||
|
v.Vector3(1, 0, 0), -30 / 180 * pi) *
|
||||||
|
v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
|
||||||
|
await viewer.addLight(
|
||||||
|
LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
|
||||||
|
await viewer.setRendering(true);
|
||||||
|
_loaded = true;
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Here, we've added a skybox (the background (cube) image rendered behind all other elements in the scene), image-based lighting (where an image is used to determine the direction and intensity of a light source) and a directional light (Sun).
|
||||||
|
|
||||||
|
Anything added to the scene is referred to as an "entity" (including lights and cameras).
|
||||||
|
|
||||||
|
Entities are always added to the scene at position (0,0,0).
|
||||||
|
|
||||||
|
The default scene camera is located at (0,0,0) (and is looking at -Z, or "into" the screen), so by adding a cube at (0,0,0), the camera will now be inside the cube.
|
||||||
|
|
||||||
|
We need to move the camera outside the cube so it's visible.
|
||||||
|
|
||||||
|
6. Change the camera orientation
|
||||||
|
```dart
|
||||||
|
var viewer = await _thermionViewer;
|
||||||
|
await viewer.loadSkybox("assets/default_env_skybox.ktx");
|
||||||
|
await viewer.loadGlb("assets/cube.glb");
|
||||||
|
|
||||||
|
await viewer.setCameraPosition(0, 1, 10);
|
||||||
|
await viewer.setCameraRotation(v.Quaternion.axisAngle(
|
||||||
|
v.Vector3(1, 0, 0), -30 / 180 * pi) *
|
||||||
|
v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
|
||||||
|
```
|
||||||
|
|
||||||
|
The cube still won't be visible until we add a light to the scene and tell Thermion to start rendering.
|
||||||
|
|
||||||
|
7. Add a light and turn rendering on
|
||||||
|
```dart
|
||||||
|
...
|
||||||
|
await viewer.addLight(
|
||||||
|
LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
|
||||||
|
await viewer.setRendering(true);
|
||||||
|
...
|
||||||
|
````
|
||||||
|
|
||||||
|
8. Run the project
|
||||||
|
```
|
||||||
|
$ flutter run -d macos
|
||||||
|
```
|
||||||
|
|
||||||
|
> You may experience a noticeable delay the very first time you run the project. Don't panic, it's not frozen! This is due to the build system downloading the prebuilt Filament binaries from Cloudflare, which can take some time (particularly on Windows). These binaries will be cached after first download, so subsequent runs will be much faster (though every time you run flutter clean, the binaries will be re-downloaded).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Your first Thermion project is complete!
|
||||||
42
docs/web.mdx
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
## Web
|
||||||
|
|
||||||
|
Web support is still experimental and currently requires you to manually compile Thermion to WASM first.
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
|
||||||
|
1) GNU Make
|
||||||
|
2) CMake
|
||||||
|
3) Emscripten
|
||||||
|
|
||||||
|
From the project root directory
|
||||||
|
|
||||||
|
```
|
||||||
|
thermion % ls -l
|
||||||
|
total 272
|
||||||
|
drwxr-xr-x 4 nickfisher staff 128 Jul 3 14:06 assets
|
||||||
|
-rw-r--r-- 1 nickfisher staff 84532 Jul 3 14:06 CHANGELOG.md
|
||||||
|
-rw-r--r-- 1 nickfisher staff 2349 Jul 3 14:06 Dockerfile
|
||||||
|
drwxr-xr-x 19 nickfisher staff 608 Jul 3 14:06 docs
|
||||||
|
-rw-r--r-- 1 nickfisher staff 748 Jul 3 14:06 docs.json
|
||||||
|
drwxr-xr-x 7 nickfisher staff 224 Jan 8 17:01 examples
|
||||||
|
-rw-r--r-- 1 nickfisher staff 11341 Oct 23 2024 LICENSE
|
||||||
|
-rw-r--r-- 1 nickfisher staff 2161 Jul 3 14:06 Makefile
|
||||||
|
drwxr-xr-x@ 13 nickfisher staff 416 Jul 3 14:06 materials
|
||||||
|
-rw-r--r--@ 1 nickfisher staff 517 Oct 23 2024 melos_thermion_workspace.iml
|
||||||
|
-rw-r--r-- 1 nickfisher staff 77 Oct 23 2024 melos.yaml
|
||||||
|
-rw-r--r--@ 1 nickfisher staff 9865 Jul 1 13:03 pubspec.lock
|
||||||
|
-rw-r--r-- 1 nickfisher staff 97 Jun 12 11:38 pubspec.yaml
|
||||||
|
-rw-r--r-- 1 nickfisher staff 3355 Jul 3 14:06 README.md
|
||||||
|
drwxr-xr-x@ 22 nickfisher staff 704 Jul 3 14:06 thermion_dart
|
||||||
|
drwxr-xr-x 7 nickfisher staff 224 Jul 3 14:06 thermion_flutter
|
||||||
|
thermion % make wasm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Flutter
|
||||||
|
|
||||||
|
Copy thermion_dart.js and thermion_dart.wasm to the `/web` folder for your target app.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
flutter run -d chrome --web-header Cross-Origin-Embedder-Policy=require-corp --web-header Cross-Origin-Opener-Policy=same-origin
|
||||||
|
```
|
||||||
@@ -1,32 +1,6 @@
|
|||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
## CMakeLists
|
If you're not a Thermion developer, you can ignore this.
|
||||||
|
|
||||||
You will need to disable the `/WX` compiler flag.
|
|
||||||
|
|
||||||
In your project, open the `windows/CMakeList.txt` file and find the following line:
|
|
||||||
|
|
||||||
`target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")`
|
|
||||||
|
|
||||||
Delete the `/WX`:
|
|
||||||
|
|
||||||
`target_compile_options(${TARGET} PRIVATE /W4 /wd"4100")`
|
|
||||||
|
|
||||||
|
|
||||||
## pubspec.yaml
|
|
||||||
|
|
||||||
On Windows, you will need to add a custom version of `native_toolchain_c` to your `dependency_overrides`. This is currently needed to link static libraries when building a DLL.
|
|
||||||
|
|
||||||
```
|
|
||||||
dependency_overrides:
|
|
||||||
native_toolchain_c:
|
|
||||||
git:
|
|
||||||
url: https://github.com/nmfisher/native.git
|
|
||||||
path: pkgs/native_toolchain_c
|
|
||||||
ref: windows_dll_fix
|
|
||||||
```
|
|
||||||
|
|
||||||
This will eventually be fixed upstream in the `native_toolchain_c` package, so this should be a short-term/temporary issue only.
|
|
||||||
|
|
||||||
## ANGLE build (not currently working)
|
## ANGLE build (not currently working)
|
||||||
To support embedding GPU textures in Flutter (rather than copying to a CPU pixel buffer on every frame), we need to build a slightly customized version of Filament that uses GLES on Windows (rather than the default, which uses OpenGL).
|
To support embedding GPU textures in Flutter (rather than copying to a CPU pixel buffer on every frame), we need to build a slightly customized version of Filament that uses GLES on Windows (rather than the default, which uses OpenGL).
|
||||||
|
|||||||
5
examples/README.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Thermion Examples
|
||||||
|
|
||||||
|
This repository contains example Dart and Flutter projects for the Thermion rendering toolkit.
|
||||||
|
|
||||||
|
|
||||||
BIN
examples/assets/BusterDrone/scene.bin
Normal file
11876
examples/assets/BusterDrone/scene.gltf
Normal file
BIN
examples/assets/BusterDrone/textures/Boden_baseColor.jpg
Normal file
|
After Width: | Height: | Size: 531 KiB |
BIN
examples/assets/BusterDrone/textures/Boden_metallicRoughness.jpg
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
examples/assets/BusterDrone/textures/Boden_normal.jpg
Normal file
|
After Width: | Height: | Size: 856 KiB |
BIN
examples/assets/BusterDrone/textures/body_baseColor.jpg
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
examples/assets/BusterDrone/textures/body_emissive.jpg
Normal file
|
After Width: | Height: | Size: 193 KiB |
BIN
examples/assets/BusterDrone/textures/body_metallicRoughness.jpg
Normal file
|
After Width: | Height: | Size: 3.7 MiB |
BIN
examples/assets/BusterDrone/textures/body_normal.jpg
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
examples/assets/BusterDrone/textures/material_baseColor.jpg
Normal file
|
After Width: | Height: | Size: 500 KiB |
|
After Width: | Height: | Size: 614 KiB |
BIN
examples/assets/BusterDrone/textures/material_normal.jpg
Normal file
|
After Width: | Height: | Size: 457 KiB |
BIN
examples/assets/FlightHelmet/FlightHelmet.bin
Normal file
755
examples/assets/FlightHelmet/FlightHelmet.gltf
Normal file
@@ -0,0 +1,755 @@
|
|||||||
|
{
|
||||||
|
"accessors": [
|
||||||
|
{
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 24408,
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 8468,
|
||||||
|
"type": "VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 8468,
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 8468,
|
||||||
|
"type": "VEC4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 8468,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.131662,
|
||||||
|
0.137638986,
|
||||||
|
0.10078799
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.131333,
|
||||||
|
-0.028128,
|
||||||
|
-0.137763992
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 65688,
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 12552,
|
||||||
|
"type": "VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 12552,
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 12552,
|
||||||
|
"type": "VEC4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 12552,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.11722149,
|
||||||
|
0.196387976,
|
||||||
|
0.132422984
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.11722149,
|
||||||
|
-0.196387976,
|
||||||
|
-0.132422984
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 2208,
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 436,
|
||||||
|
"type": "VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 436,
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 436,
|
||||||
|
"type": "VEC4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 436,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.09527509,
|
||||||
|
0.114654,
|
||||||
|
-0.08429489
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.0952748954,
|
||||||
|
0.0551489964,
|
||||||
|
-0.14295499
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 60288,
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 17186,
|
||||||
|
"type": "VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 17186,
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 17186,
|
||||||
|
"type": "VEC4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 17186,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.1572095,
|
||||||
|
0.2716865,
|
||||||
|
0.162181988
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.1572095,
|
||||||
|
-0.2716865,
|
||||||
|
-0.162181988
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5123,
|
||||||
|
"count": 131574,
|
||||||
|
"type": "SCALAR"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24148,
|
||||||
|
"type": "VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24148,
|
||||||
|
"type": "VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24148,
|
||||||
|
"type": "VEC4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"componentType": 5126,
|
||||||
|
"count": 24148,
|
||||||
|
"type": "VEC3",
|
||||||
|
"max": [
|
||||||
|
0.1504075,
|
||||||
|
0.328366965,
|
||||||
|
0.173673
|
||||||
|
],
|
||||||
|
"min": [
|
||||||
|
-0.1504075,
|
||||||
|
-0.328366965,
|
||||||
|
-0.173673
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"asset": {
|
||||||
|
"generator": "glTF Tools for Unity",
|
||||||
|
"version": "2.0"
|
||||||
|
},
|
||||||
|
"bufferViews": [
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 0,
|
||||||
|
"byteLength": 59806
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 59808,
|
||||||
|
"byteLength": 99674
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 159484,
|
||||||
|
"byteLength": 4875
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 164360,
|
||||||
|
"byteLength": 133545
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer": 0,
|
||||||
|
"byteOffset": 297908,
|
||||||
|
"byteLength": 203914
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buffers": [
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet",
|
||||||
|
"byteLength": 501824,
|
||||||
|
"uri": "FlightHelmet.bin"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"images": [
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_baseColor",
|
||||||
|
"uri": "FlightHelmet_baseColor.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_occlusionRoughnessMetallic",
|
||||||
|
"uri": "FlightHelmet_occlusionRoughnessMetallic.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_normal",
|
||||||
|
"uri": "FlightHelmet_normal.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_baseColor1",
|
||||||
|
"uri": "FlightHelmet_baseColor1.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_occlusionRoughnessMetallic1",
|
||||||
|
"uri": "FlightHelmet_occlusionRoughnessMetallic1.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_normal1",
|
||||||
|
"uri": "FlightHelmet_normal1.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_baseColor2",
|
||||||
|
"uri": "FlightHelmet_baseColor2.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_occlusionRoughnessMetallic2",
|
||||||
|
"uri": "FlightHelmet_occlusionRoughnessMetallic2.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_normal2",
|
||||||
|
"uri": "FlightHelmet_normal2.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_baseColor3",
|
||||||
|
"uri": "FlightHelmet_baseColor3.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_occlusionRoughnessMetallic3",
|
||||||
|
"uri": "FlightHelmet_occlusionRoughnessMetallic3.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_normal3",
|
||||||
|
"uri": "FlightHelmet_normal3.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_baseColor4",
|
||||||
|
"uri": "FlightHelmet_baseColor4.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_occlusionRoughnessMetallic4",
|
||||||
|
"uri": "FlightHelmet_occlusionRoughnessMetallic4.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "FlightHelmet_normal4",
|
||||||
|
"uri": "FlightHelmet_normal4.png"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 1,
|
||||||
|
"NORMAL": 2,
|
||||||
|
"TANGENT": 3,
|
||||||
|
"POSITION": 4
|
||||||
|
},
|
||||||
|
"indices": 0,
|
||||||
|
"material": 0,
|
||||||
|
"mode": 4,
|
||||||
|
"extensions": {
|
||||||
|
"KHR_draco_mesh_compression": {
|
||||||
|
"bufferView": 0,
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "GlassPlastic_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 6,
|
||||||
|
"NORMAL": 7,
|
||||||
|
"TANGENT": 8,
|
||||||
|
"POSITION": 9
|
||||||
|
},
|
||||||
|
"indices": 5,
|
||||||
|
"material": 1,
|
||||||
|
"mode": 4,
|
||||||
|
"extensions": {
|
||||||
|
"KHR_draco_mesh_compression": {
|
||||||
|
"bufferView": 1,
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "LeatherParts_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 11,
|
||||||
|
"NORMAL": 12,
|
||||||
|
"TANGENT": 13,
|
||||||
|
"POSITION": 14
|
||||||
|
},
|
||||||
|
"indices": 10,
|
||||||
|
"material": 2,
|
||||||
|
"mode": 4,
|
||||||
|
"extensions": {
|
||||||
|
"KHR_draco_mesh_compression": {
|
||||||
|
"bufferView": 2,
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "Lenses_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 16,
|
||||||
|
"NORMAL": 17,
|
||||||
|
"TANGENT": 18,
|
||||||
|
"POSITION": 19
|
||||||
|
},
|
||||||
|
"indices": 15,
|
||||||
|
"material": 3,
|
||||||
|
"mode": 4,
|
||||||
|
"extensions": {
|
||||||
|
"KHR_draco_mesh_compression": {
|
||||||
|
"bufferView": 3,
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "MetalParts_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"primitives": [
|
||||||
|
{
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 21,
|
||||||
|
"NORMAL": 22,
|
||||||
|
"TANGENT": 23,
|
||||||
|
"POSITION": 24
|
||||||
|
},
|
||||||
|
"indices": 20,
|
||||||
|
"material": 4,
|
||||||
|
"mode": 4,
|
||||||
|
"extensions": {
|
||||||
|
"KHR_draco_mesh_compression": {
|
||||||
|
"bufferView": 4,
|
||||||
|
"attributes": {
|
||||||
|
"TEXCOORD_0": 0,
|
||||||
|
"NORMAL": 1,
|
||||||
|
"TANGENT": 2,
|
||||||
|
"POSITION": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "RubberWood_low"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 0,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 1,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"baseColorFactor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor": 1,
|
||||||
|
"roughnessFactor": 1
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 2,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"occlusionTexture": {
|
||||||
|
"index": 1,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"name": "GlassPlasticMat",
|
||||||
|
"emissiveFactor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"alphaMode": "OPAQUE",
|
||||||
|
"doubleSided": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 3,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 4,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"baseColorFactor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor": 1,
|
||||||
|
"roughnessFactor": 1
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 5,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"occlusionTexture": {
|
||||||
|
"index": 4,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"name": "LeatherPartsMat",
|
||||||
|
"emissiveFactor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"alphaMode": "OPAQUE",
|
||||||
|
"doubleSided": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 6,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 7,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"baseColorFactor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor": 1,
|
||||||
|
"roughnessFactor": 1
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 8,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"occlusionTexture": {
|
||||||
|
"index": 7,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"alphaMode": "BLEND",
|
||||||
|
"name": "LensesMat",
|
||||||
|
"emissiveFactor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doubleSided": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 9,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 10,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"baseColorFactor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor": 1,
|
||||||
|
"roughnessFactor": 1
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 11,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"occlusionTexture": {
|
||||||
|
"index": 10,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"name": "MetalPartsMat",
|
||||||
|
"emissiveFactor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"alphaMode": "OPAQUE",
|
||||||
|
"doubleSided": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"doubleSided": true,
|
||||||
|
"pbrMetallicRoughness": {
|
||||||
|
"baseColorTexture": {
|
||||||
|
"index": 12,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"metallicRoughnessTexture": {
|
||||||
|
"index": 13,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"baseColorFactor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor": 1,
|
||||||
|
"roughnessFactor": 1
|
||||||
|
},
|
||||||
|
"normalTexture": {
|
||||||
|
"index": 14,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"occlusionTexture": {
|
||||||
|
"index": 13,
|
||||||
|
"texCoord": 0
|
||||||
|
},
|
||||||
|
"name": "RubberWoodMat",
|
||||||
|
"emissiveFactor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"alphaMode": "OPAQUE"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"mesh": 0,
|
||||||
|
"name": "GlassPlastic_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 1,
|
||||||
|
"translation": [
|
||||||
|
0.000434499962,
|
||||||
|
0.032592997,
|
||||||
|
0.011676996
|
||||||
|
],
|
||||||
|
"name": "LeatherParts_low",
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 2,
|
||||||
|
"name": "Lenses_low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 3,
|
||||||
|
"translation": [
|
||||||
|
0.0331545,
|
||||||
|
-0.1488645,
|
||||||
|
-0.0242879968
|
||||||
|
],
|
||||||
|
"name": "MetalParts_low",
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mesh": 4,
|
||||||
|
"translation": [
|
||||||
|
-0.00190849893,
|
||||||
|
-0.111985,
|
||||||
|
-0.013313001
|
||||||
|
],
|
||||||
|
"name": "RubberWood_low",
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"children": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"name": "FlightHelmet",
|
||||||
|
"translation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scale": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scene": 0,
|
||||||
|
"scenes": [
|
||||||
|
{
|
||||||
|
"nodes": [
|
||||||
|
5
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"textures": [
|
||||||
|
{
|
||||||
|
"source": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 6
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 8
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 11
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 12
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 13
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": 14
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"extensionsRequired": [
|
||||||
|
"KHR_draco_mesh_compression"
|
||||||
|
],
|
||||||
|
"extensionsUsed": [
|
||||||
|
"KHR_draco_mesh_compression"
|
||||||
|
]
|
||||||
|
}
|
||||||
BIN
examples/assets/FlightHelmet/FlightHelmet_baseColor.png
Normal file
|
After Width: | Height: | Size: 2.6 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_baseColor1.png
Normal file
|
After Width: | Height: | Size: 5.1 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_baseColor2.png
Normal file
|
After Width: | Height: | Size: 806 KiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_baseColor3.png
Normal file
|
After Width: | Height: | Size: 2.9 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_baseColor4.png
Normal file
|
After Width: | Height: | Size: 3.8 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_normal.png
Normal file
|
After Width: | Height: | Size: 3.0 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_normal1.png
Normal file
|
After Width: | Height: | Size: 5.4 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_normal2.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_normal3.png
Normal file
|
After Width: | Height: | Size: 3.5 MiB |
BIN
examples/assets/FlightHelmet/FlightHelmet_normal4.png
Normal file
|
After Width: | Height: | Size: 3.5 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 5.1 MiB |
|
After Width: | Height: | Size: 737 KiB |
|
After Width: | Height: | Size: 3.6 MiB |
|
After Width: | Height: | Size: 4.3 MiB |
16
examples/assets/FlightHelmet/README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Flight Helmet
|
||||||
|
|
||||||
|
## Screenshot
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## License Information
|
||||||
|
|
||||||
|
Donated by Microsoft for glTF testing
|
||||||
|
|
||||||
|
[](http://creativecommons.org/publicdomain/zero/1.0/)
|
||||||
|
To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset.
|
||||||
|
|
||||||
|
Draco compression was done via Cesium tools on 27-03-2020 as follows.
|
||||||
|
|
||||||
|
gltf-pipeline -i FlightHelmet.gltf -o FlightHelmet.gltf -d -s --keep-unused-elements
|
||||||
BIN
examples/assets/background.ktx
Normal file
BIN
examples/assets/background.png
Normal file
|
After Width: | Height: | Size: 572 KiB |
BIN
examples/assets/cube.bin
Normal file
121
examples/assets/cube.gltf
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
{
|
||||||
|
"asset":{
|
||||||
|
"generator":"Khronos glTF Blender I/O v4.2.60",
|
||||||
|
"version":"2.0"
|
||||||
|
},
|
||||||
|
"scene":0,
|
||||||
|
"scenes":[
|
||||||
|
{
|
||||||
|
"name":"Scene",
|
||||||
|
"nodes":[
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nodes":[
|
||||||
|
{
|
||||||
|
"mesh":0,
|
||||||
|
"name":"Cube"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"materials":[
|
||||||
|
{
|
||||||
|
"doubleSided":true,
|
||||||
|
"name":"Material",
|
||||||
|
"pbrMetallicRoughness":{
|
||||||
|
"baseColorFactor":[
|
||||||
|
0.800000011920929,
|
||||||
|
0.800000011920929,
|
||||||
|
0.800000011920929,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"metallicFactor":0,
|
||||||
|
"roughnessFactor":0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meshes":[
|
||||||
|
{
|
||||||
|
"name":"Cube",
|
||||||
|
"primitives":[
|
||||||
|
{
|
||||||
|
"attributes":{
|
||||||
|
"POSITION":0,
|
||||||
|
"NORMAL":1,
|
||||||
|
"TEXCOORD_0":2
|
||||||
|
},
|
||||||
|
"indices":3,
|
||||||
|
"material":0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"accessors":[
|
||||||
|
{
|
||||||
|
"bufferView":0,
|
||||||
|
"componentType":5126,
|
||||||
|
"count":24,
|
||||||
|
"max":[
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"min":[
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
"type":"VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView":1,
|
||||||
|
"componentType":5126,
|
||||||
|
"count":24,
|
||||||
|
"type":"VEC3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView":2,
|
||||||
|
"componentType":5126,
|
||||||
|
"count":24,
|
||||||
|
"type":"VEC2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"bufferView":3,
|
||||||
|
"componentType":5123,
|
||||||
|
"count":36,
|
||||||
|
"type":"SCALAR"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"bufferViews":[
|
||||||
|
{
|
||||||
|
"buffer":0,
|
||||||
|
"byteLength":288,
|
||||||
|
"byteOffset":0,
|
||||||
|
"target":34962
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer":0,
|
||||||
|
"byteLength":288,
|
||||||
|
"byteOffset":288,
|
||||||
|
"target":34962
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer":0,
|
||||||
|
"byteLength":192,
|
||||||
|
"byteOffset":576,
|
||||||
|
"target":34962
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"buffer":0,
|
||||||
|
"byteLength":72,
|
||||||
|
"byteOffset":768,
|
||||||
|
"target":34963
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buffers":[
|
||||||
|
{
|
||||||
|
"byteLength":840,
|
||||||
|
"uri":"cube.bin"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
183
examples/assets/cube_texture2.svg
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="200"
|
||||||
|
height="200"
|
||||||
|
viewBox="0 0 1 1"
|
||||||
|
version="1.1"
|
||||||
|
id="svg10"
|
||||||
|
sodipodi:docname="cube_texture2.svg"
|
||||||
|
inkscape:export-filename="cube_texture_512x512.png"
|
||||||
|
inkscape:export-xdpi="245.75999"
|
||||||
|
inkscape:export-ydpi="245.75999"
|
||||||
|
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#000000"
|
||||||
|
borderopacity="0.25"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:zoom="1.5185118"
|
||||||
|
inkscape:cx="255.18405"
|
||||||
|
inkscape:cy="172.86662"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="964"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="25"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg10"
|
||||||
|
showgrid="false" />
|
||||||
|
<!-- Background Grid (optional, for visual aid) -->
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
width="1"
|
||||||
|
height="1"
|
||||||
|
fill="#f0f0f0"
|
||||||
|
id="rect1" />
|
||||||
|
<line
|
||||||
|
x1="0.333"
|
||||||
|
y1="0"
|
||||||
|
x2="0.333"
|
||||||
|
y2="1"
|
||||||
|
stroke="#ccc"
|
||||||
|
stroke-width="0.005"
|
||||||
|
id="line1" />
|
||||||
|
<line
|
||||||
|
x1="0.666"
|
||||||
|
y1="0"
|
||||||
|
x2="0.666"
|
||||||
|
y2="1"
|
||||||
|
stroke="#ccc"
|
||||||
|
stroke-width="0.005"
|
||||||
|
id="line2" />
|
||||||
|
<line
|
||||||
|
y1="0.25"
|
||||||
|
x1="0"
|
||||||
|
y2="0.25"
|
||||||
|
x2="1"
|
||||||
|
stroke="#ccc"
|
||||||
|
stroke-width="0.005"
|
||||||
|
id="line3" />
|
||||||
|
<line
|
||||||
|
y1="0.5"
|
||||||
|
x1="0"
|
||||||
|
y2="0.5"
|
||||||
|
x2="1"
|
||||||
|
stroke="#ccc"
|
||||||
|
stroke-width="0.005"
|
||||||
|
id="line4" />
|
||||||
|
<line
|
||||||
|
y1="0.75"
|
||||||
|
x1="0"
|
||||||
|
y2="0.75"
|
||||||
|
x2="1"
|
||||||
|
stroke="#ccc"
|
||||||
|
stroke-width="0.005"
|
||||||
|
id="line5" />
|
||||||
|
<!-- Front Face -->
|
||||||
|
<rect
|
||||||
|
x="0.333"
|
||||||
|
y="0"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#ff0000"
|
||||||
|
id="rect5" />
|
||||||
|
<text
|
||||||
|
x="0.5"
|
||||||
|
y="0.125"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.1"
|
||||||
|
fill="white"
|
||||||
|
id="text5">Front</text>
|
||||||
|
<!-- Back Face -->
|
||||||
|
<rect
|
||||||
|
x="0.333"
|
||||||
|
y="0.5"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#00ff00"
|
||||||
|
id="rect6" />
|
||||||
|
<text
|
||||||
|
x="0.5"
|
||||||
|
y="0.625"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.1"
|
||||||
|
fill="white"
|
||||||
|
id="text6">Back</text>
|
||||||
|
<!-- Top Face -->
|
||||||
|
<rect
|
||||||
|
x="0.666"
|
||||||
|
y="0.25"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#0000ff"
|
||||||
|
id="rect7" />
|
||||||
|
<text
|
||||||
|
x="0.833"
|
||||||
|
y="0.375"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.1"
|
||||||
|
fill="white"
|
||||||
|
id="text7">Top</text>
|
||||||
|
<!-- Bottom Face -->
|
||||||
|
<rect
|
||||||
|
x="0"
|
||||||
|
y="0.25"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#ffff00"
|
||||||
|
id="rect8" />
|
||||||
|
<text
|
||||||
|
x="0.15610458"
|
||||||
|
y="0.37936932"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.0733811px"
|
||||||
|
fill="#000000"
|
||||||
|
id="text8"
|
||||||
|
style="stroke-width:0.733811">Bottom</text>
|
||||||
|
<!-- Right Face -->
|
||||||
|
<rect
|
||||||
|
x="0.333"
|
||||||
|
y="0.25"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#ff00ff"
|
||||||
|
id="rect9" />
|
||||||
|
<text
|
||||||
|
x="0.5"
|
||||||
|
y="0.375"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.1"
|
||||||
|
fill="white"
|
||||||
|
id="text9">Right</text>
|
||||||
|
<!-- Left Face -->
|
||||||
|
<rect
|
||||||
|
x="0.333"
|
||||||
|
y="0.75"
|
||||||
|
width="0.333"
|
||||||
|
height="0.25"
|
||||||
|
fill="#00ffff"
|
||||||
|
id="rect10" />
|
||||||
|
<text
|
||||||
|
x="0.5"
|
||||||
|
y="0.875"
|
||||||
|
text-anchor="middle"
|
||||||
|
dominant-baseline="middle"
|
||||||
|
font-size="0.1"
|
||||||
|
fill="black"
|
||||||
|
id="text10">Left</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
BIN
examples/assets/cube_with_morph_targets.glb
Normal file
BIN
examples/assets/green_12x12.png
Normal file
|
After Width: | Height: | Size: 312 B |
BIN
examples/assets/red_24x24.png
Normal file
|
After Width: | Height: | Size: 313 B |
BIN
examples/assets/solidcolor.filamat
Normal file
14
examples/assets/solidcolor.mat
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
material {
|
||||||
|
name : SolidColor,
|
||||||
|
shadingModel : unlit,
|
||||||
|
culling : none,
|
||||||
|
featureLevel : 1,
|
||||||
|
vertexDomain: object
|
||||||
|
}
|
||||||
|
|
||||||
|
fragment {
|
||||||
|
void material(inout MaterialInputs material) {
|
||||||
|
prepareMaterial(material);
|
||||||
|
material.baseColor = vec4(0.1f, 0.5f, 0.9f, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
4
examples/dart/cli_headless/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# https://dart.dev/guides/libraries/private-files
|
||||||
|
# Created by `dart pub`
|
||||||
|
.dart_tool/
|
||||||
|
output/**
|
||||||
3
examples/dart/cli_headless/CHANGELOG.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## 1.0.0
|
||||||
|
|
||||||
|
- Initial version.
|
||||||
9
examples/dart/cli_headless/README.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# cli_headless
|
||||||
|
|
||||||
|
A simple headless Dart CLI app using Thermion to render to a bitmap.
|
||||||
|
|
||||||
|
To run:
|
||||||
|
`dart --enable-experiment=native-assets run bin/example.dart`
|
||||||
|
|
||||||
|
Currently, this will probably only work on a non-virtualized macOS host.
|
||||||
|
|
||||||
30
examples/dart/cli_headless/analysis_options.yaml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# This file configures the static analysis results for your project (errors,
|
||||||
|
# warnings, and lints).
|
||||||
|
#
|
||||||
|
# This enables the 'recommended' set of lints from `package:lints`.
|
||||||
|
# This set helps identify many issues that may lead to problems when running
|
||||||
|
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
|
||||||
|
# style and format.
|
||||||
|
#
|
||||||
|
# If you want a smaller set of lints you can change this to specify
|
||||||
|
# 'package:lints/core.yaml'. These are just the most critical lints
|
||||||
|
# (the recommended set includes the core lints).
|
||||||
|
# The core lints are also what is used by pub.dev for scoring packages.
|
||||||
|
|
||||||
|
include: package:lints/recommended.yaml
|
||||||
|
|
||||||
|
# Uncomment the following section to specify additional rules.
|
||||||
|
|
||||||
|
# linter:
|
||||||
|
# rules:
|
||||||
|
# - camel_case_types
|
||||||
|
|
||||||
|
# analyzer:
|
||||||
|
# exclude:
|
||||||
|
# - path/to/excluded/files/**
|
||||||
|
|
||||||
|
# For more information about the core and recommended set of lints, see
|
||||||
|
# https://dart.dev/go/core-lints
|
||||||
|
|
||||||
|
# For additional information about configuring this file, see
|
||||||
|
# https://dart.dev/guides/language/analysis-options
|
||||||
32
examples/dart/cli_headless/bin/example.dart
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
import 'dart:isolate';
|
||||||
|
|
||||||
|
import 'package:thermion_dart/thermion_dart.dart';
|
||||||
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart';
|
||||||
|
|
||||||
|
void main() async {
|
||||||
|
await FFIFilamentApp.create();
|
||||||
|
final (width, height) = (500, 500);
|
||||||
|
final sc = await FilamentApp.instance!.createHeadlessSwapChain(width, height);
|
||||||
|
var viewer = ThermionViewerFFI();
|
||||||
|
await viewer.initialized;
|
||||||
|
|
||||||
|
await FilamentApp.instance!.register(sc, viewer.view);
|
||||||
|
|
||||||
|
await viewer.view.setFrustumCullingEnabled(false);
|
||||||
|
await viewer.setBackgroundColor(1, 0, 1, 1);
|
||||||
|
await viewer.setViewport(width, height);
|
||||||
|
final result = await FilamentApp.instance!.capture(
|
||||||
|
sc,
|
||||||
|
view: viewer.view,
|
||||||
|
);
|
||||||
|
|
||||||
|
final bitmap = await pixelBufferToBmp(result.first.$2, width, height,
|
||||||
|
hasAlpha: true, isFloat: true);
|
||||||
|
|
||||||
|
var outfile = File("output/render.bmp");
|
||||||
|
outfile.parent.create();
|
||||||
|
outfile.writeAsBytesSync(bitmap);
|
||||||
|
await FilamentApp.instance!.destroy();
|
||||||
|
Isolate.current.kill();
|
||||||
|
}
|
||||||
21
examples/dart/cli_headless/pubspec.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
name: example_cli
|
||||||
|
description: A sample command-line application.
|
||||||
|
version: 1.0.0
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ^3.3.0
|
||||||
|
|
||||||
|
hooks:
|
||||||
|
user_defines:
|
||||||
|
thermion_dart:
|
||||||
|
mode: debug
|
||||||
|
tracing: enabled
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
thermion_dart:
|
||||||
|
path: ../../../thermion_dart
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
ffigen: ^11.0.0
|
||||||
|
lints: ^3.0.0
|
||||||
|
test: ^1.24.0
|
||||||
3
examples/dart/cli_windows/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# https://dart.dev/guides/libraries/private-files
|
||||||
|
# Created by `dart pub`
|
||||||
|
.dart_tool/
|
||||||
3
examples/dart/cli_windows/CHANGELOG.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## 1.0.0
|
||||||
|
|
||||||
|
- Initial version.
|
||||||
7
examples/dart/cli_windows/README.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Thermion Example - Dart/Windows-only (no Flutter)
|
||||||
|
|
||||||
|
A (Windows-only) command-line application that renders into a window without Flutter.
|
||||||
|
|
||||||
|
```
|
||||||
|
dart --enable-experiment=native-assets bin\cli_windows.dart
|
||||||
|
```
|
||||||
30
examples/dart/cli_windows/analysis_options.yaml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# This file configures the static analysis results for your project (errors,
|
||||||
|
# warnings, and lints).
|
||||||
|
#
|
||||||
|
# This enables the 'recommended' set of lints from `package:lints`.
|
||||||
|
# This set helps identify many issues that may lead to problems when running
|
||||||
|
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
|
||||||
|
# style and format.
|
||||||
|
#
|
||||||
|
# If you want a smaller set of lints you can change this to specify
|
||||||
|
# 'package:lints/core.yaml'. These are just the most critical lints
|
||||||
|
# (the recommended set includes the core lints).
|
||||||
|
# The core lints are also what is used by pub.dev for scoring packages.
|
||||||
|
|
||||||
|
include: package:lints/recommended.yaml
|
||||||
|
|
||||||
|
# Uncomment the following section to specify additional rules.
|
||||||
|
|
||||||
|
# linter:
|
||||||
|
# rules:
|
||||||
|
# - camel_case_types
|
||||||
|
|
||||||
|
# analyzer:
|
||||||
|
# exclude:
|
||||||
|
# - path/to/excluded/files/**
|
||||||
|
|
||||||
|
# For more information about the core and recommended set of lints, see
|
||||||
|
# https://dart.dev/go/core-lints
|
||||||
|
|
||||||
|
# For additional information about configuring this file, see
|
||||||
|
# https://dart.dev/guides/language/analysis-options
|
||||||
54
examples/dart/cli_windows/bin/cli_windows.dart
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import 'dart:ffi';
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
|
import 'package:ffi/ffi.dart';
|
||||||
|
import 'package:thermion_dart/src/viewer/src/ffi/src/ffi_filament_app.dart';
|
||||||
|
import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_viewer_ffi.dart';
|
||||||
|
import 'package:thermion_dart/src/viewer/src/ffi/src/thermion_dart.g.dart';
|
||||||
|
import 'package:thermion_dart/thermion_dart.dart';
|
||||||
|
import 'package:vector_math/vector_math_64.dart';
|
||||||
|
import 'package:cli_windows/thermion_window.g.dart';
|
||||||
|
|
||||||
|
void main(List<String> arguments) async {
|
||||||
|
var hwnd = create_thermion_window(500, 500, 0, 0);
|
||||||
|
update();
|
||||||
|
await FFIFilamentApp.create();
|
||||||
|
var viewer = ThermionViewerFFI(
|
||||||
|
loadAssetFromUri: (path) async => File(path.replaceAll("file://", "")).readAsBytesSync());
|
||||||
|
|
||||||
|
await viewer.initialized;
|
||||||
|
var swapChain = await FilamentApp.instance!.createSwapChain(Pointer<Void>.fromAddress(hwnd));
|
||||||
|
var view = viewer.view;
|
||||||
|
await view.setViewport(500, 500);
|
||||||
|
var camera = await viewer.getActiveCamera();
|
||||||
|
await camera.setLensProjection();
|
||||||
|
await FilamentApp.instance!.register(swapChain, view);
|
||||||
|
|
||||||
|
await viewer.setBackgroundColor(1.0, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
var skyboxPath = File("..\\..\\assets\\default_env_skybox.ktx").absolute;
|
||||||
|
await viewer.loadSkybox("file://${skyboxPath.uri.toFilePath(windows: true)}");
|
||||||
|
|
||||||
|
final cube = await viewer.createGeometry(GeometryHelper.cube());
|
||||||
|
|
||||||
|
var stopwatch = Stopwatch();
|
||||||
|
stopwatch.start();
|
||||||
|
|
||||||
|
var last = 0;
|
||||||
|
|
||||||
|
await camera.lookAt(Vector3(0, 0, 10));
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
var angle = (stopwatch.elapsedMilliseconds / 1000) * 2 * pi;
|
||||||
|
var rotation = Quaternion.axisAngle(Vector3(0,1,0), angle);
|
||||||
|
var position = Vector3(10 * sin(angle), 0, 10 * cos(angle));
|
||||||
|
var modelMatrix = Matrix4.compose(position, rotation, Vector3.all(1));
|
||||||
|
await camera.setModelMatrix(modelMatrix);
|
||||||
|
await FilamentApp.instance!.requestFrame();
|
||||||
|
update();
|
||||||
|
await Future.delayed(Duration(milliseconds: 17));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
32
examples/dart/cli_windows/hook/build.dart
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:native_assets_cli/native_assets_cli.dart';
|
||||||
|
import 'package:native_toolchain_c/native_toolchain_c.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
|
||||||
|
void main(List<String> args) async {
|
||||||
|
final logger = Logger("")
|
||||||
|
..level = Level.ALL
|
||||||
|
..onRecord.listen((record) => print(
|
||||||
|
record.message + "\n"));
|
||||||
|
await build(args, (input, output) async {
|
||||||
|
final cbuilder = CBuilder.library(
|
||||||
|
name: input.packageName,
|
||||||
|
language: Language.cpp,
|
||||||
|
assetName: 'cli_windows.dart',
|
||||||
|
sources: ['native/thermion_window.cpp'],
|
||||||
|
includes: ['native', '../../../thermion_dart/native/include'],
|
||||||
|
defines: {"UNICODE":"1"},
|
||||||
|
flags:[],
|
||||||
|
dartBuildFiles: ['hook/build.dart'],
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
|
await cbuilder.run(
|
||||||
|
input: input,
|
||||||
|
output: output,
|
||||||
|
logger: logger,
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
19
examples/dart/cli_windows/lib/thermion_window.g.dart
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// AUTO GENERATED FILE, DO NOT EDIT.
|
||||||
|
//
|
||||||
|
// Generated by `package:ffigen`.
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
@ffi.DefaultAsset('package:cli_windows/cli_windows.dart')
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'dart:ffi' as ffi;
|
||||||
|
|
||||||
|
@ffi.Native<ffi.Int Function(ffi.Int, ffi.Int, ffi.Int, ffi.Int)>(isLeaf: true)
|
||||||
|
external int create_thermion_window(
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
int left,
|
||||||
|
int top,
|
||||||
|
);
|
||||||
|
|
||||||
|
@ffi.Native<ffi.Void Function()>(isLeaf: true)
|
||||||
|
external void update();
|
||||||
390
examples/dart/cli_windows/native/thermion_window.cpp
Normal file
@@ -0,0 +1,390 @@
|
|||||||
|
#pragma comment(lib, "dwmapi.lib")
|
||||||
|
#pragma comment(lib, "comctl32.lib")
|
||||||
|
#pragma comment(lib, "Shlwapi.lib")
|
||||||
|
#pragma comment(lib, "opengl32.lib")
|
||||||
|
#pragma comment(lib, "Gdi32.lib")
|
||||||
|
#pragma comment(lib, "User32.lib")
|
||||||
|
#pragma comment(lib, "dxgi.lib")
|
||||||
|
|
||||||
|
#include <dxgi.h>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <chrono>
|
||||||
|
#include <thread>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <dwmapi.h>
|
||||||
|
#include <ShObjIdl.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include "thermion_window.h"
|
||||||
|
|
||||||
|
namespace thermion {
|
||||||
|
|
||||||
|
void PrintDefaultGPU() {
|
||||||
|
IDXGIFactory* factory = nullptr;
|
||||||
|
CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
|
||||||
|
|
||||||
|
IDXGIAdapter* adapter = nullptr;
|
||||||
|
factory->EnumAdapters(0, &adapter); // 0 is the default adapter
|
||||||
|
|
||||||
|
DXGI_ADAPTER_DESC desc;
|
||||||
|
adapter->GetDesc(&desc);
|
||||||
|
|
||||||
|
std::wcout << L"GPU: " << desc.Description << std::endl;
|
||||||
|
|
||||||
|
adapter->Release();
|
||||||
|
factory->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Instantiating a ThermionWindow creates a HWND that can be passed
|
||||||
|
/// to Filament to create a swapchain.
|
||||||
|
///
|
||||||
|
///
|
||||||
|
class ThermionWindow {
|
||||||
|
public:
|
||||||
|
ThermionWindow(
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
int left,
|
||||||
|
int top);
|
||||||
|
HWND GetHandle();
|
||||||
|
void Resize(int width, int height, int left, int top);
|
||||||
|
uint32_t _width = 0;
|
||||||
|
uint32_t _height = 0;
|
||||||
|
uint32_t _left = 0;
|
||||||
|
uint32_t _top = 0;
|
||||||
|
private:
|
||||||
|
HWND _windowHandle;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
static ThermionWindow* _window;
|
||||||
|
|
||||||
|
|
||||||
|
static bool _running = false;
|
||||||
|
static std::thread _renderThread;
|
||||||
|
|
||||||
|
// Add these for timing and stats
|
||||||
|
static int _frameCount = 0;
|
||||||
|
static std::chrono::time_point<std::chrono::steady_clock> _lastFpsLog;
|
||||||
|
|
||||||
|
static void RenderLoop() {
|
||||||
|
_lastFpsLog = std::chrono::steady_clock::now();
|
||||||
|
auto lastFrame = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
while (_running) {
|
||||||
|
auto now = std::chrono::steady_clock::now();
|
||||||
|
auto frameDuration = std::chrono::duration_cast<std::chrono::microseconds>(now - lastFrame).count();
|
||||||
|
|
||||||
|
// Force a redraw
|
||||||
|
InvalidateRect(_window->GetHandle(), NULL, FALSE);
|
||||||
|
|
||||||
|
// Process any pending messages
|
||||||
|
MSG msg;
|
||||||
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||||
|
if (msg.message == WM_QUIT) {
|
||||||
|
_running = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TranslateMessage(&msg);
|
||||||
|
DispatchMessage(&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for vsync
|
||||||
|
DwmFlush();
|
||||||
|
|
||||||
|
// Update timing stats
|
||||||
|
lastFrame = now;
|
||||||
|
_frameCount++;
|
||||||
|
|
||||||
|
// Log FPS every second
|
||||||
|
auto timeSinceLastLog = std::chrono::duration_cast<std::chrono::milliseconds>(now - _lastFpsLog).count();
|
||||||
|
if (timeSinceLastLog >= 1000) { // Every second
|
||||||
|
float fps = (_frameCount * 1000.0f) / timeSinceLastLog;
|
||||||
|
float avgFrameTime = timeSinceLastLog / (float)_frameCount;
|
||||||
|
std::cout << "FPS: " << fps << " Frame Time: " << avgFrameTime << "ms"
|
||||||
|
<< " Last Frame: " << frameDuration / 1000.0f << "ms" << std::endl;
|
||||||
|
|
||||||
|
_frameCount = 0;
|
||||||
|
_lastFpsLog = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
EMSCRIPTEN_KEEPALIVE intptr_t create_thermion_window(int width, int height, int left, int top) {
|
||||||
|
_window = new ThermionWindow(width, height, left, top);
|
||||||
|
|
||||||
|
// Start the render thread
|
||||||
|
_running = true;
|
||||||
|
_renderThread = std::thread(RenderLoop);
|
||||||
|
|
||||||
|
return (intptr_t)_window->GetHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update function can now be simplified or removed since rendering happens in the thread
|
||||||
|
EMSCRIPTEN_KEEPALIVE void update() {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a cleanup function
|
||||||
|
EMSCRIPTEN_KEEPALIVE void cleanup() {
|
||||||
|
_running = false;
|
||||||
|
if (_renderThread.joinable()) {
|
||||||
|
_renderThread.join();
|
||||||
|
}
|
||||||
|
if (_window) {
|
||||||
|
delete _window;
|
||||||
|
_window = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static constexpr auto kClassName = L"THERMION_WINDOW";
|
||||||
|
static constexpr auto kWindowName = L"thermion_window";
|
||||||
|
static bool was_window_hidden_due_to_minimize_ = false;
|
||||||
|
static WPARAM last_wm_size_wparam_ = SIZE_RESTORED;
|
||||||
|
uint64_t last_thread_time_ = 0;
|
||||||
|
static constexpr auto kNativeViewPositionAndShowDelay = 300;
|
||||||
|
|
||||||
|
typedef enum _WINDOWCOMPOSITIONATTRIB {
|
||||||
|
WCA_UNDEFINED = 0,
|
||||||
|
WCA_NCRENDERING_ENABLED = 1,
|
||||||
|
WCA_NCRENDERING_POLICY = 2,
|
||||||
|
WCA_TRANSITIONS_FORCEDISABLED = 3,
|
||||||
|
WCA_ALLOW_NCPAINT = 4,
|
||||||
|
WCA_CAPTION_BUTTON_BOUNDS = 5,
|
||||||
|
WCA_NONCLIENT_RTL_LAYOUT = 6,
|
||||||
|
WCA_FORCE_ICONIC_REPRESENTATION = 7,
|
||||||
|
WCA_EXTENDED_FRAME_BOUNDS = 8,
|
||||||
|
WCA_HAS_ICONIC_BITMAP = 9,
|
||||||
|
WCA_THEME_ATTRIBUTES = 10,
|
||||||
|
WCA_NCRENDERING_EXILED = 11,
|
||||||
|
WCA_NCADORNMENTINFO = 12,
|
||||||
|
WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
|
||||||
|
WCA_VIDEO_OVERLAY_ACTIVE = 14,
|
||||||
|
WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
|
||||||
|
WCA_DISALLOW_PEEK = 16,
|
||||||
|
WCA_CLOAK = 17,
|
||||||
|
WCA_CLOAKED = 18,
|
||||||
|
WCA_ACCENT_POLICY = 19,
|
||||||
|
WCA_FREEZE_REPRESENTATION = 20,
|
||||||
|
WCA_EVER_UNCLOAKED = 21,
|
||||||
|
WCA_VISUAL_OWNER = 22,
|
||||||
|
WCA_HOLOGRAPHIC = 23,
|
||||||
|
WCA_EXCLUDED_FROM_DDA = 24,
|
||||||
|
WCA_PASSIVEUPDATEMODE = 25,
|
||||||
|
WCA_USEDARKMODECOLORS = 26,
|
||||||
|
WCA_LAST = 27
|
||||||
|
} WINDOWCOMPOSITIONATTRIB;
|
||||||
|
|
||||||
|
typedef struct _WINDOWCOMPOSITIONATTRIBDATA {
|
||||||
|
WINDOWCOMPOSITIONATTRIB Attrib;
|
||||||
|
PVOID pvData;
|
||||||
|
SIZE_T cbData;
|
||||||
|
} WINDOWCOMPOSITIONATTRIBDATA;
|
||||||
|
|
||||||
|
typedef enum _ACCENT_STATE {
|
||||||
|
ACCENT_DISABLED = 0,
|
||||||
|
ACCENT_ENABLE_GRADIENT = 1,
|
||||||
|
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
|
||||||
|
ACCENT_ENABLE_BLURBEHIND = 3,
|
||||||
|
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
|
||||||
|
ACCENT_ENABLE_HOSTBACKDROP = 5,
|
||||||
|
ACCENT_INVALID_STATE = 6
|
||||||
|
} ACCENT_STATE;
|
||||||
|
|
||||||
|
typedef struct _ACCENT_POLICY {
|
||||||
|
ACCENT_STATE AccentState;
|
||||||
|
DWORD AccentFlags;
|
||||||
|
DWORD GradientColor;
|
||||||
|
DWORD AnimationId;
|
||||||
|
} ACCENT_POLICY;
|
||||||
|
|
||||||
|
typedef BOOL(WINAPI* _GetWindowCompositionAttribute)(
|
||||||
|
HWND, WINDOWCOMPOSITIONATTRIBDATA*);
|
||||||
|
typedef BOOL(WINAPI* _SetWindowCompositionAttribute)(
|
||||||
|
HWND, WINDOWCOMPOSITIONATTRIBDATA*);
|
||||||
|
|
||||||
|
static _SetWindowCompositionAttribute g_set_window_composition_attribute = NULL;
|
||||||
|
static bool g_set_window_composition_attribute_initialized = false;
|
||||||
|
|
||||||
|
typedef LONG NTSTATUS, *PNTSTATUS;
|
||||||
|
#define STATUS_SUCCESS (0x00000000)
|
||||||
|
|
||||||
|
typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
|
||||||
|
|
||||||
|
RTL_OSVERSIONINFOW GetWindowsVersion() {
|
||||||
|
HMODULE hmodule = ::GetModuleHandleW(L"ntdll.dll");
|
||||||
|
if (hmodule) {
|
||||||
|
RtlGetVersionPtr rtl_get_version_ptr =
|
||||||
|
(RtlGetVersionPtr)::GetProcAddress(hmodule, "RtlGetVersion");
|
||||||
|
if (rtl_get_version_ptr != nullptr) {
|
||||||
|
RTL_OSVERSIONINFOW rovi = {0};
|
||||||
|
rovi.dwOSVersionInfoSize = sizeof(rovi);
|
||||||
|
if (STATUS_SUCCESS == rtl_get_version_ptr(&rovi)) {
|
||||||
|
return rovi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RTL_OSVERSIONINFOW rovi = {0};
|
||||||
|
return rovi;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetWindowComposition(HWND window, int32_t accent_state,
|
||||||
|
int32_t gradient_color) {
|
||||||
|
// TODO: Look for a better available API.
|
||||||
|
if (GetWindowsVersion().dwBuildNumber >= 18362) {
|
||||||
|
if (!g_set_window_composition_attribute_initialized) {
|
||||||
|
auto user32 = ::GetModuleHandleA("user32.dll");
|
||||||
|
if (user32) {
|
||||||
|
g_set_window_composition_attribute =
|
||||||
|
reinterpret_cast<_SetWindowCompositionAttribute>(
|
||||||
|
::GetProcAddress(user32, "SetWindowCompositionAttribute"));
|
||||||
|
if (g_set_window_composition_attribute) {
|
||||||
|
g_set_window_composition_attribute_initialized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ACCENT_POLICY accent = {static_cast<ACCENT_STATE>(accent_state), 2,
|
||||||
|
static_cast<DWORD>(gradient_color), 0};
|
||||||
|
WINDOWCOMPOSITIONATTRIBDATA data;
|
||||||
|
data.Attrib = WCA_ACCENT_POLICY;
|
||||||
|
data.pvData = &accent;
|
||||||
|
data.cbData = sizeof(accent);
|
||||||
|
g_set_window_composition_attribute(window, &data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Add tracking for drag state
|
||||||
|
static bool isDragging = false;
|
||||||
|
static POINT dragStart = {0, 0};
|
||||||
|
static POINT windowStart = {0, 0};
|
||||||
|
|
||||||
|
|
||||||
|
LRESULT CALLBACK FilamentWindowProc(HWND const window, UINT const message,
|
||||||
|
WPARAM const wparam,
|
||||||
|
LPARAM const lparam) noexcept {
|
||||||
|
switch (message) {
|
||||||
|
case WM_DESTROY: {
|
||||||
|
PostQuitMessage(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
case WM_NCHITTEST: {
|
||||||
|
POINT pt = { LOWORD(lparam), HIWORD(lparam) };
|
||||||
|
ScreenToClient(window, &pt);
|
||||||
|
return HTCAPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE: {
|
||||||
|
TRACKMOUSEEVENT event;
|
||||||
|
event.cbSize = sizeof(event);
|
||||||
|
event.hwndTrack = window;
|
||||||
|
event.dwFlags = TME_HOVER;
|
||||||
|
event.dwHoverTime = 200;
|
||||||
|
auto user_data = ::GetWindowLongPtr(window, GWLP_USERDATA);
|
||||||
|
if (user_data) {
|
||||||
|
HWND flutterRootWindow = reinterpret_cast<HWND>(user_data);
|
||||||
|
LONG ex_style = ::GetWindowLong(flutterRootWindow, GWL_EXSTYLE);
|
||||||
|
ex_style &= ~(WS_EX_TRANSPARENT | WS_EX_LAYERED);
|
||||||
|
::SetWindowLong(flutterRootWindow, GWL_EXSTYLE, ex_style);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_ERASEBKGND: {
|
||||||
|
HDC hdc = (HDC)wparam;
|
||||||
|
RECT rect;
|
||||||
|
GetClientRect(window, &rect);
|
||||||
|
|
||||||
|
ThermionWindow* thermionWindow = reinterpret_cast<ThermionWindow*>(
|
||||||
|
GetWindowLongPtr(window, GWLP_USERDATA));
|
||||||
|
|
||||||
|
if (thermionWindow) {
|
||||||
|
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
|
||||||
|
FillRect(hdc, &rect, brush);
|
||||||
|
DeleteObject(brush);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case WM_SIZE:
|
||||||
|
case WM_MOVE:
|
||||||
|
case WM_MOVING:
|
||||||
|
case WM_WINDOWPOSCHANGED: {
|
||||||
|
auto user_data = ::GetWindowLongPtr(window, GWLP_USERDATA);
|
||||||
|
if (user_data) {
|
||||||
|
HWND flutterRootWindow = reinterpret_cast<HWND>(user_data);
|
||||||
|
LONG ex_style = ::GetWindowLong(flutterRootWindow, GWL_EXSTYLE);
|
||||||
|
ex_style &= ~(WS_EX_TRANSPARENT | WS_EX_LAYERED);
|
||||||
|
::SetWindowLong(flutterRootWindow, GWL_EXSTYLE, ex_style);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return ::DefWindowProc(window, message, wparam, lparam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThermionWindow::ThermionWindow(int width,
|
||||||
|
int height,
|
||||||
|
int left,
|
||||||
|
int top) : _width(width), _height(height), _left(left), _top(top) {
|
||||||
|
|
||||||
|
PrintDefaultGPU();
|
||||||
|
|
||||||
|
auto window_class = WNDCLASSEX{};
|
||||||
|
::SecureZeroMemory(&window_class, sizeof(window_class));
|
||||||
|
window_class.cbSize = sizeof(window_class);
|
||||||
|
window_class.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
||||||
|
window_class.lpfnWndProc = FilamentWindowProc;
|
||||||
|
window_class.hInstance = GetModuleHandle(nullptr);
|
||||||
|
window_class.lpszClassName = L"THERMION_WINDOW";
|
||||||
|
window_class.hCursor = ::LoadCursorW(nullptr, IDC_ARROW);
|
||||||
|
window_class.hbrBackground = ::CreateSolidBrush(RGB(0,255,0));
|
||||||
|
::RegisterClassExW(&window_class);
|
||||||
|
|
||||||
|
// Create a normal popup window without forcing it to be topmost
|
||||||
|
_windowHandle = ::CreateWindowW(
|
||||||
|
L"THERMION_WINDOW",
|
||||||
|
L"thermion_window",
|
||||||
|
WS_OVERLAPPEDWINDOW,
|
||||||
|
left, top, width, height,
|
||||||
|
nullptr, nullptr,
|
||||||
|
GetModuleHandle(nullptr),
|
||||||
|
nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
// Store the this pointer for use in window procedure
|
||||||
|
::SetWindowLongPtr(_windowHandle, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));
|
||||||
|
|
||||||
|
// Disable DWM animations
|
||||||
|
auto disable_window_transitions = TRUE;
|
||||||
|
DwmSetWindowAttribute(_windowHandle, DWMWA_TRANSITIONS_FORCEDISABLED,
|
||||||
|
&disable_window_transitions,
|
||||||
|
sizeof(disable_window_transitions));
|
||||||
|
|
||||||
|
::ShowWindow(_windowHandle, SW_SHOW);
|
||||||
|
UpdateWindow(_windowHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThermionWindow::Resize(int width, int height, int left, int top) {
|
||||||
|
_width = width;
|
||||||
|
_height = height;
|
||||||
|
_left = left;
|
||||||
|
_top = top;
|
||||||
|
::SetWindowPos(_windowHandle, nullptr, left, top, width, height,
|
||||||
|
SWP_NOZORDER | SWP_NOACTIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND ThermionWindow::GetHandle() { return _windowHandle; }
|
||||||
|
|
||||||
|
} // namespace thermion
|
||||||
14
examples/dart/cli_windows/native/thermion_window.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef IS_DLL
|
||||||
|
#define EMSCRIPTEN_KEEPALIVE __declspec(dllimport)
|
||||||
|
#else
|
||||||
|
#define EMSCRIPTEN_KEEPALIVE __declspec(dllexport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
intptr_t create_thermion_window(int width, int height, int left, int top);
|
||||||
|
void update();
|
||||||
|
|
||||||
|
}
|
||||||
21
examples/dart/cli_windows/pubspec.yaml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
name: cli_windows
|
||||||
|
description: A sample command-line application with basic argument parsing.
|
||||||
|
version: 0.0.1
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ^3.6.0-326.0.dev
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
args: ^2.5.0
|
||||||
|
thermion_dart:
|
||||||
|
path: ../../../thermion_dart
|
||||||
|
ffi: ^2.1.3
|
||||||
|
vector_math: ^2.1.4
|
||||||
|
native_toolchain_c: ^0.9.0
|
||||||
|
native_assets_cli: ^0.12.0
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
lints: ^5.0.0
|
||||||
|
test: ^1.24.0
|
||||||
|
|
||||||
|
|
||||||
19
examples/dart/js_wasm/pubspec.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: example_web
|
||||||
|
description: A sample command-line application.
|
||||||
|
version: 1.0.0
|
||||||
|
# repository: https://github.com/my_org/my_repo
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ^3.3.0
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
thermion_dart:
|
||||||
|
path: ../../../thermion_dart
|
||||||
|
logging: ^1.3.0
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
lints: ^3.0.0
|
||||||
|
test: ^1.24.0
|
||||||
|
build_runner: ^2.4.13
|
||||||
|
build_test: ^2.2.2
|
||||||
|
build_web_compilers: ^4.1.5
|
||||||
1
examples/dart/js_wasm/web/assets
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../assets/
|
||||||
101
examples/dart/js_wasm/web/example.dart
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:js_interop';
|
||||||
|
import 'dart:math';
|
||||||
|
import 'package:web/web.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:thermion_dart/thermion_dart.dart'
|
||||||
|
hide NativeLibrary, Image_decode;
|
||||||
|
import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart';
|
||||||
|
import 'web_input_handler.dart';
|
||||||
|
import 'package:thermion_dart/src/bindings/src/thermion_dart_js_interop.g.dart';
|
||||||
|
|
||||||
|
void main(List<String> arguments) async {
|
||||||
|
Logger.root.onRecord.listen((record) {
|
||||||
|
print(record);
|
||||||
|
});
|
||||||
|
|
||||||
|
NativeLibrary.initBindings("thermion_dart");
|
||||||
|
|
||||||
|
final canvas =
|
||||||
|
document.getElementById("thermion_canvas") as HTMLCanvasElement;
|
||||||
|
try {
|
||||||
|
canvas.width = canvas.clientWidth;
|
||||||
|
canvas.height = canvas.clientHeight;
|
||||||
|
} catch (err) {
|
||||||
|
print(err.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
final config = FFIFilamentConfig(backend: Backend.OPENGL);
|
||||||
|
|
||||||
|
await FFIFilamentApp.create(config: config);
|
||||||
|
|
||||||
|
var swapChain = await FilamentApp.instance!
|
||||||
|
.createHeadlessSwapChain(canvas.width, canvas.height);
|
||||||
|
final viewer = ThermionViewerFFI();
|
||||||
|
await viewer.initialized;
|
||||||
|
await FilamentApp.instance!.setClearOptions(1.0, 0.0, 0.0, 1.0);
|
||||||
|
await FilamentApp.instance!.register(swapChain, viewer.view);
|
||||||
|
await viewer.setViewport(canvas.width, canvas.height);
|
||||||
|
await viewer.setRendering(true);
|
||||||
|
final rnd = Random();
|
||||||
|
// ignore: prefer_function_declarations_over_variables
|
||||||
|
bool resizing = false;
|
||||||
|
// ignore: prefer_function_declarations_over_variables
|
||||||
|
final resizer = () async {
|
||||||
|
if (resizing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
resizing = true;
|
||||||
|
await viewer.setViewport(canvas.clientWidth, canvas.clientHeight);
|
||||||
|
Thermion_resizeCanvas(canvas.clientWidth, canvas.clientHeight);
|
||||||
|
} catch (err) {
|
||||||
|
print(err);
|
||||||
|
} finally {
|
||||||
|
resizing = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// ignore: unused_local_variable, prefer_function_declarations_over_variables
|
||||||
|
final jsWrapper = () {
|
||||||
|
var promise = resizer().toJS;
|
||||||
|
return promise;
|
||||||
|
};
|
||||||
|
window.addEventListener('resize', jsWrapper.toJS);
|
||||||
|
// // await FilamentApp.instance!.render();
|
||||||
|
// // await Future.delayed(Duration(seconds: 1));
|
||||||
|
|
||||||
|
// // await FilamentApp.instance!.setClearOptions(1.0, 1.0, 0.0, 1.0);
|
||||||
|
// // await FilamentApp.instance!.render();
|
||||||
|
// // await Future.delayed(Duration(seconds: 1));
|
||||||
|
|
||||||
|
await viewer.loadSkybox("assets/default_env_skybox.ktx");
|
||||||
|
await viewer.loadGltf("assets/cube.glb");
|
||||||
|
final camera = await viewer.getActiveCamera();
|
||||||
|
|
||||||
|
var zOffset = 10.0;
|
||||||
|
|
||||||
|
final inputHandler = DelegateInputHandler.flight(viewer);
|
||||||
|
|
||||||
|
final webInputHandler =
|
||||||
|
WebInputHandler(inputHandler: inputHandler, canvas: canvas);
|
||||||
|
await camera.lookAt(Vector3(0, 0, zOffset));
|
||||||
|
DateTime lastRender = DateTime.now();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
var stackPtr = stackSave();
|
||||||
|
var now = DateTime.now();
|
||||||
|
await FilamentApp.instance!.requestFrame();
|
||||||
|
now = DateTime.now();
|
||||||
|
var timeSinceLast =
|
||||||
|
now.microsecondsSinceEpoch - lastRender.microsecondsSinceEpoch;
|
||||||
|
lastRender = now;
|
||||||
|
if (timeSinceLast < 1667) {
|
||||||
|
var waitFor = 1667 - timeSinceLast;
|
||||||
|
await Future.delayed(Duration(microseconds: waitFor));
|
||||||
|
}
|
||||||
|
stackRestore(stackPtr);
|
||||||
|
// inputHandler.keyDown(PhysicalKey.S);
|
||||||
|
// await camera.lookAt(Vector3(0,0,zOffset));
|
||||||
|
// zOffset +=0.1;
|
||||||
|
}
|
||||||
|
}
|
||||||
35
examples/dart/js_wasm/web/index_js.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script type="text/javascript" src="./thermion_dart.js"></script>
|
||||||
|
<script type="module">
|
||||||
|
try {
|
||||||
|
window.thermion_dart = await thermion_dart();
|
||||||
|
} catch(err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
const script = document.createElement('script')
|
||||||
|
script.src = 'example.dart.js'
|
||||||
|
document.head.append(script);
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
canvas {
|
||||||
|
position:absolute;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
top:0;
|
||||||
|
bottom:0;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<canvas id="thermion_canvas"></canvas>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
examples/dart/js_wasm/web/index_wasm.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script src="thermion_dart.js"></script>
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
canvas {
|
||||||
|
position:absolute;
|
||||||
|
left:0;
|
||||||
|
right:0;
|
||||||
|
top:0;
|
||||||
|
bottom:0;
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<script type="module">
|
||||||
|
try {
|
||||||
|
window.thermion_dart = await thermion_dart();
|
||||||
|
} catch(err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
const dartModulePromise = WebAssembly.compileStreaming(fetch('./example.wasm'));
|
||||||
|
const imports = {};
|
||||||
|
const dart2wasm_runtime = await import('./example.mjs');
|
||||||
|
const moduleInstance = await dart2wasm_runtime.instantiate(dartModulePromise, imports);
|
||||||
|
await dart2wasm_runtime.invoke(moduleInstance);
|
||||||
|
</script>
|
||||||
|
<body>
|
||||||
|
<canvas id="canvas"></canvas>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
22
examples/dart/js_wasm/web/main.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { readFile } from 'fs/promises';
|
||||||
|
|
||||||
|
import { compile } from './example.mjs';
|
||||||
|
import thermion_dart from './thermion_dart.js';
|
||||||
|
|
||||||
|
|
||||||
|
async function runDartWasm() {
|
||||||
|
globalThis['thermion_dart'] = await thermion_dart();
|
||||||
|
|
||||||
|
const wasmBytes = await readFile('example.wasm');
|
||||||
|
const compiledApp = await compile(wasmBytes);
|
||||||
|
const instantiatedApp = await compiledApp.instantiate({});
|
||||||
|
try {
|
||||||
|
instantiatedApp.invokeMain();
|
||||||
|
} catch(err) {
|
||||||
|
console.error("Failed");
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runDartWasm().catch(console.error);
|
||||||
|
|
||||||
1
examples/dart/js_wasm/web/thermion_dart.js
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../thermion_dart/native/web/build/build/out/thermion_dart.js
|
||||||
1
examples/dart/js_wasm/web/thermion_dart.wasm
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../../../thermion_dart/native/web/build/build/out/thermion_dart.wasm
|
||||||
299
examples/dart/js_wasm/web/web_input_handler.dart
Normal file
@@ -0,0 +1,299 @@
|
|||||||
|
import 'dart:js_interop';
|
||||||
|
|
||||||
|
import 'package:web/web.dart' as web;
|
||||||
|
import 'package:thermion_dart/thermion_dart.dart';
|
||||||
|
|
||||||
|
class WebInputHandler {
|
||||||
|
final InputHandler inputHandler;
|
||||||
|
final web.HTMLCanvasElement canvas;
|
||||||
|
late double pixelRatio;
|
||||||
|
|
||||||
|
final Map<int, Vector2> _touchPositions = {};
|
||||||
|
|
||||||
|
WebInputHandler({
|
||||||
|
required this.inputHandler,
|
||||||
|
required this.canvas,
|
||||||
|
}) {
|
||||||
|
pixelRatio = web.window.devicePixelRatio;
|
||||||
|
_initializeEventListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _initializeEventListeners() {
|
||||||
|
canvas.addEventListener('mousedown', _onMouseDown.toJS);
|
||||||
|
canvas.addEventListener('mousemove', _onMouseMove.toJS);
|
||||||
|
canvas.addEventListener('mouseup', _onMouseUp.toJS);
|
||||||
|
canvas.addEventListener('wheel', _onMouseWheel.toJS);
|
||||||
|
web.window.addEventListener('keydown', _onKeyDown.toJS);
|
||||||
|
web.window.addEventListener('keyup', _onKeyUp.toJS);
|
||||||
|
|
||||||
|
canvas.addEventListener('touchstart', _onTouchStart.toJS);
|
||||||
|
canvas.addEventListener('touchmove', _onTouchMove.toJS);
|
||||||
|
canvas.addEventListener('touchend', _onTouchEnd.toJS);
|
||||||
|
canvas.addEventListener('touchcancel', _onTouchCancel.toJS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onMouseDown(web.MouseEvent event) {
|
||||||
|
final localPos = _getLocalPositionFromEvent(event);
|
||||||
|
final button = _getMouseButtonFromEvent(event);
|
||||||
|
|
||||||
|
inputHandler.handle(MouseEvent(
|
||||||
|
MouseEventType.buttonDown,
|
||||||
|
button,
|
||||||
|
localPos,
|
||||||
|
Vector2.zero(),
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onMouseMove(web.MouseEvent event) {
|
||||||
|
final localPos = _getLocalPositionFromEvent(event);
|
||||||
|
final delta = Vector2(event.movementX ?? 0, event.movementY ?? 0);
|
||||||
|
final button = _getMouseButtonFromEvent(event);
|
||||||
|
|
||||||
|
inputHandler.handle(MouseEvent(
|
||||||
|
MouseEventType.move,
|
||||||
|
button,
|
||||||
|
localPos,
|
||||||
|
delta,
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onMouseUp(web.MouseEvent event) {
|
||||||
|
final localPos = _getLocalPositionFromEvent(event);
|
||||||
|
final button = _getMouseButtonFromEvent(event);
|
||||||
|
|
||||||
|
inputHandler.handle(MouseEvent(
|
||||||
|
MouseEventType.buttonUp,
|
||||||
|
button,
|
||||||
|
localPos,
|
||||||
|
Vector2.zero(),
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onMouseWheel(web.WheelEvent event) {
|
||||||
|
final localPos = _getLocalPositionFromEvent(event);
|
||||||
|
final delta = event.deltaY;
|
||||||
|
|
||||||
|
inputHandler.handle(ScrollEvent(
|
||||||
|
localPosition: localPos,
|
||||||
|
delta: delta,
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onKeyDown(web.KeyboardEvent event) {
|
||||||
|
PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event);
|
||||||
|
LogicalKey? logicalKey = _getLogicalKeyFromEvent(event);
|
||||||
|
if (physicalKey != null && logicalKey != null) {
|
||||||
|
inputHandler.handle(KeyEvent(KeyEventType.down, logicalKey, physicalKey));
|
||||||
|
}
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onKeyUp(web.KeyboardEvent event) {
|
||||||
|
LogicalKey? logicalKey = _getLogicalKeyFromEvent(event);
|
||||||
|
PhysicalKey? physicalKey = _getPhysicalKeyFromEvent(event);
|
||||||
|
if (physicalKey != null && logicalKey != null) {
|
||||||
|
inputHandler.handle(KeyEvent(KeyEventType.up, logicalKey, physicalKey));
|
||||||
|
}
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onTouchStart(web.TouchEvent event) {
|
||||||
|
for (var touch in event.changedTouches.toList()) {
|
||||||
|
final pos = _getLocalPositionFromTouch(touch);
|
||||||
|
_touchPositions[touch.identifier] = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
final touchCount = event.touches.toList().length;
|
||||||
|
if (touchCount == 1) {
|
||||||
|
final touch = event.touches.toList().first;
|
||||||
|
final pos = _getLocalPositionFromTouch(touch);
|
||||||
|
inputHandler.handle(TouchEvent(
|
||||||
|
TouchEventType.tap,
|
||||||
|
pos,
|
||||||
|
null,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (touchCount >= 2) {
|
||||||
|
final focalPoint = _calculateFocalPoint(event.touches.toList());
|
||||||
|
inputHandler.handle(ScaleStartEvent(
|
||||||
|
numPointers: touchCount,
|
||||||
|
localFocalPoint: (focalPoint.x, focalPoint.y),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onTouchMove(web.TouchEvent event) {
|
||||||
|
for (var touch in event.changedTouches.toList()) {
|
||||||
|
final id = touch.identifier;
|
||||||
|
final currPos = _getLocalPositionFromTouch(touch);
|
||||||
|
final prevPos = _touchPositions[id];
|
||||||
|
|
||||||
|
if (prevPos != null) {
|
||||||
|
_touchPositions[id] = currPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final touchCount = event.touches.toList().length;
|
||||||
|
if (touchCount >= 2) {
|
||||||
|
final touches = event.touches.toList();
|
||||||
|
final focalPoint = _calculateFocalPoint(touches);
|
||||||
|
|
||||||
|
// Calculate scale
|
||||||
|
final currPositions = touches.map((t) => _getLocalPositionFromTouch(t)).toList();
|
||||||
|
final prevPositions = touches.map((t) => _touchPositions[t.identifier] ?? _getLocalPositionFromTouch(t)).toList();
|
||||||
|
|
||||||
|
final currDist = (currPositions[0] - currPositions[1]).length;
|
||||||
|
final prevDist = (prevPositions[0] - prevPositions[1]).length;
|
||||||
|
final scale = prevDist > 0 ? currDist / prevDist : 1.0;
|
||||||
|
|
||||||
|
// Calculate focal point delta
|
||||||
|
final prevFocalPoint = _calculateFocalPoint(touches, prevPositions);
|
||||||
|
final focalPointDelta = focalPoint - prevFocalPoint;
|
||||||
|
|
||||||
|
inputHandler.handle(ScaleUpdateEvent(
|
||||||
|
numPointers: touchCount,
|
||||||
|
localFocalPoint: (focalPoint.x, focalPoint.y),
|
||||||
|
localFocalPointDelta: (focalPointDelta.x, focalPointDelta.y),
|
||||||
|
rotation: 0.0, // We don't track rotation in the web implementation
|
||||||
|
scale: scale,
|
||||||
|
horizontalScale: scale,
|
||||||
|
verticalScale: scale,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onTouchEnd(web.TouchEvent event) {
|
||||||
|
for (var touch in event.changedTouches.toList()) {
|
||||||
|
_touchPositions.remove(touch.identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
final touchCount = event.touches.toList().length;
|
||||||
|
inputHandler.handle(ScaleEndEvent(
|
||||||
|
numPointers: touchCount,
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onTouchCancel(web.TouchEvent event) {
|
||||||
|
for (var touch in event.changedTouches.toList()) {
|
||||||
|
_touchPositions.remove(touch.identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
final touchCount = event.touches.toList().length;
|
||||||
|
inputHandler.handle(ScaleEndEvent(
|
||||||
|
numPointers: touchCount,
|
||||||
|
));
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseButton? _getMouseButtonFromEvent(web.MouseEvent event) {
|
||||||
|
if (event.button == 1 || (event.buttons & 4 != 0)) {
|
||||||
|
return MouseButton.middle;
|
||||||
|
} else if (event.button == 0 || (event.buttons & 1 != 0)) {
|
||||||
|
return MouseButton.left;
|
||||||
|
} else if (event.button == 2 || (event.buttons & 2 != 0)) {
|
||||||
|
return MouseButton.right;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PhysicalKey? _getPhysicalKeyFromEvent(web.KeyboardEvent event) {
|
||||||
|
switch (event.code) {
|
||||||
|
case 'KeyW':
|
||||||
|
return PhysicalKey.w;
|
||||||
|
case 'KeyA':
|
||||||
|
return PhysicalKey.a;
|
||||||
|
case 'KeyS':
|
||||||
|
return PhysicalKey.s;
|
||||||
|
case 'KeyD':
|
||||||
|
return PhysicalKey.d;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LogicalKey? _getLogicalKeyFromEvent(web.KeyboardEvent event) {
|
||||||
|
switch (event.key) {
|
||||||
|
case 'KeyW':
|
||||||
|
return LogicalKey.w;
|
||||||
|
case 'KeyA':
|
||||||
|
return LogicalKey.a;
|
||||||
|
case 'KeyS':
|
||||||
|
return LogicalKey.s;
|
||||||
|
case 'KeyD':
|
||||||
|
return LogicalKey.d;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 _getLocalPositionFromEvent(web.Event event) {
|
||||||
|
final rect = canvas.getBoundingClientRect();
|
||||||
|
double clientX = 0, clientY = 0;
|
||||||
|
|
||||||
|
if (event is web.MouseEvent) {
|
||||||
|
clientX = event.clientX.toDouble();
|
||||||
|
clientY = event.clientY.toDouble();
|
||||||
|
} else if (event is web.TouchEvent) {
|
||||||
|
final touch = event.touches.toList().firstOrNull;
|
||||||
|
if (touch != null) {
|
||||||
|
clientX = touch.clientX;
|
||||||
|
clientY = touch.clientY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Vector2(
|
||||||
|
(clientX - rect.left) * pixelRatio,
|
||||||
|
(clientY - rect.top) * pixelRatio,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 _getLocalPositionFromTouch(web.Touch touch) {
|
||||||
|
final rect = canvas.getBoundingClientRect();
|
||||||
|
return Vector2(
|
||||||
|
(touch.clientX - rect.left) * pixelRatio,
|
||||||
|
(touch.clientY - rect.top) * pixelRatio,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 _calculateFocalPoint(List<web.Touch> touches, [List<Vector2>? positions]) {
|
||||||
|
if (touches.isEmpty) return Vector2.zero();
|
||||||
|
|
||||||
|
final points = positions ?? touches.map((t) => _getLocalPositionFromTouch(t)).toList();
|
||||||
|
|
||||||
|
Vector2 sum = Vector2.zero();
|
||||||
|
for (var point in points) {
|
||||||
|
sum += point;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum.scaled(1.0 / points.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dispose() {
|
||||||
|
canvas.removeEventListener('mousedown', _onMouseDown.toJS);
|
||||||
|
canvas.removeEventListener('mousemove', _onMouseMove.toJS);
|
||||||
|
canvas.removeEventListener('mouseup', _onMouseUp.toJS);
|
||||||
|
canvas.removeEventListener('wheel', _onMouseWheel.toJS);
|
||||||
|
web.window.removeEventListener('keydown', _onKeyDown.toJS);
|
||||||
|
web.window.removeEventListener('keyup', _onKeyUp.toJS);
|
||||||
|
canvas.removeEventListener('touchstart', _onTouchStart.toJS);
|
||||||
|
canvas.removeEventListener('touchmove', _onTouchMove.toJS);
|
||||||
|
canvas.removeEventListener('touchend', _onTouchEnd.toJS);
|
||||||
|
canvas.removeEventListener('touchcancel', _onTouchCancel.toJS);
|
||||||
|
}
|
||||||
|
}
|
||||||
45
examples/flutter/animations/.gitignore
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Miscellaneous
|
||||||
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.build/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
.swiftpm/
|
||||||
|
migrate_working_dir/
|
||||||
|
|
||||||
|
# IntelliJ related
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
|
# is commented out by default.
|
||||||
|
#.vscode/
|
||||||
|
|
||||||
|
# Flutter/Dart/Pub related
|
||||||
|
**/doc/api/
|
||||||
|
**/ios/Flutter/.last_build_id
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Symbolication related
|
||||||
|
app.*.symbols
|
||||||
|
|
||||||
|
# Obfuscation related
|
||||||
|
app.*.map.json
|
||||||
|
|
||||||
|
# Android Studio will place build artifacts here
|
||||||
|
/android/app/debug
|
||||||
|
/android/app/profile
|
||||||
|
/android/app/release
|
||||||
30
examples/flutter/animations/.metadata
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: "bae79714317430baa8e9d2edeb6accdaedfd5e06"
|
||||||
|
channel: "master"
|
||||||
|
|
||||||
|
project_type: app
|
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command
|
||||||
|
migration:
|
||||||
|
platforms:
|
||||||
|
- platform: root
|
||||||
|
create_revision: bae79714317430baa8e9d2edeb6accdaedfd5e06
|
||||||
|
base_revision: bae79714317430baa8e9d2edeb6accdaedfd5e06
|
||||||
|
- platform: android
|
||||||
|
create_revision: bae79714317430baa8e9d2edeb6accdaedfd5e06
|
||||||
|
base_revision: bae79714317430baa8e9d2edeb6accdaedfd5e06
|
||||||
|
|
||||||
|
# User provided section
|
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be
|
||||||
|
# ignored by the migrate tool.
|
||||||
|
#
|
||||||
|
# Files that are not part of the templates will be ignored by default.
|
||||||
|
unmanaged_files:
|
||||||
|
- 'lib/main.dart'
|
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj'
|
||||||
4
examples/flutter/animations/README.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Thermion Example - Camera Manipulation
|
||||||
|
|
||||||
|
A Flutter project demonstrating how to use the Thermion rendering toolkit to manipulate the camera position programatically and via device input (mouse pointer or touch screen).
|
||||||
|
|
||||||
28
examples/flutter/animations/analysis_options.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# This file configures the analyzer, which statically analyzes Dart code to
|
||||||
|
# check for errors, warnings, and lints.
|
||||||
|
#
|
||||||
|
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||||
|
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||||
|
# invoked from the command line by running `flutter analyze`.
|
||||||
|
|
||||||
|
# The following line activates a set of recommended lints for Flutter apps,
|
||||||
|
# packages, and plugins designed to encourage good coding practices.
|
||||||
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
linter:
|
||||||
|
# The lint rules applied to this project can be customized in the
|
||||||
|
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||||
|
# included above or to enable additional rules. A list of all available lints
|
||||||
|
# and their documentation is published at https://dart.dev/lints.
|
||||||
|
#
|
||||||
|
# Instead of disabling a lint rule for the entire project in the
|
||||||
|
# section below, it can also be suppressed for a single line of code
|
||||||
|
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||||
|
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||||
|
# producing the lint.
|
||||||
|
rules:
|
||||||
|
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||||
|
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||||
|
|
||||||
|
# Additional information about this file can be found at
|
||||||
|
# https://dart.dev/guides/language/analysis-options
|
||||||
13
examples/flutter/animations/android/.gitignore
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
/.gradle
|
||||||
|
/captures/
|
||||||
|
/gradlew
|
||||||
|
/gradlew.bat
|
||||||
|
/local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
|
||||||
|
# Remember to never publicly share your keystore.
|
||||||
|
# See https://flutter.dev/to/reference-keystore
|
||||||
|
key.properties
|
||||||
|
**/*.keystore
|
||||||
|
**/*.jks
|
||||||
46
examples/flutter/animations/android/app/build.gradle
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
plugins {
|
||||||
|
id "com.android.application"
|
||||||
|
id "kotlin-android"
|
||||||
|
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||||
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "com.example.quickstart"
|
||||||
|
compileSdk = flutter.compileSdkVersion
|
||||||
|
ndkVersion = flutter.ndkVersion
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = JavaVersion.VERSION_1_8
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
|
applicationId = "com.example.quickstart"
|
||||||
|
// You can update the following values to match your application needs.
|
||||||
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
|
minSdk = 22
|
||||||
|
targetSdk = flutter.targetSdkVersion
|
||||||
|
versionCode = flutter.versionCode
|
||||||
|
versionName = flutter.versionName
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
// TODO: Add your own signing config for the release build.
|
||||||
|
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||||
|
signingConfig = signingConfigs.debug
|
||||||
|
shrinkResources false
|
||||||
|
minifyEnabled false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flutter {
|
||||||
|
source = "../.."
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
|
the Flutter tool needs it to communicate with the running application
|
||||||
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
|
-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<application
|
||||||
|
android:label="camera_manipulation"
|
||||||
|
android:name="${applicationName}"
|
||||||
|
android:icon="@mipmap/ic_launcher">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:launchMode="singleTop"
|
||||||
|
android:taskAffinity=""
|
||||||
|
android:theme="@style/LaunchTheme"
|
||||||
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
|
the Android process has started. This theme is visible to the user
|
||||||
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
|
to determine the Window background behind the Flutter UI. -->
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
|
android:resource="@style/NormalTheme"
|
||||||
|
/>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<!-- Don't delete the meta-data below.
|
||||||
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
|
<meta-data
|
||||||
|
android:name="flutterEmbedding"
|
||||||
|
android:value="2" />
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.EnableImpeller"
|
||||||
|
android:value="false" />
|
||||||
|
</application>
|
||||||
|
<!-- Required to query activities that can process text, see:
|
||||||
|
https://developer.android.com/training/package-visibility and
|
||||||
|
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||||
|
|
||||||
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||||
|
<queries>
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
||||||
|
<data android:mimeType="text/plain"/>
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
</manifest>
|
||||||