Compare commits
642
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7fbdd9ad2f | ||
|
|
24539968fd | ||
|
|
f13b356531 | ||
|
|
477594d7bc | ||
|
|
e955a18126 | ||
|
|
adec1c4507 | ||
|
|
172b8a032c | ||
|
|
d6c8008978 | ||
|
|
488ca0fcc5 | ||
|
|
dfd15cadab | ||
|
|
1613257bdc | ||
|
|
1061580118 | ||
|
|
7184828a58 | ||
|
|
0428adff03 | ||
|
|
04246f0a63 | ||
|
|
61df58d651 | ||
|
|
1bd9a440e8 | ||
|
|
d82c8eb945 | ||
|
|
becbad7ea4 | ||
|
|
2335796a28 | ||
|
|
c6330b64f6 | ||
|
|
df57a23512 | ||
|
|
aea71cf0af | ||
|
|
fb54386f8d | ||
|
|
4d931b6109 | ||
|
|
407c7a10f5 | ||
|
|
16fa4d1d17 | ||
|
|
1ecccd43d4 | ||
|
|
2edbb1cf8b | ||
|
|
8dccbe8029 | ||
|
|
031c833e4d | ||
|
|
890cc46825 | ||
|
|
6b0f7e8512 | ||
|
|
7a220921f0 | ||
|
|
7ef9acda5d | ||
|
|
2a6d62e6f7 | ||
|
|
42b50bd7f7 | ||
|
|
2c3f44ae11 | ||
|
|
b7662f16e5 | ||
|
|
5bc535a8d2 | ||
|
|
3ec9c7ae6e | ||
|
|
e326d0c756 | ||
|
|
7c5434a99f | ||
|
|
26d9256ee9 | ||
|
|
053e761d8f | ||
|
|
5861b52cff | ||
|
|
66193d7283 | ||
|
|
dfb07f359e | ||
|
|
6fe1433497 | ||
|
|
01ace109ba | ||
|
|
8e01acaa12 | ||
|
|
7bbec8dbcb | ||
|
|
10375086ed | ||
|
|
dd367daac9 | ||
|
|
27063d0c32 | ||
|
|
80ff0282c3 | ||
|
|
e973e406a3 | ||
|
|
c64776029e | ||
|
|
5d7d0a922d | ||
|
|
c2c96c4219 | ||
|
|
3e9ed08c53 | ||
|
|
b7df9026c0 | ||
|
|
6527c6357b | ||
|
|
fad333256c | ||
|
|
8753811fe1 | ||
|
|
237752ff62 | ||
|
|
743244a69c | ||
|
|
9f89737986 | ||
|
|
508a5c5f66 | ||
|
|
d84394efa0 | ||
|
|
dd613d48bc | ||
|
|
2e8e500d4f | ||
|
|
48f866dcc6 | ||
|
|
ec4d3e4f9b | ||
|
|
38ddfab1e0 | ||
|
|
353b7e4438 | ||
|
|
7076c9a0ff | ||
|
|
2f42a8714c | ||
|
|
fdf6fc32ff | ||
|
|
f2188b33c6 | ||
|
|
f93fead8f2 | ||
|
|
050f3791cc | ||
|
|
94326fd964 | ||
|
|
f26f3b606d | ||
|
|
7cbfa76be4 | ||
|
|
d896e71ae9 | ||
|
|
ca79d99ec4 | ||
|
|
95f77ef81d | ||
|
|
c4e7d26b70 | ||
|
|
ea49a1a07b | ||
|
|
784223c67f | ||
|
|
77aa2c9a9d | ||
|
|
48145fb234 | ||
|
|
49730cadee | ||
|
|
0b197501e1 | ||
|
|
8b0c246a7b | ||
|
|
9c4face1ae | ||
|
|
952e2e6631 | ||
|
|
4766910413 | ||
|
|
3c2f97a8d2 | ||
|
|
f75730f165 | ||
|
|
b596e62a61 | ||
|
|
1349d48339 | ||
|
|
d69ea5fda6 | ||
|
|
9b68062ba7 | ||
|
|
b217019723 | ||
|
|
a37a254a68 | ||
|
|
5258699f20 | ||
|
|
483bebb003 | ||
|
|
8ca8052a8d | ||
|
|
d68b1144b8 | ||
|
|
42c39b6be3 | ||
|
|
bb82b9d168 | ||
|
|
b1f865d461 | ||
|
|
8e75c6be50 | ||
|
|
06a5f9188d | ||
|
|
370a991208 | ||
|
|
6deb77dd4d | ||
|
|
9e3172cb04 | ||
|
|
426c6b9a72 | ||
|
|
d148bdedcd | ||
|
|
23140e3bf7 | ||
|
|
2f023803e7 | ||
|
|
d658b5fc38 | ||
|
|
68cd84c330 | ||
|
|
0bd82a43d3 | ||
|
|
7fdf42b699 | ||
|
|
aeb0e9aac3 | ||
|
|
1099a3bdf0 | ||
|
|
aa3458f69c | ||
|
|
0186cbb7b7 | ||
|
|
fa36e94c4b | ||
|
|
ad83e70cf5 | ||
|
|
4a0377c0a1 | ||
|
|
83a3241830 | ||
|
|
f299b351e3 | ||
|
|
3880e4ef47 | ||
|
|
f205e918d9 | ||
|
|
42b0b9306b | ||
|
|
483659c319 | ||
|
|
add14dd27c | ||
|
|
61516a5e97 | ||
|
|
17418039e1 | ||
|
|
25cae61211 | ||
|
|
db98c7440e | ||
|
|
3783ae2234 | ||
|
|
3e8732b230 | ||
|
|
b39bca9458 | ||
|
|
d263334030 | ||
|
|
b2cea62189 | ||
|
|
d6b886c69b | ||
|
|
38fb9ea41e | ||
|
|
a922aaa68e | ||
|
|
4f2e36ca46 | ||
|
|
f367627cac | ||
|
|
7a7fcf10ad | ||
|
|
b9bd2734eb | ||
|
|
9c7bd4f5d5 | ||
|
|
362d47f91f | ||
|
|
a18792c397 | ||
|
|
0e2ddb2f16 | ||
|
|
bcfadd6657 | ||
|
|
021cf1a2b4 | ||
|
|
acf86be516 | ||
|
|
dd93eb88f2 | ||
|
|
e06f9e35b3 | ||
|
|
c0424aba7e | ||
|
|
b468254d73 | ||
|
|
15e3e92ec2 | ||
|
|
ee403fd83a | ||
|
|
05f266ac10 | ||
|
|
f52c0026dd | ||
|
|
a284107249 | ||
|
|
a2e25e7940 | ||
|
|
d45a0161cf | ||
|
|
c7a5d15e7a | ||
|
|
3cb2241b1d | ||
|
|
b236821661 | ||
|
|
fc75b0bd21 | ||
|
|
a9fc84d568 | ||
|
|
b15c6d887d | ||
|
|
c2f89978ff | ||
|
|
a004153223 | ||
|
|
dde2bbcbe7 | ||
|
|
7bd572f3ec | ||
|
|
486011dceb | ||
|
|
01c45633b7 | ||
|
|
5320d0ecaa | ||
|
|
757ba03918 | ||
|
|
948db69cc9 | ||
|
|
92f363926e | ||
|
|
d0ff144753 | ||
|
|
943efbb3ed | ||
|
|
6962de4b1f | ||
|
|
6f7c0c23d1 | ||
|
|
14eccc70da | ||
|
|
d4b48cec5d | ||
|
|
2d23c5351f | ||
|
|
b5dfaf170a | ||
|
|
c372591f36 | ||
|
|
36d1308aa6 | ||
|
|
b0d6ed3844 | ||
|
|
5818366d92 | ||
|
|
e5bca74b9d | ||
|
|
82dd1e4be9 | ||
|
|
d0b77639c2 | ||
|
|
6edb0f66d5 | ||
|
|
c458c13af7 | ||
|
|
bb7875edd4 | ||
|
|
6f54fb90eb | ||
|
|
4d1e7c536f | ||
|
|
59cc200f92 | ||
|
|
c6093430ae | ||
|
|
23172bcdd0 | ||
|
|
aea2dab0d7 | ||
|
|
4d26e144ab | ||
|
|
c391fcd345 | ||
|
|
ece743342a | ||
|
|
02babbe340 | ||
|
|
e27b6d050c | ||
|
|
86e2de8d10 | ||
|
|
b4526f926d | ||
|
|
14f04878d1 | ||
|
|
830fb3b752 | ||
|
|
9a336da359 | ||
|
|
6cec49ce7e | ||
|
|
6c28edea55 | ||
|
|
d7870d672e | ||
|
|
5bd9228b4a | ||
|
|
6392cf5a2f | ||
|
|
6a2e2b704e | ||
|
|
ecec803388 | ||
|
|
848965e7f0 | ||
|
|
478af5f01e | ||
|
|
14decb7387 | ||
|
|
323d0d5ba0 | ||
|
|
9bfa6ac1a1 | ||
|
|
c8af817eeb | ||
|
|
d24d3ce487 | ||
|
|
60a81dfbd8 | ||
|
|
8896a59dff | ||
|
|
7fe16d99be | ||
|
|
c3af88dfc1 | ||
|
|
5c8f0cc966 | ||
|
|
2a6c50c893 | ||
|
|
7a8d796ac1 | ||
|
|
8b3b71bce3 | ||
|
|
83da4e9248 | ||
|
|
2c879095d9 | ||
|
|
13344fbb62 | ||
|
|
2fe9ad595f | ||
|
|
0f798289f0 | ||
|
|
01104cc1d3 | ||
|
|
d61b5827fd | ||
|
|
d18cc81531 | ||
|
|
c96d7ae226 | ||
|
|
9535aef59b | ||
|
|
82f6fca06f | ||
|
|
627b36a53b | ||
|
|
2af78a3874 | ||
|
|
7c7109edf4 | ||
|
|
0fa23b83e6 | ||
|
|
e53c71543a | ||
|
|
fa64f7b6aa | ||
|
|
eaac3a64f8 | ||
|
|
4eabc45dfc | ||
|
|
5c5e2a0f2f | ||
|
|
559a5d146a | ||
|
|
df46c58cb8 | ||
|
|
1f43132363 | ||
|
|
17369a20de | ||
|
|
c83dae4c70 | ||
|
|
c2f44a51c4 | ||
|
|
3da44d1215 | ||
|
|
f6709e357f | ||
|
|
45d5511fd7 | ||
|
|
198c5d23fd | ||
|
|
c41caeaf64 | ||
|
|
b6c542b0e7 | ||
|
|
2d62275a08 | ||
|
|
971ea81861 | ||
|
|
9e9cc7859c | ||
|
|
8898f5fe52 | ||
|
|
40be69ae8e | ||
|
|
17eec81071 | ||
|
|
c9bbbd18ec | ||
|
|
e08eda18d5 | ||
|
|
d2c03a6651 | ||
|
|
0a1e920659 | ||
|
|
cd58df820e | ||
|
|
1a5467aec8 | ||
|
|
0dcb64dca3 | ||
|
|
b703102d9b | ||
|
|
3c2ef75b50 | ||
|
|
4fa530354d | ||
|
|
eeeb30dc3f | ||
|
|
870fc2e53e | ||
|
|
79ae0da927 | ||
|
|
e179bda57a | ||
|
|
8e0c15e32e | ||
|
|
ff844f6760 | ||
|
|
bc96ac85f4 | ||
|
|
33b328e3d5 | ||
|
|
dcda8d1c7a | ||
|
|
5fd2bd225f | ||
|
|
2db8859076 | ||
|
|
6eff167a28 | ||
|
|
9fecb69b84 | ||
|
|
0539aa38e5 | ||
|
|
fe9caad391 | ||
|
|
ceae2928aa | ||
|
|
0e6934abe5 | ||
|
|
a2e7c92f99 | ||
|
|
643a8717b4 | ||
|
|
f21127fd4a | ||
|
|
0bc8005100 | ||
|
|
67efc1f68f | ||
|
|
dfebf60e68 | ||
|
|
26e7d134ce | ||
|
|
c414242f13 | ||
|
|
33e60725b1 | ||
|
|
f21b0985cc | ||
|
|
71e9548c20 | ||
|
|
fc64abea5c | ||
|
|
413e89c955 | ||
|
|
439041c2f4 | ||
|
|
530de4d809 | ||
|
|
5e45bdeeda | ||
|
|
081eba903f | ||
|
|
0def045611 | ||
|
|
e20cc6a90f | ||
|
|
7dd83dd2d1 | ||
|
|
1240807b9f | ||
|
|
ad7d6624de | ||
|
|
06b089ba13 | ||
|
|
e1302bcf17 | ||
|
|
cfdc7db79a | ||
|
|
50de873453 | ||
|
|
a4ae7b2059 | ||
|
|
d90abdcb44 | ||
|
|
4a31045fd9 | ||
|
|
249155987d | ||
|
|
2ae7fc244b | ||
|
|
fafa70c6bc | ||
|
|
49162a7a64 | ||
|
|
328e6b3e28 | ||
|
|
5441db9b18 | ||
|
|
06bfa4f1a1 | ||
|
|
a530712491 | ||
|
|
3c8cfe9b76 | ||
|
|
57b4ce96e4 | ||
|
|
63c7d64143 | ||
|
|
1784327c47 | ||
|
|
a63ec83d5f | ||
|
|
d661516b02 | ||
|
|
ba020245f9 | ||
|
|
79fefc1ff9 | ||
|
|
eac169b6da | ||
|
|
a60d293759 | ||
|
|
b0063f8db6 | ||
|
|
632abdd87b | ||
|
|
d9b01ca5de | ||
|
|
adb7db9229 | ||
|
|
e4f7aec965 | ||
|
|
768a8c1062 | ||
|
|
318c5000ce | ||
|
|
70f334e1a3 | ||
|
|
279b53a705 | ||
|
|
a72a3ce5f3 | ||
|
|
979aea5212 | ||
|
|
34d3c63384 | ||
|
|
cf4af2692b | ||
|
|
d335ca5a8d | ||
|
|
9cac2c1457 | ||
|
|
523b992b4c | ||
|
|
02be490466 | ||
|
|
45ae3978f6 | ||
|
|
f983194d7e | ||
|
|
ab8373b989 | ||
|
|
4bef2c48eb | ||
|
|
21e2a769eb | ||
|
|
fd8369142a | ||
|
|
5dea221ad5 | ||
|
|
235c29913a | ||
|
|
0870407f65 | ||
|
|
e8156c6bd9 | ||
|
|
e7f9486aa1 | ||
|
|
53b9fd2110 | ||
|
|
4d4e474464 | ||
|
|
a58b41e7d2 | ||
|
|
4db05e97c5 | ||
|
|
3a668232c8 | ||
|
|
d2622a5d86 | ||
|
|
d11db8a67a | ||
|
|
98b6102e56 | ||
|
|
0db8613a21 | ||
|
|
94a6cb2cff | ||
|
|
5b92575ed3 | ||
|
|
47b02c0480 | ||
|
|
691be54ca2 | ||
|
|
22ea8ebe25 | ||
|
|
bd71635c49 | ||
|
|
830bc3eac3 | ||
|
|
2d72bf4308 | ||
|
|
f4e694afa7 | ||
|
|
55610bae70 | ||
|
|
08351e0df2 | ||
|
|
7489771ad2 | ||
|
|
ea8023e51f | ||
|
|
8a9693a28e | ||
|
|
724fba4af9 | ||
|
|
beca1cbf96 | ||
|
|
b74d2ae9fa | ||
|
|
ec82a0154b | ||
|
|
0ea8dbea10 | ||
|
|
a131f44247 | ||
|
|
0423aedffc | ||
|
|
afc89cdd95 | ||
|
|
541606e00d | ||
|
|
c53fd5fc9a | ||
|
|
bc3dd06b26 | ||
|
|
fd39808ed8 | ||
|
|
a1b7cb5330 | ||
|
|
ac27fae712 | ||
|
|
f6270ec395 | ||
|
|
e9c70f8b1c | ||
|
|
50688e1159 | ||
|
|
8417fea3bf | ||
|
|
f5150d32af | ||
|
|
2263823f75 | ||
|
|
a882263033 | ||
|
|
24d2431522 | ||
|
|
fd27e7bd43 | ||
|
|
4dfe36cdc1 | ||
|
|
fc49be1e05 | ||
|
|
d06d94c767 | ||
|
|
66786651b0 | ||
|
|
e9b499b82d | ||
|
|
e6e3e686c6 | ||
|
|
1e6ba0cdc4 | ||
|
|
75db4c29b8 | ||
|
|
914d3e6a2b | ||
|
|
ff678a5ad7 | ||
|
|
46442ef50c | ||
|
|
7d8fde82e6 | ||
|
|
99cf057906 | ||
|
|
59d3d66f91 | ||
|
|
be73c0fe43 | ||
|
|
e5afc6f029 | ||
|
|
8816d0a9ac | ||
|
|
229837b14c | ||
|
|
94b068a40f | ||
|
|
2f0dfc4d74 | ||
|
|
3391c44107 | ||
|
|
35aae588b8 | ||
|
|
c19585e22a | ||
|
|
77946585b1 | ||
|
|
88a35fd162 | ||
|
|
7d8d4a03fb | ||
|
|
1a68d34663 | ||
|
|
72a0ff706d | ||
|
|
420e43d47d | ||
|
|
3c749d4774 | ||
|
|
d4310a7f3b | ||
|
|
f892d88c10 | ||
|
|
d226709836 | ||
|
|
fbfd03fe5c | ||
|
|
f513001798 | ||
|
|
31aa0ddabe | ||
|
|
767184cf3c | ||
|
|
fe86a9ed02 | ||
|
|
9be53e746f | ||
|
|
8b6f50d0cc | ||
|
|
80dc28bfb5 | ||
|
|
983e1abf48 | ||
|
|
ff65b82671 | ||
|
|
0b26c69222 | ||
|
|
904d714d6d | ||
|
|
2aed93a576 | ||
|
|
d1af42e9ad | ||
|
|
9f31addfa5 | ||
|
|
d56ea7e6c4 | ||
|
|
1cbe271ad5 | ||
|
|
33db3c377f | ||
|
|
a0535ef64d | ||
|
|
392ba18ff7 | ||
|
|
e872f9e928 | ||
|
|
04685a8179 | ||
|
|
55fbe68e62 | ||
|
|
f51e1f0cc8 | ||
|
|
d31b62d44d | ||
|
|
9fd90e26f7 | ||
|
|
dbea0c9361 | ||
|
|
201cb61f84 | ||
|
|
71141e830a | ||
|
|
7dc8bf3aa4 | ||
|
|
0fef94cfdb | ||
|
|
a9b45967ce | ||
|
|
0928bca531 | ||
|
|
77f73a79df | ||
|
|
279445d6bc | ||
|
|
54778ee1e1 | ||
|
|
4efcda534d | ||
|
|
45ac5cb2fa | ||
|
|
6d045a9403 | ||
|
|
8c57a77d7e | ||
|
|
1f585d6719 | ||
|
|
6c111f55aa | ||
|
|
b01693f426 | ||
|
|
e37232aeb4 | ||
|
|
1c1c7dad7b | ||
|
|
b70b81f4cc | ||
|
|
e3cf41a666 | ||
|
|
851a307c23 | ||
|
|
183d3749f0 | ||
|
|
3fe513f9e0 | ||
|
|
81bee2bbc6 | ||
|
|
34719da000 | ||
|
|
df8a3d9c60 | ||
|
|
53dea9b069 | ||
|
|
186bae2bd4 | ||
|
|
f83c8828f0 | ||
|
|
509d064286 | ||
|
|
2d039e393a | ||
|
|
9ab88d9387 | ||
|
|
882a2a0e52 | ||
|
|
c6ce1d8c67 | ||
|
|
77e1a2e4be | ||
|
|
b99f53fda3 | ||
|
|
a7f64cf7aa | ||
|
|
8ebc0f2b24 | ||
|
|
5330dc34bc | ||
|
|
4854a9e320 | ||
|
|
71be1a9e28 | ||
|
|
d0ae09c7e2 | ||
|
|
a25bd06138 | ||
|
|
1b55076897 | ||
|
|
5eac7974c9 | ||
|
|
3afd6e9f51 | ||
|
|
05c107ba9c | ||
|
|
99b00daf87 | ||
|
|
8ddb99f62f | ||
|
|
47dec485e5 | ||
|
|
f191b4f35c | ||
|
|
e24e3c0612 | ||
|
|
1dfac0a8b9 | ||
|
|
f5cc151618 | ||
|
|
1ff3a61de6 | ||
|
|
81d5b651d2 | ||
|
|
ea4ed7cdd1 | ||
|
|
e30ea5206f | ||
|
|
c188f6e3cb | ||
|
|
2fb8999ac2 | ||
|
|
9c9bfc1a98 | ||
|
|
f7a87789ab | ||
|
|
7bcf02a0b4 | ||
|
|
fcd1733787 | ||
|
|
c04ec5953f | ||
|
|
63aa16b97c | ||
|
|
cafbf860be | ||
|
|
700b0bc776 | ||
|
|
98ca36e8f5 | ||
|
|
25130e3c82 | ||
|
|
dc463d1c2c | ||
|
|
89d30acbc5 | ||
|
|
be405d2311 | ||
|
|
acbe42775c | ||
|
|
42d8772dd6 | ||
|
|
81ef922f02 | ||
|
|
d6e18c8a35 | ||
|
|
4993a5c6c0 | ||
|
|
052382af89 | ||
|
|
18f7102461 | ||
|
|
ddbb2bea8a | ||
|
|
27131b43cb | ||
|
|
e8c2483432 | ||
|
|
fd495574a4 | ||
|
|
12f85b3d1f | ||
|
|
47d88bcfa7 | ||
|
|
e4dacaf0d2 | ||
|
|
2906a2d007 | ||
|
|
3000fdc33c | ||
|
|
076bde34a2 | ||
|
|
836c563c89 | ||
|
|
78c0419007 | ||
|
|
9dd5b91cea | ||
|
|
b4c8b00c0e | ||
|
|
430e72b424 | ||
|
|
135a8102f0 | ||
|
|
c9cf4ad02a | ||
|
|
3001809bc3 | ||
|
|
9e77ff328e | ||
|
|
efddcb18a3 | ||
|
|
54ff2bec90 | ||
|
|
287ed83de7 | ||
|
|
dd13924a67 | ||
|
|
a050a3b80f | ||
|
|
f1201eaebc | ||
|
|
68dd50ecbc | ||
|
|
2129cf5aa6 | ||
|
|
cf1bdcef46 | ||
|
|
7a879e2abf | ||
|
|
22878b6f89 | ||
|
|
e99064ca18 | ||
|
|
b93661508e | ||
|
|
27ade6c420 | ||
|
|
473249d605 | ||
|
|
62cf65ce0f | ||
|
|
c4f6aa2f90 | ||
|
|
9ca112c362 | ||
|
|
cdcc17ee37 | ||
|
|
4f3e1587b1 | ||
|
|
b18c92f515 | ||
|
|
3270edcf87 | ||
|
|
c0e8dd97ae | ||
|
|
3a0ae3df58 | ||
|
|
d6361dfee4 | ||
|
|
b61692b667 | ||
|
|
2815688c7e | ||
|
|
78a78a17cc | ||
|
|
e202d4e4a5 | ||
|
|
8b585db238 | ||
|
|
e288549c9e | ||
|
|
f71f129e3b | ||
|
|
ee688166ab | ||
|
|
ed66c37de2 | ||
|
|
a5c6f8023b | ||
|
|
c82da8c9c8 | ||
|
|
07d1358e08 | ||
|
|
1212109c03 | ||
|
|
d4db4fcac3 | ||
|
|
1f46c79396 | ||
|
|
199419ae62 | ||
|
|
39a4d55866 | ||
|
|
c84e1d0f0e | ||
|
|
302deeb122 | ||
|
|
b2a6cdec4e | ||
|
|
87676fad4d | ||
|
|
75087095b1 | ||
|
|
d0a5032723 | ||
|
|
2d6a7c2cf7 | ||
|
|
56e9158dee |
@@ -1,3 +1,5 @@
|
|||||||
|
.*
|
||||||
|
*~
|
||||||
Makefile
|
Makefile
|
||||||
*.o
|
*.o
|
||||||
lib*.a
|
lib*.a
|
||||||
|
|||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
if (NOT SYSTEM_EXPAT)
|
||||||
|
add_subdirectory(expat)
|
||||||
|
endif()
|
||||||
|
|
||||||
Vendored
+33
@@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
configure_file (
|
||||||
|
"${PROJECT_SOURCE_DIR}/3rdparty/expat/expat_config_cmake.in"
|
||||||
|
"${PROJECT_BINARY_DIR}/3rdparty/expat/expat_config.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(expat_sources
|
||||||
|
asciitab.h
|
||||||
|
hashtable.h
|
||||||
|
iasciitab.h
|
||||||
|
latin1tab.h
|
||||||
|
nametab.h
|
||||||
|
utf8tab.h
|
||||||
|
xmldef.h
|
||||||
|
xmlparse.h
|
||||||
|
xmlrole.h
|
||||||
|
xmltok.h
|
||||||
|
xmltok_impl.h
|
||||||
|
hashtable.c
|
||||||
|
xmlparse.c
|
||||||
|
xmlrole.c
|
||||||
|
xmltok.c
|
||||||
|
internal.h
|
||||||
|
ascii.h
|
||||||
|
sg_expat.h
|
||||||
|
sg_expat_external.h
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(s ${expat_sources})
|
||||||
|
set_property(GLOBAL
|
||||||
|
APPEND PROPERTY LOCAL_EXPAT_SOURCES
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
||||||
|
endforeach()
|
||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "expat_external.h"
|
#include "sg_expat_external.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
+1
-1
@@ -23,7 +23,7 @@
|
|||||||
#endif /* ndef COMPILED_FROM_DSP */
|
#endif /* ndef COMPILED_FROM_DSP */
|
||||||
|
|
||||||
#include "ascii.h"
|
#include "ascii.h"
|
||||||
#include "expat.h"
|
#include "sg_expat.h"
|
||||||
|
|
||||||
#ifdef XML_UNICODE
|
#ifdef XML_UNICODE
|
||||||
#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
|
#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif /* ndef COMPILED_FROM_DSP */
|
#endif /* ndef COMPILED_FROM_DSP */
|
||||||
|
|
||||||
#include "expat_external.h"
|
#include "sg_expat_external.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "xmlrole.h"
|
#include "xmlrole.h"
|
||||||
#include "ascii.h"
|
#include "ascii.h"
|
||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif /* ndef COMPILED_FROM_DSP */
|
#endif /* ndef COMPILED_FROM_DSP */
|
||||||
|
|
||||||
#include "expat_external.h"
|
#include "sg_expat_external.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
#include "xmltok.h"
|
#include "xmltok.h"
|
||||||
#include "nametab.h"
|
#include "nametab.h"
|
||||||
+154
-41
@@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 2.6.4)
|
|||||||
include (CheckFunctionExists)
|
include (CheckFunctionExists)
|
||||||
include (CheckIncludeFile)
|
include (CheckIncludeFile)
|
||||||
include (CheckCXXSourceCompiles)
|
include (CheckCXXSourceCompiles)
|
||||||
|
include (CheckCXXCompilerFlag)
|
||||||
|
|
||||||
project(SimGear)
|
project(SimGear)
|
||||||
|
|
||||||
@@ -10,9 +10,19 @@ project(SimGear)
|
|||||||
file(READ version versionFile)
|
file(READ version versionFile)
|
||||||
string(STRIP ${versionFile} SIMGEAR_VERSION)
|
string(STRIP ${versionFile} SIMGEAR_VERSION)
|
||||||
|
|
||||||
|
set(FIND_LIBRARY_USE_LIB64_PATHS ON)
|
||||||
|
|
||||||
# use simgear version also as the SO version (if building SOs)
|
# use simgear version also as the SO version (if building SOs)
|
||||||
SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
|
SET(SIMGEAR_SOVERSION ${SIMGEAR_VERSION})
|
||||||
|
|
||||||
|
# Warning when build is not an out-of-source build.
|
||||||
|
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" InSourceBuild)
|
||||||
|
if(InSourceBuild)
|
||||||
|
message(WARNING "Avoid building inside the source tree!")
|
||||||
|
message(WARNING "Create a separate build directory instead (i.e. 'sgbuild') and call CMake from there: ")
|
||||||
|
message(WARNING " mkdir ../sgbuild && cd ../sgbuild && cmake ${CMAKE_SOURCE_DIR}")
|
||||||
|
endif(InSourceBuild)
|
||||||
|
|
||||||
#packaging
|
#packaging
|
||||||
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
|
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
|
||||||
SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
|
SET(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README")
|
||||||
@@ -60,15 +70,44 @@ else(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
|||||||
endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
endif(${CMAKE_VERSION} VERSION_GREATER 2.8.4)
|
||||||
message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
|
message(STATUS "Library installation directory: ${CMAKE_INSTALL_LIBDIR}")
|
||||||
|
|
||||||
|
#####################################################################################
|
||||||
|
# Configure library search paths
|
||||||
|
#####################################################################################
|
||||||
|
|
||||||
|
if(NOT "${CMAKE_LIBRARY_ARCHITECTURE}" STREQUAL "")
|
||||||
|
# Workaround for Ubuntu/Debian which introduced the "multiarch" library
|
||||||
|
# directory structure, which is unsupported by CMake < 2.8.10, so we need to
|
||||||
|
# add paths manually
|
||||||
|
# see http://www.cmake.org/Bug/view.php?id=12049 and
|
||||||
|
# http://www.cmake.org/Bug/view.php?id=12037
|
||||||
|
list(APPEND ADDITIONAL_LIBRARY_PATHS
|
||||||
|
/usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
|
||||||
|
/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
|
||||||
|
/lib/${CMAKE_LIBRARY_ARCHITECTURE})
|
||||||
|
message(STATUS "additional library directories: ${ADDITIONAL_LIBRARY_PATHS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#####################################################################################
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
|
option(SIMGEAR_SHARED "Set to ON to build SimGear as a shared library/framework" OFF)
|
||||||
|
option(SYSTEM_EXPAT "Set to ON to build SimGear using the system libExpat" OFF)
|
||||||
|
else()
|
||||||
|
# Building SimGear DLLs is currently not supported for MSVC.
|
||||||
|
set(SIMGEAR_SHARED OFF)
|
||||||
|
# Using a system expat is currently not supported for MSVC - it would require shared simgear (DLL).
|
||||||
|
set(SYSTEM_EXPAT OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
|
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
|
||||||
option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
|
option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
|
||||||
option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
|
|
||||||
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
|
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
|
||||||
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
|
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
|
||||||
|
option(ENABLE_SOUND "Set to OFF to disable building SimGear's sound support" ON)
|
||||||
|
option(ENABLE_PKGUTIL "Set to ON to build the sg_pkgutil application (default)" ON)
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} PATH)
|
GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_BINARY_DIR} PATH)
|
||||||
if (CMAKE_CL_64)
|
if (CMAKE_CL_64)
|
||||||
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
|
SET(TEST_3RDPARTY_DIR "${PARENT_DIR}/3rdparty.x64")
|
||||||
else (CMAKE_CL_64)
|
else (CMAKE_CL_64)
|
||||||
@@ -86,11 +125,13 @@ endif (MSVC)
|
|||||||
if (MSVC AND MSVC_3RDPARTY_ROOT)
|
if (MSVC AND MSVC_3RDPARTY_ROOT)
|
||||||
message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
|
message(STATUS "3rdparty files located in ${MSVC_3RDPARTY_ROOT}")
|
||||||
set( OSG_MSVC "msvc" )
|
set( OSG_MSVC "msvc" )
|
||||||
if (${MSVC_VERSION} EQUAL 1600)
|
if (${MSVC_VERSION} EQUAL 1700)
|
||||||
|
set( OSG_MSVC ${OSG_MSVC}110 )
|
||||||
|
elseif (${MSVC_VERSION} EQUAL 1600)
|
||||||
set( OSG_MSVC ${OSG_MSVC}100 )
|
set( OSG_MSVC ${OSG_MSVC}100 )
|
||||||
else (${MSVC_VERSION} EQUAL 1600)
|
else (${MSVC_VERSION} EQUAL 1700)
|
||||||
set( OSG_MSVC ${OSG_MSVC}90 )
|
set( OSG_MSVC ${OSG_MSVC}90 )
|
||||||
endif (${MSVC_VERSION} EQUAL 1600)
|
endif (${MSVC_VERSION} EQUAL 1700)
|
||||||
if (CMAKE_CL_64)
|
if (CMAKE_CL_64)
|
||||||
set( OSG_MSVC ${OSG_MSVC}-64 )
|
set( OSG_MSVC ${OSG_MSVC}-64 )
|
||||||
set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
|
set( MSVC_3RDPARTY_DIR 3rdParty.x64 )
|
||||||
@@ -98,29 +139,47 @@ if (MSVC AND MSVC_3RDPARTY_ROOT)
|
|||||||
set( MSVC_3RDPARTY_DIR 3rdParty )
|
set( MSVC_3RDPARTY_DIR 3rdParty )
|
||||||
endif (CMAKE_CL_64)
|
endif (CMAKE_CL_64)
|
||||||
|
|
||||||
set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib )
|
set (CMAKE_LIBRARY_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/lib ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/lib )
|
||||||
set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include)
|
set (CMAKE_INCLUDE_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenScenegraph/include ${MSVC_3RDPARTY_ROOT}/install/${OSG_MSVC}/OpenRTI/include)
|
||||||
set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
|
find_path(BOOST_ROOT boost/version.hpp
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_52_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_51_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_50_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_49_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_48_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_47_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_46_1
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_46_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_45_0
|
||||||
|
${MSVC_3RDPARTY_ROOT}/boost_1_44_0
|
||||||
|
)
|
||||||
|
# set (BOOST_ROOT ${MSVC_3RDPARTY_ROOT}/boost_1_44_0)
|
||||||
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
|
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
|
||||||
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
|
set (OPENAL_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
|
||||||
set (ALUT_INCLUDE_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/include)
|
|
||||||
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
|
set (OPENAL_LIBRARY_DIR ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/lib)
|
||||||
endif (MSVC AND MSVC_3RDPARTY_ROOT)
|
endif (MSVC AND MSVC_3RDPARTY_ROOT)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
find_library(CORE_SERVICES_LIBRARY CoreServices)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(Boost REQUIRED)
|
find_package(Boost REQUIRED)
|
||||||
set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
|
set (BOOST_CXX_FLAGS "-DBOOST_MULTI_INDEX_DISABLE_SERIALIZATION -DBOOST_BIMAP_DISABLE_SERIALIZATION")
|
||||||
|
|
||||||
find_package(ZLIB REQUIRED)
|
|
||||||
find_package(Threads REQUIRED)
|
|
||||||
|
|
||||||
if(SIMGEAR_HEADLESS)
|
if(SIMGEAR_HEADLESS)
|
||||||
message(STATUS "SimGear mode: HEADLESS")
|
message(STATUS "SimGear mode: HEADLESS")
|
||||||
|
set(ENABLE_SOUND 0)
|
||||||
else()
|
else()
|
||||||
message(STATUS "SimGear mode: NORMAL")
|
message(STATUS "SimGear mode: NORMAL")
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
find_package(OpenAL REQUIRED)
|
|
||||||
find_package(ALUT REQUIRED)
|
if (ENABLE_SOUND)
|
||||||
find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgUtil)
|
find_package(OpenAL REQUIRED)
|
||||||
|
message(STATUS "Sound support: ENABLED")
|
||||||
|
endif(ENABLE_SOUND)
|
||||||
|
|
||||||
|
find_package(OpenSceneGraph 3.0.0 REQUIRED osgText osgSim osgDB osgParticle osgGA osgUtil)
|
||||||
endif(SIMGEAR_HEADLESS)
|
endif(SIMGEAR_HEADLESS)
|
||||||
|
|
||||||
if(JPEG_FACTORY)
|
if(JPEG_FACTORY)
|
||||||
@@ -131,28 +190,37 @@ else()
|
|||||||
message(STATUS "JPEG-factory: DISABLED")
|
message(STATUS "JPEG-factory: DISABLED")
|
||||||
endif(JPEG_FACTORY)
|
endif(JPEG_FACTORY)
|
||||||
|
|
||||||
if(ENABLE_LIBSVN)
|
find_package(ZLIB REQUIRED)
|
||||||
find_package(SvnClient)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
if (SYSTEM_EXPAT)
|
||||||
|
message(STATUS "Requested to use system Expat library, forcing SIMGEAR_SHARED to true")
|
||||||
|
set(SIMGEAR_SHARED ON)
|
||||||
|
find_package(EXPAT REQUIRED)
|
||||||
|
|
||||||
if(LIBSVN_FOUND)
|
|
||||||
message(STATUS "Subversion client support: ENABLED")
|
|
||||||
set(HAVE_SVN_CLIENT_H 1)
|
|
||||||
set(HAVE_LIBSVN_CLIENT_1 1)
|
|
||||||
else()
|
|
||||||
# Oops. ENABLE_LIBSVN is ON, but svn is still missing.
|
|
||||||
# Provide clearly visible warning/hint, so builders know what else they should install (or disable).
|
|
||||||
message(WARNING "Failed to enable subversion client support. Unable to find required subversion client library. Some features may not be available (scenery download).")
|
|
||||||
message(WARNING "Install 'libsvn' library/DLL (libsvn-devel/libsvnclient/...). Otherwise disable subversion support (set 'ENABLE_LIBSVN' to 'OFF').")
|
|
||||||
endif(LIBSVN_FOUND)
|
|
||||||
else()
|
else()
|
||||||
message(STATUS "Subversion client support: DISABLED")
|
message(STATUS "Using built-in expat code")
|
||||||
endif(ENABLE_LIBSVN)
|
# XML_STATIC is important to avoid sg_expat_external.h
|
||||||
|
# declaring symbols as declspec(import)
|
||||||
|
add_definitions(-DHAVE_EXPAT_CONFIG_H -DXML_STATIC)
|
||||||
|
set(EXPAT_INCLUDE_DIRS
|
||||||
|
${PROJECT_SOURCE_DIR}/3rdparty/expat
|
||||||
|
${PROJECT_BINARY_DIR}/3rdparty/expat)
|
||||||
|
endif(SYSTEM_EXPAT)
|
||||||
|
|
||||||
|
include_directories(${EXPAT_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
check_include_file(inttypes.h HAVE_INTTYPES_H)
|
||||||
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
check_include_file(sys/time.h HAVE_SYS_TIME_H)
|
||||||
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
|
check_include_file(sys/timeb.h HAVE_SYS_TIMEB_H)
|
||||||
check_include_file(unistd.h HAVE_UNISTD_H)
|
check_include_file(unistd.h HAVE_UNISTD_H)
|
||||||
check_include_file(windows.h HAVE_WINDOWS_H)
|
check_include_file(windows.h HAVE_WINDOWS_H)
|
||||||
|
|
||||||
|
if(HAVE_INTTYPES_H)
|
||||||
|
# ShivaVG needs inttypes.h
|
||||||
|
add_definitions(-DHAVE_INTTYPES_H)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ENABLE_RTI)
|
if(ENABLE_RTI)
|
||||||
# See if we have any rti library variant installed
|
# See if we have any rti library variant installed
|
||||||
message(STATUS "RTI: ENABLED")
|
message(STATUS "RTI: ENABLED")
|
||||||
@@ -190,6 +258,20 @@ if(HAVE_CLOCK_GETTIME)
|
|||||||
endif(HAVE_RT)
|
endif(HAVE_RT)
|
||||||
endif(HAVE_CLOCK_GETTIME)
|
endif(HAVE_CLOCK_GETTIME)
|
||||||
|
|
||||||
|
set(DL_LIBRARY "")
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"#include <dlfcn.h>
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
"
|
||||||
|
HAVE_DLFCN_H)
|
||||||
|
|
||||||
|
if(HAVE_DLFCN_H)
|
||||||
|
check_library_exists(dl dlerror "" HAVE_DL)
|
||||||
|
set(DL_LIBRARY "dl")
|
||||||
|
endif()
|
||||||
|
|
||||||
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
|
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually 'd' on windows")
|
||||||
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
||||||
SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
SET(CMAKE_RELWITHDEBINFO_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
|
||||||
@@ -201,6 +283,11 @@ check_cxx_source_compiles(
|
|||||||
void f() { isnan(0.0);} "
|
void f() { isnan(0.0);} "
|
||||||
HAVE_ISNAN)
|
HAVE_ISNAN)
|
||||||
|
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"#include <cmath>
|
||||||
|
void f() { std::isnan(0.0);} "
|
||||||
|
HAVE_STD_ISNAN)
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
set(WARNING_FLAGS_CXX "-Wall")
|
set(WARNING_FLAGS_CXX "-Wall")
|
||||||
set(WARNING_FLAGS_C "-Wall")
|
set(WARNING_FLAGS_C "-Wall")
|
||||||
@@ -218,6 +305,14 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|||||||
set(WARNING_FLAGS_C "-Wall")
|
set(WARNING_FLAGS_C "-Wall")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
# boost goes haywire wrt static asserts
|
||||||
|
check_cxx_compiler_flag(-Wno-unused-local-typedefs HAS_NOWARN_UNUSED_TYPEDEFS)
|
||||||
|
if(HAS_NOWARN_UNUSED_TYPEDEFS)
|
||||||
|
set(WARNING_FLAGS_CXX " ${WARNING_FLAGS_CXX} -Wno-unused-local-typedefs")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
|
||||||
if(MINGW)
|
if(MINGW)
|
||||||
@@ -230,7 +325,10 @@ if(WIN32)
|
|||||||
# SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
|
# SET(WARNING_FLAGS "${WARNING_FLAGS} /wd${warning}")
|
||||||
# endforeach(warning)
|
# endforeach(warning)
|
||||||
|
|
||||||
set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996")
|
set(MSVC_FLAGS "-DWIN32 -DNOMINMAX -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D__CRT_NONSTDC_NO_WARNINGS /wd4996 /wd4250 -Dstrdup=_strdup")
|
||||||
|
if (${MSVC_VERSION} GREATER 1599)
|
||||||
|
set( MSVC_LD_FLAGS "/FORCE:MULTIPLE" )
|
||||||
|
endif (${MSVC_VERSION} GREATER 1599)
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|
||||||
# assumed on Windows
|
# assumed on Windows
|
||||||
@@ -242,17 +340,19 @@ endif(WIN32)
|
|||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS_C} ${MSVC_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS_CXX} ${MSVC_FLAGS} ${BOOST_CXX_FLAGS}")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${MSVC_LD_FLAGS}")
|
||||||
|
|
||||||
include_directories(${PROJECT_SOURCE_DIR})
|
include_directories(${PROJECT_SOURCE_DIR})
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/simgear/canvas/ShivaVG/include)
|
||||||
include_directories(${PROJECT_BINARY_DIR}/simgear)
|
include_directories(${PROJECT_BINARY_DIR}/simgear)
|
||||||
include_directories(${PROJECT_BINARY_DIR}/simgear/xml)
|
|
||||||
|
|
||||||
include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
|
include_directories(${OPENSCENEGRAPH_INCLUDE_DIRS}
|
||||||
${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}
|
${Boost_INCLUDE_DIRS}
|
||||||
${ALUT_INCLUDE_DIR} ${OPENAL_INCLUDE_DIR} )
|
${ZLIB_INCLUDE_DIR}
|
||||||
|
${OPENAL_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
add_definitions(-DHAVE_CONFIG_H)
|
add_definitions(-DHAVE_CONFIG_H)
|
||||||
add_definitions(-DHAVE_EXPAT_CONFIG_H)
|
|
||||||
|
|
||||||
# configure a header file to pass some of the CMake settings
|
# configure a header file to pass some of the CMake settings
|
||||||
# to the source code
|
# to the source code
|
||||||
@@ -261,22 +361,33 @@ configure_file (
|
|||||||
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
|
"${PROJECT_BINARY_DIR}/simgear/simgear_config.h"
|
||||||
)
|
)
|
||||||
|
|
||||||
configure_file (
|
|
||||||
"${PROJECT_SOURCE_DIR}/simgear/xml/expat_config_cmake.in"
|
|
||||||
"${PROJECT_BINARY_DIR}/simgear/xml/expat_config.h"
|
|
||||||
)
|
|
||||||
|
|
||||||
if(ENABLE_TESTS)
|
if(ENABLE_TESTS)
|
||||||
# enable CTest / make test target
|
# enable CTest / make test target
|
||||||
message(STATUS "Tests: ENABLED")
|
message(STATUS "Tests: ENABLED")
|
||||||
|
|
||||||
include (Dart)
|
include (Dart)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
else()
|
else()
|
||||||
message(STATUS "Tests: DISABLED")
|
message(STATUS "Tests: DISABLED")
|
||||||
endif(ENABLE_TESTS)
|
endif(ENABLE_TESTS)
|
||||||
|
|
||||||
|
# always set TEST_LIBS as it is also used by other tools/applications
|
||||||
|
set(TEST_LIBS_INTERNAL_CORE
|
||||||
|
${CMAKE_THREAD_LIBS_INIT}
|
||||||
|
${ZLIB_LIBRARY}
|
||||||
|
${WINSOCK_LIBRARY}
|
||||||
|
${RT_LIBRARY}
|
||||||
|
${DL_LIBRARY}
|
||||||
|
${CORE_SERVICES_LIBRARY})
|
||||||
|
set(TEST_LIBS SimGearCore ${TEST_LIBS_INTERNAL_CORE})
|
||||||
|
|
||||||
|
if(NOT SIMGEAR_HEADLESS)
|
||||||
|
set(TEST_LIBS SimGearScene ${OPENGL_LIBRARIES} ${TEST_LIBS})
|
||||||
|
endif()
|
||||||
|
|
||||||
install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
|
install (FILES ${PROJECT_BINARY_DIR}/simgear/simgear_config.h DESTINATION include/simgear/)
|
||||||
|
|
||||||
|
add_subdirectory(3rdparty)
|
||||||
add_subdirectory(simgear)
|
add_subdirectory(simgear)
|
||||||
|
|
||||||
#-----------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------
|
||||||
@@ -288,3 +399,5 @@ CONFIGURE_FILE(
|
|||||||
IMMEDIATE @ONLY)
|
IMMEDIATE @ONLY)
|
||||||
ADD_CUSTOM_TARGET(uninstall
|
ADD_CUSTOM_TARGET(uninstall
|
||||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
# Locate ALUT
|
|
||||||
# This module defines
|
|
||||||
# ALUT_LIBRARY
|
|
||||||
# ALUT_FOUND, if false, do not try to link to ALUT
|
|
||||||
# ALUT_INCLUDE_DIR, where to find the headers
|
|
||||||
#
|
|
||||||
# $ALUTDIR is an environment variable that would
|
|
||||||
# correspond to the ./configure --prefix=$ALUTDIR
|
|
||||||
# used in building ALUT.
|
|
||||||
#
|
|
||||||
# Created by James Turner. This was influenced by the FindOpenAL.cmake module.
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Copyright 2005-2009 Kitware, Inc.
|
|
||||||
#
|
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
|
||||||
# see accompanying file Copyright.txt for details.
|
|
||||||
#
|
|
||||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
||||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the License for more information.
|
|
||||||
#=============================================================================
|
|
||||||
# (To distributed this file outside of CMake, substitute the full
|
|
||||||
# License text for the above reference.)
|
|
||||||
|
|
||||||
# Per my request, CMake should search for frameworks first in
|
|
||||||
# the following order:
|
|
||||||
# ~/Library/Frameworks/OpenAL.framework/Headers
|
|
||||||
# /Library/Frameworks/OpenAL.framework/Headers
|
|
||||||
# /System/Library/Frameworks/OpenAL.framework/Headers
|
|
||||||
#
|
|
||||||
# On OS X, this will prefer the Framework version (if found) over others.
|
|
||||||
# People will have to manually change the cache values of
|
|
||||||
# OPENAL_LIBRARY to override this selection or set the CMake environment
|
|
||||||
# CMAKE_INCLUDE_PATH to modify the search paths.
|
|
||||||
|
|
||||||
FIND_LIBRARY(ALUT_LIBRARY
|
|
||||||
NAMES ALUT alut
|
|
||||||
HINTS
|
|
||||||
$ENV{ALUTDIR}
|
|
||||||
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
|
|
||||||
PATHS
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_PATH(ALUT_INCLUDE_DIR
|
|
||||||
NAMES ALUT/alut.h alut.h
|
|
||||||
HINTS
|
|
||||||
$ENV{ALUTDIR}
|
|
||||||
PATH_SUFFIXES include/AL include
|
|
||||||
PATHS
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALUT DEFAULT_MSG ALUT_LIBRARY ALUT_INCLUDE_DIR)
|
|
||||||
|
|
||||||
MARK_AS_ADVANCED(ALUT_LIBRARY ALUT_INCLUDE_DIR)
|
|
||||||
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
# Find Subversion client libraries, and dependencies
|
|
||||||
# including APR (Apache Portable Runtime)
|
|
||||||
|
|
||||||
include (CheckFunctionExists)
|
|
||||||
include (CheckIncludeFile)
|
|
||||||
include (CheckLibraryExists)
|
|
||||||
|
|
||||||
macro(find_static_component comp libs)
|
|
||||||
# account for alternative Windows svn distribution naming
|
|
||||||
if(MSVC)
|
|
||||||
set(compLib "lib${comp}")
|
|
||||||
else(MSVC)
|
|
||||||
set(compLib "${comp}")
|
|
||||||
endif(MSVC)
|
|
||||||
|
|
||||||
string(TOUPPER "${comp}" compLibBase)
|
|
||||||
set( compLibName ${compLibBase}_LIBRARY )
|
|
||||||
|
|
||||||
FIND_LIBRARY(${compLibName}
|
|
||||||
NAMES ${compLib}
|
|
||||||
HINTS $ENV{PLIBDIR}
|
|
||||||
PATH_SUFFIXES lib64 lib libs64 libs libs/Win32 libs/Win64
|
|
||||||
PATHS
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND ${libs} ${${compLibName}})
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
find_program(HAVE_APR_CONFIG apr-1-config)
|
|
||||||
if(HAVE_APR_CONFIG)
|
|
||||||
|
|
||||||
execute_process(COMMAND apr-1-config --cppflags --includes
|
|
||||||
OUTPUT_VARIABLE APR_CFLAGS
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
|
|
||||||
execute_process(COMMAND apr-1-config --link-ld
|
|
||||||
OUTPUT_VARIABLE RAW_APR_LIBS
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
|
|
||||||
# clean up some vars, or other CMake pieces complain
|
|
||||||
string(STRIP "${RAW_APR_LIBS}" APR_LIBS)
|
|
||||||
|
|
||||||
else(HAVE_APR_CONFIG)
|
|
||||||
message(STATUS "apr-1-config not found, implement manual search for APR")
|
|
||||||
endif(HAVE_APR_CONFIG)
|
|
||||||
|
|
||||||
if(HAVE_APR_CONFIG OR MSVC)
|
|
||||||
find_path(LIBSVN_INCLUDE_DIR svn_client.h
|
|
||||||
HINTS
|
|
||||||
$ENV{LIBSVN_DIR}
|
|
||||||
PATH_SUFFIXES include/subversion-1
|
|
||||||
PATHS
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
set(LIBSVN_LIBRARIES "")
|
|
||||||
if (MSVC)
|
|
||||||
find_static_component("apr-1" LIBSVN_LIBRARIES)
|
|
||||||
else (MSVC)
|
|
||||||
list(APPEND LIBSVN_LIBRARIES ${APR_LIBS})
|
|
||||||
endif (MSVC)
|
|
||||||
find_static_component("svn_client-1" LIBSVN_LIBRARIES)
|
|
||||||
find_static_component("svn_subr-1" LIBSVN_LIBRARIES)
|
|
||||||
find_static_component("svn_ra-1" LIBSVN_LIBRARIES)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBSVN DEFAULT_MSG LIBSVN_LIBRARIES LIBSVN_INCLUDE_DIR)
|
|
||||||
if(NOT LIBSVN_FOUND)
|
|
||||||
set(LIBSVN_LIBRARIES "")
|
|
||||||
endif(NOT LIBSVN_FOUND)
|
|
||||||
endif(HAVE_APR_CONFIG OR MSVC)
|
|
||||||
@@ -1,23 +1,21 @@
|
|||||||
|
|
||||||
macro(simgear_component_common name includePath sourcesList sources headers)
|
macro(simgear_component_common name includePath sourcesList sources headers)
|
||||||
if (SIMGEAR_SHARED)
|
set(fc${sourcesList} ${name})
|
||||||
|
set(fh${sourcesList} ${name})
|
||||||
|
foreach(s ${sources})
|
||||||
|
set_property(GLOBAL
|
||||||
|
APPEND PROPERTY ${sourcesList} "${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
||||||
|
set(fc${sourcesList} "${fc${sourcesList}}#${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
foreach(s ${sources})
|
foreach(h ${headers})
|
||||||
set_property(GLOBAL
|
set_property(GLOBAL
|
||||||
APPEND PROPERTY ${sourcesList} "${CMAKE_CURRENT_SOURCE_DIR}/${s}")
|
APPEND PROPERTY PUBLIC_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/${h}")
|
||||||
endforeach()
|
set(fh${sourcesList} "${fh${sourcesList}}#${CMAKE_CURRENT_SOURCE_DIR}/${h}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
foreach(h ${headers})
|
set_property(GLOBAL APPEND PROPERTY FG_GROUPS_${sourcesList}_C "${fc${sourcesList}}@")
|
||||||
set_property(GLOBAL
|
set_property(GLOBAL APPEND PROPERTY FG_GROUPS_${sourcesList}_H "${fh${sourcesList}}@")
|
||||||
APPEND PROPERTY PUBLIC_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/${h}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
else()
|
|
||||||
set(libName "sg${name}")
|
|
||||||
add_library(${libName} STATIC ${sources} ${headers})
|
|
||||||
|
|
||||||
install (TARGETS ${libName} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install (FILES ${headers} DESTINATION include/simgear/${includePath})
|
install (FILES ${headers} DESTINATION include/simgear/${includePath})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ PROJECT_NAME = SimGear
|
|||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 2.2.0
|
PROJECT_NUMBER = 2.11.0
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
@@ -56,7 +56,7 @@ EXTRACT_PRIVATE = NO
|
|||||||
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
# If the EXTRACT_STATIC tag is set to YES all static members of a file
|
||||||
# will be included in the documentation.
|
# will be included in the documentation.
|
||||||
|
|
||||||
EXTRACT_STATIC = NO
|
EXTRACT_STATIC = YES
|
||||||
|
|
||||||
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
|
# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
|
||||||
# undocumented members of documented classes, files or namespaces.
|
# undocumented members of documented classes, files or namespaces.
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ SimGear depends on a number of 3rd party libraries, the most notable
|
|||||||
being:
|
being:
|
||||||
|
|
||||||
* OpenSceneGraph (OSG) - see README.OSG
|
* OpenSceneGraph (OSG) - see README.OSG
|
||||||
* Portable Games Library (PLIB) - see README.plib
|
|
||||||
* zlib compression library - see README.zlib
|
* zlib compression library - see README.zlib
|
||||||
* Open Audio Library (OpenAL) - see README.OpenAL
|
* Open Audio Library (OpenAL) - see README.OpenAL
|
||||||
* Subversion Client Library (optional dependency)
|
* Subversion Client Library (optional dependency)
|
||||||
|
|||||||
@@ -18,12 +18,3 @@ ccmake .
|
|||||||
then press 'g' to generate and exit ]
|
then press 'g' to generate and exit ]
|
||||||
|
|
||||||
|
|
||||||
The alut library is also required, but comes separately in the package
|
|
||||||
freelut-1.1.0.tar.gz. This package can be downloaded from the same page
|
|
||||||
(http://connect.creativelabs.com/openal/default.aspx). Download and run:
|
|
||||||
tar xzvf freelut-1.1.0.tar.gz
|
|
||||||
cd freealut-1.1.0
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
sudo make install
|
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -20,8 +20,8 @@ Probably you want to specify an install prefix:
|
|||||||
cmake ../simgear -DCMAKE_INSTALL_PREFIX=/usr
|
cmake ../simgear -DCMAKE_INSTALL_PREFIX=/usr
|
||||||
|
|
||||||
Note the install prefix is automatically searched for required libraries
|
Note the install prefix is automatically searched for required libraries
|
||||||
and header files, so if you install PLIB, OpenSceneGraph to the
|
and header files, so if you install OpenSceneGraph to the same prefix,
|
||||||
same prefix, most configuration options are unnecessary.
|
most configuration options are unnecessary.
|
||||||
|
|
||||||
If for some reason you have a dependency (or several) at a different prefix,
|
If for some reason you have a dependency (or several) at a different prefix,
|
||||||
you can specify one or more via CMAKE_PREFIX_PATH:
|
you can specify one or more via CMAKE_PREFIX_PATH:
|
||||||
@@ -33,7 +33,7 @@ you can specify one or more via CMAKE_PREFIX_PATH:
|
|||||||
Standard prefixes are searched automatically (/usr, /usr/local, /opt/local)
|
Standard prefixes are searched automatically (/usr, /usr/local, /opt/local)
|
||||||
|
|
||||||
Most dependencies also expose an environment variable to specify their
|
Most dependencies also expose an environment variable to specify their
|
||||||
installation directory explicitly eg OSG_DIR or PLIBDIR. Any of the methods
|
installation directory explicitly eg OSG_DIR. Any of the methods
|
||||||
described above will work, but specifying an INSTALL_PREFIX or PREFIX_PATH is
|
described above will work, but specifying an INSTALL_PREFIX or PREFIX_PATH is
|
||||||
usually simpler.
|
usually simpler.
|
||||||
|
|
||||||
|
|||||||
-32
@@ -1,32 +0,0 @@
|
|||||||
[This file is mirrored in both the FlightGear and SimGear packages.]
|
|
||||||
|
|
||||||
You *must* have plib version 1.8.5 or later installed on your system
|
|
||||||
to build FlightGear!" Flight Gear is no longer compatible with the
|
|
||||||
earlier versions of the library.
|
|
||||||
|
|
||||||
You can get the latest version of plib from:
|
|
||||||
|
|
||||||
http://plib.sourceforge.net
|
|
||||||
|
|
||||||
Build notes:
|
|
||||||
|
|
||||||
You should be able to just run "./configure" to configure the package
|
|
||||||
and use all of plib's defaults. Then run "make" followed by "make
|
|
||||||
install". By default, plib installs itself into /usr so if you don't
|
|
||||||
like this, be sure to specify an alternate prefix such as --prefix=/usr/local
|
|
||||||
|
|
||||||
As of this writing (2007-11-18), many linux distributions are shipped with a
|
|
||||||
working version of plib, so chances are that this library is already
|
|
||||||
installed. It should be noted, that currently plib version no longer compiles
|
|
||||||
using recent versions of gcc (confirmed on version gcc 4.1.2, as shipped with
|
|
||||||
SuSe 10.2). As a workaround, it is possible to either use plib SVN. Run the
|
|
||||||
following commands:
|
|
||||||
|
|
||||||
|
|
||||||
svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib
|
|
||||||
cd plib
|
|
||||||
./autogen.sh
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
make install
|
|
||||||
|
|
||||||
@@ -9,9 +9,7 @@ Source: http://mirrors.ibiblio.org/pub/mirrors/flightgear/ftp/Source/simgear
|
|||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
|
||||||
BuildRequires: gcc, gcc-c++, cmake
|
BuildRequires: gcc, gcc-c++, cmake
|
||||||
BuildRequires: freealut, freealut-devel
|
|
||||||
BuildRequires: libopenal1-soft, openal-soft
|
BuildRequires: libopenal1-soft, openal-soft
|
||||||
BuildRequires: plib-devel >= 1.8.5
|
|
||||||
BuildRequires: libOpenSceneGraph-devel >= 3.0
|
BuildRequires: libOpenSceneGraph-devel >= 3.0
|
||||||
BuildRequires: zlib, zlib-devel
|
BuildRequires: zlib, zlib-devel
|
||||||
BuildRequires: libjpeg62, libjpeg62-devel
|
BuildRequires: libjpeg62, libjpeg62-devel
|
||||||
@@ -27,7 +25,6 @@ simulation and visualization applications such as FlightGear or TerraGear.
|
|||||||
Group: Development/Libraries/Other
|
Group: Development/Libraries/Other
|
||||||
Summary: Development header files for SimGear
|
Summary: Development header files for SimGear
|
||||||
Requires: SimGear = %{version}
|
Requires: SimGear = %{version}
|
||||||
Requires: plib-devel
|
|
||||||
|
|
||||||
%description devel
|
%description devel
|
||||||
Development headers and libraries for building applications against SimGear.
|
Development headers and libraries for building applications against SimGear.
|
||||||
|
|||||||
+86
-36
@@ -3,6 +3,7 @@ file(WRITE ${PROJECT_BINARY_DIR}/simgear/version.h "#define SIMGEAR_VERSION ${SI
|
|||||||
|
|
||||||
foreach( mylibfolder
|
foreach( mylibfolder
|
||||||
bucket
|
bucket
|
||||||
|
bvh
|
||||||
debug
|
debug
|
||||||
ephemeris
|
ephemeris
|
||||||
io
|
io
|
||||||
@@ -10,12 +11,14 @@ foreach( mylibfolder
|
|||||||
math
|
math
|
||||||
misc
|
misc
|
||||||
nasal
|
nasal
|
||||||
|
nasal/cppbind
|
||||||
props
|
props
|
||||||
serial
|
serial
|
||||||
structure
|
structure
|
||||||
threads
|
threads
|
||||||
timing
|
timing
|
||||||
xml
|
xml
|
||||||
|
package
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(${mylibfolder})
|
add_subdirectory(${mylibfolder})
|
||||||
@@ -23,6 +26,7 @@ foreach( mylibfolder
|
|||||||
endforeach( mylibfolder )
|
endforeach( mylibfolder )
|
||||||
|
|
||||||
if(NOT SIMGEAR_HEADLESS)
|
if(NOT SIMGEAR_HEADLESS)
|
||||||
|
add_subdirectory(canvas)
|
||||||
add_subdirectory(environment)
|
add_subdirectory(environment)
|
||||||
add_subdirectory(screen)
|
add_subdirectory(screen)
|
||||||
add_subdirectory(scene)
|
add_subdirectory(scene)
|
||||||
@@ -38,56 +42,102 @@ endif(ENABLE_RTI)
|
|||||||
set(HEADERS compiler.h constants.h sg_inlines.h ${PROJECT_BINARY_DIR}/simgear/version.h)
|
set(HEADERS compiler.h constants.h sg_inlines.h ${PROJECT_BINARY_DIR}/simgear/version.h)
|
||||||
install (FILES ${HEADERS} DESTINATION include/simgear/)
|
install (FILES ${HEADERS} DESTINATION include/simgear/)
|
||||||
|
|
||||||
|
get_property(coreSources GLOBAL PROPERTY CORE_SOURCES)
|
||||||
|
get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES)
|
||||||
|
get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS)
|
||||||
|
get_property(localExpatSources GLOBAL PROPERTY LOCAL_EXPAT_SOURCES)
|
||||||
|
|
||||||
if(SIMGEAR_SHARED)
|
if(SIMGEAR_SHARED)
|
||||||
message(STATUS "Library building mode: SHARED LIBRARIES")
|
message(STATUS "Library building mode: SHARED LIBRARIES")
|
||||||
get_property(coreSources GLOBAL PROPERTY CORE_SOURCES)
|
add_library(SimGearCore SHARED ${coreSources} ${localExpatSources})
|
||||||
get_property(sceneSources GLOBAL PROPERTY SCENE_SOURCES)
|
|
||||||
get_property(publicHeaders GLOBAL PROPERTY PUBLIC_HEADERS)
|
|
||||||
|
|
||||||
add_library(SimGearCore SHARED ${coreSources})
|
|
||||||
|
|
||||||
# set_property(TARGET SimGearCore PROPERTY FRAMEWORK 1)
|
|
||||||
# message(STATUS "public header: ${publicHeaders}")
|
|
||||||
# set_property(TARGET SimGearCore PROPERTY PUBLIC_HEADER "${publicHeaders}")
|
|
||||||
set_property(TARGET SimGearCore PROPERTY LINKER_LANGUAGE CXX)
|
set_property(TARGET SimGearCore PROPERTY LINKER_LANGUAGE CXX)
|
||||||
|
|
||||||
set_property(TARGET SimGearCore PROPERTY VERSION ${SIMGEAR_VERSION})
|
set_property(TARGET SimGearCore PROPERTY VERSION ${SIMGEAR_VERSION})
|
||||||
set_property(TARGET SimGearCore PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
set_property(TARGET SimGearCore PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
||||||
|
install(TARGETS SimGearCore EXPORT SimGearCoreConfig LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
target_link_libraries(SimGearCore ${ZLIB_LIBRARY} ${RT_LIBRARY})
|
install(EXPORT SimGearCoreConfig DESTINATION share/SimGearCore)
|
||||||
install(TARGETS SimGearCore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
|
|
||||||
if(LIBSVN_FOUND)
|
|
||||||
add_definitions(${APR_CFLAGS})
|
|
||||||
|
|
||||||
IF(APPLE)
|
|
||||||
set_property(SOURCE scene/tsync/terrasync.cxx PROPERTY COMPILE_FLAGS "-iwithsysroot ${LIBSVN_INCLUDE_DIR}")
|
|
||||||
ELSE()
|
|
||||||
include_directories(${LIBSVN_INCLUDE_DIR})
|
|
||||||
ENDIF(APPLE)
|
|
||||||
target_link_libraries(SimGearCore ${LIBSVN_LIBRARIES})
|
|
||||||
endif(LIBSVN_FOUND)
|
|
||||||
|
|
||||||
if(NOT SIMGEAR_HEADLESS)
|
if(NOT SIMGEAR_HEADLESS)
|
||||||
add_library(SimGearScene SHARED ${sceneSources})
|
add_library(SimGearScene SHARED ${sceneSources})
|
||||||
# set_property(TARGET SimGearScene PROPERTY FRAMEWORK 1)
|
|
||||||
# set_property(TARGET SimGearScene PROPERTY PUBLIC_HEADER "${publicHeaders}")
|
|
||||||
set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX)
|
set_property(TARGET SimGearScene PROPERTY LINKER_LANGUAGE CXX)
|
||||||
set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION})
|
set_property(TARGET SimGearScene PROPERTY VERSION ${SIMGEAR_VERSION})
|
||||||
set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
set_property(TARGET SimGearScene PROPERTY SOVERSION ${SIMGEAR_SOVERSION})
|
||||||
|
|
||||||
target_link_libraries(SimGearScene
|
# EXPORT SimGearSceneConfig
|
||||||
SimGearCore
|
install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} )
|
||||||
${ZLIB_LIBRARY}
|
# install(EXPORT SimGearSceneConfig DESTINATION share/SimGearScene)
|
||||||
${OPENSCENEGRAPH_LIBRARIES}
|
|
||||||
${OPENAL_LIBRARY} ${ALUT_LIBRARY}
|
|
||||||
${OPENGL_LIBRARY}
|
|
||||||
${JPEG_LIBRARY})
|
|
||||||
|
|
||||||
install(TARGETS SimGearScene LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
else()
|
else()
|
||||||
message(STATUS "Library building mode: STATIC LIBRARIES")
|
message(STATUS "Library building mode: STATIC LIBRARIES")
|
||||||
|
|
||||||
|
get_property(FG_GROUPS_CORE_SOURCES_C GLOBAL PROPERTY FG_GROUPS_CORE_SOURCES_C)
|
||||||
|
string(REPLACE "@" ";" groups ${FG_GROUPS_CORE_SOURCES_C} )
|
||||||
|
foreach(g ${groups})
|
||||||
|
string(REPLACE "#" ";" g2 ${g})
|
||||||
|
list(GET g2 0 name)
|
||||||
|
list(REMOVE_AT g2 0)
|
||||||
|
source_group("${name}\\Sources" FILES ${g2})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
get_property(FG_GROUPS_CORE_SOURCES_H GLOBAL PROPERTY FG_GROUPS_CORE_SOURCES_H)
|
||||||
|
string(REPLACE "@" ";" groups ${FG_GROUPS_CORE_SOURCES_H} )
|
||||||
|
foreach(g ${groups})
|
||||||
|
string(REPLACE "#" ";" g2 ${g})
|
||||||
|
list(GET g2 0 name)
|
||||||
|
list(REMOVE_AT g2 0)
|
||||||
|
source_group("${name}\\Headers" FILES ${g2})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_library(SimGearCore STATIC ${coreSources} ${localExpatSources})
|
||||||
|
install(TARGETS SimGearCore ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
|
if(NOT SIMGEAR_HEADLESS)
|
||||||
|
get_property(FG_GROUPS_SCENE_SOURCES_C GLOBAL PROPERTY FG_GROUPS_SCENE_SOURCES_C)
|
||||||
|
string(REPLACE "@" ";" groups ${FG_GROUPS_SCENE_SOURCES_C} )
|
||||||
|
foreach(g ${groups})
|
||||||
|
string(REPLACE "#" ";" g2 ${g})
|
||||||
|
list(GET g2 0 name)
|
||||||
|
list(REMOVE_AT g2 0)
|
||||||
|
source_group("${name}\\Sources" FILES ${g2})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
get_property(FG_GROUPS_SCENE_SOURCES_H GLOBAL PROPERTY FG_GROUPS_SCENE_SOURCES_H)
|
||||||
|
string(REPLACE "@" ";" groups ${FG_GROUPS_SCENE_SOURCES_H} )
|
||||||
|
foreach(g ${groups})
|
||||||
|
string(REPLACE "#" ";" g2 ${g})
|
||||||
|
list(GET g2 0 name)
|
||||||
|
list(REMOVE_AT g2 0)
|
||||||
|
source_group("${name}\\Headers" FILES ${g2})
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
add_library(SimGearScene STATIC ${sceneSources})
|
||||||
|
install(TARGETS SimGearScene ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
endif(NOT SIMGEAR_HEADLESS)
|
||||||
endif(SIMGEAR_SHARED)
|
endif(SIMGEAR_SHARED)
|
||||||
|
|
||||||
|
target_link_libraries(SimGearCore
|
||||||
|
${ZLIB_LIBRARY}
|
||||||
|
${RT_LIBRARY}
|
||||||
|
${DL_LIBRARY}
|
||||||
|
${EXPAT_LIBRARIES}
|
||||||
|
${CMAKE_THREAD_LIBS_INIT}
|
||||||
|
${CORE_SERVICES_LIBRARY})
|
||||||
|
|
||||||
|
if(NOT SIMGEAR_HEADLESS)
|
||||||
|
target_link_libraries(SimGearScene
|
||||||
|
SimGearCore
|
||||||
|
${ZLIB_LIBRARY}
|
||||||
|
${OPENSCENEGRAPH_LIBRARIES}
|
||||||
|
${OPENAL_LIBRARY}
|
||||||
|
${OPENGL_LIBRARY}
|
||||||
|
${JPEG_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_RTI)
|
||||||
|
# Ugly first aid to make hla compile agian
|
||||||
|
set_property(SOURCE hla/RTI13InteractionClass.cxx hla/RTI13ObjectClass.cxx
|
||||||
|
hla/RTI13ObjectInstance.cxx hla/RTI13Federate.cxx
|
||||||
|
hla/RTI13FederateFactory.cxx
|
||||||
|
APPEND PROPERTY COMPILE_FLAGS "-I${RTI_INCLUDE_DIR}")
|
||||||
|
endif(ENABLE_RTI)
|
||||||
|
|||||||
@@ -212,7 +212,7 @@ std::string SGBucket::gen_base_path() const {
|
|||||||
main_lat *= -1;
|
main_lat *= -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(raw_path, "%c%03d%c%02d/%c%03d%c%02d",
|
snprintf(raw_path, 256, "%c%03d%c%02d/%c%03d%c%02d",
|
||||||
hem, top_lon, pole, top_lat,
|
hem, top_lon, pole, top_lat,
|
||||||
hem, main_lon, pole, main_lat);
|
hem, main_lon, pole, main_lat);
|
||||||
|
|
||||||
@@ -224,17 +224,6 @@ std::string SGBucket::gen_base_path() const {
|
|||||||
|
|
||||||
// return width of the tile in degrees
|
// return width of the tile in degrees
|
||||||
double SGBucket::get_width() const {
|
double SGBucket::get_width() const {
|
||||||
if (lon==-180 && (lat==-89 || lat==88) ) {
|
|
||||||
/* Normally the tile at 180W in 88N and 89S
|
|
||||||
* would cover 184W to 176W and the next
|
|
||||||
* on the east side starts at 176W.
|
|
||||||
* To correct, make this a special tile
|
|
||||||
* from 180W to 176W with 4 degrees width
|
|
||||||
* instead of the normal 8 degrees at
|
|
||||||
* that latitude.
|
|
||||||
*/
|
|
||||||
return 4.0;
|
|
||||||
}
|
|
||||||
return sg_bucket_span( get_center_lat() );
|
return sg_bucket_span( get_center_lat() );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,4 +345,13 @@ void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy ) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sgGetBuckets( const SGGeod& min, const SGGeod& max, std::vector<SGBucket>& list ) {
|
||||||
|
double lon, lat, span;
|
||||||
|
|
||||||
|
for (lat = min.getLatitudeDeg(); lat <= max.getLatitudeDeg(); lat += SG_BUCKET_SPAN) {
|
||||||
|
span = sg_bucket_span( lat );
|
||||||
|
for (lon = min.getLongitudeDeg(); lon <= max.getLongitudeDeg(); lon += span) {
|
||||||
|
list.push_back( SGBucket(lon , lat) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
#include <cstdio> // sprintf()
|
#include <cstdio> // sprintf()
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* standard size of a bucket in degrees (1/8 of a degree)
|
* standard size of a bucket in degrees (1/8 of a degree)
|
||||||
@@ -57,9 +58,7 @@
|
|||||||
// return the horizontal tile span factor based on latitude
|
// return the horizontal tile span factor based on latitude
|
||||||
static double sg_bucket_span( double l ) {
|
static double sg_bucket_span( double l ) {
|
||||||
if ( l >= 89.0 ) {
|
if ( l >= 89.0 ) {
|
||||||
return 360.0;
|
return 12.0;
|
||||||
} else if ( l >= 88.0 ) {
|
|
||||||
return 8.0;
|
|
||||||
} else if ( l >= 86.0 ) {
|
} else if ( l >= 86.0 ) {
|
||||||
return 4.0;
|
return 4.0;
|
||||||
} else if ( l >= 83.0 ) {
|
} else if ( l >= 83.0 ) {
|
||||||
@@ -80,12 +79,10 @@ static double sg_bucket_span( double l ) {
|
|||||||
return 1.0;
|
return 1.0;
|
||||||
} else if ( l >= -86.0 ) {
|
} else if ( l >= -86.0 ) {
|
||||||
return 2.0;
|
return 2.0;
|
||||||
} else if ( l >= -88.0 ) {
|
|
||||||
return 4.0;
|
|
||||||
} else if ( l >= -89.0 ) {
|
} else if ( l >= -89.0 ) {
|
||||||
return 8.0;
|
return 4.0;
|
||||||
} else {
|
} else {
|
||||||
return 360.0;
|
return 12.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,6 +323,15 @@ SGBucket sgBucketOffset( double dlon, double dlat, int x, int y );
|
|||||||
void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy );
|
void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \relates SGBucket
|
||||||
|
* retrieve a list of buckets in the given bounding box
|
||||||
|
* @param min min lon,lat of bounding box in degrees
|
||||||
|
* @param max max lon,lat of bounding box in degrees
|
||||||
|
* @param list standard vector of buckets within the bounding box
|
||||||
|
*/
|
||||||
|
void sgGetBuckets( const SGGeod& min, const SGGeod& max, std::vector<SGBucket>& list );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the bucket lon, lat, x, and y to the output stream.
|
* Write the bucket lon, lat, x, and y to the output stream.
|
||||||
* @param out output stream
|
* @param out output stream
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "BVHVisitor.hxx"
|
#include "BVHVisitor.hxx"
|
||||||
#include "BVHNode.hxx"
|
#include "BVHNode.hxx"
|
||||||
#include "BVHGroup.hxx"
|
#include "BVHGroup.hxx"
|
||||||
|
#include "BVHPageNode.hxx"
|
||||||
#include "BVHTransform.hxx"
|
#include "BVHTransform.hxx"
|
||||||
#include "BVHMotionTransform.hxx"
|
#include "BVHMotionTransform.hxx"
|
||||||
#include "BVHLineGeometry.hxx"
|
#include "BVHLineGeometry.hxx"
|
||||||
@@ -45,6 +46,8 @@ public:
|
|||||||
|
|
||||||
virtual void apply(BVHGroup& node)
|
virtual void apply(BVHGroup& node)
|
||||||
{ expandBy(node.getBoundingSphere()); }
|
{ expandBy(node.getBoundingSphere()); }
|
||||||
|
virtual void apply(BVHPageNode& node)
|
||||||
|
{ expandBy(node.getBoundingSphere()); }
|
||||||
virtual void apply(BVHTransform& node)
|
virtual void apply(BVHTransform& node)
|
||||||
{ expandBy(node.getBoundingSphere()); }
|
{ expandBy(node.getBoundingSphere()); }
|
||||||
virtual void apply(BVHMotionTransform& node)
|
virtual void apply(BVHMotionTransform& node)
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "BVHNode.hxx"
|
#include "BVHNode.hxx"
|
||||||
#include "BVHGroup.hxx"
|
#include "BVHGroup.hxx"
|
||||||
|
#include "BVHPageNode.hxx"
|
||||||
#include "BVHTransform.hxx"
|
#include "BVHTransform.hxx"
|
||||||
#include "BVHMotionTransform.hxx"
|
#include "BVHMotionTransform.hxx"
|
||||||
#include "BVHLineGeometry.hxx"
|
#include "BVHLineGeometry.hxx"
|
||||||
@@ -47,6 +48,14 @@ BVHLineSegmentVisitor::apply(BVHGroup& group)
|
|||||||
return;
|
return;
|
||||||
group.traverse(*this);
|
group.traverse(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHLineSegmentVisitor::apply(BVHPageNode& pageNode)
|
||||||
|
{
|
||||||
|
if (!intersects(_lineSegment, pageNode.getBoundingSphere()))
|
||||||
|
return;
|
||||||
|
pageNode.traverse(*this);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BVHLineSegmentVisitor::apply(BVHTransform& transform)
|
BVHLineSegmentVisitor::apply(BVHTransform& transform)
|
||||||
@@ -20,13 +20,14 @@
|
|||||||
|
|
||||||
#include <simgear/math/SGGeometry.hxx>
|
#include <simgear/math/SGGeometry.hxx>
|
||||||
#include <simgear/structure/SGSharedPtr.hxx>
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
#include <simgear/scene/material/mat.hxx>
|
|
||||||
|
|
||||||
#include "BVHVisitor.hxx"
|
#include "BVHVisitor.hxx"
|
||||||
#include "BVHNode.hxx"
|
#include "BVHNode.hxx"
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
|
class BVHMaterial;
|
||||||
|
|
||||||
class BVHLineSegmentVisitor : public BVHVisitor {
|
class BVHLineSegmentVisitor : public BVHVisitor {
|
||||||
public:
|
public:
|
||||||
BVHLineSegmentVisitor(const SGLineSegmentd& lineSegment,
|
BVHLineSegmentVisitor(const SGLineSegmentd& lineSegment,
|
||||||
@@ -54,12 +55,13 @@ public:
|
|||||||
{ return _linearVelocity; }
|
{ return _linearVelocity; }
|
||||||
const SGVec3d& getAngularVelocity() const
|
const SGVec3d& getAngularVelocity() const
|
||||||
{ return _angularVelocity; }
|
{ return _angularVelocity; }
|
||||||
const SGMaterial* getMaterial() const
|
const BVHMaterial* getMaterial() const
|
||||||
{ return _material; }
|
{ return _material; }
|
||||||
BVHNode::Id getId() const
|
BVHNode::Id getId() const
|
||||||
{ return _id; }
|
{ return _id; }
|
||||||
|
|
||||||
virtual void apply(BVHGroup& group);
|
virtual void apply(BVHGroup& group);
|
||||||
|
virtual void apply(BVHPageNode& node);
|
||||||
virtual void apply(BVHTransform& transform);
|
virtual void apply(BVHTransform& transform);
|
||||||
virtual void apply(BVHMotionTransform& transform);
|
virtual void apply(BVHMotionTransform& transform);
|
||||||
virtual void apply(BVHLineGeometry&);
|
virtual void apply(BVHLineGeometry&);
|
||||||
@@ -87,7 +89,7 @@ private:
|
|||||||
SGVec3d _normal;
|
SGVec3d _normal;
|
||||||
SGVec3d _linearVelocity;
|
SGVec3d _linearVelocity;
|
||||||
SGVec3d _angularVelocity;
|
SGVec3d _angularVelocity;
|
||||||
const SGMaterial* _material;
|
const BVHMaterial* _material;
|
||||||
BVHNode::Id _id;
|
BVHNode::Id _id;
|
||||||
|
|
||||||
bool _haveHit;
|
bool _haveHit;
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "BVHMaterial.hxx"
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
BVHMaterial::BVHMaterial() :
|
||||||
|
_solid(true),
|
||||||
|
_friction_factor(1),
|
||||||
|
_rolling_friction(0.02),
|
||||||
|
_bumpiness(0),
|
||||||
|
_load_resistance(1e30)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BVHMaterial::~BVHMaterial()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BVHMaterial_hxx
|
||||||
|
#define BVHMaterial_hxx
|
||||||
|
|
||||||
|
#include <simgear/structure/SGReferenced.hxx>
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
class BVHMaterial : public SGReferenced {
|
||||||
|
public:
|
||||||
|
BVHMaterial();
|
||||||
|
virtual ~BVHMaterial();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return if the surface material is solid, if it is not solid, a fluid
|
||||||
|
* can be assumed, that is usually water.
|
||||||
|
*/
|
||||||
|
bool get_solid () const { return _solid; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the friction factor for that material
|
||||||
|
*/
|
||||||
|
double get_friction_factor () const { return _friction_factor; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the rolling friction for that material
|
||||||
|
*/
|
||||||
|
double get_rolling_friction () const { return _rolling_friction; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the bumpines for that material
|
||||||
|
*/
|
||||||
|
double get_bumpiness () const { return _bumpiness; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the load resistance
|
||||||
|
*/
|
||||||
|
double get_load_resistance () const { return _load_resistance; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// True if the material is solid, false if it is a fluid
|
||||||
|
bool _solid;
|
||||||
|
|
||||||
|
// the friction factor of that surface material
|
||||||
|
double _friction_factor;
|
||||||
|
|
||||||
|
// the rolling friction of that surface material
|
||||||
|
double _rolling_friction;
|
||||||
|
|
||||||
|
// the bumpiness of that surface material
|
||||||
|
double _bumpiness;
|
||||||
|
|
||||||
|
// the load resistance of that surface material
|
||||||
|
double _load_resistance;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
+9
-2
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "BVHNode.hxx"
|
#include "BVHNode.hxx"
|
||||||
#include "BVHGroup.hxx"
|
#include "BVHGroup.hxx"
|
||||||
|
#include "BVHPageNode.hxx"
|
||||||
#include "BVHTransform.hxx"
|
#include "BVHTransform.hxx"
|
||||||
#include "BVHLineGeometry.hxx"
|
#include "BVHLineGeometry.hxx"
|
||||||
#include "BVHStaticGeometry.hxx"
|
#include "BVHStaticGeometry.hxx"
|
||||||
@@ -52,6 +53,12 @@ public:
|
|||||||
return;
|
return;
|
||||||
leaf.traverse(*this);
|
leaf.traverse(*this);
|
||||||
}
|
}
|
||||||
|
virtual void apply(BVHPageNode& leaf)
|
||||||
|
{
|
||||||
|
if (!intersects(_sphere, leaf.getBoundingSphere()))
|
||||||
|
return;
|
||||||
|
leaf.traverse(*this);
|
||||||
|
}
|
||||||
virtual void apply(BVHTransform& transform)
|
virtual void apply(BVHTransform& transform)
|
||||||
{
|
{
|
||||||
if (!intersects(_sphere, transform.getBoundingSphere()))
|
if (!intersects(_sphere, transform.getBoundingSphere()))
|
||||||
@@ -140,7 +147,7 @@ public:
|
|||||||
{ return _linearVelocity; }
|
{ return _linearVelocity; }
|
||||||
const SGVec3d& getAngularVelocity() const
|
const SGVec3d& getAngularVelocity() const
|
||||||
{ return _angularVelocity; }
|
{ return _angularVelocity; }
|
||||||
const SGMaterial* getMaterial() const
|
const BVHMaterial* getMaterial() const
|
||||||
{ return _material; }
|
{ return _material; }
|
||||||
BVHNode::Id getId() const
|
BVHNode::Id getId() const
|
||||||
{ return _id; }
|
{ return _id; }
|
||||||
@@ -155,7 +162,7 @@ private:
|
|||||||
SGVec3d _point;
|
SGVec3d _point;
|
||||||
SGVec3d _linearVelocity;
|
SGVec3d _linearVelocity;
|
||||||
SGVec3d _angularVelocity;
|
SGVec3d _angularVelocity;
|
||||||
const SGMaterial* _material;
|
const BVHMaterial* _material;
|
||||||
BVHNode::Id _id;
|
BVHNode::Id _id;
|
||||||
|
|
||||||
bool _havePoint;
|
bool _havePoint;
|
||||||
@@ -26,6 +26,7 @@ namespace simgear {
|
|||||||
|
|
||||||
class BVHGroup;
|
class BVHGroup;
|
||||||
class BVHVisitor;
|
class BVHVisitor;
|
||||||
|
class BVHPageNode;
|
||||||
|
|
||||||
// Base for the tree nodes
|
// Base for the tree nodes
|
||||||
class BVHNode : public SGReferenced {
|
class BVHNode : public SGReferenced {
|
||||||
@@ -55,6 +56,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class BVHGroup;
|
friend class BVHGroup;
|
||||||
|
friend class BVHPageNode;
|
||||||
void addParent(BVHNode* parent);
|
void addParent(BVHNode* parent);
|
||||||
void removeParent(BVHNode* parent);
|
void removeParent(BVHNode* parent);
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -15,17 +15,26 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef HLAVariantDataElement_hxx
|
#include "BVHPageNode.hxx"
|
||||||
#define HLAVariantDataElement_hxx
|
|
||||||
|
|
||||||
#include "HLAVariantDataType.hxx"
|
#include "BVHPager.hxx"
|
||||||
#include "HLAVariantRecordDataElement.hxx"
|
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
typedef HLAAbstractVariantRecordDataElement HLAAbstractVariantDataElement;
|
BVHPageNode::BVHPageNode() :
|
||||||
typedef HLAVariantRecordDataElement HLAVariantDataElement;
|
_useStamp(0),
|
||||||
|
_requested(false)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
BVHPageNode::~BVHPageNode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHPageNode::accept(BVHVisitor& visitor)
|
||||||
|
{
|
||||||
|
visitor.apply(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BVHPageNode_hxx
|
||||||
|
#define BVHPageNode_hxx
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
|
|
||||||
|
#include "BVHGroup.hxx"
|
||||||
|
#include "BVHVisitor.hxx"
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
class BVHPager;
|
||||||
|
class BVHPageRequest;
|
||||||
|
|
||||||
|
class BVHPageNode : public BVHGroup {
|
||||||
|
public:
|
||||||
|
BVHPageNode();
|
||||||
|
virtual ~BVHPageNode();
|
||||||
|
|
||||||
|
virtual void accept(BVHVisitor& visitor);
|
||||||
|
|
||||||
|
/// Return the usage stamp of the last access
|
||||||
|
unsigned getUseStamp() const
|
||||||
|
{ return _useStamp; }
|
||||||
|
|
||||||
|
virtual SGSphered computeBoundingSphere() const = 0;
|
||||||
|
|
||||||
|
virtual BVHPageRequest* newRequest() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void invalidateBound() = 0;
|
||||||
|
|
||||||
|
bool getRequested() const
|
||||||
|
{ return _requested; }
|
||||||
|
void setRequested(bool requested)
|
||||||
|
{ _requested = requested; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class BVHPager;
|
||||||
|
|
||||||
|
std::list<SGSharedPtr<BVHPageNode> >::iterator _iterator;
|
||||||
|
unsigned _useStamp;
|
||||||
|
bool _requested;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2009 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -15,15 +15,12 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef HLAVariantDataType_hxx
|
#include "BVHPageRequest.hxx"
|
||||||
#define HLAVariantDataType_hxx
|
|
||||||
|
|
||||||
#include "HLAVariantRecordDataType.hxx"
|
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
typedef HLAVariantRecordDataType HLAVariantDataType;
|
BVHPageRequest::~BVHPageRequest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace simgear
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BVHPageRequest_hxx
|
||||||
|
#define BVHPageRequest_hxx
|
||||||
|
|
||||||
|
#include <simgear/structure/SGReferenced.hxx>
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
class BVHPageNode;
|
||||||
|
|
||||||
|
class BVHPageRequest : public SGReferenced {
|
||||||
|
public:
|
||||||
|
virtual ~BVHPageRequest();
|
||||||
|
|
||||||
|
/// Happens in the pager thread, do not modify the calling bvh tree
|
||||||
|
virtual void load() = 0;
|
||||||
|
/// Happens in the bvh main thread where the bvh is actually used.
|
||||||
|
/// So inside here it is safe to modify the paged node
|
||||||
|
virtual void insert() = 0;
|
||||||
|
/// The page node this request is for
|
||||||
|
virtual BVHPageNode* getPageNode() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "BVHPager.hxx"
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include <simgear/threads/SGThread.hxx>
|
||||||
|
#include <simgear/threads/SGGuard.hxx>
|
||||||
|
|
||||||
|
#include "BVHPageNode.hxx"
|
||||||
|
#include "BVHPageRequest.hxx"
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
struct BVHPager::_PrivateData : protected SGThread {
|
||||||
|
typedef SGSharedPtr<BVHPageRequest> _Request;
|
||||||
|
typedef std::list<_Request> _RequestList;
|
||||||
|
typedef std::list<SGSharedPtr<BVHPageNode> > _PageNodeList;
|
||||||
|
|
||||||
|
struct _LockedQueue {
|
||||||
|
void _push(const _Request& request)
|
||||||
|
{
|
||||||
|
SGGuard<SGMutex> scopeLock(_mutex);
|
||||||
|
_requestList.push_back(request);
|
||||||
|
}
|
||||||
|
_Request _pop()
|
||||||
|
{
|
||||||
|
SGGuard<SGMutex> scopeLock(_mutex);
|
||||||
|
if (_requestList.empty())
|
||||||
|
return _Request();
|
||||||
|
_Request request;
|
||||||
|
request.swap(_requestList.front());
|
||||||
|
_requestList.pop_front();
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
SGMutex _mutex;
|
||||||
|
_RequestList _requestList;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _WorkQueue {
|
||||||
|
void _stop()
|
||||||
|
{
|
||||||
|
_push(_Request());
|
||||||
|
}
|
||||||
|
void _push(const _Request& request)
|
||||||
|
{
|
||||||
|
SGGuard<SGMutex> scopeLock(_mutex);
|
||||||
|
bool needSignal = _requestList.empty();
|
||||||
|
_requestList.push_back(request);
|
||||||
|
if (needSignal)
|
||||||
|
_waitCondition.signal();
|
||||||
|
}
|
||||||
|
_Request _pop()
|
||||||
|
{
|
||||||
|
SGGuard<SGMutex> scopeLock(_mutex);
|
||||||
|
while (_requestList.empty())
|
||||||
|
_waitCondition.wait(_mutex);
|
||||||
|
_Request request;
|
||||||
|
request.swap(_requestList.front());
|
||||||
|
_requestList.pop_front();
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
SGMutex _mutex;
|
||||||
|
SGWaitCondition _waitCondition;
|
||||||
|
_RequestList _requestList;
|
||||||
|
};
|
||||||
|
|
||||||
|
_PrivateData() :
|
||||||
|
_started(false),
|
||||||
|
_useStamp(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual ~_PrivateData()
|
||||||
|
{
|
||||||
|
_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void run()
|
||||||
|
{
|
||||||
|
for (;;) {
|
||||||
|
_Request request = _pendingRequests._pop();
|
||||||
|
// This means stop working
|
||||||
|
if (!request.valid())
|
||||||
|
return;
|
||||||
|
request->load();
|
||||||
|
_processedRequests._push(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _start()
|
||||||
|
{
|
||||||
|
if (_started)
|
||||||
|
return true;
|
||||||
|
if (!start())
|
||||||
|
return false;
|
||||||
|
_started = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _stop()
|
||||||
|
{
|
||||||
|
if (!_started)
|
||||||
|
return;
|
||||||
|
// send a stop request ...
|
||||||
|
_pendingRequests._stop();
|
||||||
|
// ... and wait for the thread to finish
|
||||||
|
join();
|
||||||
|
_started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _use(BVHPageNode& pageNode)
|
||||||
|
{
|
||||||
|
if (pageNode._requested) {
|
||||||
|
// move it forward in the lru list
|
||||||
|
_pageNodeList.splice(_pageNodeList.end(), _pageNodeList,
|
||||||
|
pageNode._iterator);
|
||||||
|
} else {
|
||||||
|
_Request request = pageNode.newRequest();
|
||||||
|
if (!request.valid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
pageNode._iterator = _pageNodeList.insert(_pageNodeList.end(),
|
||||||
|
&pageNode);
|
||||||
|
pageNode._requested = true;
|
||||||
|
|
||||||
|
if (_started) {
|
||||||
|
_pendingRequests._push(request);
|
||||||
|
} else {
|
||||||
|
request->load();
|
||||||
|
request->insert();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pageNode._useStamp = _useStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _update(unsigned expiry)
|
||||||
|
{
|
||||||
|
// Insert all processed requests
|
||||||
|
for (;;) {
|
||||||
|
SGSharedPtr<BVHPageRequest> request;
|
||||||
|
request = _processedRequests._pop();
|
||||||
|
if (!request.valid())
|
||||||
|
break;
|
||||||
|
request->insert();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ... and throw away stuff that is not used for a long time
|
||||||
|
unsigned useStamp = _useStamp - expiry;
|
||||||
|
_PageNodeList::iterator i = _pageNodeList.begin();
|
||||||
|
while (i != _pageNodeList.end()) {
|
||||||
|
// Ok, this means if the highest bit in the below difference
|
||||||
|
// is set which is aequivalent to having a negative difference
|
||||||
|
// but being wraparound save.
|
||||||
|
unsigned diff = (*i)->_useStamp - useStamp;
|
||||||
|
// test the sign bit of the difference
|
||||||
|
if (!(diff & (~((~0u) >> 1))))
|
||||||
|
break;
|
||||||
|
(*i)->clear();
|
||||||
|
(*i)->_requested = false;
|
||||||
|
i = _pageNodeList.erase(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _started;
|
||||||
|
unsigned _useStamp;
|
||||||
|
_WorkQueue _pendingRequests;
|
||||||
|
_LockedQueue _processedRequests;
|
||||||
|
// Store the rcu list of loaded nodes so that they can expire
|
||||||
|
_PageNodeList _pageNodeList;
|
||||||
|
};
|
||||||
|
|
||||||
|
BVHPager::BVHPager() :
|
||||||
|
_privateData(new _PrivateData)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BVHPager::~BVHPager()
|
||||||
|
{
|
||||||
|
delete _privateData;
|
||||||
|
_privateData = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
BVHPager::start()
|
||||||
|
{
|
||||||
|
return _privateData->_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHPager::stop()
|
||||||
|
{
|
||||||
|
_privateData->_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHPager::use(BVHPageNode& pageNode)
|
||||||
|
{
|
||||||
|
_privateData->_use(pageNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHPager::update(unsigned expiry)
|
||||||
|
{
|
||||||
|
_privateData->_update(expiry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHPager::setUseStamp(unsigned stamp)
|
||||||
|
{
|
||||||
|
_privateData->_useStamp = stamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
BVHPager::getUseStamp() const
|
||||||
|
{
|
||||||
|
return _privateData->_useStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BVHPager_hxx
|
||||||
|
#define BVHPager_hxx
|
||||||
|
|
||||||
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
|
|
||||||
|
namespace simgear {
|
||||||
|
|
||||||
|
class BVHPageNode;
|
||||||
|
class BVHPageRequest;
|
||||||
|
|
||||||
|
class BVHPager {
|
||||||
|
public:
|
||||||
|
BVHPager();
|
||||||
|
~BVHPager();
|
||||||
|
|
||||||
|
/// Starts the pager thread
|
||||||
|
bool start();
|
||||||
|
|
||||||
|
/// Stops the pager thread
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
/// Use this page node, if loaded make it as used, if not loaded schedule
|
||||||
|
void use(BVHPageNode& pageNode);
|
||||||
|
|
||||||
|
/// Call this from the main thread to incorporate the processed page
|
||||||
|
/// requests into the bounding volume tree
|
||||||
|
void update(unsigned expiry);
|
||||||
|
|
||||||
|
/// The usage stamp to mark usage of BVHPageNodes
|
||||||
|
void setUseStamp(unsigned stamp);
|
||||||
|
unsigned getUseStamp() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
BVHPager(const BVHPager&);
|
||||||
|
BVHPager& operator=(const BVHPager&);
|
||||||
|
|
||||||
|
struct _PrivateData;
|
||||||
|
_PrivateData* _privateData;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -22,11 +22,7 @@
|
|||||||
#include <simgear/structure/SGReferenced.hxx>
|
#include <simgear/structure/SGReferenced.hxx>
|
||||||
#include <simgear/structure/SGSharedPtr.hxx>
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
#include <simgear/math/SGGeometry.hxx>
|
#include <simgear/math/SGGeometry.hxx>
|
||||||
|
#include "BVHMaterial.hxx"
|
||||||
/// FIXME, the SGMaterial class is too much tied to the scenegraph aspects of
|
|
||||||
/// the materials. Use some class more decribing the
|
|
||||||
/// nature of the surface we live on ...
|
|
||||||
class SGMaterial;
|
|
||||||
|
|
||||||
namespace simgear {
|
namespace simgear {
|
||||||
|
|
||||||
@@ -40,20 +36,20 @@ public:
|
|||||||
{ return _vertices[i]; }
|
{ return _vertices[i]; }
|
||||||
|
|
||||||
|
|
||||||
unsigned addMaterial(const SGMaterial* material)
|
unsigned addMaterial(const BVHMaterial* material)
|
||||||
{ _materials.push_back(material); return _materials.size() - 1; }
|
{ _materials.push_back(material); return _materials.size() - 1; }
|
||||||
const SGMaterial* getMaterial(unsigned i) const
|
const BVHMaterial* getMaterial(unsigned i) const
|
||||||
{ if (_materials.size() <= i) return 0; return _materials[i]; }
|
{ if (_materials.size() <= i) return 0; return _materials[i]; }
|
||||||
|
|
||||||
void trim()
|
void trim()
|
||||||
{
|
{
|
||||||
std::vector<SGVec3f>(_vertices).swap(_vertices);
|
std::vector<SGVec3f>(_vertices).swap(_vertices);
|
||||||
std::vector<const SGMaterial*>(_materials).swap(_materials);
|
std::vector<SGSharedPtr<const BVHMaterial> >(_materials).swap(_materials);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<SGVec3f> _vertices;
|
std::vector<SGVec3f> _vertices;
|
||||||
std::vector<const SGMaterial*> _materials;
|
std::vector<SGSharedPtr<const BVHMaterial> > _materials;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
+5
-5
@@ -78,16 +78,16 @@ public:
|
|||||||
typedef std::set<SGVec3<unsigned> > TriangleSet;
|
typedef std::set<SGVec3<unsigned> > TriangleSet;
|
||||||
TriangleSet _triangleSet;
|
TriangleSet _triangleSet;
|
||||||
|
|
||||||
void setCurrentMaterial(const SGMaterial* material)
|
void setCurrentMaterial(const BVHMaterial* material)
|
||||||
{
|
{
|
||||||
_currentMaterial = material;
|
_currentMaterial = material;
|
||||||
_currentMaterialIndex = addMaterial(material);
|
_currentMaterialIndex = addMaterial(material);
|
||||||
}
|
}
|
||||||
const SGMaterial* getCurrentMaterial() const
|
const BVHMaterial* getCurrentMaterial() const
|
||||||
{
|
{
|
||||||
return _currentMaterial;
|
return _currentMaterial;
|
||||||
}
|
}
|
||||||
unsigned addMaterial(const SGMaterial* material)
|
unsigned addMaterial(const BVHMaterial* material)
|
||||||
{
|
{
|
||||||
MaterialMap::const_iterator i = _materialMap.find(material);
|
MaterialMap::const_iterator i = _materialMap.find(material);
|
||||||
if (i != _materialMap.end())
|
if (i != _materialMap.end())
|
||||||
@@ -97,9 +97,9 @@ public:
|
|||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::map<const SGMaterial*, unsigned> MaterialMap;
|
typedef std::map<const BVHMaterial*, unsigned> MaterialMap;
|
||||||
MaterialMap _materialMap;
|
MaterialMap _materialMap;
|
||||||
const SGMaterial* _currentMaterial;
|
const BVHMaterial* _currentMaterial;
|
||||||
unsigned _currentMaterialIndex;
|
unsigned _currentMaterialIndex;
|
||||||
|
|
||||||
void addTriangle(const SGVec3f& v1, const SGVec3f& v2, const SGVec3f& v3)
|
void addTriangle(const SGVec3f& v1, const SGVec3f& v2, const SGVec3f& v3)
|
||||||
@@ -59,6 +59,22 @@ BVHSubTreeCollector::apply(BVHGroup& group)
|
|||||||
popNodeList(parentNodeList);
|
popNodeList(parentNodeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BVHSubTreeCollector::apply(BVHPageNode& group)
|
||||||
|
{
|
||||||
|
if (!intersects(_sphere, group.getBoundingSphere()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The _nodeList content is somehow the 'return value' of the subtree.
|
||||||
|
// Set it to zero to see if we have something to collect down there.
|
||||||
|
NodeList parentNodeList;
|
||||||
|
pushNodeList(parentNodeList);
|
||||||
|
|
||||||
|
group.traverse(*this);
|
||||||
|
|
||||||
|
popNodeList(parentNodeList);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BVHSubTreeCollector::apply(BVHTransform& transform)
|
BVHSubTreeCollector::apply(BVHTransform& transform)
|
||||||
{
|
{
|
||||||
@@ -43,6 +43,7 @@ public:
|
|||||||
virtual ~BVHSubTreeCollector();
|
virtual ~BVHSubTreeCollector();
|
||||||
|
|
||||||
virtual void apply(BVHGroup&);
|
virtual void apply(BVHGroup&);
|
||||||
|
virtual void apply(BVHPageNode&);
|
||||||
virtual void apply(BVHTransform&);
|
virtual void apply(BVHTransform&);
|
||||||
virtual void apply(BVHMotionTransform&);
|
virtual void apply(BVHMotionTransform&);
|
||||||
virtual void apply(BVHLineGeometry&);
|
virtual void apply(BVHLineGeometry&);
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (C) 2008 - 2009 Mathias Froehlich - Mathias.Froehlich@web.de
|
// Copyright (C) 2008 - 2012 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -23,6 +23,7 @@ namespace simgear {
|
|||||||
class BVHStaticData;
|
class BVHStaticData;
|
||||||
|
|
||||||
class BVHGroup;
|
class BVHGroup;
|
||||||
|
class BVHPageNode;
|
||||||
class BVHTransform;
|
class BVHTransform;
|
||||||
class BVHMotionTransform;
|
class BVHMotionTransform;
|
||||||
class BVHStaticGeometry;
|
class BVHStaticGeometry;
|
||||||
@@ -41,6 +42,7 @@ public:
|
|||||||
|
|
||||||
// High level nodes to handle
|
// High level nodes to handle
|
||||||
virtual void apply(BVHGroup&) = 0;
|
virtual void apply(BVHGroup&) = 0;
|
||||||
|
virtual void apply(BVHPageNode&) = 0;
|
||||||
virtual void apply(BVHTransform&) = 0;
|
virtual void apply(BVHTransform&) = 0;
|
||||||
virtual void apply(BVHMotionTransform&) = 0;
|
virtual void apply(BVHMotionTransform&) = 0;
|
||||||
virtual void apply(BVHLineGeometry&) = 0;
|
virtual void apply(BVHLineGeometry&) = 0;
|
||||||
@@ -1,14 +1,16 @@
|
|||||||
include (SimGearComponent)
|
include (SimGearComponent)
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
BVHBoundingBoxVisitor.hxx
|
BVHBoundingBoxVisitor.hxx
|
||||||
BVHDebugCollectVisitor.hxx
|
|
||||||
BVHGroup.hxx
|
BVHGroup.hxx
|
||||||
BVHLineGeometry.hxx
|
BVHLineGeometry.hxx
|
||||||
BVHLineSegmentVisitor.hxx
|
BVHLineSegmentVisitor.hxx
|
||||||
BVHMotionTransform.hxx
|
BVHMotionTransform.hxx
|
||||||
BVHNearestPointVisitor.hxx
|
BVHNearestPointVisitor.hxx
|
||||||
BVHNode.hxx
|
BVHNode.hxx
|
||||||
|
BVHPageNode.hxx
|
||||||
|
BVHPageRequest.hxx
|
||||||
|
BVHPager.hxx
|
||||||
BVHStaticBinary.hxx
|
BVHStaticBinary.hxx
|
||||||
BVHStaticData.hxx
|
BVHStaticData.hxx
|
||||||
BVHStaticGeometry.hxx
|
BVHStaticGeometry.hxx
|
||||||
@@ -17,23 +19,34 @@ set(HEADERS
|
|||||||
BVHStaticNode.hxx
|
BVHStaticNode.hxx
|
||||||
BVHStaticTriangle.hxx
|
BVHStaticTriangle.hxx
|
||||||
BVHSubTreeCollector.hxx
|
BVHSubTreeCollector.hxx
|
||||||
|
BVHMaterial.hxx
|
||||||
BVHTransform.hxx
|
BVHTransform.hxx
|
||||||
BVHVisitor.hxx
|
BVHVisitor.hxx
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
BVHGroup.cxx
|
BVHGroup.cxx
|
||||||
BVHLineGeometry.cxx
|
BVHLineGeometry.cxx
|
||||||
BVHLineSegmentVisitor.cxx
|
BVHLineSegmentVisitor.cxx
|
||||||
BVHMotionTransform.cxx
|
BVHMotionTransform.cxx
|
||||||
BVHNode.cxx
|
BVHNode.cxx
|
||||||
|
BVHPageNode.cxx
|
||||||
|
BVHPageRequest.cxx
|
||||||
|
BVHPager.cxx
|
||||||
BVHStaticBinary.cxx
|
BVHStaticBinary.cxx
|
||||||
BVHStaticGeometry.cxx
|
BVHStaticGeometry.cxx
|
||||||
BVHStaticLeaf.cxx
|
BVHStaticLeaf.cxx
|
||||||
BVHStaticNode.cxx
|
BVHStaticNode.cxx
|
||||||
BVHStaticTriangle.cxx
|
BVHStaticTriangle.cxx
|
||||||
BVHSubTreeCollector.cxx
|
BVHSubTreeCollector.cxx
|
||||||
BVHTransform.cxx
|
BVHMaterial.cxx
|
||||||
)
|
BVHTransform.cxx
|
||||||
|
)
|
||||||
|
|
||||||
simgear_scene_component(bvh scene/bvh "${SOURCES}" "${HEADERS}")
|
simgear_component(bvh bvh "${SOURCES}" "${HEADERS}")
|
||||||
|
|
||||||
|
if(ENABLE_TESTS)
|
||||||
|
add_executable(bvhtest bvhtest.cxx)
|
||||||
|
target_link_libraries(bvhtest SimGearCore)
|
||||||
|
add_test(bvhtest ${EXECUTABLE_OUTPUT_PATH}/bvhtest)
|
||||||
|
endif(ENABLE_TESTS)
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
include (SimGearComponent)
|
||||||
|
|
||||||
|
set(HEADERS
|
||||||
|
canvas_fwd.hxx
|
||||||
|
Canvas.hxx
|
||||||
|
CanvasEvent.hxx
|
||||||
|
CanvasEventManager.hxx
|
||||||
|
CanvasEventTypes.hxx
|
||||||
|
CanvasEventVisitor.hxx
|
||||||
|
CanvasMgr.hxx
|
||||||
|
CanvasObjectPlacement.hxx
|
||||||
|
CanvasPlacement.hxx
|
||||||
|
CanvasSystemAdapter.hxx
|
||||||
|
MouseEvent.hxx
|
||||||
|
ODGauge.hxx
|
||||||
|
VGInitOperation.hxx
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
Canvas.cxx
|
||||||
|
CanvasEvent.cxx
|
||||||
|
CanvasEventManager.cxx
|
||||||
|
CanvasEventVisitor.cxx
|
||||||
|
CanvasMgr.cxx
|
||||||
|
CanvasObjectPlacement.cxx
|
||||||
|
CanvasPlacement.cxx
|
||||||
|
ODGauge.cxx
|
||||||
|
VGInitOperation.cxx
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(ShivaVG/src)
|
||||||
|
add_subdirectory(elements)
|
||||||
|
|
||||||
|
simgear_scene_component(canvas canvas "${SOURCES}" "${HEADERS}")
|
||||||
@@ -0,0 +1,662 @@
|
|||||||
|
// The canvas for rendering with the 2d API
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "Canvas.hxx"
|
||||||
|
#include "CanvasEventManager.hxx"
|
||||||
|
#include "CanvasEventVisitor.hxx"
|
||||||
|
#include <simgear/canvas/MouseEvent.hxx>
|
||||||
|
#include <simgear/canvas/CanvasPlacement.hxx>
|
||||||
|
#include <simgear/scene/util/parse_color.hxx>
|
||||||
|
#include <simgear/scene/util/RenderConstants.hxx>
|
||||||
|
|
||||||
|
#include <osg/Camera>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osgText/Text>
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
|
||||||
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Canvas::CullCallback::CullCallback(const CanvasWeakPtr& canvas):
|
||||||
|
_canvas( canvas )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::CullCallback::operator()( osg::Node* node,
|
||||||
|
osg::NodeVisitor* nv )
|
||||||
|
{
|
||||||
|
if( (nv->getTraversalMask() & simgear::MODEL_BIT) && !_canvas.expired() )
|
||||||
|
_canvas.lock()->enableRendering();
|
||||||
|
|
||||||
|
traverse(node, nv);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Canvas::Canvas(SGPropertyNode* node):
|
||||||
|
PropertyBasedElement(node),
|
||||||
|
_canvas_mgr(0),
|
||||||
|
_event_manager(new EventManager),
|
||||||
|
_size_x(-1),
|
||||||
|
_size_y(-1),
|
||||||
|
_view_width(-1),
|
||||||
|
_view_height(-1),
|
||||||
|
_status(node, "status"),
|
||||||
|
_status_msg(node, "status-msg"),
|
||||||
|
_sampling_dirty(false),
|
||||||
|
_render_dirty(true),
|
||||||
|
_visible(true),
|
||||||
|
_render_always(false)
|
||||||
|
{
|
||||||
|
_status = 0;
|
||||||
|
setStatusFlags(MISSING_SIZE_X | MISSING_SIZE_Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Canvas::~Canvas()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::onDestroy()
|
||||||
|
{
|
||||||
|
if( _root_group )
|
||||||
|
{
|
||||||
|
_root_group->clearEventListener();
|
||||||
|
_root_group->onDestroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setCanvasMgr(CanvasMgr* canvas_mgr)
|
||||||
|
{
|
||||||
|
_canvas_mgr = canvas_mgr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
CanvasMgr* Canvas::getCanvasMgr() const
|
||||||
|
{
|
||||||
|
return _canvas_mgr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool Canvas::isInit() const
|
||||||
|
{
|
||||||
|
return _texture.serviceable();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::addParentCanvas(const CanvasWeakPtr& canvas)
|
||||||
|
{
|
||||||
|
if( canvas.expired() )
|
||||||
|
{
|
||||||
|
SG_LOG
|
||||||
|
(
|
||||||
|
SG_GENERAL,
|
||||||
|
SG_WARN,
|
||||||
|
"Canvas::addParentCanvas(" << _node->getPath(true) << "): "
|
||||||
|
"got an expired parent!"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_parent_canvases.insert(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::addChildCanvas(const CanvasWeakPtr& canvas)
|
||||||
|
{
|
||||||
|
if( canvas.expired() )
|
||||||
|
{
|
||||||
|
SG_LOG
|
||||||
|
(
|
||||||
|
SG_GENERAL,
|
||||||
|
SG_WARN,
|
||||||
|
"Canvas::addChildCanvas(" << _node->getPath(true) << "): "
|
||||||
|
" got an expired child!"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_child_canvases.insert(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::removeParentCanvas(const CanvasWeakPtr& canvas)
|
||||||
|
{
|
||||||
|
_parent_canvases.erase(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::removeChildCanvas(const CanvasWeakPtr& canvas)
|
||||||
|
{
|
||||||
|
_child_canvases.erase(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
GroupPtr Canvas::createGroup(const std::string& name)
|
||||||
|
{
|
||||||
|
return _root_group->createChild<Group>(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
GroupPtr Canvas::getGroup(const std::string& name)
|
||||||
|
{
|
||||||
|
return _root_group->getChild<Group>(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
GroupPtr Canvas::getOrCreateGroup(const std::string& name)
|
||||||
|
{
|
||||||
|
return _root_group->getOrCreateChild<Group>(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
GroupPtr Canvas::getRootGroup()
|
||||||
|
{
|
||||||
|
return _root_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::enableRendering(bool force)
|
||||||
|
{
|
||||||
|
_visible = true;
|
||||||
|
if( force )
|
||||||
|
_render_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::update(double delta_time_sec)
|
||||||
|
{
|
||||||
|
if( (!_texture.serviceable() && _status != STATUS_DIRTY)
|
||||||
|
|| (_status & CREATE_FAILED) )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( _status == STATUS_DIRTY )
|
||||||
|
{
|
||||||
|
_texture.setSize(_size_x, _size_y);
|
||||||
|
|
||||||
|
if( !_texture.serviceable() )
|
||||||
|
{
|
||||||
|
_texture.useImageCoords(true);
|
||||||
|
_texture.useStencil(true);
|
||||||
|
_texture.allocRT(/*_camera_callback*/);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Resizing causes a new texture to be created so we need to reapply all
|
||||||
|
// existing placements
|
||||||
|
reloadPlacements();
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Camera* camera = _texture.getCamera();
|
||||||
|
|
||||||
|
// TODO Allow custom render order? For now just keep in order with
|
||||||
|
// property tree.
|
||||||
|
camera->setRenderOrder(osg::Camera::PRE_RENDER, _node->getIndex());
|
||||||
|
|
||||||
|
osg::Vec4 clear_color(0.0f, 0.0f, 0.0f , 1.0f);
|
||||||
|
parseColor(_node->getStringValue("background"), clear_color);
|
||||||
|
camera->setClearColor(clear_color);
|
||||||
|
|
||||||
|
camera->addChild(_root_group->getMatrixTransform());
|
||||||
|
|
||||||
|
if( _texture.serviceable() )
|
||||||
|
{
|
||||||
|
setStatusFlags(STATUS_OK);
|
||||||
|
setStatusFlags(STATUS_DIRTY, false);
|
||||||
|
_render_dirty = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setStatusFlags(CREATE_FAILED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _visible || _render_always )
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(CanvasWeakPtr canvas, _child_canvases)
|
||||||
|
{
|
||||||
|
// TODO should we check if the image the child canvas is displayed
|
||||||
|
// within is really visible?
|
||||||
|
if( !canvas.expired() )
|
||||||
|
canvas.lock()->_visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _render_dirty )
|
||||||
|
{
|
||||||
|
// Also mark all canvases this canvas is displayed within as dirty
|
||||||
|
BOOST_FOREACH(CanvasWeakPtr canvas, _parent_canvases)
|
||||||
|
{
|
||||||
|
if( !canvas.expired() )
|
||||||
|
canvas.lock()->_render_dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_texture.setRender(_render_dirty);
|
||||||
|
|
||||||
|
_render_dirty = false;
|
||||||
|
_visible = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
_texture.setRender(false);
|
||||||
|
|
||||||
|
_root_group->update(delta_time_sec);
|
||||||
|
|
||||||
|
if( _sampling_dirty )
|
||||||
|
{
|
||||||
|
_texture.setSampling(
|
||||||
|
_node->getBoolValue("mipmapping"),
|
||||||
|
_node->getIntValue("coverage-samples"),
|
||||||
|
_node->getIntValue("color-samples")
|
||||||
|
);
|
||||||
|
_sampling_dirty = false;
|
||||||
|
_render_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
while( !_dirty_placements.empty() )
|
||||||
|
{
|
||||||
|
SGPropertyNode *node = _dirty_placements.back();
|
||||||
|
_dirty_placements.pop_back();
|
||||||
|
|
||||||
|
if( node->getIndex() >= static_cast<int>(_placements.size()) )
|
||||||
|
// New placement
|
||||||
|
_placements.resize(node->getIndex() + 1);
|
||||||
|
else
|
||||||
|
// Remove possibly existing placements
|
||||||
|
_placements[ node->getIndex() ].clear();
|
||||||
|
|
||||||
|
// Get new placements
|
||||||
|
PlacementFactoryMap::const_iterator placement_factory =
|
||||||
|
_placement_factories.find( node->getStringValue("type", "object") );
|
||||||
|
if( placement_factory != _placement_factories.end() )
|
||||||
|
{
|
||||||
|
Placements& placements = _placements[ node->getIndex() ] =
|
||||||
|
placement_factory->second
|
||||||
|
(
|
||||||
|
node,
|
||||||
|
boost::static_pointer_cast<Canvas>(_self.lock())
|
||||||
|
);
|
||||||
|
node->setStringValue
|
||||||
|
(
|
||||||
|
"status-msg",
|
||||||
|
placements.empty() ? "No match" : "Ok"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
node->setStringValue("status-msg", "Unknown placement type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool Canvas::addEventListener( const std::string& type,
|
||||||
|
const EventListener& cb )
|
||||||
|
{
|
||||||
|
if( !_root_group.get() )
|
||||||
|
throw std::runtime_error("Canvas::AddEventListener: no root group!");
|
||||||
|
|
||||||
|
return _root_group->addEventListener(type, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setSizeX(int sx)
|
||||||
|
{
|
||||||
|
if( _size_x == sx )
|
||||||
|
return;
|
||||||
|
_size_x = sx;
|
||||||
|
setStatusFlags(STATUS_DIRTY);
|
||||||
|
|
||||||
|
if( _size_x <= 0 )
|
||||||
|
setStatusFlags(MISSING_SIZE_X);
|
||||||
|
else
|
||||||
|
setStatusFlags(MISSING_SIZE_X, false);
|
||||||
|
|
||||||
|
// reset flag to allow creation with new size
|
||||||
|
setStatusFlags(CREATE_FAILED, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setSizeY(int sy)
|
||||||
|
{
|
||||||
|
if( _size_y == sy )
|
||||||
|
return;
|
||||||
|
_size_y = sy;
|
||||||
|
setStatusFlags(STATUS_DIRTY);
|
||||||
|
|
||||||
|
if( _size_y <= 0 )
|
||||||
|
setStatusFlags(MISSING_SIZE_Y);
|
||||||
|
else
|
||||||
|
setStatusFlags(MISSING_SIZE_Y, false);
|
||||||
|
|
||||||
|
// reset flag to allow creation with new size
|
||||||
|
setStatusFlags(CREATE_FAILED, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int Canvas::getSizeX() const
|
||||||
|
{
|
||||||
|
return _size_x;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int Canvas::getSizeY() const
|
||||||
|
{
|
||||||
|
return _size_y;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setViewWidth(int w)
|
||||||
|
{
|
||||||
|
if( _view_width == w )
|
||||||
|
return;
|
||||||
|
_view_width = w;
|
||||||
|
|
||||||
|
_texture.setViewSize(_view_width, _view_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setViewHeight(int h)
|
||||||
|
{
|
||||||
|
if( _view_height == h )
|
||||||
|
return;
|
||||||
|
_view_height = h;
|
||||||
|
|
||||||
|
_texture.setViewSize(_view_width, _view_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int Canvas::getViewWidth() const
|
||||||
|
{
|
||||||
|
return _texture.getViewSize().x();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
int Canvas::getViewHeight() const
|
||||||
|
{
|
||||||
|
return _texture.getViewSize().y();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
SGRect<int> Canvas::getViewport() const
|
||||||
|
{
|
||||||
|
return SGRect<int>(0, 0, getViewWidth(), getViewHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool Canvas::handleMouseEvent(const MouseEventPtr& event)
|
||||||
|
{
|
||||||
|
if( !_root_group.get() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
EventVisitor visitor( EventVisitor::TRAVERSE_DOWN,
|
||||||
|
event->getClientPos(),
|
||||||
|
event->getDelta(),
|
||||||
|
_root_group );
|
||||||
|
if( !_root_group->accept(visitor) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return _event_manager->handleEvent(event, visitor.getPropagationPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::childAdded( SGPropertyNode * parent,
|
||||||
|
SGPropertyNode * child )
|
||||||
|
{
|
||||||
|
if( parent != _node )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( child->getNameString() == "placement" )
|
||||||
|
_dirty_placements.push_back(child);
|
||||||
|
else if( _root_group.get() )
|
||||||
|
static_cast<Element*>(_root_group.get())->childAdded(parent, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::childRemoved( SGPropertyNode * parent,
|
||||||
|
SGPropertyNode * child )
|
||||||
|
{
|
||||||
|
_render_dirty = true;
|
||||||
|
|
||||||
|
if( parent != _node )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( child->getNameString() == "placement" )
|
||||||
|
_placements[ child->getIndex() ].clear();
|
||||||
|
else if( _root_group.get() )
|
||||||
|
static_cast<Element*>(_root_group.get())->childRemoved(parent, child);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::valueChanged(SGPropertyNode* node)
|
||||||
|
{
|
||||||
|
if( boost::starts_with(node->getNameString(), "status")
|
||||||
|
|| node->getParent()->getNameString() == "bounding-box" )
|
||||||
|
return;
|
||||||
|
_render_dirty = true;
|
||||||
|
|
||||||
|
bool handled = true;
|
||||||
|
if( node->getParent()->getParent() == _node
|
||||||
|
&& node->getParent()->getNameString() == "placement" )
|
||||||
|
{
|
||||||
|
size_t index = node->getIndex();
|
||||||
|
if( index < _placements.size() )
|
||||||
|
{
|
||||||
|
Placements& placements = _placements[index];
|
||||||
|
if( !placements.empty() )
|
||||||
|
{
|
||||||
|
bool placement_dirty = false;
|
||||||
|
BOOST_FOREACH(PlacementPtr& placement, placements)
|
||||||
|
{
|
||||||
|
// check if change can be directly handled by placement
|
||||||
|
if( placement->getProps() == node->getParent()
|
||||||
|
&& !placement->childChanged(node) )
|
||||||
|
placement_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !placement_dirty )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prevent double updates...
|
||||||
|
for( size_t i = 0; i < _dirty_placements.size(); ++i )
|
||||||
|
{
|
||||||
|
if( node->getParent() == _dirty_placements[i] )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_dirty_placements.push_back(node->getParent());
|
||||||
|
}
|
||||||
|
else if( node->getParent() == _node )
|
||||||
|
{
|
||||||
|
if( node->getNameString() == "background" )
|
||||||
|
{
|
||||||
|
osg::Vec4 color;
|
||||||
|
if( _texture.getCamera() && parseColor(node->getStringValue(), color) )
|
||||||
|
{
|
||||||
|
_texture.getCamera()->setClearColor(color);
|
||||||
|
_render_dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "mipmapping"
|
||||||
|
|| node->getNameString() == "coverage-samples"
|
||||||
|
|| node->getNameString() == "color-samples" )
|
||||||
|
{
|
||||||
|
_sampling_dirty = true;
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "additive-blend" )
|
||||||
|
{
|
||||||
|
_texture.useAdditiveBlend( node->getBoolValue() );
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "render-always" )
|
||||||
|
{
|
||||||
|
_render_always = node->getBoolValue();
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "size" )
|
||||||
|
{
|
||||||
|
if( node->getIndex() == 0 )
|
||||||
|
setSizeX( node->getIntValue() );
|
||||||
|
else if( node->getIndex() == 1 )
|
||||||
|
setSizeY( node->getIntValue() );
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "view" )
|
||||||
|
{
|
||||||
|
if( node->getIndex() == 0 )
|
||||||
|
setViewWidth( node->getIntValue() );
|
||||||
|
else if( node->getIndex() == 1 )
|
||||||
|
setViewHeight( node->getIntValue() );
|
||||||
|
}
|
||||||
|
else if( node->getNameString() == "freeze" )
|
||||||
|
_texture.setRender( node->getBoolValue() );
|
||||||
|
else
|
||||||
|
handled = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
handled = false;
|
||||||
|
|
||||||
|
if( !handled && _root_group.get() )
|
||||||
|
_root_group->valueChanged(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
osg::Texture2D* Canvas::getTexture() const
|
||||||
|
{
|
||||||
|
return _texture.getTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Canvas::CullCallbackPtr Canvas::getCullCallback() const
|
||||||
|
{
|
||||||
|
return _cull_callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::reloadPlacements(const std::string& type)
|
||||||
|
{
|
||||||
|
for(size_t i = 0; i < _placements.size(); ++i)
|
||||||
|
{
|
||||||
|
if( _placements[i].empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SGPropertyNode* child = _placements[i].front()->getProps();
|
||||||
|
if( type.empty()
|
||||||
|
// reload if type matches or no type specified
|
||||||
|
|| child->getStringValue("type", type.c_str()) == type )
|
||||||
|
{
|
||||||
|
_dirty_placements.push_back(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::addPlacementFactory( const std::string& type,
|
||||||
|
PlacementFactory factory )
|
||||||
|
{
|
||||||
|
if( _placement_factories.find(type) != _placement_factories.end() )
|
||||||
|
SG_LOG
|
||||||
|
(
|
||||||
|
SG_GENERAL,
|
||||||
|
SG_WARN,
|
||||||
|
"Canvas::addPlacementFactory: replace existing factory '" << type << "'"
|
||||||
|
);
|
||||||
|
|
||||||
|
_placement_factories[type] = factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::removePlacementFactory(const std::string& type)
|
||||||
|
{
|
||||||
|
PlacementFactoryMap::iterator it = _placement_factories.find(type);
|
||||||
|
if( it == _placement_factories.end() )
|
||||||
|
SG_LOG
|
||||||
|
(
|
||||||
|
SG_GENERAL,
|
||||||
|
SG_WARN,
|
||||||
|
"Canvas::removePlacementFactory: no such factory '" << type << "'"
|
||||||
|
);
|
||||||
|
else
|
||||||
|
_placement_factories.erase(it);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setSystemAdapter(const SystemAdapterPtr& system_adapter)
|
||||||
|
{
|
||||||
|
_system_adapter = system_adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
SystemAdapterPtr Canvas::getSystemAdapter()
|
||||||
|
{
|
||||||
|
return _system_adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setSelf(const PropertyBasedElementPtr& self)
|
||||||
|
{
|
||||||
|
PropertyBasedElement::setSelf(self);
|
||||||
|
|
||||||
|
CanvasPtr canvas = boost::static_pointer_cast<Canvas>(self);
|
||||||
|
|
||||||
|
_root_group.reset( new Group(canvas, _node) );
|
||||||
|
_root_group->setSelf(_root_group);
|
||||||
|
|
||||||
|
// Remove automatically created property listener as we forward them on our
|
||||||
|
// own
|
||||||
|
_root_group->removeListener();
|
||||||
|
|
||||||
|
_cull_callback = new CullCallback(canvas);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Canvas::setStatusFlags(unsigned int flags, bool set)
|
||||||
|
{
|
||||||
|
if( set )
|
||||||
|
_status |= flags;
|
||||||
|
else
|
||||||
|
_status &= ~flags;
|
||||||
|
|
||||||
|
if( (_status & MISSING_SIZE_X) && (_status & MISSING_SIZE_Y) )
|
||||||
|
_status_msg = "Missing size";
|
||||||
|
else if( _status & MISSING_SIZE_X )
|
||||||
|
_status_msg = "Missing size-x";
|
||||||
|
else if( _status & MISSING_SIZE_Y )
|
||||||
|
_status_msg = "Missing size-y";
|
||||||
|
else if( _status & CREATE_FAILED )
|
||||||
|
_status_msg = "Creating render target failed";
|
||||||
|
else if( _status == STATUS_DIRTY )
|
||||||
|
_status_msg = "Creation pending...";
|
||||||
|
else
|
||||||
|
_status_msg = "Ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Canvas::PlacementFactoryMap Canvas::_placement_factories;
|
||||||
|
SystemAdapterPtr Canvas::_system_adapter;
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,222 @@
|
|||||||
|
// The canvas for rendering with the 2d API
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_HXX_
|
||||||
|
#define CANVAS_HXX_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
#include "ODGauge.hxx"
|
||||||
|
|
||||||
|
#include <simgear/canvas/elements/CanvasGroup.hxx>
|
||||||
|
#include <simgear/math/SGRect.hxx>
|
||||||
|
#include <simgear/props/PropertyBasedElement.hxx>
|
||||||
|
#include <simgear/props/propertyObject.hxx>
|
||||||
|
#include <osg/NodeCallback>
|
||||||
|
#include <osg/observer_ptr>
|
||||||
|
|
||||||
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
class CanvasMgr;
|
||||||
|
class MouseEvent;
|
||||||
|
|
||||||
|
class Canvas:
|
||||||
|
public PropertyBasedElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum StatusFlags
|
||||||
|
{
|
||||||
|
STATUS_OK,
|
||||||
|
STATUS_DIRTY = 1,
|
||||||
|
MISSING_SIZE_X = STATUS_DIRTY << 1,
|
||||||
|
MISSING_SIZE_Y = MISSING_SIZE_X << 1,
|
||||||
|
CREATE_FAILED = MISSING_SIZE_Y << 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This callback is installed on every placement of the canvas in the
|
||||||
|
* scene to only render the canvas if at least one placement is visible
|
||||||
|
*/
|
||||||
|
class CullCallback:
|
||||||
|
public osg::NodeCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CullCallback(const CanvasWeakPtr& canvas);
|
||||||
|
|
||||||
|
private:
|
||||||
|
CanvasWeakPtr _canvas;
|
||||||
|
|
||||||
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
|
||||||
|
};
|
||||||
|
typedef osg::ref_ptr<CullCallback> CullCallbackPtr;
|
||||||
|
|
||||||
|
Canvas(SGPropertyNode* node);
|
||||||
|
virtual ~Canvas();
|
||||||
|
virtual void onDestroy();
|
||||||
|
|
||||||
|
void setCanvasMgr(CanvasMgr* canvas_mgr);
|
||||||
|
CanvasMgr* getCanvasMgr() const;
|
||||||
|
|
||||||
|
bool isInit() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a canvas which should be marked as dirty upon any change to this
|
||||||
|
* canvas.
|
||||||
|
*
|
||||||
|
* This mechanism is used to eg. redraw a canvas if it's displaying
|
||||||
|
* another canvas (recursive canvases)
|
||||||
|
*/
|
||||||
|
void addParentCanvas(const CanvasWeakPtr& canvas);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a canvas which should be marked visible if this canvas is visible.
|
||||||
|
*/
|
||||||
|
void addChildCanvas(const CanvasWeakPtr& canvas);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop notifying the given canvas upon changes
|
||||||
|
*/
|
||||||
|
void removeParentCanvas(const CanvasWeakPtr& canvas);
|
||||||
|
void removeChildCanvas(const CanvasWeakPtr& canvas);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new group
|
||||||
|
*/
|
||||||
|
GroupPtr createGroup(const std::string& name = "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an existing group with the given name
|
||||||
|
*/
|
||||||
|
GroupPtr getGroup(const std::string& name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an existing group with the given name or otherwise create a new
|
||||||
|
* group
|
||||||
|
*/
|
||||||
|
GroupPtr getOrCreateGroup(const std::string& name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the root group of the canvas
|
||||||
|
*/
|
||||||
|
GroupPtr getRootGroup();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable rendering for the next frame
|
||||||
|
*
|
||||||
|
* @param force Force redraw even if nothing has changed (if dirty flag
|
||||||
|
* is not set)
|
||||||
|
*/
|
||||||
|
void enableRendering(bool force = false);
|
||||||
|
|
||||||
|
void update(double delta_time_sec);
|
||||||
|
|
||||||
|
bool addEventListener(const std::string& type, const EventListener& cb);
|
||||||
|
|
||||||
|
void setSizeX(int sx);
|
||||||
|
void setSizeY(int sy);
|
||||||
|
|
||||||
|
int getSizeX() const;
|
||||||
|
int getSizeY() const;
|
||||||
|
|
||||||
|
void setViewWidth(int w);
|
||||||
|
void setViewHeight(int h);
|
||||||
|
|
||||||
|
int getViewWidth() const;
|
||||||
|
int getViewHeight() const;
|
||||||
|
SGRect<int> getViewport() const;
|
||||||
|
|
||||||
|
bool handleMouseEvent(const MouseEventPtr& event);
|
||||||
|
|
||||||
|
virtual void childAdded( SGPropertyNode * parent,
|
||||||
|
SGPropertyNode * child );
|
||||||
|
virtual void childRemoved( SGPropertyNode * parent,
|
||||||
|
SGPropertyNode * child );
|
||||||
|
virtual void valueChanged (SGPropertyNode * node);
|
||||||
|
|
||||||
|
osg::Texture2D* getTexture() const;
|
||||||
|
|
||||||
|
CullCallbackPtr getCullCallback() const;
|
||||||
|
|
||||||
|
void reloadPlacements( const std::string& type = std::string() );
|
||||||
|
static void addPlacementFactory( const std::string& type,
|
||||||
|
PlacementFactory factory );
|
||||||
|
static void removePlacementFactory(const std::string& type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set global SystemAdapter for all Canvas/ODGauge instances.
|
||||||
|
*
|
||||||
|
* The SystemAdapter is responsible for application specific operations
|
||||||
|
* like loading images/fonts and adding/removing cameras to the scene
|
||||||
|
* graph.
|
||||||
|
*/
|
||||||
|
static void setSystemAdapter(const SystemAdapterPtr& system_adapter);
|
||||||
|
static SystemAdapterPtr getSystemAdapter();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CanvasMgr *_canvas_mgr;
|
||||||
|
|
||||||
|
boost::scoped_ptr<EventManager> _event_manager;
|
||||||
|
|
||||||
|
int _size_x,
|
||||||
|
_size_y,
|
||||||
|
_view_width,
|
||||||
|
_view_height;
|
||||||
|
|
||||||
|
PropertyObject<int> _status;
|
||||||
|
PropertyObject<std::string> _status_msg;
|
||||||
|
|
||||||
|
bool _sampling_dirty,
|
||||||
|
_render_dirty,
|
||||||
|
_visible;
|
||||||
|
|
||||||
|
ODGauge _texture;
|
||||||
|
GroupPtr _root_group;
|
||||||
|
|
||||||
|
CullCallbackPtr _cull_callback;
|
||||||
|
bool _render_always; //<! Used to disable automatic lazy rendering (culling)
|
||||||
|
|
||||||
|
std::vector<SGPropertyNode*> _dirty_placements;
|
||||||
|
std::vector<Placements> _placements;
|
||||||
|
std::set<CanvasWeakPtr> _parent_canvases, //<! Canvases showing this canvas
|
||||||
|
_child_canvases; //<! Canvases displayed within
|
||||||
|
// this canvas
|
||||||
|
|
||||||
|
typedef std::map<std::string, PlacementFactory> PlacementFactoryMap;
|
||||||
|
static PlacementFactoryMap _placement_factories;
|
||||||
|
|
||||||
|
virtual void setSelf(const PropertyBasedElementPtr& self);
|
||||||
|
void setStatusFlags(unsigned int flags, bool set = true);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static SystemAdapterPtr _system_adapter;
|
||||||
|
|
||||||
|
Canvas(const Canvas&); // = delete;
|
||||||
|
Canvas& operator=(const Canvas&); // = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_HXX_ */
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
// Canvas Event for event model similar to DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "CanvasEvent.hxx"
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Event::Event():
|
||||||
|
type(UNKNOWN),
|
||||||
|
propagation_stopped(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Event::~Event()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Event::Type Event::getType() const
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
std::string Event::getTypeString() const
|
||||||
|
{
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
# define ENUM_MAPPING(name, str) case name: return str;
|
||||||
|
# include "CanvasEventTypes.hxx"
|
||||||
|
# undef ENUM_MAPPING
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ElementWeakPtr Event::getTarget() const
|
||||||
|
{
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ElementWeakPtr Event::getCurrentTarget() const
|
||||||
|
{
|
||||||
|
return current_target;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
double Event::getTime() const
|
||||||
|
{
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void Event::stopPropagation()
|
||||||
|
{
|
||||||
|
propagation_stopped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Event::Type Event::strToType(const std::string& str)
|
||||||
|
{
|
||||||
|
typedef std::map<std::string, Type> TypeMap;
|
||||||
|
static TypeMap type_map;
|
||||||
|
|
||||||
|
if( type_map.empty() )
|
||||||
|
{
|
||||||
|
# define ENUM_MAPPING(type, str) type_map[ str ] = type;
|
||||||
|
# include "CanvasEventTypes.hxx"
|
||||||
|
# undef ENUM_MAPPING
|
||||||
|
}
|
||||||
|
|
||||||
|
TypeMap::const_iterator it = type_map.find(str);
|
||||||
|
if( it == type_map.end() )
|
||||||
|
return UNKNOWN;
|
||||||
|
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
// Canvas Event for event model similar to DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_EVENT_HXX_
|
||||||
|
#define CANVAS_EVENT_HXX_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
UNKNOWN,
|
||||||
|
# define ENUM_MAPPING(name, str) name,
|
||||||
|
# include "CanvasEventTypes.hxx"
|
||||||
|
# undef ENUM_MAPPING
|
||||||
|
USER_TYPE ///<! first unused id to be used for user defined types (not
|
||||||
|
/// implemented yet)
|
||||||
|
};
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
ElementWeakPtr target,
|
||||||
|
current_target;
|
||||||
|
double time;
|
||||||
|
bool propagation_stopped;
|
||||||
|
|
||||||
|
Event();
|
||||||
|
|
||||||
|
// We need a vtable to allow nasal::Ghost to determine the dynamic type
|
||||||
|
// of the actual event instances.
|
||||||
|
virtual ~Event();
|
||||||
|
|
||||||
|
Type getType() const;
|
||||||
|
std::string getTypeString() const;
|
||||||
|
|
||||||
|
ElementWeakPtr getTarget() const;
|
||||||
|
ElementWeakPtr getCurrentTarget() const;
|
||||||
|
|
||||||
|
double getTime() const;
|
||||||
|
|
||||||
|
void stopPropagation();
|
||||||
|
|
||||||
|
static Type strToType(const std::string& str);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_EVENT_HXX_ */
|
||||||
@@ -0,0 +1,348 @@
|
|||||||
|
// Manage event handling inside a Canvas similar to the DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "CanvasEventManager.hxx"
|
||||||
|
#include "MouseEvent.hxx"
|
||||||
|
#include <simgear/canvas/elements/CanvasElement.hxx>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
const unsigned int drag_threshold = 8;
|
||||||
|
const double multi_click_timeout = 0.4;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
EventManager::StampedPropagationPath::StampedPropagationPath():
|
||||||
|
time(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
EventManager::StampedPropagationPath::StampedPropagationPath(
|
||||||
|
const EventPropagationPath& path,
|
||||||
|
double time
|
||||||
|
):
|
||||||
|
path(path),
|
||||||
|
time(time)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void EventManager::StampedPropagationPath::clear()
|
||||||
|
{
|
||||||
|
path.clear();
|
||||||
|
time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventManager::StampedPropagationPath::valid() const
|
||||||
|
{
|
||||||
|
return !path.empty() && time > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
EventManager::EventManager():
|
||||||
|
_current_click_count(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventManager::handleEvent( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path )
|
||||||
|
{
|
||||||
|
bool handled = false;
|
||||||
|
switch( event->type )
|
||||||
|
{
|
||||||
|
case Event::MOUSE_DOWN:
|
||||||
|
_last_mouse_down = StampedPropagationPath(path, event->getTime());
|
||||||
|
break;
|
||||||
|
case Event::MOUSE_UP:
|
||||||
|
{
|
||||||
|
// If the mouse has moved while a button was down (aka. dragging) we
|
||||||
|
// need to notify the original element that the mouse has left it, and
|
||||||
|
// the new element that it has been entered
|
||||||
|
if( _last_mouse_down.path != path )
|
||||||
|
handled |= handleMove(event, path);
|
||||||
|
|
||||||
|
// normal mouseup
|
||||||
|
handled |= propagateEvent(event, path);
|
||||||
|
|
||||||
|
if( _last_mouse_down.path.empty() )
|
||||||
|
// Ignore mouse up without any previous mouse down
|
||||||
|
return handled;
|
||||||
|
|
||||||
|
// now handle click/dblclick
|
||||||
|
if( checkClickDistance(path, _last_mouse_down.path) )
|
||||||
|
handled |=
|
||||||
|
handleClick(event, getCommonAncestor(_last_mouse_down.path, path));
|
||||||
|
|
||||||
|
_last_mouse_down.clear();
|
||||||
|
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
case Event::DRAG:
|
||||||
|
if( !_last_mouse_down.valid() )
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return propagateEvent(event, _last_mouse_down.path);
|
||||||
|
case Event::MOUSE_MOVE:
|
||||||
|
handled |= handleMove(event, path);
|
||||||
|
break;
|
||||||
|
case Event::MOUSE_LEAVE:
|
||||||
|
// Mouse leaves window and therefore also current mouseover element
|
||||||
|
handleMove(event, EventPropagationPath());
|
||||||
|
|
||||||
|
// Event is only send if mouse is moved outside the window or dragging
|
||||||
|
// has ended somewhere outside the window. In both cases a mouse button
|
||||||
|
// has been released, so no more mouse down or click...
|
||||||
|
_last_mouse_down.clear();
|
||||||
|
_last_click.clear();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
case Event::WHEEL:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return handled | propagateEvent(event, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventManager::handleClick( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path )
|
||||||
|
{
|
||||||
|
MouseEventPtr click(new MouseEvent(*event));
|
||||||
|
click->type = Event::CLICK;
|
||||||
|
|
||||||
|
if( event->getTime() > _last_click.time + multi_click_timeout )
|
||||||
|
_current_click_count = 1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Maximum current click count is 3
|
||||||
|
_current_click_count = (_current_click_count % 3) + 1;
|
||||||
|
|
||||||
|
if( _current_click_count > 1 )
|
||||||
|
{
|
||||||
|
// Reset current click count if moved too far
|
||||||
|
if( !checkClickDistance(path, _last_click.path) )
|
||||||
|
_current_click_count = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
click->click_count = _current_click_count;
|
||||||
|
|
||||||
|
MouseEventPtr dbl_click;
|
||||||
|
if( _current_click_count == 2 )
|
||||||
|
{
|
||||||
|
dbl_click.reset(new MouseEvent(*click));
|
||||||
|
dbl_click->type = Event::DBL_CLICK;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handled = propagateEvent(click, path);
|
||||||
|
|
||||||
|
if( dbl_click )
|
||||||
|
handled |= propagateEvent( dbl_click,
|
||||||
|
getCommonAncestor(_last_click.path, path) );
|
||||||
|
|
||||||
|
_last_click = StampedPropagationPath(path, event->getTime());
|
||||||
|
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventManager::handleMove( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path )
|
||||||
|
{
|
||||||
|
EventPropagationPath& last_path = _last_mouse_over.path;
|
||||||
|
if( last_path == path )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool handled = false;
|
||||||
|
|
||||||
|
// Leave old element
|
||||||
|
if( !last_path.empty() )
|
||||||
|
{
|
||||||
|
MouseEventPtr mouseout(new MouseEvent(*event));
|
||||||
|
mouseout->type = Event::MOUSE_OUT;
|
||||||
|
handled |= propagateEvent(mouseout, last_path);
|
||||||
|
|
||||||
|
// Send a mouseleave event to all ancestors of the currently left element
|
||||||
|
// which are not ancestor of the new element currently entered
|
||||||
|
EventPropagationPath path_leave = last_path;
|
||||||
|
for(size_t i = path_leave.size() - 1; i > 0; --i)
|
||||||
|
{
|
||||||
|
if( i < path.size() && path[i] == path_leave[i] )
|
||||||
|
break;
|
||||||
|
|
||||||
|
MouseEventPtr mouseleave(new MouseEvent(*event));
|
||||||
|
mouseleave->type = Event::MOUSE_LEAVE;
|
||||||
|
handled |= propagateEvent(mouseleave, path_leave);
|
||||||
|
|
||||||
|
path_leave.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enter new element
|
||||||
|
if( !path.empty() )
|
||||||
|
{
|
||||||
|
MouseEventPtr mouseover(new MouseEvent(*event));
|
||||||
|
mouseover->type = Event::MOUSE_OVER;
|
||||||
|
handled |= propagateEvent(mouseover, path);
|
||||||
|
|
||||||
|
// Send a mouseenter event to all ancestors of the currently entered
|
||||||
|
// element which are not ancestor of the old element currently being
|
||||||
|
// left
|
||||||
|
EventPropagationPath path_enter;
|
||||||
|
for(size_t i = 0; i < path.size(); ++i)
|
||||||
|
{
|
||||||
|
path_enter.push_back(path[i]);
|
||||||
|
|
||||||
|
if( i < last_path.size() && path[i] == last_path[i] )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
MouseEventPtr mouseenter(new MouseEvent(*event));
|
||||||
|
mouseenter->type = Event::MOUSE_ENTER;
|
||||||
|
handled |= propagateEvent(mouseenter, path_enter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_last_mouse_over.path = path;
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventManager::propagateEvent( const EventPtr& event,
|
||||||
|
const EventPropagationPath& path )
|
||||||
|
{
|
||||||
|
event->target = path.back().element;
|
||||||
|
MouseEventPtr mouse_event = boost::dynamic_pointer_cast<MouseEvent>(event);
|
||||||
|
|
||||||
|
// Event propagation similar to DOM Level 3 event flow:
|
||||||
|
// http://www.w3.org/TR/DOM-Level-3-Events/#event-flow
|
||||||
|
|
||||||
|
// Capturing phase
|
||||||
|
// for( EventPropagationPath::const_iterator it = path.begin();
|
||||||
|
// it != path.end();
|
||||||
|
// ++it )
|
||||||
|
// {
|
||||||
|
// if( !it->element.expired() )
|
||||||
|
// std::cout << it->element.lock()->getProps()->getPath() << std::endl;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Check if event supports bubbling
|
||||||
|
const Event::Type types_no_bubbling[] = {
|
||||||
|
Event::MOUSE_ENTER,
|
||||||
|
Event::MOUSE_LEAVE,
|
||||||
|
};
|
||||||
|
const size_t num_types_no_bubbling = sizeof(types_no_bubbling)
|
||||||
|
/ sizeof(types_no_bubbling[0]);
|
||||||
|
bool do_bubble = true;
|
||||||
|
for( size_t i = 0; i < num_types_no_bubbling; ++i )
|
||||||
|
if( event->type == types_no_bubbling[i] )
|
||||||
|
{
|
||||||
|
do_bubble = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bubbling phase
|
||||||
|
for( EventPropagationPath::const_reverse_iterator
|
||||||
|
it = path.rbegin();
|
||||||
|
it != path.rend();
|
||||||
|
++it )
|
||||||
|
{
|
||||||
|
ElementPtr el = it->element.lock();
|
||||||
|
|
||||||
|
if( !el )
|
||||||
|
{
|
||||||
|
// Ignore element if it has been destroyed while traversing the event
|
||||||
|
// (eg. removed by another event handler)
|
||||||
|
if( do_bubble )
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO provide functions to convert delta to local coordinates on demand.
|
||||||
|
// Maybe also provide a clone method for events as local coordinates
|
||||||
|
// might differ between different elements receiving the same event.
|
||||||
|
if( mouse_event ) //&& event->type != Event::DRAG )
|
||||||
|
{
|
||||||
|
// TODO transform pos and delta for drag events. Maybe we should just
|
||||||
|
// store the global coordinates and convert to local coordinates
|
||||||
|
// on demand.
|
||||||
|
|
||||||
|
// Position and delta are specified in local coordinate system of
|
||||||
|
// current element
|
||||||
|
mouse_event->local_pos = it->local_pos;
|
||||||
|
//mouse_event->delta = it->local_delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
event->current_target = el;
|
||||||
|
el->handleEvent(event);
|
||||||
|
|
||||||
|
if( event->propagation_stopped || !do_bubble )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool
|
||||||
|
EventManager::checkClickDistance( const EventPropagationPath& path1,
|
||||||
|
const EventPropagationPath& path2 ) const
|
||||||
|
{
|
||||||
|
osg::Vec2 delta = path1.front().local_pos - path2.front().local_pos;
|
||||||
|
return std::fabs(delta.x()) < drag_threshold
|
||||||
|
&& std::fabs(delta.y()) < drag_threshold;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
EventPropagationPath
|
||||||
|
EventManager::getCommonAncestor( const EventPropagationPath& path1,
|
||||||
|
const EventPropagationPath& path2 ) const
|
||||||
|
{
|
||||||
|
if( path1.empty() || path2.empty() )
|
||||||
|
return EventPropagationPath();
|
||||||
|
|
||||||
|
if( path1.back().element.lock() == path2.back().element.lock() )
|
||||||
|
return path2;
|
||||||
|
|
||||||
|
EventPropagationPath path;
|
||||||
|
|
||||||
|
for( size_t i = 0; i < path1.size() && i < path2.size(); ++i )
|
||||||
|
{
|
||||||
|
if( path1[i].element.lock() != path2[i].element.lock() )
|
||||||
|
break;
|
||||||
|
|
||||||
|
path.push_back(path2[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
// Manage event handling inside a Canvas similar to the DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_EVENT_MANAGER_HXX_
|
||||||
|
#define CANVAS_EVENT_MANAGER_HXX_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
struct EventTarget
|
||||||
|
{
|
||||||
|
ElementWeakPtr element;
|
||||||
|
osg::Vec2f local_pos,
|
||||||
|
local_delta;
|
||||||
|
};
|
||||||
|
typedef std::deque<EventTarget> EventPropagationPath;
|
||||||
|
inline bool operator==(const EventTarget& t1, const EventTarget& t2)
|
||||||
|
{
|
||||||
|
return t1.element.lock() == t2.element.lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
class EventManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EventManager();
|
||||||
|
|
||||||
|
bool handleEvent( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
struct StampedPropagationPath
|
||||||
|
{
|
||||||
|
StampedPropagationPath();
|
||||||
|
StampedPropagationPath(const EventPropagationPath& path, double time);
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
bool valid() const;
|
||||||
|
|
||||||
|
EventPropagationPath path;
|
||||||
|
double time;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO if we really need the paths modify to not copy around the paths
|
||||||
|
// that much.
|
||||||
|
StampedPropagationPath _last_mouse_down,
|
||||||
|
_last_click,
|
||||||
|
_last_mouse_over;
|
||||||
|
size_t _current_click_count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Propagate click event and handle multi-click (eg. create dblclick)
|
||||||
|
*/
|
||||||
|
bool handleClick( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle mouseover/enter/out/leave
|
||||||
|
*/
|
||||||
|
bool handleMove( const MouseEventPtr& event,
|
||||||
|
const EventPropagationPath& path );
|
||||||
|
|
||||||
|
bool propagateEvent( const EventPtr& event,
|
||||||
|
const EventPropagationPath& path );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if two click events (either mousedown/up or two consecutive
|
||||||
|
* clicks) are inside a maximum distance to still create a click or
|
||||||
|
* dblclick event respectively.
|
||||||
|
*/
|
||||||
|
bool checkClickDistance( const EventPropagationPath& path1,
|
||||||
|
const EventPropagationPath& path2 ) const;
|
||||||
|
EventPropagationPath
|
||||||
|
getCommonAncestor( const EventPropagationPath& path1,
|
||||||
|
const EventPropagationPath& path2 ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_EVENT_MANAGER_HXX_ */
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
// Mapping between canvas gui Event types and their names
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef ENUM_MAPPING
|
||||||
|
# error "Don't include this file directly!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ENUM_MAPPING(MOUSE_DOWN, "mousedown")
|
||||||
|
ENUM_MAPPING(MOUSE_UP, "mouseup")
|
||||||
|
ENUM_MAPPING(CLICK, "click")
|
||||||
|
ENUM_MAPPING(DBL_CLICK, "dblclick")
|
||||||
|
ENUM_MAPPING(DRAG, "drag")
|
||||||
|
ENUM_MAPPING(WHEEL, "wheel")
|
||||||
|
ENUM_MAPPING(MOUSE_MOVE, "mousemove")
|
||||||
|
ENUM_MAPPING(MOUSE_OVER, "mouseover")
|
||||||
|
ENUM_MAPPING(MOUSE_OUT, "mouseout")
|
||||||
|
ENUM_MAPPING(MOUSE_ENTER, "mouseenter")
|
||||||
|
ENUM_MAPPING(MOUSE_LEAVE, "mouseleave")
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
// Visitor for traversing a canvas element hierarchy similar to the traversal
|
||||||
|
// of the DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "CanvasEvent.hxx"
|
||||||
|
#include "CanvasEventVisitor.hxx"
|
||||||
|
#include <simgear/canvas/elements/CanvasElement.hxx>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
EventVisitor::EventVisitor( TraverseMode mode,
|
||||||
|
const osg::Vec2f& pos,
|
||||||
|
const osg::Vec2f& delta,
|
||||||
|
const ElementPtr& root ):
|
||||||
|
_traverse_mode( mode ),
|
||||||
|
_root(root)
|
||||||
|
{
|
||||||
|
if( mode == TRAVERSE_DOWN )
|
||||||
|
{
|
||||||
|
EventTarget target = {ElementWeakPtr(), pos, delta};
|
||||||
|
_target_path.push_back(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
EventVisitor::~EventVisitor()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventVisitor::traverse(Element& el)
|
||||||
|
{
|
||||||
|
if( _traverse_mode == TRAVERSE_UP )
|
||||||
|
return el.ascend(*this);
|
||||||
|
else
|
||||||
|
return el.traverse(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool EventVisitor::apply(Element& el)
|
||||||
|
{
|
||||||
|
// We only need to check for hits while traversing down
|
||||||
|
if( _traverse_mode == TRAVERSE_DOWN )
|
||||||
|
{
|
||||||
|
// Transform event to local coordinates
|
||||||
|
const osg::Matrix& m = el.getMatrixTransform()->getInverseMatrix();
|
||||||
|
const osg::Vec2f& pos = _target_path.back().local_pos;
|
||||||
|
const osg::Vec2f local_pos
|
||||||
|
(
|
||||||
|
m(0, 0) * pos[0] + m(1, 0) * pos[1] + m(3, 0),
|
||||||
|
m(0, 1) * pos[0] + m(1, 1) * pos[1] + m(3, 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Don't check specified root element for collision, as its purpose is to
|
||||||
|
// catch all events which have no target. This allows for example calling
|
||||||
|
// event listeners attached to the canvas itself (its root group) even if
|
||||||
|
// no element has been hit.
|
||||||
|
if( _root.get() != &el && !el.hitBound(pos, local_pos) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const osg::Vec2f& delta = _target_path.back().local_delta;
|
||||||
|
const osg::Vec2f local_delta
|
||||||
|
(
|
||||||
|
m(0, 0) * delta[0] + m(1, 0) * delta[1],
|
||||||
|
m(0, 1) * delta[0] + m(1, 1) * delta[1]
|
||||||
|
);
|
||||||
|
|
||||||
|
EventTarget target = {el.getWeakPtr(), local_pos, local_delta};
|
||||||
|
_target_path.push_back(target);
|
||||||
|
|
||||||
|
if( el.traverse(*this) || &el == _root.get() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
_target_path.pop_back();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return el.ascend(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
const EventPropagationPath& EventVisitor::getPropagationPath() const
|
||||||
|
{
|
||||||
|
return _target_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
// Visitor for traversing a canvas element hierarchy similar to the traversal
|
||||||
|
// of the DOM Level 3 Event Model
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_EVENT_VISITOR_HXX_
|
||||||
|
#define CANVAS_EVENT_VISITOR_HXX_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
#include "CanvasEventManager.hxx"
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class EventVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum TraverseMode
|
||||||
|
{
|
||||||
|
TRAVERSE_UP,
|
||||||
|
TRAVERSE_DOWN
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param mode
|
||||||
|
* @param pos Mouse position
|
||||||
|
* @param delta Mouse movement since last mouse move event
|
||||||
|
* @param root Element to dispatch events to if no element is hit
|
||||||
|
*/
|
||||||
|
EventVisitor( TraverseMode mode,
|
||||||
|
const osg::Vec2f& pos,
|
||||||
|
const osg::Vec2f& delta,
|
||||||
|
const ElementPtr& root = ElementPtr() );
|
||||||
|
virtual ~EventVisitor();
|
||||||
|
virtual bool traverse(Element& el);
|
||||||
|
virtual bool apply(Element& el);
|
||||||
|
|
||||||
|
const EventPropagationPath& getPropagationPath() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
TraverseMode _traverse_mode;
|
||||||
|
EventPropagationPath _target_path;
|
||||||
|
ElementPtr _root;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* CANVAS_EVENTVISITOR_HXX_ */
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
// Canvas with 2D rendering API
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "CanvasMgr.hxx"
|
||||||
|
#include "Canvas.hxx"
|
||||||
|
#include "CanvasEventManager.hxx"
|
||||||
|
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Canvas factory
|
||||||
|
*/
|
||||||
|
CanvasPtr canvasFactory(SGPropertyNode* node)
|
||||||
|
{
|
||||||
|
return CanvasPtr(new Canvas(node));
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
CanvasMgr::CanvasMgr(SGPropertyNode_ptr node):
|
||||||
|
PropertyBasedMgr(node, "texture", &canvasFactory)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
CanvasPtr CanvasMgr::createCanvas(const std::string& name)
|
||||||
|
{
|
||||||
|
return boost::static_pointer_cast<Canvas>( createElement(name) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
CanvasPtr CanvasMgr::getCanvas(size_t index) const
|
||||||
|
{
|
||||||
|
return boost::static_pointer_cast<Canvas>( getElement(index) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
CanvasPtr CanvasMgr::getCanvas(const std::string& name) const
|
||||||
|
{
|
||||||
|
return boost::static_pointer_cast<Canvas>( getElement(name) );
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void CanvasMgr::elementCreated(PropertyBasedElementPtr element)
|
||||||
|
{
|
||||||
|
CanvasPtr canvas = boost::static_pointer_cast<Canvas>(element);
|
||||||
|
canvas->setCanvasMgr(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
// Canvas with 2D rendering API
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef SG_CANVAS_MGR_H_
|
||||||
|
#define SG_CANVAS_MGR_H_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
#include <simgear/props/PropertyBasedMgr.hxx>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class CanvasMgr:
|
||||||
|
public PropertyBasedMgr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param node Root node of branch used to control canvasses
|
||||||
|
*/
|
||||||
|
CanvasMgr(SGPropertyNode_ptr node);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new canvas
|
||||||
|
*
|
||||||
|
* @param name Name of the new canvas
|
||||||
|
*/
|
||||||
|
CanvasPtr createCanvas(const std::string& name = "");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ::Canvas by index
|
||||||
|
*
|
||||||
|
* @param index Index of texture node in /canvas/by-index/
|
||||||
|
*/
|
||||||
|
CanvasPtr getCanvas(size_t index) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get ::Canvas by name
|
||||||
|
*
|
||||||
|
* @param name Value of child node "name" in
|
||||||
|
* /canvas/by-index/texture[i]/name
|
||||||
|
*/
|
||||||
|
CanvasPtr getCanvas(const std::string& name) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void elementCreated(PropertyBasedElementPtr element);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* SG_CANVAS_MGR_H_ */
|
||||||
@@ -0,0 +1,244 @@
|
|||||||
|
// Canvas placement for placing a canvas texture onto osg objects.
|
||||||
|
//
|
||||||
|
// It also provides a SGPickCallback for passing mouse events to the canvas and
|
||||||
|
// manages emissive lighting of the placed canvas.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2013 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "Canvas.hxx"
|
||||||
|
#include "CanvasObjectPlacement.hxx"
|
||||||
|
#include "MouseEvent.hxx"
|
||||||
|
|
||||||
|
#include <simgear/props/props.hxx>
|
||||||
|
#include <simgear/scene/util/SGPickCallback.hxx>
|
||||||
|
|
||||||
|
#include <osgGA/GUIEventAdapter>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle picking events on object with a canvas placed onto
|
||||||
|
*/
|
||||||
|
class ObjectPickCallback:
|
||||||
|
public SGPickCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ObjectPickCallback(const CanvasWeakPtr& canvas):
|
||||||
|
_canvas(canvas)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual bool needsUV() const { return true; }
|
||||||
|
|
||||||
|
virtual bool buttonPressed( int,
|
||||||
|
const osgGA::GUIEventAdapter& ea,
|
||||||
|
const Info& info )
|
||||||
|
{
|
||||||
|
MouseEventPtr event(new MouseEvent(ea));
|
||||||
|
updatePosFromUV(event, info.uv);
|
||||||
|
|
||||||
|
if( ea.getEventType() == osgGA::GUIEventAdapter::SCROLL )
|
||||||
|
{
|
||||||
|
event->type = Event::WHEEL;
|
||||||
|
event->delta.set(0,0);
|
||||||
|
switch( ea.getScrollingMotion() )
|
||||||
|
{
|
||||||
|
case osgGA::GUIEventAdapter::SCROLL_UP:
|
||||||
|
event->delta.y() = 1;
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::SCROLL_DOWN:
|
||||||
|
event->delta.y() = -1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
event->type = Event::MOUSE_DOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void buttonReleased( int,
|
||||||
|
const osgGA::GUIEventAdapter& ea,
|
||||||
|
const Info* info )
|
||||||
|
{
|
||||||
|
if( ea.getEventType() != osgGA::GUIEventAdapter::RELEASE )
|
||||||
|
return;
|
||||||
|
|
||||||
|
MouseEventPtr event(new MouseEvent(ea));
|
||||||
|
event->type = Event::MOUSE_UP;
|
||||||
|
updatePosFromUV(event, info ? info->uv : SGVec2d(-1,-1));
|
||||||
|
|
||||||
|
handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void mouseMoved( const osgGA::GUIEventAdapter& ea,
|
||||||
|
const Info* info )
|
||||||
|
{
|
||||||
|
// drag (currently only with LMB)
|
||||||
|
if( ea.getEventType() != osgGA::GUIEventAdapter::DRAG )
|
||||||
|
return;
|
||||||
|
|
||||||
|
MouseEventPtr event(new MouseEvent(ea));
|
||||||
|
event->type = Event::DRAG;
|
||||||
|
updatePosFromUV(event, info ? info->uv : SGVec2d(-1,-1));
|
||||||
|
|
||||||
|
handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool hover( const osg::Vec2d& windowPos,
|
||||||
|
const Info& info )
|
||||||
|
{
|
||||||
|
// TODO somehow get more info about event (time, modifiers, pressed
|
||||||
|
// buttons, ...)
|
||||||
|
MouseEventPtr event(new MouseEvent);
|
||||||
|
event->type = Event::MOUSE_MOVE;
|
||||||
|
event->screen_pos = windowPos;
|
||||||
|
updatePosFromUV(event, info.uv);
|
||||||
|
|
||||||
|
return handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void mouseLeave( const osg::Vec2d& windowPos )
|
||||||
|
{
|
||||||
|
MouseEventPtr event(new MouseEvent);
|
||||||
|
event->type = Event::MOUSE_LEAVE;
|
||||||
|
event->screen_pos = windowPos;
|
||||||
|
|
||||||
|
handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CanvasWeakPtr _canvas;
|
||||||
|
osg::Vec2f _last_pos,
|
||||||
|
_last_delta;
|
||||||
|
|
||||||
|
void updatePosFromUV(const MouseEventPtr& event, const SGVec2d& uv)
|
||||||
|
{
|
||||||
|
CanvasPtr canvas = _canvas.lock();
|
||||||
|
if( !canvas )
|
||||||
|
return;
|
||||||
|
|
||||||
|
osg::Vec2d pos( uv.x() * canvas->getViewWidth(),
|
||||||
|
(1 - uv.y()) * canvas->getViewHeight() );
|
||||||
|
|
||||||
|
_last_delta = pos - _last_pos;
|
||||||
|
_last_pos = pos;
|
||||||
|
|
||||||
|
event->client_pos = pos;
|
||||||
|
event->delta = _last_delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool handleEvent(const MouseEventPtr& event)
|
||||||
|
{
|
||||||
|
CanvasPtr canvas = _canvas.lock();
|
||||||
|
if( !canvas )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return canvas->handleMouseEvent(event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ObjectPlacement::ObjectPlacement( SGPropertyNode* node,
|
||||||
|
const GroupPtr& group,
|
||||||
|
const CanvasWeakPtr& canvas ):
|
||||||
|
Placement(node),
|
||||||
|
_group(group),
|
||||||
|
_canvas(canvas)
|
||||||
|
{
|
||||||
|
// TODO make more generic and extendable for more properties
|
||||||
|
if( node->hasValue("emission") )
|
||||||
|
setEmission( node->getFloatValue("emission") );
|
||||||
|
if( node->hasValue("capture-events") )
|
||||||
|
setCaptureEvents( node->getBoolValue("capture-events") );
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ObjectPlacement::~ObjectPlacement()
|
||||||
|
{
|
||||||
|
assert( _group->getNumChildren() == 1 );
|
||||||
|
osg::Node *child = _group->getChild(0);
|
||||||
|
|
||||||
|
if( _group->getNumParents() )
|
||||||
|
{
|
||||||
|
osg::Group *parent = _group->getParent(0);
|
||||||
|
parent->addChild(child);
|
||||||
|
parent->removeChild(_group);
|
||||||
|
}
|
||||||
|
|
||||||
|
_group->removeChild(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ObjectPlacement::setEmission(float emit)
|
||||||
|
{
|
||||||
|
emit = SGMiscf::clip(emit, 0, 1);
|
||||||
|
|
||||||
|
if( !_material )
|
||||||
|
{
|
||||||
|
_material = new osg::Material;
|
||||||
|
_material->setColorMode(osg::Material::OFF);
|
||||||
|
_material->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
_group->getOrCreateStateSet()
|
||||||
|
->setAttribute(_material, ( osg::StateAttribute::ON
|
||||||
|
| osg::StateAttribute::OVERRIDE ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
_material->setEmission(
|
||||||
|
osg::Material::FRONT_AND_BACK,
|
||||||
|
osg::Vec4(emit, emit, emit, emit)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ObjectPlacement::setCaptureEvents(bool enable)
|
||||||
|
{
|
||||||
|
if( !enable && _scene_user_data )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( enable && !_pick_cb )
|
||||||
|
_pick_cb = new ObjectPickCallback(_canvas);
|
||||||
|
|
||||||
|
_scene_user_data = SGSceneUserData::getOrCreateSceneUserData(_group);
|
||||||
|
_scene_user_data->setPickCallback(enable ? _pick_cb.get() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool ObjectPlacement::childChanged(SGPropertyNode* node)
|
||||||
|
{
|
||||||
|
if( node->getParent() != _node )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if( node->getNameString() == "emission" )
|
||||||
|
setEmission( node->getFloatValue() );
|
||||||
|
else if( node->getNameString() == "capture-events" )
|
||||||
|
setCaptureEvents( node->getBoolValue() );
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
// Canvas placement for placing a canvas texture onto osg objects.
|
||||||
|
//
|
||||||
|
// It also provides a SGPickCallback for passing mouse events to the canvas and
|
||||||
|
// manages emissive lighting of the placed canvas.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2013 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_PICK_PLACEMENT_HXX_
|
||||||
|
#define CANVAS_OBJECT_PLACEMENT_HXX_
|
||||||
|
|
||||||
|
#include "CanvasPlacement.hxx"
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
|
||||||
|
#include <simgear/scene/util/SGSceneUserData.hxx>
|
||||||
|
#include <osg/Material>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class ObjectPlacement:
|
||||||
|
public Placement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef osg::ref_ptr<osg::Group> GroupPtr;
|
||||||
|
typedef osg::ref_ptr<osg::Material> MaterialPtr;
|
||||||
|
|
||||||
|
ObjectPlacement( SGPropertyNode* node,
|
||||||
|
const GroupPtr& group,
|
||||||
|
const CanvasWeakPtr& canvas );
|
||||||
|
virtual ~ObjectPlacement();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set emissive lighting of the object the canvas is placed on.
|
||||||
|
*/
|
||||||
|
void setEmission(float emit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether pick events should be captured.
|
||||||
|
*/
|
||||||
|
void setCaptureEvents(bool enable);
|
||||||
|
|
||||||
|
virtual bool childChanged(SGPropertyNode* child);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typedef SGSharedPtr<SGPickCallback> PickCallbackPtr;
|
||||||
|
typedef osg::ref_ptr<SGSceneUserData> SGSceneUserDataPtr;
|
||||||
|
|
||||||
|
GroupPtr _group;
|
||||||
|
MaterialPtr _material;
|
||||||
|
CanvasWeakPtr _canvas;
|
||||||
|
PickCallbackPtr _pick_cb;
|
||||||
|
SGSceneUserDataPtr _scene_user_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_PICK_PLACEMENT_HXX_ */
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
// Base class for canvas placements
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#include "CanvasPlacement.hxx"
|
||||||
|
#include <simgear/props/props.hxx>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Placement::Placement(SGPropertyNode* node):
|
||||||
|
_node(node)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
Placement::~Placement()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
SGConstPropertyNode_ptr Placement::getProps() const
|
||||||
|
{
|
||||||
|
return _node;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
SGPropertyNode_ptr Placement::getProps()
|
||||||
|
{
|
||||||
|
return _node;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool Placement::childChanged(SGPropertyNode* child)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// Base class for canvas placements
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_PLACEMENT_HXX_
|
||||||
|
#define CANVAS_PLACEMENT_HXX_
|
||||||
|
|
||||||
|
#include <simgear/props/propsfwd.hxx>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class Placement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Placement(SGPropertyNode* node);
|
||||||
|
virtual ~Placement() = 0;
|
||||||
|
|
||||||
|
SGConstPropertyNode_ptr getProps() const;
|
||||||
|
SGPropertyNode_ptr getProps();
|
||||||
|
|
||||||
|
virtual bool childChanged(SGPropertyNode* child);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
SGPropertyNode_ptr _node;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Placement(const Placement&) /* = delete */;
|
||||||
|
Placement& operator=(const Placement&) /* = delete */;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_PLACEMENT_HXX_ */
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
// Adapter for using the canvas with different applications
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef SG_CANVAS_SYSTEM_ADAPTER_HXX_
|
||||||
|
#define SG_CANVAS_SYSTEM_ADAPTER_HXX_
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class SystemAdapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual ~SystemAdapter() {}
|
||||||
|
virtual FontPtr getFont(const std::string& name) const = 0;
|
||||||
|
virtual void addCamera(osg::Camera* camera) const = 0;
|
||||||
|
virtual void removeCamera(osg::Camera* camera) const = 0;
|
||||||
|
virtual osg::Image* getImage(const std::string& path) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* SG_CANVAS_SYSTEM_ADAPTER_HXX_ */
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
// Mouse event
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Thomas Geymayer <tomgey@gmail.com>
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef CANVAS_MOUSE_EVENT_HXX_
|
||||||
|
#define CANVAS_MOUSE_EVENT_HXX_
|
||||||
|
|
||||||
|
#include "CanvasEvent.hxx"
|
||||||
|
#include <osgGA/GUIEventAdapter>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class MouseEvent:
|
||||||
|
public Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MouseEvent():
|
||||||
|
button(-1),
|
||||||
|
state(-1),
|
||||||
|
mod(-1),
|
||||||
|
click_count(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
MouseEvent(const osgGA::GUIEventAdapter& ea):
|
||||||
|
button(ea.getButton()),
|
||||||
|
state(ea.getButtonMask()),
|
||||||
|
mod(ea.getModKeyMask()),
|
||||||
|
click_count(0)
|
||||||
|
{
|
||||||
|
time = ea.getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec2f getScreenPos() const { return screen_pos; }
|
||||||
|
osg::Vec2f getClientPos() const { return client_pos; }
|
||||||
|
osg::Vec2f getLocalPos() const { return local_pos; }
|
||||||
|
osg::Vec2f getDelta() const { return delta; }
|
||||||
|
|
||||||
|
float getScreenX() const { return screen_pos.x(); }
|
||||||
|
float getScreenY() const { return screen_pos.y(); }
|
||||||
|
|
||||||
|
float getClientX() const { return client_pos.x(); }
|
||||||
|
float getClientY() const { return client_pos.y(); }
|
||||||
|
|
||||||
|
float getLocalX() const { return local_pos.x(); }
|
||||||
|
float getLocalY() const { return local_pos.y(); }
|
||||||
|
|
||||||
|
float getDeltaX() const { return delta.x(); }
|
||||||
|
float getDeltaY() const { return delta.y(); }
|
||||||
|
|
||||||
|
int getCurrentClickCount() const { return click_count; }
|
||||||
|
|
||||||
|
osg::Vec2f screen_pos, //<! Position in screen coordinates
|
||||||
|
client_pos, //<! Position in window/canvas coordinates
|
||||||
|
local_pos, //<! Position in local/element coordinates
|
||||||
|
delta;
|
||||||
|
int button, //<! Button for this event
|
||||||
|
state, //<! Current button state
|
||||||
|
mod, //<! Keyboard modifier state
|
||||||
|
click_count; //<! Current click count
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif /* CANVAS_MOUSE_EVENT_HXX_ */
|
||||||
@@ -0,0 +1,379 @@
|
|||||||
|
// Owner Drawn Gauge helper class
|
||||||
|
//
|
||||||
|
// Written by Harald JOHNSEN, started May 2005.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2005 Harald JOHNSEN
|
||||||
|
//
|
||||||
|
// Ported to OSG by Tim Moore - Jun 2007
|
||||||
|
//
|
||||||
|
// Heavily modified to be usable for the 2d Canvas by Thomas Geymayer - April 2012
|
||||||
|
// Supports now multisampling/mipmapping, usage of the stencil buffer and placing
|
||||||
|
// the texture in the scene by certain filter criteria
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "ODGauge.hxx"
|
||||||
|
#include "Canvas.hxx"
|
||||||
|
#include "CanvasSystemAdapter.hxx"
|
||||||
|
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/scene/util/RenderConstants.hxx>
|
||||||
|
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/AlphaFunc>
|
||||||
|
#include <osg/BlendFunc>
|
||||||
|
#include <osg/Camera>
|
||||||
|
#include <osg/Matrix>
|
||||||
|
#include <osg/PolygonMode>
|
||||||
|
#include <osg/ShadeModel>
|
||||||
|
#include <osg/StateSet>
|
||||||
|
#include <osg/FrameBufferObject> // for GL_DEPTH_STENCIL_EXT on Windows
|
||||||
|
#include <osgUtil/RenderBin>
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
class PreOrderBin:
|
||||||
|
public osgUtil::RenderBin
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
PreOrderBin()
|
||||||
|
{}
|
||||||
|
PreOrderBin( const RenderBin& rhs,
|
||||||
|
const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY ):
|
||||||
|
RenderBin(rhs, copyop)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual osg::Object* cloneType() const
|
||||||
|
{
|
||||||
|
return new PreOrderBin();
|
||||||
|
}
|
||||||
|
virtual osg::Object* clone(const osg::CopyOp& copyop) const
|
||||||
|
{
|
||||||
|
return new PreOrderBin(*this,copyop);
|
||||||
|
}
|
||||||
|
virtual bool isSameKindAs(const osg::Object* obj) const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const PreOrderBin*>(obj) != 0L;
|
||||||
|
}
|
||||||
|
virtual const char* className() const
|
||||||
|
{
|
||||||
|
return "PreOrderBin";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void sort()
|
||||||
|
{
|
||||||
|
// Do not sort to keep traversal order...
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef OSG_INIT_SINGLETON_PROXY
|
||||||
|
/**
|
||||||
|
* http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk/include/osg/Object
|
||||||
|
*
|
||||||
|
* Helper macro that creates a static proxy object to call singleton function
|
||||||
|
* on it's construction, ensuring that the singleton gets initialized at
|
||||||
|
* startup.
|
||||||
|
*/
|
||||||
|
# define OSG_INIT_SINGLETON_PROXY(ProxyName, Func)\
|
||||||
|
static struct ProxyName{ ProxyName() { Func; } } s_##ProxyName;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OSG_INIT_SINGLETON_PROXY(
|
||||||
|
PreOrderBinProxy,
|
||||||
|
(osgUtil::RenderBin::addRenderBinPrototype("PreOrderBin", new PreOrderBin))
|
||||||
|
);
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ODGauge::ODGauge():
|
||||||
|
_size_x( -1 ),
|
||||||
|
_size_y( -1 ),
|
||||||
|
_view_width( -1 ),
|
||||||
|
_view_height( -1 ),
|
||||||
|
_flags(0),
|
||||||
|
_coverage_samples( 0 ),
|
||||||
|
_color_samples( 0 )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
ODGauge::~ODGauge()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::setSize(int size_x, int size_y)
|
||||||
|
{
|
||||||
|
_size_x = size_x;
|
||||||
|
_size_y = size_y < 0 ? size_x : size_y;
|
||||||
|
|
||||||
|
if( serviceable() )
|
||||||
|
reinit();
|
||||||
|
else if( texture )
|
||||||
|
texture->setTextureSize(_size_x, _size_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::setViewSize(int width, int height)
|
||||||
|
{
|
||||||
|
_view_width = width;
|
||||||
|
_view_height = height < 0 ? width : height;
|
||||||
|
|
||||||
|
if( camera )
|
||||||
|
updateCoordinateFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
osg::Vec2s ODGauge::getViewSize() const
|
||||||
|
{
|
||||||
|
return osg::Vec2s(_view_width, _view_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::useImageCoords(bool use)
|
||||||
|
{
|
||||||
|
if( updateFlag(USE_IMAGE_COORDS, use) && texture )
|
||||||
|
updateCoordinateFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::useStencil(bool use)
|
||||||
|
{
|
||||||
|
if( updateFlag(USE_STENCIL, use) && texture )
|
||||||
|
updateStencil();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::useAdditiveBlend(bool use)
|
||||||
|
{
|
||||||
|
if( updateFlag(USE_ADDITIVE_BLEND, use) && camera )
|
||||||
|
updateBlendMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::setSampling( bool mipmapping,
|
||||||
|
int coverage_samples,
|
||||||
|
int color_samples )
|
||||||
|
{
|
||||||
|
if( !updateFlag(USE_MIPMAPPING, mipmapping)
|
||||||
|
&& _coverage_samples == coverage_samples
|
||||||
|
&& _color_samples == color_samples )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( color_samples > coverage_samples )
|
||||||
|
{
|
||||||
|
SG_LOG
|
||||||
|
(
|
||||||
|
SG_GL,
|
||||||
|
SG_WARN,
|
||||||
|
"ODGauge::setSampling: color_samples > coverage_samples not allowed!"
|
||||||
|
);
|
||||||
|
color_samples = coverage_samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
_coverage_samples = coverage_samples;
|
||||||
|
_color_samples = color_samples;
|
||||||
|
|
||||||
|
updateSampling();
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::setRender(bool render)
|
||||||
|
{
|
||||||
|
// Only the far camera should trigger this texture to be rendered.
|
||||||
|
camera->setNodeMask(render ? simgear::BACKGROUND_BIT : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool ODGauge::serviceable() const
|
||||||
|
{
|
||||||
|
return _flags & AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::allocRT(osg::NodeCallback* camera_cull_callback)
|
||||||
|
{
|
||||||
|
camera = new osg::Camera;
|
||||||
|
camera->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
|
||||||
|
camera->setRenderOrder(osg::Camera::PRE_RENDER);
|
||||||
|
camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f , 0.0f));
|
||||||
|
camera->setClearStencil(0);
|
||||||
|
camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT,
|
||||||
|
osg::Camera::FRAME_BUFFER );
|
||||||
|
|
||||||
|
if( camera_cull_callback )
|
||||||
|
camera->setCullCallback(camera_cull_callback);
|
||||||
|
|
||||||
|
setRender(true);
|
||||||
|
updateCoordinateFrame();
|
||||||
|
updateStencil();
|
||||||
|
|
||||||
|
osg::StateSet* stateSet = camera->getOrCreateStateSet();
|
||||||
|
stateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
stateSet->setMode(GL_CULL_FACE, osg::StateAttribute::OFF);
|
||||||
|
stateSet->setMode(GL_FOG, osg::StateAttribute::OFF);
|
||||||
|
stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||||
|
stateSet->setAttributeAndModes(
|
||||||
|
new osg::PolygonMode( osg::PolygonMode::FRONT_AND_BACK,
|
||||||
|
osg::PolygonMode::FILL ),
|
||||||
|
osg::StateAttribute::ON );
|
||||||
|
stateSet->setAttributeAndModes(
|
||||||
|
new osg::AlphaFunc(osg::AlphaFunc::GREATER, 0.001f),
|
||||||
|
osg::StateAttribute::ON );
|
||||||
|
stateSet->setAttribute(new osg::ShadeModel(osg::ShadeModel::FLAT));
|
||||||
|
|
||||||
|
if( !texture )
|
||||||
|
{
|
||||||
|
texture = new osg::Texture2D;
|
||||||
|
texture->setResizeNonPowerOfTwoHint(false);
|
||||||
|
texture->setTextureSize(_size_x, _size_y);
|
||||||
|
texture->setInternalFormat(GL_RGBA);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSampling();
|
||||||
|
updateBlendMode();
|
||||||
|
|
||||||
|
if( Canvas::getSystemAdapter() )
|
||||||
|
Canvas::getSystemAdapter()->addCamera(camera.get());
|
||||||
|
|
||||||
|
_flags |= AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::reinit()
|
||||||
|
{
|
||||||
|
osg::NodeCallback* cull_callback = camera ? camera->getCullCallback() : 0;
|
||||||
|
clear();
|
||||||
|
allocRT(cull_callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::clear()
|
||||||
|
{
|
||||||
|
if( camera.valid() && Canvas::getSystemAdapter() )
|
||||||
|
Canvas::getSystemAdapter()->removeCamera(camera.get());
|
||||||
|
camera.release();
|
||||||
|
texture.release();
|
||||||
|
|
||||||
|
_flags &= ~AVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
bool ODGauge::updateFlag(Flags flag, bool enable)
|
||||||
|
{
|
||||||
|
if( bool(_flags & flag) == enable )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_flags ^= flag;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::updateCoordinateFrame()
|
||||||
|
{
|
||||||
|
assert( camera );
|
||||||
|
|
||||||
|
if( _view_width < 0 )
|
||||||
|
_view_width = _size_x;
|
||||||
|
if( _view_height < 0 )
|
||||||
|
_view_height = _size_y;
|
||||||
|
|
||||||
|
camera->setViewport(0, 0, _size_x, _size_y);
|
||||||
|
|
||||||
|
if( _flags & USE_IMAGE_COORDS )
|
||||||
|
camera->setProjectionMatrix(
|
||||||
|
osg::Matrix::ortho2D(0, _view_width, _view_height, 0)
|
||||||
|
);
|
||||||
|
else
|
||||||
|
camera->setProjectionMatrix(
|
||||||
|
osg::Matrix::ortho2D( -_view_width/2., _view_width/2.,
|
||||||
|
-_view_height/2., _view_height/2. )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::updateStencil()
|
||||||
|
{
|
||||||
|
assert( camera );
|
||||||
|
|
||||||
|
GLbitfield mask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
|
||||||
|
|
||||||
|
if( _flags & USE_STENCIL )
|
||||||
|
{
|
||||||
|
camera->attach( osg::Camera::PACKED_DEPTH_STENCIL_BUFFER,
|
||||||
|
GL_DEPTH_STENCIL_EXT );
|
||||||
|
mask |= GL_STENCIL_BUFFER_BIT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
camera->detach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
camera->setClearMask(mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::updateSampling()
|
||||||
|
{
|
||||||
|
assert( camera );
|
||||||
|
assert( texture );
|
||||||
|
|
||||||
|
texture->setFilter(
|
||||||
|
osg::Texture2D::MIN_FILTER,
|
||||||
|
(_flags & USE_MIPMAPPING) ? osg::Texture2D::LINEAR_MIPMAP_LINEAR
|
||||||
|
: osg::Texture2D::LINEAR
|
||||||
|
);
|
||||||
|
camera->attach(
|
||||||
|
osg::Camera::COLOR_BUFFER,
|
||||||
|
texture.get(),
|
||||||
|
0, 0,
|
||||||
|
_flags & USE_MIPMAPPING,
|
||||||
|
_coverage_samples,
|
||||||
|
_color_samples
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ODGauge::updateBlendMode()
|
||||||
|
{
|
||||||
|
assert( camera );
|
||||||
|
|
||||||
|
camera->getOrCreateStateSet()
|
||||||
|
->setAttributeAndModes
|
||||||
|
(
|
||||||
|
(_flags & USE_ADDITIVE_BLEND)
|
||||||
|
? new osg::BlendFunc( osg::BlendFunc::SRC_ALPHA,
|
||||||
|
osg::BlendFunc::ONE_MINUS_SRC_ALPHA,
|
||||||
|
osg::BlendFunc::ONE,
|
||||||
|
osg::BlendFunc::ONE )
|
||||||
|
: new osg::BlendFunc( osg::BlendFunc::SRC_ALPHA,
|
||||||
|
osg::BlendFunc::ONE_MINUS_SRC_ALPHA )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
// Owner Drawn Gauge helper class
|
||||||
|
//
|
||||||
|
// Written by Harald JOHNSEN, started May 2005.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net
|
||||||
|
//
|
||||||
|
// Ported to OSG by Tim Moore - Jun 2007
|
||||||
|
//
|
||||||
|
// Heavily modified to be usable for the 2d Canvas by Thomas Geymayer - April 2012
|
||||||
|
// Supports now multisampling/mipmapping, usage of the stencil buffer and placing
|
||||||
|
// the texture in the scene by certain filter criteria
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Library General Public
|
||||||
|
// License along with this library; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
|
||||||
|
#ifndef _SG_OD_GAUGE_HXX
|
||||||
|
#define _SG_OD_GAUGE_HXX
|
||||||
|
|
||||||
|
#include "canvas_fwd.hxx"
|
||||||
|
|
||||||
|
#include <osg/NodeCallback>
|
||||||
|
#include <osg/Group>
|
||||||
|
|
||||||
|
namespace osg
|
||||||
|
{
|
||||||
|
class Camera;
|
||||||
|
class Texture2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace canvas
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Owner Drawn Gauge (aka render-to-texture) helper class
|
||||||
|
*/
|
||||||
|
class ODGauge
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ODGauge();
|
||||||
|
virtual ~ODGauge();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the size of the render target.
|
||||||
|
*
|
||||||
|
* @param size_x X size
|
||||||
|
* @param size_y Y size. Defaults to size_x if not specified
|
||||||
|
*/
|
||||||
|
void setSize(int size_x, int size_y = -1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the size of the viewport
|
||||||
|
*
|
||||||
|
* @param width
|
||||||
|
* @param height Defaults to width if not specified
|
||||||
|
*/
|
||||||
|
void setViewSize(int width, int height = -1);
|
||||||
|
|
||||||
|
osg::Vec2s getViewSize() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED
|
||||||
|
*
|
||||||
|
* Get size of squared texture
|
||||||
|
*/
|
||||||
|
int size() const { return _size_x; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether to use image coordinates or not.
|
||||||
|
*
|
||||||
|
* Default: origin == center of texture
|
||||||
|
* Image Coords: origin == top left corner
|
||||||
|
*/
|
||||||
|
void useImageCoords(bool use = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable using a stencil buffer
|
||||||
|
*/
|
||||||
|
void useStencil(bool use = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable additive alpha blending (Can improve results with
|
||||||
|
* transparent background)
|
||||||
|
*/
|
||||||
|
void useAdditiveBlend(bool use = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set sampling parameters for mipmapping and coverage sampling
|
||||||
|
* antialiasing.
|
||||||
|
*
|
||||||
|
* @note color_samples is not allowed to be higher than coverage_samples
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void setSampling( bool mipmapping,
|
||||||
|
int coverage_samples = 0,
|
||||||
|
int color_samples = 0 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable/Disable updating the texture (If disabled the contents of the
|
||||||
|
* texture remains with the outcome of the last rendering pass)
|
||||||
|
*/
|
||||||
|
void setRender(bool render);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Say if we can render to a texture.
|
||||||
|
* @return true if rtt is available
|
||||||
|
*/
|
||||||
|
bool serviceable() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the OSG camera for drawing this gauge.
|
||||||
|
*/
|
||||||
|
osg::Camera* getCamera() const { return camera.get(); }
|
||||||
|
|
||||||
|
osg::Texture2D* getTexture() const { return texture.get(); }
|
||||||
|
|
||||||
|
// Real initialization function. Bad name.
|
||||||
|
void allocRT(osg::NodeCallback* camera_cull_callback = 0);
|
||||||
|
void reinit();
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
int _size_x,
|
||||||
|
_size_y,
|
||||||
|
_view_width,
|
||||||
|
_view_height;
|
||||||
|
|
||||||
|
enum Flags
|
||||||
|
{
|
||||||
|
AVAILABLE = 1,
|
||||||
|
USE_IMAGE_COORDS = AVAILABLE << 1,
|
||||||
|
USE_STENCIL = USE_IMAGE_COORDS << 1,
|
||||||
|
USE_MIPMAPPING = USE_STENCIL << 1,
|
||||||
|
USE_ADDITIVE_BLEND = USE_MIPMAPPING << 1
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32_t _flags;
|
||||||
|
|
||||||
|
// Multisampling parameters
|
||||||
|
int _coverage_samples,
|
||||||
|
_color_samples;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Camera> camera;
|
||||||
|
osg::ref_ptr<osg::Texture2D> texture;
|
||||||
|
|
||||||
|
bool updateFlag(Flags flag, bool enable);
|
||||||
|
|
||||||
|
void updateCoordinateFrame();
|
||||||
|
void updateStencil();
|
||||||
|
void updateSampling();
|
||||||
|
void updateBlendMode();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace canvas
|
||||||
|
} // namespace simgear
|
||||||
|
|
||||||
|
#endif // _SG_OD_GAUGE_HXX
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
===============================================================================
|
||||||
|
ShivaVG - an open-source LGPL ANSI C implementation of the OpenVG specification
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
Lead developer:
|
||||||
|
|
||||||
|
Ivan Leben <ivan.leben@gmail.com>
|
||||||
|
|
||||||
|
Occasional patches:
|
||||||
|
|
||||||
|
Daniel Turing
|
||||||
|
Vincenzo Pupillo
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user