Compare commits
1014 Commits
OpenSceneG
...
OpenSceneG
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4013a68da | ||
|
|
2ad1e661e0 | ||
|
|
c1d5b6992c | ||
|
|
b92c3f1455 | ||
|
|
9975e15a97 | ||
|
|
5b242d22ff | ||
|
|
814a885a6c | ||
|
|
471b256d30 | ||
|
|
8f73ddc27d | ||
|
|
0874f126c0 | ||
|
|
697128a11d | ||
|
|
96d247aa7e | ||
|
|
c0ac503123 | ||
|
|
b74924fab4 | ||
|
|
75217a2ed5 | ||
|
|
2bed348da1 | ||
|
|
af8b11a391 | ||
|
|
27f080159e | ||
|
|
e8722e76ea | ||
|
|
8b4ff0f50a | ||
|
|
559da06ffa | ||
|
|
5c40e9bf81 | ||
|
|
1186143571 | ||
|
|
732364d49b | ||
|
|
0153c3e7e2 | ||
|
|
5e8d5b50db | ||
|
|
e9b75e0ded | ||
|
|
803677e03c | ||
|
|
0f97a42e17 | ||
|
|
91fd245d7c | ||
|
|
eb90d9aa34 | ||
|
|
8e9f688809 | ||
|
|
6c1c179c62 | ||
|
|
cfe3e621ad | ||
|
|
761cf52bb7 | ||
|
|
42efcf24fb | ||
|
|
0a56f65077 | ||
|
|
3339395071 | ||
|
|
34e53a37e0 | ||
|
|
482fd41d58 | ||
|
|
2eef9d233b | ||
|
|
4a886c6e22 | ||
|
|
717d566713 | ||
|
|
1d0a265cd4 | ||
|
|
3d69d46e3e | ||
|
|
8e20224828 | ||
|
|
6e65a9955e | ||
|
|
2264c3b7e2 | ||
|
|
8c991c056f | ||
|
|
34ab8bc048 | ||
|
|
d73e979ea8 | ||
|
|
6273495c64 | ||
|
|
8f26396e78 | ||
|
|
78bf1e8ea4 | ||
|
|
83a03f3346 | ||
|
|
4626f6fb6a | ||
|
|
9e581f91db | ||
|
|
887768b55a | ||
|
|
5b1cfd26ab | ||
|
|
f48a4baa4e | ||
|
|
49c802153d | ||
|
|
13e79d3210 | ||
|
|
236617b6c5 | ||
|
|
a0229ee684 | ||
|
|
5ebfa0a71e | ||
|
|
5acad4e07e | ||
|
|
ccae59e98a | ||
|
|
222871aade | ||
|
|
d221133728 | ||
|
|
2eff96d1a4 | ||
|
|
0394ba5453 | ||
|
|
1db8a4e818 | ||
|
|
a39578826c | ||
|
|
98ebacdcbb | ||
|
|
04f4b542bd | ||
|
|
f0ac1a16f9 | ||
|
|
08893c7fcc | ||
|
|
17dfbe99fc | ||
|
|
74ddaeaf50 | ||
|
|
2f7193ee4c | ||
|
|
b4cd40cf7c | ||
|
|
5cd478e4bb | ||
|
|
d3baf9d311 | ||
|
|
fe09ebfbdb | ||
|
|
b5a3a58076 | ||
|
|
3bcfad833c | ||
|
|
6f00eb2548 | ||
|
|
4ec0e76c0b | ||
|
|
1e0d682979 | ||
|
|
824cc95518 | ||
|
|
08d2d322d9 | ||
|
|
75891924bb | ||
|
|
82c188c24a | ||
|
|
1e78098967 | ||
|
|
fc9848ff19 | ||
|
|
8aee04c780 | ||
|
|
e69405f99a | ||
|
|
e76c91ed78 | ||
|
|
d2e0081690 | ||
|
|
11a55ea6de | ||
|
|
bd9bd3f8b2 | ||
|
|
7e05d2fd54 | ||
|
|
37d051af5e | ||
|
|
03565e3bbe | ||
|
|
4073910ce8 | ||
|
|
ceabbdb8d9 | ||
|
|
f7f1487fca | ||
|
|
1f0ba7aa4f | ||
|
|
32b60cd2d7 | ||
|
|
ff42ff2a11 | ||
|
|
23cd6d2ba3 | ||
|
|
95f911e98c | ||
|
|
fd46645ade | ||
|
|
fd806293be | ||
|
|
9222506a2c | ||
|
|
e7244e654a | ||
|
|
da73723949 | ||
|
|
e3f0876e87 | ||
|
|
80791c6972 | ||
|
|
ba9dfb2ff6 | ||
|
|
d14a602a59 | ||
|
|
e0028bef6e | ||
|
|
120bf699b2 | ||
|
|
78a01ce2a5 | ||
|
|
44c406e167 | ||
|
|
f72b62a065 | ||
|
|
4f423ff66b | ||
|
|
906bb27fa0 | ||
|
|
0f35f31d72 | ||
|
|
ddda9a6a0d | ||
|
|
01e87939a4 | ||
|
|
820166b49d | ||
|
|
05841d7c00 | ||
|
|
95a507299b | ||
|
|
d5b615a4e1 | ||
|
|
2e11113072 | ||
|
|
180ce288c3 | ||
|
|
89fd422c98 | ||
|
|
5380aebfc1 | ||
|
|
eb5791e5e2 | ||
|
|
8962838e6a | ||
|
|
e52b95e084 | ||
|
|
5be2e05b18 | ||
|
|
f66b430476 | ||
|
|
7d66324e5d | ||
|
|
2b1abf1937 | ||
|
|
5237185e8c | ||
|
|
6a4a21afe3 | ||
|
|
e08fd168f6 | ||
|
|
54b389a18a | ||
|
|
1020e22c33 | ||
|
|
14ef282297 | ||
|
|
ed7629351f | ||
|
|
f4196dfe64 | ||
|
|
3bc1102f11 | ||
|
|
a583b306c5 | ||
|
|
3a2380932f | ||
|
|
c61c3d5500 | ||
|
|
4a734b314c | ||
|
|
bf0425f628 | ||
|
|
eb893eba75 | ||
|
|
1909de938a | ||
|
|
3add98180c | ||
|
|
87122ca369 | ||
|
|
0a1db3d6fc | ||
|
|
166c49eedd | ||
|
|
a711fdba36 | ||
|
|
0335ea3760 | ||
|
|
16b19a0c30 | ||
|
|
595a048319 | ||
|
|
70b5297575 | ||
|
|
ab2fc1be76 | ||
|
|
abdb23e367 | ||
|
|
31488eeba1 | ||
|
|
6cff8650f2 | ||
|
|
814693ffc1 | ||
|
|
4c84742664 | ||
|
|
c753dbc3e6 | ||
|
|
40a7f903ec | ||
|
|
8fb08496ae | ||
|
|
950d7bb60b | ||
|
|
9aa8d641a0 | ||
|
|
de415fbcf9 | ||
|
|
5229280901 | ||
|
|
a7ba138dc7 | ||
|
|
99f7bfab3b | ||
|
|
296c12a8e9 | ||
|
|
307e70f13b | ||
|
|
06e6f368fc | ||
|
|
890aea9537 | ||
|
|
953828a817 | ||
|
|
6854d2968f | ||
|
|
63a3595aab | ||
|
|
d9f920ee37 | ||
|
|
31fd2456b6 | ||
|
|
bf86b031e0 | ||
|
|
535b168d81 | ||
|
|
c086bef5ed | ||
|
|
fb4a2d7128 | ||
|
|
b8cd439697 | ||
|
|
728d5ead52 | ||
|
|
6d47fe4d98 | ||
|
|
e6e39e7924 | ||
|
|
7165182e35 | ||
|
|
a88fa6f7b7 | ||
|
|
58717d9279 | ||
|
|
e2f208af54 | ||
|
|
dd2de7f132 | ||
|
|
d3e9c44440 | ||
|
|
3d144a0312 | ||
|
|
53859bb3de | ||
|
|
11f5039695 | ||
|
|
75b9cd3627 | ||
|
|
b6acb1a8d3 | ||
|
|
c30be2355b | ||
|
|
d97e01c520 | ||
|
|
2a84719f4a | ||
|
|
9e2c23c9d3 | ||
|
|
6a860e5e82 | ||
|
|
e5b533726e | ||
|
|
ed9502e017 | ||
|
|
efb90a6a80 | ||
|
|
8c8b8f3305 | ||
|
|
26d1679248 | ||
|
|
412a9154c3 | ||
|
|
66aef5dfc9 | ||
|
|
5346e7772a | ||
|
|
ec6edf535d | ||
|
|
4c4738eced | ||
|
|
925c37b783 | ||
|
|
58edd10d04 | ||
|
|
1d9e7f144b | ||
|
|
0a83632f0a | ||
|
|
321750d72d | ||
|
|
e3e1a55702 | ||
|
|
e9f497aa1f | ||
|
|
b59b0e0253 | ||
|
|
d03b38dea8 | ||
|
|
23b76599bd | ||
|
|
f93a4f330a | ||
|
|
6a30705870 | ||
|
|
9dffd49241 | ||
|
|
77f662f9f7 | ||
|
|
63acee9ee3 | ||
|
|
d1c93f6bad | ||
|
|
11ff450231 | ||
|
|
9362339242 | ||
|
|
32831b1ef8 | ||
|
|
5f1b41a84f | ||
|
|
1db6def2c4 | ||
|
|
47202acc24 | ||
|
|
30a62bc4ad | ||
|
|
47db2da8b4 | ||
|
|
7d50c8e634 | ||
|
|
e7d41377be | ||
|
|
213efd20ad | ||
|
|
bd3f390b2f | ||
|
|
594b3064c0 | ||
|
|
685a270c18 | ||
|
|
1320c923ca | ||
|
|
72c4f3a8ba | ||
|
|
afbf20eba9 | ||
|
|
5c023d1f76 | ||
|
|
e5d51da1b3 | ||
|
|
4cb5bce66a | ||
|
|
3e2305d815 | ||
|
|
8546e911fc | ||
|
|
441dbe6b02 | ||
|
|
53198f2e9b | ||
|
|
6bddbdf074 | ||
|
|
77b8962bcc | ||
|
|
a40260a5a5 | ||
|
|
66210a6aca | ||
|
|
9fa3defb0e | ||
|
|
4a9f4aae9d | ||
|
|
a676d5d37b | ||
|
|
06f186dc07 | ||
|
|
ea7dbabda1 | ||
|
|
b38c6258bf | ||
|
|
b90503fdf5 | ||
|
|
bb637e73f3 | ||
|
|
1debc21bb2 | ||
|
|
bbb54cedc7 | ||
|
|
a9804d7e19 | ||
|
|
045caf1086 | ||
|
|
4bcf4cf7bb | ||
|
|
22cf4c18c3 | ||
|
|
f5faf615ef | ||
|
|
51b19d2d8b | ||
|
|
e330e9309c | ||
|
|
4a668d53c5 | ||
|
|
d5f2c34f24 | ||
|
|
7fbeeefea8 | ||
|
|
3ab06c54bf | ||
|
|
51afa2c1df | ||
|
|
a0f1442aae | ||
|
|
98f5fca9c2 | ||
|
|
0a4efa35c3 | ||
|
|
3eca5765c9 | ||
|
|
249c0ff208 | ||
|
|
3e3d7e4dc1 | ||
|
|
ed57c8718c | ||
|
|
d409ffcb91 | ||
|
|
bf794165d5 | ||
|
|
134b2e506f | ||
|
|
8b384baca9 | ||
|
|
f9f480b935 | ||
|
|
4538a0fa41 | ||
|
|
f7b95ea4e5 | ||
|
|
b1852757b5 | ||
|
|
ace32ebe6c | ||
|
|
1b1c987356 | ||
|
|
78729e28fd | ||
|
|
50203023c7 | ||
|
|
a331680cec | ||
|
|
2870c12b03 | ||
|
|
18323ac899 | ||
|
|
c57e62e799 | ||
|
|
f984f6032f | ||
|
|
5a4f962013 | ||
|
|
dd650921b1 | ||
|
|
73221e8682 | ||
|
|
8e901ebbac | ||
|
|
4945e03bcb | ||
|
|
c6013c721e | ||
|
|
dfc02b78bf | ||
|
|
a03ec99005 | ||
|
|
8be71caeaf | ||
|
|
b163ff8562 | ||
|
|
4ce6b07886 | ||
|
|
2a46857353 | ||
|
|
e281c264a7 | ||
|
|
34177d3f63 | ||
|
|
6f9ac83693 | ||
|
|
075e874c85 | ||
|
|
af16041f57 | ||
|
|
adf9596316 | ||
|
|
69abe094ab | ||
|
|
4513709a1b | ||
|
|
e7ea085912 | ||
|
|
e4e22bb1af | ||
|
|
4dfe6ab048 | ||
|
|
6cd9932780 | ||
|
|
58c47e9842 | ||
|
|
117869d154 | ||
|
|
811dde86c8 | ||
|
|
49c48a5509 | ||
|
|
1b6e50a2dd | ||
|
|
92e2d849ed | ||
|
|
487c2b5f67 | ||
|
|
3c07921dee | ||
|
|
485709f708 | ||
|
|
09205544b7 | ||
|
|
7629a5126a | ||
|
|
22e51c9902 | ||
|
|
a6aa47afcd | ||
|
|
d166b6d1df | ||
|
|
d32cd203a2 | ||
|
|
43049ebcf1 | ||
|
|
d5fcdabfa1 | ||
|
|
e31f682451 | ||
|
|
3f1e77d479 | ||
|
|
ec4f898bce | ||
|
|
cceee38727 | ||
|
|
a8804e2366 | ||
|
|
35cfbfdb8c | ||
|
|
bc424bc54f | ||
|
|
9b03b3f8ce | ||
|
|
f634152de0 | ||
|
|
1ce8029f39 | ||
|
|
1bcb944ddc | ||
|
|
aa090f0f99 | ||
|
|
d83e641fad | ||
|
|
d02c0bdc49 | ||
|
|
69407f4054 | ||
|
|
1791ac08a8 | ||
|
|
6569f69de1 | ||
|
|
66da1328f8 | ||
|
|
f8d53b7c8d | ||
|
|
5efe60dcf5 | ||
|
|
457d41d385 | ||
|
|
a9cab19ddb | ||
|
|
0ce96fbe8b | ||
|
|
ff73445bf3 | ||
|
|
b7067ad988 | ||
|
|
e5f5c30e4d | ||
|
|
d7c6bb1c4b | ||
|
|
6d98c5460f | ||
|
|
1c9993dd5d | ||
|
|
114ddbb0c6 | ||
|
|
95b3622d1d | ||
|
|
4184696809 | ||
|
|
d76947845a | ||
|
|
2f0cc6fbc9 | ||
|
|
f802f6d0ed | ||
|
|
a165930b48 | ||
|
|
0be132c07c | ||
|
|
d6ed4c4d6d | ||
|
|
8fe82b463f | ||
|
|
dd186fe6a1 | ||
|
|
dfb0b2ab8e | ||
|
|
d9f93f9d1a | ||
|
|
eaa170809f | ||
|
|
4c5a1885d2 | ||
|
|
f06ea2bc6e | ||
|
|
79a4fff2dc | ||
|
|
53e337611a | ||
|
|
86ddca4edb | ||
|
|
2a8d894168 | ||
|
|
fce7137525 | ||
|
|
671d8dc342 | ||
|
|
a97f104ab6 | ||
|
|
e51fd3d4fa | ||
|
|
b37d6b1921 | ||
|
|
e67466a74f | ||
|
|
f49d7ae110 | ||
|
|
c71016bd3c | ||
|
|
b9a529148a | ||
|
|
2986df22d6 | ||
|
|
5da4e80e95 | ||
|
|
f8c4ad4b90 | ||
|
|
834c940db1 | ||
|
|
600e98773e | ||
|
|
2da766ff1b | ||
|
|
1e75ca63f4 | ||
|
|
cf7258e03a | ||
|
|
b4354df6fb | ||
|
|
7ae45b7ac2 | ||
|
|
f3859f6d11 | ||
|
|
f0882eda6b | ||
|
|
aa17d70853 | ||
|
|
f3eb245e98 | ||
|
|
a08b3104a8 | ||
|
|
43bdd32242 | ||
|
|
3dd9f8d430 | ||
|
|
34863fe2d2 | ||
|
|
5f45a39f28 | ||
|
|
5ab861cd04 | ||
|
|
f40df07ec7 | ||
|
|
ab47842d6d | ||
|
|
6661deeb24 | ||
|
|
bff5b0261b | ||
|
|
25cfb81a09 | ||
|
|
ed28ec97c7 | ||
|
|
0e9c93f335 | ||
|
|
14620aa1dd | ||
|
|
a84df15c0a | ||
|
|
7f592b7ad5 | ||
|
|
9cda04e51f | ||
|
|
7a33cc00cd | ||
|
|
1a265f53f7 | ||
|
|
5177298dad | ||
|
|
de0664ef77 | ||
|
|
aa962724e8 | ||
|
|
28a676e105 | ||
|
|
997ee30039 | ||
|
|
174c161daa | ||
|
|
4c1fd06252 | ||
|
|
fec06828cf | ||
|
|
68c4eaaff1 | ||
|
|
acbad2424e | ||
|
|
f3ba656303 | ||
|
|
e35b0796d6 | ||
|
|
e97059df78 | ||
|
|
e3a3ae6de6 | ||
|
|
fafe06acbf | ||
|
|
6b82d4099f | ||
|
|
57a42aac39 | ||
|
|
e93e7ca1f2 | ||
|
|
0db0bcdd5e | ||
|
|
23b8131ae5 | ||
|
|
9e9fe9b9c9 | ||
|
|
21fc2fae8d | ||
|
|
4f6dbf5623 | ||
|
|
1e9722601c | ||
|
|
959d78f755 | ||
|
|
30f4568f7b | ||
|
|
90c787a56a | ||
|
|
5633fa1247 | ||
|
|
baf139c75b | ||
|
|
d97081fe7f | ||
|
|
2f10db8f11 | ||
|
|
77c0f5f675 | ||
|
|
f6cc4440a1 | ||
|
|
d1bf811331 | ||
|
|
6126379362 | ||
|
|
beeda386ef | ||
|
|
d4260ddb18 | ||
|
|
a53e73ba10 | ||
|
|
e3c445a52f | ||
|
|
7e4b41e41a | ||
|
|
2032be209a | ||
|
|
818e1393ec | ||
|
|
f28d460caa | ||
|
|
5f74fdc326 | ||
|
|
f0125da6fd | ||
|
|
af5685bf28 | ||
|
|
89786dd42a | ||
|
|
973ac76197 | ||
|
|
99cbab1806 | ||
|
|
fdd9efe45a | ||
|
|
0335e9c63a | ||
|
|
ff78d30cee | ||
|
|
e979f76156 | ||
|
|
899e359cdb | ||
|
|
cbfcac6f63 | ||
|
|
0bdd7351f6 | ||
|
|
46440ad0a8 | ||
|
|
a3794f3bd3 | ||
|
|
90e58f66c0 | ||
|
|
839dbb1bc1 | ||
|
|
e65d03bf27 | ||
|
|
23ae292fe2 | ||
|
|
cbd2d6e434 | ||
|
|
3a7942dfb7 | ||
|
|
aa2c9c152f | ||
|
|
900534f86e | ||
|
|
5130361d65 | ||
|
|
7dc3b34bfd | ||
|
|
3b23b474dc | ||
|
|
d3945d5210 | ||
|
|
6bb2251faf | ||
|
|
8f39d7a2b2 | ||
|
|
20560bd927 | ||
|
|
93938439d9 | ||
|
|
0f611144d7 | ||
|
|
acb497b2ab | ||
|
|
50e63ad3ee | ||
|
|
5a7a20d01e | ||
|
|
f2d11bb46e | ||
|
|
70f9bdc6e1 | ||
|
|
d981ca416e | ||
|
|
3f637584f5 | ||
|
|
7a18876c5b | ||
|
|
3c6a1ec117 | ||
|
|
c4f199d1b5 | ||
|
|
b8dbebeca7 | ||
|
|
7bacd73e85 | ||
|
|
d4c4bee020 | ||
|
|
48c9816c38 | ||
|
|
43a068b156 | ||
|
|
45bea0db4b | ||
|
|
bb8b1538c7 | ||
|
|
147c5e183f | ||
|
|
9d5a510441 | ||
|
|
5fb078b4f1 | ||
|
|
1581699022 | ||
|
|
4c18eb62ca | ||
|
|
7a14b224ed | ||
|
|
555c935ffd | ||
|
|
1d4fbbce1f | ||
|
|
e9728042b9 | ||
|
|
23ae2acf73 | ||
|
|
f42ac7e15b | ||
|
|
32e0e21013 | ||
|
|
8d6bee6da9 | ||
|
|
d994e84288 | ||
|
|
92d684de6b | ||
|
|
a21ce3469b | ||
|
|
67f98edc05 | ||
|
|
93cf84da3e | ||
|
|
febcb25cb6 | ||
|
|
138ea0e0c7 | ||
|
|
ed314c6d7d | ||
|
|
d82131544b | ||
|
|
d939adeb56 | ||
|
|
2428e07f35 | ||
|
|
86ddbc7ad9 | ||
|
|
aac0a5fbe2 | ||
|
|
a2db511c99 | ||
|
|
1674692840 | ||
|
|
5c488d4c46 | ||
|
|
4e530a1938 | ||
|
|
d22f62396c | ||
|
|
71f7a74091 | ||
|
|
81c23564b5 | ||
|
|
82a34a2546 | ||
|
|
bd82d2a52d | ||
|
|
7295258d71 | ||
|
|
4ec4e88f85 | ||
|
|
c6ab14018a | ||
|
|
8d06b9b019 | ||
|
|
9195a0000b | ||
|
|
3a18699074 | ||
|
|
d9a6491a43 | ||
|
|
be13c2202d | ||
|
|
410f7d27ed | ||
|
|
63d101b653 | ||
|
|
584035b663 | ||
|
|
86a9a45525 | ||
|
|
89ca694684 | ||
|
|
d234262585 | ||
|
|
a316c30b4a | ||
|
|
1c699a3664 | ||
|
|
d7b99b9062 | ||
|
|
977ec20751 | ||
|
|
35d6cb812f | ||
|
|
6ea4f4a939 | ||
|
|
333a16a88d | ||
|
|
3dde165f14 | ||
|
|
2d41cbd0cf | ||
|
|
e1ec4ec67f | ||
|
|
199506296a | ||
|
|
189c0b3477 | ||
|
|
a45ba05bdd | ||
|
|
26a7c30229 | ||
|
|
1fcb91900a | ||
|
|
6af9edf33b | ||
|
|
faced0a896 | ||
|
|
5d635287c0 | ||
|
|
b04a4813ba | ||
|
|
5d234ba021 | ||
|
|
71352ea56d | ||
|
|
f50ec0fe8e | ||
|
|
cca18e82e8 | ||
|
|
55c2041d4d | ||
|
|
bda5ec4875 | ||
|
|
0b5b3213fe | ||
|
|
d8adc80c2c | ||
|
|
20fd80de3a | ||
|
|
28c36d615b | ||
|
|
9859f3110b | ||
|
|
30b54e3af2 | ||
|
|
e70acf4c51 | ||
|
|
8346f0ebe1 | ||
|
|
d917987938 | ||
|
|
e4004118db | ||
|
|
4ce2e075c4 | ||
|
|
1b34fed500 | ||
|
|
87fd1d38fb | ||
|
|
3e00764649 | ||
|
|
03fc0c3662 | ||
|
|
5b60708e80 | ||
|
|
d8a06f827e | ||
|
|
85386daa25 | ||
|
|
4f199e36c9 | ||
|
|
20b9f3ff88 | ||
|
|
afcf54b108 | ||
|
|
74f91037a7 | ||
|
|
ff21af2b0d | ||
|
|
4174d72a52 | ||
|
|
12a737ae02 | ||
|
|
b2c7bacfe9 | ||
|
|
ead92353fe | ||
|
|
490b351330 | ||
|
|
754a163cbf | ||
|
|
eae4d51e3f | ||
|
|
cf66750d7b | ||
|
|
1f33e2a2a0 | ||
|
|
35d73ea41c | ||
|
|
298f1c65b6 | ||
|
|
e16eb147a1 | ||
|
|
a04232a75a | ||
|
|
b6404d18c3 | ||
|
|
fa6f5219bf | ||
|
|
ecd26f9f5b | ||
|
|
2bb4e0566c | ||
|
|
4dd3e3562f | ||
|
|
f5261b9877 | ||
|
|
4994b806d2 | ||
|
|
6a0270279c | ||
|
|
3ec6938b95 | ||
|
|
7b4d7cd221 | ||
|
|
77f1c58345 | ||
|
|
bc5575f83a | ||
|
|
6f2d003bc5 | ||
|
|
ec658b115c | ||
|
|
a43cc12394 | ||
|
|
ef76994c05 | ||
|
|
a1342a6bf6 | ||
|
|
5597248895 | ||
|
|
560587c88f | ||
|
|
5015fb6dac | ||
|
|
c168887e5e | ||
|
|
db6df6fefd | ||
|
|
ef5be684ed | ||
|
|
51671348f7 | ||
|
|
a4a5957e2f | ||
|
|
25ddbf8f1f | ||
|
|
f2b746520b | ||
|
|
ca4d93652d | ||
|
|
efc493cfa0 | ||
|
|
391ab02573 | ||
|
|
64979a0c1a | ||
|
|
20c0292e97 | ||
|
|
88aa9ac5de | ||
|
|
ac380e03c4 | ||
|
|
67b4d5412b | ||
|
|
d773d358c4 | ||
|
|
e5fe59799d | ||
|
|
27b71e3927 | ||
|
|
2f8b0f7a70 | ||
|
|
d7944b6ca9 | ||
|
|
ed724a730e | ||
|
|
d703a2df44 | ||
|
|
7f206fbf80 | ||
|
|
ea865d0ff9 | ||
|
|
75982f3379 | ||
|
|
8f30a262f4 | ||
|
|
ee266255eb | ||
|
|
9b299dc4b9 | ||
|
|
9319350176 | ||
|
|
076adcbd82 | ||
|
|
218e36b12b | ||
|
|
c6e72ee00b | ||
|
|
2b67196418 | ||
|
|
de09adcaa9 | ||
|
|
46381cb15c | ||
|
|
9394215d31 | ||
|
|
69e9f2c973 | ||
|
|
4ef5d9eb5f | ||
|
|
6d68718fba | ||
|
|
cb805d7be5 | ||
|
|
42705bff3f | ||
|
|
743a6b049c | ||
|
|
8bbbea1274 | ||
|
|
2797e8cb7c | ||
|
|
e3a003a08f | ||
|
|
a9f8af3fb6 | ||
|
|
e21865ee33 | ||
|
|
31e98b51df | ||
|
|
3dcca431a9 | ||
|
|
1319c2d281 | ||
|
|
8eae4b0381 | ||
|
|
8ad0ab1f6b | ||
|
|
6f5e5c23df | ||
|
|
4016aed62d | ||
|
|
958a7d0ab0 | ||
|
|
99eb81e743 | ||
|
|
ca3737e002 | ||
|
|
2b8be97297 | ||
|
|
1909093cac | ||
|
|
c599189d7d | ||
|
|
6bf6d5eeb2 | ||
|
|
488e1692cc | ||
|
|
f44369777f | ||
|
|
306a4f2d2d | ||
|
|
5f8e2bda2f | ||
|
|
661f0e69ef | ||
|
|
d63c6f6978 | ||
|
|
fba7a65fb4 | ||
|
|
4814a5341e | ||
|
|
f7e6f0092c | ||
|
|
4f19237467 | ||
|
|
5292c7ca50 | ||
|
|
70bfad0371 | ||
|
|
fcc34a8b45 | ||
|
|
1ec3ec1247 | ||
|
|
1270236715 | ||
|
|
8a334e724b | ||
|
|
8ae57c2797 | ||
|
|
eb56080277 | ||
|
|
91b7104a92 | ||
|
|
15f44c8736 | ||
|
|
f0df819cbf | ||
|
|
29ab577bc3 | ||
|
|
4886a8941d | ||
|
|
d8482ef1ba | ||
|
|
a96ad565c7 | ||
|
|
09c09628ac | ||
|
|
15882aae5f | ||
|
|
8876394c7c | ||
|
|
fd85542d8f | ||
|
|
ea429d5d46 | ||
|
|
7f9f7dd216 | ||
|
|
405cb0d828 | ||
|
|
4fef6a3c2f | ||
|
|
7fe3244c71 | ||
|
|
c63bebd8c3 | ||
|
|
1678dc3562 | ||
|
|
e48d6812fa | ||
|
|
504b42aa61 | ||
|
|
779bd20fd5 | ||
|
|
752d40b118 | ||
|
|
b41e5ccc77 | ||
|
|
8a0e49d780 | ||
|
|
54a3f76a2b | ||
|
|
5cb305041d | ||
|
|
15399bbf35 | ||
|
|
6246cd5d85 | ||
|
|
0d4a448c34 | ||
|
|
8efe470d07 | ||
|
|
e968caae80 | ||
|
|
e04e03d695 | ||
|
|
354d79acd1 | ||
|
|
235a52405d | ||
|
|
706afaccae | ||
|
|
e8cd06c6e9 | ||
|
|
1264ec736a | ||
|
|
a30ec25067 | ||
|
|
110fbf89b0 | ||
|
|
2efd52dda2 | ||
|
|
889e4749ef | ||
|
|
84d301715e | ||
|
|
32d7a48712 | ||
|
|
db82bb4ab1 | ||
|
|
4a76063b03 | ||
|
|
716cfbffa4 | ||
|
|
0f2502c72d | ||
|
|
0bb62a8162 | ||
|
|
d48091d37e | ||
|
|
7bc373a056 | ||
|
|
0ee9f732b8 | ||
|
|
3531bec43c | ||
|
|
cc99a40b16 | ||
|
|
8ae971bdaa | ||
|
|
fa7f25d75d | ||
|
|
6490f1b6a5 | ||
|
|
534d21dffd | ||
|
|
bfdcf4d8d1 | ||
|
|
afab78ed40 | ||
|
|
865a47bd6b | ||
|
|
a72508bc71 | ||
|
|
e4810990f0 | ||
|
|
3e171414bd | ||
|
|
f16f278fea | ||
|
|
02120e188e | ||
|
|
a8dc460085 | ||
|
|
591c5bae42 | ||
|
|
666aa81185 | ||
|
|
723ecfad8d | ||
|
|
5571c361dc | ||
|
|
939aa38a2a | ||
|
|
a5c0127a6e | ||
|
|
2501f32e9a | ||
|
|
e3bf55a266 | ||
|
|
ff4a0ce1e2 | ||
|
|
bc95ea97fb | ||
|
|
499adba97f | ||
|
|
3858acf70f | ||
|
|
ed4deeb0fb | ||
|
|
1b3290221c | ||
|
|
477951b924 | ||
|
|
4fcf8d3e86 | ||
|
|
f02ed3c629 | ||
|
|
91033a3a1f | ||
|
|
d3a7115c45 | ||
|
|
5bea13c172 | ||
|
|
1b269a7711 | ||
|
|
9a9efb1c58 | ||
|
|
a5d78953d4 | ||
|
|
1e2bead9bc | ||
|
|
a54b999ccc | ||
|
|
dbf88cc209 | ||
|
|
d8c1c4bbeb | ||
|
|
e0d3ab4412 | ||
|
|
d7442e7456 | ||
|
|
80c45ad46a | ||
|
|
c194e92df8 | ||
|
|
835d9455a9 | ||
|
|
eede49d15c | ||
|
|
829cd9718a | ||
|
|
1a90789402 | ||
|
|
25b8b8bd16 | ||
|
|
70c78264dc | ||
|
|
7a2900e238 | ||
|
|
fef39b6215 | ||
|
|
2ebe81cb0e | ||
|
|
6f6c44446c | ||
|
|
ef3a65b93f | ||
|
|
2b3665f010 | ||
|
|
ffb0a8e545 | ||
|
|
a10e9c6950 | ||
|
|
ff8fe4143e | ||
|
|
ac383e15c1 | ||
|
|
4a660f6266 | ||
|
|
2025c511f0 | ||
|
|
191eabd3ab | ||
|
|
2a9ed125b8 | ||
|
|
b3603f76e4 | ||
|
|
95e8d2838c | ||
|
|
1861e025e9 | ||
|
|
ded27b4971 | ||
|
|
37fa2d698f | ||
|
|
234adf7daf | ||
|
|
f548bc79d4 | ||
|
|
c45f3aa4fb | ||
|
|
b7b7186cf8 | ||
|
|
3dba54c10a | ||
|
|
1196f153fc | ||
|
|
c34a8e4ddb | ||
|
|
5ed399ca48 | ||
|
|
4493d11ca3 | ||
|
|
074eb8e41c | ||
|
|
a68f0f26a8 | ||
|
|
9146ba7d44 | ||
|
|
5bfb2ef26d | ||
|
|
bddeecdbee | ||
|
|
49625a1baf | ||
|
|
a97e092619 | ||
|
|
7de6a0c9e2 | ||
|
|
eb7c2ae3f7 | ||
|
|
cd86995d7d | ||
|
|
08ec0a11bf | ||
|
|
0dc55ebc86 | ||
|
|
4e4d2b35cf | ||
|
|
9c53794bc7 | ||
|
|
e8b5272b02 | ||
|
|
20fbad6c29 | ||
|
|
da2d7e2dde | ||
|
|
d260b16981 | ||
|
|
79e2d1309f | ||
|
|
c77dc4fe9e | ||
|
|
b5b020a138 | ||
|
|
910cfeea60 | ||
|
|
83c396b13b | ||
|
|
69f2fb56b3 | ||
|
|
0ec35d5a5d | ||
|
|
0eb435e118 | ||
|
|
60d4b71d2b | ||
|
|
59caf4a48e | ||
|
|
fcc14e467a | ||
|
|
11168fea66 | ||
|
|
5015ec4b5d | ||
|
|
270883d3f4 | ||
|
|
c399db82a3 | ||
|
|
76d833f332 | ||
|
|
68c22efa58 | ||
|
|
c626b0e1f6 | ||
|
|
d304ed7d73 | ||
|
|
0ba856a637 | ||
|
|
8bc85764ff | ||
|
|
ff925f1d86 | ||
|
|
43cb1b3a41 | ||
|
|
6d8f40d13a | ||
|
|
796314c339 | ||
|
|
874a7ed3b3 | ||
|
|
351f98b10d | ||
|
|
3af70f13a3 | ||
|
|
8f3ee7c649 | ||
|
|
6bc413530e | ||
|
|
6e3f893a0e | ||
|
|
250d9f2ed7 | ||
|
|
f42481b60f | ||
|
|
24ecfb1a48 | ||
|
|
31cd80cea7 | ||
|
|
82bbcef117 | ||
|
|
898c716841 | ||
|
|
085bfd83d7 | ||
|
|
27b57dbf0c | ||
|
|
e9697859bd | ||
|
|
b20a74b017 | ||
|
|
80456598e0 | ||
|
|
61ccd56d25 | ||
|
|
7050c59cae | ||
|
|
df48d440e4 | ||
|
|
94735a8364 | ||
|
|
19f84b52e7 | ||
|
|
0d2825e06f | ||
|
|
73250601f0 | ||
|
|
9201cf8d00 | ||
|
|
856ec46467 | ||
|
|
ccf7bbdb50 | ||
|
|
9f5e131203 | ||
|
|
3c106e4dd7 | ||
|
|
fdfe3210ce | ||
|
|
f5deda56a6 | ||
|
|
b9ecec6452 | ||
|
|
698365e47f | ||
|
|
7c78101621 | ||
|
|
820ba45fab | ||
|
|
de428146b9 | ||
|
|
ef32fab30e | ||
|
|
d7038e1be1 | ||
|
|
11685a3e0c | ||
|
|
79c9aa7d02 | ||
|
|
ffa58776fe | ||
|
|
db449b9e09 | ||
|
|
464628b5c4 | ||
|
|
fcde15e136 | ||
|
|
c678fed113 | ||
|
|
4e3715d4bb | ||
|
|
28ce02915a | ||
|
|
bd7ec9c5f7 | ||
|
|
babd6e0ee7 | ||
|
|
eba9291e5c | ||
|
|
ef88a54125 | ||
|
|
93ebfd6217 | ||
|
|
82401defc7 | ||
|
|
835ee7aa8e | ||
|
|
0c609bc17e | ||
|
|
90703f99ee | ||
|
|
5f6a1f4093 | ||
|
|
b69745f178 | ||
|
|
14f63cbe67 | ||
|
|
46ec50aecb | ||
|
|
837a680849 | ||
|
|
07365c1073 | ||
|
|
364e2765e7 | ||
|
|
9c9939e5d4 | ||
|
|
9878a83894 | ||
|
|
56cb7de72a | ||
|
|
52761f2c29 | ||
|
|
fb8db6cb73 | ||
|
|
846001f06d | ||
|
|
0620f249a5 | ||
|
|
019bccfa6f | ||
|
|
75fd039dba | ||
|
|
9b733baf02 | ||
|
|
ee5a1b0a83 | ||
|
|
8d3e46dfac | ||
|
|
75226e6b68 | ||
|
|
085d3af14c | ||
|
|
ca3efe6bdc | ||
|
|
c21b60b038 | ||
|
|
51075421d3 | ||
|
|
f6c3c8ac00 | ||
|
|
fcca4032ef | ||
|
|
a802729562 | ||
|
|
95d5a19319 | ||
|
|
4a2e1534d5 | ||
|
|
f21a1dc9ad | ||
|
|
b3aa1bda1d | ||
|
|
cda0b615de |
123
AUTHORS.txt
123
AUTHORS.txt
@@ -1,6 +1,6 @@
|
|||||||
OpenSceneGraph Library 3.2.1
|
OpenSceneGraph Library 3.4.0
|
||||||
|
|
||||||
519 Contributors:
|
550 Contributors:
|
||||||
|
|
||||||
Firstname Surname
|
Firstname Surname
|
||||||
-----------------
|
-----------------
|
||||||
@@ -8,15 +8,15 @@ Robert Osfield
|
|||||||
Don Burns
|
Don Burns
|
||||||
Stephan Huber
|
Stephan Huber
|
||||||
Paul Martz
|
Paul Martz
|
||||||
Mathias Fr<46>hlich
|
|
||||||
Farshid Lashkari
|
Farshid Lashkari
|
||||||
|
Mathias Fr<46>hlich
|
||||||
Marco Jez
|
Marco Jez
|
||||||
Wang Rui
|
Wang Rui
|
||||||
Jean-S<>bastien Guay
|
Jean-S<>bastien Guay
|
||||||
Ulrich Hertlein
|
Ulrich Hertlein
|
||||||
Mike Weiblen
|
Mike Weiblen
|
||||||
|
Sukender
|
||||||
Eric Wing
|
Eric Wing
|
||||||
Sukender
|
|
||||||
Cedric Pinson
|
Cedric Pinson
|
||||||
Brede Johansen
|
Brede Johansen
|
||||||
Bob Kuehne
|
Bob Kuehne
|
||||||
@@ -30,51 +30,54 @@ Colin McDonald
|
|||||||
Trajce Nikolov
|
Trajce Nikolov
|
||||||
Tim Moore
|
Tim Moore
|
||||||
Martin Lavery
|
Martin Lavery
|
||||||
Tree
|
Mattias Helsing
|
||||||
|
Tree
|
||||||
|
Jason Beverage
|
||||||
|
Pjotr Svetachov
|
||||||
Luigi Calori
|
Luigi Calori
|
||||||
Mike Wittman
|
Mike Wittman
|
||||||
Jason Beverage
|
Jan Peciva
|
||||||
Chris Hanson
|
Chris Hanson
|
||||||
|
Alberto Luaces
|
||||||
Roland Smeenk
|
Roland Smeenk
|
||||||
Roger James
|
Roger James
|
||||||
Jeremy Moles
|
Jeremy Moles
|
||||||
Jan Peciva
|
|
||||||
Mattias Helsing
|
|
||||||
J.P. Delport
|
J.P. Delport
|
||||||
Alberto Luaces
|
Andy Skinner
|
||||||
Magnus Kessler
|
Magnus Kessler
|
||||||
David Fries
|
David Fries
|
||||||
Andy Skinner
|
|
||||||
Tom Jolley
|
Tom Jolley
|
||||||
Paul Melis
|
Paul Melis
|
||||||
Luc Frauciel
|
Luc Frauciel
|
||||||
|
Aurelien Albert
|
||||||
Pavel Moloshtan
|
Pavel Moloshtan
|
||||||
Brad Christiansen
|
Brad Christiansen
|
||||||
|
Terry Welsh
|
||||||
Olaf Flebbe
|
Olaf Flebbe
|
||||||
Mathieu Marache
|
Mathieu Marache
|
||||||
|
Lionel Lagarde
|
||||||
Jason Daly
|
Jason Daly
|
||||||
Aurelien Albert
|
|
||||||
Art Tevs
|
Art Tevs
|
||||||
Philip Lowman
|
Philip Lowman
|
||||||
Per Fahlberg
|
Per Fahlberg
|
||||||
Norman Vine
|
Norman Vine
|
||||||
Terry Welsh
|
Jannik Heller
|
||||||
|
Chris Denham
|
||||||
Serge Lages
|
Serge Lages
|
||||||
Romano Jos<6F> Magacho da Silva
|
Romano Jos<6F> Magacho da Silva
|
||||||
Lionel Lagarde
|
|
||||||
Chris Denham
|
|
||||||
Alberto Farre
|
Alberto Farre
|
||||||
Torben Dannhauer
|
Torben Dannhauer
|
||||||
Sherman Wilcox
|
Sherman Wilcox
|
||||||
Robert Michael
|
Robert Michael
|
||||||
Mourad Boufarguine
|
Mourad Boufarguine
|
||||||
|
Glenn Waldron
|
||||||
Andr<EFBFBD> Garneau
|
Andr<EFBFBD> Garneau
|
||||||
Adrian Egli
|
Adrian Egli
|
||||||
Ruben Lopez
|
Ruben Lopez
|
||||||
Randall Hopper
|
Randall Hopper
|
||||||
Pjotr Svetachov
|
|
||||||
Jan Ciger
|
Jan Ciger
|
||||||
Glenn Waldron
|
Sebastian Messerschmidt
|
||||||
|
Kristofer Tingdahl
|
||||||
Gideon May
|
Gideon May
|
||||||
Don Tidrow
|
Don Tidrow
|
||||||
Stephane Lamoliatte
|
Stephane Lamoliatte
|
||||||
@@ -84,16 +87,18 @@ Joakim Simonsson
|
|||||||
David Spilling
|
David Spilling
|
||||||
Daniel Sj<53>lie
|
Daniel Sj<53>lie
|
||||||
Bryan Thrall
|
Bryan Thrall
|
||||||
|
Rafa Gaitan
|
||||||
|
Mike Connell
|
||||||
Fabien Lavignotte
|
Fabien Lavignotte
|
||||||
Andreas Ekstrand
|
Andreas Ekstrand
|
||||||
Riccardo Corsi
|
|
||||||
Mike Connell
|
|
||||||
Melchior Franz
|
|
||||||
Johannes Baeuerle
|
|
||||||
Thomas Hogarth
|
Thomas Hogarth
|
||||||
Rafa Gaitan
|
Riccardo Corsi
|
||||||
|
Melchior Franz
|
||||||
|
Konstantin Matveyev
|
||||||
|
Johannes Baeuerle
|
||||||
Neil Hughes
|
Neil Hughes
|
||||||
Martin Beckett
|
Martin Beckett
|
||||||
|
Marc Helbling
|
||||||
Joran Jessurun
|
Joran Jessurun
|
||||||
Gino van den Bergen
|
Gino van den Bergen
|
||||||
Frederic Marmond
|
Frederic Marmond
|
||||||
@@ -105,7 +110,6 @@ Boris Bralo
|
|||||||
Yefei He
|
Yefei He
|
||||||
Sondra Iverson
|
Sondra Iverson
|
||||||
Simon Julier
|
Simon Julier
|
||||||
Sebastian Messerschmidt
|
|
||||||
Rune Schmidt Jensen
|
Rune Schmidt Jensen
|
||||||
Rainer Oder
|
Rainer Oder
|
||||||
Nico Kruithof
|
Nico Kruithof
|
||||||
@@ -113,10 +117,12 @@ Martin Aumueller
|
|||||||
Mario Valle
|
Mario Valle
|
||||||
Lukasz Izdebski
|
Lukasz Izdebski
|
||||||
Jorge Izquierdo Ciges
|
Jorge Izquierdo Ciges
|
||||||
|
Jordi Torres
|
||||||
Gordon Tomlinson
|
Gordon Tomlinson
|
||||||
Frederic Bouvier
|
Frederic Bouvier
|
||||||
Carlo Camporesi
|
Carlo Camporesi
|
||||||
Ben Discoe
|
Ben Discoe
|
||||||
|
Alexander Sinditskiy
|
||||||
Thibault Genessay
|
Thibault Genessay
|
||||||
Sasa Bistrovic
|
Sasa Bistrovic
|
||||||
Ravi Mathur
|
Ravi Mathur
|
||||||
@@ -126,10 +132,9 @@ Mikhail Izmestev
|
|||||||
Markus Trenkwalder
|
Markus Trenkwalder
|
||||||
Loic Dachary
|
Loic Dachary
|
||||||
Joseph Steel
|
Joseph Steel
|
||||||
Jordi Torres
|
|
||||||
John Shue
|
John Shue
|
||||||
Brad Colbert
|
Brad Colbert
|
||||||
Alexander Sinditskiy
|
Bj<EFBFBD>rn Blissing
|
||||||
Vivek Rajan
|
Vivek Rajan
|
||||||
Uwe Woessner
|
Uwe Woessner
|
||||||
Tony Horrobin
|
Tony Horrobin
|
||||||
@@ -137,6 +142,7 @@ Thom DeCarlo
|
|||||||
Tatsuhiro Nishioka
|
Tatsuhiro Nishioka
|
||||||
Tanguy Fautr<74>
|
Tanguy Fautr<74>
|
||||||
Sean Spicer
|
Sean Spicer
|
||||||
|
Ryan Kawicki
|
||||||
Richard Schmidt
|
Richard Schmidt
|
||||||
Peter Hrenka
|
Peter Hrenka
|
||||||
Paul de Repentigny
|
Paul de Repentigny
|
||||||
@@ -149,21 +155,19 @@ Maciej Krol
|
|||||||
Lilin Xiong
|
Lilin Xiong
|
||||||
Leandro Motta Barros
|
Leandro Motta Barros
|
||||||
Johan Nouvel
|
Johan Nouvel
|
||||||
|
Javier Taibo
|
||||||
Hartwig Wiesmann
|
Hartwig Wiesmann
|
||||||
Donn Mielcarek
|
Donn Mielcarek
|
||||||
Corbin Holtz
|
Corbin Holtz
|
||||||
Blasius Czink
|
Blasius Czink
|
||||||
Bj<EFBFBD>rn Blissing
|
|
||||||
Alexander Irion
|
Alexander Irion
|
||||||
Toshiyuki Takahei
|
Toshiyuki Takahei
|
||||||
Sebastien Grignard
|
Sebastien Grignard
|
||||||
Ryan Kawicki
|
|
||||||
Rudolf Wiedemann
|
Rudolf Wiedemann
|
||||||
Robert Milharcic
|
|
||||||
Maria Ten
|
Maria Ten
|
||||||
Liang Aibin
|
Liang Aibin
|
||||||
Kristofer Tingdahl
|
|
||||||
Katharina Plugge
|
Katharina Plugge
|
||||||
|
Julien Valentin
|
||||||
John Vidar Larring
|
John Vidar Larring
|
||||||
John Kelso
|
John Kelso
|
||||||
John Ivar
|
John Ivar
|
||||||
@@ -177,20 +181,25 @@ Bruce Clay
|
|||||||
Bradley Anderegg
|
Bradley Anderegg
|
||||||
Andreas Goebel
|
Andreas Goebel
|
||||||
Alok Priyadarshi
|
Alok Priyadarshi
|
||||||
|
Ali Botorabi
|
||||||
Alberto Barbati
|
Alberto Barbati
|
||||||
Alan Dickinson
|
Alan Dickinson
|
||||||
Vladimir Shabanov
|
Vladimir Shabanov
|
||||||
Vladimir Chebaev
|
Vladimir Chebaev
|
||||||
Tugkan Calapoglu
|
Tugkan Calapoglu
|
||||||
Tim Daoust
|
Tim Daoust
|
||||||
|
Sylvain Marie
|
||||||
Sohey Yamamoto
|
Sohey Yamamoto
|
||||||
Sergey Leontyev
|
Sergey Leontyev
|
||||||
Santosh Gaikwad
|
Santosh Gaikwad
|
||||||
Ryan Pavlik
|
Ryan Pavlik
|
||||||
|
Robert Milharcic
|
||||||
Rene Molenaar
|
Rene Molenaar
|
||||||
Piotr Domagalski
|
Piotr Domagalski
|
||||||
Phil Atkin
|
Phil Atkin
|
||||||
|
Pawel Ksiezopolski
|
||||||
Nathan Monteleone
|
Nathan Monteleone
|
||||||
|
Miha Rav<61>elj
|
||||||
Miguel Escriva
|
Miguel Escriva
|
||||||
Mattias Linde
|
Mattias Linde
|
||||||
Mark Sciabica
|
Mark Sciabica
|
||||||
@@ -200,11 +209,14 @@ Lars Nilsson
|
|||||||
Konstantin Sinitsyn
|
Konstantin Sinitsyn
|
||||||
Ken Sewell
|
Ken Sewell
|
||||||
Julian Ortiz
|
Julian Ortiz
|
||||||
|
Julen Garcia
|
||||||
John Kaniarz
|
John Kaniarz
|
||||||
|
Johannes Scholz
|
||||||
Jim Vaughan
|
Jim Vaughan
|
||||||
Jeremy Bell
|
Jeremy Bell
|
||||||
Jaromir Vitek
|
Jaromir Vitek
|
||||||
James French
|
James French
|
||||||
|
Jaap Glas
|
||||||
Guillaume Millet
|
Guillaume Millet
|
||||||
Gary Quinn
|
Gary Quinn
|
||||||
Garrett Potts
|
Garrett Potts
|
||||||
@@ -215,13 +227,16 @@ Donald Cipperly
|
|||||||
Don Leich
|
Don Leich
|
||||||
Dietmar Funck
|
Dietmar Funck
|
||||||
Colin Cochran
|
Colin Cochran
|
||||||
|
Christian Ruzicka
|
||||||
Christian Buchner
|
Christian Buchner
|
||||||
Charles Cole
|
Charles Cole
|
||||||
Blake Williams
|
Blake Williams
|
||||||
|
Bj<EFBFBD>rn Hein
|
||||||
|
Aur<EFBFBD>lien Chatelain
|
||||||
Antoine Hue
|
Antoine Hue
|
||||||
Andrew Bettison
|
Andrew Bettison
|
||||||
|
Andreas Henne
|
||||||
Anders Backman
|
Anders Backman
|
||||||
Ali Botorabi
|
|
||||||
Alexander Wiebel
|
Alexander Wiebel
|
||||||
Alessandro Terenzi
|
Alessandro Terenzi
|
||||||
Zach Deedler
|
Zach Deedler
|
||||||
@@ -229,26 +244,28 @@ Yuzhong Shen
|
|||||||
Wee See
|
Wee See
|
||||||
Warren Macchi
|
Warren Macchi
|
||||||
Vincent Bourdier
|
Vincent Bourdier
|
||||||
Terrex
|
Terrex
|
||||||
Tassilo Glander
|
Tassilo Glander
|
||||||
Sylvain Marie
|
|
||||||
Steve Lunsford
|
Steve Lunsford
|
||||||
Stephane Simon
|
Stephane Simon
|
||||||
Stephan Eilemann
|
Stephan Eilemann
|
||||||
Stanislav Blinov
|
Stanislav Blinov
|
||||||
Sergey Polischuk
|
Sergey Polischuk
|
||||||
|
Roni Zanolli
|
||||||
Raymond de Vries
|
Raymond de Vries
|
||||||
Ralf Kern
|
Ralf Kern
|
||||||
Piotr Gwiazdowski
|
Piotr Gwiazdowski
|
||||||
Pierre Haritchabalet
|
Pierre Haritchabalet
|
||||||
|
Philippe Renon
|
||||||
Perry Miller
|
Perry Miller
|
||||||
Pawel Ksiezopolski
|
|
||||||
Paul Palumbo
|
Paul Palumbo
|
||||||
Paul Obermeier
|
Paul Obermeier
|
||||||
|
Patrick Neary
|
||||||
Nguyen Van Truong
|
Nguyen Van Truong
|
||||||
Nathan Cournia
|
Nathan Cournia
|
||||||
Morten Haukness
|
Morten Haukness
|
||||||
Morn<EFBFBD> Pistorius
|
Morn<EFBFBD> Pistorius
|
||||||
|
Michael Mc Donnell
|
||||||
Michael Henheffer
|
Michael Henheffer
|
||||||
Michael Guerrero
|
Michael Guerrero
|
||||||
Maya Leonard
|
Maya Leonard
|
||||||
@@ -263,18 +280,15 @@ Marius Heise
|
|||||||
Marcin Hajder
|
Marcin Hajder
|
||||||
Marcel Pursche
|
Marcel Pursche
|
||||||
Lilith Bryant
|
Lilith Bryant
|
||||||
Konstantin Matveyev
|
|
||||||
Kevin Moiule
|
Kevin Moiule
|
||||||
Keith Steffen
|
Keith Steffen
|
||||||
Julen Garcia
|
|
||||||
Joseph Winston
|
Joseph Winston
|
||||||
John Aughey
|
John Aughey
|
||||||
Johannes Scholz
|
|
||||||
Joachim Pouderoux
|
Joachim Pouderoux
|
||||||
Jean-Christophe Lombardo
|
Jean-Christophe Lombardo
|
||||||
Javier Taibo
|
Jan Klimke
|
||||||
|
James Turner
|
||||||
James Moliere
|
James Moliere
|
||||||
Jaap Glas
|
|
||||||
Igor Kravtchenko
|
Igor Kravtchenko
|
||||||
Himar Carmona
|
Himar Carmona
|
||||||
He Sicong
|
He Sicong
|
||||||
@@ -284,31 +298,35 @@ Guillaume Taze
|
|||||||
Guillaume Chouvenc
|
Guillaume Chouvenc
|
||||||
Giuseppe Donvito
|
Giuseppe Donvito
|
||||||
Gill Peacegood
|
Gill Peacegood
|
||||||
|
Giampaolo Vigan<61>
|
||||||
Gerrick Bivins
|
Gerrick Bivins
|
||||||
George Tarantilis
|
George Tarantilis
|
||||||
Ferdi Smit
|
Ferdi Smit
|
||||||
Eric Buehler
|
Eric Buehler
|
||||||
Eduardo Poyart
|
Eduardo Poyart
|
||||||
Edgar Ellis
|
Edgar Ellis
|
||||||
|
Dmitry Marakasov
|
||||||
Dimi Christopoulos
|
Dimi Christopoulos
|
||||||
Diane Delallée
|
Diane Delall<EFBFBD>e
|
||||||
David Longest
|
David Longest
|
||||||
David Ergo
|
David Ergo
|
||||||
Daniel Trstenjak
|
Daniel Trstenjak
|
||||||
Craig Bosma
|
Craig Bosma
|
||||||
Claus Scheiblauer
|
Claus Scheiblauer
|
||||||
Christophe Loustaunau
|
Christophe Loustaunau
|
||||||
Christian Ruzicka
|
Christian Kehl
|
||||||
|
Bradley Baker Searles
|
||||||
Brad Anderegg
|
Brad Anderegg
|
||||||
Bj<EFBFBD>rn Hein
|
|
||||||
Aric Aumann
|
Aric Aumann
|
||||||
Andrew Sampson
|
Andrew Sampson
|
||||||
Andrew Lorino
|
Andrew Lorino
|
||||||
Alexandre Amalric
|
Alexandre Amalric
|
||||||
|
Aitor Moreno
|
||||||
Zbigniew Sroczynski
|
Zbigniew Sroczynski
|
||||||
Yuri Vilmanis
|
Yuri Vilmanis
|
||||||
Xin Li
|
Xin Li
|
||||||
Wang Lam
|
Wang Lam
|
||||||
|
Wand Rui
|
||||||
Walter J. Altice
|
Walter J. Altice
|
||||||
Volker Walkiewicz
|
Volker Walkiewicz
|
||||||
Vladimir Vukicevic
|
Vladimir Vukicevic
|
||||||
@@ -327,12 +345,14 @@ Tomas Hnilica
|
|||||||
Todd Furlong
|
Todd Furlong
|
||||||
Tobias Ottenweller
|
Tobias Ottenweller
|
||||||
Tino Schwarze
|
Tino Schwarze
|
||||||
|
Tim George
|
||||||
Thorsten Brehm
|
Thorsten Brehm
|
||||||
Thomas Weidner
|
Thomas Weidner
|
||||||
Tan Dunning
|
Tan Dunning
|
||||||
Tamer Fahmy
|
Tamer Fahmy
|
||||||
Stewart Andreason
|
Stewart Andreason
|
||||||
Steven Thomas
|
Steven Thomas
|
||||||
|
Stephan Wenglorz
|
||||||
Simon Hammett
|
Simon Hammett
|
||||||
Simon Carmody
|
Simon Carmody
|
||||||
Simon Buckley
|
Simon Buckley
|
||||||
@@ -368,9 +388,11 @@ Philip Lamb
|
|||||||
Petr Salinger
|
Petr Salinger
|
||||||
Peter Bear
|
Peter Bear
|
||||||
Peter Amstutz
|
Peter Amstutz
|
||||||
|
Per Nordqvist
|
||||||
Paul Idstein
|
Paul Idstein
|
||||||
Paul Fredrikson
|
Paul Fredrikson
|
||||||
Paul Fotheringham
|
Paul Fotheringham
|
||||||
|
Paul Cheyrou-Lagreze
|
||||||
Pau Garcia
|
Pau Garcia
|
||||||
Patrick Hartling
|
Patrick Hartling
|
||||||
Parag Chaudhur
|
Parag Chaudhur
|
||||||
@@ -384,10 +406,10 @@ Nicolas Brodu
|
|||||||
Nick Black
|
Nick Black
|
||||||
Mojtaba Fathi
|
Mojtaba Fathi
|
||||||
Mirko Viviani
|
Mirko Viviani
|
||||||
Mikkel Gjøl
|
Mikkel Gj<EFBFBD>l
|
||||||
Mike Krus
|
Mike Krus
|
||||||
Mike Garrity
|
Mike Garrity
|
||||||
Miha Ravsel
|
Michal Durkovic
|
||||||
Michael Schanne
|
Michael Schanne
|
||||||
Michael Polak
|
Michael Polak
|
||||||
Michael Morrison
|
Michael Morrison
|
||||||
@@ -409,12 +431,13 @@ Martin Innus
|
|||||||
Martin Beck
|
Martin Beck
|
||||||
Marius Kintel
|
Marius Kintel
|
||||||
Mario Guimaraes
|
Mario Guimaraes
|
||||||
|
Marcus Hein
|
||||||
Marco Sciabica
|
Marco Sciabica
|
||||||
Marco Lehmann
|
Marco Lehmann
|
||||||
Marc Helbling
|
|
||||||
Maik Keller
|
Maik Keller
|
||||||
Lukas Diduch
|
Lukas Diduch
|
||||||
Louis Hamilton
|
Louis Hamilton
|
||||||
|
Likasz Izebski
|
||||||
Lewis Harmon
|
Lewis Harmon
|
||||||
Leigh Stivers
|
Leigh Stivers
|
||||||
Laurence Muller
|
Laurence Muller
|
||||||
@@ -431,6 +454,7 @@ Juergen Rensen
|
|||||||
Juan Manuel Alvarez
|
Juan Manuel Alvarez
|
||||||
Juan Hernando
|
Juan Hernando
|
||||||
Josh Portway
|
Josh Portway
|
||||||
|
Jonathan Greig
|
||||||
John Tan
|
John Tan
|
||||||
John Grant
|
John Grant
|
||||||
John Donovan
|
John Donovan
|
||||||
@@ -440,11 +464,11 @@ John Argentieri
|
|||||||
Joan Abadie
|
Joan Abadie
|
||||||
Jim Brooks
|
Jim Brooks
|
||||||
Jeroen den Dekker
|
Jeroen den Dekker
|
||||||
|
Jeffrey Kinross
|
||||||
Jay Zuckerman
|
Jay Zuckerman
|
||||||
Jason Howlett
|
Jason Howlett
|
||||||
Jason Ballenger
|
Jason Ballenger
|
||||||
Jan Klimke
|
Jamie Robertson
|
||||||
James Turner
|
|
||||||
James Killian
|
James Killian
|
||||||
James Athey
|
James Athey
|
||||||
J.E. Hoffmann
|
J.E. Hoffmann
|
||||||
@@ -478,7 +502,7 @@ Duvan Cope
|
|||||||
Duncan Cavens
|
Duncan Cavens
|
||||||
Drew Whitehouse
|
Drew Whitehouse
|
||||||
Douglas A. Pouk
|
Douglas A. Pouk
|
||||||
Dmitry Marakasov
|
Dmitriy Ogalcev
|
||||||
Dean Iverson
|
Dean Iverson
|
||||||
David Jung
|
David Jung
|
||||||
Danny Valente
|
Danny Valente
|
||||||
@@ -486,7 +510,10 @@ Daniel Stien
|
|||||||
Dan Minor
|
Dan Minor
|
||||||
C<EFBFBD>sar L. B. Silveira
|
C<EFBFBD>sar L. B. Silveira
|
||||||
Cyril Brulebois
|
Cyril Brulebois
|
||||||
|
Cory Slep
|
||||||
|
Cl<EFBFBD>ment B<>sch
|
||||||
Clay Fowler
|
Clay Fowler
|
||||||
|
Claus Steuer
|
||||||
Chuck Sembroski
|
Chuck Sembroski
|
||||||
Christopher Blaesius
|
Christopher Blaesius
|
||||||
Christopher Baker
|
Christopher Baker
|
||||||
@@ -508,6 +535,7 @@ Benjamin Wasty
|
|||||||
Ben van Basten
|
Ben van Basten
|
||||||
Bart Gallet
|
Bart Gallet
|
||||||
Axel Volley
|
Axel Volley
|
||||||
|
Arjun Ramamurthy
|
||||||
Anthousis Andreadis
|
Anthousis Andreadis
|
||||||
Anish Thomas
|
Anish Thomas
|
||||||
Andy Preece
|
Andy Preece
|
||||||
@@ -515,11 +543,14 @@ Andrew Reyonolds
|
|||||||
Andreas Roth
|
Andreas Roth
|
||||||
Andreas Jochens
|
Andreas Jochens
|
||||||
Andre Normann
|
Andre Normann
|
||||||
|
Alois Wismer
|
||||||
Almalric Alexandre
|
Almalric Alexandre
|
||||||
Allen Bierbaum
|
Allen Bierbaum
|
||||||
|
Alexey Pavlov
|
||||||
Alberto Jaspe
|
Alberto Jaspe
|
||||||
Alan Purvis
|
Alan Purvis
|
||||||
Alan Ott
|
Alan Ott
|
||||||
Alan Harris
|
Alan Harris
|
||||||
Adrien Grandemange
|
Adrien Grandemange
|
||||||
|
Adrian Clark
|
||||||
Adam Richard
|
Adam Richard
|
||||||
|
|||||||
412
CMakeLists.txt
412
CMakeLists.txt
@@ -22,34 +22,39 @@ if(COMMAND cmake_policy)
|
|||||||
|
|
||||||
# tell CMake to prefer CMake's own CMake modules when available
|
# tell CMake to prefer CMake's own CMake modules when available
|
||||||
# only available from cmake-2.8.4
|
# only available from cmake-2.8.4
|
||||||
if(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 8 AND ${CMAKE_PATCH_VERSION} GREATER 3)
|
if(${CMAKE_MAJOR_VERSION} GREATER 2 OR
|
||||||
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 8) OR
|
||||||
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 8 AND ${CMAKE_PATCH_VERSION} GREATER 3))
|
||||||
cmake_policy(SET CMP0017 NEW)
|
cmake_policy(SET CMP0017 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# cmake-2.6.1 introduces policy cmp0008 decide how to treat full path libraries that do not appear to be valid library file names
|
# cmake-2.6.1 introduces policy cmp0008 decide how to treat full path libraries that do not appear to be valid library file names
|
||||||
# quote from cvslog "Such libraries worked by accident in the VS IDE and Xcode generators in CMake 2.4 and below."
|
# quote from cvslog "Such libraries worked by accident in the VS IDE and Xcode generators in CMake 2.4 and below."
|
||||||
if(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4 AND ${CMAKE_PATCH_VERSION} GREATER 0)
|
if(${CMAKE_MAJOR_VERSION} GREATER 2 OR
|
||||||
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 6) OR
|
||||||
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 6 AND ${CMAKE_PATCH_VERSION} GREATER 0))
|
||||||
cmake_policy(SET CMP0008 OLD)
|
cmake_policy(SET CMP0008 OLD)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# disable autolinking to qtmain as we have our own main() functions (new in Qt 5.1)
|
# disable autolinking to qtmain as we have our own main() functions (new in Qt 5.1)
|
||||||
if((${CMAKE_MAJOR_VERSION} EQUAL 2 OR ${CMAKE_MAJOR_VERSION} GREATER 2) AND
|
if(${CMAKE_MAJOR_VERSION} GREATER 2 OR
|
||||||
(${CMAKE_MINOR_VERSION} EQUAL 8 OR ${CMAKE_MINOR_VERSION} GREATER 8) AND
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 8) OR
|
||||||
${CMAKE_PATCH_VERSION} GREATER 10)
|
(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 8 AND ${CMAKE_PATCH_VERSION} GREATER 10))
|
||||||
cmake_policy(SET CMP0020 OLD)
|
cmake_policy(SET CMP0020 OLD)
|
||||||
endif()
|
endif()
|
||||||
# nicer version check - but needs at least CMake 2.6.2? Worth upgrading the requirements?
|
# nicer version check - but needs at least CMake 2.6.2? Worth upgrading the requirements?
|
||||||
#if("${CMAKE_VERSION}" VERSION_GREATER 2.8.10)
|
#if("${CMAKE_VERSION}" VERSION_GREATER 2.8.10)
|
||||||
|
# or even easier (available in cmake-2.6)
|
||||||
|
#if(POLICY CMPxyzw)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
PROJECT(OpenSceneGraph)
|
PROJECT(OpenSceneGraph)
|
||||||
|
|
||||||
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
|
SET(OPENSCENEGRAPH_MAJOR_VERSION 3)
|
||||||
SET(OPENSCENEGRAPH_MINOR_VERSION 2)
|
SET(OPENSCENEGRAPH_MINOR_VERSION 4)
|
||||||
SET(OPENSCENEGRAPH_PATCH_VERSION 1)
|
SET(OPENSCENEGRAPH_PATCH_VERSION 0)
|
||||||
SET(OPENSCENEGRAPH_SOVERSION 100)
|
SET(OPENSCENEGRAPH_SOVERSION 130)
|
||||||
|
|
||||||
# set to 0 when not a release candidate, non zero means that any generated
|
# set to 0 when not a release candidate, non zero means that any generated
|
||||||
# svn tags will be treated as release candidates of given number
|
# svn tags will be treated as release candidates of given number
|
||||||
@@ -80,78 +85,16 @@ SET(OpenThreads_SOURCE_DIR ${OpenSceneGraph_SOURCE_DIR})
|
|||||||
# Maybe this can be used override existing behavior if needed?
|
# Maybe this can be used override existing behavior if needed?
|
||||||
SET(CMAKE_MODULE_PATH "${OpenSceneGraph_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
|
SET(CMAKE_MODULE_PATH "${OpenSceneGraph_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}")
|
||||||
|
|
||||||
## Option to enable Android build using AndroidNDK
|
# Change the default build type to Release
|
||||||
OPTION(OSG_BUILD_PLATFORM_ANDROID OFF)
|
IF(NOT CMAKE_BUILD_TYPE)
|
||||||
IF(OSG_BUILD_PLATFORM_ANDROID)
|
SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
|
||||||
|
ENDIF(NOT CMAKE_BUILD_TYPE)
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0 FATAL_ERROR)
|
|
||||||
|
|
||||||
|
IF(ANDROID)
|
||||||
INCLUDE(OsgAndroidMacroUtils)
|
INCLUDE(OsgAndroidMacroUtils)
|
||||||
SET(ANDROID TRUE)
|
|
||||||
IF(NOT ANDROID_PLATFORM)
|
|
||||||
MESSAGE("Warning Android Platform version NOT defined, Default selected version: 5")
|
|
||||||
SET(ANDROID_PLATFORM 5)
|
|
||||||
ENDIF()
|
|
||||||
IF(NOT ANDROID_ABI)
|
|
||||||
MESSAGE("Warning Android ABI version NOT defined, Default selection: armeabi armeabi-v7a")
|
|
||||||
SET(ANDROID_ABI "armeabi armeabi-v7a")
|
|
||||||
ENDIF()
|
|
||||||
IF(NOT ANDROID_STL)
|
|
||||||
MESSAGE("Warning Android STL NOT defined, Default selection: gnustl_static")
|
|
||||||
SET(ANDROID_STL "gnustl_static")
|
|
||||||
ENDIF()
|
|
||||||
IF(ANDROID_DEBUG)
|
|
||||||
MESSAGE("Warning Android Build is in debug mode")
|
|
||||||
SET(ANDROID_RELEASE_OPTIM "debug")
|
|
||||||
ELSE()
|
|
||||||
MESSAGE("Warning Android Build is in release mode")
|
|
||||||
SET(ANDROID_RELEASE_OPTIM "release")
|
|
||||||
ENDIF()
|
|
||||||
IF(ANDROID_NEON)
|
|
||||||
MESSAGE("Warning Android NEON optimizations enabled, this will not be available on all armeabi-v7a devices ie. Tegra2")
|
|
||||||
SET(ANDROID_OPTIM_NEON true)
|
|
||||||
ELSE()
|
|
||||||
SET(ANDROID_OPTIM_NEON false)
|
|
||||||
ENDIF()
|
|
||||||
IF(ANDROID_ARM32)
|
|
||||||
MESSAGE("Warning ARM 32bit instruction set will be used")
|
|
||||||
SET(ANDROID_OPTIM_ARM32 true)
|
|
||||||
ELSE()
|
|
||||||
SET(ANDROID_OPTIM_ARM32 false)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
FIND_PACKAGE(AndroidNDK REQUIRED)
|
|
||||||
|
|
||||||
SET(OSG_ANDROID_TEMPLATES "${CMAKE_SOURCE_DIR}/PlatformSpecifics/Android")
|
|
||||||
|
|
||||||
SET(J "4" CACHE STRING "how many processes for make -j <J>")
|
|
||||||
|
|
||||||
ADD_CUSTOM_COMMAND(
|
|
||||||
OUTPUT Android-OpenSceneGraph
|
|
||||||
DEPENDS ${CMAKE_BINARY_DIR}/Android.mk
|
|
||||||
COMMAND "${ANDROID_NDK}/ndk-build"
|
|
||||||
ARGS --directory=${CMAKE_BINARY_DIR} NDK_APPLICATION_MK=Application.mk -j${J} NDK_LOG=1
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_CUSTOM_TARGET(ndk ALL echo
|
|
||||||
DEPENDS Android-OpenSceneGraph
|
|
||||||
)
|
|
||||||
install(DIRECTORY include/ DESTINATION include/
|
|
||||||
PATTERN ".svn" EXCLUDE
|
|
||||||
)
|
|
||||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/include/ DESTINATION include/
|
|
||||||
)
|
|
||||||
install(DIRECTORY ${CMAKE_BINARY_DIR}/obj/ DESTINATION obj/
|
|
||||||
PATTERN ".svn" EXCLUDE
|
|
||||||
PATTERN "objs" EXCLUDE
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_DEFINITIONS(-DANDROID)
|
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Okay, here's the problem: On some platforms, linking against OpenThreads
|
# Okay, here's the problem: On some platforms, linking against OpenThreads
|
||||||
# is not enough and explicit linking to the underlying thread library
|
# is not enough and explicit linking to the underlying thread library
|
||||||
# is also required (e.g. FreeBSD). But OpenThreads may be built with different
|
# is also required (e.g. FreeBSD). But OpenThreads may be built with different
|
||||||
@@ -234,8 +177,12 @@ IF(APPLE)
|
|||||||
EXECUTE_PROCESS(COMMAND "/usr/bin/sw_vers" "-productVersion"
|
EXECUTE_PROCESS(COMMAND "/usr/bin/sw_vers" "-productVersion"
|
||||||
OUTPUT_VARIABLE OSG_OSX_SDK_NAME
|
OUTPUT_VARIABLE OSG_OSX_SDK_NAME
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
STRING(SUBSTRING "${OSG_OSX_SDK_NAME}" 0 4 OSG_OSX_SDK_NAME)
|
STRING(REPLACE "." ";" MACOS_VERSION_LIST ${OSG_OSX_SDK_NAME})
|
||||||
SET(OSG_OSX_SDK_NAME "macosx${OSG_OSX_SDK_NAME}")
|
LIST(GET MACOS_VERSION_LIST 0 MACOS_VERSION_MAJOR)
|
||||||
|
LIST(GET MACOS_VERSION_LIST 1 MACOS_VERSION_MINOR)
|
||||||
|
LIST(GET MACOS_VERSION_LIST 2 MACOS_VERSION_PATCH)
|
||||||
|
|
||||||
|
SET(OSG_OSX_SDK_NAME "macosx${MACOS_VERSION_MAJOR}.${MACOS_VERSION_MINOR}")
|
||||||
|
|
||||||
# Trying to get CMake to generate an XCode IPhone project, current efforts are to get iphoneos sdk 3.1 working
|
# Trying to get CMake to generate an XCode IPhone project, current efforts are to get iphoneos sdk 3.1 working
|
||||||
# Added option which needs manually setting to select the IPhone SDK for building. We can only have one of the below
|
# Added option which needs manually setting to select the IPhone SDK for building. We can only have one of the below
|
||||||
@@ -286,6 +233,10 @@ ELSE()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IF(UNIX AND NOT ANDROID)
|
IF(UNIX AND NOT ANDROID)
|
||||||
# Not sure what this will do on Cygwin and Msys
|
# Not sure what this will do on Cygwin and Msys
|
||||||
# Also, remember OS X X11 is a user installed option so it may not exist.
|
# Also, remember OS X X11 is a user installed option so it may not exist.
|
||||||
@@ -450,46 +401,224 @@ MARK_AS_ADVANCED(OSG_DISABLE_MSVC_WARNINGS)
|
|||||||
OPTION(OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION "Set to ON to use the ref_ptr<> T* operator() output conversion. " ON)
|
OPTION(OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION "Set to ON to use the ref_ptr<> T* operator() output conversion. " ON)
|
||||||
|
|
||||||
|
|
||||||
OPTION(OSG_GL1_AVAILABLE "Set to OFF to disable use of OpenGL 1.x functions library." ON)
|
# Map the OPENGL_PROFILE to OSG_GL*_AVAILABLE settings
|
||||||
OPTION(OSG_GL2_AVAILABLE "Set to OFF to disable use of OpenGL 2.x functions library." ON)
|
SET(OPENGL_PROFILE "GL2" CACHE STRING "OpenGL Profile to use, choose from GL1, GL2, GL3, GLES1, GLES2, GLES3")
|
||||||
OPTION(OSG_GL3_AVAILABLE "Set to OFF to disable use of OpenGL 3.x functions library." OFF)
|
|
||||||
OPTION(OSG_GLES1_AVAILABLE "Set to OFF to disable use of OpenGL ES 1.x functions library." OFF)
|
IF ((OPENGL_PROFILE STREQUAL "GL1") OR (OPENGL_PROFILE STREQUAL "GL2"))
|
||||||
OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." OFF)
|
OPTION(OSG_GL1_AVAILABLE "Set to OFF to disable use of OpenGL 1.x functions library." ON )
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GL1_AVAILABLE "Set to OFF to disable use of OpenGL 1.x functions library." OFF )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF ((OPENGL_PROFILE STREQUAL "GL2"))
|
||||||
|
OPTION(OSG_GL2_AVAILABLE "Set to OFF to disable use of OpenGL 2.x functions library." ON )
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GL2_AVAILABLE "Set to OFF to disable use of OpenGL 2.x functions library." OFF )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF ((OPENGL_PROFILE STREQUAL "GL3") OR (OPENGL_PROFILE STREQUAL "GLCORE"))
|
||||||
|
OPTION(OSG_GL3_AVAILABLE "Set to OFF to disable use of OpenGL 3.x functions library." ON )
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GL3_AVAILABLE "Set to OFF to disable use of OpenGL 3.x functions library." OFF )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF ((OPENGL_PROFILE STREQUAL "GLES1"))
|
||||||
|
OPTION(OSG_GLES1_AVAILABLE "Set to OFF to disable use of OpenGL ES 1.x functions library." ON )
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GLES1_AVAILABLE "Set to OFF to disable use of OpenGL ES 1.x functions library." OFF )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF ((OPENGL_PROFILE STREQUAL "GLES2"))
|
||||||
|
OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." ON )
|
||||||
|
ELSEIF ((OPENGL_PROFILE STREQUAL "GLES3"))
|
||||||
|
OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." ON )
|
||||||
|
OPTION(OSG_GLES3_AVAILABLE "Set to OFF to disable use of OpenGL ES 3.x functions library." ON )
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GLES2_AVAILABLE "Set to OFF to disable use of OpenGL ES 2.x functions library." OFF )
|
||||||
|
OPTION(OSG_GLES3_AVAILABLE "Set to OFF to disable use of OpenGL ES 3.x functions library." OFF )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
OPTION(OSG_GL_LIBRARY_STATIC "Set to ON to statically link with OpenGL/GLES library." OFF)
|
OPTION(OSG_GL_LIBRARY_STATIC "Set to ON to statically link with OpenGL/GLES library." OFF)
|
||||||
|
|
||||||
SET(OPENGL_egl_LIBRARY CACHE STRING "Set the OpenGL egl library.")
|
SET(OPENGL_egl_LIBRARY CACHE STRING "Set the OpenGL egl library.")
|
||||||
|
|
||||||
# SET(OSG_GL_DISPLAYLISTS_AVAILABLE ${OSG_GL1_AVAILABLE})
|
# Map the OSG_GL*_AVAILABLE settings to OSG_GL_* settings
|
||||||
# SET(OSG_GL_MATRICES_AVAILABLE ${OSG_GL1_AVAILABLE})
|
IF (OSG_GLES2_AVAILABLE OR OSG_GL3_AVAILABLE)
|
||||||
# SET(OSG_GL_VERTEX_FUNCS_AVAILABLE ${OSG_GL1_AVAILABLE})
|
OPTION(OSG_GL_DISPLAYLISTS_AVAILABLE "Set to OFF to disable use of OpenGL display lists." OFF)
|
||||||
# SET(OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE ${OSG_GL1_AVAILABLE})
|
OPTION(OSG_GL_MATRICES_AVAILABLE "Set to OFF to disable use of OpenGL built-in matrices." OFF)
|
||||||
# SET(OSG_GL_FIXED_FUNCTION_AVAILABLE ${OSG_GL1_AVAILABLE})
|
OPTION(OSG_GL_VERTEX_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertex/glColor etc." OFF)
|
||||||
|
OPTION(OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertexPointer/glColorPointer etc." OFF)
|
||||||
|
OPTION(OSG_GL_FIXED_FUNCTION_AVAILABLE "Set to OFF to disable use of OpenGL fixed function pipeline." OFF)
|
||||||
|
ELSEIF (OSG_GLES1_AVAILABLE)
|
||||||
|
OPTION(OSG_GL_DISPLAYLISTS_AVAILABLE "Set to OFF to disable use of OpenGL display lists." OFF)
|
||||||
|
OPTION(OSG_GL_MATRICES_AVAILABLE "Set to OFF to disable use of OpenGL built-in matrices." ON)
|
||||||
|
OPTION(OSG_GL_VERTEX_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertex/glColor etc." ON)
|
||||||
|
OPTION(OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertexPointer/glColorPointer etc." ON)
|
||||||
|
OPTION(OSG_GL_FIXED_FUNCTION_AVAILABLE "Set to OFF to disable use of OpenGL fixed function pipeline." ON)
|
||||||
|
ELSE()
|
||||||
|
OPTION(OSG_GL_DISPLAYLISTS_AVAILABLE "Set to OFF to disable use of OpenGL display lists." ON)
|
||||||
|
OPTION(OSG_GL_MATRICES_AVAILABLE "Set to OFF to disable use of OpenGL built-in matrices." ON)
|
||||||
|
OPTION(OSG_GL_VERTEX_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertex/glColor etc." ON)
|
||||||
|
OPTION(OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertexPointer/glColorPointer etc." ON)
|
||||||
|
OPTION(OSG_GL_FIXED_FUNCTION_AVAILABLE "Set to OFF to disable use of OpenGL fixed function pipeline." ON)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
OPTION(OSG_GL_DISPLAYLISTS_AVAILABLE "Set to OFF to disable use of OpenGL display lists." ${OSG_GL1_AVAILABLE})
|
IF (OSG_GLES1_AVAILABLE OR OSG_GLES2_AVAILABLE)
|
||||||
OPTION(OSG_GL_MATRICES_AVAILABLE "Set to OFF to disable use of OpenGL built-in matrices." ${OSG_GL1_AVAILABLE})
|
OPTION(OSG_CPP_EXCEPTIONS_AVAILABLE "Set to OFF to disable compile of OSG components that use C++ exceptions." OFF)
|
||||||
OPTION(OSG_GL_VERTEX_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertex/glColor etc." ${OSG_GL1_AVAILABLE})
|
ELSE()
|
||||||
OPTION(OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE "Set to OFF to disable use of OpenGL vertex functions such as glVertexPointer/glColorPointer etc." ${OSG_GL1_AVAILABLE})
|
OPTION(OSG_CPP_EXCEPTIONS_AVAILABLE "Set to OFF to disable compile of OSG components that use C++ exceptions." ON)
|
||||||
OPTION(OSG_GL_FIXED_FUNCTION_AVAILABLE "Set to OFF to disable use of OpenGL fixed function pipeline." ${OSG_GL1_AVAILABLE})
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
# Map the OSG_GL*_AVAILABLE settings to OpenGL header settings
|
||||||
|
IF (OSG_GL3_AVAILABLE)
|
||||||
|
IF (APPLE)
|
||||||
|
SET(OPENGL_HEADER1 "#include <OpenGL/gl.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "#include <OpenGL/gl3.h>" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ELSE()
|
||||||
|
|
||||||
|
IF (OPENGL_PROFILE STREQUAL "GLCORE")
|
||||||
|
IF(WIN32)
|
||||||
|
FIND_PACKAGE(GLCORE REQUIRED)
|
||||||
|
ENDIF()
|
||||||
|
SET(OPENGL_HEADER1 "#include <GL/glcorearb.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ELSE()
|
||||||
|
SET(OPENGL_HEADER1 "#include <GL3/gl3.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(OSG_GLES1_AVAILABLE)
|
||||||
|
IF (APPLE AND NOT ANDROID)
|
||||||
|
SET(OPENGL_HEADER1 "#include \"TargetConditionals.h\"" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "#include <OpenGLES/ES1/gl.h>" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ELSE()
|
||||||
|
SET(OPENGL_HEADER1 "#include <GLES/gl.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(OSG_GLES2_AVAILABLE)
|
||||||
|
IF (APPLE AND NOT ANDROID)
|
||||||
|
SET(OPENGL_HEADER1 "#include \"TargetConditionals.h\"" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "#include <OpenGLES/ES2/gl.h>" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
# TODO: GLES3
|
||||||
|
ELSE()
|
||||||
|
SET(OPENGL_HEADER1 "#include <GLES2/gl2.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
# TODO: GLES3
|
||||||
|
ENDIF()
|
||||||
|
ELSE()
|
||||||
|
IF (APPLE)
|
||||||
|
SET(OPENGL_HEADER1 "#include <OpenGL/gl.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ELSE()
|
||||||
|
SET(OPENGL_HEADER1 "#include <GL/gl.h>" CACHE STRING "#include<> line for OpenGL Header")
|
||||||
|
SET(OPENGL_HEADER2 "" CACHE STRING "#include<> line for additional OpenGL Headers if required")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GL1_AVAILABLE)
|
||||||
|
SET(OSG_GL1_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GL1_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GL2_AVAILABLE)
|
||||||
|
SET(OSG_GL2_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GL2_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GL3_AVAILABLE)
|
||||||
|
SET(OSG_GL3_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GL3_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GLES1_AVAILABLE)
|
||||||
|
SET(OSG_GLES1_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GLES1_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GLES2_AVAILABLE)
|
||||||
|
SET(OSG_GLES2_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GLES2_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF (OSG_GLES3_AVAILABLE)
|
||||||
|
SET(OSG_GLES3_FEATURES "true")
|
||||||
|
ELSE()
|
||||||
|
SET(OSG_GLES3_FEATURES "false")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(ANDROID)
|
||||||
|
IF(OSG_GLES1_AVAILABLE)
|
||||||
|
FIND_PATH(OPENGL_INCLUDE_DIR GLES/gl.h
|
||||||
|
PATHS
|
||||||
|
${ANDROID_SYSROOT}/usr/include)
|
||||||
|
FIND_LIBRARY(OPENGL_gl_LIBRARY GLESv1_CM
|
||||||
|
PATHS
|
||||||
|
${ANDROID_SYSROOT}/usr/lib)
|
||||||
|
ELSEIF(OSG_GLES2_AVAILABLE)
|
||||||
|
FIND_PATH(OPENGL_INCLUDE_DIR GLES2/gl2.h
|
||||||
|
PATHS
|
||||||
|
${ANDROID_SYSROOT}/usr/include)
|
||||||
|
FIND_LIBRARY(OPENGL_gl_LIBRARY GLESv2
|
||||||
|
PATHS
|
||||||
|
${ANDROID_SYSROOT}/usr/lib)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
OPTION(OSG_CPP_EXCEPTIONS_AVAILABLE "Set to OFF to disable compile of OSG components that use C++ exceptions." ON)
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Set Config file
|
# Set Config header file
|
||||||
|
|
||||||
SET(OPENSCENEGRAPH_CONFIG_HEADER "${PROJECT_BINARY_DIR}/include/osg/Config")
|
SET(OPENSCENEGRAPH_CONFIG_HEADER "${PROJECT_BINARY_DIR}/include/osg/Config")
|
||||||
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/osg/Config.in"
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/osg/Config.in"
|
||||||
"${OPENSCENEGRAPH_CONFIG_HEADER}")
|
"${OPENSCENEGRAPH_CONFIG_HEADER}")
|
||||||
|
|
||||||
SET(OPENSCENEGRAPH_VERSION_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/include/osg/Version")
|
|
||||||
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/osg/Version.in"
|
################################################################################
|
||||||
"${OPENSCENEGRAPH_VERSION_HEADER}")
|
# Set OpenGL header file
|
||||||
|
|
||||||
|
INCLUDE (CheckCXXSourceCompiles)
|
||||||
|
#SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${OPENGL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"${OPENGL_HEADER1}
|
||||||
|
${OPENGL_HEADER2}
|
||||||
|
int main() { GLint64 test; return 0; }"
|
||||||
|
GL_HEADER_HAS_GLINT64
|
||||||
|
)
|
||||||
|
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"${OPENGL_HEADER1}
|
||||||
|
${OPENGL_HEADER2}
|
||||||
|
int main() { GLuint64 test; return 0; }"
|
||||||
|
GL_HEADER_HAS_GLUINT64
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(OPENSCENEGRAPH_OPENGL_HEADER "${PROJECT_BINARY_DIR}/include/osg/GL")
|
||||||
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/osg/GL.in"
|
||||||
|
"${OPENSCENEGRAPH_OPENGL_HEADER}")
|
||||||
|
|
||||||
# INSTALL_FILES(/include/osg/ FILES "${OPENSCENEGRAPH_CONFIG_HEADER}")
|
# INSTALL_FILES(/include/osg/ FILES "${OPENSCENEGRAPH_CONFIG_HEADER}")
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# Set Version header file
|
||||||
|
|
||||||
|
SET(OPENSCENEGRAPH_VERSION_HEADER "${PROJECT_BINARY_DIR}/include/osg/Version")
|
||||||
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/src/osg/Version.in"
|
||||||
|
"${OPENSCENEGRAPH_VERSION_HEADER}")
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Set Version Info resource file
|
# Set Version Info resource file
|
||||||
|
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
SET(OPENSCENEGRAPH_VERSIONINFO_RC "${PROJECT_BINARY_DIR}/PlatformSpecifics/Windows/OpenSceneGraphVersionInfo.rc")
|
SET(OPENSCENEGRAPH_VERSIONINFO_RC "${PROJECT_BINARY_DIR}/PlatformSpecifics/Windows/OpenSceneGraphVersionInfo.rc")
|
||||||
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/PlatformSpecifics/Windows/OpenSceneGraphVersionInfo.rc.in"
|
CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/PlatformSpecifics/Windows/OpenSceneGraphVersionInfo.rc.in"
|
||||||
@@ -511,6 +640,13 @@ IF(WIN32 AND NOT ANDROID)
|
|||||||
INCLUDE(Find3rdPartyDependencies)
|
INCLUDE(Find3rdPartyDependencies)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
OPTION(OSG_USE_LOCAL_LUA_SOURCE "Enable to use local Lua source when building the lua plugin" ON)
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you want to prevent CMake from picking up on any of the following optional 3rd Party dependencies in CMake 2.8 onwards
|
||||||
|
# you can use the following style of command line option when invoking Cmake (here illustrating ignoring PythonLibs) :
|
||||||
|
# cmake -DCMAKE_DISABLE_FIND_PACKAGE_PythonLibs=1 .
|
||||||
|
#
|
||||||
IF(ANDROID)
|
IF(ANDROID)
|
||||||
ANDROID_3RD_PARTY()
|
ANDROID_3RD_PARTY()
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -531,7 +667,10 @@ ELSE()
|
|||||||
FIND_PACKAGE(LibVNCServer)
|
FIND_PACKAGE(LibVNCServer)
|
||||||
FIND_PACKAGE(OurDCMTK)
|
FIND_PACKAGE(OurDCMTK)
|
||||||
FIND_PACKAGE(FFmpeg)
|
FIND_PACKAGE(FFmpeg)
|
||||||
|
FIND_PACKAGE(GStreamer COMPONENTS app pbutils)
|
||||||
|
FIND_PACKAGE(GLIB COMPONENTS gobject)
|
||||||
FIND_PACKAGE(DirectShow)
|
FIND_PACKAGE(DirectShow)
|
||||||
|
FIND_PACKAGE(SDL2)
|
||||||
FIND_PACKAGE(SDL)
|
FIND_PACKAGE(SDL)
|
||||||
FIND_PACKAGE(Poppler-glib)
|
FIND_PACKAGE(Poppler-glib)
|
||||||
FIND_PACKAGE(RSVG)
|
FIND_PACKAGE(RSVG)
|
||||||
@@ -542,6 +681,19 @@ ELSE()
|
|||||||
FIND_PACKAGE(Asio)
|
FIND_PACKAGE(Asio)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
FIND_PACKAGE(ZeroConf)
|
FIND_PACKAGE(ZeroConf)
|
||||||
|
|
||||||
|
FIND_PACKAGE(LIBLAS)
|
||||||
|
|
||||||
|
IF (NOT(OSG_USE_LOCAL_LUA_SOURCE))
|
||||||
|
FIND_PACKAGE(Lua52)
|
||||||
|
IF (NOT (LUA_LIBRARIES AND LUA_INCLUDE_DIR))
|
||||||
|
FIND_PACKAGE(Lua51)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# V8 and Python plugins are tests for linking against these libraries but aren't functionality beyond this.
|
||||||
|
# FIND_PACKAGE(V8)
|
||||||
|
# FIND_PACKAGE(PythonLibs)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION LESS 8)
|
IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION LESS 8)
|
||||||
@@ -560,11 +712,11 @@ IF(OSG_USE_QT AND NOT ANDROID)
|
|||||||
|
|
||||||
IF (DESIRED_QT_VERSION)
|
IF (DESIRED_QT_VERSION)
|
||||||
IF (DESIRED_QT_VERSION MATCHES 5)
|
IF (DESIRED_QT_VERSION MATCHES 5)
|
||||||
FIND_PACKAGE(Qt5Widgets)
|
FIND_PACKAGE(Qt5Widgets)
|
||||||
ELSEIF (DESIRED_QT_VERSION MATCHES 4)
|
ELSEIF (DESIRED_QT_VERSION MATCHES 4)
|
||||||
FIND_PACKAGE(Qt4)
|
FIND_PACKAGE(Qt4)
|
||||||
ELSE()
|
ELSE()
|
||||||
FIND_PACKAGE(Qt3)
|
FIND_PACKAGE(Qt3)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
ELSE()
|
ELSE()
|
||||||
@@ -596,6 +748,13 @@ IF(OSG_USE_QT AND NOT ANDROID)
|
|||||||
#If we have found Qt5, let's try to top off by getting the webkit as well
|
#If we have found Qt5, let's try to top off by getting the webkit as well
|
||||||
IF ( Qt5Widgets_FOUND )
|
IF ( Qt5Widgets_FOUND )
|
||||||
FIND_PACKAGE(Qt5WebKitWidgets QUIET)
|
FIND_PACKAGE(Qt5WebKitWidgets QUIET)
|
||||||
|
|
||||||
|
IF(COMMAND cmake_policy)
|
||||||
|
IF(${CMAKE_MAJOR_VERSION} GREATER 2)
|
||||||
|
# Qt5 qt5_use_modules usage was causing "Policy CMP0043 is not set: Ignore COMPILE_DEFINITIONS_<Config> properties." warnings
|
||||||
|
cmake_policy(SET CMP0043 NEW)
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -795,6 +954,10 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
|
|||||||
# returns too many hits.
|
# returns too many hits.
|
||||||
# FYI, if we do implement GNUCC, then -Wmissing-prototypes in another
|
# FYI, if we do implement GNUCC, then -Wmissing-prototypes in another
|
||||||
# interesting C-specific flag.
|
# interesting C-specific flag.
|
||||||
|
# Also, there is a bug in gcc 4.0. Under C++, -pedantic will create
|
||||||
|
# errors instead of warnings for certain issues, including superfluous
|
||||||
|
# semicolons and commas, and the use of long long. -fpermissive seems
|
||||||
|
# to be the workaround.
|
||||||
SET(OSG_AGGRESSIVE_WARNING_FLAGS -Wall -Wparentheses -Wno-long-long -Wno-import -pedantic -Wreturn-type -Wmissing-braces -Wunknown-pragmas -Wunused)
|
SET(OSG_AGGRESSIVE_WARNING_FLAGS -Wall -Wparentheses -Wno-long-long -Wno-import -pedantic -Wreturn-type -Wmissing-braces -Wunknown-pragmas -Wunused)
|
||||||
|
|
||||||
# Previous included -Wformat=2 in OSG_AGGRESSIVE_WARNING_FLAGS but had to remove it due to standard library errors
|
# Previous included -Wformat=2 in OSG_AGGRESSIVE_WARNING_FLAGS but had to remove it due to standard library errors
|
||||||
@@ -814,10 +977,32 @@ ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|||||||
# remain unset.
|
# remain unset.
|
||||||
|
|
||||||
IF (APPLE)
|
IF (APPLE)
|
||||||
# set standard lib, clang defaults to c++0x
|
SET(OSG_CXX_LANGUAGE_STANDARD "C++11" CACHE STRING "set the c++ language standard (C++98 / GNU++98 / C++11) for OSG" )
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++98")
|
MARK_AS_ADVANCED(OSG_CXX_LANGUAGE_STANDARD)
|
||||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++")
|
# remove existing flags
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -stdlib=libstdc++ -Wno-overloaded-virtual -Wno-conversion")
|
REMOVE_CXX_FLAG(-std=c++98)
|
||||||
|
REMOVE_CXX_FLAG(-std=gnu++98)
|
||||||
|
REMOVE_CXX_FLAG(-std=c++11)
|
||||||
|
REMOVE_CXX_FLAG(-stdlib=libstdc++)
|
||||||
|
REMOVE_CXX_FLAG(-stdlib=libc++)
|
||||||
|
|
||||||
|
IF(${OSG_CXX_LANGUAGE_STANDARD} STREQUAL "c++98" OR ${OSG_CXX_LANGUAGE_STANDARD} STREQUAL "C++98")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++98")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -stdlib=libstdc++")
|
||||||
|
ELSE()
|
||||||
|
IF(${OSG_CXX_LANGUAGE_STANDARD} STREQUAL "gnu++98" OR ${OSG_CXX_LANGUAGE_STANDARD} STREQUAL "GNU++98")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "gnu++98")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libstdc++")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++98 -stdlib=libstdc++")
|
||||||
|
ELSE()
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11")
|
||||||
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-overloaded-virtual -Wno-conversion")
|
||||||
set(WARNING_CFLAGS "")
|
set(WARNING_CFLAGS "")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@@ -881,16 +1066,21 @@ IF(APPLE AND NOT ANDROID)
|
|||||||
IF(OSG_BUILD_PLATFORM_IPHONE)
|
IF(OSG_BUILD_PLATFORM_IPHONE)
|
||||||
IF(${IPHONE_VERSION_MIN} LESS "7.0")
|
IF(${IPHONE_VERSION_MIN} LESS "7.0")
|
||||||
SET(CMAKE_OSX_ARCHITECTURES "armv6;armv7" CACHE STRING "Build architectures for iOS" FORCE)
|
SET(CMAKE_OSX_ARCHITECTURES "armv6;armv7" CACHE STRING "Build architectures for iOS" FORCE)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IPHONE_VERSION_MIN} -mno-thumb -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-thumb -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(CMAKE_OSX_ARCHITECTURES "armv7;armv7s;arm64" CACHE STRING "Build architectures for iOS" FORCE)
|
SET(CMAKE_OSX_ARCHITECTURES "armv7;armv7s;arm64" CACHE STRING "Build architectures for iOS" FORCE)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IPHONE_VERSION_MIN} -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -miphoneos-version-min=${IPHONE_VERSION_MIN}" FORCE)
|
||||||
|
|
||||||
ELSE()
|
ELSE()
|
||||||
#simulator uses i386 architectures
|
#simulator uses i386 architectures
|
||||||
SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for iOS Simulator" FORCE)
|
SET(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for iOS Simulator" FORCE)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-thumb -arch i386 -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mno-thumb -arch i386 -pipe -no-cpp-precomp" CACHE STRING "Flags used by the compiler during all build types." FORCE)
|
||||||
|
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mios-simulator-version-min=${IPHONE_VERSION_MIN}" FORCE)
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
#here we set the specific iphone sdk version. We can only set either device or simulator sdk. So if you want both you currently have to have two seperate projects
|
#here we set the specific iphone sdk version. We can only set either device or simulator sdk. So if you want both you currently have to have two seperate projects
|
||||||
@@ -918,7 +1108,7 @@ IF(APPLE AND NOT ANDROID)
|
|||||||
# FORCE is used because the options are not reflected in the UI otherwise.
|
# FORCE is used because the options are not reflected in the UI otherwise.
|
||||||
# Seems like a good place to add version specific compiler flags too.
|
# Seems like a good place to add version specific compiler flags too.
|
||||||
IF(NOT OSG_CONFIG_HAS_BEEN_RUN_BEFORE)
|
IF(NOT OSG_CONFIG_HAS_BEEN_RUN_BEFORE)
|
||||||
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9")
|
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.10")
|
||||||
SET(OSG_DEFAULT_IMAGE_PLUGIN_FOR_OSX "imageio" CACHE STRING "Forced imageio default image plugin for OSX" FORCE)
|
SET(OSG_DEFAULT_IMAGE_PLUGIN_FOR_OSX "imageio" CACHE STRING "Forced imageio default image plugin for OSX" FORCE)
|
||||||
# 64 Bit Works, i386,ppc is not supported any more
|
# 64 Bit Works, i386,ppc is not supported any more
|
||||||
SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for OSX" FORCE)
|
SET(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "Build architectures for OSX" FORCE)
|
||||||
@@ -1155,10 +1345,4 @@ ADD_CUSTOM_TARGET(uninstall
|
|||||||
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
"${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
||||||
|
|
||||||
#
|
#
|
||||||
IF(ANDROID)
|
|
||||||
message(STATUS "Creating Android Makefile Master files" )
|
|
||||||
configure_file("${OSG_ANDROID_TEMPLATES}/Android.mk.master.in" "${CMAKE_BINARY_DIR}/Android.mk")
|
|
||||||
configure_file("${OSG_ANDROID_TEMPLATES}/Application.mk.master.in" "${CMAKE_BINARY_DIR}/Application.mk")
|
|
||||||
configure_file("${OSG_ANDROID_TEMPLATES}/AndroidManifest.xml.master.in" "${CMAKE_BINARY_DIR}/AndroidManifest.xml")
|
|
||||||
ENDIF(ANDROID)
|
|
||||||
|
|
||||||
|
|||||||
@@ -143,6 +143,15 @@ ELSE()
|
|||||||
NOT _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
|
NOT _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
|
||||||
SET(_OPENTHREADS_ATOMIC_USE_MUTEX 1)
|
SET(_OPENTHREADS_ATOMIC_USE_MUTEX 1)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
# MinGW can set both WIN32_INTERLOCKED and GCC_BUILTINS to true which results in compliation errors
|
||||||
|
IF (_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS AND _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
|
||||||
|
# In this case we prefer the GCC_BUILTINS
|
||||||
|
SET(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS 1)
|
||||||
|
SET(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED 0)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ ELSE()
|
|||||||
# AVFoundation exists since 10.7, but only 10.8 has all features necessary for OSG
|
# AVFoundation exists since 10.7, but only 10.8 has all features necessary for OSG
|
||||||
# so check the SDK-setting
|
# so check the SDK-setting
|
||||||
|
|
||||||
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9")
|
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.10")
|
||||||
# nothing special here ;-)
|
# nothing special here ;-)
|
||||||
ELSE()
|
ELSE()
|
||||||
MESSAGE("AVFoundation disabled for SDK < 10.8")
|
MESSAGE("AVFoundation disabled for SDK < 10.8")
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# Locate ASIO-headers (http://think-async.com/Asio)
|
# Locate ASIO-headers (http://think-async.com/Asio)
|
||||||
# This module defines
|
# This module defines
|
||||||
# ASIO_FOUND, if false, do not try to link to gdal
|
# ASIO_FOUND, if false, do not try to link to gdal
|
||||||
# ASIO_INCLUDE_DIR, where to find the headers
|
# ASIO_INCLUDE_DIR, where to find the headers
|
||||||
#
|
#
|
||||||
# Created by Stephan Maximilian Huber
|
# Created by Stephan Maximilian Huber
|
||||||
|
|
||||||
FIND_PATH(ASIO_INCLUDE_DIR
|
FIND_PATH(ASIO_INCLUDE_DIR
|
||||||
NAMES
|
NAMES
|
||||||
@@ -14,7 +14,9 @@ FIND_PATH(ASIO_INCLUDE_DIR
|
|||||||
)
|
)
|
||||||
|
|
||||||
SET(ASIO_FOUND "NO")
|
SET(ASIO_FOUND "NO")
|
||||||
FIND_PACKAGE( Boost 1.37 )
|
IF(ASIO_INCLUDE_DIR)
|
||||||
IF(Boost_FOUND AND ASIO_INCLUDE_DIR)
|
FIND_PACKAGE( Boost 1.37 )
|
||||||
SET(ASIO_FOUND "YES")
|
IF(Boost_FOUND)
|
||||||
|
SET(ASIO_FOUND "YES")
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|||||||
@@ -11,16 +11,16 @@
|
|||||||
# $COLLADA_DIR is an environment variable that would
|
# $COLLADA_DIR is an environment variable that would
|
||||||
# correspond to the ./configure --prefix=$COLLADA_DIR
|
# correspond to the ./configure --prefix=$COLLADA_DIR
|
||||||
#
|
#
|
||||||
# Created by Robert Osfield.
|
# Created by Robert Osfield.
|
||||||
|
|
||||||
|
|
||||||
# Check if COLLADA_DIR is set, otherwise use ACTUAL_3DPARTY_DIR:
|
# Check if COLLADA_DIR is set, otherwise use ACTUAL_3DPARTY_DIR:
|
||||||
SET( COLLADA_ENV_VAR_AVAILABLE $ENV{COLLADA_DIR} )
|
SET( COLLADA_ENV_VAR_AVAILABLE $ENV{COLLADA_DIR} )
|
||||||
IF ( COLLADA_ENV_VAR_AVAILABLE )
|
IF ( COLLADA_ENV_VAR_AVAILABLE )
|
||||||
SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory" FORCE)
|
SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory" FORCE)
|
||||||
ELSE ( COLLADA_ENV_VAR_AVAILABLE )
|
ELSE ()
|
||||||
SET(COLLADA_DOM_ROOT "${ACTUAL_3DPARTY_DIR}/include/1.4/dom" CACHE PATH "Location of Collada DOM directory" FORCE)
|
SET(COLLADA_DOM_ROOT "${ACTUAL_3DPARTY_DIR}/include/1.4/dom" CACHE PATH "Location of Collada DOM directory" FORCE)
|
||||||
ENDIF( COLLADA_ENV_VAR_AVAILABLE )
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -65,16 +65,17 @@ FIND_PATH(COLLADA_INCLUDE_DIR dae.h
|
|||||||
${ACTUAL_3DPARTY_DIR}/include
|
${ACTUAL_3DPARTY_DIR}/include
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY
|
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY
|
||||||
NAMES collada_dom collada14dom Collada14Dom libcollada14dom21 libcollada14dom22
|
NAMES collada_dom collada14dom Collada14Dom libcollada14dom21 libcollada14dom22 collada-dom2.4-dp
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4
|
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4
|
||||||
|
${COLLADA_DOM_ROOT}
|
||||||
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4
|
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4
|
||||||
$ENV{COLLADA_DIR}/lib
|
$ENV{COLLADA_DIR}/lib
|
||||||
$ENV{COLLADA_DIR}/lib-dbg
|
$ENV{COLLADA_DIR}/lib-dbg
|
||||||
$ENV{COLLADA_DIR}
|
$ENV{COLLADA_DIR}
|
||||||
~/Library/Frameworks
|
~/Library/Frameworks
|
||||||
/Library/Frameworks
|
/Library/Frameworks
|
||||||
/opt/local/Library/Frameworks #macports
|
/opt/local/Library/Frameworks #macports
|
||||||
/usr/local/lib
|
/usr/local/lib
|
||||||
/usr/local/lib64
|
/usr/local/lib64
|
||||||
@@ -88,10 +89,11 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY
|
|||||||
${ACTUAL_3DPARTY_DIR}/lib
|
${ACTUAL_3DPARTY_DIR}/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG
|
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG
|
||||||
NAMES collada_dom-d collada14dom-d Collada14Dom-d libcollada14dom21-d libcollada14dom22-d
|
NAMES collada_dom-d collada14dom-d Collada14Dom-d libcollada14dom21-d libcollada14dom22-d collada-dom2.4-dp-d
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d
|
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d
|
||||||
|
${COLLADA_DOM_ROOT}
|
||||||
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4-d
|
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4-d
|
||||||
$ENV{COLLADA_DIR}/lib
|
$ENV{COLLADA_DIR}/lib
|
||||||
$ENV{COLLADA_DIR}/lib-dbg
|
$ENV{COLLADA_DIR}/lib-dbg
|
||||||
@@ -111,7 +113,7 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG
|
|||||||
${ACTUAL_3DPARTY_DIR}/lib
|
${ACTUAL_3DPARTY_DIR}/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_STATIC_LIBRARY
|
FIND_LIBRARY(COLLADA_STATIC_LIBRARY
|
||||||
NAMES libcollada14dom21-s libcollada14dom22-s libcollada14dom.a
|
NAMES libcollada14dom21-s libcollada14dom22-s libcollada14dom.a
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4
|
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4
|
||||||
@@ -134,7 +136,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY
|
|||||||
${ACTUAL_3DPARTY_DIR}/lib
|
${ACTUAL_3DPARTY_DIR}/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
||||||
NAMES collada_dom-sd collada14dom-sd libcollada14dom21-sd libcollada14dom22-sd libcollada14dom-d.a
|
NAMES collada_dom-sd collada14dom-sd libcollada14dom21-sd libcollada14dom22-sd libcollada14dom-d.a
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d
|
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d
|
||||||
@@ -173,7 +175,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
)
|
)
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
ENDIF(LIBXML2_FOUND)
|
ENDIF(LIBXML2_FOUND)
|
||||||
|
|
||||||
FIND_PACKAGE(ZLIB)
|
FIND_PACKAGE(ZLIB)
|
||||||
IF (ZLIB_FOUND)
|
IF (ZLIB_FOUND)
|
||||||
SET(COLLADA_ZLIB_LIBRARY "${ZLIB_LIBRARY}" CACHE FILEPATH "" FORCE)
|
SET(COLLADA_ZLIB_LIBRARY "${ZLIB_LIBRARY}" CACHE FILEPATH "" FORCE)
|
||||||
@@ -242,7 +244,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY
|
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY
|
||||||
NAMES libboost_filesystem boost_filesystem boost_filesystem-mt libboost_filesystem-${COLLADA_BUILDNAME}0-mt libboost_filesystem-${COLLADA_BUILDNAME}0-mt-1_54 libboost_filesystem-${COLLADA_BUILDNAME}0-mt-1_55
|
NAMES libboost_filesystem boost_filesystem boost_filesystem-mt libboost_filesystem-${COLLADA_BUILDNAME}0-mt libboost_filesystem-${COLLADA_BUILDNAME}0-mt-1_54 libboost_filesystem-${COLLADA_BUILDNAME}0-mt-1_55
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
||||||
@@ -250,7 +252,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY_DEBUG
|
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY_DEBUG
|
||||||
NAMES libboost_filesystem-d boost_filesystem-d boost_filesystem-mt-d libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd-1_54 libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd-1_55
|
NAMES libboost_filesystem-d boost_filesystem-d boost_filesystem-mt-d libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd-1_54 libboost_filesystem-${COLLADA_BUILDNAME}0-mt-gd-1_55
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
||||||
@@ -258,7 +260,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY
|
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY
|
||||||
NAMES libboost_system boost_system boost_system-mt libboost_system-${COLLADA_BUILDNAME}0-mt libboost_system-${COLLADA_BUILDNAME}0-mt-1_54 libboost_system-${COLLADA_BUILDNAME}0-mt-1_55
|
NAMES libboost_system boost_system boost_system-mt libboost_system-${COLLADA_BUILDNAME}0-mt libboost_system-${COLLADA_BUILDNAME}0-mt-1_54 libboost_system-${COLLADA_BUILDNAME}0-mt-1_55
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
||||||
@@ -266,7 +268,7 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY_DEBUG
|
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY_DEBUG
|
||||||
NAMES libboost_system-d boost_system-d boost_system-mt-d libboost_system-${COLLADA_BUILDNAME}0-mt-gd libboost_system-${COLLADA_BUILDNAME}0-mt-gd-1_54 libboost_system-${COLLADA_BUILDNAME}0-mt-gd-1_55
|
NAMES libboost_system-d boost_system-d boost_system-mt-d libboost_system-${COLLADA_BUILDNAME}0-mt-gd libboost_system-${COLLADA_BUILDNAME}0-mt-gd-1_54 libboost_system-${COLLADA_BUILDNAME}0-mt-gd-1_55
|
||||||
PATHS
|
PATHS
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
|
||||||
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
|
||||||
@@ -277,6 +279,20 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
|
|||||||
SET(COLLADA_FOUND "NO")
|
SET(COLLADA_FOUND "NO")
|
||||||
IF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)
|
IF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)
|
||||||
IF (COLLADA_INCLUDE_DIR)
|
IF (COLLADA_INCLUDE_DIR)
|
||||||
|
|
||||||
SET(COLLADA_FOUND "YES")
|
SET(COLLADA_FOUND "YES")
|
||||||
ENDIF(COLLADA_INCLUDE_DIR)
|
|
||||||
ENDIF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)
|
FIND_PATH(COLLADA_INCLUDE_DOMANY_DIR 1.4/dom/domAny.h
|
||||||
|
${COLLADA_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
IF (COLLADA_INCLUDE_DOMANY_DIR)
|
||||||
|
SET(COLLADA_DOM_2_4_OR_LATER TRUE)
|
||||||
|
ELSEIF()
|
||||||
|
SET(COLLADA_DOM_2_4_OR_LATER FALSE)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ ELSEIF(MSVC90)
|
|||||||
SET(FBX_LIBDIR "vs2008")
|
SET(FBX_LIBDIR "vs2008")
|
||||||
ELSEIF(MSVC10)
|
ELSEIF(MSVC10)
|
||||||
SET(FBX_LIBDIR "vs2010")
|
SET(FBX_LIBDIR "vs2010")
|
||||||
ELSEIF(MSVC11 OR MSVC_VERSION>1700)
|
ELSEIF(MSVC11)
|
||||||
SET(FBX_LIBDIR "vs2012")
|
SET(FBX_LIBDIR "vs2012")
|
||||||
|
ELSEIF(MSVC12 OR MSVC_VERSION>1800)
|
||||||
|
SET(FBX_LIBDIR "vs2013")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
@@ -32,6 +34,8 @@ ELSE()
|
|||||||
SET(FBX_LIBDIR ${FBX_LIBDIR}/x86)
|
SET(FBX_LIBDIR ${FBX_LIBDIR}/x86)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
#try to use 2015.1 or 2014.2 version
|
||||||
|
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(FBX_LIBNAME "libfbxsdk")
|
SET(FBX_LIBNAME "libfbxsdk")
|
||||||
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
|
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
@@ -44,10 +48,15 @@ SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
|
|||||||
|
|
||||||
SET( FBX_SEARCH_PATHS
|
SET( FBX_SEARCH_PATHS
|
||||||
$ENV{FBX_DIR}
|
$ENV{FBX_DIR}
|
||||||
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2014.1"
|
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2015.1"
|
||||||
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2014.1"
|
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2015.1"
|
||||||
|
/Applications/Autodesk/FBXSDK20151
|
||||||
|
"$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2014.2"
|
||||||
|
"$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2014.2"
|
||||||
|
/Applications/Autodesk/FBXSDK20142
|
||||||
/Applications/Autodesk/FBXSDK20141
|
/Applications/Autodesk/FBXSDK20141
|
||||||
)
|
)
|
||||||
|
#I think the last line in the search path is an old typo, but let's search for 2014.1 anyway - LV
|
||||||
|
|
||||||
# search for headers & debug/release libraries
|
# search for headers & debug/release libraries
|
||||||
FIND_PATH(FBX_INCLUDE_DIR "fbxsdk.h"
|
FIND_PATH(FBX_INCLUDE_DIR "fbxsdk.h"
|
||||||
@@ -74,21 +83,21 @@ ELSE()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(NOT FBX_FOUND)
|
IF(NOT FBX_FOUND)
|
||||||
#try to use 2013.3 version
|
#try to use 2014.1 version
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
SET(FBX_LIBNAME "fbxsdk-2013.3-static")
|
SET(FBX_LIBNAME "fbxsdk-2014.1")
|
||||||
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
|
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
SET(FBX_LIBNAME "fbxsdk-2013.3-static")
|
SET(FBX_LIBNAME "fbxsdk-2014.1")
|
||||||
ELSE()
|
ELSE()
|
||||||
SET(FBX_LIBNAME "fbxsdk-2013.3-md")
|
SET(FBX_LIBNAME "fbxsdk-2014.1")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
|
SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
|
||||||
|
|
||||||
SET( FBX_SEARCH_PATHS
|
SET( FBX_SEARCH_PATHS
|
||||||
$ENV{FBX_DIR}
|
$ENV{FBX_DIR}
|
||||||
$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2013.3
|
$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2014.1
|
||||||
$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2013.3
|
$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2014.1
|
||||||
/Applications/Autodesk/FBXSDK20141
|
/Applications/Autodesk/FBXSDK20141
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -110,3 +119,41 @@ IF(NOT FBX_FOUND)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(NOT FBX_FOUND)
|
||||||
|
#try to use 2013.3 version
|
||||||
|
IF(APPLE)
|
||||||
|
SET(FBX_LIBNAME "fbxsdk-2013.3-static")
|
||||||
|
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
SET(FBX_LIBNAME "fbxsdk-2013.3-static")
|
||||||
|
ELSE()
|
||||||
|
SET(FBX_LIBNAME "fbxsdk-2013.3-md")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
|
||||||
|
|
||||||
|
SET( FBX_SEARCH_PATHS
|
||||||
|
$ENV{FBX_DIR}
|
||||||
|
$ENV{ProgramW6432}/Autodesk/FBX/FBX SDK/2013.3
|
||||||
|
$ENV{PROGRAMFILES}/Autodesk/FBX/FBX SDK/2013.3
|
||||||
|
/Applications/Autodesk/FBXSDK20133
|
||||||
|
)
|
||||||
|
|
||||||
|
# search for headers & debug/release libraries
|
||||||
|
FIND_PATH(FBX_INCLUDE_DIR "fbxsdk.h"
|
||||||
|
PATHS ${FBX_SEARCH_PATHS}
|
||||||
|
PATH_SUFFIXES "include")
|
||||||
|
FIND_LIBRARY( FBX_LIBRARY ${FBX_LIBNAME}
|
||||||
|
PATHS ${FBX_SEARCH_PATHS}
|
||||||
|
PATH_SUFFIXES "lib/${FBX_LIBDIR}")
|
||||||
|
|
||||||
|
FIND_LIBRARY( FBX_LIBRARY_DEBUG ${FBX_LIBNAME_DEBUG}
|
||||||
|
PATHS ${FBX_SEARCH_PATHS}
|
||||||
|
PATH_SUFFIXES "lib/${FBX_LIBDIR}")
|
||||||
|
IF(FBX_LIBRARY AND FBX_LIBRARY_DEBUG AND FBX_INCLUDE_DIR)
|
||||||
|
SET(FBX_FOUND "YES")
|
||||||
|
ELSE()
|
||||||
|
SET(FBX_FOUND "NO")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
ENDIF()
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
#In OSG ffmpeg plugin, we used "#include <header.h>" for compatibility with old version of ffmpeg
|
#In OSG ffmpeg plugin, we used "#include <header.h>" for compatibility with old version of ffmpeg
|
||||||
#With the new version of FFmpeg, a file named "time.h" was added that breaks compatability with the old version of ffmpeg.
|
#With the new version of FFmpeg, a file named "time.h" was added that breaks compatability with the old version of ffmpeg.
|
||||||
|
|
||||||
#We have to search the path which contain the header.h (usefull for old version)
|
#We have to search the path which contain the header.h (useful for old version)
|
||||||
#and search the path which contain the libname/header.h (usefull for new version)
|
#and search the path which contain the libname/header.h (useful for new version)
|
||||||
|
|
||||||
#Then we need to include ${FFMPEG_libname_INCLUDE_DIRS} (in old version case, use by ffmpeg header and osg plugin code)
|
#Then we need to include ${FFMPEG_libname_INCLUDE_DIRS} (in old version case, use by ffmpeg header and osg plugin code)
|
||||||
# (in new version case, use by ffmpeg header)
|
# (in new version case, use by ffmpeg header)
|
||||||
@@ -32,6 +32,8 @@ MACRO(FFMPEG_FIND varname shortname headername)
|
|||||||
PATHS
|
PATHS
|
||||||
${FFMPEG_ROOT}/include
|
${FFMPEG_ROOT}/include
|
||||||
$ENV{FFMPEG_DIR}/include
|
$ENV{FFMPEG_DIR}/include
|
||||||
|
${FFMPEG_ROOT}
|
||||||
|
$ENV{FFMPEG_DIR}
|
||||||
~/Library/Frameworks
|
~/Library/Frameworks
|
||||||
/Library/Frameworks
|
/Library/Frameworks
|
||||||
/usr/local/include
|
/usr/local/include
|
||||||
@@ -49,6 +51,8 @@ MACRO(FFMPEG_FIND varname shortname headername)
|
|||||||
PATHS
|
PATHS
|
||||||
${FFMPEG_ROOT}/include
|
${FFMPEG_ROOT}/include
|
||||||
$ENV{FFMPEG_DIR}/include
|
$ENV{FFMPEG_DIR}/include
|
||||||
|
${FFMPEG_ROOT}
|
||||||
|
$ENV{FFMPEG_DIR}
|
||||||
~/Library/Frameworks
|
~/Library/Frameworks
|
||||||
/Library/Frameworks
|
/Library/Frameworks
|
||||||
/usr/local/include
|
/usr/local/include
|
||||||
@@ -67,6 +71,8 @@ MACRO(FFMPEG_FIND varname shortname headername)
|
|||||||
PATHS
|
PATHS
|
||||||
${FFMPEG_ROOT}/lib
|
${FFMPEG_ROOT}/lib
|
||||||
$ENV{FFMPEG_DIR}/lib
|
$ENV{FFMPEG_DIR}/lib
|
||||||
|
${FFMPEG_ROOT}/lib${shortname}
|
||||||
|
$ENV{FFMPEG_DIR}/lib${shortname}
|
||||||
~/Library/Frameworks
|
~/Library/Frameworks
|
||||||
/Library/Frameworks
|
/Library/Frameworks
|
||||||
/usr/local/lib
|
/usr/local/lib
|
||||||
@@ -123,11 +129,14 @@ FFMPEG_FIND(LIBAVFORMAT avformat avformat.h)
|
|||||||
FFMPEG_FIND(LIBAVDEVICE avdevice avdevice.h)
|
FFMPEG_FIND(LIBAVDEVICE avdevice avdevice.h)
|
||||||
FFMPEG_FIND(LIBAVCODEC avcodec avcodec.h)
|
FFMPEG_FIND(LIBAVCODEC avcodec avcodec.h)
|
||||||
FFMPEG_FIND(LIBAVUTIL avutil avutil.h)
|
FFMPEG_FIND(LIBAVUTIL avutil avutil.h)
|
||||||
|
FFMPEG_FIND(LIBSWRESAMPLE swresample swresample.h)
|
||||||
|
FFMPEG_FIND(LIBAVRESAMPLE avresample avresample.h)
|
||||||
FFMPEG_FIND(LIBSWSCALE swscale swscale.h) # not sure about the header to look for here.
|
FFMPEG_FIND(LIBSWSCALE swscale swscale.h) # not sure about the header to look for here.
|
||||||
|
|
||||||
SET(FFMPEG_FOUND "NO")
|
SET(FFMPEG_FOUND "NO")
|
||||||
# Note we don't check FFMPEG_LIBSWSCALE_FOUND here, it's optional.
|
# Note we don't check FFMPEG_LIBSWSCALE_FOUND here, it's optional.
|
||||||
IF (FFMPEG_LIBAVFORMAT_FOUND AND FFMPEG_LIBAVDEVICE_FOUND AND FFMPEG_LIBAVCODEC_FOUND AND FFMPEG_LIBAVUTIL_FOUND AND STDINT_OK)
|
IF (FFMPEG_LIBAVFORMAT_FOUND AND FFMPEG_LIBAVDEVICE_FOUND AND FFMPEG_LIBAVCODEC_FOUND AND FFMPEG_LIBAVUTIL_FOUND AND STDINT_OK
|
||||||
|
AND ( FFMPEG_LIBSWRESAMPLE_FOUND OR FFMPEG_LIBAVRESAMPLE_FOUND ) )
|
||||||
|
|
||||||
SET(FFMPEG_FOUND "YES")
|
SET(FFMPEG_FOUND "YES")
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,15 @@
|
|||||||
#
|
#
|
||||||
# Created by Robert Osfield.
|
# Created by Robert Osfield.
|
||||||
|
|
||||||
|
# prefer FindFLTK from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindFLTK.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindFLTK.cmake)
|
||||||
|
|
||||||
|
if(FLTK_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
FIND_PATH(FLTK_INCLUDE_DIR Fl/Fl.H Fl/Fl.h
|
FIND_PATH(FLTK_INCLUDE_DIR Fl/Fl.H Fl/Fl.h
|
||||||
$ENV{FLTK_DIR}/include
|
$ENV{FLTK_DIR}/include
|
||||||
$ENV{FLTK_DIR}
|
$ENV{FLTK_DIR}
|
||||||
|
|||||||
@@ -12,6 +12,15 @@
|
|||||||
# used in building FREETYPE.
|
# used in building FREETYPE.
|
||||||
# Created by Eric Wing.
|
# Created by Eric Wing.
|
||||||
|
|
||||||
|
# prefer FindFreetype from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindFreetype.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindFreetype.cmake)
|
||||||
|
|
||||||
|
if(FREETYPE_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# Ugh, FreeType seems to use some #include trickery which
|
# Ugh, FreeType seems to use some #include trickery which
|
||||||
# makes this harder than it should be. It looks like they
|
# makes this harder than it should be. It looks like they
|
||||||
# put ft2build.h in a common/easier-to-find location which
|
# put ft2build.h in a common/easier-to-find location which
|
||||||
@@ -24,6 +33,7 @@
|
|||||||
# wants explicit full paths and this trickery doesn't work too well.
|
# wants explicit full paths and this trickery doesn't work too well.
|
||||||
# I'm going to attempt to cut out the middleman and hope
|
# I'm going to attempt to cut out the middleman and hope
|
||||||
# everything still works.
|
# everything still works.
|
||||||
|
|
||||||
FIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h
|
FIND_PATH(FREETYPE_INCLUDE_DIR_ft2build ft2build.h
|
||||||
PATHS
|
PATHS
|
||||||
$ENV{FREETYPE_DIR}
|
$ENV{FREETYPE_DIR}
|
||||||
|
|||||||
@@ -19,6 +19,15 @@
|
|||||||
# This makes the presumption that you are include gdal.h like
|
# This makes the presumption that you are include gdal.h like
|
||||||
# #include "gdal.h"
|
# #include "gdal.h"
|
||||||
|
|
||||||
|
# prefer FindGDAL from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindGDAL.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindGDAL.cmake)
|
||||||
|
|
||||||
|
if(GDAL_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
FIND_PATH(GDAL_INCLUDE_DIR gdal.h
|
FIND_PATH(GDAL_INCLUDE_DIR gdal.h
|
||||||
PATHS
|
PATHS
|
||||||
$ENV{GDAL_DIR}
|
$ENV{GDAL_DIR}
|
||||||
|
|||||||
36
CMakeModules/FindGLCORE.cmake
Normal file
36
CMakeModules/FindGLCORE.cmake
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Finds the OpenGL Core Profile (cp) header file.
|
||||||
|
# Looks for glcorearb.h
|
||||||
|
#
|
||||||
|
# This script defines the following:
|
||||||
|
# GLCORE_FOUND // Set to TRUE if glcorearb.h is found
|
||||||
|
# GLCORE_INCLUDE_DIR // Parent directory of directory (gl, GL3, or OpenGL) containing the CP header.
|
||||||
|
# GLCORE_GLCOREARB_HEADER // advanced
|
||||||
|
#
|
||||||
|
# GLCORE_ROOT can be set as an environment variable or a CMake variable,
|
||||||
|
# to the parent directory of the gl, GL3, or OpenGL directory containing the CP header.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
FIND_PATH( GLCORE_GLCOREARB_HEADER
|
||||||
|
NAMES GL/glcorearb.h GL3/glcorearb.h OpenGL/glcorearb.h gl/glcorearb.h
|
||||||
|
HINTS ${GLCORE_ROOT}
|
||||||
|
PATHS ENV GLCORE_ROOT
|
||||||
|
)
|
||||||
|
|
||||||
|
set( GLCORE_INCLUDE_DIR )
|
||||||
|
if( GLCORE_GLCOREARB_HEADER )
|
||||||
|
set( GLCORE_INCLUDE_DIR ${GLCORE_GLCOREARB_HEADER} )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set
|
||||||
|
# GLCORE_FOUND to TRUE as appropriate
|
||||||
|
INCLUDE( FindPackageHandleStandardArgs )
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS( GLCORE
|
||||||
|
"Set GLCORE_ROOT as the parent of the directory containing the OpenGL core profile header."
|
||||||
|
GLCORE_INCLUDE_DIR )
|
||||||
|
|
||||||
|
MARK_AS_ADVANCED(
|
||||||
|
GLCORE_INCLUDE_DIR
|
||||||
|
GLCORE_GLCOREARB_HEADER
|
||||||
|
)
|
||||||
142
CMakeModules/FindGLIB.cmake
Normal file
142
CMakeModules/FindGLIB.cmake
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
# - Try to find Glib and its components (gio, gobject etc)
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# GLIB_FOUND - system has Glib
|
||||||
|
# GLIB_INCLUDE_DIRS - the Glib include directories
|
||||||
|
# GLIB_LIBRARIES - link these to use Glib
|
||||||
|
#
|
||||||
|
# Optionally, the COMPONENTS keyword can be passed to find_package()
|
||||||
|
# and Glib components can be looked for. Currently, the following
|
||||||
|
# components can be used, and they define the following variables if
|
||||||
|
# found:
|
||||||
|
#
|
||||||
|
# gio: GLIB_GIO_LIBRARIES
|
||||||
|
# gobject: GLIB_GOBJECT_LIBRARIES
|
||||||
|
# gmodule: GLIB_GMODULE_LIBRARIES
|
||||||
|
# gthread: GLIB_GTHREAD_LIBRARIES
|
||||||
|
#
|
||||||
|
# Note that the respective _INCLUDE_DIR variables are not set, since
|
||||||
|
# all headers are in the same directory as GLIB_INCLUDE_DIRS.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
|
||||||
|
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
|
||||||
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
find_library(GLIB_LIBRARIES
|
||||||
|
NAMES glib-2.0
|
||||||
|
PATHS C:/gstreamer/1.0/x86_64/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
else ()
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(PC_GLIB QUIET glib-2.0)
|
||||||
|
|
||||||
|
find_library(GLIB_LIBRARIES
|
||||||
|
NAMES glib-2.0
|
||||||
|
HINTS ${PC_GLIB_LIBDIR}
|
||||||
|
${PC_GLIB_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# Files in glib's main include path may include glibconfig.h, which,
|
||||||
|
# for some odd reason, is normally in $LIBDIR/glib-2.0/include.
|
||||||
|
get_filename_component(_GLIB_LIBRARY_DIR ${GLIB_LIBRARIES} PATH)
|
||||||
|
|
||||||
|
find_path(GLIBCONFIG_INCLUDE_DIR
|
||||||
|
NAMES glibconfig.h
|
||||||
|
HINTS ${PC_LIBDIR} ${PC_LIBRARY_DIRS} ${_GLIB_LIBRARY_DIR}
|
||||||
|
PATH_SUFFIXES glib-2.0/include
|
||||||
|
)
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
find_path(GLIB_INCLUDE_DIR
|
||||||
|
NAMES glib.h
|
||||||
|
PATHS C:/gstreamer/1.0/x86_64/include
|
||||||
|
PATH_SUFFIXES glib-2.0
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
find_path(GLIB_INCLUDE_DIR
|
||||||
|
NAMES glib.h
|
||||||
|
HINTS ${PC_GLIB_INCLUDEDIR}
|
||||||
|
${PC_GLIB_INCLUDE_DIRS}
|
||||||
|
PATH_SUFFIXES glib-2.0
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (GLIBCONFIG_INCLUDE_DIR)
|
||||||
|
|
||||||
|
set(GLIB_INCLUDE_DIRS ${GLIB_INCLUDE_DIR} ${GLIBCONFIG_INCLUDE_DIR})
|
||||||
|
|
||||||
|
# Version detection
|
||||||
|
file(READ "${GLIBCONFIG_INCLUDE_DIR}/glibconfig.h" GLIBCONFIG_H_CONTENTS)
|
||||||
|
string(REGEX MATCH "#define GLIB_MAJOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
|
||||||
|
set(GLIB_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
||||||
|
string(REGEX MATCH "#define GLIB_MINOR_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
|
||||||
|
set(GLIB_VERSION_MINOR "${CMAKE_MATCH_1}")
|
||||||
|
string(REGEX MATCH "#define GLIB_MICRO_VERSION ([0-9]+)" _dummy "${GLIBCONFIG_H_CONTENTS}")
|
||||||
|
set(GLIB_VERSION_MICRO "${CMAKE_MATCH_1}")
|
||||||
|
set(GLIB_VERSION "${GLIB_VERSION_MAJOR}.${GLIB_VERSION_MINOR}.${GLIB_VERSION_MICRO}")
|
||||||
|
|
||||||
|
# Additional Glib components. We only look for libraries, as not all of them
|
||||||
|
# have corresponding headers and all headers are installed alongside the main
|
||||||
|
# glib ones.
|
||||||
|
foreach (_component ${GLIB_FIND_COMPONENTS})
|
||||||
|
if (${_component} STREQUAL "gio")
|
||||||
|
find_library(GLIB_GIO_LIBRARIES NAMES gio-2.0 HINTS ${_GLIB_LIBRARY_DIR})
|
||||||
|
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GIO_LIBRARIES)
|
||||||
|
elseif (${_component} STREQUAL "gobject")
|
||||||
|
find_library(GLIB_GOBJECT_LIBRARIES NAMES gobject-2.0 HINTS ${_GLIB_LIBRARY_DIR})
|
||||||
|
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GOBJECT_LIBRARIES)
|
||||||
|
elseif (${_component} STREQUAL "gmodule")
|
||||||
|
find_library(GLIB_GMODULE_LIBRARIES NAMES gmodule-2.0 HINTS ${_GLIB_LIBRARY_DIR})
|
||||||
|
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GMODULE_LIBRARIES)
|
||||||
|
elseif (${_component} STREQUAL "gthread")
|
||||||
|
find_library(GLIB_GTHREAD_LIBRARIES NAMES gthread-2.0 HINTS ${_GLIB_LIBRARY_DIR})
|
||||||
|
set(ADDITIONAL_REQUIRED_VARS ${ADDITIONAL_REQUIRED_VARS} GLIB_GTHREAD_LIBRARIES)
|
||||||
|
elseif (${_component} STREQUAL "gio-unix")
|
||||||
|
# gio-unix is compiled as part of the gio library, but the include paths
|
||||||
|
# are separate from the shared glib ones. Since this is currently only used
|
||||||
|
# by WebKitGTK+ we don't go to extraordinary measures beyond pkg-config.
|
||||||
|
pkg_check_modules(GIO_UNIX QUIET gio-unix-2.0)
|
||||||
|
endif ()
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLIB REQUIRED_VARS GLIB_INCLUDE_DIRS GLIB_LIBRARIES ${ADDITIONAL_REQUIRED_VARS}
|
||||||
|
VERSION_VAR GLIB_VERSION)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
GLIBCONFIG_INCLUDE_DIR
|
||||||
|
GLIB_GIO_LIBRARIES
|
||||||
|
GLIB_GIO_UNIX_LIBRARIES
|
||||||
|
GLIB_GMODULE_LIBRARIES
|
||||||
|
GLIB_GOBJECT_LIBRARIES
|
||||||
|
GLIB_GTHREAD_LIBRARIES
|
||||||
|
GLIB_INCLUDE_DIR
|
||||||
|
GLIB_INCLUDE_DIRS
|
||||||
|
GLIB_LIBRARIES
|
||||||
|
)
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
endif ()
|
||||||
174
CMakeModules/FindGStreamer.cmake
Normal file
174
CMakeModules/FindGStreamer.cmake
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
# - Try to find GStreamer and its plugins
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# GSTREAMER_FOUND - system has GStreamer
|
||||||
|
# GSTREAMER_INCLUDE_DIRS - the GStreamer include directories
|
||||||
|
# GSTREAMER_LIBRARIES - link these to use GStreamer
|
||||||
|
#
|
||||||
|
# Additionally, gstreamer-base is always looked for and required, and
|
||||||
|
# the following related variables are defined:
|
||||||
|
#
|
||||||
|
# GSTREAMER_BASE_INCLUDE_DIRS - gstreamer-base's include directory
|
||||||
|
# GSTREAMER_BASE_LIBRARIES - link to these to use gstreamer-base
|
||||||
|
#
|
||||||
|
# Optionally, the COMPONENTS keyword can be passed to find_package()
|
||||||
|
# and GStreamer plugins can be looked for. Currently, the following
|
||||||
|
# plugins can be searched, and they define the following variables if
|
||||||
|
# found:
|
||||||
|
#
|
||||||
|
# gstreamer-app: GSTREAMER_APP_INCLUDE_DIRS and GSTREAMER_APP_LIBRARIES
|
||||||
|
# gstreamer-audio: GSTREAMER_AUDIO_INCLUDE_DIRS and GSTREAMER_AUDIO_LIBRARIES
|
||||||
|
# gstreamer-fft: GSTREAMER_FFT_INCLUDE_DIRS and GSTREAMER_FFT_LIBRARIES
|
||||||
|
# gstreamer-pbutils: GSTREAMER_PBUTILS_INCLUDE_DIRS and GSTREAMER_PBUTILS_LIBRARIES
|
||||||
|
# gstreamer-video: GSTREAMER_VIDEO_INCLUDE_DIRS and GSTREAMER_VIDEO_LIBRARIES
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
|
||||||
|
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
|
||||||
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# Helper macro to find a GStreamer plugin (or GStreamer itself)
|
||||||
|
# _component_prefix is prepended to the _INCLUDE_DIRS and _LIBRARIES variables (eg. "GSTREAMER_AUDIO")
|
||||||
|
# _pkgconfig_name is the component's pkg-config name (eg. "gstreamer-1.0", or "gstreamer-video-1.0").
|
||||||
|
# _header is the component's header, relative to the gstreamer-1.0 directory (eg. "gst/gst.h").
|
||||||
|
# _library is the component's library name (eg. "gstreamer-1.0" or "gstvideo-1.0")
|
||||||
|
#macro(FIND_GSTREAMER_COMPONENT _component_prefix _pkgconfig_name _header _library)
|
||||||
|
# pkg_check_modules(PC_${_component_prefix} QUIET ${_pkgconfig_name})
|
||||||
|
#
|
||||||
|
# find_path(${_component_prefix}_INCLUDE_DIRS
|
||||||
|
# NAMES ${_header}
|
||||||
|
# HINTS ${PC_${_component_prefix}_INCLUDE_DIRS} ${PC_${_component_prefix}_INCLUDEDIR}
|
||||||
|
# PATH_SUFFIXES gstreamer-1.0
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# find_library(${_component_prefix}_LIBRARIES
|
||||||
|
# NAMES ${_library}
|
||||||
|
# HINTS ${PC_${_component_prefix}_LIBRARY_DIRS} ${PC_${_component_prefix}_LIBDIR}
|
||||||
|
# )
|
||||||
|
#endmacro()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
macro(FIND_GSTREAMER_COMPONENT _component_prefix _pkgconfig_name _header _library)
|
||||||
|
find_path(${_component_prefix}_INCLUDE_DIRS
|
||||||
|
NAMES ${_header}
|
||||||
|
PATHS C:/gstreamer/1.0/x86_64/include
|
||||||
|
PATH_SUFFIXES gstreamer-1.0
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(${_component_prefix}_LIBRARIES
|
||||||
|
NAMES ${_library}
|
||||||
|
PATHS C:/gstreamer/1.0/x86_64/lib
|
||||||
|
)
|
||||||
|
endmacro()
|
||||||
|
else ()
|
||||||
|
|
||||||
|
find_package(PkgConfig)
|
||||||
|
|
||||||
|
macro(FIND_GSTREAMER_COMPONENT _component_prefix _pkgconfig_name _header _library)
|
||||||
|
pkg_check_modules(${_component_prefix} QUIET ${_pkgconfig_name})
|
||||||
|
|
||||||
|
# find_path(${_component_prefix}_INCLUDE_DIRS
|
||||||
|
# NAMES ${_header}
|
||||||
|
# HINTS ${PC_${_component_prefix}_INCLUDE_DIRS} ${PC_${_component_prefix}_INCLUDEDIR}
|
||||||
|
# PATH_SUFFIXES gstreamer-1.0
|
||||||
|
# )
|
||||||
|
|
||||||
|
# find_library(${_component_prefix}_LIBRARIES
|
||||||
|
# NAMES ${_library}
|
||||||
|
# HINTS ${PC_${_component_prefix}_LIBRARY_DIRS} ${PC_${_component_prefix}_LIBDIR}
|
||||||
|
# )
|
||||||
|
endmacro()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# ------------------------
|
||||||
|
# 1. Find GStreamer itself
|
||||||
|
# ------------------------
|
||||||
|
|
||||||
|
# 1.1. Find headers and libraries
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER gstreamer-1.0 gst/gst.h gstreamer-1.0)
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_BASE gstreamer-base-1.0 gst/gst.h gstbase-1.0)
|
||||||
|
|
||||||
|
|
||||||
|
# 1.2. Check GStreamer version
|
||||||
|
if (GSTREAMER_INCLUDE_DIRS)
|
||||||
|
if (EXISTS "${GSTREAMER_INCLUDE_DIRS}/gst/gstversion.h")
|
||||||
|
file(READ "${GSTREAMER_INCLUDE_DIRS}/gst/gstversion.h" GSTREAMER_VERSION_CONTENTS)
|
||||||
|
|
||||||
|
string(REGEX MATCH "#define +GST_VERSION_MAJOR +\\(([0-9]+)\\)" _dummy "${GSTREAMER_VERSION_CONTENTS}")
|
||||||
|
set(GSTREAMER_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
||||||
|
|
||||||
|
string(REGEX MATCH "#define +GST_VERSION_MINOR +\\(([0-9]+)\\)" _dummy "${GSTREAMER_VERSION_CONTENTS}")
|
||||||
|
set(GSTREAMER_VERSION_MINOR "${CMAKE_MATCH_1}")
|
||||||
|
|
||||||
|
string(REGEX MATCH "#define +GST_VERSION_MICRO +\\(([0-9]+)\\)" _dummy "${GSTREAMER_VERSION_CONTENTS}")
|
||||||
|
set(GSTREAMER_VERSION_MICRO "${CMAKE_MATCH_1}")
|
||||||
|
|
||||||
|
set(GSTREAMER_VERSION "${GSTREAMER_VERSION_MAJOR}.${GSTREAMER_VERSION_MINOR}.${GSTREAMER_VERSION_MICRO}")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
if ("${GStreamer_FIND_VERSION}" VERSION_GREATER "${GSTREAMER_VERSION}")
|
||||||
|
message(FATAL_ERROR "Required version (" ${GStreamer_FIND_VERSION} ") is higher than found version (" ${GSTREAMER_VERSION} ")")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
# -------------------------
|
||||||
|
# 2. Find GStreamer plugins
|
||||||
|
# -------------------------
|
||||||
|
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_APP gstreamer-app-1.0 gst/app/gstappsink.h gstapp-1.0)
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_AUDIO gstreamer-audio-1.0 gst/audio/audio.h gstaudio-1.0)
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_FFT gstreamer-fft-1.0 gst/fft/gstfft.h gstfft-1.0)
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_PBUTILS gstreamer-pbutils-1.0 gst/pbutils/pbutils.h gstpbutils-1.0)
|
||||||
|
FIND_GSTREAMER_COMPONENT(GSTREAMER_VIDEO gstreamer-video-1.0 gst/video/video.h gstvideo-1.0)
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
# 3. Process the COMPONENTS passed to FIND_PACKAGE
|
||||||
|
# ------------------------------------------------
|
||||||
|
set(_GSTREAMER_REQUIRED_VARS GSTREAMER_INCLUDE_DIRS GSTREAMER_LIBRARIES GSTREAMER_VERSION GSTREAMER_BASE_INCLUDE_DIRS GSTREAMER_BASE_LIBRARIES)
|
||||||
|
|
||||||
|
foreach (_component ${GStreamer_FIND_COMPONENTS})
|
||||||
|
set(_gst_component "GSTREAMER_${_component}")
|
||||||
|
string(TOUPPER ${_gst_component} _UPPER_NAME)
|
||||||
|
|
||||||
|
list(APPEND _GSTREAMER_REQUIRED_VARS ${_UPPER_NAME}_INCLUDE_DIRS ${_UPPER_NAME}_LIBRARIES)
|
||||||
|
endforeach ()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GStreamer REQUIRED_VARS ${_GSTREAMER_REQUIRED_VARS}
|
||||||
|
VERSION_VAR GSTREAMER_VERSION)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
GSTREAMER_APP_INCLUDE_DIRS
|
||||||
|
GSTREAMER_APP_LIBRARIES
|
||||||
|
GSTREAMER_AUDIO_INCLUDE_DIRS
|
||||||
|
GSTREAMER_AUDIO_LIBRARIES
|
||||||
|
GSTREAMER_BASE_INCLUDE_DIRS
|
||||||
|
GSTREAMER_BASE_LIBRARIES
|
||||||
|
GSTREAMER_FFT_INCLUDE_DIRS
|
||||||
|
GSTREAMER_FFT_LIBRARIES
|
||||||
|
GSTREAMER_INCLUDE_DIRS
|
||||||
|
GSTREAMER_LIBRARIES
|
||||||
|
GSTREAMER_PBUTILS_INCLUDE_DIRS
|
||||||
|
GSTREAMER_PBUTILS_LIBRARIES
|
||||||
|
GSTREAMER_VIDEO_INCLUDE_DIRS
|
||||||
|
GSTREAMER_VIDEO_LIBRARIES
|
||||||
|
)
|
||||||
@@ -9,6 +9,15 @@
|
|||||||
#
|
#
|
||||||
# Created by Robert Osfield.
|
# Created by Robert Osfield.
|
||||||
|
|
||||||
|
# prefer FindJasper from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindJasper.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindJasper.cmake)
|
||||||
|
|
||||||
|
if(JASPER_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
FIND_PATH(JASPER_INCLUDE_DIR jasper/jasper.h
|
FIND_PATH(JASPER_INCLUDE_DIR jasper/jasper.h
|
||||||
$ENV{JASPER_DIR}/include
|
$ENV{JASPER_DIR}/include
|
||||||
$ENV{JASPER_DIR}/src/libjasper/include
|
$ENV{JASPER_DIR}/src/libjasper/include
|
||||||
|
|||||||
107
CMakeModules/FindLIBLAS.cmake
Normal file
107
CMakeModules/FindLIBLAS.cmake
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
#---
|
||||||
|
# File: FindLIBLAS.cmake
|
||||||
|
#
|
||||||
|
# Find the native LIBLAS includes and library
|
||||||
|
#
|
||||||
|
# LIBLAS_INCLUDE_DIRS - where to find liblas's includes.
|
||||||
|
# LIBLAS_LIBRARIES - List of libraries when using liblas.
|
||||||
|
# LIBLAS_FOUND - True if liblas found.
|
||||||
|
#---
|
||||||
|
|
||||||
|
|
||||||
|
# Set the include dir:
|
||||||
|
find_path(LIBLAS_INCLUDE_DIR liblas/liblas.hpp)
|
||||||
|
|
||||||
|
# Macro for setting libraries:
|
||||||
|
macro(FIND_LIBLAS_LIBRARY MYLIBRARY MYLIBRARYNAME)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
"${MYLIBRARY}_DEBUG"
|
||||||
|
NAMES "${MYLIBRARYNAME}${CMAKE_DEBUG_POSTFIX}"
|
||||||
|
PATHS
|
||||||
|
${LIBLAS_DIR}/lib/Debug
|
||||||
|
${LIBLAS_DIR}/lib64/Debug
|
||||||
|
${LIBLAS_DIR}/lib
|
||||||
|
${LIBLAS_DIR}/lib64
|
||||||
|
$ENV{LIBLAS_DIR}/lib/debug
|
||||||
|
$ENV{LIBLAS_DIR}/lib64/debug
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
"${MYLIBRARY}_DEBUG"
|
||||||
|
NAMES "${MYLIBRARYNAME}${CMAKE_DEBUG_POSTFIX}"
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/lib
|
||||||
|
/usr/lib64
|
||||||
|
/sw/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;LIBLAS_ROOT]/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
${MYLIBRARY}
|
||||||
|
NAMES "${MYLIBRARYNAME}${CMAKE_RELEASE_POSTFIX}"
|
||||||
|
PATHS
|
||||||
|
${LIBLAS_DIR}/lib/Release
|
||||||
|
${LIBLAS_DIR}/lib64/Release
|
||||||
|
${LIBLAS_DIR}/lib
|
||||||
|
${LIBLAS_DIR}/lib64
|
||||||
|
$ENV{LIBLAS_DIR}/lib/Release
|
||||||
|
$ENV{LIBLAS_DIR}/lib64/Release
|
||||||
|
$ENV{LIBLAS_DIR}/lib
|
||||||
|
$ENV{LIBLAS_DIR}/lib64
|
||||||
|
$ENV{LIBLAS_DIR}
|
||||||
|
$ENV{LIBLASDIR}/lib
|
||||||
|
$ENV{LIBLASDIR}/lib64
|
||||||
|
$ENV{LIBLASDIR}
|
||||||
|
$ENV{LIBLAS_ROOT}/lib
|
||||||
|
$ENV{LIBLAS_ROOT}/lib64
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
${MYLIBRARY}
|
||||||
|
NAMES "${MYLIBRARYNAME}${CMAKE_RELEASE_POSTFIX}"
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/local/lib64
|
||||||
|
/usr/lib
|
||||||
|
/usr/lib64
|
||||||
|
/sw/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;LIBLAS_ROOT]/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
if( NOT ${MYLIBRARY}_DEBUG )
|
||||||
|
if( MYLIBRARY )
|
||||||
|
set( ${MYLIBRARY}_DEBUG ${MYLIBRARY} )
|
||||||
|
endif(MYLIBRARY)
|
||||||
|
endif( NOT ${MYLIBRARY}_DEBUG )
|
||||||
|
|
||||||
|
endmacro(FIND_LIBLAS_LIBRARY LIBRARY LIBRARYNAME)
|
||||||
|
|
||||||
|
FIND_LIBLAS_LIBRARY(LIBLAS_LIBRARY las)
|
||||||
|
FIND_LIBLAS_LIBRARY(LIBLASC_LIBRARY las_c)
|
||||||
|
|
||||||
|
set(LIBLAS_FOUND "NO")
|
||||||
|
if(LIBLAS_LIBRARY AND LIBLASC_LIBRARY AND LIBLAS_INCLUDE_DIR)
|
||||||
|
|
||||||
|
FIND_PACKAGE(Boost) # used by LIBLAS
|
||||||
|
if(Boost_FOUND)
|
||||||
|
set(LIBLAS_LIBRARIES ${LIBLAS_LIBRARY} ${LIBLASC_LIBRARY} )
|
||||||
|
set(LIBLAS_FOUND "YES")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
83
CMakeModules/FindLua52.cmake
Normal file
83
CMakeModules/FindLua52.cmake
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# Locate Lua library
|
||||||
|
# This module defines
|
||||||
|
# LUA51_FOUND, if false, do not try to link to Lua
|
||||||
|
# LUA_LIBRARIES
|
||||||
|
# LUA_INCLUDE_DIR, where to find lua.h
|
||||||
|
# LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
|
||||||
|
#
|
||||||
|
# Note that the expected include convention is
|
||||||
|
# #include "lua.h"
|
||||||
|
# and not
|
||||||
|
# #include <lua/lua.h>
|
||||||
|
# This is because, the lua location is not standardized and may exist
|
||||||
|
# in locations other than lua/
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2007-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 distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
find_path(LUA_INCLUDE_DIR lua.h
|
||||||
|
HINTS
|
||||||
|
ENV LUA_DIR
|
||||||
|
PATH_SUFFIXES include/lua52 include/lua5.2 include/lua include
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/sw # Fink
|
||||||
|
/opt/local # DarwinPorts
|
||||||
|
/opt/csw # Blastwave
|
||||||
|
/opt
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LUA_LIBRARY
|
||||||
|
NAMES lua52 lua5.2 lua-5.2 lua
|
||||||
|
HINTS
|
||||||
|
ENV LUA_DIR
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
PATHS
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/sw
|
||||||
|
/opt/local
|
||||||
|
/opt/csw
|
||||||
|
/opt
|
||||||
|
)
|
||||||
|
|
||||||
|
if(LUA_LIBRARY)
|
||||||
|
# include the math library for Unix
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
find_library(LUA_MATH_LIBRARY m)
|
||||||
|
set( LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}" CACHE STRING "Lua Libraries")
|
||||||
|
# For Windows and Mac, don't need to explicitly include the math library
|
||||||
|
else()
|
||||||
|
set( LUA_LIBRARIES "${LUA_LIBRARY}" CACHE STRING "Lua Libraries")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
|
||||||
|
file(STRINGS "${LUA_INCLUDE_DIR}/lua.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua .+\"")
|
||||||
|
|
||||||
|
string(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
|
||||||
|
unset(lua_version_str)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
|
||||||
|
# all listed variables are TRUE
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua52
|
||||||
|
REQUIRED_VARS LUA_LIBRARIES LUA_INCLUDE_DIR
|
||||||
|
VERSION_VAR LUA_VERSION_STRING)
|
||||||
|
|
||||||
|
mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARIES LUA_LIBRARY LUA_MATH_LIBRARY)
|
||||||
|
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#
|
#
|
||||||
# Created by Robert Osfield.
|
# Created by Robert Osfield.
|
||||||
|
|
||||||
|
|
||||||
FIND_PATH(OPENEXR_INCLUDE_DIR OpenEXR/ImfIO.h
|
FIND_PATH(OPENEXR_INCLUDE_DIR OpenEXR/ImfIO.h
|
||||||
$ENV{OPENEXR_DIR}/include
|
$ENV{OPENEXR_DIR}/include
|
||||||
$ENV{OPENEXR_DIR}
|
$ENV{OPENEXR_DIR}
|
||||||
@@ -23,78 +24,41 @@ FIND_PATH(OPENEXR_INCLUDE_DIR OpenEXR/ImfIO.h
|
|||||||
/usr/freeware/include
|
/usr/freeware/include
|
||||||
)
|
)
|
||||||
|
|
||||||
FIND_LIBRARY(OPENEXR_IlmIlf_LIBRARY
|
# Macro to find exr libraries (deduplicating search paths)
|
||||||
NAMES IlmImf
|
# example: OPENEXR_FIND_VAR(OPENEXR_IlmImf_LIBRARY IlmImf)
|
||||||
PATHS
|
MACRO(OPENEXR_FIND_VAR varname libname)
|
||||||
$ENV{OPENEXR_DIR}/lib
|
FIND_LIBRARY( ${varname}
|
||||||
$ENV{OPENEXR_DIR}
|
NAMES ${libname}
|
||||||
~/Library/Frameworks
|
PATHS
|
||||||
/Library/Frameworks
|
$ENV{OPENEXR_DIR}/lib
|
||||||
/usr/local/lib
|
$ENV{OPENEXR_DIR}
|
||||||
/usr/lib
|
~/Library/Frameworks
|
||||||
/sw/lib
|
/Library/Frameworks
|
||||||
/opt/local/lib
|
/usr/local/lib
|
||||||
/opt/csw/lib
|
/usr/lib
|
||||||
/opt/lib
|
/sw/lib
|
||||||
/usr/freeware/lib64
|
/opt/local/lib
|
||||||
)
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
ENDMACRO(OPENEXR_FIND_VAR)
|
||||||
|
|
||||||
FIND_LIBRARY(OPENEXR_IlmThread_LIBRARY
|
# Macro to find exr libraries (and debug versions)
|
||||||
NAMES IlmThread
|
# example: OPENEXR_FIND(IlmImf)
|
||||||
PATHS
|
MACRO(OPENEXR_FIND libname)
|
||||||
$ENV{OPENEXR_DIR}/lib
|
OPENEXR_FIND_VAR(OPENEXR_${libname}_LIBRARY ${libname})
|
||||||
$ENV{OPENEXR_DIR}
|
OPENEXR_FIND_VAR(OPENEXR_${libname}_LIBRARY_DEBUG ${libname}d)
|
||||||
~/Library/Frameworks
|
ENDMACRO(OPENEXR_FIND)
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
|
OPENEXR_FIND(IlmImf)
|
||||||
FIND_LIBRARY(OPENEXR_Iex_LIBRARY
|
OPENEXR_FIND(IlmThread)
|
||||||
NAMES Iex
|
OPENEXR_FIND(Iex)
|
||||||
PATHS
|
OPENEXR_FIND(Half)
|
||||||
$ENV{OPENEXR_DIR}/lib
|
|
||||||
$ENV{OPENEXR_DIR}
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(OPENEXR_Half_LIBRARY
|
|
||||||
NAMES Half
|
|
||||||
PATHS
|
|
||||||
$ENV{OPENEXR_DIR}/lib
|
|
||||||
$ENV{OPENEXR_DIR}
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
SET(OPENEXR_FOUND "NO")
|
SET(OPENEXR_FOUND "NO")
|
||||||
IF(OPENEXR_INCLUDE_DIR AND OPENEXR_IlmIlf_LIBRARY AND OPENEXR_IlmThread_LIBRARY AND OPENEXR_Iex_LIBRARY AND OPENEXR_Half_LIBRARY)
|
IF(OPENEXR_INCLUDE_DIR AND OPENEXR_IlmImf_LIBRARY AND OPENEXR_IlmThread_LIBRARY AND OPENEXR_Iex_LIBRARY AND OPENEXR_Half_LIBRARY)
|
||||||
SET(OPENEXR_LIBRARIES
|
SET(OPENEXR_LIBRARIES ${OPENEXR_IlmImf_LIBRARY} ${OPENEXR_IlmThread_LIBRARY} ${OPENEXR_Half_LIBRARY} ${OPENEXR_Iex_LIBRARY} )
|
||||||
${OPENEXR_IlmIlf_LIBRARY}
|
SET(OPENEXR_LIBRARIES_VARS OPENEXR_IlmImf_LIBRARY OPENEXR_IlmThread_LIBRARY OPENEXR_Half_LIBRARY OPENEXR_Iex_LIBRARY )
|
||||||
${OPENEXR_IlmThread_LIBRARY}
|
|
||||||
${OPENEXR_Half_LIBRARY}
|
|
||||||
${OPENEXR_Iex_LIBRARY}
|
|
||||||
)
|
|
||||||
SET(OPENEXR_FOUND "YES")
|
SET(OPENEXR_FOUND "YES")
|
||||||
ENDIF(OPENEXR_INCLUDE_DIR AND OPENEXR_IlmIlf_LIBRARY AND OPENEXR_IlmThread_LIBRARY AND OPENEXR_Iex_LIBRARY AND OPENEXR_Half_LIBRARY)
|
ENDIF(OPENEXR_INCLUDE_DIR AND OPENEXR_IlmImf_LIBRARY AND OPENEXR_IlmThread_LIBRARY AND OPENEXR_Iex_LIBRARY AND OPENEXR_Half_LIBRARY)
|
||||||
|
|||||||
@@ -17,6 +17,16 @@
|
|||||||
#
|
#
|
||||||
# Created by Eric Wing.
|
# Created by Eric Wing.
|
||||||
|
|
||||||
|
# prefer FindOpenThreads from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindOpenThreads.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindOpenThreads.cmake)
|
||||||
|
|
||||||
|
if(OPENTHREADS_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# Header files are presumed to be included like
|
# Header files are presumed to be included like
|
||||||
# #include <OpenThreads/Thread>
|
# #include <OpenThreads/Thread>
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
# Locate QuickTime
|
# Locate QuickTime
|
||||||
# This module defines
|
# This module defines
|
||||||
# QUICKTIME_LIBRARY
|
# QUICKTIME_LIBRARY
|
||||||
# QUICKTIME_FOUND, if false, do not try to link to gdal
|
# QUICKTIME_FOUND, if false, do not try to link to gdal
|
||||||
# QUICKTIME_INCLUDE_DIR, where to find the headers
|
# QUICKTIME_INCLUDE_DIR, where to find the headers
|
||||||
#
|
#
|
||||||
# $QUICKTIME_DIR is an environment variable that would
|
# $QUICKTIME_DIR is an environment variable that would
|
||||||
# correspond to the ./configure --prefix=$QUICKTIME_DIR
|
# correspond to the ./configure --prefix=$QUICKTIME_DIR
|
||||||
#
|
#
|
||||||
# Created by Eric Wing.
|
# Created by Eric Wing.
|
||||||
|
|
||||||
|
|
||||||
# QuickTime on OS X looks different than QuickTime for Windows,
|
# QuickTime on OS X looks different than QuickTime for Windows,
|
||||||
# so I am going to case the two.
|
# so I am going to case the two.
|
||||||
@@ -63,8 +64,8 @@ ELSE()
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
# Disable quicktime for >= 10.7, as it's officially deprecated
|
# Disable quicktime for >= 10.7, as it's officially deprecated
|
||||||
|
|
||||||
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.7" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9")
|
IF(${OSG_OSX_SDK_NAME} STREQUAL "macosx10.7" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.8" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.9" OR ${OSG_OSX_SDK_NAME} STREQUAL "macosx10.10")
|
||||||
MESSAGE("disabling quicktime because it's not supported by the selected SDK ${OSG_OSX_SDK_NAME}")
|
MESSAGE("disabling quicktime because it's not supported by the selected SDK ${OSG_OSX_SDK_NAME}")
|
||||||
SET(QUICKTIME_FOUND "NO")
|
SET(QUICKTIME_FOUND "NO")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|||||||
178
CMakeModules/FindSDL2.cmake
Normal file
178
CMakeModules/FindSDL2.cmake
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
# - Locate SDL library
|
||||||
|
# This module defines
|
||||||
|
# SDL2_LIBRARY, the name of the library to link against
|
||||||
|
# SDL2_FOUND, if false, do not try to link to SDL
|
||||||
|
# SDL2_INCLUDE_DIR, where to find SDL.h
|
||||||
|
# SDL2_VERSION_STRING, human-readable string containing the version of SDL
|
||||||
|
#
|
||||||
|
# This module responds to the flag:
|
||||||
|
# SDL2_BUILDING_LIBRARY
|
||||||
|
# If this is defined, then no SDL2_main will be linked in because
|
||||||
|
# only applications need main().
|
||||||
|
# Otherwise, it is assumed you are building an application and this
|
||||||
|
# module will attempt to locate and set the proper link flags
|
||||||
|
# as part of the returned SDL2_LIBRARY variable.
|
||||||
|
#
|
||||||
|
# Don't forget to include SDLmain.h and SDLmain.m your project for the
|
||||||
|
# OS X framework based version. (Other versions link to -lSDLmain which
|
||||||
|
# this module will try to find on your behalf.) Also for OS X, this
|
||||||
|
# module will automatically add the -framework Cocoa on your behalf.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
|
||||||
|
# and no SDL2_LIBRARY, it means CMake did not find your SDL library
|
||||||
|
# (SDL.dll, libsdl.so, SDL.framework, etc).
|
||||||
|
# Set SDL2_LIBRARY_TEMP to point to your SDL library, and configure again.
|
||||||
|
# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
|
||||||
|
# as appropriate. These values are used to generate the final SDL2_LIBRARY
|
||||||
|
# variable, but when these values are unset, SDL2_LIBRARY does not get created.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# $SDLDIR is an environment variable that would
|
||||||
|
# correspond to the ./configure --prefix=$SDLDIR
|
||||||
|
# used in building SDL.
|
||||||
|
# l.e.galup 9-20-02
|
||||||
|
#
|
||||||
|
# Modified by Eric Wing.
|
||||||
|
# Added code to assist with automated building by using environmental variables
|
||||||
|
# and providing a more controlled/consistent search behavior.
|
||||||
|
# Added new modifications to recognize OS X frameworks and
|
||||||
|
# additional Unix paths (FreeBSD, etc).
|
||||||
|
# Also corrected the header search path to follow "proper" SDL guidelines.
|
||||||
|
# Added a search for SDLmain which is needed by some platforms.
|
||||||
|
# Added a search for threads which is needed by some platforms.
|
||||||
|
# Added needed compile switches for MinGW.
|
||||||
|
#
|
||||||
|
# On OSX, this will prefer the Framework version (if found) over others.
|
||||||
|
# People will have to manually change the cache values of
|
||||||
|
# SDL2_LIBRARY to override this selection or set the CMake environment
|
||||||
|
# CMAKE_INCLUDE_PATH to modify the search paths.
|
||||||
|
#
|
||||||
|
# Note that the header path has changed from SDL/SDL.h to just SDL.h
|
||||||
|
# This needed to change because "proper" SDL convention
|
||||||
|
# is #include "SDL.h", not <SDL/SDL.h>. This is done for portability
|
||||||
|
# reasons because not all systems place things in SDL/ (see FreeBSD).
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2003-2009 Kitware, Inc.
|
||||||
|
# Copyright 2012 Benjamin Eikel
|
||||||
|
#
|
||||||
|
# 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 distribute this file outside of CMake, substitute the full
|
||||||
|
# License text for the above reference.)
|
||||||
|
|
||||||
|
find_path(SDL2_INCLUDE_DIR SDL.h
|
||||||
|
HINTS
|
||||||
|
ENV SDL2DIR
|
||||||
|
PATH_SUFFIXES include/SDL2
|
||||||
|
)
|
||||||
|
|
||||||
|
# SDL-1.1 is the name used by FreeBSD ports...
|
||||||
|
# don't confuse it for the version number.
|
||||||
|
find_library(SDL2_LIBRARY_TEMP
|
||||||
|
NAMES SDL2
|
||||||
|
HINTS
|
||||||
|
ENV SDL2DIR
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT SDL2_BUILDING_LIBRARY)
|
||||||
|
if(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
|
||||||
|
# Non-OS X framework versions expect you to also dynamically link to
|
||||||
|
# SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms
|
||||||
|
# seem to provide SDLmain for compatibility even though they don't
|
||||||
|
# necessarily need it.
|
||||||
|
find_library(SDL2MAIN_LIBRARY
|
||||||
|
NAMES SDL2main
|
||||||
|
HINTS
|
||||||
|
ENV SDL2DIR
|
||||||
|
PATH_SUFFIXES lib
|
||||||
|
PATHS
|
||||||
|
/sw
|
||||||
|
/opt/local
|
||||||
|
/opt/csw
|
||||||
|
/opt
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# SDL may require threads on your system.
|
||||||
|
# The Apple build may not need an explicit flag because one of the
|
||||||
|
# frameworks may already provide it.
|
||||||
|
# But for non-OSX systems, I will use the CMake Threads package.
|
||||||
|
if(NOT APPLE)
|
||||||
|
find_package(Threads)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# MinGW needs an additional library, mwindows
|
||||||
|
# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -lmwindows
|
||||||
|
# (Actually on second look, I think it only needs one of the m* libraries.)
|
||||||
|
if(MINGW)
|
||||||
|
set(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SDL2_LIBRARY_TEMP)
|
||||||
|
# For SDLmain
|
||||||
|
if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
|
||||||
|
list(FIND SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX)
|
||||||
|
if(_SDL2_MAIN_INDEX EQUAL -1)
|
||||||
|
set(SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP})
|
||||||
|
endif()
|
||||||
|
unset(_SDL2_MAIN_INDEX)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For OS X, SDL uses Cocoa as a backend so it must link to Cocoa.
|
||||||
|
# CMake doesn't display the -framework Cocoa string in the UI even
|
||||||
|
# though it actually is there if I modify a pre-used variable.
|
||||||
|
# I think it has something to do with the CACHE STRING.
|
||||||
|
# So I use a temporary variable until the end so I can set the
|
||||||
|
# "real" variable in one-shot.
|
||||||
|
if(APPLE)
|
||||||
|
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For threads, as mentioned Apple doesn't need this.
|
||||||
|
# In fact, there seems to be a problem if I used the Threads package
|
||||||
|
# and try using this line, so I'm just skipping it entirely for OS X.
|
||||||
|
if(NOT APPLE)
|
||||||
|
set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For MinGW library
|
||||||
|
if(MINGW)
|
||||||
|
set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set the final string here so the GUI reflects the final state.
|
||||||
|
set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found")
|
||||||
|
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
|
||||||
|
set(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h")
|
||||||
|
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$")
|
||||||
|
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$")
|
||||||
|
file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$")
|
||||||
|
string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}")
|
||||||
|
string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}")
|
||||||
|
string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}")
|
||||||
|
set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH})
|
||||||
|
unset(SDL2_VERSION_MAJOR_LINE)
|
||||||
|
unset(SDL2_VERSION_MINOR_LINE)
|
||||||
|
unset(SDL2_VERSION_PATCH_LINE)
|
||||||
|
unset(SDL2_VERSION_MAJOR)
|
||||||
|
unset(SDL2_VERSION_MINOR)
|
||||||
|
unset(SDL2_VERSION_PATCH)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
|
||||||
|
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR
|
||||||
|
VERSION_VAR SDL2_VERSION_STRING)
|
||||||
45
CMakeModules/FindV8.cmake
Normal file
45
CMakeModules/FindV8.cmake
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Locate V8
|
||||||
|
# This module defines
|
||||||
|
# V8_LIBRARY
|
||||||
|
# V8_FOUND, if false, do not try to link to gdal
|
||||||
|
# V8_INCLUDE_DIR, where to find the headers
|
||||||
|
#
|
||||||
|
# $V8_DIR is an environment variable that would
|
||||||
|
# correspond to the ./configure --prefix=$V8_DIR
|
||||||
|
#
|
||||||
|
# Created by Robert Osfield (based on FindFLTK.cmake)
|
||||||
|
|
||||||
|
FIND_PATH(V8_INCLUDE_DIR v8.h
|
||||||
|
$ENV{V8_DIR}/include
|
||||||
|
$ENV{V8_DIR}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
/sw/include # Fink
|
||||||
|
/opt/local/include # DarwinPorts
|
||||||
|
/opt/csw/include # Blastwave
|
||||||
|
/opt/include
|
||||||
|
/usr/freeware/include
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_LIBRARY(V8_LIBRARY
|
||||||
|
NAMES v8 libv8
|
||||||
|
PATHS
|
||||||
|
$ENV{V8_DIR}/lib
|
||||||
|
$ENV{V8_DIR}
|
||||||
|
~/Library/Frameworks
|
||||||
|
/Library/Frameworks
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/lib
|
||||||
|
/sw/lib
|
||||||
|
/opt/local/lib
|
||||||
|
/opt/csw/lib
|
||||||
|
/opt/lib
|
||||||
|
/usr/freeware/lib64
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(V8_FOUND "NO")
|
||||||
|
IF(V8_LIBRARY AND V8_INCLUDE_DIR)
|
||||||
|
SET(V8_FOUND "YES")
|
||||||
|
ENDIF()
|
||||||
@@ -10,6 +10,16 @@
|
|||||||
#
|
#
|
||||||
# Created by Ulrich Hertlein.
|
# Created by Ulrich Hertlein.
|
||||||
|
|
||||||
|
# prefer FindZLIB from cmake distribution
|
||||||
|
if(EXISTS ${CMAKE_ROOT}/Modules/FindZLIB.cmake)
|
||||||
|
include(${CMAKE_ROOT}/Modules/FindZLIB.cmake)
|
||||||
|
|
||||||
|
if(ZLIB_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
|
FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
|
||||||
$ENV{ZLIB_DIR}/include
|
$ENV{ZLIB_DIR}/include
|
||||||
$ENV{ZLIB_DIR}
|
$ENV{ZLIB_DIR}
|
||||||
|
|||||||
@@ -25,14 +25,6 @@ IF(MSVC AND OSG_MSVC_VERSIONED_DLL)
|
|||||||
HANDLE_MSVC_DLL()
|
HANDLE_MSVC_DLL()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF(ANDROID)
|
|
||||||
INSTALL (
|
|
||||||
FILES ${TARGET_H}
|
|
||||||
DESTINATION ${INSTALL_INCDIR}/${LIB_NAME}
|
|
||||||
COMPONENT libopenscenegraph-dev
|
|
||||||
)
|
|
||||||
ELSE(ANDROID)
|
|
||||||
|
|
||||||
INSTALL(
|
INSTALL(
|
||||||
TARGETS ${LIB_NAME}
|
TARGETS ${LIB_NAME}
|
||||||
RUNTIME DESTINATION ${INSTALL_BINDIR} COMPONENT libopenscenegraph
|
RUNTIME DESTINATION ${INSTALL_BINDIR} COMPONENT libopenscenegraph
|
||||||
@@ -59,4 +51,3 @@ ELSE()
|
|||||||
# MESSAGE("${OSG_COMPILE_FRAMEWORKS_INSTALL_NAME_DIR}")
|
# MESSAGE("${OSG_COMPILE_FRAMEWORKS_INSTALL_NAME_DIR}")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
ENDIF(ANDROID)
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#JPEG
|
#JPEG
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(JPEG_INCLUDE_DIR Android.mk
|
FIND_PATH(JPEG_INCLUDE_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/libjpeg
|
${CMAKE_SOURCE_DIR}/3rdparty/libjpeg NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libjpeg")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libjpeg")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${JPEG_INCLUDE_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${JPEG_INCLUDE_DIR}/Android.mk \n")
|
||||||
@@ -82,7 +82,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#PNG
|
#PNG
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(PNG_INCLUDE_DIR Android.mk
|
FIND_PATH(PNG_INCLUDE_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/libpng
|
${CMAKE_SOURCE_DIR}/3rdparty/libpng NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libpng")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libpng")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${PNG_INCLUDE_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${PNG_INCLUDE_DIR}/Android.mk \n")
|
||||||
@@ -97,7 +97,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#GIF
|
#GIF
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(GIFLIB_INCLUDE_DIR Android.mk
|
FIND_PATH(GIFLIB_INCLUDE_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/giflib
|
${CMAKE_SOURCE_DIR}/3rdparty/giflib NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libgif")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libgif")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${GIFLIB_INCLUDE_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${GIFLIB_INCLUDE_DIR}/Android.mk \n")
|
||||||
@@ -112,7 +112,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#TIF
|
#TIF
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(TIFF_INCLUDE_DIR Android.mk
|
FIND_PATH(TIFF_INCLUDE_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/libtiff
|
${CMAKE_SOURCE_DIR}/3rdparty/libtiff NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libtiff")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libtiff")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${TIFF_INCLUDE_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${TIFF_INCLUDE_DIR}/Android.mk \n")
|
||||||
@@ -142,7 +142,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#CURL
|
#CURL
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(CURL_DIR Android.mk
|
FIND_PATH(CURL_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/curl
|
${CMAKE_SOURCE_DIR}/3rdparty/curl NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libcurl")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libcurl")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${CURL_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${CURL_DIR}/Android.mk \n")
|
||||||
@@ -159,11 +159,11 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#FREETYPE
|
#FREETYPE
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(FREETYPE_DIR Android.mk
|
FIND_PATH(FREETYPE_DIR Android.mk
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/freetype
|
${CMAKE_SOURCE_DIR}/3rdparty/freetype NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libft2")
|
#set(ENV{AND_OSG_LIB_NAMES} "$ENV{AND_OSG_LIB_NAMES} libft2")
|
||||||
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${FREETYPE_DIR}/Android.mk \n")
|
#set(ENV{AND_OSG_LIB_PATHS} "$ENV{AND_OSG_LIB_PATHS}include ${FREETYPE_DIR}/Android.mk \n")
|
||||||
set(FREETYPE_INCLUDE_DIRS "${FREETYPE_DIR}/include ${FREETYPE_DIR}/include/freetype/config")
|
set(FREETYPE_INCLUDE_DIRS ${FREETYPE_DIR}/include ${FREETYPE_DIR}/include/freetype/config)
|
||||||
if(FREETYPE_DIR)
|
if(FREETYPE_DIR)
|
||||||
message(STATUS "FREETYPE found ${FREETYPE_DIR}" )
|
message(STATUS "FREETYPE found ${FREETYPE_DIR}" )
|
||||||
set(FREETYPE_FOUND "Yes")
|
set(FREETYPE_FOUND "Yes")
|
||||||
@@ -175,7 +175,7 @@ MACRO(ANDROID_3RD_PARTY)
|
|||||||
#GDAL
|
#GDAL
|
||||||
################################################
|
################################################
|
||||||
FIND_PATH(GDAL_DIR gdal.h
|
FIND_PATH(GDAL_DIR gdal.h
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/gdal/include
|
${CMAKE_SOURCE_DIR}/3rdparty/gdal/include NO_CMAKE_FIND_ROOT_PATH
|
||||||
)
|
)
|
||||||
set(GDAL_INCLUDE_DIR "${GDAL_DIR}")
|
set(GDAL_INCLUDE_DIR "${GDAL_DIR}")
|
||||||
if(GDAL_DIR)
|
if(GDAL_DIR)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# full path of the library name. in order to differentiate release and debug, this macro get the
|
# full path of the library name. in order to differentiate release and debug, this macro get the
|
||||||
# NAME of the variables, so the macro gets as arguments the target name and the following list of parameters
|
# NAME of the variables, so the macro gets as arguments the target name and the following list of parameters
|
||||||
# is intended as a list of variable names each one containing the path of the libraries to link to
|
# is intended as a list of variable names each one containing the path of the libraries to link to
|
||||||
# The existance of a variable name with _DEBUG appended is tested and, in case it' s value is used
|
# The existence of a variable name with _DEBUG appended is tested and, in case it' s value is used
|
||||||
# for linking to when in debug mode
|
# for linking to when in debug mode
|
||||||
# the content of this library for linking when in debugging
|
# the content of this library for linking when in debugging
|
||||||
#######################################################################################################
|
#######################################################################################################
|
||||||
@@ -212,9 +212,10 @@ ENDMACRO(SET_OUTPUT_DIR_PROPERTY_260 TARGET_TARGETNAME RELATIVE_OUTDIR)
|
|||||||
##########################################################################################################
|
##########################################################################################################
|
||||||
|
|
||||||
MACRO(SETUP_LIBRARY LIB_NAME)
|
MACRO(SETUP_LIBRARY LIB_NAME)
|
||||||
IF(ANDROID)
|
IF(GLCORE_FOUND)
|
||||||
SETUP_ANDROID_LIBRARY(${LIB_NAME})
|
INCLUDE_DIRECTORIES( ${GLCORE_INCLUDE_DIR} )
|
||||||
ELSE()
|
ENDIF()
|
||||||
|
|
||||||
SET(TARGET_NAME ${LIB_NAME} )
|
SET(TARGET_NAME ${LIB_NAME} )
|
||||||
SET(TARGET_TARGETNAME ${LIB_NAME} )
|
SET(TARGET_TARGETNAME ${LIB_NAME} )
|
||||||
ADD_LIBRARY(${LIB_NAME}
|
ADD_LIBRARY(${LIB_NAME}
|
||||||
@@ -242,14 +243,13 @@ MACRO(SETUP_LIBRARY LIB_NAME)
|
|||||||
ENDIF(TARGET_LIBRARIES_VARS)
|
ENDIF(TARGET_LIBRARIES_VARS)
|
||||||
LINK_CORELIB_DEFAULT(${LIB_NAME})
|
LINK_CORELIB_DEFAULT(${LIB_NAME})
|
||||||
|
|
||||||
ENDIF()
|
|
||||||
INCLUDE(ModuleInstall OPTIONAL)
|
INCLUDE(ModuleInstall OPTIONAL)
|
||||||
ENDMACRO(SETUP_LIBRARY LIB_NAME)
|
ENDMACRO(SETUP_LIBRARY LIB_NAME)
|
||||||
|
|
||||||
MACRO(SETUP_PLUGIN PLUGIN_NAME)
|
MACRO(SETUP_PLUGIN PLUGIN_NAME)
|
||||||
IF(ANDROID)
|
IF(GLCORE_FOUND)
|
||||||
SETUP_ANDROID_LIBRARY(${TARGET_DEFAULT_PREFIX}${PLUGIN_NAME})
|
INCLUDE_DIRECTORIES( ${GLCORE_INCLUDE_DIR} )
|
||||||
ELSE()
|
ENDIF()
|
||||||
|
|
||||||
SET(TARGET_NAME ${PLUGIN_NAME} )
|
SET(TARGET_NAME ${PLUGIN_NAME} )
|
||||||
|
|
||||||
@@ -332,7 +332,6 @@ MACRO(SETUP_PLUGIN PLUGIN_NAME)
|
|||||||
ARCHIVE DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS} COMPONENT libopenscenegraph-dev
|
ARCHIVE DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS} COMPONENT libopenscenegraph-dev
|
||||||
LIBRARY DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS} COMPONENT ${PACKAGE_COMPONENT})
|
LIBRARY DESTINATION lib${LIB_POSTFIX}/${OSG_PLUGINS} COMPONENT ${PACKAGE_COMPONENT})
|
||||||
ENDIF(WIN32)
|
ENDIF(WIN32)
|
||||||
ENDIF()
|
|
||||||
ENDMACRO(SETUP_PLUGIN)
|
ENDMACRO(SETUP_PLUGIN)
|
||||||
|
|
||||||
|
|
||||||
@@ -342,6 +341,10 @@ ENDMACRO(SETUP_PLUGIN)
|
|||||||
|
|
||||||
MACRO(SETUP_EXE IS_COMMANDLINE_APP)
|
MACRO(SETUP_EXE IS_COMMANDLINE_APP)
|
||||||
#MESSAGE("in -->SETUP_EXE<-- ${TARGET_NAME}-->${TARGET_SRC} <--> ${TARGET_H}<--")
|
#MESSAGE("in -->SETUP_EXE<-- ${TARGET_NAME}-->${TARGET_SRC} <--> ${TARGET_H}<--")
|
||||||
|
IF(GL3_FOUND)
|
||||||
|
INCLUDE_DIRECTORIES( ${GLCORE_INCLUDE_DIR} )
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(NOT TARGET_TARGETNAME)
|
IF(NOT TARGET_TARGETNAME)
|
||||||
SET(TARGET_TARGETNAME "${TARGET_DEFAULT_PREFIX}${TARGET_NAME}")
|
SET(TARGET_TARGETNAME "${TARGET_DEFAULT_PREFIX}${TARGET_NAME}")
|
||||||
ENDIF(NOT TARGET_TARGETNAME)
|
ENDIF(NOT TARGET_TARGETNAME)
|
||||||
|
|||||||
29
NEWS.txt
29
NEWS.txt
@@ -1,35 +1,6 @@
|
|||||||
OSG News
|
OSG News
|
||||||
========
|
========
|
||||||
|
|
||||||
= OpenSceneGraph 3.2.1 stable release provides a number of bug and build fixes to the 3.2.0 stable release
|
|
||||||
|
|
||||||
PERTHSHIRE, Scotland - 4th July 2014 - OpenSceneGraph Professional Services announces the release of OpenSceneGraph 3.2.1, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. OpenSceneGraph 3.2 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. OpenSceneGraph 3.2 runs on all Microsoft Windows platforms, Apple OS/X, IOS, GNU/Linux, Android, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
|
||||||
|
|
||||||
=== Open-source development delivers industry-leading features and performance ===
|
|
||||||
The OpenSceneGraph 3.2.1 stable release is the culmination of 15 years of work by the open-source community that has grown up around the project. This point release is fully binary compatible with the 3.2.0 stable release. The changes made are focused on addressing bugs and improving build support for latest compilers, OS updates and 3rd changes to Party Libraries.
|
|
||||||
|
|
||||||
=== Downloads and Licensing ===
|
|
||||||
OpenSceneGraph is open-source, so full source code is provided, and can be copied, modified and used free of charge for commercial and non-commercial use. Access to the source allows end users greater flexibility in how they develop, debug and deploy their applications. They gain productivity and freedom by being able to leverage the tool chain in accordance with their own release cycles. Downloads of binaries and source can be found in the [http://www.openscenegraph.org/index.php/download-section/stable-releases Downloads] section of the openscenegraph.org website.
|
|
||||||
|
|
||||||
OpenSceneGraph is released under the [http://www.openscenegraph.org/projects/osg/wiki/Legal OpenSceneGraph Public License], which is based on the Lesser GNU Public License (LGPL), permitting the software to be used free of charge across the full spectrum of commercial and open-source applications. Furthermore, it allows both static and dynamic linking of the OpenSceneGraph libraries without restricting the licensing of the user's software.
|
|
||||||
|
|
||||||
=== Professional support and services ===
|
|
||||||
OpenSceneGraph project is backed up with professional services by [http://www.openscenegraph.com OpenSceneGraph Professional Services], based in Scotland, and [http://www.skew-matrix.com Skew-Matrix] and [http://www.alphapixel.com AlphaPixel] both based in the USA, and a range of [wiki:Community/Contractors Contractors] from around the world. Services available include:
|
|
||||||
|
|
||||||
* Confidential Professional Support
|
|
||||||
* Bespoke development
|
|
||||||
* Consultancy
|
|
||||||
* Training
|
|
||||||
|
|
||||||
=== Community support and contributions ===
|
|
||||||
The diverse and growing community of over 5000 developers is centred around the public osg-users mailing list/forum, where members discuss how best to use OpenSceneGraph, provide mutual support, and coordinate development of new features and bug fixes. Members of this community come from many different countries with backgrounds ranging from some of the world's largest aerospace companies, game companies, and visual simulation specialists to university researchers, students and hobbyists.
|
|
||||||
|
|
||||||
The OpenSceneGraph project owes a great deal to the community for its development and support, in particular we wish to thank the [http://www.openscenegraph.org/index.php/about/56-contributors/162-contributors-to-openscenegraph-3-2-1 individuals] from around the world that have directly contributed to the development and refinement of the OpenSceneGraph code base.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
= !OpenSceneGraph 3.2 release improves support iOS and Android, supports a range of new OpenGL features much more.
|
= !OpenSceneGraph 3.2 release improves support iOS and Android, supports a range of new OpenGL features much more.
|
||||||
|
|
||||||
PERTHSHIRE, Scotland - 24th July 2013 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 3.2, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 3.2 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 3.2 runs on all Microsoft Windows platforms, Apple OS/X, IOS, GNU/Linux, Android, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
PERTHSHIRE, Scotland - 24th July 2013 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 3.2, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 3.2 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 3.2 runs on all Microsoft Windows platforms, Apple OS/X, IOS, GNU/Linux, Android, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ APP_PROJECT_PATH := $(call my-dir)
|
|||||||
|
|
||||||
APP_OPTIM := ${ANDROID_RELEASE_OPTIM}
|
APP_OPTIM := ${ANDROID_RELEASE_OPTIM}
|
||||||
|
|
||||||
APP_PLATFORM := ${ANDROID_PLATFORM}
|
APP_PLATFORM := android-${ANDROID_PLATFORM}
|
||||||
APP_STL := ${ANDROID_STL}
|
APP_STL := ${ANDROID_STL}
|
||||||
APP_CPPFLAGS := -fexceptions -frtti
|
APP_CPPFLAGS := -fexceptions -frtti
|
||||||
#APP_CPPFLAGS := -Os -mthumb-interwork -fno-short-enums
|
#APP_CPPFLAGS := -Os -mthumb-interwork -fno-short-enums
|
||||||
|
|||||||
1761
PlatformSpecifics/Android/android.toolchain.cmake
Normal file
1761
PlatformSpecifics/Android/android.toolchain.cmake
Normal file
File diff suppressed because it is too large
Load Diff
15
README.txt
15
README.txt
@@ -23,7 +23,7 @@ more indepth instructions.
|
|||||||
|
|
||||||
Robert Osfield.
|
Robert Osfield.
|
||||||
Project Lead.
|
Project Lead.
|
||||||
4th July 2014.
|
12th August 2015.
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
||||||
@@ -43,13 +43,12 @@ OpenSceneGraph's CMake build can be found at:
|
|||||||
http://www.openscenegraph.org/projects/osg/wiki/Build/CMake
|
http://www.openscenegraph.org/projects/osg/wiki/Build/CMake
|
||||||
|
|
||||||
Under unices (i.e. Linux, IRIX, Solaris, Free-BSD, HP-Ux, AIX, OSX)
|
Under unices (i.e. Linux, IRIX, Solaris, Free-BSD, HP-Ux, AIX, OSX)
|
||||||
use the cmake or ccmake command-line utils, or use the included tiny
|
use the cmake or ccmake command-line utils. Note that cmake . defaults
|
||||||
configure script that'll run cmake for you. The configure script
|
to building Release to ensure that you get the best performance from
|
||||||
simply runs 'cmake . -DCMAKE_BUILD_TYPE=Release' to ensure that you
|
your final libraries/applications.
|
||||||
get the best performance from your final libraries/applications.
|
|
||||||
|
|
||||||
cd OpenSceneGraph
|
cd OpenSceneGraph
|
||||||
./configure
|
cmake .
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ directory alongside the OpenSceneGraph use:
|
|||||||
|
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake ../OpenSceneGraph -DCMAKE_BUILD_TYPE=Release
|
cmake ../OpenSceneGraph
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
||||||
@@ -167,7 +166,7 @@ Section 3. Release notes on iOS build, by Thomas Hoghart
|
|||||||
This will give us the static build we need for iPhone.
|
This will give us the static build we need for iPhone.
|
||||||
* Disable OSG_GL1_AVAILABLE, OSG_GL2_AVAILABLE, OSG_GL3_AVAILABLE,
|
* Disable OSG_GL1_AVAILABLE, OSG_GL2_AVAILABLE, OSG_GL3_AVAILABLE,
|
||||||
OSG_GL_DISPLAYLISTS_AVAILABLE, OSG_GL_VERTEX_FUNCS_AVAILABLE
|
OSG_GL_DISPLAYLISTS_AVAILABLE, OSG_GL_VERTEX_FUNCS_AVAILABLE
|
||||||
* Enable OSG_GLES1_AVAILABLE *OR* OSG_GLES2_AVAILABLE
|
* Enable OSG_GLES1_AVAILABLE *OR* OSG_GLES2_AVAILABLE *OR* OSG_GLES3_AVAILABLE (GLES3 will enable GLES2 features)
|
||||||
* Ensure OSG_WINDOWING_SYSTEM is set to IOS
|
* Ensure OSG_WINDOWING_SYSTEM is set to IOS
|
||||||
* Change FREETYPE include and library paths to an iPhone version
|
* Change FREETYPE include and library paths to an iPhone version
|
||||||
(OpenFrameworks has one bundled with its distribution)
|
(OpenFrameworks has one bundled with its distribution)
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ public:
|
|||||||
{
|
{
|
||||||
texture->setInternalFormatMode(_internalFormatMode);
|
texture->setInternalFormatMode(_internalFormatMode);
|
||||||
|
|
||||||
// need to disable the unref after apply, other the image could go out of scope.
|
// need to disable the unref after apply, otherwise the image could go out of scope.
|
||||||
bool unrefImageDataAfterApply = texture->getUnRefImageDataAfterApply();
|
bool unrefImageDataAfterApply = texture->getUnRefImageDataAfterApply();
|
||||||
texture->setUnRefImageDataAfterApply(false);
|
texture->setUnRefImageDataAfterApply(false);
|
||||||
|
|
||||||
@@ -373,16 +373,6 @@ public:
|
|||||||
++_numStateSetRemoved;
|
++_numStateSetRemoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(unsigned int i=0;i<node.getNumDrawables();++i)
|
|
||||||
{
|
|
||||||
osg::Drawable* drawable = node.getDrawable(i);
|
|
||||||
if (drawable && drawable->getStateSet())
|
|
||||||
{
|
|
||||||
drawable->setStateSet(0);
|
|
||||||
++_numStateSetRemoved;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
traverse(node);
|
traverse(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -817,7 +807,7 @@ int main( int argc, char **argv )
|
|||||||
root->accept(av);
|
root->accept(av);
|
||||||
}
|
}
|
||||||
|
|
||||||
// optimize the scene graph, remove rendundent nodes and state etc.
|
// optimize the scene graph, remove redundant nodes and state etc.
|
||||||
osgUtil::Optimizer optimizer;
|
osgUtil::Optimizer optimizer;
|
||||||
optimizer.optimize(root.get());
|
optimizer.optimize(root.get());
|
||||||
|
|
||||||
|
|||||||
@@ -259,7 +259,9 @@ const char* invalidNames[] =
|
|||||||
"VolumeTile",
|
"VolumeTile",
|
||||||
"PushStackValueVisitor",
|
"PushStackValueVisitor",
|
||||||
"RayIntersector",
|
"RayIntersector",
|
||||||
"OpenSceneGraph-Data"
|
"OpenSceneGraph-Data",
|
||||||
|
"Node",
|
||||||
|
"AlphaFunc"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -352,6 +354,7 @@ TypoCorrection typoCorrections[] =
|
|||||||
{"Krulthof", "Kruithof"},
|
{"Krulthof", "Kruithof"},
|
||||||
{"Lagrade", "Lagarde"},
|
{"Lagrade", "Lagarde"},
|
||||||
{"Largade", "Lagarde"},
|
{"Largade", "Lagarde"},
|
||||||
|
{"Largarde", "Lagarde"},
|
||||||
{"Larshkari", "Lashkari"},
|
{"Larshkari", "Lashkari"},
|
||||||
{"Lashakari", "Lashkari"},
|
{"Lashakari", "Lashkari"},
|
||||||
{"Lashari", "Lashkari"},
|
{"Lashari", "Lashkari"},
|
||||||
@@ -468,7 +471,20 @@ TypoCorrection typoCorrections[] =
|
|||||||
{"Blessing","Blissing"},
|
{"Blessing","Blissing"},
|
||||||
{"Dannahuer","Dannhauer"},
|
{"Dannahuer","Dannhauer"},
|
||||||
{"Chebeav", "Chebaev"},
|
{"Chebeav", "Chebaev"},
|
||||||
{"Messershmidt","Messerschmidt"}
|
{"Messershmidt","Messerschmidt"},
|
||||||
|
{"Auelien","Aurelien"},
|
||||||
|
{"Aurélien","Aur<EFBFBD>lien"},
|
||||||
|
{"McDonnel","Mc Donnell"},
|
||||||
|
{"McDonnell","Mc Donnell"},
|
||||||
|
{"Delallée","Delall<EFBFBD>e"},
|
||||||
|
{"Gjøl","Gj<EFBFBD>l"},
|
||||||
|
{"Ravšelj","Rav<EFBFBD>elj"},
|
||||||
|
{"Ravsel", "Rav<EFBFBD>elj"},
|
||||||
|
{"Ravselj", "Rav<EFBFBD>elj"},
|
||||||
|
{"Janik", "Jannik"},
|
||||||
|
{"Viganò", "Vigan<EFBFBD>"},
|
||||||
|
{"Vigano", "Vigan<EFBFBD>"},
|
||||||
|
{"Frashud", "Farshid"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -576,6 +592,8 @@ NameCorrection nameCorrections[] =
|
|||||||
"Melchior", "Franz"},
|
"Melchior", "Franz"},
|
||||||
{"Glen", "Waldon",
|
{"Glen", "Waldon",
|
||||||
"Glenn", "Waldron"},
|
"Glenn", "Waldron"},
|
||||||
|
{"Glen", "Waldron",
|
||||||
|
"Glenn", "Waldron"},
|
||||||
{"Ralf", "Karn",
|
{"Ralf", "Karn",
|
||||||
"Ralf", "Kern"},
|
"Ralf", "Kern"},
|
||||||
{"Donny", "Cipperly",
|
{"Donny", "Cipperly",
|
||||||
@@ -637,7 +655,25 @@ NameCorrection nameCorrections[] =
|
|||||||
{"Ricard", "Schmidt",
|
{"Ricard", "Schmidt",
|
||||||
"Richard", "Schmidt"},
|
"Richard", "Schmidt"},
|
||||||
{"Matthias", "Helsing",
|
{"Matthias", "Helsing",
|
||||||
"Mattias", "Helsing"}
|
"Mattias", "Helsing"},
|
||||||
|
{"Clement", "Boesch",
|
||||||
|
"Cl<EFBFBD>ment", "B<EFBFBD>sch"},
|
||||||
|
{"Lauren", "Voerman",
|
||||||
|
"Laurens", "Voerman"},
|
||||||
|
{"Pjotr", "Sventachov",
|
||||||
|
"Pjotr", "Svetachov"},
|
||||||
|
{"Bradley", "Baker",
|
||||||
|
"Bradley", "Baker Searles"},
|
||||||
|
{"PawelKsiezopolski", "",
|
||||||
|
"Pawel", "Ksiezopolski"},
|
||||||
|
{"Albert", "Luaces",
|
||||||
|
"Alberto","Luaces"},
|
||||||
|
{"KOS", "",
|
||||||
|
"Konstantin","Matveyev"},
|
||||||
|
{"WeSee", "",
|
||||||
|
"Alois", "Wismer"},
|
||||||
|
{"We", "See",
|
||||||
|
"Alois", "Wismer"}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -969,7 +1005,9 @@ void printContributors(const std::string& changeLog, bool printNumEntries)
|
|||||||
cout << "-------------------------" << endl;
|
cout << "-------------------------" << endl;
|
||||||
for (SortedNameMap::reverse_iterator sitr = sortedNames.rbegin(); sitr != sortedNames.rend(); ++sitr)
|
for (SortedNameMap::reverse_iterator sitr = sortedNames.rbegin(); sitr != sortedNames.rend(); ++sitr)
|
||||||
{
|
{
|
||||||
cout << sitr->first << "\t" << sitr->second.first << " " << sitr->second.second << endl;
|
cout << sitr->first << "\t" << sitr->second.first;
|
||||||
|
if (!sitr->second.second.empty()) cout << " " << sitr->second.second;
|
||||||
|
cout << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -978,7 +1016,9 @@ void printContributors(const std::string& changeLog, bool printNumEntries)
|
|||||||
cout << "-----------------" << endl;
|
cout << "-----------------" << endl;
|
||||||
for (SortedNameMap::reverse_iterator sitr = sortedNames.rbegin(); sitr != sortedNames.rend(); ++sitr)
|
for (SortedNameMap::reverse_iterator sitr = sortedNames.rbegin(); sitr != sortedNames.rend(); ++sitr)
|
||||||
{
|
{
|
||||||
cout << sitr->second.first << " " << sitr->second.second << endl;
|
cout << sitr->second.first;
|
||||||
|
if (!sitr->second.second.empty()) cout << " " << sitr->second.second;
|
||||||
|
cout << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// The majority of the application is dedicated to building the
|
// The majority of the application is dedicated to building the
|
||||||
// current contribitors list by parsing the ChangeLog, it just takes
|
// current contributors list by parsing the ChangeLog, it just takes
|
||||||
// one line in the main itself to report the version number.
|
// one line in the main itself to report the version number.
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <osg/CoordinateSystemNode>
|
#include <osg/CoordinateSystemNode>
|
||||||
|
|
||||||
#include <osg/Switch>
|
#include <osg/Switch>
|
||||||
|
#include <osg/Types>
|
||||||
#include <osgText/Text>
|
#include <osgText/Text>
|
||||||
|
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
@@ -31,113 +32,7 @@
|
|||||||
#include <osgGA/Device>
|
#include <osgGA/Device>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <osg/GLExtensions>
|
|
||||||
|
|
||||||
#ifndef GL_ARB_sync
|
|
||||||
#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
|
|
||||||
#define GL_OBJECT_TYPE 0x9112
|
|
||||||
#define GL_SYNC_CONDITION 0x9113
|
|
||||||
#define GL_SYNC_STATUS 0x9114
|
|
||||||
#define GL_SYNC_FLAGS 0x9115
|
|
||||||
#define GL_SYNC_FENCE 0x9116
|
|
||||||
#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
|
|
||||||
#define GL_UNSIGNALED 0x9118
|
|
||||||
#define GL_SIGNALED 0x9119
|
|
||||||
#define GL_ALREADY_SIGNALED 0x911A
|
|
||||||
#define GL_TIMEOUT_EXPIRED 0x911B
|
|
||||||
#define GL_CONDITION_SATISFIED 0x911C
|
|
||||||
#define GL_WAIT_FAILED 0x911D
|
|
||||||
#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
|
|
||||||
#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFFull
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class MySwapBuffersCallback : public osg::GraphicsContext::SwapCallback
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MySwapBuffersCallback():
|
|
||||||
_extensionInitialized(false),
|
|
||||||
_glFenceSync(0),
|
|
||||||
_glIsSync(0),
|
|
||||||
_glDeleteSync(0),
|
|
||||||
_glClientWaitSync(0),
|
|
||||||
_glWaitSync(0),
|
|
||||||
_glGetInteger64v(0),
|
|
||||||
_glGetSynciv(0),
|
|
||||||
_previousSync(0)
|
|
||||||
{
|
|
||||||
OSG_NOTICE<<"Created Swap callback."<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setUpExtensions()
|
|
||||||
{
|
|
||||||
_extensionInitialized = true;
|
|
||||||
osg::setGLExtensionFuncPtr(_glFenceSync, "glFenceSync");
|
|
||||||
osg::setGLExtensionFuncPtr(_glIsSync, "glIsSync");
|
|
||||||
osg::setGLExtensionFuncPtr(_glDeleteSync, "glDeleteSync");
|
|
||||||
osg::setGLExtensionFuncPtr(_glClientWaitSync, "glClientWaitSync");
|
|
||||||
osg::setGLExtensionFuncPtr(_glWaitSync, "glWaitSync");
|
|
||||||
osg::setGLExtensionFuncPtr(_glGetInteger64v, "glGetInteger64v");
|
|
||||||
osg::setGLExtensionFuncPtr(_glGetSynciv, "glGetSynciv");
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void swapBuffersImplementation(osg::GraphicsContext* gc)
|
|
||||||
{
|
|
||||||
// OSG_NOTICE<<"Before swap - place to do swap ready sync"<<std::endl;
|
|
||||||
gc->swapBuffersImplementation();
|
|
||||||
//glFinish();
|
|
||||||
|
|
||||||
if (!_extensionInitialized) setUpExtensions();
|
|
||||||
|
|
||||||
if (_glClientWaitSync)
|
|
||||||
{
|
|
||||||
if (_previousSync)
|
|
||||||
{
|
|
||||||
unsigned int num_seconds = 1;
|
|
||||||
GLuint64 timeout = num_seconds * ((GLuint64)1000 * 1000 * 1000);
|
|
||||||
_glClientWaitSync(_previousSync, 0, timeout);
|
|
||||||
|
|
||||||
_glDeleteSync(_previousSync);
|
|
||||||
}
|
|
||||||
|
|
||||||
_previousSync = _glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
|
||||||
}
|
|
||||||
//gc->getState()->checkGLErrors("after glWaitSync");
|
|
||||||
|
|
||||||
//OSG_NOTICE<<"After swap"<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
typedef __int64 GLint64;
|
|
||||||
typedef unsigned __int64 GLuint64;
|
|
||||||
#else
|
|
||||||
typedef int64_t GLint64;
|
|
||||||
typedef uint64_t GLuint64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct __GLsync *GLsync;
|
|
||||||
|
|
||||||
typedef GLsync (GL_APIENTRY * PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags);
|
|
||||||
typedef GLboolean (GL_APIENTRY * PFNGLISSYNCPROC) (GLsync sync);
|
|
||||||
typedef void (GL_APIENTRY * PFNGLDELETESYNCPROC) (GLsync sync);
|
|
||||||
typedef GLenum (GL_APIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
|
|
||||||
typedef void (GL_APIENTRY * PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout);
|
|
||||||
typedef void (GL_APIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *params);
|
|
||||||
typedef void (GL_APIENTRY * PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
|
|
||||||
|
|
||||||
bool _extensionInitialized;
|
|
||||||
|
|
||||||
PFNGLFENCESYNCPROC _glFenceSync;
|
|
||||||
PFNGLISSYNCPROC _glIsSync;
|
|
||||||
PFNGLDELETESYNCPROC _glDeleteSync;
|
|
||||||
PFNGLCLIENTWAITSYNCPROC _glClientWaitSync;
|
|
||||||
PFNGLWAITSYNCPROC _glWaitSync;
|
|
||||||
PFNGLGETINTEGER64VPROC _glGetInteger64v;
|
|
||||||
PFNGLGETSYNCIVPROC _glGetSynciv;
|
|
||||||
|
|
||||||
GLsync _previousSync;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
@@ -232,8 +127,6 @@ int main(int argc, char** argv)
|
|||||||
viewer.setCameraManipulator( keyswitchManipulator.get() );
|
viewer.setCameraManipulator( keyswitchManipulator.get() );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool doArbSync = arguments.read("--sync");
|
|
||||||
|
|
||||||
// add the state manipulator
|
// add the state manipulator
|
||||||
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
||||||
|
|
||||||
@@ -285,18 +178,6 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
viewer.realize();
|
viewer.realize();
|
||||||
|
|
||||||
if (doArbSync)
|
|
||||||
{
|
|
||||||
osgViewer::ViewerBase::Contexts contexts;
|
|
||||||
viewer.getContexts(contexts);
|
|
||||||
for(osgViewer::ViewerBase::Contexts::iterator itr = contexts.begin();
|
|
||||||
itr != contexts.end();
|
|
||||||
++itr)
|
|
||||||
{
|
|
||||||
(*itr)->setSwapCallback(new MySwapBuffersCallback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return viewer.run();
|
return viewer.run();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ IF (NOT DYNAMIC_OPENSCENEGRAPH)
|
|||||||
osgdb_openflight
|
osgdb_openflight
|
||||||
osgdb_obj
|
osgdb_obj
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(TARGET_ADDED_LIBRARIES ${TARGET_ADDED_LIBRARIES}
|
SET(TARGET_ADDED_LIBRARIES ${TARGET_ADDED_LIBRARIES}
|
||||||
osgdb_deprecated_osg osgdb_deprecated_osgparticle osgdb_deprecated_osganimation
|
osgdb_deprecated_osg osgdb_deprecated_osgparticle osgdb_deprecated_osganimation
|
||||||
osgdb_deprecated_osgfx osgdb_deprecated_osgsim osgdb_deprecated_osgtext
|
osgdb_deprecated_osgfx osgdb_deprecated_osgsim osgdb_deprecated_osgtext
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -39,9 +39,9 @@
|
|||||||
#elif defined(__sgi)
|
#elif defined(__sgi)
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <net/soioctl.h>
|
#include <net/soioctl.h>
|
||||||
#elif defined(__CYGWIN__)
|
#elif defined(__CYGWIN__)
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#elif defined(__sun)
|
#elif defined(__sun)
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/sockio.h>
|
#include <sys/sockio.h>
|
||||||
#elif defined (__APPLE__)
|
#elif defined (__APPLE__)
|
||||||
@@ -202,7 +202,8 @@ void DataConverter::write(CameraPacket& cameraPacket)
|
|||||||
itr != cameraPacket._events.end();
|
itr != cameraPacket._events.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
write(*(*itr));
|
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||||
|
if (event) write(*(event));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +250,7 @@ void CameraPacket::writeEventQueue(osgViewer::Viewer& viewer)
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Reciever
|
// Receiver
|
||||||
//
|
//
|
||||||
Receiver::Receiver( void )
|
Receiver::Receiver( void )
|
||||||
{
|
{
|
||||||
@@ -338,7 +339,7 @@ void Receiver::sync( void )
|
|||||||
|
|
||||||
#if defined(__linux) || defined(__FreeBSD__) || defined( __APPLE__ ) || \
|
#if defined(__linux) || defined(__FreeBSD__) || defined( __APPLE__ ) || \
|
||||||
defined(__DragonFly__)
|
defined(__DragonFly__)
|
||||||
socklen_t
|
socklen_t
|
||||||
#else
|
#else
|
||||||
int
|
int
|
||||||
#endif
|
#endif
|
||||||
@@ -381,7 +382,7 @@ void Receiver::sync( void )
|
|||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Broadcaster
|
// Broadcaster
|
||||||
//
|
//
|
||||||
Broadcaster::Broadcaster( void )
|
Broadcaster::Broadcaster( void )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -29,25 +29,25 @@
|
|||||||
//
|
//
|
||||||
// Class definition for the recipient of a broadcasted message
|
// Class definition for the recipient of a broadcasted message
|
||||||
//
|
//
|
||||||
class Receiver
|
class Receiver
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
|
|
||||||
Receiver();
|
Receiver();
|
||||||
~Receiver();
|
~Receiver();
|
||||||
|
|
||||||
// setBuffer defines the buffer into which the broadcasted
|
// setBuffer defines the buffer into which the broadcasted
|
||||||
// message will be received.
|
// message will be received.
|
||||||
void setBuffer( void *buffer, const unsigned int size );
|
void setBuffer( void *buffer, const unsigned int size );
|
||||||
|
|
||||||
// Define what port to listen and bind to
|
// Define what port to listen and bind to
|
||||||
void setPort( const short port );
|
void setPort( const short port );
|
||||||
|
|
||||||
// Sync does a blocking wait to recieve next message
|
// Sync does a blocking wait to recieve next message
|
||||||
void sync( void );
|
void sync( void );
|
||||||
|
|
||||||
private :
|
private :
|
||||||
bool init( void );
|
bool init( void );
|
||||||
|
|
||||||
private :
|
private :
|
||||||
#if defined (WIN32) && !defined(__CYGWIN__)
|
#if defined (WIN32) && !defined(__CYGWIN__)
|
||||||
@@ -68,29 +68,29 @@ class Receiver
|
|||||||
//
|
//
|
||||||
// Class definition for broadcasting a buffer to a LAN
|
// Class definition for broadcasting a buffer to a LAN
|
||||||
//
|
//
|
||||||
class Broadcaster
|
class Broadcaster
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
|
|
||||||
Broadcaster( void );
|
Broadcaster( void );
|
||||||
~Broadcaster( void );
|
~Broadcaster( void );
|
||||||
|
|
||||||
// Set the broadcast port
|
// Set the broadcast port
|
||||||
void setPort( const short port );
|
void setPort( const short port );
|
||||||
|
|
||||||
// Set the buffer to be broadcast
|
// Set the buffer to be broadcast
|
||||||
void setBuffer( void *buffer, const unsigned int buffer_size );
|
void setBuffer( void *buffer, const unsigned int buffer_size );
|
||||||
|
|
||||||
// Set a recipient host. If this is used, the Broadcaster
|
// Set a recipient host. If this is used, the Broadcaster
|
||||||
// no longer broadcasts, but rather directs UDP packets at
|
// no longer broadcasts, but rather directs UDP packets at
|
||||||
// host.
|
// host.
|
||||||
void setHost( const char *hostname );
|
void setHost( const char *hostname );
|
||||||
|
|
||||||
// Sync broadcasts the buffer
|
// Sync broadcasts the buffer
|
||||||
void sync( void );
|
void sync( void );
|
||||||
|
|
||||||
private :
|
private :
|
||||||
bool init( void );
|
bool init( void );
|
||||||
|
|
||||||
private :
|
private :
|
||||||
#if defined(WIN32) && !defined(__CYGWIN__)
|
#if defined(WIN32) && !defined(__CYGWIN__)
|
||||||
@@ -112,15 +112,15 @@ class Broadcaster
|
|||||||
|
|
||||||
class CameraPacket {
|
class CameraPacket {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static const unsigned int MAX_NUM_EVENTS;
|
static const unsigned int MAX_NUM_EVENTS;
|
||||||
static const unsigned int SWAP_BYTES_COMPARE;
|
static const unsigned int SWAP_BYTES_COMPARE;
|
||||||
|
|
||||||
CameraPacket():_masterKilled(false)
|
CameraPacket():_masterKilled(false)
|
||||||
{
|
{
|
||||||
_byte_order = SWAP_BYTES_COMPARE;
|
_byte_order = SWAP_BYTES_COMPARE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPacket(const osg::Matrix& matrix,const osg::FrameStamp* frameStamp)
|
void setPacket(const osg::Matrix& matrix,const osg::FrameStamp* frameStamp)
|
||||||
{
|
{
|
||||||
_matrix = matrix;
|
_matrix = matrix;
|
||||||
@@ -129,20 +129,20 @@ class CameraPacket {
|
|||||||
_frameStamp = *frameStamp;
|
_frameStamp = *frameStamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void getModelView(osg::Matrix& matrix,float angle_offset=0.0f)
|
void getModelView(osg::Matrix& matrix,float angle_offset=0.0f)
|
||||||
{
|
{
|
||||||
|
|
||||||
matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f);
|
matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void readEventQueue(osgViewer::Viewer& viewer);
|
void readEventQueue(osgViewer::Viewer& viewer);
|
||||||
|
|
||||||
void writeEventQueue(osgViewer::Viewer& viewer);
|
void writeEventQueue(osgViewer::Viewer& viewer);
|
||||||
|
|
||||||
void setMasterKilled(const bool flag) { _masterKilled = flag; }
|
void setMasterKilled(const bool flag) { _masterKilled = flag; }
|
||||||
const bool getMasterKilled() const { return _masterKilled; }
|
const bool getMasterKilled() const { return _masterKilled; }
|
||||||
|
|
||||||
unsigned int _byte_order;
|
unsigned int _byte_order;
|
||||||
bool _masterKilled;
|
bool _masterKilled;
|
||||||
osg::Matrix _matrix;
|
osg::Matrix _matrix;
|
||||||
@@ -150,11 +150,11 @@ class CameraPacket {
|
|||||||
// note don't use a ref_ptr as used elsewhere for FrameStamp
|
// note don't use a ref_ptr as used elsewhere for FrameStamp
|
||||||
// since we don't want to copy the pointer - but the memory.
|
// since we don't want to copy the pointer - but the memory.
|
||||||
// FrameStamp doesn't have a private destructor to allow
|
// FrameStamp doesn't have a private destructor to allow
|
||||||
// us to do this, even though its a reference counted object.
|
// us to do this, even though its a reference counted object.
|
||||||
osg::FrameStamp _frameStamp;
|
osg::FrameStamp _frameStamp;
|
||||||
|
|
||||||
osgGA::EventQueue::Events _events;
|
osgGA::EventQueue::Events _events;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DataConverter
|
class DataConverter
|
||||||
@@ -186,22 +186,22 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+1>=_endPtr) return;
|
if (_currentPtr+1>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read1(char* ptr)
|
inline void read1(char* ptr)
|
||||||
{
|
{
|
||||||
if (_currentPtr+1>=_endPtr) return;
|
if (_currentPtr+1>=_endPtr) return;
|
||||||
|
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void write2(char* ptr)
|
inline void write2(char* ptr)
|
||||||
{
|
{
|
||||||
if (_currentPtr+2>=_endPtr) return;
|
if (_currentPtr+2>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read2(char* ptr)
|
inline void read2(char* ptr)
|
||||||
@@ -210,13 +210,13 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,10 +224,10 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+4>=_endPtr) return;
|
if (_currentPtr+4>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read4(char* ptr)
|
inline void read4(char* ptr)
|
||||||
@@ -236,17 +236,17 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+3) = *(_currentPtr++);
|
*(ptr+3) = *(_currentPtr++);
|
||||||
*(ptr+2) = *(_currentPtr++);
|
*(ptr+2) = *(_currentPtr++);
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,15 +254,15 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+8>=_endPtr) return;
|
if (_currentPtr+8>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read8(char* ptr)
|
inline void read8(char* ptr)
|
||||||
@@ -272,27 +272,27 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+7) = *(_currentPtr++);
|
*(ptr+7) = *(_currentPtr++);
|
||||||
*(ptr+6) = *(_currentPtr++);
|
*(ptr+6) = *(_currentPtr++);
|
||||||
*(ptr+5) = *(_currentPtr++);
|
*(ptr+5) = *(_currentPtr++);
|
||||||
*(ptr+4) = *(_currentPtr++);
|
*(ptr+4) = *(_currentPtr++);
|
||||||
|
|
||||||
*(ptr+3) = *(_currentPtr++);
|
*(ptr+3) = *(_currentPtr++);
|
||||||
*(ptr+2) = *(_currentPtr++);
|
*(ptr+2) = *(_currentPtr++);
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
|
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,14 +305,14 @@ class DataConverter
|
|||||||
inline void writeFloat(float c) { write4((char*)&c); }
|
inline void writeFloat(float c) { write4((char*)&c); }
|
||||||
inline void writeDouble(double c) { write8((char*)&c); }
|
inline void writeDouble(double c) { write8((char*)&c); }
|
||||||
|
|
||||||
inline char readChar() { char c; read1(&c); return c; }
|
inline char readChar() { char c=0; read1(&c); return c; }
|
||||||
inline unsigned char readUChar() { unsigned char c; read1((char*)&c); return c; }
|
inline unsigned char readUChar() { unsigned char c=0; read1((char*)&c); return c; }
|
||||||
inline short readShort() { short c; read2((char*)&c); return c; }
|
inline short readShort() { short c=0; read2((char*)&c); return c; }
|
||||||
inline unsigned short readUShort() { unsigned short c; read2((char*)&c); return c; }
|
inline unsigned short readUShort() { unsigned short c=0; read2((char*)&c); return c; }
|
||||||
inline int readInt() { int c; read4((char*)&c); return c; }
|
inline int readInt() { int c=0; read4((char*)&c); return c; }
|
||||||
inline unsigned int readUInt() { unsigned int c; read4((char*)&c); return c; }
|
inline unsigned int readUInt() { unsigned int c=0; read4((char*)&c); return c; }
|
||||||
inline float readFloat() { float c; read4((char*)&c); return c; }
|
inline float readFloat() { float c=0.0f; read4((char*)&c); return c; }
|
||||||
inline double readDouble() { double c; read8((char*)&c); return c; }
|
inline double readDouble() { double c=0.0; read8((char*)&c); return c; }
|
||||||
|
|
||||||
void write(const osg::FrameStamp& fs);
|
void write(const osg::FrameStamp& fs);
|
||||||
void read(osg::FrameStamp& fs);
|
void read(osg::FrameStamp& fs);
|
||||||
@@ -322,13 +322,13 @@ class DataConverter
|
|||||||
|
|
||||||
void write(const osgGA::GUIEventAdapter& event);
|
void write(const osgGA::GUIEventAdapter& event);
|
||||||
void read(osgGA::GUIEventAdapter& event);
|
void read(osgGA::GUIEventAdapter& event);
|
||||||
|
|
||||||
void write(CameraPacket& cameraPacket);
|
void write(CameraPacket& cameraPacket);
|
||||||
void read(CameraPacket& cameraPacket);
|
void read(CameraPacket& cameraPacket);
|
||||||
|
|
||||||
char* startPtr() { return _startPtr; }
|
char* startPtr() { return _startPtr; }
|
||||||
unsigned int numBytes() { return _numBytes; }
|
unsigned int numBytes() { return _numBytes; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
char* _startPtr;
|
char* _startPtr;
|
||||||
@@ -341,4 +341,4 @@ class DataConverter
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -46,16 +46,16 @@ public:
|
|||||||
|
|
||||||
void setSnapImageOnNextFrame(bool flag) { _snapImageOnNextFrame = flag; }
|
void setSnapImageOnNextFrame(bool flag) { _snapImageOnNextFrame = flag; }
|
||||||
bool getSnapImageOnNextFrame() const { return _snapImageOnNextFrame; }
|
bool getSnapImageOnNextFrame() const { return _snapImageOnNextFrame; }
|
||||||
|
|
||||||
virtual void operator () (const osg::Camera& camera) const
|
virtual void operator () (const osg::Camera& camera) const
|
||||||
{
|
{
|
||||||
if (!_snapImageOnNextFrame) return;
|
if (!_snapImageOnNextFrame) return;
|
||||||
|
|
||||||
int x = static_cast<int>(camera.getViewport()->x());
|
int x = static_cast<int>(camera.getViewport()->x());
|
||||||
int y = static_cast<int>(camera.getViewport()->y());
|
int y = static_cast<int>(camera.getViewport()->y());
|
||||||
unsigned int width = static_cast<unsigned int>(camera.getViewport()->width());
|
unsigned int width = static_cast<unsigned int>(camera.getViewport()->width());
|
||||||
unsigned int height = static_cast<unsigned int>(camera.getViewport()->height());
|
unsigned int height = static_cast<unsigned int>(camera.getViewport()->height());
|
||||||
|
|
||||||
osg::ref_ptr<osg::Image> image = new osg::Image;
|
osg::ref_ptr<osg::Image> image = new osg::Image;
|
||||||
image->readPixels(x,y,width,height,
|
image->readPixels(x,y,width,height,
|
||||||
GL_RGB,GL_UNSIGNED_BYTE);
|
GL_RGB,GL_UNSIGNED_BYTE);
|
||||||
@@ -64,16 +64,16 @@ public:
|
|||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE) << "Saved screen image to `"<<_filename<<"`"<< std::endl;
|
osg::notify(osg::NOTICE) << "Saved screen image to `"<<_filename<<"`"<< std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
_snapImageOnNextFrame = false;
|
_snapImageOnNextFrame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
std::string _filename;
|
std::string _filename;
|
||||||
mutable bool _snapImageOnNextFrame;
|
mutable bool _snapImageOnNextFrame;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::string ExportHTML::createFileName(const std::string& basename, unsigned int page, const std::string& ext)
|
std::string ExportHTML::createFileName(const std::string& basename, unsigned int page, const std::string& ext)
|
||||||
@@ -102,7 +102,7 @@ bool ExportHTML::write(osgPresentation::SlideEventHandler* seh, osgViewer::Viewe
|
|||||||
image_basename = osgDB::getNameLessExtension(filename);
|
image_basename = osgDB::getNameLessExtension(filename);
|
||||||
image_ext = ".jpg";
|
image_ext = ".jpg";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout<<"Writing slides to "<<image_basename<<"_[slidenumber]"<<image_ext<<std::endl;
|
std::cout<<"Writing slides to "<<image_basename<<"_[slidenumber]"<<image_ext<<std::endl;
|
||||||
|
|
||||||
osg::ref_ptr<SnapImageDrawCallback> sidc = new SnapImageDrawCallback;
|
osg::ref_ptr<SnapImageDrawCallback> sidc = new SnapImageDrawCallback;
|
||||||
@@ -169,7 +169,7 @@ bool ExportHTML::write(osgPresentation::SlideEventHandler* seh, osgViewer::Viewe
|
|||||||
}
|
}
|
||||||
fout<<"</tr>"<<std::endl;
|
fout<<"</tr>"<<std::endl;
|
||||||
fout<<"</table>"<<std::endl;
|
fout<<"</table>"<<std::endl;
|
||||||
fout<<"<img src=\""<<osgDB::getSimpleFileName(os.str())<<"\">"<<std::endl;
|
fout<<"<img src=\""<<osgDB::getSimpleFileName(os.str())<<"\">"<<std::endl;
|
||||||
fout<<"</html>"<<std::endl;
|
fout<<"</html>"<<std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -54,11 +54,6 @@ bool PointsEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActio
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PointsEventHandler::accept(osgGA::GUIEventHandlerVisitor& v)
|
|
||||||
{
|
|
||||||
v.visit(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PointsEventHandler::getUsage(osg::ApplicationUsage& usage) const
|
void PointsEventHandler::getUsage(osg::ApplicationUsage& usage) const
|
||||||
{
|
{
|
||||||
usage.addKeyboardMouseBinding("+","Increase point size");
|
usage.addKeyboardMouseBinding("+","Increase point size");
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -22,25 +22,23 @@ class PointsEventHandler : public osgGA::GUIEventHandler
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PointsEventHandler();
|
PointsEventHandler();
|
||||||
|
|
||||||
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&);
|
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&);
|
||||||
|
|
||||||
virtual void accept(osgGA::GUIEventHandlerVisitor& v);
|
|
||||||
|
|
||||||
void getUsage(osg::ApplicationUsage& usage) const;
|
void getUsage(osg::ApplicationUsage& usage) const;
|
||||||
|
|
||||||
void setStateSet(osg::StateSet* stateset) { _stateset=stateset; }
|
void setStateSet(osg::StateSet* stateset) { _stateset=stateset; }
|
||||||
|
|
||||||
osg::StateSet* getStateSet() { return _stateset.get(); }
|
osg::StateSet* getStateSet() { return _stateset.get(); }
|
||||||
|
|
||||||
const osg::StateSet* getStateSet() const { return _stateset.get(); }
|
const osg::StateSet* getStateSet() const { return _stateset.get(); }
|
||||||
|
|
||||||
void setPointSize(float psize);
|
void setPointSize(float psize);
|
||||||
|
|
||||||
float getPointSize() const;
|
float getPointSize() const;
|
||||||
|
|
||||||
void changePointSize(float delta);
|
void changePointSize(float delta);
|
||||||
|
|
||||||
void changePointAttenuation(float scale);
|
void changePointAttenuation(float scale);
|
||||||
|
|
||||||
osg::ref_ptr<osg::StateSet> _stateset;
|
osg::ref_ptr<osg::StateSet> _stateset;
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ class AddVolumeEditingCallbackVisitor : public osg::NodeVisitor
|
|||||||
public:
|
public:
|
||||||
AddVolumeEditingCallbackVisitor():
|
AddVolumeEditingCallbackVisitor():
|
||||||
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
|
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
|
||||||
|
|
||||||
void apply(osg::Group& group)
|
void apply(osg::Group& group)
|
||||||
{
|
{
|
||||||
osgVolume::VolumeTile* volumeTile = dynamic_cast<osgVolume::VolumeTile*>(&group);
|
osgVolume::VolumeTile* volumeTile = dynamic_cast<osgVolume::VolumeTile*>(&group);
|
||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
traverse(group);
|
traverse(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool p3d::getFileNames(osg::ArgumentParser& arguments, FileNameList& xmlFiles, FileNameList& normalFiles)
|
bool p3d::getFileNames(osg::ArgumentParser& arguments, FileNameList& xmlFiles, FileNameList& normalFiles)
|
||||||
@@ -62,7 +62,7 @@ bool p3d::getFileNames(osg::ArgumentParser& arguments, FileNameList& xmlFiles, F
|
|||||||
if (!arguments.isOption(pos))
|
if (!arguments.isOption(pos))
|
||||||
{
|
{
|
||||||
std::string ext = osgDB::getFileExtension(arguments[pos]);
|
std::string ext = osgDB::getFileExtension(arguments[pos]);
|
||||||
if (osgDB::equalCaseInsensitive(ext,"xml") || osgDB::equalCaseInsensitive(ext,"p3d"))
|
if (osgDB::equalCaseInsensitive(ext,"xml") || osgDB::equalCaseInsensitive(ext,"p3d"))
|
||||||
{
|
{
|
||||||
xmlFiles.push_back(arguments[pos]);
|
xmlFiles.push_back(arguments[pos]);
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ bool p3d::getFileNames(osg::ArgumentParser& arguments, FileNameList& xmlFiles, F
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (!xmlFiles.empty() || !normalFiles.empty());
|
return (!xmlFiles.empty() || !normalFiles.empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool p3d::readEnvVars(osg::ArgumentParser& arguments)
|
bool p3d::readEnvVars(osg::ArgumentParser& arguments)
|
||||||
{
|
{
|
||||||
@@ -94,23 +94,23 @@ bool p3d::readEnvVars(osg::ArgumentParser& arguments)
|
|||||||
{
|
{
|
||||||
osgDB::getDataFilePathList().push_front(path);
|
osgDB::getDataFilePathList().push_front(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p3d::readEnvVars(file)) readVars = true;
|
if (p3d::readEnvVars(file)) readVars = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return readVars;
|
return readVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool p3d::readEnvVars(const std::string& fileName)
|
bool p3d::readEnvVars(const std::string& fileName)
|
||||||
{
|
{
|
||||||
std::string ext = osgDB::getFileExtension(fileName);
|
std::string ext = osgDB::getFileExtension(fileName);
|
||||||
if (!osgDB::equalCaseInsensitive(ext,"xml") &&
|
if (!osgDB::equalCaseInsensitive(ext,"xml") &&
|
||||||
!osgDB::equalCaseInsensitive(ext,"p3d")) return false;
|
!osgDB::equalCaseInsensitive(ext,"p3d")) return false;
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<osgDB::XmlNode> doc = new osgDB::XmlNode;
|
osg::ref_ptr<osgDB::XmlNode> doc = new osgDB::XmlNode;
|
||||||
osgDB::XmlNode* root = 0;
|
osgDB::XmlNode* root = 0;
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ bool p3d::readEnvVars(const std::string& fileName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool readVars = false;
|
bool readVars = false;
|
||||||
|
|
||||||
for(osgDB::XmlNode::Children::iterator itr = root->children.begin();
|
for(osgDB::XmlNode::Children::iterator itr = root->children.begin();
|
||||||
itr != root->children.end();
|
itr != root->children.end();
|
||||||
++itr)
|
++itr)
|
||||||
@@ -182,7 +182,7 @@ osgDB::Options* createOptions(const osgDB::ReaderWriter::Options* options)
|
|||||||
osg::ref_ptr<osg::Node> p3d::readHoldingSlide(const std::string& filename)
|
osg::ref_ptr<osg::Node> p3d::readHoldingSlide(const std::string& filename)
|
||||||
{
|
{
|
||||||
std::string ext = osgDB::getFileExtension(filename);
|
std::string ext = osgDB::getFileExtension(filename);
|
||||||
if (!osgDB::equalCaseInsensitive(ext,"xml") &&
|
if (!osgDB::equalCaseInsensitive(ext,"xml") &&
|
||||||
!osgDB::equalCaseInsensitive(ext,"p3d")) return 0;
|
!osgDB::equalCaseInsensitive(ext,"p3d")) return 0;
|
||||||
|
|
||||||
osg::ref_ptr<osgDB::ReaderWriter::Options> options = createOptions(0);
|
osg::ref_ptr<osgDB::ReaderWriter::Options> options = createOptions(0);
|
||||||
@@ -260,12 +260,12 @@ osg::ref_ptr<osg::Node> p3d::readShowFiles(osg::ArgumentParser& arguments,const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeList.empty())
|
if (nodeList.empty())
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::ref_ptr<osg::Node> root;
|
osg::ref_ptr<osg::Node> root;
|
||||||
|
|
||||||
if (nodeList.size()==1)
|
if (nodeList.size()==1)
|
||||||
@@ -274,7 +274,7 @@ osg::ref_ptr<osg::Node> p3d::readShowFiles(osg::ArgumentParser& arguments,const
|
|||||||
}
|
}
|
||||||
else // size >1
|
else // size >1
|
||||||
{
|
{
|
||||||
|
|
||||||
osg::Switch* sw = new osg::Switch;
|
osg::Switch* sw = new osg::Switch;
|
||||||
for(NodeList::iterator itr=nodeList.begin();
|
for(NodeList::iterator itr=nodeList.begin();
|
||||||
itr!=nodeList.end();
|
itr!=nodeList.end();
|
||||||
@@ -283,7 +283,7 @@ osg::ref_ptr<osg::Node> p3d::readShowFiles(osg::ArgumentParser& arguments,const
|
|||||||
sw->addChild((*itr).get());
|
sw->addChild((*itr).get());
|
||||||
}
|
}
|
||||||
sw->setSingleChildOn(0);
|
sw->setSingleChildOn(0);
|
||||||
|
|
||||||
sw->setEventCallback(new p3d::ShowEventHandler());
|
sw->setEventCallback(new p3d::ShowEventHandler());
|
||||||
|
|
||||||
root = sw;
|
root = sw;
|
||||||
@@ -292,7 +292,7 @@ osg::ref_ptr<osg::Node> p3d::readShowFiles(osg::ArgumentParser& arguments,const
|
|||||||
if (root.valid())
|
if (root.valid())
|
||||||
{
|
{
|
||||||
osg::notify(osg::INFO)<<"Got node now adding callback"<<std::endl;
|
osg::notify(osg::INFO)<<"Got node now adding callback"<<std::endl;
|
||||||
|
|
||||||
AddVolumeEditingCallbackVisitor avecv;
|
AddVolumeEditingCallbackVisitor avecv;
|
||||||
root->accept(avecv);
|
root->accept(avecv);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -28,13 +28,13 @@ bool ShowEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
|||||||
case(osgGA::GUIEventAdapter::KEYUP):
|
case(osgGA::GUIEventAdapter::KEYUP):
|
||||||
{
|
{
|
||||||
osg::notify(osg::INFO)<<"ShowEventHandler KEYUP "<<(int)ea.getKey()<<std::endl;
|
osg::notify(osg::INFO)<<"ShowEventHandler KEYUP "<<(int)ea.getKey()<<std::endl;
|
||||||
if (ea.getKey()>=osgGA::GUIEventAdapter::KEY_F1 &&
|
if (ea.getKey()>=osgGA::GUIEventAdapter::KEY_F1 &&
|
||||||
ea.getKey()<=osgGA::GUIEventAdapter::KEY_F8)
|
ea.getKey()<=osgGA::GUIEventAdapter::KEY_F8)
|
||||||
{
|
{
|
||||||
unsigned int child = ea.getKey()-osgGA::GUIEventAdapter::KEY_F1;
|
unsigned int child = ea.getKey()-osgGA::GUIEventAdapter::KEY_F1;
|
||||||
osg::notify(osg::INFO)<<" Select "<<child<<std::endl;
|
osg::notify(osg::INFO)<<" Select "<<child<<std::endl;
|
||||||
osg::Switch* showSwitch = dynamic_cast<osg::Switch*>(object);
|
osg::Switch* showSwitch = dynamic_cast<osg::Switch*>(object);
|
||||||
if (showSwitch)
|
if (showSwitch)
|
||||||
{
|
{
|
||||||
if (child<showSwitch->getNumChildren())
|
if (child<showSwitch->getNumChildren())
|
||||||
{
|
{
|
||||||
@@ -52,12 +52,6 @@ bool ShowEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionA
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShowEventHandler::accept(osgGA::GUIEventHandlerVisitor& v)
|
|
||||||
{
|
|
||||||
v.visit(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShowEventHandler::getUsage(osg::ApplicationUsage& /*usage*/) const
|
void ShowEventHandler::getUsage(osg::ApplicationUsage& /*usage*/) const
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
/* -*-c++-*- Present3D - Copyright (C) 1999-2006 Robert Osfield
|
||||||
*
|
*
|
||||||
* This software is open source and may be redistributed and/or modified under
|
* This software is open source and may be redistributed and/or modified under
|
||||||
* the terms of the GNU General Public License (GPL) version 2.0.
|
* the terms of the GNU General Public License (GPL) version 2.0.
|
||||||
* The full license is in LICENSE.txt file included with this distribution,.
|
* The full license is in LICENSE.txt file included with this distribution,.
|
||||||
*
|
*
|
||||||
* This software is distributed in the hope that it will be useful,
|
* This software is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* include LICENSE.txt for more details.
|
* include LICENSE.txt for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -28,11 +28,9 @@ class ShowEventHandler : public osgGA::GUIEventHandler
|
|||||||
ShowEventHandler();
|
ShowEventHandler();
|
||||||
|
|
||||||
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv);
|
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv);
|
||||||
|
|
||||||
virtual void accept(osgGA::GUIEventHandlerVisitor& v);
|
|
||||||
|
|
||||||
virtual void getUsage(osg::ApplicationUsage& usage) const;
|
virtual void getUsage(osg::ApplicationUsage& usage) const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
#include <osg/CameraNode>
|
|
||||||
#include <osg/Texture2D>
|
#include <osg/Texture2D>
|
||||||
#include <osg/AutoTransform>
|
#include <osg/AutoTransform>
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
@@ -37,9 +36,10 @@
|
|||||||
#include <osgGA/TerrainManipulator>
|
#include <osgGA/TerrainManipulator>
|
||||||
#include <osgGA/AnimationPathManipulator>
|
#include <osgGA/AnimationPathManipulator>
|
||||||
#include <osgGA/StateSetManipulator>
|
#include <osgGA/StateSetManipulator>
|
||||||
|
#include <osgGA/MultiTouchTrackballManipulator>
|
||||||
|
|
||||||
#include <osgPresentation/SlideEventHandler>
|
#include <osgPresentation/SlideEventHandler>
|
||||||
#include <osgPresentation/SlideShowConstructor>
|
#include <osgPresentation/Cursor>
|
||||||
|
|
||||||
#include "ReadShowFile.h"
|
#include "ReadShowFile.h"
|
||||||
#include "PointsEventHandler.h"
|
#include "PointsEventHandler.h"
|
||||||
@@ -51,6 +51,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef USE_SDL
|
#ifdef USE_SDL
|
||||||
@@ -129,148 +130,103 @@ void setViewer(osgViewer::Viewer& viewer, float width, float height, float dista
|
|||||||
|
|
||||||
viewer.getCamera()->setProjectionMatrixAsPerspective( vfov, width/height, 0.1, 1000.0);
|
viewer.getCamera()->setProjectionMatrixAsPerspective( vfov, width/height, 0.1, 1000.0);
|
||||||
|
|
||||||
OSG_NOTICE<<"setProjectionMatrixAsPerspective( "<<vfov<<", "<<width/height<<", "<<0.1<<", "<<1000.0<<");"<<std::endl;
|
OSG_INFO<<"setProjectionMatrixAsPerspective( "<<vfov<<", "<<width/height<<", "<<0.1<<", "<<1000.0<<");"<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ForwardToDeviceEventHandler : public osgGA::GUIEventHandler {
|
class ForwardToDeviceEventHandler : public osgGA::GUIEventHandler {
|
||||||
public:
|
public:
|
||||||
ForwardToDeviceEventHandler(osgGA::Device* device) : osgGA::GUIEventHandler(), _device(device) {}
|
ForwardToDeviceEventHandler(osgGA::Device* device, bool format_mouse_events) : osgGA::GUIEventHandler(), _device(device), _forwardMouseEvents(format_mouse_events) {}
|
||||||
|
|
||||||
virtual bool handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa, osg::Object *, osg::NodeVisitor *)
|
virtual bool handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa, osg::Object *, osg::NodeVisitor *)
|
||||||
{
|
{
|
||||||
OSG_INFO<<"ForwardToDeviceEventHandler::setEvent("<<ea.getKey()<<")"<<std::endl;
|
switch (ea.getEventType())
|
||||||
_device->sendEvent(ea);
|
{
|
||||||
|
case osgGA::GUIEventAdapter::PUSH:
|
||||||
|
case osgGA::GUIEventAdapter::RELEASE:
|
||||||
|
case osgGA::GUIEventAdapter::MOVE:
|
||||||
|
case osgGA::GUIEventAdapter::DRAG:
|
||||||
|
case osgGA::GUIEventAdapter::SCROLL:
|
||||||
|
if (_forwardMouseEvents)
|
||||||
|
_device->sendEvent(ea);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
_device->sendEvent(ea);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
osg::ref_ptr<osgGA::Device> _device;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
bool handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv)
|
||||||
class FollowMouseCallback: public osgGA::GUIEventHandler
|
{
|
||||||
{
|
if (event->asGUIEventAdapter())
|
||||||
public:
|
return osgGA::GUIEventHandler::handle(event, object, nv);
|
||||||
|
else
|
||||||
FollowMouseCallback():
|
|
||||||
_mousePostition(0.5,0.5) {}
|
|
||||||
|
|
||||||
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv)
|
|
||||||
{
|
{
|
||||||
osg::AutoTransform* transform = dynamic_cast<osg::AutoTransform*>(object);
|
_device->sendEvent(*event);
|
||||||
if (!transform) return false;
|
|
||||||
|
|
||||||
osg::NotifySeverity level = osg::INFO;
|
|
||||||
|
|
||||||
switch(ea.getEventType())
|
|
||||||
{
|
|
||||||
case(osgGA::GUIEventAdapter::PUSH):
|
|
||||||
case(osgGA::GUIEventAdapter::RELEASE):
|
|
||||||
case(osgGA::GUIEventAdapter::MOVE):
|
|
||||||
case(osgGA::GUIEventAdapter::DRAG):
|
|
||||||
|
|
||||||
osg::notify(level)<<std::endl<<"ea.getGraphicsContext()="<<ea.getGraphicsContext()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getWindowWidth()="<<ea.getWindowWidth()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getWindowHeight()="<<ea.getWindowHeight()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getX()="<<ea.getX()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getXin()="<<ea.getXmin()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getXmax()="<<ea.getXmax()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getY()="<<ea.getY()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getYin()="<<ea.getYmin()<<std::endl;
|
|
||||||
osg::notify(level)<<"ea.getYmax()="<<ea.getYmax()<<std::endl;
|
|
||||||
|
|
||||||
_mousePostition.set(ea.getXnormalized(), ea.getYnormalized());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case(osgGA::GUIEventAdapter::FRAME):
|
|
||||||
{
|
|
||||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
|
|
||||||
|
|
||||||
|
|
||||||
osg::Camera* camera = view->getCamera();
|
|
||||||
osg::Matrix VP = camera->getViewMatrix() * camera->getProjectionMatrix();
|
|
||||||
|
|
||||||
osg::Matrix inverse_VP;
|
|
||||||
inverse_VP.invert(VP);
|
|
||||||
|
|
||||||
osg::Vec3d start_eye(_mousePostition.x(), _mousePostition.y(), 0.0);
|
|
||||||
osg::Vec3d end_eye(_mousePostition.x(), _mousePostition.y(), 1.0);
|
|
||||||
|
|
||||||
osg::Vec3d start_world = start_eye * inverse_VP;
|
|
||||||
osg::Vec3d end_world = start_eye * inverse_VP;
|
|
||||||
|
|
||||||
osg::notify(level)<<"start_world="<<start_world<<std::endl;
|
|
||||||
osg::notify(level)<<"end_world="<<end_world<<std::endl;
|
|
||||||
|
|
||||||
if (end_world.valid()) transform->setPosition(end_world);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OSG_NOTICE<<"Ignoring invalid end_world position"<<std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case(osgGA::GUIEventAdapter::KEYDOWN):
|
|
||||||
{
|
|
||||||
if (ea.getKey()=='c')
|
|
||||||
{
|
|
||||||
for(unsigned int i=0; i< transform->getNumChildren(); ++i)
|
|
||||||
{
|
|
||||||
osg::Node* node = transform->getChild(i);
|
|
||||||
node->setNodeMask(
|
|
||||||
node->getNodeMask()!=0 ?
|
|
||||||
0 :
|
|
||||||
0xffffff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void accept(osgGA::GUIEventHandlerVisitor& v)
|
|
||||||
{
|
|
||||||
v.visit(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
osg::Vec2d _mousePostition;
|
|
||||||
};
|
|
||||||
|
|
||||||
osg::Node* createCursorSubgraph(const std::string& filename, float size)
|
|
||||||
{
|
|
||||||
osg::Geode* geode = new osg::Geode;
|
|
||||||
|
|
||||||
size = 20.0f;
|
|
||||||
|
|
||||||
osg::Geometry* geom = osg::createTexturedQuadGeometry(osg::Vec3(-size*0.5f,-size*0.5f,0.0f),osg::Vec3(size,0.0f,0.0f),osg::Vec3(0.0f,size,0.0f));
|
|
||||||
geom->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
|
||||||
|
|
||||||
osg::Image* image = osgDB::readImageFile(osgDB::findDataFile(filename));
|
|
||||||
if (image)
|
|
||||||
{
|
|
||||||
osg::StateSet* stateset = geom->getOrCreateStateSet();
|
|
||||||
stateset->setTextureAttributeAndModes(0, new osg::Texture2D(image),osg::StateAttribute::ON|osg::StateAttribute::PROTECTED);
|
|
||||||
stateset->setMode(GL_BLEND,osg::StateAttribute::ON|osg::StateAttribute::PROTECTED);
|
|
||||||
// stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
|
|
||||||
stateset->setRenderBinDetails(1000, "DepthSortedBin");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
geode->addDrawable(geom);
|
|
||||||
|
|
||||||
osg::AutoTransform* transform = new osg::AutoTransform;
|
private:
|
||||||
transform->setAutoRotateMode(osg::AutoTransform::ROTATE_TO_CAMERA);
|
osg::ref_ptr<osgGA::Device> _device;
|
||||||
transform->setAutoScaleToScreen(true);
|
bool _forwardMouseEvents;
|
||||||
|
};
|
||||||
|
|
||||||
transform->addChild(geode);
|
|
||||||
|
|
||||||
transform->setEventCallback(new FollowMouseCallback());
|
class DumpEventHandler : public osgGA::GUIEventHandler {
|
||||||
|
public:
|
||||||
|
DumpEventHandler() : osgGA::GUIEventHandler() {}
|
||||||
|
|
||||||
return transform;
|
virtual bool handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa, osg::Object *, osg::NodeVisitor *)
|
||||||
|
{
|
||||||
|
switch (ea.getEventType())
|
||||||
|
{
|
||||||
|
case osgGA::GUIEventAdapter::FRAME:
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::PUSH:
|
||||||
|
std::cout << "PUSH: ";
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::RELEASE:
|
||||||
|
std::cout << "RELEASE: ";
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::MOVE:
|
||||||
|
std::cout << "MOVE: ";
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::DRAG:
|
||||||
|
std::cout << "DRAG: ";
|
||||||
|
break;
|
||||||
|
case osgGA::GUIEventAdapter::SCROLL:
|
||||||
|
std::cout << "SCROLL: ";
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
std::cout << ea.getEventType() << " ";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::cout << ea.getX() << "/" << ea.getY() << " " << ea.isMultiTouchEvent() << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool handle(osgGA::Event* event, osg::Object* object, osg::NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
if (event->asGUIEventAdapter())
|
||||||
|
return osgGA::GUIEventHandler::handle(event, object, nv);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
enum P3DApplicationType
|
enum P3DApplicationType
|
||||||
@@ -292,7 +248,7 @@ void processLoadedModel(osg::ref_ptr<osg::Node>& loadedModel, int optimizer_opti
|
|||||||
loadedModel->getOrCreateStateSet()->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
|
loadedModel->getOrCreateStateSet()->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// optimize the scene graph, remove rendundent nodes and state etc.
|
// optimize the scene graph, remove redundant nodes and state etc.
|
||||||
osgUtil::Optimizer optimizer;
|
osgUtil::Optimizer optimizer;
|
||||||
optimizer.optimize(loadedModel.get(), optimizer_options);
|
optimizer.optimize(loadedModel.get(), optimizer_options);
|
||||||
|
|
||||||
@@ -300,12 +256,15 @@ void processLoadedModel(osg::ref_ptr<osg::Node>& loadedModel, int optimizer_opti
|
|||||||
{
|
{
|
||||||
osg::ref_ptr<osg::Group> group = new osg::Group;
|
osg::ref_ptr<osg::Group> group = new osg::Group;
|
||||||
group->addChild(loadedModel.get());
|
group->addChild(loadedModel.get());
|
||||||
group->addChild(createCursorSubgraph(cursorFileName, 0.05f));
|
|
||||||
|
OSG_NOTICE<<"Creating Cursor"<<std::endl;
|
||||||
|
group->addChild(new osgPresentation::Cursor(cursorFileName, 20.0f));
|
||||||
|
|
||||||
loadedModel = group;
|
loadedModel = group;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addDeviceTo(osgViewer::Viewer& viewer, const std::string& device_name)
|
void addDeviceTo(osgViewer::Viewer& viewer, const std::string& device_name, bool forward_mouse_events)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osgGA::Device> dev = osgDB::readFile<osgGA::Device>(device_name);
|
osg::ref_ptr<osgGA::Device> dev = osgDB::readFile<osgGA::Device>(device_name);
|
||||||
if (dev.valid())
|
if (dev.valid())
|
||||||
@@ -313,8 +272,8 @@ void addDeviceTo(osgViewer::Viewer& viewer, const std::string& device_name)
|
|||||||
OSG_INFO << "Adding Device : " << device_name << std::endl;
|
OSG_INFO << "Adding Device : " << device_name << std::endl;
|
||||||
viewer.addDevice(dev.get());
|
viewer.addDevice(dev.get());
|
||||||
|
|
||||||
if (dev->getCapabilities() & osgGA::Device::SEND_EVENTS)
|
if ((dev->getCapabilities() & osgGA::Device::SEND_EVENTS))
|
||||||
viewer.getEventHandlers().push_front(new ForwardToDeviceEventHandler(dev.get()));
|
viewer.getEventHandlers().push_front(new ForwardToDeviceEventHandler(dev.get(), forward_mouse_events));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -348,6 +307,8 @@ int main( int argc, char **argv )
|
|||||||
arguments.getApplicationUsage()->addCommandLineOption("--html <filename>","Print out slides to a series of html & image files.");
|
arguments.getApplicationUsage()->addCommandLineOption("--html <filename>","Print out slides to a series of html & image files.");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--loop","Switch on looping of presentation.");
|
arguments.getApplicationUsage()->addCommandLineOption("--loop","Switch on looping of presentation.");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--devices","Print the Video input capability via QuickTime and exit.");
|
arguments.getApplicationUsage()->addCommandLineOption("--devices","Print the Video input capability via QuickTime and exit.");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--forwardMouseEvents","forward also mouse/touch-events to the devices");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--suppressEnvTags", "suppresses all found ENV-tags in the presentation");
|
||||||
|
|
||||||
// add alias from xml to p3d to provide backwards compatibility for old p3d files.
|
// add alias from xml to p3d to provide backwards compatibility for old p3d files.
|
||||||
osgDB::Registry::instance()->addFileExtensionAlias("xml","p3d");
|
osgDB::Registry::instance()->addFileExtensionAlias("xml","p3d");
|
||||||
@@ -360,10 +321,13 @@ int main( int argc, char **argv )
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool suppress_env_tags = false;
|
||||||
|
if (arguments.read("--suppressEnvTags"))
|
||||||
|
suppress_env_tags = true;
|
||||||
|
|
||||||
// read any env vars from presentations before we create viewer to make sure the viewer
|
// read any env vars from presentations before we create viewer to make sure the viewer
|
||||||
// utilises these env vars
|
// utilises these env vars
|
||||||
if (p3d::readEnvVars(arguments))
|
if (!suppress_env_tags && p3d::readEnvVars(arguments))
|
||||||
{
|
{
|
||||||
osg::DisplaySettings::instance()->readEnvironmentalVariables();
|
osg::DisplaySettings::instance()->readEnvironmentalVariables();
|
||||||
}
|
}
|
||||||
@@ -451,6 +415,10 @@ int main( int argc, char **argv )
|
|||||||
doSetViewer = false;
|
doSetViewer = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool forwardMouseEvents = false;
|
||||||
|
if (arguments.read("--forwardMouseEvents"))
|
||||||
|
forwardMouseEvents = true;
|
||||||
|
|
||||||
const char* p3dDevice = getenv("P3D_DEVICE");
|
const char* p3dDevice = getenv("P3D_DEVICE");
|
||||||
if (p3dDevice)
|
if (p3dDevice)
|
||||||
{
|
{
|
||||||
@@ -458,7 +426,7 @@ int main( int argc, char **argv )
|
|||||||
osgDB::split(p3dDevice, devices);
|
osgDB::split(p3dDevice, devices);
|
||||||
for(osgDB::StringList::iterator i = devices.begin(); i != devices.end(); ++i)
|
for(osgDB::StringList::iterator i = devices.begin(); i != devices.end(); ++i)
|
||||||
{
|
{
|
||||||
addDeviceTo(viewer, *i);
|
addDeviceTo(viewer, *i, forwardMouseEvents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,7 +434,7 @@ int main( int argc, char **argv )
|
|||||||
std::string device;
|
std::string device;
|
||||||
while (arguments.read("--device", device))
|
while (arguments.read("--device", device))
|
||||||
{
|
{
|
||||||
addDeviceTo(viewer, device);
|
addDeviceTo(viewer, device, forwardMouseEvents);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,7 +477,7 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;
|
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator> keyswitchManipulator = new osgGA::KeySwitchMatrixManipulator;
|
||||||
|
|
||||||
keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::TrackballManipulator() );
|
keyswitchManipulator->addMatrixManipulator( '1', "Trackball", new osgGA::MultiTouchTrackballManipulator() );
|
||||||
keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
|
keyswitchManipulator->addMatrixManipulator( '2', "Flight", new osgGA::FlightManipulator() );
|
||||||
keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
|
keyswitchManipulator->addMatrixManipulator( '3', "Drive", new osgGA::DriveManipulator() );
|
||||||
keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );
|
keyswitchManipulator->addMatrixManipulator( '4', "Terrain", new osgGA::TerrainManipulator() );
|
||||||
@@ -531,6 +499,8 @@ int main( int argc, char **argv )
|
|||||||
viewer.setCameraManipulator( keyswitchManipulator.get() );
|
viewer.setCameraManipulator( keyswitchManipulator.get() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//viewer.getEventHandlers().push_front(new DumpEventHandler());
|
||||||
|
|
||||||
// add the state manipulator
|
// add the state manipulator
|
||||||
osg::ref_ptr<osgGA::StateSetManipulator> ssManipulator = new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet());
|
osg::ref_ptr<osgGA::StateSetManipulator> ssManipulator = new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet());
|
||||||
ssManipulator->setKeyEventToggleTexturing('e');
|
ssManipulator->setKeyEventToggleTexturing('e');
|
||||||
@@ -629,13 +599,13 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// set up optimizer options
|
// set up optimizer options
|
||||||
unsigned int optimizer_options = osgUtil::Optimizer::DEFAULT_OPTIMIZATIONS;
|
unsigned int optimizer_options = osgUtil::Optimizer::DEFAULT_OPTIMIZATIONS;
|
||||||
bool relase_and_compile = false;
|
bool release_and_compile = false;
|
||||||
while (arguments.read("--release-and-compile"))
|
while (arguments.read("--release-and-compile"))
|
||||||
{
|
{
|
||||||
relase_and_compile = true;
|
release_and_compile = true;
|
||||||
}
|
}
|
||||||
seh->setReleaseAndCompileOnEachNewSlide(relase_and_compile);
|
seh->setReleaseAndCompileOnEachNewSlide(release_and_compile);
|
||||||
if (relase_and_compile)
|
if (release_and_compile)
|
||||||
{
|
{
|
||||||
// make sure that imagery stays around after being applied to textures.
|
// make sure that imagery stays around after being applied to textures.
|
||||||
viewer.getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true,false);
|
viewer.getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true,false);
|
||||||
@@ -682,9 +652,10 @@ int main( int argc, char **argv )
|
|||||||
viewer.getUsage(*arguments.getApplicationUsage());
|
viewer.getUsage(*arguments.getApplicationUsage());
|
||||||
|
|
||||||
// if user request help write it out to cout.
|
// if user request help write it out to cout.
|
||||||
if (arguments.read("-h") || arguments.read("--help"))
|
unsigned int helpType = 0;
|
||||||
|
if ((helpType = arguments.readHelpType()))
|
||||||
{
|
{
|
||||||
arguments.getApplicationUsage()->write(osg::notify(osg::NOTICE));
|
arguments.getApplicationUsage()->write(std::cout, helpType);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -779,6 +750,9 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<osgDB::ReaderWriter::Options> cacheAllOption = new osgDB::ReaderWriter::Options;
|
osg::ref_ptr<osgDB::ReaderWriter::Options> cacheAllOption = new osgDB::ReaderWriter::Options;
|
||||||
|
if(suppress_env_tags)
|
||||||
|
cacheAllOption->setPluginStringData("suppressEnvTags", "true");
|
||||||
|
|
||||||
cacheAllOption->setObjectCacheHint(osgDB::ReaderWriter::Options::CACHE_ALL);
|
cacheAllOption->setObjectCacheHint(osgDB::ReaderWriter::Options::CACHE_ALL);
|
||||||
osgDB::Registry::instance()->setOptions(cacheAllOption.get());
|
osgDB::Registry::instance()->setOptions(cacheAllOption.get());
|
||||||
|
|
||||||
@@ -956,7 +930,7 @@ int main( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the scene by traversing it with the the update visitor which will
|
// update the scene by traversing it with the update visitor which will
|
||||||
// call all node update callbacks and animations.
|
// call all node update callbacks and animations.
|
||||||
viewer.eventTraversal();
|
viewer.eventTraversal();
|
||||||
|
|
||||||
@@ -985,7 +959,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the scene by traversing it with the the update visitor which will
|
// update the scene by traversing it with the update visitor which will
|
||||||
// call all node update callbacks and animations.
|
// call all node update callbacks and animations.
|
||||||
viewer.updateTraversal();
|
viewer.updateTraversal();
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ IF(DYNAMIC_OPENSCENEGRAPH)
|
|||||||
ADD_SUBDIRECTORY(osgautocapture)
|
ADD_SUBDIRECTORY(osgautocapture)
|
||||||
ADD_SUBDIRECTORY(osgautotransform)
|
ADD_SUBDIRECTORY(osgautotransform)
|
||||||
ADD_SUBDIRECTORY(osgbillboard)
|
ADD_SUBDIRECTORY(osgbillboard)
|
||||||
|
ADD_SUBDIRECTORY(osgblenddrawbuffers)
|
||||||
ADD_SUBDIRECTORY(osgblendequation)
|
ADD_SUBDIRECTORY(osgblendequation)
|
||||||
ADD_SUBDIRECTORY(osgcallback)
|
ADD_SUBDIRECTORY(osgcallback)
|
||||||
ADD_SUBDIRECTORY(osgcamera)
|
ADD_SUBDIRECTORY(osgcamera)
|
||||||
@@ -46,7 +47,6 @@ IF(DYNAMIC_OPENSCENEGRAPH)
|
|||||||
ADD_SUBDIRECTORY(osgfont)
|
ADD_SUBDIRECTORY(osgfont)
|
||||||
ADD_SUBDIRECTORY(osgforest)
|
ADD_SUBDIRECTORY(osgforest)
|
||||||
ADD_SUBDIRECTORY(osgfxbrowser)
|
ADD_SUBDIRECTORY(osgfxbrowser)
|
||||||
ADD_SUBDIRECTORY(osgframerenderer)
|
|
||||||
ADD_SUBDIRECTORY(osgoutline)
|
ADD_SUBDIRECTORY(osgoutline)
|
||||||
ADD_SUBDIRECTORY(osggameoflife)
|
ADD_SUBDIRECTORY(osggameoflife)
|
||||||
ADD_SUBDIRECTORY(osggeometry)
|
ADD_SUBDIRECTORY(osggeometry)
|
||||||
@@ -65,6 +65,7 @@ IF(DYNAMIC_OPENSCENEGRAPH)
|
|||||||
ADD_SUBDIRECTORY(osglightpoint)
|
ADD_SUBDIRECTORY(osglightpoint)
|
||||||
ADD_SUBDIRECTORY(osglogicop)
|
ADD_SUBDIRECTORY(osglogicop)
|
||||||
ADD_SUBDIRECTORY(osglogo)
|
ADD_SUBDIRECTORY(osglogo)
|
||||||
|
ADD_SUBDIRECTORY(osggpucull)
|
||||||
ADD_SUBDIRECTORY(osggpx)
|
ADD_SUBDIRECTORY(osggpx)
|
||||||
ADD_SUBDIRECTORY(osggraphicscost)
|
ADD_SUBDIRECTORY(osggraphicscost)
|
||||||
ADD_SUBDIRECTORY(osgmanipulator)
|
ADD_SUBDIRECTORY(osgmanipulator)
|
||||||
@@ -95,6 +96,7 @@ IF(DYNAMIC_OPENSCENEGRAPH)
|
|||||||
ADD_SUBDIRECTORY(osgprerendercubemap)
|
ADD_SUBDIRECTORY(osgprerendercubemap)
|
||||||
ADD_SUBDIRECTORY(osgreflect)
|
ADD_SUBDIRECTORY(osgreflect)
|
||||||
ADD_SUBDIRECTORY(osgrobot)
|
ADD_SUBDIRECTORY(osgrobot)
|
||||||
|
ADD_SUBDIRECTORY(osgSSBO)
|
||||||
ADD_SUBDIRECTORY(osgscalarbar)
|
ADD_SUBDIRECTORY(osgscalarbar)
|
||||||
ADD_SUBDIRECTORY(osgscribe)
|
ADD_SUBDIRECTORY(osgscribe)
|
||||||
ADD_SUBDIRECTORY(osgsequence)
|
ADD_SUBDIRECTORY(osgsequence)
|
||||||
@@ -118,14 +120,17 @@ IF(DYNAMIC_OPENSCENEGRAPH)
|
|||||||
ADD_SUBDIRECTORY(osgstereomatch)
|
ADD_SUBDIRECTORY(osgstereomatch)
|
||||||
ADD_SUBDIRECTORY(osgterrain)
|
ADD_SUBDIRECTORY(osgterrain)
|
||||||
ADD_SUBDIRECTORY(osgthreadedterrain)
|
ADD_SUBDIRECTORY(osgthreadedterrain)
|
||||||
|
ADD_SUBDIRECTORY(osgtransferfunction)
|
||||||
ADD_SUBDIRECTORY(osgtext)
|
ADD_SUBDIRECTORY(osgtext)
|
||||||
ADD_SUBDIRECTORY(osgtext3D)
|
ADD_SUBDIRECTORY(osgtext3D)
|
||||||
ADD_SUBDIRECTORY(osgtexture1D)
|
ADD_SUBDIRECTORY(osgtexture1D)
|
||||||
ADD_SUBDIRECTORY(osgtexture2D)
|
ADD_SUBDIRECTORY(osgtexture2D)
|
||||||
|
ADD_SUBDIRECTORY(osgtexture2DArray)
|
||||||
ADD_SUBDIRECTORY(osgtexture3D)
|
ADD_SUBDIRECTORY(osgtexture3D)
|
||||||
ADD_SUBDIRECTORY(osgtexturerectangle)
|
ADD_SUBDIRECTORY(osgtexturerectangle)
|
||||||
ADD_SUBDIRECTORY(osgtexturecompression)
|
ADD_SUBDIRECTORY(osgtexturecompression)
|
||||||
ADD_SUBDIRECTORY(osgthirdpersonview)
|
ADD_SUBDIRECTORY(osgthirdpersonview)
|
||||||
|
ADD_SUBDIRECTORY(osgtransformfeedback)
|
||||||
ADD_SUBDIRECTORY(osguniformbuffer)
|
ADD_SUBDIRECTORY(osguniformbuffer)
|
||||||
ADD_SUBDIRECTORY(osguserstats)
|
ADD_SUBDIRECTORY(osguserstats)
|
||||||
ADD_SUBDIRECTORY(osgvertexprogram)
|
ADD_SUBDIRECTORY(osgvertexprogram)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
// Search in str for all occurences of spat and replace them with rpat.
|
// Search in str for all occurrences of spat and replace them with rpat.
|
||||||
void searchAndReplace(std::string& str, const std::string& spat, const std::string& rpat)
|
void searchAndReplace(std::string& str, const std::string& spat, const std::string& rpat)
|
||||||
{
|
{
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
@@ -30,13 +30,13 @@ void writeShader(osg::Shader* shader, const std::string& cppFileName, const std:
|
|||||||
searchAndReplace(shaderSource, "\r\n", "\n");
|
searchAndReplace(shaderSource, "\r\n", "\n");
|
||||||
searchAndReplace(shaderSource, "\r", "\n");
|
searchAndReplace(shaderSource, "\r", "\n");
|
||||||
searchAndReplace(shaderSource, "\"", "\\\"");
|
searchAndReplace(shaderSource, "\"", "\\\"");
|
||||||
|
|
||||||
std::string variableString = std::string("char ")+variableName+std::string("[] = ");
|
std::string variableString = std::string("char ")+variableName+std::string("[] = ");
|
||||||
|
|
||||||
std::string::size_type startOfLine = 0;
|
std::string::size_type startOfLine = 0;
|
||||||
std::string::size_type endOfLine = shaderSource.find_first_of('\n', startOfLine);
|
std::string::size_type endOfLine = shaderSource.find_first_of('\n', startOfLine);
|
||||||
|
|
||||||
if (endOfLine==std::string::npos)
|
if (endOfLine==std::string::npos)
|
||||||
{
|
{
|
||||||
fout<<variableString<<shaderSource<<"\\n\";"<<std::endl;
|
fout<<variableString<<shaderSource<<"\\n\";"<<std::endl;
|
||||||
}
|
}
|
||||||
@@ -63,21 +63,25 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// set up the usage document, in case we need to print out how to use this program.
|
// set up the usage document, in case we need to print out how to use this program.
|
||||||
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
|
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
|
||||||
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is a utility for converting glsl shader files into char arrays that can be compiled into applications.");
|
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is a utility for converting glsl shader files into char arrays that can be compiled into applications.");
|
||||||
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--shader <filename>","Shader file to create a .cpp file for.");
|
arguments.getApplicationUsage()->addCommandLineOption("--shader <filename>","Shader file to create a .cpp file for.");
|
||||||
|
arguments.getApplicationUsage()->addCommandLineOption("--write-to-source-file-directory","Use the path to the source filename as the directory to write to.");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters");
|
arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display command line parameters");
|
||||||
|
|
||||||
// if user request help write it out to cout.
|
// if user request help write it out to cout.
|
||||||
if (arguments.read("-h") || arguments.read("--help"))
|
if (arguments.read("-h") || arguments.read("--help"))
|
||||||
{
|
{
|
||||||
arguments.getApplicationUsage()->write(std::cout);
|
arguments.getApplicationUsage()->write(std::cout);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool useSamePathAsSourceFile = false;
|
||||||
|
if (arguments.read("--write-to-source-file-directory")) useSamePathAsSourceFile = true;
|
||||||
|
|
||||||
std::string filename;
|
std::string filename;
|
||||||
if (arguments.read("--shader",filename))
|
if (arguments.read("--shader",filename))
|
||||||
{
|
{
|
||||||
@@ -94,9 +98,11 @@ int main( int argc, char **argv )
|
|||||||
name[pos] = '_';
|
name[pos] = '_';
|
||||||
pos = name.find_first_of(invalidCharacters);
|
pos = name.find_first_of(invalidCharacters);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ext = osgDB::getFileExtension(filename);
|
std::string ext = osgDB::getFileExtension(filename);
|
||||||
std::string cppFileName = osgDB::concatPaths(path, name + "_" + ext + ".cpp");
|
std::string cppFileName = name + "_" + ext + ".cpp";
|
||||||
|
if (useSamePathAsSourceFile) cppFileName = osgDB::concatPaths(path, cppFileName);
|
||||||
|
|
||||||
std::string variableName = name + "_" + ext;
|
std::string variableName = name + "_" + ext;
|
||||||
writeShader(shader.get(), cppFileName, variableName);
|
writeShader(shader.get(), cppFileName, variableName);
|
||||||
|
|
||||||
@@ -107,7 +113,7 @@ int main( int argc, char **argv )
|
|||||||
std::cout<<"Error: could not find file '"<<filename<<"'"<<std::endl;
|
std::cout<<"Error: could not find file '"<<filename<<"'"<<std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout<<"No appropriate command line options used."<<std::endl;
|
std::cout<<"No appropriate command line options used."<<std::endl;
|
||||||
|
|||||||
@@ -59,10 +59,10 @@ class ViewerFrameThread : public OpenThreads::Thread
|
|||||||
|
|
||||||
~ViewerFrameThread()
|
~ViewerFrameThread()
|
||||||
{
|
{
|
||||||
cancel();
|
if (isRunning())
|
||||||
while(isRunning())
|
|
||||||
{
|
{
|
||||||
OpenThreads::Thread::YieldCurrentThread();
|
cancel();
|
||||||
|
join();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,25 +107,25 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//We would need to document the following somewhere in order to guide people on
|
//We would need to document the following somewhere in order to guide people on
|
||||||
//what they need to use...
|
//what they need to use...
|
||||||
//
|
//
|
||||||
//----------------------------------------------
|
//----------------------------------------------
|
||||||
//There are two angles to consider.
|
//There are two angles to consider.
|
||||||
//
|
//
|
||||||
//1. If someone wants a widget in their Qt app to be an OSG-rendered scene, they
|
//1. If someone wants a widget in their Qt app to be an OSG-rendered scene, they
|
||||||
//need GraphicsWindowQt (in the osgViewerQtContext example) or QOSGWidget (in the
|
//need GraphicsWindowQt (in the osgViewerQtContext example) or QOSGWidget (in the
|
||||||
//osgViewerQt example). These two allow both OSG and Qt to manage their threads
|
//osgViewerQt example). These two allow both OSG and Qt to manage their threads
|
||||||
//in a way which is optimal to them. We've used QOSGWidget in the past and had
|
//in a way which is optimal to them. We've used QOSGWidget in the past and had
|
||||||
//trouble when Qt tried to overlay other widgets over the QOSGWidget (since OSG
|
//trouble when Qt tried to overlay other widgets over the QOSGWidget (since OSG
|
||||||
//did its rendering independently of Qt, it would overwrite what Qt had drawn). I
|
//did its rendering independently of Qt, it would overwrite what Qt had drawn). I
|
||||||
//haven't tried GraphicsWindowQt yet, but I expect since it uses QGLWidget, it
|
//haven't tried GraphicsWindowQt yet, but I expect since it uses QGLWidget, it
|
||||||
//will result in Qt knowing when OSG has drawn and be able to do overlays at the
|
//will result in Qt knowing when OSG has drawn and be able to do overlays at the
|
||||||
//right time. Eventually GraphicsWindowQt can be brought into osgViewer I imagine...
|
//right time. Eventually GraphicsWindowQt can be brought into osgViewer I imagine...
|
||||||
//
|
//
|
||||||
//2. If someone wants to bring Qt widgets inside their OSG scene (to do HUDs or
|
//2. If someone wants to bring Qt widgets inside their OSG scene (to do HUDs or
|
||||||
//an interface on a computer screen which is inside the 3D scene, or even
|
//an interface on a computer screen which is inside the 3D scene, or even
|
||||||
//floating Qt widgets, for example). That's where QGraphicsViewAdapter +
|
//floating Qt widgets, for example). That's where QGraphicsViewAdapter +
|
||||||
//QWidgetImage will be useful.
|
//QWidgetImage will be useful.
|
||||||
//----------------------------------------------
|
//----------------------------------------------
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ int main(int argc, char **argv)
|
|||||||
bool useLabel = false;
|
bool useLabel = false;
|
||||||
if (arguments.read("--useLabel")) useLabel = true;
|
if (arguments.read("--useLabel")) useLabel = true;
|
||||||
|
|
||||||
// true = make a Qt window with the same content to compare to
|
// true = make a Qt window with the same content to compare to
|
||||||
// QWebViewImage/QWidgetImage
|
// QWebViewImage/QWidgetImage
|
||||||
// false = use QWebViewImage/QWidgetImage (depending on useWidgetImage)
|
// false = use QWebViewImage/QWidgetImage (depending on useWidgetImage)
|
||||||
bool sanityCheck = false;
|
bool sanityCheck = false;
|
||||||
@@ -183,9 +183,9 @@ int main(int argc, char **argv)
|
|||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// QWebViewImage test
|
// QWebViewImage test
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// Note: When the last few issues with QWidgetImage are fixed,
|
// Note: When the last few issues with QWidgetImage are fixed,
|
||||||
// QWebViewImage and this if() {} section can be removed since
|
// QWebViewImage and this if() {} section can be removed since
|
||||||
// QWidgetImage can display a QWebView just like QWebViewImage. Use
|
// QWidgetImage can display a QWebView just like QWebViewImage. Use
|
||||||
// --useWidgetImage --useBrowser to see that in action.
|
// --useWidgetImage --useBrowser to see that in action.
|
||||||
|
|
||||||
if (!sanityCheck)
|
if (!sanityCheck)
|
||||||
@@ -193,7 +193,7 @@ int main(int argc, char **argv)
|
|||||||
osg::ref_ptr<osgQt::QWebViewImage> image = new osgQt::QWebViewImage;
|
osg::ref_ptr<osgQt::QWebViewImage> image = new osgQt::QWebViewImage;
|
||||||
|
|
||||||
if (arguments.argc()>1) image->navigateTo((arguments[1]));
|
if (arguments.argc()>1) image->navigateTo((arguments[1]));
|
||||||
else image->navigateTo("http://www.youtube.com/");
|
else image->navigateTo("http://www.openscenegraph.org/");
|
||||||
|
|
||||||
osgWidget::GeometryHints hints(osg::Vec3(0.0f,0.0f,0.0f),
|
osgWidget::GeometryHints hints(osg::Vec3(0.0f,0.0f,0.0f),
|
||||||
osg::Vec3(1.0f,0.0f,0.0f),
|
osg::Vec3(1.0f,0.0f,0.0f),
|
||||||
@@ -208,7 +208,7 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Sanity check, do the same thing as QGraphicsViewAdapter but in
|
// Sanity check, do the same thing as QGraphicsViewAdapter but in
|
||||||
// a separate Qt window.
|
// a separate Qt window.
|
||||||
QWebPage* webPage = new QWebPage;
|
QWebPage* webPage = new QWebPage;
|
||||||
webPage->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
|
webPage->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
|
||||||
@@ -218,7 +218,7 @@ int main(int argc, char **argv)
|
|||||||
webView->setPage(webPage);
|
webView->setPage(webPage);
|
||||||
|
|
||||||
if (arguments.argc()>1) webView->load(QUrl(arguments[1]));
|
if (arguments.argc()>1) webView->load(QUrl(arguments[1]));
|
||||||
else webView->load(QUrl("http://www.youtube.com/"));
|
else webView->load(QUrl("http://www.openscenegraph.org/"));
|
||||||
|
|
||||||
QGraphicsScene* graphicsScene = new QGraphicsScene;
|
QGraphicsScene* graphicsScene = new QGraphicsScene;
|
||||||
graphicsScene->addWidget(webView);
|
graphicsScene->addWidget(webView);
|
||||||
@@ -240,14 +240,16 @@ int main(int argc, char **argv)
|
|||||||
// QWidgetImage test
|
// QWidgetImage test
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
// QWidgetImage still has some issues, some examples are:
|
// QWidgetImage still has some issues, some examples are:
|
||||||
//
|
//
|
||||||
// 1. Editing in the QTextEdit doesn't work. Also when started with
|
// 1. Editing in the QTextEdit doesn't work. Also when started with
|
||||||
// --useBrowser, editing in the search field on YouTube doesn't
|
// --useBrowser, editing in the search field on YouTube doesn't
|
||||||
// work. But that same search field when using QWebViewImage
|
// work. But that same search field when using QWebViewImage
|
||||||
// works... And editing in the text field in the pop-up getInteger
|
// works... And editing in the text field in the pop-up getInteger
|
||||||
// dialog works too. All these cases use QGraphicsViewAdapter
|
// dialog works too. All these cases use QGraphicsViewAdapter
|
||||||
// under the hood, so why do some work and others don't?
|
// under the hood, so why do some work and others don't?
|
||||||
//
|
//
|
||||||
|
// <<< FIXED, need TextEditorInteraction >>>
|
||||||
|
//
|
||||||
// a) osgQtBrowser --useWidgetImage [--fullscreen] (optional)
|
// a) osgQtBrowser --useWidgetImage [--fullscreen] (optional)
|
||||||
// b) Try to click in the QTextEdit and type, or to select text
|
// b) Try to click in the QTextEdit and type, or to select text
|
||||||
// and drag-and-drop it somewhere else in the QTextEdit. These
|
// and drag-and-drop it somewhere else in the QTextEdit. These
|
||||||
@@ -259,11 +261,11 @@ int main(int argc, char **argv)
|
|||||||
// g) osgQtBrowser
|
// g) osgQtBrowser
|
||||||
// h) Try the operation in f), it works.
|
// h) Try the operation in f), it works.
|
||||||
//
|
//
|
||||||
// 2. Operations on floating windows (--numFloatingWindows 1 or more).
|
// 2. Operations on floating windows (--numFloatingWindows 1 or more).
|
||||||
// Moving by dragging the titlebar, clicking the close button,
|
// Moving by dragging the titlebar, clicking the close button,
|
||||||
// resizing them, none of these work. I wonder if it's because the
|
// resizing them, none of these work. I wonder if it's because the
|
||||||
// OS manages those functions (they're functions of the window
|
// OS manages those functions (they're functions of the window
|
||||||
// decorations) so we need to do something special for that? But
|
// decorations) so we need to do something special for that? But
|
||||||
// in --sanityCheck mode they work.
|
// in --sanityCheck mode they work.
|
||||||
//
|
//
|
||||||
// a) osgQtBrowser --useWidgetImage --numFloatingWindows 1 [--fullscreen]
|
// a) osgQtBrowser --useWidgetImage --numFloatingWindows 1 [--fullscreen]
|
||||||
@@ -272,35 +274,37 @@ int main(int argc, char **argv)
|
|||||||
// c) osgQtBrowser --useWidgetImage --numFloatingWindows 1 --sanityCheck
|
// c) osgQtBrowser --useWidgetImage --numFloatingWindows 1 --sanityCheck
|
||||||
// d) Try the operations in b), all they work.
|
// d) Try the operations in b), all they work.
|
||||||
// e) osgQtBrowser --useWidgetImage [--fullscreen]
|
// e) osgQtBrowser --useWidgetImage [--fullscreen]
|
||||||
// f) Click the button so that the getInteger() dialog is
|
// f) Click the button so that the getInteger() dialog is
|
||||||
// displayed, then try to move that dialog or close it with the
|
// displayed, then try to move that dialog or close it with the
|
||||||
// close button, these don't work.
|
// close button, these don't work.
|
||||||
// g) osgQtBrowser --useWidgetImage --sanityCheck
|
// g) osgQtBrowser --useWidgetImage --sanityCheck
|
||||||
// h) Try the operation in f), it works.
|
// h) Try the operation in f), it works.
|
||||||
//
|
//
|
||||||
// 3. (Minor) The QGraphicsView's scrollbars don't appear when
|
// 3. (Minor) The QGraphicsView's scrollbars don't appear when
|
||||||
// using QWidgetImage or QWebViewImage. QGraphicsView is a
|
// using QWidgetImage or QWebViewImage. QGraphicsView is a
|
||||||
// QAbstractScrollArea and it should display scrollbars as soon as
|
// QAbstractScrollArea and it should display scrollbars as soon as
|
||||||
// the scene is too large to fit the view.
|
// the scene is too large to fit the view.
|
||||||
//
|
//
|
||||||
|
// <<< FIXED >>>
|
||||||
|
//
|
||||||
// a) osgQtBrowser --useWidgetImage --fullscreen
|
// a) osgQtBrowser --useWidgetImage --fullscreen
|
||||||
// b) Resize the OSG window so it's smaller than the QTextEdit.
|
// b) Resize the OSG window so it's smaller than the QTextEdit.
|
||||||
// Scrollbars should appear but don't.
|
// Scrollbars should appear but don't.
|
||||||
// c) osgQtBrowser --useWidgetImage --sanityCheck
|
// c) osgQtBrowser --useWidgetImage --sanityCheck
|
||||||
// d) Try the operation in b), scrollbars appear. Even if you have
|
// d) Try the operation in b), scrollbars appear. Even if you have
|
||||||
// floating windows (by clicking the button or by adding
|
// floating windows (by clicking the button or by adding
|
||||||
// --numFloatingWindows 1) and move them outside the view,
|
// --numFloatingWindows 1) and move them outside the view,
|
||||||
// scrollbars appear too. You can't test that case in OSG for
|
// scrollbars appear too. You can't test that case in OSG for
|
||||||
// now because of problem 2 above, but that's pretty cool.
|
// now because of problem 2 above, but that's pretty cool.
|
||||||
//
|
//
|
||||||
// 4. (Minor) In sanity check mode, the widget added to the
|
// 4. (Minor) In sanity check mode, the widget added to the
|
||||||
// QGraphicsView is centered. With QGraphicsViewAdapter, it is not.
|
// QGraphicsView is centered. With QGraphicsViewAdapter, it is not.
|
||||||
//
|
//
|
||||||
// a) osgQtBrowser --useWidgetImage [--fullscreen]
|
// a) osgQtBrowser --useWidgetImage [--fullscreen]
|
||||||
// b) The QTextEdit and button are not in the center of the image
|
// b) The QTextEdit and button are not in the center of the image
|
||||||
// generated by the QGraphicsViewAdapter.
|
// generated by the QGraphicsViewAdapter.
|
||||||
// c) osgQtBrowser --useWidgetImage --sanityCheck
|
// c) osgQtBrowser --useWidgetImage --sanityCheck
|
||||||
// d) The QTextEdit and button are in the center of the
|
// d) The QTextEdit and button are in the center of the
|
||||||
// QGraphicsView.
|
// QGraphicsView.
|
||||||
|
|
||||||
|
|
||||||
@@ -346,7 +350,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
QTextEdit* textEdit = new QTextEdit(text);
|
QTextEdit* textEdit = new QTextEdit(text);
|
||||||
textEdit->setReadOnly(false);
|
textEdit->setReadOnly(false);
|
||||||
textEdit->setTextInteractionFlags(Qt::TextEditable);
|
textEdit->setTextInteractionFlags(Qt::TextEditorInteraction);
|
||||||
|
|
||||||
QPalette palette = textEdit->palette();
|
QPalette palette = textEdit->palette();
|
||||||
palette.setColor(QPalette::Highlight, Qt::darkBlue);
|
palette.setColor(QPalette::Highlight, Qt::darkBlue);
|
||||||
@@ -388,7 +392,7 @@ int main(int argc, char **argv)
|
|||||||
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
|
texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
|
||||||
mt->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
mt->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
||||||
|
|
||||||
osgViewer::InteractiveImageHandler* handler;
|
osgViewer::InteractiveImageHandler* handler;
|
||||||
if (inScene)
|
if (inScene)
|
||||||
{
|
{
|
||||||
mt->setMatrix(osg::Matrix::rotate(osg::Vec3(0,1,0), osg::Vec3(0,0,1)));
|
mt->setMatrix(osg::Matrix::rotate(osg::Vec3(0,1,0), osg::Vec3(0,0,1)));
|
||||||
@@ -398,9 +402,9 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
else // fullscreen
|
else // fullscreen
|
||||||
{
|
{
|
||||||
// The HUD camera's viewport needs to follow the size of the
|
// The HUD camera's viewport needs to follow the size of the
|
||||||
// window. MyInteractiveImageHandler will make sure of this.
|
// window. MyInteractiveImageHandler will make sure of this.
|
||||||
// As for the quad and the camera's projection, setting the
|
// As for the quad and the camera's projection, setting the
|
||||||
// projection resize policy to FIXED takes care of them, so
|
// projection resize policy to FIXED takes care of them, so
|
||||||
// they can stay the same: (0,1,0,1) with a quad that fits.
|
// they can stay the same: (0,1,0,1) with a quad that fits.
|
||||||
|
|
||||||
@@ -429,13 +433,13 @@ int main(int argc, char **argv)
|
|||||||
overlay->addChild(mt);
|
overlay->addChild(mt);
|
||||||
|
|
||||||
root->addChild(overlay);
|
root->addChild(overlay);
|
||||||
|
|
||||||
quad->setEventCallback(handler);
|
quad->setEventCallback(handler);
|
||||||
quad->setCullCallback(handler);
|
quad->setCullCallback(handler);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Sanity check, do the same thing as QWidgetImage and
|
// Sanity check, do the same thing as QWidgetImage and
|
||||||
// QGraphicsViewAdapter but in a separate Qt window.
|
// QGraphicsViewAdapter but in a separate Qt window.
|
||||||
|
|
||||||
graphicsScene = new QGraphicsScene;
|
graphicsScene = new QGraphicsScene;
|
||||||
|
|||||||
4
examples/osgSSBO/CMakeLists.txt
Normal file
4
examples/osgSSBO/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
SET(TARGET_SRC osgSSBO.cpp )
|
||||||
|
|
||||||
|
SETUP_EXAMPLE(osgSSBO)
|
||||||
949
examples/osgSSBO/osgSSBO.cpp
Normal file
949
examples/osgSSBO/osgSSBO.cpp
Normal file
@@ -0,0 +1,949 @@
|
|||||||
|
//info : osgSSBO example,testing ShaderStorageBufferObjects ,Markus Hein, 2014, osg-3.2.1
|
||||||
|
//required hardware and driver must support GL >= GL 4.3 or GL ES 3.1 (GL ES not tested, would be nice if someone will test it on a small device)
|
||||||
|
|
||||||
|
//testing osg support for Shader Storage Buffer Objects
|
||||||
|
|
||||||
|
//version: "first take" from last night session..
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <osg/StateAttributeCallback>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osgGA/StateSetManipulator>
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
|
||||||
|
#include <osg/Node>
|
||||||
|
#include <osg/PositionAttitudeTransform>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Notify>
|
||||||
|
#include <osg/MatrixTransform>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/TextureRectangle>
|
||||||
|
#include <osg/Stencil>
|
||||||
|
#include <osg/Depth>
|
||||||
|
#include <osg/Billboard>
|
||||||
|
#include <osg/Material>
|
||||||
|
#include <osg/AnimationPath>
|
||||||
|
|
||||||
|
#include <osgGA/TrackballManipulator>
|
||||||
|
#include <osgGA/FlightManipulator>
|
||||||
|
#include <osgGA/DriveManipulator>
|
||||||
|
|
||||||
|
#include <osgUtil/SmoothingVisitor>
|
||||||
|
|
||||||
|
#include <osgDB/Registry>
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osgDB/WriteFile>
|
||||||
|
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
|
#include <osgViewer/Renderer>
|
||||||
|
|
||||||
|
|
||||||
|
#include <osg/Array>
|
||||||
|
#include <osg/BoundingSphere>
|
||||||
|
#include <osg/BufferIndexBinding>
|
||||||
|
#include <osg/BufferObject>
|
||||||
|
#include <osg/Group>
|
||||||
|
#include <osg/Math>
|
||||||
|
#include <osg/MatrixTransform>
|
||||||
|
#include <osg/Program>
|
||||||
|
#include <osg/Shader>
|
||||||
|
#include <osg/Drawable>
|
||||||
|
#include <osg/CopyOp>
|
||||||
|
#include <osg/State>
|
||||||
|
#include <osg/Matrix>
|
||||||
|
#include <osg/ShapeDrawable>
|
||||||
|
#include <osg/GL>
|
||||||
|
#include <osg/StateSet>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/BlendFunc>
|
||||||
|
#include <osg/TexEnv>
|
||||||
|
#include <osg/Material>
|
||||||
|
#include <osg/PointSprite>
|
||||||
|
#include <osg/Program>
|
||||||
|
#include <osg/Notify>
|
||||||
|
#include <osg/Point>
|
||||||
|
#include <osg/io_utils>
|
||||||
|
#include <osg/VertexProgram>
|
||||||
|
|
||||||
|
#include <osgText/Font>
|
||||||
|
#include <osgText/Text>
|
||||||
|
|
||||||
|
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osgDB/WriteFile>
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
|
#include <osgUtil/Optimizer>
|
||||||
|
#include <iostream>
|
||||||
|
#include <typeinfo>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace osg;
|
||||||
|
|
||||||
|
|
||||||
|
//todo .. #define COMPUTATION_IN_SEPARATE_THREAD
|
||||||
|
|
||||||
|
#define WORK_GROUP_SIZE 16
|
||||||
|
|
||||||
|
|
||||||
|
#define PRERENDER_ANTIALIASINGMULTISAMPLES 16
|
||||||
|
#define PRERENDER_HIGH_QUALITY_ANTIALIASING
|
||||||
|
#define PRERENDER_WIDTH 1920
|
||||||
|
#define PRERENDER_HEIGHT 1080
|
||||||
|
|
||||||
|
|
||||||
|
#define SUB_PLACEMENT_OFFSET_HORIZONTAL 0.5
|
||||||
|
#define SUB_PLACEMENT_OFFSET_VERTICAL 0.5
|
||||||
|
|
||||||
|
enum BufferOffset
|
||||||
|
{
|
||||||
|
POSITION_NOW_OFFSET,
|
||||||
|
POSITION_OLD_OFFSET,
|
||||||
|
POSITION_INIT_OFFSET,
|
||||||
|
|
||||||
|
VELOCITY_NOW_OFFSET,
|
||||||
|
VELOCITY_OLD_OFFSET,
|
||||||
|
VELOCITY_INIT_OFFSET,
|
||||||
|
|
||||||
|
ACCELERATION_OFFSET,
|
||||||
|
PROPERTIES_OFFSET,
|
||||||
|
|
||||||
|
OFFSET_END
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const int __numDataValuesPerChannel = OFFSET_END;
|
||||||
|
const int __numChannels = 4;
|
||||||
|
|
||||||
|
//512x512x4x7 = 7.340.032 floats in SSBO on GPU
|
||||||
|
const int NUM_ELEMENTS_X = 512;
|
||||||
|
const int NUM_ELEMENTS_Y = 512;
|
||||||
|
|
||||||
|
float random(float min, float max) { return min + (max - min)*(float)rand() / (float)RAND_MAX; }
|
||||||
|
|
||||||
|
|
||||||
|
enum Channel
|
||||||
|
{
|
||||||
|
RED_CHANNEL,
|
||||||
|
GREEN_CHANNEL,
|
||||||
|
BLUE_CHANNEL,
|
||||||
|
ALPHA_CHANNEL,
|
||||||
|
RGB_CHANNEL,
|
||||||
|
RGBA_CHANNEL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ShaderStorageBufferCallback : public osg::StateAttributeCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void operator() (osg::StateAttribute* attr, osg::NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
//if you need to process the data in your app-code , better leaving it on GPU and processing there, uploading per frame will make it slow
|
||||||
|
#if 0
|
||||||
|
osg::ShaderStorageBufferBinding* ssbb = static_cast<osg::ShaderStorageBufferBinding*>(attr);
|
||||||
|
osg::ShaderStorageBufferObject* ssbo
|
||||||
|
= static_cast<osg::ShaderStorageBufferObject*>(ssbb->getBufferObject());
|
||||||
|
|
||||||
|
osg::FloatArray* array = static_cast<osg::FloatArray*>(ssbo->getBufferData(0));
|
||||||
|
|
||||||
|
float someValue = array->at(0);
|
||||||
|
//std::cout << "someValue now: " << someValue << std::endl;
|
||||||
|
//data transfer performance test
|
||||||
|
// array->dirty();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//do not forget to set OSG_FILE_PATH to default OSG-Data and make sure the new shaders are copied there under"shaders"
|
||||||
|
class ComputeNode : public osg::PositionAttitudeTransform
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Program> _computeProgram;
|
||||||
|
osg::ref_ptr<osg::Shader> _computeShader; //compute and write position data in SSBO
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Shader> _vertexShader; //reading position data from SSBO (OBS!: make sure glMemoryBuffer() is syncing this)
|
||||||
|
osg::ref_ptr<osg::Shader> _geometryShader; //building a quad looking to the camera
|
||||||
|
osg::ref_ptr<osg::Shader> _fragmentShader; //use false-colors etc. for making your data visible
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Node> _helperNode; // coordinate system node
|
||||||
|
|
||||||
|
ref_ptr<osg::ShaderStorageBufferObject> _ssbo;
|
||||||
|
ref_ptr<osg::ShaderStorageBufferBinding> _ssbb;
|
||||||
|
|
||||||
|
GLfloat* _data; // some data we upload to GPU, initialised with random values
|
||||||
|
osg::ref_ptr<FloatArray> _dataArray; //
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Group> _computationResultsRenderGroup;
|
||||||
|
osg::ref_ptr<osg::Program> _computationResultsRenderProgram;
|
||||||
|
osg::ref_ptr<osg::StateSet> _computationResultsRenderStateSet;
|
||||||
|
|
||||||
|
|
||||||
|
std::string _computeShaderSourcePath;
|
||||||
|
std::string _vertexShaderSourcePath;
|
||||||
|
std::string _geometryShaderSourcePath;
|
||||||
|
std::string _fragmentShaderSourcePath;
|
||||||
|
|
||||||
|
|
||||||
|
void addHelperGeometry();
|
||||||
|
void addDataMonitor(osg::Vec3 placement, osg::Vec3 relativePlacement, float scale, Channel channel, BufferOffset shaderBufferOffset, std::string labelcaption, float minDataRange, float maxDataRange);
|
||||||
|
void addComputationResultsRenderTree();
|
||||||
|
void initComputingSetup();
|
||||||
|
|
||||||
|
ComputeNode()
|
||||||
|
{
|
||||||
|
const char* envOsgFilePath = getenv("OSG_FILE_PATH");
|
||||||
|
std::stringstream computeshaderpath; computeshaderpath << envOsgFilePath << "/shaders/osgssboComputeShader.cs";
|
||||||
|
_computeShaderSourcePath = computeshaderpath.str();
|
||||||
|
std::stringstream vertexshaderpath; vertexshaderpath << envOsgFilePath << "/shaders/osgssboVertexShader.vs";
|
||||||
|
_vertexShaderSourcePath = vertexshaderpath.str();
|
||||||
|
std::stringstream geometryshaderpath; geometryshaderpath << envOsgFilePath << "/shaders/osgssboGeometryShader.gs";
|
||||||
|
_geometryShaderSourcePath = geometryshaderpath.str();
|
||||||
|
std::stringstream fragmentshaderpath; fragmentshaderpath << envOsgFilePath << "/shaders/osgssboFragmentShader.fs";
|
||||||
|
_fragmentShaderSourcePath = fragmentshaderpath.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ComputeNodeUpdateCallback : public osg::NodeCallback
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ComputeNode* _computeNode;
|
||||||
|
osg::Timer_t _prevShaderUpdateTime;
|
||||||
|
osg::Timer _timer;
|
||||||
|
|
||||||
|
ComputeNodeUpdateCallback(){}
|
||||||
|
|
||||||
|
ComputeNodeUpdateCallback(ComputeNode* computeNode)
|
||||||
|
{
|
||||||
|
_computeNode = computeNode;
|
||||||
|
_prevShaderUpdateTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
osg::Timer_t currTime = _timer.tick();
|
||||||
|
|
||||||
|
if (_timer.delta_s(_prevShaderUpdateTime, currTime) > 1.0) //one second interval for shader-changed-do-reload check
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Shader> reloadedshader;
|
||||||
|
std::string runningSource;
|
||||||
|
std::string reloadedstring;
|
||||||
|
|
||||||
|
if (_computeNode->_computeShader.valid())
|
||||||
|
{
|
||||||
|
runningSource = _computeNode->_computeShader->getShaderSource();
|
||||||
|
reloadedshader = osg::Shader::readShaderFile(osg::Shader::COMPUTE, _computeNode->_computeShaderSourcePath);
|
||||||
|
|
||||||
|
reloadedstring = reloadedshader->getShaderSource();
|
||||||
|
if (!osgDB::equalCaseInsensitive(runningSource.c_str(), reloadedstring.c_str()))
|
||||||
|
{
|
||||||
|
_computeNode->_computeProgram->removeShader(_computeNode->_computeShader.get());
|
||||||
|
_computeNode->_computeShader = reloadedshader.get();
|
||||||
|
_computeNode->_computeProgram->addShader(_computeNode->_computeShader.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_computeNode->_vertexShader.valid())
|
||||||
|
{
|
||||||
|
|
||||||
|
runningSource = _computeNode->_vertexShader->getShaderSource();
|
||||||
|
reloadedshader = osg::Shader::readShaderFile(osg::Shader::VERTEX, _computeNode->_vertexShaderSourcePath);
|
||||||
|
|
||||||
|
reloadedstring = reloadedshader->getShaderSource();
|
||||||
|
if (!osgDB::equalCaseInsensitive(runningSource.c_str(), reloadedstring.c_str()))
|
||||||
|
{
|
||||||
|
_computeNode->_computationResultsRenderProgram->removeShader(_computeNode->_vertexShader.get());
|
||||||
|
_computeNode->_vertexShader = reloadedshader.get();
|
||||||
|
_computeNode->_computationResultsRenderProgram->addShader(_computeNode->_vertexShader.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (_computeNode->_geometryShader.valid())
|
||||||
|
{
|
||||||
|
runningSource = _computeNode->_geometryShader->getShaderSource();
|
||||||
|
reloadedshader = osg::Shader::readShaderFile(osg::Shader::GEOMETRY, _computeNode->_geometryShaderSourcePath);
|
||||||
|
|
||||||
|
reloadedstring = reloadedshader->getShaderSource();
|
||||||
|
if (!osgDB::equalCaseInsensitive(runningSource.c_str(), reloadedstring.c_str()))
|
||||||
|
{
|
||||||
|
_computeNode->_computationResultsRenderProgram->removeShader(_computeNode->_geometryShader.get());
|
||||||
|
_computeNode->_geometryShader = reloadedshader.get();
|
||||||
|
_computeNode->_computationResultsRenderProgram->addShader(_computeNode->_geometryShader.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_computeNode->_fragmentShader.valid())
|
||||||
|
{
|
||||||
|
runningSource = _computeNode->_fragmentShader->getShaderSource();
|
||||||
|
reloadedshader = osg::Shader::readShaderFile(osg::Shader::FRAGMENT, _computeNode->_fragmentShaderSourcePath);
|
||||||
|
|
||||||
|
reloadedstring = reloadedshader->getShaderSource();
|
||||||
|
if (!osgDB::equalCaseInsensitive(runningSource.c_str(), reloadedstring.c_str()))
|
||||||
|
{
|
||||||
|
_computeNode->_computationResultsRenderProgram->removeShader(_computeNode->_fragmentShader.get());
|
||||||
|
_computeNode->_fragmentShader = reloadedshader.get();
|
||||||
|
_computeNode->_computationResultsRenderProgram->addShader(_computeNode->_fragmentShader.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_prevShaderUpdateTime = _timer.tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(node, nv);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//set OSG_FILE_PATH for loading axes.osgt
|
||||||
|
void ComputeNode::addHelperGeometry()
|
||||||
|
{
|
||||||
|
_helperNode = osgDB::readNodeFile("axes.osgt");
|
||||||
|
|
||||||
|
if (_helperNode.valid())
|
||||||
|
{
|
||||||
|
addChild(_helperNode.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
//osg::PositionAttitudeTransform* pat = new osg::PositionAttitudeTransform;
|
||||||
|
//pat->setPosition(osg::Vec3(0.5, 0, 0.5));
|
||||||
|
//osg::Geode *sphereGeode = new osg::Geode;
|
||||||
|
//float radius = 0.5f;
|
||||||
|
//osg::TessellationHints* hints = new osg::TessellationHints;
|
||||||
|
//hints->setDetailRatio(0.9f);
|
||||||
|
//osg::ShapeDrawable* sphere = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f), radius), hints);
|
||||||
|
//sphereGeode->addDrawable(sphere);
|
||||||
|
//sphere->setColor(osg::Vec4(0, 1, 0, 0.1));
|
||||||
|
//osg::StateSet* stateset = sphereGeode->getOrCreateStateSet();
|
||||||
|
//osg::BlendFunc *blend = new osg::BlendFunc;
|
||||||
|
//blend->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA);
|
||||||
|
//stateset->setAttributeAndModes(blend, osg::StateAttribute::ON);
|
||||||
|
//pat->addChild(sphereGeode);
|
||||||
|
//addChild(pat);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ComputeNode::addDataMonitor(osg::Vec3 placement, osg::Vec3 relativePlacement, float scale, Channel colorchannel, BufferOffset shaderStorageBufferOffset, std::string labelCaption, float minDataRange, float maxDataRange)
|
||||||
|
{
|
||||||
|
osg::PositionAttitudeTransform* pat = new osg::PositionAttitudeTransform;
|
||||||
|
pat->setPosition(relativePlacement);
|
||||||
|
addChild(pat);
|
||||||
|
osg::Geometry* geom;
|
||||||
|
|
||||||
|
if (NUM_ELEMENTS_X >= NUM_ELEMENTS_Y)
|
||||||
|
{
|
||||||
|
float ratio = (float)((float)NUM_ELEMENTS_Y / (float)NUM_ELEMENTS_X);
|
||||||
|
geom = osg::createTexturedQuadGeometry(placement, osg::Vec3(1.0f*scale, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f, ratio*1.0f*scale));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float ratio = (float)((float)NUM_ELEMENTS_X / (float)NUM_ELEMENTS_Y);
|
||||||
|
geom = osg::createTexturedQuadGeometry(placement, osg::Vec3(ratio*1.0f*scale, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f, 1.0f*scale));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
geom->setVertexAttribArray(1, geom->getTexCoordArray(0), osg::Array::BIND_PER_VERTEX);
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Geode> quad = new osg::Geode;
|
||||||
|
quad->addDrawable(geom);
|
||||||
|
quad->setStateSet(getOrCreateStateSet());
|
||||||
|
pat->addChild(quad.get());
|
||||||
|
|
||||||
|
static const char* vertexShaderSrcChannelMonitor = {
|
||||||
|
|
||||||
|
"#version 430 \n"
|
||||||
|
|
||||||
|
"uniform int numRows;\n"
|
||||||
|
"uniform int numCols;\n"
|
||||||
|
"uniform float osg_FrameTime;\n"
|
||||||
|
"uniform mat4 osg_ProjectionMatrix;\n"
|
||||||
|
"uniform mat4 osg_ModelViewMatrix;\n"
|
||||||
|
"out vec2 texCoordFromVertexShader;\n"
|
||||||
|
"struct particle{ float x; float y; float z; float w;};"
|
||||||
|
"layout (location = 0) in vec3 vertexpos;\n"
|
||||||
|
"attribute vec2 tex_coords;\n"
|
||||||
|
"void main() {\n"
|
||||||
|
"texCoordFromVertexShader.xy = tex_coords.xy; gl_Position = ( osg_ProjectionMatrix * osg_ModelViewMatrix * vec4(vertexpos.x,vertexpos.y,vertexpos.z,1) ); \n"
|
||||||
|
"}\n"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
std::stringstream fragmentshaderstringstreamChannelMonitor;
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "#version 430\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "uniform int numRows;\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "uniform int numCols;\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "uniform float dataRangeMin;\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "uniform float dataRangeMax;\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "in vec2 texCoordFromVertexShader;\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "struct particle{ float x; float y; float z; float w;};";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "layout(std140, binding=0) coherent buffer particles{particle p[];}; ";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "void main(void)\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "{\n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "ivec2 storePos = ivec2(numRows*texCoordFromVertexShader.x, numCols*texCoordFromVertexShader.y); particle particleData = p[" << shaderStorageBufferOffset * NUM_ELEMENTS_X*NUM_ELEMENTS_Y << " + (storePos.x*numRows + storePos.y)]; ";
|
||||||
|
|
||||||
|
//fragmentshaderstringstreamChannelMonitor << " memoryBarrierBuffer(); \n";
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " float dataRangeMultiplier = 1.0 / abs(dataRangeMax - dataRangeMin); \n";
|
||||||
|
|
||||||
|
switch (colorchannel)
|
||||||
|
{
|
||||||
|
case RED_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.5+dataRangeMultiplier*particleData.x; color.y =0.0; color.z = 0.0; color.w = 1.0; gl_FragColor = color;\n";
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GREEN_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.0; color.y = 0.5+dataRangeMultiplier*particleData.y; color.z = 0.0; color.w = 1.0; gl_FragColor = color;\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BLUE_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.0; color.y = 0.0; color.z = 0.5+dataRangeMultiplier*particleData.z; color.w = 0.0 ; gl_FragColor = color;\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ALPHA_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.5+dataRangeMultiplier*particleData.w; color.y = 0.5+dataRangeMultiplier*particleData.w; color.z = 0.5+dataRangeMultiplier*particleData.w; color.w = 0.5+0.5*particleData.w; gl_FragColor = color;\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case RGB_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.5+dataRangeMultiplier*particleData.x; color.y = 0.5+dataRangeMultiplier*particleData.y; color.z = 0.5+dataRangeMultiplier*particleData.z; color.w = 1.0; gl_FragColor = color;\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case RGBA_CHANNEL:
|
||||||
|
{
|
||||||
|
fragmentshaderstringstreamChannelMonitor << " vec4 color; color.x = 0.5+dataRangeMultiplier*particleData.x; color.y = 0.5+dataRangeMultiplier*particleData.y; color.z = 0.5+dataRangeMultiplier*particleData.z; color.w = 0.5+0.5*particleData.w; gl_FragColor = color;\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fragmentshaderstringstreamChannelMonitor << "}\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
osg::Program * program = new osg::Program;
|
||||||
|
program->addShader(new osg::Shader(osg::Shader::VERTEX, vertexShaderSrcChannelMonitor));
|
||||||
|
program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragmentshaderstringstreamChannelMonitor.str().c_str()));
|
||||||
|
program->addBindAttribLocation("tex_coords", 1);
|
||||||
|
|
||||||
|
osg::StateSet* ss = geom->getOrCreateStateSet();
|
||||||
|
ss->setAttributeAndModes(program, osg::StateAttribute::ON);
|
||||||
|
ss->addUniform(new osg::Uniform("numRows", (int)NUM_ELEMENTS_X));
|
||||||
|
ss->addUniform(new osg::Uniform("numCols", (int)NUM_ELEMENTS_Y));
|
||||||
|
|
||||||
|
ss->addUniform(new osg::Uniform("dataRangeMin", (float)minDataRange));
|
||||||
|
ss->addUniform(new osg::Uniform("dataRangeMax", (float)maxDataRange));
|
||||||
|
|
||||||
|
|
||||||
|
ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
//add a label
|
||||||
|
osgText::Text* text = new osgText::Text;
|
||||||
|
osgText::Font* font = osgText::readFontFile("fonts/arial.ttf");
|
||||||
|
text->setFont(font);
|
||||||
|
text->setColor(osg::Vec4(1, 1, 1, 1));
|
||||||
|
text->setCharacterSize(0.1*scale);
|
||||||
|
text->setPosition(placement + osg::Vec3(0.05, 0.05, 0));
|
||||||
|
pat->setName(labelCaption);
|
||||||
|
text->setText(pat->getName());
|
||||||
|
text->setBackdropType(osgText::Text::OUTLINE);
|
||||||
|
text->setBackdropImplementation(osgText::Text::POLYGON_OFFSET);
|
||||||
|
text->setBackdropOffset(0.05f);
|
||||||
|
text->setBackdropColor(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
|
||||||
|
|
||||||
|
quad->addDrawable(text);
|
||||||
|
|
||||||
|
pat->addChild(quad.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//compute texture image , taken from osgspotlight
|
||||||
|
osg::Image* createSpotLightImage(const osg::Vec4& centerColour, const osg::Vec4& backgroudColour, unsigned int size, float power)
|
||||||
|
{
|
||||||
|
osg::Image* image = new osg::Image;
|
||||||
|
image->allocateImage(size, size, 1,
|
||||||
|
GL_RGBA, GL_UNSIGNED_BYTE);
|
||||||
|
|
||||||
|
|
||||||
|
float mid = (float(size) - 1)*0.5f;
|
||||||
|
float div = 2.0f / float(size);
|
||||||
|
for (unsigned int r = 0; r < size; ++r)
|
||||||
|
{
|
||||||
|
unsigned char* ptr = image->data(0, r, 0);
|
||||||
|
for (unsigned int c = 0; c < size; ++c)
|
||||||
|
{
|
||||||
|
float dx = (float(c) - mid)*div;
|
||||||
|
float dy = (float(r) - mid)*div;
|
||||||
|
float r = powf(1.0f - sqrtf(dx*dx + dy*dy), power);
|
||||||
|
if (r < 0.0f) r = 0.0f;
|
||||||
|
osg::Vec4 color = centerColour*r + backgroudColour*(1.0f - r);
|
||||||
|
*ptr++ = (unsigned char)((color[0])*255.0f);
|
||||||
|
*ptr++ = (unsigned char)((color[1])*255.0f);
|
||||||
|
*ptr++ = (unsigned char)((color[2])*255.0f);
|
||||||
|
*ptr++ = (unsigned char)((color[3])*255.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ComputeNode::addComputationResultsRenderTree()
|
||||||
|
{
|
||||||
|
|
||||||
|
_computationResultsRenderProgram = new osg::Program;
|
||||||
|
|
||||||
|
_vertexShader = osg::Shader::readShaderFile(osg::Shader::VERTEX, _vertexShaderSourcePath);
|
||||||
|
_computationResultsRenderProgram->addShader(_vertexShader.get());
|
||||||
|
|
||||||
|
_geometryShader = osg::Shader::readShaderFile(osg::Shader::GEOMETRY, _geometryShaderSourcePath);
|
||||||
|
_computationResultsRenderProgram->addShader(_geometryShader.get());
|
||||||
|
|
||||||
|
_fragmentShader = osg::Shader::readShaderFile(osg::Shader::FRAGMENT, _fragmentShaderSourcePath);
|
||||||
|
_computationResultsRenderProgram->addShader(_fragmentShader.get());
|
||||||
|
|
||||||
|
|
||||||
|
_computationResultsRenderProgram->addBindAttribLocation("tex_coords", 1);
|
||||||
|
|
||||||
|
_computationResultsRenderGroup = new osg::Group;
|
||||||
|
_computationResultsRenderGroup->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
_computationResultsRenderStateSet = _computationResultsRenderGroup->getOrCreateStateSet();
|
||||||
|
_computationResultsRenderStateSet->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
||||||
|
|
||||||
|
osg::PointSprite *sprite = new osg::PointSprite;
|
||||||
|
int texture_unit = 0;
|
||||||
|
_computationResultsRenderStateSet->setTextureAttributeAndModes(texture_unit, sprite, osg::StateAttribute::ON);
|
||||||
|
_computationResultsRenderStateSet->setAttributeAndModes(_computationResultsRenderProgram.get(), osg::StateAttribute::ON);
|
||||||
|
_computationResultsRenderStateSet->addUniform(new osg::Uniform("particleTexture", texture_unit));
|
||||||
|
_computationResultsRenderStateSet->addUniform(new osg::Uniform("numRows", (int)NUM_ELEMENTS_X));
|
||||||
|
_computationResultsRenderStateSet->addUniform(new osg::Uniform("numCols", (int)NUM_ELEMENTS_Y));
|
||||||
|
|
||||||
|
|
||||||
|
_computationResultsRenderStateSet->setMode(GL_POINT_SMOOTH, osg::StateAttribute::ON);
|
||||||
|
_computationResultsRenderStateSet->setMode(GL_VERTEX_PROGRAM_POINT_SIZE_ARB, osg::StateAttribute::ON);
|
||||||
|
_computationResultsRenderStateSet->setMode(GL_ALPHA_TEST, osg::StateAttribute::ON);
|
||||||
|
_computationResultsRenderStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
osg::Texture2D *tex = new osg::Texture2D();
|
||||||
|
|
||||||
|
osg::Image* particleImage = createSpotLightImage(osg::Vec4(1, 0, 0, 1), osg::Vec4(0.5, 0, 0, 0.0), 32, 0.7);
|
||||||
|
if (particleImage)
|
||||||
|
{
|
||||||
|
tex->setImage(particleImage);
|
||||||
|
}
|
||||||
|
_computationResultsRenderStateSet->setTextureAttributeAndModes(texture_unit, tex, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
|
||||||
|
osg::BlendFunc *blend = new osg::BlendFunc;
|
||||||
|
if (false) //emissive particles
|
||||||
|
{
|
||||||
|
blend->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blend->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA);
|
||||||
|
}
|
||||||
|
|
||||||
|
_computationResultsRenderStateSet->setAttributeAndModes(blend, osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
|
||||||
|
osg::Depth* depth = new osg::Depth;
|
||||||
|
depth->setRange(0.0f, 0.0f);
|
||||||
|
depth->setFunction(osg::Depth::ALWAYS);
|
||||||
|
depth->setWriteMask(false);
|
||||||
|
depth->setFunction(osg::Depth::ALWAYS);
|
||||||
|
|
||||||
|
_computationResultsRenderStateSet->setAttributeAndModes(depth, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
|
||||||
|
osg::Geode* particleGeode = new osg::Geode;
|
||||||
|
unsigned int numVertices = NUM_ELEMENTS_X*NUM_ELEMENTS_Y;
|
||||||
|
|
||||||
|
osg::Geometry* particleGeometry = new osg::Geometry;
|
||||||
|
particleGeometry->setUseDisplayList(false);
|
||||||
|
particleGeometry->setUseVertexBufferObjects(true);
|
||||||
|
|
||||||
|
osg::Vec3Array* vertexarray = new osg::Vec3Array;
|
||||||
|
osg::Vec2Array* tcoords = new osg::Vec2Array;
|
||||||
|
|
||||||
|
osg::Vec2 bottom_texcoord(0.0f, 0.0f);
|
||||||
|
|
||||||
|
osg::Vec2 dx_texcoord(1.0f / (float)(NUM_ELEMENTS_X), 0.0f);
|
||||||
|
osg::Vec2 dy_texcoord(0.0f, 1.0f / (float)(NUM_ELEMENTS_Y));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < NUM_ELEMENTS_X; i++)
|
||||||
|
{
|
||||||
|
osg::Vec2 texcoord = bottom_texcoord + dy_texcoord*(float)i;
|
||||||
|
|
||||||
|
for (int j = 0; j < NUM_ELEMENTS_Y; j++)
|
||||||
|
{
|
||||||
|
vertexarray->push_back(osg::Vec3(texcoord.x(), texcoord.y(), 0.0));
|
||||||
|
tcoords->push_back(osg::Vec2(texcoord.x(), texcoord.y()));
|
||||||
|
texcoord += dx_texcoord;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
particleGeometry->setVertexArray(vertexarray);
|
||||||
|
particleGeometry->addPrimitiveSet(new osg::DrawArrays(GL_POINTS, 0, numVertices));
|
||||||
|
particleGeometry->setTexCoordArray(0, tcoords);
|
||||||
|
//this glMemoryBarrier thing... not sure if we could better do instanced drawing? all the data is in Shader Storage Buffer..
|
||||||
|
particleGeometry->setVertexAttribArray(1, particleGeometry->getTexCoordArray(0), osg::Array::BIND_PER_VERTEX);
|
||||||
|
|
||||||
|
_computationResultsRenderGroup->addChild(particleGeode);
|
||||||
|
particleGeode->addDrawable(particleGeometry);
|
||||||
|
|
||||||
|
addChild(_computationResultsRenderGroup.get());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ComputeNode::initComputingSetup()
|
||||||
|
{
|
||||||
|
|
||||||
|
_computeProgram = new osg::Program;
|
||||||
|
_computeProgram->setComputeGroups((NUM_ELEMENTS_X / WORK_GROUP_SIZE) <= 1 ? 1 : (NUM_ELEMENTS_X / WORK_GROUP_SIZE), (NUM_ELEMENTS_Y / WORK_GROUP_SIZE) <= 1 ? 1 : (NUM_ELEMENTS_Y / WORK_GROUP_SIZE), 1);
|
||||||
|
_computeShader = osg::Shader::readShaderFile(osg::Shader::COMPUTE, _computeShaderSourcePath);
|
||||||
|
_computeProgram->addShader(_computeShader.get());
|
||||||
|
|
||||||
|
setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
osg::StateSet* statesetComputation = getOrCreateStateSet();
|
||||||
|
statesetComputation->setAttributeAndModes(_computeProgram.get());
|
||||||
|
statesetComputation->addUniform(new osg::Uniform("numCols", (int)NUM_ELEMENTS_X));
|
||||||
|
statesetComputation->addUniform(new osg::Uniform("numRows", (int)NUM_ELEMENTS_Y));
|
||||||
|
statesetComputation->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
//blocksize
|
||||||
|
int numParticles = NUM_ELEMENTS_X * NUM_ELEMENTS_Y;
|
||||||
|
const unsigned blockSize = numParticles * __numChannels * __numDataValuesPerChannel* sizeof(GLfloat);
|
||||||
|
|
||||||
|
//init all the particle data array
|
||||||
|
int idx = 0;
|
||||||
|
_data = new GLfloat[NUM_ELEMENTS_X * NUM_ELEMENTS_Y * __numChannels * __numDataValuesPerChannel];
|
||||||
|
_dataArray = new FloatArray;
|
||||||
|
|
||||||
|
//init the data array somehow, this way all is stored in one BufferObject. maybe better using multiple buffers instead? not sure what is faster and better for threading
|
||||||
|
for (int d = 0; d < __numDataValuesPerChannel; ++d)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < NUM_ELEMENTS_X; ++i)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int j = 0; j < NUM_ELEMENTS_Y; ++j)
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int k = 0; k < __numChannels; ++k)
|
||||||
|
{
|
||||||
|
switch (k)
|
||||||
|
{
|
||||||
|
|
||||||
|
case (RED_CHANNEL) :
|
||||||
|
{
|
||||||
|
if ((d == POSITION_NOW_OFFSET) || (d == POSITION_OLD_OFFSET) || (d == POSITION_INIT_OFFSET))//position
|
||||||
|
{
|
||||||
|
*_data = random(0.25, 0.75);
|
||||||
|
}
|
||||||
|
if ((d == VELOCITY_NOW_OFFSET) || (d == VELOCITY_OLD_OFFSET) || (d == VELOCITY_INIT_OFFSET))//velocity
|
||||||
|
{
|
||||||
|
*_data = random(-2.4, 2.4);
|
||||||
|
}
|
||||||
|
if (d == ACCELERATION_OFFSET) //acceleration
|
||||||
|
{
|
||||||
|
*_data = random(-3.0, 3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == PROPERTIES_OFFSET) //property particle mass (compute shader is computing sphere mass from radius instead)
|
||||||
|
{
|
||||||
|
*_data = random(0.2, 15.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case (GREEN_CHANNEL) :
|
||||||
|
{
|
||||||
|
if ((d == POSITION_NOW_OFFSET) || (d == POSITION_OLD_OFFSET) || (d == POSITION_INIT_OFFSET))//position
|
||||||
|
{
|
||||||
|
*_data = random(0.25, 0.75);
|
||||||
|
}
|
||||||
|
if ((d == VELOCITY_NOW_OFFSET) || (d == VELOCITY_OLD_OFFSET) || (d == VELOCITY_INIT_OFFSET))//velocity
|
||||||
|
{
|
||||||
|
*_data = random(-2.4, 2.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == ACCELERATION_OFFSET)//acceleration
|
||||||
|
{
|
||||||
|
*_data = random(-3.0, 3.0);
|
||||||
|
}
|
||||||
|
if (d == PROPERTIES_OFFSET) //property particle radius
|
||||||
|
{
|
||||||
|
*_data = random(0.07, 0.219);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case (BLUE_CHANNEL) :
|
||||||
|
{
|
||||||
|
if ((d == POSITION_NOW_OFFSET) || (d == POSITION_OLD_OFFSET) || (d == POSITION_INIT_OFFSET))//position
|
||||||
|
{
|
||||||
|
*_data = random(0.25, 0.75);
|
||||||
|
}
|
||||||
|
if ((d == VELOCITY_NOW_OFFSET) || (d == VELOCITY_OLD_OFFSET) || (d == VELOCITY_INIT_OFFSET))//velocity
|
||||||
|
{
|
||||||
|
*_data = random(-2.4, 2.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == ACCELERATION_OFFSET)//acceleration
|
||||||
|
{
|
||||||
|
*_data = random(-3.0, 3.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (d == PROPERTIES_OFFSET) //place for some other property
|
||||||
|
{
|
||||||
|
*_data = random(0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case (ALPHA_CHANNEL) :
|
||||||
|
{
|
||||||
|
if ((d == POSITION_NOW_OFFSET) || (d == POSITION_OLD_OFFSET) || (d == POSITION_INIT_OFFSET))//position
|
||||||
|
{
|
||||||
|
*_data = random(1.0, 1.0);
|
||||||
|
}
|
||||||
|
if ((d == VELOCITY_NOW_OFFSET) || (d == VELOCITY_OLD_OFFSET) || (d == VELOCITY_INIT_OFFSET))//velocity
|
||||||
|
{
|
||||||
|
*_data = random(-2.4, 2.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == ACCELERATION_OFFSET) //acceleration
|
||||||
|
{
|
||||||
|
//*_data = random(1.0, 1.0);
|
||||||
|
*_data = random(0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (d == PROPERTIES_OFFSET) //place for some other property
|
||||||
|
{
|
||||||
|
*_data = random(0.3, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
_dataArray->push_back(*_data);
|
||||||
|
_data++;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_ssbo = new osg::ShaderStorageBufferObject;
|
||||||
|
_dataArray->setBufferObject(_ssbo.get());
|
||||||
|
|
||||||
|
|
||||||
|
_ssbb = new osg::ShaderStorageBufferBinding(0, _ssbo.get(), 0, blockSize);
|
||||||
|
statesetComputation->setAttributeAndModes(_ssbb.get(), osg::StateAttribute::ON);
|
||||||
|
|
||||||
|
|
||||||
|
//option, do something useful with data or test the transfer speed
|
||||||
|
//_ssbb->setUpdateCallback(new ShaderStorageBufferCallback);
|
||||||
|
|
||||||
|
//adding a quad , visualizing data in buffer
|
||||||
|
addDataMonitor(osg::Vec3(0, -1, 0), osg::Vec3(SUB_PLACEMENT_OFFSET_HORIZONTAL * 0, -SUB_PLACEMENT_OFFSET_VERTICAL * -2.0, SUB_PLACEMENT_OFFSET_HORIZONTAL * 0), 1.0, RGB_CHANNEL, POSITION_NOW_OFFSET, "X,Y,Z - PositionNow", -1.0, 1.0);
|
||||||
|
|
||||||
|
//the coord from default dataset
|
||||||
|
addHelperGeometry();
|
||||||
|
|
||||||
|
|
||||||
|
addComputationResultsRenderTree();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//taken from osgdistorsion example for getting it nice on screen with antialiasing
|
||||||
|
osg::Node* createPrerenderSubgraph(osg::Node* subgraph, const osg::Vec4& clearColour)
|
||||||
|
{
|
||||||
|
osg::Group* prerenderNode = new osg::Group;
|
||||||
|
|
||||||
|
unsigned int tex_width = PRERENDER_WIDTH;
|
||||||
|
unsigned int tex_height = PRERENDER_HEIGHT;
|
||||||
|
|
||||||
|
osg::Texture2D* texture = new osg::Texture2D;
|
||||||
|
texture->setTextureSize(tex_width, tex_height);
|
||||||
|
texture->setInternalFormat(GL_RGBA);
|
||||||
|
texture->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
|
||||||
|
texture->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
|
||||||
|
|
||||||
|
{
|
||||||
|
osg::Camera* prerenderCamera = new osg::Camera;
|
||||||
|
prerenderCamera->setClearColor(clearColour);
|
||||||
|
prerenderCamera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
prerenderCamera->setReferenceFrame(osg::Transform::RELATIVE_RF);
|
||||||
|
prerenderCamera->setProjectionMatrix(osg::Matrixd::identity());
|
||||||
|
prerenderCamera->setViewMatrix(osg::Matrixd::identity());
|
||||||
|
prerenderCamera->setViewport(0, 0, tex_width, tex_height);
|
||||||
|
prerenderCamera->setRenderOrder(osg::Camera::PRE_RENDER);
|
||||||
|
prerenderCamera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
|
||||||
|
prerenderCamera->attach(osg::Camera::COLOR_BUFFER0, texture, 0, 0, false, PRERENDER_ANTIALIASINGMULTISAMPLES, PRERENDER_ANTIALIASINGMULTISAMPLES);
|
||||||
|
prerenderCamera->addChild(subgraph);
|
||||||
|
prerenderNode->addChild(prerenderCamera);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
osg::Geometry* polyGeom = new osg::Geometry();
|
||||||
|
|
||||||
|
polyGeom->setSupportsDisplayList(false);
|
||||||
|
|
||||||
|
osg::Vec3 origin(0.0f, 0.0f, 0.0f);
|
||||||
|
osg::Vec3 xAxis(1.0f, 0.0f, 0.0f);
|
||||||
|
osg::Vec3 yAxis(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
|
float height = 1024.0f;
|
||||||
|
float width = 1280.0f;
|
||||||
|
int noSteps = 3;
|
||||||
|
|
||||||
|
osg::Vec3Array* vertices = new osg::Vec3Array;
|
||||||
|
osg::Vec2Array* texcoords = new osg::Vec2Array;
|
||||||
|
osg::Vec4Array* colors = new osg::Vec4Array;
|
||||||
|
|
||||||
|
osg::Vec3 bottom = origin;
|
||||||
|
osg::Vec3 dx = xAxis*(width / ((float)(noSteps - 1)));
|
||||||
|
osg::Vec3 dy = yAxis*(height / ((float)(noSteps - 1)));
|
||||||
|
|
||||||
|
osg::Vec2 bottom_texcoord(0.0f, 0.0f);
|
||||||
|
osg::Vec2 dx_texcoord(1.0f / (float)(noSteps - 1), 0.0f);
|
||||||
|
osg::Vec2 dy_texcoord(0.0f, 1.0f / (float)(noSteps - 1));
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < noSteps; ++i)
|
||||||
|
{
|
||||||
|
osg::Vec3 cursor = bottom + dy*(float)i;
|
||||||
|
osg::Vec2 texcoord = bottom_texcoord + dy_texcoord*(float)i;
|
||||||
|
for (j = 0; j < noSteps; ++j)
|
||||||
|
{
|
||||||
|
vertices->push_back(cursor);
|
||||||
|
texcoords->push_back(osg::Vec2((sin(texcoord.x()*osg::PI - osg::PI*0.5) + 1.0f)*0.5f, (sin(texcoord.y()*osg::PI - osg::PI*0.5) + 1.0f)*0.5f));
|
||||||
|
colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
|
||||||
|
cursor += dx;
|
||||||
|
texcoord += dx_texcoord;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
polyGeom->setVertexArray(vertices);
|
||||||
|
polyGeom->setColorArray(colors, osg::Array::BIND_PER_VERTEX);
|
||||||
|
polyGeom->setTexCoordArray(0, texcoords);
|
||||||
|
|
||||||
|
for (i = 0; i < noSteps - 1; ++i)
|
||||||
|
{
|
||||||
|
osg::DrawElementsUShort* elements = new osg::DrawElementsUShort(osg::PrimitiveSet::QUAD_STRIP);
|
||||||
|
for (j = 0; j < noSteps; ++j)
|
||||||
|
{
|
||||||
|
elements->push_back(j + (i + 1)*noSteps);
|
||||||
|
elements->push_back(j + (i)*noSteps);
|
||||||
|
}
|
||||||
|
polyGeom->addPrimitiveSet(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::StateSet* stateset = polyGeom->getOrCreateStateSet();
|
||||||
|
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
||||||
|
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
osg::Geode* geode = new osg::Geode();
|
||||||
|
geode->addDrawable(polyGeom);
|
||||||
|
|
||||||
|
osg::Camera* nestedRenderCamera = new osg::Camera;
|
||||||
|
nestedRenderCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
|
||||||
|
nestedRenderCamera->setViewMatrix(osg::Matrix::identity());
|
||||||
|
nestedRenderCamera->setProjectionMatrixAsOrtho2D(0, 1280, 0, 1024);
|
||||||
|
nestedRenderCamera->setRenderOrder(osg::Camera::NESTED_RENDER);
|
||||||
|
nestedRenderCamera->addChild(geode);
|
||||||
|
|
||||||
|
prerenderNode->addChild(nestedRenderCamera);
|
||||||
|
}
|
||||||
|
|
||||||
|
return prerenderNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
osg::ArgumentParser arguments(&argc, argv);
|
||||||
|
|
||||||
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Group> scene = new osg::Group;
|
||||||
|
|
||||||
|
|
||||||
|
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
|
||||||
|
viewer.addEventHandler(new osgViewer::StatsHandler);
|
||||||
|
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
|
||||||
|
viewer.addEventHandler(new osgViewer::ThreadingHandler);
|
||||||
|
viewer.getCamera()->setProjectionMatrixAsPerspective(60.0f, 1.33333, 0.01, 100.0);
|
||||||
|
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
|
||||||
|
|
||||||
|
viewer.setUpViewInWindow(11, 11, 800 + 11, 600 + 11);
|
||||||
|
//viewer.setUpViewOnSingleScreen(0); // !!
|
||||||
|
|
||||||
|
viewer.getCamera()->setClearColor(osg::Vec4(0.3, 0.3, 0.3, 1.0));
|
||||||
|
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);// we can play with threading models later
|
||||||
|
|
||||||
|
osg::ref_ptr<ComputeNode> computeNode = new ComputeNode();
|
||||||
|
computeNode->setPosition(osg::Vec3(0, 0, 0));
|
||||||
|
computeNode->setUpdateCallback(new ComputeNodeUpdateCallback(computeNode.get())); // on-the-fly reloading the shaders if shader source on disk is changed
|
||||||
|
computeNode->initComputingSetup();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
scene->addChild(computeNode.get());
|
||||||
|
scene->addChild(computeNode->_computationResultsRenderGroup.get());
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PRERENDER_HIGH_QUALITY_ANTIALIASING
|
||||||
|
viewer.setSceneData(createPrerenderSubgraph(scene.get(), osg::Vec4(0.3, 0.4, 0.6, 1)));
|
||||||
|
#else
|
||||||
|
viewer.setSceneData(scene.get());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
viewer.realize();
|
||||||
|
|
||||||
|
viewer.getCamera()->getGraphicsContext()->getState()->setUseModelViewAndProjectionUniforms(true);
|
||||||
|
|
||||||
|
viewer.run();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
@@ -56,18 +56,7 @@ public:
|
|||||||
traverse(node);
|
traverse(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
void apply(osg::Geode& node)
|
void apply(osg::Drawable& drawable)
|
||||||
{
|
|
||||||
if (!_useStateSets && node.getStateSet()) node.setStateSet(0);
|
|
||||||
for(unsigned int i = 0; i<node.getNumDrawables(); ++i)
|
|
||||||
{
|
|
||||||
process(*node.getDrawable(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
traverse(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void process(osg::Drawable& drawable)
|
|
||||||
{
|
{
|
||||||
if (!_useStateSets && drawable.getStateSet())
|
if (!_useStateSets && drawable.getStateSet())
|
||||||
{
|
{
|
||||||
@@ -551,6 +540,7 @@ public:
|
|||||||
const std::string& outputFilename,
|
const std::string& outputFilename,
|
||||||
SceneGraphProcessor* sceneGraphProcessor,
|
SceneGraphProcessor* sceneGraphProcessor,
|
||||||
osgUtil::IncrementalCompileOperation* ico):
|
osgUtil::IncrementalCompileOperation* ico):
|
||||||
|
osg::Referenced(true),
|
||||||
Operation("DatabasePaging Operation", false),
|
Operation("DatabasePaging Operation", false),
|
||||||
_filename(filename),
|
_filename(filename),
|
||||||
_outputFilename(outputFilename),
|
_outputFilename(outputFilename),
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ int main (int argc, char* argv[])
|
|||||||
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
|
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
|
||||||
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f,0.0f,0.0f),0.5)));
|
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f,0.0f,0.0f),0.5)));
|
||||||
|
|
||||||
//Tranformation to be manipulated by the animation
|
//Transformation to be manipulated by the animation
|
||||||
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform();
|
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform();
|
||||||
trans->setName("AnimatedNode");
|
trans->setName("AnimatedNode");
|
||||||
//Dynamic object, has to be updated during update traversal
|
//Dynamic object, has to be updated during update traversal
|
||||||
@@ -84,7 +84,7 @@ int main (int argc, char* argv[])
|
|||||||
//The second element modifies the rotation around x-axis
|
//The second element modifies the rotation around x-axis
|
||||||
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position"));
|
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position"));
|
||||||
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
|
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
|
||||||
//connect the UpdateMatrixTransform callback to the MatrixTRanform
|
//connect the UpdateMatrixTransform callback to the MatrixTransform
|
||||||
trans->setUpdateCallback(updatecb);
|
trans->setUpdateCallback(updatecb);
|
||||||
//initialize MatrixTranform
|
//initialize MatrixTranform
|
||||||
trans->setMatrix(osg::Matrix::identity());
|
trans->setMatrix(osg::Matrix::identity());
|
||||||
@@ -102,7 +102,7 @@ int main (int argc, char* argv[])
|
|||||||
//add the rest of the scene to the grp node
|
//add the rest of the scene to the grp node
|
||||||
grp->addChild(root);
|
grp->addChild(root);
|
||||||
|
|
||||||
// And we finaly define our channel for linear Vector interpolation
|
// And we finally define our channel for linear Vector interpolation
|
||||||
osgAnimation::Vec3LinearChannel* channelAnimation1 = new osgAnimation::Vec3LinearChannel;
|
osgAnimation::Vec3LinearChannel* channelAnimation1 = new osgAnimation::Vec3LinearChannel;
|
||||||
//name of the AnimationUpdateCallback
|
//name of the AnimationUpdateCallback
|
||||||
channelAnimation1->setTargetName("AnimatedCallback");
|
channelAnimation1->setTargetName("AnimatedCallback");
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
/* -*-c++-*-
|
/* -*-c++-*-
|
||||||
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
|
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net>
|
||||||
*
|
*
|
||||||
* This library is open source and may be redistributed and/or modified under
|
* This library is open source and may be redistributed and/or modified under
|
||||||
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
* (at your option) any later version. The full license is in LICENSE file
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
* included with this distribution, and on the openscenegraph.org website.
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
*
|
*
|
||||||
* This library is distributed in the hope that it will be useful,
|
* This library is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* OpenSceneGraph Public License for more details.
|
* OpenSceneGraph Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
|
|||||||
_scratchNose->setLoop(1); // one time
|
_scratchNose->setLoop(1); // one time
|
||||||
|
|
||||||
// add the main loop at priority 0 at time 0.
|
// add the main loop at priority 0 at time 0.
|
||||||
|
|
||||||
osgAnimation::Timeline* tml = _manager->getTimeline();
|
osgAnimation::Timeline* tml = _manager->getTimeline();
|
||||||
tml->play();
|
tml->play();
|
||||||
tml->addActionAt(0.0, _mainLoop.get(), 0);
|
tml->addActionAt(0.0, _mainLoop.get(), 0);
|
||||||
@@ -98,9 +98,9 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
|
|||||||
{
|
{
|
||||||
// we add a scratch head priority 1 each 10 second
|
// we add a scratch head priority 1 each 10 second
|
||||||
// note:
|
// note:
|
||||||
// it's possible to add the same instance more then once on the timeline
|
// it's possible to add the same instance more than once on the timeline
|
||||||
// the only things you need to take care is if you remove it. It will remove
|
// the only things you need to take care is if you remove it. It will remove
|
||||||
// all instance that exist on the timeline. If you need to differtiate
|
// all instance that exist on the timeline. If you need to differentiate
|
||||||
// it's better to create a new instance
|
// it's better to create a new instance
|
||||||
tml->addActionAt(5.0 + 10.0 * i, _scratchHead.get(), 1);
|
tml->addActionAt(5.0 + 10.0 * i, _scratchHead.get(), 1);
|
||||||
}
|
}
|
||||||
@@ -139,21 +139,12 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
|
|||||||
}
|
}
|
||||||
_releaseKey = false;
|
_releaseKey = false;
|
||||||
}
|
}
|
||||||
|
traverse(node, nv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
|
osgGA::GUIEventHandler::operator()(node, nv);
|
||||||
if (ev && ev->getActionAdapter() && !ev->getEvents().empty())
|
}
|
||||||
{
|
|
||||||
for(osgGA::EventQueue::Events::iterator itr = ev->getEvents().begin();
|
|
||||||
itr != ev->getEvents().end();
|
|
||||||
++itr)
|
|
||||||
{
|
|
||||||
handleWithCheckAgainstIgnoreHandledEventsMask(*(*itr), *(ev->getActionAdapter()), node, nv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
traverse(node, nv);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -168,7 +159,7 @@ int main (int argc, char* argv[])
|
|||||||
osgViewer::Viewer viewer(psr);
|
osgViewer::Viewer viewer(psr);
|
||||||
|
|
||||||
std::string file = "nathan.osg";
|
std::string file = "nathan.osg";
|
||||||
if(argc >= 2)
|
if(argc >= 2)
|
||||||
file = psr[1];
|
file = psr[1];
|
||||||
|
|
||||||
// replace the manager
|
// replace the manager
|
||||||
@@ -178,7 +169,7 @@ int main (int argc, char* argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
|
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
|
||||||
if(!animationManager)
|
if(!animationManager)
|
||||||
{
|
{
|
||||||
osg::notify(osg::FATAL) << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl;
|
osg::notify(osg::FATAL) << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
@@ -186,22 +177,22 @@ int main (int argc, char* argv[])
|
|||||||
|
|
||||||
osg::ref_ptr<osgAnimation::TimelineAnimationManager> tl = new osgAnimation::TimelineAnimationManager(*animationManager);
|
osg::ref_ptr<osgAnimation::TimelineAnimationManager> tl = new osgAnimation::TimelineAnimationManager(*animationManager);
|
||||||
root->setUpdateCallback(tl.get());
|
root->setUpdateCallback(tl.get());
|
||||||
|
|
||||||
ExampleTimelineUsage* callback = new ExampleTimelineUsage(tl.get());
|
ExampleTimelineUsage* callback = new ExampleTimelineUsage(tl.get());
|
||||||
root->setEventCallback(callback);
|
root->setEventCallback(callback);
|
||||||
root->getUpdateCallback()->addNestedCallback(callback);
|
root->getUpdateCallback()->addNestedCallback(callback);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// add the state manipulator
|
// add the state manipulator
|
||||||
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
||||||
|
|
||||||
// add the thread model handler
|
// add the thread model handler
|
||||||
viewer.addEventHandler(new osgViewer::ThreadingHandler);
|
viewer.addEventHandler(new osgViewer::ThreadingHandler);
|
||||||
|
|
||||||
// add the window size toggle handler
|
// add the window size toggle handler
|
||||||
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
|
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
|
||||||
|
|
||||||
// add the stats handler
|
// add the stats handler
|
||||||
viewer.addEventHandler(new osgViewer::StatsHandler);
|
viewer.addEventHandler(new osgViewer::StatsHandler);
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
#include <osg/Geode>
|
#include <osg/Geode>
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
#include <osgViewer/ViewerEventHandlers>
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
#include <osgWidget/ViewerEventHandlers>
|
#include <osgWidget/ViewerEventHandlers>
|
||||||
@@ -136,10 +137,30 @@ int main(int argc, char** argv)
|
|||||||
// Set our Singleton's model.
|
// Set our Singleton's model.
|
||||||
AnimationManagerFinder finder;
|
AnimationManagerFinder finder;
|
||||||
node->accept(finder);
|
node->accept(finder);
|
||||||
if (finder._am.valid()) {
|
if (finder._am.valid())
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string playModeOpt;
|
||||||
|
if (arguments.read("--play-mode", playModeOpt))
|
||||||
|
{
|
||||||
|
osgAnimation::Animation::PlayMode playMode = osgAnimation::Animation::LOOP;
|
||||||
|
if (osgDB::equalCaseInsensitive(playModeOpt, "ONCE")) playMode = osgAnimation::Animation::ONCE;
|
||||||
|
else if (osgDB::equalCaseInsensitive(playModeOpt, "STAY")) playMode = osgAnimation::Animation::STAY;
|
||||||
|
else if (osgDB::equalCaseInsensitive(playModeOpt, "LOOP")) playMode = osgAnimation::Animation::LOOP;
|
||||||
|
else if (osgDB::equalCaseInsensitive(playModeOpt, "PPONG")) playMode = osgAnimation::Animation::PPONG;
|
||||||
|
|
||||||
|
for (osgAnimation::AnimationList::const_iterator animIter = finder._am->getAnimationList().begin();
|
||||||
|
animIter != finder._am->getAnimationList().end(); ++animIter)
|
||||||
|
{
|
||||||
|
(*animIter)->setPlayMode(playMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
node->setUpdateCallback(finder._am.get());
|
node->setUpdateCallback(finder._am.get());
|
||||||
AnimtkViewerModelController::setModel(finder._am.get());
|
AnimtkViewerModelController::setModel(finder._am.get());
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
osg::notify(osg::WARN) << "no osgAnimation::AnimationManagerBase found in the subgraph, no animations available" << std::endl;
|
osg::notify(osg::WARN) << "no osgAnimation::AnimationManagerBase found in the subgraph, no animations available" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ int main( int argc, char **argv )
|
|||||||
viewer.renderingTraversals();
|
viewer.renderingTraversals();
|
||||||
|
|
||||||
osg::Timer_t afterRenderTick = osg::Timer::instance()->tick();
|
osg::Timer_t afterRenderTick = osg::Timer::instance()->tick();
|
||||||
std::cout<<"Rendring time = "<<osg::Timer::instance()->delta_s(beforeRenderTick, afterRenderTick) <<" seconds"<<std::endl;
|
std::cout<<"Rendering time = "<<osg::Timer::instance()->delta_s(beforeRenderTick, afterRenderTick) <<" seconds"<<std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ osg::Node* createModel()
|
|||||||
// create the root node which will hold the model.
|
// create the root node which will hold the model.
|
||||||
osg::Group* root = new osg::Group();
|
osg::Group* root = new osg::Group();
|
||||||
|
|
||||||
// add the drawable into a single goede to be shared...
|
// add the drawable into a single geode to be shared...
|
||||||
osg::Billboard* center = new osg::Billboard();
|
osg::Billboard* center = new osg::Billboard();
|
||||||
center->setMode(osg::Billboard::POINT_ROT_EYE);
|
center->setMode(osg::Billboard::POINT_ROT_EYE);
|
||||||
center->addDrawable(
|
center->addDrawable(
|
||||||
|
|||||||
7
examples/osgblenddrawbuffers/CMakeLists.txt
Normal file
7
examples/osgblenddrawbuffers/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#this file is automatically generated
|
||||||
|
|
||||||
|
|
||||||
|
SET(TARGET_SRC osgblenddrawbuffers.cpp )
|
||||||
|
SET(TARGET_ADDED_LIBRARIES osgGA )
|
||||||
|
#### end var setup ###
|
||||||
|
SETUP_EXAMPLE(osgblenddrawbuffers)
|
||||||
147
examples/osgblenddrawbuffers/osgblenddrawbuffers.cpp
Normal file
147
examples/osgblenddrawbuffers/osgblenddrawbuffers.cpp
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/* OpenSceneGraph example, osgblenddrawbuffers.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Camera>
|
||||||
|
#include <osg/Texture2D>
|
||||||
|
#include <osg/BlendFunci>
|
||||||
|
#include <osg/ColorMaski>
|
||||||
|
#include <osg/Capability>
|
||||||
|
#include <osgDB/ReadFile>
|
||||||
|
#include <osgViewer/Viewer>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
osg::Camera* createMRTCamera( std::vector<osg::Texture*>& attachedTextures )
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
|
||||||
|
camera->setClearColor( osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f) );
|
||||||
|
camera->setClearMask( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
|
||||||
|
camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT );
|
||||||
|
camera->setRenderOrder( osg::Camera::PRE_RENDER );
|
||||||
|
|
||||||
|
for ( int i=0; i<4; ++i )
|
||||||
|
{
|
||||||
|
osg::Texture2D* tex = new osg::Texture2D;
|
||||||
|
tex->setTextureSize( 1024, 1024 );
|
||||||
|
tex->setInternalFormat( GL_RGBA );
|
||||||
|
tex->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR );
|
||||||
|
tex->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR );
|
||||||
|
attachedTextures.push_back( tex );
|
||||||
|
|
||||||
|
camera->setViewport( 0, 0, tex->getTextureWidth(), tex->getTextureHeight() );
|
||||||
|
camera->attach( osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0+i), tex );
|
||||||
|
}
|
||||||
|
return camera.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Camera* createHUDCamera( double left, double right, double bottom, double top )
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
|
||||||
|
camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF );
|
||||||
|
camera->setClearMask( GL_DEPTH_BUFFER_BIT );
|
||||||
|
camera->setRenderOrder( osg::Camera::POST_RENDER );
|
||||||
|
camera->setAllowEventFocus( false );
|
||||||
|
camera->setProjectionMatrix( osg::Matrix::ortho2D(left, right, bottom, top) );
|
||||||
|
camera->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
|
||||||
|
return camera.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main( int argc, char **argv )
|
||||||
|
{
|
||||||
|
osg::ArgumentParser arguments(&argc, argv);
|
||||||
|
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName() + " is the example which demonstrates how to enable/disable blending on specified draw buffers in multi-rendering-target cases.");
|
||||||
|
|
||||||
|
std::vector<osg::Texture*> textures;
|
||||||
|
bool useGlobalBlending = false;
|
||||||
|
if ( arguments.read("--no-draw-buffers") ) useGlobalBlending = true;
|
||||||
|
|
||||||
|
// Create a camera to output multi-rendering-targets (MRT)
|
||||||
|
osg::Camera* mrtCam = createMRTCamera( textures );
|
||||||
|
mrtCam->addChild( osgDB::readNodeFile("cessna.osgt") );
|
||||||
|
|
||||||
|
// Create shader program to be used
|
||||||
|
const char* mrtFragmentCode = {
|
||||||
|
"void main() {\n"
|
||||||
|
" gl_FragData[0] = gl_Color * vec4(1.0, 1.0, 1.0, 0.7);\n"
|
||||||
|
" gl_FragData[1] = vec4(0.0, 1.0, 1.0, 0.0);\n"
|
||||||
|
" gl_FragData[2] = vec4(1.0, 0.0, 1.0, 0.3);\n"
|
||||||
|
" gl_FragData[3] = vec4(1.0, 1.0, 0.0, 1.0);\n"
|
||||||
|
"}\n"
|
||||||
|
};
|
||||||
|
osg::ref_ptr<osg::Program> program = new osg::Program;
|
||||||
|
program->addShader( new osg::Shader(osg::Shader::FRAGMENT, mrtFragmentCode) );
|
||||||
|
|
||||||
|
osg::StateSet* ss = mrtCam->getOrCreateStateSet();
|
||||||
|
ss->setAttributeAndModes( program.get() );
|
||||||
|
|
||||||
|
// Apply blending to the original scene in MRT
|
||||||
|
if ( !useGlobalBlending )
|
||||||
|
{
|
||||||
|
// Only enable blending on the first draw buffer so other three outputs are
|
||||||
|
// totally opaque, which is important for MRT cases
|
||||||
|
ss->setAttribute( new osg::Enablei(GL_BLEND, 0) );
|
||||||
|
ss->setAttribute( new osg::Disablei(GL_BLEND, 1) );
|
||||||
|
ss->setAttribute( new osg::Disablei(GL_BLEND, 2) );
|
||||||
|
ss->setAttribute( new osg::Disablei(GL_BLEND, 3) );
|
||||||
|
|
||||||
|
// Accept different blend/colormask attributes on multiple render targets
|
||||||
|
osg::ref_ptr<osg::BlendFunci> blend0 = new osg::BlendFunci(0, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
osg::ref_ptr<osg::ColorMaski> colormask3 = new osg::ColorMaski(3, false, true, false, true);
|
||||||
|
ss->setAttribute( blend0.get() );
|
||||||
|
ss->setAttributeAndModes( colormask3.get() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// When separated blending is disabled, all rendering targets will be affected
|
||||||
|
// by its alpha channel and you will see each output blended with the background.
|
||||||
|
//
|
||||||
|
// This causes a big program in situations like deferred shading because we may
|
||||||
|
// have to save different scene data to MRT 'GBuffer', in which alpha channels are
|
||||||
|
// used to store certain attributes rather than opacity. These attributes can be
|
||||||
|
// reused in following post-processing steps.
|
||||||
|
//
|
||||||
|
// For such targets, alpha blending must be disabled; otherwise it will mess the
|
||||||
|
// output. That is why this example exists!
|
||||||
|
osg::ref_ptr<osg::BlendFunc> blend = new osg::BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
ss->setAttributeAndModes( blend.get() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create some quads to be shown on screen to contain the MRT result
|
||||||
|
osg::ref_ptr<osg::Geode> quad = new osg::Geode;
|
||||||
|
for ( unsigned int i=0; i<textures.size(); ++i )
|
||||||
|
{
|
||||||
|
osg::Geometry* geom = osg::createTexturedQuadGeometry(
|
||||||
|
osg::Vec3((float)i/(float)textures.size(), 0.0f, 0.0f),
|
||||||
|
osg::Vec3(1.0f/(float)textures.size()-0.01f,0.0f,0.0f), osg::Vec3(0.0f,1.0f,0.0f) );
|
||||||
|
geom->getOrCreateStateSet()->setTextureAttributeAndModes( 0, textures[i] );
|
||||||
|
quad->addDrawable( geom );
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Camera* hudCam = createHUDCamera( 0.0, 1.0, 0.0, 1.0 );
|
||||||
|
hudCam->addChild( quad.get() );
|
||||||
|
|
||||||
|
// Construct scene graph and viewer
|
||||||
|
osg::ref_ptr<osg::Group> root = new osg::Group;
|
||||||
|
root->addChild( mrtCam );
|
||||||
|
root->addChild( hudCam );
|
||||||
|
|
||||||
|
osgViewer::Viewer viewer;
|
||||||
|
viewer.setSceneData( root.get() );
|
||||||
|
return viewer.run();
|
||||||
|
}
|
||||||
@@ -82,7 +82,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool TechniqueEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&)
|
bool TechniqueEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&)
|
||||||
{
|
{
|
||||||
switch(ea.getEventType())
|
switch(ea.getEventType())
|
||||||
@@ -104,7 +104,7 @@ bool TechniqueEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIAc
|
|||||||
_eq_index--;
|
_eq_index--;
|
||||||
if (_eq_index<0) _eq_index=_eq_nb-1;
|
if (_eq_index<0) _eq_index=_eq_nb-1;
|
||||||
_blendEq->setEquation(_equations[_eq_index]);
|
_blendEq->setEquation(_equations[_eq_index]);
|
||||||
std::cout<<"Operation name = "<<_equations_name[_eq_index]<<std::endl;
|
std::cout<<"Equation name = "<<_equations_name[_eq_index]<<std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -134,7 +134,7 @@ int main( int argc, char **argv )
|
|||||||
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates how to use glBlendEquation for mixing rendered scene and the frame-buffer.");
|
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates how to use glBlendEquation for mixing rendered scene and the frame-buffer.");
|
||||||
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
|
arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
@@ -143,7 +143,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// if not loaded assume no arguments passed in, try use default mode instead.
|
// if not loaded assume no arguments passed in, try use default mode instead.
|
||||||
if (!loadedModel) loadedModel = osgDB::readNodeFile("cessnafire.osgt");
|
if (!loadedModel) loadedModel = osgDB::readNodeFile("cessnafire.osgt");
|
||||||
|
|
||||||
if (!loadedModel)
|
if (!loadedModel)
|
||||||
{
|
{
|
||||||
std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
|
std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
|
||||||
@@ -152,18 +152,18 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
osg::Group* root = new osg::Group;
|
osg::Group* root = new osg::Group;
|
||||||
root->addChild(loadedModel);
|
root->addChild(loadedModel);
|
||||||
|
|
||||||
|
|
||||||
osg::StateSet* stateset = new osg::StateSet;
|
osg::StateSet* stateset = new osg::StateSet;
|
||||||
stateset->setDataVariance(osg::Object::DYNAMIC);
|
stateset->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
|
||||||
osg::BlendEquation* blendEquation = new osg::BlendEquation(osg::BlendEquation::FUNC_ADD);
|
osg::BlendEquation* blendEquation = new osg::BlendEquation(osg::BlendEquation::FUNC_ADD);
|
||||||
blendEquation->setDataVariance(osg::Object::DYNAMIC);
|
blendEquation->setDataVariance(osg::Object::DYNAMIC);
|
||||||
|
|
||||||
stateset->setAttributeAndModes(blendEquation,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
|
stateset->setAttributeAndModes(blendEquation,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
|
||||||
|
|
||||||
//tell to sort the mesh before displaying it
|
//tell to sort the mesh before displaying it
|
||||||
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
|
||||||
|
|
||||||
loadedModel->setStateSet(stateset);
|
loadedModel->setStateSet(stateset);
|
||||||
|
|
||||||
@@ -171,6 +171,6 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// add a viewport to the viewer and attach the scene graph.
|
// add a viewport to the viewer and attach the scene graph.
|
||||||
viewer.setSceneData( root );
|
viewer.setSceneData( root );
|
||||||
|
|
||||||
return viewer.run();
|
return viewer.run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
class UpdateCallback : public osg::NodeCallback
|
class UpdateCallback : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||||
{
|
{
|
||||||
std::cout<<"update callback - pre traverse"<<node<<std::endl;
|
std::cout<<"update callback - pre traverse"<<node<<std::endl;
|
||||||
traverse(node,nv);
|
traverse(node,nv);
|
||||||
std::cout<<"update callback - post traverse"<<node<<std::endl;
|
std::cout<<"update callback - post traverse"<<node<<std::endl;
|
||||||
@@ -48,7 +48,7 @@ class UpdateCallback : public osg::NodeCallback
|
|||||||
class CullCallback : public osg::NodeCallback
|
class CullCallback : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||||
{
|
{
|
||||||
std::cout<<"cull callback - pre traverse"<<node<<std::endl;
|
std::cout<<"cull callback - pre traverse"<<node<<std::endl;
|
||||||
traverse(node,nv);
|
traverse(node,nv);
|
||||||
std::cout<<"cull callback - post traverse"<<node<<std::endl;
|
std::cout<<"cull callback - post traverse"<<node<<std::endl;
|
||||||
@@ -87,11 +87,11 @@ class InsertCallbacksVisitor : public osg::NodeVisitor
|
|||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
InsertCallbacksVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
InsertCallbacksVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(osg::Node& node)
|
virtual void apply(osg::Node& node)
|
||||||
{
|
{
|
||||||
node.setUpdateCallback(new UpdateCallback());
|
node.setUpdateCallback(new UpdateCallback());
|
||||||
@@ -102,7 +102,7 @@ class InsertCallbacksVisitor : public osg::NodeVisitor
|
|||||||
virtual void apply(osg::Geode& geode)
|
virtual void apply(osg::Geode& geode)
|
||||||
{
|
{
|
||||||
geode.setUpdateCallback(new UpdateCallback());
|
geode.setUpdateCallback(new UpdateCallback());
|
||||||
|
|
||||||
//note, it makes no sense to attach a cull callback to the node
|
//note, it makes no sense to attach a cull callback to the node
|
||||||
//at there are no nodes to traverse below the geode, only
|
//at there are no nodes to traverse below the geode, only
|
||||||
//drawables, and as such the Cull node callbacks is ignored.
|
//drawables, and as such the Cull node callbacks is ignored.
|
||||||
@@ -116,7 +116,7 @@ class InsertCallbacksVisitor : public osg::NodeVisitor
|
|||||||
geode.getDrawable(i)->setDrawCallback(new DrawableDrawCallback());
|
geode.getDrawable(i)->setDrawCallback(new DrawableDrawCallback());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(osg::Transform& node)
|
virtual void apply(osg::Transform& node)
|
||||||
{
|
{
|
||||||
apply((osg::Node&)node);
|
apply((osg::Node&)node);
|
||||||
@@ -140,7 +140,7 @@ public:
|
|||||||
class CameraUpdateCallback : public osg::NodeCallback
|
class CameraUpdateCallback : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||||
{
|
{
|
||||||
std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;
|
std::cout<<"Camera update callback - pre traverse"<<node<<std::endl;
|
||||||
traverse(node,nv);
|
traverse(node,nv);
|
||||||
std::cout<<"Camera update callback - post traverse"<<node<<std::endl;
|
std::cout<<"Camera update callback - post traverse"<<node<<std::endl;
|
||||||
@@ -150,50 +150,131 @@ class CameraUpdateCallback : public osg::NodeCallback
|
|||||||
class CameraEventCallback : public osg::NodeCallback
|
class CameraEventCallback : public osg::NodeCallback
|
||||||
{
|
{
|
||||||
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
|
||||||
{
|
{
|
||||||
std::cout<<"Camera event callback - pre traverse"<<node<<std::endl;
|
std::cout<<"Camera event callback - pre traverse"<<node<<std::endl;
|
||||||
traverse(node,nv);
|
traverse(node,nv);
|
||||||
std::cout<<"Camera event callback - post traverse"<<node<<std::endl;
|
std::cout<<"Camera event callback - post traverse"<<node<<std::endl;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct TestDrawableUpdateCallback : public osg::Drawable::UpdateCallback
|
||||||
|
{
|
||||||
|
TestDrawableUpdateCallback(const std::string &message): _message(message) {}
|
||||||
|
|
||||||
|
virtual void update(osg::NodeVisitor*, osg::Drawable* drw) {
|
||||||
|
printf("%s\n", _message.c_str());
|
||||||
|
}
|
||||||
|
std::string _message;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TestNodeUpdateCallback : public osg::NodeCallback
|
||||||
|
{
|
||||||
|
TestNodeUpdateCallback(const std::string &message): _message(message) {}
|
||||||
|
|
||||||
|
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
|
||||||
|
printf("%s\n", _message.c_str());
|
||||||
|
}
|
||||||
|
std::string _message;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char **argv )
|
int main( int argc, char **argv )
|
||||||
{
|
{
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// set the osgDB::Registy read file callback to catch all requests for reading files.
|
// set the osgDB::Registy read file callback to catch all requests for reading files.
|
||||||
osgDB::Registry::instance()->setReadFileCallback(new MyReadFileCallback());
|
osgDB::Registry::instance()->setReadFileCallback(new MyReadFileCallback());
|
||||||
|
|
||||||
// initialize the viewer.
|
// initialize the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
// load the nodes from the commandline arguments.
|
// load the nodes from the commandline arguments.
|
||||||
osg::Node* rootnode = osgDB::readNodeFiles(arguments);
|
osg::ref_ptr<osg::Node> rootnode;
|
||||||
|
|
||||||
// if not loaded assume no arguments passed in, try use default mode instead.
|
if (arguments.read("--test"))
|
||||||
if (!rootnode) rootnode = osgDB::readNodeFile("cow.osgt");
|
|
||||||
|
|
||||||
if (!rootnode)
|
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Please specify a file on the command line"<<std::endl;
|
osg::ref_ptr<osg::Group> root = new osg::Group();
|
||||||
|
rootnode = root;
|
||||||
|
|
||||||
|
osg::Node *test1 = new osg::Node();
|
||||||
|
test1->setUpdateCallback(new TestNodeUpdateCallback("test1"));
|
||||||
|
root->addChild(test1);
|
||||||
|
|
||||||
|
osg::Drawable *test2 = new osg::Drawable();
|
||||||
|
test2->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test2"));
|
||||||
|
root->addChild(test2);
|
||||||
|
|
||||||
|
osg::Drawable *test3 = new osg::Drawable();
|
||||||
|
test3->setUpdateCallback(new TestDrawableUpdateCallback("test3"));
|
||||||
|
root->addChild(test3);
|
||||||
|
|
||||||
|
osg::Geode *test4 = new osg::Geode();
|
||||||
|
osg::Drawable *drawable1 = new osg::Drawable();
|
||||||
|
drawable1->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test4"));
|
||||||
|
test4->addDrawable(drawable1);
|
||||||
|
root->addChild(test4);
|
||||||
|
|
||||||
|
osg::Geode *test5 = new osg::Geode();
|
||||||
|
osg::Drawable *drawable2 = new osg::Drawable();
|
||||||
|
drawable2->setUpdateCallback(new TestDrawableUpdateCallback("test5"));
|
||||||
|
test5->addDrawable(drawable2);
|
||||||
|
root->addChild(test5);
|
||||||
|
|
||||||
|
osg::Geode *test6 = new osg::Geode();
|
||||||
|
osg::Drawable *drawable3 = new osg::Drawable();
|
||||||
|
drawable3->setUpdateCallback(new TestDrawableUpdateCallback("test6"));
|
||||||
|
test6->addChild(drawable3);
|
||||||
|
root->addChild(test6);
|
||||||
|
|
||||||
|
osg::Geode *test7 = new osg::Geode();
|
||||||
|
osg::Drawable *drawable4 = new osg::Drawable();
|
||||||
|
drawable4->osg::Node::setUpdateCallback(new TestNodeUpdateCallback("test7"));
|
||||||
|
test7->addChild(drawable4);
|
||||||
|
root->addChild(test7);
|
||||||
|
|
||||||
|
printf("Numchildren with updates %u\n", rootnode->getNumChildrenRequiringUpdateTraversal());
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// run optimization over the scene graph
|
{
|
||||||
osgUtil::Optimizer optimzer;
|
rootnode = osgDB::readNodeFiles(arguments);
|
||||||
optimzer.optimize(rootnode);
|
|
||||||
|
// if not loaded assume no arguments passed in, try use default mode instead.
|
||||||
// insert all the callbacks
|
if (!rootnode) rootnode = osgDB::readNodeFile("cow.osgt");
|
||||||
InsertCallbacksVisitor icv;
|
|
||||||
rootnode->accept(icv);
|
if (!rootnode)
|
||||||
|
{
|
||||||
|
osg::notify(osg::NOTICE)<<"Please specify a file on the command line"<<std::endl;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// run optimization over the scene graph
|
||||||
|
osgUtil::Optimizer optimzer;
|
||||||
|
optimzer.optimize(rootnode.get());
|
||||||
|
|
||||||
|
// insert all the callbacks
|
||||||
|
InsertCallbacksVisitor icv;
|
||||||
|
rootnode->accept(icv);
|
||||||
|
}
|
||||||
|
|
||||||
viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback());
|
viewer.getCamera()->setUpdateCallback(new CameraUpdateCallback());
|
||||||
viewer.getCamera()->setEventCallback(new CameraEventCallback());
|
viewer.getCamera()->setEventCallback(new CameraEventCallback());
|
||||||
|
|
||||||
// set the scene to render
|
// set the scene to render
|
||||||
viewer.setSceneData(rootnode);
|
viewer.setSceneData(rootnode.get());
|
||||||
|
|
||||||
return viewer.run();
|
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
|
||||||
|
|
||||||
|
viewer.realize();
|
||||||
|
|
||||||
|
while(!viewer.done())
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<std::endl<<"New Frame"<<std::endl;
|
||||||
|
viewer.frame();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,7 +304,7 @@ int main( int argc, char **argv )
|
|||||||
osgViewer::View* view = dynamic_cast<osgViewer::View*>(object.get());
|
osgViewer::View* view = dynamic_cast<osgViewer::View*>(object.get());
|
||||||
if (view)
|
if (view)
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Read config file succesfully"<<std::endl;
|
osg::notify(osg::NOTICE)<<"Read config file successfully"<<std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1366,6 +1366,7 @@ class CompileStateCallback : public osg::Operation
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CompileStateCallback(GameEventHandler* eh):
|
CompileStateCallback(GameEventHandler* eh):
|
||||||
|
osg::Referenced(true),
|
||||||
osg::Operation("CompileStateCallback", false),
|
osg::Operation("CompileStateCallback", false),
|
||||||
_gameEventHandler(eh) {}
|
_gameEventHandler(eh) {}
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ osg::Node* decorate_with_clip_node(osg::Node* subgraph)
|
|||||||
rootnode->addChild(wireframe_subgraph);
|
rootnode->addChild(wireframe_subgraph);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// simple approach to adding a clipnode above a subrgaph.
|
// simple approach to adding a clipnode above a subgraph.
|
||||||
|
|
||||||
// create clipped part.
|
// create clipped part.
|
||||||
osg::ClipNode* clipped_subgraph = new osg::ClipNode;
|
osg::ClipNode* clipped_subgraph = new osg::ClipNode;
|
||||||
@@ -78,7 +78,7 @@ osg::Node* decorate_with_clip_node(osg::Node* subgraph)
|
|||||||
|
|
||||||
|
|
||||||
// more complex approach to managing ClipNode, allowing
|
// more complex approach to managing ClipNode, allowing
|
||||||
// ClipNode node to be transformed independantly from the subgraph
|
// ClipNode node to be transformed independently from the subgraph
|
||||||
// that it is clipping.
|
// that it is clipping.
|
||||||
|
|
||||||
osg::MatrixTransform* transform= new osg::MatrixTransform;
|
osg::MatrixTransform* transform= new osg::MatrixTransform;
|
||||||
@@ -126,7 +126,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
if (!loadedModel)
|
if (!loadedModel)
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Please specifiy a filename and the command line"<<std::endl;
|
osg::notify(osg::NOTICE)<<"Please specify a filename on the command line"<<std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,17 +44,16 @@
|
|||||||
#include "broadcaster.h"
|
#include "broadcaster.h"
|
||||||
|
|
||||||
|
|
||||||
const unsigned int MAX_NUM_EVENTS = 10;
|
|
||||||
const unsigned int SWAP_BYTES_COMPARE = 0x12345678;
|
const unsigned int SWAP_BYTES_COMPARE = 0x12345678;
|
||||||
class CameraPacket {
|
class CameraPacket {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
CameraPacket():_masterKilled(false)
|
CameraPacket():_masterKilled(false)
|
||||||
{
|
{
|
||||||
_byte_order = SWAP_BYTES_COMPARE;
|
_byte_order = SWAP_BYTES_COMPARE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPacket(const osg::Matrix& matrix,const osg::FrameStamp* frameStamp)
|
void setPacket(const osg::Matrix& matrix,const osg::FrameStamp* frameStamp)
|
||||||
{
|
{
|
||||||
_matrix = matrix;
|
_matrix = matrix;
|
||||||
@@ -63,20 +62,20 @@ class CameraPacket {
|
|||||||
_frameStamp = *frameStamp;
|
_frameStamp = *frameStamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void getModelView(osg::Matrix& matrix,float angle_offset=0.0f)
|
void getModelView(osg::Matrix& matrix,float angle_offset=0.0f)
|
||||||
{
|
{
|
||||||
|
|
||||||
matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f);
|
matrix = _matrix * osg::Matrix::rotate(osg::DegreesToRadians(angle_offset),0.0f,1.0f,0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void readEventQueue(osgViewer::Viewer& viewer);
|
void readEventQueue(osgViewer::Viewer& viewer);
|
||||||
|
|
||||||
void writeEventQueue(osgViewer::Viewer& viewer);
|
void writeEventQueue(osgViewer::Viewer& viewer);
|
||||||
|
|
||||||
void setMasterKilled(const bool flag) { _masterKilled = flag; }
|
void setMasterKilled(const bool flag) { _masterKilled = flag; }
|
||||||
const bool getMasterKilled() const { return _masterKilled; }
|
const bool getMasterKilled() const { return _masterKilled; }
|
||||||
|
|
||||||
unsigned int _byte_order;
|
unsigned int _byte_order;
|
||||||
bool _masterKilled;
|
bool _masterKilled;
|
||||||
osg::Matrix _matrix;
|
osg::Matrix _matrix;
|
||||||
@@ -84,11 +83,11 @@ class CameraPacket {
|
|||||||
// note don't use a ref_ptr as used elsewhere for FrameStamp
|
// note don't use a ref_ptr as used elsewhere for FrameStamp
|
||||||
// since we don't want to copy the pointer - but the memory.
|
// since we don't want to copy the pointer - but the memory.
|
||||||
// FrameStamp doesn't have a private destructor to allow
|
// FrameStamp doesn't have a private destructor to allow
|
||||||
// us to do this, even though its a reference counted object.
|
// us to do this, even though its a reference counted object.
|
||||||
osg::FrameStamp _frameStamp;
|
osg::FrameStamp _frameStamp;
|
||||||
|
|
||||||
osgGA::EventQueue::Events _events;
|
osgGA::EventQueue::Events _events;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DataConverter
|
class DataConverter
|
||||||
@@ -112,7 +111,7 @@ class DataConverter
|
|||||||
bool _swapBytes;
|
bool _swapBytes;
|
||||||
|
|
||||||
char* _currentPtr;
|
char* _currentPtr;
|
||||||
|
|
||||||
void reset()
|
void reset()
|
||||||
{
|
{
|
||||||
_currentPtr = _startPtr;
|
_currentPtr = _startPtr;
|
||||||
@@ -122,22 +121,22 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+1>=_endPtr) return;
|
if (_currentPtr+1>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read1(char* ptr)
|
inline void read1(char* ptr)
|
||||||
{
|
{
|
||||||
if (_currentPtr+1>=_endPtr) return;
|
if (_currentPtr+1>=_endPtr) return;
|
||||||
|
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void write2(char* ptr)
|
inline void write2(char* ptr)
|
||||||
{
|
{
|
||||||
if (_currentPtr+2>=_endPtr) return;
|
if (_currentPtr+2>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read2(char* ptr)
|
inline void read2(char* ptr)
|
||||||
@@ -146,13 +145,13 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,10 +159,10 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+4>=_endPtr) return;
|
if (_currentPtr+4>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read4(char* ptr)
|
inline void read4(char* ptr)
|
||||||
@@ -172,17 +171,17 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+3) = *(_currentPtr++);
|
*(ptr+3) = *(_currentPtr++);
|
||||||
*(ptr+2) = *(_currentPtr++);
|
*(ptr+2) = *(_currentPtr++);
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,15 +189,15 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
if (_currentPtr+8>=_endPtr) return;
|
if (_currentPtr+8>=_endPtr) return;
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
|
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr++);
|
*(_currentPtr++) = *(ptr++);
|
||||||
*(_currentPtr++) = *(ptr);
|
*(_currentPtr++) = *(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void read8(char* ptr)
|
inline void read8(char* ptr)
|
||||||
@@ -208,27 +207,27 @@ class DataConverter
|
|||||||
|
|
||||||
if (_swapBytes)
|
if (_swapBytes)
|
||||||
{
|
{
|
||||||
*(ptr+7) = *(_currentPtr++);
|
*(ptr+7) = *(_currentPtr++);
|
||||||
*(ptr+6) = *(_currentPtr++);
|
*(ptr+6) = *(_currentPtr++);
|
||||||
*(ptr+5) = *(_currentPtr++);
|
*(ptr+5) = *(_currentPtr++);
|
||||||
*(ptr+4) = *(_currentPtr++);
|
*(ptr+4) = *(_currentPtr++);
|
||||||
|
|
||||||
*(ptr+3) = *(_currentPtr++);
|
*(ptr+3) = *(_currentPtr++);
|
||||||
*(ptr+2) = *(_currentPtr++);
|
*(ptr+2) = *(_currentPtr++);
|
||||||
*(ptr+1) = *(_currentPtr++);
|
*(ptr+1) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
|
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr++) = *(_currentPtr++);
|
*(ptr++) = *(_currentPtr++);
|
||||||
*(ptr) = *(_currentPtr++);
|
*(ptr) = *(_currentPtr++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,14 +240,14 @@ class DataConverter
|
|||||||
inline void writeFloat(float c) { write4((char*)&c); }
|
inline void writeFloat(float c) { write4((char*)&c); }
|
||||||
inline void writeDouble(double c) { write8((char*)&c); }
|
inline void writeDouble(double c) { write8((char*)&c); }
|
||||||
|
|
||||||
inline char readChar() { char c; read1(&c); return c; }
|
inline char readChar() { char c=0; read1(&c); return c; }
|
||||||
inline unsigned char readUChar() { unsigned char c; read1((char*)&c); return c; }
|
inline unsigned char readUChar() { unsigned char c=0; read1((char*)&c); return c; }
|
||||||
inline short readShort() { short c; read2((char*)&c); return c; }
|
inline short readShort() { short c=0; read2((char*)&c); return c; }
|
||||||
inline unsigned short readUShort() { unsigned short c; read2((char*)&c); return c; }
|
inline unsigned short readUShort() { unsigned short c=0; read2((char*)&c); return c; }
|
||||||
inline int readInt() { int c; read4((char*)&c); return c; }
|
inline int readInt() { int c=0; read4((char*)&c); return c; }
|
||||||
inline unsigned int readUInt() { unsigned int c; read4((char*)&c); return c; }
|
inline unsigned int readUInt() { unsigned int c=0; read4((char*)&c); return c; }
|
||||||
inline float readFloat() { float c; read4((char*)&c); return c; }
|
inline float readFloat() { float c=0.0f; read4((char*)&c); return c; }
|
||||||
inline double readDouble() { double c; read8((char*)&c); return c; }
|
inline double readDouble() { double c=0.0; read8((char*)&c); return c; }
|
||||||
|
|
||||||
void write(const osg::FrameStamp& fs)
|
void write(const osg::FrameStamp& fs)
|
||||||
{
|
{
|
||||||
@@ -361,22 +360,23 @@ class DataConverter
|
|||||||
event.setModKeyMask(readUInt());
|
event.setModKeyMask(readUInt());
|
||||||
event.setTime(readDouble());
|
event.setTime(readDouble());
|
||||||
}
|
}
|
||||||
|
|
||||||
void write(CameraPacket& cameraPacket)
|
void write(CameraPacket& cameraPacket)
|
||||||
{
|
{
|
||||||
writeUInt(cameraPacket._byte_order);
|
writeUInt(cameraPacket._byte_order);
|
||||||
|
|
||||||
writeUInt(cameraPacket._masterKilled);
|
writeUInt(cameraPacket._masterKilled);
|
||||||
|
|
||||||
write(cameraPacket._matrix);
|
write(cameraPacket._matrix);
|
||||||
write(cameraPacket._frameStamp);
|
write(cameraPacket._frameStamp);
|
||||||
|
|
||||||
writeUInt(cameraPacket._events.size());
|
writeUInt(cameraPacket._events.size());
|
||||||
for(osgGA::EventQueue::Events::iterator itr = cameraPacket._events.begin();
|
for(osgGA::EventQueue::Events::iterator itr = cameraPacket._events.begin();
|
||||||
itr != cameraPacket._events.end();
|
itr != cameraPacket._events.end();
|
||||||
++itr)
|
++itr)
|
||||||
{
|
{
|
||||||
write(*(*itr));
|
osgGA::GUIEventAdapter* event = (*itr)->asGUIEventAdapter();
|
||||||
|
if (event) write(*event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,12 +387,12 @@ class DataConverter
|
|||||||
{
|
{
|
||||||
_swapBytes = !_swapBytes;
|
_swapBytes = !_swapBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
cameraPacket._masterKilled = readUInt()!=0;
|
cameraPacket._masterKilled = readUInt()!=0;
|
||||||
|
|
||||||
read(cameraPacket._matrix);
|
read(cameraPacket._matrix);
|
||||||
read(cameraPacket._frameStamp);
|
read(cameraPacket._frameStamp);
|
||||||
|
|
||||||
cameraPacket._events.clear();
|
cameraPacket._events.clear();
|
||||||
unsigned int numEvents = readUInt();
|
unsigned int numEvents = readUInt();
|
||||||
for(unsigned int i=0;i<numEvents;++i)
|
for(unsigned int i=0;i<numEvents;++i)
|
||||||
@@ -409,7 +409,7 @@ void CameraPacket::readEventQueue(osgViewer::Viewer& viewer)
|
|||||||
_events.clear();
|
_events.clear();
|
||||||
|
|
||||||
osgViewer::ViewerBase::Contexts contexts;
|
osgViewer::ViewerBase::Contexts contexts;
|
||||||
viewer.getContexts(contexts);
|
viewer.getContexts(contexts);
|
||||||
|
|
||||||
for(osgViewer::ViewerBase::Contexts::iterator citr =contexts.begin(); citr != contexts.end(); ++citr)
|
for(osgViewer::ViewerBase::Contexts::iterator citr =contexts.begin(); citr != contexts.end(); ++citr)
|
||||||
{
|
{
|
||||||
@@ -423,7 +423,7 @@ void CameraPacket::readEventQueue(osgViewer::Viewer& viewer)
|
|||||||
}
|
}
|
||||||
_events.insert(_events.end(), gw_events.begin(), gw_events.end());
|
_events.insert(_events.end(), gw_events.begin(), gw_events.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
viewer.getEventQueue()->copyEvents(_events);
|
viewer.getEventQueue()->copyEvents(_events);
|
||||||
|
|
||||||
osg::notify(osg::INFO)<<"written events = "<<_events.size()<<std::endl;
|
osg::notify(osg::INFO)<<"written events = "<<_events.size()<<std::endl;
|
||||||
@@ -449,7 +449,7 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// set up the usage document, in case we need to print out how to use this program.
|
// set up the usage document, in case we need to print out how to use this program.
|
||||||
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates how to approach implementation of clustering.");
|
arguments.getApplicationUsage()->setDescription(arguments.getApplicationName()+" is the example which demonstrates how to approach implementation of clustering.");
|
||||||
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
||||||
@@ -459,7 +459,7 @@ int main( int argc, char **argv )
|
|||||||
arguments.getApplicationUsage()->addCommandLineOption("-n <int>","Socket number to transmit packets");
|
arguments.getApplicationUsage()->addCommandLineOption("-n <int>","Socket number to transmit packets");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("-f <float>","Field of view of camera");
|
arguments.getApplicationUsage()->addCommandLineOption("-f <float>","Field of view of camera");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("-o <float>","Offset angle of camera");
|
arguments.getApplicationUsage()->addCommandLineOption("-o <float>","Offset angle of camera");
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
@@ -468,12 +468,12 @@ int main( int argc, char **argv )
|
|||||||
ViewerMode viewerMode = STAND_ALONE;
|
ViewerMode viewerMode = STAND_ALONE;
|
||||||
while (arguments.read("-m")) viewerMode = MASTER;
|
while (arguments.read("-m")) viewerMode = MASTER;
|
||||||
while (arguments.read("-s")) viewerMode = SLAVE;
|
while (arguments.read("-s")) viewerMode = SLAVE;
|
||||||
|
|
||||||
int socketNumber=8100;
|
int socketNumber=8100;
|
||||||
while (arguments.read("-n",socketNumber)) ;
|
while (arguments.read("-n",socketNumber)) ;
|
||||||
|
|
||||||
float camera_fov=-1.0f;
|
float camera_fov=-1.0f;
|
||||||
while (arguments.read("-f",camera_fov))
|
while (arguments.read("-f",camera_fov))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -497,7 +497,7 @@ int main( int argc, char **argv )
|
|||||||
arguments.writeErrorMessages(std::cout);
|
arguments.writeErrorMessages(std::cout);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.argc()<=1)
|
if (arguments.argc()<=1)
|
||||||
{
|
{
|
||||||
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
|
arguments.getApplicationUsage()->write(std::cout,osg::ApplicationUsage::COMMAND_LINE_OPTION);
|
||||||
@@ -514,13 +514,13 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
double fovy, aspectRatio, zNear, zFar;
|
double fovy, aspectRatio, zNear, zFar;
|
||||||
viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
||||||
|
|
||||||
double original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0;
|
double original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0;
|
||||||
std::cout << "setting lens perspective : original "<<original_fov<<" "<<fovy<<std::endl;
|
std::cout << "setting lens perspective : original "<<original_fov<<" "<<fovy<<std::endl;
|
||||||
|
|
||||||
fovy = atan(tan(osg::DegreesToRadians(camera_fov)*0.5)/aspectRatio)*2.0;
|
fovy = atan(tan(osg::DegreesToRadians(camera_fov)*0.5)/aspectRatio)*2.0;
|
||||||
viewer.getCamera()->setProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
viewer.getCamera()->setProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
||||||
|
|
||||||
viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
viewer.getCamera()->getProjectionMatrixAsPerspective(fovy, aspectRatio,zNear, zFar);
|
||||||
original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0;
|
original_fov = atan(tan(osg::DegreesToRadians(fovy)*0.5)*aspectRatio)*2.0;
|
||||||
std::cout << "setting lens perspective : new "<<original_fov<<" "<<fovy<<std::endl;
|
std::cout << "setting lens perspective : new "<<original_fov<<" "<<fovy<<std::endl;
|
||||||
@@ -549,13 +549,13 @@ int main( int argc, char **argv )
|
|||||||
rc.setPort(static_cast<short int>(socketNumber));
|
rc.setPort(static_cast<short int>(socketNumber));
|
||||||
|
|
||||||
bool masterKilled = false;
|
bool masterKilled = false;
|
||||||
|
|
||||||
DataConverter scratchPad(1024);
|
DataConverter scratchPad(1024);
|
||||||
|
|
||||||
while( !viewer.done() && !masterKilled )
|
while( !viewer.done() && !masterKilled )
|
||||||
{
|
{
|
||||||
osg::Timer_t startTick = osg::Timer::instance()->tick();
|
osg::Timer_t startTick = osg::Timer::instance()->tick();
|
||||||
|
|
||||||
viewer.advance();
|
viewer.advance();
|
||||||
|
|
||||||
// special handling for working as a cluster.
|
// special handling for working as a cluster.
|
||||||
@@ -563,12 +563,12 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
case(MASTER):
|
case(MASTER):
|
||||||
{
|
{
|
||||||
|
|
||||||
// take camera zero as the guide.
|
// take camera zero as the guide.
|
||||||
osg::Matrix modelview(viewer.getCamera()->getViewMatrix());
|
osg::Matrix modelview(viewer.getCamera()->getViewMatrix());
|
||||||
|
|
||||||
cp->setPacket(modelview,viewer.getFrameStamp());
|
cp->setPacket(modelview,viewer.getFrameStamp());
|
||||||
|
|
||||||
cp->readEventQueue(viewer);
|
cp->readEventQueue(viewer);
|
||||||
|
|
||||||
scratchPad.reset();
|
scratchPad.reset();
|
||||||
@@ -578,11 +578,11 @@ int main( int argc, char **argv )
|
|||||||
scratchPad.read(*cp);
|
scratchPad.read(*cp);
|
||||||
|
|
||||||
bc.setBuffer(scratchPad._startPtr, scratchPad._numBytes);
|
bc.setBuffer(scratchPad._startPtr, scratchPad._numBytes);
|
||||||
|
|
||||||
std::cout << "bc.sync()"<<scratchPad._numBytes<<std::endl;
|
std::cout << "bc.sync()"<<scratchPad._numBytes<<std::endl;
|
||||||
|
|
||||||
bc.sync();
|
bc.sync();
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case(SLAVE):
|
case(SLAVE):
|
||||||
@@ -591,13 +591,13 @@ int main( int argc, char **argv )
|
|||||||
rc.setBuffer(scratchPad._startPtr, scratchPad._numBytes);
|
rc.setBuffer(scratchPad._startPtr, scratchPad._numBytes);
|
||||||
|
|
||||||
rc.sync();
|
rc.sync();
|
||||||
|
|
||||||
scratchPad.reset();
|
scratchPad.reset();
|
||||||
scratchPad.read(*cp);
|
scratchPad.read(*cp);
|
||||||
|
|
||||||
cp->writeEventQueue(viewer);
|
cp->writeEventQueue(viewer);
|
||||||
|
|
||||||
if (cp->getMasterKilled())
|
if (cp->getMasterKilled())
|
||||||
{
|
{
|
||||||
std::cout << "Received master killed."<<std::endl;
|
std::cout << "Received master killed."<<std::endl;
|
||||||
// break out of while (!done) loop since we've now want to shut down.
|
// break out of while (!done) loop since we've now want to shut down.
|
||||||
@@ -609,12 +609,12 @@ int main( int argc, char **argv )
|
|||||||
// no need to anything here, just a normal interactive viewer.
|
// no need to anything here, just a normal interactive viewer.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Timer_t endTick = osg::Timer::instance()->tick();
|
osg::Timer_t endTick = osg::Timer::instance()->tick();
|
||||||
|
|
||||||
osg::notify(osg::INFO)<<"Time to do cluster sync "<<osg::Timer::instance()->delta_m(startTick,endTick)<<std::endl;
|
osg::notify(osg::INFO)<<"Time to do cluster sync "<<osg::Timer::instance()->delta_m(startTick,endTick)<<std::endl;
|
||||||
|
|
||||||
// update the scene by traversing it with the the update visitor which will
|
// update the scene by traversing it with the update visitor which will
|
||||||
// call all node update callbacks and animations.
|
// call all node update callbacks and animations.
|
||||||
viewer.eventTraversal();
|
viewer.eventTraversal();
|
||||||
viewer.updateTraversal();
|
viewer.updateTraversal();
|
||||||
@@ -623,14 +623,14 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
osg::Matrix modelview;
|
osg::Matrix modelview;
|
||||||
cp->getModelView(modelview,camera_offset);
|
cp->getModelView(modelview,camera_offset);
|
||||||
|
|
||||||
viewer.getCamera()->setViewMatrix(modelview);
|
viewer.getCamera()->setViewMatrix(modelview);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fire off the cull and draw traversals of the scene.
|
// fire off the cull and draw traversals of the scene.
|
||||||
if(!masterKilled)
|
if(!masterKilled)
|
||||||
viewer.renderingTraversals();
|
viewer.renderingTraversals();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we are master clean up by telling all slaves that we're going down.
|
// if we are master clean up by telling all slaves that we're going down.
|
||||||
@@ -638,7 +638,7 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
// need to broadcast my death.
|
// need to broadcast my death.
|
||||||
cp->setPacket(osg::Matrix::identity(),viewer.getFrameStamp());
|
cp->setPacket(osg::Matrix::identity(),viewer.getFrameStamp());
|
||||||
cp->setMasterKilled(true);
|
cp->setMasterKilled(true);
|
||||||
|
|
||||||
scratchPad.reset();
|
scratchPad.reset();
|
||||||
scratchPad.write(*cp);
|
scratchPad.write(*cp);
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// ------------- Start of copy specific code -------------------------------------------------------
|
// ------------- Start of copy specific code -------------------------------------------------------
|
||||||
|
|
||||||
// do a deep copy, using MyCopyOp to reveal whats going on under the good,
|
// do a deep copy, using MyCopyOp to reveal whats going on under the hood,
|
||||||
// in your own code you'd typically just use the basic osg::CopyOp something like
|
// in your own code you'd typically just use the basic osg::CopyOp something like
|
||||||
osg::ref_ptr<osg::Node> mycopy = dynamic_cast<osg::Node*>(rootnode->clone(osg::CopyOp::DEEP_COPY_ALL));
|
osg::ref_ptr<osg::Node> mycopy = dynamic_cast<osg::Node*>(rootnode->clone(osg::CopyOp::DEEP_COPY_ALL));
|
||||||
std::cout << "Doing a deep copy of scene graph"<<std::endl;
|
std::cout << "Doing a deep copy of scene graph"<<std::endl;
|
||||||
|
|||||||
@@ -43,21 +43,21 @@
|
|||||||
void create_specular_highlights(osg::Node *node)
|
void create_specular_highlights(osg::Node *node)
|
||||||
{
|
{
|
||||||
osg::StateSet *ss = node->getOrCreateStateSet();
|
osg::StateSet *ss = node->getOrCreateStateSet();
|
||||||
|
|
||||||
// create and setup the texture object
|
// create and setup the texture object
|
||||||
osg::TextureCubeMap *tcm = new osg::TextureCubeMap;
|
osg::TextureCubeMap *tcm = new osg::TextureCubeMap;
|
||||||
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP);
|
||||||
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP);
|
||||||
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP);
|
tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP);
|
||||||
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
|
tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR);
|
||||||
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
|
|
||||||
// generate the six highlight map images (light direction = [1, 1, -1])
|
// generate the six highlight map images (light direction = [1, 1, -1])
|
||||||
osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator(
|
osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator(
|
||||||
osg::Vec3(1, 1, -1), // light direction
|
osg::Vec3(1, 1, -1), // light direction
|
||||||
osg::Vec4(1, 0.9f, 0.8f, 1), // light color
|
osg::Vec4(1, 0.9f, 0.8f, 1), // light color
|
||||||
8); // specular exponent
|
8); // specular exponent
|
||||||
|
|
||||||
mapgen->generateMap();
|
mapgen->generateMap();
|
||||||
|
|
||||||
// assign the six images to the texture object
|
// assign the six images to the texture object
|
||||||
@@ -77,7 +77,7 @@ void create_specular_highlights(osg::Node *node)
|
|||||||
ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON);
|
||||||
|
|
||||||
// use TexEnvCombine to add the highlights to the original lighting
|
// use TexEnvCombine to add the highlights to the original lighting
|
||||||
osg::TexEnvCombine *te = new osg::TexEnvCombine;
|
osg::TexEnvCombine *te = new osg::TexEnvCombine;
|
||||||
te->setCombine_RGB(osg::TexEnvCombine::ADD);
|
te->setCombine_RGB(osg::TexEnvCombine::ADD);
|
||||||
te->setSource0_RGB(osg::TexEnvCombine::TEXTURE);
|
te->setSource0_RGB(osg::TexEnvCombine::TEXTURE);
|
||||||
te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR);
|
te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR);
|
||||||
@@ -93,7 +93,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
// load the nodes from the commandline arguments.
|
// load the nodes from the commandline arguments.
|
||||||
osg::Node* rootnode = osgDB::readNodeFiles(arguments);
|
osg::Node* rootnode = osgDB::readNodeFiles(arguments);
|
||||||
|
|
||||||
@@ -108,32 +108,16 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
// create specular highlights
|
// create specular highlights
|
||||||
create_specular_highlights(rootnode);
|
create_specular_highlights(rootnode);
|
||||||
|
|
||||||
// run optimization over the scene graph
|
// run optimization over the scene graph
|
||||||
osgUtil::Optimizer optimzer;
|
osgUtil::Optimizer optimzer;
|
||||||
optimzer.optimize(rootnode);
|
optimzer.optimize(rootnode);
|
||||||
|
|
||||||
// add a viewport to the viewer and attach the scene graph.
|
// add a viewport to the viewer and attach the scene graph.
|
||||||
viewer.setSceneData(rootnode);
|
viewer.setSceneData(rootnode);
|
||||||
|
|
||||||
// create the windows and run the threads.
|
// create the windows and run the threads.
|
||||||
viewer.realize();
|
viewer.realize();
|
||||||
|
|
||||||
// now check to see if texture cube map is supported.
|
|
||||||
for(unsigned int contextID = 0;
|
|
||||||
contextID<osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts();
|
|
||||||
++contextID)
|
|
||||||
{
|
|
||||||
osg::TextureCubeMap::Extensions* tcmExt = osg::TextureCubeMap::getExtensions(contextID,false);
|
|
||||||
if (tcmExt)
|
|
||||||
{
|
|
||||||
if (!tcmExt->isCubeMapSupported())
|
|
||||||
{
|
|
||||||
std::cout<<"Warning: texture_cube_map not supported by OpenGL drivers, unable to run application."<<std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return viewer.run();
|
return viewer.run();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ bool DePee::createHUD()
|
|||||||
osg::BoundingBox bb;
|
osg::BoundingBox bb;
|
||||||
for(unsigned int i=0;i<geode->getNumDrawables();++i)
|
for(unsigned int i=0;i<geode->getNumDrawables();++i)
|
||||||
{
|
{
|
||||||
bb.expandBy(geode->getDrawable(i)->getBound());
|
bb.expandBy(geode->getDrawable(i)->getBoundingBox());
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Geometry* geom = new osg::Geometry;
|
osg::Geometry* geom = new osg::Geometry;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
The DePee class is main class for setting up and managing depth peeling.
|
The DePee class is main class for setting up and managing depth peeling.
|
||||||
A DePee object can be seen as a virtual node, that has one parent and one child. The rendering of every child and subchil of this child is managed by the the DePee node. Besides that, it handles a head up display.
|
A DePee object can be seen as a virtual node, that has one parent and one child. The rendering of every child and subchil of this child is managed by the DePee node. Besides that, it handles a head up display.
|
||||||
*/
|
*/
|
||||||
class DePee : public osg::Referenced
|
class DePee : public osg::Referenced
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -52,18 +52,96 @@
|
|||||||
|
|
||||||
using namespace osg;
|
using namespace osg;
|
||||||
|
|
||||||
osg::Node* createDistortionSubgraph(osg::Node* subgraph, const osg::Vec4& clearColour)
|
struct CommandLineOptions
|
||||||
|
{
|
||||||
|
unsigned int width;
|
||||||
|
unsigned int height;
|
||||||
|
unsigned int tex_width;
|
||||||
|
unsigned int tex_height;
|
||||||
|
double sphere_radius;
|
||||||
|
double collar_radius;
|
||||||
|
double distance;
|
||||||
|
|
||||||
|
CommandLineOptions():
|
||||||
|
width(1024),
|
||||||
|
height(1024),
|
||||||
|
tex_width(1024),
|
||||||
|
tex_height(1024),
|
||||||
|
sphere_radius(1.0),
|
||||||
|
collar_radius(0.45),
|
||||||
|
distance(1.0)
|
||||||
|
{
|
||||||
|
|
||||||
|
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
||||||
|
if (!wsi)
|
||||||
|
{
|
||||||
|
osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int width, height;
|
||||||
|
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
||||||
|
|
||||||
|
distance = sqrt(sphere_radius*sphere_radius - collar_radius*collar_radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
void read(osg::ArgumentParser& arguments)
|
||||||
|
{
|
||||||
|
while (arguments.read("--width",width)) {}
|
||||||
|
while (arguments.read("--height",height)) {}
|
||||||
|
while (arguments.read("--texture-width",tex_width) || arguments.read("--tx",tex_width) ) {}
|
||||||
|
while (arguments.read("--texture-height",tex_height) || arguments.read("--ty",tex_height) ) {}
|
||||||
|
|
||||||
|
while (arguments.read("--radius", sphere_radius)) {}
|
||||||
|
while (arguments.read("--collar", collar_radius)) {}
|
||||||
|
|
||||||
|
distance = sqrt(sphere_radius*sphere_radius - collar_radius*collar_radius);
|
||||||
|
while (arguments.read("--distance", distance)) {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class WindowResizedHandler : public osgGA::GUIEventHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WindowResizedHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* object, osg::NodeVisitor* nv)
|
||||||
|
{
|
||||||
|
osg::Camera* camera = dynamic_cast<osg::Camera*>(object);
|
||||||
|
if (!camera) return false;
|
||||||
|
|
||||||
|
const osg::FrameStamp* fs = nv->getFrameStamp();
|
||||||
|
|
||||||
|
if (ea.getEventType()==osgGA::GUIEventAdapter::RESIZE)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<"Window resized event context="<<ea.getGraphicsContext()<<" frameNumber = "<<fs->getFrameNumber()<<std::endl;
|
||||||
|
OSG_NOTICE<<" WindowX="<<ea.getWindowX()<<std::endl;
|
||||||
|
OSG_NOTICE<<" WindowY="<<ea.getWindowY()<<std::endl;
|
||||||
|
OSG_NOTICE<<" WindowWidth="<<ea.getWindowWidth()<<std::endl;
|
||||||
|
OSG_NOTICE<<" WindowHeight="<<ea.getWindowHeight()<<std::endl;
|
||||||
|
|
||||||
|
// reset the Camera viewport and associated Texture's to make sure it tracks the new window size.
|
||||||
|
camera->resize(ea.getWindowWidth(), ea.getWindowHeight());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
osg::Node* createDistortionSubgraph(CommandLineOptions& options, osg::Node* subgraph, const osg::Vec4& clearColour)
|
||||||
{
|
{
|
||||||
osg::Group* distortionNode = new osg::Group;
|
osg::Group* distortionNode = new osg::Group;
|
||||||
|
|
||||||
unsigned int tex_width = 1024;
|
|
||||||
unsigned int tex_height = 1024;
|
|
||||||
|
|
||||||
osg::Texture2D* texture = new osg::Texture2D;
|
osg::Texture2D* texture = new osg::Texture2D;
|
||||||
texture->setTextureSize(tex_width, tex_height);
|
texture->setTextureSize(options.tex_width, options.tex_height);
|
||||||
texture->setInternalFormat(GL_RGBA);
|
texture->setInternalFormat(GL_RGBA);
|
||||||
texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
|
texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
|
||||||
texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
|
texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
|
||||||
|
texture->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::CLAMP_TO_EDGE);
|
||||||
|
texture->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::CLAMP_TO_EDGE);
|
||||||
|
|
||||||
// set up the render to texture camera.
|
// set up the render to texture camera.
|
||||||
{
|
{
|
||||||
@@ -79,7 +157,7 @@ osg::Node* createDistortionSubgraph(osg::Node* subgraph, const osg::Vec4& clearC
|
|||||||
camera->setViewMatrix(osg::Matrixd::identity());
|
camera->setViewMatrix(osg::Matrixd::identity());
|
||||||
|
|
||||||
// set viewport
|
// set viewport
|
||||||
camera->setViewport(0,0,tex_width,tex_height);
|
camera->setViewport(0,0,options.tex_width,options.tex_height);
|
||||||
|
|
||||||
// set the camera to render before the main camera.
|
// set the camera to render before the main camera.
|
||||||
camera->setRenderOrder(osg::Camera::PRE_RENDER);
|
camera->setRenderOrder(osg::Camera::PRE_RENDER);
|
||||||
@@ -94,6 +172,8 @@ osg::Node* createDistortionSubgraph(osg::Node* subgraph, const osg::Vec4& clearC
|
|||||||
camera->addChild(subgraph);
|
camera->addChild(subgraph);
|
||||||
|
|
||||||
distortionNode->addChild(camera);
|
distortionNode->addChild(camera);
|
||||||
|
|
||||||
|
camera->addEventCallback(new WindowResizedHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
// set up the hud camera
|
// set up the hud camera
|
||||||
@@ -186,27 +266,13 @@ osg::Node* createDistortionSubgraph(osg::Node* subgraph, const osg::Vec4& clearC
|
|||||||
return distortionNode;
|
return distortionNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDomeFaces(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments)
|
void setDomeFaces(osgViewer::Viewer& viewer, CommandLineOptions& options)
|
||||||
{
|
{
|
||||||
|
|
||||||
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
|
||||||
if (!wsi)
|
|
||||||
{
|
|
||||||
osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int width, height;
|
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
|
||||||
|
|
||||||
while (arguments.read("--width",width)) {}
|
|
||||||
while (arguments.read("--height",height)) {}
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 0;
|
traits->x = 0;
|
||||||
traits->y = 0;
|
traits->y = 0;
|
||||||
traits->width = width;
|
traits->width = options.width;
|
||||||
traits->height = height;
|
traits->height = options.height;
|
||||||
traits->windowDecoration = true;
|
traits->windowDecoration = true;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
@@ -219,8 +285,8 @@ void setDomeFaces(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int center_x = width/2;
|
int center_x = options.width/2;
|
||||||
int center_y = height/2;
|
int center_y = options.height/2;
|
||||||
int camera_width = 256;
|
int camera_width = 256;
|
||||||
int camera_height = 256;
|
int camera_height = 256;
|
||||||
|
|
||||||
@@ -303,27 +369,18 @@ void setDomeFaces(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments)
|
|||||||
}
|
}
|
||||||
|
|
||||||
osg::Geometry* createDomeDistortionMesh(const osg::Vec3& origin, const osg::Vec3& widthVector, const osg::Vec3& heightVector,
|
osg::Geometry* createDomeDistortionMesh(const osg::Vec3& origin, const osg::Vec3& widthVector, const osg::Vec3& heightVector,
|
||||||
osg::ArgumentParser& arguments)
|
CommandLineOptions& options)
|
||||||
{
|
{
|
||||||
double sphere_radius = 1.0;
|
|
||||||
if (arguments.read("--radius", sphere_radius)) {}
|
|
||||||
|
|
||||||
double collar_radius = 0.45;
|
|
||||||
if (arguments.read("--collar", collar_radius)) {}
|
|
||||||
|
|
||||||
osg::Vec3d center(0.0,0.0,0.0);
|
osg::Vec3d center(0.0,0.0,0.0);
|
||||||
osg::Vec3d eye(0.0,0.0,0.0);
|
osg::Vec3d eye(0.0,0.0,0.0);
|
||||||
|
|
||||||
double distance = sqrt(sphere_radius*sphere_radius - collar_radius*collar_radius);
|
|
||||||
if (arguments.read("--distance", distance)) {}
|
|
||||||
|
|
||||||
bool centerProjection = false;
|
bool centerProjection = false;
|
||||||
|
|
||||||
osg::Vec3d projector = eye - osg::Vec3d(0.0,0.0, distance);
|
osg::Vec3d projector = eye - osg::Vec3d(0.0,0.0, options.distance);
|
||||||
|
|
||||||
|
|
||||||
osg::notify(osg::NOTICE)<<"Projector position = "<<projector<<std::endl;
|
osg::notify(osg::NOTICE)<<"Projector position = "<<projector<<std::endl;
|
||||||
osg::notify(osg::NOTICE)<<"distance = "<<distance<<std::endl;
|
osg::notify(osg::NOTICE)<<"distance = "<<options.distance<<std::endl;
|
||||||
|
|
||||||
|
|
||||||
// create the quad to visualize.
|
// create the quad to visualize.
|
||||||
@@ -396,15 +453,15 @@ osg::Geometry* createDomeDistortionMesh(const osg::Vec3& origin, const osg::Vec3
|
|||||||
|
|
||||||
// osg::notify(osg::NOTICE)<<"theta = "<<theta<< "phi="<<phi<<std::endl;
|
// osg::notify(osg::NOTICE)<<"theta = "<<theta<< "phi="<<phi<<std::endl;
|
||||||
|
|
||||||
double f = distance * sin(phi);
|
double f = options.distance * sin(phi);
|
||||||
double e = distance * cos(phi) + sqrt( sphere_radius*sphere_radius - f*f);
|
double e = options.distance * cos(phi) + sqrt( options.sphere_radius*options.sphere_radius - f*f);
|
||||||
double l = e * cos(phi);
|
double l = e * cos(phi);
|
||||||
double h = e * sin(phi);
|
double h = e * sin(phi);
|
||||||
double z = l - distance;
|
double z = l - options.distance;
|
||||||
|
|
||||||
osg::Vec3 texcoord(h * cos(theta) / sphere_radius,
|
osg::Vec3 texcoord(h * cos(theta) / options.sphere_radius,
|
||||||
h * sin(theta) / sphere_radius,
|
h * sin(theta) / options.sphere_radius,
|
||||||
z / sphere_radius);
|
z / options.sphere_radius);
|
||||||
|
|
||||||
vertices->push_back(cursor);
|
vertices->push_back(cursor);
|
||||||
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
|
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
|
||||||
@@ -437,33 +494,17 @@ osg::Geometry* createDomeDistortionMesh(const osg::Vec3& origin, const osg::Vec3
|
|||||||
return geometry;
|
return geometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDomeCorrection(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments)
|
void setDomeCorrection(osgViewer::Viewer& viewer, CommandLineOptions& options)
|
||||||
{
|
{
|
||||||
|
|
||||||
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
|
||||||
if (!wsi)
|
|
||||||
{
|
|
||||||
osg::notify(osg::NOTICE)<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int width, height;
|
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
|
||||||
|
|
||||||
while (arguments.read("--width",width)) {}
|
|
||||||
while (arguments.read("--height",height)) {}
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 0;
|
traits->x = 0;
|
||||||
traits->y = 0;
|
traits->y = 0;
|
||||||
traits->width = width;
|
traits->width = options.width;
|
||||||
traits->height = height;
|
traits->height = options.height;
|
||||||
traits->windowDecoration = false;
|
traits->windowDecoration = false;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
|
||||||
if (!gc)
|
if (!gc)
|
||||||
{
|
{
|
||||||
@@ -471,18 +512,18 @@ void setDomeCorrection(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tex_width = 512;
|
int camera_width = options.tex_width;
|
||||||
int tex_height = 512;
|
int camera_height = options.tex_height;
|
||||||
|
|
||||||
int camera_width = tex_width;
|
|
||||||
int camera_height = tex_height;
|
|
||||||
|
|
||||||
osg::TextureCubeMap* texture = new osg::TextureCubeMap;
|
osg::TextureCubeMap* texture = new osg::TextureCubeMap;
|
||||||
|
|
||||||
texture->setTextureSize(tex_width, tex_height);
|
texture->setTextureSize(options.tex_width, options.tex_height);
|
||||||
texture->setInternalFormat(GL_RGB);
|
texture->setInternalFormat(GL_RGB);
|
||||||
texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
|
texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
|
||||||
texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
|
texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
|
||||||
|
texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
texture->setWrap(osg::Texture::WRAP_R,osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
osg::Camera::RenderTargetImplementation renderTargetImplementation = osg::Camera::SEPERATE_WINDOW;
|
osg::Camera::RenderTargetImplementation renderTargetImplementation = osg::Camera::SEPERATE_WINDOW;
|
||||||
@@ -614,7 +655,7 @@ void setDomeCorrection(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments
|
|||||||
// distortion correction set up.
|
// distortion correction set up.
|
||||||
{
|
{
|
||||||
osg::Geode* geode = new osg::Geode();
|
osg::Geode* geode = new osg::Geode();
|
||||||
geode->addDrawable(createDomeDistortionMesh(osg::Vec3(0.0f,0.0f,0.0f), osg::Vec3(width,0.0f,0.0f), osg::Vec3(0.0f,height,0.0f), arguments));
|
geode->addDrawable(createDomeDistortionMesh(osg::Vec3(0.0f,0.0f,0.0f), osg::Vec3(options.width,0.0f,0.0f), osg::Vec3(0.0f,options.height,0.0f), options));
|
||||||
|
|
||||||
// new we need to add the texture to the mesh, we do so by creating a
|
// new we need to add the texture to the mesh, we do so by creating a
|
||||||
// StateSet to contain the Texture StateAttribute.
|
// StateSet to contain the Texture StateAttribute.
|
||||||
@@ -626,7 +667,7 @@ void setDomeCorrection(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments
|
|||||||
camera->setGraphicsContext(gc.get());
|
camera->setGraphicsContext(gc.get());
|
||||||
camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
|
camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
|
||||||
camera->setClearColor( osg::Vec4(0.1,0.1,1.0,1.0) );
|
camera->setClearColor( osg::Vec4(0.1,0.1,1.0,1.0) );
|
||||||
camera->setViewport(new osg::Viewport(0, 0, width, height));
|
camera->setViewport(new osg::Viewport(0, 0, options.width, options.height));
|
||||||
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
|
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
|
||||||
camera->setDrawBuffer(buffer);
|
camera->setDrawBuffer(buffer);
|
||||||
camera->setReadBuffer(buffer);
|
camera->setReadBuffer(buffer);
|
||||||
@@ -635,7 +676,7 @@ void setDomeCorrection(osgViewer::Viewer& viewer, osg::ArgumentParser& arguments
|
|||||||
//camera->setInheritanceMask(camera->getInheritanceMask() & ~osg::CullSettings::CLEAR_COLOR & ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE);
|
//camera->setInheritanceMask(camera->getInheritanceMask() & ~osg::CullSettings::CLEAR_COLOR & ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE);
|
||||||
//camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
|
//camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
|
||||||
|
|
||||||
camera->setProjectionMatrixAsOrtho2D(0,width,0,height);
|
camera->setProjectionMatrixAsOrtho2D(0,options.width,0,options.height);
|
||||||
camera->setViewMatrix(osg::Matrix::identity());
|
camera->setViewMatrix(osg::Matrix::identity());
|
||||||
|
|
||||||
// add subgraph to render
|
// add subgraph to render
|
||||||
@@ -655,8 +696,11 @@ int main(int argc, char** argv)
|
|||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
|
CommandLineOptions options;
|
||||||
|
options.read(arguments);
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer(arguments);
|
||||||
|
|
||||||
// load the nodes from the commandline arguments.
|
// load the nodes from the commandline arguments.
|
||||||
osg::Node* loadedModel = osgDB::readNodeFiles(arguments);
|
osg::Node* loadedModel = osgDB::readNodeFiles(arguments);
|
||||||
@@ -674,20 +718,20 @@ int main(int argc, char** argv)
|
|||||||
if (arguments.read("--dome") || arguments.read("--puffer") )
|
if (arguments.read("--dome") || arguments.read("--puffer") )
|
||||||
{
|
{
|
||||||
|
|
||||||
setDomeCorrection(viewer, arguments);
|
setDomeCorrection(viewer, options);
|
||||||
|
|
||||||
viewer.setSceneData( loadedModel );
|
viewer.setSceneData( loadedModel );
|
||||||
}
|
}
|
||||||
else if (arguments.read("--faces"))
|
else if (arguments.read("--faces"))
|
||||||
{
|
{
|
||||||
|
|
||||||
setDomeFaces(viewer, arguments);
|
setDomeFaces(viewer, options);
|
||||||
|
|
||||||
viewer.setSceneData( loadedModel );
|
viewer.setSceneData( loadedModel );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
osg::Node* distortionNode = createDistortionSubgraph( loadedModel, viewer.getCamera()->getClearColor());
|
osg::Node* distortionNode = createDistortionSubgraph( options, loadedModel, viewer.getCamera()->getClearColor());
|
||||||
viewer.setSceneData( distortionNode );
|
viewer.setSceneData( distortionNode );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -738,6 +782,9 @@ int main(int argc, char** argv)
|
|||||||
|
|
||||||
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
|
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
|
||||||
|
|
||||||
|
// add window resize handler
|
||||||
|
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
|
||||||
|
|
||||||
// add the state manipulator
|
// add the state manipulator
|
||||||
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
|
||||||
|
|
||||||
|
|||||||
@@ -19,17 +19,10 @@ void textInfo(osgText::Text* text)
|
|||||||
|
|
||||||
for(unsigned int i = 0; i < s.size(); i++)
|
for(unsigned int i = 0; i < s.size(); i++)
|
||||||
{
|
{
|
||||||
osg::Vec2 ul = gq.getCoords()[0 + (i * 4)]; // upperLeft
|
osg::Vec2 ul = (*gq.getCoords())[0 + (i * 4)]; // upperLeft
|
||||||
osg::Vec2 ll = gq.getCoords()[1 + (i * 4)]; // lowerLeft
|
osg::Vec2 ll = (*gq.getCoords())[1 + (i * 4)]; // lowerLeft
|
||||||
osg::Vec2 lr = gq.getCoords()[2 + (i * 4)]; // lowerRight
|
osg::Vec2 lr = (*gq.getCoords())[2 + (i * 4)]; // lowerRight
|
||||||
osg::Vec2 ur = gq.getCoords()[3 + (i * 4)]; // upperRight
|
osg::Vec2 ur = (*gq.getCoords())[3 + (i * 4)]; // upperRight
|
||||||
|
|
||||||
/*
|
|
||||||
osg::Vec3 ul = gq.getTransformedCoords(0)[0 + (i * 4)];
|
|
||||||
osg::Vec3 ll = gq.getTransformedCoords(0)[1 + (i * 4)];
|
|
||||||
osg::Vec3 lr = gq.getTransformedCoords(0)[2 + (i * 4)];
|
|
||||||
osg::Vec3 ur = gq.getTransformedCoords(0)[3 + (i * 4)];
|
|
||||||
*/
|
|
||||||
|
|
||||||
osg::notify(osg::NOTICE)
|
osg::notify(osg::NOTICE)
|
||||||
<< "'" << static_cast<char>(s[i]) << "':"
|
<< "'" << static_cast<char>(s[i]) << "':"
|
||||||
|
|||||||
@@ -812,9 +812,9 @@ class ShaderGeometry : public osg::Drawable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual osg::BoundingBox computeBound() const
|
virtual osg::BoundingBox computeBoundingBox() const
|
||||||
{
|
{
|
||||||
osg::BoundingBox geom_box = _geometry->getBound();
|
osg::BoundingBox geom_box = _geometry->getBoundingBox();
|
||||||
osg::BoundingBox bb;
|
osg::BoundingBox bb;
|
||||||
for(PositionSizeList::const_iterator itr = _trees.begin();
|
for(PositionSizeList::const_iterator itr = _trees.begin();
|
||||||
itr != _trees.end();
|
itr != _trees.end();
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
#include <osg/GLExtensions>
|
#include <osg/GLExtensions>
|
||||||
#include <osg/Node>
|
#include <osg/Node>
|
||||||
#include <osg/NodeCallback>
|
|
||||||
#include <osg/Notify>
|
#include <osg/Notify>
|
||||||
#include <osg/observer_ptr>
|
#include <osg/observer_ptr>
|
||||||
#include <osg/Projection>
|
#include <osg/Projection>
|
||||||
@@ -133,10 +132,10 @@ void getPossibleConfigs(GraphicsContext* gc, BufferConfigList& colorConfigs,
|
|||||||
unsigned contextID = gc->getState()->getContextID();
|
unsigned contextID = gc->getState()->getContextID();
|
||||||
colorConfigs.push_back(BufferConfig("RGBA8", GL_RGBA8, 8));
|
colorConfigs.push_back(BufferConfig("RGBA8", GL_RGBA8, 8));
|
||||||
depthConfigs.push_back(BufferConfig("D24", GL_DEPTH_COMPONENT24, 24));
|
depthConfigs.push_back(BufferConfig("D24", GL_DEPTH_COMPONENT24, 24));
|
||||||
FBOExtensions* fboe = FBOExtensions::instance(contextID, true);
|
osg::GLExtensions* ext = gc->getState()->get<GLExtensions>();
|
||||||
if (!fboe->isSupported())
|
if (!ext->isRenderbufferMultisampleSupported())
|
||||||
return;
|
return;
|
||||||
if (fboe->isMultisampleSupported())
|
if (ext->isMultisampleSupported)
|
||||||
glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples);
|
glGetIntegerv(GL_MAX_SAMPLES_EXT, &maxSamples);
|
||||||
// isMultisampleCoverageSupported
|
// isMultisampleCoverageSupported
|
||||||
if (isGLExtensionSupported(contextID,
|
if (isGLExtensionSupported(contextID,
|
||||||
@@ -157,9 +156,8 @@ void getPossibleConfigs(GraphicsContext* gc, BufferConfigList& colorConfigs,
|
|||||||
bool checkFramebufferStatus(GraphicsContext* gc, bool silent = false)
|
bool checkFramebufferStatus(GraphicsContext* gc, bool silent = false)
|
||||||
{
|
{
|
||||||
State& state = *gc->getState();
|
State& state = *gc->getState();
|
||||||
unsigned contextID = state.getContextID();
|
osg::GLExtensions* ext = state.get<GLExtensions>();
|
||||||
FBOExtensions* fboe = FBOExtensions::instance(contextID, true);
|
switch(ext->glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT)) {
|
||||||
switch(fboe->glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT)) {
|
|
||||||
case GL_FRAMEBUFFER_COMPLETE_EXT:
|
case GL_FRAMEBUFFER_COMPLETE_EXT:
|
||||||
break;
|
break;
|
||||||
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
|
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
|
||||||
@@ -243,30 +241,30 @@ bool createFBO(GraphicsContext* gc, FboConfig &config, FboData &data)
|
|||||||
}
|
}
|
||||||
State& state = *gc->getState();
|
State& state = *gc->getState();
|
||||||
unsigned int contextID = state.getContextID();
|
unsigned int contextID = state.getContextID();
|
||||||
FBOExtensions* fboe = FBOExtensions::instance(contextID, true);
|
osg::GLExtensions* ext = gc->getState()->get<GLExtensions>();
|
||||||
|
|
||||||
data.fb->apply(state);
|
data.fb->apply(state);
|
||||||
result = checkFramebufferStatus(gc, true);
|
result = checkFramebufferStatus(gc, true);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
fboe->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
ext->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
int query;
|
int query;
|
||||||
if (multisample)
|
if (multisample)
|
||||||
{
|
{
|
||||||
GLuint colorRBID = colorRB->getObjectID(contextID, fboe);
|
GLuint colorRBID = colorRB->getObjectID(contextID, ext);
|
||||||
fboe->glBindRenderbuffer(GL_RENDERBUFFER_EXT, colorRBID);
|
ext->glBindRenderbuffer(GL_RENDERBUFFER_EXT, colorRBID);
|
||||||
if (csaa)
|
if (csaa)
|
||||||
{
|
{
|
||||||
fboe->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
ext->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
||||||
GL_RENDERBUFFER_COVERAGE_SAMPLES_NV,
|
GL_RENDERBUFFER_COVERAGE_SAMPLES_NV,
|
||||||
&query);
|
&query);
|
||||||
if (query < config.coverageSamples)
|
if (query < config.coverageSamples)
|
||||||
result = false;
|
result = false;
|
||||||
else
|
else
|
||||||
config.coverageSamples = query;
|
config.coverageSamples = query;
|
||||||
fboe->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
ext->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
||||||
GL_RENDERBUFFER_COLOR_SAMPLES_NV,
|
GL_RENDERBUFFER_COLOR_SAMPLES_NV,
|
||||||
&query);
|
&query);
|
||||||
|
|
||||||
@@ -278,7 +276,7 @@ bool createFBO(GraphicsContext* gc, FboConfig &config, FboData &data)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fboe->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
ext->glGetRenderbufferParameteriv(GL_RENDERBUFFER_EXT,
|
||||||
GL_RENDERBUFFER_SAMPLES_EXT,
|
GL_RENDERBUFFER_SAMPLES_EXT,
|
||||||
&query);
|
&query);
|
||||||
if (query < config.depthSamples)
|
if (query < config.depthSamples)
|
||||||
@@ -304,7 +302,7 @@ bool createFBO(GraphicsContext* gc, FboConfig &config, FboData &data)
|
|||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fboe->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
ext->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,15 +695,15 @@ GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments)
|
|||||||
DisplaySettings* ds = viewer.getDisplaySettings() ? viewer.getDisplaySettings() : DisplaySettings::instance().get();
|
DisplaySettings* ds = viewer.getDisplaySettings() ? viewer.getDisplaySettings() : DisplaySettings::instance().get();
|
||||||
GraphicsContext::ScreenIdentifier si;
|
GraphicsContext::ScreenIdentifier si;
|
||||||
si.readDISPLAY();
|
si.readDISPLAY();
|
||||||
|
si.setUndefinedScreenDetailsToDefaultScreen();
|
||||||
// displayNum has not been set so reset it to 0.
|
|
||||||
if (si.displayNum<0) si.displayNum = 0;
|
|
||||||
|
|
||||||
bool decoration = true;
|
bool decoration = true;
|
||||||
if (x < 0)
|
if (x < 0)
|
||||||
{
|
{
|
||||||
unsigned int w, h;
|
unsigned int w, h;
|
||||||
wsi->getScreenResolution(si, w, h);
|
wsi->getScreenResolution(si, w, h);
|
||||||
|
OSG_NOTICE<<"Screen resolution is "<<w<<", "<<h<<std::endl;
|
||||||
|
OSG_NOTICE<<"ScreenIdentifier "<<si.displayNum<<", "<<si.screenNum<<std::endl;
|
||||||
x = 0;
|
x = 0;
|
||||||
y = 0;
|
y = 0;
|
||||||
width = w;
|
width = w;
|
||||||
@@ -713,8 +711,9 @@ GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments)
|
|||||||
decoration = false;
|
decoration = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ref_ptr<GraphicsContext::Traits> traits
|
OSG_NOTICE<<"x = "<<x<<", y = "<<y<<", width = "<<width<<", height = "<<height<<std::endl;
|
||||||
= new GraphicsContext::Traits(ds);
|
|
||||||
|
ref_ptr<GraphicsContext::Traits> traits = new GraphicsContext::Traits(ds);
|
||||||
traits->hostName = si.hostName;
|
traits->hostName = si.hostName;
|
||||||
traits->displayNum = si.displayNum;
|
traits->displayNum = si.displayNum;
|
||||||
traits->screenNum = si.screenNum;
|
traits->screenNum = si.screenNum;
|
||||||
@@ -725,10 +724,9 @@ GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments)
|
|||||||
traits->windowDecoration = decoration;
|
traits->windowDecoration = decoration;
|
||||||
traits->doubleBuffer = true;
|
traits->doubleBuffer = true;
|
||||||
traits->sharedContext = 0;
|
traits->sharedContext = 0;
|
||||||
ref_ptr<GraphicsContext> gc
|
|
||||||
= GraphicsContext::createGraphicsContext(traits.get());
|
ref_ptr<GraphicsContext> gc = GraphicsContext::createGraphicsContext(traits.get());
|
||||||
osgViewer::GraphicsWindow* gw
|
osgViewer::GraphicsWindow* gw = dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
||||||
= dynamic_cast<osgViewer::GraphicsWindow*>(gc.get());
|
|
||||||
if (gw)
|
if (gw)
|
||||||
{
|
{
|
||||||
OSG_NOTIFY(INFO)<<"View::setUpViewOnSingleScreen - GraphicsWindow has been created successfully."<<std::endl;
|
OSG_NOTIFY(INFO)<<"View::setUpViewOnSingleScreen - GraphicsWindow has been created successfully."<<std::endl;
|
||||||
@@ -751,20 +749,29 @@ GraphicsContext* setupGC(osgViewer::Viewer& viewer, ArgumentParser& arguments)
|
|||||||
}
|
}
|
||||||
// Context has to be current to test for extensions
|
// Context has to be current to test for extensions
|
||||||
gc->realize();
|
gc->realize();
|
||||||
gc->makeCurrent();
|
if (!gc->makeCurrent())
|
||||||
|
{
|
||||||
|
OSG_NOTIFY(NOTICE) << "Unable to create GraphicsWindow"<<std::endl;
|
||||||
|
gc->releaseContext();
|
||||||
|
gc->close(true);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int contextID = gc->getState()->getContextID();
|
unsigned int contextID = gc->getState()->getContextID();
|
||||||
FBOExtensions* fboe = FBOExtensions::instance(contextID, true);
|
osg::GLExtensions* ext = gc->getState()->get<GLExtensions>();
|
||||||
if (!fboe->isSupported())
|
if (!ext->isFrameBufferObjectSupported)
|
||||||
{
|
{
|
||||||
OSG_NOTIFY(NOTICE) << "Frame buffer objects are not supported\n";
|
OSG_NOTIFY(NOTICE) << "Frame buffer objects are not supported\n";
|
||||||
gc->releaseContext();
|
gc->releaseContext();
|
||||||
gc->close(true);
|
gc->close(true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isGLExtensionSupported(contextID, "GL_ARB_depth_buffer_float"))
|
if (isGLExtensionSupported(contextID, "GL_ARB_depth_buffer_float"))
|
||||||
depthTextureEnum = GL_DEPTH_COMPONENT32F;
|
depthTextureEnum = GL_DEPTH_COMPONENT32F;
|
||||||
else if (isGLExtensionSupported(contextID, "GL_NV_depth_buffer_float"))
|
else if (isGLExtensionSupported(contextID, "GL_NV_depth_buffer_float"))
|
||||||
depthTextureEnum = GL_DEPTH_COMPONENT32F_NV;
|
depthTextureEnum = GL_DEPTH_COMPONENT32F_NV;
|
||||||
|
|
||||||
BufferConfigList colorConfigs;
|
BufferConfigList colorConfigs;
|
||||||
BufferConfigList depthConfigs;
|
BufferConfigList depthConfigs;
|
||||||
vector<int> coverageConfigs;
|
vector<int> coverageConfigs;
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
// wraps OpenGL very thinly and therefore uses all the same enum and naming conventions. The coordinate data is also
|
// wraps OpenGL very thinly and therefore uses all the same enum and naming conventions. The coordinate data is also
|
||||||
// wrapped around OpenGL's vertex arrays and draw arrays/elements calls. Familiarity with
|
// wrapped around OpenGL's vertex arrays and draw arrays/elements calls. Familiarity with
|
||||||
// OpenGL will help you understand the osg::Geometry class which encapsulate all this, or if you
|
// OpenGL will help you understand the osg::Geometry class which encapsulate all this, or if you
|
||||||
// havn't learned OpenGL yet, learning osg::Geometry will help you understand how OpenGL
|
// haven't learned OpenGL yet, learning osg::Geometry will help you understand how OpenGL
|
||||||
// works!
|
// works!
|
||||||
|
|
||||||
// The osg::Geometry class "is a" subclass of osg::Drawable base class, so is an object that provides
|
// The osg::Geometry class "is a" subclass of osg::Drawable base class, so is an object that provides
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
#ifdef ENABLE_GLSL
|
#ifdef ENABLE_GLSL
|
||||||
|
|
||||||
class SineAnimation: public osg::Uniform::Callback
|
class SineAnimation: public osg::UniformCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SineAnimation( float rate = 1.0f, float scale = 1.0f, float offset = 0.0f ) :
|
SineAnimation( float rate = 1.0f, float scale = 1.0f, float offset = 0.0f ) :
|
||||||
|
|||||||
84
examples/osggpucull/AggregateGeometryVisitor.cpp
Normal file
84
examples/osggpucull/AggregateGeometryVisitor.cpp
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "AggregateGeometryVisitor.h"
|
||||||
|
|
||||||
|
AggregateGeometryVisitor::AggregateGeometryVisitor( ConvertTrianglesOperator* ctOperator )
|
||||||
|
: osg::NodeVisitor( osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
||||||
|
{
|
||||||
|
_ctOperator.setConverter(ctOperator);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AggregateGeometryVisitor::init()
|
||||||
|
{
|
||||||
|
_aggregatedGeometry = new osg::Geometry;
|
||||||
|
_ctOperator.initGeometry( _aggregatedGeometry.get() );
|
||||||
|
_matrixStack.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
AggregateGeometryVisitor::AddObjectResult AggregateGeometryVisitor::addObject( osg::Node* object, unsigned int typeID, unsigned int lodNumber )
|
||||||
|
{
|
||||||
|
unsigned int currentVertexFirst = _aggregatedGeometry->getVertexArray()->getNumElements();
|
||||||
|
_currentTypeID = typeID;
|
||||||
|
_currentLodNumber = lodNumber;
|
||||||
|
object->accept(*this);
|
||||||
|
unsigned int currentVertexCount = _aggregatedGeometry->getVertexArray()->getNumElements() - currentVertexFirst;
|
||||||
|
_aggregatedGeometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::TRIANGLES, currentVertexFirst, currentVertexCount ) );
|
||||||
|
_matrixStack.clear();
|
||||||
|
return AddObjectResult( currentVertexFirst, currentVertexCount, _aggregatedGeometry->getNumPrimitiveSets()-1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void AggregateGeometryVisitor::apply( osg::Node& node )
|
||||||
|
{
|
||||||
|
bool pushed = _ctOperator.pushNode(&node);
|
||||||
|
traverse(node);
|
||||||
|
if( pushed ) _ctOperator.popNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AggregateGeometryVisitor::apply( osg::Transform& transform )
|
||||||
|
{
|
||||||
|
bool pushed = _ctOperator.pushNode(&transform);
|
||||||
|
osg::Matrix matrix;
|
||||||
|
if( !_matrixStack.empty() )
|
||||||
|
matrix = _matrixStack.back();
|
||||||
|
transform.computeLocalToWorldMatrix( matrix, this );
|
||||||
|
_matrixStack.push_back( matrix );
|
||||||
|
|
||||||
|
traverse(transform);
|
||||||
|
|
||||||
|
_matrixStack.pop_back();
|
||||||
|
if( pushed ) _ctOperator.popNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AggregateGeometryVisitor::apply( osg::Geode& geode )
|
||||||
|
{
|
||||||
|
bool pushed = _ctOperator.pushNode(&geode);
|
||||||
|
|
||||||
|
osg::Matrix matrix;
|
||||||
|
if(! _matrixStack.empty() )
|
||||||
|
matrix = _matrixStack.back();
|
||||||
|
for( unsigned int i=0; i<geode.getNumDrawables(); ++i)
|
||||||
|
{
|
||||||
|
osg::Geometry* geom = geode.getDrawable(i)->asGeometry();
|
||||||
|
if ( geom != NULL )
|
||||||
|
{
|
||||||
|
_ctOperator.setGeometryData( matrix, geom, _aggregatedGeometry.get(), (float) _currentTypeID, (float) _currentLodNumber );
|
||||||
|
geom->accept( _ctOperator );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(geode);
|
||||||
|
if( pushed ) _ctOperator.popNode();
|
||||||
|
}
|
||||||
290
examples/osggpucull/AggregateGeometryVisitor.h
Normal file
290
examples/osggpucull/AggregateGeometryVisitor.h
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AGREGATE_GEOMETRY_VISITOR_H
|
||||||
|
#define AGREGATE_GEOMETRY_VISITOR_H 1
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Transform>
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
#include <osg/TriangleIndexFunctor>
|
||||||
|
|
||||||
|
// AggregateGeometryVisitor uses ConvertTrianglesOperator to create and fill osg::Geometry
|
||||||
|
// with data matching users needs
|
||||||
|
struct ConvertTrianglesOperator : public osg::Referenced
|
||||||
|
{
|
||||||
|
ConvertTrianglesOperator()
|
||||||
|
: osg::Referenced()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual void initGeometry( osg::Geometry* outputGeometry ) = 0;
|
||||||
|
virtual bool pushNode( osg::Node* node )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
virtual void popNode() = 0;
|
||||||
|
virtual void setGeometryData( const osg::Matrix &matrix, osg::Geometry *inputGeometry, osg::Geometry* outputGeometry, float typeID, float lodNumber ) = 0;
|
||||||
|
virtual void operator() ( unsigned int i1, unsigned int i2, unsigned int i3 ) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GetVec2FromArrayVisitor : public osg::ValueVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GetVec2FromArrayVisitor()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void apply( GLfloat& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value, 0.0 );
|
||||||
|
}
|
||||||
|
void apply( osg::Vec2& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
virtual void apply( osg::Vec2d& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
void apply( osg::Vec3& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
void apply( osg::Vec4& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
void apply( osg::Vec3d& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
void apply( osg::Vec4d& value )
|
||||||
|
{
|
||||||
|
out = osg::Vec2( value.x(), value.y() );
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec2 out;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ConvertTrianglesOperatorClassic is a ConvertTrianglesOperator that creates
|
||||||
|
// aggregated geometry with standard set of vertex attributes : vertices, normals, color and texCoord0.
|
||||||
|
// texCoord1 holds additional information about vertex ( typeID, lodNumber, boneIndex )
|
||||||
|
struct ConvertTrianglesOperatorClassic : public ConvertTrianglesOperator
|
||||||
|
{
|
||||||
|
ConvertTrianglesOperatorClassic()
|
||||||
|
: ConvertTrianglesOperator(), _typeID(0.0f), _lodNumber(0.0f)
|
||||||
|
|
||||||
|
{
|
||||||
|
_boneIndices.push_back(0.0);
|
||||||
|
}
|
||||||
|
virtual void initGeometry( osg::Geometry* outputGeometry )
|
||||||
|
{
|
||||||
|
osg::Vec3Array* vertices = new osg::Vec3Array; outputGeometry->setVertexArray( vertices );
|
||||||
|
osg::Vec4Array* colors = new osg::Vec4Array; outputGeometry->setColorArray( colors, osg::Array::BIND_PER_VERTEX );
|
||||||
|
osg::Vec3Array* normals = new osg::Vec3Array; outputGeometry->setNormalArray( normals, osg::Array::BIND_PER_VERTEX );
|
||||||
|
osg::Vec2Array* texCoords0 = new osg::Vec2Array; outputGeometry->setTexCoordArray( 0, texCoords0 );
|
||||||
|
osg::Vec3Array* texCoords1 = new osg::Vec3Array; outputGeometry->setTexCoordArray( 1, texCoords1 );
|
||||||
|
outputGeometry->setStateSet(NULL);
|
||||||
|
}
|
||||||
|
virtual bool pushNode( osg::Node* node )
|
||||||
|
{
|
||||||
|
std::map<std::string,float>::iterator it = _boneNames.find( node->getName() );
|
||||||
|
if(it==_boneNames.end())
|
||||||
|
return false;
|
||||||
|
_boneIndices.push_back( it->second );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
virtual void popNode()
|
||||||
|
{
|
||||||
|
_boneIndices.pop_back();
|
||||||
|
}
|
||||||
|
virtual void setGeometryData( const osg::Matrix &matrix, osg::Geometry *inputGeometry, osg::Geometry* outputGeometry, float typeID, float lodNumber )
|
||||||
|
{
|
||||||
|
_matrix = matrix;
|
||||||
|
|
||||||
|
_inputVertices = dynamic_cast<osg::Vec3Array *>( inputGeometry->getVertexArray() );
|
||||||
|
_inputColors = dynamic_cast<osg::Vec4Array *>( inputGeometry->getColorArray() );
|
||||||
|
_inputNormals = dynamic_cast<osg::Vec3Array *>( inputGeometry->getNormalArray() );
|
||||||
|
_inputTexCoord0 = inputGeometry->getTexCoordArray(0);
|
||||||
|
|
||||||
|
_outputVertices = dynamic_cast<osg::Vec3Array *>( outputGeometry->getVertexArray() );
|
||||||
|
_outputColors = dynamic_cast<osg::Vec4Array *>( outputGeometry->getColorArray() );
|
||||||
|
_outputNormals = dynamic_cast<osg::Vec3Array *>( outputGeometry->getNormalArray() );
|
||||||
|
_outputTexCoord0 = dynamic_cast<osg::Vec2Array *>( outputGeometry->getTexCoordArray(0) );
|
||||||
|
_outputTexCoord1 = dynamic_cast<osg::Vec3Array *>( outputGeometry->getTexCoordArray(1) );
|
||||||
|
|
||||||
|
_typeID = typeID;
|
||||||
|
_lodNumber = lodNumber;
|
||||||
|
}
|
||||||
|
virtual void operator() ( unsigned int i1, unsigned int i2, unsigned int i3 )
|
||||||
|
{
|
||||||
|
unsigned int ic1=i1, ic2=i2, ic3=i3, in1=i1, in2=i2, in3=i3, it01=i1, it02=i2, it03=i3;
|
||||||
|
if ( _inputColors!=NULL && _inputColors->size() == 1 )
|
||||||
|
{
|
||||||
|
ic1=0; ic2=0; ic3=0;
|
||||||
|
}
|
||||||
|
if ( _inputNormals!=NULL && _inputNormals->size() == 1 )
|
||||||
|
{
|
||||||
|
in1=0; in2=0; in3=0;
|
||||||
|
}
|
||||||
|
if ( _inputTexCoord0!=NULL && _inputTexCoord0->getNumElements()==1 )
|
||||||
|
{
|
||||||
|
it01=0; it02=0; it03=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_outputVertices->push_back( _inputVertices->at( i1 ) * _matrix );
|
||||||
|
_outputVertices->push_back( _inputVertices->at( i2 ) * _matrix );
|
||||||
|
_outputVertices->push_back( _inputVertices->at( i3 ) * _matrix );
|
||||||
|
|
||||||
|
if( _inputColors != NULL )
|
||||||
|
{
|
||||||
|
_outputColors->push_back( _inputColors->at( ic1 ) );
|
||||||
|
_outputColors->push_back( _inputColors->at( ic2 ) );
|
||||||
|
_outputColors->push_back( _inputColors->at( ic3 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<3; ++i)
|
||||||
|
_outputColors->push_back( osg::Vec4(1.0,1.0,1.0,1.0) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( _inputNormals != NULL )
|
||||||
|
{
|
||||||
|
_outputNormals->push_back( osg::Matrix::transform3x3( _inputNormals->at( in1 ), _matrix ) );
|
||||||
|
_outputNormals->push_back( osg::Matrix::transform3x3( _inputNormals->at( in2 ), _matrix ) );
|
||||||
|
_outputNormals->push_back( osg::Matrix::transform3x3( _inputNormals->at( in3 ), _matrix ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<3; ++i)
|
||||||
|
_outputNormals->push_back( osg::Vec3( 0.0,0.0,1.0 ) );
|
||||||
|
}
|
||||||
|
if( _inputTexCoord0 != NULL )
|
||||||
|
{
|
||||||
|
_inputTexCoord0->accept( it01, _inputTexCoord0Visitor );
|
||||||
|
_outputTexCoord0->push_back( _inputTexCoord0Visitor.out );
|
||||||
|
_inputTexCoord0->accept( it02, _inputTexCoord0Visitor );
|
||||||
|
_outputTexCoord0->push_back( _inputTexCoord0Visitor.out );
|
||||||
|
_inputTexCoord0->accept( it03, _inputTexCoord0Visitor );
|
||||||
|
_outputTexCoord0->push_back( _inputTexCoord0Visitor.out );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(unsigned int i=0; i<3; ++i)
|
||||||
|
_outputTexCoord0->push_back( osg::Vec2(0.0,0.0) );
|
||||||
|
}
|
||||||
|
|
||||||
|
for(unsigned int i=0; i<3; ++i)
|
||||||
|
_outputTexCoord1->push_back( osg::Vec3( _typeID, _lodNumber, _boneIndices.back() ) );
|
||||||
|
}
|
||||||
|
void registerBoneByName( const std::string& boneName, int boneIndex )
|
||||||
|
{
|
||||||
|
_boneNames[boneName] = float(boneIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix _matrix;
|
||||||
|
|
||||||
|
osg::Vec3Array* _inputVertices;
|
||||||
|
osg::Vec4Array* _inputColors;
|
||||||
|
osg::Vec3Array* _inputNormals;
|
||||||
|
osg::Array* _inputTexCoord0;
|
||||||
|
|
||||||
|
osg::Vec3Array* _outputVertices;
|
||||||
|
osg::Vec4Array* _outputColors;
|
||||||
|
osg::Vec3Array* _outputNormals;
|
||||||
|
osg::Vec2Array* _outputTexCoord0;
|
||||||
|
osg::Vec3Array* _outputTexCoord1;
|
||||||
|
|
||||||
|
float _typeID;
|
||||||
|
float _lodNumber;
|
||||||
|
std::vector<float> _boneIndices;
|
||||||
|
|
||||||
|
std::map<std::string,float> _boneNames;
|
||||||
|
|
||||||
|
GetVec2FromArrayVisitor _inputTexCoord0Visitor;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class AggregateGeometryVisitor : public osg::NodeVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AggregateGeometryVisitor( ConvertTrianglesOperator* ctOperator );
|
||||||
|
void init();
|
||||||
|
|
||||||
|
// osg::TriangleIndexFunctor uses its template parameter as a base class, so we must use an adapter pattern to hack it
|
||||||
|
struct ConvertTrianglesBridge
|
||||||
|
{
|
||||||
|
inline void setConverter( ConvertTrianglesOperator* cto )
|
||||||
|
{
|
||||||
|
_converter = cto;
|
||||||
|
}
|
||||||
|
inline void initGeometry( osg::Geometry* outputGeometry )
|
||||||
|
{
|
||||||
|
_converter->initGeometry(outputGeometry);
|
||||||
|
}
|
||||||
|
inline bool pushNode( osg::Node* node )
|
||||||
|
{
|
||||||
|
return _converter->pushNode( node );
|
||||||
|
}
|
||||||
|
inline void popNode()
|
||||||
|
{
|
||||||
|
_converter->popNode();
|
||||||
|
}
|
||||||
|
inline void setGeometryData( const osg::Matrix &matrix, osg::Geometry *inputGeometry, osg::Geometry* outputGeometry, float typeID, float lodNumber )
|
||||||
|
{
|
||||||
|
_converter->setGeometryData(matrix,inputGeometry,outputGeometry,typeID, lodNumber);
|
||||||
|
}
|
||||||
|
inline void operator() ( unsigned int i1, unsigned int i2, unsigned int i3 )
|
||||||
|
{
|
||||||
|
_converter->operator()(i1,i2,i3);
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::ref_ptr<ConvertTrianglesOperator> _converter;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// struct returning information about added object ( first vertex, vertex count, primitiveset index )
|
||||||
|
// used later to create indirect command texture buffers
|
||||||
|
struct AddObjectResult
|
||||||
|
{
|
||||||
|
AddObjectResult( unsigned int f, unsigned int c, unsigned int i )
|
||||||
|
: first(f), count(c), index(i)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
unsigned int first;
|
||||||
|
unsigned int count;
|
||||||
|
unsigned int index;
|
||||||
|
};
|
||||||
|
AddObjectResult addObject( osg::Node* object, unsigned int typeID, unsigned int lodNumber );
|
||||||
|
|
||||||
|
void apply( osg::Node& node );
|
||||||
|
void apply( osg::Transform& transform );
|
||||||
|
void apply( osg::Geode& geode );
|
||||||
|
|
||||||
|
inline osg::Geometry* getAggregatedGeometry()
|
||||||
|
{
|
||||||
|
return _aggregatedGeometry.get();
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
osg::ref_ptr<osg::Geometry> _aggregatedGeometry;
|
||||||
|
osg::TriangleIndexFunctor<ConvertTrianglesBridge> _ctOperator;
|
||||||
|
std::vector<osg::Matrix> _matrixStack;
|
||||||
|
|
||||||
|
unsigned int _currentTypeID;
|
||||||
|
unsigned int _currentLodNumber;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
16
examples/osggpucull/CMakeLists.txt
Normal file
16
examples/osggpucull/CMakeLists.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
SET(TARGET_SRC
|
||||||
|
ShapeToGeometry.cpp
|
||||||
|
DrawIndirectPrimitiveSet.cpp
|
||||||
|
AggregateGeometryVisitor.cpp
|
||||||
|
osggpucull.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(TARGET_H
|
||||||
|
ShapeToGeometry.h
|
||||||
|
DrawIndirectPrimitiveSet.h
|
||||||
|
AggregateGeometryVisitor.h
|
||||||
|
GpuCullShaders.h
|
||||||
|
)
|
||||||
|
|
||||||
|
#### end var setup ###
|
||||||
|
SETUP_EXAMPLE(osggpucull)
|
||||||
139
examples/osggpucull/DrawIndirectPrimitiveSet.cpp
Normal file
139
examples/osggpucull/DrawIndirectPrimitiveSet.cpp
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "DrawIndirectPrimitiveSet.h"
|
||||||
|
#include <osg/State>
|
||||||
|
#include <osg/buffered_value>
|
||||||
|
#include <osg/ref_ptr>
|
||||||
|
#include <osg/GLExtensions>
|
||||||
|
#include <osg/Drawable>
|
||||||
|
|
||||||
|
void DrawArraysIndirect::draw(osg::State& state, bool useVertexBufferObjects) const
|
||||||
|
{
|
||||||
|
if( !_buffer.valid() )
|
||||||
|
return;
|
||||||
|
_buffer->bindBufferAs( state.getContextID(), GL_DRAW_INDIRECT_BUFFER );
|
||||||
|
|
||||||
|
// if you want to see how many primitives were rendered - uncomment code below, but
|
||||||
|
// be warned : it is a serious performance killer ( because of GPU->CPU roundtrip )
|
||||||
|
|
||||||
|
// osg::Drawable::Extensions *dext = osg::Drawable::getExtensions( state.getContextID(),true );
|
||||||
|
// int* tab = (int*)dext->glMapBuffer(GL_DRAW_INDIRECT_BUFFER,GL_READ_ONLY);
|
||||||
|
// int val = _indirect/sizeof(int);
|
||||||
|
// OSG_WARN<<"DrawArraysIndirect ("<<val<<"): "<< tab[val] << " " << tab[val+1] << " " << tab[val+2] << " " << tab[val+3] << std::endl;
|
||||||
|
// dext->glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER);
|
||||||
|
|
||||||
|
DrawIndirectGLExtensions *ext = DrawIndirectGLExtensions::getExtensions( state.getContextID(),true );
|
||||||
|
ext->glDrawArraysIndirect( _mode, reinterpret_cast<const void*>(_indirect) );
|
||||||
|
_buffer->unbindBufferAs( state.getContextID(), GL_DRAW_INDIRECT_BUFFER );
|
||||||
|
}
|
||||||
|
|
||||||
|
void MultiDrawArraysIndirect::draw(osg::State& state, bool useVertexBufferObjects) const
|
||||||
|
{
|
||||||
|
if( !_buffer.valid() )
|
||||||
|
return;
|
||||||
|
_buffer->bindBufferAs( state.getContextID(), GL_DRAW_INDIRECT_BUFFER );
|
||||||
|
|
||||||
|
DrawIndirectGLExtensions *ext = DrawIndirectGLExtensions::getExtensions( state.getContextID(),true );
|
||||||
|
ext->glMultiDrawArraysIndirect( _mode, reinterpret_cast<const void*>(_indirect), _drawcount, _stride );
|
||||||
|
_buffer->unbindBufferAs( state.getContextID(), GL_DRAW_INDIRECT_BUFFER );
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawIndirectGLExtensions::DrawIndirectGLExtensions( unsigned int contextID )
|
||||||
|
{
|
||||||
|
setupGLExtensions( contextID );
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawIndirectGLExtensions::DrawIndirectGLExtensions( const DrawIndirectGLExtensions &rhs )
|
||||||
|
: Referenced()
|
||||||
|
{
|
||||||
|
_glDrawArraysIndirect = rhs._glDrawArraysIndirect;
|
||||||
|
_glMultiDrawArraysIndirect = rhs._glMultiDrawArraysIndirect;
|
||||||
|
_glMemoryBarrier = rhs._glMemoryBarrier;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DrawIndirectGLExtensions::lowestCommonDenominator( const DrawIndirectGLExtensions &rhs )
|
||||||
|
{
|
||||||
|
if ( !rhs._glDrawArraysIndirect )
|
||||||
|
{
|
||||||
|
_glDrawArraysIndirect = rhs._glDrawArraysIndirect;
|
||||||
|
}
|
||||||
|
if ( !rhs._glMultiDrawArraysIndirect )
|
||||||
|
{
|
||||||
|
_glMultiDrawArraysIndirect = rhs._glMultiDrawArraysIndirect;
|
||||||
|
}
|
||||||
|
if ( !rhs._glMemoryBarrier )
|
||||||
|
{
|
||||||
|
_glMemoryBarrier = rhs._glMemoryBarrier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawIndirectGLExtensions::setupGLExtensions( unsigned int contextID )
|
||||||
|
{
|
||||||
|
_glDrawArraysIndirect = 0;
|
||||||
|
_glMultiDrawArraysIndirect = 0;
|
||||||
|
osg::setGLExtensionFuncPtr( _glDrawArraysIndirect, "glDrawArraysIndirect" );
|
||||||
|
osg::setGLExtensionFuncPtr( _glMultiDrawArraysIndirect, "glMultiDrawArraysIndirect" );
|
||||||
|
osg::setGLExtensionFuncPtr( _glMemoryBarrier, "glMemoryBarrier" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawIndirectGLExtensions::glDrawArraysIndirect(GLenum mode, const void * indirect) const
|
||||||
|
{
|
||||||
|
if ( _glDrawArraysIndirect )
|
||||||
|
{
|
||||||
|
_glDrawArraysIndirect( mode, indirect );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_WARN<<"Error: glDrawArraysIndirect not supported by OpenGL driver"<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawIndirectGLExtensions::glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride)
|
||||||
|
{
|
||||||
|
if ( _glMultiDrawArraysIndirect )
|
||||||
|
{
|
||||||
|
_glMultiDrawArraysIndirect( mode, indirect, drawcount, stride );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_WARN<<"Error: glMultiDrawArraysIndirect not supported by OpenGL driver"<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawIndirectGLExtensions::glMemoryBarrier(GLbitfield barriers)
|
||||||
|
{
|
||||||
|
if ( _glMemoryBarrier )
|
||||||
|
{
|
||||||
|
_glMemoryBarrier( barriers );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_WARN<<"Error: glMemoryBarrier not supported by OpenGL driver"<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef osg::buffered_value< osg::ref_ptr<DrawIndirectGLExtensions> > BufferedDrawIndirectGLExtensions;
|
||||||
|
static BufferedDrawIndirectGLExtensions bdiExtensions;
|
||||||
|
|
||||||
|
DrawIndirectGLExtensions* DrawIndirectGLExtensions::getExtensions( unsigned int contextID,bool createIfNotInitalized )
|
||||||
|
{
|
||||||
|
if ( !bdiExtensions[contextID] && createIfNotInitalized )
|
||||||
|
{
|
||||||
|
bdiExtensions[contextID] = new DrawIndirectGLExtensions( contextID );
|
||||||
|
}
|
||||||
|
return bdiExtensions[contextID].get();
|
||||||
|
}
|
||||||
100
examples/osggpucull/DrawIndirectPrimitiveSet.h
Normal file
100
examples/osggpucull/DrawIndirectPrimitiveSet.h
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSG_DRAWINDIRECTPRIMITIVESET
|
||||||
|
#define OSG_DRAWINDIRECTPRIMITIVESET 1
|
||||||
|
|
||||||
|
#include <osg/PrimitiveSet>
|
||||||
|
#include <osg/BufferObject>
|
||||||
|
#include <osg/TextureBuffer>
|
||||||
|
|
||||||
|
#ifndef GL_ARB_draw_indirect
|
||||||
|
#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
|
||||||
|
#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
|
||||||
|
#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
class DrawArraysIndirect : public osg::DrawArrays
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawArraysIndirect(GLenum mode=0, osg::TextureBuffer* buffer=NULL, unsigned int indirect=0)
|
||||||
|
: osg::DrawArrays(mode), _buffer(buffer), _indirect(indirect)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual osg::Object* cloneType() const { return new DrawArraysIndirect(); }
|
||||||
|
virtual osg::Object* clone(const osg::CopyOp& copyop) const { return NULL; }
|
||||||
|
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const DrawArraysIndirect*>(obj)!=NULL; }
|
||||||
|
virtual const char* libraryName() const { return "osg"; }
|
||||||
|
virtual const char* className() const { return "DrawArraysIndirect"; }
|
||||||
|
|
||||||
|
virtual void draw(osg::State& state, bool useVertexBufferObjects) const;
|
||||||
|
protected:
|
||||||
|
osg::ref_ptr<osg::TextureBuffer> _buffer;
|
||||||
|
unsigned int _indirect;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MultiDrawArraysIndirect : public osg::DrawArrays
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MultiDrawArraysIndirect(GLenum mode=0, osg::TextureBuffer* buffer=NULL, unsigned int indirect=0, GLsizei drawcount=0, GLsizei stride=0)
|
||||||
|
: osg::DrawArrays(mode), _buffer(buffer), _indirect(indirect), _drawcount(drawcount), _stride(stride)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
virtual osg::Object* cloneType() const { return new MultiDrawArraysIndirect(); }
|
||||||
|
virtual osg::Object* clone(const osg::CopyOp& copyop) const { return NULL; }
|
||||||
|
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MultiDrawArraysIndirect*>(obj)!=NULL; }
|
||||||
|
virtual const char* libraryName() const { return "osg"; }
|
||||||
|
virtual const char* className() const { return "MultiDrawArraysIndirect"; }
|
||||||
|
|
||||||
|
virtual void draw(osg::State& state, bool useVertexBufferObjects) const;
|
||||||
|
protected:
|
||||||
|
osg::ref_ptr<osg::TextureBuffer> _buffer;
|
||||||
|
unsigned int _indirect;
|
||||||
|
GLsizei _drawcount;
|
||||||
|
GLsizei _stride;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DrawIndirectGLExtensions : public osg::Referenced
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawIndirectGLExtensions( unsigned int contextID );
|
||||||
|
DrawIndirectGLExtensions( const DrawIndirectGLExtensions &rhs );
|
||||||
|
void lowestCommonDenominator( const DrawIndirectGLExtensions &rhs );
|
||||||
|
void setupGLExtensions( unsigned int contextID );
|
||||||
|
|
||||||
|
void glDrawArraysIndirect(GLenum mode, const void * indirect) const;
|
||||||
|
void glMultiDrawArraysIndirect(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
|
||||||
|
void glMemoryBarrier(GLbitfield barriers);
|
||||||
|
|
||||||
|
static DrawIndirectGLExtensions* getExtensions( unsigned int contextID,bool createIfNotInitalized );
|
||||||
|
protected:
|
||||||
|
|
||||||
|
typedef void ( GL_APIENTRY *DrawArraysIndirectProc ) (GLenum mode, const void * indirect);
|
||||||
|
typedef void ( GL_APIENTRY *MultiDrawArraysIndirectProc ) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride);
|
||||||
|
typedef void ( GL_APIENTRY *MemoryBarrierProc ) (GLbitfield barriers);
|
||||||
|
|
||||||
|
DrawArraysIndirectProc _glDrawArraysIndirect;
|
||||||
|
MultiDrawArraysIndirectProc _glMultiDrawArraysIndirect;
|
||||||
|
MemoryBarrierProc _glMemoryBarrier;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
592
examples/osggpucull/GpuCullShaders.h
Normal file
592
examples/osggpucull/GpuCullShaders.h
Normal file
@@ -0,0 +1,592 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef GPU_CULL_SHADERS
|
||||||
|
#define GPU_CULL_SHADERS 1
|
||||||
|
|
||||||
|
char SHADER_STATIC_CULL_VERTEX[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"uniform mat4 osg_ViewMatrixInverse;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(R32I) coherent uniform iimageBuffer indirectCommand0;\n"
|
||||||
|
"layout(R32I) coherent uniform iimageBuffer indirectCommand1;\n"
|
||||||
|
"uniform int indirectCommandSize; // = sizeof(DrawArraysIndirectCommand) / sizeof(unsigned int) = 4\n"
|
||||||
|
"\n"
|
||||||
|
"layout(R32I) coherent uniform iimageBuffer getIndirectCommand( int index )\n"
|
||||||
|
"{\n"
|
||||||
|
" if(index==0) return indirectCommand0;\n"
|
||||||
|
" if(index==1) return indirectCommand1;\n"
|
||||||
|
" return indirectCommand0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32F) coherent uniform imageBuffer indirectTarget0;\n"
|
||||||
|
"layout(RGBA32F) coherent uniform imageBuffer indirectTarget1;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32F) coherent uniform imageBuffer getIndirectTarget( int index )\n"
|
||||||
|
"{\n"
|
||||||
|
" if(index==0) return indirectTarget0;\n"
|
||||||
|
" if(index==1) return indirectTarget1;\n"
|
||||||
|
" return indirectTarget0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceLOD\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 indirectTargetParams; // x=targetID, y=indexInTarget, z=offsetInTarget, w=lodMaxQuantity\n"
|
||||||
|
" vec4 distances; // x=minDistance, y=minFadeDistance, z=maxFadeDistance, w=maxDistance\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"const int OSGGPUCULL_MAXIMUM_LOD_NUMBER = 8;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceType\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 params;\n"
|
||||||
|
" InstanceLOD lods[OSGGPUCULL_MAXIMUM_LOD_NUMBER];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(std140) uniform instanceTypesData\n"
|
||||||
|
"{\n"
|
||||||
|
" InstanceType instanceTypes[32];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"// StaticInstance params are stored in vertex attributes\n"
|
||||||
|
"layout(location = 0) in vec3 VertexPosition;\n"
|
||||||
|
"layout(location = 10) in vec4 M0;\n"
|
||||||
|
"layout(location = 11) in vec4 M1;\n"
|
||||||
|
"layout(location = 12) in vec4 M2;\n"
|
||||||
|
"layout(location = 13) in vec4 M3;\n"
|
||||||
|
"layout(location = 14) in vec4 ExtraParams;\n"
|
||||||
|
"layout(location = 15) in vec4 IdParams;\n"
|
||||||
|
"\n"
|
||||||
|
"out vec4 fColor;\n"
|
||||||
|
"\n"
|
||||||
|
"bool boundingBoxInViewFrustum( in mat4 matrix, in vec3 bbMin, in vec3 bbMax )\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 BoundingBox[8];\n"
|
||||||
|
" BoundingBox[0] = matrix * vec4( bbMax.x, bbMax.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[1] = matrix * vec4( bbMin.x, bbMax.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[2] = matrix * vec4( bbMax.x, bbMin.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[3] = matrix * vec4( bbMin.x, bbMin.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[4] = matrix * vec4( bbMax.x, bbMax.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[5] = matrix * vec4( bbMin.x, bbMax.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[6] = matrix * vec4( bbMax.x, bbMin.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[7] = matrix * vec4( bbMin.x, bbMin.y, bbMin.z, 1.0);\n"
|
||||||
|
"\n"
|
||||||
|
" int outOfBound[6] = int[6]( 0, 0, 0, 0, 0, 0 );\n"
|
||||||
|
" for (int i=0; i<8; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" outOfBound[0] += int( BoundingBox[i].x > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[1] += int( BoundingBox[i].x < -BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[2] += int( BoundingBox[i].y > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[3] += int( BoundingBox[i].y < -BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[4] += int( BoundingBox[i].z > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[5] += int( BoundingBox[i].z < -BoundingBox[i].w );\n"
|
||||||
|
" }\n"
|
||||||
|
" return (outOfBound[0] < 8 ) && ( outOfBound[1] < 8 ) && ( outOfBound[2] < 8 ) && ( outOfBound[3] < 8 ) && ( outOfBound[4] < 8 ) && ( outOfBound[5] < 8 );\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"void main(void) \n"
|
||||||
|
"{\n"
|
||||||
|
" mat4 instanceMatrix = mat4(M0,M1,M2,M3);\n"
|
||||||
|
" mat4 mvpoMatrix = gl_ModelViewProjectionMatrix * instanceMatrix;\n"
|
||||||
|
"\n"
|
||||||
|
" // gl_Position is created only for debugging purposes\n"
|
||||||
|
" gl_Position = mvpoMatrix * vec4(0.0,0.0,0.0,1.0);\n"
|
||||||
|
"\n"
|
||||||
|
" int instanceTypeIndex = int(IdParams.x);\n"
|
||||||
|
"\n"
|
||||||
|
" fColor = vec4(0.0,0.0,0.0,1.0);\n"
|
||||||
|
" if( boundingBoxInViewFrustum( mvpoMatrix, instanceTypes[instanceTypeIndex].bbMin.xyz, instanceTypes[instanceTypeIndex].bbMax.xyz ) )\n"
|
||||||
|
" {\n"
|
||||||
|
" fColor = vec4(1.0,0.0,0.0,1.0);\n"
|
||||||
|
" float distanceToObject = distance(osg_ViewMatrixInverse[3].xyz / osg_ViewMatrixInverse[3].w, instanceMatrix[3].xyz / instanceMatrix[3].w );\n"
|
||||||
|
" for(int i=0;i<instanceTypes[instanceTypeIndex].params.x;++i)\n"
|
||||||
|
" {\n"
|
||||||
|
" if( boundingBoxInViewFrustum( mvpoMatrix, instanceTypes[instanceTypeIndex].lods[i].bbMin.xyz, instanceTypes[instanceTypeIndex].lods[i].bbMax.xyz ) &&\n"
|
||||||
|
" ( distanceToObject >= instanceTypes[instanceTypeIndex].lods[i].distances.x ) && ( distanceToObject < instanceTypes[instanceTypeIndex].lods[i].distances.w ) )\n"
|
||||||
|
" {\n"
|
||||||
|
" fColor = vec4(1.0,1.0,0.0,1.0);\n"
|
||||||
|
" float fadeAlpha = 4.0 * ( clamp( (distanceToObject-instanceTypes[instanceTypeIndex].lods[i].distances.x)/( instanceTypes[instanceTypeIndex].lods[i].distances.y - instanceTypes[instanceTypeIndex].lods[i].distances.x), 0.0, 1.0 ) \n"
|
||||||
|
" + clamp( (distanceToObject- instanceTypes[instanceTypeIndex].lods[i].distances.z)/( instanceTypes[instanceTypeIndex].lods[i].distances.w - instanceTypes[instanceTypeIndex].lods[i].distances.z), 0.0, 1.0 ) );\n"
|
||||||
|
" int sampleMask = ( 0xF0 >> int(fadeAlpha) ) & 0xF;\n"
|
||||||
|
" int indirectCommandIndex = instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.x;\n"
|
||||||
|
" int indirectCommandAddress = instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.y;\n"
|
||||||
|
" int objectIndex = imageAtomicAdd( getIndirectCommand( indirectCommandIndex ), indirectCommandAddress*indirectCommandSize+1, 1 );\n"
|
||||||
|
" int indirectTargetAddress = 6*(instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.z + objectIndex);\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+0, M0 );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+1, M1 );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+2, M2 );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+3, M3 );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+4, ExtraParams );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress+5, vec4(IdParams.x,IdParams.y,float(sampleMask),0.0) );\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_STATIC_CULL_FRAGMENT[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0, index = 0) out vec4 FragmentColor;\n"
|
||||||
|
"\n"
|
||||||
|
"in vec4 fColor;\n"
|
||||||
|
"\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" FragmentColor = fColor;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_STATIC_DRAW_0_VERTEX[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) in vec4 VertexPosition;\n"
|
||||||
|
"layout(location = 2) in vec3 VertexNormal;\n"
|
||||||
|
"layout(location = 3) in vec4 VertexColor;\n"
|
||||||
|
"layout(location = 8) in vec2 VertexTexCoord0;\n"
|
||||||
|
"layout(location = 9) in vec3 VertexTexCoord1;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceLOD\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 indirectTargetParams; // x=targetID, y=indexInTarget, z=offsetInTarget, w=lodMaxQuantity\n"
|
||||||
|
" vec4 distances; // x=minDistance, y=minFadeDistance, z=maxFadeDistance, w=maxDistance\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"const int OSGGPUCULL_MAXIMUM_LOD_NUMBER = 8;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceType\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 params;\n"
|
||||||
|
" InstanceLOD lods[OSGGPUCULL_MAXIMUM_LOD_NUMBER];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(std140) uniform instanceTypesData\n"
|
||||||
|
"{\n"
|
||||||
|
" InstanceType instanceTypes[32];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32F) coherent uniform imageBuffer indirectTarget;\n"
|
||||||
|
"\n"
|
||||||
|
"out vec3 ecPosition3;\n"
|
||||||
|
"out vec3 ecNormal;\n"
|
||||||
|
"out vec2 TexCoord;\n"
|
||||||
|
"out vec4 color;\n"
|
||||||
|
"flat out int sMask;\n"
|
||||||
|
" \n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" // every vertex has its type coded on VertexTexCoord1.x,\n"
|
||||||
|
" // and its lodNumber coded in VertexTexCoord1.y\n"
|
||||||
|
" int instanceTypeIndex = int(VertexTexCoord1.x);\n"
|
||||||
|
" int instanceLodNumber = int(VertexTexCoord1.y);\n"
|
||||||
|
" int indirectTargetAddress = 6*(instanceTypes[instanceTypeIndex].lods[instanceLodNumber].indirectTargetParams.z + gl_InstanceID);\n"
|
||||||
|
" mat4 instanceMatrix = mat4(\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 0),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 1),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 2),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 3) );\n"
|
||||||
|
" vec4 extraParams = imageLoad(indirectTarget, indirectTargetAddress + 4);\n"
|
||||||
|
" vec4 idParams = imageLoad(indirectTarget, indirectTargetAddress + 5);\n"
|
||||||
|
"\n"
|
||||||
|
" sMask = int(idParams.z);\n"
|
||||||
|
"\n"
|
||||||
|
" mat4 mvMatrix = gl_ModelViewMatrix * instanceMatrix;\n"
|
||||||
|
" \n"
|
||||||
|
" // Do fixed functionality vertex transform\n"
|
||||||
|
" vec4 ecPos = mvMatrix * vec4(VertexPosition.xyz,1.0);\n"
|
||||||
|
" gl_Position = gl_ProjectionMatrix * ecPos;\n"
|
||||||
|
"\n"
|
||||||
|
" ecPosition3 = ecPos.xyz / ecPos.w;\n"
|
||||||
|
" ecNormal = normalize( mat3(mvMatrix) * VertexNormal.xyz );\n"
|
||||||
|
" \n"
|
||||||
|
" TexCoord = VertexTexCoord0.xy;\n"
|
||||||
|
" color.xyz = VertexColor.xyz * extraParams.x;\n"
|
||||||
|
" color.a = VertexColor.a;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_STATIC_DRAW_0_FRAGMENT[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"in vec3 ecPosition3;\n"
|
||||||
|
"in vec3 ecNormal;\n"
|
||||||
|
"in vec2 TexCoord;\n"
|
||||||
|
"in vec4 color;\n"
|
||||||
|
"\n"
|
||||||
|
"flat in int sMask;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) out vec4 FragColor;\n"
|
||||||
|
"\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
"// simple fragment shader that calculates ambient + diffuse lighting with osg::LightSource\n"
|
||||||
|
" vec3 lightDir = normalize(vec3(gl_LightSource[0].position));\n"
|
||||||
|
" vec3 normal = normalize(ecNormal);\n"
|
||||||
|
" float NdotL = max(dot(normal, lightDir), 0.0);\n"
|
||||||
|
" FragColor = NdotL * color * gl_LightSource[0].diffuse + color * gl_LightSource[0].ambient;\n"
|
||||||
|
" gl_SampleMask[0] = sMask;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_STATIC_DRAW_1_VERTEX[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) in vec4 VertexPosition;\n"
|
||||||
|
"layout(location = 2) in vec3 VertexNormal;\n"
|
||||||
|
"layout(location = 3) in vec4 VertexColor;\n"
|
||||||
|
"layout(location = 8) in vec2 VertexTexCoord0;\n"
|
||||||
|
"layout(location = 9) in vec3 VertexTexCoord1;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceLOD\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 indirectTargetParams; // x=targetID, y=indexInTarget, z=offsetInTarget, w=lodMaxQuantity\n"
|
||||||
|
" vec4 distances; // x=minDistance, y=minFadeDistance, z=maxFadeDistance, w=maxDistance\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"const int OSGGPUCULL_MAXIMUM_LOD_NUMBER = 8;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceType\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 params;\n"
|
||||||
|
" InstanceLOD lods[OSGGPUCULL_MAXIMUM_LOD_NUMBER];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(std140) uniform instanceTypesData\n"
|
||||||
|
"{\n"
|
||||||
|
" InstanceType instanceTypes[32];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32F) coherent uniform imageBuffer indirectTarget;\n"
|
||||||
|
"\n"
|
||||||
|
"uniform vec2 windDirection;\n"
|
||||||
|
"uniform float osg_FrameTime;\n"
|
||||||
|
"\n"
|
||||||
|
"out vec3 ecPosition3;\n"
|
||||||
|
"out vec3 ecNormal;\n"
|
||||||
|
"out vec2 TexCoord;\n"
|
||||||
|
"out vec4 color;\n"
|
||||||
|
"flat out int sMask;\n"
|
||||||
|
" \n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" // every vertex has its type coded on VertexTexCoord1.x,\n"
|
||||||
|
" // and its lodNumber coded in VertexTexCoord1.y\n"
|
||||||
|
" int instanceTypeIndex = int(VertexTexCoord1.x);\n"
|
||||||
|
" int instanceLodNumber = int(VertexTexCoord1.y);\n"
|
||||||
|
" int indirectTargetAddress = 6*(instanceTypes[instanceTypeIndex].lods[instanceLodNumber].indirectTargetParams.z + gl_InstanceID);\n"
|
||||||
|
" mat4 instanceMatrix = mat4(\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 0),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 1),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 2),\n"
|
||||||
|
" imageLoad(indirectTarget, indirectTargetAddress + 3) );\n"
|
||||||
|
" vec4 extraParams = imageLoad(indirectTarget, indirectTargetAddress + 4);\n"
|
||||||
|
" vec4 idParams = imageLoad(indirectTarget, indirectTargetAddress + 5);\n"
|
||||||
|
"\n"
|
||||||
|
" sMask = int(idParams.z);\n"
|
||||||
|
"\n"
|
||||||
|
" // simple tree waving in the wind. Amplitude, frequency and offset are coded in extraParams\n"
|
||||||
|
" vec4 mPos = instanceMatrix * vec4(VertexPosition.xyz,1.0);\n"
|
||||||
|
" float wavingAmplitute = VertexPosition.z * extraParams.y;\n"
|
||||||
|
" mPos.xy += windDirection * wavingAmplitute * sin( extraParams.z*osg_FrameTime + extraParams.w );\n"
|
||||||
|
"\n"
|
||||||
|
" mat4 mvMatrix = gl_ModelViewMatrix * instanceMatrix;\n"
|
||||||
|
" \n"
|
||||||
|
" // Do fixed functionality vertex transform\n"
|
||||||
|
" vec4 ecPos = osg_ModelViewMatrix * mPos;\n"
|
||||||
|
" gl_Position = gl_ProjectionMatrix * ecPos;\n"
|
||||||
|
"\n"
|
||||||
|
" ecPosition3 = ecPos.xyz / ecPos.w;\n"
|
||||||
|
" ecNormal = normalize( mat3(mvMatrix) * VertexNormal.xyz );\n"
|
||||||
|
" \n"
|
||||||
|
" TexCoord = VertexTexCoord0.xy;\n"
|
||||||
|
" color.xyz = VertexColor.xyz * extraParams.x;\n"
|
||||||
|
" color.a = VertexColor.a;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_STATIC_DRAW_1_FRAGMENT[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"in vec3 ecPosition3;\n"
|
||||||
|
"in vec3 ecNormal;\n"
|
||||||
|
"in vec2 TexCoord;\n"
|
||||||
|
"in vec4 color;\n"
|
||||||
|
"\n"
|
||||||
|
"flat in int sMask;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) out vec4 FragColor;\n"
|
||||||
|
"\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
"// simple fragment shader that calculates ambient + diffuse lighting with osg::LightSource\n"
|
||||||
|
" vec3 lightDir = normalize(vec3(gl_LightSource[0].position));\n"
|
||||||
|
" vec3 normal = normalize(ecNormal);\n"
|
||||||
|
" float NdotL = max(dot(normal, lightDir), 0.0);\n"
|
||||||
|
" FragColor = NdotL * color * gl_LightSource[0].diffuse + color * gl_LightSource[0].ambient;\n"
|
||||||
|
" gl_SampleMask[0] = sMask;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_DYNAMIC_CULL_VERTEX[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"uniform mat4 osg_ViewMatrixInverse;\n"
|
||||||
|
"\n"
|
||||||
|
"uniform samplerBuffer dynamicInstancesData;\n"
|
||||||
|
"uniform int dynamicInstancesDataSize; // = sizeof(DynamicInstance) / sizeof(osg::Vec4f)\n"
|
||||||
|
"\n"
|
||||||
|
"layout(R32I) coherent uniform iimageBuffer indirectCommand0;\n"
|
||||||
|
"uniform int indirectCommandSize; // = sizeof(DrawArraysIndirectCommand) / sizeof(unsigned int) = 4\n"
|
||||||
|
"\n"
|
||||||
|
"layout(R32I) coherent uniform iimageBuffer getIndirectCommand( int index )\n"
|
||||||
|
"{\n"
|
||||||
|
" if(index==0) return indirectCommand0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32I) coherent uniform iimageBuffer indirectTarget0;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32I) coherent uniform iimageBuffer getIndirectTarget( int index )\n"
|
||||||
|
"{\n"
|
||||||
|
" if(index==0) return indirectTarget0;\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceLOD\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 indirectTargetParams; // x=targetID, y=indexInTarget, z=offsetInTarget, w=lodMaxQuantity\n"
|
||||||
|
" vec4 distances; // x=minDistance, y=minFadeDistance, z=maxFadeDistance, w=maxDistance\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"const int OSGGPUCULL_MAXIMUM_LOD_NUMBER = 8;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceType\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 params;\n"
|
||||||
|
" InstanceLOD lods[OSGGPUCULL_MAXIMUM_LOD_NUMBER];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(std140) uniform instanceTypesData\n"
|
||||||
|
"{\n"
|
||||||
|
" InstanceType instanceTypes[32];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) in vec3 VertexPosition; // xyz - used only for debugging purposes\n"
|
||||||
|
"layout(location = 10) in vec4 InstanceID; // typeid, id - points to the data in dynamicInstancesData buffer\n"
|
||||||
|
"\n"
|
||||||
|
"bool boundingBoxInViewFrustum( in mat4 matrix, in vec3 bbMin, in vec3 bbMax )\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 BoundingBox[8];\n"
|
||||||
|
" BoundingBox[0] = matrix * vec4( bbMax.x, bbMax.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[1] = matrix * vec4( bbMin.x, bbMax.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[2] = matrix * vec4( bbMax.x, bbMin.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[3] = matrix * vec4( bbMin.x, bbMin.y, bbMax.z, 1.0);\n"
|
||||||
|
" BoundingBox[4] = matrix * vec4( bbMax.x, bbMax.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[5] = matrix * vec4( bbMin.x, bbMax.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[6] = matrix * vec4( bbMax.x, bbMin.y, bbMin.z, 1.0);\n"
|
||||||
|
" BoundingBox[7] = matrix * vec4( bbMin.x, bbMin.y, bbMin.z, 1.0);\n"
|
||||||
|
"\n"
|
||||||
|
" int outOfBound[6] = int[6]( 0, 0, 0, 0, 0, 0 );\n"
|
||||||
|
" for (int i=0; i<8; i++)\n"
|
||||||
|
" {\n"
|
||||||
|
" outOfBound[0] += int( BoundingBox[i].x > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[1] += int( BoundingBox[i].x < -BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[2] += int( BoundingBox[i].y > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[3] += int( BoundingBox[i].y < -BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[4] += int( BoundingBox[i].z > BoundingBox[i].w );\n"
|
||||||
|
" outOfBound[5] += int( BoundingBox[i].z < -BoundingBox[i].w );\n"
|
||||||
|
" }\n"
|
||||||
|
" return (outOfBound[0] < 8 ) && ( outOfBound[1] < 8 ) && ( outOfBound[2] < 8 ) && ( outOfBound[3] < 8 ) && ( outOfBound[4] < 8 ) && ( outOfBound[5] < 8 );\n"
|
||||||
|
"}\n"
|
||||||
|
"\n"
|
||||||
|
"void main(void) \n"
|
||||||
|
"{\n"
|
||||||
|
" // get object matrices\n"
|
||||||
|
" int instanceIndex = int(InstanceID.y);\n"
|
||||||
|
" int instanceAddress = instanceIndex * dynamicInstancesDataSize;\n"
|
||||||
|
" mat4 instanceMatrix = mat4 (\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 1),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 2),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 3) );\n"
|
||||||
|
" mat4 mvpoMatrix = gl_ModelViewProjectionMatrix * instanceMatrix;\n"
|
||||||
|
"\n"
|
||||||
|
" // gl_Position is created only for debugging purposes\n"
|
||||||
|
" gl_Position = mvpoMatrix * vec4(0.0,0.0,0.0,1.0);\n"
|
||||||
|
"\n"
|
||||||
|
" int instanceTypeIndex = int(InstanceID.x);\n"
|
||||||
|
"\n"
|
||||||
|
" if( boundingBoxInViewFrustum( mvpoMatrix, instanceTypes[instanceTypeIndex].bbMin.xyz, instanceTypes[instanceTypeIndex].bbMax.xyz ) )\n"
|
||||||
|
" {\n"
|
||||||
|
" float distanceToObject = distance(osg_ViewMatrixInverse[3].xyz / osg_ViewMatrixInverse[3].w, instanceMatrix[3].xyz / instanceMatrix[3].w );\n"
|
||||||
|
" for(int i=0;i<instanceTypes[instanceTypeIndex].params.x;++i)\n"
|
||||||
|
" {\n"
|
||||||
|
" if( boundingBoxInViewFrustum( mvpoMatrix, instanceTypes[instanceTypeIndex].lods[i].bbMin.xyz, instanceTypes[instanceTypeIndex].lods[i].bbMax.xyz ) &&\n"
|
||||||
|
" ( distanceToObject >= instanceTypes[instanceTypeIndex].lods[i].distances.x ) && ( distanceToObject < instanceTypes[instanceTypeIndex].lods[i].distances.w ) )\n"
|
||||||
|
" {\n"
|
||||||
|
" float fadeAlpha = 4.0 * ( clamp( (distanceToObject-instanceTypes[instanceTypeIndex].lods[i].distances.x)/( instanceTypes[instanceTypeIndex].lods[i].distances.y - instanceTypes[instanceTypeIndex].lods[i].distances.x), 0.0, 1.0 ) \n"
|
||||||
|
" + clamp( (distanceToObject- instanceTypes[instanceTypeIndex].lods[i].distances.z)/( instanceTypes[instanceTypeIndex].lods[i].distances.w - instanceTypes[instanceTypeIndex].lods[i].distances.z), 0.0, 1.0 ) );\n"
|
||||||
|
" int sampleMask = ( 0xF0 >> int(fadeAlpha) ) & 0xF;\n"
|
||||||
|
" int indirectCommandIndex = instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.x;\n"
|
||||||
|
" int indirectCommandAddress = instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.y;\n"
|
||||||
|
" int objectIndex = imageAtomicAdd( getIndirectCommand( indirectCommandIndex ), indirectCommandAddress*indirectCommandSize+1, 1 );\n"
|
||||||
|
" int indirectTargetAddress = instanceTypes[instanceTypeIndex].lods[i].indirectTargetParams.z + objectIndex;\n"
|
||||||
|
" ivec4 indirectCommandData = ivec4( instanceTypeIndex, instanceIndex, sampleMask, 0 );\n"
|
||||||
|
" imageStore( getIndirectTarget(indirectCommandIndex), indirectTargetAddress, indirectCommandData );\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_DYNAMIC_CULL_FRAGMENT[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0, index = 0) out vec4 FragmentColor;\n"
|
||||||
|
"\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" FragmentColor = vec4(1.0,1.0,0.1,1.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_DYNAMIC_DRAW_0_VERTEX[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"uniform samplerBuffer dynamicInstancesData;\n"
|
||||||
|
"uniform int dynamicInstancesDataSize; // = sizeof(DynamicInstance) / sizeof(osg::Vec4f)\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) in vec4 VertexPosition;\n"
|
||||||
|
"layout(location = 2) in vec3 VertexNormal;\n"
|
||||||
|
"layout(location = 3) in vec4 VertexColor;\n"
|
||||||
|
"layout(location = 8) in vec2 VertexTexCoord0;\n"
|
||||||
|
"layout(location = 9) in vec3 VertexTexCoord1;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceLOD\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 indirectTargetParams; // x=targetID, y=indexInTarget, z=offsetInTarget, w=lodMaxQuantity\n"
|
||||||
|
" vec4 distances; // x=minDistance, y=minFadeDistance, z=maxFadeDistance, w=maxDistance\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"const int OSGGPUCULL_MAXIMUM_LOD_NUMBER = 8;\n"
|
||||||
|
"\n"
|
||||||
|
"struct InstanceType\n"
|
||||||
|
"{\n"
|
||||||
|
" vec4 bbMin;\n"
|
||||||
|
" vec4 bbMax;\n"
|
||||||
|
" ivec4 params;\n"
|
||||||
|
" InstanceLOD lods[OSGGPUCULL_MAXIMUM_LOD_NUMBER];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(std140) uniform instanceTypesData\n"
|
||||||
|
"{\n"
|
||||||
|
" InstanceType instanceTypes[32];\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"layout(RGBA32I) coherent uniform iimageBuffer indirectTarget;\n"
|
||||||
|
"\n"
|
||||||
|
"out vec3 ecPosition3;\n"
|
||||||
|
"out vec3 ecNormal;\n"
|
||||||
|
"out vec2 TexCoord;\n"
|
||||||
|
"out vec4 color;\n"
|
||||||
|
"flat out int sMask;\n"
|
||||||
|
" \n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
" // every vertex has its type coded on VertexTexCoord1.x,\n"
|
||||||
|
" // its lodNumber coded in VertexTexCoord1.y\n"
|
||||||
|
" // and bone index coded in VertexTexCoord1.z\n"
|
||||||
|
" int instanceTypeIndex = int(VertexTexCoord1.x);\n"
|
||||||
|
" int instanceLodNumber = int(VertexTexCoord1.y);\n"
|
||||||
|
" int boneIndex = int(VertexTexCoord1.z);\n"
|
||||||
|
" int indirectTargetAddress = instanceTypes[instanceTypeIndex].lods[instanceLodNumber].indirectTargetParams.z + gl_InstanceID;\n"
|
||||||
|
"\n"
|
||||||
|
" // if we know instance type, lod number and gl_InstanceID, we can reconstruct all instance data\n"
|
||||||
|
" ivec4 indirectCommandData = imageLoad(indirectTarget, indirectTargetAddress);\n"
|
||||||
|
" // now its time to read instance matrix and other additional params\n"
|
||||||
|
" int instanceAddress = indirectCommandData.y * dynamicInstancesDataSize;\n"
|
||||||
|
" mat4 instanceMatrix = mat4 (\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 1),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 2),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, instanceAddress + 3) );\n"
|
||||||
|
"\n"
|
||||||
|
" vec4 instanceExtraParams = texelFetch(dynamicInstancesData, instanceAddress + 4);\n"
|
||||||
|
" // we also need boneMatrix to animate an object\n"
|
||||||
|
" int boneAddress = instanceAddress + 6 + 4*boneIndex;\n"
|
||||||
|
" mat4 boneMatrix = mat4 (\n"
|
||||||
|
" texelFetch(dynamicInstancesData, boneAddress),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, boneAddress + 1),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, boneAddress + 2),\n"
|
||||||
|
" texelFetch(dynamicInstancesData, boneAddress + 3) );\n"
|
||||||
|
"\n"
|
||||||
|
" sMask = indirectCommandData.z;\n"
|
||||||
|
"\n"
|
||||||
|
" mat4 mvMatrix = gl_ModelViewMatrix * instanceMatrix * boneMatrix;\n"
|
||||||
|
" \n"
|
||||||
|
" // Do fixed functionality vertex transform\n"
|
||||||
|
" vec4 ecPos = mvMatrix * vec4(VertexPosition.xyz,1.0);\n"
|
||||||
|
" gl_Position = gl_ProjectionMatrix * ecPos;\n"
|
||||||
|
"\n"
|
||||||
|
" ecPosition3 = ecPos.xyz / ecPos.w;\n"
|
||||||
|
" ecNormal = normalize( mat3(mvMatrix) * VertexNormal.xyz );\n"
|
||||||
|
" \n"
|
||||||
|
" TexCoord = VertexTexCoord0.xy;\n"
|
||||||
|
" color.xyz = VertexColor.xyz * instanceExtraParams.x;\n"
|
||||||
|
" color.a = VertexColor.a;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
char SHADER_DYNAMIC_DRAW_0_FRAGMENT[] =
|
||||||
|
"#version 420 compatibility\n"
|
||||||
|
"\n"
|
||||||
|
"in vec3 ecPosition3;\n"
|
||||||
|
"in vec3 ecNormal;\n"
|
||||||
|
"in vec2 TexCoord;\n"
|
||||||
|
"in vec4 color;\n"
|
||||||
|
"\n"
|
||||||
|
"flat in int sMask;\n"
|
||||||
|
"\n"
|
||||||
|
"layout(location = 0) out vec4 FragColor;\n"
|
||||||
|
"\n"
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
"// simple fragment shader that calculates ambient + diffuse lighting with osg::LightSource\n"
|
||||||
|
" vec3 lightDir = normalize(vec3(gl_LightSource[0].position));\n"
|
||||||
|
" vec3 normal = normalize(ecNormal);\n"
|
||||||
|
" float NdotL = max(dot(normal, lightDir), 0.0);\n"
|
||||||
|
" FragColor = NdotL * color * gl_LightSource[0].diffuse + color * gl_LightSource[0].ambient;\n"
|
||||||
|
" gl_SampleMask[0] = sMask;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
1158
examples/osggpucull/ShapeToGeometry.cpp
Normal file
1158
examples/osggpucull/ShapeToGeometry.cpp
Normal file
File diff suppressed because it is too large
Load Diff
97
examples/osggpucull/ShapeToGeometry.h
Normal file
97
examples/osggpucull/ShapeToGeometry.h
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 Robert Osfield
|
||||||
|
* Copyright (C) 2014 Pawel Ksiezopolski
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef SHAPE_TO_GEOMETRY
|
||||||
|
#define SHAPE_TO_GEOMETRY 1
|
||||||
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Geode>
|
||||||
|
#include <osg/ShapeDrawable>
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
|
||||||
|
// arbitrary minima for rows & segments ( from shapedrawable.cpp )
|
||||||
|
const unsigned int MIN_NUM_ROWS = 3;
|
||||||
|
const unsigned int MIN_NUM_SEGMENTS = 5;
|
||||||
|
|
||||||
|
// osg::GLBeginEndAdapter descendant that stores data for osg::Geometry creation
|
||||||
|
class FakeGLBeginEndAdapter : public osg::GLBeginEndAdapter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FakeGLBeginEndAdapter();
|
||||||
|
|
||||||
|
void PushMatrix();
|
||||||
|
void MultMatrixd(const GLdouble* m);
|
||||||
|
void Translated(GLdouble x, GLdouble y, GLdouble z);
|
||||||
|
void Scaled(GLdouble x, GLdouble y, GLdouble z);
|
||||||
|
void Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
|
||||||
|
void End();
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Geometry> geometry;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ShapeToGeometryVisitor : public osg::ConstShapeVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ShapeToGeometryVisitor(const osg::TessellationHints* hints)
|
||||||
|
: osg::ConstShapeVisitor(), _hints(hints)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void apply(const osg::Sphere&);
|
||||||
|
virtual void apply(const osg::Box&);
|
||||||
|
virtual void apply(const osg::Cone&);
|
||||||
|
virtual void apply(const osg::Cylinder&);
|
||||||
|
virtual void apply(const osg::Capsule&);
|
||||||
|
virtual void apply(const osg::InfinitePlane&);
|
||||||
|
|
||||||
|
virtual void apply(const osg::TriangleMesh&);
|
||||||
|
virtual void apply(const osg::ConvexHull&);
|
||||||
|
virtual void apply(const osg::HeightField&);
|
||||||
|
|
||||||
|
virtual void apply(const osg::CompositeShape&);
|
||||||
|
|
||||||
|
osg::Geometry* getGeometry() { return gl.geometry.get(); }
|
||||||
|
|
||||||
|
|
||||||
|
const osg::TessellationHints* _hints;
|
||||||
|
FakeGLBeginEndAdapter gl;
|
||||||
|
protected:
|
||||||
|
|
||||||
|
ShapeToGeometryVisitor& operator = (const ShapeToGeometryVisitor&) { return *this; }
|
||||||
|
enum SphereHalf { SphereTopHalf, SphereBottomHalf };
|
||||||
|
|
||||||
|
// helpers for apply( Cylinder | Sphere | Capsule )
|
||||||
|
void drawCylinderBody(unsigned int numSegments, float radius, float height);
|
||||||
|
void drawHalfSphere(unsigned int numSegments, unsigned int numRows, float radius, SphereHalf which, float zOffset = 0.0f);
|
||||||
|
};
|
||||||
|
|
||||||
|
osg::Geometry* convertShapeToGeometry(const osg::Shape& shape, const osg::TessellationHints* hints);
|
||||||
|
|
||||||
|
osg::Geometry* convertShapeToGeometry(const osg::Shape& shape, const osg::TessellationHints* hints, const osg::Vec4& color);
|
||||||
|
|
||||||
|
osg::Geode* convertShapeToGeode(const osg::Shape& shape, const osg::TessellationHints* hints);
|
||||||
|
|
||||||
|
osg::Geode* convertShapeToGeode(const osg::Shape& shape, const osg::TessellationHints* hints, const osg::Vec4& color);
|
||||||
|
|
||||||
|
|
||||||
|
// example : how to use convertShapeToGeometry()
|
||||||
|
// osg::ref_ptr<osg::Capsule> shape = new osg::Capsule( osg::Vec3( 0.0, 0.0, 0.0 ), radius, height );
|
||||||
|
// osg::ref_ptr<osg::TessellationHints> tessHints = new osg::TessellationHints;
|
||||||
|
// tessHints->setDetailRatio(0.5f);
|
||||||
|
// tessHints->setCreateTextureCoords(true);
|
||||||
|
// osg::ref_ptr<osg::Geometry> capsuleGeometry = convertShapeToGeometry(*shape.get(), tessHints.get());
|
||||||
|
// osg::ref_ptr<osg::Geometry> redCapsuleGeometry = convertShapeToGeometry(*shape.get(), tessHints.get(), osg::Vec4(1.0,0.0,0.0,1.0) );
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
1536
examples/osggpucull/osggpucull.cpp
Normal file
1536
examples/osggpucull/osggpucull.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,7 @@ class CalibrateCostEsimator : public osg::GraphicsOperation
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
CalibrateCostEsimator(osg::GraphicsCostEstimator* gce):
|
CalibrateCostEsimator(osg::GraphicsCostEstimator* gce):
|
||||||
|
osg::Referenced(true),
|
||||||
osg::GraphicsOperation("CalbirateCostEstimator",false),
|
osg::GraphicsOperation("CalbirateCostEstimator",false),
|
||||||
_gce(gce) {}
|
_gce(gce) {}
|
||||||
|
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ osg::Camera* createHUD()
|
|||||||
osg::BoundingBox bb;
|
osg::BoundingBox bb;
|
||||||
for(unsigned int i=0;i<geode->getNumDrawables();++i)
|
for(unsigned int i=0;i<geode->getNumDrawables();++i)
|
||||||
{
|
{
|
||||||
bb.expandBy(geode->getDrawable(i)->getBound());
|
bb.expandBy(geode->getDrawable(i)->getBoundingBox());
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Geometry* geom = new osg::Geometry;
|
osg::Geometry* geom = new osg::Geometry;
|
||||||
@@ -227,6 +227,8 @@ struct SnapImage : public osg::Camera::DrawCallback
|
|||||||
mutable osg::ref_ptr<osg::Image> _image;
|
mutable osg::ref_ptr<osg::Image> _image;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct SnapeImageHandler : public osgGA::GUIEventHandler
|
struct SnapeImageHandler : public osgGA::GUIEventHandler
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -234,7 +236,7 @@ struct SnapeImageHandler : public osgGA::GUIEventHandler
|
|||||||
_key(key),
|
_key(key),
|
||||||
_snapImage(si) {}
|
_snapImage(si) {}
|
||||||
|
|
||||||
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter&)
|
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
|
||||||
{
|
{
|
||||||
if (ea.getHandled()) return false;
|
if (ea.getHandled()) return false;
|
||||||
|
|
||||||
@@ -242,6 +244,18 @@ struct SnapeImageHandler : public osgGA::GUIEventHandler
|
|||||||
{
|
{
|
||||||
case(osgGA::GUIEventAdapter::KEYUP):
|
case(osgGA::GUIEventAdapter::KEYUP):
|
||||||
{
|
{
|
||||||
|
if (ea.getKey() == 'o' )
|
||||||
|
{
|
||||||
|
osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
|
||||||
|
osg::Node* node = view ? view->getSceneData() : 0;
|
||||||
|
if (node)
|
||||||
|
{
|
||||||
|
osgDB::writeNodeFile(*node, "hud.osgt");
|
||||||
|
osgDB::writeNodeFile(*node, "hud.osgb");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (ea.getKey() == _key)
|
if (ea.getKey() == _key)
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"event handler"<<std::endl;
|
osg::notify(osg::NOTICE)<<"event handler"<<std::endl;
|
||||||
@@ -358,7 +372,7 @@ int main( int argc, char **argv )
|
|||||||
viewer.getCamera()->setFinalDrawCallback(finalDrawCallback);
|
viewer.getCamera()->setFinalDrawCallback(finalDrawCallback);
|
||||||
viewer.addEventHandler(new SnapeImageHandler('f',finalDrawCallback));
|
viewer.addEventHandler(new SnapeImageHandler('f',finalDrawCallback));
|
||||||
|
|
||||||
osg::ref_ptr<osg::Group> group = new osg::Group;
|
osg::ref_ptr<osg::Group> group = new osg::Group;
|
||||||
|
|
||||||
// add the HUD subgraph.
|
// add the HUD subgraph.
|
||||||
if (scene.valid()) group->addChild(scene.get());
|
if (scene.valid()) group->addChild(scene.get());
|
||||||
|
|||||||
@@ -44,12 +44,12 @@ class CreateModelToSaveVisitor : public osg::NodeVisitor
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
CreateModelToSaveVisitor():
|
CreateModelToSaveVisitor():
|
||||||
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
||||||
{
|
{
|
||||||
_group = new osg::Group;
|
_group = new osg::Group;
|
||||||
_addToModel = false;
|
_addToModel = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(osg::Node& node)
|
virtual void apply(osg::Node& node)
|
||||||
{
|
{
|
||||||
osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
|
osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
|
||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
traverse(node);
|
traverse(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::ref_ptr<osg::Group> _group;
|
osg::ref_ptr<osg::Group> _group;
|
||||||
bool _addToModel;
|
bool _addToModel;
|
||||||
};
|
};
|
||||||
@@ -75,10 +75,10 @@ class DeleteSelectedNodesVisitor : public osg::NodeVisitor
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
DeleteSelectedNodesVisitor():
|
DeleteSelectedNodesVisitor():
|
||||||
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void apply(osg::Node& node)
|
virtual void apply(osg::Node& node)
|
||||||
{
|
{
|
||||||
osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
|
osgFX::Scribe* scribe = dynamic_cast<osgFX::Scribe*>(&node);
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
traverse(node);
|
traverse(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pruneSelectedNodes()
|
void pruneSelectedNodes()
|
||||||
{
|
{
|
||||||
for(SelectedNodes::iterator itr = _selectedNodes.begin();
|
for(SelectedNodes::iterator itr = _selectedNodes.begin();
|
||||||
@@ -104,21 +104,20 @@ public:
|
|||||||
pitr != parents.end();
|
pitr != parents.end();
|
||||||
++pitr)
|
++pitr)
|
||||||
{
|
{
|
||||||
osg::Group* parent = *pitr;
|
(*pitr)->removeChild(node);
|
||||||
parent->removeChild(node);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef std::vector< osg::ref_ptr<osgFX::Scribe> > SelectedNodes;
|
typedef std::vector< osg::ref_ptr<osgFX::Scribe> > SelectedNodes;
|
||||||
SelectedNodes _selectedNodes;
|
SelectedNodes _selectedNodes;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// class to handle events with a pick
|
// class to handle events with a pick
|
||||||
class PickHandler : public osgGA::GUIEventHandler
|
class PickHandler : public osgGA::GUIEventHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
PickHandler():
|
PickHandler():
|
||||||
_mx(0.0),_my(0.0),
|
_mx(0.0),_my(0.0),
|
||||||
@@ -139,7 +138,7 @@ public:
|
|||||||
if (ea.getKey()=='s')
|
if (ea.getKey()=='s')
|
||||||
{
|
{
|
||||||
saveSelectedModel(viewer->getSceneData());
|
saveSelectedModel(viewer->getSceneData());
|
||||||
}
|
}
|
||||||
else if (ea.getKey()=='o')
|
else if (ea.getKey()=='o')
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osgt'"<<std::endl;
|
osg::notify(osg::NOTICE)<<"Saved model to file 'saved_model.osgt'"<<std::endl;
|
||||||
@@ -189,7 +188,7 @@ public:
|
|||||||
pick(ea,viewer);
|
pick(ea,viewer);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@@ -248,7 +247,7 @@ public:
|
|||||||
node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
|
node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
|
||||||
parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
|
parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
|
||||||
|
|
||||||
if (node) std::cout<<" Hits "<<node->className()<<" nodePath size "<<nodePath.size()<<std::endl;
|
if (node) std::cout<<" Hits "<<node->className()<<" nodePath size "<<nodePath.size()<<std::endl;
|
||||||
toggleScribe(parent, node);
|
toggleScribe(parent, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,7 +283,7 @@ public:
|
|||||||
if (node) std::cout<<" Hits "<<node->className()<<" nodePath size"<<nodePath.size()<<std::endl;
|
if (node) std::cout<<" Hits "<<node->className()<<" nodePath size"<<nodePath.size()<<std::endl;
|
||||||
toggleScribe(parent, node);
|
toggleScribe(parent, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now we try to decorate the hit node by the osgFX::Scribe to show that its been "picked"
|
// now we try to decorate the hit node by the osgFX::Scribe to show that its been "picked"
|
||||||
}
|
}
|
||||||
@@ -319,10 +318,10 @@ public:
|
|||||||
void saveSelectedModel(osg::Node* scene)
|
void saveSelectedModel(osg::Node* scene)
|
||||||
{
|
{
|
||||||
if (!scene) return;
|
if (!scene) return;
|
||||||
|
|
||||||
CreateModelToSaveVisitor cmtsv;
|
CreateModelToSaveVisitor cmtsv;
|
||||||
scene->accept(cmtsv);
|
scene->accept(cmtsv);
|
||||||
|
|
||||||
if (cmtsv._group->getNumChildren()>0)
|
if (cmtsv._group->getNumChildren()>0)
|
||||||
{
|
{
|
||||||
std::cout<<"Writing selected compoents to 'selected_model.osgt'"<<std::endl;
|
std::cout<<"Writing selected compoents to 'selected_model.osgt'"<<std::endl;
|
||||||
@@ -340,19 +339,19 @@ protected:
|
|||||||
int main( int argc, char **argv )
|
int main( int argc, char **argv )
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osg::Node> loadedModel;
|
osg::ref_ptr<osg::Node> loadedModel;
|
||||||
|
|
||||||
// load the scene.
|
// load the scene.
|
||||||
if (argc>1) loadedModel = osgDB::readNodeFile(argv[1]);
|
if (argc>1) loadedModel = osgDB::readNodeFile(argv[1]);
|
||||||
|
|
||||||
// if not loaded assume no arguments passed in, try use default mode instead.
|
// if not loaded assume no arguments passed in, try use default mode instead.
|
||||||
if (!loadedModel) loadedModel = osgDB::readNodeFile("dumptruck.osgt");
|
if (!loadedModel) loadedModel = osgDB::readNodeFile("dumptruck.osgt");
|
||||||
|
|
||||||
if (!loadedModel)
|
if (!loadedModel)
|
||||||
{
|
{
|
||||||
std::cout << argv[0] <<": No data loaded." << std::endl;
|
std::cout << argv[0] <<": No data loaded." << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// create the window to draw to.
|
// create the window to draw to.
|
||||||
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
|
||||||
traits->x = 200;
|
traits->x = 200;
|
||||||
@@ -376,7 +375,7 @@ int main( int argc, char **argv )
|
|||||||
viewer.getCamera()->setGraphicsContext(gc.get());
|
viewer.getCamera()->setGraphicsContext(gc.get());
|
||||||
viewer.getCamera()->setViewport(0,0,800,600);
|
viewer.getCamera()->setViewport(0,0,800,600);
|
||||||
viewer.setSceneData(loadedModel.get());
|
viewer.setSceneData(loadedModel.get());
|
||||||
|
|
||||||
// create a tracball manipulator to move the camera around in response to keyboard/mouse events
|
// create a tracball manipulator to move the camera around in response to keyboard/mouse events
|
||||||
viewer.setCameraManipulator( new osgGA::TrackballManipulator );
|
viewer.setCameraManipulator( new osgGA::TrackballManipulator );
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* OpenSceneGraph example, osganimate.
|
/* OpenSceneGraph example, osgkeystone.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <osgDB/ReadFile>
|
#include <osgDB/ReadFile>
|
||||||
#include <osgUtil/Optimizer>
|
#include <osgUtil/Optimizer>
|
||||||
#include <osgViewer/Viewer>
|
#include <osgViewer/Viewer>
|
||||||
|
#include <osgViewer/ViewerEventHandlers>
|
||||||
#include <osg/CoordinateSystemNode>
|
#include <osg/CoordinateSystemNode>
|
||||||
#include <osgText/Text>
|
#include <osgText/Text>
|
||||||
|
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
#include <osgManipulator/TranslateAxisDragger>
|
#include <osgManipulator/TranslateAxisDragger>
|
||||||
#include <osgManipulator/TranslatePlaneDragger>
|
#include <osgManipulator/TranslatePlaneDragger>
|
||||||
#include <osgManipulator/RotateCylinderDragger>
|
#include <osgManipulator/RotateCylinderDragger>
|
||||||
|
#include <osgManipulator/AntiSquish>
|
||||||
|
|
||||||
#include <osg/ShapeDrawable>
|
#include <osg/ShapeDrawable>
|
||||||
#include <osg/MatrixTransform>
|
#include <osg/MatrixTransform>
|
||||||
@@ -47,11 +49,11 @@ class PlaneConstraint : public osgManipulator::Constraint
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlaneConstraint() {}
|
PlaneConstraint() {}
|
||||||
|
|
||||||
virtual bool constrain(osgManipulator::TranslateInLineCommand& command) const
|
virtual bool constrain(osgManipulator::TranslateInLineCommand& command) const
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"PlaneConstraint TranslateInLineCommand "<<command.getTranslation()<<std::endl;
|
OSG_NOTICE<<"PlaneConstraint TranslateInLineCommand "<<command.getTranslation()<<std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual bool constrain(osgManipulator::TranslateInPlaneCommand& command) const
|
virtual bool constrain(osgManipulator::TranslateInPlaneCommand& command) const
|
||||||
{
|
{
|
||||||
@@ -63,7 +65,7 @@ public:
|
|||||||
{
|
{
|
||||||
//command.setScale(1.0f);
|
//command.setScale(1.0f);
|
||||||
OSG_NOTICE<<"PlaneConstraint Scale1DCommand"<<command.getScale()<<std::endl;
|
OSG_NOTICE<<"PlaneConstraint Scale1DCommand"<<command.getScale()<<std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
virtual bool constrain(osgManipulator::Scale2DCommand& command) const
|
virtual bool constrain(osgManipulator::Scale2DCommand& command) const
|
||||||
{
|
{
|
||||||
@@ -74,7 +76,7 @@ public:
|
|||||||
virtual bool constrain(osgManipulator::ScaleUniformCommand& command) const
|
virtual bool constrain(osgManipulator::ScaleUniformCommand& command) const
|
||||||
{
|
{
|
||||||
OSG_NOTICE<<"PlaneConstraint ScaleUniformCommand"<<command.getScale()<<std::endl;
|
OSG_NOTICE<<"PlaneConstraint ScaleUniformCommand"<<command.getScale()<<std::endl;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -106,6 +108,8 @@ osgManipulator::Dragger* createDragger(const std::string& name)
|
|||||||
{
|
{
|
||||||
osgManipulator::TrackballDragger* d = new osgManipulator::TrackballDragger();
|
osgManipulator::TrackballDragger* d = new osgManipulator::TrackballDragger();
|
||||||
d->setupDefaultGeometry();
|
d->setupDefaultGeometry();
|
||||||
|
//d->setAxisLineWidth(5.0f);
|
||||||
|
//d->setPickCylinderHeight(0.1f);
|
||||||
dragger = d;
|
dragger = d;
|
||||||
}
|
}
|
||||||
else if ("Translate1DDragger" == name)
|
else if ("Translate1DDragger" == name)
|
||||||
@@ -124,6 +128,9 @@ osgManipulator::Dragger* createDragger(const std::string& name)
|
|||||||
{
|
{
|
||||||
osgManipulator::TranslateAxisDragger* d = new osgManipulator::TranslateAxisDragger();
|
osgManipulator::TranslateAxisDragger* d = new osgManipulator::TranslateAxisDragger();
|
||||||
d->setupDefaultGeometry();
|
d->setupDefaultGeometry();
|
||||||
|
d->setAxisLineWidth(5.0f);
|
||||||
|
d->setPickCylinderRadius(0.05f);
|
||||||
|
d->setConeHeight(0.2f);
|
||||||
dragger = d;
|
dragger = d;
|
||||||
}
|
}
|
||||||
else if ("TranslatePlaneDragger" == name)
|
else if ("TranslatePlaneDragger" == name)
|
||||||
@@ -163,8 +170,6 @@ osgManipulator::Dragger* createDragger(const std::string& name)
|
|||||||
dragger = d;
|
dragger = d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return dragger;
|
return dragger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,29 +178,29 @@ class DraggerContainer : public osg::Group
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DraggerContainer() : _draggerSize(240.0f), _active(true) {}
|
DraggerContainer() : _draggerSize(240.0f), _active(true) {}
|
||||||
|
|
||||||
DraggerContainer( const DraggerContainer& copy, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY )
|
DraggerContainer( const DraggerContainer& copy, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY )
|
||||||
: osg::Group(copy, copyop),
|
: osg::Group(copy, copyop),
|
||||||
_dragger(copy._dragger), _draggerSize(copy._draggerSize), _active(copy._active)
|
_dragger(copy._dragger), _draggerSize(copy._draggerSize), _active(copy._active)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
META_Node( osgManipulator, DraggerContainer );
|
META_Node( osgManipulator, DraggerContainer );
|
||||||
|
|
||||||
void setDragger( osgManipulator::Dragger* dragger )
|
void setDragger( osgManipulator::Dragger* dragger )
|
||||||
{
|
{
|
||||||
_dragger = dragger;
|
_dragger = dragger;
|
||||||
if ( !containsNode(dragger) ) addChild( dragger );
|
if ( !containsNode(dragger) ) addChild( dragger );
|
||||||
}
|
}
|
||||||
|
|
||||||
osgManipulator::Dragger* getDragger() { return _dragger.get(); }
|
osgManipulator::Dragger* getDragger() { return _dragger.get(); }
|
||||||
const osgManipulator::Dragger* getDragger() const { return _dragger.get(); }
|
const osgManipulator::Dragger* getDragger() const { return _dragger.get(); }
|
||||||
|
|
||||||
void setDraggerSize( float size ) { _draggerSize = size; }
|
void setDraggerSize( float size ) { _draggerSize = size; }
|
||||||
float getDraggerSize() const { return _draggerSize; }
|
float getDraggerSize() const { return _draggerSize; }
|
||||||
|
|
||||||
void setActive( bool b ) { _active = b; }
|
void setActive( bool b ) { _active = b; }
|
||||||
bool getActive() const { return _active; }
|
bool getActive() const { return _active; }
|
||||||
|
|
||||||
void traverse( osg::NodeVisitor& nv )
|
void traverse( osg::NodeVisitor& nv )
|
||||||
{
|
{
|
||||||
if ( _dragger.valid() )
|
if ( _dragger.valid() )
|
||||||
@@ -203,13 +208,13 @@ public:
|
|||||||
if ( _active && nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR )
|
if ( _active && nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR )
|
||||||
{
|
{
|
||||||
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv);
|
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(&nv);
|
||||||
|
|
||||||
float pixelSize = cv->pixelSize(_dragger->getBound().center(), 0.48f);
|
float pixelSize = cv->pixelSize(_dragger->getBound().center(), 0.48f);
|
||||||
if ( pixelSize!=_draggerSize )
|
if ( pixelSize!=_draggerSize )
|
||||||
{
|
{
|
||||||
float pixelScale = pixelSize>0.0f ? _draggerSize/pixelSize : 1.0f;
|
float pixelScale = pixelSize>0.0f ? _draggerSize/pixelSize : 1.0f;
|
||||||
osg::Vec3d scaleFactor(pixelScale, pixelScale, pixelScale);
|
osg::Vec3d scaleFactor(pixelScale, pixelScale, pixelScale);
|
||||||
|
|
||||||
osg::Vec3 trans = _dragger->getMatrix().getTrans();
|
osg::Vec3 trans = _dragger->getMatrix().getTrans();
|
||||||
_dragger->setMatrix( osg::Matrix::scale(scaleFactor) * osg::Matrix::translate(trans) );
|
_dragger->setMatrix( osg::Matrix::scale(scaleFactor) * osg::Matrix::translate(trans) );
|
||||||
}
|
}
|
||||||
@@ -217,7 +222,7 @@ public:
|
|||||||
}
|
}
|
||||||
osg::Group::traverse(nv);
|
osg::Group::traverse(nv);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
osg::ref_ptr<osgManipulator::Dragger> _dragger;
|
osg::ref_ptr<osgManipulator::Dragger> _dragger;
|
||||||
float _draggerSize;
|
float _draggerSize;
|
||||||
@@ -273,7 +278,7 @@ osg::Node* addDraggerToScene(osg::Node* scene, const std::string& name, bool fix
|
|||||||
}
|
}
|
||||||
|
|
||||||
osg::Node* createDemoScene(bool fixedSizeInScreen) {
|
osg::Node* createDemoScene(bool fixedSizeInScreen) {
|
||||||
|
|
||||||
osg::Group* root = new osg::Group;
|
osg::Group* root = new osg::Group;
|
||||||
|
|
||||||
osg::ref_ptr<osg::Geode> geode_1 = new osg::Geode;
|
osg::ref_ptr<osg::Geode> geode_1 = new osg::Geode;
|
||||||
@@ -297,7 +302,7 @@ osg::Node* createDemoScene(bool fixedSizeInScreen) {
|
|||||||
osg::ref_ptr<osg::Geode> geode_7 = new osg::Geode;
|
osg::ref_ptr<osg::Geode> geode_7 = new osg::Geode;
|
||||||
osg::ref_ptr<osg::MatrixTransform> transform_7 = new osg::MatrixTransform;
|
osg::ref_ptr<osg::MatrixTransform> transform_7 = new osg::MatrixTransform;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -364,17 +369,18 @@ osg::Node* createDemoScene(bool fixedSizeInScreen) {
|
|||||||
root->addChild(transform_6.get());
|
root->addChild(transform_6.get());
|
||||||
root->addChild(transform_7.get());
|
root->addChild(transform_7.get());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
//
|
|
||||||
|
//
|
||||||
int main( int argc, char **argv )
|
int main( int argc, char **argv )
|
||||||
{
|
{
|
||||||
|
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// set up the usage document, in case we need to print out how to use this program.
|
// set up the usage document, in case we need to print out how to use this program.
|
||||||
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
|
arguments.getApplicationUsage()->setApplicationName(arguments.getApplicationName());
|
||||||
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options] filename ...");
|
||||||
@@ -387,16 +393,42 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--dragger <draggername>","Use the specified dragger for manipulation [TabPlaneDragger, TabPlaneTrackballDragger, TrackballDragger, Translate1DDragger, Translate2DDragger, TranslateAxisDragger, TabBoxDragger, TranslatePlaneDragger, Scale1DDragger, Scale2DDragger, RotateCylinderDragger, RotateSphereDragger]");
|
arguments.getApplicationUsage()->addCommandLineOption("--dragger <draggername>","Use the specified dragger for manipulation [TabPlaneDragger, TabPlaneTrackballDragger, TrackballDragger, Translate1DDragger, Translate2DDragger, TranslateAxisDragger, TabBoxDragger, TranslatePlaneDragger, Scale1DDragger, Scale2DDragger, RotateCylinderDragger, RotateSphereDragger]");
|
||||||
arguments.getApplicationUsage()->addCommandLineOption("--fixedDraggerSize","Fix the size of the dragger geometry in the screen space");
|
arguments.getApplicationUsage()->addCommandLineOption("--fixedDraggerSize","Fix the size of the dragger geometry in the screen space");
|
||||||
|
|
||||||
bool fixedSizeInScreen = false;
|
bool fixedSizeInScreen = false;
|
||||||
while (arguments.read("--fixedDraggerSize")) { fixedSizeInScreen = true; }
|
while (arguments.read("--fixedDraggerSize")) { fixedSizeInScreen = true; }
|
||||||
|
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer(arguments);
|
||||||
|
|
||||||
|
// add the window size toggle handler
|
||||||
|
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
|
||||||
|
|
||||||
// get details on keyboard and mouse bindings used by the viewer.
|
// get details on keyboard and mouse bindings used by the viewer.
|
||||||
viewer.getUsage(*arguments.getApplicationUsage());
|
viewer.getUsage(*arguments.getApplicationUsage());
|
||||||
|
|
||||||
|
|
||||||
|
if (arguments.read("--test-NodeMask"))
|
||||||
|
{
|
||||||
|
const osg::ref_ptr<osg::Group> group = new osg::Group();
|
||||||
|
group->setNodeMask(0);
|
||||||
|
|
||||||
|
const osg::ref_ptr<osgManipulator::AntiSquish> antiSquish = new osgManipulator::AntiSquish();
|
||||||
|
|
||||||
|
group->addChild(antiSquish.get());
|
||||||
|
|
||||||
|
const osg::ref_ptr<osg::Node> node = new osg::Node();
|
||||||
|
node->setInitialBound(osg::BoundingSphere(osg::Vec3(0.0, 0.0, 0.0), 1.0));
|
||||||
|
|
||||||
|
antiSquish->addChild(node.get());
|
||||||
|
|
||||||
|
group->getBound();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// if user request help write it out to cout.
|
// if user request help write it out to cout.
|
||||||
bool helpAll = arguments.read("--help-all");
|
bool helpAll = arguments.read("--help-all");
|
||||||
unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
|
unsigned int helpType = ((helpAll || arguments.read("-h") || arguments.read("--help"))? osg::ApplicationUsage::COMMAND_LINE_OPTION : 0 ) |
|
||||||
@@ -425,7 +457,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
// if no model has been successfully loaded report failure.
|
// if no model has been successfully loaded report failure.
|
||||||
bool tragger2Scene(true);
|
bool tragger2Scene(true);
|
||||||
if (!loadedModel)
|
if (!loadedModel)
|
||||||
{
|
{
|
||||||
//std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
|
//std::cout << arguments.getApplicationName() <<": No data loaded" << std::endl;
|
||||||
//return 1;
|
//return 1;
|
||||||
@@ -451,11 +483,11 @@ int main( int argc, char **argv )
|
|||||||
osgUtil::Optimizer optimizer;
|
osgUtil::Optimizer optimizer;
|
||||||
optimizer.optimize(loadedModel.get());
|
optimizer.optimize(loadedModel.get());
|
||||||
|
|
||||||
|
|
||||||
// pass the loaded scene graph to the viewer.
|
// pass the loaded scene graph to the viewer.
|
||||||
if ( tragger2Scene ) {
|
if ( tragger2Scene ) {
|
||||||
viewer.setSceneData(addDraggerToScene(loadedModel.get(), dragger_name, fixedSizeInScreen));
|
viewer.setSceneData(addDraggerToScene(loadedModel.get(), dragger_name, fixedSizeInScreen));
|
||||||
} else {
|
} else {
|
||||||
viewer.setSceneData(loadedModel.get());
|
viewer.setSceneData(loadedModel.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* OpenSceneGraph example, osganimate.
|
/* OpenSceneGraph example, osgmemorytest.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class MotionBlurOperation: public osg::Operation
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MotionBlurOperation(double persistence):
|
MotionBlurOperation(double persistence):
|
||||||
|
osg::Referenced(true),
|
||||||
osg::Operation("MotionBlur",true),
|
osg::Operation("MotionBlur",true),
|
||||||
cleared_(false),
|
cleared_(false),
|
||||||
persistence_(persistence)
|
persistence_(persistence)
|
||||||
|
|||||||
@@ -1,14 +1,25 @@
|
|||||||
# INCLUDE_DIRECTORIES( ${OPENAL_INCLUDE_DIR} )
|
# INCLUDE_DIRECTORIES( ${OPENAL_INCLUDE_DIR} )
|
||||||
# SET(TARGET_EXTERNAL_LIBRARIES ${OPENAL_LIBRARY} alut)
|
# SET(TARGET_EXTERNAL_LIBRARIES ${OPENAL_LIBRARY} alut)
|
||||||
|
|
||||||
IF (SDL_FOUND)
|
IF (SDL2_FOUND)
|
||||||
|
|
||||||
|
SET(TARGET_EXTERNAL_LIBRARIES ${SDL2_LIBRARY} )
|
||||||
|
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR} )
|
||||||
|
ADD_DEFINITIONS(-DUSE_SDL2)
|
||||||
|
IF (MINGW)
|
||||||
|
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
ELSEIF (SDL_FOUND)
|
||||||
|
|
||||||
SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} )
|
SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} )
|
||||||
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} )
|
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} )
|
||||||
ADD_DEFINITIONS(-DUSE_SDL)
|
ADD_DEFINITIONS(-DUSE_SDL)
|
||||||
IF (MINGW)
|
IF (MINGW)
|
||||||
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid)
|
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF(SDL_FOUND)
|
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(TARGET_SRC osgmovie.cpp )
|
SET(TARGET_SRC osgmovie.cpp )
|
||||||
SET(TARGET_ADDED_LIBRARIES osgGA )
|
SET(TARGET_ADDED_LIBRARIES osgGA )
|
||||||
|
|||||||
@@ -376,7 +376,7 @@ osg::Geometry* myCreateTexturedQuadGeometry(const osg::Vec3& pos,float width,flo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_SDL
|
#if USE_SDL || USE_SDL2
|
||||||
|
|
||||||
class SDLAudioSink : public osg::AudioSink
|
class SDLAudioSink : public osg::AudioSink
|
||||||
{
|
{
|
||||||
@@ -508,11 +508,11 @@ int main(int argc, char** argv)
|
|||||||
osg::Vec3 bottomright = pos;
|
osg::Vec3 bottomright = pos;
|
||||||
|
|
||||||
bool xyPlane = fullscreen;
|
bool xyPlane = fullscreen;
|
||||||
|
|
||||||
bool useAudioSink = false;
|
bool useAudioSink = false;
|
||||||
while(arguments.read("--audio")) { useAudioSink = true; }
|
while(arguments.read("--audio")) { useAudioSink = true; }
|
||||||
|
|
||||||
#if USE_SDL
|
#if USE_SDL || USE_SDL2
|
||||||
unsigned int numAudioStreamsEnabled = 0;
|
unsigned int numAudioStreamsEnabled = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -522,18 +522,18 @@ int main(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
osg::Image* image = osgDB::readImageFile(arguments[i]);
|
osg::Image* image = osgDB::readImageFile(arguments[i]);
|
||||||
osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
|
osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
|
||||||
if (imagestream)
|
if (imagestream)
|
||||||
{
|
{
|
||||||
osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams();
|
osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams();
|
||||||
if (useAudioSink && !audioStreams.empty())
|
if (useAudioSink && !audioStreams.empty())
|
||||||
{
|
{
|
||||||
osg::AudioStream* audioStream = audioStreams[0].get();
|
osg::AudioStream* audioStream = audioStreams[0].get();
|
||||||
osg::notify(osg::NOTICE)<<"AudioStream read ["<<audioStream->getName()<<"]"<<std::endl;
|
osg::notify(osg::NOTICE)<<"AudioStream read ["<<audioStream->getName()<<"]"<<std::endl;
|
||||||
#if USE_SDL
|
#if USE_SDL || USE_SDL2
|
||||||
if (numAudioStreamsEnabled==0)
|
if (numAudioStreamsEnabled==0)
|
||||||
{
|
{
|
||||||
audioStream->setAudioSink(new SDLAudioSink(audioStream));
|
audioStream->setAudioSink(new SDLAudioSink(audioStream));
|
||||||
|
|
||||||
++numAudioStreamsEnabled;
|
++numAudioStreamsEnabled;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -551,7 +551,7 @@ int main(int argc, char** argv)
|
|||||||
float height = image->t();
|
float height = image->t();
|
||||||
|
|
||||||
osg::ref_ptr<osg::Drawable> drawable = myCreateTexturedQuadGeometry(pos, width, height,image, useTextureRectangle, xyPlane, flip);
|
osg::ref_ptr<osg::Drawable> drawable = myCreateTexturedQuadGeometry(pos, width, height,image, useTextureRectangle, xyPlane, flip);
|
||||||
|
|
||||||
if (image->isImageTranslucent())
|
if (image->isImageTranslucent())
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Transparent movie, enabling blending."<<std::endl;
|
osg::notify(osg::NOTICE)<<"Transparent movie, enabling blending."<<std::endl;
|
||||||
@@ -606,22 +606,22 @@ int main(int argc, char** argv)
|
|||||||
if (fullscreen)
|
if (fullscreen)
|
||||||
{
|
{
|
||||||
viewer.realize();
|
viewer.realize();
|
||||||
|
|
||||||
viewer.getCamera()->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
|
viewer.getCamera()->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
|
||||||
|
|
||||||
float screenAspectRatio = 1280.0f/1024.0f;
|
float screenAspectRatio = 1280.0f/1024.0f;
|
||||||
|
|
||||||
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
|
||||||
if (wsi)
|
if (wsi)
|
||||||
{
|
{
|
||||||
unsigned int width, height;
|
unsigned int width, height;
|
||||||
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
|
||||||
|
|
||||||
screenAspectRatio = float(width) / float(height);
|
screenAspectRatio = float(width) / float(height);
|
||||||
}
|
}
|
||||||
|
|
||||||
float modelAspectRatio = (bottomright.x()-topleft.x())/(bottomright.y()-topleft.y());
|
float modelAspectRatio = (bottomright.x()-topleft.x())/(bottomright.y()-topleft.y());
|
||||||
|
|
||||||
viewer.getCamera()->setViewMatrix(osg::Matrix::identity());
|
viewer.getCamera()->setViewMatrix(osg::Matrix::identity());
|
||||||
|
|
||||||
|
|
||||||
@@ -659,7 +659,7 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USE_SDL
|
#if USE_SDL || USE_SDL2
|
||||||
|
|
||||||
#include "SDL.h"
|
#include "SDL.h"
|
||||||
|
|
||||||
@@ -699,22 +699,51 @@ void SDLAudioSink::play()
|
|||||||
osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl;
|
osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl;
|
||||||
osg::notify(osg::NOTICE)<<" audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl;
|
osg::notify(osg::NOTICE)<<" audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SDL_AudioSpec specs = { 0 };
|
SDL_AudioSpec specs = { 0 };
|
||||||
SDL_AudioSpec wanted_specs = { 0 };
|
SDL_AudioSpec wanted_specs = { 0 };
|
||||||
|
|
||||||
wanted_specs.freq = _audioStream->audioFrequency();
|
wanted_specs.freq = _audioStream->audioFrequency();
|
||||||
wanted_specs.format = AUDIO_S16SYS;
|
|
||||||
wanted_specs.channels = _audioStream->audioNbChannels();
|
wanted_specs.channels = _audioStream->audioNbChannels();
|
||||||
wanted_specs.silence = 0;
|
wanted_specs.silence = 0;
|
||||||
wanted_specs.samples = 1024;
|
wanted_specs.samples = 1024;
|
||||||
wanted_specs.callback = soundReadCallback;
|
wanted_specs.callback = soundReadCallback;
|
||||||
wanted_specs.userdata = this;
|
wanted_specs.userdata = this;
|
||||||
|
wanted_specs.format = 0;
|
||||||
|
|
||||||
if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
|
#if SDL_MAJOR_VERSION>=2
|
||||||
throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")";
|
switch(_audioStream->audioSampleFormat())
|
||||||
|
{
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_U8): { wanted_specs.format = AUDIO_U8; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_U8"<<std::endl; break;}
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S16): { wanted_specs.format = AUDIO_S16SYS; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S16"<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S24): { OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S24 NOT Supported by SDL."<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S32): { wanted_specs.format = AUDIO_S32SYS; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S32"<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_F32): { wanted_specs.format = AUDIO_F32SYS; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_F32"<<std::endl; break; }
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
switch(_audioStream->audioSampleFormat())
|
||||||
|
{
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_U8): { wanted_specs.format = AUDIO_U8; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_U8"<<std::endl; break;}
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S16): { wanted_specs.format = AUDIO_S16SYS; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S16"<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S24): { OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S24 NOT Supported by SDL1.x."<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_S32): { OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_S32 NOT Supported by SDL1.x"<<std::endl; break; }
|
||||||
|
case(osg::AudioStream::SAMPLE_FORMAT_F32): { OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_F32 NOT Supported by SDL1.x"<<std::endl; break; }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_PauseAudio(0);
|
if (wanted_specs.format!=0)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
|
||||||
|
throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")";
|
||||||
|
|
||||||
|
SDL_PauseAudio(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw "SDL_OpenAudio() does not support audio format";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDLAudioSink::pause()
|
void SDLAudioSink::pause()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <osg/TextureRectangle>
|
#include <osg/TextureRectangle>
|
||||||
#include <osg/ColorMask>
|
#include <osg/ColorMask>
|
||||||
#include <osg/Material>
|
#include <osg/Material>
|
||||||
|
#include <osg/Capability>
|
||||||
|
|
||||||
#include <osgGA/TrackballManipulator>
|
#include <osgGA/TrackballManipulator>
|
||||||
#include <osgGA/FlightManipulator>
|
#include <osgGA/FlightManipulator>
|
||||||
@@ -354,6 +355,12 @@ osg::Node* createScene(osg::Node* cam_subgraph, unsigned int tex_width, unsigned
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// test for new glEnablei/glDisablei functionality.
|
||||||
|
camera->getOrCreateStateSet()->setAttribute(new osg::Enablei(GL_BLEND, 0));
|
||||||
|
camera->getOrCreateStateSet()->setAttribute(new osg::Disablei(GL_BLEND, 1));
|
||||||
|
#endif
|
||||||
|
|
||||||
// we can also read back any of the targets as an image, modify this image and push it back
|
// we can also read back any of the targets as an image, modify this image and push it back
|
||||||
if (useImage) {
|
if (useImage) {
|
||||||
// which texture to get the image from
|
// which texture to get the image from
|
||||||
|
|||||||
@@ -39,22 +39,22 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
// load the nodes from the commandline arguments.
|
// load the nodes from the commandline arguments.
|
||||||
osg::Node* rootnode = osgDB::readNodeFiles(arguments);
|
osg::Node* rootnode = osgDB::readNodeFiles(arguments);
|
||||||
|
|
||||||
// if not loaded assume no arguments passed in, try use default mode instead.
|
// if not loaded assume no arguments passed in, try use default mode instead.
|
||||||
if (!rootnode) rootnode = osgDB::readNodeFile("cessnafire.osgt");
|
if (!rootnode) rootnode = osgDB::readNodeFile("cessnafire.osgt");
|
||||||
|
|
||||||
if (!rootnode)
|
if (!rootnode)
|
||||||
{
|
{
|
||||||
osg::notify(osg::NOTICE)<<"Please specify a model filename on the command line."<<std::endl;
|
osg::notify(osg::NOTICE)<<"Please specify a model filename on the command line."<<std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::Image* image = osgDB::readImageFile("Images/reflect.rgb");
|
osg::Image* image = osgDB::readImageFile("Images/reflect.rgb");
|
||||||
if (image)
|
if (image)
|
||||||
{
|
{
|
||||||
@@ -72,7 +72,7 @@ int main( int argc, char **argv )
|
|||||||
stateset->setTextureAttributeAndModes(1,texture,osg::StateAttribute::ON);
|
stateset->setTextureAttributeAndModes(1,texture,osg::StateAttribute::ON);
|
||||||
stateset->setTextureAttributeAndModes(1,texgen,osg::StateAttribute::ON);
|
stateset->setTextureAttributeAndModes(1,texgen,osg::StateAttribute::ON);
|
||||||
stateset->setTextureAttribute(1,texenv);
|
stateset->setTextureAttribute(1,texenv);
|
||||||
|
|
||||||
rootnode->setStateSet(stateset);
|
rootnode->setStateSet(stateset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -83,21 +83,21 @@ int main( int argc, char **argv )
|
|||||||
// run optimization over the scene graph
|
// run optimization over the scene graph
|
||||||
osgUtil::Optimizer optimzer;
|
osgUtil::Optimizer optimzer;
|
||||||
optimzer.optimize(rootnode);
|
optimzer.optimize(rootnode);
|
||||||
|
|
||||||
// add a viewport to the viewer and attach the scene graph.
|
// add a viewport to the viewer and attach the scene graph.
|
||||||
viewer.setSceneData( rootnode );
|
viewer.setSceneData( rootnode );
|
||||||
|
|
||||||
// create the windows and run the threads.
|
// create the windows and run the threads.
|
||||||
viewer.realize();
|
viewer.realize();
|
||||||
|
|
||||||
for(unsigned int contextID = 0;
|
for(unsigned int contextID = 0;
|
||||||
contextID<osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts();
|
contextID<osg::DisplaySettings::instance()->getMaxNumberOfGraphicsContexts();
|
||||||
++contextID)
|
++contextID)
|
||||||
{
|
{
|
||||||
osg::Texture::Extensions* textExt = osg::Texture::getExtensions(contextID,false);
|
osg::GLExtensions* textExt = osg::GLExtensions::Get(contextID,false);
|
||||||
if (textExt)
|
if (textExt)
|
||||||
{
|
{
|
||||||
if (!textExt->isMultiTexturingSupported())
|
if (!textExt->isMultiTexturingSupported)
|
||||||
{
|
{
|
||||||
std::cout<<"Warning: multi-texturing not supported by OpenGL drivers, unable to run application."<<std::endl;
|
std::cout<<"Warning: multi-texturing not supported by OpenGL drivers, unable to run application."<<std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -401,7 +401,7 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
|
|
||||||
// we must assign callback as both an update and cull callback, as update callback to do the update of
|
// we must assign callback as both an update and cull callback, as update callback to do the update of
|
||||||
// the the osgFX::MultiTextureControl node a thread safe way, and as a cull callback to gather the camera
|
// the osgFX::MultiTextureControl node a thread safe way, and as a cull callback to gather the camera
|
||||||
// position information.
|
// position information.
|
||||||
ElevationLayerBlendingCallback* elbc = new ElevationLayerBlendingCallback(mtc, elevations);
|
ElevationLayerBlendingCallback* elbc = new ElevationLayerBlendingCallback(mtc, elevations);
|
||||||
terrain->setUpdateCallback(elbc);
|
terrain->setUpdateCallback(elbc);
|
||||||
|
|||||||
@@ -98,9 +98,11 @@ osg::Camera* createHUD(unsigned int w, unsigned int h)
|
|||||||
|
|
||||||
class TestMultiTouchEventHandler : public osgGA::GUIEventHandler {
|
class TestMultiTouchEventHandler : public osgGA::GUIEventHandler {
|
||||||
public:
|
public:
|
||||||
TestMultiTouchEventHandler(osg::Group* parent_group)
|
TestMultiTouchEventHandler(osg::Group* parent_group, float w, float h)
|
||||||
: osgGA::GUIEventHandler(),
|
: osgGA::GUIEventHandler(),
|
||||||
_cleanupOnNextFrame(false)
|
_cleanupOnNextFrame(false),
|
||||||
|
_w(w),
|
||||||
|
_h(h)
|
||||||
{
|
{
|
||||||
createTouchRepresentations(parent_group, 10);
|
createTouchRepresentations(parent_group, 10);
|
||||||
}
|
}
|
||||||
@@ -149,6 +151,18 @@ private:
|
|||||||
|
|
||||||
virtual bool handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa, osg::Object *, osg::NodeVisitor *)
|
virtual bool handle (const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa, osg::Object *, osg::NodeVisitor *)
|
||||||
{
|
{
|
||||||
|
if (ea.getEventType() != osgGA::GUIEventAdapter::FRAME) {
|
||||||
|
std::cout << ea.getTime() << ": ";
|
||||||
|
switch(ea.getEventType()) {
|
||||||
|
case osgGA::GUIEventAdapter::PUSH: std::cout << "PUSH"; break;
|
||||||
|
case osgGA::GUIEventAdapter::DRAG: std::cout << "DRAG"; break;
|
||||||
|
case osgGA::GUIEventAdapter::MOVE: std::cout << "MOVE"; break;
|
||||||
|
case osgGA::GUIEventAdapter::RELEASE: std::cout << "RELEASE"; break;
|
||||||
|
default: std::cout << ea.getEventType();
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
switch(ea.getEventType())
|
switch(ea.getEventType())
|
||||||
{
|
{
|
||||||
case osgGA::GUIEventAdapter::FRAME:
|
case osgGA::GUIEventAdapter::FRAME:
|
||||||
@@ -174,7 +188,12 @@ private:
|
|||||||
for(osgGA::GUIEventAdapter::TouchData::iterator i = ea.getTouchData()->begin(); i != ea.getTouchData()->end(); ++i, ++j)
|
for(osgGA::GUIEventAdapter::TouchData::iterator i = ea.getTouchData()->begin(); i != ea.getTouchData()->end(); ++i, ++j)
|
||||||
{
|
{
|
||||||
const osgGA::GUIEventAdapter::TouchData::TouchPoint& tp = (*i);
|
const osgGA::GUIEventAdapter::TouchData::TouchPoint& tp = (*i);
|
||||||
_mats[j]->setMatrix(osg::Matrix::translate(tp.x, ea.getWindowHeight() - tp.y, 0));
|
float x = ea.getTouchPointNormalizedX(j);
|
||||||
|
float y = ea.getTouchPointNormalizedY(j);
|
||||||
|
|
||||||
|
// std::cout << j << ": " << tp.x << "/" << tp.y <<" "<< x << " " << y << " " << _w << " " << _h << std::endl;
|
||||||
|
|
||||||
|
_mats[j]->setMatrix(osg::Matrix::translate((1+x) * 0.5 * _w, (1+y) * 0.5 * _h, 0));
|
||||||
_mats[j]->setNodeMask(0xffff);
|
_mats[j]->setNodeMask(0xffff);
|
||||||
|
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
@@ -238,6 +257,8 @@ private:
|
|||||||
std::vector<osg::MatrixTransform*> _mats;
|
std::vector<osg::MatrixTransform*> _mats;
|
||||||
std::vector<osgText::Text*> _texts;
|
std::vector<osgText::Text*> _texts;
|
||||||
bool _cleanupOnNextFrame;
|
bool _cleanupOnNextFrame;
|
||||||
|
|
||||||
|
float _w, _h;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -246,7 +267,21 @@ int main( int argc, char **argv )
|
|||||||
{
|
{
|
||||||
// use an ArgumentParser object to manage the program arguments.
|
// use an ArgumentParser object to manage the program arguments.
|
||||||
osg::ArgumentParser arguments(&argc,argv);
|
osg::ArgumentParser arguments(&argc,argv);
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int helpType = 0;
|
||||||
|
if ((helpType = arguments.readHelpType()))
|
||||||
|
{
|
||||||
|
arguments.getApplicationUsage()->write(std::cout, helpType);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// report any errors if they have occurred when parsing the program arguments.
|
||||||
|
if (arguments.errors())
|
||||||
|
{
|
||||||
|
arguments.writeErrorMessages(std::cout);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// read the scene from the list of file specified commandline args.
|
// read the scene from the list of file specified commandline args.
|
||||||
osg::ref_ptr<osg::Node> scene = osgDB::readNodeFiles(arguments);
|
osg::ref_ptr<osg::Node> scene = osgDB::readNodeFiles(arguments);
|
||||||
@@ -265,7 +300,19 @@ int main( int argc, char **argv )
|
|||||||
|
|
||||||
|
|
||||||
// construct the viewer.
|
// construct the viewer.
|
||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer(arguments);
|
||||||
|
|
||||||
|
|
||||||
|
//opening devices
|
||||||
|
std::string device;
|
||||||
|
while(arguments.read("--device", device))
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osgGA::Device> dev = osgDB::readFile<osgGA::Device>(device);
|
||||||
|
if (dev.valid())
|
||||||
|
{
|
||||||
|
viewer.addDevice(dev.get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
osg::ref_ptr<osg::Group> group = new osg::Group;
|
osg::ref_ptr<osg::Group> group = new osg::Group;
|
||||||
@@ -288,7 +335,7 @@ int main( int argc, char **argv )
|
|||||||
osg::Camera* hud_camera = createHUD(gc->getTraits()->width, gc->getTraits()->height);
|
osg::Camera* hud_camera = createHUD(gc->getTraits()->width, gc->getTraits()->height);
|
||||||
|
|
||||||
|
|
||||||
viewer.addEventHandler(new TestMultiTouchEventHandler(hud_camera));
|
viewer.addEventHandler(new TestMultiTouchEventHandler(hud_camera, gc->getTraits()->width, gc->getTraits()->height));
|
||||||
|
|
||||||
|
|
||||||
group->addChild(hud_camera);
|
group->addChild(hud_camera);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* OpenSceneGraph example, osganimate.
|
/* OpenSceneGraph example, osgocclusionquery.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user