Compare commits
1081
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b0ba10b0b | ||
|
|
9f9c4cf32c | ||
|
|
536ebf604f | ||
|
|
03a616b737 | ||
|
|
0b05f67114 | ||
|
|
0ede690580 | ||
|
|
d81545a871 | ||
|
|
1cda1fc201 | ||
|
|
490dad7838 | ||
|
|
13ecbb8bce | ||
|
|
3346bfc9a8 | ||
|
|
c5de65f115 | ||
|
|
4fffcf9975 | ||
|
|
8962d9b293 | ||
|
|
050c1560e8 | ||
|
|
68b3041f50 | ||
|
|
1ddd153399 | ||
|
|
df0a60caae | ||
|
|
675c86582d | ||
|
|
e6d01ed1a3 | ||
|
|
d8d1064e05 | ||
|
|
5d04cb81ba | ||
|
|
5d5906e980 | ||
|
|
2e7b862ad3 | ||
|
|
ad86e22824 | ||
|
|
536b8a213b | ||
|
|
2e13877926 | ||
|
|
967d63dec4 | ||
|
|
573c4268b6 | ||
|
|
f19e83dcf1 | ||
|
|
caabe8fc87 | ||
|
|
7c4e5309fc | ||
|
|
542124e90c | ||
|
|
e0d02be0f5 | ||
|
|
461e6d1b5b | ||
|
|
d767e6d7eb | ||
|
|
bff1584012 | ||
|
|
3d91a11b95 | ||
|
|
1349b46a8c | ||
|
|
74330ba1dd | ||
|
|
64ab227f62 | ||
|
|
1c51fbd1b4 | ||
|
|
4c2dd553f2 | ||
|
|
2fb985afa4 | ||
|
|
44c93d5074 | ||
|
|
dcf07a46aa | ||
|
|
284a9e0612 | ||
|
|
60349a8690 | ||
|
|
64072be83c | ||
|
|
229abb8412 | ||
|
|
7b1d1fd288 | ||
|
|
1ca1f6ad22 | ||
|
|
0ad66f4bc4 | ||
|
|
d5757c4fb8 | ||
|
|
7fe40bce86 | ||
|
|
5da3d64ede | ||
|
|
2e93b06ac0 | ||
|
|
1e6aa4b40f | ||
|
|
262383395d | ||
|
|
127226c421 | ||
|
|
fabcb021cb | ||
|
|
60ab1ab83e | ||
|
|
1f37095087 | ||
|
|
93c2f70b64 | ||
|
|
b0562df6bb | ||
|
|
65d6a5c774 | ||
|
|
650af0f7b0 | ||
|
|
cf9de25c25 | ||
|
|
fc4009aa50 | ||
|
|
d04cf4d897 | ||
|
|
2e45c67ef2 | ||
|
|
b6d8e1f842 | ||
|
|
284bc364fe | ||
|
|
a050654b4c | ||
|
|
7311dae483 | ||
|
|
c57c3cd1d3 | ||
|
|
3ec5e85485 | ||
|
|
ff95af0367 | ||
|
|
aa9c7d5435 | ||
|
|
dcc9f33357 | ||
|
|
1ace645505 | ||
|
|
dc2b87dce1 | ||
|
|
8e47f5d494 | ||
|
|
333d381f41 | ||
|
|
f9b064cc19 | ||
|
|
116a6c1b2e | ||
|
|
c4506b8e6c | ||
|
|
6786a7be4a | ||
|
|
bb370a304d | ||
|
|
fdcf53c688 | ||
|
|
d3f575547c | ||
|
|
68797e51c6 | ||
|
|
c76c55cdee | ||
|
|
f529ec3018 | ||
|
|
ad667be0d7 | ||
|
|
133fa09261 | ||
|
|
acf19cebf8 | ||
|
|
5dfa4c0840 | ||
|
|
f918602f58 | ||
|
|
2cf2dd24a4 | ||
|
|
eefb069d08 | ||
|
|
3dcffc7df8 | ||
|
|
b121277142 | ||
|
|
d283fcf7b4 | ||
|
|
e7f151ad02 | ||
|
|
0710b781d3 | ||
|
|
7c01ad6917 | ||
|
|
56d2f06631 | ||
|
|
9e47911b19 | ||
|
|
ef80497fbe | ||
|
|
e22cf106c2 | ||
|
|
5ffb270ec1 | ||
|
|
f85f3b0f25 | ||
|
|
e7ec83d626 | ||
|
|
11479cd8c3 | ||
|
|
176e760de1 | ||
|
|
430c60ed1a | ||
|
|
dfea3623f6 | ||
|
|
b38783e4cb | ||
|
|
9382a4c21b | ||
|
|
3cd4c5566f | ||
|
|
601c0977df | ||
|
|
c56f036bab | ||
|
|
44dd50c0ef | ||
|
|
56919ae45f | ||
|
|
6c14e7127d | ||
|
|
578af00b0d | ||
|
|
d6c0bf69b6 | ||
|
|
e8884b4ec0 | ||
|
|
5e79609955 | ||
|
|
4950c96f1c | ||
|
|
51b0cf535e | ||
|
|
4cc17a7f6e | ||
|
|
dca07c5634 | ||
|
|
fd42294faf | ||
|
|
c1246e8c4e | ||
|
|
59fc902cfb | ||
|
|
1fe9755d01 | ||
|
|
1da09a4706 | ||
|
|
f3c591469b | ||
|
|
b1200f9f59 | ||
|
|
47617d6c04 | ||
|
|
4794ab6095 | ||
|
|
bc85767f19 | ||
|
|
e37c218c2a | ||
|
|
a0aaa23904 | ||
|
|
27a6c72091 | ||
|
|
2dcc66f03e | ||
|
|
d70a05a088 | ||
|
|
c2317edf8a | ||
|
|
cb7ac404d9 | ||
|
|
5abc6c995f | ||
|
|
0f21c39e49 | ||
|
|
f6513127ce | ||
|
|
ddd72b2b37 | ||
|
|
7f5df1fb66 | ||
|
|
2e71b64de1 | ||
|
|
45f1f9263f | ||
|
|
878288f06a | ||
|
|
406cdf8d16 | ||
|
|
5b28b024ae | ||
|
|
7c693d8107 | ||
|
|
b8a6d1ac4d | ||
|
|
40533f50df | ||
|
|
539ced191b | ||
|
|
1a400b890b | ||
|
|
ebe5a5579c | ||
|
|
afb18ca75b | ||
|
|
01c62932bd | ||
|
|
6cd8db7b28 | ||
|
|
bb46d91bc6 | ||
|
|
3cd5322496 | ||
|
|
cadecdcab7 | ||
|
|
cd4030b7db | ||
|
|
0a2264cad4 | ||
|
|
bb2a02daa8 | ||
|
|
5991195062 | ||
|
|
54c4055af3 | ||
|
|
cb07210bc7 | ||
|
|
3e40d624a8 | ||
|
|
63ce675914 | ||
|
|
14e5e87a4d | ||
|
|
e7e81c6639 | ||
|
|
23d0601d82 | ||
|
|
6db9138eeb | ||
|
|
6a7c200002 | ||
|
|
e3f70b7125 | ||
|
|
a25e859fa7 | ||
|
|
5b2af1f6b3 | ||
|
|
59df72c4b0 | ||
|
|
4e2eb2f24c | ||
|
|
b905f4b8aa | ||
|
|
fefe87ed1e | ||
|
|
b66905c2f6 | ||
|
|
39472e4d81 | ||
|
|
85fba1325a | ||
|
|
0f39f05fa1 | ||
|
|
8d551c2664 | ||
|
|
346a22f684 | ||
|
|
b1571e4437 | ||
|
|
5ac2abe3ab | ||
|
|
5b15426cc6 | ||
|
|
1ac944b7c1 | ||
|
|
fd90dbb123 | ||
|
|
6ccad91537 | ||
|
|
c89db53ebf | ||
|
|
4ffd70a42a | ||
|
|
bbeb48a60d | ||
|
|
aefe9bc116 | ||
|
|
bcb95f647d | ||
|
|
145a7fa146 | ||
|
|
06f0b6030a | ||
|
|
191ee3a0ed | ||
|
|
f6358694ae | ||
|
|
af14d65a98 | ||
|
|
9fe75dc521 | ||
|
|
0051bea034 | ||
|
|
76c79dba8e | ||
|
|
84dc82506a | ||
|
|
ae1625734c | ||
|
|
e2ce4c0fa9 | ||
|
|
a06a15e769 | ||
|
|
7c5de29b61 | ||
|
|
5f9befebae | ||
|
|
6a7b885891 | ||
|
|
cd8e7bbdca | ||
|
|
5d731ad8c3 | ||
|
|
7964270929 | ||
|
|
ea513d392e | ||
|
|
feba9024eb | ||
|
|
b3e16ce8e0 | ||
|
|
31dd77c694 | ||
|
|
ae58f89fbf | ||
|
|
b3bc36b253 | ||
|
|
7287509fef | ||
|
|
b1c49045a8 | ||
|
|
0d5634475c | ||
|
|
e6bfe7d40c | ||
|
|
811cd0653f | ||
|
|
e2b8a21ff5 | ||
|
|
24c7941f65 | ||
|
|
600a9ee4c5 | ||
|
|
fdfdfedf01 | ||
|
|
a67688322d | ||
|
|
6fe057e277 | ||
|
|
f23e8bfb02 | ||
|
|
eab9da98f2 | ||
|
|
f161992836 | ||
|
|
40e13b91fe | ||
|
|
af6824605b | ||
|
|
babf58f8d2 | ||
|
|
968f5d7693 | ||
|
|
4cc6bd69ae | ||
|
|
199437e859 | ||
|
|
e5fac0a01d | ||
|
|
5d14b84969 | ||
|
|
bcccd06cee | ||
|
|
6b0ab9a49a | ||
|
|
023002ae73 | ||
|
|
579d384c04 | ||
|
|
e2e1524454 | ||
|
|
4a5853c1c2 | ||
|
|
64756d14d0 | ||
|
|
bac2ef601d | ||
|
|
cf3bab89f9 | ||
|
|
dfe41ad984 | ||
|
|
b784bebaa9 | ||
|
|
bcf727cf58 | ||
|
|
ecd0a53412 | ||
|
|
3456434e37 | ||
|
|
454c5b1ed2 | ||
|
|
dc2c437a1a | ||
|
|
819d3f5ded | ||
|
|
4f802689f2 | ||
|
|
9cbbe55598 | ||
|
|
7e2dafdcb8 | ||
|
|
c7873d68f7 | ||
|
|
939ec526a8 | ||
|
|
b20a635db0 | ||
|
|
a656bee0df | ||
|
|
42f07e3f14 | ||
|
|
5803b05bd5 | ||
|
|
ccf0ba50c4 | ||
|
|
f3bc977d32 | ||
|
|
80609e0816 | ||
|
|
795d481ca6 | ||
|
|
1b936b9af8 | ||
|
|
f141cc28b0 | ||
|
|
4cb64b58be | ||
|
|
028af34d3d | ||
|
|
ce54997be5 | ||
|
|
3d213fa713 | ||
|
|
e71f3790ce | ||
|
|
67b9cba4d3 | ||
|
|
78a471f684 | ||
|
|
d4289c5d54 | ||
|
|
0c17c5440a | ||
|
|
c4116da564 | ||
|
|
d0821953bb | ||
|
|
e782adef94 | ||
|
|
d3572c2562 | ||
|
|
1f3838b155 | ||
|
|
6aa459073e | ||
|
|
0932c33185 | ||
|
|
5e542aa841 | ||
|
|
6d53abd5af | ||
|
|
3ea58bf8db | ||
|
|
71a4c2c3d2 | ||
|
|
a3e391a523 | ||
|
|
9cb15b302c | ||
|
|
15c1a28d37 | ||
|
|
d3a500e54e | ||
|
|
a0a5eb8aef | ||
|
|
a92955eade | ||
|
|
f043f3d4f9 | ||
|
|
992a057a1b | ||
|
|
07da1e7e1a | ||
|
|
2c07222ef6 | ||
|
|
918e315d47 | ||
|
|
c824731bc6 | ||
|
|
0c39caa622 | ||
|
|
1f1e28baf8 | ||
|
|
0c303389d6 | ||
|
|
01a896ef5b | ||
|
|
0e5e760135 | ||
|
|
7e7d877874 | ||
|
|
57ccb6fd6b | ||
|
|
efa2876e29 | ||
|
|
59ef7d8fd1 | ||
|
|
1f308c9ec3 | ||
|
|
4943d3aa53 | ||
|
|
828d561113 | ||
|
|
fcf72a7123 | ||
|
|
d3f5bc6e2d | ||
|
|
f525a05be8 | ||
|
|
fc7ec4299e | ||
|
|
21d053b1b6 | ||
|
|
68e64a5aa7 | ||
|
|
8e718fe288 | ||
|
|
efec9070e1 | ||
|
|
e3646d4d4a | ||
|
|
4219f16f61 | ||
|
|
c3b1802e95 | ||
|
|
40fe078021 | ||
|
|
a5a6600e74 | ||
|
|
03b9303f22 | ||
|
|
b5a59ea6f9 | ||
|
|
c6b2124129 | ||
|
|
d320a6facb | ||
|
|
0793c2cb8c | ||
|
|
d14755abb8 | ||
|
|
abd4aa2e6b | ||
|
|
58417e78e5 | ||
|
|
390eb1c6e9 | ||
|
|
d4c6530a72 | ||
|
|
ff17b44a41 | ||
|
|
5bd2d47571 | ||
|
|
f8e475cd34 | ||
|
|
a05e063949 | ||
|
|
eb06a90109 | ||
|
|
e2f6632fee | ||
|
|
5c5c583dcc | ||
|
|
0d8d5c02d0 | ||
|
|
382e0c6ad2 | ||
|
|
a8d1c44408 | ||
|
|
78b4318c34 | ||
|
|
b47031a099 | ||
|
|
0f7b65a921 | ||
|
|
33f7903aeb | ||
|
|
f3c2740917 | ||
|
|
09a57c7a52 | ||
|
|
9068f0606e | ||
|
|
c577b7e369 | ||
|
|
5850464ba7 | ||
|
|
50e240d5e4 | ||
|
|
75c2a45b25 | ||
|
|
c958d63897 | ||
|
|
b633b8d0d3 | ||
|
|
76948416a9 | ||
|
|
f4a527c57c | ||
|
|
c491baff0e | ||
|
|
6d05fc6f57 | ||
|
|
ca53add820 | ||
|
|
6fe3099ab4 | ||
|
|
a34eceb327 | ||
|
|
c9042c3186 | ||
|
|
b46fe0d51c | ||
|
|
6d1d3173fe | ||
|
|
030d044d03 | ||
|
|
29fb8e0f74 | ||
|
|
6e326976d5 | ||
|
|
03a7d72a62 | ||
|
|
f913febd71 | ||
|
|
daa0fbdc6b | ||
|
|
d4c52b599d | ||
|
|
ec88373eb7 | ||
|
|
4286cafdeb | ||
|
|
3880d8e2f2 | ||
|
|
671c84ad44 | ||
|
|
a0d687bb24 | ||
|
|
704385ff0a | ||
|
|
81a657edec | ||
|
|
9d0bad29c0 | ||
|
|
2fb8e32104 | ||
|
|
c522e499b2 | ||
|
|
4700955480 | ||
|
|
2c66081fa4 | ||
|
|
855e88da43 | ||
|
|
ad302db9a8 | ||
|
|
bfa5fff500 | ||
|
|
01c64fd554 | ||
|
|
13a2b92a32 | ||
|
|
29e79f8f61 | ||
|
|
8f7527ede0 | ||
|
|
7cd149a4d8 | ||
|
|
e45912fd8a | ||
|
|
56c4ba67c6 | ||
|
|
7e7ce2f38e | ||
|
|
7dc9eba2d0 | ||
|
|
f91d96b51a | ||
|
|
bc19609147 | ||
|
|
1ccaf3a0bd | ||
|
|
03bfd829da | ||
|
|
e1f7a1e0a0 | ||
|
|
ceeac0ecf0 | ||
|
|
c9d0eac739 | ||
|
|
8f24d924ee | ||
|
|
8537cc9edf | ||
|
|
58f3985567 | ||
|
|
872db67f21 | ||
|
|
006f90997a | ||
|
|
26b4776394 | ||
|
|
66c64459e6 | ||
|
|
dc8657f57f | ||
|
|
9d647b90e0 | ||
|
|
f5730c950b | ||
|
|
15d37daebd | ||
|
|
795c9876af | ||
|
|
45f653167d | ||
|
|
403d9b6ac1 | ||
|
|
722af5f659 | ||
|
|
471b9f02ec | ||
|
|
fd294b6f98 | ||
|
|
88baaa72be | ||
|
|
61084cf1ba | ||
|
|
5b63f0755a | ||
|
|
9eb5cf6c98 | ||
|
|
679db5a22b | ||
|
|
0e35168bdb | ||
|
|
035dcc7ab7 | ||
|
|
252deed5b9 | ||
|
|
c2c4cad753 | ||
|
|
42e76477cf | ||
|
|
1eade74e5a | ||
|
|
f1f0fa0aa9 | ||
|
|
deef158822 | ||
|
|
fef2006663 | ||
|
|
5c97fd576a | ||
|
|
c4eb6b7b65 | ||
|
|
31324761cc | ||
|
|
e495f03ee9 | ||
|
|
f5769627e4 | ||
|
|
06ad73f85b | ||
|
|
fa20363853 | ||
|
|
2564432e71 | ||
|
|
addf47600d | ||
|
|
7f534a7966 | ||
|
|
eabffece1f | ||
|
|
afed842ad1 | ||
|
|
c46cfb5d47 | ||
|
|
34fe42bbd9 | ||
|
|
0c1d96b749 | ||
|
|
9b67f52d56 | ||
|
|
d37907d35d | ||
|
|
fee8d0cf78 | ||
|
|
f5f9c6b81f | ||
|
|
4e3460a34b | ||
|
|
8545b6ce6b | ||
|
|
e417903c23 | ||
|
|
81eae3fa48 | ||
|
|
90c58087e8 | ||
|
|
19bc1e6313 | ||
|
|
4a4e8c87b8 | ||
|
|
f04e559dc2 | ||
|
|
8e5e657344 | ||
|
|
a4f1f62068 | ||
|
|
a3e279f06f | ||
|
|
d11954e80c | ||
|
|
812170ebce | ||
|
|
fdd3c77298 | ||
|
|
342de209a2 | ||
|
|
caeb32488e | ||
|
|
ff7e70f4d5 | ||
|
|
950f51909c | ||
|
|
f86e6d344c | ||
|
|
08581282dd | ||
|
|
e1e47e76ec | ||
|
|
3ff059848c | ||
|
|
22c7df5936 | ||
|
|
81a44d1340 | ||
|
|
2c089e6166 | ||
|
|
589dae7b0c | ||
|
|
3ff13189aa | ||
|
|
7151c3fac1 | ||
|
|
3e023b77dd | ||
|
|
e3fc89890c | ||
|
|
ce2a6cfe5c | ||
|
|
31d9eaf54c | ||
|
|
781c445d14 | ||
|
|
26a416399f | ||
|
|
f7dc7f039e | ||
|
|
3c74fea087 | ||
|
|
be0635bfd3 | ||
|
|
6723ef95c2 | ||
|
|
1a8fd62680 | ||
|
|
8b57ed46b1 | ||
|
|
25c08e56c2 | ||
|
|
0f148b6ab6 | ||
|
|
47575fe357 | ||
|
|
7c14453b5a | ||
|
|
a47d5536fa | ||
|
|
db8f7f21e8 | ||
|
|
3c312c55f1 | ||
|
|
2d11419cba | ||
|
|
07a4508944 | ||
|
|
62913739bb | ||
|
|
55e9d8d944 | ||
|
|
a9439d58c7 | ||
|
|
800ad40c4c | ||
|
|
62864637a3 | ||
|
|
4d4ac7ea24 | ||
|
|
119651482d | ||
|
|
ecf0a1a736 | ||
|
|
94942d1ac4 | ||
|
|
b0a5b54949 | ||
|
|
ac57eab8ac | ||
|
|
74a4144193 | ||
|
|
5c44cb0f01 | ||
|
|
c044d711ef | ||
|
|
f2132f6a7d | ||
|
|
69871b15ff | ||
|
|
f4ec02a592 | ||
|
|
53f7743678 | ||
|
|
15893bc558 | ||
|
|
73b974f1b5 | ||
|
|
0e7bdc208b | ||
|
|
e0a07b7a92 | ||
|
|
4da58e8846 | ||
|
|
966b9e5c2b | ||
|
|
1625192c81 | ||
|
|
c5e8c6603c | ||
|
|
37e541d326 | ||
|
|
862a827fe6 | ||
|
|
b96c5c9e4b | ||
|
|
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 |
@@ -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.9
|
PROJECT_NUMBER = 1.9.0
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
@@ -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 \
|
||||||
|
|||||||
+6
-4
@@ -2,15 +2,17 @@ EXTRA_DIST = \
|
|||||||
acinclude.m4 \
|
acinclude.m4 \
|
||||||
autogen.sh \
|
autogen.sh \
|
||||||
DoxygenMain.cxx \
|
DoxygenMain.cxx \
|
||||||
README.MSVC \
|
|
||||||
README.zlib \
|
README.zlib \
|
||||||
SimGear.dsp \
|
README.plib \
|
||||||
SimGear.dsw
|
README.OpenAL \
|
||||||
|
README.OSG \
|
||||||
|
projects
|
||||||
|
|
||||||
SUBDIRS = src-libs simgear
|
SUBDIRS = simgear
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
(cd $(top_srcdir); $(HOME)/Projects/FlightGear/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,43 @@
|
|||||||
|
Version 1.9.0
|
||||||
|
* Thu Dec 18 15:12:15 CST 2008
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.8.6
|
||||||
|
* Mon Dec 1 14:02:47 CST 2008
|
||||||
|
|
||||||
|
|
||||||
|
Version 1.8.5
|
||||||
|
* October 30, 2008 (source code 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
|
New in 0.3.9
|
||||||
* November 17, 2005
|
* November 17, 2005
|
||||||
|
|
||||||
|
|||||||
-24
@@ -1,24 +0,0 @@
|
|||||||
This document describes how to build SimGear using the supplied workspace and
|
|
||||||
project files.
|
|
||||||
|
|
||||||
Unpack the SimGear source file into your work directory. This creates a new
|
|
||||||
subdirectory called SimGear-X.Y.Z. Rename this to SimGear. Before we can
|
|
||||||
build SimGear you must unpack and build the third party libraries metakit and
|
|
||||||
zlib. Sources for these are included in the SimGear/src-libs directory.
|
|
||||||
Unpack these into the top level SimGear directory. At this point your
|
|
||||||
directory structure should look something like this:
|
|
||||||
|
|
||||||
<work_dir>/
|
|
||||||
SimGear/
|
|
||||||
metakit-x.y.z/
|
|
||||||
simgear/
|
|
||||||
src-libs/
|
|
||||||
zlib-x.y.z/
|
|
||||||
|
|
||||||
Now open the SimGear workspace. This workspace file contains projects for
|
|
||||||
building metakit(mklib), SimGear and zlib. Select each project as the active
|
|
||||||
project and build all. Order is unimportant since there are no dependencies
|
|
||||||
between the projects.
|
|
||||||
|
|
||||||
The workspace and project files are generated by a perl script with extra
|
|
||||||
input from the am2dsp.cfg file.
|
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
[This file is mirrored in both the FlightGear and SimGear packages.]
|
||||||
|
|
||||||
|
You *must* have OpenSceneGraph (OSG) installed to build this version of
|
||||||
|
FlightGear.
|
||||||
|
|
||||||
|
Notice that FlightGear 1.9.0 requires at least version 2.7.8. Using earlier
|
||||||
|
versions of OSG will yield serious rendering bugs.
|
||||||
|
|
||||||
|
You can get the latest version of OSG from:
|
||||||
|
|
||||||
|
http://www.openscenegraph.org/
|
||||||
|
|
||||||
|
Build notes:
|
||||||
|
|
||||||
|
Unzip the file OpenSceneGraph-x.x.zip and install using the following
|
||||||
|
commands:
|
||||||
|
|
||||||
|
unzip OpenSceneGraph-x.x
|
||||||
|
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
|
||||||
|
|
||||||
+21
-4
@@ -3,10 +3,27 @@
|
|||||||
You *must* have the development components of OpenAL installed on your system
|
You *must* have the development components of OpenAL installed on your system
|
||||||
to build FlightGear!" You can get a copy here:
|
to build FlightGear!" You can get a copy here:
|
||||||
|
|
||||||
http://www.openal.org
|
http://connect.creativelabs.com/openal/default.aspx
|
||||||
|
|
||||||
Build notes:
|
Build notes:
|
||||||
|
|
||||||
The OpenAL developers do not make "versioned" releases so we recommend that
|
You can download a versioned release of the openal library from
|
||||||
you pull the latest version via anonymous CVS (follow the instructions at
|
http://www.openal.org/downloads.html. Download the openal source,
|
||||||
the OpenAL web site) and build/install that.
|
release 0.0.8 (dated February 11, 2006) and run:
|
||||||
|
tar xjvf openal-soft-1.5.304.tar.bz2
|
||||||
|
cd openal-soft-1.5.304/
|
||||||
|
ccmake .
|
||||||
|
|
||||||
|
[ While running ccmake: press 'c' to configure, press 'c' once more, and
|
||||||
|
then press 'g' to generate and exit ]
|
||||||
|
|
||||||
|
|
||||||
|
The alut library is also required, but comes separately in the package
|
||||||
|
freelut-1.1.0.tar.gz. This package can be downloaded from the same page
|
||||||
|
(http://connect.creativelabs.com/openal/default.aspx). Download and run:
|
||||||
|
tar xzvf freelut-1.1.0.tar.gz
|
||||||
|
cd freealut-1.1.0
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
|||||||
+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.
|
|
||||||
|
|||||||
-2101
File diff suppressed because it is too large
Load Diff
-53
@@ -1,53 +0,0 @@
|
|||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "SimGear"=".\SimGear.dsp" - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
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:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
@@ -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,6 +106,11 @@ David Megginson <david@megginson.com>
|
|||||||
SimGear property manager/registry
|
SimGear property manager/registry
|
||||||
|
|
||||||
|
|
||||||
|
Tim Moore
|
||||||
|
Ported the (chrome) "shader" animation to OSG, and helped with porting
|
||||||
|
the "material" animation.
|
||||||
|
|
||||||
|
|
||||||
Curt Olson http://www.flightgear.org/~curt/
|
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>
|
||||||
|
|||||||
+339
-48
@@ -6,19 +6,25 @@ 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
|
already=""
|
||||||
*-I${incdir}*)
|
for CPPflag in $CPPFLAGS ; do
|
||||||
# echo " + already had $incdir" 1>&6
|
if test "_$CPPflag" = "_-I${incdir}" ; then
|
||||||
;;
|
already=yes
|
||||||
*)
|
break
|
||||||
if test "$CPPFLAGS" = "" ; then
|
fi
|
||||||
CPPFLAGS="-I$incdir"
|
done
|
||||||
else
|
if test -n "$already" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -I$incdir"
|
echo " + already had -I$incdir" 1>&AS_MESSAGE_LOG_FD
|
||||||
fi
|
else
|
||||||
echo " + found $incdir" 1>&6
|
if test "$CPPFLAGS" = "" ; then
|
||||||
;;
|
CPPFLAGS="-I$incdir"
|
||||||
esac
|
else
|
||||||
|
CPPFLAGS="$CPPFLAGS -I$incdir"
|
||||||
|
fi
|
||||||
|
echo " + added -I$incdir" 1>&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " + IDIR is not accessible: '$myincdir'" 1>&AS_MESSAGE_LOG_FD
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
dnl
|
dnl
|
||||||
@@ -28,19 +34,25 @@ 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
|
already=""
|
||||||
*-L${mylibdir}*)
|
for LDflag in $LDFLAGS ; do
|
||||||
# echo " + already had $mylibdir" 1>&6
|
if test "_$LDflag" = "_-L${mylibdir}" ; then
|
||||||
;;
|
already=yes
|
||||||
*)
|
break
|
||||||
if test "$LDFLAGS" = "" ; then
|
fi
|
||||||
LDFLAGS="-L$mylibdir"
|
done
|
||||||
else
|
if test -n "$already" ; then
|
||||||
LDFLAGS="$LDFLAGS -L$mylibdir"
|
echo " + already had -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
|
||||||
fi
|
else
|
||||||
echo " + found $mylibdir" 1>&6
|
if test "$LDFLAGS" = "" ; then
|
||||||
;;
|
LDFLAGS="-L$mylibdir"
|
||||||
esac
|
else
|
||||||
|
LDFLAGS="$LDFLAGS -L$mylibdir"
|
||||||
|
fi
|
||||||
|
echo " + added -L$mylibdir" 1>&AS_MESSAGE_LOG_FD
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " + LDIR is not accessible: '$mylibdir'" 1>&AS_MESSAGE_LOG_FD
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
dnl
|
dnl
|
||||||
@@ -50,12 +62,9 @@ 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
|
||||||
*:${progdir}*)
|
*:${progdir}:*)
|
||||||
# echo " + already had $progdir" 1>&6
|
echo " + already had $progdir in \$PATH" 1>&AS_MESSAGE_LOG_FD
|
||||||
;;
|
|
||||||
*${progdir}:*)
|
|
||||||
# echo " + already had $progdir" 1>&6
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
if test "$PATH" = "" ; then
|
if test "$PATH" = "" ; then
|
||||||
@@ -63,9 +72,11 @@ if test -r $progdir ; then
|
|||||||
else
|
else
|
||||||
PATH="$PATH:$progdir"
|
PATH="$PATH:$progdir"
|
||||||
fi
|
fi
|
||||||
echo " + found $progdir" 1>&6
|
echo " + appended $progdir to \$PATH" 1>&AS_MESSAGE_LOG_FD
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
else
|
||||||
|
echo " + PDIR is not accessible: '$progdir'" 1>&AS_MESSAGE_LOG_FD
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
dnl
|
dnl
|
||||||
@@ -89,23 +100,32 @@ if test "$subexdirs" = "" ; then
|
|||||||
subexdirs="-"
|
subexdirs="-"
|
||||||
fi
|
fi
|
||||||
for subexdir in $subexdirs ; do
|
for subexdir in $subexdirs ; do
|
||||||
if test "$subexdir" = "-" ; then
|
if test "$subexdir" = "-" ; then
|
||||||
subexdir=""
|
subexdir=""
|
||||||
else
|
else
|
||||||
subexdir="/$subexdir"
|
subexdir="/$subexdir"
|
||||||
fi
|
fi
|
||||||
for exdir in $exdirs ; do
|
for exdir in $exdirs ; do
|
||||||
if test "$exdir" != "/usr" || test "$subexdir" != ""; then
|
if test "$exdir" != "/usr" || test "$subexdir" != ""; then
|
||||||
incdir="${exdir}/include${subexdir}"
|
incdir="${exdir}/include${subexdir}"
|
||||||
wi_EXTRA_IDIR($incdir)
|
wi_EXTRA_IDIR($incdir)
|
||||||
|
|
||||||
mylibdir="${exdir}/lib${subexdir}"
|
dnl On 64-bit machines, if lib64/ exists and is not identical to lib/
|
||||||
wi_EXTRA_LDIR($mylibdir)
|
dnl then it should be listed here, listed ahead of lib/.
|
||||||
|
mylibdir64="${exdir}/lib64${subexdir}"
|
||||||
|
mylibdir32="${exdir}/lib${subexdir}"
|
||||||
|
|
||||||
progdir="${exdir}/bin${subexdir}"
|
if test "x86_64" = $(uname -m) \
|
||||||
wi_EXTRA_PDIR($progdir)
|
-a ! ${mylibdir64} -ef ${mylibdir32} ; then
|
||||||
fi
|
wi_EXTRA_LDIR($mylibdir64)
|
||||||
done
|
fi
|
||||||
|
|
||||||
|
wi_EXTRA_LDIR($mylibdir32)
|
||||||
|
|
||||||
|
progdir="${exdir}/bin${subexdir}"
|
||||||
|
wi_EXTRA_PDIR($progdir)
|
||||||
|
fi
|
||||||
|
done
|
||||||
done
|
done
|
||||||
])
|
])
|
||||||
dnl
|
dnl
|
||||||
@@ -413,3 +433,274 @@ 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
|
||||||
|
|
||||||
|
# ===========================================================================
|
||||||
|
# http://autoconf-archive.cryp.to/ax_boost_base.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_BOOST_BASE([MINIMUM-VERSION])
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Test for the Boost C++ libraries of a particular version (or newer)
|
||||||
|
#
|
||||||
|
# If no path to the installed boost library is given the macro searchs
|
||||||
|
# under /usr, /usr/local, /opt and /opt/local and evaluates the
|
||||||
|
# $BOOST_ROOT environment variable. Further documentation is available at
|
||||||
|
# <http://randspringer.de/boost/index.html>.
|
||||||
|
#
|
||||||
|
# This macro calls:
|
||||||
|
#
|
||||||
|
# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS)
|
||||||
|
#
|
||||||
|
# And sets:
|
||||||
|
#
|
||||||
|
# HAVE_BOOST
|
||||||
|
#
|
||||||
|
# LAST MODIFICATION
|
||||||
|
#
|
||||||
|
# 2008-04-12
|
||||||
|
#
|
||||||
|
# COPYLEFT
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved.
|
||||||
|
|
||||||
|
AC_DEFUN([AX_BOOST_BASE],
|
||||||
|
[
|
||||||
|
AC_ARG_WITH([boost],
|
||||||
|
AS_HELP_STRING([--with-boost@<:@=DIR@:>@], [use boost (default is yes) - it is possible to specify the root directory for boost (optional)]),
|
||||||
|
[
|
||||||
|
if test "$withval" = "no"; then
|
||||||
|
want_boost="no"
|
||||||
|
elif test "$withval" = "yes"; then
|
||||||
|
want_boost="yes"
|
||||||
|
ac_boost_path=""
|
||||||
|
else
|
||||||
|
want_boost="yes"
|
||||||
|
ac_boost_path="$withval"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[want_boost="yes"])
|
||||||
|
|
||||||
|
|
||||||
|
AC_ARG_WITH([boost-libdir],
|
||||||
|
AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
|
||||||
|
[Force given directory for boost libraries. Note that this will overwrite library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
|
||||||
|
[
|
||||||
|
if test -d $withval
|
||||||
|
then
|
||||||
|
ac_boost_lib_path="$withval"
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR(--with-boost-libdir expected directory name)
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[ac_boost_lib_path=""]
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "x$want_boost" = "xyes"; then
|
||||||
|
boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
|
||||||
|
boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||||
|
boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
|
||||||
|
boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
|
||||||
|
boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
|
||||||
|
if test "x$boost_lib_version_req_sub_minor" = "x" ; then
|
||||||
|
boost_lib_version_req_sub_minor="0"
|
||||||
|
fi
|
||||||
|
WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
|
||||||
|
AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
|
||||||
|
succeeded=no
|
||||||
|
|
||||||
|
dnl first we check the system location for boost libraries
|
||||||
|
dnl this location ist chosen if boost libraries are installed with the --layout=system option
|
||||||
|
dnl or if you install boost with RPM
|
||||||
|
if test "$ac_boost_path" != ""; then
|
||||||
|
BOOST_LDFLAGS="-L$ac_boost_path/lib"
|
||||||
|
BOOST_CPPFLAGS="-I$ac_boost_path/include"
|
||||||
|
else
|
||||||
|
for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
|
||||||
|
if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
|
||||||
|
BOOST_LDFLAGS="-L$ac_boost_path_tmp/lib"
|
||||||
|
BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl overwrite ld flags if we have required special directory with
|
||||||
|
dnl --with-boost-libdir parameter
|
||||||
|
if test "$ac_boost_lib_path" != ""; then
|
||||||
|
BOOST_LDFLAGS="-L$ac_boost_lib_path"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
export CPPFLAGS
|
||||||
|
|
||||||
|
LDFLAGS_SAVED="$LDFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||||
|
export LDFLAGS
|
||||||
|
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
@%:@include <boost/version.hpp>
|
||||||
|
]], [[
|
||||||
|
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||||
|
// Everything is okay
|
||||||
|
#else
|
||||||
|
# error Boost version is too old
|
||||||
|
#endif
|
||||||
|
]])],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
succeeded=yes
|
||||||
|
found_system=yes
|
||||||
|
],[
|
||||||
|
])
|
||||||
|
AC_LANG_POP([C++])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
dnl if we found no boost with system layout we search for boost libraries
|
||||||
|
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
||||||
|
if test "x$succeeded" != "xyes"; then
|
||||||
|
_version=0
|
||||||
|
if test "$ac_boost_path" != ""; then
|
||||||
|
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||||
|
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
|
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
|
if test "$V_CHECK" = "1" ; then
|
||||||
|
_version=$_version_tmp
|
||||||
|
fi
|
||||||
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
|
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
for ac_boost_path in /usr /usr/local /opt /opt/local ; do
|
||||||
|
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||||
|
for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
|
||||||
|
_version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
|
||||||
|
V_CHECK=`expr $_version_tmp \> $_version`
|
||||||
|
if test "$V_CHECK" = "1" ; then
|
||||||
|
_version=$_version_tmp
|
||||||
|
best_path=$ac_boost_path
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
|
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
|
if test "$ac_boost_lib_path" = ""
|
||||||
|
then
|
||||||
|
BOOST_LDFLAGS="-L$best_path/lib"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$BOOST_ROOT" != "x"; then
|
||||||
|
if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/lib" && test -r "$BOOST_ROOT/stage/lib"; then
|
||||||
|
version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'`
|
||||||
|
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
|
||||||
|
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
|
||||||
|
V_CHECK=`expr $stage_version_shorten \>\= $_version`
|
||||||
|
if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
|
||||||
|
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
|
||||||
|
BOOST_CPPFLAGS="-I$BOOST_ROOT"
|
||||||
|
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/lib"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
export CPPFLAGS
|
||||||
|
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||||
|
export LDFLAGS
|
||||||
|
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
@%:@include <boost/version.hpp>
|
||||||
|
]], [[
|
||||||
|
#if BOOST_VERSION >= $WANT_BOOST_VERSION
|
||||||
|
// Everything is okay
|
||||||
|
#else
|
||||||
|
# error Boost version is too old
|
||||||
|
#endif
|
||||||
|
]])],[
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
succeeded=yes
|
||||||
|
found_system=yes
|
||||||
|
],[
|
||||||
|
])
|
||||||
|
AC_LANG_POP([C++])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$succeeded" != "yes" ; then
|
||||||
|
if test "$_version" = "0" ; then
|
||||||
|
AC_MSG_ERROR([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.]])
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([Your boost libraries seems to old (version $_version).])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AC_SUBST(BOOST_CPPFLAGS)
|
||||||
|
AC_SUBST(BOOST_LDFLAGS)
|
||||||
|
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
|
fi
|
||||||
|
|
||||||
|
])
|
||||||
|
|||||||
+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\
|
||||||
\
|
\
|
||||||
|
|||||||
+212
-14
@@ -8,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.9)
|
AM_INIT_AUTOMAKE(SimGear, 2.0.0)
|
||||||
|
|
||||||
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.
|
||||||
@@ -24,17 +24,25 @@ 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
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CPP
|
AC_PROG_CPP
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
|
AC_PROG_CXXCPP
|
||||||
AC_PROG_RANLIB
|
AC_PROG_RANLIB
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
|
AX_BOOST_BASE([1.37.0])
|
||||||
|
|
||||||
|
if test "x$BOOST_CPPFLAGS" != "x-I/usr/include" ; then
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl set the $host variable based on local machine/os
|
dnl set the $host variable based on local machine/os
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
@@ -119,6 +127,35 @@ if test "x$with_plib" != "x" ; then
|
|||||||
EXTRA_DIRS="${EXTRA_DIRS} $with_plib"
|
EXTRA_DIRS="${EXTRA_DIRS} $with_plib"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
AC_ARG_WITH(plib_framework, [ --with-plib-framework=PREFIX Specify the prefix path to PLIB.framework ])
|
||||||
|
|
||||||
|
if test "x$with_plib_framework" != "x"; then
|
||||||
|
echo "plib framework prefix is $with_plib_framework"
|
||||||
|
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
|
||||||
|
|
||||||
|
AC_ARG_WITH(osg_framework, [ --with-osg-framework=PREFIX Specify the prefix path to OSG.framework ])
|
||||||
|
|
||||||
|
if test "x$with_osg_framework" != "x"; then
|
||||||
|
echo "osg framework prefix is $with_osg_framework"
|
||||||
|
CPPFLAGS = "$CPPFLAGS -F$with-osg-framework"
|
||||||
|
export DYLD_FRAMEWORK_PATH="$DYLD_FRAMEWORK_PATH:$with_osg_framework"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl specifying OpenAL.framework (for user provided OpenAL.framework / ALUT)
|
||||||
|
AC_ARG_WITH(openal_framework, [ --with-openal-framework=PREFIX Speicfy the prefix path to OpenAL.framework ])
|
||||||
|
|
||||||
|
if test "x$with_openal_framework" != "x"; then
|
||||||
|
echo "OpenAL framework prefix is $with_openal_framework"
|
||||||
|
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* | *-*-cygwin* | *-*-mingw32*)
|
*-apple-darwin* | *-*-cygwin* | *-*-mingw32*)
|
||||||
@@ -188,6 +225,7 @@ LIBS=""
|
|||||||
|
|
||||||
dnl check for some default libraries
|
dnl check for some default libraries
|
||||||
AC_SEARCH_LIBS(cos, m)
|
AC_SEARCH_LIBS(cos, m)
|
||||||
|
AC_SEARCH_LIBS(clock_gettime, rt)
|
||||||
|
|
||||||
base_LIBS="$LIBS"
|
base_LIBS="$LIBS"
|
||||||
|
|
||||||
@@ -250,21 +288,26 @@ 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"
|
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"
|
INCLUDES="$INCLUDES -I/usr/local/include/"
|
||||||
LIBS="$LIBS -L/usr/local/lib"
|
LIBS="$LIBS -L/usr/local/lib"
|
||||||
AC_SEARCH_LIBS(alGenBuffers, openal32)
|
AC_SEARCH_LIBS(alGenBuffers, [ openal32 openal 'openal -ldsound -lwinmm' ] )
|
||||||
AC_SEARCH_LIBS(alutInit, [ openal32 ALut ] )
|
AC_SEARCH_LIBS(alutInit, [ openal32 ALut alut ] )
|
||||||
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
|
LIBS="$LIBS -lwinmm -ldsound -ldxguid -lole32"
|
||||||
openal_LIBS="$LIBS"
|
openal_LIBS="$LIBS"
|
||||||
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||||
|
ALUT_OK="$ac_cv_search_alutInit"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-apple-darwin*)
|
*-apple-darwin*)
|
||||||
@@ -272,8 +315,54 @@ case "${host}" in
|
|||||||
|
|
||||||
LIBS="$LIBS -framework IOKit -framework OpenAL"
|
LIBS="$LIBS -framework IOKit -framework OpenAL"
|
||||||
openal_LIBS="$LIBS"
|
openal_LIBS="$LIBS"
|
||||||
# not sure how to test if OpenAL exists on MacOS (does it come by default?)
|
|
||||||
OPENAL_OK="yes"
|
OPENAL_OK="yes"
|
||||||
|
ALUT_OK="no"
|
||||||
|
|
||||||
|
if test "x$with_openal_lib" != "x"; then
|
||||||
|
echo "libopenal is not supported on Mac OS platform."
|
||||||
|
openal_LIBS=""
|
||||||
|
fi
|
||||||
|
OPENAL_OK="yes"
|
||||||
|
# Looking for alut.h, if found assume that it is a part of
|
||||||
|
# the OpenAL package.
|
||||||
|
AC_CHECK_HEADERS([OpenAL/alut.h],[ALUT_OK="yes"])
|
||||||
|
|
||||||
|
|
||||||
|
dnl Thank you Christian Bauer from SheepSaver
|
||||||
|
dnl Modified by Tatsuhiro Nishioka for accepting a given framework path
|
||||||
|
dnl AC_CHECK_FRAMEWORK($1=NAME, $2=INCLUDES, $3=FRAMEWORK_PATH) ; $3 is optional
|
||||||
|
AC_DEFUN([AC_CHECK_FRAMEWORK], [
|
||||||
|
AS_VAR_PUSHDEF([ac_Framework], [ac_cv_framework_$1])dnl
|
||||||
|
AC_CACHE_CHECK([whether compiler supports framework $1],
|
||||||
|
ac_Framework, [
|
||||||
|
saved_LIBS="$LIBS"
|
||||||
|
FRAMEWORKS="$FRAMEWORKS -framework $1"
|
||||||
|
if test "$3" = ""; then
|
||||||
|
FRAMEWORKS="$FRAMEWORKS $ADD2LD"
|
||||||
|
elif test "`echo $FRAMEWORKS | grep -- -F$3`" = ""; then
|
||||||
|
FRAMEWORKS="$FRAMEWORKS -F$3"
|
||||||
|
CXXFLAGS="$CXXFLAGS -F$3"
|
||||||
|
CCFLAGS="$CCFLAGS -F$3"
|
||||||
|
dnl This is needed for AC_TRY_LINK when a framework path is specified
|
||||||
|
export DYLD_FRAMEWORK_PATH="${DYLD_FRAMEWORK_PATH}:$3"
|
||||||
|
fi
|
||||||
|
AC_TRY_LINK(
|
||||||
|
[$2], [],
|
||||||
|
[AS_VAR_SET(ac_Framework, yes)], [AS_VAR_SET(ac_Framework, no); LIBS="$saved_LIBS"]
|
||||||
|
)
|
||||||
|
])
|
||||||
|
AS_IF([test AS_VAR_GET(ac_Framework) = yes],
|
||||||
|
[AC_DEFINE(AS_TR_CPP(HAVE_FRAMEWORK_$1), 1, [Define if framework $1 is available.])]
|
||||||
|
)
|
||||||
|
AS_VAR_POPDEF([ac_Framework])dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl Check for OpenAL.framework when --with-openal-framework is specified
|
||||||
|
dnl Of cource OpenAL.framework needs to have alut.h
|
||||||
|
if test "x$with_openal_framework" != "x"; then
|
||||||
|
AC_CHECK_FRAMEWORK(OpenAL, [#include <OpenAL/alut.h>], $with_openal_framework)
|
||||||
|
fi
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
@@ -284,6 +373,7 @@ case "${host}" in
|
|||||||
AC_SEARCH_LIBS(alGenBuffers, openal)
|
AC_SEARCH_LIBS(alGenBuffers, openal)
|
||||||
AC_SEARCH_LIBS(alutInit, [ alut openal ] )
|
AC_SEARCH_LIBS(alutInit, [ alut openal ] )
|
||||||
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
OPENAL_OK="$ac_cv_search_alGenBuffers"
|
||||||
|
ALUT_OK="$ac_cv_search_alutInit"
|
||||||
openal_LIBS="$LIBS"
|
openal_LIBS="$LIBS"
|
||||||
LIBS=$save_LIBS
|
LIBS=$save_LIBS
|
||||||
;;
|
;;
|
||||||
@@ -301,6 +391,19 @@ if test "$OPENAL_OK" == "no"; then
|
|||||||
exit
|
exit
|
||||||
fi
|
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)
|
||||||
@@ -316,30 +419,49 @@ AM_CONDITIONAL(EXTGL_NEEDED, test "x$ac_cv_header_windows_h" = "xyes")
|
|||||||
# The following are C++ items that need to be tested for with the c++
|
# The following are C++ items that need to be tested for with the c++
|
||||||
# compiler
|
# compiler
|
||||||
|
|
||||||
|
CXXCPP="g++ -E"
|
||||||
AC_LANG_PUSH(C++)
|
AC_LANG_PUSH(C++)
|
||||||
|
|
||||||
dnl Check for "plib" without which we cannot go on
|
dnl Check for "plib" without which we cannot go on
|
||||||
|
case ${host} in
|
||||||
|
*-apple-darwin*)
|
||||||
|
# Check PLIB framework availability when with-plib-framework is specified
|
||||||
|
if test "x$with_plib_framework" != "x"; then
|
||||||
|
AC_CHECK_FRAMEWORK(PLIB, [#include <plib/ul.h>], $with_plib_framework)
|
||||||
|
plib_FRAMEWORK="$FRAMEWORKS"
|
||||||
|
FRAMEWORKS=""
|
||||||
|
AC_SUBST(plib_FRAMEWORK)
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
AM_CONDITIONAL(HAVE_FRAMEWORK_PLIB, test "x$ac_cv_framework_PLIB" != "x")
|
||||||
|
|
||||||
AC_CHECK_HEADER(plib/ul.h)
|
AC_CHECK_HEADER(plib/ul.h)
|
||||||
if test "x$ac_cv_header_plib_ul_h" != "xyes"; then
|
|
||||||
|
AC_CHECK_LIB(plibul,ulInit)
|
||||||
|
if test "x$ac_cv_header_plib_ul_h" != "xyes" \
|
||||||
|
-o "x$ac_cv_lib_plibul_ulInit" != "xyes" ; then
|
||||||
echo
|
echo
|
||||||
echo "You *must* have the plib library installed on your system to build"
|
echo "You *must* have the plib library installed on your system to build"
|
||||||
echo "SimGear!"
|
echo "SimGear!"
|
||||||
echo
|
echo
|
||||||
|
echo " LIBS: '$LIBS'"
|
||||||
|
echo " LDFLAGS: '$LDFLAGS'"
|
||||||
|
echo " CPPFLAGS: '$CPPFLAGS'"
|
||||||
|
echo
|
||||||
echo "Please see README.plib for more details."
|
echo "Please see README.plib for more details."
|
||||||
echo
|
echo
|
||||||
echo "configure aborted."
|
echo "configure aborted."
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING([for plib 1.8.4 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 184
|
#define MIN_PLIB_VERSION 185
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
int major, minor, micro;
|
|
||||||
|
|
||||||
if ( PLIB_VERSION < MIN_PLIB_VERSION ) {
|
if ( PLIB_VERSION < MIN_PLIB_VERSION ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -350,12 +472,86 @@ 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.8.4 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"
|
||||||
|
|
||||||
|
# OpenSceneGraph
|
||||||
|
case "${host}" in
|
||||||
|
*-apple-darwin*)
|
||||||
|
if test "x$with_osg_framework" != "x"; then
|
||||||
|
# AC_CHECK_FRAMEWORK(osgViewer, [#include <osgViewer/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgGA, [#include <osgGA/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgText, [#include <osgText/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgFX, [#include <osgFX/AnisotropicLighting>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgUtil, [#include <osgUtil/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgDB, [#include <osgDB/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgSim, [#include <osgSim/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osgParticle, [#include <osgParticle/Version>], $with_osg_framework)
|
||||||
|
# AC_CHECK_FRAMEWORK(osg, [#include <osg/Version>], $with_osg_framework)
|
||||||
|
# osg_FRAMEWORKS="$FRAMEWORKS"
|
||||||
|
# FRAMEWORKS=""
|
||||||
|
# AC_SUBST(osg_FRAMEWORKS)
|
||||||
|
AC_CHECK_FRAMEWORK(OpenThreads, [#include <OpenThreads/Version>], $with_osg_framework)
|
||||||
|
openthreads_FRAMEWORK="$FRAMEWORKS"
|
||||||
|
FRAMEWORKS=""
|
||||||
|
AC_SUBST(openthreads_FRAMEWORK)
|
||||||
|
else
|
||||||
|
dnl
|
||||||
|
dnl This is needed when osg dynamic libs are specified
|
||||||
|
dnl instead of OSG frameworks on Mac OS X
|
||||||
|
dnl
|
||||||
|
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if test "x$enable_osgdebug" = "xyes"; then
|
||||||
|
AC_CHECK_LIB(OpenThreadsd,OpenThreadsGetVersion)
|
||||||
|
else
|
||||||
|
AC_CHECK_LIB(OpenThreads,OpenThreadsGetVersion)
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AM_CONDITIONAL(HAVE_FRAMEWORK_OSG, test "x$ac_cv_framework_osg" != "x")
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(osg/Version)
|
||||||
|
|
||||||
|
if test "x$ac_cv_header_osg_Version" != "xyes" -o "x$ac_cv_lib_OpenThreads_OpenThreadsGetVersion" != "xyes"; then
|
||||||
|
if test "x$ac_cv_framework_osg" != "xyes"; then
|
||||||
|
echo
|
||||||
|
echo "You *must* have the OpenThreads library installed on your system"
|
||||||
|
echo "to build this version of SimGear!"
|
||||||
|
echo " Maybe you need to specify --with-osg=DIR."
|
||||||
|
echo " Maybe you need to specify some LDFLAGS to help the linker."
|
||||||
|
echo
|
||||||
|
echo " LIBS: '$LIBS'"
|
||||||
|
echo " LDFLAGS: '$LDFLAGS'"
|
||||||
|
echo " CPPFLAGS: '$CPPFLAGS'"
|
||||||
|
echo
|
||||||
|
echo "Please see README.OSG for more details."
|
||||||
|
echo
|
||||||
|
echo "configure aborted."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(boost/version.hpp)
|
||||||
|
if test "x$ac_cv_header_boost_version_hpp" != "xyes"; then
|
||||||
|
echo
|
||||||
|
echo "You *must* have the Boost library installed on your system"
|
||||||
|
echo "to build this version of SimGear!"
|
||||||
|
echo
|
||||||
|
echo " LIBS: '$LIBS'"
|
||||||
|
echo " LDFLAGS: '$LDFLAGS'"
|
||||||
|
echo " CPPFLAGS: '$CPPFLAGS'"
|
||||||
|
echo
|
||||||
|
echo "configure aborted."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
AC_LANG_POP
|
AC_LANG_POP
|
||||||
|
|
||||||
dnl Check for system installed zlib
|
dnl Check for system installed zlib
|
||||||
@@ -387,6 +583,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
|
||||||
|
|
||||||
@@ -405,7 +602,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 \
|
||||||
@@ -423,10 +619,12 @@ AC_CONFIG_FILES([ \
|
|||||||
simgear/props/Makefile \
|
simgear/props/Makefile \
|
||||||
simgear/route/Makefile \
|
simgear/route/Makefile \
|
||||||
simgear/scene/Makefile \
|
simgear/scene/Makefile \
|
||||||
|
simgear/scene/bvh/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/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 \
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
SimGear.ncb
|
||||||
|
SimGear.suo
|
||||||
|
*.user
|
||||||
|
Win32
|
||||||
|
x64
|
||||||
File diff suppressed because it is too large
Load Diff
+4
-10
@@ -1,16 +1,10 @@
|
|||||||
if HAVE_THREADS
|
|
||||||
SGTHREAD_DIR = threads
|
|
||||||
else
|
|
||||||
SGTHREAD_DIR =
|
|
||||||
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) \
|
||||||
@@ -31,7 +25,7 @@ SUBDIRS = \
|
|||||||
screen \
|
screen \
|
||||||
serial \
|
serial \
|
||||||
sound \
|
sound \
|
||||||
$(SGTHREAD_DIR) \
|
threads \
|
||||||
timing
|
timing
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -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] );
|
||||||
@@ -109,7 +106,7 @@ void SGBucket::set_bucket( double dlon, double dlat ) {
|
|||||||
} else if ( span <= 1.0 ) {
|
} else if ( span <= 1.0 ) {
|
||||||
x = (int)((dlon - lon) / span);
|
x = (int)((dlon - lon) / span);
|
||||||
} else {
|
} else {
|
||||||
if ( (dlon >= 0) || (fabs(diff) < SG_EPSILON) ) {
|
if ( dlon >= 0 ) {
|
||||||
lon = (int)( (int)(lon / span) * span);
|
lon = (int)( (int)(lon / span) * span);
|
||||||
} else {
|
} else {
|
||||||
// cout << " lon = " << lon
|
// cout << " lon = " << lon
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -114,11 +95,10 @@ static double sg_bucket_span( double l ) {
|
|||||||
class SGBucket {
|
class SGBucket {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double cx, cy; // centerpoint (lon, lat) in degrees of bucket
|
short lon; // longitude index (-180 to 179)
|
||||||
int lon; // longitude index (-180 to 179)
|
short lat; // latitude index (-90 to 89)
|
||||||
int lat; // latitude index (-90 to 89)
|
char x; // x subdivision (0 to 7)
|
||||||
int x; // x subdivision (0 to 7)
|
char y; // y subdivision (0 to 7)
|
||||||
int y; // y subdivision (0 to 7)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -134,6 +114,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 +134,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 +148,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 +190,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.
|
||||||
@@ -254,6 +244,23 @@ public:
|
|||||||
*/
|
*/
|
||||||
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 +287,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 +326,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;
|
||||||
}
|
}
|
||||||
|
|||||||
+43
-344
@@ -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,33 @@
|
|||||||
#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
|
||||||
|
# if _MSC_VER < 1500
|
||||||
|
# define vsnprintf _vsnprintf
|
||||||
|
# endif
|
||||||
|
# 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 +80,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)
|
||||||
@@ -346,24 +126,7 @@
|
|||||||
// 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
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -371,19 +134,31 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
# define SG_GL_H <OpenGL/gl.h>
|
# ifdef __GNUC__
|
||||||
# define SG_GLX_H <AGL/agl.h>
|
# if ( __GNUC__ > 3 ) || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 3 )
|
||||||
# define SG_GLU_H <OpenGL/glu.h>
|
|
||||||
# define SG_GLEXT_H <OpenGL/glext.h>
|
|
||||||
# define SG_GLUT_H <GLUT/glut.h>
|
|
||||||
|
|
||||||
inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
|
inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
|
||||||
#else
|
# else
|
||||||
# define SG_GL_H <GL/gl.h>
|
// any C++ header file undefines isinf and isnan
|
||||||
# define SG_GLX_H <GL/glx.h>
|
// so this should be included before <iostream>
|
||||||
# define SG_GLU_H <GL/glu.h>
|
// the functions are STILL in libm (libSystem on mac os x)
|
||||||
# define SG_GLEXT_H <GL/glext.h>
|
extern "C" int (isnan)(double);
|
||||||
# define SG_GLUT_H <GL/glut.h>
|
extern "C" int (isinf)(double);
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__FreeBSD__)
|
||||||
|
# if __FreeBSD_version < 500000
|
||||||
|
extern "C" {
|
||||||
|
inline int isnan(double r) { return !(r <= 0 || r >= 0); }
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__CYGWIN__)
|
||||||
|
# include <ieeefp.h> // isnan
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -391,81 +166,5 @@ inline int (isnan)(double r) { return !(r <= 0 || r >= 0); }
|
|||||||
// 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
|
||||||
|
|
||||||
|
|||||||
+18
-20
@@ -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,17 +31,8 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#include <cmath>
|
||||||
# define _USE_MATH_DEFINES
|
|
||||||
#endif
|
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
|
||||||
# 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>
|
||||||
|
|
||||||
@@ -79,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
|
||||||
|
|
||||||
@@ -126,22 +118,28 @@
|
|||||||
/** Nautical Miles to Radians */
|
/** Nautical Miles to Radians */
|
||||||
#define SG_RAD_TO_NM 3437.7467707849392526
|
#define SG_RAD_TO_NM 3437.7467707849392526
|
||||||
|
|
||||||
/** Miles per second to Knots */
|
/** meters per second to Knots */
|
||||||
#define SG_MPS_TO_KT 1.9438444924406046432
|
#define SG_MPS_TO_KT 1.9438444924406046432
|
||||||
|
|
||||||
/** Knots to Miles per second */
|
/** Knots to meters per second */
|
||||||
#define SG_KT_TO_MPS 0.5144444444444444444
|
#define SG_KT_TO_MPS 0.5144444444444444444
|
||||||
|
|
||||||
/** Miles per second to Miles per hour */
|
/** Feet per second to Knots */
|
||||||
|
#define SG_FPS_TO_KT 0.5924838012958962841
|
||||||
|
|
||||||
|
/** Knots to Feet per second */
|
||||||
|
#define SG_KT_TO_FPS 1.6878098571011956874
|
||||||
|
|
||||||
|
/** meters per second to Miles per hour */
|
||||||
#define SG_MPS_TO_MPH 2.2369362920544020312
|
#define SG_MPS_TO_MPH 2.2369362920544020312
|
||||||
|
|
||||||
/** Miles per hour to Miles per second */
|
/** meetrs per hour to Miles per second */
|
||||||
#define SG_MPH_TO_MPS 0.44704
|
#define SG_MPH_TO_MPS 0.44704
|
||||||
|
|
||||||
/** Meters per second to Kilometers per hour */
|
/** Meters per second to Kilometers per hour */
|
||||||
#define SG_MPS_TO_KMH 3.6
|
#define SG_MPS_TO_KMH 3.6
|
||||||
|
|
||||||
/** Kilometers per hour to Miles per second */
|
/** Kilometers per hour to meters per second */
|
||||||
#define SG_KMH_TO_MPS 0.2777777777777777778
|
#define SG_KMH_TO_MPS 0.2777777777777777778
|
||||||
|
|
||||||
/** Pascal to Inch Mercury */
|
/** Pascal to Inch Mercury */
|
||||||
|
|||||||
@@ -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 _WIN32
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|||||||
+51
-65
@@ -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$
|
||||||
|
|
||||||
@@ -28,29 +27,18 @@
|
|||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _WIN32
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SG_HAVE_STD_INCLUDES
|
#include <streambuf>
|
||||||
# include <streambuf>
|
#include <ostream>
|
||||||
# include <iostream>
|
#include <cstdio>
|
||||||
#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 +56,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 +79,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 +121,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 _WIN32
|
||||||
|
static void has_no_console() { has_console = false; }
|
||||||
|
#endif
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
@@ -152,9 +139,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 _WIN32
|
||||||
|
static bool has_console;
|
||||||
|
#endif
|
||||||
static sgDebugClass logClass;
|
static sgDebugClass logClass;
|
||||||
static sgDebugPriority logPriority;
|
static sgDebugPriority logPriority;
|
||||||
|
|
||||||
@@ -168,11 +158,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 +167,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 _WIN32
|
||||||
static bool has_console = false;
|
|
||||||
if ( logging_enabled ) {
|
if ( logging_enabled ) {
|
||||||
if ( !has_console ) {
|
if ( !has_console ) {
|
||||||
AllocConsole();
|
AllocConsole();
|
||||||
@@ -194,7 +185,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 +224,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 +249,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 +282,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 +294,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
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include "Debug/logstream.hxx"
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
|
||||||
class Test {
|
class Test {
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ includedir = @includedir@/environment
|
|||||||
|
|
||||||
lib_LIBRARIES = libsgenvironment.a
|
lib_LIBRARIES = libsgenvironment.a
|
||||||
|
|
||||||
include_HEADERS = metar.hxx visual_enviro.hxx
|
include_HEADERS = metar.hxx visual_enviro.hxx precipitation.hxx
|
||||||
|
|
||||||
libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx
|
libsgenvironment_a_SOURCES = metar.cxx visual_enviro.cxx precipitation.cxx
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)
|
INCLUDES = -I$(top_srcdir)
|
||||||
|
|||||||
@@ -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,6 +24,9 @@
|
|||||||
* @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 <time.h>
|
||||||
@@ -107,7 +110,7 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
|
|||||||
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();
|
||||||
|
|
||||||
@@ -133,7 +136,7 @@ SGMetar::SGMetar(const string& m, const string& proxy, const string& port,
|
|||||||
|
|
||||||
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 = "";
|
||||||
@@ -156,7 +159,7 @@ void SGMetar::useCurrentDate()
|
|||||||
{
|
{
|
||||||
struct tm now;
|
struct tm now;
|
||||||
time_t now_sec = time(0);
|
time_t now_sec = time(0);
|
||||||
#if defined( _MSC_VER ) || defined ( __MINGW32__ )
|
#ifdef _WIN32
|
||||||
now = *gmtime(&now_sec);
|
now = *gmtime(&now_sec);
|
||||||
#else
|
#else
|
||||||
gmtime_r(&now_sec, &now);
|
gmtime_r(&now_sec, &now);
|
||||||
@@ -196,7 +199,7 @@ 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 ";
|
||||||
@@ -218,7 +221,7 @@ char *SGMetar::loadData(const char *id, const string& proxy, const string& port,
|
|||||||
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: ", 9))
|
if (!strncmp(buf, "X-MetarProxy: ", 13))
|
||||||
_x_proxy = true;
|
_x_proxy = true;
|
||||||
}
|
}
|
||||||
if (i) {
|
if (i) {
|
||||||
@@ -233,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);
|
||||||
@@ -489,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;
|
||||||
|
|
||||||
@@ -608,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;
|
||||||
@@ -713,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 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -743,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
|
||||||
@@ -832,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')
|
||||||
@@ -957,11 +968,13 @@ bool SGMetar::scanRunwayReport()
|
|||||||
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))
|
||||||
@@ -970,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)
|
||||||
@@ -996,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;
|
||||||
@@ -1075,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 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1167,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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -130,25 +130,21 @@ 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) {}
|
|
||||||
|
|
||||||
void set(double alt, int cov = -1);
|
void set(double alt, int cov = -1);
|
||||||
|
|
||||||
inline int getCoverage() const { return _coverage; }
|
inline int getCoverage() const { return _coverage; }
|
||||||
inline double getAltitude_m() const { return _altitude; }
|
inline double getAltitude_m() const { return _altitude; }
|
||||||
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
|
inline double getAltitude_ft() const { return _altitude == NaN ? NaN : _altitude * SG_METER_TO_FEET; }
|
||||||
inline char *getTypeString() const { return _type; }
|
inline const char *getTypeString() const { return _type; }
|
||||||
inline char *getTypeLongString() const { return _type_long; }
|
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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,195 @@
|
|||||||
|
/**
|
||||||
|
* @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>
|
||||||
|
#include <osg/ClipNode>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SGPrecipitation constructor
|
||||||
|
*
|
||||||
|
* Build a new OSG object from osgParticle.
|
||||||
|
*/
|
||||||
|
SGPrecipitation::SGPrecipitation() :
|
||||||
|
_freeze(false), _snow_intensity(0.0), _rain_intensity(0.0), _clip_distance(5.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);
|
||||||
|
|
||||||
|
if (_clip_distance!=0.0)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::ClipNode> clipNode = new osg::ClipNode;
|
||||||
|
clipNode->addClipPlane( new osg::ClipPlane( 0 ) );
|
||||||
|
clipNode->getClipPlane(0)->setClipPlane( 0.0, 0.0, -1.0, -_clip_distance );
|
||||||
|
clipNode->setReferenceFrame(osg::ClipNode::ABSOLUTE_RF);
|
||||||
|
clipNode->addChild(_precipitationEffect.get());
|
||||||
|
|
||||||
|
group->addChild(clipNode.get());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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,61 @@
|
|||||||
|
/**
|
||||||
|
* @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;
|
||||||
|
float _clip_distance;
|
||||||
|
|
||||||
|
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
|
||||||
@@ -16,28 +16,29 @@
|
|||||||
//
|
//
|
||||||
// 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.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include <simgear_config.h>
|
# include <simgear_config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <plib/sg.h>
|
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
|
#include <simgear/structure/SGReferenced.hxx>
|
||||||
|
#include <simgear/structure/SGSharedPtr.hxx>
|
||||||
#include <simgear/math/sg_random.h>
|
#include <simgear/math/sg_random.h>
|
||||||
#include <simgear/math/sg_geodesy.hxx>
|
#include <simgear/math/sg_geodesy.hxx>
|
||||||
#include <simgear/math/point3d.hxx>
|
#include <simgear/math/point3d.hxx>
|
||||||
#include <simgear/math/polar3d.hxx>
|
#include <simgear/math/polar3d.hxx>
|
||||||
#include <simgear/sound/soundmgr_openal.hxx>
|
#include <simgear/sound/sample_group.hxx>
|
||||||
#include <simgear/scene/sky/cloudfield.hxx>
|
#include <simgear/scene/sky/cloudfield.hxx>
|
||||||
#include <simgear/scene/sky/newcloud.hxx>
|
#include <simgear/scene/sky/newcloud.hxx>
|
||||||
|
#include <simgear/props/props.hxx>
|
||||||
#include "visual_enviro.hxx"
|
#include "visual_enviro.hxx"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
using std::vector;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -50,6 +51,85 @@ typedef struct {
|
|||||||
static float rainpos[MAX_RAIN_SLICE];
|
static float rainpos[MAX_RAIN_SLICE];
|
||||||
#define MAX_LT_TREE_SEG 400
|
#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.
|
* A class to render lightnings.
|
||||||
*/
|
*/
|
||||||
@@ -84,23 +164,23 @@ static list_of_lightning lightnings;
|
|||||||
|
|
||||||
SGEnviro sgEnviro;
|
SGEnviro sgEnviro;
|
||||||
|
|
||||||
SGEnviro::SGEnviro(void) :
|
SGEnviro::SGEnviro() :
|
||||||
view_in_cloud(false),
|
view_in_cloud(false),
|
||||||
turbulence_enable_state(false),
|
|
||||||
precipitation_enable_state(true),
|
precipitation_enable_state(true),
|
||||||
lightning_enable_state(false),
|
precipitation_density(100.0),
|
||||||
soundMgr(NULL),
|
precipitation_max_alt(0.0),
|
||||||
snd_active(false),
|
turbulence_enable_state(false),
|
||||||
snd_dist(0.0),
|
|
||||||
last_cloud_turbulence(0.0),
|
last_cloud_turbulence(0.0),
|
||||||
cloud_turbulence(0.0),
|
cloud_turbulence(0.0),
|
||||||
|
lightning_enable_state(false),
|
||||||
elapsed_time(0.0),
|
elapsed_time(0.0),
|
||||||
dt(0.0),
|
dt(0.0),
|
||||||
|
sampleGroup(NULL),
|
||||||
|
snd_active(false),
|
||||||
|
snd_dist(0.0),
|
||||||
min_time_before_lt(0.0),
|
min_time_before_lt(0.0),
|
||||||
fov_width(55.0),
|
fov_width(55.0),
|
||||||
fov_height(55.0),
|
fov_height(55.0)
|
||||||
precipitation_max_alt(0.0),
|
|
||||||
precipitation_density(100.0)
|
|
||||||
|
|
||||||
{
|
{
|
||||||
for(int i = 0; i < MAX_RAIN_SLICE ; i++)
|
for(int i = 0; i < MAX_RAIN_SLICE ; i++)
|
||||||
@@ -109,6 +189,10 @@ SGEnviro::SGEnviro(void) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
SGEnviro::~SGEnviro(void) {
|
SGEnviro::~SGEnviro(void) {
|
||||||
|
if (sampleGroup) delete sampleGroup;
|
||||||
|
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
list_of_lightning::iterator iLightning;
|
list_of_lightning::iterator iLightning;
|
||||||
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
|
for( iLightning = lightnings.begin() ; iLightning != lightnings.end() ; iLightning++ ) {
|
||||||
delete (*iLightning);
|
delete (*iLightning);
|
||||||
@@ -117,10 +201,10 @@ SGEnviro::~SGEnviro(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time) {
|
void SGEnviro::startOfFrame( sgVec3 p, sgVec3 up, double lon, double lat, double alt, double delta_time) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
view_in_cloud = false;
|
view_in_cloud = false;
|
||||||
// ask the impostor cache to do some cleanup
|
// ask the impostor cache to do some cleanup
|
||||||
if(SGNewCloud::cldCache)
|
|
||||||
SGNewCloud::cldCache->startNewFrame();
|
|
||||||
last_cloud_turbulence = cloud_turbulence;
|
last_cloud_turbulence = cloud_turbulence;
|
||||||
cloud_turbulence = 0.0;
|
cloud_turbulence = 0.0;
|
||||||
elapsed_time += delta_time;
|
elapsed_time += delta_time;
|
||||||
@@ -171,43 +255,10 @@ void SGEnviro::set_view_in_cloud(bool incloud) {
|
|||||||
view_in_cloud = incloud;
|
view_in_cloud = incloud;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SGEnviro::get_CacheResolution(void) const {
|
|
||||||
return SGCloudField::get_CacheResolution();
|
|
||||||
}
|
|
||||||
|
|
||||||
int SGEnviro::get_clouds_CacheSize(void) const {
|
|
||||||
return SGCloudField::get_CacheSize();
|
|
||||||
}
|
|
||||||
float SGEnviro::get_clouds_visibility(void) const {
|
|
||||||
return SGCloudField::get_CloudVis();
|
|
||||||
}
|
|
||||||
float SGEnviro::get_clouds_density(void) const {
|
|
||||||
return SGCloudField::get_density();
|
|
||||||
}
|
|
||||||
bool SGEnviro::get_clouds_enable_state(void) const {
|
|
||||||
return SGCloudField::get_enable3dClouds();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SGEnviro::get_turbulence_enable_state(void) const {
|
bool SGEnviro::get_turbulence_enable_state(void) const {
|
||||||
return turbulence_enable_state;
|
return turbulence_enable_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::set_CacheResolution(int resolutionPixels) {
|
|
||||||
SGCloudField::set_CacheResolution(resolutionPixels);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SGEnviro::set_clouds_CacheSize(int sizeKb) {
|
|
||||||
SGCloudField::set_CacheSize(sizeKb);
|
|
||||||
}
|
|
||||||
void SGEnviro::set_clouds_visibility(float distance) {
|
|
||||||
SGCloudField::set_CloudVis(distance);
|
|
||||||
}
|
|
||||||
void SGEnviro::set_clouds_density(float density) {
|
|
||||||
SGCloudField::set_density(density);
|
|
||||||
}
|
|
||||||
void SGEnviro::set_clouds_enable_state(bool enable) {
|
|
||||||
SGCloudField::set_enable3dClouds(enable);
|
|
||||||
}
|
|
||||||
void SGEnviro::set_turbulence_enable_state(bool enable) {
|
void SGEnviro::set_turbulence_enable_state(bool enable) {
|
||||||
turbulence_enable_state = enable;
|
turbulence_enable_state = enable;
|
||||||
}
|
}
|
||||||
@@ -239,13 +290,15 @@ void SGEnviro::set_lightning_enable_state(bool enable) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::setLight(sgVec4 adj_fog_color) {
|
void SGEnviro::setLight(sgVec4 adj_fog_color) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
sgCopyVec4( fog_color, adj_fog_color );
|
sgCopyVec4( fog_color, adj_fog_color );
|
||||||
if( false ) {
|
if( false ) {
|
||||||
// ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
|
// ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
void SGEnviro::callback_cloud(float heading, float alt, float radius, int familly, float dist, int cloudId) {
|
void SGEnviro::callback_cloud(float heading, float alt, float radius, int family, float dist, int cloudId) {
|
||||||
// send data to wx radar
|
// send data to wx radar
|
||||||
// compute turbulence
|
// compute turbulence
|
||||||
// draw precipitation
|
// draw precipitation
|
||||||
@@ -255,7 +308,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
// http://www.pilotfriend.com/flight_training/weather/THUNDERSTORM%20HAZARDS1.htm
|
// http://www.pilotfriend.com/flight_training/weather/THUNDERSTORM%20HAZARDS1.htm
|
||||||
double turbulence = 0.0;
|
double turbulence = 0.0;
|
||||||
if( dist < radius * radius * 2.25f ) {
|
if( dist < radius * radius * 2.25f ) {
|
||||||
switch(familly) {
|
switch(family) {
|
||||||
case SGNewCloud::CLFamilly_st:
|
case SGNewCloud::CLFamilly_st:
|
||||||
turbulence = 0.2;
|
turbulence = 0.2;
|
||||||
break;
|
break;
|
||||||
@@ -290,7 +343,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
// convert to LWC for radar (experimental)
|
// convert to LWC for radar (experimental)
|
||||||
// http://www-das.uwyo.edu/~geerts/cwx/notes/chap08/moist_cloud.html
|
// http://www-das.uwyo.edu/~geerts/cwx/notes/chap08/moist_cloud.html
|
||||||
double LWC = 0.0;
|
double LWC = 0.0;
|
||||||
switch(familly) {
|
switch(family) {
|
||||||
case SGNewCloud::CLFamilly_st:
|
case SGNewCloud::CLFamilly_st:
|
||||||
LWC = 0.29;
|
LWC = 0.29;
|
||||||
break;
|
break;
|
||||||
@@ -317,6 +370,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
LWC = 0.29*2.0;
|
LWC = 0.29*2.0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// add to the list for the wxRadar instrument
|
// add to the list for the wxRadar instrument
|
||||||
if( LWC > 0.0 )
|
if( LWC > 0.0 )
|
||||||
radarEcho.push_back( SGWxRadarEcho ( heading, alt, radius, dist, LWC, false, cloudId ) );
|
radarEcho.push_back( SGWxRadarEcho ( heading, alt, radius, dist, LWC, false, cloudId ) );
|
||||||
@@ -324,7 +378,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
// NB:data valid only from cockpit view
|
// NB:data valid only from cockpit view
|
||||||
|
|
||||||
// spawn a new lightning
|
// spawn a new lightning
|
||||||
if(lightning_enable_state && min_time_before_lt <= 0.0 && (familly == SGNewCloud::CLFamilly_cb) &&
|
if(lightning_enable_state && min_time_before_lt <= 0.0 && (family == SGNewCloud::CLFamilly_cb) &&
|
||||||
dist < 15000.0 * 15000.0 && sg_random() > 0.9f) {
|
dist < 15000.0 * 15000.0 && sg_random() > 0.9f) {
|
||||||
double lat, lon;
|
double lat, lon;
|
||||||
Point3D orig, dest;
|
Point3D orig, dest;
|
||||||
@@ -343,7 +397,7 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
// min_time_before_lt = 5.0;
|
// min_time_before_lt = 5.0;
|
||||||
}
|
}
|
||||||
if( (alt - radius * 0.1) > precipitation_max_alt )
|
if( (alt - radius * 0.1) > precipitation_max_alt )
|
||||||
switch(familly) {
|
switch(family) {
|
||||||
case SGNewCloud::CLFamilly_st:
|
case SGNewCloud::CLFamilly_st:
|
||||||
case SGNewCloud::CLFamilly_cu:
|
case SGNewCloud::CLFamilly_cu:
|
||||||
case SGNewCloud::CLFamilly_cb:
|
case SGNewCloud::CLFamilly_cb:
|
||||||
@@ -354,32 +408,35 @@ void SGEnviro::callback_cloud(float heading, float alt, float radius, int famill
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
list_of_SGWxRadarEcho *SGEnviro::get_radar_echo(void) {
|
list_of_SGWxRadarEcho *SGEnviro::get_radar_echo(void) {
|
||||||
return &radarEcho;
|
return &radarEcho;
|
||||||
}
|
}
|
||||||
|
|
||||||
// precipitation rendering code
|
// precipitation rendering code
|
||||||
void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed) {
|
void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down, double rain_norm, double speed) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
sgVec3 light;
|
sgVec3 light;
|
||||||
sgVec3 min_light = {0.35, 0.35, 0.35};
|
|
||||||
sgAddVec3( light, fog_color, min_light );
|
sgAddVec3( light, fog_color, min_light );
|
||||||
float da = SG_PI * 2.0f / (float) slices;
|
float da = SG_PI * 2.0f / (float) slices;
|
||||||
// low number = faster
|
// low number = faster
|
||||||
float speedf = 2.5f - speed / 200.0;
|
float speedf = streak_period_max - speed * streak_period_change_per_kt;
|
||||||
if( speedf < 1.0f )
|
if( speedf < streak_period_min )
|
||||||
speedf = 1.0f;
|
speedf = streak_period_min;
|
||||||
float lenf = 0.03f + speed / 2000.0;
|
float lenf = streak_length_min + speed * streak_length_change_per_kt;
|
||||||
if( lenf > 0.10f )
|
if( lenf > streak_length_max )
|
||||||
lenf = 0.10f;
|
lenf = streak_length_max;
|
||||||
float t = fmod((float) elapsed_time, speedf) / speedf;
|
float t = fmod((float) elapsed_time, speedf) / speedf;
|
||||||
// t = 0.1f;
|
// t = 0.1f;
|
||||||
if( !down )
|
if( !down )
|
||||||
t = 1.0f - t;
|
t = 1.0f - t;
|
||||||
float angle = 0.0f;
|
float angle = 0.0f;
|
||||||
glColor4f(1.0f, 0.7f, 0.7f, 0.9f);
|
//glColor4f(1.0f, 0.7f, 0.7f, 0.9f); // XXX unneeded? overriden below
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
int rainpos_indice = 0;
|
if (slices > MAX_RAIN_SLICE)
|
||||||
|
slices = MAX_RAIN_SLICE; // should never happen
|
||||||
for( int i = 0 ; i < slices ; i++ ) {
|
for( int i = 0 ; i < slices ; i++ ) {
|
||||||
float x = cos(angle) * baseRadius;
|
float x = cos(angle) * baseRadius;
|
||||||
float y = sin(angle) * baseRadius;
|
float y = sin(angle) * baseRadius;
|
||||||
@@ -387,12 +444,14 @@ void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down,
|
|||||||
sgVec3 dir = {x, -height, y};
|
sgVec3 dir = {x, -height, y};
|
||||||
|
|
||||||
// rain drops at 2 different speed to simulate depth
|
// rain drops at 2 different speed to simulate depth
|
||||||
float t1 = (i & 1 ? t : t + t) + rainpos[rainpos_indice];
|
float t1 = (i & 1 ? t : t + t) + rainpos[i];
|
||||||
if(t1 > 1.0f) t1 -= 1.0f;
|
if(t1 > 1.0f) t1 -= 1.0f;
|
||||||
if(t1 > 1.0f) t1 -= 1.0f;
|
if(t1 > 1.0f) t1 -= 1.0f;
|
||||||
|
|
||||||
// distant raindrops are more transparent
|
// distant raindrops are more transparent
|
||||||
float c = (i & 1 ? t1 * 0.5f : t1 * 0.9f);
|
float c = t1 * (i & 1 ?
|
||||||
|
streak_bright_farmost_layer
|
||||||
|
: streak_bright_nearmost_layer);
|
||||||
glColor4f(c * light[0], c * light[1], c * light[2], c);
|
glColor4f(c * light[0], c * light[1], c * light[2], c);
|
||||||
sgVec3 p1, p2;
|
sgVec3 p1, p2;
|
||||||
sgScaleVec3(p1, dir, t1);
|
sgScaleVec3(p1, dir, t1);
|
||||||
@@ -402,13 +461,30 @@ void SGEnviro::DrawCone2(float baseRadius, float height, int slices, bool down,
|
|||||||
|
|
||||||
glVertex3f(p1[0], p1[1] + height, p1[2]);
|
glVertex3f(p1[0], p1[1] + height, p1[2]);
|
||||||
glVertex3f(p2[0], p2[1] + height, p2[2]);
|
glVertex3f(p2[0], p2[1] + height, p2[2]);
|
||||||
if( ++rainpos_indice >= MAX_RAIN_SLICE )
|
|
||||||
rainpos_indice = 0;
|
|
||||||
}
|
}
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::drawRain(double pitch, double roll, double heading, double speed, double rain_norm) {
|
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);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
@@ -419,25 +495,33 @@ void SGEnviro::drawRain(double pitch, double roll, double heading, double speed,
|
|||||||
glDisable( GL_FOG );
|
glDisable( GL_FOG );
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
|
|
||||||
int slice_count = (40.0 + rain_norm*150.0)* precipitation_density / 100.0;
|
int slice_count = static_cast<int>(
|
||||||
|
(streak_count_min + rain_norm*(streak_count_max-streak_count_min))
|
||||||
|
* precipitation_density / 100.0);
|
||||||
|
|
||||||
float angle = speed;
|
// www.wonderquest.com/falling-raindrops.htm says that
|
||||||
if( angle > 90.0 )
|
// Raindrop terminal velocity is 5 to 20mph
|
||||||
angle = 90.0;
|
// 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();
|
glPushMatrix();
|
||||||
// TODO:find the real view orientation, not the AC one
|
// the cone rotate with hspeed
|
||||||
// the cone rotate with speed
|
|
||||||
angle = -pitch - angle;
|
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);
|
glRotatef(angle, 1.0, 0.0, 0.0);
|
||||||
glRotatef(roll, 0.0, 1.0, 0.0);
|
|
||||||
glRotatef(heading, 0.0, 0.0, 1.0);
|
|
||||||
|
|
||||||
// up cone
|
// up cone
|
||||||
DrawCone2(15.0, 30.0, slice_count, true, rain_norm, speed);
|
DrawCone2(cone_base_radius, cone_height,
|
||||||
|
slice_count, true, rain_norm, hspeed);
|
||||||
// down cone (usually not visible)
|
// down cone (usually not visible)
|
||||||
if(angle > 0.0 || heading != 0.0)
|
if(angle > 0.0 || heading != 0.0)
|
||||||
DrawCone2(15.0, -30.0, slice_count, false, rain_norm, speed);
|
DrawCone2(cone_base_radius, -cone_height,
|
||||||
|
slice_count, false, rain_norm, hspeed);
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
@@ -448,23 +532,25 @@ void SGEnviro::drawRain(double pitch, double roll, double heading, double speed,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::set_soundMgr(SGSoundMgr *mgr) {
|
void SGEnviro::set_sampleGroup(SGSampleGroup *sgr) {
|
||||||
soundMgr = mgr;
|
sampleGroup = sgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::drawPrecipitation(double rain_norm, double snow_norm, double hail_norm, double pitch, double roll, double heading, double speed) {
|
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_enable_state && rain_norm > 0.0)
|
||||||
if( precipitation_max_alt >= last_alt )
|
if( precipitation_max_alt >= last_alt )
|
||||||
drawRain(pitch, roll, heading, speed, rain_norm);
|
drawRain(pitch, roll, heading, hspeed, rain_norm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SGLightning::SGLightning(double _lon, double _lat, double _alt) :
|
SGLightning::SGLightning(double _lon, double _lat, double _alt) :
|
||||||
|
nb_tree(0),
|
||||||
lon(_lon),
|
lon(_lon),
|
||||||
lat(_lat),
|
lat(_lat),
|
||||||
alt(_alt),
|
alt(_alt),
|
||||||
age(1.0 + sg_random() * 4.0),
|
age(1.0 + sg_random() * 4.0)
|
||||||
nb_tree(0)
|
|
||||||
{
|
{
|
||||||
// sequence_count = 1 + sg_random() * 5.0;
|
// sequence_count = 1 + sg_random() * 5.0;
|
||||||
lt_build();
|
lt_build();
|
||||||
@@ -475,6 +561,8 @@ SGLightning::~SGLightning() {
|
|||||||
|
|
||||||
// lightning rendering code
|
// lightning rendering code
|
||||||
void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize) {
|
void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy, int nbseg, float segsize) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
|
|
||||||
sgVec3 dir, newdir;
|
sgVec3 dir, newdir;
|
||||||
int nseg = 0;
|
int nseg = 0;
|
||||||
@@ -500,7 +588,7 @@ void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy
|
|||||||
nseg++;
|
nseg++;
|
||||||
// add a branch
|
// add a branch
|
||||||
if( energy * sg_random() > 0.8f )
|
if( energy * sg_random() > 0.8f )
|
||||||
lt_build_tree_branch(tree_nr + 1, pt, energy * 0.9f, nbseg == 50 ? 10 : nbseg * 0.4f, segsize * 0.7f);
|
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 )
|
if( nb_tree >= MAX_LT_TREE_SEG )
|
||||||
return;
|
return;
|
||||||
@@ -522,13 +610,15 @@ void SGLightning::lt_build_tree_branch(int tree_nr, Point3D &start, float energy
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGLightning::lt_build(void) {
|
void SGLightning::lt_build(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
Point3D top;
|
Point3D top;
|
||||||
nb_tree = 0;
|
nb_tree = 0;
|
||||||
top[PX] = 0 ;
|
top[PX] = 0 ;
|
||||||
top[PY] = alt;
|
top[PY] = alt;
|
||||||
top[PZ] = 0;
|
top[PZ] = 0;
|
||||||
lt_build_tree_branch(0, top, 1.0, 50, top[PY] / 8.0);
|
lt_build_tree_branch(0, top, 1.0, 50, top[PY] / 8.0);
|
||||||
if( ! sgEnviro.soundMgr )
|
if( ! sgEnviro.sampleGroup )
|
||||||
return;
|
return;
|
||||||
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
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 );
|
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
@@ -547,6 +637,8 @@ void SGLightning::lt_build(void) {
|
|||||||
|
|
||||||
|
|
||||||
void SGLightning::lt_Render(void) {
|
void SGLightning::lt_Render(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
float flash = 0.5;
|
float flash = 0.5;
|
||||||
if( fmod(sgEnviro.elapsed_time*100.0, 100.0) > 50.0 )
|
if( fmod(sgEnviro.elapsed_time*100.0, 100.0) > 50.0 )
|
||||||
flash = sg_random() * 0.75f + 0.25f;
|
flash = sg_random() * 0.75f + 0.25f;
|
||||||
@@ -555,11 +647,12 @@ void SGLightning::lt_Render(void) {
|
|||||||
sgVec4 c;
|
sgVec4 c;
|
||||||
|
|
||||||
#define DRAW_SEG() \
|
#define DRAW_SEG() \
|
||||||
{glBegin(GL_LINES); \
|
{glColorMaterial(GL_FRONT, GL_EMISSION); \
|
||||||
|
glDisable(GL_LINE_SMOOTH); glBegin(GL_LINES); \
|
||||||
glColor4fv(c); \
|
glColor4fv(c); \
|
||||||
glVertex3f(lt_tree[n].pt[PX], lt_tree[n].pt[PZ], lt_tree[n].pt[PY]); \
|
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]); \
|
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();}
|
glEnd(); glEnable(GL_LINE_SMOOTH);}
|
||||||
|
|
||||||
glDepthMask( GL_FALSE );
|
glDepthMask( GL_FALSE );
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
@@ -570,10 +663,12 @@ void SGLightning::lt_Render(void) {
|
|||||||
glDisable( GL_FOG );
|
glDisable( GL_FOG );
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
sgMat4 modelview, tmp;
|
sgMat4 modelview, tmp;
|
||||||
ssgGetModelviewMatrix( modelview );
|
// OSGFIXME
|
||||||
|
// ssgGetModelviewMatrix( modelview );
|
||||||
sgCopyMat4( tmp, sgEnviro.transform );
|
sgCopyMat4( tmp, sgEnviro.transform );
|
||||||
sgPostMultMat4( tmp, modelview );
|
sgPostMultMat4( tmp, modelview );
|
||||||
ssgLoadModelviewMatrix( tmp );
|
// OSGFIXME
|
||||||
|
// ssgLoadModelviewMatrix( tmp );
|
||||||
|
|
||||||
Point3D start( sgEnviro.last_lon*SG_DEGREES_TO_RADIANS, sgEnviro.last_lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
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 );
|
Point3D dest( lon*SG_DEGREES_TO_RADIANS, lat*SG_DEGREES_TO_RADIANS, 0.0 );
|
||||||
@@ -631,6 +726,8 @@ void SGLightning::lt_Render(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::addLightning(double lon, double lat, double alt) {
|
void SGEnviro::addLightning(double lon, double lat, double alt) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
if( lightnings.size() > 10)
|
if( lightnings.size() > 10)
|
||||||
return;
|
return;
|
||||||
SGLightning *lt= new SGLightning(lon, lat, alt);
|
SGLightning *lt= new SGLightning(lon, lat, alt);
|
||||||
@@ -638,9 +735,11 @@ void SGEnviro::addLightning(double lon, double lat, double alt) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SGEnviro::drawLightning(void) {
|
void SGEnviro::drawLightning(void) {
|
||||||
|
// OSGFIXME
|
||||||
|
return;
|
||||||
list_of_lightning::iterator iLightning;
|
list_of_lightning::iterator iLightning;
|
||||||
// play 'thunder' for lightning
|
// play 'thunder' for lightning
|
||||||
if( snd_active )
|
if( snd_active ) {
|
||||||
if( !snd_playing ) {
|
if( !snd_playing ) {
|
||||||
// wait until sound has reached us
|
// wait until sound has reached us
|
||||||
snd_timer += dt;
|
snd_timer += dt;
|
||||||
@@ -654,20 +753,21 @@ void SGEnviro::drawLightning(void) {
|
|||||||
double ax = 0.0, ay = 0.0;
|
double ax = 0.0, ay = 0.0;
|
||||||
ax = cos(course) * dist;
|
ax = cos(course) * dist;
|
||||||
ay = sin(course) * dist;
|
ay = sin(course) * dist;
|
||||||
SGSoundSample *snd = soundMgr->find("thunder");
|
SGSharedPtr<SGSoundSample> snd = sampleGroup->find("thunder");
|
||||||
if( snd ) {
|
if( snd ) {
|
||||||
ALfloat pos[3]={ax, ay, -sgEnviro.last_alt };
|
SGVec3d pos = SGVec3d(ax, ay, -sgEnviro.last_alt);
|
||||||
snd->set_source_pos(pos);
|
snd->set_position(pos);
|
||||||
snd->play_once();
|
snd->play_once();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if( !soundMgr->is_playing("thunder") ) {
|
if( !sampleGroup->is_playing("thunder") ) {
|
||||||
snd_active = false;
|
snd_active = false;
|
||||||
snd_playing = false;
|
snd_playing = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
if( ! lightning_enable_state )
|
if( ! lightning_enable_state )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -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, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
#ifndef _VISUAL_ENVIRO_HXX
|
#ifndef _VISUAL_ENVIRO_HXX
|
||||||
#define _VISUAL_ENVIRO_HXX
|
#define _VISUAL_ENVIRO_HXX
|
||||||
|
|
||||||
|
#include <plib/sg.h>
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
SG_USING_STD(vector);
|
using std::vector;
|
||||||
SG_USING_STD(string);
|
using std::string;
|
||||||
|
|
||||||
class SGLightning;
|
class SGLightning;
|
||||||
class SGSoundMgr;
|
class SGSampleGroup;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simulate some echo on a weather radar.
|
* Simulate some echo on a weather radar.
|
||||||
@@ -38,7 +40,8 @@ class SGSoundMgr;
|
|||||||
*/
|
*/
|
||||||
class SGWxRadarEcho {
|
class SGWxRadarEcho {
|
||||||
public:
|
public:
|
||||||
SGWxRadarEcho(float _heading, float _alt, float _radius, float _dist, double _LWC, bool _lightning, int _cloudId) :
|
SGWxRadarEcho(float _heading, float _alt, float _radius, float _dist,
|
||||||
|
double _LWC, bool _lightning, int _cloudId ) :
|
||||||
heading( _heading ),
|
heading( _heading ),
|
||||||
alt ( _alt ),
|
alt ( _alt ),
|
||||||
radius ( _radius ),
|
radius ( _radius ),
|
||||||
@@ -54,7 +57,7 @@ public:
|
|||||||
/** reflectivity converted to liquid water content. */
|
/** reflectivity converted to liquid water content. */
|
||||||
double LWC;
|
double LWC;
|
||||||
/** if true then this data is for a lightning else it is for water echo. */
|
/** if true then this data is for a lightning else it is for water echo. */
|
||||||
bool lightning;
|
bool lightning;
|
||||||
/** Unique identifier of cloud */
|
/** Unique identifier of cloud */
|
||||||
int cloudId;
|
int cloudId;
|
||||||
};
|
};
|
||||||
@@ -81,7 +84,7 @@ private:
|
|||||||
sgVec4 fog_color;
|
sgVec4 fog_color;
|
||||||
sgMat4 transform;
|
sgMat4 transform;
|
||||||
double last_lon, last_lat, last_alt;
|
double last_lon, last_lat, last_alt;
|
||||||
SGSoundMgr *soundMgr;
|
SGSampleGroup *sampleGroup;
|
||||||
bool snd_active, snd_playing;
|
bool snd_active, snd_playing;
|
||||||
double snd_timer, snd_wait, snd_pos_lat, snd_pos_lon, snd_dist;
|
double snd_timer, snd_wait, snd_pos_lat, snd_pos_lon, snd_dist;
|
||||||
double min_time_before_lt;
|
double min_time_before_lt;
|
||||||
@@ -90,11 +93,31 @@ private:
|
|||||||
|
|
||||||
/** a list of all the radar echo. */
|
/** a list of all the radar echo. */
|
||||||
list_of_SGWxRadarEcho radarEcho;
|
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:
|
public:
|
||||||
SGEnviro();
|
SGEnviro();
|
||||||
~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.
|
* Forward a few states used for renderings.
|
||||||
*/
|
*/
|
||||||
@@ -102,17 +125,18 @@ public:
|
|||||||
|
|
||||||
void endOfFrame(void);
|
void endOfFrame(void);
|
||||||
|
|
||||||
|
#if 0
|
||||||
/**
|
/**
|
||||||
* Whenever a cloud is drawn we check his 'impact' on the environment.
|
* Whenever a cloud is drawn we check his 'impact' on the environment.
|
||||||
* @param heading direction of cloud in radians
|
* @param heading direction of cloud in radians
|
||||||
* @param alt asl of cloud in meters
|
* @param alt asl of cloud in meters
|
||||||
* @param radius radius of cloud in meters
|
* @param radius radius of cloud in meters
|
||||||
* @param familly cloud familly
|
* @param family cloud family
|
||||||
* @param dist squared dist to cloud in meters
|
* @param dist squared dist to cloud in meters
|
||||||
*/
|
*/
|
||||||
void callback_cloud(float heading, float alt, float radius, int familly, float dist, int cloudId);
|
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 speed, double rain_norm);
|
void drawRain(double pitch, double roll, double heading, double hspeed, double rain_norm);
|
||||||
/**
|
/**
|
||||||
* Draw rain or snow precipitation around the viewer.
|
* Draw rain or snow precipitation around the viewer.
|
||||||
* @param rain_norm rain normalized intensity given by metar class
|
* @param rain_norm rain normalized intensity given by metar class
|
||||||
@@ -120,10 +144,10 @@ public:
|
|||||||
* @param hail_norm hail normalized intensity given by metar class
|
* @param hail_norm hail normalized intensity given by metar class
|
||||||
* @param pitch pitch rotation of viewer
|
* @param pitch pitch rotation of viewer
|
||||||
* @param roll roll rotation of viewer
|
* @param roll roll rotation of viewer
|
||||||
* @param speed moving speed of viewer in kt
|
* @param hspeed moving horizontal speed of viewer in kt
|
||||||
*/
|
*/
|
||||||
void drawPrecipitation(double rain_norm, double snow_norm, double hail_norm,
|
void drawPrecipitation(double rain_norm, double snow_norm, double hail_norm,
|
||||||
double pitch, double roll, double heading, double speed);
|
double pitch, double roll, double heading, double hspeed);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw the lightnings spawned by cumulo nimbus.
|
* Draw the lightnings spawned by cumulo nimbus.
|
||||||
@@ -186,6 +210,12 @@ public:
|
|||||||
float get_precipitation_density(void) const;
|
float get_precipitation_density(void) const;
|
||||||
bool get_precipitation_enable_state(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);
|
void set_precipitation_density(float density);
|
||||||
/**
|
/**
|
||||||
* Enable or disable the rendering of precipitation around the viewer.
|
* Enable or disable the rendering of precipitation around the viewer.
|
||||||
@@ -213,7 +243,7 @@ public:
|
|||||||
* Forward the sound manager instance to be able to play samples.
|
* Forward the sound manager instance to be able to play samples.
|
||||||
* @param mgr a running sound manager
|
* @param mgr a running sound manager
|
||||||
*/
|
*/
|
||||||
void set_soundMgr(SGSoundMgr *mgr);
|
void set_sampleGroup(SGSampleGroup *sgr);
|
||||||
|
|
||||||
void setFOV( float w, float h );
|
void setFOV( float w, float h );
|
||||||
void getFOV( float &w, float &h );
|
void getFOV( float &w, float &h );
|
||||||
|
|||||||
@@ -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$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -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,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;
|
||||||
@@ -43,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) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,6 +42,9 @@
|
|||||||
#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
|
||||||
*
|
*
|
||||||
@@ -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,8 @@ 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; }
|
||||||
|
inline const SGVec3d *getPlanets() const { 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 +170,8 @@ 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(); }
|
||||||
|
inline const SGVec3d *getStars() const { 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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|
||||||
@@ -26,25 +25,19 @@
|
|||||||
#endif
|
#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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -53,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, ',' );
|
||||||
@@ -117,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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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$
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|||||||
+26
-8
@@ -26,41 +26,59 @@ noinst_PROGRAMS = decode_binobj socktest lowtest tcp_server tcp_client
|
|||||||
|
|
||||||
tcp_server_SOURCES = tcp_server.cxx
|
tcp_server_SOURCES = tcp_server.cxx
|
||||||
|
|
||||||
|
if HAVE_FRAMEWORK_PLIB
|
||||||
|
tcp_server_LDFLAGS = $(plib_FRAMEWORK)
|
||||||
|
else
|
||||||
|
tcp_server_PLIB_LIBS = -lplibnet -lplibul
|
||||||
|
endif
|
||||||
|
|
||||||
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 \
|
||||||
-lplibnet -lplibul -lz \
|
$(tcp_server_PLIB_LIBS) -lz \
|
||||||
$(network_LIBS) \
|
$(network_LIBS) \
|
||||||
$(base_LIBS)
|
$(base_LIBS)
|
||||||
|
|
||||||
tcp_client_SOURCES = tcp_client.cxx
|
tcp_client_SOURCES = tcp_client.cxx
|
||||||
|
|
||||||
|
if HAVE_FRAMEWORK_PLIB
|
||||||
|
tcp_client_LDFLAGS = $(plib_FRAMEWORK)
|
||||||
|
else
|
||||||
|
tcp_client_PLIB_LIBS = -lplibnet -lplibul
|
||||||
|
endif
|
||||||
|
|
||||||
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 \
|
||||||
-lplibnet -lplibul -lz \
|
$(tcp_client_PLIB_LIBS) -lz \
|
||||||
$(network_LIBS) \
|
$(network_LIBS) \
|
||||||
$(base_LIBS)
|
$(base_LIBS)
|
||||||
|
|
||||||
socktest_SOURCES = socktest.cxx
|
socktest_SOURCES = socktest.cxx
|
||||||
|
|
||||||
|
if HAVE_FRAMEWORK_PLIB
|
||||||
|
socktest_LDFLAGS = $(plib_FRAMEWORK)
|
||||||
|
else
|
||||||
|
socktest_PLIB_LIBS = -lplibnet -lplibul
|
||||||
|
endif
|
||||||
|
|
||||||
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 \
|
||||||
-lplibnet -lplibul -lz \
|
$(socktest_PLIB_LIBS) -lz \
|
||||||
$(network_LIBS) \
|
$(network_LIBS) \
|
||||||
$(base_LIBS)
|
$(base_LIBS)
|
||||||
|
|
||||||
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 +87,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 \
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
#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 ) {
|
||||||
@@ -37,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",
|
||||||
@@ -52,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",
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+17
-9
@@ -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$
|
||||||
|
|
||||||
@@ -55,21 +55,25 @@ void sgWriteChar ( gzFile fd, const char var )
|
|||||||
|
|
||||||
void sgReadFloat ( gzFile fd, float *var )
|
void sgReadFloat ( gzFile fd, float *var )
|
||||||
{
|
{
|
||||||
if ( gzread ( fd, var, sizeof(float) ) != sizeof(float) ) {
|
union { float v; uint32_t u; } buf;
|
||||||
|
if ( gzread ( fd, &buf.u, sizeof(float) ) != sizeof(float) ) {
|
||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint32_t *)var);
|
sgEndianSwap( &buf.u );
|
||||||
}
|
}
|
||||||
|
*var = buf.v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgWriteFloat ( gzFile fd, const float var )
|
void sgWriteFloat ( gzFile fd, const float var )
|
||||||
{
|
{
|
||||||
|
union { float v; uint32_t u; } buf;
|
||||||
|
buf.v = var;
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint32_t *)&var);
|
sgEndianSwap( &buf.u );
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(float) ) != sizeof(float) ) {
|
if ( gzwrite ( fd, (void *)(&buf.u), sizeof(float) ) != sizeof(float) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,21 +81,25 @@ void sgWriteFloat ( gzFile fd, const float var )
|
|||||||
|
|
||||||
void sgReadDouble ( gzFile fd, double *var )
|
void sgReadDouble ( gzFile fd, double *var )
|
||||||
{
|
{
|
||||||
if ( gzread ( fd, var, sizeof(double) ) != sizeof(double) ) {
|
union { double v; uint64_t u; } buf;
|
||||||
|
if ( gzread ( fd, &buf.u, sizeof(double) ) != sizeof(double) ) {
|
||||||
read_error = true ;
|
read_error = true ;
|
||||||
}
|
}
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64_t *)var);
|
sgEndianSwap( &buf.u );
|
||||||
}
|
}
|
||||||
|
*var = buf.v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void sgWriteDouble ( gzFile fd, const double var )
|
void sgWriteDouble ( gzFile fd, const double var )
|
||||||
{
|
{
|
||||||
|
union { double v; uint64_t u; } buf;
|
||||||
|
buf.v = var;
|
||||||
if ( sgIsBigEndian() ) {
|
if ( sgIsBigEndian() ) {
|
||||||
sgEndianSwap( (uint64_t *)&var);
|
sgEndianSwap( &buf.u );
|
||||||
}
|
}
|
||||||
if ( gzwrite ( fd, (void *)(&var), sizeof(double) ) != sizeof(double) ) {
|
if ( gzwrite ( fd, (void *)(&buf.u), sizeof(double) ) != sizeof(double) ) {
|
||||||
write_error = true ;
|
write_error = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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$
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
+122
-131
@@ -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
|
||||||
@@ -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;
|
||||||
@@ -407,7 +423,7 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
sgEndianSwap( (uint64_t *)&(dptr[1]) );
|
sgEndianSwap( (uint64_t *)&(dptr[1]) );
|
||||||
sgEndianSwap( (uint64_t *)&(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;
|
||||||
|
|
||||||
@@ -447,7 +463,7 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
sgEndianSwap( (uint32_t *)&(fptr[1]) );
|
sgEndianSwap( (uint32_t *)&(fptr[1]) );
|
||||||
sgEndianSwap( (uint32_t *)&(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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -481,7 +497,8 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
sgEndianSwap( (uint32_t *)&(fptr[2]) );
|
sgEndianSwap( (uint32_t *)&(fptr[2]) );
|
||||||
sgEndianSwap( (uint32_t *)&(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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -547,7 +561,7 @@ bool SGBinObject::read_bin( const string& file ) {
|
|||||||
sgEndianSwap( (uint32_t *)&(fptr[0]) );
|
sgEndianSwap( (uint32_t *)&(fptr[0]) );
|
||||||
sgEndianSwap( (uint32_t *)&(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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -662,7 +665,7 @@ bool SGBinObject::write_bin( const string& base, const string& name,
|
|||||||
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
-19
@@ -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$
|
||||||
|
|
||||||
@@ -33,13 +33,14 @@
|
|||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
#include <simgear/math/sg_types.hxx>
|
#include <simgear/math/sg_types.hxx>
|
||||||
|
#include <simgear/math/point3d.hxx>
|
||||||
#include <simgear/bucket/newbucket.hxx>
|
#include <simgear/bucket/newbucket.hxx>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include STL_STRING
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -74,9 +75,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 +90,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 +126,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; }
|
||||||
|
|||||||
+32
-11
@@ -16,31 +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__)
|
#ifdef _WIN32
|
||||||
# include <io.h>
|
# include <io.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include <simgear/misc/stdint.hxx>
|
#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;
|
|
||||||
eof_flag = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -53,7 +55,7 @@ bool SGFile::open( const SGProtocolDir d ) {
|
|||||||
set_dir( d );
|
set_dir( d );
|
||||||
|
|
||||||
if ( get_dir() == SG_IO_OUT ) {
|
if ( get_dir() == SG_IO_OUT ) {
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#ifdef _WIN32
|
||||||
int mode = 00666;
|
int mode = 00666;
|
||||||
#else
|
#else
|
||||||
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
|
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
|
||||||
@@ -82,7 +84,20 @@ int SGFile::read( char *buf, int length ) {
|
|||||||
// read a chunk
|
// read a chunk
|
||||||
ssize_t result = ::read( fp, buf, length );
|
ssize_t result = ::read( fp, buf, length );
|
||||||
if ( length > 0 && result == 0 ) {
|
if ( length > 0 && result == 0 ) {
|
||||||
eof_flag = true;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -96,7 +111,13 @@ int SGFile::readline( char *buf, int length ) {
|
|||||||
// read a chunk
|
// read a chunk
|
||||||
ssize_t result = ::read( fp, buf, length );
|
ssize_t result = ::read( fp, buf, length );
|
||||||
if ( length > 0 && result == 0 ) {
|
if ( length > 0 && result == 0 ) {
|
||||||
eof_flag = true;
|
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
|
||||||
@@ -129,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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,6 +55,10 @@ class SGFile : public SGIOChannel {
|
|||||||
string file_name;
|
string file_name;
|
||||||
int fp;
|
int fp;
|
||||||
bool eof_flag;
|
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:
|
||||||
|
|
||||||
@@ -64,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();
|
||||||
|
|||||||
@@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
+12
-7
@@ -1,7 +1,16 @@
|
|||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <simgear_config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#define sleep(x) Sleep(x*1000)
|
||||||
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include STL_IOSTREAM
|
#endif
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "sg_socket.hxx"
|
#include "sg_socket.hxx"
|
||||||
#include "lowlevel.hxx"
|
#include "lowlevel.hxx"
|
||||||
@@ -10,8 +19,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() {
|
||||||
@@ -40,10 +49,6 @@ int main() {
|
|||||||
if ( s.readline( buf, 256 ) > 0 ) {
|
if ( s.readline( buf, 256 ) > 0 ) {
|
||||||
cout << "result = " << buf;
|
cout << "result = " << buf;
|
||||||
}
|
}
|
||||||
#ifdef __MINGW32__
|
|
||||||
Sleep(100);
|
|
||||||
#else
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,17 +1,18 @@
|
|||||||
#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
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TcpServer();
|
TcpServer();
|
||||||
|
~TcpServer();
|
||||||
bool open();
|
bool open();
|
||||||
bool process();
|
bool process();
|
||||||
bool close();
|
bool close();
|
||||||
@@ -25,6 +26,11 @@ TcpServer::TcpServer()
|
|||||||
channel = new SGSocket( "", "5500", "tcp" );
|
channel = new SGSocket( "", "5500", "tcp" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TcpServer::~TcpServer()
|
||||||
|
{
|
||||||
|
delete channel;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
TcpServer::open()
|
TcpServer::open()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,18 +2,16 @@ includedir = @includedir@/magvar
|
|||||||
|
|
||||||
lib_LIBRARIES = libsgmagvar.a
|
lib_LIBRARIES = libsgmagvar.a
|
||||||
|
|
||||||
include_HEADERS = magvar.hxx
|
include_HEADERS = magvar.hxx coremag.hxx
|
||||||
|
|
||||||
libsgmagvar_a_SOURCES = \
|
libsgmagvar_a_SOURCES = coremag.cxx magvar.cxx
|
||||||
coremag.hxx coremag.cxx \
|
|
||||||
magvar.cxx
|
|
||||||
|
|
||||||
noinst_PROGRAMS = testmagvar
|
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$
|
||||||
|
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <simgear/magvar/magvar.hxx>
|
#include <simgear/magvar/magvar.hxx>
|
||||||
|
#include <simgear/math/SGMath.hxx>
|
||||||
|
|
||||||
#include "coremag.hxx"
|
#include "coremag.hxx"
|
||||||
#include "magvar.hxx"
|
#include "magvar.hxx"
|
||||||
@@ -47,6 +48,12 @@ void SGMagVar::update( double lon, double lat, double alt_m, double jd ) {
|
|||||||
magdip = atan(field[5]/sqrt(field[3]*field[3]+field[4]*field[4]));
|
magdip = atan(field[5]/sqrt(field[3]*field[3]+field[4]*field[4]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SGMagVar::update( const SGGeod& geod, double jd ) {
|
||||||
|
|
||||||
|
update(geod.getLongitudeDeg(), geod.getLatitudeDeg(),
|
||||||
|
geod.getElevationM(), jd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
double sgGetMagVar( double lon, double lat, double alt_m, double jd ) {
|
double sgGetMagVar( double lon, double lat, double alt_m, double jd ) {
|
||||||
// cout << "lat = " << lat << " lon = " << lon << " elev = " << alt_m
|
// cout << "lat = " << lat << " lon = " << lon << " elev = " << alt_m
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|
||||||
@@ -33,6 +33,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// forward decls
|
||||||
|
class SGGeod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Magnetic variation wrapper class.
|
* Magnetic variation wrapper class.
|
||||||
*
|
*
|
||||||
@@ -78,6 +81,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
void update( double lon, double lat, double alt_m, double jd );
|
void update( double lon, double lat, double alt_m, double jd );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* overloaded variant taking an SGGeod to specify position
|
||||||
|
*/
|
||||||
|
void update( const SGGeod& geod, double jd );
|
||||||
|
|
||||||
/** @return the current magnetic variation in radians. */
|
/** @return the current magnetic variation in radians. */
|
||||||
double get_magvar() const { return magvar; }
|
double get_magvar() const { return magvar; }
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
.deps
|
.deps
|
||||||
Makefile
|
Makefile
|
||||||
Makefile.in
|
Makefile.in
|
||||||
|
SGMathTest
|
||||||
|
|||||||
@@ -1,29 +1,56 @@
|
|||||||
includedir = @includedir@/math
|
includedir = @includedir@/math
|
||||||
|
|
||||||
|
check_PROGRAMS = SGMathTest SGGeometryTest
|
||||||
|
TESTS = $(check_PROGRAMS)
|
||||||
|
|
||||||
|
SGMathTest_SOURCES = SGMathTest.cxx
|
||||||
|
SGMathTest_LDADD = libsgmath.a -lsgstructure $(base_LIBS)
|
||||||
|
|
||||||
|
SGGeometryTest_SOURCES = SGGeometryTest.cxx
|
||||||
|
SGGeometryTest_LDADD = libsgmath.a -lsgstructure $(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 \
|
||||||
|
beziercurve.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,166 @@
|
|||||||
|
// 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())
|
||||||
|
{ }
|
||||||
|
SGBox(const SGVec3<T>& pt) :
|
||||||
|
_min(pt),
|
||||||
|
_max(pt)
|
||||||
|
{ }
|
||||||
|
SGBox(const SGVec3<T>& min, const SGVec3<T>& max) :
|
||||||
|
_min(min),
|
||||||
|
_max(max)
|
||||||
|
{ }
|
||||||
|
template<typename S>
|
||||||
|
explicit SGBox(const SGBox<S>& box) :
|
||||||
|
_min(box.getMin()),
|
||||||
|
_max(box.getMax())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
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; }
|
||||||
|
|
||||||
|
SGVec3<T> getCorner(unsigned i) const
|
||||||
|
{ return SGVec3<T>((i&1) ? _min[0] : _max[0],
|
||||||
|
(i&2) ? _min[1] : _max[1],
|
||||||
|
(i&4) ? _min[2] : _max[2]); }
|
||||||
|
|
||||||
|
template<typename S>
|
||||||
|
SGVec3<T> getNearestCorner(const SGVec3<S>& pt) const
|
||||||
|
{
|
||||||
|
SGVec3<T> center = getCenter();
|
||||||
|
return SGVec3<T>((pt[0] <= center[0]) ? _min[0] : _max[0],
|
||||||
|
(pt[1] <= center[1]) ? _min[1] : _max[1],
|
||||||
|
(pt[2] <= center[2]) ? _min[2] : _max[2]);
|
||||||
|
}
|
||||||
|
template<typename S>
|
||||||
|
SGVec3<T> getFarestCorner(const SGVec3<S>& pt) const
|
||||||
|
{
|
||||||
|
SGVec3<T> center = getCenter();
|
||||||
|
return SGVec3<T>((pt[0] > center[0]) ? _min[0] : _max[0],
|
||||||
|
(pt[1] > center[1]) ? _min[1] : _max[1],
|
||||||
|
(pt[2] > center[2]) ? _min[2] : _max[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the closest point to pt still in the box
|
||||||
|
template<typename S>
|
||||||
|
SGVec3<T> getClosestPoint(const SGVec3<S>& pt) const
|
||||||
|
{
|
||||||
|
return SGVec3<T>((pt[0] < _min[0]) ? _min[0] : ((_max[0] < pt[0]) ? _max[0] : T(pt[0])),
|
||||||
|
(pt[1] < _min[1]) ? _min[1] : ((_max[1] < pt[1]) ? _max[1] : T(pt[1])),
|
||||||
|
(pt[2] < _min[2]) ? _min[2] : ((_max[2] < pt[2]) ? _max[2] : T(pt[2])));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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; }
|
||||||
|
SGVec3<T> getHalfSize() const
|
||||||
|
{ return T(0.5)*getSize(); }
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
SGVec3<T> size = getSize();
|
||||||
|
if (size[1] <= size[0] && size[2] <= size[0])
|
||||||
|
return 0;
|
||||||
|
else if (size[2] <= size[1])
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note that this only works if the box is nonmepty
|
||||||
|
unsigned getSmallestAxis() const
|
||||||
|
{
|
||||||
|
SGVec3<T> 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,348 @@
|
|||||||
|
// 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);
|
||||||
|
|
||||||
|
// Compare two geocentric positions for equality
|
||||||
|
bool operator == ( const SGGeoc & other ) const;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool
|
||||||
|
SGGeoc::operator == ( const SGGeoc & other ) const
|
||||||
|
{
|
||||||
|
return _lon == other._lon &&
|
||||||
|
_lat == other._lat &&
|
||||||
|
_radius == other._radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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,55 @@
|
|||||||
|
// 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"
|
||||||
|
|
||||||
|
#ifndef NO_OPENSCENEGRAPH_INTERFACE
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeSimulationFrameRelative() const
|
||||||
|
{
|
||||||
|
SGQuatd hlOr = SGQuatd::fromLonLat(*this);
|
||||||
|
return osg::Matrix(toOsg(hlOr));
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeSimulationFrame() const
|
||||||
|
{
|
||||||
|
osg::Matrix result(makeSimulationFrameRelative());
|
||||||
|
SGVec3d coord;
|
||||||
|
SGGeodesy::SGGeodToCart(*this, coord);
|
||||||
|
result.setTrans(toOsg(coord));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Matrix SGGeod::makeZUpFrameRelative() const
|
||||||
|
{
|
||||||
|
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() const
|
||||||
|
{
|
||||||
|
osg::Matrix result(makeZUpFrameRelative());
|
||||||
|
SGVec3d coord;
|
||||||
|
SGGeodesy::SGGeodToCart(*this, coord);
|
||||||
|
result.setTrans(toOsg(coord));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,377 @@
|
|||||||
|
// 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>
|
||||||
|
|
||||||
|
#ifndef NO_OPENSCENEGRAPH_INTERFACE
|
||||||
|
#include <osg/Matrix>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// #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 from an other SGGeod and a different elevation in m
|
||||||
|
static SGGeod fromGeodM(const SGGeod& geod, double elevation);
|
||||||
|
/// Factory from an other SGGeod and a different elevation in ft
|
||||||
|
static SGGeod fromGeodFt(const SGGeod& geod, 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);
|
||||||
|
|
||||||
|
// Compare two geodetic positions for equality
|
||||||
|
bool operator == ( const SGGeod & other ) const;
|
||||||
|
|
||||||
|
#ifndef NO_OPENSCENEGRAPH_INTERFACE
|
||||||
|
// 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() const;
|
||||||
|
osg::Matrix makeSimulationFrame() const;
|
||||||
|
|
||||||
|
// 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() const;
|
||||||
|
osg::Matrix makeZUpFrame() const;
|
||||||
|
#endif
|
||||||
|
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);
|
||||||
|
|
||||||
|
//// FIXME: wrong comment!
|
||||||
|
/// The actual data, angles in degrees, 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::fromGeodM(const SGGeod& geod, double elevation)
|
||||||
|
{
|
||||||
|
return SGGeod(geod._lon, geod._lat, elevation);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
SGGeod
|
||||||
|
SGGeod::fromGeodFt(const SGGeod& geod, double elevation)
|
||||||
|
{
|
||||||
|
return SGGeod(geod._lon, geod._lat, elevation*SG_FEET_TO_METER);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool
|
||||||
|
SGGeod::operator == ( const SGGeod & other ) const
|
||||||
|
{
|
||||||
|
return _lon == other._lon &&
|
||||||
|
_lat == other._lat &&
|
||||||
|
_elevation == other._elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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,561 @@
|
|||||||
|
// 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 <simgear/structure/exception.hxx>
|
||||||
|
#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;
|
||||||
|
if( XXpYY + Z*Z < 25 ) {
|
||||||
|
// This function fails near the geocenter region, so catch that special case here.
|
||||||
|
// Define the innermost sphere of small radius as earth center and return the
|
||||||
|
// coordinates 0/0/-EQURAD. It may be any other place on geoide's surface,
|
||||||
|
// the Northpole, Hawaii or Wentorf. This one was easy to code ;-)
|
||||||
|
geod.setLongitudeRad( 0.0 );
|
||||||
|
geod.setLongitudeRad( 0.0 );
|
||||||
|
geod.setElevationM( -EQURAD );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
/*
|
||||||
|
s*(2+s) is negative for s = [-2..0]
|
||||||
|
slightly negative values for s due to floating point rounding errors
|
||||||
|
cause nan for sqrt(s*(2+s))
|
||||||
|
We can probably clamp the resulting parable to positive numbers
|
||||||
|
*/
|
||||||
|
if( s >= -2.0 && s <= 0.0 )
|
||||||
|
s = 0.0;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::courseDeg(const SGGeod& p1, const SGGeod& p2)
|
||||||
|
{
|
||||||
|
double course1, course2, distance;
|
||||||
|
int r = _geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
|
||||||
|
p2.getLatitudeDeg(), p2.getLongitudeDeg(),
|
||||||
|
&course1, &course2, &distance);
|
||||||
|
if (r != 0) {
|
||||||
|
throw sg_exception("SGGeodesy::courseDeg, unable to compute course");
|
||||||
|
}
|
||||||
|
|
||||||
|
return course1;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::distanceM(const SGGeod& p1, const SGGeod& p2)
|
||||||
|
{
|
||||||
|
double course1, course2, distance;
|
||||||
|
int r = _geo_inverse_wgs_84(p1.getLatitudeDeg(), p1.getLongitudeDeg(),
|
||||||
|
p2.getLatitudeDeg(), p2.getLongitudeDeg(),
|
||||||
|
&course1, &course2, &distance);
|
||||||
|
if (r != 0) {
|
||||||
|
throw sg_exception("SGGeodesy::distanceM, unable to compute distance");
|
||||||
|
}
|
||||||
|
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::distanceNm(const SGGeod& from, const SGGeod& to)
|
||||||
|
{
|
||||||
|
return distanceM(from, to) * SG_METER_TO_NM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 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::distanceRad(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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double
|
||||||
|
SGGeodesy::distanceM(const SGGeoc& from, const SGGeoc& to)
|
||||||
|
{
|
||||||
|
return distanceRad(from, to) * SG_RAD_TO_NM * SG_NM_TO_METER;
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
// 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);
|
||||||
|
|
||||||
|
static double courseDeg(const SGGeod& from, const SGGeod& to);
|
||||||
|
static double distanceM(const SGGeod& from, const SGGeod& to);
|
||||||
|
static double distanceNm(const SGGeod& from, const SGGeod& to);
|
||||||
|
|
||||||
|
// 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 distanceRad(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,547 @@
|
|||||||
|
// 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
|
||||||
|
TriangleClosestPointIntersectionTest(void)
|
||||||
|
{
|
||||||
|
unsigned nTests = 100000;
|
||||||
|
unsigned failedCount = 0;
|
||||||
|
for (unsigned i = 0; i < nTests; ++i) {
|
||||||
|
// test triangle
|
||||||
|
SGTriangle<T> triangle(rndVec3<T>(), rndVec3<T>(), rndVec3<T>());
|
||||||
|
T triangleEps = 100*SGLimits<T>::epsilon();
|
||||||
|
|
||||||
|
// generate random point in the triangle
|
||||||
|
T u = 4*sg_random() - 2;
|
||||||
|
T v = 4*sg_random() - 2;
|
||||||
|
if (1 < u + v) {
|
||||||
|
v = T(0.5)*(v + 1 - u);
|
||||||
|
u = 1 - v;
|
||||||
|
}
|
||||||
|
u = SGMisc<T>::clip(u, 0, 1);
|
||||||
|
v = SGMisc<T>::clip(v, 0, 1);
|
||||||
|
|
||||||
|
SGVec3<T> testClosest;
|
||||||
|
testClosest = triangle.getBaseVertex();
|
||||||
|
testClosest += u*triangle.getEdge(0) + v*triangle.getEdge(1);
|
||||||
|
|
||||||
|
SGVec3<T> n = triangle.getNormal();
|
||||||
|
SGVec3<T> e0 = triangle.getEdge(0);
|
||||||
|
SGVec3<T> e1 = triangle.getEdge(1);
|
||||||
|
|
||||||
|
// The normals to the edges
|
||||||
|
SGVec3<T> a0 = cross(e0, n);
|
||||||
|
SGVec3<T> a1 = cross(e1 - e0, n);
|
||||||
|
SGVec3<T> a2 = cross(n, e1);
|
||||||
|
|
||||||
|
SGVec3<T> testPoint = testClosest;
|
||||||
|
// Ok, if we are at some edge, go perpandicular to the triangle away
|
||||||
|
if (u == 0) {
|
||||||
|
if (v == 0) {
|
||||||
|
testPoint += sg_random()*a0 + sg_random()*a2;
|
||||||
|
} else if (v == 1) {
|
||||||
|
testPoint += sg_random()*a1 + sg_random()*a2;
|
||||||
|
} else {
|
||||||
|
testPoint += sg_random()*a2;
|
||||||
|
}
|
||||||
|
} else if (u == 1) {
|
||||||
|
testPoint += sg_random()*a0 + sg_random()*a1;
|
||||||
|
} else {
|
||||||
|
if (v == 0) {
|
||||||
|
testPoint += sg_random()*a0;
|
||||||
|
} else if (u + v == 1) {
|
||||||
|
testPoint += sg_random()*a1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
testPoint += (2*sg_random() - 1)*n;
|
||||||
|
|
||||||
|
// Test the closest point function
|
||||||
|
SGVec3<T> closest = closestPoint(triangle, testPoint);
|
||||||
|
if (!equivalent(closest, testClosest, triangleEps)) {
|
||||||
|
std::cout << "Failed closest point test #" << i
|
||||||
|
<< ": not equivalent!\nu = "
|
||||||
|
<< u << ", v = " << v
|
||||||
|
<< "\ntestPoint = " << testPoint
|
||||||
|
<< ", testClosest = " << testClosest
|
||||||
|
<< ", closest = " << closest << "\n"
|
||||||
|
<< triangle << std::endl;
|
||||||
|
++failedCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test the triangle sphere intersection
|
||||||
|
SGSphere<T> sphere(testPoint, sg_random());
|
||||||
|
bool exactIntersection = intersects(sphere, testClosest);
|
||||||
|
// bool exactIntersection = intersects(sphere, closest);
|
||||||
|
bool sphereTriangleIntersection = intersects(sphere, triangle);
|
||||||
|
|
||||||
|
if (sphereTriangleIntersection != exactIntersection) {
|
||||||
|
std::cout << "Failed triangle sphere intersection test #" << i
|
||||||
|
<< ": not equivalent!\nu = "
|
||||||
|
<< u << ", v = " << v
|
||||||
|
<< "\ntestPoint = " << testPoint
|
||||||
|
<< ", testClosest = " << testClosest
|
||||||
|
<< ", closest = " << closest << "\n"
|
||||||
|
<< triangle << 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
T triangleEps = 100*SGLimits<T>::epsilon();
|
||||||
|
|
||||||
|
// 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, triangleEps)) {
|
||||||
|
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, triangleEps)) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
sg_srandom(17);
|
||||||
|
|
||||||
|
if (!TriangleClosestPointIntersectionTest<float>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
if (!TriangleClosestPointIntersectionTest<double>())
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -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,75 @@
|
|||||||
|
// 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)
|
||||||
|
{ }
|
||||||
|
template<typename S>
|
||||||
|
explicit SGLineSegment(const SGLineSegment<S>& lineSegment) :
|
||||||
|
_start(lineSegment.getStart()),
|
||||||
|
_direction(lineSegment.getDirection())
|
||||||
|
{ }
|
||||||
|
|
||||||
|
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; }
|
||||||
|
|
||||||
|
SGLineSegment<T> transform(const SGMatrix<T>& matrix) const
|
||||||
|
{
|
||||||
|
SGLineSegment<T> lineSegment;
|
||||||
|
lineSegment._start = matrix.xformPt(_start);
|
||||||
|
lineSegment._direction = matrix.xformVec(_direction);
|
||||||
|
return lineSegment;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
// 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 SGMath_H
|
||||||
|
#define SGMath_H
|
||||||
|
|
||||||
|
/// Just include them all
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
// FIXME, make it compile on IRIX
|
||||||
|
|
||||||
|
//#include <osg/GL>
|
||||||
|
//#undef GLUT_APIENTRY_DEFINED // GL/glut.h undef APIENTRY when this symbol is defined. osg/GL defines it (?).
|
||||||
|
// This probably would work if we didn't use plib/pu.h that include GL/glut.h
|
||||||
|
// on its side.
|
||||||
|
|
||||||
|
#include "SGMathFwd.hxx"
|
||||||
|
|
||||||
|
#include "SGCMath.hxx"
|
||||||
|
#include "SGLimits.hxx"
|
||||||
|
#include "SGMisc.hxx"
|
||||||
|
#include "SGGeodesy.hxx"
|
||||||
|
#include "SGVec2.hxx"
|
||||||
|
#include "SGVec3.hxx"
|
||||||
|
#include "SGVec4.hxx"
|
||||||
|
#include "SGGeoc.hxx"
|
||||||
|
#include "SGGeod.hxx"
|
||||||
|
#include "SGQuat.hxx"
|
||||||
|
#include "SGMatrix.hxx"
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user