├── .gitignore ├── LICENSE.md ├── Makefile ├── README.md ├── SeaTraffic-ReadMe.html ├── SeaTraffic ├── 64 │ └── .gitignore ├── .gitignore ├── Aframax_tanker.py ├── Aframax_tanker_Black.obj ├── Aframax_tanker_Blue.blend ├── Aframax_tanker_Blue.obj ├── Aframax_tanker_Grey.obj ├── Aframax_tanker_Sky.obj ├── Damen_2006.blend ├── Damen_2006_Green.obj ├── Damen_2006_Red.obj ├── Damen_2006_Sky.obj ├── Damen_2006_White.obj ├── Damen_2010.blend ├── Damen_2010.dds ├── Damen_2010.obj ├── Damen_2010.xcf ├── Damen_2010_LIT.dds ├── Damen_4212.blend ├── Damen_4212.dds ├── Damen_4212.xcf ├── Damen_4212_Blue.obj ├── Damen_4212_Green.obj ├── Damen_4212_LIT.dds ├── Damen_4212_Orange.obj ├── Damen_4212_Sky.obj ├── Osm_linkage.png ├── River_crossing.blend ├── River_crossing.dds ├── River_crossing.obj ├── River_crossing_LIT.dds ├── Tanker.dds ├── Tanker.xcf ├── Tanker_LIT.dds ├── buildroutes.py ├── enhancedby_opensceneryx_logo.png ├── routes.txt ├── wake.dds ├── wake.xcf ├── wake_big.blend ├── wake_big.obj ├── wake_med.blend ├── wake_med.obj ├── wake_sml.blend └── wake_sml.obj ├── src ├── .gdbinit ├── .gitignore ├── .lldbinit ├── Makefile.lin ├── Makefile.mac ├── Makefile.win ├── models.c ├── routes.c ├── seatraffic.c └── seatraffic.h └── version.mak /.gitignore: -------------------------------------------------------------------------------- 1 | *.bak 2 | *.zip 3 | 4 | *.blend1 5 | *.blend2 6 | *.blend3 7 | 8 | .DS_Store 9 | Thumbs.db 10 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | (This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.) 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | {description} 474 | Copyright (C) {year} {fullname} 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 489 | USA 490 | 491 | Also add information on how to contact you by electronic and paper mail. 492 | 493 | You should also get your employer (if you work as a programmer) or your 494 | school, if any, to sign a "copyright disclaimer" for the library, if 495 | necessary. Here is a sample; alter the names: 496 | 497 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 498 | library `Frob' (a library for tweaking knobs) written by James Random 499 | Hacker. 500 | 501 | {signature of Ty Coon}, 1 April 1990 502 | Ty Coon, President of Vice 503 | 504 | That's all there is to it! 505 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | include version.mak 2 | 3 | TARGET=$(PROJECT)_$(VER).zip 4 | 5 | INSTALLDIR=~/Desktop/X-Plane\ 10/Resources/plugins 6 | 7 | FILES=$(PROJECT)-ReadMe.html $(PROJECT)/lin.xpl $(PROJECT)/mac.xpl $(PROJECT)/win.xpl $(PROJECT)/32/win.xpl $(PROJECT)/64/lin.xpl $(PROJECT)/64/win.xpl $(PROJECT)/buildroutes.py $(PROJECT)/routes.txt $(PROJECT)/enhancedby_opensceneryx_logo.png $(PROJECT)/Osm_linkage.png $(PROJECT)/Tanker.dds $(PROJECT)/Tanker_LIT.dds $(PROJECT)/Aframax_tanker_Black.obj $(PROJECT)/Aframax_tanker_Blue.obj $(PROJECT)/Aframax_tanker_Grey.obj $(PROJECT)/Aframax_tanker_Sky.obj $(PROJECT)/Damen_2006_Green.obj $(PROJECT)/Damen_2006_Sky.obj $(PROJECT)/Damen_2006_Red.obj $(PROJECT)/Damen_2006_White.obj $(PROJECT)/Damen_2010.dds $(PROJECT)/Damen_2010_LIT.dds $(PROJECT)/Damen_2010.obj $(PROJECT)/Damen_4212.dds $(PROJECT)/Damen_4212_LIT.dds $(PROJECT)/Damen_4212_Blue.obj $(PROJECT)/Damen_4212_Green.obj $(PROJECT)/Damen_4212_Orange.obj $(PROJECT)/Damen_4212_Sky.obj $(PROJECT)/River_crossing.dds $(PROJECT)/River_crossing_LIT.dds $(PROJECT)/River_crossing.obj $(PROJECT)/wake.dds $(PROJECT)/wake_big.obj $(PROJECT)/wake_med.obj $(PROJECT)/wake_sml.obj 8 | 9 | all: $(TARGET) 10 | 11 | clean: 12 | rm $(TARGET) 13 | 14 | install: $(TARGET) 15 | rm -rf $(INSTALLDIR)/$(PROJECT) 16 | unzip -o -d $(INSTALLDIR) $(TARGET) 17 | 18 | $(TARGET): $(FILES) 19 | chmod +x $(PROJECT)/*.xpl $(PROJECT)/32/*.xpl $(PROJECT)/64/*.xpl 20 | rm -f $(TARGET) 21 | zip -MM $(TARGET) $+ 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SeaTraffic plugin for X-Plane® 2 | ==== 3 | 4 | This [X-Plane](x-plane.com) plugin displays ships moving along real-life routes. 5 | 6 | The repo contains the artwork assets and the source code for the X-Plane plugin. User oriented documention is contained in the file [SeaTraffic-ReadMe.html](http://htmlpreview.github.io/?https://raw.githubusercontent.com/Marginal/SeaTraffic/master/SeaTraffic-ReadMe.html). 7 | 8 | Building the plugin 9 | ---- 10 | The plugin is built from the `src` directory. 11 | 12 | Mac 32 & 64 bit fat binary: 13 | 14 | make -f Makefile.mac 15 | 16 | Linux 32 & 64 bit binaries: 17 | 18 | make -f Makefile.lin 19 | 20 | Windows 32 or 64 bit binary: 21 | 22 | vcvarsall [target] 23 | nmake -f Makefile.win 24 | 25 | Building the routes list 26 | ---- 27 | The routes list is built from the `SeaTraffic` directory, and requires Python 2.x. 28 | 29 | buildroutes.py 30 | -------------------------------------------------------------------------------- /SeaTraffic-ReadMe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | SeaTraffic 8 | 9 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 | 30 |

SeaTraffic plugin for X-Plane®

31 | 32 |

Overview

33 |

This X-Plane plugin displays ships moving along real-life routes.

34 | 35 |

Requirements

36 |

This plugin can be used with X-Plane 9 or later. It relies on the OpenSceneryX Object Library for some of its ship models.

37 | 38 |

Installation

39 | 57 | 58 |

Options

59 |

If the plugin is installed correctly, you will see a SeaTraffic entry in X-Plane’s Plugins menu. This offers one option:

60 |
61 |
Draw routes in Local Map
62 |
Controls whether routes and current ship positions are shown in X-Plane’s Location → Local Map.
63 |
64 |

The plugin obeys the following settings in X-Plane’s Settings → Rendering Options:

65 |
66 |
number of objects
67 |
Controls the maximum number of ships.
68 |
shadow detail (X-Plane 10 or later)
69 |
Ships are shown with shadows when this is set to “global (low)” or above.
70 |
water reflection detail
71 |
Ships are shown with reflections and wakes when this is set to “medium” or above.
72 |
73 |
74 | 75 |

Adding / modifying routes

76 |

This plugin uses ferry routes extracted from the OpenStreetMap project. If you find that a ferry route is missing or incorrect you can sign up to the project and add or modify the route. Start by reading the Beginners’ guide and other info on the Main Page.

77 |

The OpenStreetMap “way” tags for creating a ferry route are described here and here. This plugin uses these tags to choose which type of ship to display. At minimum you should set the following tags:

78 | 84 |

You can further specify the type and size of ship with the following tags:

85 | 91 | 92 |

Getting your new / modified route into X-Plane

93 |

This plugin doesn’t read ferry routes directly from the OpenStreetMap servers (that would be too slow). Instead, it contains a pre-computed database of routes. In order to visualise your new or modified ferry route(s) in X-Plane you can either:

94 | 98 | 99 |
100 | 101 |

Replacing ship models

102 |

You can use X-Plane’s library system to replace the plugin’s built-in ship models. EXPORT object(s) from your scenery package with the following ‹virtual path(s)›:

103 |
104 |
marginal/seatraffic/tourist.obj
105 |
marginal/seatraffic/cruise.obj
106 |
marginal/seatraffic/ped/sml.obj
107 |
marginal/seatraffic/ped/med.obj
108 |
marginal/seatraffic/veh/sml.obj
109 |
marginal/seatraffic/veh/med.obj
110 |
marginal/seatraffic/veh/big.obj
111 |
112 |

You must use the REGION statement in your library.txt file to restrict the use of your ship models to your geographical area of interest. Ships starting their journey within your region will use your model(s), but any ships arriving from outside of your region will still use the default models.

113 |

You must restart X-Plane to see the effect of changes to your library.txt file - X-Plane only looks for and reads scenery libraries once at startup.

114 |

Refer to this example scenery package for a worked example.

115 | 116 |

Troubleshooting

117 |
118 |
There is no SeaTraffic entry in X-Plane’s Plugins menu, and I don't see any ships at all:
119 |
Open the file Log.txt in the X-Plane folder and search for a message SeaTraffic: Missing REGION statement for customization of ship ‹virtual path›.
120 | If you see this message then you haven't correctly used a REGION for your ship model(s) in your library.txt file.
121 |
 
122 |
I see the default ship models instead of my ship models:
123 |
Check that you’re overriding the appropriate ‹virtual path(s)› (listed above) in your library.txt file.
124 | Check that you’re using the REGION_RECT statement correctly in your library.txt file. 125 |
 
126 |
I see ship wakes, but I don't see my ship models:
127 |
Search in Log.txt for error messages from the SeaTraffic plugin and/or from X-Plane containing your ship object’s filename.
128 |
129 | 130 |
131 | 132 |

Acknowledgements

133 |

“X-Plane” is a registered trademark of Laminar Research.

134 |

Medium vehicle ferry courtesy of Roy Leonard.

135 | 136 |

License

137 |

This kit is licensed under the GNU LGPL v2.1 license.
138 | It uses map data © OpenStreetMap contributors, licensed under the Open Data Commons Open Database License (ODbL).

139 | 140 |
141 | 142 | 143 | 144 | 146 | 150 | 151 | 152 |
153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /SeaTraffic/.gitignore: -------------------------------------------------------------------------------- 1 | # Placeholder to create directory for output 2 | *.xpl 3 | *.exp 4 | *.lib 5 | *.idb 6 | *.pdb 7 | *.csv 8 | *.osm 9 | -------------------------------------------------------------------------------- /SeaTraffic/64/.gitignore: -------------------------------------------------------------------------------- 1 | # Placeholder to create directory for output 2 | *.xpl 3 | *.exp 4 | *.lib 5 | *.idb 6 | *.pdb 7 | -------------------------------------------------------------------------------- /SeaTraffic/Aframax_tanker.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | pattern='Aframax_tanker_%s.obj' 4 | 5 | for (name, udelta) in [('Sky',0.125), ('Grey',0.5), ('Black', 0.625)]: 6 | infile =file(pattern % 'Blue', 'rU') 7 | outfile=file(pattern % name, 'w') 8 | for line in infile: 9 | if line.startswith('VT'): 10 | c=line.split() 11 | if (c[7] in ['0.9063', '0.9688'] and c[8] in ['0.0313', '0.0938']): 12 | d=map(float, c[1:]) 13 | d[6] -= udelta 14 | outfile.write('VT\t%9.4f %9.4f %9.4f\t%6.3f %6.3f %6.3f\t%6.4f %6.4f\n' % tuple(d)) 15 | else: 16 | outfile.write(line) 17 | else: 18 | outfile.write(line) 19 | infile.close() 20 | outfile.close() 21 | -------------------------------------------------------------------------------- /SeaTraffic/Aframax_tanker_Blue.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Aframax_tanker_Blue.blend -------------------------------------------------------------------------------- /SeaTraffic/Damen_2006.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_2006.blend -------------------------------------------------------------------------------- /SeaTraffic/Damen_2006_Red.obj: -------------------------------------------------------------------------------- 1 | I 2 | 800 3 | OBJ 4 | 5 | TEXTURE Damen_4212.dds 6 | TEXTURE_LIT Damen_4212_LIT.dds 7 | POINT_COUNTS 1098 0 0 1776 8 | 9 | VT 0.6000 1.6000 0.1000 0.042 0.383 -0.923 0.1563 0.0938 10 | VT 0.6000 1.4000 0.1000 0.045 0.000 -0.999 0.2188 0.0938 11 | VT 1.7000 1.4000 0.2000 0.116 0.000 -0.993 0.2188 0.0313 12 | VT 1.7000 1.6000 0.2000 0.107 0.381 -0.918 0.1563 0.0313 13 | VT -0.6000 1.6000 0.1000 -0.042 0.383 -0.923 0.1563 0.0938 14 | VT -1.7000 1.6000 0.2000 -0.107 0.381 -0.918 0.1563 0.0313 15 | VT -1.7000 1.4000 0.2000 -0.116 0.000 -0.993 0.2188 0.0313 16 | VT -0.6000 1.4000 0.1000 -0.045 0.000 -0.999 0.2188 0.0938 17 | VT 1.7000 1.4000 0.2000 0.116 0.000 -0.993 0.1563 0.0938 18 | VT 2.4000 1.4000 0.3000 0.141 0.000 -0.990 0.2188 0.0938 19 | VT 2.4000 1.6000 0.3000 0.131 0.380 -0.915 0.2188 0.0313 20 | VT -1.7000 1.4000 0.2000 -0.116 0.000 -0.993 0.1563 0.0938 21 | VT -2.4000 1.6000 0.3000 -0.131 0.380 -0.915 0.2188 0.0313 22 | VT -2.4000 1.4000 0.3000 -0.141 0.000 -0.990 0.2188 0.0938 23 | VT 2.6000 1.4000 0.7000 0.932 0.000 -0.362 0.1563 0.0938 24 | VT 2.6000 1.6000 0.7000 0.906 0.263 -0.333 0.2188 0.0938 25 | VT 2.4000 1.6000 0.3000 0.881 0.247 -0.404 0.2188 0.0313 26 | VT 2.4000 1.4000 0.3000 0.894 0.000 -0.447 0.1563 0.0313 27 | VT -2.6000 1.4000 0.7000 -0.932 0.000 -0.362 0.1563 0.0938 28 | VT -2.4000 1.4000 0.3000 -0.894 0.000 -0.447 0.1563 0.0313 29 | VT -2.4000 1.6000 0.3000 -0.881 0.247 -0.404 0.2188 0.0313 30 | VT -2.6000 1.6000 0.7000 -0.906 0.263 -0.333 0.2188 0.0938 31 | VT 2.6000 1.6000 0.7000 0.906 0.263 -0.333 0.1563 0.0938 32 | VT 2.6000 1.4000 0.7000 0.932 0.000 -0.362 0.2188 0.0938 33 | VT 2.8000 1.4000 1.4000 0.977 0.000 -0.212 0.2188 0.0313 34 | VT 2.8000 1.6000 1.4000 0.943 0.265 -0.203 0.1563 0.0313 35 | VT -2.6000 1.6000 0.7000 -0.906 0.263 -0.333 0.1563 0.0938 36 | VT -2.8000 1.6000 1.4000 -0.943 0.265 -0.203 0.1563 0.0313 37 | VT -2.8000 1.4000 1.4000 -0.977 0.000 -0.212 0.2188 0.0313 38 | VT -2.6000 1.4000 0.7000 -0.932 0.000 -0.362 0.2188 0.0938 39 | VT 2.8000 1.6000 1.4000 0.943 0.265 -0.203 0.1563 0.0938 40 | VT 2.8000 1.4000 1.4000 0.977 0.000 -0.212 0.2188 0.0938 41 | VT 3.1000 1.4000 3.4000 0.994 0.000 -0.107 0.2188 0.0313 42 | VT 3.1000 1.6000 3.4000 0.964 0.243 -0.105 0.1563 0.0313 43 | VT -2.8000 1.6000 1.4000 -0.943 0.265 -0.203 0.1563 0.0938 44 | VT -3.1000 1.6000 3.4000 -0.964 0.243 -0.105 0.1563 0.0313 45 | VT -3.1000 1.4000 3.4000 -0.994 0.000 -0.107 0.2188 0.0313 46 | VT -2.8000 1.4000 1.4000 -0.977 0.000 -0.212 0.2188 0.0938 47 | VT 3.1000 1.4000 3.4000 0.994 0.000 -0.107 0.1563 0.0938 48 | VT 3.2500 1.4000 5.7000 1.000 0.000 -0.033 0.2188 0.0938 49 | VT 3.2500 1.6000 5.7000 0.972 0.231 -0.032 0.2188 0.0313 50 | VT -3.1000 1.4000 3.4000 -0.994 0.000 -0.107 0.1563 0.0938 51 | VT -3.2500 1.6000 5.7000 -0.972 0.231 -0.032 0.2188 0.0313 52 | VT -3.2500 1.4000 5.7000 -1.000 0.000 -0.033 0.2188 0.0938 53 | VT -0.0000 1.4000 0.1000 -0.000 0.000 -1.000 0.1563 0.0938 54 | VT 0.6000 1.6000 0.1000 0.042 0.383 -0.923 0.2188 0.0313 55 | VT -0.0000 1.6000 0.1000 -0.000 0.383 -0.924 0.1563 0.0313 56 | VT -0.6000 1.6000 0.1000 -0.042 0.383 -0.923 0.2188 0.0313 57 | VT 0.6000 1.4000 -0.0000 0.045 0.000 -0.999 0.2813 0.0938 58 | VT 0.6000 1.2000 -0.0000 0.045 0.000 -0.999 0.3438 0.0938 59 | VT 1.7000 1.2000 0.1000 0.107 0.000 -0.994 0.3438 0.0313 60 | VT 1.7000 1.4000 0.1000 0.107 0.000 -0.994 0.2813 0.0313 61 | VT -0.6000 1.4000 0.0000 -0.045 0.000 -0.999 0.2813 0.0938 62 | VT -1.7000 1.4000 0.1000 -0.107 0.000 -0.994 0.2813 0.0313 63 | VT -1.7000 1.2000 0.1000 -0.107 0.000 -0.994 0.3438 0.0313 64 | VT -0.6000 1.2000 0.0000 -0.045 0.000 -0.999 0.3438 0.0938 65 | VT 1.7000 1.2000 0.1000 0.107 0.000 -0.994 0.2813 0.0938 66 | VT 2.5000 1.2000 0.2000 0.124 0.000 -0.992 0.3438 0.0938 67 | VT 2.5000 1.4000 0.2000 0.124 0.000 -0.992 0.3438 0.0313 68 | VT -1.7000 1.2000 0.1000 -0.107 0.000 -0.994 0.2813 0.0938 69 | VT -2.5000 1.4000 0.2000 -0.124 0.000 -0.992 0.3438 0.0313 70 | VT -2.5000 1.2000 0.2000 -0.124 0.000 -0.992 0.3438 0.0938 71 | VT 3.3500 1.2000 5.7000 1.000 0.000 -0.033 0.2813 0.0938 72 | VT 3.3500 1.2000 19.5000 1.000 0.000 -0.000 0.3438 0.0938 73 | VT 3.3500 1.4000 19.5000 1.000 0.000 -0.000 0.3438 0.0313 74 | VT 3.3500 1.4000 5.7000 1.000 0.000 -0.033 0.2813 0.0313 75 | VT -3.3500 1.2000 5.7000 -1.000 0.000 -0.033 0.2813 0.0938 76 | VT -3.3500 1.4000 5.7000 -1.000 0.000 -0.033 0.2813 0.0313 77 | VT -3.3500 1.4000 19.5000 -1.000 0.000 0.000 0.3438 0.0313 78 | VT -3.3500 1.2000 19.5000 -1.000 0.000 0.000 0.3438 0.0938 79 | VT 2.5000 1.4000 0.2000 0.928 0.000 -0.371 0.2813 0.0938 80 | VT 2.5000 1.2000 0.2000 0.928 0.000 -0.371 0.3438 0.0938 81 | VT 2.7000 1.2000 0.7000 0.946 0.000 -0.324 0.3438 0.0313 82 | VT 2.7000 1.4000 0.7000 0.946 0.000 -0.324 0.2813 0.0313 83 | VT -2.5000 1.4000 0.2000 -0.928 0.000 -0.371 0.2813 0.0938 84 | VT -2.7000 1.4000 0.7000 -0.946 0.000 -0.324 0.2813 0.0313 85 | VT -2.7000 1.2000 0.7000 -0.946 0.000 -0.324 0.3438 0.0313 86 | VT -2.5000 1.2000 0.2000 -0.928 0.000 -0.371 0.3438 0.0938 87 | VT 2.7000 1.4000 0.7000 0.946 0.000 -0.324 0.2813 0.0938 88 | VT 2.7000 1.2000 0.7000 0.946 0.000 -0.324 0.3438 0.0938 89 | VT 2.9000 1.2000 1.4000 0.977 0.000 -0.212 0.3438 0.0313 90 | VT 2.9000 1.4000 1.4000 0.977 0.000 -0.212 0.2813 0.0313 91 | VT -2.7000 1.4000 0.7000 -0.946 0.000 -0.324 0.2813 0.0938 92 | VT -2.9000 1.4000 1.4000 -0.977 0.000 -0.212 0.2813 0.0313 93 | VT -2.9000 1.2000 1.4000 -0.977 0.000 -0.212 0.3438 0.0313 94 | VT -2.7000 1.2000 0.7000 -0.946 0.000 -0.324 0.3438 0.0938 95 | VT 2.9000 1.4000 1.4000 0.977 0.000 -0.212 0.2813 0.0938 96 | VT 2.9000 1.2000 1.4000 0.977 0.000 -0.212 0.3438 0.0938 97 | VT 3.2000 1.2000 3.4000 0.994 0.000 -0.107 0.3438 0.0313 98 | VT 3.2000 1.4000 3.4000 0.994 0.000 -0.107 0.2813 0.0313 99 | VT -2.9000 1.4000 1.4000 -0.977 0.000 -0.212 0.2813 0.0938 100 | VT -3.2000 1.4000 3.4000 -0.994 0.000 -0.107 0.2813 0.0313 101 | VT -3.2000 1.2000 3.4000 -0.994 0.000 -0.107 0.3438 0.0313 102 | VT -2.9000 1.2000 1.4000 -0.977 0.000 -0.212 0.3438 0.0938 103 | VT 3.2000 1.2000 3.4000 0.994 0.000 -0.107 0.2813 0.0938 104 | VT 3.3500 1.2000 5.7000 1.000 0.000 -0.033 0.3438 0.0938 105 | VT 3.3500 1.4000 5.7000 1.000 0.000 -0.033 0.3438 0.0313 106 | VT -3.2000 1.2000 3.4000 -0.994 0.000 -0.107 0.2813 0.0938 107 | VT -3.3500 1.4000 5.7000 -1.000 0.000 -0.033 0.3438 0.0313 108 | VT -3.3500 1.2000 5.7000 -1.000 0.000 -0.033 0.3438 0.0938 109 | VT 3.3500 1.4000 19.5000 0.000 0.000 1.000 0.2813 0.0938 110 | VT 3.3500 1.2000 19.5000 0.000 0.000 1.000 0.3438 0.0938 111 | VT 0.0000 1.2000 19.5000 0.000 0.000 1.000 0.3438 0.0313 112 | VT 0.0000 1.4000 19.5000 0.000 0.000 1.000 0.2813 0.0313 113 | VT -3.3500 1.4000 19.5000 0.000 0.000 1.000 0.2813 0.0938 114 | VT -3.3500 1.2000 19.5000 0.000 0.000 1.000 0.3438 0.0938 115 | VT -0.0000 1.2000 -0.0000 -0.000 0.000 -1.000 0.2813 0.0938 116 | VT 0.6000 1.4000 -0.0000 0.045 0.000 -0.999 0.3438 0.0313 117 | VT -0.0000 1.4000 -0.0000 -0.000 0.000 -1.000 0.2813 0.0313 118 | VT -0.6000 1.4000 0.0000 -0.045 0.000 -0.999 0.3438 0.0313 119 | VT 1.7000 1.6000 0.2000 0.107 0.381 -0.918 0.1563 0.0938 120 | VT 1.7000 1.8000 0.4000 0.047 0.903 -0.426 0.2188 0.0938 121 | VT 0.6000 1.8000 0.3000 0.018 0.909 -0.417 0.2188 0.0313 122 | VT 0.6000 1.6000 0.1000 0.042 0.383 -0.923 0.1563 0.0313 123 | VT -1.7000 1.6000 0.2000 -0.107 0.381 -0.918 0.1563 0.0938 124 | VT -0.6000 1.6000 0.1000 -0.042 0.383 -0.923 0.1563 0.0313 125 | VT -0.6000 1.8000 0.3000 -0.018 0.909 -0.417 0.2188 0.0313 126 | VT -1.7000 1.8000 0.4000 -0.047 0.903 -0.426 0.2188 0.0938 127 | VT 2.4000 1.8000 0.5000 0.040 0.945 -0.325 0.1563 0.0938 128 | VT 1.7000 1.6000 0.2000 0.107 0.381 -0.918 0.2188 0.0313 129 | VT 2.4000 1.6000 0.3000 0.131 0.380 -0.915 0.1563 0.0313 130 | VT -2.4000 1.8000 0.5000 -0.040 0.945 -0.325 0.1563 0.0938 131 | VT -2.4000 1.6000 0.3000 -0.131 0.380 -0.915 0.1563 0.0313 132 | VT -1.7000 1.6000 0.2000 -0.107 0.381 -0.918 0.2188 0.0313 133 | VT 2.5000 1.8500 0.9000 0.816 0.506 -0.279 0.2188 0.0938 134 | VT 2.4000 1.8000 0.5000 0.812 0.478 -0.335 0.2188 0.0313 135 | VT 2.4000 1.6000 0.3000 0.881 0.247 -0.404 0.1563 0.0313 136 | VT -2.4000 1.6000 0.3000 -0.881 0.247 -0.404 0.1563 0.0313 137 | VT -2.4000 1.8000 0.5000 -0.812 0.478 -0.335 0.2188 0.0313 138 | VT -2.5000 1.8500 0.9000 -0.816 0.506 -0.279 0.2188 0.0938 139 | VT 2.6500 1.9000 1.6000 0.840 0.512 -0.179 0.2188 0.0938 140 | VT 2.5000 1.8500 0.9000 0.816 0.506 -0.279 0.2188 0.0313 141 | VT 2.6000 1.6000 0.7000 0.906 0.263 -0.333 0.1563 0.0313 142 | VT -2.6000 1.6000 0.7000 -0.906 0.263 -0.333 0.1563 0.0313 143 | VT -2.5000 1.8500 0.9000 -0.816 0.506 -0.279 0.2188 0.0313 144 | VT -2.6500 1.9000 1.6000 -0.840 0.512 -0.179 0.2188 0.0938 145 | VT 3.1000 1.6000 3.4000 0.964 0.243 -0.105 0.1563 0.0938 146 | VT 2.9000 2.0000 3.5000 0.877 0.471 -0.097 0.2188 0.0938 147 | VT 2.6500 1.9000 1.6000 0.840 0.512 -0.179 0.2188 0.0313 148 | VT -3.1000 1.6000 3.4000 -0.964 0.243 -0.105 0.1563 0.0938 149 | VT -2.6500 1.9000 1.6000 -0.840 0.512 -0.179 0.2188 0.0313 150 | VT -2.9000 2.0000 3.5000 -0.877 0.471 -0.097 0.2188 0.0938 151 | VT 3.0500 2.0000 5.7000 0.892 0.450 -0.030 0.1563 0.0938 152 | VT 3.1000 1.6000 3.4000 0.964 0.243 -0.105 0.2188 0.0313 153 | VT 3.2500 1.6000 5.7000 0.972 0.231 -0.032 0.1563 0.0313 154 | VT -3.0500 2.0000 5.7000 -0.892 0.450 -0.030 0.1563 0.0938 155 | VT -3.2500 1.6000 5.7000 -0.972 0.231 -0.032 0.1563 0.0313 156 | VT -3.1000 1.6000 3.4000 -0.964 0.243 -0.105 0.2188 0.0313 157 | VT 0.6000 1.8000 0.3000 0.018 0.909 -0.417 0.1563 0.0938 158 | VT -0.0000 1.8000 0.3000 -0.000 0.911 -0.413 0.2188 0.0938 159 | VT -0.0000 1.6000 0.1000 -0.000 0.383 -0.924 0.2188 0.0313 160 | VT -0.6000 1.8000 0.3000 -0.018 0.909 -0.417 0.1563 0.0938 161 | VT 3.0500 2.0000 19.2000 0.894 0.447 -0.000 0.1563 0.0938 162 | VT 3.0500 2.0000 17.1000 0.894 0.447 -0.000 0.2188 0.0938 163 | VT 3.2500 1.6000 17.1000 0.973 0.230 -0.000 0.2188 0.0313 164 | VT 3.2500 1.6000 19.4000 0.973 0.230 -0.000 0.1563 0.0313 165 | VT -3.0500 2.0000 19.2000 -0.894 0.447 0.000 0.1563 0.0938 166 | VT -3.2500 1.6000 19.4000 -0.973 0.230 0.000 0.1563 0.0313 167 | VT -3.2500 1.6000 17.1000 -0.973 0.230 0.000 0.2188 0.0313 168 | VT -3.0500 2.0000 17.1000 -0.894 0.447 0.000 0.2188 0.0938 169 | VT 3.2500 1.6000 15.3000 0.973 0.230 -0.000 0.1563 0.0938 170 | VT 3.0500 2.0000 15.3000 0.894 0.447 -0.000 0.2188 0.0938 171 | VT 3.0500 2.0000 5.7000 0.892 0.450 -0.030 0.2188 0.0313 172 | VT -3.2500 1.6000 15.3000 -0.973 0.230 0.000 0.1563 0.0938 173 | VT -3.0500 2.0000 5.7000 -0.892 0.450 -0.030 0.2188 0.0313 174 | VT -3.0500 2.0000 15.3000 -0.894 0.447 0.000 0.2188 0.0938 175 | VT 3.2500 1.6000 17.1000 0.973 0.230 -0.000 0.1563 0.0938 176 | VT 3.2500 1.4000 17.1000 1.000 0.000 -0.000 0.2188 0.0938 177 | VT 3.2500 1.4000 19.4000 1.000 0.000 -0.000 0.2188 0.0313 178 | VT -3.2500 1.6000 17.1000 -0.973 0.230 0.000 0.1563 0.0938 179 | VT -3.2500 1.4000 19.4000 -1.000 0.000 0.000 0.2188 0.0313 180 | VT -3.2500 1.4000 17.1000 -1.000 0.000 0.000 0.2188 0.0938 181 | VT 3.2500 1.4000 5.7000 1.000 0.000 -0.033 0.1563 0.0938 182 | VT 3.2500 1.4000 15.3000 1.000 0.000 -0.000 0.2188 0.0938 183 | VT 3.2500 1.6000 15.3000 0.973 0.230 -0.000 0.2188 0.0313 184 | VT -3.2500 1.4000 5.7000 -1.000 0.000 -0.033 0.1563 0.0938 185 | VT -3.2500 1.6000 15.3000 -0.973 0.230 0.000 0.2188 0.0313 186 | VT -3.2500 1.4000 15.3000 -1.000 0.000 0.000 0.2188 0.0938 187 | VT 1.7000 1.8300 0.7000 0.007 0.995 -0.098 0.1563 0.0938 188 | VT 0.6000 1.8200 0.6000 0.002 0.997 -0.075 0.2188 0.0938 189 | VT 1.7000 1.8000 0.4000 0.047 0.903 -0.426 0.1563 0.0313 190 | VT -1.7000 1.8300 0.7000 -0.007 0.995 -0.098 0.1563 0.0938 191 | VT -1.7000 1.8000 0.4000 -0.047 0.903 -0.426 0.1563 0.0313 192 | VT -0.6000 1.8200 0.6000 -0.002 0.997 -0.075 0.2188 0.0938 193 | VT 2.2000 1.8400 0.8000 0.007 0.994 -0.110 0.1563 0.0938 194 | VT 1.7000 1.8300 0.7000 0.007 0.995 -0.098 0.2188 0.0938 195 | VT 1.7000 1.8000 0.4000 0.047 0.903 -0.426 0.2188 0.0313 196 | VT 2.4000 1.8000 0.5000 0.040 0.945 -0.325 0.1563 0.0313 197 | VT -2.2000 1.8400 0.8000 -0.007 0.994 -0.110 0.1563 0.0938 198 | VT -2.4000 1.8000 0.5000 -0.040 0.945 -0.325 0.1563 0.0313 199 | VT -1.7000 1.8000 0.4000 -0.047 0.903 -0.426 0.2188 0.0313 200 | VT -1.7000 1.8300 0.7000 -0.007 0.995 -0.098 0.2188 0.0938 201 | VT 0.6000 1.8200 0.6000 0.002 0.997 -0.075 0.1563 0.0938 202 | VT -0.0000 1.8200 0.6000 -0.000 0.998 -0.067 0.2188 0.0938 203 | VT -0.0000 1.8000 0.3000 -0.000 0.911 -0.413 0.2188 0.0313 204 | VT 0.6000 1.8000 0.3000 0.018 0.909 -0.417 0.1563 0.0313 205 | VT -0.6000 1.8200 0.6000 -0.002 0.997 -0.075 0.1563 0.0938 206 | VT -0.6000 1.8000 0.3000 -0.018 0.909 -0.417 0.1563 0.0313 207 | VT 2.6500 1.6000 19.4000 0.000 0.230 0.973 0.1563 0.0938 208 | VT 2.6500 2.0000 19.2000 0.000 0.447 0.894 0.2188 0.0938 209 | VT 3.0500 2.0000 19.2000 0.000 0.447 0.894 0.2188 0.0313 210 | VT 3.2500 1.6000 19.4000 0.000 0.230 0.973 0.1563 0.0313 211 | VT -2.6500 1.6000 19.4000 0.000 0.230 0.973 0.1563 0.0938 212 | VT -3.2500 1.6000 19.4000 0.000 0.230 0.973 0.1563 0.0313 213 | VT -3.0500 2.0000 19.2000 0.000 0.447 0.894 0.2188 0.0313 214 | VT -2.6500 2.0000 19.2000 0.000 0.447 0.894 0.2188 0.0938 215 | VT 3.2500 1.4000 19.4000 0.000 0.000 1.000 0.1563 0.0938 216 | VT 2.6500 1.4000 19.4000 0.000 0.000 1.000 0.2188 0.0938 217 | VT 2.6500 1.6000 19.4000 0.000 0.230 0.973 0.2188 0.0313 218 | VT -3.2500 1.4000 19.4000 0.000 0.000 1.000 0.1563 0.0938 219 | VT -2.6500 1.6000 19.4000 0.000 0.230 0.973 0.2188 0.0313 220 | VT -2.6500 1.4000 19.4000 0.000 0.000 1.000 0.2188 0.0938 221 | VT 2.6500 2.0000 17.1000 0.000 1.000 -0.000 0.1563 0.0938 222 | VT 3.0500 2.0000 17.1000 0.000 1.000 -0.000 0.2188 0.0938 223 | VT 3.0500 2.0000 19.2000 0.000 1.000 -0.000 0.2188 0.0313 224 | VT 2.6500 2.0000 19.2000 0.000 1.000 -0.000 0.1563 0.0313 225 | VT -2.6500 2.0000 17.1000 0.000 1.000 -0.000 0.1563 0.0938 226 | VT -2.6500 2.0000 19.2000 0.000 1.000 -0.000 0.1563 0.0313 227 | VT -3.0500 2.0000 19.2000 0.000 1.000 -0.000 0.2188 0.0313 228 | VT -3.0500 2.0000 17.1000 0.000 1.000 -0.000 0.2188 0.0938 229 | VT 2.6500 2.0000 5.7000 0.000 1.000 -0.000 0.1563 0.0938 230 | VT 3.0500 2.0000 5.7000 0.000 1.000 -0.000 0.2188 0.0938 231 | VT 3.0500 2.0000 15.3000 0.000 1.000 -0.000 0.2188 0.0313 232 | VT 2.6500 2.0000 15.3000 0.000 1.000 -0.000 0.1563 0.0313 233 | VT -2.6500 2.0000 5.7000 0.000 1.000 -0.000 0.1563 0.0938 234 | VT -2.6500 2.0000 15.3000 0.000 1.000 -0.000 0.1563 0.0313 235 | VT -3.0500 2.0000 15.3000 0.000 1.000 -0.000 0.2188 0.0313 236 | VT -3.0500 2.0000 5.7000 0.000 1.000 -0.000 0.2188 0.0938 237 | VT 3.2500 1.4000 17.1000 -0.000 0.000 -1.000 0.2188 0.0938 238 | VT 3.2500 1.6000 17.1000 -0.000 0.000 -1.000 0.2188 0.0313 239 | VT 2.6500 1.4000 17.1000 -0.000 0.000 -1.000 0.1563 0.0313 240 | VT -2.6500 1.4000 17.1000 -0.000 0.000 -1.000 0.1563 0.0313 241 | VT -3.2500 1.6000 17.1000 -0.000 0.000 -1.000 0.2188 0.0313 242 | VT -3.2500 1.4000 17.1000 -0.000 0.000 -1.000 0.2188 0.0938 243 | VT 2.6500 1.4000 17.1000 -0.000 0.000 -1.000 0.2188 0.0938 244 | VT 3.0500 2.0000 17.1000 -0.000 0.000 -1.000 0.1563 0.0313 245 | VT -3.0500 2.0000 17.1000 0.000 0.000 -1.000 0.1563 0.0313 246 | VT -2.6500 1.4000 17.1000 0.000 0.000 -1.000 0.2188 0.0938 247 | VT 2.6500 2.0000 17.1000 0.000 0.000 -1.000 0.2188 0.0938 248 | VT 2.6500 1.4000 17.1000 0.000 0.000 -1.000 0.2188 0.0313 249 | VT -2.6500 1.4000 17.1000 -0.000 0.000 -1.000 0.2188 0.0313 250 | VT -2.6500 2.0000 17.1000 -0.000 0.000 -1.000 0.2188 0.0938 251 | VT 3.2500 1.6000 15.3000 0.000 0.000 1.000 0.2188 0.0938 252 | VT 3.2500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0313 253 | VT 2.6500 1.4000 15.3000 0.000 0.000 1.000 0.1563 0.0313 254 | VT -2.6500 1.4000 15.3000 0.000 0.000 1.000 0.1563 0.0313 255 | VT -3.2500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0313 256 | VT -3.2500 1.6000 15.3000 0.000 0.000 1.000 0.2188 0.0938 257 | VT 2.6500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0313 258 | VT 3.0500 2.0000 15.3000 0.000 0.000 1.000 0.1563 0.0313 259 | VT -3.0500 2.0000 15.3000 0.000 0.000 1.000 0.1563 0.0313 260 | VT -2.6500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0313 261 | VT 2.6500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0938 262 | VT 2.6500 2.0000 15.3000 0.000 0.000 1.000 0.2188 0.0313 263 | VT -2.6500 2.0000 15.3000 0.000 0.000 1.000 0.2188 0.0313 264 | VT -2.6500 1.4000 15.3000 0.000 0.000 1.000 0.2188 0.0938 265 | VT 2.6500 1.4000 17.1000 -1.000 0.000 0.000 0.2188 0.0938 266 | VT 2.6500 2.0000 17.1000 -1.000 0.000 0.000 0.2188 0.0313 267 | VT 2.6500 2.0000 19.2000 -1.000 0.000 0.000 0.1563 0.0313 268 | VT -2.6500 2.0000 19.2000 1.000 0.000 -0.000 0.1563 0.0313 269 | VT -2.6500 2.0000 17.1000 1.000 0.000 -0.000 0.2188 0.0313 270 | VT -2.6500 1.4000 17.1000 1.000 0.000 -0.000 0.2188 0.0938 271 | VT 2.6500 2.0000 19.2000 -1.000 0.000 -0.000 0.2188 0.0313 272 | VT 2.6500 1.4000 19.4000 -1.000 0.000 -0.000 0.1563 0.0313 273 | VT -2.6500 1.4000 19.4000 1.000 0.000 -0.000 0.1563 0.0313 274 | VT -2.6500 2.0000 19.2000 1.000 0.000 -0.000 0.2188 0.0313 275 | VT 2.6500 2.0000 19.2000 -1.000 0.000 -0.000 0.2188 0.0938 276 | VT 2.6500 1.6000 19.4000 -1.000 0.000 -0.000 0.2188 0.0313 277 | VT -2.6500 1.6000 19.4000 1.000 0.000 -0.000 0.2188 0.0313 278 | VT -2.6500 2.0000 19.2000 1.000 0.000 -0.000 0.2188 0.0938 279 | VT 2.6500 2.0000 3.6000 -0.006 1.000 -0.025 0.2188 0.0938 280 | VT 2.9000 2.0000 3.5000 -0.006 1.000 -0.025 0.2188 0.0313 281 | VT 3.0500 2.0000 5.7000 0.000 1.000 -0.000 0.1563 0.0313 282 | VT -3.0500 2.0000 5.7000 0.000 1.000 -0.000 0.1563 0.0313 283 | VT -2.9000 2.0000 3.5000 0.006 1.000 -0.025 0.2188 0.0313 284 | VT -2.6500 2.0000 3.6000 0.006 1.000 -0.025 0.2188 0.0938 285 | VT 2.9000 2.0000 3.5000 -0.006 1.000 -0.025 0.1563 0.0938 286 | VT 2.4800 1.9100 1.8000 -0.011 0.998 -0.058 0.2188 0.0313 287 | VT 2.6500 1.9000 1.6000 -0.011 0.998 -0.058 0.1563 0.0313 288 | VT -2.9000 2.0000 3.5000 0.006 1.000 -0.025 0.1563 0.0938 289 | VT -2.6500 1.9000 1.6000 0.011 0.998 -0.058 0.1563 0.0313 290 | VT -2.4800 1.9100 1.8000 0.011 0.998 -0.058 0.2188 0.0313 291 | VT 2.6500 1.9000 1.6000 -0.011 0.998 -0.058 0.1563 0.0938 292 | VT 2.4800 1.9100 1.8000 -0.011 0.998 -0.058 0.2188 0.0938 293 | VT 2.3500 1.8600 1.0500 -0.004 0.996 -0.087 0.2188 0.0313 294 | VT 2.5000 1.8500 0.9000 -0.004 0.996 -0.087 0.1563 0.0313 295 | VT -2.6500 1.9000 1.6000 0.011 0.998 -0.058 0.1563 0.0938 296 | VT -2.5000 1.8500 0.9000 0.004 0.996 -0.087 0.1563 0.0313 297 | VT -2.3500 1.8600 1.0500 0.004 0.996 -0.087 0.2188 0.0313 298 | VT -2.4800 1.9100 1.8000 0.011 0.998 -0.058 0.2188 0.0938 299 | VT 2.5000 1.8500 0.9000 -0.004 0.996 -0.087 0.1563 0.0938 300 | VT 2.3500 1.8600 1.0500 -0.004 0.996 -0.087 0.2188 0.0938 301 | VT 2.2000 1.8400 0.8000 0.007 0.994 -0.110 0.2188 0.0313 302 | VT -2.5000 1.8500 0.9000 0.004 0.996 -0.087 0.1563 0.0938 303 | VT -2.2000 1.8400 0.8000 -0.007 0.994 -0.110 0.2188 0.0313 304 | VT -2.3500 1.8600 1.0500 0.004 0.996 -0.087 0.2188 0.0938 305 | VT 1.7000 1.4000 0.7000 -0.143 0.000 0.990 0.4063 0.0938 306 | VT 0.6000 1.4000 0.6000 -0.045 0.000 0.999 0.4688 0.0938 307 | VT 0.6000 1.8200 0.6000 -0.045 0.000 0.999 0.4688 0.0313 308 | VT 1.7000 1.8300 0.7000 -0.143 0.000 0.990 0.4063 0.0313 309 | VT -1.7000 1.4000 0.7000 0.143 0.000 0.990 0.4063 0.0938 310 | VT -1.7000 1.8300 0.7000 0.143 0.000 0.990 0.4063 0.0313 311 | VT -0.6000 1.8200 0.6000 0.045 0.000 0.999 0.4688 0.0313 312 | VT -0.6000 1.4000 0.6000 0.045 0.000 0.999 0.4688 0.0938 313 | VT 2.2000 1.4000 0.8000 -0.196 0.000 0.981 0.4063 0.0938 314 | VT 1.7000 1.4000 0.7000 -0.143 0.000 0.990 0.4688 0.0938 315 | VT 1.7000 1.8300 0.7000 -0.143 0.000 0.990 0.4688 0.0313 316 | VT 2.2000 1.8400 0.8000 -0.196 0.000 0.981 0.4063 0.0313 317 | VT -2.2000 1.4000 0.8000 0.196 0.000 0.981 0.4063 0.0938 318 | VT -2.2000 1.8400 0.8000 0.196 0.000 0.981 0.4063 0.0313 319 | VT -1.7000 1.8300 0.7000 0.143 0.000 0.990 0.4688 0.0313 320 | VT -1.7000 1.4000 0.7000 0.143 0.000 0.990 0.4688 0.0938 321 | VT 0.6000 1.4000 0.6000 -0.045 0.000 0.999 0.4063 0.0938 322 | VT -0.0000 1.4000 0.6000 0.000 0.000 1.000 0.4688 0.0938 323 | VT -0.0000 1.8200 0.6000 0.000 0.000 1.000 0.4688 0.0313 324 | VT 0.6000 1.8200 0.6000 -0.045 0.000 0.999 0.4063 0.0313 325 | VT -0.6000 1.4000 0.6000 0.045 0.000 0.999 0.4063 0.0938 326 | VT -0.6000 1.8200 0.6000 0.045 0.000 0.999 0.4063 0.0313 327 | VT 2.6500 1.4000 3.6000 -0.999 0.000 0.047 0.4063 0.0938 328 | VT 2.4800 1.4000 1.8000 -0.991 0.000 0.133 0.4688 0.0938 329 | VT 2.4800 1.9100 1.8000 -0.991 0.000 0.133 0.4688 0.0313 330 | VT 2.6500 2.0000 3.6000 -0.999 0.000 0.047 0.4063 0.0313 331 | VT -2.6500 1.4000 3.6000 0.999 0.000 0.047 0.4063 0.0938 332 | VT -2.6500 2.0000 3.6000 0.999 0.000 0.047 0.4063 0.0313 333 | VT -2.4800 1.9100 1.8000 0.991 0.000 0.133 0.4688 0.0313 334 | VT -2.4800 1.4000 1.8000 0.991 0.000 0.133 0.4688 0.0938 335 | VT 2.4800 1.4000 1.8000 -0.991 0.000 0.133 0.4063 0.0938 336 | VT 2.3500 1.4000 1.0500 -0.937 0.000 0.348 0.4688 0.0938 337 | VT 2.3500 1.8600 1.0500 -0.937 0.000 0.348 0.4688 0.0313 338 | VT 2.4800 1.9100 1.8000 -0.991 0.000 0.133 0.4063 0.0313 339 | VT -2.4800 1.4000 1.8000 0.991 0.000 0.133 0.4063 0.0938 340 | VT -2.4800 1.9100 1.8000 0.991 0.000 0.133 0.4063 0.0313 341 | VT -2.3500 1.8600 1.0500 0.937 0.000 0.348 0.4688 0.0313 342 | VT -2.3500 1.4000 1.0500 0.937 0.000 0.348 0.4688 0.0938 343 | VT 2.3500 1.4000 1.0500 -0.937 0.000 0.348 0.4063 0.0938 344 | VT 2.2000 1.4000 0.8000 -0.858 0.000 0.514 0.4688 0.0938 345 | VT 2.2000 1.8400 0.8000 -0.858 0.000 0.514 0.4688 0.0313 346 | VT 2.3500 1.8600 1.0500 -0.937 0.000 0.348 0.4063 0.0313 347 | VT -2.3500 1.4000 1.0500 0.937 0.000 0.348 0.4063 0.0938 348 | VT -2.3500 1.8600 1.0500 0.937 0.000 0.348 0.4063 0.0313 349 | VT -2.2000 1.8400 0.8000 0.858 0.000 0.514 0.4688 0.0313 350 | VT -2.2000 1.4000 0.8000 0.858 0.000 0.514 0.4688 0.0938 351 | VT 2.6500 1.4000 5.0000 -1.000 0.000 0.000 0.4063 0.0938 352 | VT 2.6500 1.4000 3.6000 -0.999 0.000 0.047 0.4688 0.0938 353 | VT 2.6500 2.0000 3.6000 -0.999 0.000 0.047 0.4688 0.0313 354 | VT 2.6500 2.0000 5.0000 -1.000 0.000 0.000 0.4063 0.0313 355 | VT -2.6500 1.4000 5.0000 1.000 0.000 -0.000 0.4063 0.0938 356 | VT -2.6500 2.0000 5.0000 1.000 0.000 -0.000 0.4063 0.0313 357 | VT -2.6500 2.0000 3.6000 0.999 0.000 0.047 0.4688 0.0313 358 | VT -2.6500 1.4000 3.6000 0.999 0.000 0.047 0.4688 0.0938 359 | VT 1.4000 1.4000 1.7000 -0.000 1.000 0.000 0.4688 0.0938 360 | VT 0.6000 1.4000 0.6000 -0.000 1.000 0.000 0.4688 0.0313 361 | VT 1.7000 1.4000 0.7000 -0.000 1.000 0.000 0.4063 0.0313 362 | VT -1.7000 1.4000 0.7000 0.000 1.000 0.000 0.4063 0.0313 363 | VT -0.6000 1.4000 0.6000 0.000 1.000 0.000 0.4688 0.0313 364 | VT -1.4000 1.4000 1.7000 0.000 1.000 0.000 0.4688 0.0938 365 | VT 2.6500 1.4000 5.0000 -0.000 1.000 -0.000 0.4688 0.0938 366 | VT 1.5000 1.4000 5.0000 -0.000 1.000 -0.000 0.4688 0.0313 367 | VT 1.5000 1.4000 3.6000 -0.000 1.000 -0.000 0.4063 0.0313 368 | VT -1.5000 1.4000 3.6000 -0.000 1.000 -0.000 0.4063 0.0313 369 | VT -1.5000 1.4000 5.0000 -0.000 1.000 -0.000 0.4688 0.0313 370 | VT -2.6500 1.4000 5.0000 -0.000 1.000 -0.000 0.4688 0.0938 371 | VT 0.6000 1.4000 0.6000 -0.000 1.000 0.000 0.4688 0.0938 372 | VT 1.4000 1.4000 1.7000 -0.000 1.000 0.000 0.4688 0.0313 373 | VT -0.0000 1.4000 1.6000 -0.000 1.000 0.000 0.4063 0.0313 374 | VT -1.4000 1.4000 1.7000 0.000 1.000 0.000 0.4688 0.0313 375 | VT -0.6000 1.4000 0.6000 0.000 1.000 0.000 0.4688 0.0938 376 | VT -0.0000 1.4000 0.6000 0.000 1.000 0.000 0.4688 0.0938 377 | VT 2.4800 1.4000 1.8000 -0.000 1.000 0.000 0.4688 0.0938 378 | VT 1.5000 1.4000 3.1000 -0.000 1.000 0.000 0.4688 0.0313 379 | VT 1.4000 1.4000 1.7000 -0.000 1.000 0.000 0.4063 0.0313 380 | VT -1.4000 1.4000 1.7000 0.000 1.000 0.000 0.4063 0.0313 381 | VT -1.5000 1.4000 3.1000 0.000 1.000 0.000 0.4688 0.0313 382 | VT -2.4800 1.4000 1.8000 0.000 1.000 0.000 0.4688 0.0938 383 | VT 1.5000 1.4000 3.6000 -0.000 1.000 -0.000 0.4688 0.0313 384 | VT 2.6500 1.4000 3.6000 -0.000 1.000 -0.000 0.4063 0.0313 385 | VT -2.6500 1.4000 3.6000 0.000 1.000 -0.000 0.4063 0.0313 386 | VT -1.5000 1.4000 3.6000 0.000 1.000 -0.000 0.4688 0.0313 387 | VT 2.3500 1.4000 1.0500 -0.000 1.000 0.000 0.4063 0.0313 388 | VT -2.3500 1.4000 1.0500 0.000 1.000 0.000 0.4063 0.0313 389 | VT 2.3500 1.4000 1.0500 -0.000 1.000 0.000 0.4688 0.0938 390 | VT -2.3500 1.4000 1.0500 0.000 1.000 0.000 0.4688 0.0938 391 | VT 2.2000 1.4000 0.8000 0.000 1.000 -0.000 0.4688 0.0938 392 | VT 2.3500 1.4000 1.0500 0.000 1.000 -0.000 0.4688 0.0313 393 | VT -2.3500 1.4000 1.0500 0.000 1.000 -0.000 0.4688 0.0313 394 | VT -2.2000 1.4000 0.8000 0.000 1.000 -0.000 0.4688 0.0938 395 | VT 2.6500 1.4000 3.6000 -0.000 1.000 0.000 0.4688 0.0938 396 | VT 1.5000 1.4000 3.1000 -0.000 1.000 0.000 0.4063 0.0313 397 | VT -1.5000 1.4000 3.1000 0.000 1.000 -0.000 0.4063 0.0313 398 | VT -2.6500 1.4000 3.6000 0.000 1.000 -0.000 0.4688 0.0938 399 | VT 2.6500 1.4000 3.6000 -0.000 1.000 0.000 0.4688 0.0313 400 | VT -2.6500 1.4000 3.6000 0.000 1.000 0.000 0.4688 0.0313 401 | VT -0.0000 1.4000 0.1000 0.000 1.000 -0.000 0.2813 0.0938 402 | VT -0.0000 1.4000 -0.0000 0.000 1.000 -0.000 0.3438 0.0938 403 | VT 0.6000 1.4000 -0.0000 0.000 1.000 -0.000 0.3438 0.0313 404 | VT 0.6000 1.4000 0.1000 0.000 1.000 -0.000 0.2813 0.0313 405 | VT -0.6000 1.4000 0.1000 0.000 1.000 -0.000 0.2813 0.0313 406 | VT -0.6000 1.4000 0.0000 0.000 1.000 -0.000 0.3438 0.0313 407 | VT 0.6000 1.4000 -0.0000 0.000 1.000 -0.000 0.2813 0.0938 408 | VT 1.7000 1.4000 0.1000 0.000 1.000 -0.000 0.3438 0.0938 409 | VT 1.7000 1.4000 0.2000 0.000 1.000 -0.000 0.3438 0.0313 410 | VT -0.6000 1.4000 0.0000 0.000 1.000 -0.000 0.2813 0.0938 411 | VT -1.7000 1.4000 0.2000 0.000 1.000 -0.000 0.3438 0.0313 412 | VT -1.7000 1.4000 0.1000 0.000 1.000 -0.000 0.3438 0.0938 413 | VT 1.7000 1.4000 0.1000 0.000 1.000 -0.000 0.2813 0.0938 414 | VT 2.5000 1.4000 0.2000 0.000 1.000 -0.000 0.3438 0.0938 415 | VT 2.4000 1.4000 0.3000 0.000 1.000 -0.000 0.3438 0.0313 416 | VT 1.7000 1.4000 0.2000 0.000 1.000 -0.000 0.2813 0.0313 417 | VT -1.7000 1.4000 0.1000 0.000 1.000 -0.000 0.2813 0.0938 418 | VT -1.7000 1.4000 0.2000 0.000 1.000 -0.000 0.2813 0.0313 419 | VT -2.4000 1.4000 0.3000 0.000 1.000 -0.000 0.3438 0.0313 420 | VT -2.5000 1.4000 0.2000 0.000 1.000 -0.000 0.3438 0.0938 421 | VT 2.5000 1.4000 0.2000 0.000 1.000 -0.000 0.2813 0.0938 422 | VT 2.7000 1.4000 0.7000 0.000 1.000 -0.000 0.3438 0.0938 423 | VT 2.6000 1.4000 0.7000 0.000 1.000 -0.000 0.3438 0.0313 424 | VT 2.4000 1.4000 0.3000 0.000 1.000 -0.000 0.2813 0.0313 425 | VT -2.5000 1.4000 0.2000 0.000 1.000 -0.000 0.2813 0.0938 426 | VT -2.4000 1.4000 0.3000 0.000 1.000 -0.000 0.2813 0.0313 427 | VT -2.6000 1.4000 0.7000 0.000 1.000 -0.000 0.3438 0.0313 428 | VT -2.7000 1.4000 0.7000 0.000 1.000 -0.000 0.3438 0.0938 429 | VT 2.7000 1.4000 0.7000 0.000 1.000 -0.000 0.2813 0.0938 430 | VT 2.9000 1.4000 1.4000 0.000 1.000 -0.000 0.3438 0.0938 431 | VT 2.8000 1.4000 1.4000 0.000 1.000 -0.000 0.3438 0.0313 432 | VT 2.6000 1.4000 0.7000 0.000 1.000 -0.000 0.2813 0.0313 433 | VT -2.7000 1.4000 0.7000 0.000 1.000 -0.000 0.2813 0.0938 434 | VT -2.6000 1.4000 0.7000 0.000 1.000 -0.000 0.2813 0.0313 435 | VT -2.8000 1.4000 1.4000 0.000 1.000 -0.000 0.3438 0.0313 436 | VT -2.9000 1.4000 1.4000 0.000 1.000 -0.000 0.3438 0.0938 437 | VT 2.9000 1.4000 1.4000 0.000 1.000 -0.000 0.2813 0.0938 438 | VT 3.2000 1.4000 3.4000 0.000 1.000 -0.000 0.3438 0.0938 439 | VT 3.1000 1.4000 3.4000 0.000 1.000 -0.000 0.3438 0.0313 440 | VT 2.8000 1.4000 1.4000 0.000 1.000 -0.000 0.2813 0.0313 441 | VT -2.9000 1.4000 1.4000 0.000 1.000 -0.000 0.2813 0.0938 442 | VT -2.8000 1.4000 1.4000 0.000 1.000 -0.000 0.2813 0.0313 443 | VT -3.1000 1.4000 3.4000 0.000 1.000 -0.000 0.3438 0.0313 444 | VT -3.2000 1.4000 3.4000 0.000 1.000 -0.000 0.3438 0.0938 445 | VT 3.1000 1.4000 3.4000 0.000 1.000 -0.000 0.2813 0.0938 446 | VT 3.3500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0313 447 | VT 3.2500 1.4000 5.7000 0.000 1.000 -0.000 0.2813 0.0313 448 | VT -3.1000 1.4000 3.4000 0.000 1.000 -0.000 0.2813 0.0938 449 | VT -3.2500 1.4000 5.7000 0.000 1.000 -0.000 0.2813 0.0313 450 | VT -3.3500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0313 451 | VT 3.3500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0938 452 | VT 3.3500 1.4000 19.5000 0.000 1.000 -0.000 0.3438 0.0313 453 | VT 3.2500 1.4000 15.3000 0.000 1.000 -0.000 0.2813 0.0313 454 | VT -3.2500 1.4000 15.3000 0.000 1.000 -0.000 0.2813 0.0313 455 | VT -3.3500 1.4000 19.5000 0.000 1.000 -0.000 0.3438 0.0313 456 | VT -3.3500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0938 457 | VT 3.2500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0938 458 | VT -3.2500 1.4000 5.7000 0.000 1.000 -0.000 0.3438 0.0938 459 | VT 0.0000 1.4000 19.5000 0.000 1.000 -0.000 0.2813 0.0938 460 | VT 0.0000 1.4000 19.3000 0.000 1.000 -0.000 0.3438 0.0938 461 | VT 3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.3438 0.0313 462 | VT 3.3500 1.4000 19.5000 0.000 1.000 -0.000 0.2813 0.0313 463 | VT -3.3500 1.4000 19.5000 0.000 1.000 -0.000 0.2813 0.0313 464 | VT -3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.3438 0.0313 465 | VT 3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.2813 0.0938 466 | VT 3.1500 1.4000 15.2000 0.000 1.000 -0.000 0.3438 0.0938 467 | VT 3.2500 1.4000 15.3000 0.000 1.000 -0.000 0.3438 0.0313 468 | VT -3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.2813 0.0938 469 | VT -3.2500 1.4000 15.3000 0.000 1.000 -0.000 0.3438 0.0313 470 | VT -3.1500 1.4000 15.2000 0.000 1.000 -0.000 0.3438 0.0938 471 | VT 0.0000 1.4000 19.3000 0.000 1.000 -0.000 0.4688 0.0938 472 | VT 0.0000 1.4000 14.8000 0.000 1.000 -0.000 0.4688 0.0313 473 | VT 1.0000 1.4000 14.8000 0.000 1.000 -0.000 0.4063 0.0313 474 | VT -1.0000 1.4000 14.8000 0.000 1.000 -0.000 0.4063 0.0313 475 | VT 3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.4688 0.0938 476 | VT 0.0000 1.4000 19.3000 0.000 1.000 -0.000 0.4688 0.0313 477 | VT -3.1500 1.4000 19.3000 0.000 1.000 -0.000 0.4688 0.0938 478 | VT 1.0000 1.4000 14.8000 0.000 1.000 -0.000 0.4688 0.0313 479 | VT 2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 480 | VT -2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 481 | VT -1.0000 1.4000 14.8000 0.000 1.000 -0.000 0.4688 0.0313 482 | VT 2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0938 483 | VT 2.5000 1.4000 14.8000 0.000 1.000 -0.000 0.4063 0.0313 484 | VT -2.5000 1.4000 14.8000 0.000 1.000 -0.000 0.4063 0.0313 485 | VT -2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0938 486 | VT 2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0313 487 | VT 3.0000 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 488 | VT -3.0000 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 489 | VT -2.5000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0313 490 | VT 3.0000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0313 491 | VT 3.1500 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 492 | VT -3.1500 1.4000 15.2000 0.000 1.000 -0.000 0.4063 0.0313 493 | VT -3.0000 1.4000 15.2000 0.000 1.000 -0.000 0.4688 0.0313 494 | VT 3.0500 2.6000 15.4000 0.000 1.000 -0.000 0.4063 0.0938 495 | VT 3.0500 2.6000 17.0000 0.000 1.000 -0.000 0.4688 0.0938 496 | VT 2.9500 2.6000 17.0000 0.000 1.000 -0.000 0.4688 0.0313 497 | VT 2.9500 2.6000 15.4000 0.000 1.000 -0.000 0.4063 0.0313 498 | VT -3.0500 2.6000 15.4000 0.000 1.000 -0.000 0.4063 0.0938 499 | VT -2.9500 2.6000 15.4000 0.000 1.000 -0.000 0.4063 0.0313 500 | VT -2.9500 2.6000 17.0000 0.000 1.000 -0.000 0.4688 0.0313 501 | VT -3.0500 2.6000 17.0000 0.000 1.000 -0.000 0.4688 0.0938 502 | VT 2.9500 2.6000 17.0000 0.000 0.000 1.000 0.4063 0.0938 503 | VT 3.0500 2.6000 17.0000 0.000 0.000 1.000 0.4688 0.0938 504 | VT 3.0500 1.4000 17.0000 0.000 0.000 1.000 0.4688 0.0313 505 | VT 2.9500 1.4000 17.0000 0.000 0.000 1.000 0.4063 0.0313 506 | VT -2.9500 2.6000 17.0000 0.000 0.000 1.000 0.4063 0.0938 507 | VT -2.9500 1.4000 17.0000 0.000 0.000 1.000 0.4063 0.0313 508 | VT -3.0500 1.4000 17.0000 0.000 0.000 1.000 0.4688 0.0313 509 | VT -3.0500 2.6000 17.0000 0.000 0.000 1.000 0.4688 0.0938 510 | VT 2.9500 1.4000 15.4000 -0.000 0.000 -1.000 0.4063 0.0938 511 | VT 3.0500 1.4000 15.4000 -0.000 0.000 -1.000 0.4688 0.0938 512 | VT 3.0500 2.6000 15.4000 -0.000 0.000 -1.000 0.4688 0.0313 513 | VT 2.9500 2.6000 15.4000 -0.000 0.000 -1.000 0.4063 0.0313 514 | VT -2.9500 1.4000 15.4000 -0.000 0.000 -1.000 0.4063 0.0938 515 | VT -2.9500 2.6000 15.4000 -0.000 0.000 -1.000 0.4063 0.0313 516 | VT -3.0500 2.6000 15.4000 -0.000 0.000 -1.000 0.4688 0.0313 517 | VT -3.0500 1.4000 15.4000 -0.000 0.000 -1.000 0.4688 0.0938 518 | VT 3.0500 1.4000 15.4000 1.000 0.000 -0.000 0.4063 0.0938 519 | VT 3.0500 1.4000 17.0000 1.000 0.000 -0.000 0.4688 0.0938 520 | VT 3.0500 2.6000 17.0000 1.000 0.000 -0.000 0.4688 0.0313 521 | VT 3.0500 2.6000 15.4000 1.000 0.000 -0.000 0.4063 0.0313 522 | VT -3.0500 1.4000 15.4000 -1.000 0.000 0.000 0.4063 0.0938 523 | VT -3.0500 2.6000 15.4000 -1.000 0.000 0.000 0.4063 0.0313 524 | VT -3.0500 2.6000 17.0000 -1.000 0.000 0.000 0.4688 0.0313 525 | VT -3.0500 1.4000 17.0000 -1.000 0.000 0.000 0.4688 0.0938 526 | VT 2.9500 2.6000 17.0000 -1.000 0.000 0.000 0.4063 0.0938 527 | VT 2.9500 1.4000 17.0000 -1.000 0.000 0.000 0.4688 0.0938 528 | VT 2.9500 1.4000 15.4000 -1.000 0.000 0.000 0.4688 0.0313 529 | VT 2.9500 2.6000 15.4000 -1.000 0.000 0.000 0.4063 0.0313 530 | VT -2.9500 2.6000 17.0000 1.000 0.000 -0.000 0.4063 0.0938 531 | VT -2.9500 2.6000 15.4000 1.000 0.000 -0.000 0.4063 0.0313 532 | VT -2.9500 1.4000 15.4000 1.000 0.000 -0.000 0.4688 0.0313 533 | VT -2.9500 1.4000 17.0000 1.000 0.000 -0.000 0.4688 0.0938 534 | VT 3.0000 3.0000 15.4000 1.000 0.000 -0.000 0.2188 0.0938 535 | VT 3.0000 3.3000 12.8000 1.000 0.000 -0.000 0.2188 0.0313 536 | VT 3.0000 3.1000 13.1000 1.000 0.000 -0.000 0.1563 0.0313 537 | VT -3.0000 3.1000 13.1000 -1.000 0.000 0.000 0.1563 0.0313 538 | VT -3.0000 3.3000 12.8000 -1.000 0.000 0.000 0.2188 0.0313 539 | VT -3.0000 3.0000 15.4000 -1.000 0.000 0.000 0.2188 0.0938 540 | VT 3.0000 1.4000 15.2000 1.000 0.000 -0.000 0.8125 0.4258 541 | VT 3.0000 2.8000 15.2000 1.000 0.000 -0.000 0.8125 0.5781 542 | VT 3.0000 2.0000 13.6000 1.000 0.000 -0.000 0.6211 0.4922 543 | VT -3.0000 2.0000 13.6000 -1.000 0.000 0.000 0.6211 0.4922 544 | VT -3.0000 2.8000 15.2000 -1.000 0.000 0.000 0.8125 0.5781 545 | VT -3.0000 1.4000 15.2000 -1.000 0.000 0.000 0.8125 0.4258 546 | VT 2.9600 2.0000 4.9000 0.999 -0.002 -0.046 0.2188 0.0938 547 | VT 3.0000 3.1000 5.7000 0.999 -0.012 -0.032 0.2188 0.0313 548 | VT 2.9500 3.3000 5.0000 0.998 -0.005 -0.071 0.1563 0.0313 549 | VT -2.9500 3.3000 5.0000 -0.998 -0.005 -0.071 0.1563 0.0313 550 | VT -3.0000 3.1000 5.7000 -0.999 -0.012 -0.032 0.2188 0.0313 551 | VT -2.9600 2.0000 4.9000 -0.999 -0.002 -0.046 0.2188 0.0938 552 | VT 2.8800 2.0000 3.6000 0.998 0.012 -0.061 0.2188 0.0938 553 | VT 2.9600 2.0000 4.9000 0.999 -0.002 -0.046 0.2188 0.0313 554 | VT -2.9600 2.0000 4.9000 -0.999 -0.002 -0.046 0.2188 0.0313 555 | VT -2.8800 2.0000 3.6000 -0.998 0.012 -0.061 0.2188 0.0938 556 | VT 3.0000 2.8000 15.2000 1.000 0.000 -0.000 0.2188 0.0938 557 | VT 3.0000 3.0000 15.4000 1.000 0.000 -0.000 0.2188 0.0313 558 | VT -3.0000 3.0000 15.4000 -1.000 0.000 0.000 0.2188 0.0313 559 | VT -3.0000 2.8000 15.2000 -1.000 0.000 0.000 0.2188 0.0938 560 | VT 3.0000 3.1000 13.1000 1.000 0.000 -0.000 0.5625 0.6133 561 | VT -3.0000 3.1000 13.1000 -1.000 0.000 0.000 0.5625 0.6133 562 | VT 3.0000 3.5000 18.0000 1.000 0.000 -0.000 0.2188 0.0938 563 | VT 3.0000 3.0000 15.4000 1.000 0.000 -0.000 0.1563 0.0313 564 | VT -3.0000 3.0000 15.4000 -1.000 0.000 0.000 0.1563 0.0313 565 | VT -3.0000 3.5000 18.0000 -1.000 0.000 0.000 0.2188 0.0938 566 | VT 3.0000 3.3000 18.1000 1.000 0.000 -0.000 0.2188 0.0938 567 | VT 3.0000 3.5000 18.0000 1.000 0.000 -0.000 0.2188 0.0313 568 | VT -3.0000 3.5000 18.0000 -1.000 0.000 0.000 0.2188 0.0313 569 | VT -3.0000 3.3000 18.1000 -1.000 0.000 0.000 0.2188 0.0938 570 | VT 3.0000 3.5000 5.5000 1.000 -0.010 -0.021 0.2188 0.0938 571 | VT 2.9500 3.3000 5.0000 0.998 -0.005 -0.071 0.2188 0.0313 572 | VT 3.0000 3.1000 5.7000 0.999 -0.012 -0.032 0.1563 0.0313 573 | VT -3.0000 3.1000 5.7000 -0.999 -0.012 -0.032 0.1563 0.0313 574 | VT -2.9500 3.3000 5.0000 -0.998 -0.005 -0.071 0.2188 0.0313 575 | VT -3.0000 3.5000 5.5000 -1.000 -0.010 -0.021 0.2188 0.0938 576 | VT 3.0000 3.3000 6.0000 1.000 0.000 -0.000 0.2188 0.0938 577 | VT 3.0000 3.5000 5.5000 1.000 -0.010 -0.021 0.2188 0.0313 578 | VT -3.0000 3.5000 5.5000 -1.000 -0.010 -0.021 0.2188 0.0313 579 | VT -3.0000 3.3000 6.0000 -1.000 0.000 0.000 0.2188 0.0938 580 | VT 2.6500 3.3000 5.0000 -0.000 0.876 -0.482 0.1563 0.0938 581 | VT 2.6500 2.0000 3.6000 -0.000 0.733 -0.680 0.2188 0.0938 582 | VT 2.8800 2.0000 3.6000 -0.000 0.733 -0.680 0.2188 0.0313 583 | VT 2.9500 3.3000 5.0000 -0.000 0.845 -0.535 0.1563 0.0313 584 | VT -2.6500 3.3000 5.0000 -0.000 0.876 -0.482 0.1563 0.0938 585 | VT -2.9500 3.3000 5.0000 -0.000 0.845 -0.535 0.1563 0.0313 586 | VT -2.8800 2.0000 3.6000 -0.000 0.733 -0.680 0.2188 0.0313 587 | VT -2.6500 2.0000 3.6000 -0.000 0.733 -0.680 0.2188 0.0938 588 | VT 1.5000 3.3000 5.0000 -0.000 0.000 -1.000 0.125 0.5 589 | VT 1.5000 1.4000 5.0000 -0.000 0.000 -1.000 0.125 0.25 590 | VT 2.6500 2.0000 5.0000 -0.000 0.000 -1.000 0.0 0.3289 591 | VT -2.6500 2.0000 5.0000 -0.000 0.000 -1.000 0.0 0.3289 592 | VT -1.5000 1.4000 5.0000 -0.000 0.000 -1.000 0.125 0.25 593 | VT -1.5000 3.3000 5.0000 -0.000 0.000 -1.000 0.125 0.5 594 | VT 2.6500 3.3000 5.0000 -0.000 0.000 -1.000 0.0 0.5 595 | VT -2.6500 3.3000 5.0000 -0.000 0.000 -1.000 0.0 0.5 596 | VT 2.6500 1.4000 5.0000 -0.000 0.000 -1.000 0.0 0.25 597 | VT -2.6500 1.4000 5.0000 -0.000 0.000 -1.000 0.0 0.25 598 | VT 2.6500 2.0000 5.0000 -1.000 0.000 0.000 0.2188 0.0938 599 | VT 2.6500 2.0000 3.6000 -1.000 0.000 0.000 0.2188 0.0313 600 | VT 2.6500 3.3000 5.0000 -1.000 0.000 0.000 0.1563 0.0313 601 | VT -2.6500 3.3000 5.0000 1.000 0.000 -0.000 0.1563 0.0313 602 | VT -2.6500 2.0000 3.6000 1.000 0.000 -0.000 0.2188 0.0313 603 | VT -2.6500 2.0000 5.0000 1.000 0.000 -0.000 0.2188 0.0938 604 | VT 3.0000 3.3000 18.1000 0.000 0.447 0.894 0.2188 0.0938 605 | VT 0.0000 3.3000 18.1000 0.000 0.447 0.894 0.2188 0.0313 606 | VT 1.5000 3.5000 18.0000 0.000 0.447 0.894 0.1563 0.0313 607 | VT -1.5000 3.5000 18.0000 0.000 0.447 0.894 0.1563 0.0313 608 | VT -3.0000 3.3000 18.1000 0.000 0.447 0.894 0.2188 0.0938 609 | VT 1.5000 3.5000 18.0000 0.000 0.447 0.894 0.2188 0.0313 610 | VT 3.0000 3.5000 18.0000 0.000 0.447 0.894 0.1563 0.0313 611 | VT -3.0000 3.5000 18.0000 0.000 0.447 0.894 0.1563 0.0313 612 | VT -1.5000 3.5000 18.0000 0.000 0.447 0.894 0.2188 0.0313 613 | VT 0.0000 3.3000 18.1000 0.000 0.447 0.894 0.2188 0.0938 614 | VT 0.0000 3.5000 18.0000 0.000 0.447 0.894 0.2188 0.0313 615 | VT 3.0000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0938 616 | VT 1.5000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0313 617 | VT 1.5000 3.5000 17.7000 0.000 1.000 -0.000 0.1563 0.0313 618 | VT -1.5000 3.5000 17.7000 0.000 1.000 -0.000 0.1563 0.0313 619 | VT -1.5000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0313 620 | VT -3.0000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0938 621 | VT 0.0000 3.5000 17.7000 0.000 1.000 -0.000 0.1563 0.0938 622 | VT 1.5000 3.5000 17.7000 0.000 1.000 -0.000 0.2188 0.0938 623 | VT 0.0000 3.5000 18.0000 0.000 1.000 -0.000 0.1563 0.0313 624 | VT -1.5000 3.5000 17.7000 0.000 1.000 -0.000 0.2188 0.0938 625 | VT 0.0000 3.6000 17.7000 0.000 0.000 1.000 0.0313 0.0938 626 | VT 1.5000 3.6000 17.7000 0.000 0.000 1.000 0.0938 0.0938 627 | VT 1.5000 3.5000 17.7000 0.000 0.000 1.000 0.0938 0.0313 628 | VT 0.0000 3.5000 17.7000 0.000 0.000 1.000 0.0313 0.0313 629 | VT -1.5000 3.5000 17.7000 0.000 0.000 1.000 0.0938 0.0313 630 | VT -1.5000 3.6000 17.7000 0.000 0.000 1.000 0.0938 0.0938 631 | VT 1.5000 3.6000 17.7000 0.000 1.000 -0.000 0.0938 0.0938 632 | VT 0.0000 3.6000 17.7000 0.000 1.000 -0.000 0.0938 0.0313 633 | VT 1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0313 0.0313 634 | VT -1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0313 0.0313 635 | VT -1.5000 3.6000 17.7000 0.000 1.000 -0.000 0.0938 0.0938 636 | VT 1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0938 0.0938 637 | VT -0.0000 3.6000 3.6000 -0.000 0.992 -0.126 0.0313 0.0313 638 | VT -1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0938 0.0938 639 | VT 1.5000 3.6000 3.6000 -0.000 0.982 -0.189 0.0938 0.0938 640 | VT 1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0938 0.0313 641 | VT -1.5000 3.6000 5.5000 0.000 1.000 -0.000 0.0938 0.0313 642 | VT -1.5000 3.6000 3.6000 -0.000 0.982 -0.189 0.0938 0.0938 643 | VT -0.0000 3.4000 3.1000 -0.000 0.855 -0.518 0.0313 0.0938 644 | VT 1.5000 3.4000 3.1000 0.005 0.855 -0.518 0.0938 0.0938 645 | VT 1.5000 3.6000 3.6000 -0.000 0.982 -0.189 0.0938 0.0313 646 | VT -1.5000 3.6000 3.6000 -0.000 0.982 -0.189 0.0938 0.0313 647 | VT -1.5000 3.4000 3.1000 -0.005 0.855 -0.518 0.0938 0.0938 648 | VT -0.0000 1.4000 1.6000 -0.000 -0.164 -0.986 0.0313 0.0938 649 | VT 1.4000 1.4000 1.7000 0.070 -0.164 -0.984 0.0938 0.0938 650 | VT 1.4000 2.0000 1.6000 0.070 -0.164 -0.984 0.0938 0.0313 651 | VT -0.0000 2.0000 1.5000 -0.000 -0.164 -0.986 0.0313 0.0313 652 | VT -1.4000 2.0000 1.6000 -0.070 -0.164 -0.984 0.0938 0.0313 653 | VT -1.4000 1.4000 1.7000 -0.070 -0.164 -0.984 0.0938 0.0938 654 | VT 1.5000 1.4000 5.0000 1.000 0.000 -0.000 0.0938 0.0938 655 | VT 1.5000 3.3000 5.0000 1.000 0.000 -0.000 0.0938 0.0313 656 | VT 1.5000 1.4000 3.6000 1.000 0.000 -0.000 0.0313 0.0313 657 | VT -1.5000 1.4000 3.6000 -1.000 0.000 0.000 0.0313 0.0313 658 | VT -1.5000 3.3000 5.0000 -1.000 0.000 0.000 0.0938 0.0313 659 | VT -1.5000 1.4000 5.0000 -1.000 0.000 0.000 0.0938 0.0938 660 | VT 1.5000 3.3000 5.0000 1.000 0.000 -0.000 0.0938 0.0938 661 | VT 1.5000 3.5000 5.5000 1.000 0.000 -0.000 0.0938 0.0313 662 | VT 1.5000 3.6000 5.5000 1.000 0.000 -0.000 0.0313 0.0313 663 | VT -1.5000 3.6000 5.5000 -1.000 0.000 0.000 0.0313 0.0313 664 | VT -1.5000 3.5000 5.5000 -1.000 0.000 0.000 0.0938 0.0313 665 | VT -1.5000 3.3000 5.0000 -1.000 0.000 0.000 0.0938 0.0938 666 | VT 1.5000 3.6000 3.6000 1.000 0.000 -0.000 0.0938 0.0938 667 | VT -1.5000 3.6000 3.6000 -1.000 0.000 0.000 0.0938 0.0938 668 | VT 3.0000 2.0000 9.4000 1.000 0.000 0.000 0.4375 0.6406 669 | VT 3.0000 3.3000 9.4000 1.000 0.000 0.000 0.4375 0.875 670 | VT 3.0000 3.3000 6.0000 1.000 0.000 0.000 0.1186 0.875 671 | VT -3.0000 3.3000 6.0000 -1.000 0.000 0.000 0.1186 0.875 672 | VT -3.0000 3.3000 9.4000 -1.000 0.000 0.000 0.4375 0.875 673 | VT -3.0000 2.0000 9.4000 -1.000 0.000 0.000 0.4375 0.6406 674 | VT 3.0000 3.1000 5.7000 1.000 -0.000 0.000 0.0898 0.8359 675 | VT -3.0000 3.1000 5.7000 -1.000 -0.000 0.000 0.0898 0.8359 676 | VT 3.0000 2.0000 9.4000 1.000 -0.030 -0.009 0.4375 0.6406 677 | VT 3.0000 3.1000 5.7000 1.000 -0.030 -0.009 0.0898 0.8359 678 | VT 2.9600 2.0000 4.9000 1.000 -0.030 -0.009 0.0156 0.6406 679 | VT -2.9600 2.0000 4.9000 -1.000 -0.030 -0.009 0.0156 0.6406 680 | VT -3.0000 3.1000 5.7000 -1.000 -0.030 -0.009 0.0898 0.8359 681 | VT -3.0000 2.0000 9.4000 -1.000 -0.030 -0.009 0.4375 0.6406 682 | VT 3.0000 3.3000 12.8000 1.000 0.000 -0.000 0.8814 0.875 683 | VT 3.0000 3.3000 9.4000 1.000 0.000 -0.000 0.5625 0.875 684 | VT 3.0000 2.0000 9.4000 1.000 0.000 -0.000 0.5625 0.6406 685 | VT -3.0000 2.0000 9.4000 -1.000 0.000 -0.000 0.5625 0.6406 686 | VT -3.0000 3.3000 9.4000 -1.000 0.000 -0.000 0.5625 0.875 687 | VT -3.0000 3.3000 12.8000 -1.000 0.000 -0.000 0.8814 0.875 688 | VT 3.0000 3.1000 13.1000 1.000 -0.000 -0.000 0.9102 0.8359 689 | VT -3.0000 3.1000 13.1000 -1.000 -0.000 -0.000 0.9102 0.8359 690 | VT 3.0000 2.0000 13.6000 1.000 -0.000 -0.000 0.957 0.6406 691 | VT -3.0000 2.0000 13.6000 -1.000 -0.000 -0.000 0.957 0.6406 692 | VT 3.0000 3.3000 9.4000 1.000 0.000 -0.000 0.2188 0.0313 693 | VT 3.0000 3.5000 5.5000 1.000 -0.010 -0.021 0.1563 0.0313 694 | VT -3.0000 3.5000 5.5000 -1.000 -0.010 -0.021 0.1563 0.0313 695 | VT -3.0000 3.3000 9.4000 -1.000 0.000 0.000 0.2188 0.0313 696 | VT 3.0000 3.5000 5.5000 1.000 -0.010 -0.021 0.1563 0.0938 697 | VT 3.0000 3.3000 9.4000 1.000 0.000 -0.000 0.2188 0.0938 698 | VT 3.0000 3.5000 18.0000 1.000 0.000 -0.000 0.1563 0.0313 699 | VT -3.0000 3.5000 5.5000 -1.000 -0.010 -0.021 0.1563 0.0938 700 | VT -3.0000 3.5000 18.0000 -1.000 0.000 0.000 0.1563 0.0313 701 | VT -3.0000 3.3000 9.4000 -1.000 0.000 0.000 0.2188 0.0938 702 | VT 2.6500 3.5000 5.5000 -0.000 0.982 -0.189 0.1563 0.0938 703 | VT 2.6500 3.3000 5.0000 -0.000 0.876 -0.482 0.2188 0.0938 704 | VT 2.9500 3.3000 5.0000 -0.000 0.845 -0.535 0.2188 0.0313 705 | VT 3.0000 3.5000 5.5000 -0.000 0.992 -0.126 0.1563 0.0313 706 | VT -2.6500 3.5000 5.5000 -0.000 0.982 -0.189 0.1563 0.0938 707 | VT -3.0000 3.5000 5.5000 -0.000 0.992 -0.126 0.1563 0.0313 708 | VT -2.9500 3.3000 5.0000 -0.000 0.845 -0.535 0.2188 0.0313 709 | VT -2.6500 3.3000 5.0000 -0.000 0.876 -0.482 0.2188 0.0938 710 | VT 1.5000 3.3000 5.0000 -0.000 0.928 -0.371 0.1563 0.0938 711 | VT 2.6500 3.5000 5.5000 -0.000 0.982 -0.189 0.2188 0.0313 712 | VT 1.5000 3.5000 5.5000 -0.000 0.982 -0.189 0.1563 0.0313 713 | VT -1.5000 3.3000 5.0000 -0.000 0.928 -0.371 0.1563 0.0938 714 | VT -1.5000 3.5000 5.5000 -0.000 0.982 -0.189 0.1563 0.0313 715 | VT -2.6500 3.5000 5.5000 -0.000 0.982 -0.189 0.2188 0.0313 716 | VT 1.5000 3.5000 13.3000 0.000 1.000 -0.000 0.1914 0.7383 717 | VT 1.5000 3.5000 5.5000 0.000 1.000 -0.000 0.9336 0.7383 718 | VT 2.6500 3.5000 5.5000 0.000 1.000 -0.000 0.9336 0.8711 719 | VT 2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.1914 0.8711 720 | VT -1.5000 3.5000 13.3000 0.000 1.000 -0.000 0.1914 0.7383 721 | VT -2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.1914 0.8711 722 | VT -2.6500 3.5000 5.5000 0.000 1.000 -0.000 0.9336 0.8711 723 | VT -1.5000 3.5000 5.5000 0.000 1.000 -0.000 0.9336 0.7383 724 | VT 2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0938 725 | VT 3.0000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0313 726 | VT -3.0000 3.5000 18.0000 0.000 1.000 -0.000 0.2188 0.0313 727 | VT -2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0938 728 | VT 1.5000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0938 729 | VT 2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0313 730 | VT -2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0313 731 | VT -1.5000 3.5000 13.3000 0.000 1.000 -0.000 0.2188 0.0938 732 | VT 3.0000 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0938 733 | VT 2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.1563 0.0313 734 | VT -2.7000 3.5000 13.3000 0.000 1.000 -0.000 0.1563 0.0313 735 | VT -3.0000 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0938 736 | VT 2.6500 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0938 737 | VT 3.0000 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0313 738 | VT -3.0000 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0313 739 | VT -2.6500 3.5000 5.5000 0.000 1.000 -0.000 0.2188 0.0938 740 | VT 1.5000 3.6000 17.7000 1.000 0.000 -0.000 0.0938 0.0938 741 | VT 1.5000 3.5000 13.3000 1.000 0.000 -0.000 0.0938 0.0313 742 | VT 1.5000 3.5000 17.7000 1.000 0.000 -0.000 0.0313 0.0313 743 | VT -1.5000 3.5000 17.7000 -1.000 0.000 0.000 0.0313 0.0313 744 | VT -1.5000 3.5000 13.3000 -1.000 0.000 0.000 0.0938 0.0313 745 | VT -1.5000 3.6000 17.7000 -1.000 0.000 0.000 0.0938 0.0938 746 | VT 1.5000 3.5000 13.3000 1.000 0.000 -0.000 0.0938 0.0938 747 | VT 1.5000 3.6000 5.5000 1.000 0.000 -0.000 0.0938 0.0313 748 | VT 1.5000 3.5000 5.5000 1.000 0.000 -0.000 0.0313 0.0313 749 | VT -1.5000 3.5000 5.5000 -1.000 0.000 0.000 0.0313 0.0313 750 | VT -1.5000 3.6000 5.5000 -1.000 0.000 0.000 0.0938 0.0313 751 | VT -1.5000 3.5000 13.3000 -1.000 0.000 0.000 0.0938 0.0938 752 | VT 1.5000 3.6000 17.7000 1.000 0.000 -0.000 0.0938 0.0313 753 | VT -1.5000 3.6000 17.7000 -1.000 0.000 0.000 0.0938 0.0313 754 | VT 1.5000 3.2000 4.0000 1.000 0.000 -0.000 0.0938 0.0313 755 | VT 1.5000 3.3000 5.0000 1.000 0.000 -0.000 0.0313 0.0313 756 | VT -1.5000 3.3000 5.0000 -1.000 0.000 0.000 0.0313 0.0313 757 | VT -1.5000 3.2000 4.0000 -1.000 0.000 0.000 0.0938 0.0313 758 | VT 1.5000 3.4000 3.1000 0.999 0.022 -0.044 0.0938 0.0938 759 | VT 1.5000 3.6000 3.6000 1.000 0.000 -0.000 0.0313 0.0313 760 | VT -1.5000 3.6000 3.6000 -1.000 0.000 0.000 0.0313 0.0313 761 | VT -1.5000 3.4000 3.1000 -0.999 0.022 -0.044 0.0938 0.0938 762 | VT 1.5000 3.2000 3.0000 0.997 0.035 -0.069 0.0938 0.0938 763 | VT 1.5000 3.4000 3.1000 0.999 0.022 -0.044 0.0313 0.0313 764 | VT -1.5000 3.4000 3.1000 -0.999 0.022 -0.044 0.0313 0.0313 765 | VT -1.5000 3.2000 3.0000 -0.997 0.035 -0.069 0.0938 0.0938 766 | VT 1.4600 2.2000 2.2300 0.998 -0.010 -0.067 0.0938 0.0938 767 | VT 1.4500 2.3500 2.0800 0.993 0.045 -0.110 0.0938 0.0313 768 | VT 1.4000 2.0000 1.6000 0.992 0.030 -0.125 0.0313 0.0313 769 | VT -1.4000 2.0000 1.6000 -0.992 0.030 -0.125 0.0313 0.0313 770 | VT -1.4500 2.3500 2.0800 -0.993 0.045 -0.110 0.0938 0.0313 771 | VT -1.4600 2.2000 2.2300 -0.998 -0.010 -0.067 0.0938 0.0938 772 | VT 1.5000 3.2000 4.0000 1.000 0.000 -0.000 0.0938 0.0938 773 | VT 1.5000 3.0000 4.0000 1.000 0.000 -0.000 0.0938 0.0313 774 | VT -1.5000 3.0000 4.0000 -1.000 0.000 0.000 0.0938 0.0313 775 | VT -1.5000 3.2000 4.0000 -1.000 0.000 0.000 0.0938 0.0938 776 | VT 1.5000 3.0000 4.0000 1.000 0.000 -0.000 0.0313 0.0938 777 | VT 1.5000 2.2000 3.0500 1.000 -0.001 -0.019 0.0938 0.0938 778 | VT 1.5000 1.4000 3.6000 1.000 0.000 -0.000 0.0938 0.0313 779 | VT -1.5000 3.0000 4.0000 -1.000 0.000 0.000 0.0313 0.0938 780 | VT -1.5000 1.4000 3.6000 -1.000 0.000 0.000 0.0938 0.0313 781 | VT -1.5000 2.2000 3.0500 -1.000 -0.001 -0.019 0.0938 0.0938 782 | VT 1.4000 1.4000 1.7000 0.997 -0.021 -0.081 0.0938 0.0938 783 | VT 1.4600 2.2000 2.2300 0.998 -0.010 -0.067 0.0938 0.0313 784 | VT -1.4600 2.2000 2.2300 -0.998 -0.010 -0.067 0.0938 0.0313 785 | VT -1.4000 1.4000 1.7000 -0.997 -0.021 -0.081 0.0938 0.0938 786 | VT 1.5000 1.4000 3.1000 0.999 -0.010 -0.040 0.0938 0.0313 787 | VT -1.5000 1.4000 3.1000 -0.999 -0.010 -0.040 0.0938 0.0313 788 | VT 1.5000 1.4000 3.1000 0.999 -0.010 -0.040 0.0938 0.0938 789 | VT 1.4000 1.4000 1.7000 0.997 -0.021 -0.081 0.0313 0.0313 790 | VT -1.4000 1.4000 1.7000 -0.997 -0.021 -0.081 0.0313 0.0313 791 | VT -1.5000 1.4000 3.1000 -0.999 -0.010 -0.040 0.0938 0.0938 792 | VT 1.5000 1.4000 3.1000 0.999 -0.010 -0.040 0.0313 0.0313 793 | VT -1.5000 1.4000 3.1000 -0.999 -0.010 -0.040 0.0313 0.0313 794 | VT 2.9500 3.3000 15.2000 0.000 0.000 1.000 0.2188 0.0938 795 | VT 3.0000 2.8000 15.2000 0.000 0.000 1.000 0.2188 0.0313 796 | VT 2.5000 3.3000 15.2000 0.000 0.000 1.000 0.1563 0.0313 797 | VT -2.5000 3.3000 15.2000 0.000 0.000 1.000 0.1563 0.0313 798 | VT -3.0000 2.8000 15.2000 0.000 0.000 1.000 0.2188 0.0313 799 | VT -2.9500 3.3000 15.2000 0.000 0.000 1.000 0.2188 0.0938 800 | VT 2.5000 3.3000 15.2000 -0.000 0.000 1.000 0.2188 0.0938 801 | VT 2.5000 1.4000 15.2000 -0.000 0.000 1.000 0.1563 0.0313 802 | VT -2.5000 1.4000 15.2000 0.000 0.000 1.000 0.1563 0.0313 803 | VT -2.5000 3.3000 15.2000 0.000 0.000 1.000 0.2188 0.0938 804 | VT 3.0000 2.8000 15.2000 0.000 -0.000 1.000 0.2188 0.0938 805 | VT 3.0000 1.4000 15.2000 0.000 -0.000 1.000 0.2188 0.0313 806 | VT -3.0000 1.4000 15.2000 0.000 -0.000 1.000 0.2188 0.0313 807 | VT -3.0000 2.8000 15.2000 0.000 -0.000 1.000 0.2188 0.0938 808 | VT 2.9500 3.3000 15.2000 -0.990 -0.126 0.058 0.2188 0.0938 809 | VT 3.0000 3.0000 15.4000 -0.990 -0.126 0.058 0.2188 0.0313 810 | VT 3.0000 2.8000 15.2000 -0.990 -0.099 0.099 0.1563 0.0313 811 | VT -3.0000 2.8000 15.2000 0.990 -0.099 0.099 0.1563 0.0313 812 | VT -3.0000 3.0000 15.4000 0.990 -0.126 0.058 0.2188 0.0313 813 | VT -2.9500 3.3000 15.2000 0.990 -0.126 0.058 0.2188 0.0938 814 | VT 3.0000 3.3000 18.1000 -0.988 -0.153 0.017 0.2188 0.0313 815 | VT 3.0000 3.0000 15.4000 -0.990 -0.126 0.058 0.1563 0.0313 816 | VT -3.0000 3.0000 15.4000 0.990 -0.126 0.058 0.1563 0.0313 817 | VT -3.0000 3.3000 18.1000 0.988 -0.153 0.017 0.2188 0.0313 818 | VT 2.5000 3.3000 15.2000 -1.000 0.000 -0.000 0.1563 0.0938 819 | VT 2.5000 1.4000 15.2000 -1.000 0.000 -0.000 0.2188 0.0938 820 | VT 2.5000 1.4000 14.8000 -1.000 0.000 -0.000 0.2188 0.0313 821 | VT 2.5000 3.3000 14.8000 -1.000 0.000 -0.000 0.1563 0.0313 822 | VT -2.5000 3.3000 15.2000 1.000 0.000 -0.000 0.1563 0.0938 823 | VT -2.5000 3.3000 14.8000 1.000 0.000 -0.000 0.1563 0.0313 824 | VT -2.5000 1.4000 14.8000 1.000 0.000 -0.000 0.2188 0.0313 825 | VT -2.5000 1.4000 15.2000 1.000 0.000 -0.000 0.2188 0.0938 826 | VT 2.5000 1.4000 14.8000 -0.000 -0.000 1.000 0.1563 0.0938 827 | VT 1.0000 1.4000 14.8000 -0.000 -0.000 1.000 0.2188 0.0938 828 | VT 1.0000 3.3000 14.8000 -0.000 -0.000 1.000 0.2188 0.0313 829 | VT 2.5000 3.3000 14.8000 -0.000 -0.000 1.000 0.1563 0.0313 830 | VT -2.5000 1.4000 14.8000 0.000 -0.000 1.000 0.1563 0.0938 831 | VT -2.5000 3.3000 14.8000 0.000 -0.000 1.000 0.1563 0.0313 832 | VT -1.0000 3.3000 14.8000 0.000 -0.000 1.000 0.2188 0.0313 833 | VT -1.0000 1.4000 14.8000 0.000 -0.000 1.000 0.2188 0.0938 834 | VT 1.0000 1.4000 14.8000 0.000 -0.000 1.000 0.125 0.25 835 | VT 0.0000 1.4000 14.8000 0.000 -0.000 1.000 0.0 0.25 836 | VT 0.0000 3.3000 14.8000 0.000 -0.000 1.000 0.0 0.5 837 | VT 1.0000 3.3000 14.8000 0.000 -0.000 1.000 0.125 0.5 838 | VT -1.0000 1.4000 14.8000 0.000 -0.000 1.000 0.125 0.25 839 | VT -1.0000 3.3000 14.8000 0.000 -0.000 1.000 0.125 0.5 840 | VT 1.5000 3.0000 4.0000 1.000 0.000 -0.000 0.5117 0.4453 841 | VT 1.5000 2.7000 3.0250 1.000 0.000 -0.000 0.625 0.375 842 | VT 1.5000 2.2000 3.0500 1.000 0.000 -0.000 0.5117 0.2578 843 | VT -1.5000 2.2000 3.0500 -1.000 0.000 0.000 0.5117 0.2578 844 | VT -1.5000 2.7000 3.0250 -1.000 0.000 0.000 0.625 0.375 845 | VT -1.5000 3.0000 4.0000 -1.000 0.000 0.000 0.5117 0.4453 846 | VT 1.4600 2.2000 2.2300 0.999 -0.002 -0.049 0.7383 0.2578 847 | VT 1.5000 2.2000 3.0500 0.999 -0.002 -0.049 0.5117 0.2578 848 | VT 1.5000 2.7000 3.0250 0.999 -0.002 -0.049 0.625 0.375 849 | VT -1.5000 2.7000 3.0250 -0.999 -0.002 -0.049 0.625 0.375 850 | VT -1.5000 2.2000 3.0500 -0.999 -0.002 -0.049 0.5117 0.2578 851 | VT -1.4600 2.2000 2.2300 -0.999 -0.002 -0.049 0.7383 0.2578 852 | VT 1.5000 3.2000 4.0000 1.000 0.000 -0.000 0.5117 0.4766 853 | VT 1.5000 2.7000 3.0250 1.000 0.001 -0.026 0.625 0.375 854 | VT -1.5000 2.7000 3.0250 -1.000 0.001 -0.026 0.625 0.375 855 | VT -1.5000 3.2000 4.0000 -1.000 0.000 0.000 0.5117 0.4766 856 | VT 1.5000 3.2000 3.0000 0.997 0.035 -0.069 0.6289 0.4766 857 | VT -1.5000 3.2000 3.0000 -0.997 0.035 -0.069 0.6289 0.4766 858 | VT 1.4500 2.3500 2.0800 0.993 0.045 -0.110 0.7383 0.4766 859 | VT -1.4500 2.3500 2.0800 -0.993 0.045 -0.110 0.7383 0.4766 860 | VT 1.4600 2.2000 2.2300 0.998 -0.010 -0.067 0.7383 0.2578 861 | VT -1.4600 2.2000 2.2300 -0.998 -0.010 -0.067 0.7383 0.2578 862 | VT -0.0000 2.3500 1.9000 -0.000 0.741 -0.672 0.0313 0.0625 863 | VT -0.0000 2.0000 1.5000 -0.000 0.743 -0.669 0.0313 0.0938 864 | VT 1.4000 2.0000 1.6000 0.043 0.743 -0.668 0.0938 0.0938 865 | VT 1.4300 2.3500 1.9800 0.036 0.740 -0.671 0.0938 0.0625 866 | VT -1.4300 2.3500 1.9800 -0.036 0.740 -0.671 0.0938 0.0625 867 | VT -1.4000 2.0000 1.6000 -0.043 0.743 -0.668 0.0938 0.0938 868 | VT 1.4500 2.3500 2.0800 0.993 0.045 -0.110 0.0938 0.0938 869 | VT 1.4300 2.3500 1.9800 0.977 0.119 -0.177 0.0313 0.0625 870 | VT 1.4000 2.0000 1.6000 0.992 0.030 -0.125 0.0313 0.0938 871 | VT -1.4000 2.0000 1.6000 -0.992 0.030 -0.125 0.0313 0.0938 872 | VT -1.4300 2.3500 1.9800 -0.977 0.119 -0.177 0.0313 0.0625 873 | VT -1.4500 2.3500 2.0800 -0.993 0.045 -0.110 0.0938 0.0938 874 | VT -0.0000 3.4000 3.1000 -0.000 0.855 -0.518 0.0313 0.0313 875 | VT -0.0000 3.2500 2.9000 -0.000 0.749 -0.663 0.0313 0.0469 876 | VT 1.4900 3.2500 2.9500 0.020 0.748 -0.663 0.0938 0.0469 877 | VT 1.5000 3.4000 3.1000 0.005 0.855 -0.518 0.0938 0.0313 878 | VT -1.5000 3.4000 3.1000 -0.005 0.855 -0.518 0.0938 0.0313 879 | VT -1.4900 3.2500 2.9500 -0.020 0.748 -0.663 0.0938 0.0469 880 | VT -0.0000 3.2500 2.9000 -0.000 0.749 -0.663 0.4688 0.4727 881 | VT -0.0000 2.3500 1.9000 -0.000 0.741 -0.672 0.4688 0.2617 882 | VT 1.4300 2.3500 1.9800 0.036 0.740 -0.671 0.2617 0.2617 883 | VT 1.4900 3.2500 2.9500 0.020 0.748 -0.663 0.2617 0.4727 884 | VT -1.4900 3.2500 2.9500 -0.020 0.748 -0.663 0.2617 0.4727 885 | VT -1.4300 2.3500 1.9800 -0.036 0.740 -0.671 0.2617 0.2617 886 | VT 1.5000 3.2000 3.0000 0.997 0.035 -0.069 0.0938 0.0313 887 | VT 1.4900 3.2500 2.9500 0.985 0.088 -0.146 0.0313 0.0469 888 | VT -1.4900 3.2500 2.9500 -0.985 0.088 -0.146 0.0313 0.0469 889 | VT -1.5000 3.2000 3.0000 -0.997 0.035 -0.069 0.0938 0.0313 890 | VT 0.0600 3.6000 3.9000 1.000 -0.000 0.000 0.1563 0.0938 891 | VT 0.0600 3.6000 4.1000 1.000 -0.000 0.000 0.2188 0.0938 892 | VT 0.0600 4.4000 4.2000 1.000 -0.000 0.000 0.2188 0.0313 893 | VT 0.0600 4.4000 4.1000 1.000 -0.000 0.000 0.1563 0.0313 894 | VT -0.0600 3.6000 3.9000 -1.000 -0.000 0.000 0.1563 0.0938 895 | VT -0.0600 4.4000 4.1000 -1.000 -0.000 0.000 0.1563 0.0313 896 | VT -0.0600 4.4000 4.2000 -1.000 -0.000 0.000 0.2188 0.0313 897 | VT -0.0600 3.6000 4.1000 -1.000 -0.000 0.000 0.2188 0.0938 898 | VT -0.0000 3.6000 3.9000 0.000 0.242 -0.970 0.1563 0.0938 899 | VT 0.0600 3.6000 3.9000 0.000 0.242 -0.970 0.2188 0.0938 900 | VT 0.0600 4.4000 4.1000 0.000 0.242 -0.970 0.2188 0.0313 901 | VT -0.0000 4.4000 4.1000 0.000 0.242 -0.970 0.1563 0.0313 902 | VT -0.0600 4.4000 4.1000 -0.000 0.242 -0.970 0.2188 0.0313 903 | VT -0.0600 3.6000 3.9000 -0.000 0.242 -0.970 0.2188 0.0938 904 | VT -0.0000 4.4000 4.2000 -0.000 -0.124 0.992 0.1563 0.0938 905 | VT 0.0600 4.4000 4.2000 -0.000 -0.124 0.992 0.2188 0.0938 906 | VT 0.0600 3.6000 4.1000 -0.000 -0.124 0.992 0.2188 0.0313 907 | VT -0.0000 3.6000 4.1000 -0.000 -0.124 0.992 0.1563 0.0313 908 | VT -0.0600 3.6000 4.1000 0.000 -0.124 0.992 0.2188 0.0313 909 | VT -0.0600 4.4000 4.2000 0.000 -0.124 0.992 0.2188 0.0938 910 | VT -0.0000 4.4000 4.1000 0.000 1.000 -0.000 0.1563 0.0938 911 | VT 0.0600 4.4000 4.1000 0.000 1.000 -0.000 0.2188 0.0938 912 | VT 0.0600 4.4000 4.2000 0.000 1.000 -0.000 0.2188 0.0313 913 | VT -0.0000 4.4000 4.2000 0.000 1.000 -0.000 0.1563 0.0313 914 | VT -0.0600 4.4000 4.2000 -0.000 1.000 -0.000 0.2188 0.0313 915 | VT -0.0600 4.4000 4.1000 -0.000 1.000 -0.000 0.2188 0.0938 916 | VT 1.5500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0313 0.0938 917 | VT 1.5500 1.2000 5.7000 -1.000 -0.002 -0.033 0.0938 0.0938 918 | VT 1.5500 0.7500 19.4000 -1.000 0.000 0.000 0.0938 0.0313 919 | VT 1.5500 0.1000 19.4000 -1.000 0.000 0.000 0.0313 0.0313 920 | VT -1.5500 0.1000 5.7500 0.999 -0.002 -0.033 0.0313 0.0938 921 | VT -1.5500 0.1000 19.4000 1.000 0.000 -0.000 0.0313 0.0313 922 | VT -1.5500 0.7500 19.4000 1.000 0.000 -0.000 0.0938 0.0313 923 | VT -1.5500 1.2000 5.7000 1.000 -0.002 -0.033 0.0938 0.0938 924 | VT 1.5500 0.7500 19.4000 0.000 0.000 1.000 0.0313 0.0938 925 | VT 3.2500 1.2000 19.4000 0.000 0.000 1.000 0.0938 0.0938 926 | VT 3.2500 0.1000 19.4000 0.000 0.000 1.000 0.0938 0.0313 927 | VT 1.5500 0.1000 19.4000 0.000 0.000 1.000 0.0313 0.0313 928 | VT -1.5500 0.7500 19.4000 0.000 0.000 1.000 0.0313 0.0938 929 | VT -1.5500 0.1000 19.4000 0.000 0.000 1.000 0.0313 0.0313 930 | VT -3.2500 0.1000 19.4000 0.000 0.000 1.000 0.0938 0.0313 931 | VT -3.2500 1.2000 19.4000 0.000 0.000 1.000 0.0938 0.0938 932 | VT 3.2500 -1.0000 19.4000 0.000 0.000 1.000 0.0313 0.0938 933 | VT 1.5500 -1.0000 19.4000 0.000 0.000 1.000 0.0938 0.0938 934 | VT 1.5500 0.1000 19.4000 0.000 0.000 1.000 0.0938 0.0313 935 | VT 3.2500 0.1000 19.4000 0.000 0.000 1.000 0.0313 0.0313 936 | VT -3.2500 -1.0000 19.4000 0.000 0.000 1.000 0.0313 0.0938 937 | VT -3.2500 0.1000 19.4000 0.000 0.000 1.000 0.0313 0.0313 938 | VT -1.5500 0.1000 19.4000 0.000 0.000 1.000 0.0938 0.0313 939 | VT -1.5500 -1.0000 19.4000 0.000 0.000 1.000 0.0938 0.0938 940 | VT 1.5500 -1.0000 5.8000 -0.999 -0.002 -0.034 0.0313 0.0938 941 | VT 1.5500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0938 0.0938 942 | VT 1.5500 0.1000 19.4000 -1.000 0.000 0.000 0.0938 0.0313 943 | VT 1.5500 -1.0000 19.4000 -1.000 0.000 0.000 0.0313 0.0313 944 | VT -1.5500 -1.0000 5.8000 0.999 -0.002 -0.034 0.0313 0.0938 945 | VT -1.5500 -1.0000 19.4000 1.000 0.000 -0.000 0.0313 0.0313 946 | VT -1.5500 0.1000 19.4000 1.000 0.000 -0.000 0.0938 0.0313 947 | VT -1.5500 0.1000 5.7500 0.999 -0.002 -0.033 0.0938 0.0938 948 | VT 3.2500 0.1000 19.4000 1.000 0.000 -0.000 0.0313 0.0938 949 | VT 3.2500 1.2000 19.4000 1.000 0.000 -0.000 0.0938 0.0938 950 | VT 3.2500 1.2000 5.7000 1.000 -0.002 -0.033 0.0938 0.0313 951 | VT 3.2500 0.1000 5.7500 0.999 -0.002 -0.033 0.0313 0.0313 952 | VT -3.2500 0.1000 19.4000 -1.000 0.000 0.000 0.0313 0.0938 953 | VT -3.2500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0313 0.0313 954 | VT -3.2500 1.2000 5.7000 -1.000 -0.002 -0.033 0.0938 0.0313 955 | VT -3.2500 1.2000 19.4000 -1.000 0.000 0.000 0.0938 0.0938 956 | VT 3.2500 -1.0000 19.4000 1.000 0.000 -0.000 0.0313 0.0938 957 | VT 3.2500 0.1000 19.4000 1.000 0.000 -0.000 0.0938 0.0938 958 | VT 3.2500 0.1000 5.7500 0.999 -0.002 -0.033 0.0938 0.0313 959 | VT 3.2500 -1.0000 5.8000 0.999 -0.002 -0.034 0.0313 0.0313 960 | VT -3.2500 -1.0000 19.4000 -1.000 0.000 0.000 0.0313 0.0938 961 | VT -3.2500 -1.0000 5.8000 -0.999 -0.002 -0.034 0.0313 0.0313 962 | VT -3.2500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0938 0.0313 963 | VT -3.2500 0.1000 19.4000 -1.000 0.000 0.000 0.0938 0.0938 964 | VT 2.6000 0.1000 0.8500 0.931 -0.049 -0.362 0.0313 0.0938 965 | VT 2.6000 1.2000 0.7000 0.931 -0.049 -0.362 0.0938 0.0938 966 | VT 2.4000 1.2000 0.3000 0.893 -0.061 -0.446 0.0938 0.0313 967 | VT 2.4000 0.1000 0.4500 0.893 -0.061 -0.446 0.0313 0.0313 968 | VT -2.6000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0313 0.0938 969 | VT -2.4000 0.1000 0.4500 -0.893 -0.061 -0.446 0.0313 0.0313 970 | VT -2.4000 1.2000 0.3000 -0.893 -0.061 -0.446 0.0938 0.0313 971 | VT -2.6000 1.2000 0.7000 -0.931 -0.049 -0.362 0.0938 0.0938 972 | VT 2.6000 -1.0000 1.0000 0.931 -0.049 -0.362 0.0313 0.0938 973 | VT 2.6000 0.1000 0.8500 0.931 -0.049 -0.362 0.0938 0.0938 974 | VT 2.4000 0.1000 0.4500 0.893 -0.061 -0.446 0.0938 0.0313 975 | VT 2.4000 -1.0000 0.6000 0.893 -0.061 -0.446 0.0313 0.0313 976 | VT -2.6000 -1.0000 1.0000 -0.931 -0.049 -0.362 0.0313 0.0938 977 | VT -2.4000 -1.0000 0.6000 -0.893 -0.061 -0.446 0.0313 0.0313 978 | VT -2.4000 0.1000 0.4500 -0.893 -0.061 -0.446 0.0938 0.0313 979 | VT -2.6000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0938 0.0938 980 | VT 2.8000 0.1000 1.5500 0.977 -0.027 -0.214 0.0313 0.0938 981 | VT 2.8000 1.2000 1.4000 0.977 -0.027 -0.213 0.0938 0.0938 982 | VT 2.6000 1.2000 0.7000 0.931 -0.049 -0.362 0.0938 0.0313 983 | VT 2.6000 0.1000 0.8500 0.931 -0.049 -0.362 0.0313 0.0313 984 | VT -2.8000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0313 0.0938 985 | VT -2.6000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0313 0.0313 986 | VT -2.6000 1.2000 0.7000 -0.931 -0.049 -0.362 0.0938 0.0313 987 | VT -2.8000 1.2000 1.4000 -0.977 -0.027 -0.213 0.0938 0.0938 988 | VT 2.8000 -1.0000 1.7000 0.976 -0.028 -0.215 0.0313 0.0938 989 | VT 2.8000 0.1000 1.5500 0.977 -0.027 -0.214 0.0938 0.0938 990 | VT 2.6000 0.1000 0.8500 0.931 -0.049 -0.362 0.0938 0.0313 991 | VT 2.6000 -1.0000 1.0000 0.931 -0.049 -0.362 0.0313 0.0313 992 | VT -2.8000 -1.0000 1.7000 -0.976 -0.028 -0.215 0.0313 0.0938 993 | VT -2.6000 -1.0000 1.0000 -0.931 -0.049 -0.362 0.0313 0.0313 994 | VT -2.6000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0938 0.0313 995 | VT -2.8000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0938 0.0938 996 | VT 3.1000 0.1000 3.5000 0.994 -0.011 -0.109 0.0313 0.0938 997 | VT 3.1000 1.2000 3.4000 0.994 -0.011 -0.108 0.0938 0.0938 998 | VT 2.8000 1.2000 1.4000 0.977 -0.027 -0.213 0.0938 0.0313 999 | VT 2.8000 0.1000 1.5500 0.977 -0.027 -0.214 0.0313 0.0313 1000 | VT -3.1000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0313 0.0938 1001 | VT -2.8000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0313 0.0313 1002 | VT -2.8000 1.2000 1.4000 -0.977 -0.027 -0.213 0.0938 0.0313 1003 | VT -3.1000 1.2000 3.4000 -0.994 -0.011 -0.108 0.0938 0.0938 1004 | VT 3.1000 -1.0000 3.6000 0.994 -0.011 -0.111 0.0313 0.0938 1005 | VT 3.1000 0.1000 3.5000 0.994 -0.011 -0.109 0.0938 0.0938 1006 | VT 2.8000 0.1000 1.5500 0.977 -0.027 -0.214 0.0938 0.0313 1007 | VT 2.8000 -1.0000 1.7000 0.976 -0.028 -0.215 0.0313 0.0313 1008 | VT -3.1000 -1.0000 3.6000 -0.994 -0.011 -0.111 0.0313 0.0938 1009 | VT -2.8000 -1.0000 1.7000 -0.976 -0.028 -0.215 0.0313 0.0313 1010 | VT -2.8000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0938 0.0313 1011 | VT -3.1000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0938 0.0938 1012 | VT 3.2500 0.1000 5.7500 0.999 -0.002 -0.033 0.0313 0.0938 1013 | VT 3.2500 1.2000 5.7000 1.000 -0.002 -0.033 0.0938 0.0938 1014 | VT 3.1000 1.2000 3.4000 0.994 -0.011 -0.108 0.0938 0.0313 1015 | VT 3.1000 0.1000 3.5000 0.994 -0.011 -0.109 0.0313 0.0313 1016 | VT -3.2500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0313 0.0938 1017 | VT -3.1000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0313 0.0313 1018 | VT -3.1000 1.2000 3.4000 -0.994 -0.011 -0.108 0.0938 0.0313 1019 | VT -3.2500 1.2000 5.7000 -1.000 -0.002 -0.033 0.0938 0.0938 1020 | VT 3.2500 -1.0000 5.8000 0.999 -0.002 -0.034 0.0313 0.0938 1021 | VT 3.2500 0.1000 5.7500 0.999 -0.002 -0.033 0.0938 0.0938 1022 | VT 3.1000 0.1000 3.5000 0.994 -0.011 -0.109 0.0938 0.0313 1023 | VT 3.1000 -1.0000 3.6000 0.994 -0.011 -0.111 0.0313 0.0313 1024 | VT -3.2500 -1.0000 5.8000 -0.999 -0.002 -0.034 0.0313 0.0938 1025 | VT -3.1000 -1.0000 3.6000 -0.994 -0.011 -0.111 0.0313 0.0313 1026 | VT -3.1000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0938 0.0313 1027 | VT -3.2500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0938 0.0938 1028 | VT 1.7000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0313 0.0938 1029 | VT 1.7000 1.2000 3.4000 -0.994 -0.011 -0.108 0.0938 0.0938 1030 | VT 1.5500 1.2000 5.7000 -1.000 -0.002 -0.033 0.0938 0.0313 1031 | VT 1.5500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0313 0.0313 1032 | VT -1.7000 0.1000 3.5000 0.994 -0.011 -0.109 0.0313 0.0938 1033 | VT -1.5500 0.1000 5.7500 0.999 -0.002 -0.033 0.0313 0.0313 1034 | VT -1.5500 1.2000 5.7000 1.000 -0.002 -0.033 0.0938 0.0313 1035 | VT -1.7000 1.2000 3.4000 0.994 -0.011 -0.108 0.0938 0.0938 1036 | VT 1.7000 -1.0000 3.6000 -0.994 -0.011 -0.111 0.0313 0.0938 1037 | VT 1.7000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0938 0.0938 1038 | VT 1.5500 0.1000 5.7500 -0.999 -0.002 -0.033 0.0938 0.0313 1039 | VT 1.5500 -1.0000 5.8000 -0.999 -0.002 -0.034 0.0313 0.0313 1040 | VT -1.7000 -1.0000 3.6000 0.994 -0.011 -0.111 0.0313 0.0938 1041 | VT -1.5500 -1.0000 5.8000 0.999 -0.002 -0.034 0.0313 0.0313 1042 | VT -1.5500 0.1000 5.7500 0.999 -0.002 -0.033 0.0938 0.0313 1043 | VT -1.7000 0.1000 3.5000 0.994 -0.011 -0.109 0.0938 0.0938 1044 | VT 2.0000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0313 0.0938 1045 | VT 2.0000 1.2000 1.4000 -0.977 -0.027 -0.213 0.0938 0.0938 1046 | VT 1.7000 1.2000 3.4000 -0.994 -0.011 -0.108 0.0938 0.0313 1047 | VT 1.7000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0313 0.0313 1048 | VT -2.0000 0.1000 1.5500 0.977 -0.027 -0.214 0.0313 0.0938 1049 | VT -1.7000 0.1000 3.5000 0.994 -0.011 -0.109 0.0313 0.0313 1050 | VT -1.7000 1.2000 3.4000 0.994 -0.011 -0.108 0.0938 0.0313 1051 | VT -2.0000 1.2000 1.4000 0.977 -0.027 -0.213 0.0938 0.0938 1052 | VT 2.0000 -1.0000 1.7000 -0.976 -0.028 -0.215 0.0313 0.0938 1053 | VT 2.0000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0938 0.0938 1054 | VT 1.7000 0.1000 3.5000 -0.994 -0.011 -0.109 0.0938 0.0313 1055 | VT 1.7000 -1.0000 3.6000 -0.994 -0.011 -0.111 0.0313 0.0313 1056 | VT -2.0000 -1.0000 1.7000 0.976 -0.028 -0.215 0.0313 0.0938 1057 | VT -1.7000 -1.0000 3.6000 0.994 -0.011 -0.111 0.0313 0.0313 1058 | VT -1.7000 0.1000 3.5000 0.994 -0.011 -0.109 0.0938 0.0313 1059 | VT -2.0000 0.1000 1.5500 0.977 -0.027 -0.214 0.0938 0.0938 1060 | VT 2.2000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0313 0.0938 1061 | VT 2.2000 1.2000 0.7000 -0.931 -0.049 -0.362 0.0938 0.0938 1062 | VT 2.0000 1.2000 1.4000 -0.977 -0.027 -0.213 0.0938 0.0313 1063 | VT 2.0000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0313 0.0313 1064 | VT -2.2000 0.1000 0.8500 0.931 -0.049 -0.362 0.0313 0.0938 1065 | VT -2.0000 0.1000 1.5500 0.977 -0.027 -0.214 0.0313 0.0313 1066 | VT -2.0000 1.2000 1.4000 0.977 -0.027 -0.213 0.0938 0.0313 1067 | VT -2.2000 1.2000 0.7000 0.931 -0.049 -0.362 0.0938 0.0938 1068 | VT 2.2000 -1.0000 1.0000 -0.931 -0.049 -0.362 0.0313 0.0938 1069 | VT 2.2000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0938 0.0938 1070 | VT 2.0000 0.1000 1.5500 -0.977 -0.027 -0.214 0.0938 0.0313 1071 | VT 2.0000 -1.0000 1.7000 -0.976 -0.028 -0.215 0.0313 0.0313 1072 | VT -2.2000 -1.0000 1.0000 0.931 -0.049 -0.362 0.0313 0.0938 1073 | VT -2.0000 -1.0000 1.7000 0.976 -0.028 -0.215 0.0313 0.0313 1074 | VT -2.0000 0.1000 1.5500 0.977 -0.027 -0.214 0.0938 0.0313 1075 | VT -2.2000 0.1000 0.8500 0.931 -0.049 -0.362 0.0938 0.0938 1076 | VT 2.4000 0.1000 0.4500 -0.893 -0.061 -0.446 0.0313 0.0938 1077 | VT 2.4000 1.2000 0.3000 -0.893 -0.061 -0.446 0.0938 0.0938 1078 | VT 2.2000 1.2000 0.7000 -0.931 -0.049 -0.362 0.0938 0.0313 1079 | VT 2.2000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0313 0.0313 1080 | VT -2.4000 0.1000 0.4500 0.893 -0.061 -0.446 0.0313 0.0938 1081 | VT -2.2000 0.1000 0.8500 0.931 -0.049 -0.362 0.0313 0.0313 1082 | VT -2.2000 1.2000 0.7000 0.931 -0.049 -0.362 0.0938 0.0313 1083 | VT -2.4000 1.2000 0.3000 0.893 -0.061 -0.446 0.0938 0.0938 1084 | VT 2.4000 -1.0000 0.6000 -0.893 -0.061 -0.446 0.0313 0.0938 1085 | VT 2.4000 0.1000 0.4500 -0.893 -0.061 -0.446 0.0938 0.0938 1086 | VT 2.2000 0.1000 0.8500 -0.931 -0.049 -0.362 0.0938 0.0313 1087 | VT 2.2000 -1.0000 1.0000 -0.931 -0.049 -0.362 0.0313 0.0313 1088 | VT -2.4000 -1.0000 0.6000 0.893 -0.061 -0.446 0.0313 0.0938 1089 | VT -2.2000 -1.0000 1.0000 0.931 -0.049 -0.362 0.0313 0.0313 1090 | VT -2.2000 0.1000 0.8500 0.931 -0.049 -0.362 0.0938 0.0313 1091 | VT -2.4000 0.1000 0.4500 0.893 -0.061 -0.446 0.0938 0.0938 1092 | VT 1.4000 0.9000 19.4000 -0.707 -0.707 -0.023 0.0938 0.0938 1093 | VT 1.5500 0.7500 19.4000 -0.707 -0.707 -0.023 0.0938 0.0313 1094 | VT 1.5500 1.2000 5.7000 -0.707 -0.707 -0.023 0.0313 0.0313 1095 | VT -1.5500 1.2000 5.7000 0.707 -0.707 -0.023 0.0313 0.0313 1096 | VT -1.5500 0.7500 19.4000 0.707 -0.707 -0.023 0.0938 0.0313 1097 | VT -1.4000 0.9000 19.4000 0.707 -0.707 -0.023 0.0938 0.0938 1098 | VT 0.0000 1.2000 19.4000 0.000 0.000 1.000 0.0938 0.0938 1099 | VT 1.4000 0.9000 19.4000 0.000 0.000 1.000 0.0938 0.0313 1100 | VT 0.0000 0.9000 19.4000 0.000 0.000 1.000 0.0313 0.0313 1101 | VT -1.4000 0.9000 19.4000 0.000 0.000 1.000 0.0938 0.0313 1102 | VT 0.0000 1.2000 19.4000 0.000 0.000 1.000 0.0313 0.0313 1103 | VT 1.5500 0.7500 19.4000 0.000 0.000 1.000 0.0938 0.0313 1104 | VT 1.4000 0.9000 19.4000 0.000 0.000 1.000 0.0313 0.0313 1105 | VT -1.4000 0.9000 19.4000 -0.000 0.000 1.000 0.0313 0.0313 1106 | VT -1.5500 0.7500 19.4000 -0.000 0.000 1.000 0.0938 0.0313 1107 | 1108 | IDX10 915 916 917 915 917 918 919 920 921 919 1109 | IDX10 921 922 923 924 925 923 925 926 927 928 1110 | IDX10 929 927 929 930 1089 1090 1091 1091 1092 1089 1111 | IDX10 1093 1092 922 1096 1097 922 1015 1016 1017 1015 1112 | IDX10 1017 1018 1067 1068 1069 1067 1069 1070 1035 1036 1113 | IDX10 1037 1035 1037 1038 1011 1012 1013 1011 1013 1014 1114 | IDX10 1007 1008 1009 1007 1009 1010 1003 1004 1005 1003 1115 | IDX10 1005 1006 999 1000 1001 999 1001 1002 1051 1052 1116 | IDX10 1053 1051 1053 1054 1059 1060 1061 1059 1061 1062 1117 | IDX10 1027 1028 1029 1027 1029 1030 995 996 997 995 1118 | IDX10 997 998 991 992 993 991 993 994 987 988 1119 | IDX10 989 987 989 990 983 984 985 983 985 986 1120 | IDX10 979 980 981 979 981 982 975 976 977 975 1121 | IDX10 977 978 1075 1076 1077 1075 1077 1078 1043 1044 1122 | IDX10 1045 1043 1045 1046 1083 1084 1085 971 972 973 1123 | IDX10 971 973 974 967 968 969 967 969 970 963 1124 | IDX10 964 965 963 965 966 959 960 961 959 961 1125 | IDX10 962 955 956 957 955 957 958 951 952 953 1126 | IDX10 951 953 954 947 948 949 947 949 950 916 1127 | IDX10 1090 1093 916 1094 1095 879 755 880 880 864 1128 | IDX10 863 880 863 879 885 886 887 885 887 888 1129 | IDX10 901 902 903 901 903 904 901 904 905 901 1130 | IDX10 905 906 865 866 867 865 867 868 877 754 1131 | IDX10 878 877 878 860 877 860 859 862 863 864 1132 | IDX10 853 854 855 853 855 856 871 875 876 871 1133 | IDX10 876 872 859 860 861 853 857 858 853 858 1134 | IDX10 854 871 872 873 871 873 874 865 869 870 1135 | IDX10 865 870 866 799 800 801 802 803 804 834 1136 | IDX10 835 836 840 841 842 848 845 850 848 846 1137 | IDX10 845 889 890 891 889 891 892 799 805 806 1138 | IDX10 807 808 804 850 845 852 836 845 846 825 1139 | IDX10 826 827 825 827 828 809 810 811 809 811 1140 | IDX10 812 817 818 819 817 819 820 895 898 899 1141 | IDX10 895 899 900 895 896 897 895 897 898 831 1142 | IDX10 832 833 837 838 839 843 844 831 844 843 1143 | IDX10 847 851 844 849 849 844 847 881 882 883 1144 | IDX10 881 883 884 889 892 893 889 893 894 1063 1145 | IDX10 1064 1065 1063 1065 1066 829 830 827 829 827 1146 | IDX10 826 813 814 815 813 815 816 821 822 823 1147 | IDX10 821 823 824 907 908 909 907 909 910 911 1148 | IDX10 912 913 911 913 914 931 932 933 931 933 1149 | IDX10 934 1039 1040 1041 1039 1041 1042 1055 1056 1057 1150 | IDX10 1055 1057 1058 1086 1087 1088 943 944 945 943 1151 | IDX10 945 946 785 786 787 791 786 792 793 789 1152 | IDX10 794 795 796 792 793 797 798 757 758 759 1153 | IDX10 701 694 702 701 702 703 768 774 783 773 1154 | IDX10 774 759 779 774 780 731 732 733 704 705 1155 | IDX10 706 704 706 700 690 691 529 690 529 692 1156 | IDX10 687 688 526 687 526 689 737 738 739 737 1157 | IDX10 743 653 788 789 790 670 671 672 667 668 1158 | IDX10 669 662 663 664 666 662 664 659 660 661 1159 | IDX10 659 661 665 673 674 675 679 673 675 675 1160 | IDX10 681 679 567 683 684 654 655 656 654 649 1161 | IDX10 658 639 642 643 639 643 644 639 640 641 1162 | IDX10 639 641 642 634 635 636 634 636 628 657 1163 | IDX10 745 746 749 745 750 753 745 754 763 764 1164 | IDX10 746 767 768 769 767 769 746 768 777 647 1165 | IDX10 634 628 637 634 637 638 697 698 699 697 1166 | IDX10 699 700 595 596 597 609 717 718 598 596 1167 | IDX10 599 685 686 570 707 708 709 707 709 710 1168 | IDX10 711 712 713 711 713 714 784 775 772 760 1169 | IDX10 761 762 648 649 650 734 735 736 654 744 1170 | IDX10 742 751 748 752 770 747 771 770 771 772 1171 | IDX10 648 778 772 693 694 695 693 695 696 604 1172 | IDX10 605 597 595 600 601 602 603 599 598 605 1173 | IDX10 604 606 607 608 609 610 611 715 716 608 1174 | IDX10 719 720 608 609 721 722 723 716 724 725 1175 | IDX10 717 726 676 677 678 676 678 680 680 682 1176 | IDX10 676 760 775 776 781 775 782 612 613 607 1177 | IDX10 612 607 614 612 614 610 612 610 615 616 1178 | IDX10 617 618 616 618 619 622 623 624 625 623 1179 | IDX10 626 627 623 628 645 646 647 657 646 653 1180 | IDX10 628 623 629 616 619 620 616 620 621 630 1181 | IDX10 631 628 628 632 633 740 741 742 755 748 1182 | IDX10 756 727 728 724 579 580 581 582 583 584 1183 | IDX10 579 581 585 586 582 584 580 587 581 582 1184 | IDX10 588 583 589 590 591 561 562 563 651 652 1185 | IDX10 653 725 729 730 575 576 577 575 577 578 1186 | IDX10 540 545 546 540 541 542 564 565 566 571 1187 | IDX10 572 573 571 573 574 528 549 550 535 534 1188 | IDX10 552 555 529 556 555 559 560 537 538 539 1189 | IDX10 543 544 539 525 526 527 513 514 515 513 1190 | IDX10 515 516 528 529 530 485 486 487 485 487 1191 | IDX10 488 279 280 281 279 281 275 198 199 200 1192 | IDX10 198 200 201 212 213 214 212 214 215 216 1193 | IDX10 217 218 216 218 219 202 203 204 202 204 1194 | IDX10 205 220 221 222 220 222 223 224 225 226 1195 | IDX10 224 226 227 220 270 271 220 271 272 224 1196 | IDX10 273 274 224 274 275 206 207 208 206 208 1197 | IDX10 201 209 203 210 209 210 211 242 243 244 1198 | IDX10 245 246 247 242 248 249 250 251 247 252 1199 | IDX10 253 249 250 254 255 181 182 116 181 116 1200 | IDX10 183 188 189 190 188 190 191 196 197 194 1201 | IDX10 196 194 193 178 179 112 178 112 180 184 1202 | IDX10 185 186 184 186 187 192 193 194 192 194 1203 | IDX10 195 282 283 284 282 284 285 286 287 288 1204 | IDX10 286 288 289 293 189 294 293 294 295 290 1205 | IDX10 291 292 290 292 187 276 270 277 276 277 1206 | IDX10 278 175 146 176 175 176 177 256 257 258 1207 | IDX10 172 173 174 172 174 144 169 157 170 169 1208 | IDX10 170 171 166 167 168 166 168 155 160 161 1209 | IDX10 162 160 162 144 156 157 158 156 158 159 1210 | IDX10 163 146 164 163 164 165 151 115 150 151 1211 | IDX10 150 149 148 149 150 148 150 113 142 137 1212 | IDX10 143 142 143 144 152 153 154 152 154 155 1213 | IDX10 34 133 134 34 134 135 139 27 140 139 1214 | IDX10 140 141 145 146 147 145 147 141 26 127 1215 | IDX10 128 26 128 129 22 124 125 22 125 126 1216 | IDX10 30 130 131 30 131 132 114 115 116 114 1217 | IDX10 116 117 121 122 123 121 123 117 110 111 1218 | IDX10 112 110 112 113 118 111 119 118 119 120 1219 | IDX10 104 103 102 104 102 105 97 91 98 97 1220 | IDX10 98 99 86 87 88 86 88 89 136 137 1221 | IDX10 138 136 138 25 94 95 96 94 96 89 1222 | IDX10 78 79 80 78 80 81 74 75 76 74 1223 | IDX10 76 77 82 83 84 82 84 85 90 91 1224 | IDX10 92 90 92 93 66 67 68 66 68 69 1225 | IDX10 62 63 64 62 64 65 100 101 102 100 1226 | IDX10 102 103 56 57 58 56 58 51 70 71 1227 | IDX10 72 70 72 73 52 53 54 52 54 55 1228 | IDX10 59 53 60 59 60 61 48 49 50 48 1229 | IDX10 50 51 106 49 107 106 107 108 106 108 1230 | IDX10 109 106 109 55 44 1 45 44 45 46 1231 | IDX10 44 46 47 44 47 7 41 35 42 41 1232 | IDX10 42 43 38 39 40 38 40 33 34 35 1233 | IDX10 36 34 36 37 30 31 32 30 32 33 1234 | IDX10 531 532 533 489 490 491 489 491 492 521 1235 | IDX10 522 523 521 523 524 445 441 449 534 535 1236 | IDX10 536 564 569 570 505 506 507 505 507 508 1237 | IDX10 450 451 452 450 452 453 450 454 455 450 1238 | IDX10 455 451 493 494 495 493 495 496 456 457 1239 | IDX10 458 456 458 453 547 548 527 551 533 532 1240 | IDX10 553 526 554 557 558 554 459 454 460 459 1241 | IDX10 460 461 462 463 464 465 463 462 466 467 1242 | IDX10 464 465 467 468 466 469 470 509 510 511 1243 | IDX10 509 511 512 567 568 563 26 27 28 26 1244 | IDX10 28 29 22 23 24 22 24 25 18 19 1245 | IDX10 20 18 20 21 228 229 230 231 232 233 1246 | IDX10 234 229 235 236 232 237 238 239 235 236 1247 | IDX10 240 241 259 260 261 256 262 263 264 265 1248 | IDX10 261 266 267 263 264 268 269 471 472 468 1249 | IDX10 497 498 499 497 499 500 296 297 298 296 1250 | IDX10 298 299 14 15 16 14 16 17 300 301 1251 | IDX10 302 300 302 303 11 5 12 11 12 13 1252 | IDX10 8 9 10 8 10 3 4 5 6 4 1253 | IDX10 6 7 304 305 306 304 306 307 312 313 1254 | IDX10 314 312 314 315 316 317 314 316 314 313 1255 | IDX10 0 1 2 0 2 3 350 351 352 353 1256 | IDX10 354 355 356 357 358 359 360 361 362 363 1257 | IDX10 364 364 365 366 367 351 364 364 354 367 1258 | IDX10 356 374 375 379 365 373 380 363 352 382 1259 | IDX10 383 352 386 374 387 388 391 373 392 393 1260 | IDX10 394 392 394 395 398 399 400 398 400 395 1261 | IDX10 408 409 410 408 410 411 416 417 418 416 1262 | IDX10 418 419 424 425 426 424 426 427 432 433 1263 | IDX10 434 432 434 435 439 440 441 439 441 435 1264 | IDX10 445 446 447 318 319 320 318 320 321 368 1265 | IDX10 369 370 368 390 387 412 413 414 412 414 1266 | IDX10 415 322 323 324 322 324 325 326 327 328 1267 | IDX10 326 328 329 428 429 430 428 430 431 330 1268 | IDX10 331 332 330 332 333 371 372 373 376 377 1269 | IDX10 361 368 363 378 436 429 437 436 437 438 1270 | IDX10 442 443 444 334 335 336 334 336 337 338 1271 | IDX10 339 340 338 340 341 353 365 381 353 384 1272 | IDX10 385 392 396 397 392 397 393 401 396 402 1273 | IDX10 401 402 403 404 405 406 404 406 407 342 1274 | IDX10 343 344 342 344 345 420 421 422 420 422 1275 | IDX10 423 346 347 348 346 348 349 388 377 389 1276 | IDX10 473 469 474 475 472 476 466 477 478 592 1277 | IDX10 593 594 479 480 468 747 748 658 747 765 1278 | IDX10 766 1019 1020 1021 1019 1021 1022 517 518 519 1279 | IDX10 517 519 520 448 437 444 939 940 941 939 1280 | IDX10 941 942 466 481 482 483 484 468 308 309 1281 | IDX10 310 308 310 311 1071 1072 1073 1071 1073 1074 1282 | IDX10 1079 1080 1081 1079 1081 1082 501 502 503 501 1283 | IDX10 503 504 1023 1024 1025 1023 1025 1026 1031 1032 1284 | IDX10 1033 1031 1033 1034 1047 1048 1049 1047 1049 1050 1285 | IDX 935 1286 | IDX 936 1287 | IDX 937 1288 | IDX 935 1289 | IDX 937 1290 | IDX 938 1291 | 1292 | TRIS 0 1776 1293 | LIGHT_NAMED ship_nav_left -3.2000 3.3000 5.5000 1294 | LIGHT_NAMED ship_nav_right 3.2000 3.3000 5.5000 1295 | LIGHT_NAMED ship_nav_tail 0.0000 3.4000 18.2000 1296 | LIGHT_NAMED ship_mast_powered 0.0000 4.6000 4.0000 1297 | -------------------------------------------------------------------------------- /SeaTraffic/Damen_2010.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_2010.blend -------------------------------------------------------------------------------- /SeaTraffic/Damen_2010.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_2010.dds -------------------------------------------------------------------------------- /SeaTraffic/Damen_2010.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_2010.xcf -------------------------------------------------------------------------------- /SeaTraffic/Damen_2010_LIT.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_2010_LIT.dds -------------------------------------------------------------------------------- /SeaTraffic/Damen_4212.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_4212.blend -------------------------------------------------------------------------------- /SeaTraffic/Damen_4212.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_4212.dds -------------------------------------------------------------------------------- /SeaTraffic/Damen_4212.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_4212.xcf -------------------------------------------------------------------------------- /SeaTraffic/Damen_4212_LIT.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Damen_4212_LIT.dds -------------------------------------------------------------------------------- /SeaTraffic/Osm_linkage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Osm_linkage.png -------------------------------------------------------------------------------- /SeaTraffic/River_crossing.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/River_crossing.blend -------------------------------------------------------------------------------- /SeaTraffic/River_crossing.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/River_crossing.dds -------------------------------------------------------------------------------- /SeaTraffic/River_crossing_LIT.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/River_crossing_LIT.dds -------------------------------------------------------------------------------- /SeaTraffic/Tanker.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Tanker.dds -------------------------------------------------------------------------------- /SeaTraffic/Tanker.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Tanker.xcf -------------------------------------------------------------------------------- /SeaTraffic/Tanker_LIT.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/Tanker_LIT.dds -------------------------------------------------------------------------------- /SeaTraffic/buildroutes.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | # 4 | # Build maritime routes, categorised by traffic type = [ leisure | tourist | cruise | ped/sml | ped/med | veh/sml | veh/med | veh/big | cargo | tanker | mil ] 5 | # 6 | # Top-level documentation: http://wiki.openstreetmap.org/wiki/Marine_navigation and http://wiki.openstreetmap.org/wiki/Marine_Mapping 7 | # 8 | # Primary way tags for ped/* and veh/* : 9 | # route = ferry 10 | # name = 11 | # ref = 12 | # motor_vehicle = yes|no 13 | # hgv = yes|no 14 | # motorcar = yes|no 15 | # foot = yes|no 16 | # See http://wiki.openstreetmap.org/wiki/Tag:route=ferry 17 | # 18 | # Primary way tags for tourist : 19 | # route = ferry 20 | # name = 21 | # ref = 22 | # ferry = tourist 23 | # See http://wiki.openstreetmap.org/wiki/Proposed_features/ferry 24 | # 25 | # Primary way tags for cruise : 26 | # route = cruise 27 | # name = 28 | # ref = 29 | # or: 30 | # route = ferry 31 | # ferry = cruise 32 | # name = 33 | # ref = 34 | # See http://wiki.openstreetmap.org/wiki/Proposed_features/ferry 35 | # 36 | # Primary tags for leisure : 37 | # not implemented - perhaps look for node|area with tag leisure=marina and create routes around it 38 | # See http://wiki.openstreetmap.org/wiki/Tag:leisure=marina 39 | # 40 | # Primary tags for cargo | tanker : 41 | # not implemented - perhaps look for way with tag seamark:type=separation_lane (only ~100 hits in OSM database) 42 | # See http://wiki.openstreetmap.org/wiki/OpenSeaMap/Seamark_Tag_Values 43 | # or perhaps look for way with tag mooring=commercial and create routes around it (only ~50 hits in OSM database) 44 | # See http://wiki.openstreetmap.org/wiki/Key:mooring 45 | # or perhaps look for way with tag man_made=pier and create routes around it 46 | # See http://wiki.openstreetmap.org/wiki/Tag:man_made=pier 47 | # 48 | # Primary tags for mil : 49 | # not implemented - perhaps look for node|area with tag military=naval_base and create routes around it 50 | # See http://wiki.openstreetmap.org/wiki/Tag:military=naval_base 51 | # 52 | # 53 | 54 | 55 | import codecs 56 | from operator import attrgetter 57 | from math import acos, cos, sin, radians 58 | from sys import exit 59 | from urllib2 import urlopen 60 | from xml.parsers.expat import ParserCreate 61 | 62 | # http://wiki.openstreetmap.org/wiki/Overpass_API 63 | server='http://overpass-api.de/api/interpreter' 64 | 65 | timeout=1800 # server and client timout [s] 66 | 67 | radius=6378145 # from sim/physics/earth_radius_m 68 | 69 | 70 | class Node: 71 | 72 | def __init__(self, id, lat,lon): 73 | self.id=id # just for debugging 74 | self.lat=lat 75 | self.lon=lon 76 | self.ways=[] # Ways that use this node 77 | 78 | def __repr__(self): 79 | return "%11.7f %12.7f" % (self.lat, self.lon) 80 | 81 | def distanceto(self, to): 82 | a1=radians(self.lat) 83 | b1=radians(self.lon) 84 | a2=radians(to.lat) 85 | b2=radians(to.lon) 86 | if a1==a2 and b1==b2: return 0 87 | x=(cos(a1)*cos(b1)*cos(a2)*cos(b2) + cos(a1)*sin(b1)*cos(a2)*sin(b2) + sin(a1)*sin(a2)) 88 | if x>=1: return 0 89 | return radius * acos(x) 90 | 91 | 92 | class Way: 93 | 94 | DEFAULTNAME='Unnamed' 95 | def __init__(self, id): 96 | self.id=id # just for debugging 97 | self.name=Way.DEFAULTNAME 98 | self.nodes=[] 99 | self.length=0 100 | self.cruise=None 101 | self.hgv=None 102 | self.car=None 103 | self.vehicle=None 104 | self.foot=None 105 | self.tourist=None 106 | 107 | def __repr__(self): 108 | return "%-10d %s %s" % (self.id, self.name, self.nodes) 109 | 110 | def removefrom(self, ways): 111 | # Remove this way from ways, tidying up nodes 112 | for i in range(len(self.nodes)): 113 | node=self.nodes[i] 114 | if self in node.ways: # might be already removed if this way is a loop 115 | node.ways.remove(self) 116 | ways.remove(self) 117 | 118 | for i in range(1, len(self.nodes)-1): 119 | node=self.nodes[i] 120 | while node.ways: 121 | # way forks - remove the fork too 122 | node.ways[0].removefrom(ways) 123 | 124 | 125 | class Parser: 126 | 127 | def __init__(self): 128 | self.parser=ParserCreate() 129 | self.parser.StartElementHandler = self.startelement 130 | self.parser.EndElementHandler = self.endelement 131 | self.currentway=None 132 | 133 | def parse(self, data): 134 | self.parser.Parse(data) 135 | 136 | def OSMbool(self, value): 137 | # http://wiki.openstreetmap.org/wiki/Key:access 138 | if value in ['yes', 'permissive', 'designated', 'private', 'official']: 139 | return True 140 | elif value in ['no', 'delivery']: 141 | return False 142 | elif value in ['unknown']: 143 | return None # http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx 144 | else: 145 | try: 146 | int(value) # e.g. 147 | return True 148 | except: 149 | assert False, value # fail on random crud so we can decide what to do with it 150 | return False 151 | 152 | def startelement(self, name, attributes): 153 | if name=='node': 154 | nodes[int(attributes['id'])]=Node(int(attributes['id']), float(attributes['lat']), float(attributes['lon'])) 155 | elif name=='way': 156 | self.currentway=Way(int(attributes['id'])) 157 | ways.append(self.currentway) 158 | elif name=='meta': 159 | global datadate 160 | datadate=attributes['osm_base'] 161 | elif not self.currentway: 162 | pass # ignore tags etc unless we're in the middle of a Way definition 163 | elif name=='nd': 164 | node=nodes[int(attributes['ref'])] # assumes referenced node has already been parsed 165 | node.ways.append(self.currentway) 166 | self.currentway.nodes.append(node) 167 | elif name=='tag': 168 | tag=attributes['k'] 169 | value=attributes['v'] 170 | if tag==('name'): 171 | self.currentway.name=value.strip(' "\'-') 172 | elif tag.startswith('name'): # Pick any language-specific name if no generic name 173 | if self.currentway.name==Way.DEFAULTNAME: 174 | self.currentway.name=value.strip(' "\'-') 175 | elif tag=='ref': 176 | self.currentway.name+=(" #"+value) # relies on tags being alphabetically sorted so that ref comes after name 177 | elif tag=='hgv': 178 | self.currentway.hgv=self.OSMbool(value) 179 | elif tag=='motorcar': 180 | self.currentway.car=self.OSMbool(value) 181 | elif tag=='motor_vehicle': 182 | self.currentway.vehicle=self.OSMbool(value) 183 | elif tag=='foot': 184 | self.currentway.foot=self.OSMbool(value) 185 | elif tag=='ferry': 186 | # http://wiki.openstreetmap.org/wiki/Proposed_features/ferry 187 | if value.startswith('crui'): 188 | self.currentway.cruise=True 189 | elif value=='tourist': 190 | self.currentway.tourist=True 191 | elif value in ['trunk', 'primary', 'secondary']: 192 | if self.currentway.hgv is not False: self.currentway.hgv=True 193 | elif value in ['tertiary']: 194 | if self.currentway.hgv is not True: self.currentway.hgv=False 195 | if self.currentway.car is not False: self.currentway.car=True 196 | elif value in ['local','express_boat']: 197 | if self.currentway.vehicle is not True: self.currentway.vehicle=False 198 | if self.currentway.foot is not False: self.currentway.foot=True 199 | elif tag=='route': 200 | if value=='cruise': 201 | self.currentway.cruise=True 202 | assert value in ['ferry','cruise'], self.currentway.id 203 | 204 | def endelement(self, name): 205 | if name=='way': 206 | self.currentway.name=self.currentway.name[:128] # Completely arbitrary limit. (Note may be larger after utf-8 encoding). 207 | for i in range(0, len(self.currentway.nodes)-1): 208 | self.currentway.length+=self.currentway.nodes[i].distanceto(self.currentway.nodes[i+1]) 209 | self.currentway=None 210 | 211 | 212 | # main ################################################################# 213 | 214 | if True: 215 | bbox='' 216 | #bbox='(50.5,1,51.5,2)' # limit to Dover/Calais area for testing 217 | print "Querying %s - this will take a while" % server 218 | h=urlopen('%s?data=[timeout:%d];(way[route~"^ferry$|^cruise$"][bridge!~"."]%s;>;);out;' % (server, timeout, bbox), timeout=timeout) 219 | print "Downloading results" 220 | data=h.read() 221 | h.close() 222 | h=open('routes.osm', 'w') # dump XML for analysis 223 | h.write(data) 224 | h.close() 225 | else: 226 | # use an existing file instead, obtained with: wget -S -T0 -O routes.osm 'http://overpass-api.de/api/interpreter?data=[timeout:1800];(way[route~"^ferry$|^cruise$"][bridge!~"."];>;);out;' 227 | h=open('routes.osm') 228 | data=h.read() 229 | h.close() 230 | 231 | datadate=None 232 | nodes={} # Node by id 233 | ways=[] # List so sort is stable 234 | 235 | parser=Parser() 236 | parser.parse(data) 237 | if not ways: 238 | print "Query failed!" 239 | exit(1) 240 | 241 | # Dump raw data for analysis - open in Excel with Data->Import or Data->Get External Data 242 | h=codecs.open('routes.csv', 'w', 'utf-8') 243 | h.write('way,name,length,vehicle,hgv,car,foot,cruise,tourist\n') 244 | for way in ways: 245 | h.write('%d,"%s",%d,%s,%s,%s,%s,%s,%s\n' % ((way.id, way.name.replace('"', '""'), way.length) + tuple(['' if x is None else x for x in way.vehicle, way.hgv, way.car, way.foot, way.cruise, way.tourist]))) 246 | h.close() 247 | 248 | # arbitrary constants 249 | LENGTH_CUTOFF=50 # want to allow eg Woolwich ferry and Glastonbury-Rocky Hill 250 | LENGTH_PED_MED=2000 # assume foot-only access over this length is a medium-sized boat 251 | LENGTH_VEH_MED=2000 # assume coastal or inland (e.g. François Lake Ferry=3km) 252 | LENGTH_VEH_BIG=20000 # assume seagoing over 20km 253 | LENGTH_UNK_PED=500 # assume unspecified is foot-only under this length 254 | 255 | 256 | # Process ############################################################## 257 | 258 | # look for ways that share nodes 259 | # this code assumes that we have no extraneous nodes - i.e. nodes that link to a way not in 'ways' - so filter out any 260 | # unwanted ways in the original OSM query 261 | nways=len(ways) 262 | nmerged=nforked=nmess=0 263 | for node in nodes.itervalues(): 264 | if len(node.ways)<=1: continue # common case 265 | # for simplicity we just examine the longest way at each node 266 | node.ways.sort(key=attrgetter('length'), reverse=True) 267 | way0=node.ways[0] 268 | 269 | # check for loop e.g. "whale watching" in Guerrero Negro, Mexico 270 | while len(node.ways)>1: 271 | if way0==node.ways[1]: 272 | #print node, way0.name, 'loop' 273 | if not way0.cruise and not way0.hgv and not way0.car: 274 | way0.tourist=True # Assume loops are tourist boats 275 | node.ways.pop(0) 276 | else: 277 | break 278 | 279 | # check for single logical route split into multiple routes e.g. "14 / Actv" in Venice 280 | i=1 281 | while i=LENGTH_CUTOFF, ways), key=attrgetter('name')) 344 | 345 | print("%d OSM Ways, of which %d were merged, %d rejected forks, %d too small.\nResulting in %d routes, %d of which are a mess." % (nways, nmerged, nforked, len(ways)-len(sortedways), len(sortedways), nmess)) 346 | 347 | 348 | h=codecs.open('routes.txt', 'w', 'utf-8') 349 | h.write(u'\uFEFF# OSM export %s\n# Map data \u00A9 OpenStreetMap contributors - http://www.openstreetmap.org/, licensed under ODbL - http://opendatacommons.org/licenses/odbl/\n\n' % datadate) # start with BOM to signify this is utf-8 350 | for way in sortedways: 351 | 352 | if way.cruise: 353 | ferrytype='cruise' 354 | elif way.tourist: 355 | ferrytype='tourist' 356 | elif way.vehicle is False or (way.foot and not (way.hgv or way.car)) or (way.car is False and not way.hgv): 357 | if way.length>=LENGTH_PED_MED: 358 | ferrytype='ped/med' 359 | else: 360 | ferrytype='ped/sml' 361 | elif way.hgv: # HGV explicitly allowed - don't use small ferry 362 | if way.length>=LENGTH_VEH_BIG: 363 | ferrytype='veh/big' 364 | else: 365 | ferrytype='veh/med' 366 | elif way.hgv is False or (way.car and not way.hgv): # HGV explicitly or implicitly denied - don't use big ferry 367 | if way.length>=LENGTH_VEH_MED: 368 | ferrytype='veh/med' 369 | else: 370 | ferrytype='veh/sml' 371 | elif way.vehicle or way.foot is False: 372 | if way.length>=LENGTH_VEH_BIG: 373 | ferrytype='veh/big' 374 | elif way.length>=LENGTH_VEH_MED: 375 | ferrytype='veh/med' 376 | else: 377 | ferrytype='veh/sml' 378 | else: 379 | # No access specified - roughly 50% of cases 380 | assert way.vehicle is None and way.hgv is None and way.car is None and way.foot is None, way.id 381 | if way.length>=LENGTH_VEH_BIG: 382 | ferrytype='veh/big' 383 | elif way.length>=LENGTH_VEH_MED: 384 | ferrytype='veh/med' 385 | elif way.length>=LENGTH_UNK_PED: 386 | ferrytype='veh/sml' 387 | else: 388 | ferrytype='ped/sml' 389 | 390 | h.write('%s\t%s\n' % (ferrytype, way.name)) 391 | for node in way.nodes: 392 | h.write('%s\n' % node) 393 | h.write('\n') 394 | h.close() 395 | 396 | -------------------------------------------------------------------------------- /SeaTraffic/enhancedby_opensceneryx_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/enhancedby_opensceneryx_logo.png -------------------------------------------------------------------------------- /SeaTraffic/wake.dds: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/wake.dds -------------------------------------------------------------------------------- /SeaTraffic/wake.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/wake.xcf -------------------------------------------------------------------------------- /SeaTraffic/wake_big.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/wake_big.blend -------------------------------------------------------------------------------- /SeaTraffic/wake_big.obj: -------------------------------------------------------------------------------- 1 | I 2 | 800 3 | OBJ 4 | 5 | TEXTURE wake.dds 6 | TEXTURE_LIT wake_LIT.dds 7 | POINT_COUNTS 12 0 0 18 8 | 9 | VT 40.0000 0.0000 460.0000 0.000 1.000 -0.000 0.0 0.0156 10 | VT -40.0000 0.0000 460.0000 0.000 1.000 -0.000 0.5 0.0156 11 | VT -40.0000 0.0000 140.0000 0.000 1.000 -0.000 0.5 1.0 12 | VT 40.0000 0.0000 140.0000 0.000 1.000 -0.000 0.0 1.0 13 | VT 32.3301 0.1000 52.1410 0.000 1.000 -0.000 1.0 0.0 14 | VT 25.4019 0.1000 56.1410 0.000 1.000 -0.000 0.5 0.0 15 | VT 5.4019 0.1000 21.5000 0.000 1.000 -0.000 0.5 4.0 16 | VT 12.3301 0.1000 17.5000 0.000 1.000 -0.000 1.0 4.0 17 | VT -12.3301 0.1000 17.5000 0.000 1.000 -0.000 1.0 4.0 18 | VT -5.4019 0.1000 21.5000 0.000 1.000 -0.000 0.5 4.0 19 | VT -25.4019 0.1000 56.1410 0.000 1.000 -0.000 0.5 0.0 20 | VT -32.3301 0.1000 52.1410 0.000 1.000 -0.000 1.0 0.0 21 | 22 | IDX10 0 1 2 0 2 3 4 5 6 4 23 | IDX 6 24 | IDX 7 25 | IDX 8 26 | IDX 9 27 | IDX 10 28 | IDX 8 29 | IDX 10 30 | IDX 11 31 | 32 | ####_alpha 33 | TRIS 0 18 34 | 35 | # Built with Blender 2.49. Exported with XPlane2Blender 3.11. 36 | -------------------------------------------------------------------------------- /SeaTraffic/wake_med.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/wake_med.blend -------------------------------------------------------------------------------- /SeaTraffic/wake_med.obj: -------------------------------------------------------------------------------- 1 | I 2 | 800 3 | OBJ 4 | 5 | TEXTURE wake.dds 6 | TEXTURE_LIT wake_LIT.dds 7 | POINT_COUNTS 12 0 0 18 8 | 9 | VT 18.0000 0.1000 120.0000 0.000 1.000 -0.000 0.0 0.0156 10 | VT -18.0000 0.1000 120.0000 0.000 1.000 -0.000 0.5 0.0156 11 | VT -18.0000 0.1000 36.0000 0.000 1.000 -0.000 0.5 1.0 12 | VT 18.0000 0.1000 36.0000 0.000 1.000 -0.000 0.0 1.0 13 | VT 16.3301 0.1000 22.8205 0.000 1.000 -0.000 1.0 0.0 14 | VT 12.0000 0.1000 25.3205 0.000 1.000 -0.000 0.5 0.0 15 | VT 2.0000 0.1000 8.0000 0.000 1.000 -0.000 0.5 2.0 16 | VT 6.3301 0.1000 5.5000 0.000 1.000 -0.000 1.0 2.0 17 | VT -6.3301 0.1000 5.5000 0.000 1.000 -0.000 1.0 2.0 18 | VT -2.0000 0.1000 8.0000 0.000 1.000 -0.000 0.5 2.0 19 | VT -12.0000 0.1000 25.3205 0.000 1.000 -0.000 0.5 0.0 20 | VT -16.3301 0.1000 22.8205 0.000 1.000 -0.000 1.0 0.0 21 | 22 | IDX10 0 1 2 0 2 3 4 5 6 4 23 | IDX 6 24 | IDX 7 25 | IDX 8 26 | IDX 9 27 | IDX 10 28 | IDX 8 29 | IDX 10 30 | IDX 11 31 | 32 | ####_alpha 33 | TRIS 0 18 34 | 35 | # Built with Blender 2.49. Exported with XPlane2Blender 3.11. 36 | -------------------------------------------------------------------------------- /SeaTraffic/wake_sml.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Marginal/SeaTraffic/d1639ea06eed15a3f93d754af1948ca6596ffa9d/SeaTraffic/wake_sml.blend -------------------------------------------------------------------------------- /SeaTraffic/wake_sml.obj: -------------------------------------------------------------------------------- 1 | I 2 | 800 3 | OBJ 4 | 5 | TEXTURE wake.dds 6 | POINT_COUNTS 12 0 0 18 7 | 8 | VT 9.0000 0.0500 60.0000 0.000 1.000 -0.000 0.0 0.0156 9 | VT -9.0000 0.0500 60.0000 0.000 1.000 -0.000 0.5 0.0156 10 | VT -9.0000 0.0500 18.0000 0.000 1.000 -0.000 0.5 1.0 11 | VT 9.0000 0.0500 18.0000 0.000 1.000 -0.000 0.0 1.0 12 | VT 8.1651 0.0500 10.4103 0.000 1.000 -0.000 1.0 0.0 13 | VT 6.0000 0.0500 11.6603 0.000 1.000 -0.000 0.5 0.0 14 | VT 1.0000 0.0500 3.0000 0.000 1.000 -0.000 0.5 2.0 15 | VT 3.1651 0.0500 1.7500 0.000 1.000 -0.000 1.0 2.0 16 | VT -3.1651 0.0500 1.7500 0.000 1.000 -0.000 1.0 2.0 17 | VT -1.0000 0.0500 3.0000 0.000 1.000 -0.000 0.5 2.0 18 | VT -6.0000 0.0500 11.6603 0.000 1.000 -0.000 0.5 0.0 19 | VT -8.1651 0.0500 10.4103 0.000 1.000 -0.000 1.0 0.0 20 | 21 | IDX10 0 1 2 0 2 3 4 5 6 4 22 | IDX 6 23 | IDX 7 24 | IDX 8 25 | IDX 9 26 | IDX 10 27 | IDX 8 28 | IDX 10 29 | IDX 11 30 | 31 | TRIS 0 18 32 | -------------------------------------------------------------------------------- /src/.gdbinit: -------------------------------------------------------------------------------- 1 | file "~/Desktop/X-Plane 10/X-Plane.app/Contents/MacOS/X-Plane" 2 | set args --no_crash_reporter 3 | -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | *.bak 2 | *.d 3 | *.o 4 | *.obj 5 | *.pdb 6 | *.ncb 7 | *.xpl 8 | -------------------------------------------------------------------------------- /src/.lldbinit: -------------------------------------------------------------------------------- 1 | target create "~/Desktop/X-Plane 10/X-Plane.app/Contents/MacOS/X-Plane" 2 | settings set target.run-args -- --no_crash_reporter 3 | -------------------------------------------------------------------------------- /src/Makefile.lin: -------------------------------------------------------------------------------- 1 | # -*-Makefile-*- 2 | # Setup for building on Ubuntu x86_64 with multilib support, plus: 3 | # sudo ln -s mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so 4 | # sudo ln -s libGLU.so.1 /usr/lib/i386-linux-gnu/libGLU.so 5 | 6 | include ../version.mak 7 | 8 | XPSDK=../../XPSDK213 9 | 10 | CC=gcc 11 | #BUILD=-g -DDEBUG 12 | #LDFLAGS= 13 | BUILD=-O3 -s -DNDEBUG 14 | LDFLAGS=-Wl,-x 15 | DEFINES=-DAPL=0 -DIBM=0 -DLIN=1 -DVERSION=$(VERSION) 16 | INC=-I$(XPSDK)/CHeaders/XPLM -I$(XPSDK)/CHeaders/Widgets 17 | CFLAGS=-march=core2 -ffast-math -pipe -Wall -Wdouble-promotion -Winline -Wno-missing-braces -static-libgcc -shared -fPIC -fvisibility=hidden -fshort-enums $(BUILD) $(DEFINES) $(INC) 18 | 19 | VPATH= 20 | SRC=models.c routes.c seatraffic.c 21 | LIBS=-lGLU -lGL 22 | TARGETDIR=../$(PROJECT) 23 | 24 | ############################################################################ 25 | 26 | BUILD_32=$(shell uname)32 27 | OBJS_32=$(addprefix $(BUILD_32)/, $(addsuffix .o, $(basename $(notdir $(SRC))))) 28 | TARGET_32=$(TARGETDIR)/lin.xpl 29 | BUILD_64=$(shell uname)64 30 | OBJS_64=$(addprefix $(BUILD_64)/, $(addsuffix .o, $(basename $(notdir $(SRC))))) 31 | TARGET_64=$(TARGETDIR)/64/lin.xpl 32 | TARGET=$(TARGET_32) $(TARGET_64) 33 | 34 | RM=rm -f 35 | CP=cp -p 36 | MD=mkdir -p 37 | 38 | .PHONY: all clean install 39 | 40 | all: $(TARGET_32) $(TARGET_64) 41 | 42 | install: $(TARGET_32) $(TARGET_64) 43 | $(MD) /media/jonathan/Desktop/X-Plane\ 9/Resources/plugins/$(PROJECT) 44 | $(CP) $(TARGET_32) /media/jonathan/Desktop/X-Plane\ 9/Resources/plugins/$(PROJECT)/ 45 | $(MD) /media/jonathan/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT)/ 46 | $(CP) $(TARGET_32) /media/jonathan/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT)/ 47 | $(MD) /media/jonathan/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT)/64 48 | $(CP) $(TARGET_64) /media/jonathan/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT)/64/ 49 | 50 | $(TARGET_32): $(OBJS_32) | $(TARGETDIR) 51 | $(CC) $(CFLAGS) $(LDFLAGS) -m32 -o $@ $+ $(LIBS) 52 | 53 | $(TARGET_64): $(OBJS_64) | $(TARGETDIR)/64 54 | $(CC) $(CFLAGS) $(LDFLAGS) -m64 -o $@ $+ $(LIBS) 55 | 56 | $(OBJS_32): | $(BUILD_32) 57 | 58 | $(OBJS_64): | $(BUILD_64) 59 | 60 | $(BUILD_32): 61 | $(MD) $(BUILD_32) 62 | 63 | $(BUILD_64): 64 | $(MD) $(BUILD_64) 65 | 66 | $(BUILD_32)/%.o: %.c 67 | $(CC) $(CFLAGS) -m32 -c -o $@ $< 68 | @$(CC) $(CFLAGS) -m32 -MM $< | sed -e 's|$*.o|$@|' > $(@:.o=.d) 69 | 70 | $(BUILD_64)/%.o: %.c 71 | $(CC) $(CFLAGS) -m64 -c -o $@ $< 72 | @$(CC) $(CFLAGS) -m64 -MM $< | sed -e 's|$*.o|$@|' > $(@:.o=.d) 73 | 74 | $(TARGETDIR): 75 | $(MD) $(TARGETDIR) 76 | 77 | $(TARGETDIR)/64: 78 | $(MD) $(TARGETDIR)/64 79 | 80 | clean: 81 | $(RM) *~ *.bak $(OBJS_32) $(OBJS_32:.o=.d) $(OBJS_64) $(OBJS_64:.o=.d) $(TARGET_32) $(TARGET_64) 82 | -------------------------------------------------------------------------------- /src/Makefile.mac: -------------------------------------------------------------------------------- 1 | # -*-Makefile-*- 2 | 3 | include ../version.mak 4 | 5 | XPSDK=../../XPSDK213 6 | 7 | CC=gcc 8 | #BUILD=-g -DDEBUG 9 | #LDFLAGS= 10 | BUILD=-O3 -DNDEBUG 11 | LDFLAGS=-Wl,-x 12 | DEFINES=-DAPL=1 -DIBM=0 -DLIN=0 -DVERSION=$(VERSION) 13 | INC=-F$(XPSDK)/Libraries/Mac -I$(XPSDK)/CHeaders/XPLM -I$(XPSDK)/CHeaders/Widgets 14 | CFLAGS=-arch ppc -arch i586 -arch x86_64 -ffast-math -pipe -Wall -Winline -Wno-missing-braces -bundle -fvisibility=hidden -mmacosx-version-min=10.4 $(BUILD) $(DEFINES) $(INC) 15 | 16 | VPATH= 17 | SRC=models.c routes.c seatraffic.c 18 | LIBS=-framework XPLM -framework XPWidgets -framework OpenGL -framework CoreFoundation 19 | TARGETDIR=../$(PROJECT) 20 | 21 | ############################################################################ 22 | 23 | BUILDDIR=$(shell uname) 24 | OBJS=$(addprefix $(BUILDDIR)/, $(addsuffix .o, $(basename $(notdir $(SRC))))) 25 | TARGET=../$(PROJECT)/mac.xpl 26 | 27 | RM=rm -f 28 | CP=cp -p 29 | MD=mkdir -p 30 | 31 | .PHONY: all clean install 32 | 33 | all: $(TARGET) 34 | 35 | install: $(TARGET) 36 | $(MD) ~/Desktop/X-Plane\ 9/Resources/plugins/$(PROJECT) 37 | $(CP) $(TARGET) ~/Desktop/X-Plane\ 9/Resources/plugins/$(PROJECT)/ 38 | $(MD) ~/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT) 39 | $(CP) $(TARGET) ~/Desktop/X-Plane\ 10/Resources/plugins/$(PROJECT)/ 40 | 41 | $(TARGET): $(OBJS)| $(TARGETDIR) 42 | $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) 43 | 44 | $(OBJS): | $(BUILDDIR) 45 | 46 | $(BUILDDIR): 47 | $(MD) $(BUILDDIR) 48 | 49 | $(BUILDDIR)/%.o: %.c 50 | $(CC) $(CFLAGS) -c -o $@ $< 51 | @$(CC) $(BUILD) $(DEFINES) $(INC) -MM $< | sed -e 's|$*.o|$@|' > $(@:.o=.d) 52 | 53 | $(TARGETDIR): 54 | $(MD) $(TARGETDIR) 55 | 56 | clean: 57 | $(RM) *~ *.bak $(OBJS) $(OBJS:.o=.d) $(TARGET) 58 | 59 | # pull in dependency info 60 | -include $(OBJS:.o=.d) 61 | -------------------------------------------------------------------------------- /src/Makefile.win: -------------------------------------------------------------------------------- 1 | # -*-Makefile-*- in NMAKE format 2 | # Makes 32bit & 64bit version for X-Plane 10+, plus 32bit version without SSE2 for X-Plane 9 3 | 4 | !include ..\version.mak 5 | 6 | XPSDK=..\..\XPSDK213 7 | 8 | CC=cl 9 | #BUILD=-ZI -DDEBUG 10 | BUILD=-O2 -DNDEBUG 11 | DEFINES=-DIBM=1 -DAPL=0 -DLIN=0 -DVERSION=$(VERSION) 12 | INC=-I$(XPSDK)\CHeaders\XPLM -I$(XPSDK)/CHeaders/Widgets 13 | CFLAGS=-nologo -fp:fast -LD $(BUILD) $(DEFINES) $(INC) 14 | 15 | SRC=models.c routes.c seatraffic.c 16 | TARGETDIR=..\$(PROJECT) 17 | 18 | # Work out which target we're set up for by looking for a program (ml64.exe) that only exists in the path for one target 19 | !if [ml64 >nul 2>&1] == 0 20 | CPU=x64 21 | ARCHXP=_64 22 | TARGET=$(TARGETDIR)\64\win.xpl 23 | !else 24 | CPU=x86 25 | ARCHXP= 26 | TARGET=$(TARGETDIR)\32\win.xpl $(TARGETDIR)\win.xpl 27 | !endif 28 | 29 | LIBS=$(XPSDK)\Libraries\Win\XPLM$(ARCHXP).lib $(XPSDK)\Libraries\Win\XPWidgets$(ARCHXP).lib GlU32.Lib OpenGL32.Lib 30 | 31 | RM=del /q 32 | CP=copy /y 33 | MD=mkdir 34 | 35 | all: $(TARGET) 36 | 37 | install: $(TARGET) 38 | !if "$(CPU)" == "x86" 39 | -$(MD) "X:\Desktop\X-Plane 9\Resources\plugins\$(PROJECT)\" 40 | $(CP) $(TARGETDIR)\win.xpl "X:\Desktop\X-Plane 9\Resources\plugins\$(PROJECT)\" 41 | -$(MD) "X:\Desktop\X-Plane 10\Resources\plugins\$(PROJECT)\32" 42 | $(CP) $(TARGETDIR)\32\win.xpl "X:\Desktop\X-Plane 10\Resources\plugins\$(PROJECT)\32\" 43 | !else 44 | -$(MD) "X:\Desktop\X-Plane 10\Resources\plugins\$(PROJECT)\64\" 45 | $(CP) $(TARGETDIR)\64\win.xpl "X:\Desktop\X-Plane 10\Resources\plugins\$(PROJECT)\64\" 46 | !endif 47 | 48 | $(TARGETDIR)\win.xpl: $(SRC) 49 | -@if not exist "$(TARGETDIR)" $(MD) "$(TARGETDIR)" 50 | $(CC) $(CFLAGS) -Fe$@ -Fd$* $(SRC) $(LIBS) 51 | 52 | $(TARGETDIR)\32\win.xpl: $(SRC) 53 | -@if not exist "$(TARGETDIR)\32" $(MD) "$(TARGETDIR)\32" 54 | $(CC) -arch:SSE2 $(CFLAGS) -Fe$@ -Fd$* $(SRC) $(LIBS) 55 | 56 | $(TARGETDIR)\64\win.xpl: $(SRC) 57 | -@if not exist "$(TARGETDIR)\64" $(MD) "$(TARGETDIR)\64" 58 | $(CC) $(CFLAGS) -Fe$@ -Fd$* $(SRC) $(LIBS) 59 | 60 | clean: 61 | -$(RM) *~ *.bak *.obj 62 | -$(RM) $(TARGETDIR)\win.* 63 | -$(RM) $(TARGETDIR)\32\win.* 64 | -$(RM) $(TARGETDIR)\64\win.* 65 | 66 | seatraffic.c: seatraffic.h 67 | routes.c: seatraffic.h 68 | -------------------------------------------------------------------------------- /src/models.c: -------------------------------------------------------------------------------- 1 | /* 2 | * SeaTraffic 3 | * 4 | * (c) Jonathan Harris 2015 5 | * 6 | */ 7 | 8 | #include "seatraffic.h" 9 | 10 | /* Use asynchronous object loading if on v10 */ 11 | typedef void (* XPLMLoadObjectAsync_f) (const char *inPath, XPLMObjectLoaded_f inCallback, void *inRefcon); 12 | static XPLMLoadObjectAsync_f myXPLMLoadObjectAsync; 13 | 14 | static void libraryloadimmediate(const char *inFilePath, void *inRef); 15 | static void libraryloadasync(const char *inFilePath, void *inRef); 16 | 17 | 18 | /* Globals */ 19 | 20 | static ship_models_t default_models[ship_kind_count] = { 0 }; /* The default set of models */ 21 | static ship_models_t *model_cache[180][360] = { 0 }; /* Per-tile sets of models */ 22 | static XPLMLibraryEnumerator_f libraryloadfn; /* fn pointer for loading objects */ 23 | 24 | 25 | typedef struct 26 | { 27 | ship_kind_t kind; 28 | char *name; 29 | } ship_library_t; 30 | 31 | /* default objects */ 32 | static const ship_library_t default_library[] = 33 | { 34 | { leisure, "opensceneryx/objects/vehicles/boats_ships/power.obj" }, 35 | { tourist, "opensceneryx/objects/vehicles/boats_ships/tour.obj" }, 36 | { cruise, "opensceneryx/objects/vehicles/boats_ships/cruise.obj" }, 37 | { ped_sml, "Damen_2006_Green.obj" }, 38 | { ped_sml, "Damen_2006_Red.obj" }, 39 | { ped_sml, "Damen_2006_Sky.obj" }, 40 | { ped_sml, "Damen_2006_White.obj" }, 41 | { ped_med, "Damen_4212_Blue.obj" }, 42 | { ped_med, "Damen_4212_Green.obj" }, 43 | { ped_med, "Damen_4212_Orange.obj" }, 44 | { ped_med, "Damen_4212_Sky.obj" }, 45 | { veh_sml, "Damen_2010.obj" }, 46 | { veh_med, "River_crossing.obj" }, 47 | { veh_big, "opensceneryx/objects/vehicles/boats_ships/ferries.obj" }, 48 | { cargo, "opensceneryx/objects/vehicles/boats_ships/container.obj" }, 49 | { tanker, "Aframax_tanker_Black.obj" }, 50 | { tanker, "Aframax_tanker_Blue.obj" }, 51 | { tanker, "Aframax_tanker_Grey.obj" }, 52 | { tanker, "Aframax_tanker_Sky.obj" }, 53 | }; 54 | 55 | 56 | XPLMObjectRef loadobject(const char *path) 57 | { 58 | XPLMObjectRef ref = XPLMLoadObject(path); 59 | if (!ref) 60 | { 61 | XPLMDebugString("SeaTraffic: Can't load object \""); 62 | XPLMDebugString(path); 63 | XPLMDebugString("\"\n"); 64 | } 65 | return ref; 66 | } 67 | 68 | 69 | /* Callback from XPLMLookupObjects used to count objects */ 70 | static void libraryloaddummy(const char *inFilePath, void *inRef) 71 | {} 72 | 73 | /* Helper function for libraryloadimmediate and libraryloadasync */ 74 | static int libraryloadcommon(const char *inFilePath, ship_models_t *models) 75 | { 76 | if (!(strcmp(strrchr(inFilePath, '/'), "/placeholder.obj"))) 77 | { 78 | return 0; /* OpenSceneryX placeholder */ 79 | } 80 | else if (!(models->refs = realloc(models->refs, (models->obj_n + 1) * sizeof(XPLMObjectRef))) || 81 | !(models->names = realloc(models->names, (models->obj_n + 1) * sizeof(char*)))) 82 | { 83 | XPLMDebugString("SeaTraffic: Out of memory!"); 84 | return 0; 85 | } 86 | models->names[models->obj_n] = (char*) inFilePath; 87 | return -1; 88 | } 89 | 90 | 91 | /* Callback from XPLMLookupObjects to load ship objects */ 92 | static void libraryloadimmediate(const char *inFilePath, void *inRef) 93 | { 94 | ship_models_t *models = inRef; 95 | if (libraryloadcommon(inFilePath, models) && 96 | (models->refs[models->obj_n] = loadobject(inFilePath))) 97 | models->obj_n ++; 98 | } 99 | 100 | 101 | static void libraryloaded(XPLMObjectRef inObject, void *inRefcon) 102 | { 103 | /* Too late to give an error if it can't be loaded (inObject==NULL) but X-Plane's will put its own message in Log.txt */ 104 | XPLMObjectRef *ref = inRefcon; 105 | *ref = inObject; 106 | } 107 | 108 | /* Callback from XPLMLookupObjects to load ship objects */ 109 | static void libraryloadasync(const char *inFilePath, void *inRef) 110 | { 111 | ship_models_t *models = inRef; 112 | if (libraryloadcommon(inFilePath, models)) 113 | { 114 | models->refs[models->obj_n] = NULL; 115 | myXPLMLoadObjectAsync(inFilePath, libraryloaded, &(models->refs[models->obj_n])); 116 | models->obj_n ++; 117 | } 118 | } 119 | 120 | 121 | /* Are there custom models for this tile in the library? */ 122 | static int hascustommodels(int south, int west, int errorme) 123 | { 124 | int i, found = 0; 125 | char name[sizeof(LIBRARY_PREFIX) + LIBRARY_TOKEN_MAX + 4] = LIBRARY_PREFIX; 126 | 127 | for (i=0; irefs = realloc(models->refs, (models->obj_n + 1) * sizeof(XPLMObjectRef))) || 207 | !(models->names = realloc(models->names, (models->obj_n + 1) * sizeof(char*))) || 208 | !(models->names[models->obj_n] = malloc(strlen(respath) + strlen(name) + 1))) 209 | { 210 | XPLMDebugString("SeaTraffic: Out of memory!"); 211 | return 0; 212 | } 213 | 214 | strcpy(models->names[models->obj_n], respath); 215 | strcat(models->names[models->obj_n], name); 216 | if ((models->refs[models->obj_n] = loadobject(models->names[models->obj_n]))) 217 | models->obj_n ++; 218 | } 219 | else 220 | { 221 | /* Library resource */ 222 | XPLMLookupObjects(name, 0.0f, 0.0f, libraryloadimmediate, models); 223 | } 224 | if (models->obj_n <= 0) 225 | { 226 | XPLMDebugString("SeaTraffic: Can't find object \""); 227 | XPLMDebugString(name); 228 | XPLMDebugString("\"\n"); 229 | return 0; 230 | } 231 | } 232 | return -1; 233 | } 234 | -------------------------------------------------------------------------------- /src/routes.c: -------------------------------------------------------------------------------- 1 | /* 2 | * SeaTraffic 3 | * 4 | * (c) Jonathan Harris 2012 5 | * 6 | */ 7 | 8 | #include "seatraffic.h" 9 | 10 | /* Globals */ 11 | static route_list_t *routes[180][360]; /* array of link lists of routes by tile */ 12 | 13 | /* prototypes */ 14 | static int addroutetotile(route_t *route); 15 | 16 | 17 | int readroutes(char *mypath, char *err) 18 | { 19 | char buffer[PATH_MAX], *c; 20 | FILE *h; 21 | int lineno=0; 22 | route_t *currentroute=NULL; 23 | 24 | strcpy(buffer, mypath); 25 | strcat(buffer, "routes.txt"); 26 | if (!(h=fopen(buffer, "r"))) 27 | { 28 | strcpy(err, "Can't open routes.txt"); 29 | return 0; 30 | } 31 | if (!(c=fgets(buffer, PATH_MAX, h))) 32 | { 33 | fclose(h); 34 | strcpy(err, "Can't read routes.txt"); 35 | return 0; 36 | } 37 | if (!strncmp(c, "\xef\xbb\xbf", 3)) { c+=3; } /* skip Unicode BOM */ 38 | while (c) 39 | { 40 | lineno++; 41 | while (isspace(*c)) { c++; } /* ltrim */ 42 | if (*c == '#') /* Skip comment lines */ 43 | { 44 | } 45 | else if (!*c) /* Blank line = end of record */ 46 | { 47 | if (currentroute) 48 | { 49 | if (currentroute->pathlen) 50 | { 51 | if (!addroutetotile(currentroute)) 52 | { 53 | strcpy(err, "Out of memory"); 54 | return 0; 55 | } 56 | } 57 | else 58 | { 59 | sprintf(err, "Empty route at routes.txt line %d", lineno); 60 | return 0; 61 | } 62 | currentroute=NULL; 63 | } 64 | } 65 | else if (currentroute) /* New point on path of existing route */ 66 | { 67 | if (!(currentroute->path=realloc(currentroute->path, (currentroute->pathlen+1)*sizeof(loc_t)))) 68 | { 69 | strcpy(err, "Out of memory"); 70 | return 0; 71 | } 72 | if (sscanf(c, "%f %f", &(currentroute->path[currentroute->pathlen].lat), &(currentroute->path[currentroute->pathlen].lon)) != 2) 73 | { 74 | sprintf(err, "Invalid location at routes.txt line %d", lineno); 75 | return 0; 76 | } 77 | currentroute->pathlen++; 78 | } 79 | else /* New route */ 80 | { 81 | int i; 82 | char *name=c; 83 | while ((*name) && !isspace(*name)) { name++; } /* split line into shiptype and name */ 84 | while ((*name) && isspace(*name)) { *(name++)=0; } /* split line into shiptype and name */ 85 | if (!(currentroute=calloc(1, sizeof(route_t)))) 86 | { 87 | strcpy(err, "Out of memory"); 88 | return 0; 89 | } 90 | for (i=0; iship_kind=i; 95 | break; 96 | } 97 | } 98 | if (i==ship_kind_count) 99 | { 100 | sprintf(err, "Unrecognised ship type \"%s\" at routes.txt line %d", c, lineno); 101 | return 0; 102 | } 103 | #if defined(DO_LOCAL_MAP) || defined(DO_ACTIVE_LIST) 104 | c=name+strlen(name)-1; /* name is utf-8 encoded, which X-Plane can render */ 105 | while ((c>=name) && isspace(*c)) { *(c--)=0; }; /* rtrim */ 106 | currentroute->name=strdup(name); 107 | #endif 108 | } 109 | c=fgets(buffer, PATH_MAX, h); 110 | } 111 | 112 | if (currentroute) /* last one */ 113 | { 114 | if (currentroute->pathlen) 115 | { 116 | if (!addroutetotile(currentroute)) 117 | { 118 | strcpy(err, "Out of memory"); 119 | return 0; 120 | } 121 | } 122 | else 123 | { 124 | sprintf(err, "Empty route at routes.txt line %d", lineno); 125 | return 0; 126 | } 127 | } 128 | 129 | fclose(h); 130 | 131 | return 1; 132 | } 133 | 134 | 135 | /* Add a route to the tile list */ 136 | static int addroutetotile(route_t *route) 137 | { 138 | int i; 139 | for (i=0; ipathlen; i++) 140 | { 141 | route_list_t **route_list; 142 | int south, west; 143 | south=(int)floor(route->path[i].lat); 144 | west=(int)floor(route->path[i].lon); 145 | route_list=&routes[south+90][west+180]; 146 | 147 | if (!*route_list || (*route_list)->route!=route) /* We add from front so only need to check first route */ 148 | { 149 | if (!route_list_add(route_list, route)) { return 0; } 150 | } 151 | } 152 | return 1; 153 | } 154 | 155 | 156 | route_list_t *getroutesbytile(int south, int west) 157 | { 158 | return routes[south+90][west+180]; 159 | } 160 | 161 | 162 | /********************************************************************** 163 | Linked list manipulation 164 | **********************************************************************/ 165 | 166 | /* Allocates and adds to front of list */ 167 | route_list_t *route_list_add(route_list_t **route_list, route_t *route) 168 | { 169 | route_list_t *newroute; 170 | if (!(newroute=malloc(sizeof(route_list_t)))) { return 0; } 171 | newroute->route=route; 172 | newroute->next=*route_list; 173 | *route_list=newroute; 174 | return *route_list; 175 | } 176 | 177 | 178 | route_list_t *route_list_get_byroute(route_list_t *route_list, route_t *route) 179 | { 180 | while (route_list!=NULL) 181 | { 182 | if (route_list->route==route) { return route_list; } 183 | route_list=route_list->next; 184 | } 185 | return NULL; 186 | } 187 | 188 | 189 | /* Return nth item in list. Assumes that there are n items in list */ 190 | route_t *route_list_pop(route_list_t **route_list, int n) 191 | { 192 | route_t *route; 193 | route_list_t *this, **lastptr=route_list; 194 | while (n--) 195 | { 196 | lastptr=&((*lastptr)->next); 197 | assert(*lastptr!=NULL); 198 | } 199 | this=*lastptr; 200 | route=this->route; 201 | *lastptr=this->next; 202 | free(this); 203 | return route; 204 | } 205 | 206 | 207 | int route_list_length(route_list_t *route_list) 208 | { 209 | int i=0; 210 | while (route_list!=NULL) 211 | { 212 | i++; 213 | route_list=route_list->next; 214 | } 215 | return i; 216 | } 217 | 218 | 219 | /* Free entire list */ 220 | void route_list_free(route_list_t **route_list) 221 | { 222 | route_list_t *next; 223 | while (*route_list) 224 | { 225 | next=(*route_list)->next; 226 | free(*route_list); 227 | *route_list=next; 228 | } 229 | } 230 | 231 | 232 | /* Allocates and adds to front of list */ 233 | active_route_t *active_route_add(active_route_t **active_routes) 234 | { 235 | active_route_t *newroute; 236 | if (!(newroute=malloc(sizeof(active_route_t)))) { return NULL; } 237 | newroute->next=*active_routes; 238 | *active_routes=newroute; 239 | return *active_routes; 240 | } 241 | 242 | 243 | active_route_t *active_route_get(active_route_t *active_routes, int n) 244 | { 245 | while (n--) 246 | { 247 | active_routes=active_routes->next; 248 | // assert(active_routes!=NULL); /* Allow function to return NULL for item just past length */ 249 | } 250 | return active_routes; 251 | } 252 | 253 | 254 | active_route_t *active_route_get_byroute(active_route_t *active_routes, route_t *route) 255 | { 256 | while (active_routes!=NULL) 257 | { 258 | if (active_routes->route==route) { return active_routes; } 259 | active_routes=active_routes->next; 260 | } 261 | return NULL; 262 | } 263 | 264 | 265 | void active_route_pop(active_route_t **active_routes, int n) 266 | { 267 | active_route_t *this, **lastptr=active_routes; 268 | while (n--) 269 | { 270 | lastptr=&((*lastptr)->next); 271 | assert(*lastptr!=NULL); 272 | } 273 | this=*lastptr; 274 | *lastptr=this->next; 275 | free(this); 276 | } 277 | 278 | 279 | int active_route_length(active_route_t *active_routes) 280 | { 281 | int i=0; 282 | while (active_routes!=NULL) 283 | { 284 | i++; 285 | active_routes=active_routes->next; 286 | } 287 | return i; 288 | } 289 | 290 | 291 | /* Callback for active_route_sort */ 292 | static int sortactive(const void *a, const void *b) 293 | { 294 | const active_route_t *const *ra = a, *const *rb = b; 295 | return strcmp((*ra)->object_name, (*rb)->object_name); 296 | } 297 | 298 | 299 | /* Sort active routes by object name to minimise texture swaps when drawing. 300 | * Rather than actually shuffling the routes around in memory we just sort an array of pointers and then go back 301 | * and fix up the linked list. */ 302 | void active_route_sort(active_route_t **active_routes, int active_n) 303 | { 304 | int i; 305 | active_route_t *table[ACTIVE_MAX], *active_route; 306 | 307 | if (active_n <= 2) return; /* Nothing useful to do */ 308 | 309 | for (i = 0, active_route = *active_routes; active_route; active_route = active_route->next) 310 | table[i++] = active_route; 311 | qsort(table, active_n, sizeof(active_route), sortactive); 312 | *active_routes = table[0]; 313 | for (i = 0; i < active_n; i++) 314 | table[i]->next = i < active_n-1 ? table[i+1] : NULL; 315 | } 316 | -------------------------------------------------------------------------------- /src/seatraffic.c: -------------------------------------------------------------------------------- 1 | /* 2 | * SeaTraffic 3 | * 4 | * (c) Jonathan Harris 2012 5 | * 6 | */ 7 | 8 | #include "seatraffic.h" 9 | 10 | #if IBM 11 | # include 12 | BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason, LPVOID lpReserved) 13 | { return TRUE; } 14 | #elif APL 15 | # include 16 | # include 17 | #endif 18 | 19 | 20 | /* Globals */ 21 | static char mypath[PATH_MAX], *relpath; 22 | 23 | /* Ship types. Order must match ship_kind_t enum */ 24 | const ship_t ships[ship_kind_count] = 25 | { 26 | /* speed [m/s], semilen [m], token */ 27 | { 2, 8, "leisure" }, /* ~4 knots */ 28 | { 3, 15, "tourist" }, /* ~6 knots */ 29 | { 12, 80, "cruise" }, /* ~23.5 knots */ 30 | { 11, 11, "ped/sml" }, /* ~21.5 knots */ 31 | { 16, 21, "ped/med" }, /* ~31 knots */ 32 | { 5, 11, "veh/sml" }, /* ~9.5 knots */ 33 | { 6, 30, "veh/med" }, /* ~11.5 knots */ 34 | { 10, 76, "veh/big" }, /* ~19.5 knots */ 35 | { 8, 95, "cargo" }, /* ~15.5 knots */ 36 | { 8,125, "tanker" }, /* ~15.5 knots */ 37 | }; 38 | 39 | 40 | static XPLMDataRef ref_view_x, ref_view_y, ref_view_z, ref_view_h; 41 | static XPLMDataRef ref_plane_lat, ref_plane_lon, ref_night, ref_monotonic, ref_renopt=0, ref_rentype; 42 | static XPLMObjectRef wake_big_ref, wake_med_ref, wake_sml_ref; 43 | static float last_frame=0; /* last time we recalculated */ 44 | static int done_init=0, need_recalc=1; 45 | static tile_t current_tile={0,0}; 46 | static int active_n=0; 47 | static int active_max = ACTIVE_DEFAULT; 48 | static active_route_t *active_routes = NULL; 49 | static XPLMMenuID my_menu_id; 50 | static int do_wakes=0; 51 | #ifdef DO_LOCAL_MAP 52 | static int do_local_map=0; 53 | #endif 54 | #ifdef DO_ACTIVE_LIST 55 | static XPLMWindowID windowId = NULL; 56 | static int drawtime, drawmax; /* clock time taken in last main loop [us] */ 57 | # if IBM 58 | static __int64 ticks_per_sec; 59 | # endif 60 | #endif 61 | 62 | 63 | static inline int inrange(tile_t tile, loc_t loc) 64 | { 65 | return ((abs(tile.south - (int) floorf(loc.lat)) <= TILE_RANGE) && 66 | (abs(tile.west - (int) floorf(loc.lon)) <= TILE_RANGE)); 67 | } 68 | 69 | static inline int indrawrange(float xdist, float ydist) 70 | { 71 | return (xdist*xdist + ydist*ydist <= DRAW_DISTANCE*DRAW_DISTANCE); 72 | } 73 | 74 | static inline int inreflectrange(float xdist, float ydist) 75 | { 76 | return (xdist*xdist + ydist*ydist <= DRAW_REFLECT*DRAW_REFLECT); 77 | } 78 | 79 | static inline int inwakerange(float xdist, float ydist) 80 | { 81 | return (xdist*xdist + ydist*ydist <= DRAW_WAKE*DRAW_WAKE); 82 | } 83 | 84 | 85 | /* Great circle distance, using Haversine formula. http://mathforum.org/library/drmath/view/51879.html */ 86 | static float distanceto(loc_t a, loc_t b) 87 | { 88 | float slat=sinf((b.lat-a.lat) * (float) (M_PI/360)); 89 | float slon=sinf((b.lon-a.lon) * (float) (M_PI/360)); 90 | float aa=slat*slat + cosf(a.lat * (float) (M_PI/180)) * cosf(b.lat * (float) (M_PI/180)) * slon*slon; 91 | return RADIUS*2 * atan2f(sqrtf(aa), sqrtf(1-aa)); 92 | } 93 | 94 | 95 | /* Bearing of b from a [radians] http://mathforum.org/library/drmath/view/55417.html */ 96 | static float headingto(loc_t a, loc_t b) 97 | { 98 | float lat1=(a.lat * (float) (M_PI/180)); 99 | float lon1=(a.lon * (float) (M_PI/180)); 100 | float lat2=(b.lat * (float) (M_PI/180)); 101 | float lon2=(b.lon * (float) (M_PI/180)); 102 | float clat2=cosf(lat2); 103 | return fmodf(atan2f(sinf(lon2-lon1)*clat2, cosf(lat1)*sinf(lat2)-sinf(lat1)*clat2*cosf(lon2-lon1)), (float) (M_PI*2)); 104 | } 105 | 106 | 107 | /* Location distance d along heading h from a [degrees]. Assumes d < circumference/4. http://williams.best.vwh.net/avform.htm#LL */ 108 | static void displaced(loc_t a, double h, double d, dloc_t *b) 109 | { 110 | double lat1=((double) a.lat * M_PI/180); 111 | double lon1=((double) a.lon * M_PI/180); 112 | double clat1=cos(lat1); 113 | double dang=(d/(double)RADIUS); 114 | double sang=sin(dang); 115 | b->lat=asin(sin(lat1)*cos(dang)+clat1*sang*cos(h)) * (180*M_1_PI); 116 | b->lon=(fmod(lon1+asin(sin(h)*sang/clat1)+M_PI, M_PI*2.0) - M_PI) * (180*M_1_PI); 117 | } 118 | 119 | 120 | /* is this location within distance of the active routes */ 121 | static int tooclose(active_route_t *active_routes, loc_t loc, int distance) 122 | { 123 | active_route_t *active_route = active_routes; 124 | while (active_route) 125 | { 126 | loc_t other; 127 | if (active_route->new_node) 128 | { 129 | /* location hasn't been calculated yet, just use its current node's location */ 130 | other.lat = active_route->route->path[active_route->last_node].lat; 131 | other.lon = active_route->route->path[active_route->last_node].lon; 132 | } 133 | else 134 | { 135 | other.lat = active_route->loc.lat; 136 | other.lon = active_route->loc.lon; 137 | } 138 | if (distanceto(loc, other) <= distance) { return 1; } 139 | active_route = active_route -> next; 140 | } 141 | return 0; 142 | } 143 | 144 | 145 | /* Adjust active routes */ 146 | static void recalc(void) 147 | { 148 | int active_i, i, j; 149 | int candidate_n=0; 150 | route_list_t *candidates=NULL; 151 | active_route_t *a; 152 | 153 | need_recalc=0; 154 | 155 | /* Retire routes that have gone out of range */ 156 | active_i=0; 157 | a=active_routes; 158 | while (active_iroute->path[a->last_node])) /* FIXME: Should check on current position, not last_node */ 161 | { 162 | XPLMDestroyProbe(a->ref_probe); /* Deallocate resources */ 163 | active_route_pop(&active_routes, active_i); /* retire out-of-range route */ 164 | a=active_route_get(active_routes, active_i); /* get pointer to next item */ 165 | active_n--; 166 | } 167 | else 168 | { 169 | a=a->next; 170 | active_i++; 171 | } 172 | } 173 | 174 | /* Or if rendering options have changed */ 175 | while (active_n > active_max) 176 | { 177 | active_route_pop(&active_routes, rand() % (active_max-active_n)); /* retire a random route */ 178 | active_n--; 179 | } 180 | 181 | if (active_n >= active_max) { return; } /* We have enough routes */ 182 | 183 | /* Locate candidate routes */ 184 | for (i=current_tile.south-TILE_RANGE; i<=current_tile.south+TILE_RANGE; i++) 185 | for (j=current_tile.west-TILE_RANGE; j<=current_tile.west+TILE_RANGE; j++) 186 | { 187 | route_list_t *route_list=getroutesbytile(i,j); 188 | while (route_list) 189 | { 190 | /* Check it's neither already active nor already a candidate from an adjacent tile */ 191 | if (!active_route_get_byroute(active_routes, route_list->route) && 192 | !route_list_get_byroute(candidates, route_list->route) && 193 | route_list_add(&candidates, route_list->route)) 194 | { 195 | candidate_n++; 196 | } 197 | route_list=route_list->next; 198 | } 199 | } 200 | 201 | /* Pick new active routes from candidates */ 202 | if (candidate_n) 203 | { 204 | float now=XPLMGetDataf(ref_monotonic); 205 | 206 | while ((active_n < active_max) && candidate_n) 207 | { 208 | int obj_n; 209 | ship_models_t *models; 210 | route_t *newroute = route_list_pop(&candidates, rand() % candidate_n--); 211 | active_n++; 212 | if (!(a = active_route_add(&active_routes))) { break; } /* Alloc failure! */ 213 | a->ship=&ships[newroute->ship_kind]; 214 | a->route=newroute; 215 | a->altmsl=0; 216 | a->ref_probe=XPLMCreateProbe(xplm_ProbeY); 217 | a->drawinfo.structSize=sizeof(XPLMDrawInfo_t); 218 | a->drawinfo.pitch=a->drawinfo.roll=0; 219 | 220 | /* Find a starting node */ 221 | if (inrange(current_tile, newroute->path[0]) && !tooclose(active_routes->next, newroute->path[0], SHIP_SPACING * a->ship->semilen)) 222 | { 223 | /* Start of path */ 224 | a->direction=1; 225 | a->last_node=0; 226 | a->last_time=now-(a->ship->semilen/a->ship->speed); /* Move ship away from the dock */ 227 | } 228 | else if (inrange(current_tile, newroute->path[newroute->pathlen-1]) && !tooclose(active_routes->next, newroute->path[newroute->pathlen-1], SHIP_SPACING * a->ship->semilen)) 229 | { 230 | /* End of path */ 231 | a->direction=-1; 232 | a->last_node=newroute->pathlen-1; 233 | a->last_time=now-(a->ship->semilen/a->ship->speed); /* Move ship away from the dock */ 234 | } 235 | else 236 | { 237 | a->direction=0; 238 | for (i=1; ipathlen-1; i++) 239 | if (inrange(current_tile, newroute->path[i]) && !tooclose(active_routes->next, newroute->path[i], SHIP_SPACING * a->ship->semilen)) 240 | { 241 | /* First node in range */ 242 | a->direction=1; 243 | a->last_node=i; 244 | a->last_time=now; 245 | break; 246 | } 247 | if (!a->direction) 248 | { 249 | /* Found nothing suitable! Look again, and just shove the ship along its path */ 250 | a->last_time = now - (SHIP_SPACING * a->ship->semilen / a->ship->speed); 251 | if (inrange(current_tile, newroute->path[0])) 252 | { 253 | /* Start of path */ 254 | a->direction=1; 255 | a->last_node=0; 256 | } 257 | else if (inrange(current_tile, newroute->path[newroute->pathlen-1])) 258 | { 259 | /* End of path */ 260 | a->direction=-1; 261 | a->last_node=newroute->pathlen-1; 262 | } 263 | else 264 | { 265 | for (i=1; ipathlen-1; i++) 266 | if (inrange(current_tile, newroute->path[i])) 267 | { 268 | /* First node in range */ 269 | a->direction=1; 270 | a->last_node=i; 271 | break; 272 | } 273 | } 274 | } 275 | } 276 | 277 | /* Choose ship model based on starting node's tile */ 278 | models = models_for_tile((int) floorf(newroute->path[a->last_node].lat), (int) floorf(newroute->path[a->last_node].lon)) + a->route->ship_kind; 279 | obj_n = rand() % models->obj_n; 280 | a->object_ref = &models->refs[obj_n]; /* May be NULL until async load completes */ 281 | a->object_name = models->names[obj_n]; 282 | 283 | a->new_node=1; /* Tell drawships() to calculate state */ 284 | a->next_time = a->last_time + distanceto(newroute->path[a->last_node], newroute->path[a->last_node+a->direction]) / a->ship->speed; 285 | } 286 | active_route_sort(&active_routes, active_n); /* Sort active routes by object name for more efficient drawing */ 287 | } 288 | route_list_free(&candidates); 289 | } 290 | 291 | 292 | static int drawupdate(void) 293 | { 294 | static float next_hdg_update=0.0f; 295 | 296 | tile_t new_tile; 297 | float now; 298 | int do_hdg_update, active_i; 299 | XPLMProbeInfo_t probeinfo; 300 | active_route_t *a; 301 | 302 | /* If we've shifted tile (which can happen without an airport or scenery re-load) then recalculate active routes */ 303 | new_tile.south=(int) floor(XPLMGetDatad(ref_plane_lat)); 304 | new_tile.west=(int) floor(XPLMGetDatad(ref_plane_lon)); 305 | if (need_recalc || (new_tile.south!=current_tile.south) || (new_tile.west!=current_tile.west)) 306 | { 307 | current_tile.south=new_tile.south; 308 | current_tile.west=new_tile.west; 309 | recalc(); 310 | } 311 | 312 | if (active_n==0) { return 1; } /* Nothing to do */ 313 | 314 | probeinfo.structSize = sizeof(XPLMProbeInfo_t); 315 | 316 | /* Headings change slowly. Reduce time in this function by updating them only periodically */ 317 | now = XPLMGetDataf(ref_monotonic); 318 | do_hdg_update = (now>=next_hdg_update); 319 | if (do_hdg_update) 320 | { 321 | next_hdg_update=now+HDG_HOLD_TIME; 322 | #ifdef DO_ACTIVE_LIST 323 | drawmax=0; /* This iteration is a good time to reset max draw timer */ 324 | #endif 325 | } 326 | 327 | /* Draw ships */ 328 | active_i=0; 329 | a=active_routes; 330 | while (active_iroute; 334 | 335 | if (now >= a->next_time) 336 | { 337 | /* Time for next node */ 338 | a->last_node+=a->direction; 339 | if ((a->last_node < 0) || (a->last_node >= route->pathlen)) 340 | { 341 | /* Already was at end of route - turn it round */ 342 | a->new_node=1; 343 | a->direction*=-1; /* reverse */ 344 | a->last_node+=a->direction; 345 | a->last_time=now-(a->ship->semilen/a->ship->speed); /* Move ship away from the dock */ 346 | } 347 | else if (!inrange(current_tile, a->route->path[a->last_node])) 348 | { 349 | /* No longer in range - kill it off on next callback */ 350 | need_recalc=1; 351 | a=a->next; 352 | active_i++; 353 | continue; 354 | } 355 | else 356 | { 357 | /* Next node */ 358 | if ((a->last_node == 0) || (a->last_node == route->pathlen-1)) 359 | { 360 | /* Just hit end of route */ 361 | XPLMProbeResult result; 362 | a->last_time=now; 363 | a->next_time=now+LINGER_TIME; 364 | /* Keep previous location and heading - don't set new_node flag. But since we'll be here a while do update alt. */ 365 | XPLMWorldToLocal(a->loc.lat, a->loc.lon, 0.0, &x, &y, &z); 366 | probeinfo.locationY=y; /* If probe fails set altmsl=0 */ 367 | result=XPLMProbeTerrainXYZ(a->ref_probe, x, y, z, &probeinfo); 368 | assert (result==xplm_ProbeHitTerrain); 369 | a->altmsl=(double) probeinfo.locationY - y; 370 | } 371 | else 372 | { 373 | /* Progress to next node on route */ 374 | a->new_node=1; 375 | a->last_time=now; 376 | } 377 | } 378 | } 379 | else if ((a->last_node+a->direction < 0) || (a->last_node+a->direction >= route->pathlen)) 380 | { 381 | /* Ship is lingering at end of route - re-use location and drawinfo heading from last drawships() callback */ 382 | } 383 | else 384 | { 385 | /* Common case: Not time for a new node so so update ship position along path */ 386 | displaced(route->path[a->last_node], a->last_hdg, a->ship->semilen + (now-a->last_time)*a->ship->speed, &(a->loc)); 387 | if (do_hdg_update && (a->next_time-now > HDG_HOLD_TIME)) /* Don't update heading when approaching next node to prevent squirreliness */ 388 | { 389 | loc_t loc={a->loc.lat, a->loc.lon}; /* Down to float */ 390 | a->drawinfo.heading=headingto(loc, route->path[a->last_node+a->direction]) * (float) (180*M_1_PI); 391 | } 392 | } 393 | 394 | if (a->new_node) /* May be set above or, for new routes, in recalc() */ 395 | { 396 | /* Update state after ship visits new node. Assumes last_node and last_time already updated. */ 397 | a->last_hdg = headingto(a->route->path[a->last_node], a->route->path[a->last_node+a->direction]); 398 | a->drawinfo.heading=a->last_hdg * (float) (180*M_1_PI); 399 | displaced(route->path[a->last_node], a->last_hdg, a->ship->semilen + (now-a->last_time)*a->ship->speed, &(a->loc)); 400 | a->next_time = a->last_time + distanceto(route->path[a->last_node], route->path[a->last_node+a->direction]) / a->ship->speed; 401 | if ((a->last_node+a->direction == 0) || (a->last_node+a->direction == route->pathlen-1)) 402 | { 403 | /* Next node is last node */ 404 | a->next_time-=(a->ship->semilen/a->ship->speed); /* Stop ship before it crashes into dock */ 405 | } 406 | } 407 | 408 | /* Update altitiude at same time as heading */ 409 | if (do_hdg_update || a->new_node) /* New node implies altitude update needed */ 410 | { 411 | /* Not all routes are at sea level, so need a way of determining altitude but without probing every cycle. 412 | * Should probably probe twice - http://forums.x-plane.org/index.php?showtopic=38688&st=20#entry566469 */ 413 | XPLMProbeResult result; 414 | XPLMWorldToLocal(a->loc.lat, a->loc.lon, 0.0, &x, &y, &z); 415 | probeinfo.locationY=y; /* If probe fails set altmsl=0 */ 416 | result=XPLMProbeTerrainXYZ(a->ref_probe, x, y, z, &probeinfo); 417 | assert (result==xplm_ProbeHitTerrain); 418 | a->altmsl=(double) probeinfo.locationY - y; 419 | } 420 | 421 | /* In local co-ordinates for drawing */ 422 | XPLMWorldToLocal(a->loc.lat, a->loc.lon, a->altmsl, &x, &y, &z); 423 | a->drawinfo.x=x; a->drawinfo.y=y; a->drawinfo.z=z; /* double -> float */ 424 | 425 | a->new_node=0; 426 | a=a->next; 427 | active_i++; 428 | } 429 | 430 | return 1; 431 | } 432 | 433 | 434 | /* XPLMRegisterDrawCallback callback */ 435 | static int drawships(XPLMDrawingPhase inPhase, int inIsBefore, void *inRefcon) 436 | { 437 | active_route_t *a; 438 | int is_night; 439 | float now; 440 | float view_x, view_z; 441 | int render_pass; 442 | #ifdef DO_ACTIVE_LIST 443 | # if IBM 444 | __int64 t1, t2; 445 | QueryPerformanceCounter((LARGE_INTEGER *) &t1); /* start */ 446 | # else 447 | struct timeval t1, t2; 448 | gettimeofday(&t1, NULL); /* start */ 449 | # endif 450 | #endif 451 | 452 | assert((inPhase==xplm_Phase_Objects) && inIsBefore); 453 | 454 | /* We're potentially called multiple times per frame: 455 | * reflections ("sim/graphics/view/world_render_type" == 1), multiple shadows (== 3) and finally normal (== 0). 456 | * So skip calculations if we've already run the calculations for this frame. */ 457 | if ((now = XPLMGetDataf(ref_monotonic)) != last_frame) 458 | { 459 | drawupdate(); 460 | last_frame = now; 461 | #ifdef DO_ACTIVE_LIST 462 | drawtime = 0; 463 | #endif 464 | } 465 | 466 | render_pass = XPLMGetDatai(ref_rentype); 467 | is_night = (int) (XPLMGetDataf(ref_night) + 0.67f); 468 | view_x=XPLMGetDataf(ref_view_x); 469 | view_z=XPLMGetDataf(ref_view_z); 470 | 471 | if (render_pass == 1) /* reflections */ 472 | { 473 | for (a=active_routes; a; a=a->next) 474 | if (*a->object_ref && inreflectrange(a->drawinfo.x - view_x, a->drawinfo.z - view_z)) 475 | XPLMDrawObjects(*a->object_ref, 1, &(a->drawinfo), is_night, 1); 476 | do_wakes = 1; /* Do wakes on base pass if reflections enabled */ 477 | } 478 | else /* shadows or base */ 479 | { 480 | for (a=active_routes; a; a=a->next) 481 | if (*a->object_ref && indrawrange(a->drawinfo.x - view_x, a->drawinfo.z - view_z)) 482 | XPLMDrawObjects(*a->object_ref, 1, &(a->drawinfo), is_night, 1); 483 | 484 | /* Wakes. Drawn after drawing the ships, so that the ships' hulls are visible through alpha. 485 | * Batched together to reduce texture swaps. */ 486 | if (render_pass == 0 && do_wakes) /* Only draw wakes in base pass */ 487 | { 488 | do_wakes = 0; 489 | // XPLMSetGraphicsState(1, 1, 1, 1, 1, 0, 0); /* No depth test/write - doesn't work with XPLMDrawObjects */ 490 | glEnable(GL_POLYGON_OFFSET_FILL); /* Do this instead - Yuk! */ 491 | glPolygonOffset(-2,-2); 492 | 493 | for (a=active_routes; a; a=a->next) 494 | if ((a->ship->speed >= WAKE_MINSPEED) && /* Only draw wakes for ships going at speed */ 495 | (a->last_node+a->direction >= 0) && (a->last_node+a->direction < a->route->pathlen) && /* and not lingering */ 496 | inwakerange(a->drawinfo.x - view_x, a->drawinfo.z - view_z)) /* and closeish */ 497 | { 498 | XPLMDrawObjects(a->ship->semilen >= WAKE_BIG ? wake_big_ref : (a->ship->semilen >= WAKE_MED ? wake_med_ref : wake_sml_ref), 1, &(a->drawinfo), 0, 1); 499 | } 500 | glDisable(GL_POLYGON_OFFSET_FILL); 501 | } 502 | } 503 | 504 | #ifdef DO_ACTIVE_LIST 505 | # if IBM 506 | QueryPerformanceCounter((LARGE_INTEGER *) &t2); /* stop */ 507 | drawtime += ((t2 - t1) * 1000000) / ticks_per_sec; 508 | # else 509 | gettimeofday(&t2, NULL); /* stop */ 510 | drawtime += (t2.tv_sec-t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; 511 | # endif 512 | if (drawtime>drawmax) { drawmax=drawtime; } 513 | if (!render_pass) { last_frame = 0; } /* In DEBUG recalculate while paused for easier debugging / profiling */ 514 | #endif 515 | return 1; 516 | } 517 | 518 | 519 | #ifdef DO_LOCAL_MAP 520 | /* Work out screen locations in local map */ 521 | static int drawmap3d(XPLMDrawingPhase inPhase, int inIsBefore, void *inRefcon) 522 | { 523 | route_list_t *route_list; 524 | int i, j; 525 | 526 | if (!do_local_map) { return 1; } 527 | 528 | if (active_n) 529 | { 530 | GLdouble model[16], proj[16], winX, winY, winZ; 531 | GLint view[4]; 532 | active_route_t *a; 533 | 534 | /* This is slow, but it's only the local map */ 535 | glGetDoublev(GL_MODELVIEW_MATRIX, model); 536 | glGetDoublev(GL_PROJECTION_MATRIX, proj); 537 | glGetIntegerv(GL_VIEWPORT, view); 538 | 539 | a=active_routes; 540 | while (a!=NULL) 541 | { 542 | gluProject(a->drawinfo.x, a->drawinfo.y, a->drawinfo.z, model, proj, view, &winX, &winY, &winZ); 543 | a->mapx=winX; 544 | a->mapy=winY; 545 | a=a->next; 546 | } 547 | } 548 | 549 | XPLMSetGraphicsState(0, 0, 0, 0, 0, 0, 0); 550 | glColor3f(0,0,0.25); 551 | for (i=current_tile.south-TILE_RANGE; i<=current_tile.south+TILE_RANGE; i++) 552 | for (j=current_tile.west-TILE_RANGE; j<=current_tile.west+TILE_RANGE; j++) 553 | { 554 | route_list=getroutesbytile(i,j); 555 | while (route_list) 556 | { 557 | route_t *route=route_list->route; 558 | int k; 559 | 560 | glBegin(GL_LINE_STRIP); 561 | for (k=0; kpathlen; k++) 562 | { 563 | double x, y, z; 564 | XPLMWorldToLocal(route->path[k].lat, route->path[k].lon, 0.0, &x, &y, &z); 565 | glVertex3f(x,y,z); 566 | } 567 | glEnd(); 568 | route_list=route_list->next; 569 | } 570 | } 571 | 572 | return 1; 573 | } 574 | 575 | 576 | /* Draw ship icons in local map */ 577 | static int drawmap2d(XPLMDrawingPhase inPhase, int inIsBefore, void *inRefcon) 578 | { 579 | int width, height; 580 | active_route_t *a; 581 | float color[] = { 0, 0, 0.25 }; 582 | 583 | if (!do_local_map) { return 1; } 584 | 585 | XPGetElementDefaultDimensions(xpElement_CustomObject, &width, &height, NULL); 586 | 587 | a=active_routes; 588 | while (a!=NULL) 589 | { 590 | XPLMDrawString(color, a->mapx+6, a->mapy-3, a->route->name, NULL, xplmFont_Proportional); 591 | XPDrawElement(a->mapx-width/2, a->mapy-height+height/2, a->mapx+width-width/2, a->mapy+height/2, xpElement_CustomObject, 0); 592 | a=a->next; 593 | } 594 | 595 | return 1; 596 | } 597 | #endif /* DO_LOCAL_MAP */ 598 | 599 | 600 | #ifdef DO_ACTIVE_LIST 601 | static void drawdebug(XPLMWindowID inWindowID, void *inRefcon) 602 | { 603 | char buf[256]; 604 | int top, bottom; 605 | static int left=10, right=310; 606 | float width, width1; 607 | float color[] = { 1.0, 1.0, 1.0 }; /* RGB White */ 608 | float now=XPLMGetDataf(ref_monotonic); 609 | float view_x=XPLMGetDataf(ref_view_x); 610 | float view_z=XPLMGetDataf(ref_view_z); 611 | 612 | active_route_t *a=active_routes; 613 | 614 | XPLMGetScreenSize(NULL, &top); 615 | top-=20; /* leave room for X-Plane's menubar */ 616 | bottom=top-40-60*active_route_length(active_routes); 617 | XPLMSetWindowGeometry(inWindowID, left, top, right, bottom); 618 | XPLMDrawTranslucentDarkBox(left, top, right, bottom); 619 | 620 | sprintf(buf, "Tile: %+3d,%+4d Active: %2d Now: %7.1f", current_tile.south, current_tile.west, active_n, now); 621 | XPLMDrawString(color, left + 5, top - 10, buf, 0, xplmFont_Basic); 622 | sprintf(buf, "View: %10.3f,%10.3f,%10.3f %6.1f\xC2\xB0", XPLMGetDataf(ref_view_x), XPLMGetDataf(ref_view_y), XPLMGetDataf(ref_view_z), XPLMGetDataf(ref_view_h)); 623 | XPLMDrawString(color, left + 5, top - 20, buf, 0, xplmFont_Basic); 624 | width=XPLMMeasureString(xplmFont_Basic, buf, strlen(buf)); 625 | sprintf(buf, "Draw: %4d Max: %4d", drawtime, drawmax); 626 | XPLMDrawString(color, left + 5, top - 30, buf, 0, xplmFont_Basic); 627 | top-=40; 628 | 629 | while (a!=NULL) 630 | { 631 | sprintf(buf, "%s: %s", ships[a->route->ship_kind].token, a->route->name); 632 | XPLMDrawString(color, left + 5, top - 10, buf, 0, xplmFont_Basic); 633 | width1=XPLMMeasureString(xplmFont_Basic, buf, strlen(buf)); 634 | if (width1>width) { width=width1; } 635 | sprintf(buf, "Path: %3d/%3d %+d Last: %7.1f Next: %7.1f", a->last_node, a->route->pathlen, a->direction, a->last_time, a->next_time); 636 | XPLMDrawString(color, left + 5, top - 20, buf, 0, xplmFont_Basic); 637 | width1=XPLMMeasureString(xplmFont_Basic, buf, strlen(buf)); 638 | if (width1>width) { width=width1; } 639 | sprintf(buf, "Last: %11.7f,%12.7f %6.1f\xC2\xB0", a->route->path[a->last_node].lat, a->route->path[a->last_node].lon, a->last_hdg * 180.0*M_1_PI); 640 | XPLMDrawString(color, left + 5, top - 30, buf, 0, xplmFont_Basic); 641 | sprintf(buf, "Now: %11.7f,%12.7f %7.1f", a->loc.lat, a->loc.lon, a->altmsl); 642 | XPLMDrawString(color, left + 5, top - 40, buf, 0, xplmFont_Basic); 643 | sprintf(buf, "Draw: %10.3f,%10.3f,%10.3f %6.1f\xC2\xB0 %s", a->drawinfo.x, a->drawinfo.y, a->drawinfo.z, a->drawinfo.heading, indrawrange(a->drawinfo.x - view_x, a->drawinfo.z - view_z) ? "" : "*"); 644 | XPLMDrawString(color, left + 5, top - 50, buf, 0, xplmFont_Basic); 645 | top-=60; 646 | a=a->next; 647 | } 648 | right=20+(int)width; /* For next time */ 649 | } 650 | #endif /* DO_ACTIVE_LIST */ 651 | 652 | 653 | static void menuhandler(void *inMenuRef, void *inItemRef) 654 | { 655 | switch ((intptr_t) inItemRef) 656 | { 657 | #ifdef DO_LOCAL_MAP 658 | case menu_idx_local_map: 659 | do_local_map=!do_local_map; 660 | XPLMCheckMenuItem(my_menu_id, menu_idx_local_map, do_local_map ? xplm_Menu_Checked : xplm_Menu_Unchecked); 661 | if (do_local_map) 662 | { 663 | XPLMRegisterDrawCallback(drawmap3d, xplm_Phase_LocalMap3D, 0, NULL); 664 | XPLMRegisterDrawCallback(drawmap2d, xplm_Phase_LocalMap2D, 0, NULL); 665 | } 666 | else 667 | { 668 | XPLMUnregisterDrawCallback(drawmap3d, xplm_Phase_LocalMap3D, 0, NULL); 669 | XPLMUnregisterDrawCallback(drawmap2d, xplm_Phase_LocalMap2D, 0, NULL); 670 | } 671 | break; 672 | #endif 673 | } 674 | } 675 | 676 | 677 | #ifdef DEBUG 678 | static void mybad(const char *inMessage) 679 | { 680 | assert(inMessage!=NULL); 681 | } 682 | #endif 683 | 684 | 685 | static int failinit(char *outDescription) 686 | { 687 | XPLMDebugString("SeaTraffic: "); 688 | XPLMDebugString(outDescription); 689 | XPLMDebugString("\n"); 690 | return 0; 691 | } 692 | 693 | 694 | /* Convert path to posix style in-place */ 695 | static void posixify(char *path) 696 | { 697 | #if APL 698 | if (*path!='/') 699 | { 700 | /* X-Plane 9 - screw around with HFS paths FFS */ 701 | int isfolder = (path[strlen(path)-1]==':'); 702 | CFStringRef hfspath = CFStringCreateWithCString(NULL, path, kCFStringEncodingMacRoman); 703 | CFURLRef url = CFURLCreateWithFileSystemPath(NULL, hfspath, kCFURLHFSPathStyle, 0); 704 | CFStringRef posixpath = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle); 705 | CFStringGetCString(posixpath, path, PATH_MAX, kCFStringEncodingUTF8); 706 | CFRelease(hfspath); 707 | CFRelease(url); 708 | CFRelease(posixpath); 709 | if (isfolder && path[strlen(path)-1]!='/') { strcat(path, "/"); } /* converting from HFS loses trailing separator */ 710 | } 711 | #elif IBM 712 | char *c; 713 | for (c=path; *c; c++) if (*c=='\\') *c='/'; 714 | #endif 715 | } 716 | 717 | 718 | /********************************************************************** 719 | Plugin entry points 720 | **********************************************************************/ 721 | 722 | PLUGIN_API int XPluginStart(char *outName, char *outSignature, char *outDescription) 723 | { 724 | char buffer[PATH_MAX], *c; 725 | 726 | sprintf(outName, "SeaTraffic v%.2f", VERSION); 727 | strcpy(outSignature, "Marginal.SeaTraffic"); 728 | strcpy(outDescription, "Shows animated marine traffic"); 729 | 730 | #ifdef DEBUG 731 | XPLMSetErrorCallback(mybad); 732 | #endif 733 | 734 | /* Get path for my resources in posix format */ 735 | XPLMEnableFeature("XPLM_USE_NATIVE_PATHS", 1); /* X-Plane 10+ */ 736 | XPLMGetPluginInfo(XPLMGetMyID(), NULL, mypath, NULL, NULL); 737 | posixify(mypath); 738 | if (!(c=strrchr(mypath, '/'))) 739 | { 740 | strcpy(outDescription, "Can't find my plugin"); 741 | return failinit(outDescription); 742 | } 743 | *(c+1)='\0'; 744 | if (!strcmp(c-3, "/32/") || !strcmp(c-3, "/64/")) { *(c-2)='\0'; } /* plugins one level down on some builds, so go up */ 745 | 746 | XPLMGetSystemPath(buffer); 747 | posixify(buffer); 748 | assert (!(strncmp(mypath, buffer, strlen(buffer)))); 749 | relpath=mypath+strlen(buffer); /* resource path, relative to X-Plane system folder */ 750 | 751 | strcpy(buffer, relpath); 752 | strcat(buffer, "wake_big.obj"); 753 | if (!(wake_big_ref=loadobject(buffer))) { return 0; } 754 | strcpy(buffer, relpath); 755 | strcat(buffer, "wake_med.obj"); 756 | if (!(wake_med_ref=loadobject(buffer))) { return 0; } 757 | strcpy(buffer, relpath); 758 | strcat(buffer, "wake_sml.obj"); 759 | if (!(wake_sml_ref=loadobject(buffer))) { return 0; } 760 | 761 | if (!readroutes(mypath, outDescription)) { return failinit(outDescription); } /* read routes.txt */ 762 | 763 | ref_view_x =XPLMFindDataRef("sim/graphics/view/view_x"); 764 | ref_view_y =XPLMFindDataRef("sim/graphics/view/view_y"); 765 | ref_view_z =XPLMFindDataRef("sim/graphics/view/view_z"); 766 | ref_view_h =XPLMFindDataRef("sim/graphics/view/view_heading"); 767 | ref_plane_lat=XPLMFindDataRef("sim/flightmodel/position/latitude"); 768 | ref_plane_lon=XPLMFindDataRef("sim/flightmodel/position/longitude"); 769 | ref_night =XPLMFindDataRef("sim/graphics/scenery/percent_lights_on"); 770 | ref_rentype =XPLMFindDataRef("sim/graphics/view/world_render_type"); 771 | ref_monotonic=XPLMFindDataRef("sim/time/total_running_time_sec"); 772 | if (!(ref_view_x && ref_view_y && ref_view_z && ref_view_h && ref_plane_lat && ref_plane_lon && ref_night && ref_rentype && ref_monotonic)) 773 | { 774 | strcpy(outDescription, "Can't access X-Plane datarefs!"); 775 | return failinit(outDescription); 776 | } 777 | 778 | srand(time(NULL)); /* Seed rng */ 779 | 780 | #ifdef DO_ACTIVE_LIST 781 | windowId = XPLMCreateWindow(10, 750, 310, 650, 1, drawdebug, NULL, NULL, NULL); /* size overridden later */ 782 | # if IBM 783 | QueryPerformanceFrequency((LARGE_INTEGER *) &ticks_per_sec); 784 | # endif 785 | #endif 786 | 787 | return 1; 788 | } 789 | 790 | PLUGIN_API void XPluginStop(void) 791 | { 792 | #ifdef DO_ACTIVE_LIST 793 | if (windowId) { XPLMDestroyWindow(windowId); } 794 | #endif 795 | } 796 | 797 | PLUGIN_API void XPluginEnable(void) 798 | { 799 | } 800 | 801 | PLUGIN_API void XPluginDisable(void) 802 | { 803 | } 804 | 805 | PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFrom, long inMessage, void *inParam) 806 | { 807 | if (!done_init) 808 | { 809 | int my_menu_index; 810 | done_init = 1; 811 | 812 | /* Load default ship .objs. Deferred to here so scenery library has been scanned */ 813 | if (!models_init(relpath)) 814 | return; /* Exit before setting up menus & callbacks */ 815 | 816 | /* Finish setup */ 817 | ref_renopt = XPLMFindDataRef("sim/private/controls/reno/draw_objs_06"); /* v10+ */ 818 | XPLMEnableFeature("XPLM_WANTS_REFLECTIONS", 1); 819 | XPLMRegisterDrawCallback(drawships, xplm_Phase_Objects, 1, NULL); /* Before other 3D objects */ 820 | 821 | my_menu_index = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "SeaTraffic", NULL, 1); 822 | my_menu_id = XPLMCreateMenu("SeaTraffic", XPLMFindPluginsMenu(), my_menu_index, menuhandler, NULL); 823 | /* Menu items must be added in order of menu_idx enum */ 824 | #ifdef DO_LOCAL_MAP 825 | /* Setup local map */ 826 | XPLMAppendMenuItem(my_menu_id, "Draw routes in Local Map", (void*) menu_idx_local_map, 0); 827 | XPLMCheckMenuItem(my_menu_id, menu_idx_local_map, do_local_map ? xplm_Menu_Checked : xplm_Menu_Unchecked); 828 | if (do_local_map) 829 | { 830 | XPLMRegisterDrawCallback(drawmap3d, xplm_Phase_LocalMap3D, 0, NULL); 831 | XPLMRegisterDrawCallback(drawmap2d, xplm_Phase_LocalMap2D, 0, NULL); 832 | } 833 | #endif 834 | need_recalc = 1; 835 | } 836 | 837 | if (ref_renopt) /* change to rendering options causes SCENERY_LOADED */ 838 | { 839 | int new_active_max = XPLMGetDatai(ref_renopt) * RENDERING_SCALE; 840 | if (new_active_max > ACTIVE_MAX) { new_active_max = ACTIVE_MAX; } 841 | if (active_max != new_active_max) 842 | { 843 | active_max = new_active_max; 844 | need_recalc = 1; 845 | } 846 | } 847 | } 848 | -------------------------------------------------------------------------------- /src/seatraffic.h: -------------------------------------------------------------------------------- 1 | /* 2 | * SeaTraffic 3 | * 4 | * (c) Jonathan Harris 2012 5 | * 6 | */ 7 | 8 | #ifdef _MSC_VER 9 | # define _USE_MATH_DEFINES 10 | # define _CRT_SECURE_NO_DEPRECATE 11 | # define inline __forceinline 12 | #else 13 | # include 14 | #endif 15 | 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | 26 | #define XPLM200 /* Requires X-Plane 9.0 or later */ 27 | #define XPLM210 /* Uses asynchronous object loading if on v10 */ 28 | #include "XPLMDataAccess.h" 29 | #include "XPLMDisplay.h" 30 | #include "XPLMGraphics.h" 31 | #include "XPLMMenus.h" 32 | #include "XPLMPlugin.h" 33 | #include "XPLMScenery.h" 34 | #include "XPLMUtilities.h" 35 | #include "XPUIGraphics.h" 36 | 37 | #if APL 38 | # include 39 | # include 40 | #else 41 | # include 42 | # include 43 | #endif 44 | 45 | #ifdef _MSC_VER 46 | # define PATH_MAX MAX_PATH 47 | #endif 48 | 49 | /* Version of assert that suppresses "variable ... set but not used" if the variable only exists for the purpose of the asserted expression */ 50 | #ifdef NDEBUG 51 | # undef assert 52 | # define assert(expr) ((void)(expr)) 53 | #endif 54 | 55 | /* constants */ 56 | #define DRAW_DISTANCE 20000.f /* can see things a long way on water [m] */ 57 | #define DRAW_REFLECT 16000.f 58 | #define DRAW_WAKE 12000.f 59 | #define RENDERING_SCALE 16 /* multiplied by number of objects setting to give maximum number of active routes */ 60 | #define ACTIVE_DEFAULT (2*RENDERING_SCALE) /* for v9 */ 61 | #define ACTIVE_MAX (4*RENDERING_SCALE) /* "mega tons" */ 62 | #define TILE_RANGE 1 /* How many tiles away from plane's tile to render boats */ 63 | #define OBJ_VARIANT_MAX 8 /* How many physical objects to use for each virtual object in X-Plane's library */ 64 | #define HDG_HOLD_TIME 10.0f /* Only update headings and altitudes periodically [s] */ 65 | #define LINGER_TIME 300.0f /* How long should ships hang around at the dock at the end of their route [s] */ 66 | #define SHIP_SPACING 8 /* Try to space ships out by this many times their semilen */ 67 | #define RADIUS 6378145.f /* from sim/physics/earth_radius_m [m] */ 68 | #define WAKE_MINSPEED 5 /* Only draw wakes for ships going this fast [m/s] */ 69 | #define WAKE_MED 20 /* Draw medium wake for ships this large (semilen) [m] */ 70 | #define WAKE_BIG 40 /* Draw large wake for ships this large (semilen) [m] */ 71 | #define LIBRARY_PREFIX "marginal/seatraffic/" /* library names */ 72 | #define LIBRARY_TOKEN_MAX 8 /* token size */ 73 | 74 | /* rendering options */ 75 | #define DO_LOCAL_MAP 76 | enum 77 | { 78 | menu_idx_local_map 79 | } menu_idx; 80 | #ifdef DEBUG 81 | # define DO_ACTIVE_LIST 82 | #endif 83 | 84 | /* types */ 85 | 86 | /* Kinds of ships we recognise */ 87 | typedef enum /* use -fshort-enums with gcc */ 88 | { 89 | leisure, tourist, cruise, ped_sml, ped_med, veh_sml, veh_med, veh_big, cargo, tanker, 90 | ship_kind_count 91 | } ship_kind_t; 92 | 93 | /* Description of a kind of ship */ 94 | typedef struct 95 | { 96 | unsigned int speed; /* [m/s] */ 97 | float semilen; /* [m] */ 98 | char token[LIBRARY_TOKEN_MAX]; /* token in routes.txt */ 99 | } ship_t; 100 | 101 | /* Models of a kind of ship */ 102 | typedef struct 103 | { 104 | int obj_n; /* Number of physical .objs */ 105 | char **names; /* Physical .obj names for sorting */ 106 | XPLMObjectRef *refs; /* Physical .obj handles */ 107 | } ship_models_t; 108 | 109 | /* Geolocation, used for route paths */ 110 | typedef struct 111 | { 112 | float lat, lon; /* we don't need double precision so save some memory */ 113 | } loc_t; 114 | 115 | /* Current location */ 116 | typedef struct 117 | { 118 | double lat, lon; /* we do want double precision to prevent jerkiness */ 119 | } dloc_t; 120 | 121 | /* X-Plane 1x1degree tile number */ 122 | typedef struct 123 | { 124 | int south, west; 125 | } tile_t; 126 | 127 | /* A route from routes.txt */ 128 | typedef struct 129 | { 130 | loc_t *path; 131 | #if defined(DO_LOCAL_MAP) || defined(DO_ACTIVE_LIST) 132 | char *name; 133 | #endif 134 | ship_kind_t ship_kind; 135 | unsigned short pathlen; 136 | } route_t; 137 | 138 | /* List of routes */ 139 | typedef struct route_list_t 140 | { 141 | struct route_list_t *next; 142 | route_t *route; 143 | } route_list_t; 144 | 145 | /* An active route */ 146 | typedef struct active_route_t 147 | { 148 | struct active_route_t *next; 149 | const ship_t *ship; /* Ship description */ 150 | route_t *route; /* The route it's on */ 151 | int direction; /* Traversing path 1=forwards, -1=reverse */ 152 | int last_node; /* The last node visited on that route */ 153 | int new_node; /* Flag indicating that state needs updating after hitting a new node */ 154 | float last_hdg; /* The heading we set off from last_node */ 155 | float last_time, next_time; /* Time we left last_node, expected time to hit the next node */ 156 | XPLMObjectRef *object_ref; /* X-Plane object */ 157 | const char *object_name; /* X-Plane object name for sorting */ 158 | dloc_t loc; /* Ship's current location */ 159 | double altmsl; /* Altitude */ 160 | XPLMProbeRef ref_probe; /* Terrain probe */ 161 | XPLMDrawInfo_t drawinfo; /* Where to draw the ship */ 162 | #ifdef DO_LOCAL_MAP 163 | int mapx, mapy; /* position in local map */ 164 | #endif 165 | } active_route_t; 166 | 167 | 168 | /* globals */ 169 | extern const ship_t ships[ship_kind_count]; 170 | 171 | 172 | /* prototypes */ 173 | int readroutes(char *mypath, char *err); 174 | route_list_t *getroutesbytile(int south, int west); 175 | 176 | route_list_t *route_list_add(route_list_t **route_list, route_t *route); 177 | route_list_t *route_list_get_byroute(route_list_t *route_list, route_t *route); 178 | route_t *route_list_pop(route_list_t **route_list, int n); 179 | int route_list_length(route_list_t *route_list); 180 | void route_list_free(route_list_t **route_list); 181 | 182 | active_route_t *active_route_add(active_route_t **active_routes); 183 | active_route_t *active_route_get(active_route_t *active_routes, int n); 184 | active_route_t *active_route_get_byroute(active_route_t *active_routes, route_t *route); 185 | void active_route_pop(active_route_t **active_routes, int n); 186 | int active_route_length(active_route_t *active_routes); 187 | void active_route_sort(active_route_t **active_routes, int active_n); 188 | 189 | int models_init(); 190 | ship_models_t *models_for_tile(int south, int west); 191 | XPLMObjectRef loadobject(const char *path); 192 | -------------------------------------------------------------------------------- /version.mak: -------------------------------------------------------------------------------- 1 | PROJECT=SeaTraffic 2 | VER=131 3 | VERSION=1.31 4 | --------------------------------------------------------------------------------