Compare commits
746
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f7e91f1f08 | ||
|
|
2d77178ba3 | ||
|
|
b38e6d8bf3 | ||
|
|
b601cdb6a5 | ||
|
|
2803154213 | ||
|
|
ae5297e6d7 | ||
|
|
fa7490fb38 | ||
|
|
bad80521a8 | ||
|
|
8303e30033 | ||
|
|
27de1e271e | ||
|
|
98cecfe940 | ||
|
|
2e65538fb5 | ||
|
|
e6371cbf9c | ||
|
|
0b8b6ac56a | ||
|
|
cc17cc4af7 | ||
|
|
6afd7e1a38 | ||
|
|
91e22c1fb3 | ||
|
|
ad6129816d | ||
|
|
409db9d7ef | ||
|
|
2ccd58e917 | ||
|
|
7585ad430a | ||
|
|
c105c5a449 | ||
|
|
54065b59a1 | ||
|
|
f9250ae522 | ||
|
|
2f8621ed3d | ||
|
|
98a3e7cffa | ||
|
|
d7f2966216 | ||
|
|
8687b214e7 | ||
|
|
f5f1f0da8e | ||
|
|
818359bfd0 | ||
|
|
8174005ac8 | ||
|
|
0180cae8c3 | ||
|
|
dd1ea541ec | ||
|
|
19aac5b14c | ||
|
|
f3f8a211cd | ||
|
|
3edcbc3b99 | ||
|
|
5a1cc8745e | ||
|
|
12495547c4 | ||
|
|
ff654ab094 | ||
|
|
e55f55cd3e | ||
|
|
29aad066f0 | ||
|
|
74d3bdc68c | ||
|
|
7f9b3a8666 | ||
|
|
426f6de16f | ||
|
|
cf19b81dd4 | ||
|
|
d4c7e95092 | ||
|
|
aa07b5bdd8 | ||
|
|
c7cbb22667 | ||
|
|
ff72b68731 | ||
|
|
433be0e46b | ||
|
|
900607034e | ||
|
|
733e6fa14f | ||
|
|
cd72eb20c6 | ||
|
|
d754e616a5 | ||
|
|
d613e0a488 | ||
|
|
942fa53ed9 | ||
|
|
1729841083 | ||
|
|
315d83bc88 | ||
|
|
223aa0ccd5 | ||
|
|
38494a48d8 | ||
|
|
38456bddb5 | ||
|
|
b8a12b0e5b | ||
|
|
2d37c0aa42 | ||
|
|
c8c693db53 | ||
|
|
cdff0fceea | ||
|
|
3b6f47aea1 | ||
|
|
7bc37651c3 | ||
|
|
4fe43c3e50 | ||
|
|
0826b7c3ca | ||
|
|
d219c5c4c6 | ||
|
|
1a498348ee | ||
|
|
c6b03555f7 | ||
|
|
bb1a270532 | ||
|
|
69ea4b846a | ||
|
|
373a0e4a7d | ||
|
|
f4f5ab2392 | ||
|
|
b20b3229bf | ||
|
|
77fb93bb61 | ||
|
|
ec72b46dcb | ||
|
|
367f1813de | ||
|
|
74116057a7 | ||
|
|
9deb40216e | ||
|
|
daef76ec0b | ||
|
|
569a29fbbc | ||
|
|
0c06bfd3d9 | ||
|
|
8f46f2cac8 | ||
|
|
8f48515b80 | ||
|
|
c7dab4abea | ||
|
|
5e4c4725bc | ||
|
|
9861d74221 | ||
|
|
bb3b606820 | ||
|
|
09fb51189e | ||
|
|
bd19899bbc | ||
|
|
b69753fb76 | ||
|
|
9dc1b5f6f5 | ||
|
|
55c1ac36e3 | ||
|
|
c12e6cdc09 | ||
|
|
85562e8b95 | ||
|
|
fd34cc0b87 | ||
|
|
6322393782 | ||
|
|
1f9e954610 | ||
|
|
6491746809 | ||
|
|
6d2f1ff81e | ||
|
|
c724e5fb20 | ||
|
|
600726976c | ||
|
|
49b5c2058d | ||
|
|
21df21b144 | ||
|
|
620e71e800 | ||
|
|
db2216848d | ||
|
|
cfffe91ed5 | ||
|
|
a95aed1047 | ||
|
|
2883a36c76 | ||
|
|
ac4245013f | ||
|
|
b09e484492 | ||
|
|
dc63ddb010 | ||
|
|
09778a8eab | ||
|
|
8cbe9f1bd0 | ||
|
|
be61689458 | ||
|
|
4b63bc051e | ||
|
|
a098ba5e79 | ||
|
|
edee4b3fe5 | ||
|
|
0c9013e60e | ||
|
|
701c4bcf27 | ||
|
|
22f2fac56b | ||
|
|
605125c0e7 | ||
|
|
65d0ee126a | ||
|
|
4db6435090 | ||
|
|
4383fd3c45 | ||
|
|
b6be76b0ab | ||
|
|
92d8fa1193 | ||
|
|
9c51bf3edf | ||
|
|
cf0e4e6f8c | ||
|
|
c3719f35e3 | ||
|
|
0b1f074bcf | ||
|
|
7fe8514434 | ||
|
|
37c4dcf8ba | ||
|
|
e33dd3c499 | ||
|
|
94be52886e | ||
|
|
6646aa5644 | ||
|
|
d556eba296 | ||
|
|
a5b573b2d3 | ||
|
|
18d30ea8fa | ||
|
|
4324ffccf4 | ||
|
|
182ee9d7e4 | ||
|
|
68c1cfed46 | ||
|
|
1159784538 | ||
|
|
e683b5fdec | ||
|
|
3c409c5070 | ||
|
|
4b7361dfe7 | ||
|
|
037d5c11a5 | ||
|
|
95d857e091 | ||
|
|
4efa087cd1 | ||
|
|
60f0003436 | ||
|
|
fdb265cd6e | ||
|
|
34704a17f2 | ||
|
|
4a959ec2fd | ||
|
|
f182886fce | ||
|
|
2fbaddbecf | ||
|
|
cafcecf03d | ||
|
|
49473845cf | ||
|
|
d4d4ed22a0 | ||
|
|
240ed6f0b1 | ||
|
|
084a24e958 | ||
|
|
cd9e3648e9 | ||
|
|
7ed51be4e6 | ||
|
|
0c8358ae67 | ||
|
|
25cefd9129 | ||
|
|
af75c0ca0c | ||
|
|
a91b2629d3 | ||
|
|
de9070dba1 | ||
|
|
813b518b6f | ||
|
|
c47e800f60 | ||
|
|
8398f45d43 | ||
|
|
aeaaa50f6c | ||
|
|
f33ce846b8 | ||
|
|
4718b9dc07 | ||
|
|
fba00f7c5a | ||
|
|
3360383fd7 | ||
|
|
6c30f62693 | ||
|
|
ab5b0382da | ||
|
|
671f3f5890 | ||
|
|
9bae445624 | ||
|
|
30529ccdf5 | ||
|
|
a8a02d3a2e | ||
|
|
5da33ca244 | ||
|
|
04c1e95f08 | ||
|
|
2186fc1fc7 | ||
|
|
fb49a9192e | ||
|
|
ccbc5abec6 | ||
|
|
7aa6fd479d | ||
|
|
3fcc16c1a0 | ||
|
|
b3e0298189 | ||
|
|
7e1fe7d852 | ||
|
|
5d7d77d4b6 | ||
|
|
418856769b | ||
|
|
46a32dd3ee | ||
|
|
ecb4dc57b4 | ||
|
|
89d426470b | ||
|
|
23c7a1b5b7 | ||
|
|
3b21e9434f | ||
|
|
d4a4428e64 | ||
|
|
2dfc057135 | ||
|
|
a25eebef9b | ||
|
|
741c4ca15a | ||
|
|
0bcdf2e4dc | ||
|
|
cd5a720211 | ||
|
|
5cb04946b0 | ||
|
|
c8953c6275 | ||
|
|
e8dc9c9454 | ||
|
|
a0c325681f | ||
|
|
8d3bf19422 | ||
|
|
4477867ef4 | ||
|
|
e696c884dc | ||
|
|
80bcaa49e6 | ||
|
|
0096c1bb02 | ||
|
|
38b37a068d | ||
|
|
0281f31df2 | ||
|
|
40b182c550 | ||
|
|
d1dedc7511 | ||
|
|
04cd9b3eb6 | ||
|
|
de6003367d | ||
|
|
a5f42eeddf | ||
|
|
a8ba041b67 | ||
|
|
e700fc6f34 | ||
|
|
af29d3d257 | ||
|
|
487701a143 | ||
|
|
f32e037c58 | ||
|
|
8bd903dd96 | ||
|
|
560c100484 | ||
|
|
52444d177b | ||
|
|
b4f7ff29ef | ||
|
|
f7c6a5bfa2 | ||
|
|
6fe14f7a6b | ||
|
|
786e5addd8 | ||
|
|
2e9a15f523 | ||
|
|
bb0d2ddc53 | ||
|
|
702fb014a5 | ||
|
|
834eab9457 | ||
|
|
a85da04601 | ||
|
|
414f1c27e4 | ||
|
|
c76e2eb900 | ||
|
|
c523e15302 | ||
|
|
2dc8de295d | ||
|
|
d645fd6327 | ||
|
|
219a7f3a07 | ||
|
|
d95e3e0055 | ||
|
|
2cc31ff425 | ||
|
|
8258fd7d9f | ||
|
|
784cca2233 | ||
|
|
436539a700 | ||
|
|
dcb3da9f28 | ||
|
|
a354c841f1 | ||
|
|
3824f064cd | ||
|
|
cba6db752b | ||
|
|
a458e26581 | ||
|
|
9d68727a84 | ||
|
|
38b9a874e0 | ||
|
|
7a680fb9f2 | ||
|
|
a5f9262adb | ||
|
|
b05e32fa8c | ||
|
|
53d8cff835 | ||
|
|
00fe97ff88 | ||
|
|
607511fd64 | ||
|
|
8663c265d8 | ||
|
|
6c5d35d6ce | ||
|
|
95532cb318 | ||
|
|
4d91bc5908 | ||
|
|
b13900402d | ||
|
|
1bb6c03bd0 | ||
|
|
1445949e31 | ||
|
|
360d3834ca | ||
|
|
aacdcad529 | ||
|
|
ad9341835f | ||
|
|
b028adb6af | ||
|
|
39f683b272 | ||
|
|
a6c46c89eb | ||
|
|
d534cf6f02 | ||
|
|
dd4326f7c4 | ||
|
|
40aecd688e | ||
|
|
63730a6e2c | ||
|
|
4d4d26aef8 | ||
|
|
de6b32d8c6 | ||
|
|
a0af7f0524 | ||
|
|
c043bd3422 | ||
|
|
18ae1d6940 | ||
|
|
d6f64f9773 | ||
|
|
db99a4cb90 | ||
|
|
108689661f | ||
|
|
d3e00dba8e | ||
|
|
fcd33e5035 | ||
|
|
af9082cd9f | ||
|
|
6a0bb18fca | ||
|
|
8aa8d87781 | ||
|
|
4998af8d7a | ||
|
|
c6aa95f3f3 | ||
|
|
481be29366 | ||
|
|
3617b6ad8c | ||
|
|
3fb8e19a38 | ||
|
|
2ea2f1b4f2 | ||
|
|
26cb8ec4f1 | ||
|
|
7fe56bea86 | ||
|
|
11b16b8a86 | ||
|
|
de020ee695 | ||
|
|
3b83487611 | ||
|
|
09bab4f162 | ||
|
|
49fcc799ca | ||
|
|
10bc803775 | ||
|
|
4f40770fc6 | ||
|
|
a4495c6ef1 | ||
|
|
67d837c4ec | ||
|
|
138825af6d | ||
|
|
c093841336 | ||
|
|
2df1da4226 | ||
|
|
2792d60e2d | ||
|
|
656a3ace07 | ||
|
|
aec8e88c14 | ||
|
|
bdd5ca140d | ||
|
|
8b3b0def03 | ||
|
|
6440ece177 | ||
|
|
bd3518637c | ||
|
|
aef2a1c484 | ||
|
|
a4b28e5737 | ||
|
|
a3bc2eb836 | ||
|
|
3059da5805 | ||
|
|
18d5a492c8 | ||
|
|
160b0ea7d9 | ||
|
|
4dd1267bea | ||
|
|
b5c4328682 | ||
|
|
571fc69ef4 | ||
|
|
f51595cfc9 | ||
|
|
d54aea0036 | ||
|
|
51bb2974bc | ||
|
|
7a859061fd | ||
|
|
cefa9fcd75 | ||
|
|
d3bacd0b73 | ||
|
|
b94a98fc90 | ||
|
|
e0b2687231 | ||
|
|
cc6179a4dd | ||
|
|
e947bac4a3 | ||
|
|
11ecbb6ca7 | ||
|
|
322789cd4c | ||
|
|
f28464dba0 | ||
|
|
8f6456b1f8 | ||
|
|
1f32786c82 | ||
|
|
829c729ee9 | ||
|
|
5d3aacb892 | ||
|
|
741e9c5ed5 | ||
|
|
1408c1b623 | ||
|
|
c256f8d09e | ||
|
|
55c018c525 | ||
|
|
3fa94b5143 | ||
|
|
5127e2f89c | ||
|
|
3175fa3aca | ||
|
|
5614174b39 | ||
|
|
39fc52fe0a | ||
|
|
81188705b1 | ||
|
|
63c4873d8a | ||
|
|
1a85dcd890 | ||
|
|
27470fc504 | ||
|
|
65d18445d3 | ||
|
|
84dd54b33a | ||
|
|
7c410d36e3 | ||
|
|
98a603a570 | ||
|
|
5876052170 | ||
|
|
f8303b4623 | ||
|
|
20005a7a22 | ||
|
|
4f0bfbab21 | ||
|
|
811442832e | ||
|
|
40811311d7 | ||
|
|
198de211f8 | ||
|
|
9f5412fa9d | ||
|
|
0dc9de81ae | ||
|
|
5b8f42ce5e | ||
|
|
5314274ed6 | ||
|
|
c831856711 | ||
|
|
1bade6d796 | ||
|
|
629a4a950e | ||
|
|
aebb1f6ec8 | ||
|
|
6e42bc55e0 | ||
|
|
1235fba7ee | ||
|
|
7a459db022 | ||
|
|
607987def5 | ||
|
|
397ec62180 | ||
|
|
9315210fbe | ||
|
|
5127990a43 | ||
|
|
40ad2b155a | ||
|
|
a0412d026c | ||
|
|
7d2134c488 | ||
|
|
d894f52b97 | ||
|
|
735f475c24 | ||
|
|
353dd73e24 | ||
|
|
49fe06498a | ||
|
|
bc95ec8084 | ||
|
|
f79906bf16 | ||
|
|
b3262fcb80 | ||
|
|
52b8f924aa | ||
|
|
52f57160aa | ||
|
|
6d4f23919c | ||
|
|
899623f71b | ||
|
|
c5d677ac7b | ||
|
|
c75270a9fc | ||
|
|
1588a379eb | ||
|
|
72d2075828 | ||
|
|
e99c682637 | ||
|
|
c815f70831 | ||
|
|
0da50eaa79 | ||
|
|
b0af84a549 | ||
|
|
b9631e8521 | ||
|
|
f664f7a201 | ||
|
|
f72b3882c3 | ||
|
|
ea47a2973c | ||
|
|
04be9ca670 | ||
|
|
6f0baf6ca9 | ||
|
|
1f5ec6b8d5 | ||
|
|
a2a91520aa | ||
|
|
fd7b5d3de7 | ||
|
|
30ea844c43 | ||
|
|
efac53b121 | ||
|
|
73c0ef59c1 | ||
|
|
7e65ab2d3b | ||
|
|
fec769f632 | ||
|
|
90e42642b6 | ||
|
|
9d9610a882 | ||
|
|
1fc81f4b66 | ||
|
|
4f0b1e847c | ||
|
|
9567ac32f2 | ||
|
|
8dd9cfa2a6 | ||
|
|
dbda8ef893 | ||
|
|
cd143c15d5 | ||
|
|
509a388ccc | ||
|
|
76c6482495 | ||
|
|
010a44f831 | ||
|
|
e6b0d644d4 | ||
|
|
02dc68c899 | ||
|
|
11ac97cd09 | ||
|
|
61f6565321 | ||
|
|
55d951f211 | ||
|
|
143ce6fcd5 | ||
|
|
e264c6ad2e | ||
|
|
036b6785f1 | ||
|
|
caf5cc90ae | ||
|
|
b05e98b1b6 | ||
|
|
31d0779377 | ||
|
|
6b056e915e | ||
|
|
9d6c0dc580 | ||
|
|
6e973e07f4 | ||
|
|
c8098b9eac | ||
|
|
ed20ce388a | ||
|
|
33e01e431d | ||
|
|
7d631e4959 | ||
|
|
29eb566448 | ||
|
|
a770d2a972 | ||
|
|
688cffb031 | ||
|
|
2cccc26541 | ||
|
|
f96f083bb5 | ||
|
|
2e078aff7d | ||
|
|
bd1f192dc4 | ||
|
|
b62f241051 | ||
|
|
95d1ac354e | ||
|
|
54728f5d57 | ||
|
|
d9356b0f86 | ||
|
|
6b68d9d90b | ||
|
|
359a8c4a81 | ||
|
|
dcb95d131b | ||
|
|
f4e37ba7c0 | ||
|
|
1cbceec0e1 | ||
|
|
5b3c5407a1 | ||
|
|
27a120c7c3 | ||
|
|
375f3e8bc1 | ||
|
|
a75b4af374 | ||
|
|
b2a4cd488d | ||
|
|
1d8d203e9e | ||
|
|
4e7fe460a5 | ||
|
|
9be14a63b1 | ||
|
|
afd3c76088 | ||
|
|
6b697506c3 | ||
|
|
3eba296157 | ||
|
|
1b51de08f5 | ||
|
|
3e37f3fa54 | ||
|
|
a18679e95d | ||
|
|
0154f81e33 | ||
|
|
366931952b | ||
|
|
606fc352aa | ||
|
|
75f817b39c | ||
|
|
0bc49bf244 | ||
|
|
930a84b459 | ||
|
|
21c89e8163 | ||
|
|
b3770cd26c | ||
|
|
0cd4d44bd3 | ||
|
|
af15e73e64 | ||
|
|
33f176b8f9 | ||
|
|
42f21972fd | ||
|
|
2d79e54c46 | ||
|
|
224408b0e8 | ||
|
|
610e447d7c | ||
|
|
c2c0e19305 | ||
|
|
e8c4b0d57c | ||
|
|
36e7684d9a | ||
|
|
795c079af0 | ||
|
|
94e1d3f0fc | ||
|
|
1df002de81 | ||
|
|
b7115659b3 | ||
|
|
258ec6b89a | ||
|
|
d1ecdfc510 | ||
|
|
a807e66d4a | ||
|
|
8f9921d00c | ||
|
|
99bc4e9a87 | ||
|
|
9289cfdde9 | ||
|
|
bedbe3caad | ||
|
|
2e329426ab | ||
|
|
4c68d03457 | ||
|
|
0911fa4fa2 | ||
|
|
c5737c5f74 | ||
|
|
106198fa20 | ||
|
|
4eb74a3c93 | ||
|
|
3f0bcc9568 | ||
|
|
f0c35fde6d | ||
|
|
8357eeb762 | ||
|
|
61da54d6ca | ||
|
|
efea47833d | ||
|
|
24ea08b6d3 | ||
|
|
2808b334ed | ||
|
|
96159cf739 | ||
|
|
577dfa4f54 | ||
|
|
66075d620e | ||
|
|
60f1d21914 | ||
|
|
b108621a59 | ||
|
|
4a4e703f16 | ||
|
|
61984730ac | ||
|
|
f196d3bab8 | ||
|
|
7da45cb49e | ||
|
|
e994305da6 | ||
|
|
2af37b484e | ||
|
|
faf41f7d96 | ||
|
|
7629e29397 | ||
|
|
1cff7fcfea | ||
|
|
694cf6e958 | ||
|
|
0e12fbb2a0 | ||
|
|
450ad45882 | ||
|
|
d674e50591 | ||
|
|
61f2f4b761 | ||
|
|
baa2f49b14 | ||
|
|
8c0bd234d8 | ||
|
|
c4fd41562f | ||
|
|
a1d1b4e49f | ||
|
|
96fb7a45f7 | ||
|
|
d5eedd2c65 | ||
|
|
fe4f907099 | ||
|
|
1b45eaf3de | ||
|
|
cfbc0a1579 | ||
|
|
db1b99d8dd | ||
|
|
65a880e9fa | ||
|
|
37b4005d3e | ||
|
|
70faa252e7 | ||
|
|
3620be8dbc | ||
|
|
21c64dd60f | ||
|
|
fb69d790ce | ||
|
|
debd066edd | ||
|
|
f58d81b1e9 | ||
|
|
8d507f161b | ||
|
|
b015f7c801 | ||
|
|
80abe952ba | ||
|
|
c12162407c | ||
|
|
7f5c3b223a | ||
|
|
2f3e4ebf39 | ||
|
|
2c14f8587e | ||
|
|
42224052e2 | ||
|
|
a8dd5aa0fc | ||
|
|
f3d0a9bc3f | ||
|
|
d629b9e36a | ||
|
|
4d54ba2200 | ||
|
|
0035ef9194 | ||
|
|
fcb20296d7 | ||
|
|
6bb9080017 | ||
|
|
bbde16dc08 | ||
|
|
ac9716f193 | ||
|
|
8a2bc1c21b | ||
|
|
942b474ad7 | ||
|
|
f3ef9b671f | ||
|
|
3538631e8e | ||
|
|
1577ab04e1 | ||
|
|
7f2dfaa5b4 | ||
|
|
fd126746f7 | ||
|
|
63f7e9feb0 | ||
|
|
5eb380e103 | ||
|
|
832e821919 | ||
|
|
197e3f144d | ||
|
|
056b5b41e2 | ||
|
|
15d40fd64a | ||
|
|
979d3da69c | ||
|
|
72984cc4a8 | ||
|
|
0a7a815124 | ||
|
|
1ce68a49c6 | ||
|
|
b1b6abf285 | ||
|
|
9dfd6970f1 | ||
|
|
3583c13339 | ||
|
|
00ab198c9f | ||
|
|
669d9a89ca | ||
|
|
9c54603726 | ||
|
|
dc09a50472 | ||
|
|
68eb7031e2 | ||
|
|
19623cac21 | ||
|
|
4ca25ca533 | ||
|
|
178c49a430 | ||
|
|
32e2cd9f06 | ||
|
|
7aa514d9ba | ||
|
|
7c2575d723 | ||
|
|
f93ea20d5e | ||
|
|
73cb6ff00d | ||
|
|
72267fa60b | ||
|
|
6b6a27e849 | ||
|
|
daea10121c | ||
|
|
999a1e514b | ||
|
|
be30960366 | ||
|
|
38e5084018 | ||
|
|
fdd9bb1af6 | ||
|
|
81546820ab | ||
|
|
84e87f0e8a | ||
|
|
901592a88e | ||
|
|
24f908d9be | ||
|
|
f62ff0ad66 | ||
|
|
8e0ecbeb8f | ||
|
|
095367f760 | ||
|
|
5d34eb12e0 | ||
|
|
d4e760efe1 | ||
|
|
75ab8e697b | ||
|
|
f4b05d46ed | ||
|
|
04c5f2c36a | ||
|
|
db50f95482 | ||
|
|
0e52a08a47 | ||
|
|
7b5d49ef60 | ||
|
|
430ba60b33 | ||
|
|
3af1f3bc63 | ||
|
|
bdcb94af81 | ||
|
|
2ea9e723c2 | ||
|
|
e19091d809 | ||
|
|
64ab59c0e0 | ||
|
|
4707b363aa | ||
|
|
1a72245c15 | ||
|
|
dea7b9050d | ||
|
|
3bd810fedc | ||
|
|
f9cbf8361d | ||
|
|
eccd4d0325 | ||
|
|
e0decf1233 | ||
|
|
100927f16c | ||
|
|
bb670f6658 | ||
|
|
d37992aaf9 | ||
|
|
9048ee533d | ||
|
|
2b1e5927ca | ||
|
|
b5e03030d1 | ||
|
|
65056bfa72 | ||
|
|
c50bb90374 | ||
|
|
ec4fc265e0 | ||
|
|
8ea41af5c4 | ||
|
|
966331dac7 | ||
|
|
cf056bace7 | ||
|
|
405a455906 | ||
|
|
3a8b431a5b | ||
|
|
3ce0c17237 | ||
|
|
61a2e0f104 | ||
|
|
7c44251216 | ||
|
|
26e70664d6 | ||
|
|
8ac27cc798 | ||
|
|
d314164fed | ||
|
|
d2cbed151b | ||
|
|
fc06ae58b2 | ||
|
|
a8768c78a2 | ||
|
|
ee8763f60d | ||
|
|
db633330fe | ||
|
|
c1ffafd663 | ||
|
|
72f35dc914 | ||
|
|
e5f82f53b9 | ||
|
|
e39e6893e0 | ||
|
|
9ab77d65f4 | ||
|
|
8ed96cad1d | ||
|
|
7795eb8239 | ||
|
|
207c7ab1e0 | ||
|
|
27af79684f | ||
|
|
6b61a8eed1 | ||
|
|
181e6eac75 | ||
|
|
fd1979857c | ||
|
|
448bc3facd | ||
|
|
97cabadb88 | ||
|
|
8e284a70b7 | ||
|
|
73f9febe06 | ||
|
|
6a6cc22e9c | ||
|
|
b293639b76 | ||
|
|
f06036be09 | ||
|
|
867571af78 | ||
|
|
f6314d3124 | ||
|
|
1e87dd7903 | ||
|
|
3b6af2f0c2 | ||
|
|
5bdff41641 | ||
|
|
67e9d105cb | ||
|
|
f1fc99f16f | ||
|
|
f89e359d53 | ||
|
|
77ec170a50 | ||
|
|
34320f5f20 | ||
|
|
a26271e46e | ||
|
|
e2e7466250 | ||
|
|
1e24cc4643 | ||
|
|
dfc23c3528 | ||
|
|
cd11a5dc27 | ||
|
|
899734296b | ||
|
|
7a3a81c152 | ||
|
|
e62a4a05ac | ||
|
|
463ca207ce | ||
|
|
da6e1b31ea | ||
|
|
8c783b1680 | ||
|
|
efce88ff12 | ||
|
|
01608b7e18 | ||
|
|
a5f0e0395a | ||
|
|
0b723174fd | ||
|
|
5d248bf0df | ||
|
|
c039ccdeb0 | ||
|
|
d88fb32a73 | ||
|
|
37ac409586 | ||
|
|
7b24e94c66 | ||
|
|
e12cd2a50c | ||
|
|
98b2ba4fc1 | ||
|
|
2f0afdccc1 | ||
|
|
79734df554 | ||
|
|
c52657fa1a | ||
|
|
9cac8409cd | ||
|
|
18703ce02d | ||
|
|
709a166bd6 | ||
|
|
8048e6297c | ||
|
|
fb0dded103 | ||
|
|
055e969e7a | ||
|
|
f10db8a30e | ||
|
|
c19af3525e | ||
|
|
7c60ccfc35 | ||
|
|
84cba33aab | ||
|
|
a52b1ec64f | ||
|
|
f30c4720ae | ||
|
|
7fc8c02688 | ||
|
|
54a7a0d534 | ||
|
|
8d73160a75 | ||
|
|
ff10602c65 | ||
|
|
ca50fe386d | ||
|
|
39f3c6e41d | ||
|
|
ba1b96e518 | ||
|
|
ef486b2cc6 | ||
|
|
06f3cb4f8e | ||
|
|
074f5ff996 | ||
|
|
8c26f32d5f |
@@ -22,7 +22,7 @@ PROJECT_NAME = SimGear
|
|||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 0.3.7
|
PROJECT_NUMBER = 1.99.5
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
@@ -303,16 +303,19 @@ INPUT = \
|
|||||||
simgear/compiler.h \
|
simgear/compiler.h \
|
||||||
simgear/constants.h \
|
simgear/constants.h \
|
||||||
simgear/debug \
|
simgear/debug \
|
||||||
|
simgear/environment \
|
||||||
simgear/ephemeris \
|
simgear/ephemeris \
|
||||||
simgear/io \
|
simgear/io \
|
||||||
simgear/magvar \
|
simgear/magvar \
|
||||||
simgear/math \
|
simgear/math \
|
||||||
simgear/misc \
|
simgear/misc \
|
||||||
|
simgear/nasal \
|
||||||
simgear/props \
|
simgear/props \
|
||||||
simgear/route \
|
simgear/route \
|
||||||
simgear/scene \
|
simgear/scene \
|
||||||
simgear/screen \
|
simgear/screen \
|
||||||
simgear/serial \
|
simgear/serial \
|
||||||
|
simgear/structure \
|
||||||
simgear/sg_inlines.h \
|
simgear/sg_inlines.h \
|
||||||
simgear/sg_traits.hxx \
|
simgear/sg_traits.hxx \
|
||||||
simgear/sound \
|
simgear/sound \
|
||||||
|
|||||||
+7
-2
@@ -4,13 +4,18 @@ EXTRA_DIST = \
|
|||||||
DoxygenMain.cxx \
|
DoxygenMain.cxx \
|
||||||
README.MSVC \
|
README.MSVC \
|
||||||
README.zlib \
|
README.zlib \
|
||||||
|
README.plib \
|
||||||
|
README.OpenAL \
|
||||||
|
README.OSG \
|
||||||
|
projects \
|
||||||
SimGear.dsp \
|
SimGear.dsp \
|
||||||
SimGear.dsw
|
SimGear.dsw
|
||||||
|
|
||||||
SUBDIRS = src-libs simgear
|
SUBDIRS = simgear
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
(cd $(top_srcdir); $(HOME)/Projects/FlightGear-0.9/admin/am2dsp.pl)
|
(cd $(top_srcdir); $(HOME)/Projects/FlightGear/admin/am2dsp.pl)
|
||||||
|
rm -rf `find $(distdir)/projects -name CVS`
|
||||||
|
|
||||||
#
|
#
|
||||||
# Rule to build RPM distribution package
|
# Rule to build RPM distribution package
|
||||||
|
|||||||
@@ -1,3 +1,87 @@
|
|||||||
|
Version 1.99.5
|
||||||
|
* October 30, 2008 (sourcecode snapshot release)
|
||||||
|
|
||||||
|
|
||||||
|
New in 0.3.10
|
||||||
|
* April 5, 2006
|
||||||
|
|
||||||
|
* Add a small accessor function to expose local timezone offset.
|
||||||
|
* Improved exception handling and made output more helpful in various places.
|
||||||
|
* Better pbuffer runtime detection.
|
||||||
|
* Add directory creation capability to file/path library.
|
||||||
|
* Added a basic reference counting class to improve robustness of
|
||||||
|
memory management in places. Use this for all scenegraph
|
||||||
|
references, sgmaterial references, sgmatmodel references, and
|
||||||
|
sgsoundsample references.
|
||||||
|
* Add support for point sprites.
|
||||||
|
* Updates to rain cone rendering.
|
||||||
|
* Add a new vector library and integrate that with improved coordinate
|
||||||
|
system conversion code.
|
||||||
|
* Mutex locking and cleanup improvements in the threading abstraction
|
||||||
|
library.
|
||||||
|
* Add MacOS RenderTexture support.
|
||||||
|
* Add a Nasal based io libarary that is not activated by default.
|
||||||
|
* Added a set of MS-VC8 project files.
|
||||||
|
|
||||||
|
* Various platform related bug fixes.
|
||||||
|
* Various compiler related bug/warning fixes.
|
||||||
|
* Clean up some things that triggered valgrind warnings.
|
||||||
|
* Fix a Nasal cmp() bug.
|
||||||
|
* Removed ancient version of zlib from distribution.
|
||||||
|
|
||||||
|
|
||||||
|
New in 0.3.9
|
||||||
|
* November 17, 2005
|
||||||
|
|
||||||
|
* Add support for OpenAL 1.1 (with a separate alut library.)
|
||||||
|
* Add support for volumetric shadows. Aircraft can cast shadows on themselves
|
||||||
|
as well as onto the ground (by Harald Johnsen.)
|
||||||
|
* New 3d volumetric clouds by Harald Johnsen (along with several rounds of
|
||||||
|
followup fixes and improvements.)
|
||||||
|
* Remove Mark Harris's old 3d clouds because they were never properly
|
||||||
|
integrated. And we now have new 3d clouds.
|
||||||
|
* Add support for seasonal textures (with a set of winter textures added
|
||||||
|
to FlightGear.)
|
||||||
|
* Updated Nasal scripting system. Adds several new syntax convenience
|
||||||
|
features, fixes parser bugs, fixes several internal bugs.
|
||||||
|
* Our 3d cockpit jitter problem is fixed (woohoo!)
|
||||||
|
* Add code to support rendering to a texture.
|
||||||
|
* Allow "tip" popups to pop themselves down after the appropriate
|
||||||
|
timeout, even if the sim time is paused.
|
||||||
|
* Various low model level animation fixes and additions ... color,
|
||||||
|
transparency, 'chrome' effects, randomized spin, etc.
|
||||||
|
* Create our own portable stdint.h implementation.
|
||||||
|
* Fixed several memory leaks.
|
||||||
|
* removeChildren() added to the property system.
|
||||||
|
* Fix many cases of 'const'.
|
||||||
|
* Fixes for cygwin, solaris/sun, Mac OS X, MSVC, gcc-3.4.x.
|
||||||
|
|
||||||
|
|
||||||
|
New in 0.3.8
|
||||||
|
* January 18, 2005
|
||||||
|
|
||||||
|
* Configure script does a sanity check for the existence of openal.
|
||||||
|
* Better pthreads detection for FreeBSD.
|
||||||
|
* Abstract out the location of gl.h, glu.h, and glut.h so we can more
|
||||||
|
easily support MacOS which puts these in an oddball location.
|
||||||
|
* Added two new debug output types for instrumentation and systems.
|
||||||
|
* Add a name parameter to the waypoint class for supporting a route
|
||||||
|
manager in the flightgear gps module.
|
||||||
|
* Make display list usage optional.
|
||||||
|
* Event manager: specifying a zero delay will force event execution in
|
||||||
|
the next frame rather than entering an infinite loop.
|
||||||
|
* gcc-4.0 fix.
|
||||||
|
* Fixes to property tree loading and saving.
|
||||||
|
* Make volume inaudible at startup.
|
||||||
|
* Solaris fixes.
|
||||||
|
* For low density cloud coverage, blend the layer to nothing as we pass
|
||||||
|
through instead of fully engulfing the aircraft in the cloud.
|
||||||
|
* Add several new capabilities to the texture management code for building
|
||||||
|
normal maps and doing some simple on-the-fly effects on textures.
|
||||||
|
* Better error message for sound problems.
|
||||||
|
* Add support for binding a thread to a specific CPU.
|
||||||
|
|
||||||
|
|
||||||
New in 0.3.7
|
New in 0.3.7
|
||||||
* October 12, 2004
|
* October 12, 2004
|
||||||
|
|
||||||
@@ -33,7 +117,7 @@ New in 0.3.5
|
|||||||
* Support VASI/PAPI lights correctly.
|
* Support VASI/PAPI lights correctly.
|
||||||
* Fixes to cloud animation.
|
* Fixes to cloud animation.
|
||||||
* Updates to sky dome coloring as well as sun/moon coloring.
|
* Updates to sky dome coloring as well as sun/moon coloring.
|
||||||
* Vary environment lighting with visibility (subtlely.)
|
* Vary environment lighting with visibility (subtlety.)
|
||||||
* Support control of alpha test in model animation.
|
* Support control of alpha test in model animation.
|
||||||
* Complete rewrite of the event manager.
|
* Complete rewrite of the event manager.
|
||||||
* Updates to low level socket code to make it more flexible.
|
* Updates to low level socket code to make it more flexible.
|
||||||
@@ -84,7 +168,7 @@ New in 0.3.2
|
|||||||
management, basic model and model animation management, sky
|
management, basic model and model animation management, sky
|
||||||
rendering, and low level loaders for the "TerraGear" tile object format.
|
rendering, and low level loaders for the "TerraGear" tile object format.
|
||||||
* Removed support of the flat shaded and non-textured material
|
* Removed support of the flat shaded and non-textured material
|
||||||
property varients. You can still do these things, but extra states
|
property variants. You can still do these things, but extra states
|
||||||
are no longer set up automatically.
|
are no longer set up automatically.
|
||||||
* Removed 3d clouds from the default build ... these need a maintainer
|
* Removed 3d clouds from the default build ... these need a maintainer
|
||||||
or better yet, a complete plib-based rewrite.
|
or better yet, a complete plib-based rewrite.
|
||||||
@@ -129,7 +213,7 @@ New in 0.2.0
|
|||||||
* Removed efence support (in favor of valgrind.)
|
* Removed efence support (in favor of valgrind.)
|
||||||
|
|
||||||
* Added a javascript interpreter.
|
* Added a javascript interpreter.
|
||||||
* SGSocket reimplimented on top of plib/net libs.
|
* SGSocket reimplemented on top of plib/net libs.
|
||||||
* Added a new random number generation algorithm.
|
* Added a new random number generation algorithm.
|
||||||
* Total rewrite of the strutils package.
|
* Total rewrite of the strutils package.
|
||||||
|
|
||||||
@@ -139,7 +223,7 @@ New in 0.2.0
|
|||||||
* Mac OS X fixes.
|
* Mac OS X fixes.
|
||||||
* Irix fixes.
|
* Irix fixes.
|
||||||
* Code clean ups to remove warning messages.
|
* Code clean ups to remove warning messages.
|
||||||
* Optimizations in sg_binobj to reduce the amout of memory copying
|
* Optimizations in sg_binobj to reduce the amount of memory copying
|
||||||
needed when loading a binobj format file.
|
needed when loading a binobj format file.
|
||||||
* Fixed a couple places where variables could be used before they were
|
* Fixed a couple places where variables could be used before they were
|
||||||
initialized.
|
initialized.
|
||||||
@@ -159,7 +243,7 @@ New in 0.0.18
|
|||||||
* Upgrade to metakit-2.4.2-32.tar.gz (latest upstream release)
|
* Upgrade to metakit-2.4.2-32.tar.gz (latest upstream release)
|
||||||
* Added support for point objects in the scenery file format.
|
* Added support for point objects in the scenery file format.
|
||||||
* Additions to the binary file format to make it *much* more flexible.
|
* Additions to the binary file format to make it *much* more flexible.
|
||||||
For each major primative type: points, triangles, fans, and strips, you
|
For each major primitive type: points, triangles, fans, and strips, you
|
||||||
can specify an index list of vertices, normals, colors, and texture
|
can specify an index list of vertices, normals, colors, and texture
|
||||||
coordinates. You can skip any of these you like to save on space.
|
coordinates. You can skip any of these you like to save on space.
|
||||||
* Added support for new file features in the binary -> ascii scenery file
|
* Added support for new file features in the binary -> ascii scenery file
|
||||||
@@ -210,7 +294,7 @@ New in 0.0.17pre1
|
|||||||
|
|
||||||
New in 0.0.16
|
New in 0.0.16
|
||||||
* July 12, 2001
|
* July 12, 2001
|
||||||
* Various changes to the property manager implimentation to better support
|
* Various changes to the property manager implementation to better support
|
||||||
dumping out the desired portions of the property tree to file.
|
dumping out the desired portions of the property tree to file.
|
||||||
* Don't compile the metakit demos by default (causes problems for Irix)'
|
* Don't compile the metakit demos by default (causes problems for Irix)'
|
||||||
* Other various tweaks for Irix.
|
* Other various tweaks for Irix.
|
||||||
@@ -253,7 +337,7 @@ New in 0.0.15
|
|||||||
read/write routines.
|
read/write routines.
|
||||||
* Added doxygen comments for all public interface code. Documentation
|
* Added doxygen comments for all public interface code. Documentation
|
||||||
can be accessed via the SimGear web page.
|
can be accessed via the SimGear web page.
|
||||||
* Many FG -> SG name space changes for better consistancy throughout
|
* Many FG -> SG name space changes for better consistency throughout
|
||||||
this package.
|
this package.
|
||||||
* Added property aliases, repeated name tags, and a general xml
|
* Added property aliases, repeated name tags, and a general xml
|
||||||
inclusion facilities. Many other property manager clean ups
|
inclusion facilities. Many other property manager clean ups
|
||||||
@@ -344,4 +428,4 @@ New in 0.0.4
|
|||||||
|
|
||||||
|
|
||||||
New in 0.0.3
|
New in 0.0.3
|
||||||
* Release that conincides with FlightGear-0.7.2
|
* Release that coincides with FlightGear-0.7.2
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
[This file is mirrored in both the FlightGear and SimGear packages.]
|
||||||
|
|
||||||
|
You *must* have OpenSceneGraph (OSG) installed to build this version of
|
||||||
|
FlightGear.
|
||||||
|
|
||||||
|
You can get the latest version of OSG from:
|
||||||
|
|
||||||
|
http://www.openscenegraph.org/
|
||||||
|
|
||||||
|
Build notes:
|
||||||
|
|
||||||
|
Unzip the file OpenSceneGraph-2.4.zip and install using the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
unzip OpenSceneGraph-2.4
|
||||||
|
cd OpenSceneGraph
|
||||||
|
ccmake .
|
||||||
|
|
||||||
|
[ While running ccmake: press 'c' to configure, press 'c' once more, and
|
||||||
|
then press 'g' to generate and exit ]
|
||||||
|
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
[This file is mirrored in both the FlightGear and SimGear packages.]
|
||||||
|
|
||||||
|
You *must* have the development components of OpenAL installed on your system
|
||||||
|
to build FlightGear!" You can get a copy here:
|
||||||
|
|
||||||
|
http://www.openal.org
|
||||||
|
|
||||||
|
Build notes:
|
||||||
|
|
||||||
|
You can download a versioned release of the openal library from
|
||||||
|
http://www.openal.org/downloads.html. Download the openal source,
|
||||||
|
release 0.0.8 (dated February 11, 2006) and run:
|
||||||
|
tar xzvf openal-0.0.8.tar.gz
|
||||||
|
cd openal-0.0.8
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
The alut library is also required, but comes separately in the package
|
||||||
|
freelut-1.1.0.tar.gz. This package can be downloaded from the same page
|
||||||
|
(http://www.openal.org/downloads.html). Download and run:
|
||||||
|
tar xzvf freelut-1.1.0.tar.gz
|
||||||
|
cd freelut-1.1.0
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
Alternatively, you can use the CVS version (follow the instructions at
|
||||||
|
the OpenAL web site) and build/install that one.
|
||||||
+17
-1
@@ -1,6 +1,6 @@
|
|||||||
[This file is mirrored in both the FlightGear and SimGear packages.]
|
[This file is mirrored in both the FlightGear and SimGear packages.]
|
||||||
|
|
||||||
You *must* have plib version 1.6.0 or later installed on your system
|
You *must* have plib version 1.8.5 or later installed on your system
|
||||||
to build FlightGear!" Flight Gear is no longer compatible with the
|
to build FlightGear!" Flight Gear is no longer compatible with the
|
||||||
earlier versions of the library.
|
earlier versions of the library.
|
||||||
|
|
||||||
@@ -14,3 +14,19 @@ You should be able to just run "./configure" to configure the package
|
|||||||
and use all of plib's defaults. Then run "make" followed by "make
|
and use all of plib's defaults. Then run "make" followed by "make
|
||||||
install". By default, plib installs itself into /usr so if you don't
|
install". By default, plib installs itself into /usr so if you don't
|
||||||
like this, be sure to specify an alternate prefix such as --prefix=/usr/local
|
like this, be sure to specify an alternate prefix such as --prefix=/usr/local
|
||||||
|
|
||||||
|
As of this writing (2007-11-18), many linux distributions are shipped with a
|
||||||
|
working version of plib, so chances are that this library is already
|
||||||
|
installed. It should be noted, that currently plib version no longer compiles
|
||||||
|
using recent versions of gcc (confirmed on version gcc 4.1.2, as shipped with
|
||||||
|
SuSe 10.2). As a workaround, it is possible to either use plib SVN. Run the
|
||||||
|
following commands:
|
||||||
|
|
||||||
|
|
||||||
|
svn co https://plib.svn.sourceforge.net/svnroot/plib/trunk plib
|
||||||
|
cd plib
|
||||||
|
./autogen.sh
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
|||||||
+5
-170
@@ -1,173 +1,8 @@
|
|||||||
For your convenience and allowed by zlib's license terms:
|
zlib is prerequisite for compiling SimGear and FlightGear. You can fetch
|
||||||
http://www.gzip.org/zlib/zlib_license.html a copy of the zlib source
|
the latest version of zlib from:
|
||||||
is bundled with SimGear in $(top_srcdir)/src-libs/. You must have
|
|
||||||
zlib installed before you can build SimGear.
|
|
||||||
|
|
||||||
- Most linux distributions have a zlib package. For linux
|
http://www.zlib.net
|
||||||
developers, we recommend ysou install your distributions package
|
|
||||||
rather than building from source.
|
|
||||||
|
|
||||||
- Cygwin installs zlib automatically.
|
Most modern unix distributions (and cygwin) come with a version of zlib
|
||||||
|
already installed or available to install as a package.
|
||||||
|
|
||||||
- For developers on most other platforms, you will have to build
|
|
||||||
zlib from source and install it yourself. For your convenience a
|
|
||||||
tar ball of the zlib source is included with the simgear source
|
|
||||||
distribution. Untar the zlib source, and follow the included
|
|
||||||
build and installation instructions.
|
|
||||||
|
|
||||||
Once zlib is installed you can return to configuring and building
|
|
||||||
Simgear.
|
|
||||||
|
|
||||||
We now send you to the official zlib README ...
|
|
||||||
|
|
||||||
|
|
||||||
=============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
zlib 1.1.4 is a general purpose data compression library. All the code
|
|
||||||
is thread safe. The data format used by the zlib library
|
|
||||||
is described by RFCs (Request for Comments) 1950 to 1952 in the files
|
|
||||||
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
|
|
||||||
format) and rfc1952.txt (gzip format). These documents are also available in
|
|
||||||
other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
|
|
||||||
|
|
||||||
All functions of the compression library are documented in the file zlib.h
|
|
||||||
(volunteer to write man pages welcome, contact jloup@gzip.org). A usage
|
|
||||||
example of the library is given in the file example.c which also tests that
|
|
||||||
the library is working correctly. Another example is given in the file
|
|
||||||
minigzip.c. The compression library itself is composed of all source files
|
|
||||||
except example.c and minigzip.c.
|
|
||||||
|
|
||||||
To compile all files and run the test program, follow the instructions
|
|
||||||
given at the top of Makefile. In short "make test; make install"
|
|
||||||
should work for most machines. For Unix: "./configure; make test; make install"
|
|
||||||
For MSDOS, use one of the special makefiles such as Makefile.msc.
|
|
||||||
For VMS, use Make_vms.com or descrip.mms.
|
|
||||||
|
|
||||||
Questions about zlib should be sent to <zlib@gzip.org>, or to
|
|
||||||
Gilles Vollant <info@winimage.com> for the Windows DLL version.
|
|
||||||
The zlib home page is http://www.zlib.org or http://www.gzip.org/zlib/
|
|
||||||
Before reporting a problem, please check this site to verify that
|
|
||||||
you have the latest version of zlib; otherwise get the latest version and
|
|
||||||
check whether the problem still exists or not.
|
|
||||||
|
|
||||||
PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html
|
|
||||||
before asking for help.
|
|
||||||
|
|
||||||
Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
|
||||||
issue of Dr. Dobb's Journal; a copy of the article is available in
|
|
||||||
http://dogma.net/markn/articles/zlibtool/zlibtool.htm
|
|
||||||
|
|
||||||
The changes made in version 1.1.4 are documented in the file ChangeLog.
|
|
||||||
The only changes made since 1.1.3 are bug corrections:
|
|
||||||
|
|
||||||
- ZFREE was repeated on same allocation on some error conditions.
|
|
||||||
This creates a security problem described in
|
|
||||||
http://www.zlib.org/advisory-2002-03-11.txt
|
|
||||||
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
|
|
||||||
- Avoid accesses before window for invalid distances with inflate window
|
|
||||||
less than 32K.
|
|
||||||
- force windowBits > 8 to avoid a bug in the encoder for a window size
|
|
||||||
of 256 bytes. (A complete fix will be available in 1.1.5).
|
|
||||||
|
|
||||||
The beta version 1.1.5beta includes many more changes. A new official
|
|
||||||
version 1.1.5 will be released as soon as extensive testing has been
|
|
||||||
completed on it.
|
|
||||||
|
|
||||||
|
|
||||||
Unsupported third party contributions are provided in directory "contrib".
|
|
||||||
|
|
||||||
A Java implementation of zlib is available in the Java Development Kit
|
|
||||||
http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
|
|
||||||
See the zlib home page http://www.zlib.org for details.
|
|
||||||
|
|
||||||
A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
|
|
||||||
is in the CPAN (Comprehensive Perl Archive Network) sites
|
|
||||||
http://www.cpan.org/modules/by-module/Compress/
|
|
||||||
|
|
||||||
A Python interface to zlib written by A.M. Kuchling <amk@magnet.com>
|
|
||||||
is available in Python 1.5 and later versions, see
|
|
||||||
http://www.python.org/doc/lib/module-zlib.html
|
|
||||||
|
|
||||||
A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com>
|
|
||||||
is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
|
|
||||||
|
|
||||||
An experimental package to read and write files in .zip format,
|
|
||||||
written on top of zlib by Gilles Vollant <info@winimage.com>, is
|
|
||||||
available at http://www.winimage.com/zLibDll/unzip.html
|
|
||||||
and also in the contrib/minizip directory of zlib.
|
|
||||||
|
|
||||||
|
|
||||||
Notes for some targets:
|
|
||||||
|
|
||||||
- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
|
|
||||||
and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
|
|
||||||
The zlib DLL support was initially done by Alessandro Iacopetti and is
|
|
||||||
now maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL
|
|
||||||
home page at http://www.winimage.com/zLibDll
|
|
||||||
|
|
||||||
From Visual Basic, you can call the DLL functions which do not take
|
|
||||||
a structure as argument: compress, uncompress and all gz* functions.
|
|
||||||
See contrib/visual-basic.txt for more information, or get
|
|
||||||
http://www.tcfb.com/dowseware/cmp-z-it.zip
|
|
||||||
|
|
||||||
- For 64-bit Irix, deflate.c must be compiled without any optimization.
|
|
||||||
With -O, one libpng test fails. The test works in 32 bit mode (with
|
|
||||||
the -n32 compiler flag). The compiler bug has been reported to SGI.
|
|
||||||
|
|
||||||
- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1
|
|
||||||
it works when compiled with cc.
|
|
||||||
|
|
||||||
- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
|
|
||||||
is necessary to get gzprintf working correctly. This is done by configure.
|
|
||||||
|
|
||||||
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
|
|
||||||
with other compilers. Use "make test" to check your compiler.
|
|
||||||
|
|
||||||
- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
|
|
||||||
|
|
||||||
- For Turbo C the small model is supported only with reduced performance to
|
|
||||||
avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
|
|
||||||
|
|
||||||
- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
|
|
||||||
Per Harald Myrvang <perm@stud.cs.uit.no>
|
|
||||||
|
|
||||||
|
|
||||||
Acknowledgments:
|
|
||||||
|
|
||||||
The deflate format used by zlib was defined by Phil Katz. The deflate
|
|
||||||
and zlib specifications were written by L. Peter Deutsch. Thanks to all the
|
|
||||||
people who reported problems and suggested various improvements in zlib;
|
|
||||||
they are too numerous to cite here.
|
|
||||||
|
|
||||||
Copyright notice:
|
|
||||||
|
|
||||||
(C) 1995-2002 Jean-loup Gailly and Mark Adler
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
Jean-loup Gailly Mark Adler
|
|
||||||
jloup@gzip.org madler@alumni.caltech.edu
|
|
||||||
|
|
||||||
If you use the zlib library in a product, we would appreciate *not*
|
|
||||||
receiving lengthy legal documents to sign. The sources are provided
|
|
||||||
for free but without warranty of any kind. The library has been
|
|
||||||
entirely written by Jean-loup Gailly and Mark Adler; it does not
|
|
||||||
include third-party code.
|
|
||||||
|
|
||||||
If you redistribute modified sources, we would appreciate that you include
|
|
||||||
in the file ChangeLog history information documenting your changes.
|
|
||||||
|
|||||||
+786
-955
File diff suppressed because it is too large
Load Diff
-24
@@ -15,30 +15,6 @@ Package=<4>
|
|||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
Project: "mklib"=".\SimGear\metakit-2.4.3\win\msvc60\mklib.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "zlib"=".\SimGear\zlib.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
Global:
|
||||||
|
|
||||||
Package=<5>
|
Package=<5>
|
||||||
|
|||||||
@@ -47,6 +47,18 @@ Jean-Francois Doue
|
|||||||
http://www.animats.com/simpleppp/ftp/public_html/topics/developers.html
|
http://www.animats.com/simpleppp/ftp/public_html/topics/developers.html
|
||||||
|
|
||||||
|
|
||||||
|
Melchior Franz
|
||||||
|
METAR parser and fetcher. "material" animation (based on Jim Wilsons's
|
||||||
|
"emission" animation). Debugging and extension of property listener
|
||||||
|
features. Addition of removeChildren.
|
||||||
|
|
||||||
|
|
||||||
|
Mathias Froehlich
|
||||||
|
Reworked and cleaned up large parts of the infrastructure, of math
|
||||||
|
files, animations and rendering in preparation of a transition to
|
||||||
|
the OSG library. Added new handlers for shared and referenced objects.
|
||||||
|
|
||||||
|
|
||||||
Bruce Finney <bfinney@gte.net>
|
Bruce Finney <bfinney@gte.net>
|
||||||
MSVC5 compatibility.
|
MSVC5 compatibility.
|
||||||
|
|
||||||
@@ -71,6 +83,10 @@ Bruce Jackson of NASA <e.b.jackson@larc.nasa.gov>
|
|||||||
http://dcb.larc.nasa.gov/www/DCBStaff/ebj/ebj.html
|
http://dcb.larc.nasa.gov/www/DCBStaff/ebj/ebj.html
|
||||||
|
|
||||||
|
|
||||||
|
Maik Justus
|
||||||
|
Fixed an old bug in the SGPropertyNode class.
|
||||||
|
|
||||||
|
|
||||||
Richard Kaszeta <bofh@me.umn.edu>
|
Richard Kaszeta <bofh@me.umn.edu>
|
||||||
Contributed screen buffer to ppm screen shot routine.
|
Contributed screen buffer to ppm screen shot routine.
|
||||||
Rich has also helped in the early development of the Flight Gear "altitude
|
Rich has also helped in the early development of the Flight Gear "altitude
|
||||||
@@ -90,7 +106,12 @@ David Megginson <david@megginson.com>
|
|||||||
SimGear property manager/registry
|
SimGear property manager/registry
|
||||||
|
|
||||||
|
|
||||||
Curt Olson <curt@flightgear.org>
|
Tim Moore
|
||||||
|
Ported the (chrome) "shader" animation to OSG, and helped with porting
|
||||||
|
the "material" animation.
|
||||||
|
|
||||||
|
|
||||||
|
Curt Olson http://www.flightgear.org/~curt/
|
||||||
Curt is responsible for overall project and source code management.
|
Curt is responsible for overall project and source code management.
|
||||||
He has his hands in many of the areas.
|
He has his hands in many of the areas.
|
||||||
|
|
||||||
@@ -99,7 +120,7 @@ Petter Reinholdtsen <pere@games.no>
|
|||||||
Incorporated the Gnu automake/autoconf system (with libtool).
|
Incorporated the Gnu automake/autoconf system (with libtool).
|
||||||
This should streamline and standardize the build process for all
|
This should streamline and standardize the build process for all
|
||||||
Unix-like platforms. It should have little effect on IDE type
|
Unix-like platforms. It should have little effect on IDE type
|
||||||
environments since the don't use the Unix make system.
|
environments since these don't use the Unix make system.
|
||||||
|
|
||||||
|
|
||||||
Paul Schlyter <pausch@saaf.se>
|
Paul Schlyter <pausch@saaf.se>
|
||||||
@@ -175,7 +196,7 @@ NOTE:
|
|||||||
----
|
----
|
||||||
|
|
||||||
THIS DOCUMENT WAS INITIALLY WRITTEN BY
|
THIS DOCUMENT WAS INITIALLY WRITTEN BY
|
||||||
Curt L. Olson <curt@flightgear.org>
|
Curt L. Olson <http://www.flightgear.org/~curt>
|
||||||
|
|
||||||
|
|
||||||
05 Jul 2000 Removed non-SimGear entries (CLO)
|
05 Jul 2000 Removed non-SimGear entries (CLO)
|
||||||
|
|||||||
+65
-18
@@ -3,7 +3,7 @@ dnl originally from ncftp 2.3.0
|
|||||||
dnl added wi_EXTRA_PDIR and wi_ANSI_C
|
dnl added wi_EXTRA_PDIR and wi_ANSI_C
|
||||||
dnl $Id$
|
dnl $Id$
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_EXTRA_IDIR, [
|
AC_DEFUN([wi_EXTRA_IDIR], [
|
||||||
incdir="$1"
|
incdir="$1"
|
||||||
if test -r $incdir ; then
|
if test -r $incdir ; then
|
||||||
case "$CPPFLAGS" in
|
case "$CPPFLAGS" in
|
||||||
@@ -25,7 +25,7 @@ dnl
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_EXTRA_LDIR, [
|
AC_DEFUN([wi_EXTRA_LDIR], [
|
||||||
mylibdir="$1"
|
mylibdir="$1"
|
||||||
if test -r $mylibdir ; then
|
if test -r $mylibdir ; then
|
||||||
case "$LDFLAGS" in
|
case "$LDFLAGS" in
|
||||||
@@ -47,7 +47,7 @@ dnl
|
|||||||
dnl __FP__
|
dnl __FP__
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_EXTRA_PDIR, [
|
AC_DEFUN([wi_EXTRA_PDIR], [
|
||||||
progdir="$1"
|
progdir="$1"
|
||||||
if test -r $progdir ; then
|
if test -r $progdir ; then
|
||||||
case "$PATH" in
|
case "$PATH" in
|
||||||
@@ -76,7 +76,7 @@ dnl
|
|||||||
dnl If you want to look for subdirectories in include/lib directories,
|
dnl If you want to look for subdirectories in include/lib directories,
|
||||||
dnl you pass the names in argument 3, otherwise pass a dash.
|
dnl you pass the names in argument 3, otherwise pass a dash.
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_EXTRA_DIRS, [echo "checking for extra include and lib directories..." 1>&6
|
AC_DEFUN([wi_EXTRA_DIRS], [echo "checking for extra include and lib directories..." 1>&6
|
||||||
ifelse([$1], yes, [dnl
|
ifelse([$1], yes, [dnl
|
||||||
b1=`cd .. ; pwd`
|
b1=`cd .. ; pwd`
|
||||||
b2=`cd ../.. ; pwd`
|
b2=`cd ../.. ; pwd`
|
||||||
@@ -111,7 +111,7 @@ done
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_HPUX_CFLAGS,
|
AC_DEFUN([wi_HPUX_CFLAGS],
|
||||||
[AC_MSG_CHECKING(if HP-UX ansi C compiler flags are needed)
|
[AC_MSG_CHECKING(if HP-UX ansi C compiler flags are needed)
|
||||||
AC_REQUIRE([AC_PROG_CC])
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
os=`uname -s | tr '[A-Z]' '[a-z]'`
|
os=`uname -s | tr '[A-Z]' '[a-z]'`
|
||||||
@@ -144,7 +144,7 @@ AC_MSG_RESULT($ac_cv_hpux_flags)
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_CFLAGS, [AC_REQUIRE([AC_PROG_CC])
|
AC_DEFUN([wi_CFLAGS], [AC_REQUIRE([AC_PROG_CC])
|
||||||
wi_HPUX_CFLAGS
|
wi_HPUX_CFLAGS
|
||||||
if test "$CFLAGS" = "" ; then
|
if test "$CFLAGS" = "" ; then
|
||||||
CFLAGS="-O"
|
CFLAGS="-O"
|
||||||
@@ -165,7 +165,7 @@ wi_HPUX_CFLAGS
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_PROTOTYPES, [
|
AC_DEFUN([wi_PROTOTYPES], [
|
||||||
AC_MSG_CHECKING(if the compiler supports function prototypes)
|
AC_MSG_CHECKING(if the compiler supports function prototypes)
|
||||||
AC_TRY_COMPILE(,[extern void exit(int status);],[wi_cv_prototypes=yes
|
AC_TRY_COMPILE(,[extern void exit(int status);],[wi_cv_prototypes=yes
|
||||||
AC_DEFINE(PROTOTYPES)],wi_cv_prototypes=no)
|
AC_DEFINE(PROTOTYPES)],wi_cv_prototypes=no)
|
||||||
@@ -174,7 +174,7 @@ AC_MSG_RESULT($wi_cv_prototypes)
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_ANSI_C, [
|
AC_DEFUN([wi_ANSI_C], [
|
||||||
AC_MSG_CHECKING(ANSI-style function definitions)
|
AC_MSG_CHECKING(ANSI-style function definitions)
|
||||||
AC_TRY_COMPILE(,[int blubb(int x) { return 0; }],[wi_cv_ansi_funcs=yes
|
AC_TRY_COMPILE(,[int blubb(int x) { return 0; }],[wi_cv_ansi_funcs=yes
|
||||||
AC_DEFINE(ANSI_FUNCS)],wi_cv_ansi_funcs=no)
|
AC_DEFINE(ANSI_FUNCS)],wi_cv_ansi_funcs=no)
|
||||||
@@ -183,7 +183,7 @@ AC_MSG_RESULT($wi_cv_ansi_funcs)
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_HEADER_SYS_SELECT_H, [
|
AC_DEFUN([wi_HEADER_SYS_SELECT_H], [
|
||||||
# See if <sys/select.h> is includable after <sys/time.h>
|
# See if <sys/select.h> is includable after <sys/time.h>
|
||||||
if test "$ac_cv_header_sys_time_h" = no ; then
|
if test "$ac_cv_header_sys_time_h" = no ; then
|
||||||
AC_CHECK_HEADERS(sys/time.h sys/select.h)
|
AC_CHECK_HEADERS(sys/time.h sys/select.h)
|
||||||
@@ -211,7 +211,7 @@ fi
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_LIB_RESOLV, [
|
AC_DEFUN([wi_LIB_RESOLV], [
|
||||||
# See if we could access two well-known sites without help of any special
|
# See if we could access two well-known sites without help of any special
|
||||||
# libraries, like resolv.
|
# libraries, like resolv.
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ dnl
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(wi_LIB_NSL, [
|
AC_DEFUN([wi_LIB_NSL], [
|
||||||
AC_MSG_CHECKING(if we can use -lnsl)
|
AC_MSG_CHECKING(if we can use -lnsl)
|
||||||
ac_save_LIBS="$LIBS";
|
ac_save_LIBS="$LIBS";
|
||||||
LIBS="$LIBS -lnsl";
|
LIBS="$LIBS -lnsl";
|
||||||
@@ -261,7 +261,7 @@ dnl
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
|
|
||||||
AC_DEFUN(nc_PATH_PROG_ZCAT, [
|
AC_DEFUN([nc_PATH_PROG_ZCAT], [
|
||||||
AC_PATH_PROG(GZCAT,gzcat)
|
AC_PATH_PROG(GZCAT,gzcat)
|
||||||
AC_PATH_PROG(ZCAT,zcat)
|
AC_PATH_PROG(ZCAT,zcat)
|
||||||
if test "x$GZCAT" = x ; then
|
if test "x$GZCAT" = x ; then
|
||||||
@@ -287,7 +287,7 @@ fi
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_SYSV_EXTRA_DIRS, [
|
AC_DEFUN([wi_SYSV_EXTRA_DIRS], [
|
||||||
# Use System V because their curses extensions are required. This must
|
# Use System V because their curses extensions are required. This must
|
||||||
# be done early so we use the -I and -L in the library checks also.
|
# be done early so we use the -I and -L in the library checks also.
|
||||||
# This is mostly a Solaris/SunOS hack. Note that doing this will also
|
# This is mostly a Solaris/SunOS hack. Note that doing this will also
|
||||||
@@ -305,7 +305,7 @@ fi
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_DEFINE_UNAME, [
|
AC_DEFUN([wi_DEFINE_UNAME], [
|
||||||
# Get first 127 chars of all uname information. Some folks have
|
# Get first 127 chars of all uname information. Some folks have
|
||||||
# way too much stuff there, so grab only the first 127.
|
# way too much stuff there, so grab only the first 127.
|
||||||
unam=`uname -a 2>/dev/null | cut -c1-127`
|
unam=`uname -a 2>/dev/null | cut -c1-127`
|
||||||
@@ -316,7 +316,7 @@ fi
|
|||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
dnl
|
dnl
|
||||||
AC_DEFUN(wi_READLINE_WITH_NCURSES, [
|
AC_DEFUN([wi_READLINE_WITH_NCURSES], [
|
||||||
# Readline and Ncurses could both define "backspace".
|
# Readline and Ncurses could both define "backspace".
|
||||||
# Warn about this if we have both things in our definitions list.
|
# Warn about this if we have both things in our definitions list.
|
||||||
|
|
||||||
@@ -352,7 +352,7 @@ dnl
|
|||||||
|
|
||||||
dnl AC_EXT_DAYLIGHT
|
dnl AC_EXT_DAYLIGHT
|
||||||
dnl Check for an external variable daylight. Stolen from w3c-libwww.
|
dnl Check for an external variable daylight. Stolen from w3c-libwww.
|
||||||
AC_DEFUN(AC_EXT_DAYLIGHT,
|
AC_DEFUN([AC_EXT_DAYLIGHT],
|
||||||
[ AC_MSG_CHECKING(int daylight variable)
|
[ AC_MSG_CHECKING(int daylight variable)
|
||||||
AC_TRY_COMPILE([#include <time.h>], [return daylight;],
|
AC_TRY_COMPILE([#include <time.h>], [return daylight;],
|
||||||
have_daylight=yes,
|
have_daylight=yes,
|
||||||
@@ -362,7 +362,7 @@ AC_MSG_RESULT($have_daylight)
|
|||||||
|
|
||||||
dnl AC_EXT_TIMEZONE
|
dnl AC_EXT_TIMEZONE
|
||||||
dnl Check for an external variable timezone. Stolen from tcl-8.0.
|
dnl Check for an external variable timezone. Stolen from tcl-8.0.
|
||||||
AC_DEFUN(AC_EXT_TIMEZONE,
|
AC_DEFUN([AC_EXT_TIMEZONE],
|
||||||
[
|
[
|
||||||
#
|
#
|
||||||
# Its important to include time.h in this check, as some systems (like convex)
|
# Its important to include time.h in this check, as some systems (like convex)
|
||||||
@@ -395,7 +395,7 @@ fi
|
|||||||
|
|
||||||
## AC_BZ_SET_COMPILER: Addition by Theodore Papadopoulo
|
## AC_BZ_SET_COMPILER: Addition by Theodore Papadopoulo
|
||||||
## Patch by Jim McKelvey: change sed -e 's/ /@/g' to sed -e 's/ /@/'
|
## Patch by Jim McKelvey: change sed -e 's/ /@/g' to sed -e 's/ /@/'
|
||||||
AC_DEFUN(AC_SG_SET_COMPILER,
|
AC_DEFUN([AC_SG_SET_COMPILER],
|
||||||
[cxxwith=`echo $1 | sed -e 's/ /@/'`
|
[cxxwith=`echo $1 | sed -e 's/ /@/'`
|
||||||
case "$cxxwith" in
|
case "$cxxwith" in
|
||||||
*:*@*) # Full initialization syntax
|
*:*@*) # Full initialization syntax
|
||||||
@@ -413,3 +413,50 @@ AC_DEFUN(AC_SG_SET_COMPILER,
|
|||||||
## CFLAGS=
|
## CFLAGS=
|
||||||
;;
|
;;
|
||||||
esac])
|
esac])
|
||||||
|
|
||||||
|
pushdef([AC_PROG_INSTALL],
|
||||||
|
[
|
||||||
|
dnl our own version, testing for a -p flag
|
||||||
|
popdef([AC_PROG_INSTALL])
|
||||||
|
dnl as AC_PROG_INSTALL works as it works we first have
|
||||||
|
dnl to save if the user didn't specify INSTALL, as the
|
||||||
|
dnl autoconf one overwrites INSTALL and we have no chance to find
|
||||||
|
dnl out afterwards
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
|
||||||
|
# OK, user hasn't given any INSTALL, autoconf found one for us
|
||||||
|
# now we test, if it supports the -p flag
|
||||||
|
AC_MSG_CHECKING(for -p flag to install)
|
||||||
|
rm -f confinst.$$.* > /dev/null 2>&1
|
||||||
|
echo "Testtest" > confinst.$$.orig
|
||||||
|
ac_res=no
|
||||||
|
if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then
|
||||||
|
if test -f confinst.$$.new ; then
|
||||||
|
# OK, -p seems to do no harm to install
|
||||||
|
INSTALL="${INSTALL} -p"
|
||||||
|
ac_res=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f confinst.$$.*
|
||||||
|
AC_MSG_RESULT($ac_res)
|
||||||
|
dnl the following tries to resolve some signs and wonders coming up
|
||||||
|
dnl with different autoconf/automake versions
|
||||||
|
dnl e.g.:
|
||||||
|
dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s
|
||||||
|
dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS)
|
||||||
|
dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s
|
||||||
|
dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has
|
||||||
|
dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the
|
||||||
|
dnl install-@DIR@PROGRAMS targets to explicitly use that flag
|
||||||
|
dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as
|
||||||
|
dnl INSTALL_SCRIPT, which breaks with automake <= 1.4
|
||||||
|
dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure
|
||||||
|
dnl to clean up that mess we:
|
||||||
|
dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG
|
||||||
|
dnl which cleans KDE's program with automake > 1.4;
|
||||||
|
dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems
|
||||||
|
dnl with automake<=1.4
|
||||||
|
dnl note that dues to this sometimes two '-s' flags are used
|
||||||
|
INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)'
|
||||||
|
INSTALL_SCRIPT='${INSTALL}'
|
||||||
|
])dnl
|
||||||
|
|||||||
+4
-5
@@ -4,14 +4,13 @@ exclude_dir = threads
|
|||||||
include_path = .
|
include_path = .
|
||||||
include_path = ..
|
include_path = ..
|
||||||
include_path = .\SimGear
|
include_path = .\SimGear
|
||||||
include_path = .\SimGear\metakit-2.4.3\include
|
include_path = ..\zlib-1.2.3
|
||||||
include_path = ..\SimGear\zlib-1.1.4
|
include_path = "..\OpenAL 1.0 Software Development Kit\include"
|
||||||
|
|
||||||
|
define = _USE_MATH_DEFINES
|
||||||
|
define = _CRT_SECURE_NO_DEPRECATE
|
||||||
define = HAVE_CONFIG_H
|
define = HAVE_CONFIG_H
|
||||||
|
|
||||||
add_project = .\SimGear\metakit-2.4.3\win\msvc60\mklib.dsp,mklib
|
|
||||||
add_project = .\SimGear\zlib.dsp,zlib
|
|
||||||
|
|
||||||
# Rule to create simgear_config.h
|
# Rule to create simgear_config.h
|
||||||
add_source_file = SOURCE=.\simgear\simgear_config.h.vc5\
|
add_source_file = SOURCE=.\simgear\simgear_config.h.vc5\
|
||||||
\
|
\
|
||||||
|
|||||||
+86
-40
@@ -1,7 +1,5 @@
|
|||||||
dnl Process this file with autoget.sh to produce a working configure
|
dnl Process this file with autoget.sh to produce a working configure
|
||||||
dnl script.
|
dnl script.
|
||||||
dnl
|
|
||||||
dnl $Id$
|
|
||||||
|
|
||||||
AC_INIT
|
AC_INIT
|
||||||
AC_CONFIG_SRCDIR([simgear/bucket/newbucket.cxx])
|
AC_CONFIG_SRCDIR([simgear/bucket/newbucket.cxx])
|
||||||
@@ -10,7 +8,7 @@ dnl Require at least automake 2.52
|
|||||||
AC_PREREQ(2.52)
|
AC_PREREQ(2.52)
|
||||||
|
|
||||||
dnl Initialize the automake stuff
|
dnl Initialize the automake stuff
|
||||||
AM_INIT_AUTOMAKE(SimGear, 0.3.7)
|
AM_INIT_AUTOMAKE(SimGear, 1.99.5-rc2)
|
||||||
|
|
||||||
dnl Specify KAI C++ compiler and flags.
|
dnl Specify KAI C++ compiler and flags.
|
||||||
dnl Borrowed with slight modification from blitz distribution.
|
dnl Borrowed with slight modification from blitz distribution.
|
||||||
@@ -26,8 +24,10 @@ AC_ARG_WITH(cxx,
|
|||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
|
|
||||||
echo CXX = $CXX
|
AC_MSG_CHECKING([CXX])
|
||||||
echo CC = $CC
|
AC_MSG_RESULT([$CXX])
|
||||||
|
AC_MSG_CHECKING([CC])
|
||||||
|
AC_MSG_RESULT([$CC])
|
||||||
|
|
||||||
dnl Checks for programs.
|
dnl Checks for programs.
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
@@ -121,9 +121,17 @@ if test "x$with_plib" != "x" ; then
|
|||||||
EXTRA_DIRS="${EXTRA_DIRS} $with_plib"
|
EXTRA_DIRS="${EXTRA_DIRS} $with_plib"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# specify the osg location
|
||||||
|
AC_ARG_WITH(osg, [ --with-osg=PREFIX Specify the prefix path to osg])
|
||||||
|
|
||||||
|
if test "x$with_osg" != "x" ; then
|
||||||
|
echo "osg prefix is $with_osg"
|
||||||
|
EXTRA_DIRS="${EXTRA_DIRS} $with_osg"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Determine an extra directories to add to include/lib search paths
|
dnl Determine an extra directories to add to include/lib search paths
|
||||||
case "${host}" in
|
case "${host}" in
|
||||||
*-apple-darwin* | *-*-mingw32*)
|
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
|
||||||
echo no EXTRA_DIRS for $host
|
echo no EXTRA_DIRS for $host
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -165,33 +173,18 @@ dnl Checks for libraries.
|
|||||||
|
|
||||||
dnl Thread related checks
|
dnl Thread related checks
|
||||||
AC_CHECK_HEADER(pthread.h)
|
AC_CHECK_HEADER(pthread.h)
|
||||||
AC_CHECK_LIB(pthread, pthread_exit)
|
AC_SEARCH_LIBS(pthread_exit, [pthread c_r])
|
||||||
if test "x$ac_cv_lib_pthread_pthread_exit" = "xyes" -a "x$ac_cv_header_pthread_h" = "xyes"; then
|
if test "x$ac_cv_header_pthread_h" = "xyes"; then
|
||||||
CXXFLAGS="$CXXFLAGS -D_REENTRANT"
|
CXXFLAGS="$CXXFLAGS -D_REENTRANT"
|
||||||
CFLAGS="$CFLAGS -D_REENTRANT"
|
CFLAGS="$CFLAGS -D_REENTRANT"
|
||||||
fi
|
|
||||||
if test "x$ac_cv_lib_pthread_pthread_exit" != "xyes" -a "x$ac_cv_header_pthread_h" = "xyes"; then
|
if test "x$ac_cv_search_pthread_exit" = "x-lc_r"; then
|
||||||
dnl FreeBSD: System has pthread.h, but -lpthread library check
|
|
||||||
dnl fails. See if we need -pthread instead of -lpthread and look
|
|
||||||
dnl for the functions in libc_r.
|
|
||||||
save_CXXFLAGS="$CXXFLAGS"
|
|
||||||
save_CFLAGS="$CFLAGS"
|
|
||||||
CXXFLAGS="-pthread $CXXFLAGS"
|
CXXFLAGS="-pthread $CXXFLAGS"
|
||||||
CFLAGS="-pthread $FLAGS"
|
CFLAGS="-pthread $CFLAGS"
|
||||||
save_LIBS=$LIBS
|
fi
|
||||||
AC_CHECK_LIB(c_r, pthread_exit)
|
|
||||||
if test "x$ac_cv_lib_c_r_pthread_exit" != "xyes"; then
|
|
||||||
CXXFLAGS=$save_CXXFLAGS
|
|
||||||
CFLAGS=$save_CFLAGS
|
|
||||||
else
|
|
||||||
dnl This is cheating a bit. pthread_exit comes with using -pthread, not
|
|
||||||
-lpthread
|
|
||||||
ac_cv_lib_pthread_pthread_exit="yes"
|
|
||||||
fi
|
|
||||||
LIBS=$save_LIBS
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AM_CONDITIONAL(HAVE_THREADS, test "x$ac_cv_lib_pthread_pthread_exit" = "xyes" -a "x$ac_cv_header_pthread_h" = "xyes")
|
AM_CONDITIONAL(HAVE_THREADS, test "x$ac_cv_header_pthread_h" = "xyes")
|
||||||
|
|
||||||
thread_LIBS="$LIBS"
|
thread_LIBS="$LIBS"
|
||||||
LIBS=""
|
LIBS=""
|
||||||
@@ -267,34 +260,77 @@ case "${host}" in
|
|||||||
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
AC_SEARCH_LIBS(glutGetModifiers, [ glut glut32 freeglut ], have_glut=yes, have_glut=no)
|
||||||
|
AM_CONDITIONAL(HAVE_GLUT, test "x$have_glut" = "xyes")
|
||||||
|
|
||||||
opengl_LIBS="$LIBS"
|
opengl_LIBS="$LIBS"
|
||||||
LIBS="$base_LIBS"
|
LIBS="$base_LIBS"
|
||||||
|
|
||||||
dnl check for OpenAL libraries
|
dnl check for OpenAL libraries
|
||||||
|
OPENAL_OK="no"
|
||||||
|
ALUT_OK="no"
|
||||||
case "${host}" in
|
case "${host}" in
|
||||||
*-*-cygwin* | *-*-mingw32*)
|
*-*-cygwin* | *-*-mingw32*)
|
||||||
dnl CygWin under Windoze.
|
dnl CygWin under Windoze.
|
||||||
|
INCLUDES="$INCLUDES -I/usr/local/include/"
|
||||||
AC_SEARCH_LIBS(alGenBuffers, openal32)
|
LIBS="$LIBS -L/usr/local/lib"
|
||||||
AC_SEARCH_LIBS(alutInit, [ openal32 ALut ] )
|
AC_SEARCH_LIBS(alGenBuffers, [ openal32 openal ] )
|
||||||
|
AC_SEARCH_LIBS(alutInit, [ openal32 ALut alut ] )
|
||||||
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
|
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
|
||||||
|
openal_LIBS="$LIBS"
|
||||||
|
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||||
|
ALUT_OK="$ac_cv_search_alutInit"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-apple-darwin*)
|
*-apple-darwin*)
|
||||||
dnl Mac OS X
|
dnl Mac OS X
|
||||||
|
|
||||||
LIBS="$LIBS -framework IOKit -framework OpenAL"
|
LIBS="$LIBS -framework IOKit -framework OpenAL"
|
||||||
|
openal_LIBS="$LIBS"
|
||||||
|
# not sure how to test if OpenAL exists on MacOS (does it come by default?)
|
||||||
|
OPENAL_OK="yes"
|
||||||
|
ALUT_OK="yes"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
dnl default unix style machines
|
dnl default unix style machines
|
||||||
|
|
||||||
|
save_LIBS=$LIBS
|
||||||
|
LIBS="$LIBS $thread_LIBS"
|
||||||
AC_SEARCH_LIBS(alGenBuffers, openal)
|
AC_SEARCH_LIBS(alGenBuffers, openal)
|
||||||
|
AC_SEARCH_LIBS(alutInit, [ alut openal ] )
|
||||||
|
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||||
|
ALUT_OK="$ac_cv_search_alutInit"
|
||||||
|
openal_LIBS="$LIBS"
|
||||||
|
LIBS=$save_LIBS
|
||||||
;;
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
openal_LIBS="$LIBS"
|
if test "$OPENAL_OK" == "no"; then
|
||||||
|
echo
|
||||||
|
echo "You *must* have the openal library installed on your system to build"
|
||||||
|
echo "SimGear!"
|
||||||
|
echo
|
||||||
|
echo "Please see README.OpenAL for more details."
|
||||||
|
echo
|
||||||
|
echo "configure aborted."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$ALUT_OK" == "no"; then
|
||||||
|
echo
|
||||||
|
echo "You *must* have the alut library installed on your system to build"
|
||||||
|
echo "SimGear!"
|
||||||
|
echo
|
||||||
|
echo "Please see README.OpenAL for more details."
|
||||||
|
echo
|
||||||
|
echo "configure aborted."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LIBS="$base_LIBS"
|
LIBS="$base_LIBS"
|
||||||
|
|
||||||
AC_SUBST(base_LIBS)
|
AC_SUBST(base_LIBS)
|
||||||
@@ -325,11 +361,11 @@ if test "x$ac_cv_header_plib_ul_h" != "xyes"; then
|
|||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING([for plib 1.6.0 or newer])
|
AC_MSG_CHECKING([for plib 1.8.5 or newer])
|
||||||
AC_TRY_RUN([
|
AC_TRY_RUN([
|
||||||
#include <plib/ul.h>
|
#include <plib/ul.h>
|
||||||
|
|
||||||
#define MIN_PLIB_VERSION 160
|
#define MIN_PLIB_VERSION 185
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int major, minor, micro;
|
int major, minor, micro;
|
||||||
@@ -344,12 +380,24 @@ int main() {
|
|||||||
],
|
],
|
||||||
AC_MSG_RESULT(yes),
|
AC_MSG_RESULT(yes),
|
||||||
[AC_MSG_RESULT(wrong version);
|
[AC_MSG_RESULT(wrong version);
|
||||||
AC_MSG_ERROR([Install plib 1.6.0 or later first...])],
|
AC_MSG_ERROR([Install plib 1.8.5 or later first...])],
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
)
|
)
|
||||||
|
|
||||||
LIBS="$saved_LIBS"
|
LIBS="$saved_LIBS"
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(osg/Version)
|
||||||
|
if test "x$ac_cv_header_osg_Version" != "xyes"; then
|
||||||
|
echo
|
||||||
|
echo "You *must* have the OpenSceneGraph support library installed on your system"
|
||||||
|
echo "to build this version of SimGear!"
|
||||||
|
echo
|
||||||
|
echo "Please see README.OSG for more details."
|
||||||
|
echo
|
||||||
|
echo "configure aborted."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
AC_LANG_POP
|
AC_LANG_POP
|
||||||
|
|
||||||
dnl Check for system installed zlib
|
dnl Check for system installed zlib
|
||||||
@@ -381,6 +429,7 @@ fi
|
|||||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_MODE_T
|
||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
AC_STRUCT_TM
|
AC_STRUCT_TM
|
||||||
|
|
||||||
@@ -399,7 +448,6 @@ AM_CONFIG_HEADER(simgear/simgear_config.h)
|
|||||||
AC_CONFIG_FILES([ \
|
AC_CONFIG_FILES([ \
|
||||||
Makefile \
|
Makefile \
|
||||||
SimGear.spec \
|
SimGear.spec \
|
||||||
src-libs/Makefile \
|
|
||||||
simgear/Makefile \
|
simgear/Makefile \
|
||||||
simgear/version.h \
|
simgear/version.h \
|
||||||
simgear/compatibility/Makefile \
|
simgear/compatibility/Makefile \
|
||||||
@@ -417,19 +465,17 @@ AC_CONFIG_FILES([ \
|
|||||||
simgear/props/Makefile \
|
simgear/props/Makefile \
|
||||||
simgear/route/Makefile \
|
simgear/route/Makefile \
|
||||||
simgear/scene/Makefile \
|
simgear/scene/Makefile \
|
||||||
simgear/scene/fgsg/Makefile \
|
|
||||||
simgear/scene/material/Makefile \
|
simgear/scene/material/Makefile \
|
||||||
simgear/scene/model/Makefile \
|
simgear/scene/model/Makefile \
|
||||||
simgear/scene/sky/Makefile \
|
simgear/scene/sky/Makefile \
|
||||||
simgear/scene/sky/clouds3d/Makefile \
|
|
||||||
simgear/scene/tgdb/Makefile \
|
simgear/scene/tgdb/Makefile \
|
||||||
|
simgear/scene/util/Makefile \
|
||||||
simgear/screen/Makefile \
|
simgear/screen/Makefile \
|
||||||
simgear/serial/Makefile \
|
simgear/serial/Makefile \
|
||||||
simgear/sound/Makefile \
|
simgear/sound/Makefile \
|
||||||
simgear/structure/Makefile \
|
simgear/structure/Makefile \
|
||||||
simgear/threads/Makefile \
|
simgear/threads/Makefile \
|
||||||
simgear/timing/Makefile \
|
simgear/timing/Makefile \
|
||||||
simgear/xgl/Makefile \
|
|
||||||
simgear/xml/Makefile \
|
simgear/xml/Makefile \
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
@@ -456,7 +502,7 @@ else
|
|||||||
echo "Without JPEG Factory support"
|
echo "Without JPEG Factory support"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$ac_cv_lib_pthread_pthread_exit" = "xyes" -a "x$ac_cv_header_pthread_h" = "xyes"; then
|
if test "x$ac_cv_header_pthread_h" = "xyes"; then
|
||||||
echo "Threads: pthread lib found."
|
echo "Threads: pthread lib found."
|
||||||
else
|
else
|
||||||
echo "Threads: no threads (pthread lib not found.)"
|
echo "Threads: no threads (pthread lib not found.)"
|
||||||
|
|||||||
Executable
+4
@@ -0,0 +1,4 @@
|
|||||||
|
Debug
|
||||||
|
Release
|
||||||
|
SimGear.ncb
|
||||||
|
SimGear.suo
|
||||||
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimGear", "SimGear.vcproj", "{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
|
Debug = Debug
|
||||||
|
Release = Release
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfiguration) = postSolution
|
||||||
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug.ActiveCfg = Debug|Win32
|
||||||
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Debug.Build.0 = Debug|Win32
|
||||||
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release.ActiveCfg = Release|Win32
|
||||||
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED}.Release.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
Executable
+1218
File diff suppressed because it is too large
Load Diff
Executable
+20
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual C++ Express 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SimGear", "SimGear.vcproj", "{952B5B5B-7FC8-4AE9-A664-333322BEEEB0}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{952B5B5B-7FC8-4AE9-A664-333322BEEEB0}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{952B5B5B-7FC8-4AE9-A664-333322BEEEB0}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{952B5B5B-7FC8-4AE9-A664-333322BEEEB0}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{952B5B5B-7FC8-4AE9-A664-333322BEEEB0}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
Executable
+1420
File diff suppressed because it is too large
Load Diff
+4
-5
@@ -7,10 +7,10 @@ endif
|
|||||||
# METAR_DIRS =
|
# METAR_DIRS =
|
||||||
METAR_DIRS = environment
|
METAR_DIRS = environment
|
||||||
|
|
||||||
EXTRA_DIST = simgear_config.h.vc5 version.h.in
|
EXTRA_DIST = simgear_config.h.vc5 simgear_config.h-msvc71 version.h.in
|
||||||
|
|
||||||
include_HEADERS = \
|
include_HEADERS = \
|
||||||
compiler.h constants.h sg_inlines.h sg_traits.hxx version.h
|
compiler.h constants.h sg_inlines.h version.h
|
||||||
|
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
$(compatibility_DIR) \
|
$(compatibility_DIR) \
|
||||||
@@ -32,7 +32,6 @@ SUBDIRS = \
|
|||||||
serial \
|
serial \
|
||||||
sound \
|
sound \
|
||||||
$(SGTHREAD_DIR) \
|
$(SGTHREAD_DIR) \
|
||||||
timing \
|
timing
|
||||||
xgl
|
|
||||||
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS) compatibility threads
|
DIST_SUBDIRS = $(SUBDIRS) compatibility
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ libsgbucket_a_SOURCES = newbucket.cxx
|
|||||||
# testbucket_SOURCES = testbucket.cxx
|
# testbucket_SOURCES = testbucket.cxx
|
||||||
|
|
||||||
# testbucket_LDADD = \
|
# testbucket_LDADD = \
|
||||||
# $(top_builddir)/bucket/libsgbucket.a \
|
# libsgbucket.a \
|
||||||
# $(top_builddir)/misc/libsgmisc.a
|
# $(top_builddir)/misc/libsgmisc.a
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Written by Curtis L. Olson, started February 1999.
|
* Written by Curtis L. Olson, started February 1999.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
* Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt/
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Library General Public
|
* modify it under the terms of the GNU Library General Public
|
||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -45,6 +44,9 @@ SGBucket::SGBucket(const double dlon, const double dlat) {
|
|||||||
set_bucket(dlon, dlat);
|
set_bucket(dlon, dlat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SGBucket::SGBucket(const SGGeod& geod) {
|
||||||
|
set_bucket(geod);
|
||||||
|
}
|
||||||
|
|
||||||
// create an impossible bucket if false
|
// create an impossible bucket if false
|
||||||
SGBucket::SGBucket(const bool is_good) {
|
SGBucket::SGBucket(const bool is_good) {
|
||||||
@@ -74,11 +76,6 @@ SGBucket::SGBucket(const long int bindex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// default destructor
|
|
||||||
SGBucket::~SGBucket() {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Set the bucket params for the specified lat and lon
|
// Set the bucket params for the specified lat and lon
|
||||||
void SGBucket::set_bucket( double *lonlat ) {
|
void SGBucket::set_bucket( double *lonlat ) {
|
||||||
set_bucket( lonlat[0], lonlat[1] );
|
set_bucket( lonlat[0], lonlat[1] );
|
||||||
@@ -136,6 +133,11 @@ void SGBucket::set_bucket( double dlon, double dlat ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGBucket::set_bucket(const SGGeod& geod)
|
||||||
|
{
|
||||||
|
set_bucket(geod.getLongitudeDeg(), geod.getLatitudeDeg());
|
||||||
|
}
|
||||||
|
|
||||||
// Build the path name for this bucket
|
// Build the path name for this bucket
|
||||||
string SGBucket::gen_base_path() const {
|
string SGBucket::gen_base_path() const {
|
||||||
// long int index;
|
// long int index;
|
||||||
@@ -208,7 +210,7 @@ double SGBucket::get_width_m() const {
|
|||||||
double clat_rad = clat * SGD_DEGREES_TO_RADIANS;
|
double clat_rad = clat * SGD_DEGREES_TO_RADIANS;
|
||||||
double cos_lat = cos( clat_rad );
|
double cos_lat = cos( clat_rad );
|
||||||
double local_radius = cos_lat * SG_EQUATORIAL_RADIUS_M;
|
double local_radius = cos_lat * SG_EQUATORIAL_RADIUS_M;
|
||||||
double local_perimeter = 2.0 * local_radius * SGD_PI;
|
double local_perimeter = local_radius * SGD_2PI;
|
||||||
double degree_width = local_perimeter / 360.0;
|
double degree_width = local_perimeter / 360.0;
|
||||||
|
|
||||||
return sg_bucket_span( get_center_lat() ) * degree_width;
|
return sg_bucket_span( get_center_lat() ) * degree_width;
|
||||||
@@ -217,7 +219,7 @@ double SGBucket::get_width_m() const {
|
|||||||
|
|
||||||
// return height of the tile in meters
|
// return height of the tile in meters
|
||||||
double SGBucket::get_height_m() const {
|
double SGBucket::get_height_m() const {
|
||||||
double perimeter = 2.0 * SG_EQUATORIAL_RADIUS_M * SGD_PI;
|
double perimeter = SG_EQUATORIAL_RADIUS_M * SGD_2PI;
|
||||||
double degree_height = perimeter / 360.0;
|
double degree_height = perimeter / 360.0;
|
||||||
|
|
||||||
return SG_BUCKET_SPAN * degree_height;
|
return SG_BUCKET_SPAN * degree_height;
|
||||||
@@ -271,16 +273,32 @@ void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy ) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// longitude difference
|
// longitude difference
|
||||||
double c1_lon = b1.get_center_lon();
|
double diff_lon=0.0;
|
||||||
double c2_lon = b2.get_center_lon();
|
double span=0.0;
|
||||||
double diff_lon = c2_lon - c1_lon;
|
|
||||||
double span;
|
SGBucket tmp_bucket;
|
||||||
if ( sg_bucket_span(c1_lat) <= sg_bucket_span(c2_lat) ) {
|
// To handle crossing the bucket size boundary
|
||||||
|
// we need to account for different size buckets.
|
||||||
|
|
||||||
|
if ( sg_bucket_span(c1_lat) <= sg_bucket_span(c2_lat) )
|
||||||
|
{
|
||||||
span = sg_bucket_span(c1_lat);
|
span = sg_bucket_span(c1_lat);
|
||||||
} else {
|
} else {
|
||||||
span = sg_bucket_span(c2_lat);
|
span = sg_bucket_span(c2_lat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diff_lon = b2.get_center_lon() - b1.get_center_lon();
|
||||||
|
|
||||||
|
if (diff_lon <0.0)
|
||||||
|
{
|
||||||
|
diff_lon -= b1.get_width()*0.5 + b2.get_width()*0.5 - span;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
diff_lon += b1.get_width()*0.5 + b2.get_width()*0.5 - span;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_RINT
|
#ifdef HAVE_RINT
|
||||||
*dx = (int)rint( diff_lon / span );
|
*dx = (int)rint( diff_lon / span );
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Written by Curtis L. Olson, started February 1999.
|
* Written by Curtis L. Olson, started February 1999.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
* Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Library General Public
|
* modify it under the terms of the GNU Library General Public
|
||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -32,30 +31,12 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
|
#include <simgear/math/SGMath.hxx>
|
||||||
|
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
#include <cmath>
|
||||||
# include <cmath>
|
#include <cstdio> // sprintf()
|
||||||
# include <cstdio> // sprintf()
|
#include <ostream>
|
||||||
#else
|
#include <string>
|
||||||
# include <math.h>
|
|
||||||
# include <stdio.h> // sprintf()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include STL_IOSTREAM
|
|
||||||
|
|
||||||
// I don't understand ... <math.h> or <cmath> should be included
|
|
||||||
// already depending on how you defined SG_HAVE_STD_INCLUDES, but I
|
|
||||||
// can go ahead and add this -- CLO
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
SG_USING_STD(sprintf);
|
|
||||||
SG_USING_STD(fabs);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include STL_STRING
|
|
||||||
|
|
||||||
SG_USING_STD(string);
|
|
||||||
SG_USING_STD(ostream);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* standard size of a bucket in degrees (1/8 of a degree)
|
* standard size of a bucket in degrees (1/8 of a degree)
|
||||||
@@ -115,10 +96,10 @@ class SGBucket {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
double cx, cy; // centerpoint (lon, lat) in degrees of bucket
|
double cx, cy; // centerpoint (lon, lat) in degrees of bucket
|
||||||
int lon; // longitude index (-180 to 179)
|
short lon; // longitude index (-180 to 179)
|
||||||
int lat; // latitude index (-90 to 89)
|
short lat; // latitude index (-90 to 89)
|
||||||
int x; // x subdivision (0 to 7)
|
char x; // x subdivision (0 to 7)
|
||||||
int y; // y subdivision (0 to 7)
|
char y; // y subdivision (0 to 7)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -134,6 +115,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
SGBucket(const double dlon, const double dlat);
|
SGBucket(const double dlon, const double dlat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a bucket given a specific location.
|
||||||
|
* @param dlon longitude specified in degrees
|
||||||
|
* @param dlat latitude specified in degrees
|
||||||
|
*/
|
||||||
|
SGBucket(const SGGeod& geod);
|
||||||
|
|
||||||
/** Construct a bucket.
|
/** Construct a bucket.
|
||||||
* @param is_good if false, create an invalid bucket. This is
|
* @param is_good if false, create an invalid bucket. This is
|
||||||
* useful * if you are comparing cur_bucket to last_bucket and
|
* useful * if you are comparing cur_bucket to last_bucket and
|
||||||
@@ -147,11 +135,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
SGBucket(const long int bindex);
|
SGBucket(const long int bindex);
|
||||||
|
|
||||||
/**
|
|
||||||
* Default destructor.
|
|
||||||
*/
|
|
||||||
~SGBucket();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset a bucket to represent a new lat and lon
|
* Reset a bucket to represent a new lat and lon
|
||||||
* @param dlon longitude specified in degrees
|
* @param dlon longitude specified in degrees
|
||||||
@@ -166,6 +149,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
void set_bucket( double *lonlat );
|
void set_bucket( double *lonlat );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset a bucket to represent a new lat and lon
|
||||||
|
* @param dlon longitude specified in degrees
|
||||||
|
* @param dlat latitude specified in degrees
|
||||||
|
*/
|
||||||
|
void set_bucket(const SGGeod& geod);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an impossible bucket.
|
* Create an impossible bucket.
|
||||||
* This is useful if you are comparing cur_bucket to last_bucket
|
* This is useful if you are comparing cur_bucket to last_bucket
|
||||||
@@ -201,18 +191,19 @@ public:
|
|||||||
* string form.
|
* string form.
|
||||||
* @return tile index in string form
|
* @return tile index in string form
|
||||||
*/
|
*/
|
||||||
inline string gen_index_str() const {
|
inline std::string gen_index_str() const {
|
||||||
char tmp[20];
|
char tmp[20];
|
||||||
sprintf(tmp, "%ld",
|
std::sprintf(tmp, "%ld",
|
||||||
(((long)lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x);
|
(((long)lon + 180) << 14) + ((lat + 90) << 6)
|
||||||
return (string)tmp;
|
+ (y << 3) + x);
|
||||||
|
return (std::string)tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the base path name for this bucket.
|
* Build the base path name for this bucket.
|
||||||
* @return base path in string form
|
* @return base path in string form
|
||||||
*/
|
*/
|
||||||
string gen_base_path() const;
|
std::string gen_base_path() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the center lon of a tile.
|
* @return the center lon of a tile.
|
||||||
@@ -253,7 +244,24 @@ public:
|
|||||||
* @return the height of the tile in meters.
|
* @return the height of the tile in meters.
|
||||||
*/
|
*/
|
||||||
double get_height_m() const;
|
double get_height_m() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the center of the bucket in geodetic coordinates.
|
||||||
|
*/
|
||||||
|
SGGeod get_center() const
|
||||||
|
{ return SGGeod::fromDeg(get_center_lon(), get_center_lat()); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the center of the bucket in geodetic coordinates.
|
||||||
|
*/
|
||||||
|
SGGeod get_corner(unsigned num) const
|
||||||
|
{
|
||||||
|
double lonFac = ((num + 1) & 2) ? 0.5 : -0.5;
|
||||||
|
double latFac = ((num ) & 2) ? 0.5 : -0.5;
|
||||||
|
return SGGeod::fromDeg(get_center_lon() + lonFac*get_width(),
|
||||||
|
get_center_lat() + latFac*get_height());
|
||||||
|
}
|
||||||
|
|
||||||
// Informational methods.
|
// Informational methods.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -280,10 +288,15 @@ public:
|
|||||||
|
|
||||||
// friends
|
// friends
|
||||||
|
|
||||||
friend ostream& operator<< ( ostream&, const SGBucket& );
|
friend std::ostream& operator<< ( std::ostream&, const SGBucket& );
|
||||||
friend bool operator== ( const SGBucket&, const SGBucket& );
|
friend bool operator== ( const SGBucket&, const SGBucket& );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline bool operator!= (const SGBucket& lhs, const SGBucket& rhs)
|
||||||
|
{
|
||||||
|
return !(lhs == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \relates SGBucket
|
* \relates SGBucket
|
||||||
@@ -314,8 +327,8 @@ void sgBucketDiff( const SGBucket& b1, const SGBucket& b2, int *dx, int *dy );
|
|||||||
* @param out output stream
|
* @param out output stream
|
||||||
* @param b bucket
|
* @param b bucket
|
||||||
*/
|
*/
|
||||||
inline ostream&
|
inline std::ostream&
|
||||||
operator<< ( ostream& out, const SGBucket& b )
|
operator<< ( std::ostream& out, const SGBucket& b )
|
||||||
{
|
{
|
||||||
return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y;
|
return out << b.lon << ":" << b.x << ", " << b.lat << ":" << b.y;
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-334
@@ -11,10 +11,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
*
|
*
|
||||||
@@ -24,48 +23,9 @@
|
|||||||
* A set of defines to encapsulate compiler and platform differences.
|
* A set of defines to encapsulate compiler and platform differences.
|
||||||
* Please refer to the source code for full documentation on this file.
|
* Please refer to the source code for full documentation on this file.
|
||||||
*
|
*
|
||||||
* Here is a summary of what this file does.
|
* This file is useful to set compiler-specific options in every file - for
|
||||||
|
* example, disabling warnings.
|
||||||
*
|
*
|
||||||
* (1) Defines macros for some STL includes which may be affected
|
|
||||||
* by file name length limitations.
|
|
||||||
*
|
|
||||||
* (2) Defines macros for some features not supported by all C++ compilers.
|
|
||||||
*
|
|
||||||
* (3) Defines 'explicit' as a null macro if the compiler doesn't support
|
|
||||||
* the explicit keyword.
|
|
||||||
*
|
|
||||||
* (4) Defines 'typename' as a null macro if the compiler doesn't support
|
|
||||||
* the typename keyword.
|
|
||||||
*
|
|
||||||
* (5) Defines bool, true and false if the compiler doesn't do so.
|
|
||||||
*
|
|
||||||
* (6) Defines SG_EXPLICIT_FUNCTION_TMPL_ARGS if the compiler
|
|
||||||
* supports calling a function template by providing its template
|
|
||||||
* arguments explicitly.
|
|
||||||
*
|
|
||||||
* (7) Defines SG_NEED_AUTO_PTR if STL doesn't provide auto_ptr<>.
|
|
||||||
*
|
|
||||||
* (8) Defines SG_NO_ARROW_OPERATOR if the compiler is unable
|
|
||||||
* to support operator->() for iterators.
|
|
||||||
*
|
|
||||||
* (9) Defines SG_USE_EXCEPTIONS if the compiler supports exceptions.
|
|
||||||
* Note: no FlightGear code uses exceptions.
|
|
||||||
*
|
|
||||||
* (10) Define SG_NAMESPACES if the compiler supports namespaces.
|
|
||||||
*
|
|
||||||
* (11) SG_MATH_FN_IN_NAMESPACE_STD -- not used??
|
|
||||||
*
|
|
||||||
* (12) Define SG_HAVE_STD if std namespace is supported.
|
|
||||||
*
|
|
||||||
* (13) Defines SG_CLASS_PARTIAL_SPECIALIZATION if the compiler
|
|
||||||
* supports partial specialization of class templates.
|
|
||||||
*
|
|
||||||
* (14) Defines SG_HAVE_STD_INCLUDES to use ISO C++ Standard headers.
|
|
||||||
*
|
|
||||||
* (15) Defines SG_HAVE_STREAMBUF if <streambuf> of <streambuf.h> are present.
|
|
||||||
*
|
|
||||||
* (16) Define SG_MATH_EXCEPTION_CLASH if math.h defines an exception class
|
|
||||||
* that clashes with the one defined in <stdexcept>.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _SG_COMPILER_H
|
#ifndef _SG_COMPILER_H
|
||||||
@@ -80,157 +40,30 @@
|
|||||||
#define SG_DO_STRINGIZE(X) #X
|
#define SG_DO_STRINGIZE(X) #X
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
# if __GNUC__ == 2
|
# if __GNUC__ < 3
|
||||||
# if __GNUC_MINOR__ < 8
|
# error Time to upgrade. GNU compilers < 3.0 not supported
|
||||||
|
# elif (__GNUC__ == 3) && (__GNUC_MINOR__ < 4)
|
||||||
// g++-2.7.x
|
# warning GCC compilers prior to 3.4 are suspect
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip.h>
|
|
||||||
# define STL_IOSTREAM <iostream.h>
|
|
||||||
# define STL_ITERATOR <iterator.h>
|
|
||||||
# define STL_FSTREAM <fstream.h>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream.h>
|
|
||||||
|
|
||||||
# define SG_NEED_AUTO_PTR
|
|
||||||
# define SG_NO_DEFAULT_TEMPLATE_ARGS
|
|
||||||
# define SG_INCOMPLETE_FUNCTIONAL
|
|
||||||
# define SG_NO_ARROW_OPERATOR
|
|
||||||
|
|
||||||
# elif __GNUC_MINOR__ >= 8
|
|
||||||
|
|
||||||
// g++-2.8.x and egcs-1.x
|
|
||||||
# define SG_EXPLICIT_FUNCTION_TMPL_ARGS
|
|
||||||
# define SG_NEED_AUTO_PTR
|
|
||||||
# define SG_MEMBER_TEMPLATES
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
# define SG_CLASS_PARTIAL_SPECIALIZATION
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
# endif
|
|
||||||
# elif __GNUC__ == 3
|
|
||||||
// g++-3.0.x
|
|
||||||
# define SG_EXPLICIT_FUNCTION_TMPL_ARGS
|
|
||||||
# define SG_NEED_AUTO_PTR
|
|
||||||
# define SG_MEMBER_TEMPLATES
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
# define SG_CLASS_PARTIAL_SPECIALIZATION
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
# else
|
|
||||||
# error Time to upgrade. GNU compilers < 2.7 not supported
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# define SG_COMPILER_STR "GNU C++ version " SG_STRINGIZE(__GNUC__) "." SG_STRINGIZE(__GNUC_MINOR__)
|
# define SG_COMPILER_STR "GNU C++ version " SG_STRINGIZE(__GNUC__) "." SG_STRINGIZE(__GNUC_MINOR__)
|
||||||
|
|
||||||
#endif // __GNUC__
|
#endif // __GNUC__
|
||||||
|
|
||||||
/* KAI C++ */
|
/* KAI C++ */
|
||||||
#if defined(__KCC)
|
#if defined(__KCC)
|
||||||
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
# define SG_HAVE_TRAITS
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
# define SG_COMPILER_STR "Kai C++ version " SG_STRINGIZE(__KCC_VERSION)
|
# define SG_COMPILER_STR "Kai C++ version " SG_STRINGIZE(__KCC_VERSION)
|
||||||
|
|
||||||
#endif // __KCC
|
#endif // __KCC
|
||||||
|
|
||||||
//
|
|
||||||
// Metrowerks
|
|
||||||
//
|
|
||||||
#if defined(__MWERKS__)
|
|
||||||
/*
|
|
||||||
CodeWarrior compiler from Metrowerks, Inc.
|
|
||||||
*/
|
|
||||||
# define SG_HAVE_TRAITS
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
|
|
||||||
// Temp:
|
|
||||||
# define bcopy(from, to, n) memcpy(to, from, n)
|
|
||||||
|
|
||||||
// -rp- please use FG_MEM_COPY everywhere !
|
|
||||||
// #define FG_MEM_COPY(to,from,n) memcpy(to, from, n)
|
|
||||||
|
|
||||||
// -dw- currently used glut has no game mode stuff
|
|
||||||
# define GLUT_WRONG_VERSION
|
|
||||||
|
|
||||||
# define SG_COMPILER_STR "Metrowerks CodeWarrior C++ version " SG_STRINGIZE(__MWERKS__)
|
|
||||||
|
|
||||||
#endif // __MWERKS__
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Microsoft compilers.
|
// Microsoft compilers.
|
||||||
//
|
//
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# define bcopy(from, to, n) memcpy(to, from, n)
|
# define bcopy(from, to, n) memcpy(to, from, n)
|
||||||
# define FG_MEM_COPY(to,from,n) memcpy(to, from, n)
|
|
||||||
|
|
||||||
# if _MSC_VER >= 1200 // msvc++ 6.0 or greater
|
# if _MSC_VER >= 1200 // msvc++ 6.0 or greater
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
# define isnan _isnan
|
# define isnan _isnan
|
||||||
# define snprintf _snprintf
|
# define snprintf _snprintf
|
||||||
|
# define copysign _copysign
|
||||||
|
|
||||||
# pragma warning(disable: 4786) // identifier was truncated to '255' characters
|
# pragma warning(disable: 4786) // identifier was truncated to '255' characters
|
||||||
# pragma warning(disable: 4244) // conversion from double to float
|
# pragma warning(disable: 4244) // conversion from double to float
|
||||||
@@ -244,79 +77,23 @@
|
|||||||
|
|
||||||
#endif // _MSC_VER
|
#endif // _MSC_VER
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# if defined(HAVE_SGI_STL_PORT)
|
|
||||||
|
|
||||||
// Use quotes around long file names to get around Borland's include hackery
|
|
||||||
|
|
||||||
# define STL_ALGORITHM "algorithm"
|
|
||||||
# define STL_FUNCTIONAL "functional"
|
|
||||||
|
|
||||||
# define SG_MATH_EXCEPTION_CLASH
|
|
||||||
|
|
||||||
# else
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
# define SG_INCOMPLETE_FUNCTIONAL
|
|
||||||
|
|
||||||
# endif // HAVE_SGI_STL_PORT
|
|
||||||
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define SG_NO_DEFAULT_TEMPLATE_ARGS
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
// # define SG_HAVE_STD
|
|
||||||
|
|
||||||
# define SG_COMPILER_STR "Borland C++ version " SG_STRINGIZE(__BORLANDC__)
|
|
||||||
|
|
||||||
#endif // __BORLANDC__
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Native SGI compilers
|
// Native SGI compilers
|
||||||
//
|
//
|
||||||
|
|
||||||
#if defined ( sgi ) && !defined( __GNUC__ )
|
#if defined ( sgi ) && !defined( __GNUC__ )
|
||||||
# define SG_HAVE_NATIVE_SGI_COMPILERS
|
# if (_COMPILER_VERSION < 740)
|
||||||
|
# error Need MipsPro 7.4.0 or higher now
|
||||||
|
# endif
|
||||||
|
|
||||||
# define SG_EXPLICIT_FUNCTION_TMPL_ARGS
|
#define SG_HAVE_NATIVE_SGI_COMPILERS
|
||||||
# define SG_CLASS_PARTIAL_SPECIALIZATION
|
|
||||||
# define SG_NEED_AUTO_PTR
|
|
||||||
# define SG_MEMBER_TEMPLATES
|
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
# define SG_HAVE_TRAITS
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
#if (_COMPILER_VERSION < 740)
|
|
||||||
# define STL_STRING <irix_string>
|
|
||||||
#else
|
|
||||||
# define STL_STRING <string>
|
|
||||||
#endif
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
#pragma set woff 1001,1012,1014,1116,1155,1172,1174
|
#pragma set woff 1001,1012,1014,1116,1155,1172,1174
|
||||||
#pragma set woff 1401,1460,1551,1552,1681
|
#pragma set woff 1401,1460,1551,1552,1681
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#pragma set woff 1682,3303
|
# pragma set woff 1682,3303
|
||||||
#if (_COMPILER_VERSION >= 740)
|
# pragma set woff 3624
|
||||||
# pragma set woff 3624
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# define SG_COMPILER_STR "SGI MipsPro compiler version " SG_STRINGIZE(_COMPILER_VERSION)
|
# define SG_COMPILER_STR "SGI MipsPro compiler version " SG_STRINGIZE(_COMPILER_VERSION)
|
||||||
@@ -324,7 +101,7 @@
|
|||||||
#endif // Native SGI compilers
|
#endif // Native SGI compilers
|
||||||
|
|
||||||
|
|
||||||
#if defined ( sun )
|
#if defined (__sun)
|
||||||
# include <strings.h>
|
# include <strings.h>
|
||||||
# include <memory.h>
|
# include <memory.h>
|
||||||
# if defined ( __cplusplus )
|
# if defined ( __cplusplus )
|
||||||
@@ -336,7 +113,9 @@
|
|||||||
extern void *memmove(void *, const void *, size_t);
|
extern void *memmove(void *, const void *, size_t);
|
||||||
# endif // __cplusplus
|
# endif // __cplusplus
|
||||||
|
|
||||||
# define SG_COMPILER_STR "Sun compiler version " SG_STRINGIZE(__SUNPRO_CC)
|
# if !defined( __GNUC__ )
|
||||||
|
# define SG_COMPILER_STR "Sun compiler version " SG_STRINGIZE(__SUNPRO_CC)
|
||||||
|
# endif
|
||||||
|
|
||||||
#endif // sun
|
#endif // sun
|
||||||
|
|
||||||
@@ -344,104 +123,23 @@
|
|||||||
// Intel C++ Compiler
|
// Intel C++ Compiler
|
||||||
//
|
//
|
||||||
#if defined(__ICC) || defined (__ECC)
|
#if defined(__ICC) || defined (__ECC)
|
||||||
# define SG_NAMESPACES
|
|
||||||
# define SG_HAVE_STD
|
|
||||||
# define SG_HAVE_STREAMBUF
|
|
||||||
# define SG_HAVE_TRAITS
|
|
||||||
# define SG_HAVE_STD_INCLUDES
|
|
||||||
|
|
||||||
# define STL_ALGORITHM <algorithm>
|
|
||||||
# define STL_FUNCTIONAL <functional>
|
|
||||||
# define STL_IOMANIP <iomanip>
|
|
||||||
# define STL_IOSTREAM <iostream>
|
|
||||||
# define STL_ITERATOR <iterator>
|
|
||||||
# define STL_FSTREAM <fstream>
|
|
||||||
# define STL_STDEXCEPT <stdexcept>
|
|
||||||
# define STL_STRING <string>
|
|
||||||
# define STL_STRSTREAM <strstream>
|
|
||||||
|
|
||||||
# define SG_COMPILER_STR "Intel C++ version " SG_STRINGIZE(__ICC)
|
# define SG_COMPILER_STR "Intel C++ version " SG_STRINGIZE(__ICC)
|
||||||
|
|
||||||
#endif // __ICC
|
#endif // __ICC
|
||||||
|
|
||||||
|
//
|
||||||
|
// Platform dependent gl.h and glut.h definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
|
||||||
|
#else
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// No user modifiable definitions beyond here.
|
// No user modifiable definitions beyond here.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifdef SG_NEED_EXPLICIT
|
|
||||||
# define explicit
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SG_NEED_TYPENAME
|
|
||||||
# define typename
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SG_NEED_MUTABLE
|
|
||||||
# define mutable
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SG_NEED_BOOL
|
|
||||||
typedef int bool;
|
|
||||||
# define true 1
|
|
||||||
# define false 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SG_EXPLICIT_FUNCTION_TMPL_ARGS
|
|
||||||
# define SG_NULL_TMPL_ARGS <>
|
|
||||||
#else
|
|
||||||
# define SG_NULL_TMPL_ARGS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SG_CLASS_PARTIAL_SPECIALIZATION
|
|
||||||
# define SG_TEMPLATE_NULL template<>
|
|
||||||
#else
|
|
||||||
# define SG_TEMPLATE_NULL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// SG_NO_NAMESPACES is a hook so that users can disable namespaces
|
|
||||||
// without having to edit library headers.
|
|
||||||
#if defined(SG_NAMESPACES) && !defined(SG_NO_NAMESPACES)
|
|
||||||
# define SG_NAMESPACE(X) namespace X {
|
|
||||||
# define SG_NAMESPACE_END }
|
|
||||||
# define SG_USING_NAMESPACE(X) using namespace X
|
|
||||||
# else
|
|
||||||
# define SG_NAMESPACE(X)
|
|
||||||
# define SG_NAMESPACE_END
|
|
||||||
# define SG_USING_NAMESPACE(X)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** \def SG_USING_STD(x)
|
|
||||||
* Expands to using std::x if SG_HAVE_STD is defined
|
|
||||||
*/
|
|
||||||
# ifdef SG_HAVE_STD
|
|
||||||
# define SG_USING_STD(X) using std::X
|
|
||||||
# define STD std
|
|
||||||
# else
|
|
||||||
# define SG_USING_STD(X)
|
|
||||||
# define STD
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// Additional <functional> implementation from SGI STL 3.11
|
|
||||||
// Adapter function objects: pointers to member functions
|
|
||||||
#ifdef SG_INCOMPLETE_FUNCTIONAL
|
|
||||||
|
|
||||||
template <class _Ret, class _Tp>
|
|
||||||
class const_mem_fun_ref_t
|
|
||||||
#ifndef __BORLANDC__
|
|
||||||
: public unary_function<_Tp,_Ret>
|
|
||||||
#endif // __BORLANDC__
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit const_mem_fun_ref_t(_Ret (_Tp::*__pf)() const) : _M_f(__pf) {}
|
|
||||||
_Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); }
|
|
||||||
private:
|
|
||||||
_Ret (_Tp::*_M_f)() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class _Ret, class _Tp>
|
|
||||||
inline const_mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)() const)
|
|
||||||
{ return const_mem_fun_ref_t<_Ret,_Tp>(__f); }
|
|
||||||
|
|
||||||
#endif // SG_INCOMPLETE_FUNCTIONAL
|
|
||||||
|
|
||||||
#endif // _SG_COMPILER_H
|
#endif // _SG_COMPILER_H
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started February 2000.
|
// Written by Curtis Olson, started February 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt/
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -14,10 +14,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -32,14 +31,8 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
#include <cmath>
|
||||||
# include <cmath>
|
|
||||||
#else
|
|
||||||
# ifdef SG_MATH_EXCEPTION_CLASH
|
|
||||||
# define exception C_exception
|
|
||||||
# endif
|
|
||||||
# include <math.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <plib/sg.h>
|
#include <plib/sg.h>
|
||||||
|
|
||||||
@@ -76,6 +69,8 @@
|
|||||||
* 6378.165 but this is probably close enough */
|
* 6378.165 but this is probably close enough */
|
||||||
#define SG_EARTH_RAD 6378.155
|
#define SG_EARTH_RAD 6378.155
|
||||||
|
|
||||||
|
// Maximum terrain elevation from sea level
|
||||||
|
#define SG_MAX_ELEVATION_M 9000.0
|
||||||
|
|
||||||
// Earth parameters for WGS 84, taken from LaRCsim/ls_constants.h
|
// Earth parameters for WGS 84, taken from LaRCsim/ls_constants.h
|
||||||
|
|
||||||
@@ -129,6 +124,12 @@
|
|||||||
/** Knots to Miles per second */
|
/** Knots to Miles per second */
|
||||||
#define SG_KT_TO_MPS 0.5144444444444444444
|
#define SG_KT_TO_MPS 0.5144444444444444444
|
||||||
|
|
||||||
|
/** Feet per second to Knots */
|
||||||
|
#define SG_FPS_TO_KT 0.5924838012958962841
|
||||||
|
|
||||||
|
/** Knots to Feet per second */
|
||||||
|
#define SG_KT_TO_FPS 1.6878098571011956874
|
||||||
|
|
||||||
/** Miles per second to Miles per hour */
|
/** Miles per second to Miles per hour */
|
||||||
#define SG_MPS_TO_MPH 2.2369362920544020312
|
#define SG_MPS_TO_MPH 2.2369362920544020312
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,9 @@ typedef enum {
|
|||||||
SG_NETWORK = 0x00004000,
|
SG_NETWORK = 0x00004000,
|
||||||
SG_ATC = 0x00008000,
|
SG_ATC = 0x00008000,
|
||||||
SG_NASAL = 0x00010000,
|
SG_NASAL = 0x00010000,
|
||||||
SG_UNDEFD = 0x00020000, // For range checking
|
SG_INSTR = 0x00020000,
|
||||||
|
SG_SYSTEMS = 0x00040000,
|
||||||
|
SG_UNDEFD = 0x00080000, // For range checking
|
||||||
|
|
||||||
SG_ALL = 0xFFFFFFFF
|
SG_ALL = 0xFFFFFFFF
|
||||||
} sgDebugClass;
|
} sgDebugClass;
|
||||||
|
|||||||
@@ -14,22 +14,37 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "logstream.hxx"
|
#include "logstream.hxx"
|
||||||
|
|
||||||
logstream *global_logstream = NULL;
|
logstream *logstream::global_logstream = 0;
|
||||||
|
|
||||||
bool logbuf::logging_enabled = true;
|
bool logbuf::logging_enabled = true;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
bool logbuf::has_console = true;
|
||||||
|
#endif
|
||||||
sgDebugClass logbuf::logClass = SG_NONE;
|
sgDebugClass logbuf::logClass = SG_NONE;
|
||||||
sgDebugPriority logbuf::logPriority = SG_INFO;
|
sgDebugPriority logbuf::logPriority = SG_INFO;
|
||||||
streambuf* logbuf::sbuf = NULL;
|
streambuf* logbuf::sbuf = NULL;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct ignore_me
|
||||||
|
{
|
||||||
|
ignore_me()
|
||||||
|
{
|
||||||
|
logstream::initGlobalLogstream();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static ignore_me im;
|
||||||
|
}
|
||||||
|
|
||||||
logbuf::logbuf()
|
logbuf::logbuf()
|
||||||
{
|
{
|
||||||
// if ( sbuf == NULL )
|
// if ( sbuf == NULL )
|
||||||
@@ -88,3 +103,12 @@ logstream::setLogLevels( sgDebugClass c, sgDebugPriority p )
|
|||||||
logbuf::set_log_level( c, p );
|
logbuf::set_log_level( c, p );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logstream *
|
||||||
|
logstream::initGlobalLogstream()
|
||||||
|
{
|
||||||
|
// Force initialization of cerr.
|
||||||
|
static std::ios_base::Init initializer;
|
||||||
|
if( !global_logstream )
|
||||||
|
global_logstream = new logstream(std::cerr);
|
||||||
|
return global_logstream;
|
||||||
|
}
|
||||||
|
|||||||
+48
-63
@@ -16,10 +16,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -32,25 +31,13 @@
|
|||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
#include <streambuf>
|
||||||
# include <streambuf>
|
#include <ostream>
|
||||||
# include <iostream>
|
|
||||||
#else
|
|
||||||
# include <iostream.h>
|
|
||||||
# include <simgear/sg_traits.hxx>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <simgear/debug/debug_types.h>
|
#include <simgear/debug/debug_types.h>
|
||||||
|
|
||||||
SG_USING_STD(streambuf);
|
using std::streambuf;
|
||||||
SG_USING_STD(ostream);
|
using std::ostream;
|
||||||
SG_USING_STD(cout);
|
|
||||||
SG_USING_STD(cerr);
|
|
||||||
SG_USING_STD(endl);
|
|
||||||
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
SG_USING_STD(iostream);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// TODO:
|
// TODO:
|
||||||
@@ -68,17 +55,10 @@ SG_USING_STD(iostream);
|
|||||||
#ifdef SG_NEED_STREAMBUF_HACK
|
#ifdef SG_NEED_STREAMBUF_HACK
|
||||||
class logbuf : public __streambuf
|
class logbuf : public __streambuf
|
||||||
#else
|
#else
|
||||||
class logbuf : public streambuf
|
class logbuf : public std::streambuf
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#ifndef SG_HAVE_STD_INCLUDES
|
|
||||||
typedef char_traits<char> traits_type;
|
|
||||||
typedef char_traits<char>::int_type int_type;
|
|
||||||
// typedef char_traits<char>::pos_type pos_type;
|
|
||||||
// typedef char_traits<char>::off_type off_type;
|
|
||||||
#endif
|
|
||||||
// logbuf( streambuf* sb ) : sbuf(sb) {}
|
// logbuf( streambuf* sb ) : sbuf(sb) {}
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
logbuf();
|
logbuf();
|
||||||
@@ -98,6 +78,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
void set_log_state( sgDebugClass c, sgDebugPriority p );
|
void set_log_state( sgDebugClass c, sgDebugPriority p );
|
||||||
|
|
||||||
|
bool would_log( sgDebugClass c, sgDebugPriority p ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the global logging level.
|
* Set the global logging level.
|
||||||
* @param c debug class
|
* @param c debug class
|
||||||
@@ -138,7 +120,11 @@ public:
|
|||||||
* Set the stream buffer
|
* Set the stream buffer
|
||||||
* @param sb stream buffer
|
* @param sb stream buffer
|
||||||
*/
|
*/
|
||||||
void set_sb( streambuf* sb );
|
void set_sb( std::streambuf* sb );
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
static void has_no_console() { has_console = false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@@ -152,9 +138,12 @@ protected:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
// The streambuf used for actual output. Defaults to cerr.rdbuf().
|
// The streambuf used for actual output. Defaults to cerr.rdbuf().
|
||||||
static streambuf* sbuf;
|
static std::streambuf* sbuf;
|
||||||
|
|
||||||
static bool logging_enabled;
|
static bool logging_enabled;
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
static bool has_console;
|
||||||
|
#endif
|
||||||
static sgDebugClass logClass;
|
static sgDebugClass logClass;
|
||||||
static sgDebugPriority logPriority;
|
static sgDebugPriority logPriority;
|
||||||
|
|
||||||
@@ -168,11 +157,7 @@ private:
|
|||||||
inline int
|
inline int
|
||||||
logbuf::sync()
|
logbuf::sync()
|
||||||
{
|
{
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
|
||||||
return sbuf->pubsync();
|
return sbuf->pubsync();
|
||||||
#else
|
|
||||||
return sbuf->sync();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void
|
inline void
|
||||||
@@ -181,11 +166,16 @@ logbuf::set_log_state( sgDebugClass c, sgDebugPriority p )
|
|||||||
logging_enabled = ((c & logClass) != 0 && p >= logPriority);
|
logging_enabled = ((c & logClass) != 0 && p >= logPriority);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool
|
||||||
|
logbuf::would_log( sgDebugClass c, sgDebugPriority p ) const
|
||||||
|
{
|
||||||
|
return ((c & logClass) != 0 && p >= logPriority);
|
||||||
|
}
|
||||||
|
|
||||||
inline logbuf::int_type
|
inline logbuf::int_type
|
||||||
logbuf::overflow( int c )
|
logbuf::overflow( int c )
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
static has_console = false;
|
|
||||||
if ( logging_enabled ) {
|
if ( logging_enabled ) {
|
||||||
if ( !has_console ) {
|
if ( !has_console ) {
|
||||||
AllocConsole();
|
AllocConsole();
|
||||||
@@ -194,7 +184,7 @@ logbuf::overflow( int c )
|
|||||||
freopen("conout$", "w", stderr);
|
freopen("conout$", "w", stderr);
|
||||||
has_console = true;
|
has_console = true;
|
||||||
}
|
}
|
||||||
sbuf->sputc(c);
|
return sbuf->sputc(c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return EOF == 0 ? 1: 0;
|
return EOF == 0 ? 1: 0;
|
||||||
@@ -233,23 +223,23 @@ struct logstream_base
|
|||||||
/**
|
/**
|
||||||
* Class to manage the debug logging stream.
|
* Class to manage the debug logging stream.
|
||||||
*/
|
*/
|
||||||
class logstream : private logstream_base, public ostream
|
class logstream : private logstream_base, public std::ostream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* The default is to send messages to cerr.
|
* The default is to send messages to cerr.
|
||||||
* @param out output stream
|
* @param out output stream
|
||||||
*/
|
*/
|
||||||
logstream( ostream& out )
|
logstream( std::ostream& out )
|
||||||
// : logstream_base(out.rdbuf()),
|
// : logstream_base(out.rdbuf()),
|
||||||
: logstream_base(),
|
: logstream_base(),
|
||||||
ostream(&lbuf) { lbuf.set_sb(out.rdbuf());}
|
std::ostream(&lbuf) { lbuf.set_sb(out.rdbuf());}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the output stream
|
* Set the output stream
|
||||||
* @param out output stream
|
* @param out output stream
|
||||||
*/
|
*/
|
||||||
void set_output( ostream& out ) { lbuf.set_sb( out.rdbuf() ); }
|
void set_output( std::ostream& out ) { lbuf.set_sb( out.rdbuf() ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the global log class and priority level.
|
* Set the global log class and priority level.
|
||||||
@@ -258,22 +248,29 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setLogLevels( sgDebugClass c, sgDebugPriority p );
|
void setLogLevels( sgDebugClass c, sgDebugPriority p );
|
||||||
|
|
||||||
|
bool would_log( sgDebugClass c, sgDebugPriority p ) const
|
||||||
|
{
|
||||||
|
return lbuf.would_log( c, p );
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Output operator to capture the debug level and priority of a message.
|
* Output operator to capture the debug level and priority of a message.
|
||||||
* @param l log level
|
* @param l log level
|
||||||
*/
|
*/
|
||||||
inline ostream& operator<< ( const loglevel& l );
|
inline std::ostream& operator<< ( const loglevel& l );
|
||||||
|
friend logstream& sglog();
|
||||||
|
static logstream *initGlobalLogstream();
|
||||||
|
protected:
|
||||||
|
static logstream *global_logstream;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ostream&
|
inline std::ostream&
|
||||||
logstream::operator<< ( const loglevel& l )
|
logstream::operator<< ( const loglevel& l )
|
||||||
{
|
{
|
||||||
lbuf.set_log_state( l.logClass, l.logPriority );
|
lbuf.set_log_state( l.logClass, l.logPriority );
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern logstream *global_logstream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \relates logstream
|
* \relates logstream
|
||||||
* Return the one and only logstream instance.
|
* Return the one and only logstream instance.
|
||||||
@@ -284,22 +281,7 @@ extern logstream *global_logstream;
|
|||||||
inline logstream&
|
inline logstream&
|
||||||
sglog()
|
sglog()
|
||||||
{
|
{
|
||||||
if (global_logstream == NULL) {
|
return *logstream::initGlobalLogstream();
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
/**
|
|
||||||
* There appears to be a bug in the C++ runtime in Mac OS X that
|
|
||||||
* will crash if certain funtions are called (in this case
|
|
||||||
* cerr.rdbuf()) during static initialization of a class. This
|
|
||||||
* print statement is hack to kick the library in the pants so it
|
|
||||||
* won't crash when cerr.rdbuf() is first called -DW
|
|
||||||
**/
|
|
||||||
cout << "Using Mac OS X hack for initializing C++ stdio..." << endl;
|
|
||||||
#endif
|
|
||||||
global_logstream = new logstream (cerr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return *global_logstream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -311,12 +293,15 @@ sglog()
|
|||||||
*/
|
*/
|
||||||
#ifdef FG_NDEBUG
|
#ifdef FG_NDEBUG
|
||||||
# define SG_LOG(C,P,M)
|
# define SG_LOG(C,P,M)
|
||||||
#elif defined( __MWERKS__ )
|
|
||||||
# define SG_LOG(C,P,M) ::sglog() << ::loglevel(C,P) << M << std::endl
|
|
||||||
#else
|
#else
|
||||||
# define SG_LOG(C,P,M) sglog() << loglevel(C,P) << M << endl
|
# define SG_LOG(C,P,M) do { \
|
||||||
|
logstream& __tmplogstreamref(sglog()); \
|
||||||
|
if(__tmplogstreamref.would_log(C,P)) { \
|
||||||
|
__tmplogstreamref << loglevel(C,P) << M << std::endl; } \
|
||||||
|
} while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define SG_ORIGIN __FILE__ ":" SG_STRINGIZE(__LINE__)
|
||||||
|
|
||||||
#endif // _LOGSTREAM_H
|
#endif // _LOGSTREAM_H
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ includedir = @includedir@/environment
|
|||||||
|
|
||||||
lib_LIBRARIES = libsgenvironment.a
|
lib_LIBRARIES = libsgenvironment.a
|
||||||
|
|
||||||
include_HEADERS = metar.hxx
|
include_HEADERS = metar.hxx visual_enviro.hxx precipitation.hxx
|
||||||
|
|
||||||
libsgenvironment_a_SOURCES = metar.cxx
|
libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx precipitation.cxx
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir)
|
||||||
|
|||||||
+175
-99
@@ -16,7 +16,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -24,8 +24,12 @@
|
|||||||
* @file metar.cxx
|
* @file metar.cxx
|
||||||
* Interface for encoded Meteorological Aerodrome Reports (METAR).
|
* Interface for encoded Meteorological Aerodrome Reports (METAR).
|
||||||
*/
|
*/
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include <simgear/io/sg_socket.hxx>
|
#include <simgear/io/sg_socket.hxx>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
@@ -59,8 +63,10 @@
|
|||||||
* double d = n.getDewpoint_C();
|
* double d = n.getDewpoint_C();
|
||||||
* @endcode
|
* @endcode
|
||||||
*/
|
*/
|
||||||
SGMetar::SGMetar(const string& m, const string& proxy, const string& port, const string& auth) :
|
SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
|
||||||
|
const string& auth, const time_t time) :
|
||||||
_grpcount(0),
|
_grpcount(0),
|
||||||
|
_x_proxy(false),
|
||||||
_year(-1),
|
_year(-1),
|
||||||
_month(-1),
|
_month(-1),
|
||||||
_day(-1),
|
_day(-1),
|
||||||
@@ -74,13 +80,17 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port, const
|
|||||||
_wind_range_to(-1),
|
_wind_range_to(-1),
|
||||||
_temp(NaN),
|
_temp(NaN),
|
||||||
_dewp(NaN),
|
_dewp(NaN),
|
||||||
_pressure(NaN)
|
_pressure(NaN),
|
||||||
|
_rain(false),
|
||||||
|
_hail(false),
|
||||||
|
_snow(false),
|
||||||
|
_cavok(false)
|
||||||
{
|
{
|
||||||
if (m.length() == 4 && isalnum(m[0]) && isalnum(m[1]) && isalnum(m[2]) && isalnum(m[3])) {
|
if (m.length() == 4 && isalnum(m[0]) && isalnum(m[1]) && isalnum(m[2]) && isalnum(m[3])) {
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
_icao[i] = toupper(m[i]);
|
_icao[i] = toupper(m[i]);
|
||||||
_icao[4] = '\0';
|
_icao[4] = '\0';
|
||||||
_data = loadData(_icao, proxy, port, auth);
|
_data = loadData(_icao, proxy, port, auth, time);
|
||||||
} else {
|
} else {
|
||||||
_data = new char[m.length() + 2]; // make room for " \0"
|
_data = new char[m.length() + 2]; // make room for " \0"
|
||||||
strcpy(_data, m.c_str());
|
strcpy(_data, m.c_str());
|
||||||
@@ -92,14 +102,15 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port, const
|
|||||||
_icao[0] = '\0';
|
_icao[0] = '\0';
|
||||||
|
|
||||||
// NOAA preample
|
// NOAA preample
|
||||||
scanPreambleDate();
|
if (!scanPreambleDate())
|
||||||
|
useCurrentDate();
|
||||||
scanPreambleTime();
|
scanPreambleTime();
|
||||||
|
|
||||||
// METAR header
|
// METAR header
|
||||||
scanType();
|
scanType();
|
||||||
if (!scanId() || !scanDate()) {
|
if (!scanId() || !scanDate()) {
|
||||||
delete[] _data;
|
delete[] _data;
|
||||||
throw sg_io_exception("metar data bogus (" + _url + ')');
|
throw sg_io_exception("metar data bogus ", sg_location(_url));
|
||||||
}
|
}
|
||||||
scanModifier();
|
scanModifier();
|
||||||
|
|
||||||
@@ -125,8 +136,9 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port, const
|
|||||||
|
|
||||||
if (_grpcount < 4) {
|
if (_grpcount < 4) {
|
||||||
delete[] _data;
|
delete[] _data;
|
||||||
throw sg_io_exception("metar data incomplete (" + _url + ')');
|
throw sg_io_exception("metar data incomplete ", sg_location(_url));
|
||||||
}
|
}
|
||||||
|
|
||||||
_url = "";
|
_url = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,6 +155,20 @@ SGMetar::~SGMetar()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGMetar::useCurrentDate()
|
||||||
|
{
|
||||||
|
struct tm now;
|
||||||
|
time_t now_sec = time(0);
|
||||||
|
#if defined( _MSC_VER ) || defined ( __MINGW32__ )
|
||||||
|
now = *gmtime(&now_sec);
|
||||||
|
#else
|
||||||
|
gmtime_r(&now_sec, &now);
|
||||||
|
#endif
|
||||||
|
_year = now.tm_year + 1900;
|
||||||
|
_month = now.tm_mon + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If called with "KSFO" loads data from
|
* If called with "KSFO" loads data from
|
||||||
* @code
|
* @code
|
||||||
@@ -157,10 +183,15 @@ SGMetar::~SGMetar()
|
|||||||
* @return pointer to Metar data string, allocated by new char[].
|
* @return pointer to Metar data string, allocated by new char[].
|
||||||
* @see rfc2068.txt for proxy spec ("Proxy-Authorization")
|
* @see rfc2068.txt for proxy spec ("Proxy-Authorization")
|
||||||
*/
|
*/
|
||||||
char *SGMetar::loadData(const char *id, const string& proxy, const string& port, const string& auth)
|
char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
|
||||||
|
const string& auth, time_t time)
|
||||||
{
|
{
|
||||||
|
const int buflen = 512;
|
||||||
|
char buf[2 * buflen];
|
||||||
|
|
||||||
string host = proxy.empty() ? "weather.noaa.gov" : proxy;
|
string host = proxy.empty() ? "weather.noaa.gov" : proxy;
|
||||||
string path = "/pub/data/observations/metar/stations/";
|
string path = "/pub/data/observations/metar/stations/";
|
||||||
|
|
||||||
path += string(id) + ".TXT";
|
path += string(id) + ".TXT";
|
||||||
_url = "http://weather.noaa.gov" + path;
|
_url = "http://weather.noaa.gov" + path;
|
||||||
|
|
||||||
@@ -168,30 +199,31 @@ char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
|
|||||||
sock->set_timeout(10000);
|
sock->set_timeout(10000);
|
||||||
if (!sock->open(SG_IO_OUT)) {
|
if (!sock->open(SG_IO_OUT)) {
|
||||||
delete sock;
|
delete sock;
|
||||||
throw sg_io_exception("cannot connect to " + host);
|
throw sg_io_exception("cannot connect to ", sg_location(host));
|
||||||
}
|
}
|
||||||
|
|
||||||
string get = "GET ";
|
string get = "GET ";
|
||||||
if (!proxy.empty())
|
if (!proxy.empty())
|
||||||
get += "http://weather.noaa.gov";
|
get += "http://weather.noaa.gov";
|
||||||
get += path + " HTTP/1.0\r\n";
|
|
||||||
|
sprintf(buf, "%ld", time);
|
||||||
|
get += path + " HTTP/1.0\015\012X-Time: " + buf + "\015\012";
|
||||||
|
|
||||||
|
if (!auth.empty())
|
||||||
|
get += "Proxy-Authorization: " + auth + "\015\012";
|
||||||
|
|
||||||
|
get += "\015\012";
|
||||||
sock->writestring(get.c_str());
|
sock->writestring(get.c_str());
|
||||||
|
|
||||||
if (!auth.empty()) {
|
|
||||||
get = "Proxy-Authorization: " + auth + "\r\n";
|
|
||||||
sock->writestring(get.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
sock->writestring("\r\n");
|
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
const int buflen = 512;
|
|
||||||
char buf[2 * buflen];
|
|
||||||
|
|
||||||
// skip HTTP header
|
// skip HTTP header
|
||||||
while ((i = sock->readline(buf, buflen)))
|
while ((i = sock->readline(buf, buflen))) {
|
||||||
if (i <= 2 && isspace(buf[0]) && (!buf[1] || isspace(buf[1])))
|
if (i <= 2 && isspace(buf[0]) && (!buf[1] || isspace(buf[1])))
|
||||||
break;
|
break;
|
||||||
|
if (!strncmp(buf, "X-MetarProxy: ", 13))
|
||||||
|
_x_proxy = true;
|
||||||
|
}
|
||||||
if (i) {
|
if (i) {
|
||||||
i = sock->readline(buf, buflen);
|
i = sock->readline(buf, buflen);
|
||||||
if (i)
|
if (i)
|
||||||
@@ -204,7 +236,8 @@ char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
|
|||||||
char *b = buf;
|
char *b = buf;
|
||||||
scanBoundary(&b);
|
scanBoundary(&b);
|
||||||
if (*b == '<')
|
if (*b == '<')
|
||||||
throw sg_io_exception("no metar data available from " + _url);
|
throw sg_io_exception("no metar data available from ",
|
||||||
|
sg_location(_url));
|
||||||
|
|
||||||
char *metar = new char[strlen(b) + 2]; // make room for " \0"
|
char *metar = new char[strlen(b) + 2]; // make room for " \0"
|
||||||
strcpy(metar, b);
|
strcpy(metar, b);
|
||||||
@@ -392,7 +425,7 @@ bool SGMetar::scanWind()
|
|||||||
if (gust != NaN)
|
if (gust != NaN)
|
||||||
_gust_speed = gust * factor;
|
_gust_speed = gust * factor;
|
||||||
_grpcount++;
|
_grpcount++;
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -460,7 +493,6 @@ bool SGMetar::scanVisibility()
|
|||||||
distance = i;
|
distance = i;
|
||||||
} else {
|
} else {
|
||||||
// M?(\d{1,2}|\d{1,2}/\d{1,2}|\d{1,2} \d{1,2}/\d{1,2})(SM|KM)
|
// M?(\d{1,2}|\d{1,2}/\d{1,2}|\d{1,2} \d{1,2}/\d{1,2})(SM|KM)
|
||||||
modifier = 0;
|
|
||||||
if (*m == 'M')
|
if (*m == 'M')
|
||||||
m++, modifier = SGMetarVisibility::LESS_THAN;
|
m++, modifier = SGMetarVisibility::LESS_THAN;
|
||||||
|
|
||||||
@@ -579,56 +611,56 @@ bool SGMetar::scanRwyVisRange()
|
|||||||
|
|
||||||
|
|
||||||
static const struct Token special[] = {
|
static const struct Token special[] = {
|
||||||
"NSW", "no significant weather",
|
{ "NSW", "no significant weather" },
|
||||||
"VCSH", "showers in the vicinity",
|
{ "VCSH", "showers in the vicinity" },
|
||||||
"VCTS", "thunderstorm in the vicinity",
|
{ "VCTS", "thunderstorm in the vicinity" },
|
||||||
0, 0
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static const struct Token description[] = {
|
static const struct Token description[] = {
|
||||||
"SH", "showers of",
|
{ "SH", "showers of" },
|
||||||
"TS", "thunderstorm with",
|
{ "TS", "thunderstorm with" },
|
||||||
"BC", "patches of",
|
{ "BC", "patches of" },
|
||||||
"BL", "blowing",
|
{ "BL", "blowing" },
|
||||||
"DR", "low drifting",
|
{ "DR", "low drifting" },
|
||||||
"FZ", "freezing",
|
{ "FZ", "freezing" },
|
||||||
"MI", "shallow",
|
{ "MI", "shallow" },
|
||||||
"PR", "partial",
|
{ "PR", "partial" },
|
||||||
0, 0
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static const struct Token phenomenon[] = {
|
static const struct Token phenomenon[] = {
|
||||||
"DZ", "drizzle",
|
{ "DZ", "drizzle" },
|
||||||
"GR", "hail",
|
{ "GR", "hail" },
|
||||||
"GS", "small hail and/or snow pellets",
|
{ "GS", "small hail and/or snow pellets" },
|
||||||
"IC", "ice crystals",
|
{ "IC", "ice crystals" },
|
||||||
"PE", "ice pellets",
|
{ "PE", "ice pellets" },
|
||||||
"RA", "rain",
|
{ "RA", "rain" },
|
||||||
"SG", "snow grains",
|
{ "SG", "snow grains" },
|
||||||
"SN", "snow",
|
{ "SN", "snow" },
|
||||||
"UP", "unknown precipitation",
|
{ "UP", "unknown precipitation" },
|
||||||
"BR", "mist",
|
{ "BR", "mist" },
|
||||||
"DU", "widespread dust",
|
{ "DU", "widespread dust" },
|
||||||
"SG", "fog",
|
{ "FG", "fog" },
|
||||||
"SGBR", "fog bank",
|
{ "FGBR", "fog bank" },
|
||||||
"FU", "smoke",
|
{ "FU", "smoke" },
|
||||||
"HZ", "haze",
|
{ "HZ", "haze" },
|
||||||
"PY", "spray",
|
{ "PY", "spray" },
|
||||||
"SA", "sand",
|
{ "SA", "sand" },
|
||||||
"VA", "volcanic ash",
|
{ "VA", "volcanic ash" },
|
||||||
"DS", "duststorm",
|
{ "DS", "duststorm" },
|
||||||
"FC", "funnel cloud/tornado waterspout",
|
{ "FC", "funnel cloud/tornado waterspout" },
|
||||||
"PO", "well-developed dust/sand whirls",
|
{ "PO", "well-developed dust/sand whirls" },
|
||||||
"SQ", "squalls",
|
{ "SQ", "squalls" },
|
||||||
"SS", "sandstorm",
|
{ "SS", "sandstorm" },
|
||||||
"UP", "unknown", // ... due to failed automatic acquisition
|
{ "UP", "unknown" }, // ... due to failed automatic acquisition
|
||||||
0, 0
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// (+|-|VC)?(NSW|MI|PR|BC|DR|BL|SH|TS|FZ)?((DZ|RA|SN|SG|IC|PE|GR|GS|UP){0,3})(BR|SG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS){0,3}
|
// (+|-|VC)?(NSW|MI|PR|BC|DR|BL|SH|TS|FZ)?((DZ|RA|SN|SG|IC|PE|GR|GS|UP){0,3})(BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS){0,3}
|
||||||
bool SGMetar::scanWeather()
|
bool SGMetar::scanWeather()
|
||||||
{
|
{
|
||||||
char *m = _m;
|
char *m = _m;
|
||||||
@@ -643,14 +675,15 @@ bool SGMetar::scanWeather()
|
|||||||
}
|
}
|
||||||
|
|
||||||
string pre, post;
|
string pre, post;
|
||||||
|
int intensity = 0;
|
||||||
if (*m == '-')
|
if (*m == '-')
|
||||||
m++, pre = "light ";
|
m++, pre = "light ", intensity = 1;
|
||||||
else if (*m == '+')
|
else if (*m == '+')
|
||||||
m++, pre = "heavy ";
|
m++, pre = "heavy ", intensity = 3;
|
||||||
else if (!strncmp(m, "VC", 2))
|
else if (!strncmp(m, "VC", 2))
|
||||||
m += 2, post = "in the vicinity ";
|
m += 2, post = "in the vicinity ";
|
||||||
else
|
else
|
||||||
pre = "moderate ";
|
pre = "moderate ", intensity = 2;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
@@ -662,6 +695,12 @@ bool SGMetar::scanWeather()
|
|||||||
if (!(a = scanToken(&m, phenomenon)))
|
if (!(a = scanToken(&m, phenomenon)))
|
||||||
break;
|
break;
|
||||||
weather += string(a->text) + " ";
|
weather += string(a->text) + " ";
|
||||||
|
if (!strcmp(a->id, "RA"))
|
||||||
|
_rain = intensity;
|
||||||
|
else if (!strcmp(a->id, "HA"))
|
||||||
|
_hail = intensity;
|
||||||
|
else if (!strcmp(a->id, "SN"))
|
||||||
|
_snow = intensity;
|
||||||
}
|
}
|
||||||
if (!weather.length())
|
if (!weather.length())
|
||||||
return false;
|
return false;
|
||||||
@@ -677,26 +716,26 @@ bool SGMetar::scanWeather()
|
|||||||
|
|
||||||
|
|
||||||
static const struct Token cloud_types[] = {
|
static const struct Token cloud_types[] = {
|
||||||
"AC", "altocumulus",
|
{ "AC", "altocumulus" },
|
||||||
"ACC", "altocumulus castellanus",
|
{ "ACC", "altocumulus castellanus" },
|
||||||
"ACSL", "altocumulus standing lenticular",
|
{ "ACSL", "altocumulus standing lenticular" },
|
||||||
"AS", "altostratus",
|
{ "AS", "altostratus" },
|
||||||
"CB", "cumulonimbus",
|
{ "CB", "cumulonimbus" },
|
||||||
"CBMAM", "cumulonimbus mammatus",
|
{ "CBMAM", "cumulonimbus mammatus" },
|
||||||
"CC", "cirrocumulus",
|
{ "CC", "cirrocumulus" },
|
||||||
"CCSL", "cirrocumulus standing lenticular",
|
{ "CCSL", "cirrocumulus standing lenticular" },
|
||||||
"CI", "cirrus",
|
{ "CI", "cirrus" },
|
||||||
"CS", "cirrostratus",
|
{ "CS", "cirrostratus" },
|
||||||
"CU", "cumulus",
|
{ "CU", "cumulus" },
|
||||||
"CUFRA", "cumulus fractus",
|
{ "CUFRA", "cumulus fractus" },
|
||||||
"NS", "nimbostratus",
|
{ "NS", "nimbostratus" },
|
||||||
"SAC", "stratoaltocumulus", // guessed
|
{ "SAC", "stratoaltocumulus" }, // guessed
|
||||||
"SC", "stratocumulus",
|
{ "SC", "stratocumulus" },
|
||||||
"SCSL", "stratocumulus standing lenticular",
|
{ "SCSL", "stratocumulus standing lenticular" },
|
||||||
"ST", "stratus",
|
{ "ST", "stratus" },
|
||||||
"STFRA", "stratus fractus",
|
{ "STFRA", "stratus fractus" },
|
||||||
"TCU", "towering cumulus",
|
{ "TCU", "towering cumulus" },
|
||||||
0, 0
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -707,6 +746,14 @@ bool SGMetar::scanSkyCondition()
|
|||||||
int i;
|
int i;
|
||||||
SGMetarCloud cl;
|
SGMetarCloud cl;
|
||||||
|
|
||||||
|
if (!strncmp(m, "//////", 6)) {
|
||||||
|
m += 6;
|
||||||
|
if (!scanBoundary(&m))
|
||||||
|
return false;
|
||||||
|
_m = m;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strncmp(m, "CLR", i = 3) // clear
|
if (!strncmp(m, "CLR", i = 3) // clear
|
||||||
|| !strncmp(m, "SKC", i = 3) // sky clear
|
|| !strncmp(m, "SKC", i = 3) // sky clear
|
||||||
|| !strncmp(m, "NSC", i = 3) // no significant clouds
|
|| !strncmp(m, "NSC", i = 3) // no significant clouds
|
||||||
@@ -714,8 +761,13 @@ bool SGMetar::scanSkyCondition()
|
|||||||
m += i;
|
m += i;
|
||||||
if (!scanBoundary(&m))
|
if (!scanBoundary(&m))
|
||||||
return false;
|
return false;
|
||||||
cl._coverage = 0;
|
|
||||||
_clouds.push_back(cl);
|
if (i == 3) {
|
||||||
|
cl._coverage = 0;
|
||||||
|
_clouds.push_back(cl);
|
||||||
|
} else {
|
||||||
|
_cavok = true;
|
||||||
|
}
|
||||||
_m = m;
|
_m = m;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -791,7 +843,7 @@ bool SGMetar::scanTemperature()
|
|||||||
return false;
|
return false;
|
||||||
if (!scanBoundary(&m)) {
|
if (!scanBoundary(&m)) {
|
||||||
if (!strncmp(m, "XX", 2)) // not spec compliant!
|
if (!strncmp(m, "XX", 2)) // not spec compliant!
|
||||||
m += 2, sign = 0;
|
m += 2, sign = 0, dew = temp;
|
||||||
else {
|
else {
|
||||||
sign = 1;
|
sign = 1;
|
||||||
if (*m == 'M')
|
if (*m == 'M')
|
||||||
@@ -907,19 +959,22 @@ bool SGMetar::scanRunwayReport()
|
|||||||
|
|
||||||
if (!strncmp(m, "CLRD", 4)) {
|
if (!strncmp(m, "CLRD", 4)) {
|
||||||
m += 4; // runway cleared
|
m += 4; // runway cleared
|
||||||
r._deposit = "cleared";
|
r._deposit_string = "cleared";
|
||||||
} else {
|
} else {
|
||||||
if (scanNumber(&m, &i, 1)) {
|
if (scanNumber(&m, &i, 1)) {
|
||||||
r._deposit = runway_deposit[i];
|
r._deposit = i;
|
||||||
|
r._deposit_string = runway_deposit[i];
|
||||||
} else if (*m == '/')
|
} else if (*m == '/')
|
||||||
m++;
|
m++;
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (*m == '1' || *m == '2' || *m == '5' || *m == '9') { // extent of deposit
|
if (*m == '1' || *m == '2' || *m == '5' || *m == '9') { // extent of deposit
|
||||||
r._extent = *m - '0';
|
r._extent = *m - '0';
|
||||||
r._extent_string = runway_deposit_extent[*m - '0'];
|
r._extent_string = runway_deposit_extent[*m - '0'];
|
||||||
} else if (*m != '/')
|
} else if (*m != '/')
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m++;
|
m++;
|
||||||
i = -1;
|
i = -1;
|
||||||
if (!strncmp(m, "//", 2))
|
if (!strncmp(m, "//", 2))
|
||||||
@@ -928,7 +983,7 @@ bool SGMetar::scanRunwayReport()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
r._depth = 0.5; // < 1 mm deep (let's say 0.5 :-)
|
r._depth = 0.0005; // < 1 mm deep (let's say 0.5 :-)
|
||||||
else if (i > 0 && i <= 90)
|
else if (i > 0 && i <= 90)
|
||||||
r._depth = i / 1000.0; // i mm deep
|
r._depth = i / 1000.0; // i mm deep
|
||||||
else if (i >= 92 && i <= 98)
|
else if (i >= 92 && i <= 98)
|
||||||
@@ -954,6 +1009,7 @@ bool SGMetar::scanRunwayReport()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
_runways[id]._deposit = r._deposit;
|
_runways[id]._deposit = r._deposit;
|
||||||
|
_runways[id]._deposit_string = r._deposit_string;
|
||||||
_runways[id]._extent = r._extent;
|
_runways[id]._extent = r._extent;
|
||||||
_runways[id]._extent_string = r._extent_string;
|
_runways[id]._extent_string = r._extent_string;
|
||||||
_runways[id]._depth = r._depth;
|
_runways[id]._depth = r._depth;
|
||||||
@@ -1033,13 +1089,13 @@ bool SGMetar::scanTrendForecast()
|
|||||||
|
|
||||||
// (BLU|WHT|GRN|YLO|AMB|RED)
|
// (BLU|WHT|GRN|YLO|AMB|RED)
|
||||||
static const struct Token colors[] = {
|
static const struct Token colors[] = {
|
||||||
"BLU", "Blue", // 2500 ft, 8.0 km
|
{ "BLU", "Blue" }, // 2500 ft, 8.0 km
|
||||||
"WHT", "White", // 1500 ft, 5.0 km
|
{ "WHT", "White" }, // 1500 ft, 5.0 km
|
||||||
"GRN", "Green", // 700 ft, 3.7 km
|
{ "GRN", "Green" }, // 700 ft, 3.7 km
|
||||||
"YLO", "Yellow", // 300 ft, 1.6 km
|
{ "YLO", "Yellow" }, // 300 ft, 1.6 km
|
||||||
"AMB", "Amber", // 200 ft, 0.8 km
|
{ "AMB", "Amber" }, // 200 ft, 0.8 km
|
||||||
"RED", "Red", // <200 ft, <0.8 km
|
{ "RED", "Red" }, // <200 ft, <0.8 km
|
||||||
0, 0
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1125,7 +1181,7 @@ const struct Token *SGMetar::scanToken(char **str, const struct Token *list)
|
|||||||
{
|
{
|
||||||
const struct Token *longest = 0;
|
const struct Token *longest = 0;
|
||||||
int maxlen = 0, len;
|
int maxlen = 0, len;
|
||||||
char *s;
|
const char *s;
|
||||||
for (int i = 0; (s = list[i].id); i++) {
|
for (int i = 0; (s = list[i].id); i++) {
|
||||||
len = strlen(s);
|
len = strlen(s);
|
||||||
if (!strncmp(s, *str, len) && len > maxlen) {
|
if (!strncmp(s, *str, len) && len > maxlen) {
|
||||||
@@ -1137,4 +1193,24 @@ const struct Token *SGMetar::scanToken(char **str, const struct Token *list)
|
|||||||
return longest;
|
return longest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGMetarCloud::set(double alt, int cov)
|
||||||
|
{
|
||||||
|
_altitude = alt;
|
||||||
|
if (cov != -1)
|
||||||
|
_coverage = cov;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGMetarVisibility::set(double dist, int dir, int mod, int tend)
|
||||||
|
{
|
||||||
|
_distance = dist;
|
||||||
|
if (dir != -1)
|
||||||
|
_direction = dir;
|
||||||
|
if (mod != -1)
|
||||||
|
_modifier = mod;
|
||||||
|
if (tend != 1)
|
||||||
|
_tendency = tend;
|
||||||
|
}
|
||||||
|
|
||||||
#undef NaN
|
#undef NaN
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -29,16 +29,16 @@
|
|||||||
|
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
using std::vector;
|
||||||
SG_USING_STD(map);
|
using std::map;
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
const double SGMetarNaN = -1E20;
|
const double SGMetarNaN = -1E20;
|
||||||
#define NaN SGMetarNaN
|
#define NaN SGMetarNaN
|
||||||
|
|
||||||
struct Token {
|
struct Token {
|
||||||
char *id;
|
const char *id;
|
||||||
char *text;
|
const char *text;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -67,6 +67,8 @@ public:
|
|||||||
DECREASING
|
DECREASING
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void set(double dist, int dir = -1, int mod = -1, int tend = -1);
|
||||||
|
|
||||||
inline double getVisibility_m() const { return _distance; }
|
inline double getVisibility_m() const { return _distance; }
|
||||||
inline double getVisibility_ft() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_FEET; }
|
inline double getVisibility_ft() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_FEET; }
|
||||||
inline double getVisibility_sm() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_SM; }
|
inline double getVisibility_sm() const { return _distance == NaN ? NaN : _distance * SG_METER_TO_SM; }
|
||||||
@@ -87,7 +89,8 @@ class SGMetarRunway {
|
|||||||
friend class SGMetar;
|
friend class SGMetar;
|
||||||
public:
|
public:
|
||||||
SGMetarRunway() :
|
SGMetarRunway() :
|
||||||
_deposit(0),
|
_deposit(-1),
|
||||||
|
_deposit_string(0),
|
||||||
_extent(-1),
|
_extent(-1),
|
||||||
_extent_string(0),
|
_extent_string(0),
|
||||||
_depth(NaN),
|
_depth(NaN),
|
||||||
@@ -96,7 +99,8 @@ public:
|
|||||||
_comment(0),
|
_comment(0),
|
||||||
_wind_shear(false) {}
|
_wind_shear(false) {}
|
||||||
|
|
||||||
inline const char *getDeposit() const { return _deposit; }
|
inline int getDeposit() const { return _deposit; }
|
||||||
|
inline const char *getDepositString() const { return _deposit_string; }
|
||||||
inline double getExtent() const { return _extent; }
|
inline double getExtent() const { return _extent; }
|
||||||
inline const char *getExtentString() const { return _extent_string; }
|
inline const char *getExtentString() const { return _extent_string; }
|
||||||
inline double getDepth() const { return _depth; }
|
inline double getDepth() const { return _depth; }
|
||||||
@@ -104,13 +108,14 @@ public:
|
|||||||
inline const char *getFrictionString() const { return _friction_string; }
|
inline const char *getFrictionString() const { return _friction_string; }
|
||||||
inline const char *getComment() const { return _comment; }
|
inline const char *getComment() const { return _comment; }
|
||||||
inline const bool getWindShear() const { return _wind_shear; }
|
inline const bool getWindShear() const { return _wind_shear; }
|
||||||
inline SGMetarVisibility getMinVisibility() const { return _min_visibility; }
|
inline const SGMetarVisibility& getMinVisibility() const { return _min_visibility; }
|
||||||
inline SGMetarVisibility getMaxVisibility() const { return _max_visibility; }
|
inline const SGMetarVisibility& getMaxVisibility() const { return _max_visibility; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SGMetarVisibility _min_visibility;
|
SGMetarVisibility _min_visibility;
|
||||||
SGMetarVisibility _max_visibility;
|
SGMetarVisibility _max_visibility;
|
||||||
const char *_deposit;
|
int _deposit;
|
||||||
|
const char *_deposit_string;
|
||||||
int _extent;
|
int _extent;
|
||||||
const char *_extent_string;
|
const char *_extent_string;
|
||||||
double _depth;
|
double _depth;
|
||||||
@@ -125,29 +130,28 @@ protected:
|
|||||||
class SGMetarCloud {
|
class SGMetarCloud {
|
||||||
friend class SGMetar;
|
friend class SGMetar;
|
||||||
public:
|
public:
|
||||||
SGMetarCloud() :
|
SGMetarCloud() : _coverage(-1), _altitude(NaN), _type(0), _type_long(0) {}
|
||||||
_coverage(-1),
|
|
||||||
_altitude(NaN),
|
|
||||||
_type(0),
|
|
||||||
_type_long(0) {}
|
|
||||||
|
|
||||||
inline int getCoverage() const { return _coverage; }
|
void set(double alt, int cov = -1);
|
||||||
inline double getAltitude_m() const { return _altitude; }
|
|
||||||
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
|
inline int getCoverage() const { return _coverage; }
|
||||||
inline char *getTypeString() const { return _type; }
|
inline double getAltitude_m() const { return _altitude; }
|
||||||
inline char *getTypeLongString() const { return _type_long; }
|
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
|
||||||
|
inline const char *getTypeString() const { return _type; }
|
||||||
|
inline const char *getTypeLongString() const { return _type_long; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int _coverage; // quarters: 0 -> clear ... 4 -> overcast
|
int _coverage; // quarters: 0 -> clear ... 4 -> overcast
|
||||||
double _altitude; // 1000 m
|
double _altitude; // 1000 m
|
||||||
char *_type; // CU
|
const char *_type; // CU
|
||||||
char *_type_long; // cumulus
|
const char *_type_long; // cumulus
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class SGMetar {
|
class SGMetar {
|
||||||
public:
|
public:
|
||||||
SGMetar(const string& m, const string& proxy = "", const string& port = "", const string &auth = "");
|
SGMetar(const string& m, const string& proxy = "", const string& port = "",
|
||||||
|
const string &auth = "", const time_t time = 0);
|
||||||
~SGMetar();
|
~SGMetar();
|
||||||
|
|
||||||
enum ReportType {
|
enum ReportType {
|
||||||
@@ -159,6 +163,7 @@ public:
|
|||||||
|
|
||||||
inline const char *getData() const { return _data; }
|
inline const char *getData() const { return _data; }
|
||||||
inline const char *getUnusedData() const { return _m; }
|
inline const char *getUnusedData() const { return _m; }
|
||||||
|
inline const bool getProxy() const { return _x_proxy; }
|
||||||
inline const char *getId() const { return _icao; }
|
inline const char *getId() const { return _icao; }
|
||||||
inline int getYear() const { return _year; }
|
inline int getYear() const { return _year; }
|
||||||
inline int getMonth() const { return _month; }
|
inline int getMonth() const { return _month; }
|
||||||
@@ -181,10 +186,10 @@ public:
|
|||||||
inline int getWindRangeFrom() const { return _wind_range_from; }
|
inline int getWindRangeFrom() const { return _wind_range_from; }
|
||||||
inline int getWindRangeTo() const { return _wind_range_to; }
|
inline int getWindRangeTo() const { return _wind_range_to; }
|
||||||
|
|
||||||
inline SGMetarVisibility& getMinVisibility() { return _min_visibility; }
|
inline const SGMetarVisibility& getMinVisibility() const { return _min_visibility; }
|
||||||
inline SGMetarVisibility& getMaxVisibility() { return _max_visibility; }
|
inline const SGMetarVisibility& getMaxVisibility() const { return _max_visibility; }
|
||||||
inline SGMetarVisibility& getVertVisibility() { return _vert_visibility; }
|
inline const SGMetarVisibility& getVertVisibility() const { return _vert_visibility; }
|
||||||
inline SGMetarVisibility *getDirVisibility() { return _dir_visibility; }
|
inline const SGMetarVisibility *getDirVisibility() const { return _dir_visibility; }
|
||||||
|
|
||||||
inline double getTemperature_C() const { return _temp; }
|
inline double getTemperature_C() const { return _temp; }
|
||||||
inline double getTemperature_F() const { return _temp == NaN ? NaN : 1.8 * _temp + 32; }
|
inline double getTemperature_F() const { return _temp == NaN ? NaN : 1.8 * _temp + 32; }
|
||||||
@@ -193,15 +198,21 @@ public:
|
|||||||
inline double getPressure_hPa() const { return _pressure == NaN ? NaN : _pressure / 100; }
|
inline double getPressure_hPa() const { return _pressure == NaN ? NaN : _pressure / 100; }
|
||||||
inline double getPressure_inHg() const { return _pressure == NaN ? NaN : _pressure * SG_PA_TO_INHG; }
|
inline double getPressure_inHg() const { return _pressure == NaN ? NaN : _pressure * SG_PA_TO_INHG; }
|
||||||
|
|
||||||
|
inline int getRain() const { return _rain; }
|
||||||
|
inline int getHail() const { return _hail; }
|
||||||
|
inline int getSnow() const { return _snow; }
|
||||||
|
inline bool getCAVOK() const { return _cavok; }
|
||||||
|
|
||||||
double getRelHumidity() const;
|
double getRelHumidity() const;
|
||||||
|
|
||||||
inline vector<SGMetarCloud>& getClouds() { return _clouds; }
|
inline const vector<SGMetarCloud>& getClouds() const { return _clouds; }
|
||||||
inline map<string, SGMetarRunway>& getRunways() { return _runways; }
|
inline const map<string, SGMetarRunway>& getRunways() const { return _runways; }
|
||||||
inline vector<string>& getWeather() { return _weather; }
|
inline const vector<string>& getWeather() const { return _weather; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
string _url;
|
string _url;
|
||||||
int _grpcount;
|
int _grpcount;
|
||||||
|
bool _x_proxy;
|
||||||
char *_data;
|
char *_data;
|
||||||
char *_m;
|
char *_m;
|
||||||
char _icao[5];
|
char _icao[5];
|
||||||
@@ -219,6 +230,10 @@ protected:
|
|||||||
double _temp;
|
double _temp;
|
||||||
double _dewp;
|
double _dewp;
|
||||||
double _pressure;
|
double _pressure;
|
||||||
|
int _rain;
|
||||||
|
int _hail;
|
||||||
|
int _snow;
|
||||||
|
bool _cavok;
|
||||||
|
|
||||||
SGMetarVisibility _min_visibility;
|
SGMetarVisibility _min_visibility;
|
||||||
SGMetarVisibility _max_visibility;
|
SGMetarVisibility _max_visibility;
|
||||||
@@ -230,6 +245,7 @@ protected:
|
|||||||
|
|
||||||
bool scanPreambleDate();
|
bool scanPreambleDate();
|
||||||
bool scanPreambleTime();
|
bool scanPreambleTime();
|
||||||
|
void useCurrentDate();
|
||||||
|
|
||||||
bool scanType();
|
bool scanType();
|
||||||
bool scanId();
|
bool scanId();
|
||||||
@@ -253,7 +269,8 @@ protected:
|
|||||||
int scanNumber(char **str, int *num, int min, int max = 0);
|
int scanNumber(char **str, int *num, int min, int max = 0);
|
||||||
bool scanBoundary(char **str);
|
bool scanBoundary(char **str);
|
||||||
const struct Token *scanToken(char **str, const struct Token *list);
|
const struct Token *scanToken(char **str, const struct Token *list);
|
||||||
char *loadData(const char *id, const string& proxy, const string& port, const string &auth);
|
char *loadData(const char *id, const string& proxy, const string& port,
|
||||||
|
const string &auth, time_t time);
|
||||||
void normalizeData();
|
void normalizeData();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,181 @@
|
|||||||
|
/**
|
||||||
|
* @file precipitation.cxx
|
||||||
|
* @author Nicolas VIVIEN
|
||||||
|
* @date 2008-02-10
|
||||||
|
*
|
||||||
|
* @note Copyright (C) 2008 Nicolas VIVIEN
|
||||||
|
*
|
||||||
|
* @brief Precipitation effects to draw rain and snow.
|
||||||
|
*
|
||||||
|
* @par Licences
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precipitation.hxx"
|
||||||
|
#include "visual_enviro.hxx"
|
||||||
|
|
||||||
|
#include <simgear/constants.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SGPrecipitation constructor
|
||||||
|
*
|
||||||
|
* Build a new OSG object from osgParticle.
|
||||||
|
*/
|
||||||
|
SGPrecipitation::SGPrecipitation() :
|
||||||
|
_freeze(false), _snow_intensity(0.0), _rain_intensity(0.0)
|
||||||
|
{
|
||||||
|
_precipitationEffect = new osgParticle::PrecipitationEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Build and add the object "precipitationEffect"
|
||||||
|
*
|
||||||
|
* This function permits you to create an object precipitationEffect and initialize it.
|
||||||
|
* I define by default the color of water (for raining)
|
||||||
|
*/
|
||||||
|
osg::Group* SGPrecipitation::build(void)
|
||||||
|
{
|
||||||
|
osg::Group* group = new osg::Group;
|
||||||
|
|
||||||
|
_precipitationEffect->snow(0);
|
||||||
|
_precipitationEffect->rain(0);
|
||||||
|
|
||||||
|
group->addChild(_precipitationEffect.get());
|
||||||
|
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the snow intensity
|
||||||
|
*
|
||||||
|
* This function permits you to define and change the snow intensity
|
||||||
|
* The param 'intensity' is normed (0 to 1).
|
||||||
|
*/
|
||||||
|
void SGPrecipitation::setSnowIntensity(float intensity)
|
||||||
|
{
|
||||||
|
if (this->_snow_intensity < intensity-0.001)
|
||||||
|
this->_snow_intensity += 0.001;
|
||||||
|
else if (this->_snow_intensity > intensity+0.001)
|
||||||
|
this->_snow_intensity -= 0.001;
|
||||||
|
else
|
||||||
|
this->_snow_intensity = intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the rain intensity
|
||||||
|
*
|
||||||
|
* This function permits you to define and change the rain intensity
|
||||||
|
* The param 'intensity' is normed (0 to 1).
|
||||||
|
*/
|
||||||
|
void SGPrecipitation::setRainIntensity(float intensity)
|
||||||
|
{
|
||||||
|
if (this->_rain_intensity < intensity-0.001)
|
||||||
|
this->_rain_intensity += 0.001;
|
||||||
|
else if (this->_rain_intensity > intensity+0.001)
|
||||||
|
this->_rain_intensity -= 0.001;
|
||||||
|
else
|
||||||
|
this->_rain_intensity = intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Freeze the rain to snow
|
||||||
|
*
|
||||||
|
* @param freeze Boolean
|
||||||
|
*
|
||||||
|
* This function permits you to turn off the rain to snow.
|
||||||
|
*/
|
||||||
|
void SGPrecipitation::setFreezing(bool freeze)
|
||||||
|
{
|
||||||
|
this->_freeze = freeze;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the wind direction and speed
|
||||||
|
*
|
||||||
|
* This function permits you to define and change the wind direction
|
||||||
|
*
|
||||||
|
* After apply the MatrixTransform to the osg::Precipitation object,
|
||||||
|
* x points full south... From wind heading and speed, we can calculate
|
||||||
|
* the wind vector.
|
||||||
|
*/
|
||||||
|
void SGPrecipitation::setWindProperty(double heading, double speed)
|
||||||
|
{
|
||||||
|
double x, y, z;
|
||||||
|
|
||||||
|
heading = (heading + 180) * SGD_DEGREES_TO_RADIANS;
|
||||||
|
speed = speed * SG_FEET_TO_METER;
|
||||||
|
|
||||||
|
x = -cos(heading) * speed;
|
||||||
|
y = sin(heading) * speed;
|
||||||
|
z = 0;
|
||||||
|
|
||||||
|
this->_wind_vec = osg::Vec3(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the precipitation effects
|
||||||
|
*
|
||||||
|
* This function permits you to update the precipitation effects.
|
||||||
|
* Be careful, if snow and rain intensity are greater than '0', snow effect
|
||||||
|
* will be first.
|
||||||
|
*
|
||||||
|
* The settings come from the osgParticule/PrecipitationEffect.cpp exemple.
|
||||||
|
*/
|
||||||
|
bool SGPrecipitation::update(void)
|
||||||
|
{
|
||||||
|
if (this->_freeze) {
|
||||||
|
if (this->_rain_intensity > 0)
|
||||||
|
this->_snow_intensity = this->_rain_intensity;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool enabled = sgEnviro.get_precipitation_enable_state();
|
||||||
|
if (enabled && this->_snow_intensity > 0) {
|
||||||
|
_precipitationEffect->setWind(_wind_vec);
|
||||||
|
_precipitationEffect->setParticleSpeed( -0.75f - 0.25f*_snow_intensity);
|
||||||
|
|
||||||
|
_precipitationEffect->setParticleSize(0.02f + 0.03f*_snow_intensity);
|
||||||
|
_precipitationEffect->setMaximumParticleDensity(_snow_intensity * 7.2f);
|
||||||
|
_precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_snow_intensity), 5.0f / (0.25f+_snow_intensity), 5.0f));
|
||||||
|
|
||||||
|
_precipitationEffect->setNearTransition(25.f);
|
||||||
|
_precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_snow_intensity));
|
||||||
|
|
||||||
|
_precipitationEffect->setParticleColor(osg::Vec4(0.85, 0.85, 0.85, 1.0) - osg::Vec4(0.1, 0.1, 0.1, 1.0) * _snow_intensity);
|
||||||
|
} else if (enabled && this->_rain_intensity > 0) {
|
||||||
|
_precipitationEffect->setWind(_wind_vec);
|
||||||
|
_precipitationEffect->setParticleSpeed( -2.0f + -5.0f*_rain_intensity);
|
||||||
|
|
||||||
|
_precipitationEffect->setParticleSize(0.01 + 0.02*_rain_intensity);
|
||||||
|
_precipitationEffect->setMaximumParticleDensity(_rain_intensity * 7.5f);
|
||||||
|
_precipitationEffect->setCellSize(osg::Vec3(5.0f / (0.25f+_rain_intensity), 5.0f / (0.25f+_rain_intensity), 5.0f));
|
||||||
|
|
||||||
|
_precipitationEffect->setNearTransition(25.f);
|
||||||
|
_precipitationEffect->setFarTransition(100.0f - 60.0f*sqrtf(_rain_intensity));
|
||||||
|
|
||||||
|
_precipitationEffect->setParticleColor( osg::Vec4(0x7A, 0xCE, 0xFF, 0x80));
|
||||||
|
} else {
|
||||||
|
_precipitationEffect->snow(0);
|
||||||
|
_precipitationEffect->rain(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* @file precipitation.hxx
|
||||||
|
* @author Nicolas VIVIEN
|
||||||
|
* @date 2008-02-10
|
||||||
|
*
|
||||||
|
* @note Copyright (C) 2008 Nicolas VIVIEN
|
||||||
|
*
|
||||||
|
* @brief Precipitation effects to draw rain and snow.
|
||||||
|
*
|
||||||
|
* @par Licences
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PRECIPITATION_HXX
|
||||||
|
#define _PRECIPITATION_HXX
|
||||||
|
|
||||||
|
#include <osg/Group>
|
||||||
|
#include <osg/Referenced>
|
||||||
|
#include <osgParticle/PrecipitationEffect>
|
||||||
|
|
||||||
|
|
||||||
|
class SGPrecipitation : public osg::Referenced
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool _freeze;
|
||||||
|
|
||||||
|
float _snow_intensity;
|
||||||
|
float _rain_intensity;
|
||||||
|
|
||||||
|
int _wind_dir;
|
||||||
|
osg::Vec3 _wind_vec;
|
||||||
|
|
||||||
|
osg::ref_ptr<osgParticle::PrecipitationEffect> _precipitationEffect;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SGPrecipitation();
|
||||||
|
virtual ~SGPrecipitation() {}
|
||||||
|
osg::Group* build(void);
|
||||||
|
bool update(void);
|
||||||
|
|
||||||
|
void setWindProperty(double, double);
|
||||||
|
void setFreezing(bool);
|
||||||
|
void setRainIntensity(float);
|
||||||
|
void setSnowIntensity(float);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,795 @@
|
|||||||
|
// Visual environment helper class
|
||||||
|
//
|
||||||
|
// Written by Harald JOHNSEN, started April 2005.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/constants.h>
|
||||||
|
#include <simgear/structure/SGReferenced.hxx>
|
||||||
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
|
#include <simgear/math/sg_random.h>
|
||||||
|
#include <simgear/math/sg_geodesy.hxx>
|
||||||
|
#include <simgear/math/point3d.hxx>
|
||||||
|
#include <simgear/math/polar3d.hxx>
|
||||||
|
#include <simgear/sound/soundmgr_openal.hxx>
|
||||||
|
#include <simgear/scene/sky/cloudfield.hxx>
|
||||||
|
#include <simgear/scene/sky/newcloud.hxx>
|
||||||
|
#include <simgear/props/props.hxx>
|
||||||
|
#include "visual_enviro.hxx"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using std::vector;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Point3D pt;
|
||||||
|
int depth;
|
||||||
|
int prev;
|
||||||
|
} lt_tree_seg;
|
||||||
|
|
||||||
|
#define MAX_RAIN_SLICE 200
|
||||||
|
static float rainpos[MAX_RAIN_SLICE];
|
||||||
|
#define MAX_LT_TREE_SEG 400
|
||||||
|
|
||||||
|
#define DFL_MIN_LIGHT 0.35
|
||||||
|
sgVec3 SGEnviro::min_light = {DFL_MIN_LIGHT, DFL_MIN_LIGHT, DFL_MIN_LIGHT};
|
||||||
|
#define DFL_STREAK_BRIGHT_NEARMOST_LAYER 0.9
|
||||||
|
SGfloat SGEnviro::streak_bright_nearmost_layer = DFL_STREAK_BRIGHT_NEARMOST_LAYER;
|
||||||
|
#define DFL_STREAK_BRIGHT_FARMOST_LAYER 0.5
|
||||||
|
SGfloat SGEnviro::streak_bright_farmost_layer = DFL_STREAK_BRIGHT_FARMOST_LAYER;
|
||||||
|
#define DFL_STREAK_PERIOD_MAX 2.5
|
||||||
|
SGfloat SGEnviro::streak_period_max = DFL_STREAK_PERIOD_MAX;
|
||||||
|
#define DFL_STREAK_PERIOD_CHANGE_PER_KT 0.005
|
||||||
|
SGfloat SGEnviro::streak_period_change_per_kt = DFL_STREAK_PERIOD_CHANGE_PER_KT;
|
||||||
|
#define DFL_STREAK_PERIOD_MIN 1.0
|
||||||
|
SGfloat SGEnviro::streak_period_min = DFL_STREAK_PERIOD_MIN;
|
||||||
|
#define DFL_STREAK_LENGTH_MIN 0.03
|
||||||
|
SGfloat SGEnviro::streak_length_min = DFL_STREAK_LENGTH_MIN;
|
||||||
|
#define DFL_STREAK_LENGTH_CHANGE_PER_KT 0.0005
|
||||||
|
SGfloat SGEnviro::streak_length_change_per_kt = DFL_STREAK_LENGTH_CHANGE_PER_KT;
|
||||||
|
#define DFL_STREAK_LENGTH_MAX 0.1
|
||||||
|
SGfloat SGEnviro::streak_length_max = DFL_STREAK_LENGTH_MAX;
|
||||||
|
#define DFL_STREAK_COUNT_MIN 40
|
||||||
|
int SGEnviro::streak_count_min = DFL_STREAK_COUNT_MIN;
|
||||||
|
#define DFL_STREAK_COUNT_MAX 190
|
||||||
|
#if (DFL_STREAK_COUNT_MAX > MAX_RAIN_SLICE)
|
||||||
|
#error "Bad default!"
|
||||||
|
#endif
|
||||||
|
int SGEnviro::streak_count_max = DFL_STREAK_COUNT_MAX;
|
||||||
|
#define DFL_CONE_BASE_RADIUS 15.0
|
||||||
|
SGfloat SGEnviro::cone_base_radius = DFL_CONE_BASE_RADIUS;
|
||||||
|
#define DFL_CONE_HEIGHT 30.0
|
||||||
|
SGfloat SGEnviro::cone_height = DFL_CONE_HEIGHT;
|
||||||
|
|
||||||
|
|
||||||
|
void SGEnviro::config(const SGPropertyNode* n)
|
||||||
|
{
|
||||||
|
if (!n)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const float ml = n->getFloatValue("min-light", DFL_MIN_LIGHT);
|
||||||
|
sgSetVec3(min_light, ml, ml, ml);
|
||||||
|
|
||||||
|
streak_bright_nearmost_layer = n->getFloatValue(
|
||||||
|
"streak-brightness-nearmost-layer",
|
||||||
|
DFL_STREAK_BRIGHT_NEARMOST_LAYER);
|
||||||
|
streak_bright_farmost_layer = n->getFloatValue(
|
||||||
|
"streak-brightness-farmost-layer",
|
||||||
|
DFL_STREAK_BRIGHT_FARMOST_LAYER);
|
||||||
|
|
||||||
|
streak_period_max = n->getFloatValue(
|
||||||
|
"streak-period-max",
|
||||||
|
DFL_STREAK_PERIOD_MAX);
|
||||||
|
streak_period_min = n->getFloatValue(
|
||||||
|
"streak-period-min",
|
||||||
|
DFL_STREAK_PERIOD_MIN);
|
||||||
|
streak_period_change_per_kt = n->getFloatValue(
|
||||||
|
"streak-period-change-per-kt",
|
||||||
|
DFL_STREAK_PERIOD_CHANGE_PER_KT);
|
||||||
|
|
||||||
|
streak_length_max = n->getFloatValue(
|
||||||
|
"streak-length-max",
|
||||||
|
DFL_STREAK_LENGTH_MAX);
|
||||||
|
streak_length_min = n->getFloatValue(
|
||||||
|
"streak-length-min",
|
||||||
|
DFL_STREAK_LENGTH_MIN);
|
||||||
|
streak_length_change_per_kt = n->getFloatValue(
|
||||||
|
"streak-length-change-per-kt",
|
||||||
|
DFL_STREAK_LENGTH_CHANGE_PER_KT);
|
||||||
|
|
||||||
|
streak_count_min = n->getIntValue(
|
||||||
|
"streak-count-min", DFL_STREAK_COUNT_MIN);
|
||||||
|
streak_count_max = n->getIntValue(
|
||||||
|
"streak-count-max", DFL_STREAK_COUNT_MAX);
|
||||||
|
if (streak_count_max > MAX_RAIN_SLICE)
|
||||||
|
streak_count_max = MAX_RAIN_SLICE;
|
||||||
|
|
||||||
|
cone_base_radius = n->getFloatValue(
|
||||||
|
"cone-base-radius", DFL_CONE_BASE_RADIUS);
|
||||||
|
cone_height = n->getFloatValue("cone_height", DFL_CONE_HEIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class to render lightnings.
|
||||||
|
*/
|
||||||
|
class SGLightning {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Build a new lightning.
|
||||||
|
* The lightning has a limited life time. It will also play a thunder sounder once.
|
||||||
|
* @param lon lon longitude in degree
|
||||||
|
* @param lat lat latitude in degree
|
||||||
|
* @param alt asl of top of lightning
|
||||||
|
*/
|
||||||
|
SGLightning(double lon, double lat, double alt);
|
||||||
|
~SGLightning();
|
||||||
|
void lt_Render(void);
|
||||||
|
void lt_build(void);
|
||||||
|
void lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize);
|
||||||
|
|
||||||
|
// contains all the segments of the lightning
|
||||||
|
lt_tree_seg lt_tree[MAX_LT_TREE_SEG];
|
||||||
|
// segment count
|
||||||
|
int nb_tree;
|
||||||
|
// position of lightning
|
||||||
|
double lon, lat, alt;
|
||||||
|
int sequence_count;
|
||||||
|
// time to live
|
||||||
|
double age;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef vector<SGLightning *> list_of_lightning;
|
||||||
|
static list_of_lightning lightnings;
|
||||||
|
|
||||||
|
SGEnviro sgEnviro;
|
||||||
|
|
||||||
|
SGEnviro::SGEnviro() :
|
||||||
|
view_in_cloud(false),
|
||||||
|
precipitation_enable_state(true),
|
||||||
|
precipitation_density(100.0),
|
||||||
|
precipitation_max_alt(0.0),
|
||||||
|
turbulence_enable_state(false),
|
||||||
|
last_cloud_turbulence(0.0),
|
||||||
|
cloud_turbulence(0.0),
|
||||||
|
lightning_enable_state(false),
|
||||||
|
elapsed_time(0.0),
|
||||||
|
dt(0.0),
|
||||||
|
soundMgr(NULL),
|
||||||
|
snd_active(false),
|
||||||
|
snd_dist(0.0),
|
||||||
|
min_time_before_lt(0.0),
|
||||||
|
fov_width(55.0),
|
||||||
|
fov_height(55.0)
|
||||||
|
|
||||||
|
{
|
||||||
|
for(int i = 0; i < MAX_RAIN_SLICE ; i++)
|
||||||
|
rainpos[i] = sg_random();
|
||||||
|
radarEcho.reserve(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
SGEnviro::~SGEnviro(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
list_of_lightning::iterator iLightning;
|
||||||
|
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
|
||||||
|
delete (*iLightning);
|
||||||
|
}
|
||||||
|
lightnings.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
view_in_cloud = false;
|
||||||
|
// ask the impostor cache to do some cleanup
|
||||||
|
last_cloud_turbulence = cloud_turbulence;
|
||||||
|
cloud_turbulence = 0.0;
|
||||||
|
elapsed_time += delta_time;
|
||||||
|
min_time_before_lt -= delta_time;
|
||||||
|
dt = delta_time;
|
||||||
|
|
||||||
|
sgMat4 T1, LON, LAT;
|
||||||
|
sgVec3 axis;
|
||||||
|
|
||||||
|
sgMakeTransMat4( T1, p );
|
||||||
|
|
||||||
|
sgSetVec3( axis, 0.0, 0.0, 1.0 );
|
||||||
|
sgMakeRotMat4( LON, lon, axis );
|
||||||
|
|
||||||
|
sgSetVec3( axis, 0.0, 1.0, 0.0 );
|
||||||
|
sgMakeRotMat4( LAT, 90.0 - lat, axis );
|
||||||
|
|
||||||
|
sgMat4 TRANSFORM;
|
||||||
|
|
||||||
|
sgCopyMat4( TRANSFORM, T1 );
|
||||||
|
sgPreMultMat4( TRANSFORM, LON );
|
||||||
|
sgPreMultMat4( TRANSFORM, LAT );
|
||||||
|
|
||||||
|
sgCoord pos;
|
||||||
|
sgSetCoord( &pos, TRANSFORM );
|
||||||
|
|
||||||
|
sgMakeCoordMat4( transform, &pos );
|
||||||
|
last_lon = lon;
|
||||||
|
last_lat = lat;
|
||||||
|
last_alt = alt;
|
||||||
|
|
||||||
|
radarEcho.clear();
|
||||||
|
precipitation_max_alt = 400.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::endOfFrame(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
double SGEnviro::get_cloud_turbulence(void) const {
|
||||||
|
return last_cloud_turbulence;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this can be queried to add some turbulence for example
|
||||||
|
bool SGEnviro::is_view_in_cloud(void) const {
|
||||||
|
return view_in_cloud;
|
||||||
|
}
|
||||||
|
void SGEnviro::set_view_in_cloud(bool incloud) {
|
||||||
|
view_in_cloud = incloud;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SGEnviro::get_turbulence_enable_state(void) const {
|
||||||
|
return turbulence_enable_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::set_turbulence_enable_state(bool enable) {
|
||||||
|
turbulence_enable_state = enable;
|
||||||
|
}
|
||||||
|
// rain/snow
|
||||||
|
float SGEnviro::get_precipitation_density(void) const {
|
||||||
|
return precipitation_density;
|
||||||
|
}
|
||||||
|
bool SGEnviro::get_precipitation_enable_state(void) const {
|
||||||
|
return precipitation_enable_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::set_precipitation_density(float density) {
|
||||||
|
precipitation_density = density;
|
||||||
|
}
|
||||||
|
void SGEnviro::set_precipitation_enable_state(bool enable) {
|
||||||
|
precipitation_enable_state = enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
// others
|
||||||
|
bool SGEnviro::get_lightning_enable_state(void) const {
|
||||||
|
return lightning_enable_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::set_lightning_enable_state(bool enable) {
|
||||||
|
lightning_enable_state = enable;
|
||||||
|
if( ! enable ) {
|
||||||
|
// TODO:cleanup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::setLight(sgVec4 adj_fog_color) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
sgCopyVec4( fog_color, adj_fog_color );
|
||||||
|
if( false ) {
|
||||||
|
// ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
void SGEnviro::callback_cloud(float heading, float alt, float radius, int family, float dist, int cloudId) {
|
||||||
|
// send data to wx radar
|
||||||
|
// compute turbulence
|
||||||
|
// draw precipitation
|
||||||
|
// draw lightning
|
||||||
|
// compute illumination
|
||||||
|
|
||||||
|
// http://www.pilotfriend.com/flight_training/weather/THUNDERSTORM%20HAZARDS1.htm
|
||||||
|
double turbulence = 0.0;
|
||||||
|
if( dist < radius * radius * 2.25f ) {
|
||||||
|
switch(family) {
|
||||||
|
case SGNewCloud::CLFamilly_st:
|
||||||
|
turbulence = 0.2;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_ci:
|
||||||
|
case SGNewCloud::CLFamilly_cs:
|
||||||
|
case SGNewCloud::CLFamilly_cc:
|
||||||
|
case SGNewCloud::CLFamilly_ac:
|
||||||
|
case SGNewCloud::CLFamilly_as:
|
||||||
|
turbulence = 0.1;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_sc:
|
||||||
|
turbulence = 0.3;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_ns:
|
||||||
|
turbulence = 0.4;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_cu:
|
||||||
|
turbulence = 0.5;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_cb:
|
||||||
|
turbulence = 0.6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// full turbulence inside cloud, half in the vicinity
|
||||||
|
if( dist > radius * radius )
|
||||||
|
turbulence *= 0.5;
|
||||||
|
if( turbulence > cloud_turbulence )
|
||||||
|
cloud_turbulence = turbulence;
|
||||||
|
// we can do 'local' precipitations too
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert to LWC for radar (experimental)
|
||||||
|
// http://www-das.uwyo.edu/~geerts/cwx/notes/chap08/moist_cloud.html
|
||||||
|
double LWC = 0.0;
|
||||||
|
switch(family) {
|
||||||
|
case SGNewCloud::CLFamilly_st:
|
||||||
|
LWC = 0.29;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_cu:
|
||||||
|
LWC = 0.27;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_cb:
|
||||||
|
LWC = 2.0;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_sc:
|
||||||
|
LWC = 0.44;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_ci:
|
||||||
|
LWC = 0.03;
|
||||||
|
break;
|
||||||
|
// no data
|
||||||
|
case SGNewCloud::CLFamilly_cs:
|
||||||
|
case SGNewCloud::CLFamilly_cc:
|
||||||
|
case SGNewCloud::CLFamilly_ac:
|
||||||
|
case SGNewCloud::CLFamilly_as:
|
||||||
|
LWC = 0.03;
|
||||||
|
break;
|
||||||
|
case SGNewCloud::CLFamilly_ns:
|
||||||
|
LWC = 0.29*2.0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add to the list for the wxRadar instrument
|
||||||
|
if( LWC > 0.0 )
|
||||||
|
radarEcho.push_back( SGWxRadarEcho ( heading, alt, radius, dist, LWC, false, cloudId ) );
|
||||||
|
|
||||||
|
// NB:data valid only from cockpit view
|
||||||
|
|
||||||
|
// spawn a new lightning
|
||||||
|
if(lightning_enable_state && min_time_before_lt <= 0.0 && (family == SGNewCloud::CLFamilly_cb) &&
|
||||||
|
dist < 15000.0 * 15000.0 && sg_random() > 0.9f) {
|
||||||
|
double lat, lon;
|
||||||
|
Point3D orig, dest;
|
||||||
|
orig.setlat(last_lat * SG_DEGREES_TO_RADIANS );
|
||||||
|
orig.setlon(last_lon * SG_DEGREES_TO_RADIANS );
|
||||||
|
orig.setelev(0.0);
|
||||||
|
dist = sgSqrt(dist);
|
||||||
|
dest = calc_gc_lon_lat(orig, heading, dist);
|
||||||
|
lon = dest.lon() * SG_RADIANS_TO_DEGREES;
|
||||||
|
lat = dest.lat() * SG_RADIANS_TO_DEGREES;
|
||||||
|
addLightning( lon, lat, alt );
|
||||||
|
|
||||||
|
// reset timer
|
||||||
|
min_time_before_lt = 5.0 + sg_random() * 30;
|
||||||
|
// DEBUG only
|
||||||
|
// min_time_before_lt = 5.0;
|
||||||
|
}
|
||||||
|
if( (alt - radius * 0.1) > precipitation_max_alt )
|
||||||
|
switch(family) {
|
||||||
|
case SGNewCloud::CLFamilly_st:
|
||||||
|
case SGNewCloud::CLFamilly_cu:
|
||||||
|
case SGNewCloud::CLFamilly_cb:
|
||||||
|
case SGNewCloud::CLFamilly_ns:
|
||||||
|
case SGNewCloud::CLFamilly_sc:
|
||||||
|
precipitation_max_alt = alt - radius * 0.1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
list_of_SGWxRadarEcho *SGEnviro::get_radar_echo(void) {
|
||||||
|
return &radarEcho;
|
||||||
|
}
|
||||||
|
|
||||||
|
// precipitation rendering code
|
||||||
|
void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
sgVec3 light;
|
||||||
|
sgAddVec3( light, fog_color, min_light );
|
||||||
|
float da = SG_PI * 2.0f / (float) slices;
|
||||||
|
// low number = faster
|
||||||
|
float speedf = streak_period_max - speed * streak_period_change_per_kt;
|
||||||
|
if( speedf < streak_period_min )
|
||||||
|
speedf = streak_period_min;
|
||||||
|
float lenf = streak_length_min + speed * streak_length_change_per_kt;
|
||||||
|
if( lenf > streak_length_max )
|
||||||
|
lenf = streak_length_max;
|
||||||
|
float t = fmod((float) elapsed_time, speedf) / speedf;
|
||||||
|
// t = 0.1f;
|
||||||
|
if( !down )
|
||||||
|
t = 1.0f - t;
|
||||||
|
float angle = 0.0f;
|
||||||
|
//glColor4f(1.0f, 0.7f, 0.7f, 0.9f); // XXX unneeded? overriden below
|
||||||
|
glBegin(GL_LINES);
|
||||||
|
if (slices > MAX_RAIN_SLICE)
|
||||||
|
slices = MAX_RAIN_SLICE; // should never happen
|
||||||
|
for( int i = 0 ; i < slices ; i++ ) {
|
||||||
|
float x = cos(angle) * baseRadius;
|
||||||
|
float y = sin(angle) * baseRadius;
|
||||||
|
angle += da;
|
||||||
|
sgVec3 dir = {x, -height, y};
|
||||||
|
|
||||||
|
// rain drops at 2 different speed to simulate depth
|
||||||
|
float t1 = (i & 1 ? t : t + t) + rainpos[i];
|
||||||
|
if(t1 > 1.0f) t1 -= 1.0f;
|
||||||
|
if(t1 > 1.0f) t1 -= 1.0f;
|
||||||
|
|
||||||
|
// distant raindrops are more transparent
|
||||||
|
float c = t1 * (i & 1 ?
|
||||||
|
streak_bright_farmost_layer
|
||||||
|
: streak_bright_nearmost_layer);
|
||||||
|
glColor4f(c * light[0], c * light[1], c * light[2], c);
|
||||||
|
sgVec3 p1, p2;
|
||||||
|
sgScaleVec3(p1, dir, t1);
|
||||||
|
// distant raindrops are shorter
|
||||||
|
float t2 = t1 + (i & 1 ? lenf : lenf+lenf);
|
||||||
|
sgScaleVec3(p2, dir, t2);
|
||||||
|
|
||||||
|
glVertex3f(p1[0], p1[1] + height, p1[2]);
|
||||||
|
glVertex3f(p2[0], p2[1] + height, p2[2]);
|
||||||
|
}
|
||||||
|
glEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static int debug_period = 0;
|
||||||
|
if (debug_period++ == 50) {
|
||||||
|
debug_period = 0;
|
||||||
|
cout << "drawRain("
|
||||||
|
<< pitch << ", "
|
||||||
|
<< roll << ", "
|
||||||
|
<< heading << ", "
|
||||||
|
<< hspeed << ", "
|
||||||
|
<< rain_norm << ");"
|
||||||
|
//" angle = " << angle
|
||||||
|
//<< " raindrop(KTS) = " << raindrop_speed_kts
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glShadeModel(GL_SMOOTH);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA );
|
||||||
|
glDisable( GL_FOG );
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
|
int slice_count = static_cast<int>(
|
||||||
|
(streak_count_min + rain_norm*(streak_count_max-streak_count_min))
|
||||||
|
* precipitation_density / 100.0);
|
||||||
|
|
||||||
|
// www.wonderquest.com/falling-raindrops.htm says that
|
||||||
|
// Raindrop terminal velocity is 5 to 20mph
|
||||||
|
// Rather than model it accurately (temp, pressure, diameter), and make it
|
||||||
|
// smaller than terminal when closer to the precipitation cloud base,
|
||||||
|
// we interpolate in the 5-20mph range according to rain_norm.
|
||||||
|
double raindrop_speed_kts
|
||||||
|
= (5.0 + rain_norm*15.0) * SG_MPH_TO_MPS * SG_MPS_TO_KT;
|
||||||
|
|
||||||
|
float angle = atanf(hspeed / raindrop_speed_kts) * SG_RADIANS_TO_DEGREES;
|
||||||
|
glPushMatrix();
|
||||||
|
// the cone rotate with hspeed
|
||||||
|
angle = -pitch - angle;
|
||||||
|
glRotatef(roll, 0.0, 0.0, 1.0);
|
||||||
|
glRotatef(heading, 0.0, 1.0, 0.0);
|
||||||
|
glRotatef(angle, 1.0, 0.0, 0.0);
|
||||||
|
|
||||||
|
// up cone
|
||||||
|
DrawCone2(cone_base_radius, cone_height,
|
||||||
|
slice_count, true, rain_norm, hspeed);
|
||||||
|
// down cone (usually not visible)
|
||||||
|
if(angle > 0.0 || heading != 0.0)
|
||||||
|
DrawCone2(cone_base_radius, -cone_height,
|
||||||
|
slice_count, false, rain_norm, hspeed);
|
||||||
|
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
||||||
|
glEnable( GL_FOG );
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::set_soundMgr(SGSoundMgr *mgr) {
|
||||||
|
soundMgr = mgr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::drawPrecipitation(double rain_norm, double snow_norm, double hail_norm, double pitch, double roll, double heading, double hspeed) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
if( precipitation_enable_state && rain_norm > 0.0)
|
||||||
|
if( precipitation_max_alt >= last_alt )
|
||||||
|
drawRain(pitch, roll, heading, hspeed, rain_norm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SGLightning::SGLightning(double _lon, double _lat, double _alt) :
|
||||||
|
nb_tree(0),
|
||||||
|
lon(_lon),
|
||||||
|
lat(_lat),
|
||||||
|
alt(_alt),
|
||||||
|
age(1.0 + sg_random() * 4.0)
|
||||||
|
{
|
||||||
|
// sequence_count = 1 + sg_random() * 5.0;
|
||||||
|
lt_build();
|
||||||
|
}
|
||||||
|
|
||||||
|
SGLightning::~SGLightning() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// lightning rendering code
|
||||||
|
void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
|
||||||
|
sgVec3 dir, newdir;
|
||||||
|
int nseg = 0;
|
||||||
|
Point3D pt = start;
|
||||||
|
if( nbseg == 50 )
|
||||||
|
sgSetVec3( dir, 0.0, -1.0, 0.0 );
|
||||||
|
else {
|
||||||
|
sgSetVec3( dir, sg_random() - 0.5f, sg_random() - 0.5f, sg_random() - 0.5f);
|
||||||
|
sgNormaliseVec3(dir);
|
||||||
|
}
|
||||||
|
if( nb_tree >= MAX_LT_TREE_SEG )
|
||||||
|
return;
|
||||||
|
|
||||||
|
lt_tree[nb_tree].depth = tree_nr;
|
||||||
|
nseg = 0;
|
||||||
|
lt_tree[nb_tree].pt = pt;
|
||||||
|
lt_tree[nb_tree].prev = -1;
|
||||||
|
nb_tree ++;
|
||||||
|
|
||||||
|
// TODO:check agl
|
||||||
|
while(nseg < nbseg && pt.y() > 0.0) {
|
||||||
|
int prev = nb_tree - 1;
|
||||||
|
nseg++;
|
||||||
|
// add a branch
|
||||||
|
if( energy * sg_random() > 0.8f )
|
||||||
|
lt_build_tree_branch(tree_nr + 1, pt, energy * 0.9f, nbseg == 50 ? 10 : static_cast<int>(nbseg * 0.4f), segsize * 0.7f);
|
||||||
|
|
||||||
|
if( nb_tree >= MAX_LT_TREE_SEG )
|
||||||
|
return;
|
||||||
|
sgSetVec3(newdir, (sg_random() - 0.5f), (sg_random() - 0.5f) - (nbseg == 50 ? 0.5f : 0.0), (sg_random() - 0.5f));
|
||||||
|
sgNormaliseVec3(newdir);
|
||||||
|
sgAddVec3( dir, newdir);
|
||||||
|
sgNormaliseVec3(dir);
|
||||||
|
sgVec3 scaleDir;
|
||||||
|
sgScaleVec3( scaleDir, dir, segsize * energy * 0.5f );
|
||||||
|
pt[PX] += scaleDir[0];
|
||||||
|
pt[PY] += scaleDir[1];
|
||||||
|
pt[PZ] += scaleDir[2];
|
||||||
|
|
||||||
|
lt_tree[nb_tree].depth = tree_nr;
|
||||||
|
lt_tree[nb_tree].pt = pt;
|
||||||
|
lt_tree[nb_tree].prev = prev;
|
||||||
|
nb_tree ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGLightning::lt_build(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
Point3D top;
|
||||||
|
nb_tree = 0;
|
||||||
|
top[PX] = 0 ;
|
||||||
|
top[PY] = alt;
|
||||||
|
top[PZ] = 0;
|
||||||
|
lt_build_tree_branch(0, top, 1.0, 50, top[PY] / 8.0);
|
||||||
|
if( ! sgEnviro.soundMgr )
|
||||||
|
return;
|
||||||
|
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
double course = 0.0, dist = 0.0;
|
||||||
|
calc_gc_course_dist( dest, start, &course, &dist );
|
||||||
|
if( dist < 10000.0 && ! sgEnviro.snd_playing && (dist < sgEnviro.snd_dist || ! sgEnviro.snd_active) ) {
|
||||||
|
sgEnviro.snd_timer = 0.0;
|
||||||
|
sgEnviro.snd_wait = dist / 340;
|
||||||
|
sgEnviro.snd_dist = dist;
|
||||||
|
sgEnviro.snd_pos_lat = lat;
|
||||||
|
sgEnviro.snd_pos_lon = lon;
|
||||||
|
sgEnviro.snd_active = true;
|
||||||
|
sgEnviro.snd_playing = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGLightning::lt_Render(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
float flash = 0.5;
|
||||||
|
if( fmod(sgEnviro.elapsed_time*100.0, 100.0) > 50.0 )
|
||||||
|
flash = sg_random() * 0.75f + 0.25f;
|
||||||
|
float h = lt_tree[0].pt[PY];
|
||||||
|
sgVec4 col={0.62f, 0.83f, 1.0f, 1.0f};
|
||||||
|
sgVec4 c;
|
||||||
|
|
||||||
|
#define DRAW_SEG() \
|
||||||
|
{glColorMaterial(GL_FRONT, GL_EMISSION); \
|
||||||
|
glDisable(GL_LINE_SMOOTH); glBegin(GL_LINES); \
|
||||||
|
glColor4fv(c); \
|
||||||
|
glVertex3f(lt_tree[n].pt[PX], lt_tree[n].pt[PZ], lt_tree[n].pt[PY]); \
|
||||||
|
glVertex3f(lt_tree[lt_tree[n].prev].pt[PX], lt_tree[lt_tree[n].prev].pt[PZ], lt_tree[lt_tree[n].prev].pt[PY]); \
|
||||||
|
glEnd(); glEnable(GL_LINE_SMOOTH);}
|
||||||
|
|
||||||
|
glDepthMask( GL_FALSE );
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc( GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
|
glDisable(GL_LIGHTING);
|
||||||
|
glDisable( GL_FOG );
|
||||||
|
glPushMatrix();
|
||||||
|
sgMat4 modelview, tmp;
|
||||||
|
// OSGFIXME
|
||||||
|
// ssgGetModelviewMatrix( modelview );
|
||||||
|
sgCopyMat4( tmp, sgEnviro.transform );
|
||||||
|
sgPostMultMat4( tmp, modelview );
|
||||||
|
// OSGFIXME
|
||||||
|
// ssgLoadModelviewMatrix( tmp );
|
||||||
|
|
||||||
|
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
double course = 0.0, dist = 0.0;
|
||||||
|
calc_gc_course_dist( dest, start, &course, &dist );
|
||||||
|
double ax = 0.0, ay = 0.0;
|
||||||
|
ax = cos(course) * dist;
|
||||||
|
ay = sin(course) * dist;
|
||||||
|
|
||||||
|
glTranslatef( ax, ay, -sgEnviro.last_alt );
|
||||||
|
|
||||||
|
sgEnviro.radarEcho.push_back( SGWxRadarEcho ( course, 0.0, 0.0, dist, age, true, 0 ) );
|
||||||
|
|
||||||
|
for( int n = 0 ; n < nb_tree ; n++ ) {
|
||||||
|
if( lt_tree[n].prev < 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
float t1 = sgLerp(0.5, 1.0, lt_tree[n].pt[PY] / h);
|
||||||
|
t1 *= flash;
|
||||||
|
if( lt_tree[n].depth >= 2 ) {
|
||||||
|
glLineWidth(3);
|
||||||
|
sgScaleVec4(c, col, t1 * 0.6f);
|
||||||
|
DRAW_SEG();
|
||||||
|
} else {
|
||||||
|
if( lt_tree[n].depth == 0 ) {
|
||||||
|
glLineWidth(12);
|
||||||
|
sgScaleVec4(c, col, t1 * 0.5f);
|
||||||
|
DRAW_SEG();
|
||||||
|
|
||||||
|
glLineWidth(6);
|
||||||
|
sgScaleVec4(c, col, t1);
|
||||||
|
DRAW_SEG();
|
||||||
|
} else {
|
||||||
|
glLineWidth(6);
|
||||||
|
sgScaleVec4(c, col, t1 * 0.7f);
|
||||||
|
DRAW_SEG();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( lt_tree[n].depth == 0 )
|
||||||
|
glLineWidth(3);
|
||||||
|
else
|
||||||
|
glLineWidth(2);
|
||||||
|
|
||||||
|
sgSetVec4(c, t1, t1, t1, t1);
|
||||||
|
DRAW_SEG();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
glLineWidth(1);
|
||||||
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
||||||
|
glPopMatrix();
|
||||||
|
glDepthMask( GL_TRUE );
|
||||||
|
glEnable( GL_FOG );
|
||||||
|
glEnable(GL_LIGHTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::addLightning(double lon, double lat, double alt) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
if( lightnings.size() > 10)
|
||||||
|
return;
|
||||||
|
SGLightning *lt= new SGLightning(lon, lat, alt);
|
||||||
|
lightnings.push_back(lt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::drawLightning(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
list_of_lightning::iterator iLightning;
|
||||||
|
// play 'thunder' for lightning
|
||||||
|
if( snd_active )
|
||||||
|
if( !snd_playing ) {
|
||||||
|
// wait until sound has reached us
|
||||||
|
snd_timer += dt;
|
||||||
|
if( snd_timer >= snd_wait ) {
|
||||||
|
snd_playing = true;
|
||||||
|
// compute relative position of lightning
|
||||||
|
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
Point3D dest( snd_pos_lon*SG_DEGREES_TO_RADIANS, snd_pos_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
|
double course = 0.0, dist = 0.0;
|
||||||
|
calc_gc_course_dist( dest, start, &course, &dist );
|
||||||
|
double ax = 0.0, ay = 0.0;
|
||||||
|
ax = cos(course) * dist;
|
||||||
|
ay = sin(course) * dist;
|
||||||
|
SGSharedPtr<SGSoundSample> snd = soundMgr->find("thunder");
|
||||||
|
if( snd ) {
|
||||||
|
ALfloat pos[3]={ax, ay, -sgEnviro.last_alt };
|
||||||
|
snd->set_source_pos(pos);
|
||||||
|
snd->play_once();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if( !soundMgr->is_playing("thunder") ) {
|
||||||
|
snd_active = false;
|
||||||
|
snd_playing = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ! lightning_enable_state )
|
||||||
|
return;
|
||||||
|
|
||||||
|
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
|
||||||
|
if( dt )
|
||||||
|
if( sg_random() > 0.95f )
|
||||||
|
(*iLightning)->lt_build();
|
||||||
|
(*iLightning)->lt_Render();
|
||||||
|
(*iLightning)->age -= dt;
|
||||||
|
if( (*iLightning)->age < 0.0 ) {
|
||||||
|
delete (*iLightning);
|
||||||
|
lightnings.erase( iLightning );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SGEnviro::setFOV( float w, float h ) {
|
||||||
|
fov_width = w;
|
||||||
|
fov_height = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SGEnviro::getFOV( float &w, float &h ) {
|
||||||
|
w = fov_width;
|
||||||
|
h = fov_height;
|
||||||
|
}
|
||||||
@@ -0,0 +1,258 @@
|
|||||||
|
// Visual environment helper class
|
||||||
|
//
|
||||||
|
// Written by Harald JOHNSEN, started April 2005.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2005 Harald JOHNSEN - hjohnsen@evc.net
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful, but
|
||||||
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
#ifndef _VISUAL_ENVIRO_HXX
|
||||||
|
#define _VISUAL_ENVIRO_HXX
|
||||||
|
|
||||||
|
#include <plib/sg.h>
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using std::vector;
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
class SGLightning;
|
||||||
|
class SGSoundMgr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simulate some echo on a weather radar.
|
||||||
|
* Container class for the wx radar instrument.
|
||||||
|
*/
|
||||||
|
class SGWxRadarEcho {
|
||||||
|
public:
|
||||||
|
SGWxRadarEcho(float _heading, float _alt, float _radius, float _dist,
|
||||||
|
double _LWC, bool _lightning, int _cloudId ) :
|
||||||
|
heading( _heading ),
|
||||||
|
alt ( _alt ),
|
||||||
|
radius ( _radius ),
|
||||||
|
dist ( _dist ),
|
||||||
|
LWC ( _LWC ),
|
||||||
|
lightning ( _lightning ),
|
||||||
|
cloudId ( _cloudId )
|
||||||
|
{}
|
||||||
|
|
||||||
|
/** the heading in radian is versus north */
|
||||||
|
float heading;
|
||||||
|
float alt, radius, dist;
|
||||||
|
/** reflectivity converted to liquid water content. */
|
||||||
|
double LWC;
|
||||||
|
/** if true then this data is for a lightning else it is for water echo. */
|
||||||
|
bool lightning;
|
||||||
|
/** Unique identifier of cloud */
|
||||||
|
int cloudId;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef vector<SGWxRadarEcho> list_of_SGWxRadarEcho;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Visual environment helper class.
|
||||||
|
*/
|
||||||
|
class SGEnviro {
|
||||||
|
friend class SGLightning;
|
||||||
|
private:
|
||||||
|
void DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed);
|
||||||
|
void lt_update(void);
|
||||||
|
|
||||||
|
bool view_in_cloud;
|
||||||
|
bool precipitation_enable_state;
|
||||||
|
float precipitation_density;
|
||||||
|
float precipitation_max_alt;
|
||||||
|
bool turbulence_enable_state;
|
||||||
|
double last_cloud_turbulence, cloud_turbulence;
|
||||||
|
bool lightning_enable_state;
|
||||||
|
double elapsed_time, dt;
|
||||||
|
sgVec4 fog_color;
|
||||||
|
sgMat4 transform;
|
||||||
|
double last_lon, last_lat, last_alt;
|
||||||
|
SGSoundMgr *soundMgr;
|
||||||
|
bool snd_active, snd_playing;
|
||||||
|
double snd_timer, snd_wait, snd_pos_lat, snd_pos_lon, snd_dist;
|
||||||
|
double min_time_before_lt;
|
||||||
|
|
||||||
|
float fov_width, fov_height;
|
||||||
|
|
||||||
|
/** a list of all the radar echo. */
|
||||||
|
list_of_SGWxRadarEcho radarEcho;
|
||||||
|
static sgVec3 min_light;
|
||||||
|
static SGfloat streak_bright_nearmost_layer,
|
||||||
|
streak_bright_farmost_layer,
|
||||||
|
streak_period_max,
|
||||||
|
streak_period_change_per_kt,
|
||||||
|
streak_period_min,
|
||||||
|
streak_length_min,
|
||||||
|
streak_length_change_per_kt,
|
||||||
|
streak_length_max;
|
||||||
|
static int streak_count_min, streak_count_max;
|
||||||
|
static SGfloat cone_base_radius,
|
||||||
|
cone_height;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SGEnviro();
|
||||||
|
~SGEnviro();
|
||||||
|
|
||||||
|
/** Read the config from the precipitation rendering config properties.
|
||||||
|
* @param precip_rendering_cfgNode "/sim/rendering/precipitation" in fg
|
||||||
|
* Set from whatever info present in the
|
||||||
|
* subnodes passed, substituting hardwired defaults for missing fields.
|
||||||
|
* If NULL is given, do nothing.
|
||||||
|
*/
|
||||||
|
void config(const class SGPropertyNode* precip_rendering_cfgNode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward a few states used for renderings.
|
||||||
|
*/
|
||||||
|
void startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time);
|
||||||
|
|
||||||
|
void endOfFrame(void);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/**
|
||||||
|
* Whenever a cloud is drawn we check his 'impact' on the environment.
|
||||||
|
* @param heading direction of cloud in radians
|
||||||
|
* @param alt asl of cloud in meters
|
||||||
|
* @param radius radius of cloud in meters
|
||||||
|
* @param family cloud family
|
||||||
|
* @param dist squared dist to cloud in meters
|
||||||
|
*/
|
||||||
|
void callback_cloud(float heading, float alt, float radius, int family, float dist, int cloudId);
|
||||||
|
#endif
|
||||||
|
void drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm);
|
||||||
|
/**
|
||||||
|
* Draw rain or snow precipitation around the viewer.
|
||||||
|
* @param rain_norm rain normalized intensity given by metar class
|
||||||
|
* @param snow_norm snow normalized intensity given by metar class
|
||||||
|
* @param hail_norm hail normalized intensity given by metar class
|
||||||
|
* @param pitch pitch rotation of viewer
|
||||||
|
* @param roll roll rotation of viewer
|
||||||
|
* @param hspeed moving horizontal speed of viewer in kt
|
||||||
|
*/
|
||||||
|
void drawPrecipitation(double rain_norm, double snow_norm, double hail_norm,
|
||||||
|
double pitch, double roll, double heading, double hspeed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the lightnings spawned by cumulo nimbus.
|
||||||
|
*/
|
||||||
|
void drawLightning(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward the fog color used by the rain rendering.
|
||||||
|
* @param adj_fog_color color of the fog
|
||||||
|
*/
|
||||||
|
void setLight(sgVec4 adj_fog_color);
|
||||||
|
|
||||||
|
// this can be queried to add some turbulence for example
|
||||||
|
bool is_view_in_cloud(void) const;
|
||||||
|
void set_view_in_cloud(bool incloud);
|
||||||
|
double get_cloud_turbulence(void) const;
|
||||||
|
|
||||||
|
// Clouds
|
||||||
|
// return the size of the memory pool used by texture impostors
|
||||||
|
int get_clouds_CacheSize(void) const;
|
||||||
|
int get_CacheResolution(void) const;
|
||||||
|
float get_clouds_visibility(void) const;
|
||||||
|
float get_clouds_density(void) const;
|
||||||
|
bool get_clouds_enable_state(void) const;
|
||||||
|
bool get_turbulence_enable_state(void) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the size of the impostor texture cache for 3D clouds.
|
||||||
|
* @param sizeKb size of the texture pool in Kb
|
||||||
|
*/
|
||||||
|
void set_clouds_CacheSize(int sizeKb);
|
||||||
|
/**
|
||||||
|
* Set the resolution of the impostor texture for 3D clouds.
|
||||||
|
* @param resolutionPixels size of each texture in pixels (64|128|256)
|
||||||
|
*/
|
||||||
|
void set_CacheResolution(int resolutionPixels);
|
||||||
|
/**
|
||||||
|
* Set the maximum range used when drawing clouds.
|
||||||
|
* Clouds are blended from totaly transparent at max range to totaly opaque around the viewer
|
||||||
|
* @param distance in meters
|
||||||
|
*/
|
||||||
|
void set_clouds_visibility(float distance);
|
||||||
|
/**
|
||||||
|
* Set the proportion of clouds that will be rendered to limit drop in FPS.
|
||||||
|
* @param density 0..100 no clouds drawn when density == 0, all are drawn when density == 100
|
||||||
|
*/
|
||||||
|
void set_clouds_density(float density);
|
||||||
|
/**
|
||||||
|
* Enable or disable the use of 3D clouds.
|
||||||
|
* @param enable when false we draw the 2D layers
|
||||||
|
*/
|
||||||
|
void set_clouds_enable_state(bool enable);
|
||||||
|
/**
|
||||||
|
* Enable or disable the use of proximity cloud turbulence.
|
||||||
|
* @param enable when true the turbulence is computed based on type of cloud around the AC
|
||||||
|
*/
|
||||||
|
void set_turbulence_enable_state(bool enable);
|
||||||
|
|
||||||
|
// rain/snow
|
||||||
|
float get_precipitation_density(void) const;
|
||||||
|
bool get_precipitation_enable_state(void) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decrease the precipitation density to the given percentage.
|
||||||
|
* (Only show the given percentage of rain streaks etc.)
|
||||||
|
* Default precipitation density upon construction is 100.0.
|
||||||
|
* @param density 0.0 to 100.0
|
||||||
|
*/
|
||||||
|
void set_precipitation_density(float density);
|
||||||
|
/**
|
||||||
|
* Enable or disable the rendering of precipitation around the viewer.
|
||||||
|
* @param enable when true we will draw precipitation depending on metar data
|
||||||
|
*/
|
||||||
|
void set_precipitation_enable_state(bool enable);
|
||||||
|
|
||||||
|
// others
|
||||||
|
bool get_lightning_enable_state(void) const;
|
||||||
|
/**
|
||||||
|
* Enable or disable the rendering of lightning and the thunder sound.
|
||||||
|
* @param enable when true we will draw lightning spwaned by cumulonimbus
|
||||||
|
*/
|
||||||
|
void set_lightning_enable_state(bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spawn a new lighning at specified lon/lat.
|
||||||
|
* @param lon position of the new lightning
|
||||||
|
* @param lat position of the new lightning
|
||||||
|
* @param alt asl of the starting point of the lightning in meters
|
||||||
|
*/
|
||||||
|
void addLightning(double lon, double lat, double alt);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Forward the sound manager instance to be able to play samples.
|
||||||
|
* @param mgr a running sound manager
|
||||||
|
*/
|
||||||
|
void set_soundMgr(SGSoundMgr *mgr);
|
||||||
|
|
||||||
|
void setFOV( float w, float h );
|
||||||
|
void getFOV( float &w, float &h );
|
||||||
|
|
||||||
|
list_of_SGWxRadarEcho *get_radar_echo(void);
|
||||||
|
|
||||||
|
sgMat4 *get_transform(void) { return &transform; }
|
||||||
|
};
|
||||||
|
|
||||||
|
extern SGEnviro sgEnviro;
|
||||||
|
|
||||||
|
#endif // _VISUAL_ENVIRO_HXX
|
||||||
@@ -15,19 +15,15 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
#ifdef SG_MATH_EXCEPTION_CLASH
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "celestialBody.hxx"
|
#include "celestialBody.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -27,9 +26,9 @@
|
|||||||
#ifndef _CELESTIALBODY_H_
|
#ifndef _CELESTIALBODY_H_
|
||||||
#define _CELESTIALBODY_H_
|
#define _CELESTIALBODY_H_
|
||||||
|
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
# error This library requires C++
|
# error This library requires C++
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started March 2000.
|
// Written by Curtis Olson, started March 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -15,13 +15,15 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
@@ -29,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
SGEphemeris::SGEphemeris( const string &path ) {
|
SGEphemeris::SGEphemeris( const std::string &path ) {
|
||||||
our_sun = new Star;
|
our_sun = new Star;
|
||||||
moon = new MoonPos;
|
moon = new MoonPos;
|
||||||
mercury = new Mercury;
|
mercury = new Mercury;
|
||||||
@@ -40,9 +42,8 @@ SGEphemeris::SGEphemeris( const string &path ) {
|
|||||||
uranus = new Uranus;
|
uranus = new Uranus;
|
||||||
neptune = new Neptune;
|
neptune = new Neptune;
|
||||||
nplanets = 7;
|
nplanets = 7;
|
||||||
for ( int i = 0; i < nplanets; ++i ) {
|
for ( int i = 0; i < nplanets; ++i )
|
||||||
sgdSetVec3( planets[i], 0.0, 0.0, 0.0 );
|
planets[i] = SGVec3d::zeros();
|
||||||
}
|
|
||||||
stars = new SGStarData( SGPath(path) );
|
stars = new SGStarData( SGPath(path) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
// All the core code underneath this is written by Durk Talsma. See
|
// All the core code underneath this is written by Durk Talsma. See
|
||||||
// the headers of all the other individual files for details.
|
// the headers of all the other individual files for details.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -19,10 +19,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -30,8 +29,7 @@
|
|||||||
#ifndef _EPHEMERIS_HXX
|
#ifndef _EPHEMERIS_HXX
|
||||||
#define _EPHEMERIS_HXX
|
#define _EPHEMERIS_HXX
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <plib/sg.h>
|
|
||||||
|
|
||||||
#include <simgear/ephemeris/star.hxx>
|
#include <simgear/ephemeris/star.hxx>
|
||||||
#include <simgear/ephemeris/moonpos.hxx>
|
#include <simgear/ephemeris/moonpos.hxx>
|
||||||
@@ -44,11 +42,14 @@
|
|||||||
#include <simgear/ephemeris/neptune.hxx>
|
#include <simgear/ephemeris/neptune.hxx>
|
||||||
#include <simgear/ephemeris/stardata.hxx>
|
#include <simgear/ephemeris/stardata.hxx>
|
||||||
|
|
||||||
|
#include <simgear/math/SGMath.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
|
|
||||||
/** Ephemeris class
|
/** Ephemeris class
|
||||||
*
|
*
|
||||||
* Written by Durk Talsma <d.talsma@direct.a2000.nl> and Curtis Olson
|
* Written by Durk Talsma <d.talsma@direct.a2000.nl> and Curtis Olson
|
||||||
* <curt@flightgear.org>
|
* <http://www.flightgear.org/~curt>
|
||||||
*
|
*
|
||||||
* Introduction
|
* Introduction
|
||||||
*
|
*
|
||||||
@@ -84,7 +85,7 @@ class SGEphemeris {
|
|||||||
// planets[i][1] = Declination
|
// planets[i][1] = Declination
|
||||||
// planets[i][2] = Magnitude
|
// planets[i][2] = Magnitude
|
||||||
int nplanets;
|
int nplanets;
|
||||||
sgdVec3 planets[7];
|
SGVec3d planets[7];
|
||||||
|
|
||||||
SGStarData *stars;
|
SGStarData *stars;
|
||||||
|
|
||||||
@@ -96,7 +97,7 @@ public:
|
|||||||
* calling the constructor you need to provide a path pointing to
|
* calling the constructor you need to provide a path pointing to
|
||||||
* your star database file.
|
* your star database file.
|
||||||
* @param path path to your star database */
|
* @param path path to your star database */
|
||||||
SGEphemeris( const string &path );
|
SGEphemeris( const std::string &path );
|
||||||
|
|
||||||
/** Destructor */
|
/** Destructor */
|
||||||
~SGEphemeris( void );
|
~SGEphemeris( void );
|
||||||
@@ -156,7 +157,7 @@ public:
|
|||||||
* the second is the declination, and the third is the magnitude.
|
* the second is the declination, and the third is the magnitude.
|
||||||
* @return planets array
|
* @return planets array
|
||||||
*/
|
*/
|
||||||
inline sgdVec3 *getPlanets() { return planets; }
|
inline SGVec3d *getPlanets() { return planets; }
|
||||||
|
|
||||||
/** @return the numbers of defined stars. */
|
/** @return the numbers of defined stars. */
|
||||||
inline int getNumStars() const { return stars->getNumStars(); }
|
inline int getNumStars() const { return stars->getNumStars(); }
|
||||||
@@ -168,7 +169,7 @@ public:
|
|||||||
* third is the magnitude.
|
* third is the magnitude.
|
||||||
* @returns star array
|
* @returns star array
|
||||||
*/
|
*/
|
||||||
inline sgdVec3 *getStars() { return stars->getStars(); }
|
inline SGVec3d *getStars() { return stars->getStars(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,18 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "jupiter.hxx"
|
#include "jupiter.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,17 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "mars.hxx"
|
#include "mars.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,17 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "mercury.hxx"
|
#include "mercury.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -28,9 +27,6 @@
|
|||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
// #include <FDM/flight.hxx>
|
// #include <FDM/flight.hxx>
|
||||||
@@ -172,7 +168,7 @@ void MoonPos::updatePosition(double mjd, double lst, double lat, Star *ourSun)
|
|||||||
// SG_LOG( SG_GENERAL, SG_INFO, "rho = " << rho );
|
// SG_LOG( SG_GENERAL, SG_INFO, "rho = " << rho );
|
||||||
|
|
||||||
if (geoRa < 0)
|
if (geoRa < 0)
|
||||||
geoRa += (2*SGD_PI);
|
geoRa += SGD_2PI;
|
||||||
|
|
||||||
HA = lst - (3.8197186 * geoRa);
|
HA = lst - (3.8197186 * geoRa);
|
||||||
/* SG_LOG( SG_GENERAL, SG_INFO, "t->getLst() = " << t->getLst()
|
/* SG_LOG( SG_GENERAL, SG_INFO, "t->getLst() = " << t->getLst()
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,17 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "saturn.hxx"
|
#include "saturn.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,18 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
@@ -80,7 +75,7 @@ void Star::updatePosition(double mjd)
|
|||||||
double
|
double
|
||||||
actTime, eccAnom,
|
actTime, eccAnom,
|
||||||
xv, yv, v, r,
|
xv, yv, v, r,
|
||||||
xe, ye, ze, ecl;
|
xe, ecl;
|
||||||
|
|
||||||
updateOrbElements(mjd);
|
updateOrbElements(mjd);
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
@@ -35,6 +34,7 @@ class Star : public CelestialBody
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
double xs, ys; // the sun's rectangular geocentric coordinates
|
double xs, ys; // the sun's rectangular geocentric coordinates
|
||||||
|
double ye, ze; // the sun's rectangularequatorial rectangular geocentric coordinates
|
||||||
double distance; // the sun's distance to the earth
|
double distance; // the sun's distance to the earth
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -47,6 +47,8 @@ public:
|
|||||||
double getw();
|
double getw();
|
||||||
double getxs();
|
double getxs();
|
||||||
double getys();
|
double getys();
|
||||||
|
double getye();
|
||||||
|
double getze();
|
||||||
double getDistance();
|
double getDistance();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -71,6 +73,16 @@ inline double Star::getys()
|
|||||||
return ys;
|
return ys;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline double Star::getye()
|
||||||
|
{
|
||||||
|
return ye;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline double Star::getze()
|
||||||
|
{
|
||||||
|
return ze;
|
||||||
|
}
|
||||||
|
|
||||||
inline double Star::getDistance()
|
inline double Star::getDistance()
|
||||||
{
|
{
|
||||||
return distance;
|
return distance;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started March 2000.
|
// Written by Curtis Olson, started March 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -14,34 +14,30 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/misc/sgstream.hxx>
|
#include <simgear/misc/sgstream.hxx>
|
||||||
|
|
||||||
#include "stardata.hxx"
|
#include "stardata.hxx"
|
||||||
|
|
||||||
#if defined (_MSC_VER)
|
#if defined (_MSC_VER)
|
||||||
SG_USING_STD(getline);
|
using std::getline;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
SGStarData::SGStarData() :
|
SGStarData::SGStarData( const SGPath& path )
|
||||||
nstars(0)
|
|
||||||
{
|
{
|
||||||
}
|
load(path);
|
||||||
|
|
||||||
SGStarData::SGStarData( SGPath path ) :
|
|
||||||
nstars(0)
|
|
||||||
{
|
|
||||||
data_path = SGPath( path );
|
|
||||||
load();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -50,31 +46,28 @@ SGStarData::~SGStarData() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SGStarData::load() {
|
bool SGStarData::load( const SGPath& path ) {
|
||||||
|
|
||||||
// -dw- avoid local data > 32k error by dynamic allocation of the
|
_stars.clear();
|
||||||
// array, problem for some compilers
|
|
||||||
stars = new sgdVec3[SG_MAX_STARS];
|
|
||||||
|
|
||||||
// build the full path name to the stars data base file
|
// build the full path name to the stars data base file
|
||||||
data_path.append( "stars" );
|
SGPath tmp = path;
|
||||||
SG_LOG( SG_ASTRO, SG_INFO, " Loading stars from " << data_path.str() );
|
tmp.append( "stars" );
|
||||||
|
SG_LOG( SG_ASTRO, SG_INFO, " Loading stars from " << tmp.str() );
|
||||||
|
|
||||||
sg_gzifstream in( data_path.str() );
|
sg_gzifstream in( tmp.str() );
|
||||||
if ( ! in.is_open() ) {
|
if ( ! in.is_open() ) {
|
||||||
SG_LOG( SG_ASTRO, SG_ALERT, "Cannot open star file: "
|
SG_LOG( SG_ASTRO, SG_ALERT, "Cannot open star file: "
|
||||||
<< data_path.str() );
|
<< tmp.str() );
|
||||||
exit(-1);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
double ra, dec, mag;
|
double ra, dec, mag;
|
||||||
char c;
|
char c;
|
||||||
string name;
|
string name;
|
||||||
|
|
||||||
nstars = 0;
|
|
||||||
|
|
||||||
// read in each line of the file
|
// read in each line of the file
|
||||||
while ( ! in.eof() && nstars < SG_MAX_STARS ) {
|
while ( ! in.eof() ) {
|
||||||
in >> skipcomment;
|
in >> skipcomment;
|
||||||
|
|
||||||
getline( in, name, ',' );
|
getline( in, name, ',' );
|
||||||
@@ -114,13 +107,10 @@ bool SGStarData::load() {
|
|||||||
in >> mag;
|
in >> mag;
|
||||||
|
|
||||||
// cout << " star data = " << ra << " " << dec << " " << mag << endl;
|
// cout << " star data = " << ra << " " << dec << " " << mag << endl;
|
||||||
|
_stars.push_back(SGVec3d(ra, dec, mag));
|
||||||
sgdSetVec3( stars[nstars], ra, dec, mag );
|
|
||||||
|
|
||||||
++nstars;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SG_LOG( SG_ASTRO, SG_INFO, " Loaded " << nstars << " stars" );
|
SG_LOG( SG_ASTRO, SG_INFO, " Loaded " << _stars.size() << " stars" );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started March 2000.
|
// Written by Curtis Olson, started March 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This library is free software; you can redistribute it and/or
|
// This library is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU Library General Public
|
// modify it under the terms of the GNU Library General Public
|
||||||
@@ -14,10 +14,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -25,37 +24,28 @@
|
|||||||
#ifndef _SG_STARDATA_HXX
|
#ifndef _SG_STARDATA_HXX
|
||||||
#define _SG_STARDATA_HXX
|
#define _SG_STARDATA_HXX
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <simgear/math/SGMath.hxx>
|
||||||
|
|
||||||
#include <plib/sg.h>
|
class SGPath;
|
||||||
|
|
||||||
#include <simgear/misc/sg_path.hxx>
|
|
||||||
|
|
||||||
|
|
||||||
#define SG_MAX_STARS 850
|
|
||||||
|
|
||||||
|
|
||||||
class SGStarData {
|
class SGStarData {
|
||||||
|
|
||||||
int nstars;
|
|
||||||
sgdVec3 *stars;
|
|
||||||
|
|
||||||
SGPath data_path;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
SGStarData();
|
SGStarData( const SGPath& path );
|
||||||
SGStarData( SGPath path );
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~SGStarData();
|
~SGStarData();
|
||||||
|
|
||||||
// load the stars database
|
// load the stars database
|
||||||
bool load();
|
bool load( const SGPath& path );
|
||||||
|
|
||||||
// stars
|
// stars
|
||||||
inline int getNumStars() const { return nstars; }
|
inline int getNumStars() const { return _stars.size(); }
|
||||||
inline sgdVec3 *getStars() { return stars; }
|
inline SGVec3d *getStars() { return &(_stars[0]); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<SGVec3d> _stars;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,17 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "uranus.hxx"
|
#include "uranus.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -15,17 +15,13 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifdef __BORLANDC__
|
|
||||||
# define exception c_exception
|
|
||||||
#endif
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "venus.hxx"
|
#include "venus.hxx"
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
* Library General Public License for more details.
|
* Library General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU Library General Public
|
* You should have received a copy of the GNU General Public License
|
||||||
* License along with this library; if not, write to the
|
* along with this program; if not, write to the Free Software
|
||||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
* Boston, MA 02111-1307, USA.
|
|
||||||
*
|
*
|
||||||
* $Id$
|
* $Id$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ noinst_PROGRAMS = decode_binobj socktest lowtest tcp_server tcp_client
|
|||||||
tcp_server_SOURCES = tcp_server.cxx
|
tcp_server_SOURCES = tcp_server.cxx
|
||||||
|
|
||||||
tcp_server_LDADD = \
|
tcp_server_LDADD = \
|
||||||
$(top_builddir)/simgear/io/libsgio.a \
|
libsgio.a \
|
||||||
$(top_builddir)/simgear/debug/libsgdebug.a \
|
$(top_builddir)/simgear/debug/libsgdebug.a \
|
||||||
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
||||||
$(top_builddir)/simgear/misc/libsgmisc.a \
|
$(top_builddir)/simgear/misc/libsgmisc.a \
|
||||||
@@ -38,7 +38,7 @@ tcp_server_LDADD = \
|
|||||||
tcp_client_SOURCES = tcp_client.cxx
|
tcp_client_SOURCES = tcp_client.cxx
|
||||||
|
|
||||||
tcp_client_LDADD = \
|
tcp_client_LDADD = \
|
||||||
$(top_builddir)/simgear/io/libsgio.a \
|
libsgio.a \
|
||||||
$(top_builddir)/simgear/debug/libsgdebug.a \
|
$(top_builddir)/simgear/debug/libsgdebug.a \
|
||||||
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
||||||
$(top_builddir)/simgear/misc/libsgmisc.a \
|
$(top_builddir)/simgear/misc/libsgmisc.a \
|
||||||
@@ -49,7 +49,7 @@ tcp_client_LDADD = \
|
|||||||
socktest_SOURCES = socktest.cxx
|
socktest_SOURCES = socktest.cxx
|
||||||
|
|
||||||
socktest_LDADD = \
|
socktest_LDADD = \
|
||||||
$(top_builddir)/simgear/io/libsgio.a \
|
libsgio.a \
|
||||||
$(top_builddir)/simgear/debug/libsgdebug.a \
|
$(top_builddir)/simgear/debug/libsgdebug.a \
|
||||||
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
||||||
$(top_builddir)/simgear/misc/libsgmisc.a \
|
$(top_builddir)/simgear/misc/libsgmisc.a \
|
||||||
@@ -60,7 +60,7 @@ socktest_LDADD = \
|
|||||||
lowtest_SOURCES = lowtest.cxx
|
lowtest_SOURCES = lowtest.cxx
|
||||||
|
|
||||||
lowtest_LDADD = \
|
lowtest_LDADD = \
|
||||||
$(top_builddir)/simgear/io/libsgio.a \
|
libsgio.a \
|
||||||
$(top_builddir)/simgear/debug/libsgdebug.a \
|
$(top_builddir)/simgear/debug/libsgdebug.a \
|
||||||
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
||||||
$(top_builddir)/simgear/misc/libsgmisc.a \
|
$(top_builddir)/simgear/misc/libsgmisc.a \
|
||||||
@@ -69,7 +69,7 @@ lowtest_LDADD = \
|
|||||||
decode_binobj_SOURCES = decode_binobj.cxx
|
decode_binobj_SOURCES = decode_binobj.cxx
|
||||||
|
|
||||||
decode_binobj_LDADD = \
|
decode_binobj_LDADD = \
|
||||||
$(top_builddir)/simgear/io/libsgio.a \
|
libsgio.a \
|
||||||
$(top_builddir)/simgear/debug/libsgdebug.a \
|
$(top_builddir)/simgear/debug/libsgdebug.a \
|
||||||
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
$(top_builddir)/simgear/bucket/libsgbucket.a \
|
||||||
$(top_builddir)/simgear/misc/libsgmisc.a \
|
$(top_builddir)/simgear/misc/libsgmisc.a \
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
|
|
||||||
#include "sg_binobj.hxx"
|
#include "sg_binobj.hxx"
|
||||||
|
|
||||||
SG_USING_STD(cout);
|
using std::cout;
|
||||||
SG_USING_STD(endl);
|
using std::endl;
|
||||||
|
|
||||||
|
|
||||||
int main( int argc, char **argv ) {
|
int main( int argc, char **argv ) {
|
||||||
@@ -33,14 +37,14 @@ int main( int argc, char **argv ) {
|
|||||||
obj.get_gbs_radius());
|
obj.get_gbs_radius());
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
point_list nodes = obj.get_wgs84_nodes();
|
std::vector<SGVec3d> nodes = obj.get_wgs84_nodes();
|
||||||
cout << "# vertex list" << endl;
|
cout << "# vertex list" << endl;
|
||||||
for ( i = 0; i < (int)nodes.size(); ++i ) {
|
for ( i = 0; i < (int)nodes.size(); ++i ) {
|
||||||
printf("v %.5f %.5f %.5f\n", nodes[i].x(), nodes[i].y(), nodes[i].z() );
|
printf("v %.5f %.5f %.5f\n", nodes[i].x(), nodes[i].y(), nodes[i].z() );
|
||||||
}
|
}
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
point_list normals = obj.get_normals();
|
std::vector<SGVec3f> normals = obj.get_normals();
|
||||||
cout << "# vertex normal list" << endl;
|
cout << "# vertex normal list" << endl;
|
||||||
for ( i = 0; i < (int)normals.size(); ++i ) {
|
for ( i = 0; i < (int)normals.size(); ++i ) {
|
||||||
printf("vn %.5f %.5f %.5f\n",
|
printf("vn %.5f %.5f %.5f\n",
|
||||||
@@ -48,7 +52,7 @@ int main( int argc, char **argv ) {
|
|||||||
}
|
}
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
point_list texcoords = obj.get_texcoords();
|
std::vector<SGVec2f> texcoords = obj.get_texcoords();
|
||||||
cout << "# texture coordinate list" << endl;
|
cout << "# texture coordinate list" << endl;
|
||||||
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
||||||
printf("vt %.5f %.5f\n",
|
printf("vt %.5f %.5f\n",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -70,3 +70,9 @@ int SGIOChannel::writestring( const char *str ) {
|
|||||||
bool SGIOChannel::close() {
|
bool SGIOChannel::close() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// dummy eof routine
|
||||||
|
bool SGIOChannel::eof() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -32,11 +32,11 @@
|
|||||||
|
|
||||||
// #include "protocol.hxx"
|
// #include "protocol.hxx"
|
||||||
|
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
using std::vector;
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
#define SG_IO_MAX_MSG_SIZE 16384
|
#define SG_IO_MAX_MSG_SIZE 16384
|
||||||
@@ -152,6 +152,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual bool close();
|
virtual bool close();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The eof() method returns true if end of file has been reached
|
||||||
|
* in a context where that makes sense. Otherwise it returns
|
||||||
|
* false.
|
||||||
|
* @return result of eof check
|
||||||
|
*/
|
||||||
|
virtual bool eof();
|
||||||
|
|
||||||
inline void set_type( SGChannelType t ) { type = t; }
|
inline void set_type( SGChannelType t ) { type = t; }
|
||||||
inline SGChannelType get_type() const { return type; }
|
inline SGChannelType get_type() const { return type; }
|
||||||
|
|
||||||
|
|||||||
+40
-40
@@ -4,7 +4,7 @@
|
|||||||
// Shamelessly adapted from plib (plib.sourceforge.net) January 2001
|
// Shamelessly adapted from plib (plib.sourceforge.net) January 2001
|
||||||
//
|
//
|
||||||
// Original version Copyright (C) 2000 the plib team
|
// Original version Copyright (C) 2000 the plib team
|
||||||
// Local changes Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Local changes Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ void sgReadFloat ( gzFile fd, float *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)var);
|
sgEndianSwap( (uint32_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ void sgReadFloat ( gzFile fd, float *var )
|
|||||||
void sgWriteFloat ( gzFile fd, const float var )
|
void sgWriteFloat ( gzFile fd, const float var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)&var);
|
sgEndianSwap( (uint32_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) != sizeof(float) ) {
|
if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) != sizeof(float) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
@@ -81,7 +81,7 @@ void sgReadDouble ( gzFile fd, double *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64*)var);
|
sgEndianSwap( (uint64_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ void sgReadDouble ( gzFile fd, double *var )
|
|||||||
void sgWriteDouble ( gzFile fd, const double var )
|
void sgWriteDouble ( gzFile fd, const double var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64*)&var);
|
sgEndianSwap( (uint64_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) != sizeof(double) ) {
|
if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) != sizeof(double) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
@@ -103,7 +103,7 @@ void sgReadUInt ( gzFile fd, unsigned int *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)var);
|
sgEndianSwap( (uint32_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ void sgReadUInt ( gzFile fd, unsigned int *var )
|
|||||||
void sgWriteUInt ( gzFile fd, const unsigned int var )
|
void sgWriteUInt ( gzFile fd, const unsigned int var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)&var);
|
sgEndianSwap( (uint32_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) )
|
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned int) )
|
||||||
!= sizeof(unsigned int) )
|
!= sizeof(unsigned int) )
|
||||||
@@ -127,7 +127,7 @@ void sgReadInt ( gzFile fd, int *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)var);
|
sgEndianSwap( (uint32_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ void sgReadInt ( gzFile fd, int *var )
|
|||||||
void sgWriteInt ( gzFile fd, const int var )
|
void sgWriteInt ( gzFile fd, const int var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)&var);
|
sgEndianSwap( (uint32_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) != sizeof(int) ) {
|
if ( gzwrite ( fd, (void *)(&var), sizeof(int) ) != sizeof(int) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
@@ -143,48 +143,48 @@ void sgWriteInt ( gzFile fd, const int var )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgReadLong ( gzFile fd, long int *var )
|
void sgReadLong ( gzFile fd, int32_t *var )
|
||||||
{
|
{
|
||||||
if ( gzread ( fd, var, sizeof(long int) ) != sizeof(long int) ) {
|
if ( gzread ( fd, var, sizeof(int32_t) ) != sizeof(int32_t) ) {
|
||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)var);
|
sgEndianSwap( (uint32_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgWriteLong ( gzFile fd, const long int var )
|
void sgWriteLong ( gzFile fd, const int32_t var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int*)&var);
|
sgEndianSwap( (uint32_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(long int) )
|
if ( gzwrite ( fd, (void *)(&var), sizeof(int32_t) )
|
||||||
!= sizeof(long int) )
|
!= sizeof(int32_t) )
|
||||||
{
|
{
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgReadLongLong ( gzFile fd, int64 *var )
|
void sgReadLongLong ( gzFile fd, int64_t *var )
|
||||||
{
|
{
|
||||||
if ( gzread ( fd, var, sizeof(int64) ) != sizeof(int64) ) {
|
if ( gzread ( fd, var, sizeof(int64_t) ) != sizeof(int64_t) ) {
|
||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64*)var);
|
sgEndianSwap( (uint64_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgWriteLongLong ( gzFile fd, const int64 var )
|
void sgWriteLongLong ( gzFile fd, const int64_t var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64*)&var);
|
sgEndianSwap( (uint64_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(int64) )
|
if ( gzwrite ( fd, (void *)(&var), sizeof(int64_t) )
|
||||||
!= sizeof(int64) )
|
!= sizeof(int64_t) )
|
||||||
{
|
{
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
}
|
}
|
||||||
@@ -197,7 +197,7 @@ void sgReadUShort ( gzFile fd, unsigned short *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned short int*)var);
|
sgEndianSwap( (uint16_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +205,7 @@ void sgReadUShort ( gzFile fd, unsigned short *var )
|
|||||||
void sgWriteUShort ( gzFile fd, const unsigned short var )
|
void sgWriteUShort ( gzFile fd, const unsigned short var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned short*)&var);
|
sgEndianSwap( (uint16_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) )
|
if ( gzwrite ( fd, (void *)(&var), sizeof(unsigned short) )
|
||||||
!= sizeof(unsigned short) )
|
!= sizeof(unsigned short) )
|
||||||
@@ -221,7 +221,7 @@ void sgReadShort ( gzFile fd, short *var )
|
|||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned short int*)var);
|
sgEndianSwap( (uint16_t *)var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ void sgReadShort ( gzFile fd, short *var )
|
|||||||
void sgWriteShort ( gzFile fd, const short var )
|
void sgWriteShort ( gzFile fd, const short var )
|
||||||
{
|
{
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned short*)&var);
|
sgEndianSwap( (uint16_t *)&var);
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) != sizeof(short) ) {
|
if ( gzwrite ( fd, (void *)(&var), sizeof(short) ) != sizeof(short) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
@@ -244,7 +244,7 @@ void sgReadFloat ( gzFile fd, const unsigned int n, float *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)var++);
|
sgEndianSwap( (uint32_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -257,7 +257,7 @@ void sgWriteFloat ( gzFile fd, const unsigned int n, const float *var )
|
|||||||
float *ptr = swab;
|
float *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(float) * n );
|
memcpy( swab, var, sizeof(float) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)ptr++);
|
sgEndianSwap( (uint32_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
@@ -275,7 +275,7 @@ void sgReadDouble ( gzFile fd, const unsigned int n, double *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (uint64*)var++);
|
sgEndianSwap( (uint64_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ void sgWriteDouble ( gzFile fd, const unsigned int n, const double *var )
|
|||||||
double *ptr = swab;
|
double *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(double) * n );
|
memcpy( swab, var, sizeof(double) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (uint64*)ptr++);
|
sgEndianSwap( (uint64_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
@@ -325,7 +325,7 @@ void sgReadUShort ( gzFile fd, const unsigned int n, unsigned short *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned short int*)var++);
|
sgEndianSwap( (uint16_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -338,7 +338,7 @@ void sgWriteUShort ( gzFile fd, const unsigned int n, const unsigned short *var
|
|||||||
unsigned short *ptr = swab;
|
unsigned short *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(unsigned short) * n );
|
memcpy( swab, var, sizeof(unsigned short) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned short*)ptr++);
|
sgEndianSwap( (uint16_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
@@ -360,7 +360,7 @@ void sgReadShort ( gzFile fd, const unsigned int n, short *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned short int*)var++);
|
sgEndianSwap( (uint16_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -373,7 +373,7 @@ void sgWriteShort ( gzFile fd, const unsigned int n, const short *var )
|
|||||||
short *ptr = swab;
|
short *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(short) * n );
|
memcpy( swab, var, sizeof(short) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned short*)ptr++);
|
sgEndianSwap( (uint16_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
@@ -394,7 +394,7 @@ void sgReadUInt ( gzFile fd, const unsigned int n, unsigned int *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)var++);
|
sgEndianSwap( (uint32_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ void sgWriteUInt ( gzFile fd, const unsigned int n, const unsigned int *var )
|
|||||||
unsigned int *ptr = swab;
|
unsigned int *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(unsigned int) * n );
|
memcpy( swab, var, sizeof(unsigned int) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)ptr++);
|
sgEndianSwap( (uint32_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
@@ -429,7 +429,7 @@ void sgReadInt ( gzFile fd, const unsigned int n, int *var )
|
|||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)var++);
|
sgEndianSwap( (uint32_t *)var++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -442,7 +442,7 @@ void sgWriteInt ( gzFile fd, const unsigned int n, const int *var )
|
|||||||
int *ptr = swab;
|
int *ptr = swab;
|
||||||
memcpy( swab, var, sizeof(int) * n );
|
memcpy( swab, var, sizeof(int) * n );
|
||||||
for ( unsigned int i = 0; i < n; ++i ) {
|
for ( unsigned int i = 0; i < n; ++i ) {
|
||||||
sgEndianSwap( (unsigned int*)ptr++);
|
sgEndianSwap( (uint32_t *)ptr++);
|
||||||
}
|
}
|
||||||
var = swab;
|
var = swab;
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-62
@@ -4,7 +4,7 @@
|
|||||||
// Shamelessly adapted from plib January 2001
|
// Shamelessly adapted from plib January 2001
|
||||||
//
|
//
|
||||||
// Original version Copyright (C) 2000 the plib team
|
// Original version Copyright (C) 2000 the plib team
|
||||||
// Local changes Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Local changes Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
//
|
//
|
||||||
@@ -27,19 +27,13 @@
|
|||||||
#ifndef _SG_LOWLEVEL_HXX
|
#ifndef _SG_LOWLEVEL_HXX
|
||||||
#define _SG_LOWLEVEL_HXX
|
#define _SG_LOWLEVEL_HXX
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#include <plib/sg.h>
|
#include <plib/sg.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#include <simgear/compiler.h>
|
||||||
typedef __int64 int64;
|
#include <simgear/misc/stdint.hxx>
|
||||||
typedef __int64 uint64;
|
|
||||||
#else
|
|
||||||
typedef long long int64;
|
|
||||||
typedef unsigned long long uint64;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Note that output is written in little endian form (and converted as
|
// Note that output is written in little endian form (and converted as
|
||||||
// necessary for big endian machines)
|
// necessary for big endian machines)
|
||||||
@@ -54,10 +48,10 @@ void sgReadUInt ( gzFile fd, unsigned int *var ) ;
|
|||||||
void sgWriteUInt ( gzFile fd, const unsigned int var ) ;
|
void sgWriteUInt ( gzFile fd, const unsigned int var ) ;
|
||||||
void sgReadInt ( gzFile fd, int *var ) ;
|
void sgReadInt ( gzFile fd, int *var ) ;
|
||||||
void sgWriteInt ( gzFile fd, const int var ) ;
|
void sgWriteInt ( gzFile fd, const int var ) ;
|
||||||
void sgReadLong ( gzFile fd, long int *var ) ;
|
void sgReadLong ( gzFile fd, int32_t *var ) ;
|
||||||
void sgWriteLong ( gzFile fd, const long int var ) ;
|
void sgWriteLong ( gzFile fd, const int32_t var ) ;
|
||||||
void sgReadLongLong ( gzFile fd, int64 *var ) ;
|
void sgReadLongLong ( gzFile fd, int64_t *var ) ;
|
||||||
void sgWriteLongLong ( gzFile fd, const int64 var ) ;
|
void sgWriteLongLong ( gzFile fd, const int64_t var ) ;
|
||||||
void sgReadUShort ( gzFile fd, unsigned short *var ) ;
|
void sgReadUShort ( gzFile fd, unsigned short *var ) ;
|
||||||
void sgWriteUShort ( gzFile fd, const unsigned short var ) ;
|
void sgWriteUShort ( gzFile fd, const unsigned short var ) ;
|
||||||
void sgReadShort ( gzFile fd, short *var ) ;
|
void sgReadShort ( gzFile fd, short *var ) ;
|
||||||
@@ -121,52 +115,4 @@ void sgClearWriteError();
|
|||||||
int sgReadError();
|
int sgReadError();
|
||||||
int sgWriteError();
|
int sgWriteError();
|
||||||
|
|
||||||
inline bool sgIsLittleEndian() {
|
|
||||||
static const int sgEndianTest = 1;
|
|
||||||
return (*((char *) &sgEndianTest ) != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool sgIsBigEndian() {
|
|
||||||
static const int sgEndianTest = 1;
|
|
||||||
return (*((char *) &sgEndianTest ) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void sgEndianSwap(unsigned short *x) {
|
|
||||||
*x =
|
|
||||||
(( *x >> 8 ) & 0x00FF ) |
|
|
||||||
(( *x << 8 ) & 0xFF00 ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void sgEndianSwap(unsigned int *x) {
|
|
||||||
*x =
|
|
||||||
(( *x >> 24 ) & 0x000000FF ) |
|
|
||||||
(( *x >> 8 ) & 0x0000FF00 ) |
|
|
||||||
(( *x << 8 ) & 0x00FF0000 ) |
|
|
||||||
(( *x << 24 ) & 0xFF000000 ) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void sgEndianSwap(uint64 *x) {
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
*x =
|
|
||||||
(( *x >> 56 ) & 0x00000000000000FFULL ) |
|
|
||||||
(( *x >> 40 ) & 0x000000000000FF00ULL ) |
|
|
||||||
(( *x >> 24 ) & 0x0000000000FF0000ULL ) |
|
|
||||||
(( *x >> 8 ) & 0x00000000FF000000ULL ) |
|
|
||||||
(( *x << 8 ) & 0x000000FF00000000ULL ) |
|
|
||||||
(( *x << 24 ) & 0x0000FF0000000000ULL ) |
|
|
||||||
(( *x << 40 ) & 0x00FF000000000000ULL ) |
|
|
||||||
(( *x << 56 ) & 0xFF00000000000000ULL ) ;
|
|
||||||
#else
|
|
||||||
*x =
|
|
||||||
(( *x >> 56 ) & 0x00000000000000FF ) |
|
|
||||||
(( *x >> 40 ) & 0x000000000000FF00 ) |
|
|
||||||
(( *x >> 24 ) & 0x0000000000FF0000 ) |
|
|
||||||
(( *x >> 8 ) & 0x00000000FF000000 ) |
|
|
||||||
(( *x << 8 ) & 0x000000FF00000000 ) |
|
|
||||||
(( *x << 24 ) & 0x0000FF0000000000 ) |
|
|
||||||
(( *x << 40 ) & 0x00FF000000000000 ) |
|
|
||||||
(( *x << 56 ) & 0xFF00000000000000 ) ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // _SG_LOWLEVEL_HXX
|
#endif // _SG_LOWLEVEL_HXX
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
#include "lowlevel.hxx"
|
#include "lowlevel.hxx"
|
||||||
|
|
||||||
|
|
||||||
@@ -8,8 +8,8 @@ static const int sgEndianTest = 1;
|
|||||||
#define sgIsLittleEndian (*((char *) &sgEndianTest ) != 0)
|
#define sgIsLittleEndian (*((char *) &sgEndianTest ) != 0)
|
||||||
#define sgIsBigEndian (*((char *) &sgEndianTest ) == 0)
|
#define sgIsBigEndian (*((char *) &sgEndianTest ) == 0)
|
||||||
|
|
||||||
SG_USING_STD(cout);
|
using std::cout;
|
||||||
SG_USING_STD(endl);
|
using std::endl;
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
@@ -25,22 +25,22 @@ int main() {
|
|||||||
|
|
||||||
short s = 1111;
|
short s = 1111;
|
||||||
cout << "short s = " << s << endl;
|
cout << "short s = " << s << endl;
|
||||||
sgEndianSwap((unsigned short *)&s);
|
sgEndianSwap((uint16_t *)&s);
|
||||||
cout << "short s = " << s << endl;
|
cout << "short s = " << s << endl;
|
||||||
sgEndianSwap((unsigned short *)&s);
|
sgEndianSwap((uint16_t *)&s);
|
||||||
cout << "short s = " << s << endl;
|
cout << "short s = " << s << endl;
|
||||||
|
|
||||||
int i = 1111111;
|
int i = 1111111;
|
||||||
cout << "int i = " << i << endl;
|
cout << "int i = " << i << endl;
|
||||||
sgEndianSwap((unsigned int *)&i);
|
sgEndianSwap((uint32_t *)&i);
|
||||||
cout << "int i = " << i << endl;
|
cout << "int i = " << i << endl;
|
||||||
sgEndianSwap((unsigned int *)&i);
|
sgEndianSwap((uint32_t *)&i);
|
||||||
cout << "int i = " << i << endl;
|
cout << "int i = " << i << endl;
|
||||||
|
|
||||||
double x = 1111111111;
|
double x = 1111111111;
|
||||||
cout << "double x = " << x << endl;
|
cout << "double x = " << x << endl;
|
||||||
sgEndianSwap((unsigned long long *)&x);
|
sgEndianSwap((uint64_t *)&x);
|
||||||
cout << "double x = " << x << endl;
|
cout << "double x = " << x << endl;
|
||||||
sgEndianSwap((unsigned long long *)&x);
|
sgEndianSwap((uint64_t *)&x);
|
||||||
cout << "double x = " << x << endl;
|
cout << "double x = " << x << endl;
|
||||||
}
|
}
|
||||||
|
|||||||
+140
-149
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started January 2000.
|
// Written by Curtis Olson, started January 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
//
|
//
|
||||||
@@ -33,19 +33,22 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <simgear/bucket/newbucket.hxx>
|
#include <simgear/bucket/newbucket.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
#include "lowlevel.hxx"
|
#include "lowlevel.hxx"
|
||||||
#include "sg_binobj.hxx"
|
#include "sg_binobj.hxx"
|
||||||
|
|
||||||
|
|
||||||
SG_USING_STD( string );
|
using std::string;
|
||||||
SG_USING_STD( vector );
|
using std::vector;
|
||||||
|
using std::cout;
|
||||||
|
using std::endl;
|
||||||
|
|
||||||
|
enum sgObjectTypes {
|
||||||
enum {
|
|
||||||
SG_BOUNDING_SPHERE = 0,
|
SG_BOUNDING_SPHERE = 0,
|
||||||
|
|
||||||
SG_VERTEX_LIST = 1,
|
SG_VERTEX_LIST = 1,
|
||||||
@@ -58,20 +61,19 @@ enum {
|
|||||||
SG_TRIANGLE_FACES = 10,
|
SG_TRIANGLE_FACES = 10,
|
||||||
SG_TRIANGLE_STRIPS = 11,
|
SG_TRIANGLE_STRIPS = 11,
|
||||||
SG_TRIANGLE_FANS = 12
|
SG_TRIANGLE_FANS = 12
|
||||||
} sgObjectTypes;
|
};
|
||||||
|
|
||||||
enum {
|
enum sgIndexTypes {
|
||||||
SG_IDX_VERTICES = 0x01,
|
SG_IDX_VERTICES = 0x01,
|
||||||
SG_IDX_NORMALS = 0x02,
|
SG_IDX_NORMALS = 0x02,
|
||||||
SG_IDX_COLORS = 0x04,
|
SG_IDX_COLORS = 0x04,
|
||||||
SG_IDX_TEXCOORDS = 0x08
|
SG_IDX_TEXCOORDS = 0x08
|
||||||
} sgIndexTypes;
|
};
|
||||||
|
|
||||||
enum {
|
enum sgPropertyTypes {
|
||||||
SG_MATERIAL = 0,
|
SG_MATERIAL = 0,
|
||||||
SG_INDEX_TYPES = 1
|
SG_INDEX_TYPES = 1
|
||||||
} sgPropertyTypes;
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class sgSimpleBuffer {
|
class sgSimpleBuffer {
|
||||||
@@ -174,7 +176,7 @@ static void read_object( gzFile fp,
|
|||||||
int idx_size;
|
int idx_size;
|
||||||
bool do_vertices, do_normals, do_colors, do_texcoords;
|
bool do_vertices, do_normals, do_colors, do_texcoords;
|
||||||
int j, k, idx;
|
int j, k, idx;
|
||||||
static sgSimpleBuffer buf( 32768 ); // 32 Kb
|
sgSimpleBuffer buf( 32768 ); // 32 Kb
|
||||||
char material[256];
|
char material[256];
|
||||||
|
|
||||||
// default values
|
// default values
|
||||||
@@ -240,8 +242,8 @@ static void read_object( gzFile fp,
|
|||||||
if ( nbytes > buf.get_size() ) { buf.resize( nbytes ); }
|
if ( nbytes > buf.get_size() ) { buf.resize( nbytes ); }
|
||||||
char *ptr = buf.get_ptr();
|
char *ptr = buf.get_ptr();
|
||||||
sgReadBytes( fp, nbytes, ptr );
|
sgReadBytes( fp, nbytes, ptr );
|
||||||
int count = nbytes / (idx_size * sizeof(short));
|
int count = nbytes / (idx_size * sizeof(unsigned short));
|
||||||
short *sptr = (short *)ptr;
|
unsigned short *sptr = (unsigned short *)ptr;
|
||||||
int_list vs; vs.clear();
|
int_list vs; vs.clear();
|
||||||
int_list ns; ns.clear();
|
int_list ns; ns.clear();
|
||||||
int_list cs; cs.clear();
|
int_list cs; cs.clear();
|
||||||
@@ -249,7 +251,7 @@ static void read_object( gzFile fp,
|
|||||||
for ( k = 0; k < count; ++k ) {
|
for ( k = 0; k < count; ++k ) {
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
for ( idx = 0; idx < idx_size; ++idx ) {
|
for ( idx = 0; idx < idx_size; ++idx ) {
|
||||||
sgEndianSwap( (unsigned short *)&(sptr[idx]) );
|
sgEndianSwap( (uint16_t *)&(sptr[idx]) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
idx = 0;
|
idx = 0;
|
||||||
@@ -280,13 +282,13 @@ static void read_object( gzFile fp,
|
|||||||
|
|
||||||
// read a binary file and populate the provided structures.
|
// read a binary file and populate the provided structures.
|
||||||
bool SGBinObject::read_bin( const string& file ) {
|
bool SGBinObject::read_bin( const string& file ) {
|
||||||
Point3D p;
|
SGVec3d p;
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
unsigned int nbytes;
|
unsigned int nbytes;
|
||||||
static sgSimpleBuffer buf( 32768 ); // 32 Kb
|
sgSimpleBuffer buf( 32768 ); // 32 Kb
|
||||||
|
|
||||||
// zero out structures
|
// zero out structures
|
||||||
gbs_center = Point3D( 0 );
|
gbs_center = SGVec3d(0, 0, 0);
|
||||||
gbs_radius = 0.0;
|
gbs_radius = 0.0;
|
||||||
|
|
||||||
wgs84_nodes.clear();
|
wgs84_nodes.clear();
|
||||||
@@ -322,7 +324,7 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
string filegz = file + ".gz";
|
string filegz = file + ".gz";
|
||||||
if ( (fp = gzopen( filegz.c_str(), "rb" )) == NULL ) {
|
if ( (fp = gzopen( filegz.c_str(), "rb" )) == NULL ) {
|
||||||
SG_LOG( SG_EVENT, SG_ALERT,
|
SG_LOG( SG_EVENT, SG_ALERT,
|
||||||
"ERROR: opening " << file << " or " << filegz << "for reading!");
|
"ERROR: opening " << file << " or " << filegz << " for reading!");
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -364,18 +366,32 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// read number of top level objects
|
// read number of top level objects
|
||||||
short nobjects;
|
unsigned short nobjects;
|
||||||
sgReadShort( fp, &nobjects );
|
if ( version >= 7 ) {
|
||||||
|
sgReadUShort( fp, &nobjects );
|
||||||
|
} else {
|
||||||
|
short tmp;
|
||||||
|
sgReadShort( fp, &tmp );
|
||||||
|
nobjects = tmp;
|
||||||
|
}
|
||||||
// cout << "Total objects to read = " << nobjects << endl;
|
// cout << "Total objects to read = " << nobjects << endl;
|
||||||
|
|
||||||
// read in objects
|
// read in objects
|
||||||
for ( i = 0; i < nobjects; ++i ) {
|
for ( i = 0; i < nobjects; ++i ) {
|
||||||
// read object header
|
// read object header
|
||||||
char obj_type;
|
char obj_type;
|
||||||
short nproperties, nelements;
|
unsigned short nproperties, nelements;
|
||||||
sgReadChar( fp, &obj_type );
|
sgReadChar( fp, &obj_type );
|
||||||
sgReadShort( fp, &nproperties );
|
if ( version >= 7 ) {
|
||||||
sgReadShort( fp, &nelements );
|
sgReadUShort( fp, &nproperties );
|
||||||
|
sgReadUShort( fp, &nelements );
|
||||||
|
} else {
|
||||||
|
short tmp;
|
||||||
|
sgReadShort( fp, &tmp );
|
||||||
|
nproperties = tmp;
|
||||||
|
sgReadShort( fp, &tmp );
|
||||||
|
nelements = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
// cout << "object " << i << " = " << (int)obj_type << " props = "
|
// cout << "object " << i << " = " << (int)obj_type << " props = "
|
||||||
// << nproperties << " elements = " << nelements << endl;
|
// << nproperties << " elements = " << nelements << endl;
|
||||||
@@ -403,17 +419,17 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
|
|
||||||
double *dptr = (double *)ptr;
|
double *dptr = (double *)ptr;
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64 *)&(dptr[0]) );
|
sgEndianSwap( (uint64_t *)&(dptr[0]) );
|
||||||
sgEndianSwap( (uint64 *)&(dptr[1]) );
|
sgEndianSwap( (uint64_t *)&(dptr[1]) );
|
||||||
sgEndianSwap( (uint64 *)&(dptr[2]) );
|
sgEndianSwap( (uint64_t *)&(dptr[2]) );
|
||||||
}
|
}
|
||||||
gbs_center = Point3D( dptr[0], dptr[1], dptr[2] );
|
gbs_center = SGVec3d( dptr[0], dptr[1], dptr[2] );
|
||||||
// cout << "Center = " << gbs_center << endl;
|
// cout << "Center = " << gbs_center << endl;
|
||||||
ptr += sizeof(double) * 3;
|
ptr += sizeof(double) * 3;
|
||||||
|
|
||||||
float *fptr = (float *)ptr;
|
float *fptr = (float *)ptr;
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int *)fptr );
|
sgEndianSwap( (uint32_t *)fptr );
|
||||||
}
|
}
|
||||||
gbs_radius = fptr[0];
|
gbs_radius = fptr[0];
|
||||||
// cout << "Bounding radius = " << gbs_radius << endl;
|
// cout << "Bounding radius = " << gbs_radius << endl;
|
||||||
@@ -443,11 +459,11 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
wgs84_nodes.reserve( count );
|
wgs84_nodes.reserve( count );
|
||||||
for ( k = 0; k < count; ++k ) {
|
for ( k = 0; k < count; ++k ) {
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[0]) );
|
sgEndianSwap( (uint32_t *)&(fptr[0]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[1]) );
|
sgEndianSwap( (uint32_t *)&(fptr[1]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[2]) );
|
sgEndianSwap( (uint32_t *)&(fptr[2]) );
|
||||||
}
|
}
|
||||||
wgs84_nodes.push_back( Point3D(fptr[0], fptr[1], fptr[2]) );
|
wgs84_nodes.push_back( SGVec3d(fptr[0], fptr[1], fptr[2]) );
|
||||||
fptr += 3;
|
fptr += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -476,12 +492,13 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
colors.reserve(count);
|
colors.reserve(count);
|
||||||
for ( k = 0; k < count; ++k ) {
|
for ( k = 0; k < count; ++k ) {
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[0]) );
|
sgEndianSwap( (uint32_t *)&(fptr[0]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[1]) );
|
sgEndianSwap( (uint32_t *)&(fptr[1]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[2]) );
|
sgEndianSwap( (uint32_t *)&(fptr[2]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[3]) );
|
sgEndianSwap( (uint32_t *)&(fptr[3]) );
|
||||||
}
|
}
|
||||||
colors.push_back( Point3D( fptr[0], fptr[1], fptr[2] ) );
|
SGVec4f color( fptr[0], fptr[1], fptr[2], fptr[3] );
|
||||||
|
colors.push_back( color );
|
||||||
fptr += 4;
|
fptr += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -508,14 +525,11 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
int count = nbytes / 3;
|
int count = nbytes / 3;
|
||||||
normals.reserve( count );
|
normals.reserve( count );
|
||||||
for ( k = 0; k < count; ++k ) {
|
for ( k = 0; k < count; ++k ) {
|
||||||
sgdVec3 normal;
|
SGVec3f normal((ptr[0]) / 127.5 - 1.0,
|
||||||
sgdSetVec3( normal,
|
(ptr[1]) / 127.5 - 1.0,
|
||||||
(ptr[0]) / 127.5 - 1.0,
|
(ptr[2]) / 127.5 - 1.0);
|
||||||
(ptr[1]) / 127.5 - 1.0,
|
|
||||||
(ptr[2]) / 127.5 - 1.0 );
|
|
||||||
sgdNormalizeVec3( normal );
|
|
||||||
|
|
||||||
normals.push_back(Point3D(normal[0], normal[1], normal[2]));
|
normals.push_back(normalize(normal));
|
||||||
ptr += 3;
|
ptr += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -544,10 +558,10 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
texcoords.reserve(count);
|
texcoords.reserve(count);
|
||||||
for ( k = 0; k < count; ++k ) {
|
for ( k = 0; k < count; ++k ) {
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[0]) );
|
sgEndianSwap( (uint32_t *)&(fptr[0]) );
|
||||||
sgEndianSwap( (unsigned int *)&(fptr[1]) );
|
sgEndianSwap( (uint32_t *)&(fptr[1]) );
|
||||||
}
|
}
|
||||||
texcoords.push_back( Point3D( fptr[0], fptr[1], 0 ) );
|
texcoords.push_back( SGVec2f( fptr[0], fptr[1] ) );
|
||||||
fptr += 2;
|
fptr += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -612,28 +626,17 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
bool SGBinObject::write_bin( const string& base, const string& name,
|
bool SGBinObject::write_bin( const string& base, const string& name,
|
||||||
const SGBucket& b )
|
const SGBucket& b )
|
||||||
{
|
{
|
||||||
Point3D p;
|
|
||||||
sgVec2 t;
|
|
||||||
sgVec3 pt;
|
|
||||||
sgVec4 color;
|
|
||||||
int i, j;
|
int i, j;
|
||||||
unsigned char idx_mask;
|
unsigned char idx_mask;
|
||||||
int idx_size;
|
int idx_size;
|
||||||
|
|
||||||
string dir = base + "/" + b.gen_base_path();
|
SGPath file = base + "/" + b.gen_base_path() + "/" + name + ".gz";
|
||||||
string command = "mkdir -p " + dir;
|
file.create_dir( 0755 );
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
cout << "Output file = " << file.str() << endl;
|
||||||
system( (string("mkdir ") + dir).c_str() );
|
|
||||||
#else
|
|
||||||
system(command.c_str());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
string file = dir + "/" + name + ".gz";
|
|
||||||
cout << "Output file = " << file << endl;
|
|
||||||
|
|
||||||
gzFile fp;
|
gzFile fp;
|
||||||
if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
|
if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
|
||||||
cout << "ERROR: opening " << file << " for writing!" << endl;
|
cout << "ERROR: opening " << file.str() << " for writing!" << endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,13 +659,13 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
// write header magic
|
// write header magic
|
||||||
sgWriteUInt( fp, SG_FILE_MAGIC_NUMBER );
|
sgWriteUInt( fp, SG_FILE_MAGIC_NUMBER );
|
||||||
time_t calendar_time = time(NULL);
|
time_t calendar_time = time(NULL);
|
||||||
sgWriteLong( fp, (long int)calendar_time );
|
sgWriteLong( fp, (int32_t)calendar_time );
|
||||||
|
|
||||||
// calculate and write number of top level objects
|
// calculate and write number of top level objects
|
||||||
string material;
|
string material;
|
||||||
int start;
|
int start;
|
||||||
int end;
|
int end;
|
||||||
short nobjects = 0;
|
unsigned short nobjects = 0;
|
||||||
nobjects++; // for gbs
|
nobjects++; // for gbs
|
||||||
nobjects++; // for vertices
|
nobjects++; // for vertices
|
||||||
nobjects++; // for colors
|
nobjects++; // for colors
|
||||||
@@ -670,7 +673,7 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects++; // for texcoords
|
nobjects++; // for texcoords
|
||||||
|
|
||||||
// points
|
// points
|
||||||
short npts = 0;
|
unsigned short npts = 0;
|
||||||
start = 0; end = 1;
|
start = 0; end = 1;
|
||||||
while ( start < (int)pt_materials.size() ) {
|
while ( start < (int)pt_materials.size() ) {
|
||||||
material = pt_materials[start];
|
material = pt_materials[start];
|
||||||
@@ -684,7 +687,7 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects += npts;
|
nobjects += npts;
|
||||||
|
|
||||||
// tris
|
// tris
|
||||||
short ntris = 0;
|
unsigned short ntris = 0;
|
||||||
start = 0; end = 1;
|
start = 0; end = 1;
|
||||||
while ( start < (int)tri_materials.size() ) {
|
while ( start < (int)tri_materials.size() ) {
|
||||||
material = tri_materials[start];
|
material = tri_materials[start];
|
||||||
@@ -698,7 +701,7 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects += ntris;
|
nobjects += ntris;
|
||||||
|
|
||||||
// strips
|
// strips
|
||||||
short nstrips = 0;
|
unsigned short nstrips = 0;
|
||||||
start = 0; end = 1;
|
start = 0; end = 1;
|
||||||
while ( start < (int)strip_materials.size() ) {
|
while ( start < (int)strip_materials.size() ) {
|
||||||
material = strip_materials[start];
|
material = strip_materials[start];
|
||||||
@@ -712,7 +715,7 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects += nstrips;
|
nobjects += nstrips;
|
||||||
|
|
||||||
// fans
|
// fans
|
||||||
short nfans = 0;
|
unsigned short nfans = 0;
|
||||||
start = 0; end = 1;
|
start = 0; end = 1;
|
||||||
while ( start < (int)fan_materials.size() ) {
|
while ( start < (int)fan_materials.size() ) {
|
||||||
material = fan_materials[start];
|
material = fan_materials[start];
|
||||||
@@ -726,12 +729,12 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
nobjects += nfans;
|
nobjects += nfans;
|
||||||
|
|
||||||
cout << "total top level objects = " << nobjects << endl;
|
cout << "total top level objects = " << nobjects << endl;
|
||||||
sgWriteShort( fp, nobjects );
|
sgWriteUShort( fp, nobjects );
|
||||||
|
|
||||||
// write bounding sphere
|
// write bounding sphere
|
||||||
sgWriteChar( fp, (char)SG_BOUNDING_SPHERE ); // type
|
sgWriteChar( fp, (char)SG_BOUNDING_SPHERE ); // type
|
||||||
sgWriteShort( fp, 0 ); // nproperties
|
sgWriteUShort( fp, 0 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
|
|
||||||
sgWriteUInt( fp, sizeof(double) * 3 + sizeof(float) ); // nbytes
|
sgWriteUInt( fp, sizeof(double) * 3 + sizeof(float) ); // nbytes
|
||||||
sgdVec3 center;
|
sgdVec3 center;
|
||||||
@@ -741,37 +744,31 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// dump vertex list
|
// dump vertex list
|
||||||
sgWriteChar( fp, (char)SG_VERTEX_LIST ); // type
|
sgWriteChar( fp, (char)SG_VERTEX_LIST ); // type
|
||||||
sgWriteShort( fp, 0 ); // nproperties
|
sgWriteUShort( fp, 0 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
sgWriteUInt( fp, wgs84_nodes.size() * sizeof(float) * 3 ); // nbytes
|
sgWriteUInt( fp, wgs84_nodes.size() * sizeof(float) * 3 ); // nbytes
|
||||||
for ( i = 0; i < (int)wgs84_nodes.size(); ++i ) {
|
for ( i = 0; i < (int)wgs84_nodes.size(); ++i ) {
|
||||||
p = wgs84_nodes[i] - gbs_center;
|
SGVec3f p = toVec3f(wgs84_nodes[i] - gbs_center);
|
||||||
sgSetVec3( pt, p.x(), p.y(), p.z() );
|
sgWriteVec3( fp, p.data() );
|
||||||
sgWriteVec3( fp, pt );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump vertex color list
|
// dump vertex color list
|
||||||
sgWriteChar( fp, (char)SG_COLOR_LIST ); // type
|
sgWriteChar( fp, (char)SG_COLOR_LIST ); // type
|
||||||
sgWriteShort( fp, 0 ); // nproperties
|
sgWriteUShort( fp, 0 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
sgWriteUInt( fp, colors.size() * sizeof(float) * 4 ); // nbytes
|
sgWriteUInt( fp, colors.size() * sizeof(float) * 4 ); // nbytes
|
||||||
for ( i = 0; i < (int)colors.size(); ++i ) {
|
for ( i = 0; i < (int)colors.size(); ++i ) {
|
||||||
p = colors[i];
|
sgWriteVec4( fp, colors[i].data() );
|
||||||
// Right now we have a place holder for color alpha but we
|
|
||||||
// need to update the interface so the calling program can
|
|
||||||
// provide the info.
|
|
||||||
sgSetVec4( color, p.x(), p.y(), p.z(), 1.0 );
|
|
||||||
sgWriteVec4( fp, color );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump vertex normal list
|
// dump vertex normal list
|
||||||
sgWriteChar( fp, (char)SG_NORMAL_LIST ); // type
|
sgWriteChar( fp, (char)SG_NORMAL_LIST ); // type
|
||||||
sgWriteShort( fp, 0 ); // nproperties
|
sgWriteUShort( fp, 0 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
sgWriteUInt( fp, normals.size() * 3 ); // nbytes
|
sgWriteUInt( fp, normals.size() * 3 ); // nbytes
|
||||||
char normal[3];
|
char normal[3];
|
||||||
for ( i = 0; i < (int)normals.size(); ++i ) {
|
for ( i = 0; i < (int)normals.size(); ++i ) {
|
||||||
p = normals[i];
|
SGVec3f p = normals[i];
|
||||||
normal[0] = (unsigned char)((p.x() + 1.0) * 127.5);
|
normal[0] = (unsigned char)((p.x() + 1.0) * 127.5);
|
||||||
normal[1] = (unsigned char)((p.y() + 1.0) * 127.5);
|
normal[1] = (unsigned char)((p.y() + 1.0) * 127.5);
|
||||||
normal[2] = (unsigned char)((p.z() + 1.0) * 127.5);
|
normal[2] = (unsigned char)((p.z() + 1.0) * 127.5);
|
||||||
@@ -780,13 +777,11 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// dump texture coordinates
|
// dump texture coordinates
|
||||||
sgWriteChar( fp, (char)SG_TEXCOORD_LIST ); // type
|
sgWriteChar( fp, (char)SG_TEXCOORD_LIST ); // type
|
||||||
sgWriteShort( fp, 0 ); // nproperties
|
sgWriteUShort( fp, 0 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
sgWriteUInt( fp, texcoords.size() * sizeof(float) * 2 ); // nbytes
|
sgWriteUInt( fp, texcoords.size() * sizeof(float) * 2 ); // nbytes
|
||||||
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
||||||
p = texcoords[i];
|
sgWriteVec2( fp, texcoords[i].data() );
|
||||||
sgSetVec2( t, p.x(), p.y() );
|
|
||||||
sgWriteVec2( fp, t );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump point groups if they exist
|
// dump point groups if they exist
|
||||||
@@ -807,8 +802,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// write group headers
|
// write group headers
|
||||||
sgWriteChar( fp, (char)SG_POINTS ); // type
|
sgWriteChar( fp, (char)SG_POINTS ); // type
|
||||||
sgWriteShort( fp, 2 ); // nproperties
|
sgWriteUShort( fp, 2 ); // nproperties
|
||||||
sgWriteShort( fp, end - start ); // nelements
|
sgWriteUShort( fp, end - start ); // nelements
|
||||||
|
|
||||||
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
||||||
sgWriteUInt( fp, material.length() ); // nbytes
|
sgWriteUInt( fp, material.length() ); // nbytes
|
||||||
@@ -827,19 +822,20 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
// write strips
|
// write strips
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
// nbytes
|
// nbytes
|
||||||
sgWriteUInt( fp, pts_v[i].size() * idx_size * sizeof(short) );
|
sgWriteUInt( fp, pts_v[i].size() * idx_size
|
||||||
|
* sizeof(unsigned short) );
|
||||||
for ( j = 0; j < (int)pts_v[i].size(); ++j ) {
|
for ( j = 0; j < (int)pts_v[i].size(); ++j ) {
|
||||||
if ( pts_v.size() ) {
|
if ( pts_v.size() ) {
|
||||||
sgWriteShort( fp, (short)pts_v[i][j] );
|
sgWriteUShort( fp, (unsigned short)pts_v[i][j] );
|
||||||
}
|
}
|
||||||
if ( pts_n.size() ) {
|
if ( pts_n.size() ) {
|
||||||
sgWriteShort( fp, (short)pts_n[i][j] );
|
sgWriteUShort( fp, (unsigned short)pts_n[i][j] );
|
||||||
}
|
}
|
||||||
if ( pts_c.size() ) {
|
if ( pts_c.size() ) {
|
||||||
sgWriteShort( fp, (short)pts_c[i][j] );
|
sgWriteUShort( fp, (unsigned short)pts_c[i][j] );
|
||||||
}
|
}
|
||||||
if ( pts_tc.size() ) {
|
if ( pts_tc.size() ) {
|
||||||
sgWriteShort( fp, (short)pts_tc[i][j] );
|
sgWriteUShort( fp, (unsigned short)pts_tc[i][j] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -858,7 +854,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
// find next group
|
// find next group
|
||||||
material = tri_materials[start];
|
material = tri_materials[start];
|
||||||
while ( (end < (int)tri_materials.size()) &&
|
while ( (end < (int)tri_materials.size()) &&
|
||||||
(material == tri_materials[end]) )
|
(material == tri_materials[end]) &&
|
||||||
|
3*(end-start) < 32760 )
|
||||||
{
|
{
|
||||||
// cout << "end = " << end << endl;
|
// cout << "end = " << end << endl;
|
||||||
end++;
|
end++;
|
||||||
@@ -867,8 +864,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// write group headers
|
// write group headers
|
||||||
sgWriteChar( fp, (char)SG_TRIANGLE_FACES ); // type
|
sgWriteChar( fp, (char)SG_TRIANGLE_FACES ); // type
|
||||||
sgWriteShort( fp, 2 ); // nproperties
|
sgWriteUShort( fp, 2 ); // nproperties
|
||||||
sgWriteShort( fp, 1 ); // nelements
|
sgWriteUShort( fp, 1 ); // nelements
|
||||||
|
|
||||||
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
||||||
sgWriteUInt( fp, material.length() ); // nbytes
|
sgWriteUInt( fp, material.length() ); // nbytes
|
||||||
@@ -885,22 +882,23 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
sgWriteChar( fp, idx_mask );
|
sgWriteChar( fp, idx_mask );
|
||||||
|
|
||||||
// nbytes
|
// nbytes
|
||||||
sgWriteUInt( fp, (end - start) * 3 * idx_size * sizeof(short) );
|
sgWriteUInt( fp, (end - start) * 3 * idx_size
|
||||||
|
* sizeof(unsigned short) );
|
||||||
|
|
||||||
// write group
|
// write group
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
for ( j = 0; j < 3; ++j ) {
|
for ( j = 0; j < 3; ++j ) {
|
||||||
if ( tris_v.size() ) {
|
if ( tris_v.size() ) {
|
||||||
sgWriteShort( fp, (short)tris_v[i][j] );
|
sgWriteUShort( fp, (unsigned short)tris_v[i][j] );
|
||||||
}
|
}
|
||||||
if ( tris_n.size() ) {
|
if ( tris_n.size() ) {
|
||||||
sgWriteShort( fp, (short)tris_n[i][j] );
|
sgWriteUShort( fp, (unsigned short)tris_n[i][j] );
|
||||||
}
|
}
|
||||||
if ( tris_c.size() ) {
|
if ( tris_c.size() ) {
|
||||||
sgWriteShort( fp, (short)tris_c[i][j] );
|
sgWriteUShort( fp, (unsigned short)tris_c[i][j] );
|
||||||
}
|
}
|
||||||
if ( tris_tc.size() ) {
|
if ( tris_tc.size() ) {
|
||||||
sgWriteShort( fp, (short)tris_tc[i][j] );
|
sgWriteUShort( fp, (unsigned short)tris_tc[i][j] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -928,8 +926,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// write group headers
|
// write group headers
|
||||||
sgWriteChar( fp, (char)SG_TRIANGLE_STRIPS ); // type
|
sgWriteChar( fp, (char)SG_TRIANGLE_STRIPS ); // type
|
||||||
sgWriteShort( fp, 2 ); // nproperties
|
sgWriteUShort( fp, 2 ); // nproperties
|
||||||
sgWriteShort( fp, end - start ); // nelements
|
sgWriteUShort( fp, end - start ); // nelements
|
||||||
|
|
||||||
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
||||||
sgWriteUInt( fp, material.length() ); // nbytes
|
sgWriteUInt( fp, material.length() ); // nbytes
|
||||||
@@ -948,19 +946,20 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
// write strips
|
// write strips
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
// nbytes
|
// nbytes
|
||||||
sgWriteUInt( fp, strips_v[i].size() * idx_size * sizeof(short));
|
sgWriteUInt( fp, strips_v[i].size() * idx_size
|
||||||
|
* sizeof(unsigned short));
|
||||||
for ( j = 0; j < (int)strips_v[i].size(); ++j ) {
|
for ( j = 0; j < (int)strips_v[i].size(); ++j ) {
|
||||||
if ( strips_v.size() ) {
|
if ( strips_v.size() ) {
|
||||||
sgWriteShort( fp, (short)strips_v[i][j] );
|
sgWriteUShort( fp, (unsigned short)strips_v[i][j] );
|
||||||
}
|
}
|
||||||
if ( strips_n.size() ) {
|
if ( strips_n.size() ) {
|
||||||
sgWriteShort( fp, (short)strips_n[i][j] );
|
sgWriteUShort( fp, (unsigned short)strips_n[i][j] );
|
||||||
}
|
}
|
||||||
if ( strips_c.size() ) {
|
if ( strips_c.size() ) {
|
||||||
sgWriteShort( fp, (short)strips_c[i][j] );
|
sgWriteUShort( fp, (unsigned short)strips_c[i][j] );
|
||||||
}
|
}
|
||||||
if ( strips_tc.size() ) {
|
if ( strips_tc.size() ) {
|
||||||
sgWriteShort( fp, (short)strips_tc[i][j] );
|
sgWriteUShort( fp, (unsigned short)strips_tc[i][j] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -988,8 +987,8 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
|
|
||||||
// write group headers
|
// write group headers
|
||||||
sgWriteChar( fp, (char)SG_TRIANGLE_FANS ); // type
|
sgWriteChar( fp, (char)SG_TRIANGLE_FANS ); // type
|
||||||
sgWriteShort( fp, 2 ); // nproperties
|
sgWriteUShort( fp, 2 ); // nproperties
|
||||||
sgWriteShort( fp, end - start ); // nelements
|
sgWriteUShort( fp, end - start ); // nelements
|
||||||
|
|
||||||
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
sgWriteChar( fp, (char)SG_MATERIAL ); // property
|
||||||
sgWriteUInt( fp, material.length() ); // nbytes
|
sgWriteUInt( fp, material.length() ); // nbytes
|
||||||
@@ -1008,19 +1007,20 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
// write fans
|
// write fans
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
// nbytes
|
// nbytes
|
||||||
sgWriteUInt( fp, fans_v[i].size() * idx_size * sizeof(short) );
|
sgWriteUInt( fp, fans_v[i].size() * idx_size
|
||||||
|
* sizeof(unsigned short) );
|
||||||
for ( j = 0; j < (int)fans_v[i].size(); ++j ) {
|
for ( j = 0; j < (int)fans_v[i].size(); ++j ) {
|
||||||
if ( fans_v.size() ) {
|
if ( fans_v.size() ) {
|
||||||
sgWriteShort( fp, (short)fans_v[i][j] );
|
sgWriteUShort( fp, (unsigned short)fans_v[i][j] );
|
||||||
}
|
}
|
||||||
if ( fans_n.size() ) {
|
if ( fans_n.size() ) {
|
||||||
sgWriteShort( fp, (short)fans_n[i][j] );
|
sgWriteUShort( fp, (unsigned short)fans_n[i][j] );
|
||||||
}
|
}
|
||||||
if ( fans_c.size() ) {
|
if ( fans_c.size() ) {
|
||||||
sgWriteShort( fp, (short)fans_c[i][j] );
|
sgWriteUShort( fp, (unsigned short)fans_c[i][j] );
|
||||||
}
|
}
|
||||||
if ( fans_tc.size() ) {
|
if ( fans_tc.size() ) {
|
||||||
sgWriteShort( fp, (short)fans_tc[i][j] );
|
sgWriteUShort( fp, (unsigned short)fans_tc[i][j] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1048,24 +1048,15 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
bool SGBinObject::write_ascii( const string& base, const string& name,
|
bool SGBinObject::write_ascii( const string& base, const string& name,
|
||||||
const SGBucket& b )
|
const SGBucket& b )
|
||||||
{
|
{
|
||||||
Point3D p;
|
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
string dir = base + "/" + b.gen_base_path();
|
SGPath file = base + "/" + b.gen_base_path() + "/" + name;
|
||||||
string command = "mkdir -p " + dir;
|
file.create_dir( 0755 );
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
cout << "Output file = " << file.str() << endl;
|
||||||
system( (string("mkdir ") + dir).c_str() );
|
|
||||||
#else
|
|
||||||
system(command.c_str());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// string file = dir + "/" + b.gen_index_str();
|
|
||||||
string file = dir + "/" + name;
|
|
||||||
cout << "Output file = " << file << endl;
|
|
||||||
|
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
if ( (fp = fopen( file.c_str(), "w" )) == NULL ) {
|
if ( (fp = fopen( file.c_str(), "w" )) == NULL ) {
|
||||||
cout << "ERROR: opening " << file << " for writing!" << endl;
|
cout << "ERROR: opening " << file.str() << " for writing!" << endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1098,7 +1089,7 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
// dump vertex list
|
// dump vertex list
|
||||||
fprintf(fp, "# vertex list\n");
|
fprintf(fp, "# vertex list\n");
|
||||||
for ( i = 0; i < (int)wgs84_nodes.size(); ++i ) {
|
for ( i = 0; i < (int)wgs84_nodes.size(); ++i ) {
|
||||||
p = wgs84_nodes[i] - gbs_center;
|
SGVec3d p = wgs84_nodes[i] - gbs_center;
|
||||||
|
|
||||||
fprintf(fp, "v %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
fprintf(fp, "v %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
||||||
}
|
}
|
||||||
@@ -1106,7 +1097,7 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
|
|
||||||
fprintf(fp, "# vertex normal list\n");
|
fprintf(fp, "# vertex normal list\n");
|
||||||
for ( i = 0; i < (int)normals.size(); ++i ) {
|
for ( i = 0; i < (int)normals.size(); ++i ) {
|
||||||
p = normals[i];
|
SGVec3f p = normals[i];
|
||||||
fprintf(fp, "vn %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
fprintf(fp, "vn %.5f %.5f %.5f\n", p.x(), p.y(), p.z() );
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
@@ -1114,7 +1105,7 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
// dump texture coordinates
|
// dump texture coordinates
|
||||||
fprintf(fp, "# texture coordinate list\n");
|
fprintf(fp, "# texture coordinate list\n");
|
||||||
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
for ( i = 0; i < (int)texcoords.size(); ++i ) {
|
||||||
p = texcoords[i];
|
SGVec2f p = texcoords[i];
|
||||||
fprintf(fp, "vt %.5f %.5f\n", p.x(), p.y() );
|
fprintf(fp, "vt %.5f %.5f\n", p.x(), p.y() );
|
||||||
}
|
}
|
||||||
fprintf(fp, "\n");
|
fprintf(fp, "\n");
|
||||||
@@ -1140,13 +1131,13 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
// make a list of points for the group
|
// make a list of points for the group
|
||||||
point_list group_nodes;
|
point_list group_nodes;
|
||||||
group_nodes.clear();
|
group_nodes.clear();
|
||||||
Point3D bs_center;
|
SGVec3d bs_center;
|
||||||
double bs_radius = 0;
|
double bs_radius = 0;
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
for ( j = 0; j < (int)tris_v[i].size(); ++j ) {
|
for ( j = 0; j < (int)tris_v[i].size(); ++j ) {
|
||||||
group_nodes.push_back( wgs84_nodes[ tris_v[i][j] ] );
|
group_nodes.push_back( Point3D::fromSGVec3(wgs84_nodes[ tris_v[i][j] ]) );
|
||||||
bs_center = sgCalcCenter( group_nodes );
|
bs_center = sgCalcCenter( group_nodes ).toSGVec3d();
|
||||||
bs_radius = sgCalcBoundingRadius( bs_center, group_nodes );
|
bs_radius = sgCalcBoundingRadius( Point3D::fromSGVec3(bs_center), group_nodes );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1191,13 +1182,13 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
// make a list of points for the group
|
// make a list of points for the group
|
||||||
point_list group_nodes;
|
point_list group_nodes;
|
||||||
group_nodes.clear();
|
group_nodes.clear();
|
||||||
Point3D bs_center;
|
SGVec3d bs_center;
|
||||||
double bs_radius = 0;
|
double bs_radius = 0;
|
||||||
for ( i = start; i < end; ++i ) {
|
for ( i = start; i < end; ++i ) {
|
||||||
for ( j = 0; j < (int)strips_v[i].size(); ++j ) {
|
for ( j = 0; j < (int)strips_v[i].size(); ++j ) {
|
||||||
group_nodes.push_back( wgs84_nodes[ strips_v[i][j] ] );
|
group_nodes.push_back( Point3D::fromSGVec3(wgs84_nodes[ strips_v[i][j] ]) );
|
||||||
bs_center = sgCalcCenter( group_nodes );
|
bs_center = sgCalcCenter( group_nodes ).toSGVec3d();
|
||||||
bs_radius = sgCalcBoundingRadius( bs_center, group_nodes );
|
bs_radius = sgCalcBoundingRadius( Point3D::fromSGVec3(bs_center), group_nodes );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1224,7 +1215,7 @@ bool SGBinObject::write_ascii( const string& base, const string& name,
|
|||||||
// close the file
|
// close the file
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
command = "gzip --force --best " + file;
|
string command = "gzip --force --best " + file.str();
|
||||||
system(command.c_str());
|
system(command.c_str());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+48
-20
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started January 2000.
|
// Written by Curtis Olson, started January 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or modify
|
// This program is free software; you can redistribute it and/or modify
|
||||||
// it under the terms of the GNU General Public License as published by
|
// it under the terms of the GNU General Public License as published by
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -74,9 +74,9 @@ typedef group_list::const_iterator const_group_list_iterator;
|
|||||||
*
|
*
|
||||||
* - prop_typecode: material_name | ???
|
* - prop_typecode: material_name | ???
|
||||||
*
|
*
|
||||||
* - nelements: SHORT (Gives us 65536 which ought to be enough, right?)
|
* - nelements: USHORT (Gives us 65536 which ought to be enough, right?)
|
||||||
*
|
*
|
||||||
* - nproperties: SHORT
|
* - nproperties: USHORT
|
||||||
*
|
*
|
||||||
* - *_typecode: CHAR
|
* - *_typecode: CHAR
|
||||||
*
|
*
|
||||||
@@ -89,13 +89,13 @@ typedef group_list::const_iterator const_group_list_iterator;
|
|||||||
class SGBinObject {
|
class SGBinObject {
|
||||||
unsigned short version;
|
unsigned short version;
|
||||||
|
|
||||||
Point3D gbs_center;
|
SGVec3d gbs_center;
|
||||||
float gbs_radius;
|
float gbs_radius;
|
||||||
|
|
||||||
point_list wgs84_nodes; // vertex list
|
std::vector<SGVec3d> wgs84_nodes; // vertex list
|
||||||
point_list colors; // color list
|
std::vector<SGVec4f> colors; // color list
|
||||||
point_list normals; // normal list
|
std::vector<SGVec3f> normals; // normal list
|
||||||
point_list texcoords; // texture coordinate list
|
std::vector<SGVec2f> texcoords; // texture coordinate list
|
||||||
|
|
||||||
group_list pts_v; // points vertex index
|
group_list pts_v; // points vertex index
|
||||||
group_list pts_n; // points normal index
|
group_list pts_n; // points normal index
|
||||||
@@ -125,23 +125,51 @@ public:
|
|||||||
|
|
||||||
inline unsigned short get_version() const { return version; }
|
inline unsigned short get_version() const { return version; }
|
||||||
|
|
||||||
inline const Point3D& get_gbs_center() const { return gbs_center; }
|
inline Point3D get_gbs_center() const { return Point3D::fromSGVec3(gbs_center); }
|
||||||
inline void set_gbs_center( const Point3D& p ) { gbs_center = p; }
|
inline void set_gbs_center( const Point3D& p ) { gbs_center = p.toSGVec3d(); }
|
||||||
|
inline const SGVec3d& get_gbs_center2() const { return gbs_center; }
|
||||||
|
inline void set_gbs_center( const SGVec3d& p ) { gbs_center = p; }
|
||||||
|
|
||||||
inline float get_gbs_radius() const { return gbs_radius; }
|
inline float get_gbs_radius() const { return gbs_radius; }
|
||||||
inline void set_gbs_radius( float r ) { gbs_radius = r; }
|
inline void set_gbs_radius( float r ) { gbs_radius = r; }
|
||||||
|
|
||||||
inline const point_list& get_wgs84_nodes() const { return wgs84_nodes; }
|
inline const std::vector<SGVec3d>& get_wgs84_nodes() const
|
||||||
inline void set_wgs84_nodes( const point_list& n ) { wgs84_nodes = n; }
|
{ return wgs84_nodes; }
|
||||||
|
inline void set_wgs84_nodes( const std::vector<SGVec3d>& n )
|
||||||
|
{ wgs84_nodes = n; }
|
||||||
|
inline void set_wgs84_nodes( const point_list& n )
|
||||||
|
{
|
||||||
|
wgs84_nodes.resize(n.size());
|
||||||
|
for (unsigned i = 0; i < wgs84_nodes.size(); ++i)
|
||||||
|
wgs84_nodes[i] = n[i].toSGVec3d();
|
||||||
|
}
|
||||||
|
|
||||||
inline const point_list& get_colors() const { return colors; }
|
inline const std::vector<SGVec4f>& get_colors() const { return colors; }
|
||||||
inline void set_colors( const point_list& c ) { colors = c; }
|
inline void set_colors( const std::vector<SGVec4f>& c ) { colors = c; }
|
||||||
|
inline void set_colors( const point_list& c )
|
||||||
|
{
|
||||||
|
colors.resize(c.size());
|
||||||
|
for (unsigned i = 0; i < colors.size(); ++i)
|
||||||
|
colors[i] = SGVec4f(c[i].toSGVec3f(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
inline const point_list& get_normals() const { return normals; }
|
inline const std::vector<SGVec3f>& get_normals() const { return normals; }
|
||||||
inline void set_normals( const point_list& n ) { normals = n; }
|
inline void set_normals( const std::vector<SGVec3f>& n ) { normals = n; }
|
||||||
|
inline void set_normals( const point_list& n )
|
||||||
|
{
|
||||||
|
normals.resize(n.size());
|
||||||
|
for (unsigned i = 0; i < normals.size(); ++i)
|
||||||
|
normals[i] = n[i].toSGVec3f();
|
||||||
|
}
|
||||||
|
|
||||||
inline const point_list& get_texcoords() const { return texcoords; }
|
inline const std::vector<SGVec2f>& get_texcoords() const { return texcoords; }
|
||||||
inline void set_texcoords( const point_list& t ) { texcoords = t; }
|
inline void set_texcoords( const std::vector<SGVec2f>& t ) { texcoords = t; }
|
||||||
|
inline void set_texcoords( const point_list& t )
|
||||||
|
{
|
||||||
|
texcoords.resize(t.size());
|
||||||
|
for (unsigned i = 0; i < texcoords.size(); ++i)
|
||||||
|
texcoords[i] = t[i].toSGVec2f();
|
||||||
|
}
|
||||||
|
|
||||||
inline const group_list& get_pts_v() const { return pts_v; }
|
inline const group_list& get_pts_v() const { return pts_v; }
|
||||||
inline void set_pts_v( const group_list& g ) { pts_v = g; }
|
inline void set_pts_v( const group_list& g ) { pts_v = g; }
|
||||||
|
|||||||
+41
-9
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -16,29 +16,33 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
# include <io.h>
|
# include <io.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#include <simgear/misc/stdint.hxx>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
#include "sg_file.hxx"
|
#include "sg_file.hxx"
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
SGFile::SGFile( const string &file) {
|
SGFile::SGFile(const string &file, int repeat_)
|
||||||
|
: file_name(file), fp(-1), eof_flag(true), repeat(repeat_), iteration(0)
|
||||||
|
{
|
||||||
set_type( sgFileType );
|
set_type( sgFileType );
|
||||||
file_name = file;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -70,6 +74,7 @@ bool SGFile::open( const SGProtocolDir d ) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eof_flag = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +82,24 @@ bool SGFile::open( const SGProtocolDir d ) {
|
|||||||
// read a block of data of specified size
|
// read a block of data of specified size
|
||||||
int SGFile::read( char *buf, int length ) {
|
int SGFile::read( char *buf, int length ) {
|
||||||
// read a chunk
|
// read a chunk
|
||||||
return ::read( fp, buf, length );
|
ssize_t result = ::read( fp, buf, length );
|
||||||
|
if ( length > 0 && result == 0 ) {
|
||||||
|
if (repeat < 0 || iteration < repeat - 1) {
|
||||||
|
iteration++;
|
||||||
|
// loop reading the file, unless it is empty
|
||||||
|
off_t fileLen = ::lseek(fp, 0, SEEK_CUR);
|
||||||
|
if (fileLen == 0) {
|
||||||
|
eof_flag = true;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
::lseek(fp, 0, SEEK_SET);
|
||||||
|
return ::read(fp, buf, length);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eof_flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -87,7 +109,16 @@ int SGFile::readline( char *buf, int length ) {
|
|||||||
int pos = lseek( fp, 0, SEEK_CUR );
|
int pos = lseek( fp, 0, SEEK_CUR );
|
||||||
|
|
||||||
// read a chunk
|
// read a chunk
|
||||||
int result = ::read( fp, buf, length );
|
ssize_t result = ::read( fp, buf, length );
|
||||||
|
if ( length > 0 && result == 0 ) {
|
||||||
|
if ((repeat < 0 || iteration < repeat - 1) && pos != 0) {
|
||||||
|
iteration++;
|
||||||
|
pos = ::lseek(fp, 0, SEEK_SET);
|
||||||
|
result = ::read(fp, buf, length);
|
||||||
|
} else {
|
||||||
|
eof_flag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// find the end of line and reset position
|
// find the end of line and reset position
|
||||||
int i;
|
int i;
|
||||||
@@ -119,7 +150,7 @@ int SGFile::write( const char *buf, const int length ) {
|
|||||||
|
|
||||||
// write null terminated string to a file
|
// write null terminated string to a file
|
||||||
int SGFile::writestring( const char *str ) {
|
int SGFile::writestring( const char *str ) {
|
||||||
int length = strlen( str );
|
int length = std::strlen( str );
|
||||||
return write( str, length );
|
return write( str, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,5 +161,6 @@ bool SGFile::close() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eof_flag = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-4
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
#include "iochannel.hxx"
|
#include "iochannel.hxx"
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,6 +54,11 @@ class SGFile : public SGIOChannel {
|
|||||||
|
|
||||||
string file_name;
|
string file_name;
|
||||||
int fp;
|
int fp;
|
||||||
|
bool eof_flag;
|
||||||
|
// Number of repetitions to play. -1 means loop infinitely.
|
||||||
|
const int repeat;
|
||||||
|
int iteration; // number of current repetition,
|
||||||
|
// starting at 0
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -63,8 +68,9 @@ public:
|
|||||||
* name. This file is not opened immediately, but instead will be
|
* name. This file is not opened immediately, but instead will be
|
||||||
* opened when the open() method is called.
|
* opened when the open() method is called.
|
||||||
* @param file name of file to open
|
* @param file name of file to open
|
||||||
|
* @param repeat On eof restart at the beginning of the file
|
||||||
*/
|
*/
|
||||||
SGFile( const string& file );
|
SGFile( const string& file, int repeat_ = 1 );
|
||||||
|
|
||||||
/** Destructor */
|
/** Destructor */
|
||||||
~SGFile();
|
~SGFile();
|
||||||
@@ -89,6 +95,9 @@ public:
|
|||||||
|
|
||||||
/** @return the name of the file being manipulated. */
|
/** @return the name of the file being manipulated. */
|
||||||
inline string get_file_name() const { return file_name; }
|
inline string get_file_name() const { return file_name; }
|
||||||
|
|
||||||
|
/** @return true of eof conditions exists */
|
||||||
|
inline bool eof() const { return eof_flag; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -16,21 +16,23 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/serial/serial.hxx>
|
#include <simgear/serial/serial.hxx>
|
||||||
|
|
||||||
#include "sg_serial.hxx"
|
#include "sg_serial.hxx"
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
SGSerial::SGSerial( const string& device_name, const string& baud_rate ) :
|
SGSerial::SGSerial( const string& device_name, const string& baud_rate ) :
|
||||||
@@ -57,7 +59,7 @@ bool SGSerial::open( const SGProtocolDir d ) {
|
|||||||
|
|
||||||
// cout << "fd = " << port.fd << endl;
|
// cout << "fd = " << port.fd << endl;
|
||||||
|
|
||||||
if ( ! port.set_baud( atoi( baud.c_str() ) ) ) {
|
if ( ! port.set_baud( std::atoi( baud.c_str() ) ) ) {
|
||||||
SG_LOG( SG_IO, SG_ALERT, "Error setting baud: " << baud );
|
SG_LOG( SG_IO, SG_ALERT, "Error setting baud: " << baud );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -80,7 +82,7 @@ int SGSerial::read( char *buf, int length ) {
|
|||||||
result = port.read_port( buf_ptr, length - save_len );
|
result = port.read_port( buf_ptr, length - save_len );
|
||||||
|
|
||||||
if ( result + save_len == length ) {
|
if ( result + save_len == length ) {
|
||||||
strncpy( buf, save_buf, length );
|
std::strncpy( buf, save_buf, length );
|
||||||
save_len = 0;
|
save_len = 0;
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
@@ -114,7 +116,7 @@ int SGSerial::readline( char *buf, int length ) {
|
|||||||
// we found an end of line
|
// we found an end of line
|
||||||
|
|
||||||
// copy to external buffer
|
// copy to external buffer
|
||||||
strncpy( buf, save_buf, result );
|
std::strncpy( buf, save_buf, result );
|
||||||
buf[result] = '\0';
|
buf[result] = '\0';
|
||||||
SG_LOG( SG_IO, SG_INFO, "fg_serial line = " << buf );
|
SG_LOG( SG_IO, SG_INFO, "fg_serial line = " << buf );
|
||||||
|
|
||||||
@@ -142,7 +144,7 @@ int SGSerial::write( const char *buf, const int length ) {
|
|||||||
|
|
||||||
// write null terminated string to port
|
// write null terminated string to port
|
||||||
int SGSerial::writestring( const char *str ) {
|
int SGSerial::writestring( const char *str ) {
|
||||||
int length = strlen( str );
|
int length = std::strlen( str );
|
||||||
return write( str, length );
|
return write( str, length );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -36,17 +36,11 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
// #ifdef SG_HAVE_STD_INCLUDES
|
|
||||||
// # include <ctime>
|
|
||||||
// #else
|
|
||||||
// # include <time.h>
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
#include <simgear/serial/serial.hxx>
|
#include <simgear/serial/serial.hxx>
|
||||||
|
|
||||||
#include "iochannel.hxx"
|
#include "iochannel.hxx"
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A serial I/O class based on SGIOChannel.
|
* A serial I/O class based on SGIOChannel.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
// Modified by Bernie Bright <bbright@bigpond.net.au>, May 2002.
|
// Modified by Bernie Bright <bbright@bigpond.net.au>, May 2002.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -17,10 +17,13 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
@@ -28,7 +31,7 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -34,14 +34,14 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
#include <simgear/math/sg_types.hxx>
|
#include <simgear/math/sg_types.hxx>
|
||||||
#include <simgear/io/iochannel.hxx>
|
#include <simgear/io/iochannel.hxx>
|
||||||
|
|
||||||
#include <plib/netSocket.h>
|
#include <plib/netSocket.h>
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
#define SG_MAX_SOCKET_QUEUE 32
|
#define SG_MAX_SOCKET_QUEUE 32
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started November 1999.
|
// Written by Curtis Olson, started November 1999.
|
||||||
//
|
//
|
||||||
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 1999 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -16,10 +16,13 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started November 2001.
|
// Written by Curtis Olson, started November 2001.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2001 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -36,12 +36,12 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
#include <simgear/math/sg_types.hxx>
|
#include <simgear/math/sg_types.hxx>
|
||||||
#include <simgear/io/iochannel.hxx>
|
#include <simgear/io/iochannel.hxx>
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A UDP socket I/O class based on SGIOChannel and plib/net.
|
* A UDP socket I/O class based on SGIOChannel and plib/net.
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
|
|
||||||
#include "sg_socket.hxx"
|
#include "sg_socket.hxx"
|
||||||
#include "lowlevel.hxx"
|
#include "lowlevel.hxx"
|
||||||
@@ -10,8 +14,8 @@ static const int sgEndianTest = 1;
|
|||||||
#define sgIsLittleEndian (*((char *) &sgEndianTest ) != 0)
|
#define sgIsLittleEndian (*((char *) &sgEndianTest ) != 0)
|
||||||
#define sgIsBigEndian (*((char *) &sgEndianTest ) == 0)
|
#define sgIsBigEndian (*((char *) &sgEndianTest ) == 0)
|
||||||
|
|
||||||
SG_USING_STD(cout);
|
using std::cout;
|
||||||
SG_USING_STD(endl);
|
using std::endl;
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@@ -7,6 +7,8 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
#include "sg_socket.hxx"
|
#include "sg_socket.hxx"
|
||||||
@@ -49,7 +51,7 @@ TcpClient::process()
|
|||||||
|
|
||||||
sprintf( wbuf, "hello world\n" );
|
sprintf( wbuf, "hello world\n" );
|
||||||
int length = channel->writestring( wbuf );
|
int length = channel->writestring( wbuf );
|
||||||
cout << "writestring returned " << length << "\n";
|
std::cout << "writestring returned " << length << "\n";
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -67,7 +69,7 @@ main()
|
|||||||
TcpClient client( "localhost", "5500" );
|
TcpClient client( "localhost", "5500" );
|
||||||
if (!client.open())
|
if (!client.open())
|
||||||
{
|
{
|
||||||
cout << "client open failed\n";
|
std::cout << "client open failed\n";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
#include STL_IOSTREAM
|
#include <iostream>
|
||||||
|
|
||||||
#include "sg_socket.hxx"
|
#include "sg_socket.hxx"
|
||||||
|
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
SG_USING_STD(cout);
|
using std::cout;
|
||||||
|
|
||||||
class TcpServer
|
class TcpServer
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ noinst_PROGRAMS = testmagvar
|
|||||||
testmagvar_SOURCES = testmagvar.cxx
|
testmagvar_SOURCES = testmagvar.cxx
|
||||||
|
|
||||||
testmagvar_LDADD = \
|
testmagvar_LDADD = \
|
||||||
$(top_builddir)/simgear/magvar/libsgmagvar.a \
|
libsgmagvar.a \
|
||||||
$(base_LIBS)
|
$(base_LIBS)
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir)
|
||||||
|
|||||||
+77
-68
@@ -23,6 +23,19 @@
|
|||||||
//
|
//
|
||||||
// Put in some bullet-proofing to handle magnetic and geographic poles.
|
// Put in some bullet-proofing to handle magnetic and geographic poles.
|
||||||
// 3/28/2000 EAW
|
// 3/28/2000 EAW
|
||||||
|
//
|
||||||
|
// Updated coefficient arrays to use the current WMM2005 model,
|
||||||
|
// (valid between 2005.0 and 2010.0)
|
||||||
|
// Also removed unused variables and corrected earth radii constants
|
||||||
|
// to the values for WGS84 and WMM2005.
|
||||||
|
// Reference:
|
||||||
|
// McLean, S., S. Macmillan, S. Maus, V. Lesur, A.
|
||||||
|
// Thomson, and D. Dater, December 2004, The
|
||||||
|
// US/UK World Magnetic Model for 2005-2010,
|
||||||
|
// NOAA Technical Report NESDIS/NGDC-1.
|
||||||
|
//
|
||||||
|
// 25/10/2006 Wim Van Hoydonck -- wim.van.hoydonck@gmail.com
|
||||||
|
//
|
||||||
|
|
||||||
// The routine uses a spherical harmonic expansion of the magnetic
|
// The routine uses a spherical harmonic expansion of the magnetic
|
||||||
// potential up to twelfth order, together with its time variation, as
|
// potential up to twelfth order, together with its time variation, as
|
||||||
@@ -57,10 +70,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -74,76 +86,72 @@
|
|||||||
|
|
||||||
#include "coremag.hxx"
|
#include "coremag.hxx"
|
||||||
|
|
||||||
|
static const double a = 6378.137; /* semi-major axis (equatorial radius) of WGS84 ellipsoid */
|
||||||
|
static const double b = 6356.7523142; /* semi-minor axis referenced to the WGS84 ellipsoid */
|
||||||
|
static const double r_0 = 6371.2; /* standard Earth magnetic reference radius */
|
||||||
|
|
||||||
static const double pi = 3.14159265358979;
|
static double gnm_wmm2005[13][13] =
|
||||||
static const double a = 6378.16; /* major radius (km) IAU66 ellipsoid */
|
|
||||||
static const double f = 1.0 / 298.25; /* inverse flattening IAU66 ellipsoid */
|
|
||||||
static const double b = 6378.16 * (1.0 -1.0 / 298.25 );
|
|
||||||
/* minor radius b=a*(1-f) */
|
|
||||||
static const double r_0 = 6371.2; /* "mean radius" for spherical harmonic expansion */
|
|
||||||
|
|
||||||
static double gnm_wmm2000[13][13] =
|
|
||||||
{
|
{
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-29616.0, -1722.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-29556.8, -1671.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-2266.7, 3070.2, 1677.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-2340.6, 3046.9, 1657.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{1322.4, -2291.5, 1255.9, 724.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{1335.4, -2305.1, 1246.7, 674.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{932.1, 786.3, 250.6, -401.5, 106.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{919.8, 798.1, 211.3, -379.4, 100.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-211.9, 351.6, 220.8, -134.5, -168.8, -13.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-227.4, 354.6, 208.7, -136.5, -168.3, -14.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{73.8, 68.2, 74.1, -163.5, -3.8, 17.1, -85.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{73.2, 69.7, 76.7, -151.2, -14.9, 14.6, -86.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{77.4, -73.9, 2.2, 35.7, 7.3, 5.2, 8.4, -1.5, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{80.1, -74.5, -1.4, 38.5, 12.4, 9.5, 5.7, 1.8, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{23.3, 7.3, -8.5, -6.6, -16.9, 8.6, 4.9, -7.8, -7.6, 0.0, 0.0, 0.0, 0.0},
|
{24.9, 7.7, -11.6, -6.9, -18.2, 10.0, 9.2, -11.6, -5.2, 0.0, 0.0, 0.0, 0.0},
|
||||||
{5.7, 8.5, 2.0, -9.8, 7.6, -7.0, -2.0, 9.2, -2.2, -6.6, 0.0, 0.0, 0.0},
|
{5.6, 9.9, 3.5, -7.0, 5.1, -10.8, -1.3, 8.8, -6.7, -9.1, 0.0, 0.0, 0.0},
|
||||||
{-2.2, -5.7, 1.6, -3.7, -0.6, 4.1, 2.2, 2.2, 4.6, 2.3, 0.1, 0.0, 0.0},
|
{-2.3, -6.3, 1.6, -2.6, 0.0, 3.1, 0.4, 2.1, 3.9, -0.1, -2.3, 0.0, 0.0},
|
||||||
{3.3, -1.1, -2.4, 2.6, -1.3, -1.7, -0.6, 0.4, 0.7, -0.3, 2.3, 4.2, 0.0},
|
{2.8, -1.6, -1.7, 1.7, -0.1, 0.1, -0.7, 0.7, 1.8, 0.0, 1.1, 4.1, 0.0},
|
||||||
{-1.5, -0.2, -0.3, 0.5, 0.2, 0.9, -1.4, 0.6, -0.6, -1.0, -0.3, 0.3, 0.4},
|
{-2.4, -0.4, 0.2, 0.8, -0.3, 1.1, -0.5, 0.4, -0.3, -0.3, -0.1, -0.3, -0.1},
|
||||||
};
|
};
|
||||||
|
|
||||||
static double hnm_wmm2000[13][13]=
|
static double hnm_wmm2005[13][13]=
|
||||||
{
|
{
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 5194.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 5079.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -2484.8, -467.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -2594.7, -516.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -224.7, 293.0, -486.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -199.9, 269.3, -524.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 273.3, -227.9, 120.9, -302.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 281.5, -226.0, 145.8, -304.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 42.0, 173.8, -135.0, -38.6, 105.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 42.4, 179.8, -123.0, -19.5, 103.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -17.4, 61.2, 63.2, -62.9, 0.2, 43.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -20.3, 54.7, 63.6, -63.4, -0.1, 50.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -62.3, -24.5, 8.9, 23.4, 15.0, -27.6, -7.8, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -61.5, -22.4, 7.2, 25.4, 11.0, -26.4, -5.1, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 12.4, -20.8, 8.4, -21.2, 15.5, 9.1, -15.5, -5.4, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 11.2, -21.0, 9.6, -19.8, 16.1, 7.7, -12.9, -0.2, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -20.4, 13.9, 12.0, -6.2, -8.6, 9.4, 5.0, -8.4, 3.2, 0.0, 0.0, 0.0},
|
{0.0, -20.1, 12.9, 12.6, -6.7, -8.1, 8.0, 2.9, -7.9, 6.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.9, -0.7, 3.9, 4.8, -5.3, -1.0, -2.4, 1.3, -2.3, -6.4, 0.0, 0.0},
|
{0.0, 2.4, 0.2, 4.4, 4.8, -6.5, -1.1, -3.4, -0.8, -2.3, -7.9, 0.0, 0.0},
|
||||||
{0.0, -1.5, 0.7, -1.1, -2.3, 1.3, -0.6, -2.8, -1.6, -0.1, -1.9, 1.4, 0.0},
|
{0.0, 0.3, 1.2, -0.8, -2.5, 0.9, -0.6, -2.7, -0.9, -1.3, -2.0, -1.2, 0.0},
|
||||||
{0.0, -1.0, 0.7, 2.2, -2.5, -0.2, 0.0, -0.2, 0.0, 0.2, -0.9, -0.2, 1.0},
|
{0.0, -0.4, 0.3, 2.4, -2.6, 0.6, 0.3, 0.0, 0.0, 0.3, -0.9, -0.4, 0.8},
|
||||||
};
|
};
|
||||||
|
|
||||||
static double gtnm_wmm2000[13][13]=
|
static double gtnm_wmm2005[13][13]=
|
||||||
{
|
{
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{14.7, 11.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{8.0, 10.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-13.6, -0.7, -1.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-15.1, -7.8, -0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.3, -4.3, 0.9, -8.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.4, -2.6, -1.2, -6.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-1.6, 0.9, -7.6, 2.2, -3.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-2.5, 2.8, -7.0, 6.2, -3.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-0.9, -0.2, -2.5, -2.7, -0.9, 1.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-2.8, 0.7, -3.2, -1.1, 0.1, -0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{1.2, 0.2, 1.7, 1.6, -0.1, -0.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{-0.7, 0.4, -0.3, 2.3, -2.1, -0.6, 1.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-0.4, -0.8, -0.2, 1.1, 0.4, 0.0, -0.2, -0.2, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.2, -0.1, -0.3, 1.1, 0.6, 0.5, -0.4, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{-0.3, 0.6, -0.8, 0.3, -0.2, 0.5, 0.0, -0.6, 0.1, 0.0, 0.0, 0.0, 0.0},
|
{0.1, 0.3, -0.4, 0.3, -0.3, 0.2, 0.4, -0.7, 0.4, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
};
|
};
|
||||||
|
|
||||||
static double htnm_wmm2000[13][13]=
|
static double htnm_wmm2005[13][13]=
|
||||||
{
|
{
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -20.4, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -20.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -21.5, -9.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -23.2, -14.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 6.4, -1.3, -13.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 5.0, -7.0, -0.6, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 2.3, 0.7, 3.7, -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 2.2, 1.6, 5.8, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 2.1, 2.3, 3.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 1.7, 2.1, 4.8, -1.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -0.3, -1.7, -0.9, -1.0, -0.1, 1.9, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -0.6, -1.9, -0.4, -0.5, -0.3, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 1.4, 0.2, 0.7, 0.4, -0.3, -0.8, -0.1, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.6, 0.4, 0.2, 0.3, -0.8, -0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, -0.5, 0.1, -0.2, 0.0, 0.1, -0.1, 0.3, 0.2, 0.0, 0.0, 0.0, 0.0},
|
{0.0, -0.2, 0.1, 0.3, 0.4, 0.1, -0.2, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
|
||||||
@@ -187,8 +195,8 @@ double calc_magvar( double lat, double lon, double h, long dat, double* field )
|
|||||||
{
|
{
|
||||||
/* output field B_r,B_th,B_phi,B_x,B_y,B_z */
|
/* output field B_r,B_th,B_phi,B_x,B_y,B_z */
|
||||||
int n,m;
|
int n,m;
|
||||||
/* reference dates */
|
/* reference date for current model is 1 januari 2005 */
|
||||||
long date0_wmm2000 = yymmdd_to_julian_days(0,1,1);
|
long date0_wmm2005 = yymmdd_to_julian_days(5,1,1);
|
||||||
|
|
||||||
double yearfrac,sr,r,theta,c,s,psi,fn,fn_0,B_r,B_theta,B_phi,X,Y,Z;
|
double yearfrac,sr,r,theta,c,s,psi,fn,fn_0,B_r,B_theta,B_phi,X,Y,Z;
|
||||||
double sinpsi, cospsi, inv_s;
|
double sinpsi, cospsi, inv_s;
|
||||||
@@ -273,13 +281,14 @@ double calc_magvar( double lat, double lon, double h, long dat, double* field )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compute gnm, hnm at dat */
|
/* compute Gauss coefficients gnm and hnm of degree n and order m for the desired time
|
||||||
/* WMM2000 */
|
achieved by adjusting the coefficients at time t0 for linear secular variation */
|
||||||
yearfrac = (dat - date0_wmm2000) / 365.25;
|
/* WMM2005 */
|
||||||
|
yearfrac = (dat - date0_wmm2005) / 365.25;
|
||||||
for ( n = 1; n <= nmax; n++ ) {
|
for ( n = 1; n <= nmax; n++ ) {
|
||||||
for ( m = 0; m <= nmax; m++ ) {
|
for ( m = 0; m <= nmax; m++ ) {
|
||||||
gnm[n][m] = gnm_wmm2000[n][m] + yearfrac * gtnm_wmm2000[n][m];
|
gnm[n][m] = gnm_wmm2005[n][m] + yearfrac * gtnm_wmm2005[n][m];
|
||||||
hnm[n][m] = hnm_wmm2000[n][m] + yearfrac * htnm_wmm2000[n][m];
|
hnm[n][m] = hnm_wmm2005[n][m] + yearfrac * htnm_wmm2005[n][m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -314,7 +323,7 @@ double calc_magvar( double lat, double lon, double h, long dat, double* field )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Find geodetic field components: */
|
/* Find geodetic field components: */
|
||||||
psi = theta - ((pi / 2.0) - lat);
|
psi = theta - ((M_PI / 2.0) - lat);
|
||||||
sinpsi = sin(psi);
|
sinpsi = sin(psi);
|
||||||
cospsi = cos(psi);
|
cospsi = cos(psi);
|
||||||
X = -B_theta * cospsi - B_r * sinpsi;
|
X = -B_theta * cospsi - B_r * sinpsi;
|
||||||
@@ -341,7 +350,7 @@ double SGMagVarOrig( double lat, double lon, double h, long dat, double* field )
|
|||||||
/* output field B_r,B_th,B_phi,B_x,B_y,B_z */
|
/* output field B_r,B_th,B_phi,B_x,B_y,B_z */
|
||||||
int n,m;
|
int n,m;
|
||||||
/* reference dates */
|
/* reference dates */
|
||||||
long date0_wmm2000 = yymmdd_to_julian_days(0,1,1);
|
long date0_wmm2005 = yymmdd_to_julian_days(5,1,1);
|
||||||
|
|
||||||
double yearfrac,sr,r,theta,c,s,psi,fn,B_r,B_theta,B_phi,X,Y,Z;
|
double yearfrac,sr,r,theta,c,s,psi,fn,B_r,B_theta,B_phi,X,Y,Z;
|
||||||
|
|
||||||
@@ -398,12 +407,12 @@ double SGMagVarOrig( double lat, double lon, double h, long dat, double* field )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* compute gnm, hnm at dat */
|
/* compute gnm, hnm at dat */
|
||||||
/* WMM2000 */
|
/* WMM2005 */
|
||||||
yearfrac = (dat - date0_wmm2000) / 365.25;
|
yearfrac = (dat - date0_wmm2005) / 365.25;
|
||||||
for ( n = 1; n <= nmax; n++ ) {
|
for ( n = 1; n <= nmax; n++ ) {
|
||||||
for ( m = 0; m <= nmax; m++ ) {
|
for ( m = 0; m <= nmax; m++ ) {
|
||||||
gnm[n][m] = gnm_wmm2000[n][m] + yearfrac * gtnm_wmm2000[n][m];
|
gnm[n][m] = gnm_wmm2005[n][m] + yearfrac * gtnm_wmm2005[n][m];
|
||||||
hnm[n][m] = hnm_wmm2000[n][m] + yearfrac * htnm_wmm2000[n][m];
|
hnm[n][m] = hnm_wmm2005[n][m] + yearfrac * htnm_wmm2005[n][m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,10 +26,9 @@
|
|||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
// Library General Public License for more details.
|
// Library General Public License for more details.
|
||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Library General Public
|
// You should have received a copy of the GNU General Public License
|
||||||
// License along with this library; if not, write to the
|
// along with this program; if not, write to the Free Software
|
||||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
// Boston, MA 02111-1307, USA.
|
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
//
|
//
|
||||||
// Written by Curtis Olson, started July 2000.
|
// Written by Curtis Olson, started July 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
// Written by Curtis Olson, started July 2000.
|
// Written by Curtis Olson, started July 2000.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2000 Curtis L. Olson - curt@flightgear.org
|
// Copyright (C) 2000 Curtis L. Olson - http://www.flightgear.org/~curt
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
// modify it under the terms of the GNU General Public License as
|
// modify it under the terms of the GNU General Public License as
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
// $Id$
|
// $Id$
|
||||||
|
|
||||||
@@ -28,9 +28,9 @@
|
|||||||
#define _MAGVAR_HXX
|
#define _MAGVAR_HXX
|
||||||
|
|
||||||
|
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
# error This library requires C++
|
# error This library requires C++
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
.deps
|
.deps
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
SGMathTest
|
||||||
|
|||||||
@@ -1,29 +1,55 @@
|
|||||||
includedir = @includedir@/math
|
includedir = @includedir@/math
|
||||||
|
|
||||||
|
check_PROGRAMS = SGMathTest SGGeometryTest
|
||||||
|
TESTS = $(check_PROGRAMS)
|
||||||
|
|
||||||
|
SGMathTest_SOURCES = SGMathTest.cxx
|
||||||
|
SGMathTest_LDADD = libsgmath.a $(base_LIBS)
|
||||||
|
|
||||||
|
SGGeometryTest_SOURCES = SGGeometryTest.cxx
|
||||||
|
SGGeometryTest_LDADD = libsgmath.a $(base_LIBS)
|
||||||
|
|
||||||
lib_LIBRARIES = libsgmath.a
|
lib_LIBRARIES = libsgmath.a
|
||||||
|
|
||||||
include_HEADERS = \
|
include_HEADERS = \
|
||||||
interpolater.hxx \
|
interpolater.hxx \
|
||||||
leastsqs.hxx \
|
leastsqs.hxx \
|
||||||
localconsts.hxx \
|
|
||||||
point3d.hxx \
|
point3d.hxx \
|
||||||
polar3d.hxx \
|
polar3d.hxx \
|
||||||
sg_geodesy.hxx \
|
sg_geodesy.hxx \
|
||||||
sg_memory.h \
|
|
||||||
sg_random.h \
|
sg_random.h \
|
||||||
sg_types.hxx \
|
sg_types.hxx \
|
||||||
vector.hxx \
|
vector.hxx \
|
||||||
fastmath.hxx
|
Math.hxx \
|
||||||
|
SGBox.hxx \
|
||||||
EXTRA_DIST = linintp2.h linintp2.inl sphrintp.h sphrintp.inl
|
SGCMath.hxx \
|
||||||
|
SGGeoc.hxx \
|
||||||
|
SGGeod.hxx \
|
||||||
|
SGGeodesy.hxx \
|
||||||
|
SGGeometry.hxx \
|
||||||
|
SGGeometryFwd.hxx \
|
||||||
|
SGIntersect.hxx \
|
||||||
|
SGLimits.hxx \
|
||||||
|
SGLineSegment.hxx \
|
||||||
|
SGMatrix.hxx \
|
||||||
|
SGMath.hxx \
|
||||||
|
SGMathFwd.hxx \
|
||||||
|
SGMisc.hxx \
|
||||||
|
SGPlane.hxx \
|
||||||
|
SGQuat.hxx \
|
||||||
|
SGRay.hxx \
|
||||||
|
SGSphere.hxx \
|
||||||
|
SGTriangle.hxx \
|
||||||
|
SGVec2.hxx \
|
||||||
|
SGVec3.hxx \
|
||||||
|
SGVec4.hxx
|
||||||
|
|
||||||
libsgmath_a_SOURCES = \
|
libsgmath_a_SOURCES = \
|
||||||
interpolater.cxx \
|
interpolater.cxx \
|
||||||
leastsqs.cxx \
|
leastsqs.cxx \
|
||||||
polar3d.cxx \
|
|
||||||
sg_geodesy.cxx \
|
|
||||||
sg_random.c \
|
sg_random.c \
|
||||||
vector.cxx \
|
vector.cxx \
|
||||||
fastmath.cxx
|
SGGeod.cxx \
|
||||||
|
SGGeodesy.cxx
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir)
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef SIMGEAR_MATH_MATH_HXX
|
||||||
|
#define SIMGEAR_MATH_MATH_HXX 1
|
||||||
|
namespace simgear
|
||||||
|
{
|
||||||
|
namespace math
|
||||||
|
{
|
||||||
|
/** Linear interpolation between two values.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
inline T lerp(const T& x, const T& y, double alpha)
|
||||||
|
{
|
||||||
|
return x * (1.0 - alpha) + y * alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline T lerp(const T& x, const T& y, float alpha)
|
||||||
|
{
|
||||||
|
return x * (1.0f - alpha) + y * alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGBox_H
|
||||||
|
#define SGBox_H
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGBox {
|
||||||
|
public:
|
||||||
|
SGBox() :
|
||||||
|
_min(SGLimits<T>::max(), SGLimits<T>::max(), SGLimits<T>::max()),
|
||||||
|
_max(-SGLimits<T>::max(), -SGLimits<T>::max(), -SGLimits<T>::max())
|
||||||
|
{ }
|
||||||
|
void setMin(const SGVec3<T>& min)
|
||||||
|
{ _min = min; }
|
||||||
|
const SGVec3<T>& getMin() const
|
||||||
|
{ return _min; }
|
||||||
|
|
||||||
|
void setMax(const SGVec3<T>& max)
|
||||||
|
{ _max = max; }
|
||||||
|
const SGVec3<T>& getMax() const
|
||||||
|
{ return _max; }
|
||||||
|
|
||||||
|
// Only works for floating point types
|
||||||
|
SGVec3<T> getCenter() const
|
||||||
|
{ return T(0.5)*(_min + _max); }
|
||||||
|
|
||||||
|
// Only valid for nonempty boxes
|
||||||
|
SGVec3<T> getSize() const
|
||||||
|
{ return _max - _min; }
|
||||||
|
|
||||||
|
T getVolume() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
return 0;
|
||||||
|
return (_max[0] - _min[0])*(_max[1] - _min[1])*(_max[2] - _min[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool empty() const
|
||||||
|
{ return !valid(); }
|
||||||
|
|
||||||
|
bool valid() const
|
||||||
|
{
|
||||||
|
if (_max[0] < _min[0])
|
||||||
|
return false;
|
||||||
|
if (_max[1] < _min[1])
|
||||||
|
return false;
|
||||||
|
if (_max[2] < _min[2])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
_min[0] = SGLimits<T>::max();
|
||||||
|
_min[1] = SGLimits<T>::max();
|
||||||
|
_min[2] = SGLimits<T>::max();
|
||||||
|
_max[0] = -SGLimits<T>::max();
|
||||||
|
_max[1] = -SGLimits<T>::max();
|
||||||
|
_max[2] = -SGLimits<T>::max();
|
||||||
|
}
|
||||||
|
|
||||||
|
void expandBy(const SGVec3<T>& v)
|
||||||
|
{ _min = min(_min, v); _max = max(_max, v); }
|
||||||
|
|
||||||
|
void expandBy(const SGBox<T>& b)
|
||||||
|
{ _min = min(_min, b._min); _max = max(_max, b._max); }
|
||||||
|
|
||||||
|
// Note that this only works if the box is nonmepty
|
||||||
|
unsigned getBroadestAxis() const
|
||||||
|
{
|
||||||
|
SGVec3d size = getSize();
|
||||||
|
if (size[1] <= size[0] && size[2] <= size[0])
|
||||||
|
return 0;
|
||||||
|
else if (size[2] <= size[1])
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SGVec3<T> _min;
|
||||||
|
SGVec3<T> _max;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Output to an ostream
|
||||||
|
template<typename char_type, typename traits_type, typename T>
|
||||||
|
inline
|
||||||
|
std::basic_ostream<char_type, traits_type>&
|
||||||
|
operator<<(std::basic_ostream<char_type, traits_type>& s, const SGBox<T>& box)
|
||||||
|
{ return s << "min = " << box.getMin() << ", max = " << box.getMax(); }
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGCMath_H
|
||||||
|
#define SGCMath_H
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,337 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGGeoc_H
|
||||||
|
#define SGGeoc_H
|
||||||
|
|
||||||
|
#include <simgear/constants.h>
|
||||||
|
|
||||||
|
// #define SG_GEOC_NATIVE_DEGREE
|
||||||
|
|
||||||
|
/// Class representing a geocentric location
|
||||||
|
class SGGeoc {
|
||||||
|
public:
|
||||||
|
/// Default constructor, initializes the instance to lat = lon = lat = 0
|
||||||
|
SGGeoc(void);
|
||||||
|
|
||||||
|
/// Factory from angular values in radians and radius in ft
|
||||||
|
static SGGeoc fromRadFt(double lon, double lat, double radius);
|
||||||
|
/// Factory from angular values in degrees and radius in ft
|
||||||
|
static SGGeoc fromDegFt(double lon, double lat, double radius);
|
||||||
|
/// Factory from angular values in radians and radius in m
|
||||||
|
static SGGeoc fromRadM(double lon, double lat, double radius);
|
||||||
|
/// Factory from angular values in degrees and radius in m
|
||||||
|
static SGGeoc fromDegM(double lon, double lat, double radius);
|
||||||
|
/// Factory to convert position from a cartesian position assumed to be
|
||||||
|
/// in wgs84 measured in meters
|
||||||
|
/// Note that this conversion is relatively expensive to compute
|
||||||
|
static SGGeoc fromCart(const SGVec3<double>& cart);
|
||||||
|
/// Factory to convert position from a geodetic position
|
||||||
|
/// Note that this conversion is relatively expensive to compute
|
||||||
|
static SGGeoc fromGeod(const SGGeod& geod);
|
||||||
|
|
||||||
|
/// Return the geocentric longitude in radians
|
||||||
|
double getLongitudeRad(void) const;
|
||||||
|
/// Set the geocentric longitude from the argument given in radians
|
||||||
|
void setLongitudeRad(double lon);
|
||||||
|
|
||||||
|
/// Return the geocentric longitude in degrees
|
||||||
|
double getLongitudeDeg(void) const;
|
||||||
|
/// Set the geocentric longitude from the argument given in degrees
|
||||||
|
void setLongitudeDeg(double lon);
|
||||||
|
|
||||||
|
/// Return the geocentric latitude in radians
|
||||||
|
double getLatitudeRad(void) const;
|
||||||
|
/// Set the geocentric latitude from the argument given in radians
|
||||||
|
void setLatitudeRad(double lat);
|
||||||
|
|
||||||
|
/// Return the geocentric latitude in degrees
|
||||||
|
double getLatitudeDeg(void) const;
|
||||||
|
/// Set the geocentric latitude from the argument given in degrees
|
||||||
|
void setLatitudeDeg(double lat);
|
||||||
|
|
||||||
|
/// Return the geocentric radius in meters
|
||||||
|
double getRadiusM(void) const;
|
||||||
|
/// Set the geocentric radius from the argument given in meters
|
||||||
|
void setRadiusM(double radius);
|
||||||
|
|
||||||
|
/// Return the geocentric radius in feet
|
||||||
|
double getRadiusFt(void) const;
|
||||||
|
/// Set the geocentric radius from the argument given in feet
|
||||||
|
void setRadiusFt(double radius);
|
||||||
|
|
||||||
|
SGGeoc advanceRadM(double course, double distance) const;
|
||||||
|
static double courseRad(const SGGeoc& from, const SGGeoc& to);
|
||||||
|
static double courseDeg(const SGGeoc& from, const SGGeoc& to);
|
||||||
|
static double distanceM(const SGGeoc& from, const SGGeoc& to);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// This one is private since construction is not unique if you do
|
||||||
|
/// not know the units of the arguments, use the factory methods for
|
||||||
|
/// that purpose
|
||||||
|
SGGeoc(double lon, double lat, double radius);
|
||||||
|
|
||||||
|
/// The actual data, angles in degree, radius in meters
|
||||||
|
/// The rationale for storing the values in degrees is that most code places
|
||||||
|
/// in flightgear/terragear use degrees as a nativ input and output value.
|
||||||
|
/// The places where it makes sense to use radians is when we convert
|
||||||
|
/// to other representations or compute rotation matrices. But both tasks
|
||||||
|
/// are computionally intensive anyway and that additional 'toRadian'
|
||||||
|
/// conversion does not hurt too much
|
||||||
|
double _lon;
|
||||||
|
double _lat;
|
||||||
|
double _radius;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc::SGGeoc(void) :
|
||||||
|
_lon(0), _lat(0), _radius(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc::SGGeoc(double lon, double lat, double radius) :
|
||||||
|
_lon(lon), _lat(lat), _radius(radius)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromRadFt(double lon, double lat, double radius)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return SGGeoc(lon*SGD_RADIANS_TO_DEGREES, lat*SGD_RADIANS_TO_DEGREES,
|
||||||
|
radius*SG_FEET_TO_METER);
|
||||||
|
#else
|
||||||
|
return SGGeoc(lon, lat, radius*SG_FEET_TO_METER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromDegFt(double lon, double lat, double radius)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return SGGeoc(lon, lat, radius*SG_FEET_TO_METER);
|
||||||
|
#else
|
||||||
|
return SGGeoc(lon*SGD_DEGREES_TO_RADIANS, lat*SGD_DEGREES_TO_RADIANS,
|
||||||
|
radius*SG_FEET_TO_METER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromRadM(double lon, double lat, double radius)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return SGGeoc(lon*SGD_RADIANS_TO_DEGREES, lat*SGD_RADIANS_TO_DEGREES,
|
||||||
|
radius);
|
||||||
|
#else
|
||||||
|
return SGGeoc(lon, lat, radius);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromDegM(double lon, double lat, double radius)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return SGGeoc(lon, lat, radius);
|
||||||
|
#else
|
||||||
|
return SGGeoc(lon*SGD_DEGREES_TO_RADIANS, lat*SGD_DEGREES_TO_RADIANS,
|
||||||
|
radius);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromCart(const SGVec3<double>& cart)
|
||||||
|
{
|
||||||
|
SGGeoc geoc;
|
||||||
|
SGGeodesy::SGCartToGeoc(cart, geoc);
|
||||||
|
return geoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::fromGeod(const SGGeod& geod)
|
||||||
|
{
|
||||||
|
SGVec3<double> cart;
|
||||||
|
SGGeodesy::SGGeodToCart(geod, cart);
|
||||||
|
SGGeoc geoc;
|
||||||
|
SGGeodesy::SGCartToGeoc(cart, geoc);
|
||||||
|
return geoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getLongitudeRad(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return _lon*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#else
|
||||||
|
return _lon;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setLongitudeRad(double lon)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
_lon = lon*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#else
|
||||||
|
_lon = lon;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getLongitudeDeg(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return _lon;
|
||||||
|
#else
|
||||||
|
return _lon*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setLongitudeDeg(double lon)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
_lon = lon;
|
||||||
|
#else
|
||||||
|
_lon = lon*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getLatitudeRad(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return _lat*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#else
|
||||||
|
return _lat;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setLatitudeRad(double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
_lat = lat*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#else
|
||||||
|
_lat = lat;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getLatitudeDeg(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
return _lat;
|
||||||
|
#else
|
||||||
|
return _lat*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setLatitudeDeg(double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOC_NATIVE_DEGREE
|
||||||
|
_lat = lat;
|
||||||
|
#else
|
||||||
|
_lat = lat*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getRadiusM(void) const
|
||||||
|
{
|
||||||
|
return _radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setRadiusM(double radius)
|
||||||
|
{
|
||||||
|
_radius = radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::getRadiusFt(void) const
|
||||||
|
{
|
||||||
|
return _radius*SG_METER_TO_FEET;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeoc::setRadiusFt(double radius)
|
||||||
|
{
|
||||||
|
_radius = radius*SG_FEET_TO_METER;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeoc
|
||||||
|
SGGeoc::advanceRadM(double course, double distance) const
|
||||||
|
{
|
||||||
|
SGGeoc result;
|
||||||
|
SGGeodesy::advanceRadM(*this, course, distance, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::courseRad(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
return SGGeodesy::courseRad(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::courseDeg(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
return SGMiscd::rad2deg(courseRad(from, to));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeoc::distanceM(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
return SGGeodesy::distanceM(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Output to an ostream
|
||||||
|
template<typename char_type, typename traits_type>
|
||||||
|
inline
|
||||||
|
std::basic_ostream<char_type, traits_type>&
|
||||||
|
operator<<(std::basic_ostream<char_type, traits_type>& s, const SGGeoc& g)
|
||||||
|
{
|
||||||
|
return s << "lon = " << g.getLongitudeDeg()
|
||||||
|
<< ", lat = " << g.getLatitudeDeg()
|
||||||
|
<< ", radius = " << g.getRadiusM();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// Copyright (C) 2008 Tim Moore timoore@redhat.com
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "SGMath.hxx"
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeSimulationFrameRelative()
|
||||||
|
{
|
||||||
|
SGQuatd hlOr = SGQuatd::fromLonLat(*this);
|
||||||
|
return osg::Matrix(hlOr.osg());
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeSimulationFrame()
|
||||||
|
{
|
||||||
|
osg::Matrix result(makeSimulationFrameRelative());
|
||||||
|
SGVec3d coord;
|
||||||
|
SGGeodesy::SGGeodToCart(*this, coord);
|
||||||
|
result.setTrans(coord.osg());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeZUpFrameRelative()
|
||||||
|
{
|
||||||
|
osg::Matrix result(makeSimulationFrameRelative());
|
||||||
|
// 180 degree rotation around Y axis
|
||||||
|
osg::Quat flip(0.0, 1.0, 0.0, 0.0);
|
||||||
|
result.preMult(osg::Matrix(flip));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeZUpFrame()
|
||||||
|
{
|
||||||
|
osg::Matrix result(makeZUpFrameRelative());
|
||||||
|
SGVec3d coord;
|
||||||
|
SGGeodesy::SGGeodToCart(*this, coord);
|
||||||
|
result.setTrans(coord.osg());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,343 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGGeod_H
|
||||||
|
#define SGGeod_H
|
||||||
|
|
||||||
|
#include <simgear/constants.h>
|
||||||
|
|
||||||
|
#include <osg/Matrix>
|
||||||
|
|
||||||
|
// #define SG_GEOD_NATIVE_DEGREE
|
||||||
|
|
||||||
|
/// Class representing a geodetic location
|
||||||
|
class SGGeod {
|
||||||
|
public:
|
||||||
|
/// Default constructor, initializes the instance to lat = lon = elev = 0
|
||||||
|
SGGeod(void);
|
||||||
|
|
||||||
|
/// Factory from angular values in radians and elevation is 0
|
||||||
|
static SGGeod fromRad(double lon, double lat);
|
||||||
|
/// Factory from angular values in degrees and elevation is 0
|
||||||
|
static SGGeod fromDeg(double lon, double lat);
|
||||||
|
/// Factory from angular values in radians and elevation in ft
|
||||||
|
static SGGeod fromRadFt(double lon, double lat, double elevation);
|
||||||
|
/// Factory from angular values in degrees and elevation in ft
|
||||||
|
static SGGeod fromDegFt(double lon, double lat, double elevation);
|
||||||
|
/// Factory from angular values in radians and elevation in m
|
||||||
|
static SGGeod fromRadM(double lon, double lat, double elevation);
|
||||||
|
/// Factory from angular values in degrees and elevation in m
|
||||||
|
static SGGeod fromDegM(double lon, double lat, double elevation);
|
||||||
|
/// Factory to convert position from a cartesian position assumed to be
|
||||||
|
/// in wgs84 measured in meters
|
||||||
|
/// Note that this conversion is relatively expensive to compute
|
||||||
|
static SGGeod fromCart(const SGVec3<double>& cart);
|
||||||
|
/// Factory to convert position from a geocentric position
|
||||||
|
/// Note that this conversion is relatively expensive to compute
|
||||||
|
static SGGeod fromGeoc(const SGGeoc& geoc);
|
||||||
|
|
||||||
|
/// Return the geodetic longitude in radians
|
||||||
|
double getLongitudeRad(void) const;
|
||||||
|
/// Set the geodetic longitude from the argument given in radians
|
||||||
|
void setLongitudeRad(double lon);
|
||||||
|
|
||||||
|
/// Return the geodetic longitude in degrees
|
||||||
|
double getLongitudeDeg(void) const;
|
||||||
|
/// Set the geodetic longitude from the argument given in degrees
|
||||||
|
void setLongitudeDeg(double lon);
|
||||||
|
|
||||||
|
/// Return the geodetic latitude in radians
|
||||||
|
double getLatitudeRad(void) const;
|
||||||
|
/// Set the geodetic latitude from the argument given in radians
|
||||||
|
void setLatitudeRad(double lat);
|
||||||
|
|
||||||
|
/// Return the geodetic latitude in degrees
|
||||||
|
double getLatitudeDeg(void) const;
|
||||||
|
/// Set the geodetic latitude from the argument given in degrees
|
||||||
|
void setLatitudeDeg(double lat);
|
||||||
|
|
||||||
|
/// Return the geodetic elevation in meters
|
||||||
|
double getElevationM(void) const;
|
||||||
|
/// Set the geodetic elevation from the argument given in meters
|
||||||
|
void setElevationM(double elevation);
|
||||||
|
|
||||||
|
/// Return the geodetic elevation in feet
|
||||||
|
double getElevationFt(void) const;
|
||||||
|
/// Set the geodetic elevation from the argument given in feet
|
||||||
|
void setElevationFt(double elevation);
|
||||||
|
|
||||||
|
// Create a local coordinate frame in the earth-centered frame of
|
||||||
|
// reference. X points north, Z points down.
|
||||||
|
// makeSimulationFrameRelative() only includes rotation.
|
||||||
|
|
||||||
|
osg::Matrix makeSimulationFrameRelative();
|
||||||
|
osg::Matrix makeSimulationFrame();
|
||||||
|
|
||||||
|
// Create a Z-up local coordinate frame in the earth-centered frame
|
||||||
|
// of reference. This is what scenery models, etc. expect.
|
||||||
|
// makeZUpFrameRelative() only includes rotation.
|
||||||
|
osg::Matrix makeZUpFrameRelative();
|
||||||
|
osg::Matrix makeZUpFrame();
|
||||||
|
private:
|
||||||
|
/// This one is private since construction is not unique if you do
|
||||||
|
/// not know the units of the arguments. Use the factory methods for
|
||||||
|
/// that purpose
|
||||||
|
SGGeod(double lon, double lat, double elevation);
|
||||||
|
|
||||||
|
/// The actual data, angles in degree, elevation in meters
|
||||||
|
/// The rationale for storing the values in degrees is that most code places
|
||||||
|
/// in flightgear/terragear use degrees as a nativ input and output value.
|
||||||
|
/// The places where it makes sense to use radians is when we convert
|
||||||
|
/// to other representations or compute rotation matrices. But both tasks
|
||||||
|
/// are computionally intensive anyway and that additional 'toRadian'
|
||||||
|
/// conversion does not hurt too much
|
||||||
|
double _lon;
|
||||||
|
double _lat;
|
||||||
|
double _elevation;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod::SGGeod(void) :
|
||||||
|
_lon(0), _lat(0), _elevation(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod::SGGeod(double lon, double lat, double elevation) :
|
||||||
|
_lon(lon), _lat(lat), _elevation(elevation)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromRad(double lon, double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon*SGD_RADIANS_TO_DEGREES, lat*SGD_RADIANS_TO_DEGREES, 0);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon, lat, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromDeg(double lon, double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon, lat, 0);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon*SGD_DEGREES_TO_RADIANS, lat*SGD_DEGREES_TO_RADIANS, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromRadFt(double lon, double lat, double elevation)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon*SGD_RADIANS_TO_DEGREES, lat*SGD_RADIANS_TO_DEGREES,
|
||||||
|
elevation*SG_FEET_TO_METER);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon, lat, elevation*SG_FEET_TO_METER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromDegFt(double lon, double lat, double elevation)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon, lat, elevation*SG_FEET_TO_METER);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon*SGD_DEGREES_TO_RADIANS, lat*SGD_DEGREES_TO_RADIANS,
|
||||||
|
elevation*SG_FEET_TO_METER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromRadM(double lon, double lat, double elevation)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon*SGD_RADIANS_TO_DEGREES, lat*SGD_RADIANS_TO_DEGREES,
|
||||||
|
elevation);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon, lat, elevation);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromDegM(double lon, double lat, double elevation)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return SGGeod(lon, lat, elevation);
|
||||||
|
#else
|
||||||
|
return SGGeod(lon*SGD_DEGREES_TO_RADIANS, lat*SGD_DEGREES_TO_RADIANS,
|
||||||
|
elevation);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromCart(const SGVec3<double>& cart)
|
||||||
|
{
|
||||||
|
SGGeod geod;
|
||||||
|
SGGeodesy::SGCartToGeod(cart, geod);
|
||||||
|
return geod;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromGeoc(const SGGeoc& geoc)
|
||||||
|
{
|
||||||
|
SGVec3<double> cart;
|
||||||
|
SGGeodesy::SGGeocToCart(geoc, cart);
|
||||||
|
SGGeod geod;
|
||||||
|
SGGeodesy::SGCartToGeod(cart, geod);
|
||||||
|
return geod;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getLongitudeRad(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return _lon*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#else
|
||||||
|
return _lon;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setLongitudeRad(double lon)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
_lon = lon*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#else
|
||||||
|
_lon = lon;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getLongitudeDeg(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return _lon;
|
||||||
|
#else
|
||||||
|
return _lon*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setLongitudeDeg(double lon)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
_lon = lon;
|
||||||
|
#else
|
||||||
|
_lon = lon*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getLatitudeRad(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return _lat*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#else
|
||||||
|
return _lat;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setLatitudeRad(double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
_lat = lat*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#else
|
||||||
|
_lat = lat;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getLatitudeDeg(void) const
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
return _lat;
|
||||||
|
#else
|
||||||
|
return _lat*SGD_RADIANS_TO_DEGREES;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setLatitudeDeg(double lat)
|
||||||
|
{
|
||||||
|
#ifdef SG_GEOD_NATIVE_DEGREE
|
||||||
|
_lat = lat;
|
||||||
|
#else
|
||||||
|
_lat = lat*SGD_DEGREES_TO_RADIANS;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getElevationM(void) const
|
||||||
|
{
|
||||||
|
return _elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setElevationM(double elevation)
|
||||||
|
{
|
||||||
|
_elevation = elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
double
|
||||||
|
SGGeod::getElevationFt(void) const
|
||||||
|
{
|
||||||
|
return _elevation*SG_METER_TO_FEET;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
SGGeod::setElevationFt(double elevation)
|
||||||
|
{
|
||||||
|
_elevation = elevation*SG_FEET_TO_METER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Output to an ostream
|
||||||
|
template<typename char_type, typename traits_type>
|
||||||
|
inline
|
||||||
|
std::basic_ostream<char_type, traits_type>&
|
||||||
|
operator<<(std::basic_ostream<char_type, traits_type>& s, const SGGeod& g)
|
||||||
|
{
|
||||||
|
return s << "lon = " << g.getLongitudeDeg()
|
||||||
|
<< "deg, lat = " << g.getLatitudeDeg()
|
||||||
|
<< "deg, elev = " << g.getElevationM()
|
||||||
|
<< "m";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,500 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
#include "SGMath.hxx"
|
||||||
|
|
||||||
|
// These are hard numbers from the WGS84 standard. DON'T MODIFY
|
||||||
|
// unless you want to change the datum.
|
||||||
|
#define _EQURAD 6378137.0
|
||||||
|
#define _FLATTENING 298.257223563
|
||||||
|
|
||||||
|
// These are derived quantities more useful to the code:
|
||||||
|
#if 0
|
||||||
|
#define _SQUASH (1 - 1/_FLATTENING)
|
||||||
|
#define _STRETCH (1/_SQUASH)
|
||||||
|
#define _POLRAD (EQURAD * _SQUASH)
|
||||||
|
#else
|
||||||
|
// High-precision versions of the above produced with an arbitrary
|
||||||
|
// precision calculator (the compiler might lose a few bits in the FPU
|
||||||
|
// operations). These are specified to 81 bits of mantissa, which is
|
||||||
|
// higher than any FPU known to me:
|
||||||
|
#define _SQUASH 0.9966471893352525192801545
|
||||||
|
#define _STRETCH 1.0033640898209764189003079
|
||||||
|
#define _POLRAD 6356752.3142451794975639668
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// The constants from the WGS84 standard
|
||||||
|
const double SGGeodesy::EQURAD = _EQURAD;
|
||||||
|
const double SGGeodesy::iFLATTENING = _FLATTENING;
|
||||||
|
const double SGGeodesy::SQUASH = _SQUASH;
|
||||||
|
const double SGGeodesy::STRETCH = _STRETCH;
|
||||||
|
const double SGGeodesy::POLRAD = _POLRAD;
|
||||||
|
|
||||||
|
// additional derived and precomputable ones
|
||||||
|
// for the geodetic conversion algorithm
|
||||||
|
|
||||||
|
#define E2 fabs(1 - _SQUASH*_SQUASH)
|
||||||
|
static double a = _EQURAD;
|
||||||
|
static double ra2 = 1/(_EQURAD*_EQURAD);
|
||||||
|
static double e = sqrt(E2);
|
||||||
|
static double e2 = E2;
|
||||||
|
static double e4 = E2*E2;
|
||||||
|
|
||||||
|
#undef _EQURAD
|
||||||
|
#undef _FLATTENING
|
||||||
|
#undef _SQUASH
|
||||||
|
#undef _STRETCH
|
||||||
|
#undef _POLRAD
|
||||||
|
#undef E2
|
||||||
|
|
||||||
|
void
|
||||||
|
SGGeodesy::SGCartToGeod(const SGVec3<double>& cart, SGGeod& geod)
|
||||||
|
{
|
||||||
|
// according to
|
||||||
|
// H. Vermeille,
|
||||||
|
// Direct transformation from geocentric to geodetic ccordinates,
|
||||||
|
// Journal of Geodesy (2002) 76:451-454
|
||||||
|
double X = cart(0);
|
||||||
|
double Y = cart(1);
|
||||||
|
double Z = cart(2);
|
||||||
|
double XXpYY = X*X+Y*Y;
|
||||||
|
double sqrtXXpYY = sqrt(XXpYY);
|
||||||
|
double p = XXpYY*ra2;
|
||||||
|
double q = Z*Z*(1-e2)*ra2;
|
||||||
|
double r = 1/6.0*(p+q-e4);
|
||||||
|
double s = e4*p*q/(4*r*r*r);
|
||||||
|
double t = pow(1+s+sqrt(s*(2+s)), 1/3.0);
|
||||||
|
double u = r*(1+t+1/t);
|
||||||
|
double v = sqrt(u*u+e4*q);
|
||||||
|
double w = e2*(u+v-q)/(2*v);
|
||||||
|
double k = sqrt(u+v+w*w)-w;
|
||||||
|
double D = k*sqrtXXpYY/(k+e2);
|
||||||
|
geod.setLongitudeRad(2*atan2(Y, X+sqrtXXpYY));
|
||||||
|
double sqrtDDpZZ = sqrt(D*D+Z*Z);
|
||||||
|
geod.setLatitudeRad(2*atan2(Z, D+sqrtDDpZZ));
|
||||||
|
geod.setElevationM((k+e2-1)*sqrtDDpZZ/k);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SGGeodesy::SGGeodToCart(const SGGeod& geod, SGVec3<double>& cart)
|
||||||
|
{
|
||||||
|
// according to
|
||||||
|
// H. Vermeille,
|
||||||
|
// Direct transformation from geocentric to geodetic ccordinates,
|
||||||
|
// Journal of Geodesy (2002) 76:451-454
|
||||||
|
double lambda = geod.getLongitudeRad();
|
||||||
|
double phi = geod.getLatitudeRad();
|
||||||
|
double h = geod.getElevationM();
|
||||||
|
double sphi = sin(phi);
|
||||||
|
double n = a/sqrt(1-e2*sphi*sphi);
|
||||||
|
double cphi = cos(phi);
|
||||||
|
double slambda = sin(lambda);
|
||||||
|
double clambda = cos(lambda);
|
||||||
|
cart(0) = (h+n)*cphi*clambda;
|
||||||
|
cart(1) = (h+n)*cphi*slambda;
|
||||||
|
cart(2) = (h+n-e2*n)*sphi;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::SGGeodToSeaLevelRadius(const SGGeod& geod)
|
||||||
|
{
|
||||||
|
// this is just a simplified version of the SGGeodToCart function above,
|
||||||
|
// substitute h = 0, take the 2-norm of the cartesian vector and simplify
|
||||||
|
double phi = geod.getLatitudeRad();
|
||||||
|
double sphi = sin(phi);
|
||||||
|
double sphi2 = sphi*sphi;
|
||||||
|
return a*sqrt((1 + (e4 - 2*e2)*sphi2)/(1 - e2*sphi2));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SGGeodesy::SGCartToGeoc(const SGVec3<double>& cart, SGGeoc& geoc)
|
||||||
|
{
|
||||||
|
double minVal = SGLimits<double>::min();
|
||||||
|
if (fabs(cart(0)) < minVal && fabs(cart(1)) < minVal)
|
||||||
|
geoc.setLongitudeRad(0);
|
||||||
|
else
|
||||||
|
geoc.setLongitudeRad(atan2(cart(1), cart(0)));
|
||||||
|
|
||||||
|
double nxy = sqrt(cart(0)*cart(0) + cart(1)*cart(1));
|
||||||
|
if (fabs(nxy) < minVal && fabs(cart(2)) < minVal)
|
||||||
|
geoc.setLatitudeRad(0);
|
||||||
|
else
|
||||||
|
geoc.setLatitudeRad(atan2(cart(2), nxy));
|
||||||
|
|
||||||
|
geoc.setRadiusM(norm(cart));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SGGeodesy::SGGeocToCart(const SGGeoc& geoc, SGVec3<double>& cart)
|
||||||
|
{
|
||||||
|
double lat = geoc.getLatitudeRad();
|
||||||
|
double lon = geoc.getLongitudeRad();
|
||||||
|
double slat = sin(lat);
|
||||||
|
double clat = cos(lat);
|
||||||
|
double slon = sin(lon);
|
||||||
|
double clon = cos(lon);
|
||||||
|
cart = geoc.getRadiusM()*SGVec3<double>(clat*clon, clat*slon, slat);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
//
|
||||||
|
// The XYZ/cartesian coordinate system in use puts the X axis through
|
||||||
|
// zero lat/lon (off west Africa), the Z axis through the north pole,
|
||||||
|
// and the Y axis through 90 degrees longitude (in the Indian Ocean).
|
||||||
|
//
|
||||||
|
// All latitude and longitude values are in radians. Altitude is in
|
||||||
|
// meters, with zero on the WGS84 ellipsoid.
|
||||||
|
//
|
||||||
|
// The code below makes use of the notion of "squashed" space. This
|
||||||
|
// is a 2D cylindrical coordinate system where the radius from the Z
|
||||||
|
// axis is multiplied by SQUASH; the earth in this space is a perfect
|
||||||
|
// circle with a radius of POLRAD.
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Direct and inverse distance functions
|
||||||
|
//
|
||||||
|
// Proceedings of the 7th International Symposium on Geodetic
|
||||||
|
// Computations, 1985
|
||||||
|
//
|
||||||
|
// "The Nested Coefficient Method for Accurate Solutions of Direct and
|
||||||
|
// Inverse Geodetic Problems With Any Length"
|
||||||
|
//
|
||||||
|
// Zhang Xue-Lian
|
||||||
|
// pp 747-763
|
||||||
|
//
|
||||||
|
// modified for FlightGear to use WGS84 only -- Norman Vine
|
||||||
|
|
||||||
|
static inline double M0( double e2 ) {
|
||||||
|
//double e4 = e2*e2;
|
||||||
|
return SGMiscd::pi()*0.5*(1.0 - e2*( 1.0/4.0 + e2*( 3.0/64.0 +
|
||||||
|
e2*(5.0/256.0) )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// given, lat1, lon1, az1 and distance (s), calculate lat2, lon2
|
||||||
|
// and az2. Lat, lon, and azimuth are in degrees. distance in meters
|
||||||
|
static int _geo_direct_wgs_84 ( double lat1, double lon1, double az1,
|
||||||
|
double s, double *lat2, double *lon2,
|
||||||
|
double *az2 )
|
||||||
|
{
|
||||||
|
double a = SGGeodesy::EQURAD, rf = SGGeodesy::iFLATTENING;
|
||||||
|
double testv = 1.0E-10;
|
||||||
|
double f = ( rf > 0.0 ? 1.0/rf : 0.0 );
|
||||||
|
double b = a*(1.0-f);
|
||||||
|
double e2 = f*(2.0-f);
|
||||||
|
double phi1 = SGMiscd::deg2rad(lat1), lam1 = SGMiscd::deg2rad(lon1);
|
||||||
|
double sinphi1 = sin(phi1), cosphi1 = cos(phi1);
|
||||||
|
double azm1 = SGMiscd::deg2rad(az1);
|
||||||
|
double sinaz1 = sin(azm1), cosaz1 = cos(azm1);
|
||||||
|
|
||||||
|
|
||||||
|
if( fabs(s) < 0.01 ) { // distance < centimeter => congruency
|
||||||
|
*lat2 = lat1;
|
||||||
|
*lon2 = lon1;
|
||||||
|
*az2 = 180.0 + az1;
|
||||||
|
if( *az2 > 360.0 ) *az2 -= 360.0;
|
||||||
|
return 0;
|
||||||
|
} else if( SGLimitsd::min() < fabs(cosphi1) ) { // non-polar origin
|
||||||
|
// u1 is reduced latitude
|
||||||
|
double tanu1 = sqrt(1.0-e2)*sinphi1/cosphi1;
|
||||||
|
double sig1 = atan2(tanu1,cosaz1);
|
||||||
|
double cosu1 = 1.0/sqrt( 1.0 + tanu1*tanu1 ), sinu1 = tanu1*cosu1;
|
||||||
|
double sinaz = cosu1*sinaz1, cos2saz = 1.0-sinaz*sinaz;
|
||||||
|
double us = cos2saz*e2/(1.0-e2);
|
||||||
|
|
||||||
|
// Terms
|
||||||
|
double ta = 1.0+us*(4096.0+us*(-768.0+us*(320.0-175.0*us)))/16384.0,
|
||||||
|
tb = us*(256.0+us*(-128.0+us*(74.0-47.0*us)))/1024.0,
|
||||||
|
tc = 0;
|
||||||
|
|
||||||
|
// FIRST ESTIMATE OF SIGMA (SIG)
|
||||||
|
double first = s/(b*ta); // !!
|
||||||
|
double sig = first;
|
||||||
|
double c2sigm, sinsig,cossig, temp,denom,rnumer, dlams, dlam;
|
||||||
|
do {
|
||||||
|
c2sigm = cos(2.0*sig1+sig);
|
||||||
|
sinsig = sin(sig); cossig = cos(sig);
|
||||||
|
temp = sig;
|
||||||
|
sig = first +
|
||||||
|
tb*sinsig*(c2sigm+tb*(cossig*(-1.0+2.0*c2sigm*c2sigm) -
|
||||||
|
tb*c2sigm*(-3.0+4.0*sinsig*sinsig)
|
||||||
|
*(-3.0+4.0*c2sigm*c2sigm)/6.0)
|
||||||
|
/4.0);
|
||||||
|
} while( fabs(sig-temp) > testv);
|
||||||
|
|
||||||
|
// LATITUDE OF POINT 2
|
||||||
|
// DENOMINATOR IN 2 PARTS (TEMP ALSO USED LATER)
|
||||||
|
temp = sinu1*sinsig-cosu1*cossig*cosaz1;
|
||||||
|
denom = (1.0-f)*sqrt(sinaz*sinaz+temp*temp);
|
||||||
|
|
||||||
|
// NUMERATOR
|
||||||
|
rnumer = sinu1*cossig+cosu1*sinsig*cosaz1;
|
||||||
|
*lat2 = SGMiscd::rad2deg(atan2(rnumer,denom));
|
||||||
|
|
||||||
|
// DIFFERENCE IN LONGITUDE ON AUXILARY SPHERE (DLAMS )
|
||||||
|
rnumer = sinsig*sinaz1;
|
||||||
|
denom = cosu1*cossig-sinu1*sinsig*cosaz1;
|
||||||
|
dlams = atan2(rnumer,denom);
|
||||||
|
|
||||||
|
// TERM C
|
||||||
|
tc = f*cos2saz*(4.0+f*(4.0-3.0*cos2saz))/16.0;
|
||||||
|
|
||||||
|
// DIFFERENCE IN LONGITUDE
|
||||||
|
dlam = dlams-(1.0-tc)*f*sinaz*(sig+tc*sinsig*
|
||||||
|
(c2sigm+
|
||||||
|
tc*cossig*(-1.0+2.0*
|
||||||
|
c2sigm*c2sigm)));
|
||||||
|
*lon2 = SGMiscd::rad2deg(lam1+dlam);
|
||||||
|
if (*lon2 > 180.0 ) *lon2 -= 360.0;
|
||||||
|
if (*lon2 < -180.0 ) *lon2 += 360.0;
|
||||||
|
|
||||||
|
// AZIMUTH - FROM NORTH
|
||||||
|
*az2 = SGMiscd::rad2deg(atan2(-sinaz,temp));
|
||||||
|
if ( fabs(*az2) < testv ) *az2 = 0.0;
|
||||||
|
if( *az2 < 0.0) *az2 += 360.0;
|
||||||
|
return 0;
|
||||||
|
} else { // phi1 == 90 degrees, polar origin
|
||||||
|
double dM = a*M0(e2) - s;
|
||||||
|
double paz = ( phi1 < 0.0 ? 180.0 : 0.0 );
|
||||||
|
double zero = 0.0f;
|
||||||
|
return _geo_direct_wgs_84( zero, lon1, paz, dM, lat2, lon2, az2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
SGGeodesy::direct(const SGGeod& p1, double course1,
|
||||||
|
double distance, SGGeod& p2, double& course2)
|
||||||
|
{
|
||||||
|
double lat2, lon2;
|
||||||
|
int ret = _geo_direct_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
|
||||||
|
course1, distance, &lat2, &lon2, &course2);
|
||||||
|
p2.setLatitudeDeg(lat2);
|
||||||
|
p2.setLongitudeDeg(lon2);
|
||||||
|
p2.setElevationM(0);
|
||||||
|
return ret == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// given lat1, lon1, lat2, lon2, calculate starting and ending
|
||||||
|
// az1, az2 and distance (s). Lat, lon, and azimuth are in degrees.
|
||||||
|
// distance in meters
|
||||||
|
static int _geo_inverse_wgs_84( double lat1, double lon1, double lat2,
|
||||||
|
double lon2, double *az1, double *az2,
|
||||||
|
double *s )
|
||||||
|
{
|
||||||
|
double a = SGGeodesy::EQURAD, rf = SGGeodesy::iFLATTENING;
|
||||||
|
int iter=0;
|
||||||
|
double testv = 1.0E-10;
|
||||||
|
double f = ( rf > 0.0 ? 1.0/rf : 0.0 );
|
||||||
|
double b = a*(1.0-f);
|
||||||
|
// double e2 = f*(2.0-f); // unused in this routine
|
||||||
|
double phi1 = SGMiscd::deg2rad(lat1), lam1 = SGMiscd::deg2rad(lon1);
|
||||||
|
double sinphi1 = sin(phi1), cosphi1 = cos(phi1);
|
||||||
|
double phi2 = SGMiscd::deg2rad(lat2), lam2 = SGMiscd::deg2rad(lon2);
|
||||||
|
double sinphi2 = sin(phi2), cosphi2 = cos(phi2);
|
||||||
|
|
||||||
|
if( (fabs(lat1-lat2) < testv &&
|
||||||
|
( fabs(lon1-lon2) < testv) || fabs(lat1-90.0) < testv ) )
|
||||||
|
{
|
||||||
|
// TWO STATIONS ARE IDENTICAL : SET DISTANCE & AZIMUTHS TO ZERO */
|
||||||
|
*az1 = 0.0; *az2 = 0.0; *s = 0.0;
|
||||||
|
return 0;
|
||||||
|
} else if( fabs(cosphi1) < testv ) {
|
||||||
|
// initial point is polar
|
||||||
|
int k = _geo_inverse_wgs_84( lat2,lon2,lat1,lon1, az1,az2,s );
|
||||||
|
k = k; // avoid compiler error since return result is unused
|
||||||
|
b = *az1; *az1 = *az2; *az2 = b;
|
||||||
|
return 0;
|
||||||
|
} else if( fabs(cosphi2) < testv ) {
|
||||||
|
// terminal point is polar
|
||||||
|
double _lon1 = lon1 + 180.0f;
|
||||||
|
int k = _geo_inverse_wgs_84( lat1, lon1, lat1, _lon1,
|
||||||
|
az1, az2, s );
|
||||||
|
k = k; // avoid compiler error since return result is unused
|
||||||
|
*s /= 2.0;
|
||||||
|
*az2 = *az1 + 180.0;
|
||||||
|
if( *az2 > 360.0 ) *az2 -= 360.0;
|
||||||
|
return 0;
|
||||||
|
} else if( (fabs( fabs(lon1-lon2) - 180 ) < testv) &&
|
||||||
|
(fabs(lat1+lat2) < testv) )
|
||||||
|
{
|
||||||
|
// Geodesic passes through the pole (antipodal)
|
||||||
|
double s1,s2;
|
||||||
|
_geo_inverse_wgs_84( lat1,lon1, lat1,lon2, az1,az2, &s1 );
|
||||||
|
_geo_inverse_wgs_84( lat2,lon2, lat1,lon2, az1,az2, &s2 );
|
||||||
|
*az2 = *az1;
|
||||||
|
*s = s1 + s2;
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
// antipodal and polar points don't get here
|
||||||
|
double dlam = lam2 - lam1, dlams = dlam;
|
||||||
|
double sdlams,cdlams, sig,sinsig,cossig, sinaz,
|
||||||
|
cos2saz, c2sigm;
|
||||||
|
double tc,temp, us,rnumer,denom, ta,tb;
|
||||||
|
double cosu1,sinu1, sinu2,cosu2;
|
||||||
|
|
||||||
|
// Reduced latitudes
|
||||||
|
temp = (1.0-f)*sinphi1/cosphi1;
|
||||||
|
cosu1 = 1.0/sqrt(1.0+temp*temp);
|
||||||
|
sinu1 = temp*cosu1;
|
||||||
|
temp = (1.0-f)*sinphi2/cosphi2;
|
||||||
|
cosu2 = 1.0/sqrt(1.0+temp*temp);
|
||||||
|
sinu2 = temp*cosu2;
|
||||||
|
|
||||||
|
do {
|
||||||
|
sdlams = sin(dlams), cdlams = cos(dlams);
|
||||||
|
sinsig = sqrt(cosu2*cosu2*sdlams*sdlams+
|
||||||
|
(cosu1*sinu2-sinu1*cosu2*cdlams)*
|
||||||
|
(cosu1*sinu2-sinu1*cosu2*cdlams));
|
||||||
|
cossig = sinu1*sinu2+cosu1*cosu2*cdlams;
|
||||||
|
|
||||||
|
sig = atan2(sinsig,cossig);
|
||||||
|
sinaz = cosu1*cosu2*sdlams/sinsig;
|
||||||
|
cos2saz = 1.0-sinaz*sinaz;
|
||||||
|
c2sigm = (sinu1 == 0.0 || sinu2 == 0.0 ? cossig :
|
||||||
|
cossig-2.0*sinu1*sinu2/cos2saz);
|
||||||
|
tc = f*cos2saz*(4.0+f*(4.0-3.0*cos2saz))/16.0;
|
||||||
|
temp = dlams;
|
||||||
|
dlams = dlam+(1.0-tc)*f*sinaz*
|
||||||
|
(sig+tc*sinsig*
|
||||||
|
(c2sigm+tc*cossig*(-1.0+2.0*c2sigm*c2sigm)));
|
||||||
|
if (fabs(dlams) > SGMiscd::pi() && iter++ > 50) {
|
||||||
|
return iter;
|
||||||
|
}
|
||||||
|
} while ( fabs(temp-dlams) > testv);
|
||||||
|
|
||||||
|
us = cos2saz*(a*a-b*b)/(b*b); // !!
|
||||||
|
// BACK AZIMUTH FROM NORTH
|
||||||
|
rnumer = -(cosu1*sdlams);
|
||||||
|
denom = sinu1*cosu2-cosu1*sinu2*cdlams;
|
||||||
|
*az2 = SGMiscd::rad2deg(atan2(rnumer,denom));
|
||||||
|
if( fabs(*az2) < testv ) *az2 = 0.0;
|
||||||
|
if(*az2 < 0.0) *az2 += 360.0;
|
||||||
|
|
||||||
|
// FORWARD AZIMUTH FROM NORTH
|
||||||
|
rnumer = cosu2*sdlams;
|
||||||
|
denom = cosu1*sinu2-sinu1*cosu2*cdlams;
|
||||||
|
*az1 = SGMiscd::rad2deg(atan2(rnumer,denom));
|
||||||
|
if( fabs(*az1) < testv ) *az1 = 0.0;
|
||||||
|
if(*az1 < 0.0) *az1 += 360.0;
|
||||||
|
|
||||||
|
// Terms a & b
|
||||||
|
ta = 1.0+us*(4096.0+us*(-768.0+us*(320.0-175.0*us)))/
|
||||||
|
16384.0;
|
||||||
|
tb = us*(256.0+us*(-128.0+us*(74.0-47.0*us)))/1024.0;
|
||||||
|
|
||||||
|
// GEODETIC DISTANCE
|
||||||
|
*s = b*ta*(sig-tb*sinsig*
|
||||||
|
(c2sigm+tb*(cossig*(-1.0+2.0*c2sigm*c2sigm)-tb*
|
||||||
|
c2sigm*(-3.0+4.0*sinsig*sinsig)*
|
||||||
|
(-3.0+4.0*c2sigm*c2sigm)/6.0)/
|
||||||
|
4.0));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
SGGeodesy::inverse(const SGGeod& p1, const SGGeod& p2, double& course1,
|
||||||
|
double& course2, double& distance)
|
||||||
|
{
|
||||||
|
int ret = _geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
|
||||||
|
p2.getLatitudeDeg(), p2.getLongitudeDeg(),
|
||||||
|
&course1, &course2, &distance);
|
||||||
|
return ret == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Geocentric routines
|
||||||
|
|
||||||
|
void
|
||||||
|
SGGeodesy::advanceRadM(const SGGeoc& geoc, double course, double distance,
|
||||||
|
SGGeoc& result)
|
||||||
|
{
|
||||||
|
result.setRadiusM(geoc.getRadiusM());
|
||||||
|
|
||||||
|
// lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
|
||||||
|
// IF (cos(lat)=0)
|
||||||
|
// lon=lon1 // endpoint a pole
|
||||||
|
// ELSE
|
||||||
|
// lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
|
||||||
|
// ENDIF
|
||||||
|
|
||||||
|
distance *= SG_METER_TO_NM * SG_NM_TO_RAD;
|
||||||
|
|
||||||
|
double sinDistance = sin(distance);
|
||||||
|
double cosDistance = cos(distance);
|
||||||
|
|
||||||
|
double sinLat = sin(geoc.getLatitudeRad()) * cosDistance +
|
||||||
|
cos(geoc.getLatitudeRad()) * sinDistance * cos(course);
|
||||||
|
sinLat = SGMiscd::clip(sinLat, -1, 1);
|
||||||
|
result.setLatitudeRad(asin(sinLat));
|
||||||
|
double cosLat = cos(result.getLatitudeRad());
|
||||||
|
|
||||||
|
|
||||||
|
if (cosLat <= SGLimitsd::min()) {
|
||||||
|
// endpoint a pole
|
||||||
|
result.setLongitudeRad(geoc.getLongitudeRad());
|
||||||
|
} else {
|
||||||
|
double tmp = SGMiscd::clip(sin(course) * sinDistance / cosLat, -1, 1);
|
||||||
|
double lon = SGMiscd::normalizeAngle(geoc.getLongitudeRad() - asin( tmp ));
|
||||||
|
result.setLongitudeRad(lon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::courseRad(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
double diffLon = to.getLongitudeRad() - from.getLongitudeRad();
|
||||||
|
|
||||||
|
double sinLatFrom = sin(from.getLatitudeRad());
|
||||||
|
double cosLatFrom = cos(from.getLatitudeRad());
|
||||||
|
|
||||||
|
double sinLatTo = sin(to.getLatitudeRad());
|
||||||
|
double cosLatTo = cos(to.getLatitudeRad());
|
||||||
|
|
||||||
|
double x = cosLatTo*sin(diffLon);
|
||||||
|
double y = cosLatFrom*sinLatTo - sinLatFrom*cosLatTo*cos(diffLon);
|
||||||
|
|
||||||
|
// guard atan2 returning NaN's
|
||||||
|
if (fabs(x) <= SGLimitsd::min() && fabs(y) <= SGLimitsd::min())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
double c = atan2(x, y);
|
||||||
|
if (c >= 0)
|
||||||
|
return SGMiscd::twopi() - c;
|
||||||
|
else
|
||||||
|
return -c;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::distanceM(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
// d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
|
||||||
|
// cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))
|
||||||
|
double cosLatFrom = cos(from.getLatitudeRad());
|
||||||
|
double cosLatTo = cos(to.getLatitudeRad());
|
||||||
|
double tmp1 = sin(0.5*(from.getLatitudeRad() - to.getLatitudeRad()));
|
||||||
|
double tmp2 = sin(0.5*(from.getLongitudeRad() - to.getLongitudeRad()));
|
||||||
|
double square = tmp1*tmp1 + cosLatFrom*cosLatTo*tmp2*tmp2;
|
||||||
|
double s = SGMiscd::min(sqrt(SGMiscd::max(square, 0)), 1);
|
||||||
|
return 2 * asin(s) * SG_RAD_TO_NM * SG_NM_TO_METER;
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGGeodesy_H
|
||||||
|
#define SGGeodesy_H
|
||||||
|
|
||||||
|
class SGGeodesy {
|
||||||
|
public:
|
||||||
|
// Hard numbers from the WGS84 standard.
|
||||||
|
static const double EQURAD;
|
||||||
|
static const double iFLATTENING;
|
||||||
|
static const double SQUASH;
|
||||||
|
static const double STRETCH;
|
||||||
|
static const double POLRAD;
|
||||||
|
|
||||||
|
/// Takes a cartesian coordinate data and returns the geodetic
|
||||||
|
/// coordinates.
|
||||||
|
static void SGCartToGeod(const SGVec3<double>& cart, SGGeod& geod);
|
||||||
|
|
||||||
|
/// Takes a geodetic coordinate data and returns the cartesian
|
||||||
|
/// coordinates.
|
||||||
|
static void SGGeodToCart(const SGGeod& geod, SGVec3<double>& cart);
|
||||||
|
|
||||||
|
/// Takes a geodetic coordinate data and returns the sea level radius.
|
||||||
|
static double SGGeodToSeaLevelRadius(const SGGeod& geod);
|
||||||
|
|
||||||
|
/// Takes a cartesian coordinate data and returns the geocentric
|
||||||
|
/// coordinates.
|
||||||
|
static void SGCartToGeoc(const SGVec3<double>& cart, SGGeoc& geoc);
|
||||||
|
|
||||||
|
/// Takes a geocentric coordinate data and returns the cartesian
|
||||||
|
/// coordinates.
|
||||||
|
static void SGGeocToCart(const SGGeoc& geoc, SGVec3<double>& cart);
|
||||||
|
|
||||||
|
// Geodetic course/distance computation
|
||||||
|
static bool direct(const SGGeod& p1, double course1,
|
||||||
|
double distance, SGGeod& p2, double& course2);
|
||||||
|
|
||||||
|
static bool inverse(const SGGeod& p1, const SGGeod& p2, double& course1,
|
||||||
|
double& course2, double& distance);
|
||||||
|
|
||||||
|
// Geocentric course/distance computation
|
||||||
|
static void advanceRadM(const SGGeoc& geoc, double course, double distance,
|
||||||
|
SGGeoc& result);
|
||||||
|
static double courseRad(const SGGeoc& from, const SGGeoc& to);
|
||||||
|
static double distanceM(const SGGeoc& from, const SGGeoc& to);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGGeometry_HXX
|
||||||
|
#define SGGeometry_HXX
|
||||||
|
|
||||||
|
// Required ...
|
||||||
|
#include "SGMath.hxx"
|
||||||
|
|
||||||
|
// Make sure all is defined
|
||||||
|
#include "SGGeometryFwd.hxx"
|
||||||
|
|
||||||
|
// Geometric primitives we know about
|
||||||
|
#include "SGBox.hxx"
|
||||||
|
#include "SGSphere.hxx"
|
||||||
|
#include "SGRay.hxx"
|
||||||
|
#include "SGLineSegment.hxx"
|
||||||
|
#include "SGPlane.hxx"
|
||||||
|
#include "SGTriangle.hxx"
|
||||||
|
|
||||||
|
// Intersection tests
|
||||||
|
#include "SGIntersect.hxx"
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGGeometryFwd_HXX
|
||||||
|
#define SGGeometryFwd_HXX
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGBox;
|
||||||
|
typedef SGBox<float> SGBoxf;
|
||||||
|
typedef SGBox<double> SGBoxd;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGSphere;
|
||||||
|
typedef SGSphere<float> SGSpheref;
|
||||||
|
typedef SGSphere<double> SGSphered;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGRay;
|
||||||
|
typedef SGRay<float> SGRayf;
|
||||||
|
typedef SGRay<double> SGRayd;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGLineSegment;
|
||||||
|
typedef SGLineSegment<float> SGLineSegmentf;
|
||||||
|
typedef SGLineSegment<double> SGLineSegmentd;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGPlane;
|
||||||
|
typedef SGPlane<float> SGPlanef;
|
||||||
|
typedef SGPlane<double> SGPlaned;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGTriangle;
|
||||||
|
typedef SGTriangle<float> SGTrianglef;
|
||||||
|
typedef SGTriangle<double> SGTriangled;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,442 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "SGGeometry.hxx"
|
||||||
|
#include "sg_random.h"
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
SGVec3<T> rndVec3(void)
|
||||||
|
{
|
||||||
|
return SGVec3<T>(sg_random(), sg_random(), sg_random());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool
|
||||||
|
TriangleLineIntersectionTest(void)
|
||||||
|
{
|
||||||
|
unsigned nTests = 100000;
|
||||||
|
unsigned failedCount = 0;
|
||||||
|
for (unsigned i = 0; i < nTests; ++i) {
|
||||||
|
SGVec3<T> v0 = rndVec3<T>();
|
||||||
|
SGVec3<T> v1 = rndVec3<T>();
|
||||||
|
SGVec3<T> v2 = rndVec3<T>();
|
||||||
|
|
||||||
|
SGTriangle<T> tri(v0, v1, v2);
|
||||||
|
|
||||||
|
// generate random coeficients
|
||||||
|
T u = 4*sg_random() - 2;
|
||||||
|
T v = 4*sg_random() - 2;
|
||||||
|
T t = 4*sg_random() - 2;
|
||||||
|
|
||||||
|
SGVec3<T> isectpt = v0 + u*(v1 - v0) + v*(v2 - v0);
|
||||||
|
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
SGVec3<T> dir = rndVec3<T>();
|
||||||
|
|
||||||
|
SGVec3<T> isectres;
|
||||||
|
lineSegment.set(isectpt - t*dir, isectpt + (1 - t)*dir);
|
||||||
|
|
||||||
|
if (intersects(isectres, tri, lineSegment)) {
|
||||||
|
if (0 <= u && 0 <= v && u+v <= 1 && 0 <= t && t <= 1) {
|
||||||
|
if (!equivalent(isectres, isectpt)) {
|
||||||
|
std::cout << "Failed line segment intersection test #" << i
|
||||||
|
<< ": not equivalent!\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::cout << "Failed line segment intersection test #" << i
|
||||||
|
<< ": false positive!\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (0 <= u && 0 <= v && u+v <= 1 && 0 <= t && t <= 1) {
|
||||||
|
std::cout << "Failed line segment intersection test #" << i
|
||||||
|
<< ": false negative!\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SGRay<T> ray;
|
||||||
|
ray.set(isectpt - t*dir, dir);
|
||||||
|
if (intersects(isectres, tri, ray)) {
|
||||||
|
if (0 <= u && 0 <= v && u+v <= 1 && 0 <= t) {
|
||||||
|
if (!equivalent(isectres, isectpt)) {
|
||||||
|
std::cout << "Failed ray intersection test #" << i
|
||||||
|
<< ": not equivalent!\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::cout << "Failed ray intersection test #" << i
|
||||||
|
<< ": false positive!\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (0 <= u && 0 <= v && u+v <= 1 && 0 <= t) {
|
||||||
|
std::cout << "Failed ray intersection test #" << i
|
||||||
|
<< ": false negative !\nu = "
|
||||||
|
<< u << ", v = " << v << ", t = " << t
|
||||||
|
<< "\n" << tri << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nTests < 100*failedCount) {
|
||||||
|
std::cout << "Failed ray intersection tests: " << failedCount
|
||||||
|
<< " tests out of " << nTests
|
||||||
|
<< " went wrong. Abort!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Some crude handmade test
|
||||||
|
SGVec3<T> v0 = SGVec3<T>(0, 0, 0);
|
||||||
|
SGVec3<T> v1 = SGVec3<T>(1, 0, 0);
|
||||||
|
SGVec3<T> v2 = SGVec3<T>(0, 1, 0);
|
||||||
|
|
||||||
|
SGTriangle<T> tri(v0, v1, v2);
|
||||||
|
|
||||||
|
SGRay<T> ray;
|
||||||
|
ray.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0.1, 0.1, -1));
|
||||||
|
if (!intersects(tri, ray)) {
|
||||||
|
std::cout << "Failed test #1!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ray.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0, 0, -1));
|
||||||
|
if (!intersects(tri, ray)) {
|
||||||
|
std::cout << "Failed test #2!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0.1, 0.1, -1));
|
||||||
|
if (!intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #3!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0, 0, -1));
|
||||||
|
if (!intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #4!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0, 1, -1));
|
||||||
|
if (!intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #5!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(1, 0, -1));
|
||||||
|
if (!intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #6!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(1, 1, -1));
|
||||||
|
if (!intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #7!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// is exactly in the plane
|
||||||
|
// FIXME: cannot detect that yet ??
|
||||||
|
// lineSegment.set(SGVec3<T>(0, 0, 0), SGVec3<T>(1, 0, 0));
|
||||||
|
// if (!intersects(tri, lineSegment)) {
|
||||||
|
// std::cout << "Failed test #8!" << std::endl;
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// is exactly in the plane
|
||||||
|
// FIXME: cannot detect that yet ??
|
||||||
|
// lineSegment.set(SGVec3<T>(-1, 0, 0), SGVec3<T>(1, 0, 0));
|
||||||
|
// if (!intersects(tri, lineSegment)) {
|
||||||
|
// std::cout << "Failed test #9!" << std::endl;
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// is exactly paralell to the plane
|
||||||
|
// FIXME: cannot detect that yet ??
|
||||||
|
// lineSegment.set(SGVec3<T>(-1, 1, 0), SGVec3<T>(1, 1, 0));
|
||||||
|
// if (intersects(tri, lineSegment)) {
|
||||||
|
// std::cout << "Failed test #10!" << std::endl;
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// should fail since the line segment poins slightly beyond the triangle
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(1, 1, -0.9));
|
||||||
|
if (intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #11!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(0, -0.1, -1));
|
||||||
|
if (intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #12!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(-0.1, -0.1, -1));
|
||||||
|
if (intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #13!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineSegment.set(SGVec3<T>(0, 0, 1), SGVec3<T>(-0.1, 0, -1));
|
||||||
|
if (intersects(tri, lineSegment)) {
|
||||||
|
std::cout << "Failed test #14!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool
|
||||||
|
SphereLineIntersectionTest(void)
|
||||||
|
{
|
||||||
|
unsigned nTests = 100000;
|
||||||
|
unsigned failedCount = 0;
|
||||||
|
for (unsigned i = 0; i < nTests; ++i) {
|
||||||
|
SGVec3<T> center = rndVec3<T>();
|
||||||
|
T radius = 2*sg_random();
|
||||||
|
SGSphere<T> sphere(center, radius);
|
||||||
|
|
||||||
|
SGVec3<T> offset = normalize(rndVec3<T>());
|
||||||
|
T t = 4*sg_random();
|
||||||
|
|
||||||
|
// This one is the point we use to judge if the test should fail or not
|
||||||
|
SGVec3<T> base = center + t*offset;
|
||||||
|
|
||||||
|
SGVec3<T> per = perpendicular(offset);
|
||||||
|
SGVec3<T> start = base + 4*sg_random()*per;
|
||||||
|
SGVec3<T> end = base - 4*sg_random()*per;
|
||||||
|
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
lineSegment.set(start, end);
|
||||||
|
if (intersects(sphere, lineSegment)) {
|
||||||
|
if (radius < t) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false positive!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (t <= radius) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false negative!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SGRay<T> ray;
|
||||||
|
ray.set(start, end - start);
|
||||||
|
if (intersects(sphere, ray)) {
|
||||||
|
if (radius < t) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false positive!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (t <= radius) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false negative!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nTests < 100*failedCount) {
|
||||||
|
std::cout << "Failed sphere line intersection tests: " << failedCount
|
||||||
|
<< " tests out of " << nTests
|
||||||
|
<< " went wrong. Abort!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
failedCount = 0;
|
||||||
|
for (unsigned i = 0; i < nTests; ++i) {
|
||||||
|
SGVec3<T> center = rndVec3<T>();
|
||||||
|
T radius = 2*sg_random();
|
||||||
|
SGSphere<T> sphere(center, radius);
|
||||||
|
|
||||||
|
SGVec3<T> offset = normalize(rndVec3<T>());
|
||||||
|
T t = 4*sg_random();
|
||||||
|
|
||||||
|
// This one is the point we use to judge if the test should fail or not
|
||||||
|
SGVec3<T> base = center + t*offset;
|
||||||
|
|
||||||
|
SGVec3<T> start = base;
|
||||||
|
SGVec3<T> end = base + 2*sg_random()*offset;
|
||||||
|
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
lineSegment.set(start, end);
|
||||||
|
if (intersects(sphere, lineSegment)) {
|
||||||
|
if (radius < t) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false positive!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (t <= radius) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false negative!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SGRay<T> ray;
|
||||||
|
ray.set(start, end - start);
|
||||||
|
if (intersects(sphere, ray)) {
|
||||||
|
if (radius < t) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false positive!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (t <= radius) {
|
||||||
|
std::cout << "Failed sphere line intersection test #" << i
|
||||||
|
<< ": false negative!\nt = " << t << "\n"
|
||||||
|
<< sphere << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nTests < 100*failedCount) {
|
||||||
|
std::cout << "Failed sphere line intersection tests: " << failedCount
|
||||||
|
<< " tests out of " << nTests
|
||||||
|
<< " went wrong. Abort!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool
|
||||||
|
BoxLineIntersectionTest(void)
|
||||||
|
{
|
||||||
|
// ok, bad test case coverage, but better than nothing ...
|
||||||
|
|
||||||
|
unsigned nTests = 100000;
|
||||||
|
unsigned failedCount = 0;
|
||||||
|
for (unsigned i = 0; i < nTests; ++i) {
|
||||||
|
SGBox<T> box;
|
||||||
|
box.expandBy(rndVec3<T>());
|
||||||
|
box.expandBy(rndVec3<T>());
|
||||||
|
|
||||||
|
SGVec3<T> center = box.getCenter();
|
||||||
|
|
||||||
|
// This one is the point we use to judge if the test should fail or not
|
||||||
|
SGVec3<T> base = rndVec3<T>();
|
||||||
|
SGVec3<T> dir = base - center;
|
||||||
|
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
lineSegment.set(base, base + dir);
|
||||||
|
if (intersects(box, lineSegment)) {
|
||||||
|
if (!intersects(box, base)) {
|
||||||
|
std::cout << "Failed box line intersection test #" << i
|
||||||
|
<< ": false positive!\n"
|
||||||
|
<< box << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (intersects(box, base)) {
|
||||||
|
std::cout << "Failed box line intersection test #" << i
|
||||||
|
<< ": false negative!\n"
|
||||||
|
<< box << "\n" << lineSegment << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SGRay<T> ray;
|
||||||
|
ray.set(base, dir);
|
||||||
|
if (intersects(box, ray)) {
|
||||||
|
if (!intersects(box, base)) {
|
||||||
|
std::cout << "Failed box line intersection test #" << i
|
||||||
|
<< ": false positive!\n"
|
||||||
|
<< box << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (intersects(box, base)) {
|
||||||
|
std::cout << "Failed box line intersection test #" << i
|
||||||
|
<< ": false negative!\n"
|
||||||
|
<< box << "\n" << ray << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nTests < 100*failedCount) {
|
||||||
|
std::cout << "Failed box line intersection tests: " << failedCount
|
||||||
|
<< " tests out of " << nTests
|
||||||
|
<< " went wrong. Abort!" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
std::cout << "Testing Geometry intersection routines.\n"
|
||||||
|
<< "Some of these tests can fail due to roundoff problems...\n"
|
||||||
|
<< "Dont worry if only a few of them fail..." << std::endl;
|
||||||
|
|
||||||
|
if (!TriangleLineIntersectionTest<float>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
if (!TriangleLineIntersectionTest<double>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
if (!SphereLineIntersectionTest<float>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
if (!SphereLineIntersectionTest<double>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
if (!BoxLineIntersectionTest<float>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
if (!BoxLineIntersectionTest<double>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
std::cout << "Successfully passed all tests!" << std::endl;
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
@@ -0,0 +1,627 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGIntersect_HXX
|
||||||
|
#define SGIntersect_HXX
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGBox<T>& box, const SGSphere<T>& sphere)
|
||||||
|
{
|
||||||
|
if (sphere.empty())
|
||||||
|
return false;
|
||||||
|
// Is more or less trivially included in the next tests
|
||||||
|
// if (box.empty())
|
||||||
|
// return false;
|
||||||
|
|
||||||
|
if (sphere.getCenter().x() < box.getMin().x() - sphere.getRadius())
|
||||||
|
return false;
|
||||||
|
if (sphere.getCenter().y() < box.getMin().y() - sphere.getRadius())
|
||||||
|
return false;
|
||||||
|
if (sphere.getCenter().z() < box.getMin().z() - sphere.getRadius())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (box.getMax().x() + sphere.getRadius() < sphere.getCenter().x())
|
||||||
|
return false;
|
||||||
|
if (box.getMax().y() + sphere.getRadius() < sphere.getCenter().y())
|
||||||
|
return false;
|
||||||
|
if (box.getMax().z() + sphere.getRadius() < sphere.getCenter().z())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGSphere<T>& sphere, const SGBox<T>& box)
|
||||||
|
{ return intersects(box, sphere); }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGVec3<T>& v, const SGBox<T>& box)
|
||||||
|
{
|
||||||
|
if (v[0] < box.getMin()[0])
|
||||||
|
return false;
|
||||||
|
if (box.getMax()[0] < v[0])
|
||||||
|
return false;
|
||||||
|
if (v[1] < box.getMin()[1])
|
||||||
|
return false;
|
||||||
|
if (box.getMax()[1] < v[1])
|
||||||
|
return false;
|
||||||
|
if (v[2] < box.getMin()[2])
|
||||||
|
return false;
|
||||||
|
if (box.getMax()[2] < v[2])
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGBox<T>& box, const SGVec3<T>& v)
|
||||||
|
{ return intersects(v, box); }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGRay<T>& ray, const SGPlane<T>& plane)
|
||||||
|
{
|
||||||
|
// We compute the intersection point
|
||||||
|
// x = origin + \alpha*direction
|
||||||
|
// from the ray origin and non nomalized direction.
|
||||||
|
// For 0 <= \alpha the ray intersects the infinite plane.
|
||||||
|
// The intersection point x can also be written
|
||||||
|
// x = n*dist + y
|
||||||
|
// where n is the planes normal, dist is the distance of the plane from
|
||||||
|
// the origin in normal direction and y is ana aproriate vector
|
||||||
|
// perpendicular to n.
|
||||||
|
// Equate the x values and take the scalar product with the plane normal n.
|
||||||
|
// dot(n, origin) + \alpha*dot(n, direction) = dist
|
||||||
|
// We can now compute alpha from the above equation.
|
||||||
|
// \alpha = (dist - dot(n, origin))/dot(n, direction)
|
||||||
|
|
||||||
|
// The negative numerator for the \alpha expression
|
||||||
|
T num = plane.getPositiveDist();
|
||||||
|
num -= dot(plane.getNormal(), ray.getOrigin());
|
||||||
|
|
||||||
|
// If the numerator is zero, we have the rays origin included in the plane
|
||||||
|
if (fabs(num) <= SGLimits<T>::min())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// The denominator for the \alpha expression
|
||||||
|
T den = dot(plane.getNormal(), ray.getDirection());
|
||||||
|
|
||||||
|
// If we get here, we already know that the rays origin is not included
|
||||||
|
// in the plane. Thus if we have a zero denominator we have
|
||||||
|
// a ray paralell to the plane. That is no intersection.
|
||||||
|
if (fabs(den) <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// We would now compute \alpha = num/den and compare with 0 and 1.
|
||||||
|
// But to avoid that expensive division, check equation multiplied by
|
||||||
|
// the denominator.
|
||||||
|
T alphaDen = copysign(1, den)*num;
|
||||||
|
if (alphaDen < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGPlane<T>& plane, const SGRay<T>& ray)
|
||||||
|
{ return intersects(ray, plane); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(SGVec3<T>& dst, const SGRay<T>& ray, const SGPlane<T>& plane)
|
||||||
|
{
|
||||||
|
// We compute the intersection point
|
||||||
|
// x = origin + \alpha*direction
|
||||||
|
// from the ray origin and non nomalized direction.
|
||||||
|
// For 0 <= \alpha the ray intersects the infinite plane.
|
||||||
|
// The intersection point x can also be written
|
||||||
|
// x = n*dist + y
|
||||||
|
// where n is the planes normal, dist is the distance of the plane from
|
||||||
|
// the origin in normal direction and y is ana aproriate vector
|
||||||
|
// perpendicular to n.
|
||||||
|
// Equate the x values and take the scalar product with the plane normal n.
|
||||||
|
// dot(n, origin) + \alpha*dot(n, direction) = dist
|
||||||
|
// We can now compute alpha from the above equation.
|
||||||
|
// \alpha = (dist - dot(n, origin))/dot(n, direction)
|
||||||
|
|
||||||
|
// The negative numerator for the \alpha expression
|
||||||
|
T num = plane.getPositiveDist();
|
||||||
|
num -= dot(plane.getNormal(), ray.getOrigin());
|
||||||
|
|
||||||
|
// If the numerator is zero, we have the rays origin included in the plane
|
||||||
|
if (fabs(num) <= SGLimits<T>::min()) {
|
||||||
|
dst = ray.getOrigin();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The denominator for the \alpha expression
|
||||||
|
T den = dot(plane.getNormal(), ray.getDirection());
|
||||||
|
|
||||||
|
// If we get here, we already know that the rays origin is not included
|
||||||
|
// in the plane. Thus if we have a zero denominator we have
|
||||||
|
// a ray paralell to the plane. That is no intersection.
|
||||||
|
if (fabs(den) <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// We would now compute \alpha = num/den and compare with 0 and 1.
|
||||||
|
// But to avoid that expensive division, check equation multiplied by
|
||||||
|
// the denominator.
|
||||||
|
T alpha = num/den;
|
||||||
|
if (alpha < 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dst = ray.getOrigin() + alpha*ray.getDirection();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(SGVec3<T>& dst, const SGPlane<T>& plane, const SGRay<T>& ray)
|
||||||
|
{ return intersects(dst, ray, plane); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGLineSegment<T>& lineSegment, const SGPlane<T>& plane)
|
||||||
|
{
|
||||||
|
// We compute the intersection point
|
||||||
|
// x = origin + \alpha*direction
|
||||||
|
// from the line segments origin and non nomalized direction.
|
||||||
|
// For 0 <= \alpha <= 1 the line segment intersects the infinite plane.
|
||||||
|
// The intersection point x can also be written
|
||||||
|
// x = n*dist + y
|
||||||
|
// where n is the planes normal, dist is the distance of the plane from
|
||||||
|
// the origin in normal direction and y is ana aproriate vector
|
||||||
|
// perpendicular to n.
|
||||||
|
// Equate the x values and take the scalar product with the plane normal n.
|
||||||
|
// dot(n, origin) + \alpha*dot(n, direction) = dist
|
||||||
|
// We can now compute alpha from the above equation.
|
||||||
|
// \alpha = (dist - dot(n, origin))/dot(n, direction)
|
||||||
|
|
||||||
|
// The negative numerator for the \alpha expression
|
||||||
|
T num = plane.getPositiveDist();
|
||||||
|
num -= dot(plane.getNormal(), lineSegment.getOrigin());
|
||||||
|
|
||||||
|
// If the numerator is zero, we have the lines origin included in the plane
|
||||||
|
if (fabs(num) <= SGLimits<T>::min())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// The denominator for the \alpha expression
|
||||||
|
T den = dot(plane.getNormal(), lineSegment.getDirection());
|
||||||
|
|
||||||
|
// If we get here, we already know that the lines origin is not included
|
||||||
|
// in the plane. Thus if we have a zero denominator we have
|
||||||
|
// a line paralell to the plane. That is no intersection.
|
||||||
|
if (fabs(den) <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// We would now compute \alpha = num/den and compare with 0 and 1.
|
||||||
|
// But to avoid that expensive division, compare equations
|
||||||
|
// multiplied by |den|. Note that copysign is usually a compiler intrinsic
|
||||||
|
// that expands in assembler code that not even stalls the cpus pipes.
|
||||||
|
T alphaDen = copysign(1, den)*num;
|
||||||
|
if (alphaDen < 0)
|
||||||
|
return false;
|
||||||
|
if (den < alphaDen)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGPlane<T>& plane, const SGLineSegment<T>& lineSegment)
|
||||||
|
{ return intersects(lineSegment, plane); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(SGVec3<T>& dst, const SGLineSegment<T>& lineSegment, const SGPlane<T>& plane)
|
||||||
|
{
|
||||||
|
// We compute the intersection point
|
||||||
|
// x = origin + \alpha*direction
|
||||||
|
// from the line segments origin and non nomalized direction.
|
||||||
|
// For 0 <= \alpha <= 1 the line segment intersects the infinite plane.
|
||||||
|
// The intersection point x can also be written
|
||||||
|
// x = n*dist + y
|
||||||
|
// where n is the planes normal, dist is the distance of the plane from
|
||||||
|
// the origin in normal direction and y is an aproriate vector
|
||||||
|
// perpendicular to n.
|
||||||
|
// Equate the x values and take the scalar product with the plane normal n.
|
||||||
|
// dot(n, origin) + \alpha*dot(n, direction) = dist
|
||||||
|
// We can now compute alpha from the above equation.
|
||||||
|
// \alpha = (dist - dot(n, origin))/dot(n, direction)
|
||||||
|
|
||||||
|
// The negative numerator for the \alpha expression
|
||||||
|
T num = plane.getPositiveDist();
|
||||||
|
num -= dot(plane.getNormal(), lineSegment.getOrigin());
|
||||||
|
|
||||||
|
// If the numerator is zero, we have the lines origin included in the plane
|
||||||
|
if (fabs(num) <= SGLimits<T>::min()) {
|
||||||
|
dst = lineSegment.getOrigin();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The denominator for the \alpha expression
|
||||||
|
T den = dot(plane.getNormal(), lineSegment.getDirection());
|
||||||
|
|
||||||
|
// If we get here, we already know that the lines origin is not included
|
||||||
|
// in the plane. Thus if we have a zero denominator we have
|
||||||
|
// a line paralell to the plane. That is: no intersection.
|
||||||
|
if (fabs(den) <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// We would now compute \alpha = num/den and compare with 0 and 1.
|
||||||
|
// But to avoid that expensive division, check equation multiplied by
|
||||||
|
// the denominator. FIXME: shall we do so? or compute like that?
|
||||||
|
T alpha = num/den;
|
||||||
|
if (alpha < 0)
|
||||||
|
return false;
|
||||||
|
if (1 < alpha)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
dst = lineSegment.getOrigin() + alpha*lineSegment.getDirection();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(SGVec3<T>& dst, const SGPlane<T>& plane, const SGLineSegment<T>& lineSegment)
|
||||||
|
{ return intersects(dst, lineSegment, plane); }
|
||||||
|
|
||||||
|
|
||||||
|
// Distance of a line segment to a point
|
||||||
|
template<typename T>
|
||||||
|
inline T
|
||||||
|
distSqr(const SGLineSegment<T>& lineSeg, const SGVec3<T>& p)
|
||||||
|
{
|
||||||
|
SGVec3<T> ps = p - lineSeg.getStart();
|
||||||
|
|
||||||
|
T psdotdir = dot(ps, lineSeg.getDirection());
|
||||||
|
if (psdotdir <= 0)
|
||||||
|
return dot(ps, ps);
|
||||||
|
|
||||||
|
SGVec3<T> pe = p - lineSeg.getEnd();
|
||||||
|
if (0 <= dot(pe, lineSeg.getDirection()))
|
||||||
|
return dot(pe, pe);
|
||||||
|
|
||||||
|
return dot(ps, ps) - psdotdir*psdotdir/dot(lineSeg.getDirection(), lineSeg.getDirection());
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline T
|
||||||
|
distSqr(const SGVec3<T>& p, const SGLineSegment<T>& lineSeg)
|
||||||
|
{ return distSqr(lineSeg, p); }
|
||||||
|
// with sqrt
|
||||||
|
template<typename T>
|
||||||
|
inline T
|
||||||
|
dist(const SGVec3<T>& p, const SGLineSegment<T>& lineSeg)
|
||||||
|
{ return sqrt(distSqr(lineSeg, p)); }
|
||||||
|
template<typename T>
|
||||||
|
inline T
|
||||||
|
dist(const SGLineSegment<T>& lineSeg, const SGVec3<T>& p)
|
||||||
|
{ return sqrt(distSqr(lineSeg, p)); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGRay<T>& ray, const SGSphere<T>& sphere)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering,
|
||||||
|
// second edition, page 571
|
||||||
|
SGVec3<T> l = sphere.getCenter() - ray.getOrigin();
|
||||||
|
T s = dot(l, ray.getDirection());
|
||||||
|
T l2 = dot(l, l);
|
||||||
|
|
||||||
|
T r2 = sphere.getRadius2();
|
||||||
|
if (s < 0 && l2 > r2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
T d2 = dot(ray.getDirection(), ray.getDirection());
|
||||||
|
// The original test would read
|
||||||
|
// T m2 = l2 - s*s/d2;
|
||||||
|
// if (m2 > r2)
|
||||||
|
// return false;
|
||||||
|
// but to avoid the expensive division, we multiply by d2
|
||||||
|
T m2 = d2*l2 - s*s;
|
||||||
|
if (m2 > d2*r2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGSphere<T>& sphere, const SGRay<T>& ray)
|
||||||
|
{ return intersects(ray, sphere); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGLineSegment<T>& lineSegment, const SGSphere<T>& sphere)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering,
|
||||||
|
// second edition, page 571
|
||||||
|
SGVec3<T> l = sphere.getCenter() - lineSegment.getStart();
|
||||||
|
T ld = length(lineSegment.getDirection());
|
||||||
|
T s = dot(l, lineSegment.getDirection())/ld;
|
||||||
|
T l2 = dot(l, l);
|
||||||
|
|
||||||
|
T r2 = sphere.getRadius2();
|
||||||
|
if (s < 0 && l2 > r2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
T m2 = l2 - s*s;
|
||||||
|
if (m2 > r2)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
T q = sqrt(r2 - m2);
|
||||||
|
T t = s - q;
|
||||||
|
if (ld < t)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGSphere<T>& sphere, const SGLineSegment<T>& lineSegment)
|
||||||
|
{ return intersects(lineSegment, sphere); }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
// FIXME do not use that default argument later. Just for development now
|
||||||
|
intersects(SGVec3<T>& x, const SGTriangle<T>& tri, const SGRay<T>& ray, T eps = 0)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering
|
||||||
|
|
||||||
|
// Method based on the observation that we are looking for a
|
||||||
|
// point x that can be expressed in terms of the triangle points
|
||||||
|
// x = v_0 + u*(v_1 - v_0) + v*(v_2 - v_0)
|
||||||
|
// with 0 <= u, v and u + v <= 1.
|
||||||
|
// OTOH it could be expressed in terms of the ray
|
||||||
|
// x = o + t*d
|
||||||
|
// Now we can compute u, v and t.
|
||||||
|
SGVec3<T> p = cross(ray.getDirection(), tri.getEdge(1));
|
||||||
|
|
||||||
|
T denom = dot(p, tri.getEdge(0));
|
||||||
|
T signDenom = copysign(1, denom);
|
||||||
|
|
||||||
|
SGVec3<T> s = ray.getOrigin() - tri.getBaseVertex();
|
||||||
|
SGVec3<T> q = cross(s, tri.getEdge(0));
|
||||||
|
// Now t would read
|
||||||
|
// t = 1/denom*dot(q, tri.getEdge(1));
|
||||||
|
// To avoid an expensive division we multiply by |denom|
|
||||||
|
T tDenom = signDenom*dot(q, tri.getEdge(1));
|
||||||
|
if (tDenom < 0)
|
||||||
|
return false;
|
||||||
|
// For line segment we would test against
|
||||||
|
// if (1 < t)
|
||||||
|
// return false;
|
||||||
|
// with the original t. The multiplied test would read
|
||||||
|
// if (absDenom < tDenom)
|
||||||
|
// return false;
|
||||||
|
|
||||||
|
T absDenom = fabs(denom);
|
||||||
|
T absDenomEps = absDenom*eps;
|
||||||
|
|
||||||
|
// T u = 1/denom*dot(p, s);
|
||||||
|
T u = signDenom*dot(p, s);
|
||||||
|
if (u < -absDenomEps)
|
||||||
|
return false;
|
||||||
|
// T v = 1/denom*dot(q, d);
|
||||||
|
// if (v < -eps)
|
||||||
|
// return false;
|
||||||
|
T v = signDenom*dot(q, ray.getDirection());
|
||||||
|
if (v < -absDenomEps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (u + v > absDenom + absDenomEps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// return if paralell ??? FIXME what if paralell and in plane?
|
||||||
|
// may be we are ok below than anyway??
|
||||||
|
if (absDenom <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
x = ray.getOrigin();
|
||||||
|
// if we have survived here it could only happen with denom == 0
|
||||||
|
// that the point is already in plane. Then return the origin ...
|
||||||
|
if (SGLimitsd::min() < absDenom)
|
||||||
|
x += (tDenom/absDenom)*ray.getDirection();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGTriangle<T>& tri, const SGRay<T>& ray, T eps = 0)
|
||||||
|
{
|
||||||
|
// FIXME: for now just wrap the other method. When that has prooven
|
||||||
|
// well optimized, implement that special case
|
||||||
|
SGVec3<T> dummy;
|
||||||
|
return intersects(dummy, tri, ray, eps);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
// FIXME do not use that default argument later. Just for development now
|
||||||
|
intersects(SGVec3<T>& x, const SGTriangle<T>& tri, const SGLineSegment<T>& lineSegment, T eps = 0)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering
|
||||||
|
|
||||||
|
// Method based on the observation that we are looking for a
|
||||||
|
// point x that can be expressed in terms of the triangle points
|
||||||
|
// x = v_0 + u*(v_1 - v_0) + v*(v_2 - v_0)
|
||||||
|
// with 0 <= u, v and u + v <= 1.
|
||||||
|
// OTOH it could be expressed in terms of the lineSegment
|
||||||
|
// x = o + t*d
|
||||||
|
// Now we can compute u, v and t.
|
||||||
|
SGVec3<T> p = cross(lineSegment.getDirection(), tri.getEdge(1));
|
||||||
|
|
||||||
|
T denom = dot(p, tri.getEdge(0));
|
||||||
|
T signDenom = copysign(1, denom);
|
||||||
|
|
||||||
|
SGVec3<T> s = lineSegment.getStart() - tri.getBaseVertex();
|
||||||
|
SGVec3<T> q = cross(s, tri.getEdge(0));
|
||||||
|
// Now t would read
|
||||||
|
// t = 1/denom*dot(q, tri.getEdge(1));
|
||||||
|
// To avoid an expensive division we multiply by |denom|
|
||||||
|
T tDenom = signDenom*dot(q, tri.getEdge(1));
|
||||||
|
if (tDenom < 0)
|
||||||
|
return false;
|
||||||
|
// For line segment we would test against
|
||||||
|
// if (1 < t)
|
||||||
|
// return false;
|
||||||
|
// with the original t. The multiplied test reads
|
||||||
|
T absDenom = fabs(denom);
|
||||||
|
if (absDenom < tDenom)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// take the CPU accuracy in account
|
||||||
|
T absDenomEps = absDenom*eps;
|
||||||
|
|
||||||
|
// T u = 1/denom*dot(p, s);
|
||||||
|
T u = signDenom*dot(p, s);
|
||||||
|
if (u < -absDenomEps)
|
||||||
|
return false;
|
||||||
|
// T v = 1/denom*dot(q, d);
|
||||||
|
// if (v < -eps)
|
||||||
|
// return false;
|
||||||
|
T v = signDenom*dot(q, lineSegment.getDirection());
|
||||||
|
if (v < -absDenomEps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (u + v > absDenom + absDenomEps)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// return if paralell ??? FIXME what if paralell and in plane?
|
||||||
|
// may be we are ok below than anyway??
|
||||||
|
if (absDenom <= SGLimits<T>::min())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
x = lineSegment.getStart();
|
||||||
|
// if we have survived here it could only happen with denom == 0
|
||||||
|
// that the point is already in plane. Then return the origin ...
|
||||||
|
if (SGLimitsd::min() < absDenom)
|
||||||
|
x += (tDenom/absDenom)*lineSegment.getDirection();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGTriangle<T>& tri, const SGLineSegment<T>& lineSegment, T eps = 0)
|
||||||
|
{
|
||||||
|
// FIXME: for now just wrap the othr method. When that has prooven
|
||||||
|
// well optimized, implement that special case
|
||||||
|
SGVec3<T> dummy;
|
||||||
|
return intersects(dummy, tri, lineSegment, eps);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGVec3<T>& v, const SGSphere<T>& sphere)
|
||||||
|
{
|
||||||
|
if (sphere.empty())
|
||||||
|
return false;
|
||||||
|
return distSqr(v, sphere.getCenter()) <= sphere.getRadius2();
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGSphere<T>& sphere, const SGVec3<T>& v)
|
||||||
|
{ return intersects(v, sphere); }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGBox<T>& box, const SGLineSegment<T>& lineSegment)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering
|
||||||
|
|
||||||
|
SGVec3<T> c = lineSegment.getCenter() - box.getCenter();
|
||||||
|
SGVec3<T> w = 0.5*lineSegment.getDirection();
|
||||||
|
SGVec3<T> v(fabs(w.x()), fabs(w.y()), fabs(w.z()));
|
||||||
|
SGVec3<T> h = 0.5*box.getSize();
|
||||||
|
|
||||||
|
if (fabs(c[0]) > v[0] + h[0])
|
||||||
|
return false;
|
||||||
|
if (fabs(c[1]) > v[1] + h[1])
|
||||||
|
return false;
|
||||||
|
if (fabs(c[2]) > v[2] + h[2])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (fabs(c[1]*w[2] - c[2]*w[1]) > h[1]*v[2] + h[2]*v[1])
|
||||||
|
return false;
|
||||||
|
if (fabs(c[0]*w[2] - c[2]*w[0]) > h[0]*v[2] + h[2]*v[0])
|
||||||
|
return false;
|
||||||
|
if (fabs(c[0]*w[1] - c[1]*w[0]) > h[0]*v[1] + h[1]*v[0])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGLineSegment<T>& lineSegment, const SGBox<T>& box)
|
||||||
|
{ return intersects(box, lineSegment); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGBox<T>& box, const SGRay<T>& ray)
|
||||||
|
{
|
||||||
|
// See Tomas Akeniene - Moeller/Eric Haines: Real Time Rendering
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 3; ++i) {
|
||||||
|
T cMin = box.getMin()[i];
|
||||||
|
T cMax = box.getMax()[i];
|
||||||
|
|
||||||
|
T cOrigin = ray.getOrigin()[i];
|
||||||
|
|
||||||
|
T cDir = ray.getDirection()[i];
|
||||||
|
if (fabs(cDir) <= SGLimits<T>::min()) {
|
||||||
|
if (cOrigin < cMin)
|
||||||
|
return false;
|
||||||
|
if (cMax < cOrigin)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
T nearr = - SGLimits<T>::max();
|
||||||
|
T farr = SGLimits<T>::max();
|
||||||
|
|
||||||
|
T T1 = (cMin - cOrigin) / cDir;
|
||||||
|
T T2 = (cMax - cOrigin) / cDir;
|
||||||
|
if (T1 > T2) std::swap (T1, T2);/* since T1 intersection with near plane */
|
||||||
|
if (T1 > nearr) nearr = T1; /* want largest Tnear */
|
||||||
|
if (T2 < farr) farr = T2; /* want smallest Tfarr */
|
||||||
|
if (nearr > farr) // farr box is missed
|
||||||
|
return false;
|
||||||
|
if (farr < 0) // box is behind ray
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// make it symmetric
|
||||||
|
template<typename T>
|
||||||
|
inline bool
|
||||||
|
intersects(const SGRay<T>& ray, const SGBox<T>& box)
|
||||||
|
{ return intersects(box, ray); }
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGLimits_H
|
||||||
|
#define SGLimits_H
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
/// Helper class for epsilon and so on
|
||||||
|
/// This is the possible place to hook in for machines not
|
||||||
|
/// providing numeric_limits ...
|
||||||
|
template<typename T>
|
||||||
|
class SGLimits : public std::numeric_limits<T> {};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
// Copyright (C) 2006 Mathias Froehlich - Mathias.Froehlich@web.de
|
||||||
|
//
|
||||||
|
// This library is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Library General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 2 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// Library General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SGLineSegment_H
|
||||||
|
#define SGLineSegment_H
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class SGLineSegment {
|
||||||
|
public:
|
||||||
|
SGLineSegment()
|
||||||
|
{ }
|
||||||
|
SGLineSegment(const SGVec3<T>& start, const SGVec3<T>& end) :
|
||||||
|
_start(start),
|
||||||
|
_direction(end - start)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void set(const SGVec3<T>& start, const SGVec3<T>& end)
|
||||||
|
{ _start = start; _direction = end - start; }
|
||||||
|
|
||||||
|
const SGVec3<T>& getStart() const
|
||||||
|
{ return _start; }
|
||||||
|
SGVec3<T> getEnd() const
|
||||||
|
{ return _start + _direction; }
|
||||||
|
const SGVec3<T>& getDirection() const
|
||||||
|
{ return _direction; }
|
||||||
|
SGVec3<T> getNormalizedDirection() const
|
||||||
|
{ return normalize(getDirection()); }
|
||||||
|
|
||||||
|
SGVec3<T> getCenter() const
|
||||||
|
{ return _start + T(0.5)*_direction; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
SGVec3<T> _start;
|
||||||
|
SGVec3<T> _direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Output to an ostream
|
||||||
|
template<typename char_type, typename traits_type, typename T>
|
||||||
|
inline
|
||||||
|
std::basic_ostream<char_type, traits_type>&
|
||||||
|
operator<<(std::basic_ostream<char_type, traits_type>& s,
|
||||||
|
const SGLineSegment<T>& lineSegment)
|
||||||
|
{
|
||||||
|
return s << "line segment: start = " << lineSegment.getStart()
|
||||||
|
<< ", end = " << lineSegment.getEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user