diff --git a/Config/ProjectApollo/InstallerScripts/D3D9-LICENSE.txt b/Config/ProjectApollo/InstallerScripts/D3D9-LICENSE.txt new file mode 100644 index 0000000000..02bbb60bc4 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9-LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DG-S.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DG-S.cfg new file mode 100644 index 0000000000..361f50167c --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DG-S.cfg @@ -0,0 +1,10 @@ +; ============================================= +MESH DG\deltaglider +; --------------------------------------------- +MATERIAL 24 +SPECULAR 2.491667 2.491667 2.491667 40.000000 +REFLECT 0.129412 0.129412 0.129412 +FRESNEL 3.035294 0.000000 1.000000 +; --------------------------------------------- +MATERIAL 10 +SPECULAR 2.292319 2.235777 2.087353 25.000000 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DeltaGlider.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DeltaGlider.cfg new file mode 100644 index 0000000000..45da127cf7 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/DeltaGlider.cfg @@ -0,0 +1,38 @@ +CONFIG_VERSION 3 +; ============================================= +MESH DG\deltaglider_ns +SHADER Metalness +SAFEGUARD 0 +; --------------------------------------------- +MATERIAL 24 +SPECULAR 2.398034 2.398034 2.398034 40.000000 +REFLECT 0.117647 0.117647 0.117647 +FRESNEL 2.235294 1024.000000 1.000000 +; --------------------------------------------- +MATERIAL 10 +SPECULAR 2.032517 1.982384 1.850781 25.000000 +SMOOTHNESS 0.745098 1.000000 +METALNESS 1.000000 +; --------------------------------------------- +MATERIAL 11 +SMOOTHNESS 0.000000 1.000000 +; --------------------------------------------- +MATERIAL 15 +SMOOTHNESS 0.000000 1.000000 +; --------------------------------------------- +MATERIAL 16 +SMOOTHNESS 0.501961 1.000000 +METALNESS 1.000000 +; --------------------------------------------- +MATERIAL 18 +SMOOTHNESS 0.000000 1.000000 +; --------------------------------------------- +MATERIAL 12 +SMOOTHNESS 0.576471 1.000000 +METALNESS 1.000000 +; --------------------------------------------- +MATERIAL 14 +SMOOTHNESS 0.000000 1.000000 +; --------------------------------------------- +MATERIAL 17 +SMOOTHNESS 0.000000 1.000000 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atmo.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atmo.cfg new file mode 100644 index 0000000000..5107e6bac1 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atmo.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.55 +Blue = 0.4816 +RWaveDep = 4.08 +MWaveDep = 0 +ScaleHeight = 8.11965 +DepthClamp = 0.99875 +Exposure = 0.9185 +TGamma = 0.5976 +OutScatter = 0.6348 +InScatter = 1.7585 +RayleighPhase = -0.5085 +MiePower = 0.247808 +MiePhase = 0.924176 +Aux1 = 0.2406 +Aux2 = 0.044521 +Aux3 = 0.94 +AGamma = 0.7272 +HazeClr = 0.765 +HazeIts = 1.3912 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atms.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atms.cfg new file mode 100644 index 0000000000..5f79ec62dc --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Earth.atms.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.559 +Blue = 0.4804 +RWaveDep = 5.264 +MWaveDep = -0.912 +ScaleHeight = 8.11965 +DepthClamp = 0.99875 +Exposure = 1.1045 +TGamma = 1.0128 +OutScatter = 1.19448 +InScatter = 1.301 +RayleighPhase = -0.0345 +MiePower = 0.474338 +MiePhase = 0.962981 +Aux1 = 0.2355 +Aux2 = 0.112896 +Aux3 = 0 +AGamma = 0.7512 +HazeClr = 0.927 +HazeIts = 1.6376 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atmo.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atmo.cfg new file mode 100644 index 0000000000..b4e5bcff3f --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atmo.cfg @@ -0,0 +1,20 @@ +Red = 0.6445 +Green = 0.5923 +Blue = 0.48 +RWaveDep = -3.968 +MWaveDep = 3.12 +ScaleHeight = 400 +DepthClamp = 0.73875 +Exposure = 0.5 +TGamma = 0.3 +OutScatter = 0.386643 +InScatter = 2 +RayleighPhase = -0.0255 +MiePower = 0.039762 +MiePhase = 0.982284 +Aux1 = 0.3 +Aux2 = 1 +Aux3 = 0.92 +AGamma = 0.7392 +HazeClr = -0.492 +HazeIts = 1.5249 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atms.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atms.cfg new file mode 100644 index 0000000000..eb7619f787 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Jupiter.atms.cfg @@ -0,0 +1,20 @@ +Red = 0.6445 +Green = 0.5923 +Blue = 0.48 +RWaveDep = -1.504 +MWaveDep = 3.12 +ScaleHeight = 400 +DepthClamp = 0.7 +Exposure = 1.079 +TGamma = 0.9888 +OutScatter = 0.109443 +InScatter = 0.9575 +RayleighPhase = -0.513 +MiePower = 0.026 +MiePhase = 0.977707 +Aux1 = 0.3 +Aux2 = 1 +Aux3 = 0.718 +AGamma = 0.7464 +HazeClr = 0 +HazeIts = 1.4451 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atmo.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atmo.cfg new file mode 100644 index 0000000000..99bc7fc885 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atmo.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.55 +Blue = 0.4816 +RWaveDep = -1.296 +MWaveDep = 1.024 +ScaleHeight = 10.2529 +DepthClamp = 0.141 +Exposure = 1.16 +TGamma = 0.63 +OutScatter = 0.074892 +InScatter = 0.998 +RayleighPhase = -0.201 +MiePower = 0.014112 +MiePhase = 0.953628 +Aux1 = 0.3 +Aux2 = 0.414736 +Aux3 = 0.954 +AGamma = 1 +HazeClr = 0 +HazeIts = 1.3723 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atms.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atms.cfg new file mode 100644 index 0000000000..1fb17f7cac --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Mars.atms.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.5581 +Blue = 0.4804 +RWaveDep = -2.624 +MWaveDep = 4.192 +ScaleHeight = 10.2529 +DepthClamp = 0.0885 +Exposure = 1.019 +TGamma = 0.7272 +OutScatter = 0.401868 +InScatter = 1.0085 +RayleighPhase = 0.0105 +MiePower = 0.060552 +MiePhase = 0.938305 +Aux1 = 0.3 +Aux2 = 1 +Aux3 = 0 +AGamma = 1 +HazeClr = 0 +HazeIts = 1.7 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atmo.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atmo.cfg new file mode 100644 index 0000000000..0779333c99 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atmo.cfg @@ -0,0 +1,20 @@ +Red = 0.65 +Green = 0.5 +Blue = 0.48 +RWaveDep = 4 +MWaveDep = 1 +ScaleHeight = 8 +DepthClamp = 1 +Exposure = 1 +TGamma = 1 +OutScatter = 0.592 +InScatter = 1 +RayleighPhase = 0.3395 +MiePower = 0.0869 +MiePhase = 0.9831 +Aux1 = 0 +Aux2 = 0 +Aux3 = 0 +AGamma = 1 +HazeClr = 0 +HazeIts = 1.7 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atms.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atms.cfg new file mode 100644 index 0000000000..dc16774360 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Moon.atms.cfg @@ -0,0 +1,20 @@ +Red = 0.65 +Green = 0.5 +Blue = 0.48 +RWaveDep = 4 +MWaveDep = 1 +ScaleHeight = 8 +DepthClamp = 0.0042 +Exposure = 1.004 +TGamma = 0.606 +OutScatter = 0.592 +InScatter = 1 +RayleighPhase = 0.3395 +MiePower = 0.0869 +MiePhase = 0.9831 +Aux1 = 0 +Aux2 = 0 +Aux3 = 0 +AGamma = 1 +HazeClr = 0 +HazeIts = 1.7 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atmo.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atmo.cfg new file mode 100644 index 0000000000..6d6f31d6b9 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atmo.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.55 +Blue = 0.4816 +RWaveDep = 1.552 +MWaveDep = 8 +ScaleHeight = 30.586 +DepthClamp = 0.72625 +Exposure = 0.9635 +TGamma = 0.864 +OutScatter = 0.324723 +InScatter = 0.827 +RayleighPhase = 0.75 +MiePower = 0.063368 +MiePhase = 0.975717 +Aux1 = 0.2055 +Aux2 = 0.073984 +Aux3 = 0 +AGamma = 0.7512 +HazeClr = 0 +HazeIts = 1.5865 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atms.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atms.cfg new file mode 100644 index 0000000000..df877149ad --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/Titan.atms.cfg @@ -0,0 +1,20 @@ +Red = 0.6517 +Green = 0.55 +Blue = 0.4816 +RWaveDep = -6.448 +MWaveDep = 8 +ScaleHeight = 30.586 +DepthClamp = 0.17625 +Exposure = 1.1495 +TGamma = 0.8964 +OutScatter = 0.034347 +InScatter = 1.169 +RayleighPhase = 0.75 +MiePower = 0.038088 +MiePhase = 0.939499 +Aux1 = 0.2145 +Aux2 = 0.1936 +Aux3 = 0 +AGamma = 0.7308 +HazeClr = -0.534 +HazeIts = 1.6124 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/XR2Ravenstar.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/XR2Ravenstar.cfg new file mode 100644 index 0000000000..ed1b55230c --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/GC/XR2Ravenstar.cfg @@ -0,0 +1,7 @@ +; ============================================= +MESH XR2Ravenstar\XR2Ravenstar +; --------------------------------------------- +MATERIAL 22 +SPECULAR 2.271151 2.271151 2.271151 256.000000 +REFLECT 0.117647 0.117647 0.117647 +FRESNEL 2.588235 0.000000 0.913726 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/MicroTex.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/MicroTex.cfg new file mode 100644 index 0000000000..03c02e4037 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/MicroTex.cfg @@ -0,0 +1,63 @@ +// BODY [ BodyName] +// NORMALS [ 0-1] +// LEVEL [ 0-2] [ texture name] [ resolution pixels/meter] + +BODY Moon +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 42.0 +LEVEL 1 D3D9Moon_C2.dds 6.0 +LEVEL 2 D3D9Moon_C.dds 0.8 + +BODY Mars +NORMALS 1 +LEVEL 0 D3D9Mars_A.dds 20.0 +LEVEL 1 D3D9Mars_B.dds 3.0 +LEVEL 2 D3D9Mars_B.dds 1.0 + +BODY Mercury +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 42.0 +LEVEL 1 D3D9Moon_C2.dds 6.0 +LEVEL 2 D3D9Moon_C.dds 0.8 + +BODY Deimos +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Dione +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Iapetus +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Mimas +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Rhea +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Tethys +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 + +BODY Vesta +NORMALS 1 +LEVEL 0 D3D9Moon_A.dds 20.0 +LEVEL 1 D3D9Moon_B.dds 5.0 +LEVEL 2 D3D9Moon_C.dds 0.5 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/Vessels/MaterialTestSphere.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/Vessels/MaterialTestSphere.cfg new file mode 100644 index 0000000000..2853d3a871 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/Vessels/MaterialTestSphere.cfg @@ -0,0 +1,9 @@ +Meshname = D3D9HSphere +Mass = 124567 +Size = 30.0 +Inertia = 50.0 50.0 50.0 +CrossSections = 100.0 100.0 100.0 +EnableFocus = FALSE +EnableXPDR = TRUE +XPDR = 480 + diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/gcGUI.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/gcGUI.cfg new file mode 100644 index 0000000000..f2c0579477 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Config/gcGUI.cfg @@ -0,0 +1,52 @@ +; D3D9Client GUI configuration + +;====================================================================================== + +RESOLUTION 0 1250 ;Vertical resolution range in pixels (from, to) +SCROLL 20 ;Panel scroll speed +FONT_MAIN "Ms Shell Dlg" 19 600 ;Window title bar font ("name", size, weight) +MAIN_OFS 22 6 ;Window title text offset (x, y) +MAIN_CLR 0xFFFFFF ;Window title text color + +FONT_SUB "Ms Shell Dlg" 14 400 ;Subsection font ("name", size, weight) +SUB_OFS 20 2 ;Subsection text offset (x, y) +SUB_CLR 0x000000 ;Subsection text color + +MAIN_BMP D3D9\SubTitle28.png ;Window titlebar art (without double quotes) +SUB_BMP D3D9\SubTitle18.png ;Subsection separator art +ICON_BMP D3D9\Icons18.png ;Icons +END + +;====================================================================================== + +RESOLUTION 1250 1700 ;Vertical resolution range in pixels (from, to) +SCROLL 28 ;Panel scroll speed +FONT_MAIN "Ms Shell Dlg" 28 600 ;Window title bar font ("name", size, weight) +MAIN_OFS 40 5 ;Window title text offset (x, y) +MAIN_CLR 0xFFFFFF ;Window title text color + +FONT_SUB "Ms Shell Dlg" 22 400 ;Subsection font (name, size, weight) +SUB_OFS 32 3 ;Subsection text offset (x, y) +SUB_CLR 0x000000 ;Subsection text color + +MAIN_BMP SubTitle36.png ;Window titlebar art (without double quotes) +SUB_BMP SubTitle28.png ;Subsection separator art +ICON_BMP Icons28.png ;Icons +END + +;====================================================================================== + +RESOLUTION 1700 3000 ;Vertical resolution range in pixels (from, to) +SCROLL 40 ;Panel scroll speed +FONT_MAIN "Ms Shell Dlg" 36 600 ;Window title bar font (name, size, weight) +MAIN_OFS 50 8 ;Window title text offset (x, y) +MAIN_CLR 0xFFFFFF ;Window title text color + +FONT_SUB "Ms Shell Dlg" 28 400 ;Subsection font (name, size, weight) +SUB_OFS 40 4 ;Subsection text offset (x, y) +SUB_CLR 0x000000 ;Subsection text color + +MAIN_BMP SubTitle56.png ;Window titlebar art (without double quotes) +SUB_BMP SubTitle36.png ;Subsection separator art +ICON_BMP Icons36.png ;Icons +END \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/D3D9Client.cfg b/Config/ProjectApollo/InstallerScripts/D3D9Client/D3D9Client.cfg new file mode 100644 index 0000000000..77bd589a30 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/D3D9Client.cfg @@ -0,0 +1,64 @@ +FrameRate = 200 +EnableLimiter = 0 +CustomCamMode = 1 +PlanetPreloadMode = 0 +PlanetTexLoadFreq = 50 +Anisotrophy = 4 +SceneAntialias = 4 +SketchpadFont = 1 +PreLoadBaseVisuals = 0 +EnableNormalMapping = 1 +NearClipPlaneMode = 0 +RwyLightAnimate = 1 +RwyLightAngle = 120 +RwyBrightness = 1 +NightLightsAngle = 10 +BumpMapAmplitude = 1 +PlanetGlow = 0.7 +EnvMapSize = 256 +EnvMapMode = 1 +EnvMapFaces = 1 +ShadowMapMode = 3 +ShadowMapFilter = 2 +ShadowMapSize = 2048 +TerrainShadowing = 2 +EnableGlass = 1 +EnableMeshDbg = 1 +TileMipmaps = 1 +TextureMips = 1 +TileDebug = 0 +StereoSeparation = 65 +StereoConvergence = 0.2 +DebugLvl = 1 +VCNearPlane = 0.1 +LightConfiguration = 2 +DisableDrvMgm = 0 +NVPerfHUD = 0 +DebugLineFontSize = 18 +DisableVisualHelperReadout = 0 +LODBias = 0 +MeshRes = 1 +MicroMode = 1 +MicroFilter = 3 +BlendMode = 1 +MicroBias = 3 +CloudMicro = 1 +PostProcess = 1 +ShaderDebug = 0 +PresentLocation = 1 +PlanetTileLoadFlags = 3 +LabelDisplayFlags = 3 +GDIOverlay = 0 +gcGUIMode = 0 +AbsoluteAnimations = 0 +NormalmappedClouds = 1 +TerrainFlats = 1 +OrbitalShadowMult = 0.85 +GFXIntensity = 0.380392 +GFXDistance = 1 +GFXThreshold = 1.1 +GFXGamma = 1 +GFXSunIntensity = 1.2 +GFXLocalMax = 0.5 +SolCfg = Sol +DebugLineFont = Fixed diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Doc/D3D9Client.pdf b/Config/ProjectApollo/InstallerScripts/D3D9Client/Doc/D3D9Client.pdf new file mode 100644 index 0000000000..4babcb2466 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Doc/D3D9Client.pdf differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Arrow.msh b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Arrow.msh new file mode 100644 index 0000000000..a981b15ea5 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Arrow.msh @@ -0,0 +1,142 @@ +MSHX1 +GROUPS 1 +LABEL Arrow +MATERIAL 1 +TEXTURE 0 +GEOM 50 78 +-0.0 1.0 -1.0 -0.0 -0.347270131111145 -0.9377422332763672 1.0 0.0 +-0.3826834559440613 1.0 -0.9238795042037964 -0.3588366210460663 -0.347270131111145 -0.8663594722747803 1.0 0.0 +-0.7071067690849304 1.0 -0.7071067690849304 -0.6630756258964539 -0.347270131111145 -0.6630756258964539 1.0 0.0 +-0.9238795042037964 1.0 -0.3826834261417389 -0.8663594722747803 -0.347270131111145 -0.3588366210460663 1.0 0.0 +-1.0 1.0 4.371138828673793e-08 -0.9377422332763672 -0.347270131111145 -0.0 1.0 0.0 +-0.9238795042037964 1.0 0.38268351554870605 -0.8663594722747803 -0.347270131111145 0.3588366210460663 1.0 0.0 +-0.0 2.0 -0.0 -0.0 1.0 -0.0 1.0 0.0 +-0.7071067690849304 1.0 0.7071067690849304 -0.6630756258964539 -0.347270131111145 0.6630756258964539 1.0 0.0 +-0.38268348574638367 1.0 0.9238795042037964 -0.3588366210460663 -0.347270131111145 0.8663594722747803 1.0 0.0 +-1.5099580252808664e-07 1.0 1.0 -0.0 -0.347270131111145 0.9377422332763672 1.0 0.0 +0.3826832175254822 1.0 0.9238796234130859 0.3588366210460663 -0.347270131111145 0.8663594722747803 1.0 0.0 +0.7071065902709961 1.0 0.7071070075035095 0.6630756258964539 -0.347270131111145 0.6630756258964539 1.0 0.0 +0.9238795042037964 1.0 0.38268357515335083 0.8663594722747803 -0.347270131111145 0.3588366210460663 1.0 0.0 +1.0 1.0 -1.1924880638503055e-08 0.9377422332763672 -0.347270131111145 -0.0 1.0 0.0 +0.9238794445991516 1.0 -0.3826836049556732 0.8663594722747803 -0.347270131111145 -0.3588366210460663 1.0 0.0 +0.7071065306663513 1.0 -0.7071070075035095 0.6630756258964539 -0.347270131111145 -0.6630756258964539 1.0 0.0 +0.3826829791069031 1.0 -0.9238797426223755 0.3588366210460663 -0.347270131111145 -0.8663594722747803 1.0 0.0 +-0.0 0.0 -0.0 -0.0 -1.0 -0.0 0.0 1.0 +-0.0 0.0 -0.5 -0.0 -0.6657002568244934 -0.7461775541305542 0.0 1.0 +-0.0 1.0 -0.5 -0.0 0.0 -0.999969482421875 1.0 0.0 +-0.19134172797203064 0.0 -0.4619397521018982 -0.2855311632156372 -0.6657002568244934 -0.6893826127052307 0.0 1.0 +-0.19134172797203064 1.0 -0.4619397521018982 -0.382671594619751 0.0 -0.9238563179969788 1.0 0.0 +-0.3535533845424652 0.0 -0.3535533845424652 -0.5276345014572144 -0.6657002568244934 -0.5276345014572144 0.0 1.0 +-0.3535533845424652 1.0 -0.3535533845424652 -0.7070833444595337 0.0 -0.7070833444595337 1.0 0.0 +-0.4619397521018982 0.0 -0.19134171307086945 -0.6893826127052307 -0.6657002568244934 -0.2855311632156372 0.0 1.0 +-0.4619397521018982 1.0 -0.19134171307086945 -0.9238563179969788 0.0 -0.382671594619751 1.0 0.0 +-0.5 0.0 2.1855694143368964e-08 -0.7461775541305542 -0.6657002568244934 -0.0 0.0 1.0 +-0.5 1.0 2.1855694143368964e-08 -1.0 0.0 -0.0 1.0 0.0 +-0.4619397521018982 0.0 0.19134175777435303 -0.6893826127052307 -0.6657002568244934 0.2855311632156372 0.0 1.0 +-0.4619397521018982 1.0 0.19134175777435303 -0.9238563179969788 0.0 0.382671594619751 1.0 0.0 +-0.3535533845424652 0.0 0.3535533845424652 -0.5276345014572144 -0.6657002568244934 0.5276345014572144 0.0 1.0 +-0.3535533845424652 1.0 0.3535533845424652 -0.7070833444595337 0.0 0.7070833444595337 1.0 0.0 +-0.19134174287319183 0.0 0.4619397521018982 -0.2855311632156372 -0.6657002568244934 0.6893826127052307 0.0 1.0 +-0.19134174287319183 1.0 0.4619397521018982 -0.382671594619751 0.0 0.9238563179969788 1.0 0.0 +-7.549790126404332e-08 0.0 0.5 -0.0 -0.6657002568244934 0.7461775541305542 0.0 1.0 +-7.549790126404332e-08 1.0 0.5 -0.0 0.0 1.0 1.0 0.0 +0.1913416087627411 0.0 0.46193981170654297 0.2855311632156372 -0.6657002568244934 0.6893826127052307 0.0 1.0 +0.1913416087627411 1.0 0.46193981170654297 0.382671594619751 0.0 0.9238563179969788 1.0 0.0 +0.35355329513549805 0.0 0.35355350375175476 0.5276345014572144 -0.6657002568244934 0.5276345014572144 0.0 1.0 +0.35355329513549805 1.0 0.35355350375175476 0.7070833444595337 0.0 0.7070833444595337 1.0 0.0 +0.4619397521018982 0.0 0.19134178757667542 0.6893826127052307 -0.6657002568244934 0.2855311632156372 0.0 1.0 +0.4619397521018982 1.0 0.19134178757667542 0.9238563179969788 0.0 0.382671594619751 1.0 0.0 +0.5 0.0 -5.962440319251527e-09 0.7461775541305542 -0.6657002568244934 -0.0 0.0 1.0 +0.5 1.0 -5.962440319251527e-09 1.0 0.0 -0.0 1.0 0.0 +0.4619397222995758 0.0 -0.1913418024778366 0.6893826127052307 -0.6657002568244934 -0.2855311632156372 0.0 1.0 +0.4619397222995758 1.0 -0.1913418024778366 0.9238563179969788 0.0 -0.382671594619751 1.0 0.0 +0.35355326533317566 0.0 -0.35355350375175476 0.5276345014572144 -0.6657002568244934 -0.5276345014572144 0.0 1.0 +0.35355326533317566 1.0 -0.35355350375175476 0.7070833444595337 0.0 -0.7070833444595337 1.0 0.0 +0.19134148955345154 0.0 -0.46193987131118774 0.2855311632156372 -0.6657002568244934 -0.6893826127052307 0.0 1.0 +0.19134148955345154 1.0 -0.46193987131118774 0.382671594619751 0.0 -0.9238563179969788 1.0 0.0 +15 16 6 +0 1 6 +6 16 0 +1 2 6 +14 15 6 +13 14 6 +12 13 6 +11 12 6 +10 11 6 +9 10 6 +8 9 6 +7 8 6 +5 7 6 +4 5 6 +3 4 6 +2 3 6 +0 16 1 +17 20 18 +18 21 19 +17 22 20 +20 23 21 +17 24 22 +22 25 23 +17 26 24 +24 27 25 +17 28 26 +26 29 27 +17 30 28 +28 31 29 +17 32 30 +30 33 31 +17 34 32 +32 35 33 +17 36 34 +34 37 35 +17 38 36 +36 39 37 +17 40 38 +38 41 39 +17 42 40 +40 43 41 +17 44 42 +42 45 43 +17 46 44 +44 47 45 +17 48 46 +46 49 47 +17 18 48 +48 19 49 +1 16 2 +2 16 3 +3 16 4 +4 16 5 +5 16 7 +7 16 8 +8 16 9 +9 16 10 +10 16 11 +11 16 12 +12 16 13 +13 16 14 +14 16 15 +20 21 18 +22 23 20 +24 25 22 +26 27 24 +28 29 26 +30 31 28 +32 33 30 +34 35 32 +36 37 34 +38 39 36 +40 41 38 +42 43 40 +44 45 42 +46 47 44 +48 49 46 +18 19 48 +MATERIALS 1 +mat1 +MATERIAL mat1 +1 1 1 1 +0.3 0.3 0.3 1 +0.2 0.2 0.2 1 20 +0 0 0 1 +TEXTURES 0 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9HSphere.msh b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9HSphere.msh new file mode 100644 index 0000000000..aec9d54aac --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9HSphere.msh @@ -0,0 +1,7697 @@ +MSHX1 +GROUPS 1 +LABEL Icosphere +MATERIAL 1 +TEXTURE 0 +FLAG 0 +GEOM 2562 5120 +0.0000 -10.0000 0.0000 0.0000 -1.0000 0.0000 +7.2361 -4.4722 -5.2573 0.7236 -0.4472 -0.5257 +-2.7639 -4.4722 -8.5065 -0.2764 -0.4472 -0.8506 +-8.9443 -4.4722 0.0000 -0.8944 -0.4472 0.0000 +-2.7639 -4.4722 8.5065 -0.2764 -0.4472 0.8506 +7.2361 -4.4722 5.2573 0.7236 -0.4472 0.5257 +2.7639 4.4722 -8.5065 0.2764 0.4472 -0.8506 +-7.2361 4.4722 -5.2573 -0.7236 0.4472 -0.5257 +-7.2361 4.4722 5.2573 -0.7236 0.4472 0.5257 +2.7639 4.4722 8.5065 0.2764 0.4472 0.8506 +8.9443 4.4722 0.0000 0.8944 0.4472 0.0000 +0.0000 10.0000 0.0000 0.0000 1.0000 0.0000 +-2.6794 -4.9817 -8.2464 -0.2678 -0.4986 -0.8244 +-2.5794 -5.5069 -7.9386 -0.2579 -0.5511 -0.7936 +-2.4626 -6.0408 -7.5792 -0.2462 -0.6044 -0.7577 +-2.3282 -6.5752 -7.1656 -0.2327 -0.6578 -0.7163 +-2.1761 -7.0999 -6.6974 -0.2175 -0.7102 -0.6695 +-2.0069 -7.6040 -6.1767 -0.2006 -0.7605 -0.6175 +-1.8222 -8.0763 -5.6082 -0.1822 -0.8077 -0.5607 +-1.6246 -8.5065 -5.0000 -0.1625 -0.8506 -0.5000 +-1.4173 -8.8862 -4.3620 -0.1417 -0.8886 -0.4363 +-1.2041 -9.2095 -3.7060 -0.1205 -0.9209 -0.3707 +-0.9891 -9.4739 -3.0443 -0.0990 -0.9473 -0.3046 +-0.7761 -9.6795 -2.3885 -0.0777 -0.9679 -0.2391 +-0.5683 -9.8294 -1.7490 -0.0569 -0.9828 -0.1753 +-0.3685 -9.9286 -1.1341 -0.0370 -0.9928 -0.1138 +-0.1786 -9.9833 -0.5498 -0.0180 -0.9983 -0.0555 +0.4677 -9.9833 -0.3398 0.0472 -0.9983 -0.0343 +0.9647 -9.9286 -0.7009 0.0968 -0.9928 -0.0703 +1.4878 -9.8294 -1.0810 0.1491 -0.9828 -0.1083 +2.0318 -9.6795 -1.4762 0.2034 -0.9679 -0.1478 +2.5896 -9.4739 -1.8814 0.2591 -0.9473 -0.1883 +3.1525 -9.2095 -2.2904 0.3153 -0.9209 -0.2291 +3.7105 -8.8862 -2.6958 0.3711 -0.8886 -0.2696 +4.2532 -8.5065 -3.0901 0.4253 -0.8506 -0.3090 +4.7707 -8.0763 -3.4661 0.4770 -0.8077 -0.3465 +5.2542 -7.6040 -3.8174 0.5253 -0.7605 -0.3816 +5.6972 -7.0999 -4.1392 0.5696 -0.7102 -0.4138 +6.0955 -6.5752 -4.4286 0.6094 -0.6578 -0.4427 +6.4473 -6.0408 -4.6842 0.6445 -0.6044 -0.4682 +6.7530 -5.5069 -4.9063 0.6751 -0.5511 -0.4905 +7.0148 -4.9817 -5.0965 0.7013 -0.4986 -0.5095 +6.8362 -4.6245 -5.6463 0.6832 -0.4626 -0.5650 +6.3845 -4.7699 -6.0404 0.6381 -0.4771 -0.6043 +5.8790 -4.9042 -6.4332 0.5876 -0.4905 -0.6435 +5.3194 -5.0230 -6.8171 0.5317 -0.5023 -0.6819 +4.7081 -5.1216 -7.1835 0.4706 -0.5122 -0.7185 +4.0501 -5.1957 -7.5234 0.4048 -0.5196 -0.7524 +3.3534 -5.2418 -7.8281 0.3352 -0.5242 -0.7828 +2.6287 -5.2574 -8.0901 0.2629 -0.5257 -0.8090 +1.8883 -5.2418 -8.3041 0.1889 -0.5242 -0.8304 +1.1456 -5.1957 -8.4671 0.1147 -0.5196 -0.8467 +0.4135 -5.1216 -8.5789 0.0416 -0.5122 -0.8578 +-0.2964 -5.0230 -8.6418 -0.0293 -0.5023 -0.8642 +-0.9748 -4.9042 -8.6602 -0.0970 -0.4905 -0.8660 +-1.6147 -4.7699 -8.6395 -0.1610 -0.4771 -0.8640 +-2.2117 -4.6245 -8.5862 -0.2206 -0.4626 -0.8587 +7.4825 -4.6245 4.7567 0.7484 -0.4626 0.4752 +7.7177 -4.7699 4.2054 0.7719 -0.4771 0.4201 +7.9351 -4.9042 3.6032 0.7936 -0.4905 0.3599 +8.1273 -5.0230 2.9524 0.8128 -0.5023 0.2949 +8.2868 -5.1216 2.2578 0.8287 -0.5122 0.2255 +8.4067 -5.1957 1.5269 0.8407 -0.5196 0.1525 +8.4812 -5.2417 0.7702 0.8481 -0.5242 0.0769 +8.5065 -5.2574 -0.0000 0.8506 -0.5257 0.0000 +8.4812 -5.2417 -0.7702 0.8481 -0.5242 -0.0769 +8.4067 -5.1957 -1.5269 0.8407 -0.5196 -0.1525 +8.2868 -5.1216 -2.2578 0.8287 -0.5122 -0.2255 +8.1273 -5.0230 -2.9524 0.8128 -0.5023 -0.2949 +7.9351 -4.9042 -3.6032 0.7936 -0.4905 -0.3599 +7.7177 -4.7699 -4.2054 0.7719 -0.4771 -0.4201 +7.4825 -4.6245 -4.7567 0.7484 -0.4626 -0.4752 +0.4677 -9.9833 0.3398 0.0472 -0.9983 0.0343 +0.9647 -9.9286 0.7009 0.0968 -0.9928 0.0703 +1.4878 -9.8294 1.0810 0.1491 -0.9828 0.1083 +2.0318 -9.6795 1.4762 0.2034 -0.9679 0.1478 +2.5896 -9.4739 1.8814 0.2591 -0.9473 0.1883 +3.1525 -9.2095 2.2904 0.3153 -0.9209 0.2291 +3.7105 -8.8862 2.6958 0.3711 -0.8886 0.2696 +4.2532 -8.5065 3.0901 0.4253 -0.8506 0.3090 +4.7707 -8.0763 3.4661 0.4770 -0.8077 0.3465 +5.2542 -7.6040 3.8174 0.5253 -0.7605 0.3816 +5.6972 -7.0999 4.1392 0.5696 -0.7102 0.4138 +6.0955 -6.5752 4.4286 0.6094 -0.6578 0.4427 +6.4473 -6.0408 4.6842 0.6445 -0.6044 0.4682 +6.7530 -5.5069 4.9063 0.6751 -0.5511 0.4905 +7.0148 -4.9817 5.0965 0.7013 -0.4986 0.5095 +-8.6708 -4.9817 0.0000 -0.8668 -0.4986 0.0000 +-8.3472 -5.5068 0.0000 -0.8344 -0.5511 0.0000 +-7.9693 -6.0408 0.0000 -0.7967 -0.6044 0.0000 +-7.5344 -6.5751 0.0000 -0.7532 -0.6577 0.0000 +-7.0421 -7.0999 0.0000 -0.7040 -0.7102 0.0000 +-6.4946 -7.6040 0.0000 -0.6493 -0.7605 0.0000 +-5.8969 -8.0763 0.0000 -0.5896 -0.8077 0.0000 +-5.2573 -8.5065 0.0000 -0.5257 -0.8506 0.0000 +-4.5865 -8.8862 0.0000 -0.4587 -0.8886 0.0000 +-3.8967 -9.2095 0.0000 -0.3898 -0.9209 0.0000 +-3.2010 -9.4738 0.0000 -0.3203 -0.9473 0.0000 +-2.5115 -9.6795 0.0000 -0.2514 -0.9679 0.0000 +-1.8391 -9.8294 0.0000 -0.1843 -0.9828 0.0000 +-1.1925 -9.9286 0.0000 -0.1197 -0.9928 0.0000 +-0.5781 -9.9833 0.0000 -0.0583 -0.9983 0.0000 +-3.2574 -4.6245 -8.2464 -0.3262 -0.4626 -0.8244 +-3.7718 -4.7699 -7.9386 -0.3775 -0.4771 -0.7936 +-4.3017 -4.9042 -7.5792 -0.4305 -0.4905 -0.7577 +-4.8397 -5.0230 -7.1656 -0.4842 -0.5023 -0.7163 +-5.3771 -5.1216 -6.6975 -0.5379 -0.5122 -0.6695 +-5.9037 -5.1957 -6.1767 -0.5905 -0.5196 -0.6175 +-6.4087 -5.2417 -5.6083 -0.6409 -0.5242 -0.5607 +-6.8819 -5.2574 -5.0000 -0.6882 -0.5257 -0.5000 +-7.3142 -5.2417 -4.3620 -0.7313 -0.5242 -0.4363 +-7.6987 -5.1957 -3.7060 -0.7698 -0.5196 -0.3707 +-8.0313 -5.1216 -3.0443 -0.8030 -0.5122 -0.3046 +-8.3105 -5.0230 -2.3885 -0.8309 -0.5023 -0.2391 +-8.5376 -4.9042 -1.7490 -0.8536 -0.4905 -0.1753 +-8.7156 -4.7698 -1.1341 -0.8714 -0.4771 -0.1138 +-8.8494 -4.6245 -0.5498 -0.8848 -0.4626 -0.0555 +-2.6794 -4.9817 8.2464 -0.2678 -0.4986 0.8244 +-2.5794 -5.5069 7.9386 -0.2579 -0.5511 0.7936 +-2.4626 -6.0408 7.5792 -0.2462 -0.6044 0.7577 +-2.3282 -6.5752 7.1656 -0.2327 -0.6578 0.7163 +-2.1761 -7.0999 6.6974 -0.2175 -0.7102 0.6695 +-2.0069 -7.6040 6.1767 -0.2006 -0.7605 0.6175 +-1.8222 -8.0763 5.6082 -0.1822 -0.8077 0.5607 +-1.6246 -8.5065 5.0000 -0.1625 -0.8506 0.5000 +-1.4173 -8.8862 4.3620 -0.1417 -0.8886 0.4363 +-1.2041 -9.2095 3.7060 -0.1205 -0.9209 0.3707 +-0.9891 -9.4739 3.0443 -0.0990 -0.9473 0.3046 +-0.7761 -9.6795 2.3885 -0.0777 -0.9679 0.2391 +-0.5683 -9.8294 1.7490 -0.0569 -0.9828 0.1753 +-0.3685 -9.9286 1.1341 -0.0370 -0.9928 0.1138 +-0.1786 -9.9833 0.5498 -0.0180 -0.9983 0.0555 +-8.8494 -4.6245 0.5498 -0.8848 -0.4626 0.0555 +-8.7156 -4.7698 1.1341 -0.8714 -0.4771 0.1138 +-8.5376 -4.9042 1.7490 -0.8536 -0.4905 0.1753 +-8.3105 -5.0230 2.3885 -0.8309 -0.5023 0.2391 +-8.0313 -5.1216 3.0443 -0.8030 -0.5122 0.3046 +-7.6987 -5.1957 3.7060 -0.7698 -0.5196 0.3707 +-7.3142 -5.2417 4.3620 -0.7313 -0.5242 0.4363 +-6.8819 -5.2574 5.0000 -0.6882 -0.5257 0.5000 +-6.4087 -5.2417 5.6083 -0.6409 -0.5242 0.5607 +-5.9037 -5.1957 6.1767 -0.5905 -0.5196 0.6175 +-5.3771 -5.1216 6.6975 -0.5379 -0.5122 0.6695 +-4.8397 -5.0230 7.1656 -0.4842 -0.5023 0.7163 +-4.3017 -4.9042 7.5792 -0.4305 -0.4905 0.7577 +-3.7718 -4.7699 7.9386 -0.3775 -0.4771 0.7936 +-3.2574 -4.6245 8.2464 -0.3262 -0.4626 0.8244 +-2.2117 -4.6245 8.5862 -0.2206 -0.4626 0.8587 +-1.6147 -4.7699 8.6395 -0.1610 -0.4771 0.8639 +-0.9748 -4.9042 8.6602 -0.0970 -0.4905 0.8660 +-0.2964 -5.0230 8.6418 -0.0293 -0.5023 0.8642 +0.4135 -5.1216 8.5789 0.0416 -0.5122 0.8578 +1.1456 -5.1957 8.4671 0.1147 -0.5196 0.8467 +1.8883 -5.2418 8.3041 0.1889 -0.5242 0.8304 +2.6287 -5.2574 8.0901 0.2629 -0.5257 0.8090 +3.3534 -5.2418 7.8281 0.3352 -0.5242 0.7828 +4.0501 -5.1957 7.5234 0.4048 -0.5196 0.7524 +4.7081 -5.1216 7.1835 0.4706 -0.5122 0.7185 +5.3194 -5.0230 6.8171 0.5317 -0.5023 0.6819 +5.8790 -4.9042 6.4332 0.5876 -0.4905 0.6435 +6.3845 -4.7699 6.0404 0.6381 -0.4771 0.6043 +6.8362 -4.6245 5.6463 0.6832 -0.4626 0.5650 +9.1384 4.0464 -0.3398 0.9140 0.4042 -0.0343 +9.3119 3.5774 -0.7009 0.9313 0.3574 -0.0703 +9.4571 3.0651 -1.0810 0.9458 0.3062 -0.1083 +9.5663 2.5115 -1.4762 0.9567 0.2509 -0.1478 +9.6318 1.9206 -1.8815 0.9632 0.1918 -0.1883 +9.6471 1.2989 -2.2904 0.9647 0.1297 -0.2291 +9.6075 0.6552 -2.6958 0.9607 0.0654 -0.2696 +9.5106 -0.0000 -3.0901 0.9510 0.0000 -0.3090 +9.3572 -0.6552 -3.4661 0.9357 -0.0654 -0.3465 +9.1510 -1.2989 -3.8174 0.9151 -0.1297 -0.3816 +8.8982 -1.9206 -4.1392 0.8899 -0.1918 -0.4138 +8.6070 -2.5115 -4.4286 0.8608 -0.2509 -0.4427 +8.2863 -3.0651 -4.6842 0.8288 -0.3062 -0.4682 +7.9455 -3.5774 -4.9063 0.7948 -0.3574 -0.4905 +7.5929 -4.0464 -5.0965 0.7596 -0.4042 -0.5095 +7.5929 -4.0464 5.0965 0.7596 -0.4042 0.5095 +7.9455 -3.5774 4.9063 0.7948 -0.3574 0.4905 +8.2863 -3.0651 4.6842 0.8288 -0.3062 0.4682 +8.6070 -2.5115 4.4286 0.8608 -0.2509 0.4427 +8.8982 -1.9206 4.1392 0.8899 -0.1918 0.4138 +9.1510 -1.2989 3.8174 0.9151 -0.1297 0.3816 +9.3572 -0.6552 3.4661 0.9357 -0.0654 0.3465 +9.5106 0.0000 3.0901 0.9510 0.0000 0.3090 +9.6075 0.6552 2.6958 0.9607 0.0654 0.2696 +9.6471 1.2989 2.2904 0.9647 0.1297 0.2291 +9.6318 1.9206 1.8815 0.9632 0.1918 0.1883 +9.5663 2.5115 1.4762 0.9567 0.2509 0.1478 +9.4571 3.0651 1.0810 0.9458 0.3062 0.1083 +9.3119 3.5774 0.7009 0.9313 0.3574 0.0703 +9.1384 4.0464 0.3398 0.9140 0.4042 0.0343 +2.5008 4.0464 -8.7962 0.2498 0.4042 -0.8798 +2.2109 3.5774 -9.0727 0.2209 0.3574 -0.9075 +1.8943 3.0651 -9.3283 0.1892 0.3062 -0.9330 +1.5522 2.5115 -9.5542 0.1550 0.2509 -0.9555 +1.1870 1.9206 -9.7418 0.1186 0.1918 -0.9742 +0.8028 1.2989 -9.8827 0.0802 0.1297 -0.9883 +0.4049 0.6552 -9.9703 0.0404 0.0654 -0.9970 +0.0000 -0.0000 -10.0000 0.0000 0.0000 -1.0000 +-0.4049 -0.6552 -9.9703 -0.0404 -0.0654 -0.9970 +-0.8028 -1.2989 -9.8827 -0.0802 -0.1297 -0.9883 +-1.1870 -1.9206 -9.7418 -0.1186 -0.1918 -0.9742 +-1.5522 -2.5115 -9.5542 -0.1550 -0.2509 -0.9555 +-1.8943 -3.0651 -9.3283 -0.1892 -0.3062 -0.9330 +-2.2109 -3.5774 -9.0727 -0.2209 -0.3574 -0.9075 +-2.5008 -4.0464 -8.7962 -0.2498 -0.4042 -0.8798 +7.1935 -4.0464 -5.6463 0.7193 -0.4042 -0.5650 +7.1215 -3.5774 -6.0404 0.7121 -0.3574 -0.6043 +7.0156 -3.0652 -6.4332 0.7015 -0.3062 -0.6435 +6.8716 -2.5115 -6.8172 0.6871 -0.2509 -0.6819 +6.6864 -1.9206 -7.1836 0.6685 -0.1918 -0.7185 +6.4584 -1.2989 -7.5234 0.6458 -0.1297 -0.7524 +6.1880 -0.6552 -7.8281 0.6188 -0.0654 -0.7828 +5.8779 0.0000 -8.0902 0.5878 0.0000 -0.8090 +5.5328 0.6552 -8.3042 0.5533 0.0654 -0.8304 +5.1595 1.2989 -8.4672 0.5160 0.1297 -0.8467 +4.7658 1.9206 -8.5790 0.4767 0.1918 -0.8578 +4.3601 2.5115 -8.6419 0.4362 0.2509 -0.8642 +3.9504 3.0652 -8.6602 0.3953 0.3062 -0.8660 +3.5441 3.5774 -8.6395 0.3547 0.3574 -0.8640 +3.1470 4.0464 -8.5862 0.3150 0.4042 -0.8587 +-7.5929 4.0464 -5.0965 -0.7596 0.4042 -0.5095 +-7.9455 3.5774 -4.9063 -0.7948 0.3574 -0.4905 +-8.2863 3.0651 -4.6842 -0.8288 0.3062 -0.4682 +-8.6070 2.5115 -4.4286 -0.8608 0.2509 -0.4427 +-8.8982 1.9206 -4.1392 -0.8899 0.1918 -0.4138 +-9.1510 1.2989 -3.8174 -0.9151 0.1297 -0.3816 +-9.3572 0.6552 -3.4661 -0.9357 0.0654 -0.3465 +-9.5106 -0.0000 -3.0901 -0.9510 0.0000 -0.3090 +-9.6075 -0.6552 -2.6958 -0.9607 -0.0654 -0.2696 +-9.6471 -1.2989 -2.2904 -0.9647 -0.1297 -0.2291 +-9.6318 -1.9206 -1.8815 -0.9632 -0.1918 -0.1883 +-9.5663 -2.5115 -1.4762 -0.9567 -0.2509 -0.1478 +-9.4571 -3.0651 -1.0810 -0.9458 -0.3062 -0.1083 +-9.3119 -3.5774 -0.7009 -0.9313 -0.3574 -0.0703 +-9.1384 -4.0464 -0.3398 -0.9140 -0.4042 -0.0343 +-3.1470 -4.0464 -8.5862 -0.3150 -0.4042 -0.8587 +-3.5441 -3.5774 -8.6395 -0.3547 -0.3574 -0.8640 +-3.9504 -3.0652 -8.6602 -0.3953 -0.3062 -0.8660 +-4.3601 -2.5115 -8.6419 -0.4362 -0.2509 -0.8642 +-4.7658 -1.9206 -8.5790 -0.4767 -0.1918 -0.8578 +-5.1595 -1.2989 -8.4672 -0.5160 -0.1297 -0.8467 +-5.5328 -0.6552 -8.3042 -0.5533 -0.0654 -0.8304 +-5.8779 0.0000 -8.0902 -0.5878 0.0000 -0.8090 +-6.1880 0.6552 -7.8281 -0.6188 0.0654 -0.7828 +-6.4584 1.2989 -7.5234 -0.6458 0.1297 -0.7524 +-6.6864 1.9206 -7.1836 -0.6685 0.1918 -0.7185 +-6.8716 2.5115 -6.8172 -0.6871 0.2509 -0.6819 +-7.0156 3.0652 -6.4332 -0.7015 0.3062 -0.6435 +-7.1215 3.5774 -6.0404 -0.7121 0.3574 -0.6043 +-7.1935 4.0464 -5.6463 -0.7193 0.4042 -0.5650 +-7.1935 4.0464 5.6463 -0.7193 0.4042 0.5650 +-7.1215 3.5774 6.0404 -0.7121 0.3574 0.6043 +-7.0156 3.0652 6.4332 -0.7015 0.3062 0.6435 +-6.8716 2.5115 6.8172 -0.6871 0.2509 0.6819 +-6.6864 1.9206 7.1836 -0.6685 0.1918 0.7185 +-6.4584 1.2989 7.5234 -0.6458 0.1297 0.7524 +-6.1880 0.6552 7.8281 -0.6188 0.0654 0.7828 +-5.8779 -0.0000 8.0902 -0.5878 0.0000 0.8090 +-5.5328 -0.6552 8.3042 -0.5533 -0.0654 0.8304 +-5.1595 -1.2989 8.4672 -0.5160 -0.1297 0.8467 +-4.7658 -1.9206 8.5790 -0.4767 -0.1918 0.8578 +-4.3601 -2.5115 8.6419 -0.4362 -0.2509 0.8642 +-3.9504 -3.0652 8.6602 -0.3953 -0.3062 0.8660 +-3.5441 -3.5774 8.6395 -0.3547 -0.3574 0.8640 +-3.1470 -4.0464 8.5862 -0.3150 -0.4042 0.8587 +-9.1384 -4.0464 0.3398 -0.9140 -0.4042 0.0343 +-9.3119 -3.5774 0.7009 -0.9313 -0.3574 0.0703 +-9.4571 -3.0651 1.0810 -0.9458 -0.3062 0.1083 +-9.5663 -2.5115 1.4762 -0.9567 -0.2509 0.1478 +-9.6318 -1.9206 1.8815 -0.9632 -0.1918 0.1883 +-9.6471 -1.2989 2.2904 -0.9647 -0.1297 0.2291 +-9.6075 -0.6552 2.6958 -0.9607 -0.0654 0.2696 +-9.5106 0.0000 3.0901 -0.9510 0.0000 0.3090 +-9.3572 0.6552 3.4661 -0.9357 0.0654 0.3465 +-9.1510 1.2989 3.8174 -0.9151 0.1297 0.3816 +-8.8982 1.9206 4.1392 -0.8899 0.1918 0.4138 +-8.6070 2.5115 4.4286 -0.8608 0.2509 0.4427 +-8.2863 3.0651 4.6842 -0.8288 0.3062 0.4682 +-7.9455 3.5774 4.9063 -0.7948 0.3574 0.4905 +-7.5929 4.0464 5.0965 -0.7596 0.4042 0.5095 +3.1470 4.0464 8.5862 0.3150 0.4042 0.8587 +3.5441 3.5774 8.6395 0.3547 0.3574 0.8640 +3.9504 3.0652 8.6602 0.3953 0.3062 0.8660 +4.3601 2.5115 8.6419 0.4362 0.2509 0.8642 +4.7658 1.9206 8.5790 0.4767 0.1918 0.8578 +5.1595 1.2989 8.4672 0.5160 0.1297 0.8467 +5.5328 0.6552 8.3042 0.5533 0.0654 0.8304 +5.8779 -0.0000 8.0902 0.5878 0.0000 0.8090 +6.1880 -0.6552 7.8281 0.6188 -0.0654 0.7828 +6.4584 -1.2989 7.5234 0.6458 -0.1297 0.7524 +6.6864 -1.9206 7.1836 0.6685 -0.1918 0.7185 +6.8716 -2.5115 6.8172 0.6871 -0.2509 0.6819 +7.0156 -3.0652 6.4332 0.7015 -0.3062 0.6435 +7.1215 -3.5774 6.0404 0.7121 -0.3574 0.6043 +7.1935 -4.0464 5.6463 0.7193 -0.4042 0.5650 +-2.5008 -4.0464 8.7962 -0.2498 -0.4042 0.8798 +-2.2109 -3.5774 9.0727 -0.2209 -0.3574 0.9075 +-1.8943 -3.0651 9.3283 -0.1892 -0.3062 0.9330 +-1.5522 -2.5115 9.5542 -0.1550 -0.2509 0.9555 +-1.1870 -1.9206 9.7418 -0.1186 -0.1918 0.9742 +-0.8028 -1.2989 9.8827 -0.0802 -0.1297 0.9883 +-0.4049 -0.6552 9.9703 -0.0404 -0.0654 0.9970 +-0.0000 0.0000 10.0000 0.0000 0.0000 1.0000 +0.4049 0.6552 9.9703 0.0404 0.0654 0.9970 +0.8028 1.2989 9.8827 0.0802 0.1297 0.9883 +1.1870 1.9206 9.7418 0.1186 0.1918 0.9742 +1.5522 2.5115 9.5542 0.1550 0.2509 0.9555 +1.8943 3.0651 9.3283 0.1892 0.3062 0.9330 +2.2109 3.5774 9.0727 0.2209 0.3574 0.9075 +2.5008 4.0464 8.7962 0.2498 0.4042 0.8798 +8.8494 4.6245 -0.5498 0.8848 0.4626 -0.0555 +8.7156 4.7698 -1.1341 0.8714 0.4771 -0.1138 +8.5376 4.9042 -1.7490 0.8536 0.4905 -0.1753 +8.3105 5.0230 -2.3885 0.8309 0.5023 -0.2391 +8.0313 5.1216 -3.0443 0.8030 0.5122 -0.3046 +7.6987 5.1957 -3.7060 0.7698 0.5196 -0.3707 +7.3142 5.2417 -4.3620 0.7313 0.5242 -0.4363 +6.8819 5.2574 -5.0000 0.6882 0.5257 -0.5000 +6.4087 5.2417 -5.6083 0.6409 0.5242 -0.5607 +5.9037 5.1957 -6.1767 0.5905 0.5196 -0.6175 +5.3771 5.1216 -6.6975 0.5379 0.5122 -0.6695 +4.8397 5.0230 -7.1656 0.4842 0.5023 -0.7163 +4.3017 4.9042 -7.5792 0.4305 0.4905 -0.7577 +3.7718 4.7699 -7.9386 0.3775 0.4771 -0.7936 +3.2574 4.6245 -8.2464 0.3262 0.4626 -0.8244 +2.2117 4.6245 -8.5862 0.2206 0.4626 -0.8587 +1.6147 4.7699 -8.6395 0.1610 0.4771 -0.8640 +0.9748 4.9042 -8.6602 0.0970 0.4905 -0.8660 +0.2964 5.0230 -8.6418 0.0293 0.5023 -0.8642 +-0.4135 5.1216 -8.5789 -0.0416 0.5122 -0.8578 +-1.1456 5.1957 -8.4671 -0.1147 0.5196 -0.8467 +-1.8883 5.2418 -8.3041 -0.1889 0.5242 -0.8304 +-2.6287 5.2574 -8.0901 -0.2629 0.5257 -0.8090 +-3.3534 5.2418 -7.8281 -0.3352 0.5242 -0.7828 +-4.0501 5.1957 -7.5234 -0.4048 0.5196 -0.7524 +-4.7081 5.1216 -7.1835 -0.4706 0.5122 -0.7185 +-5.3194 5.0230 -6.8171 -0.5317 0.5023 -0.6819 +-5.8790 4.9042 -6.4332 -0.5876 0.4905 -0.6435 +-6.3845 4.7699 -6.0404 -0.6381 0.4771 -0.6043 +-6.8362 4.6245 -5.6463 -0.6832 0.4626 -0.5650 +-7.4825 4.6245 -4.7567 -0.7484 0.4626 -0.4752 +-7.7177 4.7699 -4.2054 -0.7719 0.4771 -0.4201 +-7.9351 4.9042 -3.6032 -0.7936 0.4905 -0.3599 +-8.1273 5.0230 -2.9524 -0.8128 0.5023 -0.2949 +-8.2868 5.1216 -2.2578 -0.8287 0.5122 -0.2255 +-8.4067 5.1957 -1.5269 -0.8407 0.5196 -0.1525 +-8.4812 5.2417 -0.7702 -0.8481 0.5242 -0.0769 +-8.5065 5.2574 0.0000 -0.8506 0.5257 0.0000 +-8.4812 5.2417 0.7702 -0.8481 0.5242 0.0769 +-8.4067 5.1957 1.5269 -0.8407 0.5196 0.1525 +-8.2868 5.1216 2.2578 -0.8287 0.5122 0.2255 +-8.1273 5.0230 2.9524 -0.8128 0.5023 0.2949 +-7.9351 4.9042 3.6032 -0.7936 0.4905 0.3599 +-7.7177 4.7699 4.2054 -0.7719 0.4771 0.4201 +-7.4825 4.6245 4.7567 -0.7484 0.4626 0.4752 +-6.8362 4.6245 5.6463 -0.6832 0.4626 0.5650 +-6.3845 4.7699 6.0404 -0.6381 0.4771 0.6043 +-5.8790 4.9042 6.4332 -0.5876 0.4905 0.6435 +-5.3194 5.0230 6.8171 -0.5317 0.5023 0.6819 +-4.7081 5.1216 7.1835 -0.4706 0.5122 0.7185 +-4.0501 5.1957 7.5234 -0.4048 0.5196 0.7524 +-3.3534 5.2418 7.8281 -0.3352 0.5242 0.7828 +-2.6287 5.2574 8.0901 -0.2629 0.5257 0.8090 +-1.8883 5.2418 8.3041 -0.1889 0.5242 0.8304 +-1.1456 5.1957 8.4671 -0.1147 0.5196 0.8467 +-0.4135 5.1216 8.5789 -0.0416 0.5122 0.8578 +0.2964 5.0230 8.6418 0.0293 0.5023 0.8642 +0.9748 4.9042 8.6602 0.0970 0.4905 0.8660 +1.6147 4.7699 8.6395 0.1610 0.4771 0.8640 +2.2117 4.6245 8.5862 0.2206 0.4626 0.8587 +3.2574 4.6245 8.2464 0.3262 0.4626 0.8244 +3.7718 4.7699 7.9386 0.3775 0.4771 0.7936 +4.3017 4.9042 7.5792 0.4305 0.4905 0.7577 +4.8397 5.0230 7.1656 0.4842 0.5023 0.7163 +5.3771 5.1216 6.6975 0.5379 0.5122 0.6695 +5.9037 5.1957 6.1767 0.5905 0.5196 0.6175 +6.4087 5.2417 5.6083 0.6409 0.5242 0.5607 +6.8819 5.2574 5.0000 0.6882 0.5257 0.5000 +7.3142 5.2417 4.3620 0.7313 0.5242 0.4363 +7.6987 5.1957 3.7060 0.7698 0.5196 0.3707 +8.0313 5.1216 3.0443 0.8030 0.5122 0.3046 +8.3105 5.0230 2.3885 0.8309 0.5023 0.2391 +8.5376 4.9042 1.7490 0.8536 0.4905 0.1753 +8.7156 4.7698 1.1341 0.8714 0.4771 0.1138 +8.8494 4.6245 0.5498 0.8848 0.4626 0.0555 +0.1786 9.9833 -0.5498 0.0180 0.9983 -0.0555 +0.3685 9.9287 -1.1341 0.0370 0.9928 -0.1138 +0.5683 9.8294 -1.7490 0.0569 0.9828 -0.1753 +0.7761 9.6795 -2.3885 0.0777 0.9679 -0.2391 +0.9891 9.4739 -3.0443 0.0990 0.9473 -0.3046 +1.2041 9.2095 -3.7060 0.1205 0.9209 -0.3707 +1.4173 8.8862 -4.3620 0.1417 0.8886 -0.4363 +1.6246 8.5065 -5.0000 0.1625 0.8506 -0.5000 +1.8222 8.0763 -5.6082 0.1822 0.8077 -0.5607 +2.0069 7.6040 -6.1767 0.2006 0.7605 -0.6175 +2.1761 7.0999 -6.6974 0.2175 0.7102 -0.6695 +2.3282 6.5752 -7.1656 0.2327 0.6578 -0.7163 +2.4626 6.0408 -7.5792 0.2462 0.6044 -0.7577 +2.5794 5.5069 -7.9386 0.2579 0.5511 -0.7936 +2.6794 4.9817 -8.2464 0.2678 0.4986 -0.8244 +8.6708 4.9817 0.0000 0.8668 0.4986 0.0000 +8.3472 5.5068 0.0000 0.8344 0.5511 0.0000 +7.9693 6.0408 0.0000 0.7967 0.6044 0.0000 +7.5344 6.5751 0.0000 0.7532 0.6577 0.0000 +7.0421 7.0999 0.0000 0.7040 0.7102 0.0000 +6.4946 7.6040 0.0000 0.6493 0.7605 0.0000 +5.8969 8.0763 0.0000 0.5896 0.8077 0.0000 +5.2573 8.5065 0.0000 0.5257 0.8506 0.0000 +4.5865 8.8862 0.0000 0.4587 0.8886 0.0000 +3.8967 9.2095 0.0000 0.3898 0.9209 0.0000 +3.2010 9.4738 0.0000 0.3203 0.9473 0.0000 +2.5115 9.6795 0.0000 0.2514 0.9679 0.0000 +1.8391 9.8294 0.0000 0.1843 0.9828 0.0000 +1.1925 9.9286 0.0000 0.1197 0.9928 0.0000 +0.5781 9.9833 0.0000 0.0583 0.9983 0.0000 +-0.4677 9.9833 -0.3398 -0.0472 0.9983 -0.0343 +-0.9647 9.9286 -0.7009 -0.0968 0.9928 -0.0703 +-1.4878 9.8294 -1.0810 -0.1491 0.9828 -0.1083 +-2.0318 9.6795 -1.4762 -0.2034 0.9679 -0.1478 +-2.5896 9.4739 -1.8814 -0.2591 0.9473 -0.1883 +-3.1525 9.2095 -2.2904 -0.3153 0.9209 -0.2291 +-3.7105 8.8862 -2.6958 -0.3711 0.8886 -0.2696 +-4.2532 8.5065 -3.0901 -0.4253 0.8506 -0.3090 +-4.7707 8.0763 -3.4661 -0.4770 0.8077 -0.3465 +-5.2542 7.6040 -3.8174 -0.5253 0.7605 -0.3816 +-5.6972 7.0999 -4.1392 -0.5696 0.7102 -0.4138 +-6.0955 6.5752 -4.4286 -0.6094 0.6578 -0.4427 +-6.4473 6.0408 -4.6842 -0.6445 0.6044 -0.4682 +-6.7530 5.5069 -4.9063 -0.6751 0.5511 -0.4905 +-7.0148 4.9817 -5.0965 -0.7013 0.4986 -0.5095 +-0.4677 9.9833 0.3398 -0.0472 0.9983 0.0343 +-0.9647 9.9286 0.7009 -0.0968 0.9928 0.0703 +-1.4878 9.8294 1.0810 -0.1491 0.9828 0.1083 +-2.0318 9.6795 1.4762 -0.2034 0.9679 0.1478 +-2.5896 9.4739 1.8814 -0.2591 0.9473 0.1883 +-3.1525 9.2095 2.2904 -0.3153 0.9209 0.2291 +-3.7105 8.8862 2.6958 -0.3711 0.8886 0.2696 +-4.2532 8.5065 3.0901 -0.4253 0.8506 0.3090 +-4.7707 8.0763 3.4661 -0.4770 0.8077 0.3465 +-5.2542 7.6040 3.8174 -0.5253 0.7605 0.3816 +-5.6972 7.0999 4.1392 -0.5696 0.7102 0.4138 +-6.0955 6.5752 4.4286 -0.6094 0.6578 0.4427 +-6.4473 6.0408 4.6842 -0.6445 0.6044 0.4682 +-6.7530 5.5069 4.9063 -0.6751 0.5511 0.4905 +-7.0148 4.9817 5.0965 -0.7013 0.4986 0.5095 +0.1786 9.9833 0.5498 0.0180 0.9983 0.0555 +0.3685 9.9287 1.1341 0.0370 0.9928 0.1138 +0.5683 9.8294 1.7490 0.0569 0.9828 0.1753 +0.7761 9.6795 2.3885 0.0777 0.9679 0.2391 +0.9891 9.4739 3.0443 0.0990 0.9473 0.3046 +1.2041 9.2095 3.7060 0.1205 0.9209 0.3707 +1.4173 8.8862 4.3620 0.1417 0.8886 0.4363 +1.6246 8.5065 5.0000 0.1625 0.8506 0.5000 +1.8222 8.0763 5.6082 0.1822 0.8077 0.5607 +2.0069 7.6040 6.1767 0.2006 0.7605 0.6175 +2.1761 7.0999 6.6974 0.2175 0.7102 0.6695 +2.3282 6.5752 7.1656 0.2327 0.6578 0.7163 +2.4626 6.0408 7.5792 0.2462 0.6044 0.7577 +2.5794 5.5069 7.9386 0.2579 0.5511 0.7936 +2.6794 4.9817 8.2464 0.2678 0.4986 0.8244 +0.7824 9.9531 0.5684 0.0792 0.9952 0.0575 +1.4229 9.8809 0.5861 0.1432 0.9879 0.0593 +0.9971 9.8809 1.1721 0.1007 0.9879 0.1178 +2.0948 9.7596 0.6021 0.2103 0.9757 0.0610 +1.6620 9.7867 1.2075 0.1671 0.9784 0.1214 +1.2199 9.7596 1.8062 0.1230 0.9757 0.1811 +2.7904 9.5830 0.6159 0.2797 0.9580 0.0624 +2.3566 9.6391 1.2389 0.2364 0.9636 0.1245 +1.9065 9.6391 1.8584 0.1915 0.9636 0.1863 +1.4480 9.5830 2.4635 0.1458 0.9580 0.2467 +3.4993 9.3467 0.6269 0.3504 0.9344 0.0635 +3.0717 9.4321 1.2652 0.3077 0.9429 0.1272 +2.6201 9.4611 1.9036 0.2627 0.9458 0.1909 +2.1524 9.4321 2.5304 0.2161 0.9429 0.2534 +1.6775 9.3468 3.1343 0.1687 0.9344 0.3136 +4.2093 9.0487 0.6345 0.4212 0.9047 0.0643 +3.7953 9.1621 1.2850 0.3799 0.9159 0.1292 +3.3497 9.2205 1.9397 0.3355 0.9217 0.1945 +2.8799 9.2205 2.5863 0.2886 0.9217 0.2589 +2.3949 9.1621 3.2124 0.2403 0.9159 0.3214 +1.9042 9.0487 3.8072 0.1913 0.9047 0.3807 +4.9068 8.6900 0.6385 0.4907 0.8689 0.0647 +4.5137 8.8285 1.2973 0.4515 0.8827 0.1304 +4.0820 8.9149 1.9650 0.4085 0.8912 0.1970 +3.6180 8.9443 2.6286 0.3622 0.8941 0.2632 +3.1302 8.9149 3.2750 0.3136 0.8912 0.3276 +2.6286 8.8286 3.8919 0.2636 0.8827 0.3891 +2.1235 8.6900 4.4693 0.2132 0.8689 0.4467 +5.5781 8.2751 0.6385 0.5577 0.8275 0.0647 +5.2126 8.4342 1.3015 0.5212 0.8433 0.1309 +4.8023 8.5455 1.9780 0.4803 0.8544 0.1983 +4.3523 8.6028 2.6550 0.4354 0.8601 0.2658 +3.8700 8.6028 3.3188 0.3873 0.8601 0.3319 +3.3652 8.5455 3.9560 0.3370 0.8544 0.3955 +2.8485 8.4342 4.5552 0.2855 0.8433 0.4552 +2.3309 8.2751 5.1078 0.2339 0.8275 0.5104 +6.2109 7.8117 0.6345 0.6208 0.7813 0.0643 +5.8778 7.9855 1.2973 0.5875 0.7986 0.1304 +5.4956 8.1170 1.9780 0.5494 0.8117 0.1983 +5.0673 8.1991 2.6640 0.5067 0.8198 0.2667 +4.5990 8.2270 3.3414 0.4600 0.8226 0.3342 +4.0995 8.1991 3.9960 0.4102 0.8198 0.3995 +3.5794 8.1170 4.6154 0.3584 0.8117 0.4612 +3.0501 7.9855 5.1892 0.3056 0.7986 0.5184 +2.5227 7.8117 5.7108 0.2530 0.7813 0.5705 +6.7950 7.3099 0.6269 0.6791 0.7313 0.0635 +6.4975 7.4921 1.2850 0.6493 0.7494 0.1292 +6.1482 7.6380 1.9650 0.6144 0.7639 0.1970 +5.7481 7.7401 2.6550 0.5745 0.7741 0.2658 +5.3017 7.7928 3.3414 0.5300 0.7793 0.3342 +4.8161 7.7928 4.0097 0.4816 0.7793 0.4008 +4.3014 7.7402 4.6463 0.4303 0.7741 0.4643 +3.7687 7.6380 5.2400 0.3772 0.7639 0.5235 +3.2299 7.4921 5.7824 0.3235 0.7494 0.5776 +2.6959 7.3100 6.2687 0.2703 0.7313 0.6262 +7.3234 6.7815 0.6159 0.7318 0.6786 0.0624 +7.0626 6.9656 1.2652 0.7057 0.6970 0.1272 +6.7490 7.1196 1.9397 0.6744 0.7123 0.1945 +6.3819 7.2361 2.6286 0.6377 0.7239 0.2632 +5.9638 7.3088 3.3188 0.5960 0.7311 0.3319 +5.5001 7.3335 3.9960 0.5498 0.7335 0.3995 +4.9993 7.3088 4.6463 0.4999 0.7311 0.4643 +4.4721 7.2361 5.2573 0.4474 0.7239 0.5252 +3.9303 7.1196 5.8192 0.3934 0.7123 0.5813 +3.3857 6.9656 6.3259 0.3391 0.6970 0.6319 +2.8487 6.7815 6.7746 0.2855 0.6786 0.6767 +7.7924 6.2383 0.6021 0.7787 0.6244 0.0610 +7.5675 6.4186 1.2390 0.7562 0.6424 0.1245 +7.2904 6.5746 1.9036 0.7284 0.6579 0.1909 +6.9591 6.6994 2.5863 0.6953 0.6704 0.2589 +6.5738 6.7867 3.2750 0.6569 0.6791 0.3276 +6.1383 6.8316 3.9560 0.6135 0.6836 0.3955 +5.6592 6.8316 4.6154 0.5657 0.6836 0.4612 +5.1461 6.7867 5.2400 0.5145 0.6791 0.5235 +4.6102 6.6995 5.8192 0.4611 0.6704 0.5813 +4.0633 6.5747 6.3454 0.4066 0.6579 0.6338 +3.5168 6.4186 6.8142 0.3521 0.6424 0.6806 +2.9805 6.2383 7.2249 0.2986 0.6244 0.7217 +8.2014 5.6916 0.5861 0.8196 0.5699 0.0593 +8.0102 5.8633 1.2075 0.8004 0.5870 0.1214 +7.7688 6.0160 1.8584 0.7762 0.6023 0.1863 +7.4737 6.1434 2.5304 0.7467 0.6149 0.2534 +7.1238 6.2395 3.2125 0.7118 0.6245 0.3214 +6.7209 6.2994 3.8919 0.6716 0.6305 0.3891 +6.2698 6.3198 4.5553 0.6266 0.6325 0.4552 +5.7783 6.2994 5.1893 0.5776 0.6305 0.5184 +5.2566 6.2396 5.7824 0.5256 0.6245 0.5776 +4.7160 6.1434 6.3259 0.4717 0.6149 0.6319 +4.1681 6.0161 6.8142 0.4171 0.6023 0.6806 +3.6237 5.8633 7.2450 0.3628 0.5870 0.7237 +3.0917 5.6916 7.6189 0.3097 0.5699 0.7611 +8.5524 5.1510 0.5684 0.8547 0.5159 0.0575 +8.3918 5.3107 1.1721 0.8386 0.5319 0.1178 +8.1836 5.4558 1.8062 0.8177 0.5464 0.1811 +7.9237 5.5808 2.4635 0.7917 0.5589 0.2467 +7.6097 5.6805 3.1344 0.7603 0.5688 0.3136 +7.2418 5.7499 3.8072 0.7236 0.5757 0.3807 +6.8228 5.7857 4.4693 0.6818 0.5793 0.4467 +6.3590 5.7857 5.1078 0.6355 0.5793 0.5104 +5.8587 5.7500 5.7108 0.5857 0.5757 0.5705 +5.3325 5.6805 6.2687 0.5332 0.5688 0.6262 +4.7915 5.5809 6.7746 0.4793 0.5589 0.6767 +4.2467 5.4558 7.2249 0.4249 0.5464 0.7217 +3.7079 5.3107 7.6189 0.3712 0.5319 0.7611 +3.1834 5.1510 7.9582 0.3188 0.5159 0.7951 +-0.2988 9.9531 0.9197 -0.0302 0.9952 0.0931 +-0.1177 9.8809 1.5343 -0.0122 0.9879 0.1545 +-0.8067 9.8809 1.3105 -0.0809 0.9879 0.1322 +0.0747 9.7596 2.1783 0.0070 0.9757 0.2188 +-0.6348 9.7867 1.9538 -0.0638 0.9784 0.1964 +-1.3408 9.7596 1.7184 -0.1343 0.9757 0.1729 +0.2765 9.5830 2.8441 0.0270 0.9580 0.2853 +-0.4501 9.6391 2.6241 -0.0454 0.9636 0.2633 +-1.1783 9.6391 2.3875 -0.1180 0.9636 0.2397 +-1.8955 9.5830 2.1384 -0.1896 0.9580 0.2149 +0.4851 9.3468 3.5218 0.0478 0.9344 0.3529 +-0.2541 9.4321 3.3123 -0.0259 0.9429 0.3320 +-1.0008 9.4611 3.0801 -0.1003 0.9458 0.3088 +-1.7414 9.4321 2.8290 -0.1742 0.9429 0.2838 +-2.4626 9.3468 2.5640 -0.2461 0.9344 0.2574 +0.6972 9.0487 4.1994 0.0689 0.9047 0.4205 +-0.0493 9.1621 4.0066 -0.0055 0.9160 0.4012 +-0.8097 9.2205 3.7851 -0.0813 0.9217 0.3792 +-1.5698 9.2205 3.5381 -0.1571 0.9217 0.3545 +-2.3152 9.1621 3.2703 -0.2314 0.9160 0.3278 +-3.0324 9.0487 2.9875 -0.3029 0.9047 0.2996 +0.9090 8.6900 4.8639 0.0901 0.8689 0.4867 +0.1610 8.8286 4.6937 0.0154 0.8827 0.4697 +-0.6074 8.9149 4.4894 -0.0611 0.8912 0.4494 +-1.3820 8.9443 4.2532 -0.1383 0.8941 0.4258 +-2.1474 8.9149 3.9890 -0.2147 0.8912 0.3995 +-2.8892 8.8286 3.7026 -0.2886 0.8827 0.3709 +-3.5944 8.6900 3.4006 -0.3590 0.8689 0.3408 +1.1165 8.2751 5.5024 0.1108 0.8275 0.5504 +0.3729 8.4342 5.3596 0.0366 0.8433 0.5361 +-0.3972 8.5455 5.1785 -0.0402 0.8544 0.5181 +-1.1802 8.6028 4.9597 -0.1182 0.8601 0.4962 +-1.9605 8.6028 4.7062 -0.1960 0.8601 0.4710 +-2.7225 8.5455 4.4229 -0.2720 0.8544 0.4427 +-3.4521 8.4342 4.1168 -0.3447 0.8433 0.4122 +-4.1375 8.2751 3.7952 -0.4131 0.8275 0.3802 +1.3158 7.8117 6.1030 0.1306 0.7813 0.6103 +0.5825 7.9855 5.9910 0.0575 0.7986 0.5991 +-0.1830 8.1170 5.8378 -0.0188 0.8117 0.5838 +-0.9678 8.1991 5.6425 -0.0971 0.8198 0.5643 +-1.7567 8.2271 5.4064 -0.1757 0.8226 0.5408 +-2.5337 8.1991 5.1337 -0.2531 0.8198 0.5136 +-3.2834 8.1170 4.8304 -0.3279 0.8117 0.4834 +-3.9927 7.9855 4.5044 -0.3986 0.7986 0.4509 +-4.6517 7.8117 4.1640 -0.4644 0.7813 0.4169 +1.5035 7.3100 6.6561 0.1494 0.7313 0.6655 +0.7857 7.4921 6.5766 0.0778 0.7494 0.6575 +0.0310 7.6380 6.4544 0.0025 0.7639 0.6453 +-0.7489 7.7402 6.2872 -0.0753 0.7741 0.6286 +-1.5396 7.7928 6.0747 -0.1541 0.7793 0.6073 +-2.3252 7.7928 5.8195 -0.2323 0.7793 0.5819 +-3.0898 7.7402 5.5266 -0.3086 0.7741 0.5528 +-3.8190 7.6380 5.2035 -0.3813 0.7639 0.5206 +-4.5013 7.4921 4.8587 -0.4494 0.7494 0.4862 +-5.1288 7.3100 4.5011 -0.5120 0.7313 0.4505 +1.6773 6.7815 7.1553 0.1668 0.6786 0.7153 +0.9791 6.9656 7.1078 0.0971 0.6970 0.7105 +0.2407 7.1196 7.0180 0.0234 0.7123 0.7015 +-0.5279 7.2361 6.8818 -0.0532 0.7239 0.6879 +-1.3135 7.3088 6.6975 -0.1315 0.7311 0.6695 +-2.1009 7.3335 6.4657 -0.2100 0.7335 0.6463 +-2.8741 7.3088 6.1904 -0.2871 0.7311 0.6189 +-3.6180 7.2361 5.8778 -0.3612 0.7239 0.5878 +-4.3199 7.1196 5.5362 -0.4313 0.7123 0.5537 +-4.9701 6.9656 5.1748 -0.4962 0.6970 0.5177 +-5.5627 6.7815 4.8028 -0.5553 0.6786 0.4806 +1.8353 6.2383 7.5970 0.1826 0.6244 0.7594 +1.1601 6.4186 7.5799 0.1152 0.6424 0.7576 +0.4424 6.5747 7.5218 0.0435 0.6579 0.7518 +-0.3093 6.6995 7.4176 -0.0314 0.6704 0.7413 +-1.0833 6.7867 7.2641 -0.1086 0.6791 0.7260 +-1.8656 6.8317 7.0603 -0.1866 0.6836 0.7056 +-2.6407 6.8317 6.8085 -0.2638 0.6836 0.6805 +-3.3933 6.7867 6.5135 -0.3388 0.6791 0.6511 +-4.1098 6.6995 6.1828 -0.4103 0.6704 0.6182 +-4.7792 6.5747 5.8252 -0.4771 0.6579 0.5826 +-5.3940 6.4186 5.4503 -0.5385 0.6424 0.5452 +-5.9503 6.2383 5.0673 -0.5941 0.6244 0.5070 +1.9769 5.6916 7.9811 0.1968 0.5699 0.7978 +1.3268 5.8633 7.9913 0.1319 0.5870 0.7987 +0.6332 6.0161 7.9628 0.0626 0.6023 0.7958 +-0.0971 6.1434 7.8898 -0.0102 0.6149 0.7885 +-0.8539 6.2396 7.7678 -0.0857 0.6245 0.7762 +-1.6246 6.2994 7.5946 -0.1625 0.6305 0.7589 +-2.3949 6.3198 7.3705 -0.2393 0.6325 0.7366 +-3.1497 6.2994 7.0990 -0.3146 0.6305 0.7095 +-3.8751 6.2396 6.7861 -0.3869 0.6245 0.6784 +-4.5590 6.1434 6.4400 -0.4552 0.6149 0.6439 +-5.1927 6.0161 6.0698 -0.5184 0.6023 0.6070 +-5.7707 5.8633 5.6851 -0.5762 0.5870 0.5687 +-6.2906 5.6916 5.2947 -0.6282 0.5699 0.5297 +2.1022 5.1510 8.3095 0.2094 0.5159 0.8307 +1.4784 5.3107 8.3433 0.1470 0.5319 0.8339 +0.8110 5.4558 8.3412 0.0804 0.5464 0.8336 +0.1056 5.5809 8.2972 0.0100 0.5589 0.8292 +-0.6295 5.6805 8.2058 -0.0633 0.5688 0.8200 +-1.3831 5.7500 8.0638 -0.1385 0.5757 0.8058 +-2.1423 5.7857 7.8700 -0.2141 0.5793 0.7865 +-2.8928 5.7857 7.6261 -0.2890 0.5793 0.7621 +-3.6209 5.7500 7.3367 -0.3616 0.5757 0.7333 +-4.3141 5.6805 7.0086 -0.4308 0.5688 0.7006 +-4.9624 5.5809 6.6504 -0.4955 0.5589 0.6649 +-5.5590 5.4558 6.2714 -0.5551 0.5464 0.6272 +-6.1002 5.3107 5.8808 -0.6091 0.5319 0.5882 +-6.5850 5.1510 5.4868 -0.6576 0.5159 0.5489 +-0.9671 9.9531 0.0000 -0.0979 0.9952 0.0000 +-1.4956 9.8809 0.3622 -0.1507 0.9879 0.0361 +-1.4956 9.8809 -0.3622 -0.1507 0.9879 -0.0361 +-2.0486 9.7596 0.7442 -0.2060 0.9757 0.0742 +-2.0543 9.7867 -0.0000 -0.2065 0.9784 0.0000 +-2.0486 9.7596 -0.7442 -0.2060 0.9757 -0.0742 +-2.6195 9.5830 1.1419 -0.2629 0.9580 0.1139 +-2.6348 9.6391 0.3829 -0.2645 0.9636 0.0382 +-2.6348 9.6391 -0.3829 -0.2645 0.9636 -0.0382 +-2.6195 9.5830 -1.1419 -0.2629 0.9580 -0.1139 +-3.1995 9.3468 1.5497 -0.3208 0.9344 0.1545 +-3.2287 9.4321 0.7819 -0.3237 0.9429 0.0779 +-3.2386 9.4611 -0.0000 -0.3247 0.9458 0.0000 +-3.2287 9.4321 -0.7819 -0.3237 0.9429 -0.0779 +-3.1995 9.3468 -1.5497 -0.3208 0.9344 -0.1545 +-3.7784 9.0487 1.9608 -0.3786 0.9047 0.1955 +-3.8257 9.1621 1.1912 -0.3833 0.9159 0.1187 +-3.8501 9.2205 0.3996 -0.3857 0.9217 0.0398 +-3.8501 9.2205 -0.3996 -0.3857 0.9217 -0.0398 +-3.8257 9.1621 -1.1912 -0.3833 0.9159 -0.1187 +-3.7784 9.0487 -1.9608 -0.3786 0.9047 -0.1955 +-4.3450 8.6900 2.3676 -0.4351 0.8689 0.2361 +-4.4142 8.8285 1.6035 -0.4420 0.8827 0.1599 +-4.4574 8.9149 0.8096 -0.4463 0.8912 0.0807 +-4.4721 8.9443 0.0000 -0.4477 0.8941 0.0000 +-4.4574 8.9149 -0.8096 -0.4463 0.8912 -0.0807 +-4.4142 8.8285 -1.6035 -0.4420 0.8827 -0.1599 +-4.3450 8.6900 -2.3676 -0.4351 0.8689 -0.2361 +-4.8881 8.2751 2.7622 -0.4892 0.8275 0.2754 +-4.9820 8.4342 2.0109 -0.4986 0.8433 0.2004 +-5.0478 8.5455 1.2225 -0.5051 0.8544 0.1218 +-5.0817 8.6028 0.4102 -0.5085 0.8601 0.0409 +-5.0817 8.6028 -0.4102 -0.5085 0.8601 -0.0409 +-5.0478 8.5455 -1.2225 -0.5051 0.8544 -0.1218 +-4.9820 8.4342 -2.0109 -0.4986 0.8433 -0.2004 +-4.8881 8.2751 -2.7622 -0.4892 0.8275 -0.2754 +-5.3977 7.8117 3.1373 -0.5400 0.7813 0.3128 +-5.5178 7.9855 2.4053 -0.5520 0.7986 0.2398 +-5.6087 8.1170 1.6300 -0.5610 0.8117 0.1625 +-5.6654 8.1991 0.8232 -0.5667 0.8198 0.0820 +-5.6847 8.2270 -0.0000 -0.5686 0.8226 0.0000 +-5.6654 8.1991 -0.8232 -0.5667 0.8198 -0.0820 +-5.6087 8.1170 -1.6300 -0.5610 0.8117 -0.1625 +-5.5178 7.9855 -2.4053 -0.5520 0.7986 -0.2398 +-5.3977 7.8117 -3.1373 -0.5400 0.7813 -0.3128 +-5.8657 7.3100 3.4868 -0.5867 0.7313 0.3477 +-6.0119 7.4921 2.7795 -0.6013 0.7494 0.2771 +-6.1290 7.6380 2.0240 -0.6129 0.7639 0.2018 +-6.2109 7.7401 1.2307 -0.6211 0.7741 0.1227 +-6.2532 7.7928 0.4130 -0.6252 0.7793 0.0411 +-6.2532 7.7928 -0.4130 -0.6252 0.7793 -0.0411 +-6.2109 7.7401 -1.2307 -0.6211 0.7741 -0.1227 +-6.1290 7.6380 -2.0240 -0.6129 0.7639 -0.2018 +-6.0119 7.4921 -2.7795 -0.6013 0.7494 -0.2771 +-5.8657 7.3100 -3.4868 -0.5867 0.7313 -0.3477 +-6.2867 6.7815 3.8063 -0.6287 0.6786 0.3797 +-6.4574 6.9656 3.1277 -0.6457 0.6970 0.3119 +-6.6002 7.1196 2.3976 -0.6599 0.7123 0.2390 +-6.7082 7.2361 1.6246 -0.6706 0.7239 0.1619 +-6.7756 7.3088 0.8204 -0.6773 0.7311 0.0818 +-6.7985 7.3335 -0.0000 -0.6796 0.7335 0.0000 +-6.7756 7.3088 -0.8204 -0.6773 0.7311 -0.0818 +-6.7082 7.2361 -1.6246 -0.6706 0.7239 -0.1619 +-6.6002 7.1196 -2.3976 -0.6599 0.7123 -0.2390 +-6.4574 6.9656 -3.1277 -0.6457 0.6970 -0.3119 +-6.2867 6.7815 -3.8063 -0.6287 0.6786 -0.3797 +-6.6581 6.2383 4.0931 -0.6658 0.6244 0.4083 +-6.8505 6.4186 3.4457 -0.6850 0.6424 0.3437 +-7.0170 6.5746 2.7451 -0.7015 0.6579 0.2737 +-7.1502 6.6994 1.9980 -0.7147 0.6704 0.1992 +-7.2433 6.7867 1.2144 -0.7240 0.6791 0.1210 +-7.2913 6.8316 0.4075 -0.7288 0.6836 0.0406 +-7.2913 6.8316 -0.4075 -0.7288 0.6836 -0.0406 +-7.2433 6.7867 -1.2144 -0.7240 0.6791 -0.1210 +-7.1502 6.6994 -1.9980 -0.7147 0.6704 -0.1992 +-7.0170 6.5746 -2.7451 -0.7015 0.6579 -0.2737 +-6.8505 6.4186 -3.4457 -0.6850 0.6424 -0.3437 +-6.6581 6.2383 -4.0931 -0.6658 0.6244 -0.4083 +-6.9795 5.6916 4.3465 -0.6979 0.5699 0.4337 +-7.1902 5.8633 3.7314 -0.7189 0.5870 0.3722 +-7.3774 6.0160 3.0628 -0.7375 0.6023 0.3055 +-7.5336 6.1434 2.3458 -0.7530 0.6149 0.2339 +-7.6515 6.2395 1.5883 -0.7647 0.6245 0.1584 +-7.7249 6.2994 0.8018 -0.7720 0.6305 0.0799 +-7.7499 6.3198 -0.0000 -0.7745 0.6325 0.0000 +-7.7249 6.2994 -0.8018 -0.7720 0.6305 -0.0799 +-7.6515 6.2395 -1.5883 -0.7647 0.6245 -0.1584 +-7.5336 6.1434 -2.3458 -0.7530 0.6149 -0.2339 +-7.3774 6.0160 -3.0628 -0.7375 0.6023 -0.3055 +-7.1902 5.8633 -3.7314 -0.7189 0.5870 -0.3722 +-6.9795 5.6916 -4.3465 -0.6979 0.5699 -0.4337 +-7.2532 5.1510 4.5671 -0.7253 0.5159 0.4558 +-7.4781 5.3107 3.9843 -0.7477 0.5319 0.3976 +-7.6824 5.4558 3.3489 -0.7680 0.5464 0.3341 +-7.8584 5.5809 2.6644 -0.7855 0.5589 0.2658 +-7.9987 5.6805 1.9371 -0.7994 0.5688 0.1932 +-8.0965 5.7500 1.1765 -0.8092 0.5757 0.1173 +-8.1468 5.7857 0.3946 -0.8141 0.5793 0.0393 +-8.1468 5.7857 -0.3946 -0.8141 0.5793 -0.0393 +-8.0965 5.7500 -1.1765 -0.8092 0.5757 -0.1173 +-7.9987 5.6805 -1.9371 -0.7994 0.5688 -0.1932 +-7.8584 5.5809 -2.6644 -0.7855 0.5589 -0.2658 +-7.6824 5.4558 -3.3489 -0.7680 0.5464 -0.3341 +-7.4781 5.3107 -3.9843 -0.7477 0.5319 -0.3976 +-7.2532 5.1510 -4.5671 -0.7253 0.5159 -0.4558 +-0.2988 9.9531 -0.9197 -0.0302 0.9952 -0.0931 +-0.8067 9.8809 -1.3105 -0.0809 0.9879 -0.1322 +-0.1177 9.8809 -1.5343 -0.0122 0.9879 -0.1545 +-1.3408 9.7596 -1.7184 -0.1343 0.9757 -0.1729 +-0.6348 9.7867 -1.9538 -0.0638 0.9784 -0.1964 +0.0747 9.7596 -2.1783 0.0070 0.9757 -0.2188 +-1.8955 9.5830 -2.1384 -0.1896 0.9580 -0.2149 +-1.1783 9.6391 -2.3875 -0.1180 0.9636 -0.2397 +-0.4501 9.6391 -2.6241 -0.0454 0.9636 -0.2633 +0.2765 9.5830 -2.8441 0.0270 0.9580 -0.2853 +-2.4626 9.3468 -2.5640 -0.2461 0.9344 -0.2574 +-1.7414 9.4321 -2.8290 -0.1742 0.9429 -0.2838 +-1.0008 9.4611 -3.0801 -0.1003 0.9458 -0.3088 +-0.2541 9.4321 -3.3123 -0.0259 0.9429 -0.3320 +0.4851 9.3468 -3.5218 0.0478 0.9344 -0.3529 +-3.0324 9.0487 -2.9875 -0.3029 0.9047 -0.2996 +-2.3152 9.1621 -3.2703 -0.2314 0.9160 -0.3278 +-1.5698 9.2205 -3.5381 -0.1571 0.9217 -0.3545 +-0.8097 9.2205 -3.7851 -0.0813 0.9217 -0.3792 +-0.0493 9.1621 -4.0066 -0.0055 0.9160 -0.4012 +0.6972 9.0487 -4.1994 0.0689 0.9047 -0.4205 +-3.5944 8.6900 -3.4006 -0.3590 0.8689 -0.3408 +-2.8892 8.8286 -3.7026 -0.2886 0.8827 -0.3709 +-2.1474 8.9149 -3.9890 -0.2147 0.8912 -0.3995 +-1.3820 8.9443 -4.2532 -0.1383 0.8941 -0.4258 +-0.6074 8.9149 -4.4894 -0.0611 0.8912 -0.4494 +0.1610 8.8286 -4.6937 0.0154 0.8827 -0.4697 +0.9090 8.6900 -4.8639 0.0901 0.8689 -0.4867 +-4.1375 8.2751 -3.7952 -0.4131 0.8275 -0.3802 +-3.4521 8.4342 -4.1168 -0.3447 0.8433 -0.4122 +-2.7225 8.5455 -4.4229 -0.2720 0.8544 -0.4427 +-1.9605 8.6028 -4.7062 -0.1960 0.8601 -0.4710 +-1.1802 8.6028 -4.9597 -0.1182 0.8601 -0.4962 +-0.3972 8.5455 -5.1785 -0.0402 0.8544 -0.5181 +0.3729 8.4342 -5.3596 0.0366 0.8433 -0.5361 +1.1165 8.2751 -5.5024 0.1108 0.8275 -0.5504 +-4.6517 7.8117 -4.1640 -0.4644 0.7813 -0.4169 +-3.9927 7.9855 -4.5044 -0.3986 0.7986 -0.4509 +-3.2834 8.1170 -4.8304 -0.3279 0.8117 -0.4834 +-2.5337 8.1991 -5.1337 -0.2531 0.8198 -0.5136 +-1.7567 8.2271 -5.4064 -0.1757 0.8226 -0.5408 +-0.9678 8.1991 -5.6425 -0.0971 0.8198 -0.5643 +-0.1830 8.1170 -5.8378 -0.0188 0.8117 -0.5838 +0.5825 7.9855 -5.9910 0.0575 0.7986 -0.5991 +1.3158 7.8117 -6.1030 0.1306 0.7813 -0.6103 +-5.1288 7.3100 -4.5011 -0.5120 0.7313 -0.4505 +-4.5013 7.4921 -4.8587 -0.4494 0.7494 -0.4862 +-3.8190 7.6380 -5.2035 -0.3813 0.7639 -0.5206 +-3.0898 7.7402 -5.5266 -0.3086 0.7741 -0.5528 +-2.3252 7.7928 -5.8195 -0.2323 0.7793 -0.5819 +-1.5396 7.7928 -6.0747 -0.1541 0.7793 -0.6073 +-0.7489 7.7402 -6.2872 -0.0753 0.7741 -0.6286 +0.0310 7.6380 -6.4544 0.0025 0.7639 -0.6453 +0.7857 7.4921 -6.5766 0.0778 0.7494 -0.6575 +1.5035 7.3100 -6.6561 0.1494 0.7313 -0.6655 +-5.5627 6.7815 -4.8028 -0.5553 0.6786 -0.4806 +-4.9701 6.9656 -5.1748 -0.4962 0.6970 -0.5177 +-4.3199 7.1196 -5.5362 -0.4313 0.7123 -0.5537 +-3.6180 7.2361 -5.8778 -0.3612 0.7239 -0.5878 +-2.8741 7.3088 -6.1904 -0.2871 0.7311 -0.6189 +-2.1009 7.3335 -6.4657 -0.2100 0.7335 -0.6463 +-1.3135 7.3088 -6.6974 -0.1315 0.7311 -0.6695 +-0.5279 7.2361 -6.8818 -0.0532 0.7239 -0.6879 +0.2407 7.1196 -7.0180 0.0234 0.7123 -0.7015 +0.9791 6.9656 -7.1078 0.0971 0.6970 -0.7105 +1.6773 6.7815 -7.1553 0.1668 0.6786 -0.7153 +-5.9503 6.2383 -5.0673 -0.5941 0.6244 -0.5070 +-5.3940 6.4186 -5.4503 -0.5385 0.6424 -0.5452 +-4.7792 6.5747 -5.8252 -0.4771 0.6579 -0.5826 +-4.1098 6.6995 -6.1828 -0.4103 0.6704 -0.6182 +-3.3933 6.7867 -6.5135 -0.3388 0.6791 -0.6511 +-2.6407 6.8317 -6.8085 -0.2638 0.6836 -0.6805 +-1.8656 6.8317 -7.0603 -0.1866 0.6836 -0.7056 +-1.0833 6.7867 -7.2641 -0.1086 0.6791 -0.7260 +-0.3093 6.6995 -7.4176 -0.0314 0.6704 -0.7413 +0.4424 6.5747 -7.5218 0.0435 0.6579 -0.7518 +1.1601 6.4186 -7.5799 0.1152 0.6424 -0.7576 +1.8353 6.2383 -7.5970 0.1826 0.6244 -0.7594 +-6.2906 5.6916 -5.2947 -0.6282 0.5699 -0.5297 +-5.7707 5.8633 -5.6851 -0.5762 0.5870 -0.5687 +-5.1927 6.0161 -6.0698 -0.5184 0.6023 -0.6070 +-4.5590 6.1434 -6.4400 -0.4552 0.6149 -0.6439 +-3.8751 6.2396 -6.7861 -0.3869 0.6245 -0.6784 +-3.1497 6.2994 -7.0990 -0.3146 0.6305 -0.7095 +-2.3949 6.3198 -7.3705 -0.2393 0.6325 -0.7366 +-1.6246 6.2994 -7.5946 -0.1625 0.6305 -0.7589 +-0.8539 6.2396 -7.7678 -0.0857 0.6245 -0.7762 +-0.0971 6.1434 -7.8898 -0.0102 0.6149 -0.7885 +0.6332 6.0161 -7.9628 0.0626 0.6023 -0.7958 +1.3268 5.8633 -7.9913 0.1319 0.5870 -0.7987 +1.9769 5.6916 -7.9811 0.1968 0.5699 -0.7978 +-6.5850 5.1510 -5.4868 -0.6576 0.5159 -0.5489 +-6.1002 5.3107 -5.8808 -0.6091 0.5319 -0.5882 +-5.5590 5.4558 -6.2714 -0.5551 0.5464 -0.6272 +-4.9624 5.5809 -6.6504 -0.4955 0.5589 -0.6649 +-4.3141 5.6805 -7.0086 -0.4308 0.5688 -0.7006 +-3.6209 5.7500 -7.3367 -0.3616 0.5757 -0.7333 +-2.8928 5.7857 -7.6261 -0.2890 0.5793 -0.7621 +-2.1423 5.7857 -7.8700 -0.2141 0.5793 -0.7865 +-1.3831 5.7500 -8.0638 -0.1385 0.5757 -0.8058 +-0.6295 5.6805 -8.2058 -0.0633 0.5688 -0.8200 +0.1056 5.5809 -8.2972 0.0100 0.5589 -0.8292 +0.8110 5.4558 -8.3412 0.0804 0.5464 -0.8336 +1.4784 5.3107 -8.3433 0.1470 0.5319 -0.8339 +2.1022 5.1510 -8.3095 0.2094 0.5159 -0.8307 +0.7824 9.9531 -0.5684 0.0792 0.9952 -0.0575 +0.9971 9.8809 -1.1721 0.1007 0.9879 -0.1178 +1.4229 9.8809 -0.5861 0.1432 0.9879 -0.0593 +1.2199 9.7596 -1.8062 0.1230 0.9757 -0.1811 +1.6620 9.7867 -1.2075 0.1671 0.9784 -0.1214 +2.0948 9.7596 -0.6021 0.2103 0.9757 -0.0610 +1.4480 9.5830 -2.4635 0.1458 0.9580 -0.2467 +1.9065 9.6391 -1.8584 0.1915 0.9636 -0.1863 +2.3566 9.6391 -1.2389 0.2364 0.9636 -0.1245 +2.7904 9.5830 -0.6159 0.2797 0.9580 -0.0624 +1.6775 9.3468 -3.1343 0.1687 0.9344 -0.3136 +2.1524 9.4321 -2.5304 0.2161 0.9429 -0.2534 +2.6201 9.4611 -1.9036 0.2627 0.9458 -0.1909 +3.0717 9.4321 -1.2652 0.3077 0.9429 -0.1272 +3.4993 9.3467 -0.6269 0.3504 0.9344 -0.0635 +1.9042 9.0487 -3.8072 0.1913 0.9047 -0.3807 +2.3949 9.1621 -3.2124 0.2403 0.9159 -0.3214 +2.8799 9.2205 -2.5863 0.2886 0.9217 -0.2589 +3.3497 9.2205 -1.9397 0.3355 0.9217 -0.1945 +3.7953 9.1621 -1.2850 0.3799 0.9159 -0.1292 +4.2093 9.0487 -0.6345 0.4212 0.9047 -0.0643 +2.1235 8.6900 -4.4693 0.2132 0.8689 -0.4467 +2.6286 8.8286 -3.8919 0.2636 0.8827 -0.3891 +3.1302 8.9149 -3.2750 0.3136 0.8912 -0.3276 +3.6180 8.9443 -2.6286 0.3622 0.8941 -0.2632 +4.0820 8.9149 -1.9650 0.4085 0.8912 -0.1970 +4.5137 8.8285 -1.2973 0.4515 0.8827 -0.1304 +4.9068 8.6900 -0.6385 0.4907 0.8689 -0.0647 +2.3309 8.2751 -5.1078 0.2339 0.8275 -0.5104 +2.8485 8.4342 -4.5552 0.2855 0.8433 -0.4552 +3.3652 8.5455 -3.9560 0.3370 0.8544 -0.3955 +3.8700 8.6028 -3.3188 0.3873 0.8601 -0.3319 +4.3523 8.6028 -2.6550 0.4354 0.8601 -0.2658 +4.8023 8.5455 -1.9780 0.4803 0.8544 -0.1983 +5.2126 8.4342 -1.3015 0.5212 0.8433 -0.1309 +5.5781 8.2751 -0.6385 0.5577 0.8275 -0.0647 +2.5227 7.8117 -5.7108 0.2530 0.7813 -0.5705 +3.0501 7.9855 -5.1892 0.3056 0.7986 -0.5184 +3.5794 8.1170 -4.6154 0.3584 0.8117 -0.4612 +4.0995 8.1991 -3.9960 0.4102 0.8198 -0.3995 +4.5990 8.2270 -3.3414 0.4600 0.8226 -0.3342 +5.0673 8.1991 -2.6640 0.5067 0.8198 -0.2667 +5.4956 8.1170 -1.9780 0.5494 0.8117 -0.1983 +5.8778 7.9855 -1.2973 0.5875 0.7986 -0.1304 +6.2109 7.8117 -0.6345 0.6208 0.7813 -0.0643 +2.6959 7.3100 -6.2687 0.2703 0.7313 -0.6262 +3.2299 7.4921 -5.7824 0.3235 0.7494 -0.5776 +3.7687 7.6380 -5.2400 0.3772 0.7639 -0.5235 +4.3014 7.7402 -4.6463 0.4303 0.7741 -0.4643 +4.8161 7.7928 -4.0097 0.4816 0.7793 -0.4008 +5.3017 7.7928 -3.3414 0.5300 0.7793 -0.3342 +5.7481 7.7401 -2.6550 0.5745 0.7741 -0.2658 +6.1482 7.6380 -1.9650 0.6144 0.7639 -0.1970 +6.4975 7.4921 -1.2850 0.6493 0.7494 -0.1292 +6.7950 7.3099 -0.6269 0.6791 0.7313 -0.0635 +2.8487 6.7815 -6.7746 0.2855 0.6786 -0.6767 +3.3857 6.9656 -6.3259 0.3391 0.6970 -0.6319 +3.9303 7.1196 -5.8192 0.3934 0.7123 -0.5813 +4.4721 7.2361 -5.2573 0.4474 0.7239 -0.5252 +4.9993 7.3088 -4.6463 0.4999 0.7311 -0.4643 +5.5001 7.3335 -3.9960 0.5498 0.7335 -0.3995 +5.9638 7.3088 -3.3188 0.5960 0.7311 -0.3319 +6.3819 7.2361 -2.6286 0.6377 0.7239 -0.2632 +6.7490 7.1196 -1.9397 0.6744 0.7123 -0.1945 +7.0626 6.9656 -1.2652 0.7057 0.6970 -0.1272 +7.3234 6.7815 -0.6159 0.7318 0.6786 -0.0624 +2.9805 6.2383 -7.2249 0.2986 0.6244 -0.7217 +3.5168 6.4186 -6.8142 0.3521 0.6424 -0.6806 +4.0633 6.5747 -6.3454 0.4066 0.6579 -0.6338 +4.6102 6.6995 -5.8192 0.4611 0.6704 -0.5813 +5.1461 6.7867 -5.2400 0.5145 0.6791 -0.5235 +5.6592 6.8316 -4.6154 0.5657 0.6836 -0.4612 +6.1383 6.8316 -3.9560 0.6135 0.6836 -0.3955 +6.5738 6.7867 -3.2750 0.6569 0.6791 -0.3276 +6.9591 6.6994 -2.5863 0.6953 0.6704 -0.2589 +7.2904 6.5746 -1.9036 0.7284 0.6579 -0.1909 +7.5675 6.4186 -1.2390 0.7562 0.6424 -0.1245 +7.7924 6.2383 -0.6021 0.7787 0.6244 -0.0610 +3.0917 5.6916 -7.6189 0.3097 0.5699 -0.7611 +3.6237 5.8633 -7.2450 0.3628 0.5870 -0.7237 +4.1681 6.0161 -6.8142 0.4171 0.6023 -0.6806 +4.7160 6.1434 -6.3259 0.4717 0.6149 -0.6319 +5.2566 6.2396 -5.7824 0.5256 0.6245 -0.5776 +5.7783 6.2994 -5.1893 0.5776 0.6305 -0.5184 +6.2698 6.3198 -4.5553 0.6266 0.6325 -0.4552 +6.7209 6.2994 -3.8919 0.6716 0.6305 -0.3891 +7.1238 6.2395 -3.2125 0.7118 0.6245 -0.3214 +7.4737 6.1434 -2.5304 0.7467 0.6149 -0.2534 +7.7688 6.0160 -1.8584 0.7762 0.6023 -0.1863 +8.0102 5.8633 -1.2075 0.8004 0.5870 -0.1214 +8.2014 5.6916 -0.5861 0.8196 0.5699 -0.0593 +3.1834 5.1510 -7.9582 0.3188 0.5159 -0.7951 +3.7079 5.3107 -7.6189 0.3712 0.5319 -0.7611 +4.2467 5.4558 -7.2249 0.4249 0.5464 -0.7217 +4.7915 5.5809 -6.7746 0.4793 0.5589 -0.6767 +5.3325 5.6805 -6.2687 0.5332 0.5688 -0.6262 +5.8587 5.7500 -5.7108 0.5857 0.5757 -0.5705 +6.3590 5.7857 -5.1078 0.6355 0.5793 -0.5104 +6.8228 5.7857 -4.4693 0.6818 0.5793 -0.4467 +7.2418 5.7499 -3.8072 0.7236 0.5757 -0.3807 +7.6097 5.6805 -3.1344 0.7603 0.5688 -0.3136 +7.9237 5.5808 -2.4635 0.7917 0.5589 -0.2467 +8.1836 5.4558 -1.8062 0.8177 0.5464 -0.1811 +8.3918 5.3107 -1.1721 0.8386 0.5319 -0.1178 +8.5524 5.1510 -0.5684 0.8547 0.5159 -0.0575 +9.0360 4.1839 0.9197 0.9037 0.4180 0.0931 +9.1985 3.6974 1.3105 0.9198 0.3694 0.1322 +8.8904 4.3136 1.5343 0.8891 0.4309 0.1545 +9.3289 3.1653 1.7184 0.9328 0.3163 0.1729 +9.0374 3.8090 1.9538 0.9037 0.3805 0.1964 +8.6958 4.4315 2.1783 0.8696 0.4426 0.2188 +9.4190 2.5903 2.1384 0.9417 0.2589 0.2149 +9.1484 3.2568 2.3875 0.9147 0.3254 0.2397 +8.8227 3.9082 2.6241 0.8822 0.3903 0.2633 +8.4476 4.5330 2.8441 0.8448 0.4527 0.2853 +9.4613 1.9774 2.5640 0.9459 0.1977 0.2574 +9.2151 2.6606 2.8290 0.9213 0.2658 0.2838 +8.9098 3.3360 3.0801 0.8908 0.3332 0.3088 +8.5499 3.9909 3.3123 0.8549 0.3985 0.3320 +8.1430 4.6140 3.5218 0.8144 0.4607 0.3529 +9.4496 1.3344 2.9875 0.9446 0.1336 0.2996 +9.2302 2.0267 3.2704 0.9227 0.2026 0.3278 +8.9491 2.7195 3.5382 0.8947 0.2717 0.3545 +8.6091 3.3993 3.7851 0.8608 0.3395 0.3792 +8.2169 4.0534 4.0066 0.8217 0.4047 0.4012 +7.7816 4.6704 4.1994 0.7783 0.4663 0.4205 +9.3800 0.6713 3.4007 0.9377 0.0675 0.3408 +9.1886 1.3641 3.7026 0.9185 0.1366 0.3709 +8.9341 2.0662 3.9891 0.8931 0.2065 0.3995 +8.6180 2.7640 4.2532 0.8616 0.2761 0.4258 +8.2454 3.4436 4.4894 0.8245 0.3439 0.4494 +7.8245 4.0923 4.6937 0.7826 0.4086 0.4697 +7.3660 4.6994 4.8639 0.7369 0.4691 0.4867 +9.2518 -0.0000 3.7953 0.9249 0.0005 0.3802 +9.0876 0.6843 4.1168 0.9084 0.0688 0.4122 +8.8609 1.3866 4.4230 0.8858 0.1388 0.4427 +8.5713 2.0938 4.7062 0.8569 0.2093 0.4710 +8.2224 2.7917 4.9597 0.8221 0.2788 0.4962 +7.8209 3.4664 5.1785 0.7822 0.3461 0.5181 +7.3769 4.1055 5.3596 0.7379 0.4099 0.5361 +6.9021 4.6994 5.5024 0.6906 0.4691 0.5504 +9.0673 -0.6672 4.1640 0.9065 -0.0660 0.4169 +8.9281 -0.0000 4.5044 0.8926 0.0006 0.4509 +8.7285 0.6933 4.8305 0.8726 0.0697 0.4834 +8.4666 1.4006 5.1337 0.8465 0.1402 0.5136 +8.1441 2.1080 5.4065 0.8143 0.2107 0.5408 +7.7663 2.8012 5.6425 0.7767 0.2798 0.5643 +7.3419 3.4664 5.8379 0.7344 0.3461 0.5838 +6.8819 4.0923 5.9910 0.6886 0.4086 0.5991 +6.3985 4.6704 6.1030 0.6404 0.4663 0.6103 +8.8319 -1.3183 4.5011 0.8831 -0.1309 0.4505 +8.7142 -0.6756 4.8587 0.8713 -0.0668 0.4862 +8.5395 0.0000 5.2035 0.8538 0.0006 0.5206 +8.3048 0.6979 5.5266 0.8304 0.0702 0.5528 +8.0099 1.4054 5.8195 0.8010 0.1407 0.5819 +7.6586 2.1080 6.0748 0.7660 0.2107 0.6073 +7.2579 2.7917 6.2873 0.7260 0.2788 0.6286 +6.8177 3.4436 6.4545 0.6822 0.3439 0.6453 +6.3497 4.0534 6.5766 0.6355 0.4047 0.6575 +5.8657 4.6140 6.6561 0.5873 0.4607 0.6655 +8.5533 -1.9427 4.8028 0.8553 -0.1932 0.4806 +8.4529 -1.3303 5.1748 0.8453 -0.1321 0.5177 +8.2999 -0.6799 5.5362 0.8300 -0.0672 0.5537 +8.0902 0.0000 5.8778 0.8090 0.0006 0.5878 +7.8225 0.6979 6.1904 0.7823 0.0702 0.6189 +7.4988 1.4006 6.4658 0.7500 0.1402 0.6464 +7.1246 2.0938 6.6975 0.7127 0.2093 0.6695 +6.7082 2.7640 6.8819 0.6713 0.2761 0.6879 +6.2603 3.3993 7.0181 0.6266 0.3395 0.7015 +5.7923 3.9910 7.1079 0.5799 0.3985 0.7105 +5.3154 4.5331 7.1553 0.5324 0.4527 0.7153 +8.2408 -2.5323 5.0673 0.8242 -0.2521 0.5070 +8.1532 -1.9541 5.4504 0.8154 -0.1944 0.5452 +8.0178 -1.3344 5.8253 0.8019 -0.1325 0.5826 +7.8301 -0.6799 6.1828 0.7831 -0.0672 0.6182 +7.5877 0.0000 6.5135 0.7589 0.0006 0.6511 +7.2913 0.6933 6.8085 0.7294 0.0697 0.6805 +6.9447 1.3866 7.0604 0.6948 0.1388 0.7056 +6.5547 2.0662 7.2641 0.6559 0.2065 0.7260 +6.1304 2.7195 7.4177 0.6137 0.2717 0.7413 +5.6826 3.3360 7.5219 0.5690 0.3332 0.7518 +5.2221 3.9082 7.5800 0.5231 0.3903 0.7576 +4.7589 4.4315 7.5970 0.4768 0.4426 0.7594 +7.9039 -3.0812 5.2948 0.7906 -0.3070 0.5297 +7.8250 -2.5393 5.6851 0.7827 -0.2528 0.5687 +7.7031 -1.9541 6.0698 0.7705 -0.1944 0.6070 +7.5337 -1.3303 6.4400 0.7536 -0.1321 0.6439 +7.3138 -0.6756 6.7862 0.7317 -0.0668 0.6784 +7.0429 0.0000 7.0991 0.7046 0.0006 0.7096 +6.7236 0.6843 7.3706 0.6728 0.0688 0.7366 +6.3609 1.3641 7.5946 0.6366 0.1366 0.7589 +5.9626 2.0267 7.7678 0.5969 0.2026 0.7762 +5.5382 2.6607 7.8898 0.5546 0.2658 0.7885 +5.0977 3.2568 7.9628 0.5107 0.3254 0.7958 +4.6508 3.8090 7.9913 0.4660 0.3805 0.7987 +4.2065 4.3137 7.9811 0.4217 0.4309 0.7978 +7.5521 -3.5862 5.4868 0.7555 -0.3575 0.5489 +7.4781 -3.0812 5.8808 0.7481 -0.3070 0.5882 +7.3659 -2.5323 6.2715 0.7369 -0.2521 0.6272 +7.2109 -1.9427 6.6505 0.7214 -0.1932 0.6649 +7.0101 -1.3183 7.0086 0.7014 -0.1309 0.7006 +6.7622 -0.6672 7.3367 0.6767 -0.0660 0.7333 +6.4685 0.0000 7.6262 0.6474 0.0005 0.7621 +6.1328 0.6714 7.8700 0.6139 0.0675 0.7865 +5.7614 1.3344 8.0639 0.5769 0.1336 0.8058 +5.3622 1.9774 8.2059 0.5371 0.1977 0.8200 +4.9444 2.5903 8.2972 0.4953 0.2589 0.8292 +4.5170 3.1654 8.3413 0.4527 0.3163 0.8336 +4.0888 3.6974 8.3433 0.4100 0.3694 0.8339 +3.6670 4.1839 8.3095 0.3678 0.4180 0.8307 +1.9175 4.1839 8.8779 0.1906 0.4180 0.8882 +1.5961 3.6974 9.1532 0.1585 0.3694 0.9156 +1.2880 4.3137 8.9294 0.1278 0.4309 0.8933 +1.2485 3.1654 9.4033 0.1238 0.3163 0.9405 +0.9345 3.8090 9.1988 0.0924 0.3805 0.9201 +0.6154 4.4315 8.9433 0.0606 0.4426 0.8947 +0.8769 2.5903 9.6188 0.0866 0.2589 0.9620 +0.5563 3.2568 9.4384 0.0546 0.3254 0.9440 +0.2306 3.9082 9.2018 0.0221 0.3903 0.9204 +-0.0945 4.5331 8.9130 -0.0103 0.4527 0.8916 +0.4851 1.9774 9.7905 0.0475 0.1977 0.9791 +0.1570 2.6606 9.6383 0.0147 0.2658 0.9639 +-0.1761 3.3360 9.4255 -0.0185 0.3332 0.9427 +-0.5082 3.9910 9.1550 -0.0515 0.3985 0.9157 +-0.8331 4.6140 8.8327 -0.0840 0.4607 0.8836 +0.0787 1.3344 9.9103 0.0069 0.1336 0.9910 +-0.2581 2.0267 9.7891 -0.0266 0.2026 0.9789 +-0.5996 2.7195 9.6044 -0.0607 0.2717 0.9604 +-0.9396 3.3993 9.3574 -0.0946 0.3395 0.9358 +-1.2714 4.0534 9.0528 -0.1277 0.4047 0.9055 +-1.5893 4.6704 8.6984 -0.1594 0.4663 0.8701 +-0.3357 0.6713 9.9718 -0.0344 0.0675 0.9971 +-0.6821 1.3641 9.8830 -0.0689 0.1366 0.9882 +-1.0331 2.0662 9.7295 -0.1039 0.2065 0.9729 +-1.3820 2.7640 9.5106 -0.1387 0.2761 0.9510 +-1.7218 3.4436 9.2291 -0.1726 0.3439 0.9230 +-2.0462 4.0923 8.8919 -0.2049 0.4086 0.8894 +-2.3497 4.6994 8.5085 -0.2352 0.4691 0.8512 +-0.7506 -0.0000 9.9718 -0.0757 0.0005 0.9971 +-1.1071 0.6843 9.9149 -0.1113 0.0688 0.9914 +-1.4684 1.3866 9.7939 -0.1473 0.1388 0.9793 +-1.8272 2.0938 9.6061 -0.1831 0.2093 0.9605 +-2.1762 2.7917 9.3526 -0.2179 0.2788 0.9353 +-2.5083 3.4664 9.0384 -0.2510 0.3461 0.9040 +-2.8178 4.1055 8.6721 -0.2819 0.4099 0.8675 +-3.1003 4.6994 8.2646 -0.3100 0.4691 0.8269 +-1.1583 -0.6672 9.9103 -0.1164 -0.0660 0.9910 +-1.5251 -0.0000 9.8830 -0.1530 0.0006 0.9882 +-1.8968 0.6933 9.7939 -0.1900 0.0697 0.9793 +-2.2662 1.4006 9.6386 -0.2269 0.1402 0.9638 +-2.6252 2.1080 9.4162 -0.2626 0.2107 0.9416 +-2.9665 2.8012 9.1298 -0.2967 0.2798 0.9131 +-3.2834 3.4664 8.7865 -0.3283 0.3461 0.8789 +-3.5712 4.0923 8.3964 -0.3570 0.4086 0.8400 +-3.8271 4.6704 7.9712 -0.3825 0.4663 0.7976 +-1.5517 -1.3183 9.7905 -0.1556 -0.1309 0.9791 +-1.9281 -0.6756 9.7891 -0.1932 -0.0668 0.9789 +-2.3100 -0.0000 9.7295 -0.2312 0.0006 0.9729 +-2.6899 0.6979 9.6061 -0.2691 0.0702 0.9605 +-3.0595 1.4054 9.4162 -0.3059 0.1407 0.9416 +-3.4109 2.1080 9.1609 -0.3410 0.2107 0.9161 +-3.7368 2.7917 8.8455 -0.3734 0.2788 0.8847 +-4.0318 3.4436 8.4786 -0.4029 0.3439 0.8482 +-4.2926 4.0534 8.0712 -0.4289 0.4047 0.8076 +-4.5178 4.6140 7.6355 -0.4514 0.4607 0.7642 +-1.9247 -1.9428 9.6188 -0.1928 -0.1932 0.9620 +-2.3095 -1.3303 9.6383 -0.2312 -0.1321 0.9639 +-2.7005 -0.6799 9.6044 -0.2701 -0.0672 0.9604 +-3.0902 -0.0000 9.5106 -0.3090 0.0006 0.9510 +-3.4702 0.6979 9.3526 -0.3469 0.0702 0.9353 +-3.8321 1.4006 9.1298 -0.3829 0.1402 0.9131 +-4.1681 2.0938 8.8455 -0.4164 0.2093 0.8847 +-4.4722 2.7640 8.5065 -0.4468 0.2761 0.8509 +-4.7401 3.3993 8.1226 -0.4735 0.3395 0.8127 +-4.9701 3.9910 7.7052 -0.4965 0.3985 0.7711 +-5.1626 4.5331 7.2663 -0.5158 0.4527 0.7273 +-2.2728 -2.5323 9.4033 -0.2275 -0.2521 0.9405 +-2.6641 -1.9541 9.4384 -0.2665 -0.1944 0.9440 +-3.0625 -1.3344 9.4255 -0.3063 -0.1325 0.9427 +-3.4606 -0.6799 9.3575 -0.3460 -0.0672 0.9358 +-3.8500 -0.0000 9.2292 -0.3847 0.0006 0.9230 +-4.2222 0.6933 9.0384 -0.4218 0.0697 0.9040 +-4.5688 1.3866 8.7866 -0.4564 0.1388 0.8789 +-4.8831 2.0662 8.4786 -0.4877 0.2065 0.8482 +-5.1603 2.7195 8.1226 -0.5154 0.2717 0.8127 +-5.3977 3.3360 7.7289 -0.5391 0.3332 0.7735 +-5.5953 3.9082 7.3088 -0.5589 0.3903 0.7316 +-5.7547 4.4315 6.8735 -0.5749 0.4426 0.6882 +-2.5932 -3.0812 9.1532 -0.2595 -0.3070 0.9156 +-2.9889 -2.5393 9.1988 -0.2990 -0.2528 0.9201 +-3.3924 -1.9541 9.2018 -0.3392 -0.1944 0.9204 +-3.7968 -1.3303 9.1550 -0.3795 -0.1321 0.9157 +-4.1940 -0.6756 9.0528 -0.4191 -0.0668 0.9055 +-4.5753 -0.0000 8.8920 -0.4571 0.0006 0.8894 +-4.9322 0.6843 8.6721 -0.4926 0.0688 0.8675 +-5.2573 1.3641 8.3964 -0.5251 0.1366 0.8400 +-5.5451 2.0267 8.0712 -0.5538 0.2026 0.8076 +-5.7923 2.6606 7.7052 -0.5785 0.2658 0.7711 +-5.9979 3.2568 7.3088 -0.5990 0.3254 0.7316 +-6.1630 3.8090 6.8927 -0.6156 0.3805 0.6901 +-6.2906 4.3137 6.4669 -0.6284 0.4309 0.6476 +-2.8846 -3.5862 8.8780 -0.2886 -0.3575 0.8882 +-3.2821 -3.0812 8.9294 -0.3282 -0.3070 0.8933 +-3.6884 -2.5323 8.9434 -0.3688 -0.2521 0.8947 +-4.0967 -1.9428 8.9131 -0.4094 -0.1932 0.8916 +-4.4994 -1.3183 8.8328 -0.4496 -0.1309 0.8836 +-4.8880 -0.6672 8.6984 -0.4883 -0.0660 0.8701 +-5.2540 -0.0000 8.5085 -0.5248 0.0005 0.8512 +-5.5897 0.6713 8.2646 -0.5583 0.0675 0.8269 +-5.8888 1.3344 7.9713 -0.5881 0.1336 0.7976 +-6.1473 1.9774 7.6355 -0.6139 0.1977 0.7642 +-6.3632 2.5903 7.2663 -0.6355 0.2589 0.7273 +-6.5372 3.1654 6.8735 -0.6529 0.3163 0.6882 +-6.6715 3.6974 6.4669 -0.6664 0.3694 0.6476 +-6.7697 4.1839 6.0553 -0.6763 0.4180 0.6065 +-7.8509 4.1839 4.5671 -0.7858 0.4180 0.4558 +-8.2120 3.6974 4.3465 -0.8218 0.3694 0.4337 +-8.0943 4.3137 3.9843 -0.8101 0.4309 0.3976 +-8.5573 3.1654 4.0931 -0.8563 0.3163 0.4083 +-8.4598 3.8090 3.7314 -0.8466 0.3805 0.3722 +-8.3154 4.4315 3.3489 -0.8321 0.4426 0.3341 +-8.8771 2.5903 3.8063 -0.8881 0.2589 0.3797 +-8.8046 3.2568 3.4457 -0.8809 0.3254 0.3437 +-8.6802 3.9082 3.0628 -0.8685 0.3903 0.3055 +-8.5060 4.5331 2.6644 -0.8511 0.4527 0.2658 +-9.1614 1.9774 3.4868 -0.9165 0.1977 0.3477 +-9.1180 2.6606 3.1277 -0.9121 0.2658 0.3119 +-9.0186 3.3360 2.7451 -0.9022 0.3332 0.2737 +-8.8640 3.9909 2.3458 -0.8868 0.3985 0.2339 +-8.6579 4.6140 1.9371 -0.8663 0.4607 0.1932 +-9.4009 1.3344 3.1373 -0.9403 0.1336 0.3128 +-9.3897 2.0267 2.7795 -0.9392 0.2026 0.2771 +-9.3196 2.7195 2.3976 -0.9322 0.2717 0.2390 +-9.1898 3.3993 1.9980 -0.9192 0.3395 0.1992 +-9.0026 4.0534 1.5883 -0.9006 0.4047 0.1584 +-8.7637 4.6704 1.1765 -0.8768 0.4663 0.1173 +-9.5875 0.6713 2.7622 -0.9589 0.0675 0.2754 +-9.6101 1.3641 2.4053 -0.9611 0.1366 0.2398 +-9.5726 2.0662 2.0241 -0.9574 0.2065 0.2018 +-9.4721 2.7640 1.6246 -0.9474 0.2761 0.1619 +-9.3095 3.4436 1.2144 -0.9312 0.3439 0.1210 +-9.0890 4.0923 0.8018 -0.9092 0.4086 0.0799 +-8.8182 4.6994 0.3946 -0.8822 0.4691 0.0393 +-9.7157 0.0000 2.3676 -0.9717 0.0005 0.2361 +-9.7718 0.6843 2.0109 -0.9773 0.0688 0.2004 +-9.7684 1.3866 1.6300 -0.9769 0.1388 0.1625 +-9.7006 2.0938 1.2307 -0.9701 0.2093 0.1227 +-9.5673 2.7917 0.8204 -0.9568 0.2788 0.0818 +-9.3711 3.4664 0.4075 -0.9373 0.3461 0.0406 +-9.1184 4.1055 0.0000 -0.9121 0.4099 0.0000 +-8.8182 4.6994 -0.3946 -0.8822 0.4691 -0.0393 +-9.7832 -0.6672 1.9608 -0.9785 -0.0660 0.1955 +-9.8706 0.0000 1.6035 -0.9871 0.0006 0.1599 +-9.9008 0.6933 1.2225 -0.9901 0.0697 0.1218 +-9.8672 1.4006 0.8232 -0.9867 0.1402 0.0820 +-9.7666 2.1080 0.4130 -0.9767 0.2107 0.0411 +-9.5997 2.8012 -0.0000 -0.9601 0.2798 0.0000 +-9.3711 3.4664 -0.4075 -0.9373 0.3461 -0.0406 +-9.0890 4.0923 -0.8018 -0.9092 0.4086 -0.0799 +-8.7637 4.6704 -1.1765 -0.8768 0.4663 -0.1173 +-9.7908 -1.3183 1.5497 -0.9792 -0.1309 0.1545 +-9.9058 -0.6756 1.1912 -0.9907 -0.0668 0.1187 +-9.9672 0.0000 0.8096 -0.9967 0.0006 0.0807 +-9.9672 0.6979 0.4102 -0.9967 0.0702 0.0409 +-9.9008 1.4054 -0.0000 -0.9901 0.1407 0.0000 +-9.7666 2.1080 -0.4130 -0.9767 0.2107 -0.0411 +-9.5673 2.7917 -0.8205 -0.9568 0.2788 -0.0818 +-9.3095 3.4436 -1.2144 -0.9312 0.3439 -0.1210 +-9.0026 4.0534 -1.5883 -0.9006 0.4047 -0.1584 +-8.6579 4.6140 -1.9371 -0.8663 0.4607 -0.1932 +-9.7428 -1.9427 1.1419 -0.9745 -0.1932 0.1139 +-9.8802 -1.3303 0.7819 -0.9882 -0.1321 0.0779 +-9.9689 -0.6799 0.3996 -0.9969 -0.0672 0.0398 +-10.0000 0.0000 -0.0000 -1.0000 0.0006 0.0000 +-9.9672 0.6979 -0.4102 -0.9967 0.0702 -0.0409 +-9.8671 1.4006 -0.8232 -0.9867 0.1402 -0.0820 +-9.7006 2.0938 -1.2307 -0.9701 0.2093 -0.1227 +-9.4721 2.7640 -1.6246 -0.9474 0.2761 -0.1619 +-9.1898 3.3993 -1.9980 -0.9192 0.3395 -0.1992 +-8.8640 3.9910 -2.3458 -0.8868 0.3985 -0.2339 +-8.5060 4.5331 -2.6644 -0.8511 0.4527 -0.2658 +-9.6454 -2.5323 0.7442 -0.9648 -0.2521 0.0742 +-9.7997 -1.9541 0.3828 -0.9802 -0.1943 0.0382 +-9.9106 -1.3344 -0.0000 -0.9912 -0.1325 0.0000 +-9.9689 -0.6799 -0.3996 -0.9969 -0.0672 -0.0398 +-9.9672 0.0000 -0.8096 -0.9967 0.0006 -0.0807 +-9.9008 0.6933 -1.2225 -0.9901 0.0697 -0.1218 +-9.7683 1.3866 -1.6300 -0.9769 0.1388 -0.1625 +-9.5726 2.0662 -2.0241 -0.9574 0.2065 -0.2018 +-9.3196 2.7195 -2.3976 -0.9322 0.2717 -0.2390 +-9.0186 3.3360 -2.7451 -0.9022 0.3332 -0.2737 +-8.6802 3.9082 -3.0628 -0.8685 0.3903 -0.3055 +-8.3154 4.4315 -3.3489 -0.8321 0.4426 -0.3341 +-9.5066 -3.0812 0.3622 -0.9510 -0.3070 0.0361 +-9.6722 -2.5393 -0.0000 -0.9675 -0.2528 0.0000 +-9.7997 -1.9541 -0.3829 -0.9802 -0.1943 -0.0382 +-9.8802 -1.3303 -0.7819 -0.9882 -0.1321 -0.0780 +-9.9058 -0.6756 -1.1912 -0.9907 -0.0668 -0.1187 +-9.8706 0.0000 -1.6036 -0.9871 0.0006 -0.1599 +-9.7718 0.6843 -2.0109 -0.9773 0.0688 -0.2004 +-9.6101 1.3641 -2.4053 -0.9611 0.1366 -0.2398 +-9.3897 2.0267 -2.7795 -0.9392 0.2026 -0.2771 +-9.1180 2.6606 -3.1277 -0.9121 0.2658 -0.3119 +-8.8046 3.2568 -3.4457 -0.8809 0.3254 -0.3437 +-8.4598 3.8090 -3.7314 -0.8466 0.3805 -0.3722 +-8.0943 4.3137 -3.9843 -0.8101 0.4309 -0.3976 +-9.3348 -3.5862 -0.0000 -0.9339 -0.3575 0.0000 +-9.5066 -3.0812 -0.3622 -0.9510 -0.3070 -0.0361 +-9.6454 -2.5323 -0.7442 -0.9648 -0.2521 -0.0742 +-9.7428 -1.9427 -1.1419 -0.9745 -0.1932 -0.1139 +-9.7908 -1.3183 -1.5497 -0.9792 -0.1309 -0.1545 +-9.7832 -0.6672 -1.9608 -0.9785 -0.0660 -0.1955 +-9.7157 0.0000 -2.3676 -0.9717 0.0005 -0.2361 +-9.5875 0.6714 -2.7622 -0.9589 0.0675 -0.2754 +-9.4009 1.3344 -3.1373 -0.9403 0.1336 -0.3128 +-9.1614 1.9774 -3.4868 -0.9165 0.1977 -0.3477 +-8.8771 2.5903 -3.8063 -0.8881 0.2589 -0.3797 +-8.5573 3.1654 -4.0931 -0.8563 0.3163 -0.4083 +-8.2120 3.6974 -4.3465 -0.8218 0.3694 -0.4337 +-7.8509 4.1839 -4.5671 -0.7858 0.4180 -0.4558 +-6.7697 4.1839 -6.0553 -0.6763 0.4180 -0.6065 +-6.6715 3.6974 -6.4669 -0.6664 0.3694 -0.6476 +-6.2906 4.3137 -6.4669 -0.6284 0.4309 -0.6476 +-6.5372 3.1654 -6.8735 -0.6529 0.3163 -0.6882 +-6.1630 3.8090 -6.8927 -0.6156 0.3805 -0.6901 +-5.7547 4.4315 -6.8735 -0.5749 0.4426 -0.6882 +-6.3632 2.5903 -7.2663 -0.6355 0.2589 -0.7273 +-5.9979 3.2568 -7.3088 -0.5990 0.3254 -0.7316 +-5.5953 3.9082 -7.3088 -0.5589 0.3903 -0.7316 +-5.1626 4.5331 -7.2663 -0.5158 0.4527 -0.7273 +-6.1473 1.9774 -7.6355 -0.6139 0.1977 -0.7642 +-5.7923 2.6606 -7.7052 -0.5785 0.2658 -0.7711 +-5.3977 3.3360 -7.7289 -0.5391 0.3332 -0.7735 +-4.9701 3.9910 -7.7052 -0.4965 0.3985 -0.7711 +-4.5178 4.6140 -7.6355 -0.4514 0.4607 -0.7642 +-5.8888 1.3344 -7.9713 -0.5881 0.1336 -0.7976 +-5.5451 2.0267 -8.0712 -0.5538 0.2026 -0.8076 +-5.1603 2.7195 -8.1226 -0.5154 0.2717 -0.8127 +-4.7401 3.3993 -8.1226 -0.4735 0.3395 -0.8127 +-4.2926 4.0534 -8.0712 -0.4289 0.4047 -0.8076 +-3.8271 4.6704 -7.9712 -0.3825 0.4663 -0.7976 +-5.5897 0.6713 -8.2646 -0.5583 0.0675 -0.8269 +-5.2573 1.3641 -8.3964 -0.5251 0.1366 -0.8400 +-4.8831 2.0662 -8.4786 -0.4877 0.2065 -0.8482 +-4.4722 2.7640 -8.5065 -0.4468 0.2761 -0.8509 +-4.0318 3.4436 -8.4786 -0.4029 0.3439 -0.8482 +-3.5712 4.0923 -8.3964 -0.3570 0.4086 -0.8400 +-3.1003 4.6994 -8.2646 -0.3100 0.4691 -0.8269 +-5.2540 -0.0000 -8.5085 -0.5248 0.0005 -0.8512 +-4.9322 0.6843 -8.6721 -0.4926 0.0688 -0.8675 +-4.5688 1.3866 -8.7865 -0.4564 0.1388 -0.8789 +-4.1681 2.0938 -8.8455 -0.4164 0.2093 -0.8847 +-3.7368 2.7917 -8.8455 -0.3735 0.2788 -0.8847 +-3.2834 3.4664 -8.7865 -0.3283 0.3461 -0.8789 +-2.8178 4.1055 -8.6721 -0.2819 0.4099 -0.8675 +-2.3497 4.6994 -8.5085 -0.2352 0.4691 -0.8512 +-4.8880 -0.6672 -8.6984 -0.4883 -0.0660 -0.8701 +-4.5753 -0.0000 -8.8920 -0.4571 0.0006 -0.8894 +-4.2222 0.6933 -9.0384 -0.4218 0.0697 -0.9040 +-3.8321 1.4006 -9.1298 -0.3829 0.1402 -0.9131 +-3.4109 2.1080 -9.1609 -0.3410 0.2107 -0.9161 +-2.9665 2.8012 -9.1298 -0.2967 0.2798 -0.9131 +-2.5083 3.4664 -9.0384 -0.2510 0.3461 -0.9040 +-2.0462 4.0923 -8.8919 -0.2049 0.4086 -0.8894 +-1.5893 4.6704 -8.6984 -0.1594 0.4663 -0.8701 +-4.4994 -1.3183 -8.8328 -0.4496 -0.1309 -0.8836 +-4.1940 -0.6756 -9.0528 -0.4191 -0.0668 -0.9055 +-3.8500 -0.0000 -9.2292 -0.3847 0.0006 -0.9230 +-3.4702 0.6979 -9.3526 -0.3469 0.0702 -0.9353 +-3.0595 1.4054 -9.4162 -0.3059 0.1407 -0.9416 +-2.6252 2.1080 -9.4162 -0.2626 0.2107 -0.9416 +-2.1762 2.7917 -9.3526 -0.2179 0.2788 -0.9353 +-1.7218 3.4436 -9.2291 -0.1726 0.3439 -0.9230 +-1.2714 4.0534 -9.0528 -0.1277 0.4047 -0.9055 +-0.8331 4.6140 -8.8327 -0.0840 0.4607 -0.8836 +-4.0967 -1.9428 -8.9131 -0.4094 -0.1932 -0.8916 +-3.7968 -1.3303 -9.1550 -0.3795 -0.1321 -0.9157 +-3.4606 -0.6799 -9.3575 -0.3460 -0.0672 -0.9358 +-3.0902 -0.0000 -9.5106 -0.3090 0.0006 -0.9510 +-2.6899 0.6979 -9.6061 -0.2691 0.0702 -0.9605 +-2.2662 1.4006 -9.6386 -0.2269 0.1402 -0.9638 +-1.8272 2.0938 -9.6061 -0.1831 0.2093 -0.9605 +-1.3820 2.7640 -9.5106 -0.1387 0.2761 -0.9510 +-0.9396 3.3993 -9.3574 -0.0946 0.3395 -0.9358 +-0.5082 3.9910 -9.1550 -0.0515 0.3985 -0.9157 +-0.0945 4.5331 -8.9130 -0.0103 0.4527 -0.8916 +-3.6884 -2.5323 -8.9433 -0.3688 -0.2521 -0.8947 +-3.3924 -1.9541 -9.2018 -0.3392 -0.1944 -0.9204 +-3.0625 -1.3344 -9.4255 -0.3063 -0.1325 -0.9427 +-2.7005 -0.6799 -9.6044 -0.2702 -0.0672 -0.9604 +-2.3100 -0.0000 -9.7295 -0.2312 0.0006 -0.9729 +-1.8969 0.6933 -9.7939 -0.1900 0.0697 -0.9793 +-1.4684 1.3866 -9.7939 -0.1473 0.1388 -0.9793 +-1.0331 2.0662 -9.7295 -0.1039 0.2065 -0.9729 +-0.5996 2.7195 -9.6044 -0.0607 0.2717 -0.9604 +-0.1761 3.3360 -9.4255 -0.0185 0.3332 -0.9427 +0.2306 3.9082 -9.2018 0.0221 0.3903 -0.9204 +0.6154 4.4315 -8.9433 0.0606 0.4426 -0.8947 +-3.2821 -3.0812 -8.9294 -0.3282 -0.3070 -0.8933 +-2.9889 -2.5393 -9.1988 -0.2990 -0.2528 -0.9201 +-2.6641 -1.9541 -9.4384 -0.2665 -0.1944 -0.9440 +-2.3095 -1.3303 -9.6383 -0.2312 -0.1321 -0.9639 +-1.9281 -0.6756 -9.7891 -0.1932 -0.0668 -0.9789 +-1.5251 -0.0000 -9.8830 -0.1530 0.0006 -0.9882 +-1.1071 0.6842 -9.9149 -0.1113 0.0688 -0.9914 +-0.6821 1.3641 -9.8830 -0.0689 0.1366 -0.9882 +-0.2581 2.0267 -9.7891 -0.0266 0.2026 -0.9789 +0.1570 2.6606 -9.6383 0.0147 0.2658 -0.9639 +0.5563 3.2568 -9.4384 0.0546 0.3254 -0.9440 +0.9345 3.8090 -9.1988 0.0924 0.3805 -0.9201 +1.2880 4.3137 -8.9294 0.1278 0.4309 -0.8933 +-2.8846 -3.5862 -8.8780 -0.2886 -0.3575 -0.8882 +-2.5932 -3.0812 -9.1532 -0.2595 -0.3070 -0.9156 +-2.2728 -2.5323 -9.4033 -0.2275 -0.2521 -0.9405 +-1.9247 -1.9428 -9.6188 -0.1928 -0.1932 -0.9620 +-1.5517 -1.3183 -9.7905 -0.1556 -0.1309 -0.9791 +-1.1583 -0.6672 -9.9103 -0.1164 -0.0660 -0.9910 +-0.7506 -0.0000 -9.9718 -0.0757 0.0005 -0.9971 +-0.3357 0.6713 -9.9718 -0.0344 0.0675 -0.9971 +0.0787 1.3344 -9.9103 0.0069 0.1336 -0.9910 +0.4851 1.9774 -9.7905 0.0475 0.1977 -0.9791 +0.8769 2.5903 -9.6188 0.0866 0.2589 -0.9620 +1.2485 3.1654 -9.4033 0.1238 0.3163 -0.9405 +1.5961 3.6974 -9.1532 0.1585 0.3694 -0.9156 +1.9175 4.1839 -8.8779 0.1906 0.4180 -0.8882 +3.6670 4.1839 -8.3095 0.3678 0.4180 -0.8307 +4.0888 3.6974 -8.3433 0.4099 0.3694 -0.8339 +4.2065 4.3137 -7.9811 0.4217 0.4309 -0.7978 +4.5170 3.1654 -8.3413 0.4527 0.3163 -0.8336 +4.6508 3.8090 -7.9913 0.4660 0.3805 -0.7987 +4.7589 4.4315 -7.5970 0.4768 0.4426 -0.7594 +4.9444 2.5903 -8.2972 0.4953 0.2589 -0.8292 +5.0977 3.2568 -7.9628 0.5107 0.3254 -0.7958 +5.2221 3.9082 -7.5800 0.5231 0.3903 -0.7576 +5.3154 4.5331 -7.1553 0.5324 0.4527 -0.7153 +5.3622 1.9774 -8.2059 0.5371 0.1977 -0.8200 +5.5382 2.6606 -7.8898 0.5546 0.2658 -0.7885 +5.6826 3.3360 -7.5219 0.5690 0.3332 -0.7518 +5.7923 3.9910 -7.1079 0.5799 0.3985 -0.7105 +5.8657 4.6140 -6.6561 0.5873 0.4607 -0.6655 +5.7614 1.3344 -8.0639 0.5769 0.1336 -0.8058 +5.9626 2.0267 -7.7679 0.5969 0.2026 -0.7762 +6.1304 2.7195 -7.4177 0.6137 0.2717 -0.7413 +6.2603 3.3993 -7.0181 0.6266 0.3395 -0.7015 +6.3497 4.0534 -6.5766 0.6355 0.4047 -0.6575 +6.3985 4.6704 -6.1030 0.6404 0.4663 -0.6103 +6.1328 0.6713 -7.8700 0.6139 0.0675 -0.7865 +6.3609 1.3641 -7.5946 0.6366 0.1366 -0.7589 +6.5547 2.0662 -7.2641 0.6559 0.2065 -0.7260 +6.7082 2.7640 -6.8819 0.6713 0.2761 -0.6879 +6.8177 3.4436 -6.4545 0.6822 0.3439 -0.6453 +6.8819 4.0923 -5.9910 0.6886 0.4086 -0.5991 +6.9021 4.6994 -5.5024 0.6906 0.4691 -0.5504 +6.4685 -0.0000 -7.6262 0.6474 0.0005 -0.7621 +6.7236 0.6842 -7.3706 0.6728 0.0688 -0.7366 +6.9447 1.3866 -7.0604 0.6948 0.1388 -0.7056 +7.1246 2.0938 -6.6975 0.7127 0.2093 -0.6695 +7.2579 2.7917 -6.2873 0.7260 0.2788 -0.6286 +7.3419 3.4664 -5.8379 0.7344 0.3461 -0.5838 +7.3769 4.1055 -5.3596 0.7379 0.4099 -0.5361 +7.3660 4.6994 -4.8639 0.7369 0.4691 -0.4867 +6.7622 -0.6672 -7.3367 0.6767 -0.0660 -0.7333 +7.0429 -0.0000 -7.0991 0.7046 0.0006 -0.7096 +7.2913 0.6933 -6.8085 0.7294 0.0697 -0.6805 +7.4988 1.4006 -6.4658 0.7500 0.1402 -0.6464 +7.6586 2.1080 -6.0748 0.7660 0.2107 -0.6073 +7.7663 2.8012 -5.6425 0.7767 0.2798 -0.5643 +7.8209 3.4664 -5.1785 0.7822 0.3461 -0.5181 +7.8245 4.0923 -4.6937 0.7826 0.4086 -0.4697 +7.7816 4.6704 -4.1994 0.7783 0.4663 -0.4205 +7.0101 -1.3183 -7.0086 0.7014 -0.1309 -0.7006 +7.3138 -0.6756 -6.7862 0.7317 -0.0668 -0.6784 +7.5877 -0.0000 -6.5135 0.7589 0.0006 -0.6511 +7.8225 0.6979 -6.1904 0.7823 0.0702 -0.6189 +8.0099 1.4053 -5.8195 0.8010 0.1407 -0.5819 +8.1441 2.1080 -5.4065 0.8143 0.2107 -0.5408 +8.2224 2.7917 -4.9597 0.8221 0.2788 -0.4962 +8.2454 3.4436 -4.4895 0.8245 0.3439 -0.4494 +8.2169 4.0534 -4.0066 0.8217 0.4047 -0.4012 +8.1430 4.6140 -3.5218 0.8144 0.4607 -0.3529 +7.2109 -1.9428 -6.6505 0.7214 -0.1932 -0.6649 +7.5337 -1.3303 -6.4400 0.7536 -0.1321 -0.6439 +7.8301 -0.6799 -6.1828 0.7831 -0.0672 -0.6182 +8.0902 -0.0000 -5.8778 0.8090 0.0006 -0.5878 +8.3048 0.6979 -5.5267 0.8304 0.0702 -0.5528 +8.4666 1.4006 -5.1337 0.8465 0.1402 -0.5136 +8.5713 2.0938 -4.7062 0.8569 0.2093 -0.4710 +8.6180 2.7639 -4.2532 0.8616 0.2761 -0.4258 +8.6091 3.3993 -3.7851 0.8608 0.3395 -0.3792 +8.5499 3.9909 -3.3123 0.8549 0.3985 -0.3320 +8.4476 4.5330 -2.8441 0.8448 0.4527 -0.2853 +7.3659 -2.5323 -6.2715 0.7369 -0.2521 -0.6272 +7.7031 -1.9541 -6.0699 0.7705 -0.1944 -0.6070 +8.0178 -1.3344 -5.8253 0.8019 -0.1325 -0.5826 +8.2999 -0.6799 -5.5362 0.8300 -0.0672 -0.5537 +8.5395 -0.0000 -5.2035 0.8538 0.0006 -0.5206 +8.7285 0.6933 -4.8305 0.8726 0.0697 -0.4834 +8.8609 1.3865 -4.4230 0.8858 0.1388 -0.4427 +8.9341 2.0661 -3.9891 0.8931 0.2065 -0.3995 +8.9491 2.7194 -3.5382 0.8947 0.2717 -0.3545 +8.9098 3.3360 -3.0801 0.8908 0.3332 -0.3088 +8.8227 3.9082 -2.6241 0.8822 0.3903 -0.2633 +8.6958 4.4315 -2.1783 0.8696 0.4426 -0.2188 +7.4781 -3.0812 -5.8808 0.7481 -0.3070 -0.5882 +7.8250 -2.5393 -5.6852 0.7827 -0.2528 -0.5687 +8.1532 -1.9541 -5.4504 0.8154 -0.1944 -0.5452 +8.4529 -1.3303 -5.1748 0.8453 -0.1321 -0.5177 +8.7142 -0.6756 -4.8587 0.8713 -0.0668 -0.4862 +8.9280 -0.0000 -4.5044 0.8926 0.0006 -0.4509 +9.0876 0.6842 -4.1168 0.9084 0.0688 -0.4122 +9.1886 1.3641 -3.7027 0.9185 0.1366 -0.3710 +9.2302 2.0267 -3.2704 0.9227 0.2026 -0.3278 +9.2151 2.6606 -2.8290 0.9213 0.2658 -0.2838 +9.1484 3.2568 -2.3875 0.9147 0.3254 -0.2397 +9.0374 3.8090 -1.9538 0.9037 0.3805 -0.1964 +8.8904 4.3136 -1.5343 0.8891 0.4309 -0.1545 +7.5521 -3.5862 -5.4868 0.7555 -0.3575 -0.5489 +7.9039 -3.0812 -5.2948 0.7906 -0.3070 -0.5297 +8.2407 -2.5323 -5.0673 0.8242 -0.2521 -0.5070 +8.5533 -1.9428 -4.8028 0.8553 -0.1932 -0.4806 +8.8319 -1.3183 -4.5011 0.8831 -0.1309 -0.4505 +9.0673 -0.6672 -4.1640 0.9065 -0.0660 -0.4169 +9.2518 -0.0000 -3.7953 0.9249 0.0005 -0.3802 +9.3800 0.6713 -3.4007 0.9377 0.0675 -0.3408 +9.4496 1.3344 -2.9875 0.9446 0.1336 -0.2996 +9.4613 1.9774 -2.5640 0.9459 0.1977 -0.2574 +9.4190 2.5903 -2.1384 0.9417 0.2589 -0.2149 +9.3289 3.1653 -1.7184 0.9328 0.3163 -0.1729 +9.1985 3.6974 -1.3105 0.9198 0.3694 -0.1322 +9.0360 4.1839 -0.9198 0.9037 0.4180 -0.0931 +2.8846 3.5862 8.8780 0.2886 0.3575 0.8882 +3.2821 3.0812 8.9294 0.3282 0.3070 0.8933 +2.5932 3.0812 9.1532 0.2595 0.3070 0.9156 +3.6884 2.5323 8.9433 0.3688 0.2521 0.8947 +2.9889 2.5393 9.1988 0.2990 0.2528 0.9201 +2.2728 2.5323 9.4033 0.2275 0.2521 0.9405 +4.0967 1.9428 8.9131 0.4094 0.1932 0.8916 +3.3924 1.9541 9.2018 0.3392 0.1944 0.9204 +2.6641 1.9541 9.4384 0.2665 0.1944 0.9440 +1.9247 1.9427 9.6188 0.1928 0.1932 0.9620 +4.4994 1.3183 8.8328 0.4496 0.1309 0.8836 +3.7968 1.3303 9.1550 0.3795 0.1321 0.9157 +3.0625 1.3344 9.4255 0.3063 0.1325 0.9427 +2.3095 1.3303 9.6383 0.2312 0.1321 0.9639 +1.5517 1.3183 9.7905 0.1556 0.1309 0.9791 +4.8880 0.6672 8.6984 0.4883 0.0660 0.8701 +4.1940 0.6756 9.0528 0.4191 0.0668 0.9055 +3.4606 0.6799 9.3575 0.3460 0.0672 0.9358 +2.7005 0.6799 9.6044 0.2702 0.0672 0.9604 +1.9281 0.6756 9.7891 0.1932 0.0668 0.9789 +1.1583 0.6672 9.9103 0.1164 0.0660 0.9910 +5.2540 -0.0000 8.5085 0.5248 -0.0005 0.8512 +4.5753 -0.0000 8.8920 0.4571 -0.0006 0.8894 +3.8500 -0.0000 9.2292 0.3847 -0.0006 0.9230 +3.0902 -0.0000 9.5106 0.3090 -0.0006 0.9510 +2.3100 0.0000 9.7295 0.2312 -0.0006 0.9729 +1.5251 0.0000 9.8830 0.1530 -0.0006 0.9882 +0.7506 0.0000 9.9718 0.0757 -0.0005 0.9971 +5.5897 -0.6713 8.2646 0.5583 -0.0675 0.8269 +4.9322 -0.6843 8.6721 0.4926 -0.0688 0.8675 +4.2222 -0.6933 9.0384 0.4218 -0.0697 0.9040 +3.4702 -0.6979 9.3526 0.3469 -0.0702 0.9353 +2.6899 -0.6979 9.6061 0.2691 -0.0702 0.9605 +1.8969 -0.6933 9.7939 0.1900 -0.0697 0.9793 +1.1071 -0.6843 9.9149 0.1113 -0.0688 0.9914 +0.3357 -0.6713 9.9718 0.0344 -0.0675 0.9971 +5.8888 -1.3344 7.9713 0.5881 -0.1336 0.7976 +5.2573 -1.3641 8.3964 0.5251 -0.1366 0.8400 +4.5688 -1.3866 8.7865 0.4564 -0.1388 0.8789 +3.8321 -1.4006 9.1298 0.3829 -0.1402 0.9131 +3.0595 -1.4054 9.4162 0.3059 -0.1407 0.9416 +2.2662 -1.4006 9.6386 0.2269 -0.1402 0.9638 +1.4684 -1.3866 9.7939 0.1473 -0.1388 0.9793 +0.6821 -1.3641 9.8830 0.0689 -0.1366 0.9882 +-0.0787 -1.3344 9.9103 -0.0069 -0.1336 0.9910 +6.1473 -1.9774 7.6355 0.6139 -0.1977 0.7642 +5.5451 -2.0267 8.0712 0.5538 -0.2026 0.8076 +4.8831 -2.0662 8.4786 0.4877 -0.2065 0.8482 +4.1681 -2.0938 8.8455 0.4164 -0.2093 0.8847 +3.4109 -2.1080 9.1609 0.3410 -0.2107 0.9161 +2.6252 -2.1080 9.4162 0.2626 -0.2107 0.9416 +1.8272 -2.0938 9.6061 0.1831 -0.2093 0.9605 +1.0331 -2.0662 9.7295 0.1039 -0.2065 0.9729 +0.2581 -2.0267 9.7891 0.0266 -0.2026 0.9789 +-0.4851 -1.9774 9.7905 -0.0475 -0.1977 0.9791 +6.3632 -2.5903 7.2663 0.6355 -0.2589 0.7273 +5.7923 -2.6606 7.7052 0.5785 -0.2658 0.7711 +5.1603 -2.7195 8.1226 0.5154 -0.2717 0.8127 +4.4722 -2.7640 8.5065 0.4468 -0.2761 0.8509 +3.7368 -2.7917 8.8455 0.3734 -0.2788 0.8847 +2.9665 -2.8012 9.1298 0.2967 -0.2798 0.9131 +2.1762 -2.7917 9.3526 0.2179 -0.2788 0.9353 +1.3820 -2.7640 9.5105 0.1387 -0.2761 0.9510 +0.5996 -2.7195 9.6044 0.0607 -0.2717 0.9604 +-0.1570 -2.6606 9.6383 -0.0147 -0.2658 0.9639 +-0.8769 -2.5903 9.6188 -0.0866 -0.2589 0.9620 +6.5372 -3.1654 6.8735 0.6529 -0.3163 0.6882 +5.9979 -3.2568 7.3088 0.5990 -0.3254 0.7316 +5.3977 -3.3360 7.7289 0.5391 -0.3332 0.7735 +4.7401 -3.3993 8.1226 0.4735 -0.3395 0.8127 +4.0318 -3.4436 8.4785 0.4029 -0.3439 0.8482 +3.2834 -3.4664 8.7865 0.3283 -0.3461 0.8789 +2.5083 -3.4664 9.0384 0.2510 -0.3461 0.9040 +1.7218 -3.4436 9.2291 0.1726 -0.3439 0.9230 +0.9396 -3.3993 9.3574 0.0946 -0.3395 0.9358 +0.1761 -3.3360 9.4255 0.0185 -0.3332 0.9427 +-0.5563 -3.2568 9.4384 -0.0546 -0.3254 0.9440 +-1.2485 -3.1654 9.4033 -0.1238 -0.3163 0.9405 +6.6715 -3.6974 6.4669 0.6664 -0.3694 0.6476 +6.1630 -3.8090 6.8927 0.6156 -0.3805 0.6901 +5.5953 -3.9082 7.3088 0.5589 -0.3903 0.7316 +4.9701 -3.9910 7.7052 0.4965 -0.3985 0.7711 +4.2926 -4.0534 8.0712 0.4289 -0.4047 0.8076 +3.5712 -4.0923 8.3964 0.3570 -0.4086 0.8400 +2.8178 -4.1055 8.6721 0.2819 -0.4099 0.8675 +2.0462 -4.0923 8.8919 0.2049 -0.4086 0.8894 +1.2714 -4.0534 9.0528 0.1277 -0.4047 0.9055 +0.5082 -3.9910 9.1550 0.0515 -0.3985 0.9157 +-0.2306 -3.9082 9.2018 -0.0221 -0.3903 0.9204 +-0.9345 -3.8090 9.1988 -0.0924 -0.3805 0.9201 +-1.5961 -3.6974 9.1532 -0.1585 -0.3694 0.9156 +6.7697 -4.1839 6.0553 0.6763 -0.4180 0.6065 +6.2906 -4.3137 6.4669 0.6284 -0.4309 0.6476 +5.7547 -4.4315 6.8735 0.5749 -0.4426 0.6882 +5.1626 -4.5331 7.2663 0.5158 -0.4527 0.7273 +4.5178 -4.6140 7.6355 0.4514 -0.4607 0.7642 +3.8271 -4.6704 7.9712 0.3825 -0.4663 0.7976 +3.1003 -4.6994 8.2646 0.3100 -0.4691 0.8269 +2.3497 -4.6994 8.5085 0.2352 -0.4691 0.8512 +1.5893 -4.6704 8.6984 0.1594 -0.4663 0.8701 +0.8331 -4.6140 8.8327 0.0840 -0.4607 0.8836 +0.0945 -4.5331 8.9130 0.0103 -0.4527 0.8916 +-0.6154 -4.4315 8.9433 -0.0606 -0.4426 0.8947 +-1.2880 -4.3137 8.9294 -0.1278 -0.4309 0.8933 +-1.9175 -4.1839 8.8779 -0.1906 -0.4180 0.8882 +-7.5521 3.5862 5.4868 -0.7555 0.3575 0.5489 +-7.4781 3.0812 5.8808 -0.7481 0.3070 0.5882 +-7.9039 3.0812 5.2948 -0.7906 0.3070 0.5297 +-7.3659 2.5323 6.2715 -0.7369 0.2521 0.6272 +-7.8250 2.5393 5.6852 -0.7827 0.2528 0.5687 +-8.2408 2.5323 5.0673 -0.8242 0.2521 0.5070 +-7.2109 1.9428 6.6505 -0.7214 0.1932 0.6649 +-7.7031 1.9541 6.0699 -0.7705 0.1944 0.6070 +-8.1532 1.9541 5.4504 -0.8154 0.1944 0.5452 +-8.5533 1.9427 4.8028 -0.8553 0.1932 0.4806 +-7.0101 1.3183 7.0086 -0.7014 0.1309 0.7006 +-7.5337 1.3303 6.4400 -0.7536 0.1321 0.6439 +-8.0178 1.3344 5.8253 -0.8019 0.1325 0.5826 +-8.4529 1.3303 5.1748 -0.8453 0.1321 0.5177 +-8.8319 1.3183 4.5011 -0.8831 0.1309 0.4505 +-6.7622 0.6672 7.3367 -0.6767 0.0660 0.7333 +-7.3138 0.6756 6.7862 -0.7317 0.0668 0.6784 +-7.8301 0.6799 6.1828 -0.7831 0.0672 0.6182 +-8.2999 0.6799 5.5362 -0.8300 0.0672 0.5537 +-8.7142 0.6756 4.8587 -0.8713 0.0668 0.4862 +-9.0673 0.6672 4.1640 -0.9065 0.0660 0.4169 +-6.4685 -0.0000 7.6262 -0.6474 -0.0005 0.7621 +-7.0429 -0.0000 7.0991 -0.7046 -0.0006 0.7096 +-7.5877 -0.0000 6.5135 -0.7589 -0.0006 0.6511 +-8.0902 -0.0000 5.8778 -0.8090 -0.0006 0.5878 +-8.5395 0.0000 5.2035 -0.8538 -0.0006 0.5206 +-8.9280 0.0000 4.5044 -0.8926 -0.0006 0.4509 +-9.2518 0.0000 3.7953 -0.9249 -0.0005 0.3802 +-6.1328 -0.6713 7.8700 -0.6139 -0.0675 0.7865 +-6.7235 -0.6843 7.3706 -0.6728 -0.0688 0.7366 +-7.2913 -0.6933 6.8085 -0.7294 -0.0697 0.6805 +-7.8225 -0.6979 6.1904 -0.7823 -0.0702 0.6189 +-8.3048 -0.6979 5.5267 -0.8303 -0.0702 0.5528 +-8.7284 -0.6933 4.8305 -0.8726 -0.0697 0.4834 +-9.0876 -0.6843 4.1168 -0.9084 -0.0688 0.4122 +-9.3800 -0.6713 3.4007 -0.9377 -0.0675 0.3408 +-5.7614 -1.3344 8.0639 -0.5769 -0.1336 0.8058 +-6.3609 -1.3641 7.5946 -0.6366 -0.1366 0.7589 +-6.9447 -1.3866 7.0604 -0.6948 -0.1388 0.7056 +-7.4988 -1.4006 6.4658 -0.7500 -0.1402 0.6464 +-8.0099 -1.4054 5.8195 -0.8010 -0.1407 0.5819 +-8.4666 -1.4006 5.1337 -0.8465 -0.1402 0.5136 +-8.8609 -1.3866 4.4230 -0.8858 -0.1388 0.4427 +-9.1886 -1.3641 3.7027 -0.9185 -0.1366 0.3709 +-9.4496 -1.3344 2.9875 -0.9446 -0.1336 0.2996 +-5.3622 -1.9774 8.2059 -0.5371 -0.1977 0.8200 +-5.9626 -2.0267 7.7679 -0.5969 -0.2026 0.7762 +-6.5546 -2.0662 7.2641 -0.6559 -0.2065 0.7260 +-7.1246 -2.0938 6.6975 -0.7127 -0.2093 0.6695 +-7.6585 -2.1080 6.0748 -0.7660 -0.2107 0.6073 +-8.1441 -2.1080 5.4065 -0.8143 -0.2107 0.5408 +-8.5713 -2.0938 4.7062 -0.8569 -0.2093 0.4710 +-8.9341 -2.0662 3.9891 -0.8931 -0.2065 0.3995 +-9.2302 -2.0267 3.2704 -0.9227 -0.2026 0.3278 +-9.4613 -1.9774 2.5640 -0.9459 -0.1977 0.2574 +-4.9444 -2.5903 8.2972 -0.4953 -0.2589 0.8292 +-5.5382 -2.6606 7.8898 -0.5546 -0.2658 0.7885 +-6.1304 -2.7195 7.4177 -0.6137 -0.2717 0.7413 +-6.7082 -2.7640 6.8819 -0.6713 -0.2761 0.6879 +-7.2578 -2.7917 6.2873 -0.7260 -0.2788 0.6286 +-7.7663 -2.8012 5.6425 -0.7767 -0.2798 0.5643 +-8.2224 -2.7917 4.9597 -0.8221 -0.2788 0.4962 +-8.6180 -2.7640 4.2532 -0.8616 -0.2761 0.4258 +-8.9491 -2.7195 3.5382 -0.8947 -0.2717 0.3545 +-9.2151 -2.6606 2.8290 -0.9213 -0.2658 0.2838 +-9.4190 -2.5903 2.1384 -0.9417 -0.2589 0.2149 +-4.5170 -3.1654 8.3413 -0.4527 -0.3163 0.8336 +-5.0977 -3.2568 7.9628 -0.5107 -0.3254 0.7958 +-5.6826 -3.3360 7.5219 -0.5690 -0.3332 0.7518 +-6.2603 -3.3993 7.0181 -0.6266 -0.3395 0.7015 +-6.8177 -3.4436 6.4545 -0.6821 -0.3439 0.6453 +-7.3419 -3.4664 5.8379 -0.7344 -0.3461 0.5838 +-7.8209 -3.4664 5.1785 -0.7822 -0.3461 0.5181 +-8.2454 -3.4436 4.4895 -0.8245 -0.3439 0.4494 +-8.6091 -3.3993 3.7852 -0.8608 -0.3395 0.3792 +-8.9098 -3.3360 3.0801 -0.8908 -0.3332 0.3088 +-9.1484 -3.2568 2.3875 -0.9147 -0.3254 0.2397 +-9.3289 -3.1653 1.7184 -0.9328 -0.3163 0.1729 +-4.0888 -3.6974 8.3433 -0.4099 -0.3694 0.8339 +-4.6508 -3.8090 7.9913 -0.4660 -0.3805 0.7987 +-5.2221 -3.9082 7.5800 -0.5231 -0.3903 0.7576 +-5.7922 -3.9910 7.1079 -0.5799 -0.3985 0.7105 +-6.3497 -4.0534 6.5766 -0.6355 -0.4047 0.6575 +-6.8819 -4.0923 5.9911 -0.6886 -0.4086 0.5991 +-7.3769 -4.1055 5.3597 -0.7379 -0.4099 0.5361 +-7.8244 -4.0923 4.6937 -0.7826 -0.4086 0.4697 +-8.2169 -4.0534 4.0066 -0.8217 -0.4047 0.4012 +-8.5499 -3.9909 3.3123 -0.8549 -0.3985 0.3320 +-8.8227 -3.9082 2.6241 -0.8822 -0.3903 0.2633 +-9.0374 -3.8090 1.9538 -0.9037 -0.3805 0.1964 +-9.1985 -3.6974 1.3105 -0.9198 -0.3694 0.1322 +-3.6670 -4.1839 8.3095 -0.3678 -0.4180 0.8307 +-4.2065 -4.3137 7.9811 -0.4217 -0.4309 0.7978 +-4.7588 -4.4315 7.5971 -0.4768 -0.4426 0.7594 +-5.3154 -4.5331 7.1553 -0.5324 -0.4527 0.7153 +-5.8657 -4.6140 6.6562 -0.5873 -0.4607 0.6655 +-6.3985 -4.6704 6.1030 -0.6404 -0.4663 0.6103 +-6.9021 -4.6994 5.5024 -0.6906 -0.4691 0.5504 +-7.3660 -4.6994 4.8640 -0.7369 -0.4691 0.4867 +-7.7815 -4.6704 4.1994 -0.7783 -0.4663 0.4205 +-8.1430 -4.6140 3.5218 -0.8144 -0.4607 0.3529 +-8.4476 -4.5330 2.8441 -0.8448 -0.4527 0.2853 +-8.6958 -4.4315 2.1783 -0.8696 -0.4426 0.2188 +-8.8904 -4.3136 1.5343 -0.8891 -0.4309 0.1545 +-9.0360 -4.1839 0.9198 -0.9037 -0.4180 0.0931 +-7.5521 3.5862 -5.4868 -0.7555 0.3575 -0.5489 +-7.9039 3.0812 -5.2948 -0.7906 0.3070 -0.5297 +-7.4781 3.0812 -5.8808 -0.7481 0.3070 -0.5882 +-8.2408 2.5323 -5.0673 -0.8242 0.2521 -0.5070 +-7.8250 2.5393 -5.6852 -0.7827 0.2528 -0.5687 +-7.3659 2.5323 -6.2715 -0.7369 0.2521 -0.6272 +-8.5533 1.9427 -4.8028 -0.8553 0.1932 -0.4806 +-8.1532 1.9541 -5.4504 -0.8154 0.1944 -0.5452 +-7.7031 1.9541 -6.0699 -0.7705 0.1944 -0.6070 +-7.2109 1.9428 -6.6505 -0.7214 0.1932 -0.6649 +-8.8319 1.3183 -4.5011 -0.8831 0.1309 -0.4505 +-8.4529 1.3303 -5.1748 -0.8453 0.1321 -0.5177 +-8.0178 1.3344 -5.8253 -0.8019 0.1325 -0.5826 +-7.5337 1.3303 -6.4400 -0.7536 0.1321 -0.6439 +-7.0101 1.3183 -7.0086 -0.7014 0.1309 -0.7006 +-9.0673 0.6672 -4.1640 -0.9065 0.0660 -0.4169 +-8.7142 0.6756 -4.8587 -0.8713 0.0668 -0.4862 +-8.2999 0.6799 -5.5362 -0.8300 0.0672 -0.5537 +-7.8301 0.6799 -6.1828 -0.7831 0.0672 -0.6182 +-7.3138 0.6756 -6.7862 -0.7317 0.0668 -0.6784 +-6.7622 0.6672 -7.3367 -0.6767 0.0660 -0.7333 +-9.2518 -0.0000 -3.7953 -0.9249 -0.0005 -0.3802 +-8.9280 -0.0000 -4.5044 -0.8926 -0.0006 -0.4509 +-8.5395 -0.0000 -5.2035 -0.8538 -0.0006 -0.5206 +-8.0902 0.0000 -5.8778 -0.8090 -0.0006 -0.5878 +-7.5877 0.0000 -6.5135 -0.7589 -0.0006 -0.6511 +-7.0429 0.0000 -7.0991 -0.7046 -0.0006 -0.7096 +-6.4685 0.0000 -7.6262 -0.6474 -0.0005 -0.7621 +-9.3800 -0.6713 -3.4007 -0.9377 -0.0675 -0.3408 +-9.0876 -0.6843 -4.1168 -0.9084 -0.0688 -0.4122 +-8.7285 -0.6933 -4.8305 -0.8726 -0.0697 -0.4834 +-8.3048 -0.6979 -5.5267 -0.8303 -0.0702 -0.5528 +-7.8225 -0.6979 -6.1904 -0.7823 -0.0702 -0.6189 +-7.2913 -0.6933 -6.8085 -0.7294 -0.0697 -0.6805 +-6.7235 -0.6843 -7.3706 -0.6728 -0.0688 -0.7366 +-6.1328 -0.6713 -7.8700 -0.6139 -0.0675 -0.7865 +-9.4496 -1.3344 -2.9875 -0.9446 -0.1336 -0.2996 +-9.1886 -1.3641 -3.7027 -0.9185 -0.1366 -0.3709 +-8.8609 -1.3866 -4.4230 -0.8858 -0.1388 -0.4427 +-8.4666 -1.4006 -5.1337 -0.8465 -0.1402 -0.5136 +-8.0099 -1.4054 -5.8195 -0.8010 -0.1407 -0.5819 +-7.4988 -1.4006 -6.4658 -0.7500 -0.1402 -0.6464 +-6.9447 -1.3866 -7.0604 -0.6948 -0.1388 -0.7056 +-6.3609 -1.3641 -7.5946 -0.6366 -0.1366 -0.7589 +-5.7614 -1.3344 -8.0639 -0.5769 -0.1336 -0.8058 +-9.4613 -1.9774 -2.5640 -0.9459 -0.1977 -0.2574 +-9.2302 -2.0267 -3.2704 -0.9227 -0.2026 -0.3278 +-8.9341 -2.0662 -3.9891 -0.8931 -0.2065 -0.3995 +-8.5713 -2.0938 -4.7062 -0.8569 -0.2093 -0.4710 +-8.1441 -2.1080 -5.4065 -0.8143 -0.2107 -0.5408 +-7.6585 -2.1080 -6.0748 -0.7660 -0.2107 -0.6073 +-7.1246 -2.0938 -6.6975 -0.7127 -0.2093 -0.6695 +-6.5546 -2.0662 -7.2641 -0.6559 -0.2065 -0.7260 +-5.9626 -2.0267 -7.7679 -0.5969 -0.2026 -0.7762 +-5.3622 -1.9774 -8.2059 -0.5371 -0.1977 -0.8200 +-9.4190 -2.5903 -2.1384 -0.9417 -0.2589 -0.2149 +-9.2151 -2.6606 -2.8290 -0.9213 -0.2658 -0.2838 +-8.9491 -2.7195 -3.5382 -0.8947 -0.2717 -0.3545 +-8.6180 -2.7640 -4.2532 -0.8616 -0.2761 -0.4258 +-8.2224 -2.7917 -4.9597 -0.8221 -0.2788 -0.4962 +-7.7663 -2.8012 -5.6425 -0.7767 -0.2798 -0.5643 +-7.2578 -2.7917 -6.2873 -0.7260 -0.2788 -0.6286 +-6.7082 -2.7640 -6.8819 -0.6713 -0.2761 -0.6879 +-6.1304 -2.7195 -7.4177 -0.6137 -0.2717 -0.7413 +-5.5382 -2.6606 -7.8898 -0.5546 -0.2658 -0.7885 +-4.9444 -2.5903 -8.2972 -0.4953 -0.2589 -0.8292 +-9.3289 -3.1653 -1.7184 -0.9328 -0.3163 -0.1729 +-9.1484 -3.2568 -2.3875 -0.9147 -0.3254 -0.2398 +-8.9098 -3.3360 -3.0801 -0.8908 -0.3332 -0.3088 +-8.6091 -3.3993 -3.7852 -0.8608 -0.3395 -0.3792 +-8.2454 -3.4436 -4.4895 -0.8245 -0.3439 -0.4494 +-7.8209 -3.4664 -5.1785 -0.7822 -0.3461 -0.5181 +-7.3419 -3.4664 -5.8379 -0.7344 -0.3461 -0.5838 +-6.8177 -3.4436 -6.4545 -0.6821 -0.3439 -0.6453 +-6.2603 -3.3993 -7.0181 -0.6266 -0.3395 -0.7015 +-5.6826 -3.3360 -7.5219 -0.5690 -0.3332 -0.7518 +-5.0977 -3.2568 -7.9628 -0.5107 -0.3254 -0.7958 +-4.5170 -3.1654 -8.3413 -0.4527 -0.3163 -0.8336 +-9.1985 -3.6974 -1.3105 -0.9198 -0.3694 -0.1322 +-9.0374 -3.8090 -1.9538 -0.9037 -0.3805 -0.1964 +-8.8227 -3.9082 -2.6241 -0.8822 -0.3903 -0.2633 +-8.5499 -3.9909 -3.3123 -0.8549 -0.3985 -0.3320 +-8.2169 -4.0534 -4.0066 -0.8217 -0.4047 -0.4012 +-7.8244 -4.0923 -4.6937 -0.7826 -0.4086 -0.4697 +-7.3769 -4.1055 -5.3597 -0.7379 -0.4099 -0.5361 +-6.8819 -4.0923 -5.9911 -0.6886 -0.4086 -0.5991 +-6.3497 -4.0534 -6.5766 -0.6355 -0.4047 -0.6575 +-5.7922 -3.9910 -7.1079 -0.5799 -0.3985 -0.7105 +-5.2221 -3.9082 -7.5800 -0.5231 -0.3903 -0.7576 +-4.6508 -3.8090 -7.9913 -0.4660 -0.3805 -0.7987 +-4.0888 -3.6974 -8.3433 -0.4099 -0.3694 -0.8339 +-9.0360 -4.1839 -0.9198 -0.9037 -0.4180 -0.0931 +-8.8904 -4.3136 -1.5343 -0.8891 -0.4309 -0.1545 +-8.6958 -4.4315 -2.1783 -0.8696 -0.4426 -0.2188 +-8.4476 -4.5330 -2.8441 -0.8448 -0.4527 -0.2853 +-8.1430 -4.6140 -3.5218 -0.8144 -0.4607 -0.3529 +-7.7815 -4.6704 -4.1994 -0.7783 -0.4663 -0.4205 +-7.3660 -4.6994 -4.8640 -0.7369 -0.4691 -0.4867 +-6.9021 -4.6994 -5.5024 -0.6906 -0.4691 -0.5504 +-6.3985 -4.6704 -6.1030 -0.6404 -0.4663 -0.6103 +-5.8657 -4.6140 -6.6562 -0.5873 -0.4607 -0.6655 +-5.3154 -4.5331 -7.1553 -0.5324 -0.4527 -0.7153 +-4.7588 -4.4315 -7.5971 -0.4768 -0.4426 -0.7594 +-4.2065 -4.3137 -7.9811 -0.4217 -0.4309 -0.7978 +-3.6670 -4.1839 -8.3095 -0.3678 -0.4180 -0.8307 +2.8846 3.5862 -8.8780 0.2886 0.3575 -0.8882 +2.5932 3.0812 -9.1532 0.2595 0.3070 -0.9156 +3.2821 3.0812 -8.9294 0.3282 0.3070 -0.8933 +2.2728 2.5323 -9.4033 0.2275 0.2521 -0.9405 +2.9889 2.5393 -9.1988 0.2990 0.2528 -0.9201 +3.6884 2.5323 -8.9433 0.3688 0.2521 -0.8947 +1.9247 1.9427 -9.6188 0.1928 0.1932 -0.9620 +2.6641 1.9541 -9.4384 0.2665 0.1944 -0.9440 +3.3924 1.9541 -9.2018 0.3392 0.1944 -0.9204 +4.0967 1.9428 -8.9131 0.4094 0.1932 -0.8916 +1.5517 1.3183 -9.7905 0.1556 0.1309 -0.9791 +2.3095 1.3303 -9.6383 0.2312 0.1321 -0.9639 +3.0625 1.3344 -9.4255 0.3063 0.1325 -0.9427 +3.7968 1.3303 -9.1550 0.3795 0.1321 -0.9157 +4.4994 1.3183 -8.8328 0.4496 0.1309 -0.8836 +1.1583 0.6672 -9.9103 0.1164 0.0660 -0.9910 +1.9281 0.6756 -9.7891 0.1932 0.0668 -0.9789 +2.7005 0.6799 -9.6044 0.2702 0.0672 -0.9604 +3.4606 0.6799 -9.3575 0.3460 0.0672 -0.9358 +4.1940 0.6756 -9.0528 0.4191 0.0668 -0.9055 +4.8880 0.6672 -8.6984 0.4883 0.0660 -0.8701 +0.7506 -0.0000 -9.9718 0.0757 -0.0005 -0.9971 +1.5251 -0.0000 -9.8830 0.1530 -0.0006 -0.9882 +2.3100 -0.0000 -9.7295 0.2312 -0.0006 -0.9729 +3.0902 0.0000 -9.5106 0.3090 -0.0006 -0.9510 +3.8500 0.0000 -9.2292 0.3847 -0.0006 -0.9230 +4.5753 0.0000 -8.8920 0.4571 -0.0006 -0.8894 +5.2540 0.0000 -8.5085 0.5248 -0.0005 -0.8512 +0.3357 -0.6713 -9.9718 0.0344 -0.0675 -0.9971 +1.1071 -0.6843 -9.9149 0.1113 -0.0688 -0.9914 +1.8969 -0.6933 -9.7939 0.1900 -0.0697 -0.9793 +2.6899 -0.6979 -9.6061 0.2691 -0.0702 -0.9605 +3.4702 -0.6979 -9.3526 0.3469 -0.0702 -0.9353 +4.2222 -0.6933 -9.0384 0.4218 -0.0697 -0.9040 +4.9322 -0.6843 -8.6721 0.4926 -0.0688 -0.8675 +5.5897 -0.6713 -8.2646 0.5583 -0.0675 -0.8269 +-0.0787 -1.3344 -9.9103 -0.0069 -0.1336 -0.9910 +0.6821 -1.3641 -9.8830 0.0689 -0.1366 -0.9882 +1.4684 -1.3866 -9.7939 0.1473 -0.1388 -0.9793 +2.2662 -1.4006 -9.6386 0.2269 -0.1402 -0.9638 +3.0595 -1.4054 -9.4162 0.3059 -0.1407 -0.9416 +3.8321 -1.4006 -9.1298 0.3829 -0.1402 -0.9131 +4.5688 -1.3866 -8.7865 0.4564 -0.1388 -0.8789 +5.2573 -1.3641 -8.3964 0.5251 -0.1366 -0.8400 +5.8888 -1.3344 -7.9713 0.5881 -0.1336 -0.7976 +-0.4851 -1.9774 -9.7905 -0.0475 -0.1977 -0.9791 +0.2581 -2.0267 -9.7891 0.0266 -0.2026 -0.9789 +1.0331 -2.0662 -9.7295 0.1039 -0.2065 -0.9729 +1.8272 -2.0938 -9.6061 0.1831 -0.2093 -0.9605 +2.6252 -2.1080 -9.4162 0.2626 -0.2107 -0.9416 +3.4109 -2.1080 -9.1609 0.3410 -0.2107 -0.9161 +4.1681 -2.0938 -8.8455 0.4164 -0.2093 -0.8847 +4.8831 -2.0662 -8.4786 0.4877 -0.2065 -0.8482 +5.5451 -2.0267 -8.0712 0.5538 -0.2026 -0.8076 +6.1473 -1.9774 -7.6355 0.6139 -0.1977 -0.7642 +-0.8769 -2.5903 -9.6188 -0.0866 -0.2589 -0.9620 +-0.1570 -2.6606 -9.6383 -0.0147 -0.2658 -0.9639 +0.5996 -2.7195 -9.6044 0.0607 -0.2717 -0.9604 +1.3820 -2.7640 -9.5105 0.1387 -0.2761 -0.9510 +2.1762 -2.7917 -9.3526 0.2179 -0.2788 -0.9353 +2.9665 -2.8012 -9.1298 0.2967 -0.2798 -0.9131 +3.7368 -2.7917 -8.8455 0.3734 -0.2788 -0.8847 +4.4722 -2.7640 -8.5065 0.4468 -0.2761 -0.8509 +5.1603 -2.7195 -8.1226 0.5154 -0.2717 -0.8127 +5.7923 -2.6606 -7.7052 0.5785 -0.2658 -0.7711 +6.3632 -2.5903 -7.2663 0.6355 -0.2589 -0.7273 +-1.2485 -3.1654 -9.4033 -0.1238 -0.3163 -0.9405 +-0.5563 -3.2568 -9.4384 -0.0546 -0.3254 -0.9440 +0.1761 -3.3360 -9.4255 0.0185 -0.3332 -0.9427 +0.9396 -3.3993 -9.3574 0.0946 -0.3395 -0.9358 +1.7218 -3.4436 -9.2291 0.1726 -0.3439 -0.9230 +2.5083 -3.4664 -9.0384 0.2510 -0.3461 -0.9040 +3.2834 -3.4664 -8.7865 0.3283 -0.3461 -0.8789 +4.0318 -3.4436 -8.4785 0.4029 -0.3439 -0.8482 +4.7401 -3.3993 -8.1226 0.4735 -0.3395 -0.8127 +5.3977 -3.3360 -7.7289 0.5391 -0.3332 -0.7735 +5.9979 -3.2568 -7.3088 0.5990 -0.3254 -0.7316 +6.5372 -3.1654 -6.8735 0.6529 -0.3163 -0.6882 +-1.5961 -3.6974 -9.1532 -0.1585 -0.3694 -0.9156 +-0.9345 -3.8090 -9.1988 -0.0924 -0.3805 -0.9201 +-0.2306 -3.9082 -9.2018 -0.0221 -0.3903 -0.9204 +0.5082 -3.9910 -9.1550 0.0515 -0.3985 -0.9157 +1.2714 -4.0534 -9.0528 0.1277 -0.4047 -0.9055 +2.0462 -4.0923 -8.8919 0.2049 -0.4086 -0.8894 +2.8178 -4.1055 -8.6721 0.2819 -0.4099 -0.8675 +3.5712 -4.0923 -8.3964 0.3570 -0.4086 -0.8400 +4.2926 -4.0534 -8.0712 0.4289 -0.4047 -0.8076 +4.9701 -3.9910 -7.7052 0.4965 -0.3985 -0.7711 +5.5953 -3.9082 -7.3088 0.5589 -0.3903 -0.7316 +6.1630 -3.8090 -6.8927 0.6156 -0.3805 -0.6901 +6.6715 -3.6974 -6.4669 0.6664 -0.3694 -0.6476 +-1.9175 -4.1839 -8.8779 -0.1906 -0.4180 -0.8882 +-1.2880 -4.3137 -8.9294 -0.1278 -0.4309 -0.8933 +-0.6154 -4.4315 -8.9433 -0.0606 -0.4426 -0.8947 +0.0945 -4.5331 -8.9130 0.0103 -0.4527 -0.8916 +0.8331 -4.6140 -8.8327 0.0840 -0.4607 -0.8836 +1.5893 -4.6704 -8.6984 0.1594 -0.4663 -0.8701 +2.3497 -4.6994 -8.5085 0.2352 -0.4691 -0.8512 +3.1003 -4.6994 -8.2646 0.3100 -0.4691 -0.8269 +3.8271 -4.6704 -7.9712 0.3825 -0.4663 -0.7976 +4.5178 -4.6140 -7.6355 0.4514 -0.4607 -0.7642 +5.1626 -4.5331 -7.2663 0.5158 -0.4527 -0.7273 +5.7547 -4.4315 -6.8735 0.5749 -0.4426 -0.6882 +6.2906 -4.3137 -6.4669 0.6284 -0.4309 -0.6476 +6.7697 -4.1839 -6.0553 0.6763 -0.4180 -0.6065 +9.3348 3.5862 -0.0000 0.9339 0.3575 0.0000 +9.5066 3.0812 -0.3622 0.9510 0.3070 -0.0361 +9.5066 3.0812 0.3622 0.9510 0.3070 0.0361 +9.6454 2.5323 -0.7442 0.9648 0.2521 -0.0742 +9.6722 2.5393 -0.0000 0.9675 0.2528 0.0000 +9.6454 2.5323 0.7442 0.9648 0.2521 0.0742 +9.7428 1.9427 -1.1419 0.9745 0.1932 -0.1139 +9.7997 1.9541 -0.3829 0.9802 0.1944 -0.0382 +9.7997 1.9541 0.3829 0.9802 0.1944 0.0382 +9.7428 1.9427 1.1419 0.9745 0.1932 0.1139 +9.7908 1.3183 -1.5497 0.9792 0.1309 -0.1545 +9.8802 1.3303 -0.7819 0.9882 0.1321 -0.0779 +9.9106 1.3344 -0.0000 0.9912 0.1325 0.0000 +9.8802 1.3303 0.7819 0.9882 0.1321 0.0779 +9.7908 1.3183 1.5497 0.9792 0.1309 0.1545 +9.7832 0.6672 -1.9608 0.9785 0.0660 -0.1955 +9.9058 0.6756 -1.1912 0.9907 0.0668 -0.1187 +9.9689 0.6799 -0.3996 0.9969 0.0672 -0.0398 +9.9689 0.6799 0.3996 0.9969 0.0672 0.0398 +9.9058 0.6756 1.1912 0.9907 0.0668 0.1187 +9.7832 0.6672 1.9608 0.9785 0.0660 0.1955 +9.7157 -0.0000 -2.3676 0.9717 -0.0005 -0.2361 +9.8706 -0.0000 -1.6036 0.9871 -0.0006 -0.1599 +9.9672 -0.0000 -0.8096 0.9967 -0.0006 -0.0807 +10.0000 -0.0000 -0.0000 1.0000 -0.0006 0.0000 +9.9672 0.0000 0.8096 0.9967 -0.0006 0.0807 +9.8706 0.0000 1.6035 0.9871 -0.0006 0.1599 +9.7157 0.0000 2.3676 0.9717 -0.0005 0.2361 +9.5875 -0.6713 -2.7622 0.9589 -0.0675 -0.2754 +9.7718 -0.6843 -2.0109 0.9773 -0.0688 -0.2004 +9.9008 -0.6933 -1.2225 0.9901 -0.0697 -0.1218 +9.9672 -0.6979 -0.4102 0.9967 -0.0702 -0.0409 +9.9672 -0.6979 0.4102 0.9967 -0.0702 0.0409 +9.9008 -0.6933 1.2225 0.9901 -0.0697 0.1218 +9.7718 -0.6843 2.0109 0.9773 -0.0688 0.2004 +9.5875 -0.6713 2.7622 0.9589 -0.0675 0.2754 +9.4009 -1.3344 -3.1373 0.9403 -0.1336 -0.3128 +9.6101 -1.3641 -2.4053 0.9611 -0.1366 -0.2398 +9.7684 -1.3866 -1.6300 0.9769 -0.1388 -0.1625 +9.8672 -1.4006 -0.8232 0.9867 -0.1402 -0.0820 +9.9008 -1.4054 -0.0000 0.9901 -0.1407 0.0000 +9.8672 -1.4006 0.8232 0.9867 -0.1402 0.0820 +9.7684 -1.3866 1.6300 0.9769 -0.1388 0.1625 +9.6101 -1.3641 2.4053 0.9611 -0.1366 0.2398 +9.4009 -1.3344 3.1373 0.9403 -0.1336 0.3128 +9.1614 -1.9774 -3.4868 0.9165 -0.1977 -0.3477 +9.3897 -2.0267 -2.7795 0.9392 -0.2026 -0.2771 +9.5726 -2.0662 -2.0241 0.9574 -0.2065 -0.2018 +9.7006 -2.0938 -1.2307 0.9701 -0.2093 -0.1227 +9.7666 -2.1080 -0.4130 0.9767 -0.2107 -0.0411 +9.7666 -2.1080 0.4130 0.9767 -0.2107 0.0411 +9.7006 -2.0938 1.2307 0.9701 -0.2093 0.1227 +9.5726 -2.0662 2.0241 0.9574 -0.2065 0.2018 +9.3897 -2.0267 2.7795 0.9392 -0.2026 0.2771 +9.1614 -1.9774 3.4868 0.9165 -0.1977 0.3477 +8.8771 -2.5903 -3.8063 0.8881 -0.2589 -0.3797 +9.1180 -2.6606 -3.1277 0.9121 -0.2658 -0.3119 +9.3196 -2.7195 -2.3976 0.9322 -0.2717 -0.2390 +9.4721 -2.7640 -1.6246 0.9474 -0.2761 -0.1619 +9.5673 -2.7917 -0.8204 0.9568 -0.2788 -0.0818 +9.5997 -2.8012 -0.0000 0.9601 -0.2798 0.0000 +9.5673 -2.7917 0.8204 0.9568 -0.2788 0.0818 +9.4721 -2.7640 1.6246 0.9474 -0.2761 0.1619 +9.3196 -2.7195 2.3976 0.9322 -0.2717 0.2390 +9.1180 -2.6606 3.1277 0.9121 -0.2658 0.3119 +8.8771 -2.5903 3.8063 0.8881 -0.2589 0.3797 +8.5573 -3.1654 -4.0931 0.8563 -0.3163 -0.4083 +8.8046 -3.2568 -3.4457 0.8809 -0.3254 -0.3437 +9.0186 -3.3360 -2.7451 0.9022 -0.3332 -0.2737 +9.1898 -3.3993 -1.9980 0.9192 -0.3395 -0.1992 +9.3095 -3.4436 -1.2144 0.9312 -0.3439 -0.1210 +9.3711 -3.4664 -0.4075 0.9373 -0.3461 -0.0406 +9.3711 -3.4664 0.4075 0.9373 -0.3461 0.0406 +9.3095 -3.4436 1.2144 0.9312 -0.3439 0.1210 +9.1898 -3.3993 1.9980 0.9192 -0.3395 0.1992 +9.0186 -3.3360 2.7451 0.9022 -0.3332 0.2737 +8.8046 -3.2568 3.4457 0.8809 -0.3254 0.3437 +8.5573 -3.1654 4.0931 0.8563 -0.3163 0.4083 +8.2120 -3.6974 -4.3465 0.8218 -0.3694 -0.4337 +8.4598 -3.8090 -3.7314 0.8466 -0.3805 -0.3722 +8.6802 -3.9082 -3.0628 0.8685 -0.3903 -0.3055 +8.8640 -3.9910 -2.3458 0.8868 -0.3985 -0.2339 +9.0026 -4.0534 -1.5883 0.9006 -0.4047 -0.1584 +9.0890 -4.0923 -0.8018 0.9092 -0.4086 -0.0799 +9.1184 -4.1055 0.0000 0.9121 -0.4099 0.0000 +9.0890 -4.0923 0.8018 0.9092 -0.4086 0.0799 +9.0026 -4.0534 1.5883 0.9006 -0.4047 0.1584 +8.8640 -3.9909 2.3458 0.8868 -0.3985 0.2339 +8.6802 -3.9082 3.0628 0.8685 -0.3903 0.3055 +8.4598 -3.8090 3.7314 0.8466 -0.3805 0.3722 +8.2120 -3.6974 4.3465 0.8218 -0.3694 0.4337 +7.8509 -4.1839 -4.5671 0.7858 -0.4180 -0.4558 +8.0943 -4.3137 -3.9843 0.8101 -0.4309 -0.3976 +8.3154 -4.4315 -3.3489 0.8321 -0.4426 -0.3341 +8.5060 -4.5331 -2.6644 0.8511 -0.4527 -0.2658 +8.6579 -4.6140 -1.9371 0.8663 -0.4607 -0.1932 +8.7637 -4.6704 -1.1765 0.8768 -0.4663 -0.1173 +8.8182 -4.6994 -0.3946 0.8822 -0.4691 -0.0393 +8.8182 -4.6994 0.3946 0.8822 -0.4691 0.0393 +8.7637 -4.6704 1.1765 0.8768 -0.4663 0.1173 +8.6579 -4.6140 1.9371 0.8663 -0.4607 0.1932 +8.5060 -4.5331 2.6644 0.8511 -0.4527 0.2658 +8.3154 -4.4315 3.3489 0.8321 -0.4426 0.3341 +8.0943 -4.3137 3.9843 0.8101 -0.4309 0.3976 +7.8509 -4.1839 4.5671 0.7858 -0.4180 0.4558 +6.5850 -5.1510 5.4868 0.6576 -0.5159 0.5489 +6.2906 -5.6916 5.2947 0.6282 -0.5699 0.5297 +6.1002 -5.3107 5.8808 0.6091 -0.5319 0.5882 +5.9503 -6.2383 5.0673 0.5941 -0.6244 0.5070 +5.7707 -5.8633 5.6851 0.5762 -0.5870 0.5687 +5.5590 -5.4558 6.2714 0.5551 -0.5464 0.6272 +5.5627 -6.7815 4.8028 0.5553 -0.6786 0.4806 +5.3940 -6.4186 5.4503 0.5385 -0.6424 0.5452 +5.1927 -6.0161 6.0698 0.5184 -0.6023 0.6070 +4.9624 -5.5809 6.6504 0.4955 -0.5589 0.6649 +5.1288 -7.3100 4.5011 0.5120 -0.7313 0.4505 +4.9701 -6.9656 5.1748 0.4962 -0.6970 0.5177 +4.7792 -6.5747 5.8252 0.4771 -0.6579 0.5826 +4.5590 -6.1434 6.4400 0.4552 -0.6149 0.6439 +4.3141 -5.6805 7.0086 0.4308 -0.5688 0.7006 +4.6517 -7.8117 4.1640 0.4644 -0.7813 0.4169 +4.5013 -7.4921 4.8587 0.4494 -0.7494 0.4862 +4.3199 -7.1196 5.5362 0.4313 -0.7123 0.5537 +4.1098 -6.6995 6.1828 0.4103 -0.6704 0.6182 +3.8751 -6.2396 6.7862 0.3869 -0.6245 0.6784 +3.6209 -5.7500 7.3367 0.3616 -0.5757 0.7333 +4.1375 -8.2751 3.7952 0.4131 -0.8275 0.3802 +3.9927 -7.9855 4.5044 0.3986 -0.7986 0.4509 +3.8190 -7.6380 5.2035 0.3813 -0.7639 0.5206 +3.6180 -7.2361 5.8778 0.3612 -0.7239 0.5878 +3.3933 -6.7867 6.5135 0.3388 -0.6791 0.6511 +3.1497 -6.2994 7.0990 0.3146 -0.6305 0.7096 +2.8928 -5.7857 7.6261 0.2890 -0.5793 0.7621 +3.5944 -8.6900 3.4006 0.3590 -0.8689 0.3408 +3.4521 -8.4342 4.1168 0.3447 -0.8433 0.4122 +3.2834 -8.1170 4.8304 0.3279 -0.8117 0.4834 +3.0897 -7.7402 5.5266 0.3086 -0.7741 0.5528 +2.8741 -7.3088 6.1904 0.2871 -0.7311 0.6189 +2.6407 -6.8316 6.8085 0.2638 -0.6836 0.6805 +2.3949 -6.3198 7.3705 0.2393 -0.6325 0.7366 +2.1423 -5.7857 7.8700 0.2141 -0.5793 0.7865 +3.0324 -9.0487 2.9875 0.3029 -0.9047 0.2996 +2.8892 -8.8285 3.7026 0.2886 -0.8827 0.3709 +2.7225 -8.5455 4.4230 0.2720 -0.8544 0.4427 +2.5337 -8.1991 5.1337 0.2531 -0.8198 0.5136 +2.3252 -7.7928 5.8195 0.2323 -0.7793 0.5819 +2.1009 -7.3335 6.4657 0.2100 -0.7335 0.6463 +1.8656 -6.8316 7.0603 0.1866 -0.6836 0.7056 +1.6246 -6.2994 7.5946 0.1625 -0.6305 0.7589 +1.3831 -5.7500 8.0638 0.1385 -0.5757 0.8058 +2.4626 -9.3468 2.5640 0.2461 -0.9344 0.2574 +2.3152 -9.1621 3.2704 0.2314 -0.9159 0.3278 +2.1474 -8.9149 3.9891 0.2147 -0.8912 0.3995 +1.9605 -8.6028 4.7062 0.1960 -0.8601 0.4710 +1.7567 -8.2271 5.4064 0.1757 -0.8226 0.5408 +1.5396 -7.7928 6.0747 0.1541 -0.7793 0.6073 +1.3135 -7.3088 6.6975 0.1315 -0.7311 0.6695 +1.0833 -6.7867 7.2641 0.1086 -0.6791 0.7260 +0.8539 -6.2396 7.7678 0.0857 -0.6245 0.7762 +0.6295 -5.6805 8.2058 0.0633 -0.5688 0.8200 +1.8955 -9.5830 2.1384 0.1896 -0.9580 0.2149 +1.7414 -9.4321 2.8290 0.1742 -0.9429 0.2838 +1.5698 -9.2205 3.5382 0.1571 -0.9217 0.3545 +1.3820 -8.9443 4.2532 0.1383 -0.8941 0.4258 +1.1802 -8.6028 4.9597 0.1182 -0.8601 0.4962 +0.9678 -8.1991 5.6425 0.0971 -0.8198 0.5643 +0.7489 -7.7401 6.2872 0.0753 -0.7741 0.6286 +0.5279 -7.2361 6.8819 0.0532 -0.7239 0.6879 +0.3093 -6.6995 7.4177 0.0314 -0.6704 0.7413 +0.0971 -6.1434 7.8898 0.0102 -0.6149 0.7885 +-0.1056 -5.5809 8.2972 -0.0100 -0.5589 0.8292 +1.3408 -9.7596 1.7184 0.1343 -0.9757 0.1729 +1.1783 -9.6391 2.3875 0.1180 -0.9636 0.2397 +1.0008 -9.4611 3.0801 0.1003 -0.9458 0.3088 +0.8097 -9.2205 3.7851 0.0813 -0.9217 0.3792 +0.6074 -8.9149 4.4894 0.0611 -0.8912 0.4494 +0.3972 -8.5455 5.1785 0.0402 -0.8544 0.5181 +0.1830 -8.1170 5.8378 0.0188 -0.8117 0.5838 +-0.0310 -7.6380 6.4545 -0.0025 -0.7639 0.6453 +-0.2407 -7.1196 7.0181 -0.0234 -0.7123 0.7015 +-0.4424 -6.5746 7.5219 -0.0435 -0.6579 0.7518 +-0.6332 -6.0160 7.9628 -0.0626 -0.6023 0.7958 +-0.8110 -5.4558 8.3412 -0.0804 -0.5464 0.8336 +0.8066 -9.8809 1.3105 0.0809 -0.9879 0.1322 +0.6348 -9.7867 1.9538 0.0638 -0.9784 0.1964 +0.4501 -9.6391 2.6241 0.0454 -0.9636 0.2633 +0.2541 -9.4321 3.3123 0.0259 -0.9429 0.3320 +0.0493 -9.1621 4.0066 0.0055 -0.9159 0.4012 +-0.1610 -8.8285 4.6937 -0.0154 -0.8827 0.4697 +-0.3729 -8.4342 5.3596 -0.0366 -0.8433 0.5361 +-0.5825 -7.9855 5.9910 -0.0575 -0.7986 0.5991 +-0.7857 -7.4921 6.5766 -0.0778 -0.7494 0.6575 +-0.9792 -6.9656 7.1079 -0.0971 -0.6970 0.7105 +-1.1601 -6.4186 7.5800 -0.1152 -0.6424 0.7576 +-1.3268 -5.8633 7.9913 -0.1319 -0.5870 0.7987 +-1.4784 -5.3107 8.3433 -0.1470 -0.5319 0.8339 +0.2988 -9.9531 0.9198 0.0302 -0.9952 0.0931 +0.1177 -9.8809 1.5343 0.0122 -0.9879 0.1545 +-0.0747 -9.7596 2.1783 -0.0070 -0.9757 0.2188 +-0.2765 -9.5830 2.8441 -0.0270 -0.9580 0.2853 +-0.4852 -9.3467 3.5218 -0.0478 -0.9344 0.3529 +-0.6973 -9.0487 4.1994 -0.0689 -0.9047 0.4205 +-0.9090 -8.6900 4.8639 -0.0901 -0.8689 0.4867 +-1.1165 -8.2751 5.5024 -0.1108 -0.8275 0.5504 +-1.3158 -7.8117 6.1030 -0.1306 -0.7813 0.6103 +-1.5035 -7.3099 6.6561 -0.1494 -0.7313 0.6655 +-1.6773 -6.7815 7.1553 -0.1668 -0.6786 0.7153 +-1.8353 -6.2383 7.5970 -0.1826 -0.6244 0.7594 +-1.9769 -5.6916 7.9811 -0.1968 -0.5699 0.7978 +-2.1022 -5.1510 8.3095 -0.2094 -0.5159 0.8307 +-3.1834 -5.1510 7.9582 -0.3188 -0.5159 0.7951 +-3.0917 -5.6916 7.6189 -0.3097 -0.5699 0.7611 +-3.7079 -5.3107 7.6189 -0.3712 -0.5319 0.7611 +-2.9805 -6.2383 7.2249 -0.2986 -0.6244 0.7217 +-3.6237 -5.8633 7.2450 -0.3628 -0.5870 0.7237 +-4.2467 -5.4558 7.2249 -0.4249 -0.5464 0.7217 +-2.8487 -6.7815 6.7746 -0.2855 -0.6786 0.6767 +-3.5168 -6.4186 6.8142 -0.3521 -0.6424 0.6806 +-4.1681 -6.0161 6.8142 -0.4171 -0.6023 0.6806 +-4.7915 -5.5809 6.7746 -0.4793 -0.5589 0.6767 +-2.6959 -7.3100 6.2687 -0.2703 -0.7313 0.6262 +-3.3857 -6.9656 6.3259 -0.3391 -0.6970 0.6319 +-4.0633 -6.5747 6.3454 -0.4066 -0.6579 0.6338 +-4.7160 -6.1434 6.3259 -0.4717 -0.6149 0.6319 +-5.3325 -5.6805 6.2687 -0.5332 -0.5688 0.6262 +-2.5227 -7.8117 5.7108 -0.2530 -0.7813 0.5705 +-3.2299 -7.4921 5.7824 -0.3235 -0.7494 0.5776 +-3.9303 -7.1196 5.8192 -0.3934 -0.7123 0.5813 +-4.6102 -6.6995 5.8192 -0.4611 -0.6704 0.5813 +-5.2566 -6.2396 5.7824 -0.5256 -0.6245 0.5776 +-5.8587 -5.7500 5.7108 -0.5857 -0.5757 0.5705 +-2.3309 -8.2751 5.1078 -0.2339 -0.8275 0.5104 +-3.0501 -7.9855 5.1892 -0.3056 -0.7986 0.5184 +-3.7687 -7.6380 5.2400 -0.3772 -0.7639 0.5235 +-4.4721 -7.2361 5.2573 -0.4474 -0.7239 0.5252 +-5.1461 -6.7867 5.2400 -0.5146 -0.6791 0.5235 +-5.7783 -6.2994 5.1892 -0.5776 -0.6305 0.5184 +-6.3590 -5.7857 5.1078 -0.6355 -0.5793 0.5104 +-2.1235 -8.6900 4.4693 -0.2132 -0.8689 0.4467 +-2.8486 -8.4342 4.5552 -0.2855 -0.8433 0.4552 +-3.5794 -8.1170 4.6154 -0.3584 -0.8117 0.4612 +-4.3014 -7.7401 4.6463 -0.4303 -0.7741 0.4643 +-4.9993 -7.3088 4.6463 -0.4999 -0.7311 0.4643 +-5.6593 -6.8316 4.6154 -0.5657 -0.6836 0.4612 +-6.2698 -6.3198 4.5552 -0.6266 -0.6325 0.4552 +-6.8229 -5.7857 4.4693 -0.6818 -0.5793 0.4467 +-1.9042 -9.0487 3.8072 -0.1913 -0.9047 0.3807 +-2.6286 -8.8286 3.8919 -0.2636 -0.8827 0.3891 +-3.3652 -8.5455 3.9560 -0.3370 -0.8544 0.3955 +-4.0995 -8.1991 3.9960 -0.4102 -0.8198 0.3995 +-4.8162 -7.7928 4.0096 -0.4816 -0.7793 0.4008 +-5.5001 -7.3335 3.9960 -0.5498 -0.7335 0.3995 +-6.1383 -6.8316 3.9560 -0.6135 -0.6836 0.3955 +-6.7209 -6.2994 3.8919 -0.6716 -0.6305 0.3891 +-7.2418 -5.7499 3.8072 -0.7236 -0.5757 0.3807 +-1.6775 -9.3468 3.1343 -0.1687 -0.9344 0.3136 +-2.3949 -9.1621 3.2124 -0.2403 -0.9160 0.3214 +-3.1302 -8.9149 3.2750 -0.3136 -0.8912 0.3276 +-3.8700 -8.6028 3.3188 -0.3873 -0.8601 0.3319 +-4.5990 -8.2270 3.3414 -0.4600 -0.8226 0.3342 +-5.3017 -7.7928 3.3414 -0.5300 -0.7793 0.3342 +-5.9638 -7.3088 3.3188 -0.5960 -0.7311 0.3319 +-6.5738 -6.7867 3.2750 -0.6569 -0.6791 0.3276 +-7.1238 -6.2395 3.2124 -0.7118 -0.6245 0.3214 +-7.6097 -5.6805 3.1343 -0.7603 -0.5688 0.3136 +-1.4480 -9.5830 2.4635 -0.1458 -0.9580 0.2467 +-2.1525 -9.4321 2.5304 -0.2161 -0.9429 0.2534 +-2.8799 -9.2205 2.5863 -0.2886 -0.9217 0.2589 +-3.6180 -8.9443 2.6286 -0.3622 -0.8941 0.2632 +-4.3523 -8.6028 2.6550 -0.4354 -0.8601 0.2658 +-5.0673 -8.1991 2.6640 -0.5067 -0.8198 0.2667 +-5.7481 -7.7401 2.6550 -0.5745 -0.7741 0.2658 +-6.3819 -7.2361 2.6286 -0.6377 -0.7239 0.2632 +-6.9591 -6.6994 2.5863 -0.6953 -0.6704 0.2589 +-7.4737 -6.1434 2.5304 -0.7467 -0.6149 0.2534 +-7.9237 -5.5808 2.4635 -0.7917 -0.5589 0.2467 +-1.2199 -9.7596 1.8062 -0.1230 -0.9757 0.1811 +-1.9065 -9.6391 1.8584 -0.1915 -0.9636 0.1863 +-2.6201 -9.4611 1.9036 -0.2627 -0.9458 0.1909 +-3.3497 -9.2205 1.9397 -0.3355 -0.9217 0.1945 +-4.0820 -8.9149 1.9650 -0.4085 -0.8912 0.1970 +-4.8023 -8.5455 1.9780 -0.4803 -0.8544 0.1983 +-5.4956 -8.1170 1.9780 -0.5494 -0.8117 0.1983 +-6.1482 -7.6380 1.9650 -0.6145 -0.7639 0.1970 +-6.7490 -7.1196 1.9397 -0.6744 -0.7123 0.1945 +-7.2904 -6.5746 1.9036 -0.7284 -0.6579 0.1909 +-7.7688 -6.0160 1.8584 -0.7762 -0.6023 0.1863 +-8.1836 -5.4558 1.8062 -0.8177 -0.5464 0.1811 +-0.9971 -9.8809 1.1721 -0.1007 -0.9879 0.1178 +-1.6620 -9.7867 1.2075 -0.1671 -0.9784 0.1214 +-2.3566 -9.6391 1.2389 -0.2364 -0.9636 0.1245 +-3.0717 -9.4321 1.2652 -0.3077 -0.9429 0.1272 +-3.7953 -9.1621 1.2850 -0.3799 -0.9159 0.1292 +-4.5138 -8.8285 1.2973 -0.4515 -0.8827 0.1304 +-5.2126 -8.4342 1.3015 -0.5212 -0.8433 0.1309 +-5.8778 -7.9855 1.2973 -0.5875 -0.7986 0.1304 +-6.4975 -7.4921 1.2850 -0.6493 -0.7494 0.1292 +-7.0626 -6.9656 1.2652 -0.7057 -0.6970 0.1272 +-7.5675 -6.4186 1.2389 -0.7562 -0.6424 0.1245 +-8.0102 -5.8633 1.2075 -0.8004 -0.5870 0.1214 +-8.3918 -5.3107 1.1721 -0.8386 -0.5319 0.1178 +-0.7824 -9.9531 0.5684 -0.0792 -0.9952 0.0575 +-1.4229 -9.8809 0.5861 -0.1432 -0.9879 0.0593 +-2.0948 -9.7596 0.6021 -0.2103 -0.9757 0.0610 +-2.7904 -9.5830 0.6159 -0.2797 -0.9580 0.0624 +-3.4993 -9.3467 0.6269 -0.3504 -0.9344 0.0635 +-4.2093 -9.0487 0.6345 -0.4212 -0.9047 0.0643 +-4.9068 -8.6900 0.6385 -0.4907 -0.8689 0.0647 +-5.5781 -8.2751 0.6385 -0.5577 -0.8275 0.0647 +-6.2109 -7.8117 0.6345 -0.6208 -0.7813 0.0643 +-6.7950 -7.3099 0.6269 -0.6791 -0.7313 0.0635 +-7.3234 -6.7815 0.6159 -0.7318 -0.6786 0.0624 +-7.7924 -6.2383 0.6021 -0.7787 -0.6244 0.0610 +-8.2014 -5.6916 0.5861 -0.8196 -0.5699 0.0593 +-8.5524 -5.1510 0.5684 -0.8547 -0.5159 0.0575 +-8.5524 -5.1510 -0.5684 -0.8547 -0.5159 -0.0575 +-8.2014 -5.6916 -0.5861 -0.8196 -0.5699 -0.0593 +-8.3918 -5.3107 -1.1721 -0.8386 -0.5319 -0.1178 +-7.7924 -6.2383 -0.6021 -0.7787 -0.6244 -0.0610 +-8.0102 -5.8633 -1.2075 -0.8004 -0.5870 -0.1214 +-8.1836 -5.4558 -1.8062 -0.8177 -0.5464 -0.1811 +-7.3234 -6.7815 -0.6159 -0.7318 -0.6786 -0.0624 +-7.5675 -6.4186 -1.2389 -0.7562 -0.6424 -0.1245 +-7.7688 -6.0160 -1.8584 -0.7762 -0.6023 -0.1863 +-7.9237 -5.5808 -2.4635 -0.7917 -0.5589 -0.2467 +-6.7950 -7.3099 -0.6269 -0.6791 -0.7313 -0.0635 +-7.0626 -6.9656 -1.2652 -0.7057 -0.6970 -0.1272 +-7.2904 -6.5746 -1.9036 -0.7284 -0.6579 -0.1909 +-7.4737 -6.1434 -2.5304 -0.7467 -0.6149 -0.2534 +-7.6097 -5.6805 -3.1343 -0.7603 -0.5688 -0.3136 +-6.2109 -7.8117 -0.6345 -0.6208 -0.7813 -0.0643 +-6.4975 -7.4921 -1.2850 -0.6493 -0.7494 -0.1292 +-6.7490 -7.1196 -1.9397 -0.6744 -0.7123 -0.1945 +-6.9591 -6.6994 -2.5863 -0.6953 -0.6704 -0.2589 +-7.1238 -6.2395 -3.2124 -0.7118 -0.6245 -0.3214 +-7.2418 -5.7499 -3.8072 -0.7236 -0.5757 -0.3807 +-5.5781 -8.2751 -0.6385 -0.5577 -0.8275 -0.0647 +-5.8778 -7.9855 -1.2973 -0.5875 -0.7986 -0.1304 +-6.1482 -7.6380 -1.9650 -0.6145 -0.7639 -0.1970 +-6.3819 -7.2361 -2.6286 -0.6377 -0.7239 -0.2632 +-6.5738 -6.7867 -3.2750 -0.6569 -0.6791 -0.3276 +-6.7209 -6.2994 -3.8919 -0.6716 -0.6305 -0.3891 +-6.8229 -5.7856 -4.4693 -0.6818 -0.5793 -0.4467 +-4.9068 -8.6900 -0.6385 -0.4907 -0.8689 -0.0647 +-5.2126 -8.4342 -1.3015 -0.5212 -0.8433 -0.1309 +-5.4956 -8.1170 -1.9780 -0.5494 -0.8117 -0.1983 +-5.7481 -7.7401 -2.6550 -0.5745 -0.7741 -0.2658 +-5.9638 -7.3088 -3.3188 -0.5960 -0.7311 -0.3319 +-6.1383 -6.8316 -3.9560 -0.6135 -0.6836 -0.3955 +-6.2698 -6.3198 -4.5553 -0.6266 -0.6325 -0.4552 +-6.3590 -5.7857 -5.1078 -0.6355 -0.5793 -0.5104 +-4.2093 -9.0487 -0.6345 -0.4212 -0.9047 -0.0643 +-4.5138 -8.8285 -1.2973 -0.4515 -0.8827 -0.1304 +-4.8023 -8.5455 -1.9780 -0.4803 -0.8544 -0.1983 +-5.0673 -8.1991 -2.6640 -0.5067 -0.8198 -0.2667 +-5.3017 -7.7928 -3.3414 -0.5300 -0.7793 -0.3342 +-5.5001 -7.3335 -3.9960 -0.5498 -0.7335 -0.3995 +-5.6593 -6.8316 -4.6154 -0.5657 -0.6836 -0.4612 +-5.7783 -6.2994 -5.1892 -0.5776 -0.6305 -0.5184 +-5.8587 -5.7500 -5.7108 -0.5857 -0.5757 -0.5705 +-3.4993 -9.3467 -0.6269 -0.3504 -0.9344 -0.0635 +-3.7953 -9.1621 -1.2850 -0.3799 -0.9159 -0.1292 +-4.0820 -8.9149 -1.9650 -0.4085 -0.8912 -0.1970 +-4.3523 -8.6028 -2.6551 -0.4354 -0.8601 -0.2658 +-4.5990 -8.2270 -3.3414 -0.4600 -0.8226 -0.3342 +-4.8162 -7.7928 -4.0097 -0.4816 -0.7793 -0.4008 +-4.9993 -7.3088 -4.6463 -0.4999 -0.7311 -0.4643 +-5.1461 -6.7867 -5.2400 -0.5146 -0.6791 -0.5235 +-5.2566 -6.2395 -5.7824 -0.5256 -0.6245 -0.5776 +-5.3325 -5.6805 -6.2687 -0.5332 -0.5688 -0.6262 +-2.7904 -9.5830 -0.6159 -0.2797 -0.9580 -0.0624 +-3.0717 -9.4321 -1.2652 -0.3077 -0.9429 -0.1272 +-3.3497 -9.2205 -1.9397 -0.3355 -0.9217 -0.1945 +-3.6180 -8.9443 -2.6286 -0.3622 -0.8941 -0.2632 +-3.8700 -8.6028 -3.3188 -0.3873 -0.8601 -0.3319 +-4.0995 -8.1991 -3.9961 -0.4102 -0.8198 -0.3995 +-4.3014 -7.7401 -4.6463 -0.4303 -0.7741 -0.4643 +-4.4721 -7.2361 -5.2573 -0.4474 -0.7239 -0.5252 +-4.6102 -6.6994 -5.8192 -0.4611 -0.6704 -0.5813 +-4.7160 -6.1434 -6.3259 -0.4717 -0.6149 -0.6319 +-4.7915 -5.5809 -6.7746 -0.4793 -0.5589 -0.6767 +-2.0948 -9.7596 -0.6021 -0.2103 -0.9757 -0.0610 +-2.3566 -9.6391 -1.2390 -0.2364 -0.9636 -0.1245 +-2.6201 -9.4610 -1.9036 -0.2627 -0.9458 -0.1909 +-2.8799 -9.2205 -2.5863 -0.2886 -0.9217 -0.2589 +-3.1302 -8.9149 -3.2750 -0.3136 -0.8912 -0.3276 +-3.3652 -8.5455 -3.9560 -0.3370 -0.8544 -0.3955 +-3.5794 -8.1170 -4.6154 -0.3584 -0.8117 -0.4612 +-3.7687 -7.6380 -5.2400 -0.3772 -0.7639 -0.5235 +-3.9303 -7.1196 -5.8192 -0.3934 -0.7123 -0.5813 +-4.0633 -6.5746 -6.3454 -0.4066 -0.6579 -0.6338 +-4.1681 -6.0160 -6.8142 -0.4171 -0.6023 -0.6806 +-4.2467 -5.4558 -7.2249 -0.4249 -0.5464 -0.7217 +-1.4229 -9.8809 -0.5861 -0.1432 -0.9879 -0.0593 +-1.6620 -9.7867 -1.2075 -0.1671 -0.9784 -0.1214 +-1.9065 -9.6391 -1.8584 -0.1915 -0.9636 -0.1863 +-2.1525 -9.4321 -2.5304 -0.2161 -0.9429 -0.2534 +-2.3949 -9.1621 -3.2125 -0.2403 -0.9159 -0.3214 +-2.6286 -8.8285 -3.8919 -0.2636 -0.8827 -0.3891 +-2.8486 -8.4342 -4.5553 -0.2855 -0.8433 -0.4552 +-3.0501 -7.9855 -5.1893 -0.3056 -0.7986 -0.5184 +-3.2299 -7.4921 -5.7824 -0.3235 -0.7494 -0.5776 +-3.3857 -6.9656 -6.3259 -0.3391 -0.6970 -0.6319 +-3.5168 -6.4186 -6.8142 -0.3521 -0.6424 -0.6806 +-3.6237 -5.8633 -7.2450 -0.3628 -0.5870 -0.7237 +-3.7079 -5.3107 -7.6189 -0.3712 -0.5319 -0.7611 +-0.7824 -9.9531 -0.5684 -0.0792 -0.9952 -0.0575 +-0.9971 -9.8809 -1.1721 -0.1007 -0.9879 -0.1178 +-1.2199 -9.7596 -1.8062 -0.1230 -0.9757 -0.1811 +-1.4480 -9.5830 -2.4635 -0.1458 -0.9580 -0.2467 +-1.6775 -9.3467 -3.1344 -0.1687 -0.9344 -0.3136 +-1.9042 -9.0487 -3.8072 -0.1913 -0.9047 -0.3807 +-2.1235 -8.6900 -4.4693 -0.2132 -0.8689 -0.4467 +-2.3309 -8.2751 -5.1078 -0.2339 -0.8275 -0.5104 +-2.5227 -7.8117 -5.7108 -0.2530 -0.7813 -0.5705 +-2.6959 -7.3099 -6.2687 -0.2703 -0.7313 -0.6262 +-2.8488 -6.7815 -6.7746 -0.2855 -0.6786 -0.6767 +-2.9805 -6.2383 -7.2249 -0.2986 -0.6244 -0.7217 +-3.0917 -5.6916 -7.6189 -0.3097 -0.5699 -0.7611 +-3.1834 -5.1510 -7.9582 -0.3188 -0.5159 -0.7951 +7.2532 -5.1510 4.5671 0.7253 -0.5159 0.4558 +7.4781 -5.3107 3.9843 0.7477 -0.5319 0.3976 +6.9795 -5.6916 4.3465 0.6979 -0.5699 0.4337 +7.6824 -5.4558 3.3489 0.7680 -0.5464 0.3341 +7.1902 -5.8633 3.7314 0.7189 -0.5870 0.3722 +6.6581 -6.2383 4.0931 0.6658 -0.6244 0.4083 +7.8584 -5.5809 2.6644 0.7855 -0.5589 0.2658 +7.3774 -6.0160 3.0628 0.7375 -0.6023 0.3055 +6.8505 -6.4186 3.4457 0.6850 -0.6424 0.3437 +6.2867 -6.7815 3.8063 0.6287 -0.6786 0.3797 +7.9987 -5.6805 1.9371 0.7994 -0.5688 0.1932 +7.5336 -6.1434 2.3458 0.7530 -0.6149 0.2339 +7.0170 -6.5746 2.7451 0.7015 -0.6579 0.2737 +6.4574 -6.9656 3.1277 0.6457 -0.6970 0.3119 +5.8657 -7.3100 3.4868 0.5867 -0.7313 0.3477 +8.0965 -5.7499 1.1765 0.8092 -0.5757 0.1173 +7.6515 -6.2395 1.5883 0.7647 -0.6245 0.1584 +7.1502 -6.6994 1.9980 0.7147 -0.6704 0.1992 +6.6002 -7.1196 2.3976 0.6599 -0.7123 0.2390 +6.0119 -7.4921 2.7795 0.6013 -0.7494 0.2771 +5.3977 -7.8117 3.1373 0.5400 -0.7813 0.3128 +8.1468 -5.7857 0.3946 0.8141 -0.5793 0.0393 +7.7249 -6.2994 0.8018 0.7720 -0.6305 0.0799 +7.2433 -6.7867 1.2144 0.7240 -0.6791 0.1210 +6.7082 -7.2361 1.6246 0.6706 -0.7239 0.1619 +6.1290 -7.6380 2.0240 0.6129 -0.7639 0.2018 +5.5178 -7.9855 2.4053 0.5520 -0.7986 0.2398 +4.8881 -8.2751 2.7622 0.4892 -0.8275 0.2754 +8.1468 -5.7856 -0.3946 0.8141 -0.5793 -0.0393 +7.7499 -6.3198 -0.0000 0.7745 -0.6325 0.0000 +7.2913 -6.8316 0.4075 0.7288 -0.6836 0.0406 +6.7756 -7.3088 0.8204 0.6773 -0.7311 0.0818 +6.2109 -7.7401 1.2307 0.6211 -0.7741 0.1227 +5.6087 -8.1170 1.6300 0.5610 -0.8117 0.1625 +4.9821 -8.4342 2.0109 0.4986 -0.8433 0.2004 +4.3450 -8.6900 2.3676 0.4351 -0.8689 0.2361 +8.0965 -5.7499 -1.1765 0.8092 -0.5757 -0.1173 +7.7249 -6.2994 -0.8018 0.7720 -0.6305 -0.0799 +7.2913 -6.8316 -0.4075 0.7288 -0.6836 -0.0406 +6.7985 -7.3335 -0.0000 0.6796 -0.7335 0.0000 +6.2532 -7.7928 0.4130 0.6252 -0.7793 0.0411 +5.6654 -8.1991 0.8232 0.5667 -0.8198 0.0820 +5.0478 -8.5455 1.2225 0.5051 -0.8544 0.1218 +4.4142 -8.8285 1.6035 0.4420 -0.8827 0.1599 +3.7784 -9.0487 1.9608 0.3786 -0.9047 0.1955 +7.9987 -5.6805 -1.9371 0.7994 -0.5688 -0.1932 +7.6515 -6.2395 -1.5883 0.7647 -0.6245 -0.1584 +7.2433 -6.7867 -1.2144 0.7240 -0.6791 -0.1210 +6.7756 -7.3088 -0.8205 0.6773 -0.7311 -0.0818 +6.2532 -7.7928 -0.4130 0.6252 -0.7793 -0.0411 +5.6847 -8.2270 -0.0000 0.5686 -0.8226 0.0000 +5.0817 -8.6028 0.4102 0.5085 -0.8601 0.0409 +4.4574 -8.9149 0.8096 0.4463 -0.8912 0.0807 +3.8257 -9.1621 1.1912 0.3833 -0.9159 0.1187 +3.1995 -9.3468 1.5497 0.3208 -0.9344 0.1545 +7.8584 -5.5809 -2.6644 0.7855 -0.5589 -0.2658 +7.5336 -6.1434 -2.3458 0.7530 -0.6149 -0.2339 +7.1502 -6.6994 -1.9980 0.7147 -0.6704 -0.1992 +6.7082 -7.2361 -1.6246 0.6706 -0.7239 -0.1619 +6.2109 -7.7401 -1.2307 0.6211 -0.7741 -0.1227 +5.6654 -8.1991 -0.8232 0.5667 -0.8198 -0.0820 +5.0817 -8.6028 -0.4102 0.5085 -0.8601 -0.0409 +4.4721 -8.9443 -0.0000 0.4477 -0.8941 0.0000 +3.8501 -9.2205 0.3996 0.3857 -0.9217 0.0398 +3.2287 -9.4321 0.7819 0.3237 -0.9429 0.0779 +2.6195 -9.5830 1.1419 0.2629 -0.9580 0.1139 +7.6824 -5.4558 -3.3489 0.7680 -0.5464 -0.3341 +7.3774 -6.0160 -3.0628 0.7375 -0.6023 -0.3055 +7.0170 -6.5746 -2.7451 0.7015 -0.6579 -0.2737 +6.6002 -7.1196 -2.3976 0.6599 -0.7123 -0.2390 +6.1290 -7.6380 -2.0241 0.6129 -0.7639 -0.2018 +5.6087 -8.1170 -1.6300 0.5610 -0.8117 -0.1625 +5.0478 -8.5455 -1.2225 0.5051 -0.8544 -0.1218 +4.4574 -8.9149 -0.8096 0.4463 -0.8912 -0.0807 +3.8501 -9.2205 -0.3996 0.3857 -0.9217 -0.0398 +3.2386 -9.4610 -0.0000 0.3247 -0.9458 0.0000 +2.6348 -9.6391 0.3828 0.2645 -0.9636 0.0382 +2.0486 -9.7596 0.7442 0.2060 -0.9757 0.0742 +7.4781 -5.3107 -3.9843 0.7477 -0.5319 -0.3976 +7.1902 -5.8633 -3.7314 0.7189 -0.5870 -0.3722 +6.8505 -6.4186 -3.4457 0.6850 -0.6424 -0.3437 +6.4574 -6.9656 -3.1277 0.6457 -0.6970 -0.3119 +6.0119 -7.4921 -2.7795 0.6013 -0.7494 -0.2771 +5.5178 -7.9855 -2.4053 0.5520 -0.7986 -0.2398 +4.9821 -8.4342 -2.0109 0.4986 -0.8433 -0.2004 +4.4142 -8.8285 -1.6036 0.4420 -0.8827 -0.1599 +3.8257 -9.1621 -1.1912 0.3833 -0.9159 -0.1187 +3.2287 -9.4321 -0.7819 0.3237 -0.9429 -0.0780 +2.6348 -9.6391 -0.3829 0.2645 -0.9636 -0.0382 +2.0543 -9.7867 -0.0000 0.2065 -0.9784 0.0000 +1.4956 -9.8809 0.3622 0.1507 -0.9879 0.0361 +7.2532 -5.1510 -4.5671 0.7253 -0.5159 -0.4558 +6.9795 -5.6916 -4.3465 0.6979 -0.5699 -0.4337 +6.6581 -6.2383 -4.0931 0.6658 -0.6244 -0.4083 +6.2868 -6.7815 -3.8063 0.6287 -0.6786 -0.3797 +5.8657 -7.3099 -3.4868 0.5867 -0.7313 -0.3477 +5.3977 -7.8117 -3.1373 0.5400 -0.7813 -0.3128 +4.8881 -8.2751 -2.7622 0.4892 -0.8275 -0.2754 +4.3450 -8.6900 -2.3676 0.4351 -0.8689 -0.2361 +3.7784 -9.0487 -1.9608 0.3786 -0.9047 -0.1955 +3.1995 -9.3467 -1.5497 0.3208 -0.9344 -0.1545 +2.6195 -9.5830 -1.1419 0.2629 -0.9580 -0.1139 +2.0486 -9.7596 -0.7442 0.2060 -0.9757 -0.0742 +1.4956 -9.8809 -0.3622 0.1507 -0.9879 -0.0361 +0.9671 -9.9531 -0.0000 0.0979 -0.9952 0.0000 +-2.1022 -5.1510 -8.3095 -0.2094 -0.5159 -0.8307 +-1.9769 -5.6916 -7.9811 -0.1968 -0.5699 -0.7978 +-1.4784 -5.3107 -8.3433 -0.1470 -0.5319 -0.8339 +-1.8353 -6.2383 -7.5970 -0.1826 -0.6244 -0.7594 +-1.3268 -5.8633 -7.9913 -0.1319 -0.5870 -0.7987 +-0.8110 -5.4558 -8.3412 -0.0804 -0.5464 -0.8336 +-1.6773 -6.7815 -7.1553 -0.1668 -0.6786 -0.7153 +-1.1601 -6.4186 -7.5799 -0.1152 -0.6424 -0.7576 +-0.6332 -6.0161 -7.9628 -0.0626 -0.6023 -0.7958 +-0.1056 -5.5809 -8.2972 -0.0100 -0.5589 -0.8292 +-1.5035 -7.3100 -6.6561 -0.1494 -0.7313 -0.6655 +-0.9791 -6.9656 -7.1079 -0.0971 -0.6970 -0.7105 +-0.4424 -6.5747 -7.5218 -0.0435 -0.6579 -0.7518 +0.0971 -6.1434 -7.8898 0.0102 -0.6149 -0.7885 +0.6295 -5.6805 -8.2058 0.0633 -0.5688 -0.8200 +-1.3158 -7.8117 -6.1030 -0.1306 -0.7813 -0.6103 +-0.7857 -7.4921 -6.5766 -0.0778 -0.7494 -0.6575 +-0.2407 -7.1196 -7.0180 -0.0234 -0.7123 -0.7015 +0.3093 -6.6995 -7.4177 0.0314 -0.6704 -0.7413 +0.8539 -6.2396 -7.7678 0.0857 -0.6245 -0.7762 +1.3831 -5.7500 -8.0638 0.1385 -0.5757 -0.8058 +-1.1165 -8.2751 -5.5024 -0.1108 -0.8275 -0.5504 +-0.5825 -7.9855 -5.9910 -0.0575 -0.7986 -0.5991 +-0.0310 -7.6380 -6.4544 -0.0025 -0.7639 -0.6453 +0.5279 -7.2361 -6.8819 0.0532 -0.7239 -0.6879 +1.0834 -6.7867 -7.2641 0.1086 -0.6791 -0.7260 +1.6246 -6.2994 -7.5946 0.1625 -0.6305 -0.7589 +2.1423 -5.7857 -7.8700 0.2141 -0.5793 -0.7865 +-0.9090 -8.6900 -4.8639 -0.0901 -0.8689 -0.4867 +-0.3729 -8.4342 -5.3596 -0.0366 -0.8433 -0.5361 +0.1830 -8.1170 -5.8378 0.0188 -0.8117 -0.5838 +0.7489 -7.7402 -6.2872 0.0753 -0.7741 -0.6286 +1.3135 -7.3088 -6.6975 0.1315 -0.7311 -0.6695 +1.8656 -6.8316 -7.0603 0.1866 -0.6836 -0.7056 +2.3949 -6.3198 -7.3705 0.2393 -0.6325 -0.7366 +2.8928 -5.7857 -7.6261 0.2890 -0.5793 -0.7621 +-0.6972 -9.0487 -4.1994 -0.0689 -0.9047 -0.4205 +-0.1610 -8.8286 -4.6937 -0.0154 -0.8827 -0.4697 +0.3972 -8.5455 -5.1785 0.0402 -0.8544 -0.5181 +0.9678 -8.1991 -5.6425 0.0971 -0.8198 -0.5643 +1.5396 -7.7928 -6.0747 0.1541 -0.7793 -0.6073 +2.1009 -7.3335 -6.4657 0.2100 -0.7335 -0.6463 +2.6407 -6.8316 -6.8085 0.2638 -0.6836 -0.6805 +3.1497 -6.2994 -7.0990 0.3146 -0.6305 -0.7096 +3.6209 -5.7500 -7.3367 0.3616 -0.5757 -0.7333 +-0.4851 -9.3468 -3.5218 -0.0478 -0.9344 -0.3529 +0.0493 -9.1621 -4.0066 0.0055 -0.9159 -0.4012 +0.6075 -8.9149 -4.4894 0.0611 -0.8912 -0.4494 +1.1802 -8.6028 -4.9597 0.1182 -0.8601 -0.4962 +1.7567 -8.2271 -5.4064 0.1757 -0.8226 -0.5408 +2.3252 -7.7928 -5.8195 0.2323 -0.7793 -0.5819 +2.8741 -7.3088 -6.1904 0.2871 -0.7311 -0.6189 +3.3934 -6.7867 -6.5135 0.3388 -0.6791 -0.6511 +3.8751 -6.2396 -6.7862 0.3869 -0.6245 -0.6784 +4.3141 -5.6805 -7.0086 0.4308 -0.5688 -0.7006 +-0.2765 -9.5830 -2.8441 -0.0270 -0.9580 -0.2853 +0.2541 -9.4321 -3.3123 0.0259 -0.9429 -0.3320 +0.8097 -9.2205 -3.7851 0.0813 -0.9217 -0.3792 +1.3820 -8.9443 -4.2532 0.1383 -0.8941 -0.4258 +1.9605 -8.6028 -4.7062 0.1960 -0.8601 -0.4710 +2.5337 -8.1991 -5.1337 0.2532 -0.8198 -0.5136 +3.0898 -7.7401 -5.5266 0.3086 -0.7741 -0.5528 +3.6181 -7.2361 -5.8778 0.3612 -0.7239 -0.5878 +4.1098 -6.6995 -6.1828 0.4103 -0.6704 -0.6182 +4.5590 -6.1434 -6.4400 0.4552 -0.6149 -0.6439 +4.9624 -5.5809 -6.6504 0.4955 -0.5589 -0.6649 +-0.0747 -9.7596 -2.1783 -0.0070 -0.9757 -0.2188 +0.4501 -9.6391 -2.6241 0.0454 -0.9636 -0.2633 +1.0008 -9.4611 -3.0801 0.1003 -0.9458 -0.3088 +1.5698 -9.2205 -3.5382 0.1571 -0.9217 -0.3545 +2.1474 -8.9149 -3.9891 0.2147 -0.8912 -0.3995 +2.7225 -8.5455 -4.4230 0.2720 -0.8544 -0.4427 +3.2834 -8.1170 -4.8304 0.3279 -0.8117 -0.4834 +3.8190 -7.6380 -5.2035 0.3813 -0.7639 -0.5206 +4.3199 -7.1196 -5.5362 0.4313 -0.7123 -0.5537 +4.7792 -6.5746 -5.8252 0.4771 -0.6579 -0.5826 +5.1927 -6.0160 -6.0698 0.5184 -0.6023 -0.6070 +5.5590 -5.4558 -6.2714 0.5551 -0.5464 -0.6272 +0.1177 -9.8809 -1.5343 0.0122 -0.9879 -0.1545 +0.6348 -9.7867 -1.9538 0.0638 -0.9784 -0.1964 +1.1783 -9.6391 -2.3875 0.1180 -0.9636 -0.2397 +1.7414 -9.4321 -2.8290 0.1742 -0.9429 -0.2838 +2.3152 -9.1621 -3.2704 0.2314 -0.9159 -0.3278 +2.8892 -8.8285 -3.7026 0.2886 -0.8827 -0.3709 +3.4521 -8.4342 -4.1168 0.3447 -0.8433 -0.4122 +3.9927 -7.9855 -4.5044 0.3986 -0.7986 -0.4509 +4.5013 -7.4921 -4.8587 0.4494 -0.7494 -0.4862 +4.9701 -6.9656 -5.1748 0.4962 -0.6970 -0.5177 +5.3940 -6.4186 -5.4503 0.5385 -0.6424 -0.5452 +5.7707 -5.8633 -5.6851 0.5762 -0.5870 -0.5687 +6.1002 -5.3107 -5.8808 0.6091 -0.5319 -0.5882 +0.2989 -9.9531 -0.9197 0.0302 -0.9952 -0.0931 +0.8067 -9.8809 -1.3105 0.0809 -0.9879 -0.1322 +1.3409 -9.7596 -1.7184 0.1343 -0.9757 -0.1729 +1.8955 -9.5830 -2.1384 0.1896 -0.9580 -0.2149 +2.4626 -9.3467 -2.5640 0.2461 -0.9344 -0.2574 +3.0325 -9.0487 -2.9875 0.3029 -0.9047 -0.2996 +3.5944 -8.6900 -3.4007 0.3590 -0.8689 -0.3408 +4.1375 -8.2751 -3.7952 0.4131 -0.8275 -0.3802 +4.6518 -7.8117 -4.1640 0.4644 -0.7813 -0.4169 +5.1288 -7.3099 -4.5011 0.5120 -0.7313 -0.4505 +5.5628 -6.7815 -4.8028 0.5554 -0.6786 -0.4806 +5.9503 -6.2383 -5.0673 0.5941 -0.6244 -0.5070 +6.2906 -5.6916 -5.2947 0.6282 -0.5699 -0.5297 +6.5850 -5.1510 -5.4868 0.6576 -0.5159 -0.5489 +0 26 27 +1 71 41 +0 101 26 +0 131 101 +0 72 131 +1 176 71 +2 206 56 +3 236 116 +4 266 146 +5 296 161 +1 207 176 +2 237 206 +3 267 236 +4 297 266 +5 177 296 +6 401 326 +7 431 341 +8 446 356 +9 461 371 +10 402 386 +416 11 447 +415 416 462 +414 415 463 +413 414 465 +412 413 468 +411 412 472 +410 411 477 +409 410 483 +408 409 490 +407 408 498 +406 407 507 +405 406 517 +404 405 528 +403 404 540 +402 403 553 +416 447 462 +462 447 448 +415 462 463 +463 462 464 +462 448 464 +464 448 449 +414 463 465 +465 463 466 +463 464 466 +466 464 467 +464 449 467 +467 449 450 +413 465 468 +468 465 469 +465 466 469 +469 466 470 +466 467 470 +470 467 471 +467 450 471 +471 450 451 +412 468 472 +472 468 473 +468 469 473 +473 469 474 +469 470 474 +474 470 475 +470 471 475 +475 471 476 +471 451 476 +476 451 452 +411 472 477 +477 472 478 +472 473 478 +478 473 479 +473 474 479 +479 474 480 +474 475 480 +480 475 481 +475 476 481 +481 476 482 +476 452 482 +482 452 453 +410 477 483 +483 477 484 +477 478 484 +484 478 485 +478 479 485 +485 479 486 +479 480 486 +486 480 487 +480 481 487 +487 481 488 +481 482 488 +488 482 489 +482 453 489 +489 453 454 +409 483 490 +490 483 491 +483 484 491 +491 484 492 +484 485 492 +492 485 493 +485 486 493 +493 486 494 +486 487 494 +494 487 495 +487 488 495 +495 488 496 +488 489 496 +496 489 497 +489 454 497 +497 454 455 +408 490 498 +498 490 499 +490 491 499 +499 491 500 +491 492 500 +500 492 501 +492 493 501 +501 493 502 +493 494 502 +502 494 503 +494 495 503 +503 495 504 +495 496 504 +504 496 505 +496 497 505 +505 497 506 +497 455 506 +506 455 456 +407 498 507 +507 498 508 +498 499 508 +508 499 509 +499 500 509 +509 500 510 +500 501 510 +510 501 511 +501 502 511 +511 502 512 +502 503 512 +512 503 513 +503 504 513 +513 504 514 +504 505 514 +514 505 515 +505 506 515 +515 506 516 +506 456 516 +516 456 457 +406 507 517 +517 507 518 +507 508 518 +518 508 519 +508 509 519 +519 509 520 +509 510 520 +520 510 521 +510 511 521 +521 511 522 +511 512 522 +522 512 523 +512 513 523 +523 513 524 +513 514 524 +524 514 525 +514 515 525 +525 515 526 +515 516 526 +526 516 527 +516 457 527 +527 457 458 +405 517 528 +528 517 529 +517 518 529 +529 518 530 +518 519 530 +530 519 531 +519 520 531 +531 520 532 +520 521 532 +532 521 533 +521 522 533 +533 522 534 +522 523 534 +534 523 535 +523 524 535 +535 524 536 +524 525 536 +536 525 537 +525 526 537 +537 526 538 +526 527 538 +538 527 539 +527 458 539 +539 458 459 +404 528 540 +540 528 541 +528 529 541 +541 529 542 +529 530 542 +542 530 543 +530 531 543 +543 531 544 +531 532 544 +544 532 545 +532 533 545 +545 533 546 +533 534 546 +546 534 547 +534 535 547 +547 535 548 +535 536 548 +548 536 549 +536 537 549 +549 537 550 +537 538 550 +550 538 551 +538 539 551 +551 539 552 +539 459 552 +552 459 460 +403 540 553 +553 540 554 +540 541 554 +554 541 555 +541 542 555 +555 542 556 +542 543 556 +556 543 557 +543 544 557 +557 544 558 +544 545 558 +558 545 559 +545 546 559 +559 546 560 +546 547 560 +560 547 561 +547 548 561 +561 548 562 +548 549 562 +562 549 563 +549 550 563 +563 550 564 +550 551 564 +564 551 565 +551 552 565 +565 552 566 +552 460 566 +566 460 461 +402 553 386 +386 553 385 +553 554 385 +385 554 384 +554 555 384 +384 555 383 +555 556 383 +383 556 382 +556 557 382 +382 557 381 +557 558 381 +381 558 380 +558 559 380 +380 559 379 +559 560 379 +379 560 378 +560 561 378 +378 561 377 +561 562 377 +377 562 376 +562 563 376 +376 563 375 +563 564 375 +375 564 374 +564 565 374 +374 565 373 +565 566 373 +373 566 372 +566 461 372 +372 461 9 +447 11 432 +448 447 567 +449 448 568 +450 449 570 +451 450 573 +452 451 577 +453 452 582 +454 453 588 +455 454 595 +456 455 603 +457 456 612 +458 457 622 +459 458 633 +460 459 645 +461 460 658 +447 432 567 +567 432 433 +448 567 568 +568 567 569 +567 433 569 +569 433 434 +449 568 570 +570 568 571 +568 569 571 +571 569 572 +569 434 572 +572 434 435 +450 570 573 +573 570 574 +570 571 574 +574 571 575 +571 572 575 +575 572 576 +572 435 576 +576 435 436 +451 573 577 +577 573 578 +573 574 578 +578 574 579 +574 575 579 +579 575 580 +575 576 580 +580 576 581 +576 436 581 +581 436 437 +452 577 582 +582 577 583 +577 578 583 +583 578 584 +578 579 584 +584 579 585 +579 580 585 +585 580 586 +580 581 586 +586 581 587 +581 437 587 +587 437 438 +453 582 588 +588 582 589 +582 583 589 +589 583 590 +583 584 590 +590 584 591 +584 585 591 +591 585 592 +585 586 592 +592 586 593 +586 587 593 +593 587 594 +587 438 594 +594 438 439 +454 588 595 +595 588 596 +588 589 596 +596 589 597 +589 590 597 +597 590 598 +590 591 598 +598 591 599 +591 592 599 +599 592 600 +592 593 600 +600 593 601 +593 594 601 +601 594 602 +594 439 602 +602 439 440 +455 595 603 +603 595 604 +595 596 604 +604 596 605 +596 597 605 +605 597 606 +597 598 606 +606 598 607 +598 599 607 +607 599 608 +599 600 608 +608 600 609 +600 601 609 +609 601 610 +601 602 610 +610 602 611 +602 440 611 +611 440 441 +456 603 612 +612 603 613 +603 604 613 +613 604 614 +604 605 614 +614 605 615 +605 606 615 +615 606 616 +606 607 616 +616 607 617 +607 608 617 +617 608 618 +608 609 618 +618 609 619 +609 610 619 +619 610 620 +610 611 620 +620 611 621 +611 441 621 +621 441 442 +457 612 622 +622 612 623 +612 613 623 +623 613 624 +613 614 624 +624 614 625 +614 615 625 +625 615 626 +615 616 626 +626 616 627 +616 617 627 +627 617 628 +617 618 628 +628 618 629 +618 619 629 +629 619 630 +619 620 630 +630 620 631 +620 621 631 +631 621 632 +621 442 632 +632 442 443 +458 622 633 +633 622 634 +622 623 634 +634 623 635 +623 624 635 +635 624 636 +624 625 636 +636 625 637 +625 626 637 +637 626 638 +626 627 638 +638 627 639 +627 628 639 +639 628 640 +628 629 640 +640 629 641 +629 630 641 +641 630 642 +630 631 642 +642 631 643 +631 632 643 +643 632 644 +632 443 644 +644 443 444 +459 633 645 +645 633 646 +633 634 646 +646 634 647 +634 635 647 +647 635 648 +635 636 648 +648 636 649 +636 637 649 +649 637 650 +637 638 650 +650 638 651 +638 639 651 +651 639 652 +639 640 652 +652 640 653 +640 641 653 +653 641 654 +641 642 654 +654 642 655 +642 643 655 +655 643 656 +643 644 656 +656 644 657 +644 444 657 +657 444 445 +460 645 658 +658 645 659 +645 646 659 +659 646 660 +646 647 660 +660 647 661 +647 648 661 +661 648 662 +648 649 662 +662 649 663 +649 650 663 +663 650 664 +650 651 664 +664 651 665 +651 652 665 +665 652 666 +652 653 666 +666 653 667 +653 654 667 +667 654 668 +654 655 668 +668 655 669 +655 656 669 +669 656 670 +656 657 670 +670 657 671 +657 445 671 +671 445 446 +461 658 371 +371 658 370 +658 659 370 +370 659 369 +659 660 369 +369 660 368 +660 661 368 +368 661 367 +661 662 367 +367 662 366 +662 663 366 +366 663 365 +663 664 365 +365 664 364 +664 665 364 +364 665 363 +665 666 363 +363 666 362 +666 667 362 +362 667 361 +667 668 361 +361 668 360 +668 669 360 +360 669 359 +669 670 359 +359 670 358 +670 671 358 +358 671 357 +671 446 357 +357 446 8 +432 11 417 +433 432 672 +434 433 673 +435 434 675 +436 435 678 +437 436 682 +438 437 687 +439 438 693 +440 439 700 +441 440 708 +442 441 717 +443 442 727 +444 443 738 +445 444 750 +446 445 763 +432 417 672 +672 417 418 +433 672 673 +673 672 674 +672 418 674 +674 418 419 +434 673 675 +675 673 676 +673 674 676 +676 674 677 +674 419 677 +677 419 420 +435 675 678 +678 675 679 +675 676 679 +679 676 680 +676 677 680 +680 677 681 +677 420 681 +681 420 421 +436 678 682 +682 678 683 +678 679 683 +683 679 684 +679 680 684 +684 680 685 +680 681 685 +685 681 686 +681 421 686 +686 421 422 +437 682 687 +687 682 688 +682 683 688 +688 683 689 +683 684 689 +689 684 690 +684 685 690 +690 685 691 +685 686 691 +691 686 692 +686 422 692 +692 422 423 +438 687 693 +693 687 694 +687 688 694 +694 688 695 +688 689 695 +695 689 696 +689 690 696 +696 690 697 +690 691 697 +697 691 698 +691 692 698 +698 692 699 +692 423 699 +699 423 424 +439 693 700 +700 693 701 +693 694 701 +701 694 702 +694 695 702 +702 695 703 +695 696 703 +703 696 704 +696 697 704 +704 697 705 +697 698 705 +705 698 706 +698 699 706 +706 699 707 +699 424 707 +707 424 425 +440 700 708 +708 700 709 +700 701 709 +709 701 710 +701 702 710 +710 702 711 +702 703 711 +711 703 712 +703 704 712 +712 704 713 +704 705 713 +713 705 714 +705 706 714 +714 706 715 +706 707 715 +715 707 716 +707 425 716 +716 425 426 +441 708 717 +717 708 718 +708 709 718 +718 709 719 +709 710 719 +719 710 720 +710 711 720 +720 711 721 +711 712 721 +721 712 722 +712 713 722 +722 713 723 +713 714 723 +723 714 724 +714 715 724 +724 715 725 +715 716 725 +725 716 726 +716 426 726 +726 426 427 +442 717 727 +727 717 728 +717 718 728 +728 718 729 +718 719 729 +729 719 730 +719 720 730 +730 720 731 +720 721 731 +731 721 732 +721 722 732 +732 722 733 +722 723 733 +733 723 734 +723 724 734 +734 724 735 +724 725 735 +735 725 736 +725 726 736 +736 726 737 +726 427 737 +737 427 428 +443 727 738 +738 727 739 +727 728 739 +739 728 740 +728 729 740 +740 729 741 +729 730 741 +741 730 742 +730 731 742 +742 731 743 +731 732 743 +743 732 744 +732 733 744 +744 733 745 +733 734 745 +745 734 746 +734 735 746 +746 735 747 +735 736 747 +747 736 748 +736 737 748 +748 737 749 +737 428 749 +749 428 429 +444 738 750 +750 738 751 +738 739 751 +751 739 752 +739 740 752 +752 740 753 +740 741 753 +753 741 754 +741 742 754 +754 742 755 +742 743 755 +755 743 756 +743 744 756 +756 744 757 +744 745 757 +757 745 758 +745 746 758 +758 746 759 +746 747 759 +759 747 760 +747 748 760 +760 748 761 +748 749 761 +761 749 762 +749 429 762 +762 429 430 +445 750 763 +763 750 764 +750 751 764 +764 751 765 +751 752 765 +765 752 766 +752 753 766 +766 753 767 +753 754 767 +767 754 768 +754 755 768 +768 755 769 +755 756 769 +769 756 770 +756 757 770 +770 757 771 +757 758 771 +771 758 772 +758 759 772 +772 759 773 +759 760 773 +773 760 774 +760 761 774 +774 761 775 +761 762 775 +775 762 776 +762 430 776 +776 430 431 +446 763 356 +356 763 355 +763 764 355 +355 764 354 +764 765 354 +354 765 353 +765 766 353 +353 766 352 +766 767 352 +352 767 351 +767 768 351 +351 768 350 +768 769 350 +350 769 349 +769 770 349 +349 770 348 +770 771 348 +348 771 347 +771 772 347 +347 772 346 +772 773 346 +346 773 345 +773 774 345 +345 774 344 +774 775 344 +344 775 343 +775 776 343 +343 776 342 +776 431 342 +342 431 7 +417 11 387 +418 417 777 +419 418 778 +420 419 780 +421 420 783 +422 421 787 +423 422 792 +424 423 798 +425 424 805 +426 425 813 +427 426 822 +428 427 832 +429 428 843 +430 429 855 +431 430 868 +417 387 777 +777 387 388 +418 777 778 +778 777 779 +777 388 779 +779 388 389 +419 778 780 +780 778 781 +778 779 781 +781 779 782 +779 389 782 +782 389 390 +420 780 783 +783 780 784 +780 781 784 +784 781 785 +781 782 785 +785 782 786 +782 390 786 +786 390 391 +421 783 787 +787 783 788 +783 784 788 +788 784 789 +784 785 789 +789 785 790 +785 786 790 +790 786 791 +786 391 791 +791 391 392 +422 787 792 +792 787 793 +787 788 793 +793 788 794 +788 789 794 +794 789 795 +789 790 795 +795 790 796 +790 791 796 +796 791 797 +791 392 797 +797 392 393 +423 792 798 +798 792 799 +792 793 799 +799 793 800 +793 794 800 +800 794 801 +794 795 801 +801 795 802 +795 796 802 +802 796 803 +796 797 803 +803 797 804 +797 393 804 +804 393 394 +424 798 805 +805 798 806 +798 799 806 +806 799 807 +799 800 807 +807 800 808 +800 801 808 +808 801 809 +801 802 809 +809 802 810 +802 803 810 +810 803 811 +803 804 811 +811 804 812 +804 394 812 +812 394 395 +425 805 813 +813 805 814 +805 806 814 +814 806 815 +806 807 815 +815 807 816 +807 808 816 +816 808 817 +808 809 817 +817 809 818 +809 810 818 +818 810 819 +810 811 819 +819 811 820 +811 812 820 +820 812 821 +812 395 821 +821 395 396 +426 813 822 +822 813 823 +813 814 823 +823 814 824 +814 815 824 +824 815 825 +815 816 825 +825 816 826 +816 817 826 +826 817 827 +817 818 827 +827 818 828 +818 819 828 +828 819 829 +819 820 829 +829 820 830 +820 821 830 +830 821 831 +821 396 831 +831 396 397 +427 822 832 +832 822 833 +822 823 833 +833 823 834 +823 824 834 +834 824 835 +824 825 835 +835 825 836 +825 826 836 +836 826 837 +826 827 837 +837 827 838 +827 828 838 +838 828 839 +828 829 839 +839 829 840 +829 830 840 +840 830 841 +830 831 841 +841 831 842 +831 397 842 +842 397 398 +428 832 843 +843 832 844 +832 833 844 +844 833 845 +833 834 845 +845 834 846 +834 835 846 +846 835 847 +835 836 847 +847 836 848 +836 837 848 +848 837 849 +837 838 849 +849 838 850 +838 839 850 +850 839 851 +839 840 851 +851 840 852 +840 841 852 +852 841 853 +841 842 853 +853 842 854 +842 398 854 +854 398 399 +429 843 855 +855 843 856 +843 844 856 +856 844 857 +844 845 857 +857 845 858 +845 846 858 +858 846 859 +846 847 859 +859 847 860 +847 848 860 +860 848 861 +848 849 861 +861 849 862 +849 850 862 +862 850 863 +850 851 863 +863 851 864 +851 852 864 +864 852 865 +852 853 865 +865 853 866 +853 854 866 +866 854 867 +854 399 867 +867 399 400 +430 855 868 +868 855 869 +855 856 869 +869 856 870 +856 857 870 +870 857 871 +857 858 871 +871 858 872 +858 859 872 +872 859 873 +859 860 873 +873 860 874 +860 861 874 +874 861 875 +861 862 875 +875 862 876 +862 863 876 +876 863 877 +863 864 877 +877 864 878 +864 865 878 +878 865 879 +865 866 879 +879 866 880 +866 867 880 +880 867 881 +867 400 881 +881 400 401 +431 868 341 +341 868 340 +868 869 340 +340 869 339 +869 870 339 +339 870 338 +870 871 338 +338 871 337 +871 872 337 +337 872 336 +872 873 336 +336 873 335 +873 874 335 +335 874 334 +874 875 334 +334 875 333 +875 876 333 +333 876 332 +876 877 332 +332 877 331 +877 878 331 +331 878 330 +878 879 330 +330 879 329 +879 880 329 +329 880 328 +880 881 328 +328 881 327 +881 401 327 +327 401 6 +387 11 416 +388 387 882 +389 388 883 +390 389 885 +391 390 888 +392 391 892 +393 392 897 +394 393 903 +395 394 910 +396 395 918 +397 396 927 +398 397 937 +399 398 948 +400 399 960 +401 400 973 +387 416 882 +882 416 415 +388 882 883 +883 882 884 +882 415 884 +884 415 414 +389 883 885 +885 883 886 +883 884 886 +886 884 887 +884 414 887 +887 414 413 +390 885 888 +888 885 889 +885 886 889 +889 886 890 +886 887 890 +890 887 891 +887 413 891 +891 413 412 +391 888 892 +892 888 893 +888 889 893 +893 889 894 +889 890 894 +894 890 895 +890 891 895 +895 891 896 +891 412 896 +896 412 411 +392 892 897 +897 892 898 +892 893 898 +898 893 899 +893 894 899 +899 894 900 +894 895 900 +900 895 901 +895 896 901 +901 896 902 +896 411 902 +902 411 410 +393 897 903 +903 897 904 +897 898 904 +904 898 905 +898 899 905 +905 899 906 +899 900 906 +906 900 907 +900 901 907 +907 901 908 +901 902 908 +908 902 909 +902 410 909 +909 410 409 +394 903 910 +910 903 911 +903 904 911 +911 904 912 +904 905 912 +912 905 913 +905 906 913 +913 906 914 +906 907 914 +914 907 915 +907 908 915 +915 908 916 +908 909 916 +916 909 917 +909 409 917 +917 409 408 +395 910 918 +918 910 919 +910 911 919 +919 911 920 +911 912 920 +920 912 921 +912 913 921 +921 913 922 +913 914 922 +922 914 923 +914 915 923 +923 915 924 +915 916 924 +924 916 925 +916 917 925 +925 917 926 +917 408 926 +926 408 407 +396 918 927 +927 918 928 +918 919 928 +928 919 929 +919 920 929 +929 920 930 +920 921 930 +930 921 931 +921 922 931 +931 922 932 +922 923 932 +932 923 933 +923 924 933 +933 924 934 +924 925 934 +934 925 935 +925 926 935 +935 926 936 +926 407 936 +936 407 406 +397 927 937 +937 927 938 +927 928 938 +938 928 939 +928 929 939 +939 929 940 +929 930 940 +940 930 941 +930 931 941 +941 931 942 +931 932 942 +942 932 943 +932 933 943 +943 933 944 +933 934 944 +944 934 945 +934 935 945 +945 935 946 +935 936 946 +946 936 947 +936 406 947 +947 406 405 +398 937 948 +948 937 949 +937 938 949 +949 938 950 +938 939 950 +950 939 951 +939 940 951 +951 940 952 +940 941 952 +952 941 953 +941 942 953 +953 942 954 +942 943 954 +954 943 955 +943 944 955 +955 944 956 +944 945 956 +956 945 957 +945 946 957 +957 946 958 +946 947 958 +958 947 959 +947 405 959 +959 405 404 +399 948 960 +960 948 961 +948 949 961 +961 949 962 +949 950 962 +962 950 963 +950 951 963 +963 951 964 +951 952 964 +964 952 965 +952 953 965 +965 953 966 +953 954 966 +966 954 967 +954 955 967 +967 955 968 +955 956 968 +968 956 969 +956 957 969 +969 957 970 +957 958 970 +970 958 971 +958 959 971 +971 959 972 +959 404 972 +972 404 403 +400 960 973 +973 960 974 +960 961 974 +974 961 975 +961 962 975 +975 962 976 +962 963 976 +976 963 977 +963 964 977 +977 964 978 +964 965 978 +978 965 979 +965 966 979 +979 966 980 +966 967 980 +980 967 981 +967 968 981 +981 968 982 +968 969 982 +982 969 983 +969 970 983 +983 970 984 +970 971 984 +984 971 985 +971 972 985 +985 972 986 +972 403 986 +986 403 402 +401 973 326 +326 973 325 +973 974 325 +325 974 324 +974 975 324 +324 975 323 +975 976 323 +323 976 322 +976 977 322 +322 977 321 +977 978 321 +321 978 320 +978 979 320 +320 979 319 +979 980 319 +319 980 318 +980 981 318 +318 981 317 +981 982 317 +317 982 316 +982 983 316 +316 983 315 +983 984 315 +315 984 314 +984 985 314 +314 985 313 +985 986 313 +313 986 312 +986 402 312 +312 402 10 +191 10 386 +190 191 987 +189 190 988 +188 189 990 +187 188 993 +186 187 997 +185 186 1002 +184 185 1008 +183 184 1015 +182 183 1023 +181 182 1032 +180 181 1042 +179 180 1053 +178 179 1065 +177 178 1078 +191 386 987 +987 386 385 +190 987 988 +988 987 989 +987 385 989 +989 385 384 +189 988 990 +990 988 991 +988 989 991 +991 989 992 +989 384 992 +992 384 383 +188 990 993 +993 990 994 +990 991 994 +994 991 995 +991 992 995 +995 992 996 +992 383 996 +996 383 382 +187 993 997 +997 993 998 +993 994 998 +998 994 999 +994 995 999 +999 995 1000 +995 996 1000 +1000 996 1001 +996 382 1001 +1001 382 381 +186 997 1002 +1002 997 1003 +997 998 1003 +1003 998 1004 +998 999 1004 +1004 999 1005 +999 1000 1005 +1005 1000 1006 +1000 1001 1006 +1006 1001 1007 +1001 381 1007 +1007 381 380 +185 1002 1008 +1008 1002 1009 +1002 1003 1009 +1009 1003 1010 +1003 1004 1010 +1010 1004 1011 +1004 1005 1011 +1011 1005 1012 +1005 1006 1012 +1012 1006 1013 +1006 1007 1013 +1013 1007 1014 +1007 380 1014 +1014 380 379 +184 1008 1015 +1015 1008 1016 +1008 1009 1016 +1016 1009 1017 +1009 1010 1017 +1017 1010 1018 +1010 1011 1018 +1018 1011 1019 +1011 1012 1019 +1019 1012 1020 +1012 1013 1020 +1020 1013 1021 +1013 1014 1021 +1021 1014 1022 +1014 379 1022 +1022 379 378 +183 1015 1023 +1023 1015 1024 +1015 1016 1024 +1024 1016 1025 +1016 1017 1025 +1025 1017 1026 +1017 1018 1026 +1026 1018 1027 +1018 1019 1027 +1027 1019 1028 +1019 1020 1028 +1028 1020 1029 +1020 1021 1029 +1029 1021 1030 +1021 1022 1030 +1030 1022 1031 +1022 378 1031 +1031 378 377 +182 1023 1032 +1032 1023 1033 +1023 1024 1033 +1033 1024 1034 +1024 1025 1034 +1034 1025 1035 +1025 1026 1035 +1035 1026 1036 +1026 1027 1036 +1036 1027 1037 +1027 1028 1037 +1037 1028 1038 +1028 1029 1038 +1038 1029 1039 +1029 1030 1039 +1039 1030 1040 +1030 1031 1040 +1040 1031 1041 +1031 377 1041 +1041 377 376 +181 1032 1042 +1042 1032 1043 +1032 1033 1043 +1043 1033 1044 +1033 1034 1044 +1044 1034 1045 +1034 1035 1045 +1045 1035 1046 +1035 1036 1046 +1046 1036 1047 +1036 1037 1047 +1047 1037 1048 +1037 1038 1048 +1048 1038 1049 +1038 1039 1049 +1049 1039 1050 +1039 1040 1050 +1050 1040 1051 +1040 1041 1051 +1051 1041 1052 +1041 376 1052 +1052 376 375 +180 1042 1053 +1053 1042 1054 +1042 1043 1054 +1054 1043 1055 +1043 1044 1055 +1055 1044 1056 +1044 1045 1056 +1056 1045 1057 +1045 1046 1057 +1057 1046 1058 +1046 1047 1058 +1058 1047 1059 +1047 1048 1059 +1059 1048 1060 +1048 1049 1060 +1060 1049 1061 +1049 1050 1061 +1061 1050 1062 +1050 1051 1062 +1062 1051 1063 +1051 1052 1063 +1063 1052 1064 +1052 375 1064 +1064 375 374 +179 1053 1065 +1065 1053 1066 +1053 1054 1066 +1066 1054 1067 +1054 1055 1067 +1067 1055 1068 +1055 1056 1068 +1068 1056 1069 +1056 1057 1069 +1069 1057 1070 +1057 1058 1070 +1070 1058 1071 +1058 1059 1071 +1071 1059 1072 +1059 1060 1072 +1072 1060 1073 +1060 1061 1073 +1073 1061 1074 +1061 1062 1074 +1074 1062 1075 +1062 1063 1075 +1075 1063 1076 +1063 1064 1076 +1076 1064 1077 +1064 374 1077 +1077 374 373 +178 1065 1078 +1078 1065 1079 +1065 1066 1079 +1079 1066 1080 +1066 1067 1080 +1080 1067 1081 +1067 1068 1081 +1081 1068 1082 +1068 1069 1082 +1082 1069 1083 +1069 1070 1083 +1083 1070 1084 +1070 1071 1084 +1084 1071 1085 +1071 1072 1085 +1085 1072 1086 +1072 1073 1086 +1086 1073 1087 +1073 1074 1087 +1087 1074 1088 +1074 1075 1088 +1088 1075 1089 +1075 1076 1089 +1089 1076 1090 +1076 1077 1090 +1090 1077 1091 +1077 373 1091 +1091 373 372 +177 1078 296 +296 1078 295 +1078 1079 295 +295 1079 294 +1079 1080 294 +294 1080 293 +1080 1081 293 +293 1081 292 +1081 1082 292 +292 1082 291 +1082 1083 291 +291 1083 290 +1083 1084 290 +290 1084 289 +1084 1085 289 +289 1085 288 +1085 1086 288 +288 1086 287 +1086 1087 287 +287 1087 286 +1087 1088 286 +286 1088 285 +1088 1089 285 +285 1089 284 +1089 1090 284 +284 1090 283 +1090 1091 283 +283 1091 282 +1091 372 282 +282 372 9 +311 9 371 +310 311 1092 +309 310 1093 +308 309 1095 +307 308 1098 +306 307 1102 +305 306 1107 +304 305 1113 +303 304 1120 +302 303 1128 +301 302 1137 +300 301 1147 +299 300 1158 +298 299 1170 +297 298 1183 +311 371 1092 +1092 371 370 +310 1092 1093 +1093 1092 1094 +1092 370 1094 +1094 370 369 +309 1093 1095 +1095 1093 1096 +1093 1094 1096 +1096 1094 1097 +1094 369 1097 +1097 369 368 +308 1095 1098 +1098 1095 1099 +1095 1096 1099 +1099 1096 1100 +1096 1097 1100 +1100 1097 1101 +1097 368 1101 +1101 368 367 +307 1098 1102 +1102 1098 1103 +1098 1099 1103 +1103 1099 1104 +1099 1100 1104 +1104 1100 1105 +1100 1101 1105 +1105 1101 1106 +1101 367 1106 +1106 367 366 +306 1102 1107 +1107 1102 1108 +1102 1103 1108 +1108 1103 1109 +1103 1104 1109 +1109 1104 1110 +1104 1105 1110 +1110 1105 1111 +1105 1106 1111 +1111 1106 1112 +1106 366 1112 +1112 366 365 +305 1107 1113 +1113 1107 1114 +1107 1108 1114 +1114 1108 1115 +1108 1109 1115 +1115 1109 1116 +1109 1110 1116 +1116 1110 1117 +1110 1111 1117 +1117 1111 1118 +1111 1112 1118 +1118 1112 1119 +1112 365 1119 +1119 365 364 +304 1113 1120 +1120 1113 1121 +1113 1114 1121 +1121 1114 1122 +1114 1115 1122 +1122 1115 1123 +1115 1116 1123 +1123 1116 1124 +1116 1117 1124 +1124 1117 1125 +1117 1118 1125 +1125 1118 1126 +1118 1119 1126 +1126 1119 1127 +1119 364 1127 +1127 364 363 +303 1120 1128 +1128 1120 1129 +1120 1121 1129 +1129 1121 1130 +1121 1122 1130 +1130 1122 1131 +1122 1123 1131 +1131 1123 1132 +1123 1124 1132 +1132 1124 1133 +1124 1125 1133 +1133 1125 1134 +1125 1126 1134 +1134 1126 1135 +1126 1127 1135 +1135 1127 1136 +1127 363 1136 +1136 363 362 +302 1128 1137 +1137 1128 1138 +1128 1129 1138 +1138 1129 1139 +1129 1130 1139 +1139 1130 1140 +1130 1131 1140 +1140 1131 1141 +1131 1132 1141 +1141 1132 1142 +1132 1133 1142 +1142 1133 1143 +1133 1134 1143 +1143 1134 1144 +1134 1135 1144 +1144 1135 1145 +1135 1136 1145 +1145 1136 1146 +1136 362 1146 +1146 362 361 +301 1137 1147 +1147 1137 1148 +1137 1138 1148 +1148 1138 1149 +1138 1139 1149 +1149 1139 1150 +1139 1140 1150 +1150 1140 1151 +1140 1141 1151 +1151 1141 1152 +1141 1142 1152 +1152 1142 1153 +1142 1143 1153 +1153 1143 1154 +1143 1144 1154 +1154 1144 1155 +1144 1145 1155 +1155 1145 1156 +1145 1146 1156 +1156 1146 1157 +1146 361 1157 +1157 361 360 +300 1147 1158 +1158 1147 1159 +1147 1148 1159 +1159 1148 1160 +1148 1149 1160 +1160 1149 1161 +1149 1150 1161 +1161 1150 1162 +1150 1151 1162 +1162 1151 1163 +1151 1152 1163 +1163 1152 1164 +1152 1153 1164 +1164 1153 1165 +1153 1154 1165 +1165 1154 1166 +1154 1155 1166 +1166 1155 1167 +1155 1156 1167 +1167 1156 1168 +1156 1157 1168 +1168 1157 1169 +1157 360 1169 +1169 360 359 +299 1158 1170 +1170 1158 1171 +1158 1159 1171 +1171 1159 1172 +1159 1160 1172 +1172 1160 1173 +1160 1161 1173 +1173 1161 1174 +1161 1162 1174 +1174 1162 1175 +1162 1163 1175 +1175 1163 1176 +1163 1164 1176 +1176 1164 1177 +1164 1165 1177 +1177 1165 1178 +1165 1166 1178 +1178 1166 1179 +1166 1167 1179 +1179 1167 1180 +1167 1168 1180 +1180 1168 1181 +1168 1169 1181 +1181 1169 1182 +1169 359 1182 +1182 359 358 +298 1170 1183 +1183 1170 1184 +1170 1171 1184 +1184 1171 1185 +1171 1172 1185 +1185 1172 1186 +1172 1173 1186 +1186 1173 1187 +1173 1174 1187 +1187 1174 1188 +1174 1175 1188 +1188 1175 1189 +1175 1176 1189 +1189 1176 1190 +1176 1177 1190 +1190 1177 1191 +1177 1178 1191 +1191 1178 1192 +1178 1179 1192 +1192 1179 1193 +1179 1180 1193 +1193 1180 1194 +1180 1181 1194 +1194 1181 1195 +1181 1182 1195 +1195 1182 1196 +1182 358 1196 +1196 358 357 +297 1183 266 +266 1183 265 +1183 1184 265 +265 1184 264 +1184 1185 264 +264 1185 263 +1185 1186 263 +263 1186 262 +1186 1187 262 +262 1187 261 +1187 1188 261 +261 1188 260 +1188 1189 260 +260 1189 259 +1189 1190 259 +259 1190 258 +1190 1191 258 +258 1191 257 +1191 1192 257 +257 1192 256 +1192 1193 256 +256 1193 255 +1193 1194 255 +255 1194 254 +1194 1195 254 +254 1195 253 +1195 1196 253 +253 1196 252 +1196 357 252 +252 357 8 +281 8 356 +280 281 1197 +279 280 1198 +278 279 1200 +277 278 1203 +276 277 1207 +275 276 1212 +274 275 1218 +273 274 1225 +272 273 1233 +271 272 1242 +270 271 1252 +269 270 1263 +268 269 1275 +267 268 1288 +281 356 1197 +1197 356 355 +280 1197 1198 +1198 1197 1199 +1197 355 1199 +1199 355 354 +279 1198 1200 +1200 1198 1201 +1198 1199 1201 +1201 1199 1202 +1199 354 1202 +1202 354 353 +278 1200 1203 +1203 1200 1204 +1200 1201 1204 +1204 1201 1205 +1201 1202 1205 +1205 1202 1206 +1202 353 1206 +1206 353 352 +277 1203 1207 +1207 1203 1208 +1203 1204 1208 +1208 1204 1209 +1204 1205 1209 +1209 1205 1210 +1205 1206 1210 +1210 1206 1211 +1206 352 1211 +1211 352 351 +276 1207 1212 +1212 1207 1213 +1207 1208 1213 +1213 1208 1214 +1208 1209 1214 +1214 1209 1215 +1209 1210 1215 +1215 1210 1216 +1210 1211 1216 +1216 1211 1217 +1211 351 1217 +1217 351 350 +275 1212 1218 +1218 1212 1219 +1212 1213 1219 +1219 1213 1220 +1213 1214 1220 +1220 1214 1221 +1214 1215 1221 +1221 1215 1222 +1215 1216 1222 +1222 1216 1223 +1216 1217 1223 +1223 1217 1224 +1217 350 1224 +1224 350 349 +274 1218 1225 +1225 1218 1226 +1218 1219 1226 +1226 1219 1227 +1219 1220 1227 +1227 1220 1228 +1220 1221 1228 +1228 1221 1229 +1221 1222 1229 +1229 1222 1230 +1222 1223 1230 +1230 1223 1231 +1223 1224 1231 +1231 1224 1232 +1224 349 1232 +1232 349 348 +273 1225 1233 +1233 1225 1234 +1225 1226 1234 +1234 1226 1235 +1226 1227 1235 +1235 1227 1236 +1227 1228 1236 +1236 1228 1237 +1228 1229 1237 +1237 1229 1238 +1229 1230 1238 +1238 1230 1239 +1230 1231 1239 +1239 1231 1240 +1231 1232 1240 +1240 1232 1241 +1232 348 1241 +1241 348 347 +272 1233 1242 +1242 1233 1243 +1233 1234 1243 +1243 1234 1244 +1234 1235 1244 +1244 1235 1245 +1235 1236 1245 +1245 1236 1246 +1236 1237 1246 +1246 1237 1247 +1237 1238 1247 +1247 1238 1248 +1238 1239 1248 +1248 1239 1249 +1239 1240 1249 +1249 1240 1250 +1240 1241 1250 +1250 1241 1251 +1241 347 1251 +1251 347 346 +271 1242 1252 +1252 1242 1253 +1242 1243 1253 +1253 1243 1254 +1243 1244 1254 +1254 1244 1255 +1244 1245 1255 +1255 1245 1256 +1245 1246 1256 +1256 1246 1257 +1246 1247 1257 +1257 1247 1258 +1247 1248 1258 +1258 1248 1259 +1248 1249 1259 +1259 1249 1260 +1249 1250 1260 +1260 1250 1261 +1250 1251 1261 +1261 1251 1262 +1251 346 1262 +1262 346 345 +270 1252 1263 +1263 1252 1264 +1252 1253 1264 +1264 1253 1265 +1253 1254 1265 +1265 1254 1266 +1254 1255 1266 +1266 1255 1267 +1255 1256 1267 +1267 1256 1268 +1256 1257 1268 +1268 1257 1269 +1257 1258 1269 +1269 1258 1270 +1258 1259 1270 +1270 1259 1271 +1259 1260 1271 +1271 1260 1272 +1260 1261 1272 +1272 1261 1273 +1261 1262 1273 +1273 1262 1274 +1262 345 1274 +1274 345 344 +269 1263 1275 +1275 1263 1276 +1263 1264 1276 +1276 1264 1277 +1264 1265 1277 +1277 1265 1278 +1265 1266 1278 +1278 1266 1279 +1266 1267 1279 +1279 1267 1280 +1267 1268 1280 +1280 1268 1281 +1268 1269 1281 +1281 1269 1282 +1269 1270 1282 +1282 1270 1283 +1270 1271 1283 +1283 1271 1284 +1271 1272 1284 +1284 1272 1285 +1272 1273 1285 +1285 1273 1286 +1273 1274 1286 +1286 1274 1287 +1274 344 1287 +1287 344 343 +268 1275 1288 +1288 1275 1289 +1275 1276 1289 +1289 1276 1290 +1276 1277 1290 +1290 1277 1291 +1277 1278 1291 +1291 1278 1292 +1278 1279 1292 +1292 1279 1293 +1279 1280 1293 +1293 1280 1294 +1280 1281 1294 +1294 1281 1295 +1281 1282 1295 +1295 1282 1296 +1282 1283 1296 +1296 1283 1297 +1283 1284 1297 +1297 1284 1298 +1284 1285 1298 +1298 1285 1299 +1285 1286 1299 +1299 1286 1300 +1286 1287 1300 +1300 1287 1301 +1287 343 1301 +1301 343 342 +267 1288 236 +236 1288 235 +1288 1289 235 +235 1289 234 +1289 1290 234 +234 1290 233 +1290 1291 233 +233 1291 232 +1291 1292 232 +232 1292 231 +1292 1293 231 +231 1293 230 +1293 1294 230 +230 1294 229 +1294 1295 229 +229 1295 228 +1295 1296 228 +228 1296 227 +1296 1297 227 +227 1297 226 +1297 1298 226 +226 1298 225 +1298 1299 225 +225 1299 224 +1299 1300 224 +224 1300 223 +1300 1301 223 +223 1301 222 +1301 342 222 +222 342 7 +251 7 341 +250 251 1302 +249 250 1303 +248 249 1305 +247 248 1308 +246 247 1312 +245 246 1317 +244 245 1323 +243 244 1330 +242 243 1338 +241 242 1347 +240 241 1357 +239 240 1368 +238 239 1380 +237 238 1393 +251 341 1302 +1302 341 340 +250 1302 1303 +1303 1302 1304 +1302 340 1304 +1304 340 339 +249 1303 1305 +1305 1303 1306 +1303 1304 1306 +1306 1304 1307 +1304 339 1307 +1307 339 338 +248 1305 1308 +1308 1305 1309 +1305 1306 1309 +1309 1306 1310 +1306 1307 1310 +1310 1307 1311 +1307 338 1311 +1311 338 337 +247 1308 1312 +1312 1308 1313 +1308 1309 1313 +1313 1309 1314 +1309 1310 1314 +1314 1310 1315 +1310 1311 1315 +1315 1311 1316 +1311 337 1316 +1316 337 336 +246 1312 1317 +1317 1312 1318 +1312 1313 1318 +1318 1313 1319 +1313 1314 1319 +1319 1314 1320 +1314 1315 1320 +1320 1315 1321 +1315 1316 1321 +1321 1316 1322 +1316 336 1322 +1322 336 335 +245 1317 1323 +1323 1317 1324 +1317 1318 1324 +1324 1318 1325 +1318 1319 1325 +1325 1319 1326 +1319 1320 1326 +1326 1320 1327 +1320 1321 1327 +1327 1321 1328 +1321 1322 1328 +1328 1322 1329 +1322 335 1329 +1329 335 334 +244 1323 1330 +1330 1323 1331 +1323 1324 1331 +1331 1324 1332 +1324 1325 1332 +1332 1325 1333 +1325 1326 1333 +1333 1326 1334 +1326 1327 1334 +1334 1327 1335 +1327 1328 1335 +1335 1328 1336 +1328 1329 1336 +1336 1329 1337 +1329 334 1337 +1337 334 333 +243 1330 1338 +1338 1330 1339 +1330 1331 1339 +1339 1331 1340 +1331 1332 1340 +1340 1332 1341 +1332 1333 1341 +1341 1333 1342 +1333 1334 1342 +1342 1334 1343 +1334 1335 1343 +1343 1335 1344 +1335 1336 1344 +1344 1336 1345 +1336 1337 1345 +1345 1337 1346 +1337 333 1346 +1346 333 332 +242 1338 1347 +1347 1338 1348 +1338 1339 1348 +1348 1339 1349 +1339 1340 1349 +1349 1340 1350 +1340 1341 1350 +1350 1341 1351 +1341 1342 1351 +1351 1342 1352 +1342 1343 1352 +1352 1343 1353 +1343 1344 1353 +1353 1344 1354 +1344 1345 1354 +1354 1345 1355 +1345 1346 1355 +1355 1346 1356 +1346 332 1356 +1356 332 331 +241 1347 1357 +1357 1347 1358 +1347 1348 1358 +1358 1348 1359 +1348 1349 1359 +1359 1349 1360 +1349 1350 1360 +1360 1350 1361 +1350 1351 1361 +1361 1351 1362 +1351 1352 1362 +1362 1352 1363 +1352 1353 1363 +1363 1353 1364 +1353 1354 1364 +1364 1354 1365 +1354 1355 1365 +1365 1355 1366 +1355 1356 1366 +1366 1356 1367 +1356 331 1367 +1367 331 330 +240 1357 1368 +1368 1357 1369 +1357 1358 1369 +1369 1358 1370 +1358 1359 1370 +1370 1359 1371 +1359 1360 1371 +1371 1360 1372 +1360 1361 1372 +1372 1361 1373 +1361 1362 1373 +1373 1362 1374 +1362 1363 1374 +1374 1363 1375 +1363 1364 1375 +1375 1364 1376 +1364 1365 1376 +1376 1365 1377 +1365 1366 1377 +1377 1366 1378 +1366 1367 1378 +1378 1367 1379 +1367 330 1379 +1379 330 329 +239 1368 1380 +1380 1368 1381 +1368 1369 1381 +1381 1369 1382 +1369 1370 1382 +1382 1370 1383 +1370 1371 1383 +1383 1371 1384 +1371 1372 1384 +1384 1372 1385 +1372 1373 1385 +1385 1373 1386 +1373 1374 1386 +1386 1374 1387 +1374 1375 1387 +1387 1375 1388 +1375 1376 1388 +1388 1376 1389 +1376 1377 1389 +1389 1377 1390 +1377 1378 1390 +1390 1378 1391 +1378 1379 1391 +1391 1379 1392 +1379 329 1392 +1392 329 328 +238 1380 1393 +1393 1380 1394 +1380 1381 1394 +1394 1381 1395 +1381 1382 1395 +1395 1382 1396 +1382 1383 1396 +1396 1383 1397 +1383 1384 1397 +1397 1384 1398 +1384 1385 1398 +1398 1385 1399 +1385 1386 1399 +1399 1386 1400 +1386 1387 1400 +1400 1387 1401 +1387 1388 1401 +1401 1388 1402 +1388 1389 1402 +1402 1389 1403 +1389 1390 1403 +1403 1390 1404 +1390 1391 1404 +1404 1391 1405 +1391 1392 1405 +1405 1392 1406 +1392 328 1406 +1406 328 327 +237 1393 206 +206 1393 205 +1393 1394 205 +205 1394 204 +1394 1395 204 +204 1395 203 +1395 1396 203 +203 1396 202 +1396 1397 202 +202 1397 201 +1397 1398 201 +201 1398 200 +1398 1399 200 +200 1399 199 +1399 1400 199 +199 1400 198 +1400 1401 198 +198 1401 197 +1401 1402 197 +197 1402 196 +1402 1403 196 +196 1403 195 +1403 1404 195 +195 1404 194 +1404 1405 194 +194 1405 193 +1405 1406 193 +193 1406 192 +1406 327 192 +192 327 6 +221 6 326 +220 221 1407 +219 220 1408 +218 219 1410 +217 218 1413 +216 217 1417 +215 216 1422 +214 215 1428 +213 214 1435 +212 213 1443 +211 212 1452 +210 211 1462 +209 210 1473 +208 209 1485 +207 208 1498 +221 326 1407 +1407 326 325 +220 1407 1408 +1408 1407 1409 +1407 325 1409 +1409 325 324 +219 1408 1410 +1410 1408 1411 +1408 1409 1411 +1411 1409 1412 +1409 324 1412 +1412 324 323 +218 1410 1413 +1413 1410 1414 +1410 1411 1414 +1414 1411 1415 +1411 1412 1415 +1415 1412 1416 +1412 323 1416 +1416 323 322 +217 1413 1417 +1417 1413 1418 +1413 1414 1418 +1418 1414 1419 +1414 1415 1419 +1419 1415 1420 +1415 1416 1420 +1420 1416 1421 +1416 322 1421 +1421 322 321 +216 1417 1422 +1422 1417 1423 +1417 1418 1423 +1423 1418 1424 +1418 1419 1424 +1424 1419 1425 +1419 1420 1425 +1425 1420 1426 +1420 1421 1426 +1426 1421 1427 +1421 321 1427 +1427 321 320 +215 1422 1428 +1428 1422 1429 +1422 1423 1429 +1429 1423 1430 +1423 1424 1430 +1430 1424 1431 +1424 1425 1431 +1431 1425 1432 +1425 1426 1432 +1432 1426 1433 +1426 1427 1433 +1433 1427 1434 +1427 320 1434 +1434 320 319 +214 1428 1435 +1435 1428 1436 +1428 1429 1436 +1436 1429 1437 +1429 1430 1437 +1437 1430 1438 +1430 1431 1438 +1438 1431 1439 +1431 1432 1439 +1439 1432 1440 +1432 1433 1440 +1440 1433 1441 +1433 1434 1441 +1441 1434 1442 +1434 319 1442 +1442 319 318 +213 1435 1443 +1443 1435 1444 +1435 1436 1444 +1444 1436 1445 +1436 1437 1445 +1445 1437 1446 +1437 1438 1446 +1446 1438 1447 +1438 1439 1447 +1447 1439 1448 +1439 1440 1448 +1448 1440 1449 +1440 1441 1449 +1449 1441 1450 +1441 1442 1450 +1450 1442 1451 +1442 318 1451 +1451 318 317 +212 1443 1452 +1452 1443 1453 +1443 1444 1453 +1453 1444 1454 +1444 1445 1454 +1454 1445 1455 +1445 1446 1455 +1455 1446 1456 +1446 1447 1456 +1456 1447 1457 +1447 1448 1457 +1457 1448 1458 +1448 1449 1458 +1458 1449 1459 +1449 1450 1459 +1459 1450 1460 +1450 1451 1460 +1460 1451 1461 +1451 317 1461 +1461 317 316 +211 1452 1462 +1462 1452 1463 +1452 1453 1463 +1463 1453 1464 +1453 1454 1464 +1464 1454 1465 +1454 1455 1465 +1465 1455 1466 +1455 1456 1466 +1466 1456 1467 +1456 1457 1467 +1467 1457 1468 +1457 1458 1468 +1468 1458 1469 +1458 1459 1469 +1469 1459 1470 +1459 1460 1470 +1470 1460 1471 +1460 1461 1471 +1471 1461 1472 +1461 316 1472 +1472 316 315 +210 1462 1473 +1473 1462 1474 +1462 1463 1474 +1474 1463 1475 +1463 1464 1475 +1475 1464 1476 +1464 1465 1476 +1476 1465 1477 +1465 1466 1477 +1477 1466 1478 +1466 1467 1478 +1478 1467 1479 +1467 1468 1479 +1479 1468 1480 +1468 1469 1480 +1480 1469 1481 +1469 1470 1481 +1481 1470 1482 +1470 1471 1482 +1482 1471 1483 +1471 1472 1483 +1483 1472 1484 +1472 315 1484 +1484 315 314 +209 1473 1485 +1485 1473 1486 +1473 1474 1486 +1486 1474 1487 +1474 1475 1487 +1487 1475 1488 +1475 1476 1488 +1488 1476 1489 +1476 1477 1489 +1489 1477 1490 +1477 1478 1490 +1490 1478 1491 +1478 1479 1491 +1491 1479 1492 +1479 1480 1492 +1492 1480 1493 +1480 1481 1493 +1493 1481 1494 +1481 1482 1494 +1494 1482 1495 +1482 1483 1495 +1495 1483 1496 +1483 1484 1496 +1496 1484 1497 +1484 314 1497 +1497 314 313 +208 1485 1498 +1498 1485 1499 +1485 1486 1499 +1499 1486 1500 +1486 1487 1500 +1500 1487 1501 +1487 1488 1501 +1501 1488 1502 +1488 1489 1502 +1502 1489 1503 +1489 1490 1503 +1503 1490 1504 +1490 1491 1504 +1504 1491 1505 +1491 1492 1505 +1505 1492 1506 +1492 1493 1506 +1506 1493 1507 +1493 1494 1507 +1507 1494 1508 +1494 1495 1508 +1508 1495 1509 +1495 1496 1509 +1509 1496 1510 +1496 1497 1510 +1510 1497 1511 +1497 313 1511 +1511 313 312 +207 1498 176 +176 1498 175 +1498 1499 175 +175 1499 174 +1499 1500 174 +174 1500 173 +1500 1501 173 +173 1501 172 +1501 1502 172 +172 1502 171 +1502 1503 171 +171 1503 170 +1503 1504 170 +170 1504 169 +1504 1505 169 +169 1505 168 +1505 1506 168 +168 1506 167 +1506 1507 167 +167 1507 166 +1507 1508 166 +166 1508 165 +1508 1509 165 +165 1509 164 +1509 1510 164 +164 1510 163 +1510 1511 163 +163 1511 162 +1511 312 162 +162 312 10 +282 9 311 +283 282 1512 +284 283 1513 +285 284 1515 +286 285 1518 +287 286 1522 +288 287 1527 +289 288 1533 +290 289 1540 +291 290 1548 +292 291 1557 +293 292 1567 +294 293 1578 +295 294 1590 +296 295 1603 +282 311 1512 +1512 311 310 +283 1512 1513 +1513 1512 1514 +1512 310 1514 +1514 310 309 +284 1513 1515 +1515 1513 1516 +1513 1514 1516 +1516 1514 1517 +1514 309 1517 +1517 309 308 +285 1515 1518 +1518 1515 1519 +1515 1516 1519 +1519 1516 1520 +1516 1517 1520 +1520 1517 1521 +1517 308 1521 +1521 308 307 +286 1518 1522 +1522 1518 1523 +1518 1519 1523 +1523 1519 1524 +1519 1520 1524 +1524 1520 1525 +1520 1521 1525 +1525 1521 1526 +1521 307 1526 +1526 307 306 +287 1522 1527 +1527 1522 1528 +1522 1523 1528 +1528 1523 1529 +1523 1524 1529 +1529 1524 1530 +1524 1525 1530 +1530 1525 1531 +1525 1526 1531 +1531 1526 1532 +1526 306 1532 +1532 306 305 +288 1527 1533 +1533 1527 1534 +1527 1528 1534 +1534 1528 1535 +1528 1529 1535 +1535 1529 1536 +1529 1530 1536 +1536 1530 1537 +1530 1531 1537 +1537 1531 1538 +1531 1532 1538 +1538 1532 1539 +1532 305 1539 +1539 305 304 +289 1533 1540 +1540 1533 1541 +1533 1534 1541 +1541 1534 1542 +1534 1535 1542 +1542 1535 1543 +1535 1536 1543 +1543 1536 1544 +1536 1537 1544 +1544 1537 1545 +1537 1538 1545 +1545 1538 1546 +1538 1539 1546 +1546 1539 1547 +1539 304 1547 +1547 304 303 +290 1540 1548 +1548 1540 1549 +1540 1541 1549 +1549 1541 1550 +1541 1542 1550 +1550 1542 1551 +1542 1543 1551 +1551 1543 1552 +1543 1544 1552 +1552 1544 1553 +1544 1545 1553 +1553 1545 1554 +1545 1546 1554 +1554 1546 1555 +1546 1547 1555 +1555 1547 1556 +1547 303 1556 +1556 303 302 +291 1548 1557 +1557 1548 1558 +1548 1549 1558 +1558 1549 1559 +1549 1550 1559 +1559 1550 1560 +1550 1551 1560 +1560 1551 1561 +1551 1552 1561 +1561 1552 1562 +1552 1553 1562 +1562 1553 1563 +1553 1554 1563 +1563 1554 1564 +1554 1555 1564 +1564 1555 1565 +1555 1556 1565 +1565 1556 1566 +1556 302 1566 +1566 302 301 +292 1557 1567 +1567 1557 1568 +1557 1558 1568 +1568 1558 1569 +1558 1559 1569 +1569 1559 1570 +1559 1560 1570 +1570 1560 1571 +1560 1561 1571 +1571 1561 1572 +1561 1562 1572 +1572 1562 1573 +1562 1563 1573 +1573 1563 1574 +1563 1564 1574 +1574 1564 1575 +1564 1565 1575 +1575 1565 1576 +1565 1566 1576 +1576 1566 1577 +1566 301 1577 +1577 301 300 +293 1567 1578 +1578 1567 1579 +1567 1568 1579 +1579 1568 1580 +1568 1569 1580 +1580 1569 1581 +1569 1570 1581 +1581 1570 1582 +1570 1571 1582 +1582 1571 1583 +1571 1572 1583 +1583 1572 1584 +1572 1573 1584 +1584 1573 1585 +1573 1574 1585 +1585 1574 1586 +1574 1575 1586 +1586 1575 1587 +1575 1576 1587 +1587 1576 1588 +1576 1577 1588 +1588 1577 1589 +1577 300 1589 +1589 300 299 +294 1578 1590 +1590 1578 1591 +1578 1579 1591 +1591 1579 1592 +1579 1580 1592 +1592 1580 1593 +1580 1581 1593 +1593 1581 1594 +1581 1582 1594 +1594 1582 1595 +1582 1583 1595 +1595 1583 1596 +1583 1584 1596 +1596 1584 1597 +1584 1585 1597 +1597 1585 1598 +1585 1586 1598 +1598 1586 1599 +1586 1587 1599 +1599 1587 1600 +1587 1588 1600 +1600 1588 1601 +1588 1589 1601 +1601 1589 1602 +1589 299 1602 +1602 299 298 +295 1590 1603 +1603 1590 1604 +1590 1591 1604 +1604 1591 1605 +1591 1592 1605 +1605 1592 1606 +1592 1593 1606 +1606 1593 1607 +1593 1594 1607 +1607 1594 1608 +1594 1595 1608 +1608 1595 1609 +1595 1596 1609 +1609 1596 1610 +1596 1597 1610 +1610 1597 1611 +1597 1598 1611 +1611 1598 1612 +1598 1599 1612 +1612 1599 1613 +1599 1600 1613 +1613 1600 1614 +1600 1601 1614 +1614 1601 1615 +1601 1602 1615 +1615 1602 1616 +1602 298 1616 +1616 298 297 +296 1603 161 +161 1603 160 +1603 1604 160 +160 1604 159 +1604 1605 159 +159 1605 158 +1605 1606 158 +158 1606 157 +1606 1607 157 +157 1607 156 +1607 1608 156 +156 1608 155 +1608 1609 155 +155 1609 154 +1609 1610 154 +154 1610 153 +1610 1611 153 +153 1611 152 +1611 1612 152 +152 1612 151 +1612 1613 151 +151 1613 150 +1613 1614 150 +150 1614 149 +1614 1615 149 +149 1615 148 +1615 1616 148 +148 1616 147 +1616 297 147 +147 297 4 +252 8 281 +253 252 1617 +254 253 1618 +255 254 1620 +256 255 1623 +257 256 1627 +258 257 1632 +259 258 1638 +260 259 1645 +261 260 1653 +262 261 1662 +263 262 1672 +264 263 1683 +265 264 1695 +266 265 1708 +252 281 1617 +1617 281 280 +253 1617 1618 +1618 1617 1619 +1617 280 1619 +1619 280 279 +254 1618 1620 +1620 1618 1621 +1618 1619 1621 +1621 1619 1622 +1619 279 1622 +1622 279 278 +255 1620 1623 +1623 1620 1624 +1620 1621 1624 +1624 1621 1625 +1621 1622 1625 +1625 1622 1626 +1622 278 1626 +1626 278 277 +256 1623 1627 +1627 1623 1628 +1623 1624 1628 +1628 1624 1629 +1624 1625 1629 +1629 1625 1630 +1625 1626 1630 +1630 1626 1631 +1626 277 1631 +1631 277 276 +257 1627 1632 +1632 1627 1633 +1627 1628 1633 +1633 1628 1634 +1628 1629 1634 +1634 1629 1635 +1629 1630 1635 +1635 1630 1636 +1630 1631 1636 +1636 1631 1637 +1631 276 1637 +1637 276 275 +258 1632 1638 +1638 1632 1639 +1632 1633 1639 +1639 1633 1640 +1633 1634 1640 +1640 1634 1641 +1634 1635 1641 +1641 1635 1642 +1635 1636 1642 +1642 1636 1643 +1636 1637 1643 +1643 1637 1644 +1637 275 1644 +1644 275 274 +259 1638 1645 +1645 1638 1646 +1638 1639 1646 +1646 1639 1647 +1639 1640 1647 +1647 1640 1648 +1640 1641 1648 +1648 1641 1649 +1641 1642 1649 +1649 1642 1650 +1642 1643 1650 +1650 1643 1651 +1643 1644 1651 +1651 1644 1652 +1644 274 1652 +1652 274 273 +260 1645 1653 +1653 1645 1654 +1645 1646 1654 +1654 1646 1655 +1646 1647 1655 +1655 1647 1656 +1647 1648 1656 +1656 1648 1657 +1648 1649 1657 +1657 1649 1658 +1649 1650 1658 +1658 1650 1659 +1650 1651 1659 +1659 1651 1660 +1651 1652 1660 +1660 1652 1661 +1652 273 1661 +1661 273 272 +261 1653 1662 +1662 1653 1663 +1653 1654 1663 +1663 1654 1664 +1654 1655 1664 +1664 1655 1665 +1655 1656 1665 +1665 1656 1666 +1656 1657 1666 +1666 1657 1667 +1657 1658 1667 +1667 1658 1668 +1658 1659 1668 +1668 1659 1669 +1659 1660 1669 +1669 1660 1670 +1660 1661 1670 +1670 1661 1671 +1661 272 1671 +1671 272 271 +262 1662 1672 +1672 1662 1673 +1662 1663 1673 +1673 1663 1674 +1663 1664 1674 +1674 1664 1675 +1664 1665 1675 +1675 1665 1676 +1665 1666 1676 +1676 1666 1677 +1666 1667 1677 +1677 1667 1678 +1667 1668 1678 +1678 1668 1679 +1668 1669 1679 +1679 1669 1680 +1669 1670 1680 +1680 1670 1681 +1670 1671 1681 +1681 1671 1682 +1671 271 1682 +1682 271 270 +263 1672 1683 +1683 1672 1684 +1672 1673 1684 +1684 1673 1685 +1673 1674 1685 +1685 1674 1686 +1674 1675 1686 +1686 1675 1687 +1675 1676 1687 +1687 1676 1688 +1676 1677 1688 +1688 1677 1689 +1677 1678 1689 +1689 1678 1690 +1678 1679 1690 +1690 1679 1691 +1679 1680 1691 +1691 1680 1692 +1680 1681 1692 +1692 1681 1693 +1681 1682 1693 +1693 1682 1694 +1682 270 1694 +1694 270 269 +264 1683 1695 +1695 1683 1696 +1683 1684 1696 +1696 1684 1697 +1684 1685 1697 +1697 1685 1698 +1685 1686 1698 +1698 1686 1699 +1686 1687 1699 +1699 1687 1700 +1687 1688 1700 +1700 1688 1701 +1688 1689 1701 +1701 1689 1702 +1689 1690 1702 +1702 1690 1703 +1690 1691 1703 +1703 1691 1704 +1691 1692 1704 +1704 1692 1705 +1692 1693 1705 +1705 1693 1706 +1693 1694 1706 +1706 1694 1707 +1694 269 1707 +1707 269 268 +265 1695 1708 +1708 1695 1709 +1695 1696 1709 +1709 1696 1710 +1696 1697 1710 +1710 1697 1711 +1697 1698 1711 +1711 1698 1712 +1698 1699 1712 +1712 1699 1713 +1699 1700 1713 +1713 1700 1714 +1700 1701 1714 +1714 1701 1715 +1701 1702 1715 +1715 1702 1716 +1702 1703 1716 +1716 1703 1717 +1703 1704 1717 +1717 1704 1718 +1704 1705 1718 +1718 1705 1719 +1705 1706 1719 +1719 1706 1720 +1706 1707 1720 +1720 1707 1721 +1707 268 1721 +1721 268 267 +266 1708 146 +146 1708 145 +1708 1709 145 +145 1709 144 +1709 1710 144 +144 1710 143 +1710 1711 143 +143 1711 142 +1711 1712 142 +142 1712 141 +1712 1713 141 +141 1713 140 +1713 1714 140 +140 1714 139 +1714 1715 139 +139 1715 138 +1715 1716 138 +138 1716 137 +1716 1717 137 +137 1717 136 +1717 1718 136 +136 1718 135 +1718 1719 135 +135 1719 134 +1719 1720 134 +134 1720 133 +1720 1721 133 +133 1721 132 +1721 267 132 +132 267 3 +222 7 251 +223 222 1722 +224 223 1723 +225 224 1725 +226 225 1728 +227 226 1732 +228 227 1737 +229 228 1743 +230 229 1750 +231 230 1758 +232 231 1767 +233 232 1777 +234 233 1788 +235 234 1800 +236 235 1813 +222 251 1722 +1722 251 250 +223 1722 1723 +1723 1722 1724 +1722 250 1724 +1724 250 249 +224 1723 1725 +1725 1723 1726 +1723 1724 1726 +1726 1724 1727 +1724 249 1727 +1727 249 248 +225 1725 1728 +1728 1725 1729 +1725 1726 1729 +1729 1726 1730 +1726 1727 1730 +1730 1727 1731 +1727 248 1731 +1731 248 247 +226 1728 1732 +1732 1728 1733 +1728 1729 1733 +1733 1729 1734 +1729 1730 1734 +1734 1730 1735 +1730 1731 1735 +1735 1731 1736 +1731 247 1736 +1736 247 246 +227 1732 1737 +1737 1732 1738 +1732 1733 1738 +1738 1733 1739 +1733 1734 1739 +1739 1734 1740 +1734 1735 1740 +1740 1735 1741 +1735 1736 1741 +1741 1736 1742 +1736 246 1742 +1742 246 245 +228 1737 1743 +1743 1737 1744 +1737 1738 1744 +1744 1738 1745 +1738 1739 1745 +1745 1739 1746 +1739 1740 1746 +1746 1740 1747 +1740 1741 1747 +1747 1741 1748 +1741 1742 1748 +1748 1742 1749 +1742 245 1749 +1749 245 244 +229 1743 1750 +1750 1743 1751 +1743 1744 1751 +1751 1744 1752 +1744 1745 1752 +1752 1745 1753 +1745 1746 1753 +1753 1746 1754 +1746 1747 1754 +1754 1747 1755 +1747 1748 1755 +1755 1748 1756 +1748 1749 1756 +1756 1749 1757 +1749 244 1757 +1757 244 243 +230 1750 1758 +1758 1750 1759 +1750 1751 1759 +1759 1751 1760 +1751 1752 1760 +1760 1752 1761 +1752 1753 1761 +1761 1753 1762 +1753 1754 1762 +1762 1754 1763 +1754 1755 1763 +1763 1755 1764 +1755 1756 1764 +1764 1756 1765 +1756 1757 1765 +1765 1757 1766 +1757 243 1766 +1766 243 242 +231 1758 1767 +1767 1758 1768 +1758 1759 1768 +1768 1759 1769 +1759 1760 1769 +1769 1760 1770 +1760 1761 1770 +1770 1761 1771 +1761 1762 1771 +1771 1762 1772 +1762 1763 1772 +1772 1763 1773 +1763 1764 1773 +1773 1764 1774 +1764 1765 1774 +1774 1765 1775 +1765 1766 1775 +1775 1766 1776 +1766 242 1776 +1776 242 241 +232 1767 1777 +1777 1767 1778 +1767 1768 1778 +1778 1768 1779 +1768 1769 1779 +1779 1769 1780 +1769 1770 1780 +1780 1770 1781 +1770 1771 1781 +1781 1771 1782 +1771 1772 1782 +1782 1772 1783 +1772 1773 1783 +1783 1773 1784 +1773 1774 1784 +1784 1774 1785 +1774 1775 1785 +1785 1775 1786 +1775 1776 1786 +1786 1776 1787 +1776 241 1787 +1787 241 240 +233 1777 1788 +1788 1777 1789 +1777 1778 1789 +1789 1778 1790 +1778 1779 1790 +1790 1779 1791 +1779 1780 1791 +1791 1780 1792 +1780 1781 1792 +1792 1781 1793 +1781 1782 1793 +1793 1782 1794 +1782 1783 1794 +1794 1783 1795 +1783 1784 1795 +1795 1784 1796 +1784 1785 1796 +1796 1785 1797 +1785 1786 1797 +1797 1786 1798 +1786 1787 1798 +1798 1787 1799 +1787 240 1799 +1799 240 239 +234 1788 1800 +1800 1788 1801 +1788 1789 1801 +1801 1789 1802 +1789 1790 1802 +1802 1790 1803 +1790 1791 1803 +1803 1791 1804 +1791 1792 1804 +1804 1792 1805 +1792 1793 1805 +1805 1793 1806 +1793 1794 1806 +1806 1794 1807 +1794 1795 1807 +1807 1795 1808 +1795 1796 1808 +1808 1796 1809 +1796 1797 1809 +1809 1797 1810 +1797 1798 1810 +1810 1798 1811 +1798 1799 1811 +1811 1799 1812 +1799 239 1812 +1812 239 238 +235 1800 1813 +1813 1800 1814 +1800 1801 1814 +1814 1801 1815 +1801 1802 1815 +1815 1802 1816 +1802 1803 1816 +1816 1803 1817 +1803 1804 1817 +1817 1804 1818 +1804 1805 1818 +1818 1805 1819 +1805 1806 1819 +1819 1806 1820 +1806 1807 1820 +1820 1807 1821 +1807 1808 1821 +1821 1808 1822 +1808 1809 1822 +1822 1809 1823 +1809 1810 1823 +1823 1810 1824 +1810 1811 1824 +1824 1811 1825 +1811 1812 1825 +1825 1812 1826 +1812 238 1826 +1826 238 237 +236 1813 116 +116 1813 115 +1813 1814 115 +115 1814 114 +1814 1815 114 +114 1815 113 +1815 1816 113 +113 1816 112 +1816 1817 112 +112 1817 111 +1817 1818 111 +111 1818 110 +1818 1819 110 +110 1819 109 +1819 1820 109 +109 1820 108 +1820 1821 108 +108 1821 107 +1821 1822 107 +107 1822 106 +1822 1823 106 +106 1823 105 +1823 1824 105 +105 1824 104 +1824 1825 104 +104 1825 103 +1825 1826 103 +103 1826 102 +1826 237 102 +102 237 2 +192 6 221 +193 192 1827 +194 193 1828 +195 194 1830 +196 195 1833 +197 196 1837 +198 197 1842 +199 198 1848 +200 199 1855 +201 200 1863 +202 201 1872 +203 202 1882 +204 203 1893 +205 204 1905 +206 205 1918 +192 221 1827 +1827 221 220 +193 1827 1828 +1828 1827 1829 +1827 220 1829 +1829 220 219 +194 1828 1830 +1830 1828 1831 +1828 1829 1831 +1831 1829 1832 +1829 219 1832 +1832 219 218 +195 1830 1833 +1833 1830 1834 +1830 1831 1834 +1834 1831 1835 +1831 1832 1835 +1835 1832 1836 +1832 218 1836 +1836 218 217 +196 1833 1837 +1837 1833 1838 +1833 1834 1838 +1838 1834 1839 +1834 1835 1839 +1839 1835 1840 +1835 1836 1840 +1840 1836 1841 +1836 217 1841 +1841 217 216 +197 1837 1842 +1842 1837 1843 +1837 1838 1843 +1843 1838 1844 +1838 1839 1844 +1844 1839 1845 +1839 1840 1845 +1845 1840 1846 +1840 1841 1846 +1846 1841 1847 +1841 216 1847 +1847 216 215 +198 1842 1848 +1848 1842 1849 +1842 1843 1849 +1849 1843 1850 +1843 1844 1850 +1850 1844 1851 +1844 1845 1851 +1851 1845 1852 +1845 1846 1852 +1852 1846 1853 +1846 1847 1853 +1853 1847 1854 +1847 215 1854 +1854 215 214 +199 1848 1855 +1855 1848 1856 +1848 1849 1856 +1856 1849 1857 +1849 1850 1857 +1857 1850 1858 +1850 1851 1858 +1858 1851 1859 +1851 1852 1859 +1859 1852 1860 +1852 1853 1860 +1860 1853 1861 +1853 1854 1861 +1861 1854 1862 +1854 214 1862 +1862 214 213 +200 1855 1863 +1863 1855 1864 +1855 1856 1864 +1864 1856 1865 +1856 1857 1865 +1865 1857 1866 +1857 1858 1866 +1866 1858 1867 +1858 1859 1867 +1867 1859 1868 +1859 1860 1868 +1868 1860 1869 +1860 1861 1869 +1869 1861 1870 +1861 1862 1870 +1870 1862 1871 +1862 213 1871 +1871 213 212 +201 1863 1872 +1872 1863 1873 +1863 1864 1873 +1873 1864 1874 +1864 1865 1874 +1874 1865 1875 +1865 1866 1875 +1875 1866 1876 +1866 1867 1876 +1876 1867 1877 +1867 1868 1877 +1877 1868 1878 +1868 1869 1878 +1878 1869 1879 +1869 1870 1879 +1879 1870 1880 +1870 1871 1880 +1880 1871 1881 +1871 212 1881 +1881 212 211 +202 1872 1882 +1882 1872 1883 +1872 1873 1883 +1883 1873 1884 +1873 1874 1884 +1884 1874 1885 +1874 1875 1885 +1885 1875 1886 +1875 1876 1886 +1886 1876 1887 +1876 1877 1887 +1887 1877 1888 +1877 1878 1888 +1888 1878 1889 +1878 1879 1889 +1889 1879 1890 +1879 1880 1890 +1890 1880 1891 +1880 1881 1891 +1891 1881 1892 +1881 211 1892 +1892 211 210 +203 1882 1893 +1893 1882 1894 +1882 1883 1894 +1894 1883 1895 +1883 1884 1895 +1895 1884 1896 +1884 1885 1896 +1896 1885 1897 +1885 1886 1897 +1897 1886 1898 +1886 1887 1898 +1898 1887 1899 +1887 1888 1899 +1899 1888 1900 +1888 1889 1900 +1900 1889 1901 +1889 1890 1901 +1901 1890 1902 +1890 1891 1902 +1902 1891 1903 +1891 1892 1903 +1903 1892 1904 +1892 210 1904 +1904 210 209 +204 1893 1905 +1905 1893 1906 +1893 1894 1906 +1906 1894 1907 +1894 1895 1907 +1907 1895 1908 +1895 1896 1908 +1908 1896 1909 +1896 1897 1909 +1909 1897 1910 +1897 1898 1910 +1910 1898 1911 +1898 1899 1911 +1911 1899 1912 +1899 1900 1912 +1912 1900 1913 +1900 1901 1913 +1913 1901 1914 +1901 1902 1914 +1914 1902 1915 +1902 1903 1915 +1915 1903 1916 +1903 1904 1916 +1916 1904 1917 +1904 209 1917 +1917 209 208 +205 1905 1918 +1918 1905 1919 +1905 1906 1919 +1919 1906 1920 +1906 1907 1920 +1920 1907 1921 +1907 1908 1921 +1921 1908 1922 +1908 1909 1922 +1922 1909 1923 +1909 1910 1923 +1923 1910 1924 +1910 1911 1924 +1924 1911 1925 +1911 1912 1925 +1925 1912 1926 +1912 1913 1926 +1926 1913 1927 +1913 1914 1927 +1927 1914 1928 +1914 1915 1928 +1928 1915 1929 +1915 1916 1929 +1929 1916 1930 +1916 1917 1930 +1930 1917 1931 +1917 208 1931 +1931 208 207 +206 1918 56 +56 1918 55 +1918 1919 55 +55 1919 54 +1919 1920 54 +54 1920 53 +1920 1921 53 +53 1921 52 +1921 1922 52 +52 1922 51 +1922 1923 51 +51 1923 50 +1923 1924 50 +50 1924 49 +1924 1925 49 +49 1925 48 +1925 1926 48 +48 1926 47 +1926 1927 47 +47 1927 46 +1927 1928 46 +46 1928 45 +1928 1929 45 +45 1929 44 +1929 1930 44 +44 1930 43 +1930 1931 43 +43 1931 42 +1931 207 42 +42 207 1 +162 10 191 +163 162 1932 +164 163 1933 +165 164 1935 +166 165 1938 +167 166 1942 +168 167 1947 +169 168 1953 +170 169 1960 +171 170 1968 +172 171 1977 +173 172 1987 +174 173 1998 +175 174 2010 +176 175 2023 +162 191 1932 +1932 191 190 +163 1932 1933 +1933 1932 1934 +1932 190 1934 +1934 190 189 +164 1933 1935 +1935 1933 1936 +1933 1934 1936 +1936 1934 1937 +1934 189 1937 +1937 189 188 +165 1935 1938 +1938 1935 1939 +1935 1936 1939 +1939 1936 1940 +1936 1937 1940 +1940 1937 1941 +1937 188 1941 +1941 188 187 +166 1938 1942 +1942 1938 1943 +1938 1939 1943 +1943 1939 1944 +1939 1940 1944 +1944 1940 1945 +1940 1941 1945 +1945 1941 1946 +1941 187 1946 +1946 187 186 +167 1942 1947 +1947 1942 1948 +1942 1943 1948 +1948 1943 1949 +1943 1944 1949 +1949 1944 1950 +1944 1945 1950 +1950 1945 1951 +1945 1946 1951 +1951 1946 1952 +1946 186 1952 +1952 186 185 +168 1947 1953 +1953 1947 1954 +1947 1948 1954 +1954 1948 1955 +1948 1949 1955 +1955 1949 1956 +1949 1950 1956 +1956 1950 1957 +1950 1951 1957 +1957 1951 1958 +1951 1952 1958 +1958 1952 1959 +1952 185 1959 +1959 185 184 +169 1953 1960 +1960 1953 1961 +1953 1954 1961 +1961 1954 1962 +1954 1955 1962 +1962 1955 1963 +1955 1956 1963 +1963 1956 1964 +1956 1957 1964 +1964 1957 1965 +1957 1958 1965 +1965 1958 1966 +1958 1959 1966 +1966 1959 1967 +1959 184 1967 +1967 184 183 +170 1960 1968 +1968 1960 1969 +1960 1961 1969 +1969 1961 1970 +1961 1962 1970 +1970 1962 1971 +1962 1963 1971 +1971 1963 1972 +1963 1964 1972 +1972 1964 1973 +1964 1965 1973 +1973 1965 1974 +1965 1966 1974 +1974 1966 1975 +1966 1967 1975 +1975 1967 1976 +1967 183 1976 +1976 183 182 +171 1968 1977 +1977 1968 1978 +1968 1969 1978 +1978 1969 1979 +1969 1970 1979 +1979 1970 1980 +1970 1971 1980 +1980 1971 1981 +1971 1972 1981 +1981 1972 1982 +1972 1973 1982 +1982 1973 1983 +1973 1974 1983 +1983 1974 1984 +1974 1975 1984 +1984 1975 1985 +1975 1976 1985 +1985 1976 1986 +1976 182 1986 +1986 182 181 +172 1977 1987 +1987 1977 1988 +1977 1978 1988 +1988 1978 1989 +1978 1979 1989 +1989 1979 1990 +1979 1980 1990 +1990 1980 1991 +1980 1981 1991 +1991 1981 1992 +1981 1982 1992 +1992 1982 1993 +1982 1983 1993 +1993 1983 1994 +1983 1984 1994 +1994 1984 1995 +1984 1985 1995 +1995 1985 1996 +1985 1986 1996 +1996 1986 1997 +1986 181 1997 +1997 181 180 +173 1987 1998 +1998 1987 1999 +1987 1988 1999 +1999 1988 2000 +1988 1989 2000 +2000 1989 2001 +1989 1990 2001 +2001 1990 2002 +1990 1991 2002 +2002 1991 2003 +1991 1992 2003 +2003 1992 2004 +1992 1993 2004 +2004 1993 2005 +1993 1994 2005 +2005 1994 2006 +1994 1995 2006 +2006 1995 2007 +1995 1996 2007 +2007 1996 2008 +1996 1997 2008 +2008 1997 2009 +1997 180 2009 +2009 180 179 +174 1998 2010 +2010 1998 2011 +1998 1999 2011 +2011 1999 2012 +1999 2000 2012 +2012 2000 2013 +2000 2001 2013 +2013 2001 2014 +2001 2002 2014 +2014 2002 2015 +2002 2003 2015 +2015 2003 2016 +2003 2004 2016 +2016 2004 2017 +2004 2005 2017 +2017 2005 2018 +2005 2006 2018 +2018 2006 2019 +2006 2007 2019 +2019 2007 2020 +2007 2008 2020 +2020 2008 2021 +2008 2009 2021 +2021 2009 2022 +2009 179 2022 +2022 179 178 +175 2010 2023 +2023 2010 2024 +2010 2011 2024 +2024 2011 2025 +2011 2012 2025 +2025 2012 2026 +2012 2013 2026 +2026 2013 2027 +2013 2014 2027 +2027 2014 2028 +2014 2015 2028 +2028 2015 2029 +2015 2016 2029 +2029 2016 2030 +2016 2017 2030 +2030 2017 2031 +2017 2018 2031 +2031 2018 2032 +2018 2019 2032 +2032 2019 2033 +2019 2020 2033 +2033 2020 2034 +2020 2021 2034 +2034 2021 2035 +2021 2022 2035 +2035 2022 2036 +2022 178 2036 +2036 178 177 +176 2023 71 +71 2023 70 +2023 2024 70 +70 2024 69 +2024 2025 69 +69 2025 68 +2025 2026 68 +68 2026 67 +2026 2027 67 +67 2027 66 +2027 2028 66 +66 2028 65 +2028 2029 65 +65 2029 64 +2029 2030 64 +64 2030 63 +2030 2031 63 +63 2031 62 +2031 2032 62 +62 2032 61 +2032 2033 61 +61 2033 60 +2033 2034 60 +60 2034 59 +2034 2035 59 +59 2035 58 +2035 2036 58 +58 2036 57 +2036 177 57 +57 177 5 +86 5 161 +85 86 2037 +84 85 2038 +83 84 2040 +82 83 2043 +81 82 2047 +80 81 2052 +79 80 2058 +78 79 2065 +77 78 2073 +76 77 2082 +75 76 2092 +74 75 2103 +73 74 2115 +72 73 2128 +86 161 2037 +2037 161 160 +85 2037 2038 +2038 2037 2039 +2037 160 2039 +2039 160 159 +84 2038 2040 +2040 2038 2041 +2038 2039 2041 +2041 2039 2042 +2039 159 2042 +2042 159 158 +83 2040 2043 +2043 2040 2044 +2040 2041 2044 +2044 2041 2045 +2041 2042 2045 +2045 2042 2046 +2042 158 2046 +2046 158 157 +82 2043 2047 +2047 2043 2048 +2043 2044 2048 +2048 2044 2049 +2044 2045 2049 +2049 2045 2050 +2045 2046 2050 +2050 2046 2051 +2046 157 2051 +2051 157 156 +81 2047 2052 +2052 2047 2053 +2047 2048 2053 +2053 2048 2054 +2048 2049 2054 +2054 2049 2055 +2049 2050 2055 +2055 2050 2056 +2050 2051 2056 +2056 2051 2057 +2051 156 2057 +2057 156 155 +80 2052 2058 +2058 2052 2059 +2052 2053 2059 +2059 2053 2060 +2053 2054 2060 +2060 2054 2061 +2054 2055 2061 +2061 2055 2062 +2055 2056 2062 +2062 2056 2063 +2056 2057 2063 +2063 2057 2064 +2057 155 2064 +2064 155 154 +79 2058 2065 +2065 2058 2066 +2058 2059 2066 +2066 2059 2067 +2059 2060 2067 +2067 2060 2068 +2060 2061 2068 +2068 2061 2069 +2061 2062 2069 +2069 2062 2070 +2062 2063 2070 +2070 2063 2071 +2063 2064 2071 +2071 2064 2072 +2064 154 2072 +2072 154 153 +78 2065 2073 +2073 2065 2074 +2065 2066 2074 +2074 2066 2075 +2066 2067 2075 +2075 2067 2076 +2067 2068 2076 +2076 2068 2077 +2068 2069 2077 +2077 2069 2078 +2069 2070 2078 +2078 2070 2079 +2070 2071 2079 +2079 2071 2080 +2071 2072 2080 +2080 2072 2081 +2072 153 2081 +2081 153 152 +77 2073 2082 +2082 2073 2083 +2073 2074 2083 +2083 2074 2084 +2074 2075 2084 +2084 2075 2085 +2075 2076 2085 +2085 2076 2086 +2076 2077 2086 +2086 2077 2087 +2077 2078 2087 +2087 2078 2088 +2078 2079 2088 +2088 2079 2089 +2079 2080 2089 +2089 2080 2090 +2080 2081 2090 +2090 2081 2091 +2081 152 2091 +2091 152 151 +76 2082 2092 +2092 2082 2093 +2082 2083 2093 +2093 2083 2094 +2083 2084 2094 +2094 2084 2095 +2084 2085 2095 +2095 2085 2096 +2085 2086 2096 +2096 2086 2097 +2086 2087 2097 +2097 2087 2098 +2087 2088 2098 +2098 2088 2099 +2088 2089 2099 +2099 2089 2100 +2089 2090 2100 +2100 2090 2101 +2090 2091 2101 +2101 2091 2102 +2091 151 2102 +2102 151 150 +75 2092 2103 +2103 2092 2104 +2092 2093 2104 +2104 2093 2105 +2093 2094 2105 +2105 2094 2106 +2094 2095 2106 +2106 2095 2107 +2095 2096 2107 +2107 2096 2108 +2096 2097 2108 +2108 2097 2109 +2097 2098 2109 +2109 2098 2110 +2098 2099 2110 +2110 2099 2111 +2099 2100 2111 +2111 2100 2112 +2100 2101 2112 +2112 2101 2113 +2101 2102 2113 +2113 2102 2114 +2102 150 2114 +2114 150 149 +74 2103 2115 +2115 2103 2116 +2103 2104 2116 +2116 2104 2117 +2104 2105 2117 +2117 2105 2118 +2105 2106 2118 +2118 2106 2119 +2106 2107 2119 +2119 2107 2120 +2107 2108 2120 +2120 2108 2121 +2108 2109 2121 +2121 2109 2122 +2109 2110 2122 +2122 2110 2123 +2110 2111 2123 +2123 2111 2124 +2111 2112 2124 +2124 2112 2125 +2112 2113 2125 +2125 2113 2126 +2113 2114 2126 +2126 2114 2127 +2114 149 2127 +2127 149 148 +73 2115 2128 +2128 2115 2129 +2115 2116 2129 +2129 2116 2130 +2116 2117 2130 +2130 2117 2131 +2117 2118 2131 +2131 2118 2132 +2118 2119 2132 +2132 2119 2133 +2119 2120 2133 +2133 2120 2134 +2120 2121 2134 +2134 2121 2135 +2121 2122 2135 +2135 2122 2136 +2122 2123 2136 +2136 2123 2137 +2123 2124 2137 +2137 2124 2138 +2124 2125 2138 +2138 2125 2139 +2125 2126 2139 +2139 2126 2140 +2126 2127 2140 +2140 2127 2141 +2127 148 2141 +2141 148 147 +72 2128 131 +131 2128 130 +2128 2129 130 +130 2129 129 +2129 2130 129 +129 2130 128 +2130 2131 128 +128 2131 127 +2131 2132 127 +127 2132 126 +2132 2133 126 +126 2133 125 +2133 2134 125 +125 2134 124 +2134 2135 124 +124 2135 123 +2135 2136 123 +123 2136 122 +2136 2137 122 +122 2137 121 +2137 2138 121 +121 2138 120 +2138 2139 120 +120 2139 119 +2139 2140 119 +119 2140 118 +2140 2141 118 +118 2141 117 +2141 147 117 +117 147 4 +117 4 146 +118 117 2142 +119 118 2143 +120 119 2145 +121 120 2148 +122 121 2152 +123 122 2157 +124 123 2163 +125 124 2170 +126 125 2178 +127 126 2187 +128 127 2197 +129 128 2208 +130 129 2220 +131 130 2233 +117 146 2142 +2142 146 145 +118 2142 2143 +2143 2142 2144 +2142 145 2144 +2144 145 144 +119 2143 2145 +2145 2143 2146 +2143 2144 2146 +2146 2144 2147 +2144 144 2147 +2147 144 143 +120 2145 2148 +2148 2145 2149 +2145 2146 2149 +2149 2146 2150 +2146 2147 2150 +2150 2147 2151 +2147 143 2151 +2151 143 142 +121 2148 2152 +2152 2148 2153 +2148 2149 2153 +2153 2149 2154 +2149 2150 2154 +2154 2150 2155 +2150 2151 2155 +2155 2151 2156 +2151 142 2156 +2156 142 141 +122 2152 2157 +2157 2152 2158 +2152 2153 2158 +2158 2153 2159 +2153 2154 2159 +2159 2154 2160 +2154 2155 2160 +2160 2155 2161 +2155 2156 2161 +2161 2156 2162 +2156 141 2162 +2162 141 140 +123 2157 2163 +2163 2157 2164 +2157 2158 2164 +2164 2158 2165 +2158 2159 2165 +2165 2159 2166 +2159 2160 2166 +2166 2160 2167 +2160 2161 2167 +2167 2161 2168 +2161 2162 2168 +2168 2162 2169 +2162 140 2169 +2169 140 139 +124 2163 2170 +2170 2163 2171 +2163 2164 2171 +2171 2164 2172 +2164 2165 2172 +2172 2165 2173 +2165 2166 2173 +2173 2166 2174 +2166 2167 2174 +2174 2167 2175 +2167 2168 2175 +2175 2168 2176 +2168 2169 2176 +2176 2169 2177 +2169 139 2177 +2177 139 138 +125 2170 2178 +2178 2170 2179 +2170 2171 2179 +2179 2171 2180 +2171 2172 2180 +2180 2172 2181 +2172 2173 2181 +2181 2173 2182 +2173 2174 2182 +2182 2174 2183 +2174 2175 2183 +2183 2175 2184 +2175 2176 2184 +2184 2176 2185 +2176 2177 2185 +2185 2177 2186 +2177 138 2186 +2186 138 137 +126 2178 2187 +2187 2178 2188 +2178 2179 2188 +2188 2179 2189 +2179 2180 2189 +2189 2180 2190 +2180 2181 2190 +2190 2181 2191 +2181 2182 2191 +2191 2182 2192 +2182 2183 2192 +2192 2183 2193 +2183 2184 2193 +2193 2184 2194 +2184 2185 2194 +2194 2185 2195 +2185 2186 2195 +2195 2186 2196 +2186 137 2196 +2196 137 136 +127 2187 2197 +2197 2187 2198 +2187 2188 2198 +2198 2188 2199 +2188 2189 2199 +2199 2189 2200 +2189 2190 2200 +2200 2190 2201 +2190 2191 2201 +2201 2191 2202 +2191 2192 2202 +2202 2192 2203 +2192 2193 2203 +2203 2193 2204 +2193 2194 2204 +2204 2194 2205 +2194 2195 2205 +2205 2195 2206 +2195 2196 2206 +2206 2196 2207 +2196 136 2207 +2207 136 135 +128 2197 2208 +2208 2197 2209 +2197 2198 2209 +2209 2198 2210 +2198 2199 2210 +2210 2199 2211 +2199 2200 2211 +2211 2200 2212 +2200 2201 2212 +2212 2201 2213 +2201 2202 2213 +2213 2202 2214 +2202 2203 2214 +2214 2203 2215 +2203 2204 2215 +2215 2204 2216 +2204 2205 2216 +2216 2205 2217 +2205 2206 2217 +2217 2206 2218 +2206 2207 2218 +2218 2207 2219 +2207 135 2219 +2219 135 134 +129 2208 2220 +2220 2208 2221 +2208 2209 2221 +2221 2209 2222 +2209 2210 2222 +2222 2210 2223 +2210 2211 2223 +2223 2211 2224 +2211 2212 2224 +2224 2212 2225 +2212 2213 2225 +2225 2213 2226 +2213 2214 2226 +2226 2214 2227 +2214 2215 2227 +2227 2215 2228 +2215 2216 2228 +2228 2216 2229 +2216 2217 2229 +2229 2217 2230 +2217 2218 2230 +2230 2218 2231 +2218 2219 2231 +2231 2219 2232 +2219 134 2232 +2232 134 133 +130 2220 2233 +2233 2220 2234 +2220 2221 2234 +2234 2221 2235 +2221 2222 2235 +2235 2222 2236 +2222 2223 2236 +2236 2223 2237 +2223 2224 2237 +2237 2224 2238 +2224 2225 2238 +2238 2225 2239 +2225 2226 2239 +2239 2226 2240 +2226 2227 2240 +2240 2227 2241 +2227 2228 2241 +2241 2228 2242 +2228 2229 2242 +2242 2229 2243 +2229 2230 2243 +2243 2230 2244 +2230 2231 2244 +2244 2231 2245 +2231 2232 2245 +2245 2232 2246 +2232 133 2246 +2246 133 132 +131 2233 101 +101 2233 100 +2233 2234 100 +100 2234 99 +2234 2235 99 +99 2235 98 +2235 2236 98 +98 2236 97 +2236 2237 97 +97 2237 96 +2237 2238 96 +96 2238 95 +2238 2239 95 +95 2239 94 +2239 2240 94 +94 2240 93 +2240 2241 93 +93 2241 92 +2241 2242 92 +92 2242 91 +2242 2243 91 +91 2243 90 +2243 2244 90 +90 2244 89 +2244 2245 89 +89 2245 88 +2245 2246 88 +88 2246 87 +2246 132 87 +87 132 3 +87 3 116 +88 87 2247 +89 88 2248 +90 89 2250 +91 90 2253 +92 91 2257 +93 92 2262 +94 93 2268 +95 94 2275 +96 95 2283 +97 96 2292 +98 97 2302 +99 98 2313 +100 99 2325 +101 100 2338 +87 116 2247 +2247 116 115 +88 2247 2248 +2248 2247 2249 +2247 115 2249 +2249 115 114 +89 2248 2250 +2250 2248 2251 +2248 2249 2251 +2251 2249 2252 +2249 114 2252 +2252 114 113 +90 2250 2253 +2253 2250 2254 +2250 2251 2254 +2254 2251 2255 +2251 2252 2255 +2255 2252 2256 +2252 113 2256 +2256 113 112 +91 2253 2257 +2257 2253 2258 +2253 2254 2258 +2258 2254 2259 +2254 2255 2259 +2259 2255 2260 +2255 2256 2260 +2260 2256 2261 +2256 112 2261 +2261 112 111 +92 2257 2262 +2262 2257 2263 +2257 2258 2263 +2263 2258 2264 +2258 2259 2264 +2264 2259 2265 +2259 2260 2265 +2265 2260 2266 +2260 2261 2266 +2266 2261 2267 +2261 111 2267 +2267 111 110 +93 2262 2268 +2268 2262 2269 +2262 2263 2269 +2269 2263 2270 +2263 2264 2270 +2270 2264 2271 +2264 2265 2271 +2271 2265 2272 +2265 2266 2272 +2272 2266 2273 +2266 2267 2273 +2273 2267 2274 +2267 110 2274 +2274 110 109 +94 2268 2275 +2275 2268 2276 +2268 2269 2276 +2276 2269 2277 +2269 2270 2277 +2277 2270 2278 +2270 2271 2278 +2278 2271 2279 +2271 2272 2279 +2279 2272 2280 +2272 2273 2280 +2280 2273 2281 +2273 2274 2281 +2281 2274 2282 +2274 109 2282 +2282 109 108 +95 2275 2283 +2283 2275 2284 +2275 2276 2284 +2284 2276 2285 +2276 2277 2285 +2285 2277 2286 +2277 2278 2286 +2286 2278 2287 +2278 2279 2287 +2287 2279 2288 +2279 2280 2288 +2288 2280 2289 +2280 2281 2289 +2289 2281 2290 +2281 2282 2290 +2290 2282 2291 +2282 108 2291 +2291 108 107 +96 2283 2292 +2292 2283 2293 +2283 2284 2293 +2293 2284 2294 +2284 2285 2294 +2294 2285 2295 +2285 2286 2295 +2295 2286 2296 +2286 2287 2296 +2296 2287 2297 +2287 2288 2297 +2297 2288 2298 +2288 2289 2298 +2298 2289 2299 +2289 2290 2299 +2299 2290 2300 +2290 2291 2300 +2300 2291 2301 +2291 107 2301 +2301 107 106 +97 2292 2302 +2302 2292 2303 +2292 2293 2303 +2303 2293 2304 +2293 2294 2304 +2304 2294 2305 +2294 2295 2305 +2305 2295 2306 +2295 2296 2306 +2306 2296 2307 +2296 2297 2307 +2307 2297 2308 +2297 2298 2308 +2308 2298 2309 +2298 2299 2309 +2309 2299 2310 +2299 2300 2310 +2310 2300 2311 +2300 2301 2311 +2311 2301 2312 +2301 106 2312 +2312 106 105 +98 2302 2313 +2313 2302 2314 +2302 2303 2314 +2314 2303 2315 +2303 2304 2315 +2315 2304 2316 +2304 2305 2316 +2316 2305 2317 +2305 2306 2317 +2317 2306 2318 +2306 2307 2318 +2318 2307 2319 +2307 2308 2319 +2319 2308 2320 +2308 2309 2320 +2320 2309 2321 +2309 2310 2321 +2321 2310 2322 +2310 2311 2322 +2322 2311 2323 +2311 2312 2323 +2323 2312 2324 +2312 105 2324 +2324 105 104 +99 2313 2325 +2325 2313 2326 +2313 2314 2326 +2326 2314 2327 +2314 2315 2327 +2327 2315 2328 +2315 2316 2328 +2328 2316 2329 +2316 2317 2329 +2329 2317 2330 +2317 2318 2330 +2330 2318 2331 +2318 2319 2331 +2331 2319 2332 +2319 2320 2332 +2332 2320 2333 +2320 2321 2333 +2333 2321 2334 +2321 2322 2334 +2334 2322 2335 +2322 2323 2335 +2335 2323 2336 +2323 2324 2336 +2336 2324 2337 +2324 104 2337 +2337 104 103 +100 2325 2338 +2338 2325 2339 +2325 2326 2339 +2339 2326 2340 +2326 2327 2340 +2340 2327 2341 +2327 2328 2341 +2341 2328 2342 +2328 2329 2342 +2342 2329 2343 +2329 2330 2343 +2343 2330 2344 +2330 2331 2344 +2344 2331 2345 +2331 2332 2345 +2345 2332 2346 +2332 2333 2346 +2346 2333 2347 +2333 2334 2347 +2347 2334 2348 +2334 2335 2348 +2348 2335 2349 +2335 2336 2349 +2349 2336 2350 +2336 2337 2350 +2350 2337 2351 +2337 103 2351 +2351 103 102 +101 2338 26 +26 2338 25 +2338 2339 25 +25 2339 24 +2339 2340 24 +24 2340 23 +2340 2341 23 +23 2341 22 +2341 2342 22 +22 2342 21 +2342 2343 21 +21 2343 20 +2343 2344 20 +20 2344 19 +2344 2345 19 +19 2345 18 +2345 2346 18 +18 2346 17 +2346 2347 17 +17 2347 16 +2347 2348 16 +16 2348 15 +2348 2349 15 +15 2349 14 +2349 2350 14 +14 2350 13 +2350 2351 13 +13 2351 12 +2351 102 12 +12 102 2 +57 5 86 +58 57 2352 +59 58 2353 +60 59 2355 +61 60 2358 +62 61 2362 +63 62 2367 +64 63 2373 +65 64 2380 +66 65 2388 +67 66 2397 +68 67 2407 +69 68 2418 +70 69 2430 +71 70 2443 +57 86 2352 +2352 86 85 +58 2352 2353 +2353 2352 2354 +2352 85 2354 +2354 85 84 +59 2353 2355 +2355 2353 2356 +2353 2354 2356 +2356 2354 2357 +2354 84 2357 +2357 84 83 +60 2355 2358 +2358 2355 2359 +2355 2356 2359 +2359 2356 2360 +2356 2357 2360 +2360 2357 2361 +2357 83 2361 +2361 83 82 +61 2358 2362 +2362 2358 2363 +2358 2359 2363 +2363 2359 2364 +2359 2360 2364 +2364 2360 2365 +2360 2361 2365 +2365 2361 2366 +2361 82 2366 +2366 82 81 +62 2362 2367 +2367 2362 2368 +2362 2363 2368 +2368 2363 2369 +2363 2364 2369 +2369 2364 2370 +2364 2365 2370 +2370 2365 2371 +2365 2366 2371 +2371 2366 2372 +2366 81 2372 +2372 81 80 +63 2367 2373 +2373 2367 2374 +2367 2368 2374 +2374 2368 2375 +2368 2369 2375 +2375 2369 2376 +2369 2370 2376 +2376 2370 2377 +2370 2371 2377 +2377 2371 2378 +2371 2372 2378 +2378 2372 2379 +2372 80 2379 +2379 80 79 +64 2373 2380 +2380 2373 2381 +2373 2374 2381 +2381 2374 2382 +2374 2375 2382 +2382 2375 2383 +2375 2376 2383 +2383 2376 2384 +2376 2377 2384 +2384 2377 2385 +2377 2378 2385 +2385 2378 2386 +2378 2379 2386 +2386 2379 2387 +2379 79 2387 +2387 79 78 +65 2380 2388 +2388 2380 2389 +2380 2381 2389 +2389 2381 2390 +2381 2382 2390 +2390 2382 2391 +2382 2383 2391 +2391 2383 2392 +2383 2384 2392 +2392 2384 2393 +2384 2385 2393 +2393 2385 2394 +2385 2386 2394 +2394 2386 2395 +2386 2387 2395 +2395 2387 2396 +2387 78 2396 +2396 78 77 +66 2388 2397 +2397 2388 2398 +2388 2389 2398 +2398 2389 2399 +2389 2390 2399 +2399 2390 2400 +2390 2391 2400 +2400 2391 2401 +2391 2392 2401 +2401 2392 2402 +2392 2393 2402 +2402 2393 2403 +2393 2394 2403 +2403 2394 2404 +2394 2395 2404 +2404 2395 2405 +2395 2396 2405 +2405 2396 2406 +2396 77 2406 +2406 77 76 +67 2397 2407 +2407 2397 2408 +2397 2398 2408 +2408 2398 2409 +2398 2399 2409 +2409 2399 2410 +2399 2400 2410 +2410 2400 2411 +2400 2401 2411 +2411 2401 2412 +2401 2402 2412 +2412 2402 2413 +2402 2403 2413 +2413 2403 2414 +2403 2404 2414 +2414 2404 2415 +2404 2405 2415 +2415 2405 2416 +2405 2406 2416 +2416 2406 2417 +2406 76 2417 +2417 76 75 +68 2407 2418 +2418 2407 2419 +2407 2408 2419 +2419 2408 2420 +2408 2409 2420 +2420 2409 2421 +2409 2410 2421 +2421 2410 2422 +2410 2411 2422 +2422 2411 2423 +2411 2412 2423 +2423 2412 2424 +2412 2413 2424 +2424 2413 2425 +2413 2414 2425 +2425 2414 2426 +2414 2415 2426 +2426 2415 2427 +2415 2416 2427 +2427 2416 2428 +2416 2417 2428 +2428 2417 2429 +2417 75 2429 +2429 75 74 +69 2418 2430 +2430 2418 2431 +2418 2419 2431 +2431 2419 2432 +2419 2420 2432 +2432 2420 2433 +2420 2421 2433 +2433 2421 2434 +2421 2422 2434 +2434 2422 2435 +2422 2423 2435 +2435 2423 2436 +2423 2424 2436 +2436 2424 2437 +2424 2425 2437 +2437 2425 2438 +2425 2426 2438 +2438 2426 2439 +2426 2427 2439 +2439 2427 2440 +2427 2428 2440 +2440 2428 2441 +2428 2429 2441 +2441 2429 2442 +2429 74 2442 +2442 74 73 +70 2430 2443 +2443 2430 2444 +2430 2431 2444 +2444 2431 2445 +2431 2432 2445 +2445 2432 2446 +2432 2433 2446 +2446 2433 2447 +2433 2434 2447 +2447 2434 2448 +2434 2435 2448 +2448 2435 2449 +2435 2436 2449 +2449 2436 2450 +2436 2437 2450 +2450 2437 2451 +2437 2438 2451 +2451 2438 2452 +2438 2439 2452 +2452 2439 2453 +2439 2440 2453 +2453 2440 2454 +2440 2441 2454 +2454 2441 2455 +2441 2442 2455 +2455 2442 2456 +2442 73 2456 +2456 73 72 +71 2443 41 +41 2443 40 +2443 2444 40 +40 2444 39 +2444 2445 39 +39 2445 38 +2445 2446 38 +38 2446 37 +2446 2447 37 +37 2447 36 +2447 2448 36 +36 2448 35 +2448 2449 35 +35 2449 34 +2449 2450 34 +34 2450 33 +2450 2451 33 +33 2451 32 +2451 2452 32 +32 2452 31 +2452 2453 31 +31 2453 30 +2453 2454 30 +30 2454 29 +2454 2455 29 +29 2455 28 +2455 2456 28 +28 2456 27 +2456 72 27 +27 72 0 +12 2 56 +13 12 2457 +14 13 2458 +15 14 2460 +16 15 2463 +17 16 2467 +18 17 2472 +19 18 2478 +20 19 2485 +21 20 2493 +22 21 2502 +23 22 2512 +24 23 2523 +25 24 2535 +26 25 2548 +12 56 2457 +2457 56 55 +13 2457 2458 +2458 2457 2459 +2457 55 2459 +2459 55 54 +14 2458 2460 +2460 2458 2461 +2458 2459 2461 +2461 2459 2462 +2459 54 2462 +2462 54 53 +15 2460 2463 +2463 2460 2464 +2460 2461 2464 +2464 2461 2465 +2461 2462 2465 +2465 2462 2466 +2462 53 2466 +2466 53 52 +16 2463 2467 +2467 2463 2468 +2463 2464 2468 +2468 2464 2469 +2464 2465 2469 +2469 2465 2470 +2465 2466 2470 +2470 2466 2471 +2466 52 2471 +2471 52 51 +17 2467 2472 +2472 2467 2473 +2467 2468 2473 +2473 2468 2474 +2468 2469 2474 +2474 2469 2475 +2469 2470 2475 +2475 2470 2476 +2470 2471 2476 +2476 2471 2477 +2471 51 2477 +2477 51 50 +18 2472 2478 +2478 2472 2479 +2472 2473 2479 +2479 2473 2480 +2473 2474 2480 +2480 2474 2481 +2474 2475 2481 +2481 2475 2482 +2475 2476 2482 +2482 2476 2483 +2476 2477 2483 +2483 2477 2484 +2477 50 2484 +2484 50 49 +19 2478 2485 +2485 2478 2486 +2478 2479 2486 +2486 2479 2487 +2479 2480 2487 +2487 2480 2488 +2480 2481 2488 +2488 2481 2489 +2481 2482 2489 +2489 2482 2490 +2482 2483 2490 +2490 2483 2491 +2483 2484 2491 +2491 2484 2492 +2484 49 2492 +2492 49 48 +20 2485 2493 +2493 2485 2494 +2485 2486 2494 +2494 2486 2495 +2486 2487 2495 +2495 2487 2496 +2487 2488 2496 +2496 2488 2497 +2488 2489 2497 +2497 2489 2498 +2489 2490 2498 +2498 2490 2499 +2490 2491 2499 +2499 2491 2500 +2491 2492 2500 +2500 2492 2501 +2492 48 2501 +2501 48 47 +21 2493 2502 +2502 2493 2503 +2493 2494 2503 +2503 2494 2504 +2494 2495 2504 +2504 2495 2505 +2495 2496 2505 +2505 2496 2506 +2496 2497 2506 +2506 2497 2507 +2497 2498 2507 +2507 2498 2508 +2498 2499 2508 +2508 2499 2509 +2499 2500 2509 +2509 2500 2510 +2500 2501 2510 +2510 2501 2511 +2501 47 2511 +2511 47 46 +22 2502 2512 +2512 2502 2513 +2502 2503 2513 +2513 2503 2514 +2503 2504 2514 +2514 2504 2515 +2504 2505 2515 +2515 2505 2516 +2505 2506 2516 +2516 2506 2517 +2506 2507 2517 +2517 2507 2518 +2507 2508 2518 +2518 2508 2519 +2508 2509 2519 +2519 2509 2520 +2509 2510 2520 +2520 2510 2521 +2510 2511 2521 +2521 2511 2522 +2511 46 2522 +2522 46 45 +23 2512 2523 +2523 2512 2524 +2512 2513 2524 +2524 2513 2525 +2513 2514 2525 +2525 2514 2526 +2514 2515 2526 +2526 2515 2527 +2515 2516 2527 +2527 2516 2528 +2516 2517 2528 +2528 2517 2529 +2517 2518 2529 +2529 2518 2530 +2518 2519 2530 +2530 2519 2531 +2519 2520 2531 +2531 2520 2532 +2520 2521 2532 +2532 2521 2533 +2521 2522 2533 +2533 2522 2534 +2522 45 2534 +2534 45 44 +24 2523 2535 +2535 2523 2536 +2523 2524 2536 +2536 2524 2537 +2524 2525 2537 +2537 2525 2538 +2525 2526 2538 +2538 2526 2539 +2526 2527 2539 +2539 2527 2540 +2527 2528 2540 +2540 2528 2541 +2528 2529 2541 +2541 2529 2542 +2529 2530 2542 +2542 2530 2543 +2530 2531 2543 +2543 2531 2544 +2531 2532 2544 +2544 2532 2545 +2532 2533 2545 +2545 2533 2546 +2533 2534 2546 +2546 2534 2547 +2534 44 2547 +2547 44 43 +25 2535 2548 +2548 2535 2549 +2535 2536 2549 +2549 2536 2550 +2536 2537 2550 +2550 2537 2551 +2537 2538 2551 +2551 2538 2552 +2538 2539 2552 +2552 2539 2553 +2539 2540 2553 +2553 2540 2554 +2540 2541 2554 +2554 2541 2555 +2541 2542 2555 +2555 2542 2556 +2542 2543 2556 +2556 2543 2557 +2543 2544 2557 +2557 2544 2558 +2544 2545 2558 +2558 2545 2559 +2545 2546 2559 +2559 2546 2560 +2546 2547 2560 +2560 2547 2561 +2547 43 2561 +2561 43 42 +26 2548 27 +27 2548 28 +2548 2549 28 +28 2549 29 +2549 2550 29 +29 2550 30 +2550 2551 30 +30 2551 31 +2551 2552 31 +31 2552 32 +2552 2553 32 +32 2553 33 +2553 2554 33 +33 2554 34 +2554 2555 34 +34 2555 35 +2555 2556 35 +35 2556 36 +2556 2557 36 +36 2557 37 +2557 2558 37 +37 2558 38 +2558 2559 38 +38 2559 39 +2559 2560 39 +39 2560 40 +2560 2561 40 +40 2561 41 +2561 42 41 +41 42 1 +MATERIALS 1 +Material.001 +MATERIAL Material.001 +1 1 1 1 +0 0 0 1 +0 0 0 0 1 +0 0 0 1 +TEXTURES 0 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Sphere.msh b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Sphere.msh new file mode 100644 index 0000000000..ba029c7503 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Meshes/D3D9Sphere.msh @@ -0,0 +1,1935 @@ +MSHX1 +GROUPS 1 +LABEL Icosphere +MATERIAL 1 // Material.001 +GEOM 642 1280 +0.000000 0.000000 -1.000000 0.000000 0.000000 -1.000000 +0.096471 -0.070089 -0.992865 0.098697 -0.071718 -0.992523 +-0.036848 -0.113408 -0.992865 -0.037690 -0.116031 -0.992523 +0.723607 -0.525725 -0.447220 0.723594 -0.525712 -0.447218 +0.675300 -0.490628 -0.550685 0.674032 -0.489700 -0.552995 +0.771771 -0.420539 -0.476987 0.772759 -0.417982 -0.477584 +-0.119245 0.000000 -0.992865 -0.122013 0.000000 -0.992523 +-0.036848 0.113408 -0.992865 -0.037690 0.116031 -0.992523 +0.096471 0.070089 -0.992865 0.098697 0.071718 -0.992523 +0.794547 -0.490629 -0.357741 0.796075 -0.489700 -0.355571 +-0.276388 -0.850649 -0.447220 -0.276376 -0.850642 -0.447218 +-0.161465 -0.863951 -0.476988 -0.158727 -0.864101 -0.477584 +-0.221089 -0.907271 -0.357741 -0.219733 -0.908444 -0.355571 +-0.894426 0.000000 -0.447216 -0.894406 0.000000 -0.447188 +-0.871565 -0.113408 -0.476984 -0.870876 -0.116031 -0.477584 +-0.931188 -0.070089 -0.357738 -0.931883 -0.071718 -0.355571 +-0.276388 0.850649 -0.447220 -0.276376 0.850642 -0.447218 +-0.377183 0.793861 -0.476988 -0.379467 0.792383 -0.477584 +-0.354409 0.863953 -0.357742 -0.356182 0.864101 -0.355571 +0.723607 0.525725 -0.447220 0.723594 0.525712 -0.447218 +0.638453 0.604038 -0.476987 0.636311 0.605762 -0.477584 +0.712150 0.604039 -0.357741 0.711753 0.605762 -0.355571 +0.712150 -0.604039 -0.357741 0.711753 -0.605762 -0.355571 +-0.354409 -0.863953 -0.357742 -0.356182 -0.864101 -0.355571 +-0.931188 0.070089 -0.357738 -0.931883 0.071718 -0.355571 +-0.221089 0.907271 -0.357741 -0.219733 0.908444 -0.355571 +0.794547 0.490629 -0.357741 0.796075 0.489700 -0.355571 +0.276388 -0.850649 0.447220 0.276376 -0.850642 0.447218 +0.377183 -0.793861 0.476988 0.379467 -0.792383 0.477584 +0.257937 -0.793860 0.550685 0.257454 -0.792383 0.552995 +-0.723607 -0.525725 0.447220 -0.723594 -0.525712 0.447218 +-0.638453 -0.604038 0.476987 -0.636311 -0.605762 0.477584 +-0.675300 -0.490628 0.550685 -0.674032 -0.489700 0.552995 +-0.723607 0.525725 0.447220 -0.723594 0.525712 0.447218 +-0.771771 0.420539 0.476987 -0.772759 0.417982 0.477584 +-0.675300 0.490628 0.550685 -0.674032 0.489700 0.552995 +0.276388 0.850649 0.447220 0.276376 0.850642 0.447218 +0.161465 0.863951 0.476988 0.158727 0.864101 0.477584 +0.257937 0.793860 0.550685 0.257454 0.792383 0.552995 +0.894426 0.000000 0.447216 0.894406 0.000000 0.447188 +0.871565 0.113408 0.476984 0.870876 0.116031 0.477584 +0.834716 0.000000 0.550681 0.833155 0.000000 0.552995 +-0.257937 -0.793860 -0.550685 -0.257454 -0.792383 -0.552995 +-0.232821 -0.716563 -0.657519 -0.232368 -0.715201 -0.659108 +-0.132684 -0.799129 -0.586334 -0.129460 -0.797601 -0.589099 +-0.200688 -0.617666 -0.760403 -0.200415 -0.616810 -0.761132 +-0.097915 -0.710785 -0.696561 -0.094638 -0.709647 -0.698141 +-0.162456 -0.499995 -0.850654 -0.162450 -0.499985 -0.850642 +-0.058249 -0.599101 -0.798552 -0.055208 -0.599048 -0.798791 +-0.120413 -0.370598 -0.920955 -0.120731 -0.371593 -0.920499 +-0.016097 -0.469370 -0.882855 -0.013581 -0.470870 -0.882077 +-0.077607 -0.238853 -0.967950 -0.078219 -0.240791 -0.967406 +0.025409 -0.331228 -0.943209 0.027284 -0.334300 -0.942045 +0.063484 -0.195376 -0.978671 0.064821 -0.199561 -0.977722 +-0.029639 -0.864184 -0.502302 -0.027528 -0.864040 -0.502609 +0.009709 -0.788978 -0.614344 0.011780 -0.786981 -0.616810 +0.114564 -0.846711 -0.519572 0.115696 -0.846492 -0.519639 +0.052790 -0.688185 -0.723612 0.054506 -0.686911 -0.724662 +0.162463 -0.759458 -0.629944 0.162816 -0.757469 -0.632191 +0.262869 -0.809012 -0.525738 0.262856 -0.808985 -0.525712 +0.096780 -0.564249 -0.819913 0.097964 -0.564440 -0.819605 +0.210089 -0.646572 -0.733354 0.209784 -0.645680 -0.734184 +0.314971 -0.709905 -0.629943 0.313486 -0.708518 -0.632191 +0.405008 -0.752338 -0.519572 0.403943 -0.752831 -0.519639 +0.138199 -0.425321 -0.894429 0.138829 -0.427351 -0.893338 +0.253368 -0.513370 -0.819912 0.252510 -0.514237 -0.819605 +0.361805 -0.587779 -0.723611 0.359661 -0.587756 -0.724662 +0.455903 -0.643999 -0.614344 0.453047 -0.643605 -0.616810 +0.531941 -0.681712 -0.502302 0.530168 -0.682821 -0.502609 +0.174140 -0.282902 -0.943208 0.174383 -0.286477 -0.942045 +0.288918 -0.370264 -0.882854 0.287759 -0.372936 -0.882077 +0.399274 -0.450441 -0.798550 0.396802 -0.452162 -0.798791 +0.497011 -0.517480 -0.696560 0.493698 -0.518479 -0.698111 +0.577067 -0.568513 -0.586333 0.573565 -0.569170 -0.589099 +0.638452 -0.604038 -0.476987 0.636311 -0.605762 -0.477584 +0.203181 -0.147618 -0.967950 0.204840 -0.148808 -0.967406 +0.315251 -0.229040 -0.920955 0.316111 -0.229652 -0.920499 +0.425323 -0.309011 -0.850654 0.425306 -0.309000 -0.850642 +0.525420 -0.381735 -0.760403 0.524705 -0.381207 -0.761132 +0.609547 -0.442856 -0.657519 0.608386 -0.442030 -0.659108 +0.771771 0.420539 -0.476987 0.772759 0.417982 -0.477584 +0.675300 0.490628 -0.550685 0.674032 0.489700 -0.552995 +0.812729 0.295238 -0.502301 0.813257 0.293191 -0.502609 +0.719015 0.373135 -0.586334 0.718558 0.369610 -0.589099 +0.840673 0.152694 -0.519571 0.840815 0.151524 -0.519639 +0.753363 0.234576 -0.614343 0.752129 0.231971 -0.616810 +0.850648 -0.000000 -0.525736 0.850642 0.000000 -0.525712 +0.772493 0.080177 -0.629942 0.770714 0.079196 -0.632191 +0.840673 -0.152694 -0.519571 0.840815 -0.151524 -0.519639 +0.772493 -0.080178 -0.629942 0.770714 -0.079196 -0.632191 +0.812729 -0.295238 -0.502301 0.813257 -0.293191 -0.502609 +0.753364 -0.234576 -0.614343 0.752129 -0.231971 -0.616810 +0.719016 -0.373136 -0.586333 0.718558 -0.369610 -0.589099 +0.609547 0.442856 -0.657519 0.608386 0.442030 -0.659108 +0.645740 0.312768 -0.696560 0.645680 0.309305 -0.698111 +0.525420 0.381735 -0.760403 0.524705 0.381207 -0.761132 +0.670817 0.162457 -0.723611 0.670125 0.160405 -0.724662 +0.551780 0.240532 -0.798551 0.552660 0.237648 -0.798791 +0.425323 0.309011 -0.850654 0.425306 0.309000 -0.850642 +0.679849 -0.000000 -0.733353 0.678915 0.000000 -0.734184 +0.566540 0.082322 -0.819912 0.567095 0.081240 -0.819605 +0.441423 0.160354 -0.882855 0.443617 0.158422 -0.882077 +0.315251 0.229040 -0.920955 0.316111 0.229652 -0.920499 +0.670818 -0.162458 -0.723610 0.670125 -0.160405 -0.724662 +0.566541 -0.082323 -0.819911 0.567095 -0.081240 -0.819605 +0.447211 -0.000001 -0.894428 0.449324 0.000000 -0.893338 +0.322869 0.078191 -0.943208 0.326365 0.077303 -0.942045 +0.203181 0.147618 -0.967950 0.204840 0.148808 -0.967406 +0.645741 -0.312769 -0.696559 0.645680 -0.309305 -0.698111 +0.551781 -0.240533 -0.798550 0.552660 -0.237648 -0.798791 +0.441424 -0.160356 -0.882854 0.443617 -0.158422 -0.882077 +0.322870 -0.078193 -0.943208 0.326365 -0.077303 -0.942045 +0.205432 -0.000001 -0.978671 0.209815 0.000000 -0.977722 +-0.834716 0.000000 -0.550681 -0.833155 0.000000 -0.552995 +-0.753442 0.000000 -0.657515 -0.752037 0.000000 -0.659108 +-0.801022 -0.120750 -0.586330 -0.798578 -0.123325 -0.589068 +-0.649456 0.000000 -0.760399 -0.648549 0.000000 -0.761132 +-0.706258 -0.126518 -0.696558 -0.704184 -0.129276 -0.698111 +-0.525730 0.000000 -0.850652 -0.525712 0.000000 -0.850642 +-0.587783 -0.129731 -0.798549 -0.586779 -0.132572 -0.798791 +-0.389673 0.000000 -0.920953 -0.390728 0.000000 -0.920499 +-0.451375 -0.129731 -0.882853 -0.452010 -0.132572 -0.882077 +-0.251147 0.000000 -0.967949 -0.253182 0.000000 -0.967406 +-0.307168 -0.126519 -0.943208 -0.309488 -0.129276 -0.942045 +-0.166198 -0.120750 -0.978671 -0.169744 -0.123325 -0.977722 +-0.831051 -0.238853 -0.502299 -0.830256 -0.240791 -0.502609 +-0.747367 -0.253037 -0.614341 -0.744835 -0.254402 -0.616810 +-0.769872 -0.370600 -0.519570 -0.769311 -0.371593 -0.519639 +-0.638195 -0.262864 -0.723609 -0.636433 -0.264107 -0.724662 +-0.672088 -0.389193 -0.629941 -0.670095 -0.388928 -0.632191 +-0.688189 -0.499997 -0.525736 -0.688162 -0.499985 -0.525712 +-0.506730 -0.266403 -0.819911 -0.506546 -0.267586 -0.819605 +-0.550009 -0.399605 -0.733352 -0.549242 -0.399060 -0.734184 +-0.577832 -0.518925 -0.629942 -0.576952 -0.517106 -0.632191 +-0.590366 -0.617668 -0.519572 -0.591144 -0.616810 -0.519639 +-0.361801 -0.262864 -0.894428 -0.363506 -0.264107 -0.893338 +-0.409952 -0.399605 -0.819912 -0.411023 -0.399060 -0.819605 +-0.447211 -0.525729 -0.723611 -0.447859 -0.523667 -0.724662 +-0.471601 -0.632594 -0.614343 -0.472121 -0.629749 -0.616810 +-0.483971 -0.716565 -0.502302 -0.485580 -0.715201 -0.502609 +-0.215246 -0.253038 -0.943208 -0.218574 -0.254402 -0.942045 +-0.262863 -0.389194 -0.882854 -0.265755 -0.388928 -0.882077 +-0.305015 -0.518925 -0.798550 -0.307413 -0.517106 -0.798791 +-0.338569 -0.632594 -0.696560 -0.340526 -0.629749 -0.698111 +-0.362367 -0.724502 -0.586333 -0.364055 -0.721366 -0.589099 +-0.377183 -0.793861 -0.476988 -0.379467 -0.792383 -0.477584 +-0.257937 0.793860 -0.550685 -0.257454 0.792383 -0.552995 +-0.232821 0.716563 -0.657519 -0.232368 0.715201 -0.659108 +-0.362367 0.724502 -0.586334 -0.364055 0.721366 -0.589099 +-0.200688 0.617666 -0.760403 -0.200415 0.616810 -0.761132 +-0.338569 0.632593 -0.696561 -0.340526 0.629749 -0.698111 +-0.162456 0.499995 -0.850654 -0.162450 0.499985 -0.850642 +-0.305014 0.518923 -0.798552 -0.307413 0.517106 -0.798791 +-0.120413 0.370598 -0.920955 -0.120731 0.371593 -0.920499 +-0.262862 0.389192 -0.882855 -0.265755 0.388928 -0.882077 +-0.077607 0.238853 -0.967950 -0.078219 0.240791 -0.967406 +-0.215245 0.253036 -0.943209 -0.218574 0.254402 -0.942045 +-0.166198 0.120749 -0.978671 -0.169744 0.123325 -0.977722 +-0.483971 0.716565 -0.502302 -0.485580 0.715201 -0.502609 +-0.471601 0.632593 -0.614344 -0.472121 0.629749 -0.616810 +-0.590366 0.617668 -0.519572 -0.591144 0.616810 -0.519639 +-0.447211 0.525727 -0.723611 -0.447859 0.523667 -0.724662 +-0.577832 0.518924 -0.629943 -0.576952 0.517106 -0.632191 +-0.688189 0.499997 -0.525736 -0.688162 0.499985 -0.525712 +-0.409952 0.399603 -0.819913 -0.411023 0.399060 -0.819605 +-0.550010 0.399603 -0.733353 -0.549242 0.399060 -0.734184 +-0.672088 0.389192 -0.629942 -0.670095 0.388928 -0.632191 +-0.769872 0.370600 -0.519570 -0.769311 0.371593 -0.519639 +-0.361801 0.262863 -0.894429 -0.363506 0.264107 -0.893338 +-0.506730 0.266402 -0.819912 -0.506546 0.267586 -0.819605 +-0.638195 0.262863 -0.723609 -0.636433 0.264107 -0.724662 +-0.747367 0.253036 -0.614341 -0.744835 0.254402 -0.616810 +-0.831051 0.238853 -0.502299 -0.830256 0.240791 -0.502609 +-0.307168 0.126518 -0.943208 -0.309488 0.129276 -0.942045 +-0.451376 0.129730 -0.882853 -0.452010 0.132572 -0.882077 +-0.587784 0.129730 -0.798549 -0.586779 0.132572 -0.798791 +-0.706258 0.126518 -0.696557 -0.704184 0.129276 -0.698111 +-0.801022 0.120749 -0.586330 -0.798578 0.123325 -0.589068 +-0.871565 0.113408 -0.476984 -0.870876 0.116031 -0.477584 +0.577066 0.568513 -0.586334 0.573565 0.569170 -0.589099 +0.497009 0.517479 -0.696561 0.493698 0.518479 -0.698111 +0.399272 0.450441 -0.798552 0.396802 0.452162 -0.798791 +0.288916 0.370263 -0.882855 0.287759 0.372936 -0.882077 +0.174138 0.282902 -0.943209 0.174383 0.286477 -0.942045 +0.063482 0.195377 -0.978671 0.064821 0.199561 -0.977722 +0.531941 0.681712 -0.502302 0.530168 0.682821 -0.502609 +0.455902 0.643999 -0.614344 0.453047 0.643605 -0.616810 +0.405008 0.752338 -0.519572 0.403943 0.752831 -0.519639 +0.361804 0.587779 -0.723612 0.359661 0.587756 -0.724662 +0.314971 0.709905 -0.629943 0.313486 0.708518 -0.632191 +0.262869 0.809012 -0.525738 0.262856 0.808985 -0.525712 +0.253366 0.513370 -0.819913 0.252510 0.514237 -0.819605 +0.210087 0.646572 -0.733354 0.209784 0.645680 -0.734184 +0.162463 0.759459 -0.629943 0.162816 0.757469 -0.632191 +0.114564 0.846711 -0.519573 0.115696 0.846492 -0.519639 +0.138197 0.425321 -0.894429 0.138829 0.427351 -0.893338 +0.096779 0.564250 -0.819912 0.097964 0.564440 -0.819605 +0.052789 0.688186 -0.723611 0.054506 0.686911 -0.724662 +0.009708 0.788979 -0.614344 0.011780 0.786981 -0.616810 +-0.029639 0.864184 -0.502302 -0.027528 0.864040 -0.502609 +0.025407 0.331229 -0.943208 0.027284 0.334300 -0.942045 +-0.016099 0.469371 -0.882854 -0.013581 0.470870 -0.882077 +-0.058250 0.599103 -0.798550 -0.055208 0.599048 -0.798791 +-0.097915 0.710786 -0.696560 -0.094638 0.709647 -0.698111 +-0.132684 0.799129 -0.586334 -0.129460 0.797601 -0.589099 +-0.161465 0.863951 -0.476988 -0.158727 0.864101 -0.477584 +0.931188 -0.070089 0.357738 0.931883 -0.071718 0.355571 +0.931188 0.070089 0.357738 0.931883 0.071718 0.355571 +0.956626 -0.147618 0.251149 0.956877 -0.148808 0.249397 +0.967222 0.000000 0.253931 0.968352 0.000000 0.249550 +0.964711 -0.229041 0.129893 0.964690 -0.229652 0.128910 +0.988023 -0.078192 0.133031 0.988556 -0.077303 0.129368 +0.951058 -0.309013 -0.000000 0.951048 -0.309000 0.000000 +0.987059 -0.160355 -0.000000 0.987365 -0.158422 -0.002289 +0.915098 -0.381737 -0.129893 0.915433 -0.381207 -0.128910 +0.961008 -0.240533 -0.136410 0.961608 -0.237648 -0.137089 +0.860698 -0.442858 -0.251151 0.861599 -0.442030 -0.249397 +0.911804 -0.312769 -0.266064 0.913175 -0.309305 -0.265297 +0.845982 -0.373136 -0.380899 0.848231 -0.369610 -0.379254 +0.956626 0.147618 0.251149 0.956877 0.148808 0.249397 +0.988023 0.078192 0.133031 0.988556 0.077303 0.129368 +0.964711 0.229041 0.129893 0.964690 0.229652 0.128910 +1.000000 -0.000000 0.000000 0.999969 0.000000 -0.002380 +0.987059 0.160355 0.000000 0.987365 0.158422 -0.002289 +0.951058 0.309013 0.000000 0.951048 0.309000 0.000000 +0.986715 -0.082322 -0.140059 0.986694 -0.081240 -0.140690 +0.986715 0.082322 -0.140059 0.986694 0.081240 -0.140690 +0.961008 0.240533 -0.136410 0.961608 0.237648 -0.137089 +0.915098 0.381737 -0.129893 0.915433 0.381207 -0.128910 +0.947213 -0.162458 -0.276396 0.947844 -0.160405 -0.275307 +0.959966 -0.000000 -0.280117 0.960295 0.000000 -0.278909 +0.947213 0.162458 -0.276396 0.947844 0.160405 -0.275307 +0.911804 0.312769 -0.266064 0.913175 0.309305 -0.265297 +0.860698 0.442858 -0.251151 0.861599 0.442030 -0.249397 +0.886396 -0.234576 -0.399095 0.888058 -0.231971 -0.396863 +0.908902 -0.080178 -0.409229 0.910123 -0.079196 -0.406629 +0.908902 0.080178 -0.409229 0.910123 0.079196 -0.406629 +0.886396 0.234576 -0.399095 0.888058 0.231971 -0.396863 +0.845982 0.373136 -0.380899 0.848231 0.369610 -0.379254 +0.221089 -0.907271 0.357741 0.219733 -0.908444 0.355571 +0.354409 -0.863953 0.357742 0.356182 -0.864101 0.355571 +0.155215 -0.955422 0.251152 0.154118 -0.956023 0.249397 +0.298886 -0.919883 0.253934 0.299234 -0.920957 0.249550 +0.080276 -0.988273 0.129894 0.079653 -0.988433 0.128910 +0.230948 -0.963828 0.133032 0.231910 -0.964080 0.129368 +-0.000000 -1.000000 -0.000000 0.000000 -1.000000 0.000000 +0.152509 -0.988302 -0.000000 0.154424 -0.987976 -0.002289 +-0.080276 -0.988273 -0.129894 -0.079653 -0.988433 -0.128910 +0.068205 -0.988302 -0.136410 0.071108 -0.987976 -0.137089 +-0.155215 -0.955422 -0.251152 -0.154118 -0.956023 -0.249397 +-0.015699 -0.963827 -0.266065 -0.011963 -0.964080 -0.265297 +-0.093451 -0.919882 -0.380900 -0.089389 -0.920957 -0.379254 +0.436007 -0.864188 0.251152 0.437239 -0.864040 0.249397 +0.379681 -0.915503 0.133033 0.379009 -0.916288 0.129368 +0.515946 -0.846716 0.129894 0.516526 -0.846492 0.128910 +0.309017 -0.951056 0.000000 0.309000 -0.951048 -0.002380 +0.457527 -0.889196 0.000000 0.455794 -0.890072 -0.002289 +0.587786 -0.809017 0.000000 0.587756 -0.809015 0.000000 +0.226619 -0.963861 -0.140060 0.227638 -0.963500 -0.140690 +0.383207 -0.912982 -0.140060 0.382153 -0.913297 -0.140690 +0.525732 -0.839641 -0.136411 0.523179 -0.841121 -0.137089 +0.645839 -0.752343 -0.129894 0.645436 -0.752831 -0.128910 +0.138199 -0.951055 -0.276397 0.140324 -0.951048 -0.275307 +0.296648 -0.912980 -0.280119 0.296731 -0.913297 -0.278909 +0.447216 -0.850648 -0.276398 0.445479 -0.851894 -0.275307 +0.579229 -0.770521 -0.266065 0.576373 -0.772881 -0.265297 +0.687159 -0.681715 -0.251152 0.686636 -0.682852 -0.249397 +0.050817 -0.915500 -0.399097 0.053774 -0.916288 -0.396863 +0.204615 -0.889192 -0.409230 0.205908 -0.890072 -0.406629 +0.357124 -0.839639 -0.409230 0.356578 -0.841090 -0.406629 +0.497012 -0.770520 -0.399097 0.495041 -0.772881 -0.396863 +0.616302 -0.689266 -0.380900 0.613636 -0.692496 -0.379254 +-0.794547 -0.490629 0.357741 -0.796075 -0.489700 0.355571 +-0.712150 -0.604039 0.357741 -0.711753 -0.605762 0.355571 +-0.860698 -0.442858 0.251151 -0.861599 -0.442030 0.249397 +-0.782501 -0.568515 0.253934 -0.783410 -0.569170 0.249550 +-0.915098 -0.381737 0.129893 -0.915433 -0.381207 0.128910 +-0.845290 -0.517482 0.133032 -0.845210 -0.518479 0.129368 +-0.951058 -0.309013 -0.000000 -0.951048 -0.309000 0.000000 +-0.892805 -0.450444 -0.000000 -0.891903 -0.452162 -0.002289 +-0.964711 -0.229041 -0.129893 -0.964690 -0.229652 -0.128910 +-0.918856 -0.370265 -0.136410 -0.917661 -0.372936 -0.137089 +-0.956626 -0.147618 -0.251149 -0.956877 -0.148808 -0.249397 +-0.921507 -0.282904 -0.266063 -0.920591 -0.286508 -0.265297 +-0.903739 -0.195378 -0.380897 -0.903500 -0.199561 -0.379254 +-0.687159 -0.681715 0.251152 -0.686636 -0.682852 0.249397 +-0.753368 -0.644002 0.133032 -0.754295 -0.643605 0.129368 +-0.645839 -0.752342 0.129894 -0.645436 -0.752831 0.128910 +-0.809018 -0.587783 0.000000 -0.809015 -0.587756 -0.002380 +-0.704293 -0.709910 0.000000 -0.705649 -0.708518 -0.002289 +-0.587786 -0.809017 0.000000 -0.587756 -0.809015 0.000000 +-0.846659 -0.513374 -0.140059 -0.846004 -0.514237 -0.140690 +-0.749881 -0.646577 -0.140059 -0.750511 -0.645680 -0.140690 +-0.636087 -0.759464 -0.136411 -0.638264 -0.757469 -0.137089 +-0.515946 -0.846716 -0.129894 -0.516526 -0.846492 -0.128910 +-0.861803 -0.425324 -0.276396 -0.861110 -0.427351 -0.275307 +-0.776629 -0.564253 -0.280118 -0.776910 -0.564440 -0.278909 +-0.670819 -0.688191 -0.276397 -0.672536 -0.686911 -0.275307 +-0.553819 -0.788983 -0.266065 -0.556963 -0.787011 -0.265297 +-0.436007 -0.864188 -0.251152 -0.437239 -0.864040 -0.249397 +-0.854991 -0.331231 -0.399095 -0.854823 -0.334300 -0.396863 +-0.782445 -0.469374 -0.409229 -0.782861 -0.470870 -0.406629 +-0.688189 -0.599106 -0.409230 -0.689749 -0.599048 -0.406629 +-0.579224 -0.710789 -0.399096 -0.582080 -0.709677 -0.396863 +-0.465084 -0.799132 -0.380900 -0.468978 -0.797601 -0.379254 +-0.712150 0.604039 0.357741 -0.711753 0.605762 0.355571 +-0.794547 0.490629 0.357741 -0.796075 0.489700 0.355571 +-0.687159 0.681715 0.251152 -0.686636 0.682852 0.249397 +-0.782501 0.568515 0.253934 -0.783410 0.569170 0.249550 +-0.645839 0.752343 0.129894 -0.645436 0.752831 0.128910 +-0.753368 0.644002 0.133032 -0.754295 0.643605 0.129368 +-0.587786 0.809017 -0.000000 -0.587756 0.809015 0.000000 +-0.704293 0.709910 -0.000000 -0.705649 0.708518 -0.002289 +-0.515946 0.846716 -0.129894 -0.516526 0.846492 -0.128910 +-0.636087 0.759464 -0.136411 -0.638264 0.757469 -0.137089 +-0.436007 0.864188 -0.251152 -0.437239 0.864040 -0.249397 +-0.553819 0.788983 -0.266065 -0.556963 0.787011 -0.265297 +-0.465084 0.799132 -0.380900 -0.468978 0.797601 -0.379254 +-0.860698 0.442858 0.251151 -0.861599 0.442030 0.249397 +-0.845290 0.517482 0.133032 -0.845210 0.518479 0.129368 +-0.915098 0.381737 0.129893 -0.915433 0.381207 0.128910 +-0.809018 0.587783 -0.000000 -0.809015 0.587756 -0.002380 +-0.892805 0.450444 0.000000 -0.891903 0.452162 -0.002289 +-0.951058 0.309013 0.000000 -0.951048 0.309000 0.000000 +-0.749881 0.646577 -0.140059 -0.750511 0.645680 -0.140690 +-0.846659 0.513374 -0.140059 -0.846004 0.514237 -0.140690 +-0.918856 0.370265 -0.136410 -0.917661 0.372936 -0.137089 +-0.964711 0.229041 -0.129893 -0.964690 0.229652 -0.128910 +-0.670819 0.688191 -0.276397 -0.672536 0.686911 -0.275307 +-0.776629 0.564253 -0.280118 -0.776910 0.564440 -0.278909 +-0.861803 0.425324 -0.276396 -0.861110 0.427351 -0.275307 +-0.921507 0.282904 -0.266063 -0.920591 0.286508 -0.265297 +-0.956626 0.147618 -0.251149 -0.956877 0.148808 -0.249397 +-0.579224 0.710789 -0.399096 -0.582080 0.709677 -0.396863 +-0.688189 0.599106 -0.409230 -0.689749 0.599048 -0.406629 +-0.782445 0.469374 -0.409229 -0.782861 0.470870 -0.406629 +-0.854991 0.331231 -0.399094 -0.854823 0.334300 -0.396863 +-0.903739 0.195378 -0.380897 -0.903500 0.199561 -0.379254 +0.354409 0.863953 0.357742 0.356182 0.864101 0.355571 +0.221089 0.907271 0.357741 0.219733 0.908444 0.355571 +0.436007 0.864188 0.251152 0.437239 0.864040 0.249397 +0.298886 0.919883 0.253934 0.299234 0.920957 0.249550 +0.515946 0.846716 0.129894 0.516526 0.846492 0.128910 +0.379681 0.915502 0.133033 0.379009 0.916288 0.129368 +0.587786 0.809017 -0.000000 0.587756 0.809015 0.000000 +0.457527 0.889196 -0.000000 0.455794 0.890072 -0.002289 +0.645839 0.752342 -0.129894 0.645436 0.752831 -0.128910 +0.525732 0.839641 -0.136411 0.523179 0.841121 -0.137089 +0.687159 0.681715 -0.251152 0.686636 0.682852 -0.249397 +0.579229 0.770521 -0.266065 0.576373 0.772881 -0.265297 +0.616302 0.689265 -0.380900 0.613636 0.692496 -0.379254 +0.155215 0.955422 0.251152 0.154118 0.956023 0.249397 +0.230948 0.963828 0.133033 0.231910 0.964080 0.129368 +0.080276 0.988273 0.129894 0.079653 0.988433 0.128910 +0.309017 0.951056 -0.000000 0.309000 0.951048 -0.002380 +0.152509 0.988302 0.000000 0.154424 0.987976 -0.002289 +0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 +0.383208 0.912982 -0.140060 0.382153 0.913297 -0.140690 +0.226619 0.963861 -0.140060 0.227638 0.963500 -0.140690 +0.068206 0.988302 -0.136410 0.071108 0.987976 -0.137089 +-0.080276 0.988273 -0.129894 -0.079653 0.988433 -0.128910 +0.447216 0.850648 -0.276398 0.445479 0.851894 -0.275307 +0.296648 0.912980 -0.280119 0.296731 0.913297 -0.278909 +0.138199 0.951055 -0.276398 0.140324 0.951048 -0.275307 +-0.015699 0.963827 -0.266065 -0.011963 0.964080 -0.265297 +-0.155215 0.955422 -0.251152 -0.154118 0.956023 -0.249397 +0.497012 0.770520 -0.399097 0.495041 0.772881 -0.396863 +0.357124 0.839639 -0.409231 0.356578 0.841090 -0.406629 +0.204615 0.889192 -0.409231 0.205908 0.890072 -0.406629 +0.050817 0.915500 -0.399097 0.053774 0.916288 -0.396863 +-0.093451 0.919881 -0.380900 -0.089389 0.920957 -0.379254 +0.465085 -0.799132 0.380900 0.468978 -0.797601 0.379254 +0.553820 -0.788983 0.266064 0.556963 -0.787011 0.265297 +0.636088 -0.759463 0.136410 0.638264 -0.757469 0.137089 +0.704293 -0.709909 -0.000001 0.705649 -0.708518 0.002289 +0.753368 -0.644002 -0.133034 0.754295 -0.643605 -0.129368 +0.782501 -0.568515 -0.253934 0.783410 -0.569170 -0.249550 +0.483971 -0.716565 0.502302 0.485580 -0.715201 0.502609 +0.579226 -0.710788 0.399096 0.582080 -0.709677 0.396863 +0.590366 -0.617668 0.519572 0.591144 -0.616810 0.519639 +0.670820 -0.688190 0.276396 0.672536 -0.686911 0.275307 +0.688190 -0.599104 0.409229 0.689749 -0.599048 0.406629 +0.688189 -0.499997 0.525736 0.688162 -0.499985 0.525712 +0.749882 -0.646576 0.140058 0.750511 -0.645680 0.140690 +0.776630 -0.564252 0.280117 0.776910 -0.564440 0.278909 +0.782446 -0.469372 0.409228 0.782861 -0.470870 0.406629 +0.769872 -0.370600 0.519570 0.769311 -0.371593 0.519639 +0.809018 -0.587783 -0.000002 0.809015 -0.587756 0.002380 +0.846659 -0.513373 0.140057 0.846004 -0.514237 0.140690 +0.861804 -0.425323 0.276394 0.861141 -0.427351 0.275307 +0.854992 -0.331230 0.399093 0.854823 -0.334300 0.396863 +0.831051 -0.238853 0.502299 0.830256 -0.240791 0.502609 +0.845289 -0.517482 -0.133034 0.845210 -0.518479 -0.129368 +0.892805 -0.450444 -0.000002 0.891903 -0.452162 0.002289 +0.918856 -0.370266 0.136407 0.917661 -0.372936 0.137089 +0.921508 -0.282904 0.266061 0.920591 -0.286508 0.265297 +0.903740 -0.195377 0.380896 0.903500 -0.199561 0.379254 +0.871565 -0.113408 0.476984 0.870876 -0.116031 0.477584 +-0.616302 -0.689266 0.380900 -0.613636 -0.692496 0.379254 +-0.579229 -0.770521 0.266064 -0.576373 -0.772881 0.265297 +-0.525732 -0.839641 0.136410 -0.523179 -0.841121 0.137089 +-0.457527 -0.889196 -0.000001 -0.455794 -0.890072 0.002289 +-0.379681 -0.915502 -0.133033 -0.379009 -0.916288 -0.129368 +-0.298885 -0.919883 -0.253934 -0.299234 -0.920957 -0.249550 +-0.531941 -0.681712 0.502302 -0.530168 -0.682821 0.502609 +-0.497012 -0.770520 0.399096 -0.495041 -0.772881 0.396863 +-0.405008 -0.752338 0.519572 -0.403943 -0.752831 0.519639 +-0.447216 -0.850649 0.276397 -0.445479 -0.851894 0.275307 +-0.357124 -0.839639 0.409230 -0.356578 -0.841090 0.406629 +-0.262869 -0.809012 0.525738 -0.262856 -0.808985 0.525712 +-0.383208 -0.912982 0.140059 -0.382153 -0.913297 0.140690 +-0.296649 -0.912981 0.280118 -0.296731 -0.913297 0.278909 +-0.204616 -0.889193 0.409230 -0.205908 -0.890072 0.406629 +-0.114564 -0.846711 0.519573 -0.115696 -0.846492 0.519639 +-0.309017 -0.951056 -0.000001 -0.309000 -0.951048 0.002380 +-0.226619 -0.963861 0.140059 -0.227638 -0.963500 0.140690 +-0.138199 -0.951055 0.276397 -0.140324 -0.951048 0.275307 +-0.050817 -0.915500 0.399096 -0.053774 -0.916288 0.396863 +0.029639 -0.864184 0.502302 0.027528 -0.864040 0.502609 +-0.230948 -0.963828 -0.133033 -0.231910 -0.964080 -0.129368 +-0.152509 -0.988302 -0.000000 -0.154424 -0.987976 0.002289 +-0.068206 -0.988302 0.136410 -0.071108 -0.987976 0.137089 +0.015699 -0.963827 0.266064 0.011963 -0.964080 0.265297 +0.093451 -0.919882 0.380900 0.089389 -0.920957 0.379254 +0.161465 -0.863951 0.476988 0.158727 -0.864101 0.477584 +-0.845982 0.373136 0.380899 -0.848231 0.369610 0.379254 +-0.911804 0.312769 0.266063 -0.913175 0.309305 0.265297 +-0.961008 0.240533 0.136410 -0.961608 0.237648 0.137089 +-0.987059 0.160355 0.000000 -0.987365 0.158422 0.002289 +-0.988023 0.078192 -0.133031 -0.988556 0.077303 -0.129368 +-0.967222 -0.000000 -0.253931 -0.968352 0.000000 -0.249550 +-0.812729 0.295238 0.502301 -0.813257 0.293191 0.502609 +-0.886396 0.234577 0.399095 -0.888058 0.231971 0.396863 +-0.840673 0.152694 0.519571 -0.840815 0.151524 0.519639 +-0.947213 0.162458 0.276396 -0.947844 0.160405 0.275307 +-0.908902 0.080178 0.409229 -0.910123 0.079196 0.406629 +-0.850648 0.000000 0.525736 -0.850642 0.000000 0.525712 +-0.986715 0.082322 0.140059 -0.986694 0.081240 0.140690 +-0.959966 -0.000000 0.280117 -0.960295 0.000000 0.278909 +-0.908902 -0.080178 0.409229 -0.910123 -0.079196 0.406629 +-0.840673 -0.152694 0.519571 -0.840815 -0.151524 0.519639 +-1.000000 -0.000000 0.000001 -0.999969 0.000000 0.002380 +-0.986715 -0.082323 0.140059 -0.986694 -0.081240 0.140690 +-0.947213 -0.162458 0.276397 -0.947844 -0.160405 0.275307 +-0.886395 -0.234577 0.399095 -0.888058 -0.231971 0.396863 +-0.812729 -0.295238 0.502301 -0.813257 -0.293191 0.502609 +-0.988023 -0.078193 -0.133030 -0.988556 -0.077303 -0.129368 +-0.987059 -0.160356 0.000001 -0.987365 -0.158422 0.002289 +-0.961008 -0.240534 0.136411 -0.961608 -0.237648 0.137089 +-0.911803 -0.312769 0.266065 -0.913175 -0.309305 0.265297 +-0.845982 -0.373136 0.380900 -0.848231 -0.369610 0.379254 +-0.771771 -0.420539 0.476987 -0.772759 -0.417982 0.477584 +0.093451 0.919882 0.380900 0.089389 0.920957 0.379254 +0.015700 0.963827 0.266064 0.011963 0.964080 0.265297 +-0.068205 0.988302 0.136410 -0.071108 0.987976 0.137089 +-0.152509 0.988302 -0.000000 -0.154424 0.987976 0.002289 +-0.230948 0.963829 -0.133033 -0.231910 0.964080 -0.129368 +-0.298885 0.919883 -0.253934 -0.299234 0.920957 -0.249550 +0.029639 0.864184 0.502302 0.027528 0.864040 0.502609 +-0.050816 0.915500 0.399096 -0.053774 0.916288 0.396863 +-0.114564 0.846711 0.519572 -0.115696 0.846492 0.519639 +-0.138198 0.951055 0.276397 -0.140324 0.951048 0.275307 +-0.204615 0.889193 0.409230 -0.205908 0.890072 0.406629 +-0.262869 0.809012 0.525738 -0.262856 0.808985 0.525712 +-0.226618 0.963861 0.140059 -0.227638 0.963500 0.140690 +-0.296648 0.912981 0.280118 -0.296731 0.913297 0.278909 +-0.357123 0.839639 0.409230 -0.356578 0.841090 0.406629 +-0.405008 0.752338 0.519572 -0.403943 0.752831 0.519639 +-0.309016 0.951057 -0.000000 -0.309000 0.951048 0.002380 +-0.383207 0.912982 0.140059 -0.382153 0.913297 0.140690 +-0.447215 0.850649 0.276397 -0.445479 0.851894 0.275307 +-0.497012 0.770520 0.399096 -0.495041 0.772881 0.396863 +-0.531941 0.681712 0.502302 -0.530168 0.682821 0.502609 +-0.379680 0.915503 -0.133033 -0.379009 0.916288 -0.129368 +-0.457527 0.889196 -0.000000 -0.455794 0.890072 0.002289 +-0.525732 0.839642 0.136410 -0.523179 0.841121 0.137089 +-0.579229 0.770522 0.266065 -0.576373 0.772881 0.265297 +-0.616302 0.689266 0.380900 -0.613636 0.692496 0.379254 +-0.638452 0.604038 0.476987 -0.636311 0.605762 0.477584 +0.903740 0.195376 0.380897 0.903500 0.199561 0.379254 +0.921508 0.282903 0.266063 0.920591 0.286477 0.265297 +0.918856 0.370264 0.136410 0.917661 0.372936 0.137089 +0.892805 0.450443 -0.000000 0.891903 0.452162 0.002289 +0.845290 0.517481 -0.133032 0.845210 0.518479 -0.129368 +0.782501 0.568515 -0.253933 0.783410 0.569170 -0.249550 +0.831051 0.238853 0.502299 0.830256 0.240791 0.502609 +0.854992 0.331229 0.399094 0.854823 0.334300 0.396863 +0.769872 0.370600 0.519570 0.769311 0.371593 0.519639 +0.861804 0.425322 0.276396 0.861141 0.427351 0.275307 +0.782446 0.469371 0.409229 0.782861 0.470870 0.406629 +0.688189 0.499997 0.525736 0.688162 0.499985 0.525712 +0.846660 0.513372 0.140059 0.846004 0.514237 0.140690 +0.776630 0.564251 0.280118 0.776910 0.564440 0.278909 +0.688190 0.599104 0.409230 0.689749 0.599048 0.406629 +0.590366 0.617668 0.519572 0.591144 0.616810 0.519639 +0.809019 0.587782 0.000000 0.809015 0.587756 0.002380 +0.749882 0.646576 0.140059 0.750511 0.645680 0.140690 +0.670821 0.688189 0.276397 0.672536 0.686911 0.275307 +0.579226 0.710788 0.399096 0.582080 0.709677 0.396863 +0.483971 0.716565 0.502302 0.485580 0.715201 0.502609 +0.753368 0.644002 -0.133032 0.754295 0.643605 -0.129368 +0.704293 0.709909 0.000000 0.705649 0.708518 0.002289 +0.636088 0.759463 0.136411 0.638264 0.757469 0.137089 +0.553820 0.788982 0.266065 0.556963 0.787011 0.265297 +0.465085 0.799132 0.380900 0.468978 0.797601 0.379254 +0.377183 0.793861 0.476988 0.379467 0.792383 0.477584 +0.036848 -0.113408 0.992865 0.037690 -0.116031 0.992523 +0.119245 0.000000 0.992865 0.122013 0.000000 0.992523 +0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 +0.077607 -0.238853 0.967950 0.078219 -0.240791 0.967406 +0.166198 -0.120749 0.978672 0.169744 -0.123325 0.977722 +0.120413 -0.370598 0.920955 0.120731 -0.371593 0.920499 +0.215245 -0.253036 0.943209 0.218574 -0.254402 0.942045 +0.162456 -0.499995 0.850654 0.162450 -0.499985 0.850642 +0.262862 -0.389192 0.882855 0.265755 -0.388928 0.882077 +0.200688 -0.617666 0.760403 0.200415 -0.616810 0.761132 +0.305014 -0.518924 0.798552 0.307413 -0.517106 0.798791 +0.232822 -0.716563 0.657519 0.232368 -0.715201 0.659108 +0.338569 -0.632593 0.696561 0.340526 -0.629749 0.698111 +0.362366 -0.724502 0.586334 0.364055 -0.721366 0.589099 +0.251147 0.000000 0.967949 0.253182 0.000000 0.967406 +0.307167 -0.126518 0.943208 0.309488 -0.129276 0.942045 +0.389673 0.000000 0.920953 0.390728 0.000000 0.920499 +0.361800 -0.262863 0.894429 0.363506 -0.264107 0.893338 +0.451375 -0.129731 0.882854 0.452010 -0.132572 0.882077 +0.525730 0.000000 0.850652 0.525712 0.000000 0.850642 +0.409951 -0.399604 0.819913 0.411023 -0.399060 0.819605 +0.506729 -0.266403 0.819912 0.506546 -0.267586 0.819605 +0.587783 -0.129731 0.798549 0.586779 -0.132572 0.798791 +0.649456 0.000000 0.760399 0.648549 0.000000 0.761132 +0.447209 -0.525728 0.723612 0.447859 -0.523667 0.724662 +0.550008 -0.399605 0.733353 0.549242 -0.399060 0.734184 +0.638194 -0.262864 0.723610 0.636433 -0.264107 0.724662 +0.706258 -0.126519 0.696558 0.704184 -0.129276 0.698111 +0.753442 0.000000 0.657515 0.752037 0.000000 0.659108 +0.471599 -0.632594 0.614344 0.472121 -0.629749 0.616810 +0.577830 -0.518926 0.629943 0.576952 -0.517106 0.632191 +0.672087 -0.389194 0.629942 0.670095 -0.388928 0.632191 +0.747366 -0.253038 0.614342 0.744835 -0.254402 0.616810 +0.801022 -0.120750 0.586331 0.798578 -0.123325 0.589068 +-0.096471 -0.070089 0.992865 -0.098697 -0.071718 0.992523 +-0.203181 -0.147618 0.967950 -0.204840 -0.148808 0.967406 +-0.063483 -0.195376 0.978672 -0.064821 -0.199561 0.977722 +-0.315251 -0.229040 0.920955 -0.316111 -0.229652 0.920499 +-0.174138 -0.282901 0.943209 -0.174383 -0.286477 0.942045 +-0.425323 -0.309011 0.850654 -0.425306 -0.309000 0.850642 +-0.288916 -0.370262 0.882855 -0.287759 -0.372936 0.882077 +-0.525420 -0.381735 0.760403 -0.524705 -0.381207 0.761132 +-0.399272 -0.450440 0.798552 -0.396802 -0.452162 0.798791 +-0.609547 -0.442856 0.657519 -0.608386 -0.442030 0.659108 +-0.497009 -0.517479 0.696561 -0.493698 -0.518479 0.698111 +-0.577066 -0.568513 0.586334 -0.573565 -0.569170 0.589099 +-0.025408 -0.331227 0.943209 -0.027284 -0.334300 0.942045 +-0.138197 -0.425319 0.894430 -0.138829 -0.427351 0.893338 +0.016098 -0.469369 0.882855 0.013581 -0.470870 0.882077 +-0.253366 -0.513369 0.819914 -0.252510 -0.514237 0.819605 +-0.096779 -0.564248 0.819914 -0.097964 -0.564440 0.819605 +0.058250 -0.599101 0.798552 0.055208 -0.599048 0.798791 +-0.361804 -0.587778 0.723612 -0.359661 -0.587756 0.724662 +-0.210088 -0.646571 0.733355 -0.209784 -0.645680 0.734184 +-0.052790 -0.688185 0.723612 -0.054506 -0.686911 0.724662 +0.097915 -0.710785 0.696561 0.094638 -0.709647 0.698141 +-0.455902 -0.643998 0.614345 -0.453047 -0.643605 0.616810 +-0.314971 -0.709904 0.629944 -0.313486 -0.708518 0.632191 +-0.162463 -0.759458 0.629944 -0.162816 -0.757469 0.632191 +-0.009708 -0.788978 0.614345 -0.011780 -0.786981 0.616810 +0.132684 -0.799129 0.586335 0.129460 -0.797601 0.589099 +-0.096471 0.070089 0.992865 -0.098697 0.071718 0.992523 +-0.203181 0.147618 0.967950 -0.204840 0.148808 0.967406 +-0.205432 0.000000 0.978671 -0.209815 0.000000 0.977722 +-0.315251 0.229040 0.920955 -0.316111 0.229652 0.920499 +-0.322868 0.078192 0.943208 -0.326365 0.077303 0.942045 +-0.425323 0.309011 0.850654 -0.425306 0.309000 0.850642 +-0.441423 0.160354 0.882855 -0.443617 0.158422 0.882077 +-0.525420 0.381735 0.760403 -0.524705 0.381207 0.761132 +-0.551779 0.240532 0.798551 -0.552660 0.237648 0.798791 +-0.609547 0.442856 0.657519 -0.608386 0.442030 0.659108 +-0.645740 0.312768 0.696560 -0.645680 0.309305 0.698111 +-0.719015 0.373135 0.586334 -0.718558 0.369610 0.589099 +-0.322868 -0.078192 0.943208 -0.326365 -0.077303 0.942045 +-0.447210 -0.000000 0.894429 -0.449324 0.000000 0.893338 +-0.441423 -0.160354 0.882855 -0.443617 -0.158422 0.882077 +-0.566539 0.082322 0.819912 -0.567095 0.081240 0.819605 +-0.566539 -0.082322 0.819912 -0.567095 -0.081240 0.819605 +-0.551779 -0.240532 0.798551 -0.552660 -0.237648 0.798791 +-0.670817 0.162457 0.723611 -0.670125 0.160405 0.724662 +-0.679848 0.000000 0.733353 -0.678915 0.000000 0.734184 +-0.670817 -0.162457 0.723611 -0.670125 -0.160405 0.724662 +-0.645740 -0.312768 0.696560 -0.645680 -0.309305 0.698111 +-0.753363 0.234576 0.614343 -0.752129 0.231971 0.616810 +-0.772492 0.080177 0.629942 -0.770714 0.079196 0.632191 +-0.772492 -0.080177 0.629942 -0.770714 -0.079196 0.632191 +-0.753363 -0.234576 0.614343 -0.752129 -0.231971 0.616810 +-0.719015 -0.373135 0.586334 -0.718558 -0.369610 0.589099 +0.036848 0.113408 0.992865 0.037690 0.116031 0.992523 +0.077607 0.238853 0.967950 0.078219 0.240791 0.967406 +-0.063483 0.195376 0.978672 -0.064821 0.199561 0.977722 +0.120413 0.370598 0.920955 0.120731 0.371593 0.920499 +-0.025408 0.331227 0.943209 -0.027284 0.334300 0.942045 +0.162456 0.499995 0.850654 0.162450 0.499985 0.850642 +0.016098 0.469369 0.882855 0.013581 0.470870 0.882077 +0.200688 0.617666 0.760403 0.200415 0.616810 0.761132 +0.058250 0.599101 0.798552 0.055208 0.599048 0.798791 +0.232822 0.716563 0.657519 0.232368 0.715201 0.659108 +0.097915 0.710785 0.696561 0.094638 0.709647 0.698111 +0.132684 0.799129 0.586334 0.129460 0.797601 0.589099 +-0.174138 0.282901 0.943209 -0.174383 0.286477 0.942045 +-0.138197 0.425319 0.894430 -0.138829 0.427351 0.893338 +-0.288916 0.370262 0.882855 -0.287759 0.372936 0.882077 +-0.096779 0.564248 0.819914 -0.097964 0.564440 0.819605 +-0.253366 0.513369 0.819914 -0.252510 0.514237 0.819605 +-0.399272 0.450440 0.798552 -0.396802 0.452162 0.798791 +-0.052790 0.688185 0.723612 -0.054506 0.686911 0.724662 +-0.210088 0.646571 0.733355 -0.209784 0.645680 0.734184 +-0.361804 0.587778 0.723612 -0.359661 0.587756 0.724662 +-0.497009 0.517479 0.696561 -0.493698 0.518479 0.698111 +-0.009708 0.788978 0.614345 -0.011780 0.786981 0.616810 +-0.162463 0.759458 0.629944 -0.162816 0.757469 0.632191 +-0.314971 0.709904 0.629944 -0.313486 0.708518 0.632191 +-0.455902 0.643998 0.614344 -0.453047 0.643605 0.616810 +-0.577066 0.568513 0.586334 -0.573565 0.569170 0.589099 +0.166198 0.120749 0.978672 0.169744 0.123325 0.977722 +0.307167 0.126518 0.943208 0.309488 0.129276 0.942045 +0.451375 0.129731 0.882854 0.452010 0.132572 0.882077 +0.587783 0.129731 0.798549 0.586779 0.132572 0.798791 +0.706258 0.126519 0.696558 0.704184 0.129276 0.698111 +0.801022 0.120750 0.586331 0.798578 0.123325 0.589068 +0.215245 0.253036 0.943209 0.218574 0.254402 0.942045 +0.361800 0.262863 0.894429 0.363506 0.264107 0.893338 +0.262862 0.389192 0.882855 0.265755 0.388928 0.882077 +0.506729 0.266403 0.819912 0.506546 0.267586 0.819605 +0.409951 0.399604 0.819913 0.411023 0.399060 0.819605 +0.305014 0.518924 0.798552 0.307413 0.517106 0.798791 +0.638194 0.262864 0.723610 0.636433 0.264107 0.724662 +0.550008 0.399605 0.733353 0.549242 0.399060 0.734184 +0.447209 0.525728 0.723612 0.447859 0.523667 0.724662 +0.338569 0.632593 0.696561 0.340526 0.629749 0.698111 +0.747366 0.253038 0.614342 0.744835 0.254402 0.616810 +0.672087 0.389194 0.629942 0.670095 0.388928 0.632191 +0.577830 0.518926 0.629943 0.576952 0.517106 0.632191 +0.471599 0.632594 0.614344 0.472121 0.629749 0.616810 +0.362366 0.724502 0.586334 0.364055 0.721366 0.589099 +0 1 2 +3 4 5 +0 2 6 +0 6 7 +0 7 8 +3 5 9 +10 11 12 +13 14 15 +16 17 18 +19 20 21 +3 9 22 +10 12 23 +13 15 24 +16 18 25 +19 21 26 +27 28 29 +30 31 32 +33 34 35 +36 37 38 +39 40 41 +42 11 10 +43 44 42 +45 46 43 +47 48 45 +49 50 47 +51 52 49 +2 53 51 +42 44 11 +44 54 11 +43 46 44 +46 55 44 +44 55 54 +55 56 54 +45 48 46 +48 57 46 +46 57 55 +57 58 55 +55 58 56 +58 59 56 +47 50 48 +50 60 48 +48 60 57 +60 61 57 +57 61 58 +61 62 58 +58 62 59 +62 63 59 +49 52 50 +52 64 50 +50 64 60 +64 65 60 +60 65 61 +65 66 61 +61 66 62 +66 67 62 +62 67 63 +67 68 63 +51 53 52 +53 69 52 +52 69 64 +69 70 64 +64 70 65 +70 71 65 +65 71 66 +71 72 66 +66 72 67 +72 73 67 +67 73 68 +73 74 68 +2 1 53 +1 75 53 +53 75 69 +75 76 69 +69 76 70 +76 77 70 +70 77 71 +77 78 71 +71 78 72 +78 79 72 +72 79 73 +79 4 73 +73 4 74 +4 3 74 +80 81 19 +82 83 80 +84 85 82 +86 87 84 +88 89 86 +90 91 88 +5 92 90 +80 83 81 +83 93 81 +82 85 83 +85 94 83 +83 94 93 +94 95 93 +84 87 85 +87 96 85 +85 96 94 +96 97 94 +94 97 95 +97 98 95 +86 89 87 +89 99 87 +87 99 96 +99 100 96 +96 100 97 +100 101 97 +97 101 98 +101 102 98 +88 91 89 +91 103 89 +89 103 99 +103 104 99 +99 104 100 +104 105 100 +100 105 101 +105 106 101 +101 106 102 +106 107 102 +90 92 91 +92 108 91 +91 108 103 +108 109 103 +103 109 104 +109 110 104 +104 110 105 +110 111 105 +105 111 106 +111 112 106 +106 112 107 +112 8 107 +5 4 92 +4 79 92 +92 79 108 +79 78 108 +108 78 109 +78 77 109 +109 77 110 +77 76 110 +110 76 111 +76 75 111 +111 75 112 +75 1 112 +112 1 8 +1 0 8 +113 14 13 +114 115 113 +116 117 114 +118 119 116 +120 121 118 +122 123 120 +6 124 122 +113 115 14 +115 125 14 +114 117 115 +117 126 115 +115 126 125 +126 127 125 +116 119 117 +119 128 117 +117 128 126 +128 129 126 +126 129 127 +129 130 127 +118 121 119 +121 131 119 +119 131 128 +131 132 128 +128 132 129 +132 133 129 +129 133 130 +133 134 130 +120 123 121 +123 135 121 +121 135 131 +135 136 131 +131 136 132 +136 137 132 +132 137 133 +137 138 133 +133 138 134 +138 139 134 +122 124 123 +124 140 123 +123 140 135 +140 141 135 +135 141 136 +141 142 136 +136 142 137 +142 143 137 +137 143 138 +143 144 138 +138 144 139 +144 145 139 +6 2 124 +2 51 124 +124 51 140 +51 49 140 +140 49 141 +49 47 141 +141 47 142 +47 45 142 +142 45 143 +45 43 143 +143 43 144 +43 42 144 +144 42 145 +42 10 145 +146 17 16 +147 148 146 +149 150 147 +151 152 149 +153 154 151 +155 156 153 +7 157 155 +146 148 17 +148 158 17 +147 150 148 +150 159 148 +148 159 158 +159 160 158 +149 152 150 +152 161 150 +150 161 159 +161 162 159 +159 162 160 +162 163 160 +151 154 152 +154 164 152 +152 164 161 +164 165 161 +161 165 162 +165 166 162 +162 166 163 +166 167 163 +153 156 154 +156 168 154 +154 168 164 +168 169 164 +164 169 165 +169 170 165 +165 170 166 +170 171 166 +166 171 167 +171 172 167 +155 157 156 +157 173 156 +156 173 168 +173 174 168 +168 174 169 +174 175 169 +169 175 170 +175 176 170 +170 176 171 +176 177 171 +171 177 172 +177 178 172 +7 6 157 +6 122 157 +157 122 173 +122 120 173 +173 120 174 +120 118 174 +174 118 175 +118 116 175 +175 116 176 +116 114 176 +176 114 177 +114 113 177 +177 113 178 +113 13 178 +81 20 19 +93 179 81 +95 180 93 +98 181 95 +102 182 98 +107 183 102 +8 184 107 +81 179 20 +179 185 20 +93 180 179 +180 186 179 +179 186 185 +186 187 185 +95 181 180 +181 188 180 +180 188 186 +188 189 186 +186 189 187 +189 190 187 +98 182 181 +182 191 181 +181 191 188 +191 192 188 +188 192 189 +192 193 189 +189 193 190 +193 194 190 +102 183 182 +183 195 182 +182 195 191 +195 196 191 +191 196 192 +196 197 192 +192 197 193 +197 198 193 +193 198 194 +198 199 194 +107 184 183 +184 200 183 +183 200 195 +200 201 195 +195 201 196 +201 202 196 +196 202 197 +202 203 197 +197 203 198 +203 204 198 +198 204 199 +204 205 199 +8 7 184 +7 155 184 +184 155 200 +155 153 200 +200 153 201 +153 151 201 +201 151 202 +151 149 202 +202 149 203 +149 147 203 +203 147 204 +147 146 204 +204 146 205 +146 16 205 +206 207 39 +208 209 206 +210 211 208 +212 213 210 +214 215 212 +216 217 214 +9 218 216 +206 209 207 +209 219 207 +208 211 209 +211 220 209 +209 220 219 +220 221 219 +210 213 211 +213 222 211 +211 222 220 +222 223 220 +220 223 221 +223 224 221 +212 215 213 +215 225 213 +213 225 222 +225 226 222 +222 226 223 +226 227 223 +223 227 224 +227 228 224 +214 217 215 +217 229 215 +215 229 225 +229 230 225 +225 230 226 +230 231 226 +226 231 227 +231 232 227 +227 232 228 +232 233 228 +216 218 217 +218 234 217 +217 234 229 +234 235 229 +229 235 230 +235 236 230 +230 236 231 +236 237 231 +231 237 232 +237 238 232 +232 238 233 +238 26 233 +9 5 218 +5 90 218 +218 90 234 +90 88 234 +234 88 235 +88 86 235 +235 86 236 +86 84 236 +236 84 237 +84 82 237 +237 82 238 +82 80 238 +238 80 26 +80 19 26 +239 240 27 +241 242 239 +243 244 241 +245 246 243 +247 248 245 +249 250 247 +12 251 249 +239 242 240 +242 252 240 +241 244 242 +244 253 242 +242 253 252 +253 254 252 +243 246 244 +246 255 244 +244 255 253 +255 256 253 +253 256 254 +256 257 254 +245 248 246 +248 258 246 +246 258 255 +258 259 255 +255 259 256 +259 260 256 +256 260 257 +260 261 257 +247 250 248 +250 262 248 +248 262 258 +262 263 258 +258 263 259 +263 264 259 +259 264 260 +264 265 260 +260 265 261 +265 266 261 +249 251 250 +251 267 250 +250 267 262 +267 268 262 +262 268 263 +268 269 263 +263 269 264 +269 270 264 +264 270 265 +270 271 265 +265 271 266 +271 22 266 +12 11 251 +11 54 251 +251 54 267 +54 56 267 +267 56 268 +56 59 268 +268 59 269 +59 63 269 +269 63 270 +63 68 270 +270 68 271 +68 74 271 +271 74 22 +74 3 22 +272 273 30 +274 275 272 +276 277 274 +278 279 276 +280 281 278 +282 283 280 +15 284 282 +272 275 273 +275 285 273 +274 277 275 +277 286 275 +275 286 285 +286 287 285 +276 279 277 +279 288 277 +277 288 286 +288 289 286 +286 289 287 +289 290 287 +278 281 279 +281 291 279 +279 291 288 +291 292 288 +288 292 289 +292 293 289 +289 293 290 +293 294 290 +280 283 281 +283 295 281 +281 295 291 +295 296 291 +291 296 292 +296 297 292 +292 297 293 +297 298 293 +293 298 294 +298 299 294 +282 284 283 +284 300 283 +283 300 295 +300 301 295 +295 301 296 +301 302 296 +296 302 297 +302 303 297 +297 303 298 +303 304 298 +298 304 299 +304 23 299 +15 14 284 +14 125 284 +284 125 300 +125 127 300 +300 127 301 +127 130 301 +301 130 302 +130 134 302 +302 134 303 +134 139 303 +303 139 304 +139 145 304 +304 145 23 +145 10 23 +305 306 33 +307 308 305 +309 310 307 +311 312 309 +313 314 311 +315 316 313 +18 317 315 +305 308 306 +308 318 306 +307 310 308 +310 319 308 +308 319 318 +319 320 318 +309 312 310 +312 321 310 +310 321 319 +321 322 319 +319 322 320 +322 323 320 +311 314 312 +314 324 312 +312 324 321 +324 325 321 +321 325 322 +325 326 322 +322 326 323 +326 327 323 +313 316 314 +316 328 314 +314 328 324 +328 329 324 +324 329 325 +329 330 325 +325 330 326 +330 331 326 +326 331 327 +331 332 327 +315 317 316 +317 333 316 +316 333 328 +333 334 328 +328 334 329 +334 335 329 +329 335 330 +335 336 330 +330 336 331 +336 337 331 +331 337 332 +337 24 332 +18 17 317 +17 158 317 +317 158 333 +158 160 333 +333 160 334 +160 163 334 +334 163 335 +163 167 335 +335 167 336 +167 172 336 +336 172 337 +172 178 337 +337 178 24 +178 13 24 +338 339 36 +340 341 338 +342 343 340 +344 345 342 +346 347 344 +348 349 346 +21 350 348 +338 341 339 +341 351 339 +340 343 341 +343 352 341 +341 352 351 +352 353 351 +342 345 343 +345 354 343 +343 354 352 +354 355 352 +352 355 353 +355 356 353 +344 347 345 +347 357 345 +345 357 354 +357 358 354 +354 358 355 +358 359 355 +355 359 356 +359 360 356 +346 349 347 +349 361 347 +347 361 357 +361 362 357 +357 362 358 +362 363 358 +358 363 359 +363 364 359 +359 364 360 +364 365 360 +348 350 349 +350 366 349 +349 366 361 +366 367 361 +361 367 362 +367 368 362 +362 368 363 +368 369 363 +363 369 364 +369 370 364 +364 370 365 +370 25 365 +21 20 350 +20 185 350 +350 185 366 +185 187 366 +366 187 367 +187 190 367 +367 190 368 +190 194 368 +368 194 369 +194 199 369 +369 199 370 +199 205 370 +370 205 25 +205 16 25 +240 28 27 +252 371 240 +254 372 252 +257 373 254 +261 374 257 +266 375 261 +22 376 266 +240 371 28 +371 377 28 +252 372 371 +372 378 371 +371 378 377 +378 379 377 +254 373 372 +373 380 372 +372 380 378 +380 381 378 +378 381 379 +381 382 379 +257 374 373 +374 383 373 +373 383 380 +383 384 380 +380 384 381 +384 385 381 +381 385 382 +385 386 382 +261 375 374 +375 387 374 +374 387 383 +387 388 383 +383 388 384 +388 389 384 +384 389 385 +389 390 385 +385 390 386 +390 391 386 +266 376 375 +376 392 375 +375 392 387 +392 393 387 +387 393 388 +393 394 388 +388 394 389 +394 395 389 +389 395 390 +395 396 390 +390 396 391 +396 397 391 +22 9 376 +9 216 376 +376 216 392 +216 214 392 +392 214 393 +214 212 393 +393 212 394 +212 210 394 +394 210 395 +210 208 395 +395 208 396 +208 206 396 +396 206 397 +206 39 397 +273 31 30 +285 398 273 +287 399 285 +290 400 287 +294 401 290 +299 402 294 +23 403 299 +273 398 31 +398 404 31 +285 399 398 +399 405 398 +398 405 404 +405 406 404 +287 400 399 +400 407 399 +399 407 405 +407 408 405 +405 408 406 +408 409 406 +290 401 400 +401 410 400 +400 410 407 +410 411 407 +407 411 408 +411 412 408 +408 412 409 +412 413 409 +294 402 401 +402 414 401 +401 414 410 +414 415 410 +410 415 411 +415 416 411 +411 416 412 +416 417 412 +412 417 413 +417 418 413 +299 403 402 +403 419 402 +402 419 414 +419 420 414 +414 420 415 +420 421 415 +415 421 416 +421 422 416 +416 422 417 +422 423 417 +417 423 418 +423 424 418 +23 12 403 +12 249 403 +403 249 419 +249 247 419 +419 247 420 +247 245 420 +420 245 421 +245 243 421 +421 243 422 +243 241 422 +422 241 423 +241 239 423 +423 239 424 +239 27 424 +306 34 33 +318 425 306 +320 426 318 +323 427 320 +327 428 323 +332 429 327 +24 430 332 +306 425 34 +425 431 34 +318 426 425 +426 432 425 +425 432 431 +432 433 431 +320 427 426 +427 434 426 +426 434 432 +434 435 432 +432 435 433 +435 436 433 +323 428 427 +428 437 427 +427 437 434 +437 438 434 +434 438 435 +438 439 435 +435 439 436 +439 440 436 +327 429 428 +429 441 428 +428 441 437 +441 442 437 +437 442 438 +442 443 438 +438 443 439 +443 444 439 +439 444 440 +444 445 440 +332 430 429 +430 446 429 +429 446 441 +446 447 441 +441 447 442 +447 448 442 +442 448 443 +448 449 443 +443 449 444 +449 450 444 +444 450 445 +450 451 445 +24 15 430 +15 282 430 +430 282 446 +282 280 446 +446 280 447 +280 278 447 +447 278 448 +278 276 448 +448 276 449 +276 274 449 +449 274 450 +274 272 450 +450 272 451 +272 30 451 +339 37 36 +351 452 339 +353 453 351 +356 454 353 +360 455 356 +365 456 360 +25 457 365 +339 452 37 +452 458 37 +351 453 452 +453 459 452 +452 459 458 +459 460 458 +353 454 453 +454 461 453 +453 461 459 +461 462 459 +459 462 460 +462 463 460 +356 455 454 +455 464 454 +454 464 461 +464 465 461 +461 465 462 +465 466 462 +462 466 463 +466 467 463 +360 456 455 +456 468 455 +455 468 464 +468 469 464 +464 469 465 +469 470 465 +465 470 466 +470 471 466 +466 471 467 +471 472 467 +365 457 456 +457 473 456 +456 473 468 +473 474 468 +468 474 469 +474 475 469 +469 475 470 +475 476 470 +470 476 471 +476 477 471 +471 477 472 +477 478 472 +25 18 457 +18 315 457 +457 315 473 +315 313 473 +473 313 474 +313 311 474 +474 311 475 +311 309 475 +475 309 476 +309 307 476 +476 307 477 +307 305 477 +477 305 478 +305 33 478 +207 40 39 +219 479 207 +221 480 219 +224 481 221 +228 482 224 +233 483 228 +26 484 233 +207 479 40 +479 485 40 +219 480 479 +480 486 479 +479 486 485 +486 487 485 +221 481 480 +481 488 480 +480 488 486 +488 489 486 +486 489 487 +489 490 487 +224 482 481 +482 491 481 +481 491 488 +491 492 488 +488 492 489 +492 493 489 +489 493 490 +493 494 490 +228 483 482 +483 495 482 +482 495 491 +495 496 491 +491 496 492 +496 497 492 +492 497 493 +497 498 493 +493 498 494 +498 499 494 +233 484 483 +484 500 483 +483 500 495 +500 501 495 +495 501 496 +501 502 496 +496 502 497 +502 503 497 +497 503 498 +503 504 498 +498 504 499 +504 505 499 +26 21 484 +21 348 484 +484 348 500 +348 346 500 +500 346 501 +346 344 501 +501 344 502 +344 342 502 +502 342 503 +342 340 503 +503 340 504 +340 338 504 +504 338 505 +338 36 505 +506 507 508 +509 510 506 +511 512 509 +513 514 511 +515 516 513 +517 518 515 +29 519 517 +506 510 507 +510 520 507 +509 512 510 +512 521 510 +510 521 520 +521 522 520 +511 514 512 +514 523 512 +512 523 521 +523 524 521 +521 524 522 +524 525 522 +513 516 514 +516 526 514 +514 526 523 +526 527 523 +523 527 524 +527 528 524 +524 528 525 +528 529 525 +515 518 516 +518 530 516 +516 530 526 +530 531 526 +526 531 527 +531 532 527 +527 532 528 +532 533 528 +528 533 529 +533 534 529 +517 519 518 +519 535 518 +518 535 530 +535 536 530 +530 536 531 +536 537 531 +531 537 532 +537 538 532 +532 538 533 +538 539 533 +533 539 534 +539 41 534 +29 28 519 +28 377 519 +519 377 535 +377 379 535 +535 379 536 +379 382 536 +536 382 537 +382 386 537 +537 386 538 +386 391 538 +538 391 539 +391 397 539 +539 397 41 +397 39 41 +540 506 508 +541 542 540 +543 544 541 +545 546 543 +547 548 545 +549 550 547 +32 551 549 +540 542 506 +542 509 506 +541 544 542 +544 552 542 +542 552 509 +552 511 509 +543 546 544 +546 553 544 +544 553 552 +553 554 552 +552 554 511 +554 513 511 +545 548 546 +548 555 546 +546 555 553 +555 556 553 +553 556 554 +556 557 554 +554 557 513 +557 515 513 +547 550 548 +550 558 548 +548 558 555 +558 559 555 +555 559 556 +559 560 556 +556 560 557 +560 561 557 +557 561 515 +561 517 515 +549 551 550 +551 562 550 +550 562 558 +562 563 558 +558 563 559 +563 564 559 +559 564 560 +564 565 560 +560 565 561 +565 566 561 +561 566 517 +566 29 517 +32 31 551 +31 404 551 +551 404 562 +404 406 562 +562 406 563 +406 409 563 +563 409 564 +409 413 564 +564 413 565 +413 418 565 +565 418 566 +418 424 566 +566 424 29 +424 27 29 +567 540 508 +568 569 567 +570 571 568 +572 573 570 +574 575 572 +576 577 574 +35 578 576 +567 569 540 +569 541 540 +568 571 569 +571 579 569 +569 579 541 +579 543 541 +570 573 571 +573 580 571 +571 580 579 +580 581 579 +579 581 543 +581 545 543 +572 575 573 +575 582 573 +573 582 580 +582 583 580 +580 583 581 +583 584 581 +581 584 545 +584 547 545 +574 577 575 +577 585 575 +575 585 582 +585 586 582 +582 586 583 +586 587 583 +583 587 584 +587 588 584 +584 588 547 +588 549 547 +576 578 577 +578 589 577 +577 589 585 +589 590 585 +585 590 586 +590 591 586 +586 591 587 +591 592 587 +587 592 588 +592 593 588 +588 593 549 +593 32 549 +35 34 578 +34 431 578 +578 431 589 +431 433 589 +589 433 590 +433 436 590 +590 436 591 +436 440 591 +591 440 592 +440 445 592 +592 445 593 +445 451 593 +593 451 32 +451 30 32 +594 567 508 +595 596 594 +597 598 595 +599 600 597 +601 602 599 +603 604 601 +38 605 603 +594 596 567 +596 568 567 +595 598 596 +598 606 596 +596 606 568 +606 570 568 +597 600 598 +600 607 598 +598 607 606 +607 608 606 +606 608 570 +608 572 570 +599 602 600 +602 609 600 +600 609 607 +609 610 607 +607 610 608 +610 611 608 +608 611 572 +611 574 572 +601 604 602 +604 612 602 +602 612 609 +612 613 609 +609 613 610 +613 614 610 +610 614 611 +614 615 611 +611 615 574 +615 576 574 +603 605 604 +605 616 604 +604 616 612 +616 617 612 +612 617 613 +617 618 613 +613 618 614 +618 619 614 +614 619 615 +619 620 615 +615 620 576 +620 35 576 +38 37 605 +37 458 605 +605 458 616 +458 460 616 +616 460 617 +460 463 617 +617 463 618 +463 467 618 +618 467 619 +467 472 619 +619 472 620 +472 478 620 +620 478 35 +478 33 35 +507 594 508 +520 621 507 +522 622 520 +525 623 522 +529 624 525 +534 625 529 +41 626 534 +507 621 594 +621 595 594 +520 622 621 +622 627 621 +621 627 595 +627 597 595 +522 623 622 +623 628 622 +622 628 627 +628 629 627 +627 629 597 +629 599 597 +525 624 623 +624 630 623 +623 630 628 +630 631 628 +628 631 629 +631 632 629 +629 632 599 +632 601 599 +529 625 624 +625 633 624 +624 633 630 +633 634 630 +630 634 631 +634 635 631 +631 635 632 +635 636 632 +632 636 601 +636 603 601 +534 626 625 +626 637 625 +625 637 633 +637 638 633 +633 638 634 +638 639 634 +634 639 635 +639 640 635 +635 640 636 +640 641 636 +636 641 603 +641 38 603 +41 40 626 +40 485 626 +626 485 637 +485 487 637 +637 487 638 +487 490 638 +638 490 639 +490 494 639 +639 494 640 +494 499 640 +640 499 641 +499 505 641 +641 505 38 +505 36 38 +MATERIALS 1 +Material.001 +MATERIAL Material.001 +0.028 0.061 0.800 0.500 +0 0 0 1 +0 0 0 0 1 +0 0 0 1 +TEXTURES 0 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/BeaconArray.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/BeaconArray.fx new file mode 100644 index 0000000000..11ae7d8339 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/BeaconArray.fx @@ -0,0 +1,86 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2012 - 2016 Jarmo Nikkanen +// ============================================================== + +struct BAVERTEX { + float3 posL : POSITION0; + float3 dirL : NORMAL0; + float4 data : TEXCOORD0; + float2 dataB : TEXCOORD1; + float4 colr : COLOR0; +}; + + +struct BeaconVS +{ + float4 posH : POSITION0; + float4 colr : COLOR0; + float2 tex0 : TEXCOORD0; + float size : PSIZE; + float haze : COLOR1; +}; + + +BeaconVS BeaconArrayVS(BAVERTEX vrt) +{ + BeaconVS outVS = (BeaconVS)0; + + //float3 posX = mul(float4(vrt.posL, 1.0f), gW).xyz; + //float dist = length(posX); // distance to a beacon + //float3 offL = float3(0, dist*2e-3, 0); + //float3 posW = mul(float4(vrt.posL+offL, 1.0f), gW).xyz; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 dirW = mul(float4(vrt.dirL, 0.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + + //posW = posW * gDistScale; + + float fog = exp(-abs(outVS.posH.z * gFogDensity * 20.0f)); // Haze effect scale factor + + float dist = length(posW); // distance to a beacon + + // Viewing angle dependency + float dota = -dot(normalize(posW), dirW); + float angl = saturate((dota - vrt.data[1])/(1.0f-vrt.data[1])); // beacon visibility from a current point 1.0 to 0.0 + float disp = pow(angl, vrt.dataB[1]); // apply a proper curve into a visibility + + // Distance attennuation + float att0 = vrt.dataB[0] / (1.0f+dist*2e-4); + float att1 = saturate(pow(att0, 2.0f)); + + if (gTimevrt.data[3]) disp = 0.0f; + + outVS.colr = float4(vrt.colr.rgb, min(1, vrt.colr.a * disp * att1 * 1.2f)); + outVS.size = (5.5f + vrt.data[0] * gPointScale / dist) * disp; + outVS.haze = clamp(fog*1.8f, 0.3f, 1.8f); + + return outVS; +} + +float4 BeaconArrayPS(BeaconVS frg) : COLOR +{ + float4 cTex = tex2D(ClampS, frg.tex0); + //return float4(frg.colr.rgb*saturate(pow(abs(cTex.a),0.3f)*gMix), pow(abs(cTex.a), frg.haze) * frg.colr.a); + return float4(frg.colr.rgb, pow(abs(cTex.a), frg.haze) * frg.colr.a); +} + + +technique BeaconArrayTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BeaconArrayVS(); + pixelShader = compile ps_3_0 BeaconArrayPS(); + + PointSpriteEnable = true; + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/CKBlit.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/CKBlit.fx new file mode 100644 index 0000000000..13264aa1c6 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/CKBlit.fx @@ -0,0 +1,335 @@ +// ================================================================================================================================= +// The MIT Lisence: +// +// Copyright (C) 2013-2016 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + + +// ---------------------------------------------------------------------------- +// D3D9Client ColorKey Blitting technique +// ---------------------------------------------------------------------------- + +uniform extern float4x4 gVP; // Combined World, View and Projection matrix +uniform extern texture gTex0; // Diffuse texture +uniform extern float4 gColor; +uniform extern float4 gData; +uniform extern float4 gSize; +uniform extern bool gKey; +uniform extern bool gDash; + +sampler Tex0S = sampler_state +{ + Texture = ; + MinFilter = POINT; + MagFilter = POINT; + MipFilter = None; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Tex0AS = sampler_state +{ + Texture = ; + MinFilter = Anisotropic; + MagFilter = Anisotropic; + MipFilter = NONE; + MaxAnisotropy = 18; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Font0S = sampler_state +{ + Texture = ; + MinFilter = Anisotropic; + MagFilter = LINEAR; + MipFilter = None; + MaxAnisotropy = 4; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +struct OutputVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; +}; + +struct DrawVS +{ + float4 posH : POSITION0; +}; + + +// ---------------------------------------------------------------------------- +// D3D9ClientSurface Implementation +// ---------------------------------------------------------------------------- + +OutputVS BlitTechVS(float3 posL : POSITION0, float2 tex0: TEXCOORD0) +{ + // Zero output. + OutputVS outVS = (OutputVS)0; + outVS.posH = mul(float4(posL.xy-0.5f, 0.0f, 1.0f),gVP); + outVS.tex0 = tex0; + return outVS; +} + +OutputVS FlushTechVS(float4 posL : POSITION0) +{ + // Zero output. + OutputVS outVS = (OutputVS)0; + outVS.posH = mul(float4(posL.xy-0.5f, 0.0f, 1.0f),gVP); + outVS.tex0 = posL.zw*gSize.xy; + return outVS; +} + +float4 BlitTechPS(float2 tex0 : TEXCOORD0) : COLOR +{ + float4 c = tex2D(Tex0S, tex0); + float4 x = abs(c - gColor); + float tol = 0.01f; + if (x.r0.5) return gColor; + clip(-1); + } + return gColor; +} + +float4 FillTechPS() : COLOR +{ + return gColor; +} + + +technique EllipseTech +{ + pass P0 + { + vertexShader = compile vs_2_0 EllipseTechVS(); + pixelShader = compile ps_2_0 DrawTechPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + } +} + +technique LineTech +{ + pass P0 + { + vertexShader = compile vs_2_0 LineTechVS(); + pixelShader = compile ps_2_0 DrawTechPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + } +} + +technique FillTech +{ + pass P0 + { + vertexShader = compile vs_2_0 FillTechVS(); + pixelShader = compile ps_2_0 FillTechPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Common.hlsl b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Common.hlsl new file mode 100644 index 0000000000..85a5a21323 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Common.hlsl @@ -0,0 +1,399 @@ + +#define KERNEL_RADIUS 2.0f +#define SHADOW_THRESHOLD 0.1f // 0.3 to 7.0 + + + +// ============================================================================ +// +float4 Paraboloidal_LVLH(sampler s, float3 i) +{ + float z = dot(gCameraPos, i); + float2 p = float2(dot(gEast, i), dot(gNorth, i)) / (1.0f + abs(z)); + p *= float2(0.2273f, 0.4545f); + float4 A = tex2D(s, p + float2(0.25f, 0.5f)); + float4 B = tex2D(s, p + float2(0.75f, 0.5f)); + return lerp(A, B, smoothstep(-0.03, 0.03, z)); +} + +float3 Sq(float3 x) +{ + return x*x; +} + +float4 Sq(float4 x) +{ + return x*x; +} + + +// ========================================================================================================== +// Local light sources +// ========================================================================================================== + + +float3 Light_fx(float3 x) +{ + return saturate(x); //1.5 - exp2(-x.rgb)*1.5f; +} + +void LocalLights( + out float3 diff_out, + out float3 spec_out, + in float3 nrmW, + in float3 posW, + in float sp, + uniform int x, + uniform bool bSpec) +{ + + float3 posWN = normalize(-posW); + float3 p[4]; + float4 spe; + int i; + + // Relative positions + [unroll] for (i = 0; i < 4; i++) p[i] = posW - gLights[i + x].position; + + // Square distances + float4 sd; + [unroll] for (i = 0; i < 4; i++) sd[i] = dot(p[i], p[i]); + + // Normalize + sd = rsqrt(sd); + [unroll] for (i = 0; i < 4; i++) p[i] *= sd[i]; + + // Distances + float4 dst = rcp(sd); + + // Attennuation factors + float4 att; + [unroll] for (i = 0; i < 4; i++) att[i] = dot(gLights[i + x].attenuation.xyz, float3(1.0, dst[i], dst[i] * dst[i])); + + att = rcp(att); + + // Spotlight factors + float4 spt; + [unroll] for (i = 0; i < 4; i++) { + spt[i] = (dot(p[i], gLights[i + x].direction) - gLights[i + x].param[Phi]) * gLights[i + x].param[Theta]; + if (gLights[i + x].type == 0) spt[i] = 1.0f; + } + + spt = saturate(spt); + + // Diffuse light factors + float4 dif; + [unroll] for (i = 0; i < 4; i++) dif[i] = dot(-p[i], nrmW); + + dif = saturate(dif); + dif *= (att*spt); + + // Specular lights factors + if (bSpec) { + + [unroll] for (i = 0; i < 4; i++) spe[i] = dot(reflect(p[i], nrmW), posWN) * (dif[i] > 0); + + spe = pow(saturate(spe), sp); + spe *= (att*spt); + } + + diff_out = 0; + spec_out = 0; + + [unroll] for (i = 0; i < 4; i++) diff_out += gLights[i + x].diffuse.rgb * dif[i]; + + if (bSpec) { + [unroll] for (i = 0; i < 4; i++) spec_out += gLights[i + x].diffuse.rgb * spe[i]; + } +} + + +void LocalLightsBeckman( + out float3 diff_out, + out float3 spec_out, + in float3 nrmW, + in float3 posW, + in float fRgh, + uniform int x, + uniform bool bSpec) +{ + + float3 camW = normalize(-posW); + float3 p[4]; + float3 H[4]; + float4 spe; + float4 dHN; + int i; + + // Relative positions + [unroll] for (i = 0; i < 4; i++) p[i] = posW - gLights[i + x].position; + + // Square distances + float4 sd; + [unroll] for (i = 0; i < 4; i++) sd[i] = dot(p[i], p[i]); + + // Normalize + sd = rsqrt(sd); + [unroll] for (i = 0; i < 4; i++) p[i] *= sd[i]; + + // Distances + float4 dst = rcp(sd); + + if (bSpec) { + + // Halfway Vectors + float4 hd; + [unroll] for (i = 0; i < 4; i++) H[i] = (camW - p[i]); + [unroll] for (i = 0; i < 4; i++) hd[i] = dot(H[i], H[i]); + + hd = rsqrt(hd); + + [unroll] for (i = 0; i < 4; i++) H[i] *= hd[i]; + [unroll] for (i = 0; i < 4; i++) dHN[i] = dot(H[i], nrmW); + } + + + + // Attennuation factors + float4 att; + [unroll] for (i = 0; i < 4; i++) att[i] = dot(gLights[i + x].attenuation.xyz, float3(1.0, dst[i], dst[i] * dst[i])); + + att = rcp(att); + + // Spotlight factors + float4 spt; + [unroll] for (i = 0; i < 4; i++) { + spt[i] = (dot(p[i], gLights[i + x].direction) - gLights[i + x].param[Phi]) * gLights[i + x].param[Theta]; + if (gLights[i + x].type == 0) spt[i] = 1.0f; + } + + spt = saturate(spt); + + // Diffuse light factors + float4 dif; + [unroll] for (i = 0; i < 4; i++) dif[i] = dot(-p[i], nrmW); + + dif = saturate(dif); + + // Specular lights factors + + if (bSpec) { + + float r2 = fRgh*fRgh; + float4 d2 = dHN*dHN; + float4 w = rcp(3.14*r2*d2*d2); + float4 q = rcp(r2*d2); + + spe = (att*spt*dif) * w * exp((d2 - 1.0f) * q); + } + + dif *= (att*spt); + + diff_out = 0; + spec_out = 0; + + [unroll] for (i = 0; i < 4; i++) diff_out += Sq(gLights[i + x].diffuse.rgb * dif[i]); + + if (bSpec) { + [unroll] for (i = 0; i < 4; i++) spec_out += gLights[i + x].diffuse.rgb * spe[i]; + } +} + + + +void LocalLightsEx(out float3 cDiffLocal, out float3 cSpecLocal, in float3 nrmW, in float3 posW, in float sp, uniform bool ubBeckman) +{ + +#if LMODE !=0 + if (!gLightsEnabled) { + cDiffLocal = 0; + cSpecLocal = 0; + } +#endif + +#if LMODE == 1 + if (ubBeckman) LocalLightsBeckman(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, false); + else LocalLights(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, false); + +#elif LMODE == 2 + if (ubBeckman) LocalLightsBeckman(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, true); + else LocalLights(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, true); + +#elif LMODE == 3 + float3 dd, ss; + if (ubBeckman) { + LocalLightsBeckman(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, false); + LocalLightsBeckman(dd, ss, nrmW, posW, sp, 4, false); + } + else { + LocalLights(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, false); + LocalLights(dd, ss, nrmW, posW, sp, 4, false); + } + cDiffLocal += dd; + cSpecLocal += ss; + +#elif LMODE == 4 + float3 dd, ss; + if (ubBeckman) { + LocalLightsBeckman(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, true); + LocalLightsBeckman(dd, ss, nrmW, posW, sp, 4, true); + } + else { + LocalLights(cDiffLocal, cSpecLocal, nrmW, posW, sp, 0, true); + LocalLights(dd, ss, nrmW, posW, sp, 4, true); + } + cDiffLocal += dd; + cSpecLocal += ss; +#else + cDiffLocal = 0; + cSpecLocal = 0; +#endif +} + + + + + + + +// ========================================================================================================== +// Object Self Shadows +// ========================================================================================================== +/* +float ProjectShadows(float2 sp) +{ + if (!gShadowsEnabled) return 0.0f; + + if (sp.x < 0 || sp.y < 0) return 0.0f; + if (sp.x > 1 || sp.y > 1) return 0.0f; + + float2 dx = float2(gSHD[1], 0) * 1.5f; + float2 dy = float2(0, gSHD[1]) * 1.5f; + float va = 0; + float pd = 1e-4; + + sp -= dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + + return va / 9.0f; +}*/ + + +// --------------------------------------------------------------------------------------------------- +// +float SampleShadows(float2 sp, float pd) +{ + + float2 dx = float2(gSHD[1], 0) * 1.5f; + float2 dy = float2(0, gSHD[1]) * 1.5f; + float va = 0; + + sp -= dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + + return va * 0.1111111f; +} + + +// --------------------------------------------------------------------------------------------------- +// +float SampleShadows2(float2 sp, float pd) +{ + + float val = 0; + float m = KERNEL_RADIUS * gSHD[1]; + + [unroll] for (int i = 0; i < KERNEL_SIZE; i++) { + if ((tex2D(ShadowS, sp + kernel[i].xy * m).r) > pd) val += kernel[i].z; + } + + return saturate(val * KERNEL_WEIGHT); +} + + +// --------------------------------------------------------------------------------------------------- +// +float SampleShadows3(float2 sp, float pd, float4 frame) +{ + + float val = 0; + frame *= KERNEL_RADIUS * gSHD[1]; + + [unroll] for (int i = 0; i < KERNEL_SIZE; i++) { + float2 ofs = frame.xy*kernel[i].x + frame.zw*kernel[i].y; + if (tex2D(ShadowS, sp + ofs).r > pd) val += kernel[i].z; + } + + return saturate(val * KERNEL_WEIGHT); +} + + +// --------------------------------------------------------------------------------------------------- +// +float SampleShadowsEx(float2 sp, float pd, float4 sc) +{ + +#if SHDMAP == 1 + return SampleShadows(sp, pd); +#elif SHDMAP == 2 || SHDMAP == 4 + return SampleShadows2(sp, pd); +#else + float si, co; + sc += (gSHD[2] * 2.0f); + sincos(sc.y + sc.x*149.0f, si, co); + return SampleShadows3(sp, pd, float4(si, co, co, -si)); +#endif +} + + +// --------------------------------------------------------------------------------------------------- +// +float ComputeShadow(float4 shdH, float dLN, float4 sc) +{ + if (!gShadowsEnabled) return 1.0f; + + shdH.xyz /= shdH.w; + shdH.z = 1 - shdH.z; + float2 sp = shdH.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); + + sp += gSHD[1] * 0.5f; + + if (sp.x < 0 || sp.y < 0) return 1.0f; // If a sample is outside border -> fully lit + if (sp.x > 1 || sp.y > 1) return 1.0f; + + float fShadow; + + float kr = gSHD[0] * KERNEL_RADIUS; + float dx = rsqrt(1.0 - dLN*dLN); + float ofs = kr / (dLN * dx); + float omx = min(0.05 + ofs, 0.5); + + float pd = shdH.z + omx * gSHD[3]; + + if (pd < 0) pd = 0; + if (pd > 1) pd = 1; + + fShadow = SampleShadowsEx(sp, pd, sc); + + return 1 - fShadow; +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Credits.rtf b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Credits.rtf new file mode 100644 index 0000000000..0c32e3d658 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Credits.rtf differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/D3D9Client.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/D3D9Client.fx new file mode 100644 index 0000000000..936e3ef6cf --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/D3D9Client.fx @@ -0,0 +1,753 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2012 - 2016 Jarmo Nikkanen +// ============================================================== + +// ---------------------------------------------------------------------------- +// D3D9Client rendering techniques for Orbiter Spaceflight simulator +// ---------------------------------------------------------------------------- + + +#define NIGHT_CLOUDS 0.05f // range(0.0f-0.1f) Cloud ambient level at night +#define CLOUD_INTENSITY 1.8f // range(0.5f-2.0f) +#define NIGHT_LIGHTS 0.7f // range(0.2f-1.0f) + +struct Mat +{ + float4 diffuse; + float4 ambient; + float4 specular; + float4 emissive; + float specPower; +}; + +struct Mtrl +{ + float4 diffuse; + float4 specular; + float3 ambient; + float3 emissive; + float3 reflect; + float3 emission2; + float3 fresnel; + float2 roughness; + float metalness; + float4 specialfx; // x = Heat +}; + +struct Sun +{ + float3 Dir; + float3 Color; float pad; + float3 Ambient; float pad2; +}; + +struct Light +{ + int type; /* Is is spotlight */ + float dst2; /* Camera-Light Emitter distance squared */ + float4 diffuse; /* diffuse color of light */ + float3 position; /* position in world space */ + float3 direction; /* direction in world space */ + float3 attenuation; /* Attenuation */ + float4 param; /* range, falloff, theta, phi */ +}; + +// Must match with counterpart in D3D9Effect.h + +struct Flow +{ + bool Emis; // Enable Emission Maps + bool Spec; // Enable Specular Maps + bool Refl; // Enable Reflection Maps + bool Transl; // Enble translucent effect + bool Transm; // Enable transmissive effect + bool Rghn; // Enable roughness map + bool Norm; // Enable normal map + bool Metl; // Enable metalness map + bool Heat; // Enable heat map +}; + + +// Must match with counterpart D3D9Tune in D3D9Util.h + +struct Tune +{ + float4 Albe; // Tune Diffese Maps + float4 Emis; // Tune Emission Maps + float4 Spec; // Tune Specular Maps + float4 Refl; // Tune Reflection Maps + float4 Transl; // Tune translucent effect + float4 Transm; // Tune transmissive effect + float4 Norm; // Tune normal map + float4 Rghn; // Tune roughness map +}; + + +#define Range 0 +#define Falloff 1 +#define Theta 2 +#define Phi 3 + + +#define SH_SIZE 0 +#define SH_INVSIZE 1 + +uniform extern float3 kernel[KERNEL_SIZE]; + +// ------------------------------------------------------------------------- +uniform extern float4x4 gW; // World matrix +uniform extern float4x4 gLVP; // Light view projection +uniform extern float4x4 gVP; // Combined View and Projection matrix +uniform extern float4x4 gGrpT; // Mesh group transformation matrix +uniform extern float4 gAttennuate; // (Mesh Constant Fog) Attennuation of fragment color +uniform extern float4 gInScatter; // (Mesh Constant Fog) In scattering light +uniform extern float4 gColor; // General purpose color parameter +uniform extern float4 gFogColor; // Distance fog color in "Legacy" implementation +uniform extern float4 gAtmColor; // Earth glow color +uniform extern float4 gTexOff; // Texture offsets used by surface manager +uniform extern float4 gRadius; // PlanetRad, AtmOuterLimit, CameraRad, CameraAlt +uniform extern float4 gSHD; // ShadowMap data +uniform extern float3 gCameraPos; // Planet relative camera position, Unit vector +uniform extern float3 gNorth; +uniform extern float3 gEast; +uniform extern Sun gSun; // Sun light direction +uniform extern Mat gMat; // Material input structure TODO: Remove all reference to this. Use gMtrl +uniform extern Mat gWater; // Water material input structure +uniform extern Mtrl gMtrl; // Material input structure +uniform extern Tune gTune; // Texture tuning parameters +uniform extern Light gLights[MAX_LIGHTS]; +uniform extern bool gLightsEnabled; +uniform extern bool gTuneEnabled; +uniform extern bool gModAlpha; // Configuration input +uniform extern bool gFullyLit; // Always fully lit bypass lighting calculations +uniform extern bool gTextured; // Enable Diffuse Texturing +uniform extern bool gFresnel; // Enable fresnel material +uniform extern bool gPBRSw; // Legacy / PBR Switch +uniform extern bool gRghnSw; // Roughness converter switch +uniform extern bool gNight; // Nighttime/Daytime +uniform extern bool gShadowsEnabled; // Enable shadow maps +uniform extern bool gEnvMapEnable; // Enable Environment mapping +uniform extern bool gInSpace; // True if a mesh is located in space +uniform extern bool gNoColor; // No color flag +uniform extern bool gBaseBuilding; +uniform extern int gSpecMode; +uniform extern int gHazeMode; +uniform extern float gProxySize; // Cosine of the angular size of the Proxy Gbody. (one half) +uniform extern float gInvProxySize; // = 1.0 / (1.0f-gProxySize) +uniform extern float gPointScale; +uniform extern float gDistScale; +uniform extern float gFogDensity; +uniform extern float gTime; +uniform extern float gMix; // General purpose parameter (multible uses) +uniform extern float gMtrlAlpha; +uniform extern float gGlowConst; +uniform extern float gNightTime; // 1 for nighttime, 0 for daytime +uniform extern Flow gCfg; + +// Textures ----------------------------------------------------------------- + +uniform extern texture gTex0; // Diffuse texture +uniform extern texture gTex1; // Nightlights +uniform extern texture gTex3; // Normal Map / Cloud Microtexture +uniform extern texture gSpecMap; // Specular Map +uniform extern texture gRghnMap; // Roughness Map +uniform extern texture gEmisMap; // Emission Map +uniform extern texture gEnvMapA; // Environment Map (Mirror clear) +uniform extern texture gEnvMapB; // Environment Map (Mipmapped with different levels of blur) +uniform extern texture gReflMap; // Reflectivity Map +uniform extern texture gMetlMap; // Metalness Map +uniform extern texture gHeatMap; // Heat Map +uniform extern texture gTranslMap; // Translucence Map +uniform extern texture gTransmMap; // Transmittance Map +uniform extern texture gShadowMap; // Shadow Map +uniform extern texture gIrradianceMap; // Irradiance Map + +// Legacy Atmosphere -------------------------------------------------------- + +uniform extern float gGlobalAmb; // Global Ambient Level +uniform extern float gSunAppRad; // Sun apparent size (Radius / Distance) +uniform extern float gDispersion; +uniform extern float gAmbient0; + + +// ---------------------------------------------------------------------------- +// Vertex layouts +// ---------------------------------------------------------------------------- + +struct MESH_VERTEX { // D3D9Client Mesh vertex layout + float3 posL : POSITION0; + float3 nrmL : NORMAL0; + float3 tanL : TANGENT0; + float3 tex0 : TEXCOORD0; +}; + +struct NTVERTEX { // Orbiter Mesh vertex layout + float3 posL : POSITION0; + float3 nrmL : NORMAL0; + float2 tex0 : TEXCOORD0; +}; + +struct TILEVERTEX { // Vertex declaration used for surface tiles and cloud layer + float3 posL : POSITION0; + float3 normalL : NORMAL0; + float2 tex0 : TEXCOORD0; + float2 tex1 : TEXCOORD1; +}; + +struct HZVERTEX { + float3 posL : POSITION0; + float4 color : COLOR0; + float2 tex0 : TEXCOORD0; +}; + +struct SHADOW_VERTEX { + float4 posL : POSITION0; +}; + + +// ---------------------------------------------------------------------------- +// Vertex shader outputs +// ---------------------------------------------------------------------------- + +struct SimpleVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; + float3 nrmW : TEXCOORD1; + float3 toCamW : TEXCOORD2; +}; + +struct HazeVS +{ + float4 posH : POSITION0; + float4 color : TEXCOORD0; + float2 tex0 : TEXCOORD1; +}; + +struct BShadowVS +{ + float4 posH : POSITION0; + float2 dstW : TEXCOORD0; + float alpha : TEXCOORD1; +}; + +// ---------------------------------------------------------------------------- +// Texture Sampler implementations +// ---------------------------------------------------------------------------- + +sampler IrradS = sampler_state // Irradiance map sampler +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler ShadowS = sampler_state // Shadow map sampler +{ + Texture = ; + MinFilter = POINT; + MagFilter = POINT; + MipFilter = POINT; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler WrapS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler ClampS = sampler_state // Base tile sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler SpecS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler EmisS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler ReflS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler MetlS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler HeatS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler RghnS = sampler_state // Primary Mesh texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler TranslS = sampler_state // Translucence texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; +sampler TransmS = sampler_state // Transmittance texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler Tex1S = sampler_state // Secundary mesh texture sampler (i.e. night texture) +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler Nrm0S = sampler_state // Normal Map Sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler MFDSamp = sampler_state // Virtual Cockpit MFD screen sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Panel0S = sampler_state // Sampler for mesh based panels, Panel MFDs. Must be compatible with Non-power of two conditional due to MFD screens. +{ + Texture = ; + MinFilter = POINT; + MagFilter = LINEAR; + MipFilter = NONE; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler SimpleS = sampler_state // Sampler used for SimpleTech. (Star, VC HUD) +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = CLAMP; // Modified for RC29 to fix the line issue in top-right corner + AddressV = CLAMP; +}; + +sampler ExhaustS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = NONE; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler RingS = sampler_state // Planetary rings sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler EnvMapAS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; + AddressW = CLAMP; +}; + +sampler EnvMapBS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; + AddressW = CLAMP; +}; + + +// Planet surface samplers ---------------------------------------------------- + +sampler Planet0S = sampler_state // Planet/Cloud diffuse texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Planet1S = sampler_state // Planet nightlights/specular mask sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Planet3S = sampler_state // Planet/Cloud micro texture sampler +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = WRAP; + AddressV = WRAP; +}; + + + +// ---------------------------------------------------------------------------- +// Atmospheric Haze implementation +// +// att = attennuation, ins = inscatter, depth = pixel depth [0 to 1], +// posW = camera centric world space position of the vertex +// ---------------------------------------------------------------------------- + +void AtmosphericHaze(out float4 att, out float4 ins, in float depth, in float3 posW) +{ + if (gHazeMode==0) { + att = 1; + ins = 0; + return; + } + else if (gHazeMode==1) { + att = gAttennuate; + ins = gInScatter; + return; + } + else if (gHazeMode==2) { + float fogFact = 1.0f / exp(max(0,depth) * gFogDensity); + att = fogFact; + ins = half4((1.0f-fogFact) * gFogColor.rgb, 0.0f); + return; + } +} + + +// ---------------------------------------------------------------------------- +// Legacy sun color on planet surface. Used for planet surface, base tiles and +// buildings. See SurfaceLighting() in D3D9Util.cpp +// ---------------------------------------------------------------------------- + +void LegacySunColor(out float4 diff, out float ambi, out float nigh, in float3 normalW) +{ + float h = dot(-gSun.Dir, normalW); + float s = saturate((h+gSunAppRad)/(2.0f*gSunAppRad)); + float3 r0 = 1.0 - float3(0.65, 0.75, 1.0) * gDispersion; + + if (gDispersion!=0) { // case 1: planet has atmosphere + float3 di = (r0 + (1.0-r0) * saturate(h*5.780)) * s; + float ni = (h+0.242)*2.924; + float am = saturate(max(gAmbient0*saturate(ni)-0.05, gGlobalAmb)); + + diff = float4(di*(1.0-am*0.5),1); + ambi = am; + nigh = saturate(-ni-0.2); + } + else { // case 2: planet has no atmosphere + diff = float4(r0*s, 1); + ambi = gGlobalAmb; + nigh = 0; + } +} + + + +// ---------------------------------------------------------------------------- +// Vertex shader implementations +// ---------------------------------------------------------------------------- + + +SimpleVS BasicVS(NTVERTEX vrt) +{ + SimpleVS outVS = (SimpleVS)0; + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + outVS.toCamW = -posW; + outVS.tex0 = vrt.tex0; + return outVS; +} + + + +// ---------------------------------------------------------------------------- +// PixelShader Implementations +// ---------------------------------------------------------------------------- + +float4 SimpleTechPS(SimpleVS frg) : COLOR +{ + return tex2D(SimpleS, frg.tex0); +} + +float4 PanelTechPS(SimpleVS frg) : COLOR +{ + float4 cTex = tex2D(SimpleS, frg.tex0); + return float4(cTex.rgb, cTex.a*gMix); +} + +float4 PanelTechBPS(SimpleVS frg) : COLOR +{ + float4 cTex = tex2D(Panel0S, frg.tex0); + return float4(cTex.rgb, cTex.a*gMix); +} + +float4 ExhaustTechPS(SimpleVS frg) : COLOR +{ + float4 c = tex2D(ExhaustS, frg.tex0); + return float4(c.rgb, c.a*gMix); +} + +float4 SpotTechPS(SimpleVS frg) : COLOR +{ + return (tex2D(SimpleS, frg.tex0) * gColor) * gMix; +} + +#include "Particle.fx" +#include "Mesh.fx" +#include "Vessel.fx" +#include "HorizonHaze.fx" +#include "Planet.fx" +#include "BeaconArray.fx" + + +BShadowVS ArrowTechVS(float3 posL : POSITION0) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + float3 posW = mul(float4(posL, 1.0f), gW).xyz; // Apply world transformation matrix + outVS.posH = mul(float4(posW, 1.0f), gVP); // Apply view projection matrix + return outVS; +} + +float4 ArrowTechPS(BShadowVS frg) : COLOR +{ + return gColor; +} + + +// This is used for rendering grapple points ---------------------------------- +// +technique ArrowTech +{ + pass P0 + { + vertexShader = compile vs_3_0 ArrowTechVS(); + pixelShader = compile ps_3_0 ArrowTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + ZEnable = true; + } +} + + +// This is used for many simple renderings ------------------------------------ +// +technique SimpleTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BasicVS(); + pixelShader = compile ps_3_0 SimpleTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} + +// This is used for 2DPanel and Glass cockpit --------------------------------- +// +technique PanelTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BasicVS(); + pixelShader = compile ps_3_0 PanelTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} + +technique PanelTechB +{ + pass P0 + { + vertexShader = compile vs_3_0 BasicVS(); + pixelShader = compile ps_3_0 PanelTechBPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} + + +// Thil will render exhaust textures ------------------------------------------ +// +technique ExhaustTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BasicVS(); + pixelShader = compile ps_3_0 ExhaustTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + ZEnable = true; + } +} + +// This is used for rendering beacons ----------------------------------------- +// +technique SpotTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BasicVS(); + pixelShader = compile ps_3_0 SpotTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + ZEnable = true; + } +} diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/EnvMapBlur.hlsl b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/EnvMapBlur.hlsl new file mode 100644 index 0000000000..899bcceddd --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/EnvMapBlur.hlsl @@ -0,0 +1,41 @@ + +uniform extern float3 vDir; +uniform extern float3 vUp; +uniform extern float3 vCp; +uniform extern float fD; +uniform extern bool bDir; + +sampler tCube; +sampler tSrc; + +static float coeff[8] = { 0.13298076, 0.125794409, 0.106482669, 0.080656908, 0.054670025, 0.033159046, 0.017996989, 0.00874063 }; + +float4 PSBlur(float x : TEXCOORD0, float y : TEXCOORD1) : COLOR +{ + x = x * 2.0f - 1.0f; + y = y * 2.0f - 1.0f; + + float3 vD; + + float3 dir = vDir - vUp*y + vCp*x; + + if (bDir) vD = cross(dir, vCp); + else vD = cross(dir, vUp); + + vD = normalize(vD) * fD; + + float3 color = texCUBE(tCube, dir).rgb; + float3 vX = 0; + float f = 0.75f; + float a = 0.5f; + + for (int i = 1; i < 16; i++) { + vX += vD; + color += f * texCUBE(tCube, dir + vX).rgb; + color += f * texCUBE(tCube, dir - vX).rgb; + a += f; + f *= 0.75f; + } + color /= (a*2.0f); + return float4(color, 1); +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/GDIOverlay.hlsl b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/GDIOverlay.hlsl new file mode 100644 index 0000000000..25457d5ae3 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/GDIOverlay.hlsl @@ -0,0 +1,18 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2016 Jarmo Nikkanen +// ============================================================== + +uniform extern float4 vColorKey; +sampler tSrc; + +#define tol 0.02 + +float4 PSMain(float x : TEXCOORD0, float y : TEXCOORD1) : COLOR +{ + float3 vClr = tex2D(tSrc, float2(x, y)).rgb; + float3 c = abs(vClr - vColorKey.rgb); + if (c.r 1.0? hsv.r-1.0 : hsv.r; + + return HSVtoRGB(hsv); +} + +float3 CLUT(float3 color) +{ + float2 CLut_pSize = 1 / CLUT_SIZE; + + float3 c = saturate(color); + c.b *= 15; + float3 clut_uv = 0; + clut_uv.z = floor(c.b); + clut_uv.xy = c.rg*15*CLut_pSize+0.5*CLut_pSize; + clut_uv.x += clut_uv.z * CLut_pSize.y; + + return lerp( tex2D(tCLUT, clut_uv.xy).rgb, tex2D(tCLUT, clut_uv.xy + float2(CLut_pSize.y, 0)).rgb, c.b - clut_uv.z); +} + +// Renders the main light glare, along with added streaks +float glare(float2 uv, float2 pos, float size, float streakCount, float streakMix) +{ + float2 p = uv-pos; + + float angle = atan2(p.y, p.x); + float dist = length(p); + + float bright = size-pow(dist, 0.1)*size; + float streak = pow(sin(angle*streakCount*0.5), 2.0)*size; + + return max(0.0, bright*6.0 + streak*0.32*saturate(streakMix)); +} + +// Render circular blobs, colors dissociate and separate with distance of the light form the center +float flare (float2 uv, float2 pos, float dist, float size) +{ + return max(0.01 - pow(length(uv+dist*pos), 10.0*size), 0.0)*6.0; +} +float3 flare(float2 uv, float2 pos, float dist, float size, float barrel, float3 color) +{ + pos = GetDistOffset(uv, pos, barrel); + + float r = flare(uv, pos, dist-0.02, size); + float g = flare(uv, pos, dist , size); + float b = flare(uv, pos, dist+0.02, size); + + return max(0.0, color*float3(r,g,b)); +} + +// Renders an arc lined with the light source and the center of screen (dist only changes the side the ring is rendered) +float3 ring(float2 uv, float2 pos) +{ + float2 uvd = uv*length(uv); + float3 col = 0; + col.r = max(0.0, pow(abs(1.0-pow(length(uvd*0.90), 4.0)) * length(uvd), 3.5)); + col.g = max(0.0, pow(abs(1.0-pow(length(uvd*0.95), 4.0)) * length(uvd), 3.2)); + col.b = max(0.0, pow(abs(1.0-pow(length(uvd*1.00), 4.0)) * length(uvd), 3.0)); + + float s = max(0.0, 1.0/(1.0 + 32.0 * pow(length(uvd+pos), 4.0))); + + return col * s*4.0; +} + +float3 LensFlare_Exterior(float2 uv, float2 pos, float brightness, float size, float3 color) +{ + // Here you can customize your lens flare. + // The glare should only appear one and is the star at the position of the light. + // The flare is the round artifact that appear along the light-center axis. + // The orb is a collection of flares in a particular arrangement that kinda looks like a caustic. + // The ring is a wide arc. + // + // The "uv" and "pos" variables are mandatory in the drawing of the lens flare and should always be put first and in this order. + // Next argument is the distance of the artifact. -1.0 is at the light source position, 0.0 is at the center, and 1.0 at the opposite of the light source. + // Then comes the size. Please make it a multiple of "size" so that is responds to the global size (use a constant if you want the artifact not to scale). + // Finally is the color of the flare. use it like this: float3(red, green, blue). + float3 f = flare(uv, pos, 1, size, 1.0, float3(0.1, 1.0, 0.5)*color)*3.0; + + f += flare(uv,pos, -3, 3*size, 0.1, float3(0.4, 0.6, 1.0)*complementary(color)); + + f += flare(uv,pos, -0.5, size, 0.6, float3(0.8, 0.3, 0.9)*complementary(color))*1.5; + f += flare(uv,pos, -0.2, size*0.6, 1.0, float3(1.0, 0.6, 0.8)*color); + f += flare(uv,pos, 0.1, size*0.5, 0.8, float3(0.3, 0.6, 0.5)*color)*1.5; + f += flare(uv,pos, 0.6, size, 0.5, float3(0.6, 0.3, 0.2)*complementary(color))*2.0; + + float3 c = glare(uv,pos, pow(max(1.0, length(pos)), 2.0)*size, 8.0, 0.5)*color; + c += f*(1.0-pow(saturate(length(pos)*0.50), 2.0)); + + c += ring(uv, pos)*1.5*size*color; + + return c*brightness; +} + +float3 LensFlare_Cockpit(float2 uv, float2 pos, float brightness, float size, float3 color) +{ + float3 c = glare(uv, pos, size, 16.0, 0.2)*color; + + return c*brightness; +} + +float3 Screen(float3 a, float3 b) +{ + return 1 - (1-saturate(a))*(1-saturate(b)); +} + +float4 PSMain(float x : TEXCOORD0, float y : TEXCOORD1) : COLOR +{ + float3 orig = tex2D(tBack, float2(x, y)).rgb; + float3 flare = (float3)0; + + if (sunParams.visible) + { + float2 uv = float2(x,y) - 0.5; + uv.x *= vResolution.x / vResolution.y; // Aspect ratio correction + uv.y = -uv.y; + + flare = bCockpitCamera? + LensFlare_Cockpit (uv, sunParams.position, sunParams.brightness*sunParams.color.a, 0.4/(fSize), sunParams.color.rgb)*1.414 : + LensFlare_Exterior(uv, sunParams.position, sunParams.brightness*sunParams.color.a, 0.4/(fSize), sunParams.color.rgb)*1.414; + } + + //float3 color = pow(max(0.0, Screen(orig, flare)), 2.2); + float3 color = Screen(orig, pow(saturate(flare), 2.2)); + //color = CLUT(color); + return float4(color, 1.0); +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/LightBlur.hlsl b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/LightBlur.hlsl new file mode 100644 index 0000000000..acb5433fa6 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/LightBlur.hlsl @@ -0,0 +1,145 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2016 Jarmo Nikkanen +// 2016 SolarLiner (Nathan Graule) +// ============================================================== + +// Shader configurations ----------------------------------------------- +// +//#define fGlowIntensity 0.1 // Overal glow brightness multiplier +#define radius 20 // Radius of the glow +#define rate 0.7 // glow "linearity" [0.7 to 0.95] +#define fMinThreshold 1.1 // Glow starts to appear when back buffer intensity reaches this level +#define fMaxThreshold 2.5 // Glow reaches it's maximum intensity when backbuffer goes above this level + + +// Orher configurations ------------------------------------------------ +// +#define fSunIntensity 3.14 // Sunlight intensity +#define fInvSunIntensity (1.0/fSunIntensity) + +// --------------------------------------------------------------------- +// Client configuration parameters +// +#define BufferDivider 2 // Blur buffer size in pixels = ScreenSize / BufferDivider +#define PassCount 1 // Number of "bBlur" passes +#define BufferFormat 1 // Render buffer format, 2=RGB10A2, 1 = RGBA_16F, 0=DEFAULT (RGBX8) +// --------------------------------------------------------------------- + +uniform extern float fIntensity; +uniform extern float fDistance; +uniform extern float fThreshold; +uniform extern float fGamma; +uniform extern float2 vSB; +uniform extern float2 vBB; +uniform extern bool bDir; +uniform extern bool bBlur; +uniform extern bool bBlendIn; +uniform extern bool bSample; + +uniform extern int PassId; // NOTE: CANNOT be used to toggle code section on and off efficiently, any code effected by PassId must be minimized + +sampler tBack; +sampler tBlur; +sampler tCLUT; // 2D D3D9Clut.dds texture +sampler tTone; // 4x4 mipmap of backbuffer + + +static const float3 cMult = { 3.0f, 1.0f, 5.0f }; + +float Desaturate (float3 color) +{ + return dot(color, float3(0.2, 0.7, 0.1) ); +} + + + +float3 HDRtoLDR(float3 hdr) +{ + float3 h2 = hdr*hdr; + return hdr * pow(max(0, 1.0f + h2*h2), -0.25); +} + + +float4 PSMain(float x : TEXCOORD0, float y : TEXCOORD1) : COLOR +{ + float2 vPos = float2(x,y); + + float2 vX = float2(vSB.x, 0); // Delta between two pixels in a "glow" buffer + float2 vY = float2(0, vSB.y); + + float2 sX = float2(vBB.x, 0); // Delta between two pixels in backbuffer + float2 sY = float2(0, vBB.y); + + float3 color = 0; + + + // Sample a backbuffer into a glow buffer -------------------------------- + // + if (bSample) { + float3 res = tex2D(tBack, vPos).rgb; + //res += tex2D(tBack, vPos + sX).rgb; + //res += tex2D(tBack, vPos + sY).rgb; + //res += tex2D(tBack, vPos + sX + sY).rgb; + //res *= 0.25f; + float s = Desaturate(res); + res *= smoothstep(fThreshold, fThreshold*1.5f, s) * 3.0f * rsqrt(1.0f + s*s); + return float4(abs(res), 1); + } + + + // Construct a glow gradient --------------------------------------------- + // + if (bBlur) { + + if (bDir) vX = vY; + + float2 pos = vPos; + float f = 1.0f; + float d = 1.0f; + + color += tex2D(tBlur, pos).rgb; + + for (int i = 1; i0) return float4(color.rgb*0.35f*sh, color.a); + return float4(color.rgb*sh, color.a); +} + +float4 RingTech2PS(MeshVS frg) : COLOR +{ + float3 pp = gCameraPos*gRadius[2] - frg.CamW*gDistScale; + float dpp = dot(pp,pp); + float len = sqrt(dpp); + + len = saturate(smoothstep(gTexOff.x, gTexOff.y, len)); + + float4 color = tex2D(RingS, float2(len, 0.5)); + color.a = color.r*0.75; + + float da = dot(normalize(pp), gSun.Dir); + float r = sqrt(dpp*(1.0-da*da)); + + float sh = max(0.05, smoothstep(gRadius[0], gRadius[1], r)); + + if (da<0) sh = 1.0f; + + color.rgb *= sh; + + if ((dot(frg.nrmW, frg.CamW)*dot(frg.nrmW, gSun.Dir))>0) return float4(color.rgb*0.35f, color.a); + return float4(color.rgb, color.a); +} + + +// ============================================================================ +// Base Tile Rendering Technique +// ============================================================================ + +TileMeshVS BaseTileVS(NTVERTEX vrt) +{ + // Null the output + TileMeshVS outVS = (TileMeshVS)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + outVS.tex0 = vrt.tex0; + outVS.CamW = -posW; + + // Atmospheric haze ------------------------------------------------------- + + AtmosphericHaze(outVS.atten, outVS.insca, outVS.posH.z, posW); + + float4 diffuse; + float ambi, nigh; + + LegacySunColor(diffuse, ambi, nigh, outVS.nrmW); + + outVS.insca *= (diffuse+ambi); + outVS.insca.a = nigh; + + return outVS; +} + + +float4 BaseTilePS(TileMeshVS frg) : COLOR +{ + // Normalize input + float3 nrmW = normalize(frg.nrmW); + float3 CamW = normalize(frg.CamW); + + float4 cTex = tex2D(ClampS, frg.tex0); + + float3 r = reflect(gSun.Dir, nrmW); + float s = pow(saturate(dot(r, CamW)), 20.0f) * (1.0f-cTex.a); + float d = saturate(dot(-gSun.Dir, nrmW)); + + if (d<=0) s = 0; + + float3 clr = cTex.rgb * saturate(d * gSun.Color + s * gSun.Color + gSun.Ambient); + + if (gNight) clr += tex2D(Tex1S, frg.tex0).rgb; + + return float4(clr.rgb*frg.atten.rgb+frg.insca.rgb, cTex.a); + //return float4(clr.rgb*frg.atten.rgb+frg.insca.rgb, cTex.a*(1-frg.insca.a)); // Make basetiles transparent during night +} + + +// ============================================================================ +// Vessel Axis vector technique +// ============================================================================ + +MeshVS AxisTechVS(MESH_VERTEX vrt) +{ + // Zero output. + MeshVS outVS = (MeshVS)0; + float stretch = vrt.tex0.x * gMix; + float3 posX = vrt.posL + float3(0.0, stretch, 0.0); + float3 posW = mul(float4(posX, 1.0f), gW).xyz; // Apply world transformation matrix + outVS.posH = mul(float4(posW, 1.0f), gVP); + float3 nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; // Apply world transformation matrix + + outVS.nrmW = normalize(nrmW); + outVS.CamW = -posW; + + return outVS; +} + + +float4 AxisTechPS(MeshVS frg) : COLOR +{ + float3 nrmW = normalize(frg.nrmW); + float d = saturate(dot(-gSun.Dir, nrmW)); + float3 clr = gColor.rgb * saturate(max(d,0) + 0.5); + return float4(clr, gColor.a); +} + +technique AxisTech +{ + pass P0 + { + vertexShader = compile vs_3_0 AxisTechVS(); + pixelShader = compile ps_3_0 AxisTechPS(); + + AlphaBlendEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = true; + ZWriteEnable = true; + } +} + + + +// ============================================================================ +// Mesh Shadow Technique +// ============================================================================ + +BShadowVS ShadowMeshTechVS(SHADOW_VERTEX vrt) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + float3 posW = mul(float4(vrt.posL.xyz, 1.0f), gW).xyz; + outVS.alpha = dot(vrt.posL.xyz, gInScatter.xyz) + gInScatter.w; + //outVS.alpha = vrt.posL.y + gInScatter.w; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.dstW = outVS.posH.zw; + return outVS; +} + +BShadowVS ShadowMeshTechExVS(SHADOW_VERTEX vrt) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + outVS.alpha = dot(vrt.posL.xyz, gColor.xyz) + gColor.w; + //float d = dot(vrt.posL.xyz,vrt.posL.xyz); + float3 posX = mul(float4(vrt.posL.xyz, 1.0f), gGrpT).xyz; + float3 posW = mul(float4(posX, 1.0f), gW).xyz; + //float3 posW = mul(float4(posX-gColor.xyz*(gTexOff.x*d+gTexOff.y*d*d), 1.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.dstW = outVS.posH.zw; + return outVS; +} + +float4 ShadowTechPS(BShadowVS frg) : COLOR +{ + if (frg.alpha < 0) clip(-1); + return float4(0.0f, 0.0f, 0.0f, (1.0f-gMix)); +} + +// ----------------------------------------------------------------------------------- + +BShadowVS ShadowMapVS(SHADOW_VERTEX vrt) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + float3 posW = mul(float4(vrt.posL.xyz, 1.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gLVP); + outVS.dstW = outVS.posH.zw; + return outVS; +} + +float4 ShadowMapPS(BShadowVS frg) : COLOR +{ + return 1 - (frg.dstW.x / frg.dstW.y); +} + +// ----------------------------------------------------------------------------------- + +technique GeometryTech +{ + pass P0 + { + vertexShader = compile vs_3_0 ShadowMapVS(); + pixelShader = compile ps_3_0 ShadowMapPS(); + + AlphaBlendEnable = false; + ZEnable = true; + ZWriteEnable = true; + StencilEnable = false; + } +} + +technique ShadowTech +{ + pass P0 + { + vertexShader = compile vs_3_0 ShadowMeshTechVS(); + pixelShader = compile ps_3_0 ShadowTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + + StencilEnable = true; + StencilRef = 1; + StencilMask = 1; + StencilFunc = NotEqual; + StencilPass = Replace; + } + + pass P1 + { + vertexShader = compile vs_3_0 ShadowMeshTechExVS(); + pixelShader = compile ps_3_0 ShadowTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + + StencilEnable = true; + StencilRef = 1; + StencilMask = 1; + StencilFunc = NotEqual; + StencilPass = Replace; + } +} + + + +// ============================================================================= +// Mesh Bounding Box Technique +// ============================================================================= + +BShadowVS BoundingBoxVS(float3 posL : POSITION0) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + float3 pos; + pos.x = gAttennuate.x * posL.x + gInScatter.x * (1-posL.x); + pos.y = gAttennuate.y * posL.y + gInScatter.y * (1-posL.y); + pos.z = gAttennuate.z * posL.z + gInScatter.z * (1-posL.z); + + float3 posX = mul(float4(pos, 1.0f), gGrpT).xyz; // Apply meshgroup specific transformation + float3 posW = mul(float4(posX, 1.0f), gW).xyz; // Apply world transformation matrix + outVS.posH = mul(float4(posW, 1.0f), gVP); + return outVS; +} + +BShadowVS BoundingSphereVS(float3 posL : POSITION0) +{ + // Zero output. + BShadowVS outVS = (BShadowVS)0; + float3 posW = mul(float4(posL, 1.0f), gW).xyz; // Apply world transformation matrix + outVS.posH = mul(float4(posW, 1.0f), gVP); + return outVS; +} + +float4 BoundingBoxPS(BShadowVS frg) : COLOR +{ + return gColor; +} + +technique TileBoxTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BoundingSphereVS(); + pixelShader = compile ps_3_0 BoundingBoxPS(); + + AlphaBlendEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = true; + ZWriteEnable = true; + } +} + +technique BoundingBoxTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BoundingBoxVS(); + pixelShader = compile ps_3_0 BoundingBoxPS(); + + AlphaBlendEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = true; + ZWriteEnable = true; + } +} + +technique BoundingSphereTech +{ + pass P0 + { + vertexShader = compile vs_3_0 BoundingSphereVS(); + pixelShader = compile ps_3_0 BoundingBoxPS(); + + AlphaBlendEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = true; + ZWriteEnable = true; + } +} + + +technique BaseTileTech +{ + /*pass P0 + { + vertexShader = compile VS_MOD BaseTileNMVS(); + pixelShader = compile PS_MOD BaseTileNMPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + CullMode = CCW; + }*/ + + pass P0 + { + vertexShader = compile vs_3_0 BaseTileVS(); + pixelShader = compile ps_3_0 BaseTilePS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + CullMode = CCW; + } +} + +technique RingTech +{ + pass P0 + { + vertexShader = compile vs_3_0 TinyMeshTechVS(); + pixelShader = compile ps_3_0 RingTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + ZEnable = false; + CullMode = NONE; + } +} + +technique RingTech2 +{ + pass P0 + { + vertexShader = compile vs_3_0 TinyMeshTechVS(); + pixelShader = compile ps_3_0 RingTech2PS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + ZEnable = false; + CullMode = NONE; + } +} + +technique SimplifiedTech +{ + pass P0 + { + vertexShader = compile vs_3_0 TinyMeshTechVS(); + pixelShader = compile ps_3_0 TinyMeshTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + ZEnable = true; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Metalness.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Metalness.fx new file mode 100644 index 0000000000..7e6b8f5f7c --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Metalness.fx @@ -0,0 +1,381 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// ============================================================== + +#define eps 0.001f + +// ============================================================================ +// Vertex shader for physics based rendering +// +PBRData MetalnessVS(MESH_VERTEX vrt) +{ + // Zero output. + PBRData outVS = (PBRData)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + +#if SHDMAP > 0 + outVS.shdH = mul(float4(posW, 1.0f), gLVP); +#endif + + outVS.nrmW = nrmW; + outVS.tanW = float4(mul(float4(vrt.tanL, 0.0f), gW).xyz, vrt.tex0.z); + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.camW = -posW; + outVS.tex0 = vrt.tex0.xy; + + return outVS; +} + + +// ============================================================================ +// +float BeckmanNDF(float dHN, float rgh) +{ + float r2 = rgh*rgh; + float dHN2 = dHN*dHN; + float2 w = rcp(float2(3.14f * r2 * dHN2*dHN2, r2*dHN2)); + return w.x * exp((dHN2 - 1.0f) * w.y); +} + +// ============================================================================ +// +float GGX_NDF(float dHN, float rgh) +{ + float r2 = rgh*rgh; + float dHN2 = dHN*dHN; + float d = (r2 * dHN2) + (1.0f - dHN2); + return r2 / (3.14f * d * d); +} + + +// ============================================================================ +// +float SchlickBeckmanGSF(float dLN, float dCN, float rgh) // pre-devided by dLN * dCN +{ + float2 dots = clamp(float2(dLN, dCN), eps, 1.0f); // Avoid div-by-zero + float r2 = rgh * rgh; + float2 e; e.xy = (1.0f - r2); + float2 w = rcp((dots * e) + r2); + return w.x*w.y; +} + + +// ============================================================================ +// +float DiffuseRetroReflectance(float dLN, float dCN, float dLH, float rgh, float mtl) +{ + float2 q = (1.0f-float2(dLN, dCN)); q *= q*q; + float z = 0.5f + 1.6f * dLH*dLH * rgh; + return ((1.0f - q.x) + z*q.x) * ((1.0f - q.y) + z*q.y); +} + + +// ============================================================================ +// +float3 LightFX(float3 c) +{ + float q = cmax(c); + return c * rsqrt(2 + q*q) * 1.8f; +} + +// ============================================================================ +// +float3 LightFXSq(float3 c) +{ + c = sqrt(c); + float q = cmax(c); + return c * rsqrt(2 + q*q) * 1.8f; +} + + +// ============================================================================ +// +void SampleEnvMap(out float3 cE, float dCN, float fRgh, float fMetal, float3 rflW, float3 nrmW) +{ + // Sharpen reflection at low angles + fRgh = saturate(fRgh - 0.1f); + float fLOD = fRgh * lerp(dCN * 2.0f, (0.2f + dCN*0.8f) * 2.5f, fMetal); // Compute LOD level for blur effect + + fLOD *= 5.0f * rsqrt(1.0f + fLOD*fLOD); + + cE = texCUBElod(EnvMapAS, float4(rflW, fLOD)).rgb; +} + + +// ============================================================================ +// +void Transmittance(in out float4 cDiff, float uLN, float uLC, float2 uv, float3 cSun) +{ + float4 cTransm = float4(cDiff.rgb, 1.0f); + float3 cTransl = cDiff.rgb; + + if (gCfg.Transm) { + cTransm = tex2D(TransmS, uv); + cTransm.a *= 1024.0f; + } + + if (gCfg.Transl) cTransl = tex2D(TranslS, uv).rgb; + + float sunLightFromBehind = saturate(-uLN); + float sunSpotFromBehind = saturate(pow(saturate(-uLC), cTransm.a) * 3.0); // "3.0" Causes the transmittance (sun spot) effect to fall off at very shallow angles + + cDiff.rgb += (1.0f - cDiff.rgb) * cTransl.rgb * saturate(cSun * sunLightFromBehind); + cDiff.rgb += cTransm.rgb * (sunSpotFromBehind * cSun); +} + + +// ============================================================================ +// A Shader for a typical "Metalness" PBR workflow. +// ============================================================================ + +float4 MetalnessPS(float4 sc : VPOS, PBRData frg) : COLOR +{ + float3 nrmT; + float3 nrmW; + float3 cEmis; + float4 cSpecularMap; // Added + float4 cDiff; + float fHeat; + float fSmth, fMetal; + float3 cDiffLocal; + float3 cSpecLocal; + + // ====================================================================== + // Start fetching texture data + // ====================================================================== + + if (gTextured) cDiff = tex2D(WrapS, frg.tex0.xy); + else cDiff = 1; + + // Fetch a normal map + // + if (gCfg.Norm) nrmT = tex2D(Nrm0S, frg.tex0.xy).rgb; + + // Fetch Smoothness map (i.e. *_rghn.dds) + // + if (gCfg.Rghn) fSmth = tex2D(RghnS, frg.tex0.xy).g; + else fSmth = 1.0f; + + // Fetch Roughness map + // + if (gCfg.Metl) fMetal = tex2D(MetlS, frg.tex0.xy).g; + else fMetal = gMtrl.metalness; + + // Sample emission map. (Note: Emissive materials and textures need to go different stages, material is added to light) + // + if (gCfg.Emis) cEmis = tex2D(EmisS, frg.tex0.xy).rgb; + else cEmis = 0; + + // Sample specular map // Added + // // Added + if (gCfg.Spec) cSpecularMap = tex2D(SpecS, frg.tex0.xy).rgba; // Added + + // Fetch Heat map + // + if (gCfg.Heat) fHeat = saturate((tex2D(HeatS, frg.tex0.xy).g) - 1.0f + (gMtrl.specialfx.x * gMtrl.specialfx.x * gMtrl.specialfx.x)); + else fHeat = (gMtrl.specialfx.x * gMtrl.specialfx.x * gMtrl.specialfx.x); + + // ---------------------------------------------------------------------- + // Now do other calculations while textures are being fetched + // ---------------------------------------------------------------------- + + float3 camW = normalize(frg.camW); + float3 cSun = gSun.Color * lerp(float3(1.1, 1.1, 0.9), float3(1,1,1), saturate(gRadius[3]*2e-5)); + + + // ====================================================================== + // Construct a proper world space normal + // ====================================================================== + + float3 tanW = frg.tanW.xyz; + float3 bitW = cross(tanW, frg.nrmW) * frg.tanW.w; + + if (gCfg.Norm) { + nrmT.rg = nrmT.rg * 2.0f - 1.0f; + nrmW = frg.nrmW*nrmT.z + tanW*nrmT.x + bitW*nrmT.y; + } + else nrmW = frg.nrmW; + + nrmW = normalize(nrmW); + + + + // ====================================================================== + // Typical compatibility requirements + // ====================================================================== + + if (gNoColor) cDiff.rgb = 1; + cDiff = saturate(cDiff * float4(gMtrl.diffuse.rgb, gMtrlAlpha)); + + + // ====================================================================== + // Some Precomputations + // ====================================================================== + + float3 sunW = -gSun.Dir; + float3 cEnv = 0; + + float3 rflW = reflect(-camW, nrmW); + float3 hlvW = normalize(camW + sunW); + + // Dot Products + float uLN = dot(sunW, nrmW); + float uLC = dot(sunW, camW); + float dLN = saturate(uLN); + float dLH = saturate(dot(sunW, hlvW)); + float dCN = saturate(dot(camW, nrmW)); + float dHN = saturate(dot(hlvW, nrmW)); + + // Apply a proper curve to a texture data, modulate with material value and clamp + fSmth = pow(abs(fSmth), gMtrl.roughness.y) * gMtrl.roughness.x; + + // Apply fresnel and Fresnell cut-off to fSmth + fSmth = fSmth + ((1.0f - fSmth) * pow(abs(1.0f - dCN), 4.0f)) * pow(abs(fSmth), 0.5f); + + float fRgh = saturate(1.0f - fSmth); + float fRgh3 = fRgh*fRgh*fRgh; + + + // ====================================================================== + // Compute Local Light Sources + // ====================================================================== + + LocalLightsEx(cDiffLocal, cSpecLocal, nrmW, -frg.camW, fRgh3, true); + + +#if defined(_ENVMAP) + + if (gEnvMapEnable) { + + // ====================================================================== + // Sample Env Map + SampleEnvMap(cEnv, dCN, fRgh, fMetal, rflW, nrmW); + } + + // ====================================================================== + // Sample Irradiance Map + float3 cAmbient = Paraboloidal_LVLH(IrradS, nrmW).rgb; + cAmbient *= cAmbient; + + //cAmbient = saturate(cAmbient * (1.0f + 15.0f * gNightTime)); + // Apply base ambient light + cAmbient = max(cAmbient, gSun.Ambient); +#else + + // ====================================================================== + // Compute Earth glow + float angl = saturate((-dot(gCameraPos, nrmW) - gProxySize) * gInvProxySize); + float3 cAmbient = gAtmColor.rgb * max(0, angl * gGlowConst) + gSun.Ambient; +#endif + + + cAmbient *= (1.0f - fMetal); // No ambient for metals + + + // ====================================================================== + // Add vessel self-shadows + // ====================================================================== +#if SHDMAP > 0 + cSun *= smoothstep(0, 0.72, ComputeShadow(frg.shdH, dLN, sc)); +#endif + + + // ====================================================================== + // Main shader core MetalnessPS + // ====================================================================== + float fD = GGX_NDF(dHN, lerp(0.01f, 1.0f, fRgh3)); + float fG = SchlickBeckmanGSF(dLN, dCN, fRgh); + float fR = DiffuseRetroReflectance(dLN, dCN, dLH, fRgh, fMetal); + + float3 cS2 = 0; // Added + float3 cSpec2 = 0; // Added + + // Base material color for reflections. Use cDiff for metals and very rough plastics, white for the rest. + // cDiff for rough plastics is to avoid washed-out(white) look of black and rough parts. + float3 cSpec = lerp(cDiff.rgb, float3(1, 1, 1), (1.0f - fMetal) * (1.0f - fRgh3)); + + // Fresnel power 2.5 for glossy, 5.0 for rough + float fFrs = pow(1.0f - dCN, fRgh*2.5 + 2.5f); + + // Fresnel cut-off below X of fSmth + fFrs *= saturate(0.3f - fRgh*fRgh) * 3.3f; + + // Assume that plastics absorve 50-90% of specular light + float fP = lerp(0.1f + (1.0f - fRgh)*0.4f, 1.0f, fMetal); + + + // ====================================================================== // Start of Added section + // Add multilayer texture effect + // ====================================================================== + if (gCfg.Spec) { + cSpec2 = cSpecularMap.rgb; + cSpecularMap.a = 1.0f - cSpecularMap.a; // use this + // cSpecularMap.a = 0.0f; + float fD2 = GGX_NDF(dHN, lerp(0.01f, 1.0f, cSpecularMap.a)); // makes the sun glint larger at full smoothness so that it doesn't disappear + + // Specular Color + cS2 = (fD2 * cSpec2 * fP) * cSpecularMap.a ; // (4.0f*dLN*dCN) removed to avoid division by zero, compensation in GSF + // cS2 = (fD2 * cSpec2 * fG * fP) * 0.25f; // (4.0f*dLN*dCN) removed to avoid division by zero, compensation in GSF + } // end of Added section + + // Fresnel color shift + float3 cF = cSpec + (1.0f - cSpec) * fFrs; + + // Specular Color + float3 cS = (fD * cF * fG * fP) * 0.25f; // (4.0f*dLN*dCN) removed to avoid division by zero, compensation in GSF + + + // How plastics reflect the environment + float R = 0.1f * fSmth; + float frP = R + (1.0f - R) * fFrs; + + float3 cE = (cEnv * cF * lerp(frP, 1.0f, fMetal)); + + // Attennuate diffuse color for Metals & Fresnel + float fA = (1.0f - fFrs) * (1.0f - fMetal); + + // Add a faint diffuse hue for rough metals. Rough metal doesn't look good if it's totally black + fA += fRgh * fMetal * 0.05f; + + float3 zD = cDiff.rgb * fA * LightFXSq(Sq(cSun * fR * dLN) + cDiffLocal + Sq(cAmbient) + Sq(gMtrl.emissive.rgb)); + + // Combine specular terms + // float3 zS = cS * (cSun * dLN) + cSpec * LightFX(cSpecLocal) * 0.5f; + float3 zS = cS * (cSun * dLN) + cSpec * LightFX(cSpecLocal) * 0.5f + cS2 * (cSun * dLN) + cSpec2 * LightFX(cSpecLocal) * 0.5f; // Modified + + cDiff.rgb = zD + zS + cE; + + // Override material alpha to make reflections visible + cDiff.a = saturate(cDiff.a + cmax(zS + cE)); + + + // ====================================================================== + // Add texture transmittance + // ====================================================================== + + if (gCfg.Transm || gCfg.Transl) Transmittance(cDiff, uLN, uLC, frg.tex0.xy, cSun); + + + + // Add emission texture to output, modulate with material + cDiff.rgb = max(cDiff.rgb, cEmis * gMtrl.emission2.rgb); + + // Add heat glow + //float3 cHeat = float3(pow(abs(fHeat), 0.5f), pow(abs(fHeat), 1.5f), pow(abs(fHeat), 8.0f)); + float3 cHeat = pow(abs(fHeat), float3(0.5f, 1.5f, 8.0f)); + cDiff.rgb = cDiff.rgb + cHeat; + +#if defined(_DEBUG) + cDiff = cDiff * (1.0f - gColor*0.5f) + gColor; +#endif + +#if defined(_LIGHTGLOW) + return cDiff; +#else + float3 h2 = cDiff.rgb*cDiff.rgb; + return float4(cDiff.rgb * pow(max(0, 1.0f + h2*h2), -0.25), cDiff.a); +#endif +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/PBR.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/PBR.fx new file mode 100644 index 0000000000..80bacc5969 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/PBR.fx @@ -0,0 +1,509 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2014 - 2018 Jarmo Nikkanen +// ============================================================== + + + + +struct PBRData +{ + float4 posH : POSITION0; + float3 camW : TEXCOORD0; + float2 tex0 : TEXCOORD1; + float3 nrmW : TEXCOORD2; + float4 tanW : TEXCOORD3; // Handiness in .w +#if SHDMAP > 0 + float4 shdH : TEXCOORD4; +#endif +}; + + + +// ======================================================================================================================== +// Vertex shader for physics based rendering +// +PBRData PBR_VS(MESH_VERTEX vrt) +{ + // Zero output. + PBRData outVS = (PBRData)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + + outVS.nrmW = nrmW; + outVS.tanW = float4(mul(float4(vrt.tanL, 0.0f), gW).xyz, vrt.tex0.z); + outVS.posH = mul(float4(posW, 1.0f), gVP); + +#if SHDMAP > 0 + outVS.shdH = mul(float4(posW, 1.0f), gLVP); +#endif + + outVS.camW = -posW; + outVS.tex0 = vrt.tex0.xy; + + return outVS; +} + + + + + + +// ============================================================================ +// +float4 PBR_PS(float4 sc : VPOS, PBRData frg) : COLOR +{ + float3 nrmT; + float3 nrmW; + float3 cEmis; + float3 cRefl, cRefl2, cRefl3; + float3 cFrsl = 1; + float4 cDiff; + float4 cSpec; + float4 sMask = float4(1.0f, 1.0f, 1.0f, 1024.0f); + float fRghn; + float3 cDiffLocal; + float3 cSpecLocal; + + + // ---------------------------------------------------------------------- + // Start fetching texture data + // ---------------------------------------------------------------------- + + if (gTextured) cDiff = tex2D(WrapS, frg.tex0.xy); + else cDiff = 1; + + + // Fetch a normal map + // + if (gCfg.Norm) nrmT = tex2D(Nrm0S, frg.tex0.xy).rgb; + + + // Sample specular map + if (gCfg.Spec) cSpec = tex2D(SpecS, frg.tex0.xy).rgba * sMask; + else cSpec = gMtrl.specular.rgba; + + + // Use _refl color for both + if (gCfg.Refl) cRefl = tex2D(ReflS, frg.tex0.xy).rgb; + else cRefl = gMtrl.reflect.rgb; + + + // Roughness map + if (gCfg.Rghn) fRghn = tex2D(RghnS, frg.tex0.xy).g; + else fRghn = gMtrl.roughness.r; + + + // Sample emission map. (Note: Emissive materials and textures need to go different stages, material is added to light) + if (gCfg.Emis) cEmis = tex2D(EmisS, frg.tex0.xy).rgb; + else cEmis = 0; + + + + // ---------------------------------------------------------------------- + // Now do other calculations while textures are being fetched + // ---------------------------------------------------------------------- + + float3 CamD = normalize(frg.camW); + float3 cSun = saturate(gSun.Color); + + + // ---------------------------------------------------------------------- + // Texture tuning controls for add-on developpers + // ---------------------------------------------------------------------- + +#if defined(_DEBUG) + if (gTuneEnabled) { + + nrmT *= gTune.Norm.rgb; + + cDiff.rgb = pow(abs(cDiff.rgb), gTune.Albe.a) * gTune.Albe.rgb; + cRefl.rgb = pow(abs(cRefl.rgb), gTune.Refl.a) * gTune.Refl.rgb; + cEmis.rgb = pow(abs(cEmis.rgb), gTune.Emis.a) * gTune.Emis.rgb; + fRghn = pow(abs(fRghn), gTune.Rghn.a) * gTune.Rghn.g; + cSpec.rgba = cSpec.rgba * gTune.Spec.rgba; + + cDiff = saturate(cDiff); + cRefl = saturate(cRefl); + fRghn = saturate(fRghn); + cSpec = min(cSpec, sMask); + } +#endif + + + // Use alpha zero to mask off specular reflections + cSpec.rgb *= saturate(cSpec.a); + + // ---------------------------------------------------------------------- + // "Legacy/PBR" switch + // ---------------------------------------------------------------------- + + if (gPBRSw) { + cRefl2 = cRefl*cRefl; + cRefl3 = cRefl2*cRefl; + cSpec.rgb = cRefl2; + cSpec.a = exp2(fRghn * 12.0f); // Compute specular power + } + else { + cRefl3 = cRefl2 = cRefl; + } + + float fRefl = cmax(cRefl3); + + + // ---------------------------------------------------------------------- + // cSpec.pwr to fRghn Converter + // ---------------------------------------------------------------------- + + if (gRghnSw) { + fRghn = log2(cSpec.a+1.0f) * 0.1f; + } + + + + + // ---------------------------------------------------------------------- + // Construct a proper world space normal + // ---------------------------------------------------------------------- + + if (gCfg.Norm) { + float3 bitW = cross(frg.tanW.xyz, frg.nrmW) * frg.tanW.w; + nrmT.rg = nrmT.rg * 2.0f - 1.0f; + nrmW = frg.nrmW*nrmT.z + frg.tanW.xyz*nrmT.x + bitW*nrmT.y; + } + else nrmW = frg.nrmW; + + nrmW = normalize(nrmW); + + + + // ---------------------------------------------------------------------- + // Compute reflection vector and some required dot products + // ---------------------------------------------------------------------- + + float3 RflW = reflect(-CamD, nrmW); // Reflection vector + float dRS = saturate(-dot(RflW, gSun.Dir)); // Reflection/sun angle + float dLN = saturate(-dot(gSun.Dir, nrmW)); // Diffuse lighting term + float dLNx = saturate(dLN * 80.0f); // Specular, Fresnel shadowing term + + + // ---------------------------------------------------------------------- + // Add vessel self-shadows + // ---------------------------------------------------------------------- + +#if SHDMAP > 0 + cSun *= smoothstep(0, 0.72, ComputeShadow(frg.shdH, dLN, sc)); +#endif + + + // ---------------------------------------------------------------------- + // Compute a fresnel terms fFrsl, iFrsl, fFLbe + // ---------------------------------------------------------------------- + + float fFrsl = 0; // Fresnel angle co-efficiency factor + float iFrsl = 0; // Fresnel intensity + float fFLbe = 0; // Fresnel lobe + +#if defined(_GLASS) + + if (gFresnel) { + + float dCN = saturate(dot(CamD, nrmW)); + + // Compute a fresnel term + fFrsl = pow(1.0f - dCN, gMtrl.fresnel.x); + + // Compute a specular lobe for fresnel reflection + fFLbe = pow(dRS, gMtrl.fresnel.z) * dLNx * any(cRefl); + + // Modulate with material + cFrsl *= gMtrl.fresnel.y; + + // Compute intensity term. Fresnel is always on a top of a multi-layer material + // therefore it remains strong and attennuates other properties to maintain energy conservation using (1.0 - iFrsl) + iFrsl = cmax(cFrsl) * fFrsl; + } +#endif + + + + + // ---------------------------------------------------------------------- + // Compute a specular and diffuse lighting + // ---------------------------------------------------------------------- + + // Compute a specular lobe for base material + float fLobe = pow(dRS, cSpec.a) * dLNx; + + + // ---------------------------------------------------------------------- + // Compute Local Light Sources + // ---------------------------------------------------------------------- + + LocalLightsEx(cDiffLocal, cSpecLocal, nrmW, -frg.camW, cSpec.a, false); + + + // ---------------------------------------------------------------------- + // Compute Earth glow + // ---------------------------------------------------------------------- + + float angl = saturate((-dot(gCameraPos, nrmW) - gProxySize) * gInvProxySize); + cDiffLocal += gAtmColor.rgb * max(0, angl*gGlowConst); + + // Bake material props and lights together + float3 diffBaked = Light_fx(gMtrl.diffuse.rgb * (dLN * cSun + cDiffLocal) + gMtrl.emissive.rgb + gMtrl.ambient.rgb*gSun.Ambient); + +#if LMODE > 0 + cSun = Light_fx(cSun + cSpecLocal); // Add local light sources +#endif + + // Special alpha only texture in use, set the .rgb to 1.0f + // Used for panel background lighting in Delta Glider + if (gNoColor) cDiff.rgb = 1; + + // ------------------------------------------------------------------------ + cDiff.rgb *= diffBaked; // Lit the texture + cDiff.a *= gMtrlAlpha; // Modulate material alpha + + + // ------------------------------------------------------------------------ + // Compute total reflected sun light from a material + // + float3 cBase = cSpec.rgb * (1.0f - iFrsl) * fLobe; + +#if defined(_GLASS) + cBase += cFrsl.rgb * fFrsl * fFLbe; +#endif + + cSpec.rgb = cSun * saturate(cBase); + + + + + + + + // ---------------------------------------------------------------------- + // Compute a environment reflections + // ---------------------------------------------------------------------- + + float3 cEnv = 0; + +#if defined(_ENVMAP) + + if (gEnvMapEnable) { + +#if defined(_GLASS) + + if (gFresnel) { + + // Compute LOD level for fresnel reflection + float fLOD = max(0, (10.0f - log2(gMtrl.fresnel.z))); + + // Always mirror clear reflection for low angles + fLOD *= (1.0f - fFrsl); + + // Fresnel based environment reflections + cEnv = (cFrsl * fFrsl) * texCUBElod(EnvMapAS, float4(RflW, fLOD)).rgb; + } +#endif + + // Compute LOD level for blur effect + float fLOD = (1.0f - fRghn) * 8.0f; + + // Add a metallic reflections from a base material + cEnv += cRefl3 * (1.0f-iFrsl) * texCUBElod(EnvMapAS, float4(RflW, fLOD)).rgb; + } + +#endif + + + + + // ---------------------------------------------------------------------- + // Combine all results together + // ---------------------------------------------------------------------- + + // Compute total reflected light + float fTot = cmax(cEnv + cSpec.rgb); + + // Attennuate diffuse surface beneath + cDiff.rgb *= (1.0f - fTot); + +#if defined(_ENVMAP) + // Attennuate diffuse surface beneath + cDiff.rgb *= (1.0f - fRefl); + +#if defined(_GLASS) + // Further attennuate diffuse surface beneath + cDiff.rgb *= (1.0f - iFrsl*iFrsl); // note: (1-iFrsl) goes black too quick +#endif +#endif + + // Re-compute output alpha for alpha blending stage + cDiff.a = saturate(cDiff.a + fTot); + + // Add reflections to output + cDiff.rgb += cEnv; + + // Add specular to output + cDiff.rgb += cSpec.rgb; + + // Add emission texture to output, modulate with material + cDiff.rgb = max(cDiff.rgb, cEmis * gMtrl.emission2.rgb); + +#if defined(_DEBUG) + //if (gDebugHL) cDiff = cDiff*0.5f + gColor; + cDiff = cDiff * (1 - gColor*0.5f) + gColor; +#endif + + return cDiff; +} + + + + + + + +// ============================================================================ +// Fast legacy Implementation no additional textures +// ============================================================================ + + +struct FASTData +{ + float4 posH : POSITION0; + float3 camW : TEXCOORD0; + float2 tex0 : TEXCOORD1; + float3 nrmW : TEXCOORD2; +#if SHDMAP > 0 + float4 shdH : TEXCOORD4; +#endif +}; + + +// ============================================================================ +// Vertex shader for physics based rendering +// +FASTData FAST_VS(MESH_VERTEX vrt) +{ + // Zero output. + FASTData outVS = (FASTData)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + + outVS.nrmW = nrmW; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.camW = -posW; + outVS.tex0 = vrt.tex0.xy; + +#if SHDMAP > 0 + outVS.shdH = mul(float4(posW, 1.0f), gLVP); +#endif + + return outVS; +} + + +// ============================================================================ +// +float4 FAST_PS(float4 sc : VPOS, FASTData frg) : COLOR +{ + + float3 cEmis; + float4 cDiff; + float3 cDiffLocal; + float3 cSpecLocal; + + // Start fetching texture data ------------------------------------------- + // + if (gTextured) cDiff = tex2D(WrapS, frg.tex0.xy); + else cDiff = 1; + + if (gFullyLit) { + if (gNoColor) cDiff.rgb = 1; + cDiff.rgb *= saturate(gMtrl.diffuse.rgb + gMtrl.emissive.rgb); + } + else { + + // Sample emission map. (Note: Emissive materials and textures need to go different stages, material is added to light) + if (gCfg.Emis) cEmis = tex2D(EmisS, frg.tex0.xy).rgb; + else cEmis = 0; + + float3 nrmW = normalize(frg.nrmW); + float4 cSpec = gMtrl.specular.rgba; + float3 cSun = saturate(gSun.Color); + float dLN = saturate(-dot(gSun.Dir, nrmW)); + + //cSpec.rgb *= 0.33333f; + + if (gNoColor) cDiff.rgb = 1; + + // ---------------------------------------------------------------------- + // Add vessel self-shadows + // ---------------------------------------------------------------------- + +#if SHDMAP > 0 + float fShadow = smoothstep(0, 0.72, ComputeShadow(frg.shdH, dLN, sc)); + dLN *= fShadow; +#endif + + // ---------------------------------------------------------------------- + // Compute Local Light Sources + // ---------------------------------------------------------------------- + + LocalLightsEx(cDiffLocal, cSpecLocal, nrmW, -frg.camW, cSpec.a, false); + + + // ---------------------------------------------------------------------- + // Compute Earth glow + // ---------------------------------------------------------------------- + + float angl = saturate((-dot(gCameraPos, nrmW) - gProxySize) * gInvProxySize); + cDiffLocal += gAtmColor.rgb * max(0, angl*gGlowConst); + + cDiff.rgb *= saturate( (gMtrl.diffuse.rgb*(dLN * cSun + cDiffLocal)) + (gMtrl.ambient.rgb*gSun.Ambient) + gMtrl.emissive.rgb ); + + float3 CamD = normalize(frg.camW); + float3 HlfW = normalize(CamD - gSun.Dir); + float fSun = pow(saturate(dot(HlfW, nrmW)), gMtrl.specular.a); + +#if SHDMAP > 0 + fSun *= fShadow; +#endif + + + if (dLN == 0) fSun = 0; + +#if LMODE > 0 + float3 specLight = saturate((fSun * cSun) + cSpecLocal); +#else + float3 specLight = (fSun * cSun); +#endif + cDiff.rgb += (cSpec.rgb * specLight); + + cDiff.rgb += cEmis; + } + +#if defined(_DEBUG) + //if (gDebugHL) cDiff = cDiff*0.5f + gColor; + cDiff = cDiff * (1 - gColor*0.5f) + gColor; +#endif + + cDiff.a *= gMtrlAlpha; + + return cDiff; +} + + + +// ======================================================================================================================== +// +float4 XRHUD_PS(FASTData frg) : COLOR +{ + return tex2D(WrapS, frg.tex0.xy); +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Particle.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Particle.fx new file mode 100644 index 0000000000..fb74b0c6a1 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Particle.fx @@ -0,0 +1,113 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2012 - 2016 Jarmo Nikkanen +// ============================================================== + +struct EPVERTEX { + float3 posL : POSITION0; + float2 tex0 : TEXCOORD0; +}; + +struct ParticleVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; + float light : TEXCOORD1; +}; + +ParticleVS ParticleDiffuseVS(NTVERTEX vrt) +{ + ParticleVS outVS = (ParticleVS)0; + outVS.tex0 = vrt.tex0; + outVS.light = 1.0f; // saturate(dot(-gSun.Dir, vrt.nrmL) * 2.0f); + outVS.posH = mul(float4(vrt.posL, 1.0f), gVP); + return outVS; +} + +ParticleVS ParticleEmissiveVS(EPVERTEX vrt) +{ + ParticleVS outVS = (ParticleVS)0; + outVS.tex0 = vrt.tex0; + outVS.posH = mul(float4(vrt.posL, 1.0f), gVP); + return outVS; +} + + + +// ---------------------------------------------------------------------------- +// gMix is the particle opacity computed from time and halflife +// gColor is hardcoded to [1,1,1] in exhaust streams and [1, 0.7, 0.5] in reentry streams +// frg.light is a sun light intensity level illuminating a particles. Light color is [1,1,1] +// ---------------------------------------------------------------------------- + + +float4 ParticleDiffusePS(ParticleVS frg) : COLOR +{ + float4 color = tex2D(WrapS, frg.tex0); + return float4(color.rgb*frg.light, color.a*gMix); +} + +float4 ParticleEmissivePS(ParticleVS frg) : COLOR +{ + float4 color = tex2D(WrapS, frg.tex0); + return float4(color.rgb*gColor.rgb, color.a*gMix); +} + +float4 ParticleShadowPS(ParticleVS frg) : COLOR +{ + float4 color = tex2D(WrapS, frg.tex0); + return float4(0,0,0,color.a*gMix*2.0); +} + + + +technique ParticleDiffuseTech +{ + pass P0 + { + vertexShader = compile vs_3_0 ParticleDiffuseVS(); + pixelShader = compile ps_3_0 ParticleDiffusePS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + } +} + + +technique ParticleEmissiveTech +{ + pass P0 + { + vertexShader = compile vs_3_0 ParticleEmissiveVS(); + pixelShader = compile ps_3_0 ParticleEmissivePS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + } + + // ------------------------------------------------------------------------ + // Ground shadows are rendered only for DIFFUSE particles + // Shadow rendering is defined here because of identical vertex declarations [EPVERTEX] + // ------------------------------------------------------------------------ + pass P1 + { + vertexShader = compile vs_3_0 ParticleEmissiveVS(); + pixelShader = compile ps_3_0 ParticleShadowPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = false; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Planet.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Planet.fx new file mode 100644 index 0000000000..53a1210a96 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Planet.fx @@ -0,0 +1,215 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2012 - 2016 Jarmo Nikkanen +// ============================================================== + +struct TileVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; + float2 tex1 : TEXCOORD1; + float3 normalW : TEXCOORD2; + float3 toCamW : TEXCOORD3; // Vector to the camera + float3 posW : TEXCOORD4; // World space vertex position + float4 aux : TEXCOORD5; // Specular, Diffuse, Twilight, Night Texture Intensity, + float4 diffuse : TEXCOORD6; // Sun light + float4 atten : COLOR0; // Attennuate incoming fragment color + float4 insca : COLOR1; // "Inscatter" Add to incoming fragment color +}; + + + +TileVS PlanetTechVS(TILEVERTEX vrt) +{ + // Zero output. + TileVS outVS = (TileVS)0; + + // Apply a mesh group transformation matrix + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 nrmW = normalize(mul(float4(vrt.normalL, 0.0f), gW).xyz); + + // Convert transformed vertex position into a "screen" space using a combined (World, View and Projection) Matrix + outVS.posH = mul(float4(posW, 1.0f), gVP); + + // A vector from the vertex to the camera + float3 tocam = normalize(-posW); + float3 sundir = gSun.Dir; + + float diff = saturate(dot(-sundir, nrmW)); + float dotr = max(dot(reflect(sundir, nrmW), tocam), 0.0f); + float spec = pow(diff,0.25f) * pow(dotr, gWater.specPower); + float nigh = 0.0f; + float ambi = 0.0f; + + outVS.tex0 = float2(vrt.tex0.x*gTexOff[0] + gTexOff[1], vrt.tex0.y*gTexOff[2] + gTexOff[3]); + outVS.tex1 = vrt.tex1; + outVS.toCamW = tocam; + outVS.normalW = nrmW; + outVS.posW = gCameraPos*gRadius[2] + posW*gDistScale; + + LegacySunColor(outVS.diffuse, ambi, nigh, nrmW); + + outVS.aux = float4(spec, diff, ambi, nigh); + + AtmosphericHaze(outVS.atten, outVS.insca, outVS.posH.z, posW); + + outVS.insca *= (outVS.diffuse+ambi); + + return outVS; +} + + + +float4 PlanetTechPS(TileVS frg) : COLOR +{ + + float4 diff = frg.aux.g*(gMat.diffuse*frg.diffuse) + (gMat.ambient*frg.aux.b); + float micro = 1.0f; + + if (gMix>0.0f) micro -= tex2D(Planet3S, frg.tex1).a; + + float4 vSpe = frg.aux.r * (gWater.specular*frg.diffuse) * micro; + float4 vEff = tex2D(Planet1S, frg.tex0); + + if (gSpecMode==2) vSpe *= 1.0f - vEff.a; + if (gSpecMode==0) vSpe = 0; + + float3 cTex = tex2D(Planet0S, frg.tex0).rgb; + + //cTex *= float3(0.8, 0.7, 0.6); + //cTex = pow(abs(cTex), float3(0.9, 1.1, 1.0)); + + float3 color = diff.rgb * cTex.rgb + frg.aux.a*vEff.rgb + vSpe.rgb; + + return float4(color*frg.atten.rgb+gColor.rgb+frg.insca.rgb, 1.0f); +} + + + +float4 CloudTechPS(TileVS frg) : COLOR +{ + float mic = 1.0f; + + // Default + if (gMix>0.0f) mic -= (1.0f - tex2D(Planet3S, frg.tex1).a) * gMix; + + // Test + //if (gMix>0.0f) mic -= (1.0f - tex2D(Planet3S, frg.tex1).a*tex2D(Planet3S, frg.tex1*6).a) * gMix; + + float4 data = (gMat.ambient*frg.aux.b); + float4 color = tex2D(Planet0S, frg.tex0); + float alpha = color.a; + + // Modulate color + //color = lerp(color*float4(0.5, 0.5, 0.5, 1.0), color, mic); + + // Modulate Alpha + alpha *= (mic*0.5+0.5); + + if (dot(frg.normalW, frg.toCamW)<0) { // Render cloud layer from below + float4 diff = (min(1,frg.aux.g*2) * frg.diffuse) * gMat.diffuse + data; + return float4(color.rgb*diff.rgb, alpha); + } + + else { // Render cloud layer from above + float4 diff = (min(1,frg.aux.g*1.5) * frg.diffuse) * gMat.diffuse + data; + return float4(color.rgb*diff.rgb, alpha); + } +} + + + + + + + + + +// ----------------------------------------------------------------------------- +// Cloud Shadow Techs +// ----------------------------------------------------------------------------- + + +struct ShadowVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; + float2 tex1 : TEXCOORD1; + float4 atten : TEXCOORD2; +}; + +ShadowVS CloudShadowTechVS(TILEVERTEX vrt) +{ + // Zero output. + ShadowVS outVS = (ShadowVS)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.tex0 = float2(vrt.tex0.x*gTexOff[0] + gTexOff[1], vrt.tex0.y*gTexOff[2] + gTexOff[3]); + outVS.tex1 = vrt.tex1; + + float4 none; + + AtmosphericHaze(outVS.atten, none, outVS.posH.z, posW); + + return outVS; +} + +float4 CloudShadowPS(ShadowVS frg) : COLOR +{ + float mic = 0.0f; + if (gMix>0.0f) mic = tex2D(Planet3S, frg.tex1).a * gMix; + return float4(0,0,0, (1.0f-mic)*tex2D(Planet0S, frg.tex0).a * frg.atten.b); +} + + + + + +// This is used for high resolution base tiles --------------------------------- +// +technique PlanetTech +{ + pass P0 + { + vertexShader = compile vs_3_0 PlanetTechVS(); + pixelShader = compile ps_3_0 PlanetTechPS(); + + AlphaBlendEnable = false; + ZEnable = false; + ZWriteEnable = false; + } +} + +technique PlanetCloudTech +{ + pass P0 + { + vertexShader = compile vs_3_0 PlanetTechVS(); + pixelShader = compile ps_3_0 CloudTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} + +technique PlanetCloudShadowTech +{ + pass P0 + { + vertexShader = compile vs_3_0 CloudShadowTechVS(); + pixelShader = compile ps_3_0 CloudShadowPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/SceneTech.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/SceneTech.fx new file mode 100644 index 0000000000..bccb3c4bed --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/SceneTech.fx @@ -0,0 +1,97 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2012 - 2016 Jarmo Nikkanen +// ============================================================== + +// ---------------------------------------------------------------------------- +// D3D9Client generic scene rendering technique +// ---------------------------------------------------------------------------- + +uniform extern float4x4 gWVP; // Combined World, View and Projection matrix +uniform extern float4x4 gVP; // Combined World, View and Projection matrix +uniform extern float4 gColor; // Line Color +uniform extern texture gTex0; // Diffuse texture + +sampler Tex0S = sampler_state +{ + Texture = ; + MinFilter = Anisotropic; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = 8; + AddressU = WRAP; + AddressV = WRAP; +}; + + +struct LineOutputVS +{ + float4 posH : POSITION0; +}; + +// ---------------------------------------------------------------------------- +// Line Tech Vertex/Pixel shader implementation +// ---------------------------------------------------------------------------- + +LineOutputVS LineTechVS(float3 posL : POSITION0) +{ + // Zero output. + LineOutputVS outVS = (LineOutputVS)0; + outVS.posH = mul(float4(posL, 1.0f),gWVP); + return outVS; +} + +float4 LineTechPS() : COLOR +{ + return gColor; +} + +technique LineTech +{ + pass P0 + { + vertexShader = compile vs_2_0 LineTechVS(); + pixelShader = compile ps_2_0 LineTechPS(); + ZEnable = false; + AlphaBlendEnable = false; + } +} + + + +// ---------------------------------------------------------------------------- +// Star rendering technique +// ---------------------------------------------------------------------------- + +struct StarOutputVS +{ + float4 posH : POSITION0; + float4 col : COLOR0; +}; + +StarOutputVS StarTechVS(float3 posL : POSITION0, float4 col : COLOR0) +{ + // Zero output. + StarOutputVS outVS = (StarOutputVS)0; + outVS.posH = mul(float4(posL, 1.0f), gWVP); + outVS.col = col; + return outVS; +} + +float4 StarTechPS(float4 col : COLOR0) : COLOR +{ + return col; +} + +technique StarTech +{ + pass P0 + { + vertexShader = compile vs_2_0 StarTechVS(); + pixelShader = compile ps_2_0 StarTechPS(); + ZEnable = false; + AlphaBlendEnable = false; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Sketchpad.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Sketchpad.fx new file mode 100644 index 0000000000..3d0c547da7 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Sketchpad.fx @@ -0,0 +1,368 @@ +// ================================================================================================================================= +// The MIT Lisence: +// +// Copyright (C) 2013-2016 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + + +// ---------------------------------------------------------------------------- +// Sketchpad Implementation +// ---------------------------------------------------------------------------- + +uniform extern float4x4 gColorMatrix; +uniform extern float4x4 gVP; // Projection matrix +uniform extern float4x4 gW; // World matrix +uniform extern float4x4 gWVP; // World View Projection + +// Textures +uniform extern texture gFnt0; +uniform extern texture gTex0; // Diffuse texture +uniform extern texture gNoiseTex; + +// Colors +uniform extern float4 gPen; +uniform extern float4 gKey; +uniform extern float4 gMtrl; +uniform extern float4 gNoiseColor; +uniform extern float4 gGamma; + +uniform extern float3 gPos; // Clipper sphere direction [unit vector] +uniform extern float3 gPos2; // Clipper cone direction [unit vector] +uniform extern float4 gCov; // Clipper sphere coverage parameters +uniform extern float4 gSize; // Inverse Texture size in .xy [pixels] +uniform extern float4 gPatScl; // Pattern Scale +uniform extern float4 gTarget; // Inverse Screen size in .xy [pixels], Screen Size in .zw [pixels] +uniform extern float3 gWidth; // Pen width in .x, and pattern scale in .y, pixel offset in .z +uniform extern float gFov; // atan( 2 * tan(fov/2) / H ) +uniform extern float gRandom; +uniform extern bool gDashEn; +uniform extern bool gTexEn; +uniform extern bool gFntEn; +uniform extern bool gKeyEn; +uniform extern bool gPatEn; +uniform extern bool gWide; // Unused +uniform extern bool gShade; +uniform extern bool gClipEn; +uniform extern bool gClearEn; // Unused +uniform extern bool gEffectsEn; + + +// ColorKey tolarance +#define tol 0.01f + +sampler TexS : register(s0) = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = 8; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler FntS : register(s1) = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = 8; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler NoiseS : register(s2) = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = WRAP; + AddressV = WRAP; +}; + + +struct InputVS +{ + float3 pos : POSITION0; // vertex x, y + float4 dir : TEXCOORD0; // Texture coord or inbound direction + float4 clr : COLOR0; // Color + float4 fnc : COLOR1; // Function switch +}; + +#define SSW 3 // Point side switch +#define TSW 2 // Fragment, Pen, Texture switch +#define CSW 1 // ColorKey, Font switch +#define LSW 0 // Length switch + +struct OutputVS +{ + float4 posH : POSITION0; + float4 sw : TEXCOORD0; + float4 tex : TEXCOORD1; + float len : TEXCOORD2; + float4 posW : TEXCOORD3; + float4 color : COLOR0; +}; + +struct SkpMshVS +{ + float4 posH : POSITION0; + float3 nrmW : TEXCOORD0; + float2 tex : TEXCOORD1; +}; + +struct NTVERTEX { // D3D9Client Mesh vertex layout + float3 posL : POSITION0; + float3 nrmL : NORMAL0; + float2 tex0 : TEXCOORD0; +}; + + +float cmax(float3 v) +{ + return max(v.x, max(v.y, v.z)); +} + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +OutputVS Sketch3DVS(InputVS v) +{ + // Zero output. + OutputVS outVS = (OutputVS)0; + + float3 posW = mul(float4(v.pos.xy, 0.0f, 1.0f), gW).xyz; + float3 prvW = mul(float4(v.dir.zw, 0.0f, 1.0f), gW).xyz; + float3 nxtW = mul(float4(v.dir.xy, 0.0f, 1.0f), gW).xyz; + + outVS.len = v.pos.z; + + float3 posN = normalize(posW); + float3 prvN = normalize(prvW); + float3 nxtN = normalize(nxtW); + float3 nxtS = normalize(cross(nxtN - posN, posN)); + float3 prvS = normalize(cross(posN - prvN, posN)); + float3 latN = normalize(nxtS + prvS) * (0.45*gWidth.x) * rsqrt(max(0.1, 0.5f + dot(nxtS, prvS)*0.5f)); + + //if (v.fnc[LSW]>0.5f) outVS.len = acos(dot(posN,prvN)) / gFov; + if (v.fnc[LSW]>0.5f) outVS.len = min(1, length(posN-prvN)) / gFov; + else outVS.len = v.pos.z; + + float fSide = round(v.fnc[SSW] * 2.0 - 1.0); + float fPosD = dot(posN, posW); + + posW += latN * (fSide * fPosD * gFov); + posW = normalize(posW); + + outVS.color.rgba = v.clr.bgra; + outVS.posW = float4(posW, fPosD); + outVS.sw = v.fnc; + outVS.posH = mul(float4(posW.xyz*100.0, 1.0f), gVP); + outVS.tex = float4(v.dir.xy * gSize.xy, v.dir.xy * gSize.zw); + + return outVS; +} + + + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +OutputVS OrthoVS(InputVS v) +{ + // Zero output. + OutputVS outVS = (OutputVS)0; + + float4 posH = mul(float4(v.pos.xy, 0.0f, 1.0f), gWVP); + float4 prvH = mul(float4(v.dir.zw, 0.0f, 1.0f), gWVP); + + if (v.fnc[LSW]>0.5f) outVS.len = length((posH.xy - prvH.xy) * gTarget.zw * 0.5); + else outVS.len = v.pos.z; + + outVS.posW = 0; + + if (gWide) { + + float4 nxtH = mul(float4(v.dir.xy, 0.0f, 1.0f), gWVP); + float fSide = round(v.fnc[SSW] * 2.0 - 1.0); + float2 pixH = gTarget.xy * gWidth.z * abs(fSide); + + nxtH.xy -= pixH; + posH.xy -= pixH; + prvH.xy -= pixH; + + float2 nxtS = normalize(nxtH.xy - posH.xy); + float2 prvS = normalize(posH.xy - prvH.xy); + float2 latW = normalize(nxtS + prvS) * (0.45*gWidth.x) * rsqrt(max(0.1, 0.5f + dot(nxtS, prvS)*0.5f)); + + posH += float4(latW.y, -latW.x, 0, 0) * gTarget * fSide; + } + + + outVS.color.rgba = v.clr.bgra; + outVS.sw = v.fnc; + outVS.posH = float4(posH.xyz, 1.0f); + + if (gPatEn) v.dir.xy = (v.pos.xy - (gPatScl.xy - 0.5f)); + + outVS.tex = float4(v.dir.xy * gSize.xy, v.dir.xy * gSize.zw); + + return outVS; +} + + + + + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +float4 SketchpadPS(float4 sc : VPOS, OutputVS frg) : COLOR +{ + float4 t = 1; + float3 u = 1; + + if (gFntEn) u = tex2D(FntS, frg.tex.zw).rgb; + if (gTexEn) t = tex2D(TexS, frg.tex.xy); + + float f = max(u.r*0.7f, u.g); + + // Select Color source + float4 c = frg.color; + if (frg.sw[TSW] > 0.2f) c = gPen; + if (frg.sw[TSW] > 0.8f) c = t; + if (frg.sw[CSW] > 0.8f) c.a *= f; + + if (gPatEn) c *= t; + + // Color keying + if (gTexEn && gKeyEn) { + float4 x = abs(c - gKey); + if ((x.r < tol) && (x.g < tol) && (x.b < tol)) { + if (frg.sw[CSW] > 0.2f && frg.sw[CSW] < 0.8) clip(-1); + } + } + + if (gDashEn) { + float q; + if (modf(frg.len*gWidth.y, q) > 0.5f) clip(-1); + } + + if (gClipEn) { + float3 posN = normalize(frg.posW.xyz); + if ((dot(gPos, posN) > gCov.x) && (frg.posW.w > gCov.y)) clip(-1); + if ((dot(gPos2, posN) > gCov.z) && (frg.posW.w > gCov.w)) clip(-1); + } + + if (gEffectsEn) { + + // Apply color matrix + c = mul(c, gColorMatrix); + + // Apply gamma correction + c.rgb = pow(max(c.rgb, 0), gGamma.rgb); + + // Color overboost correction beyond 0-1 range + c.rgb += saturate(cmax(c.rgb) - 1.0f); + + // Apply noise + float noise = (tex2D(NoiseS, sc.xy*(1.0f / 128.0f) + float2(gRandom, gRandom*7.0)).r * 2.0f) - 1.0f; + c.rgb = saturate(c.rgb + lerp(float3(1, 1, 1), c.rgb, gNoiseColor.a)*gNoiseColor.rgb*noise); + } + + return c; +} + + +technique SketchTech +{ + pass P0 + { + vertexShader = compile vs_3_0 OrthoVS(); + pixelShader = compile ps_3_0 SketchpadPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + CullMode = None; + } + + pass P1 + { + vertexShader = compile vs_3_0 Sketch3DVS(); + pixelShader = compile ps_3_0 SketchpadPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + CullMode = None; + } +} + + + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- + +SkpMshVS SketchMeshVS(NTVERTEX v) +{ + // Zero output. + SkpMshVS outVS = (SkpMshVS)0; + float3 posW = mul(float4(v.posL, 1.0f), gW).xyz; + float3 nrmW = mul(float4(v.nrmL, 0.0f), gW).xyz; + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.tex = v.tex0; + outVS.nrmW = nrmW; + return outVS; + +} + + +float4 SketchMeshPS(SkpMshVS frg) : COLOR +{ + float4 cTex = 1; + float fS = 1; + if (gTexEn) cTex = tex2D(TexS, frg.tex); + if (gShade) fS = dot(normalize(frg.nrmW), float3(0, 0, -1)); + + cTex.rgba *= gPen.bgra; + cTex.rgba *= gMtrl.rgba; + cTex.rgb *= saturate(fS); + + return cTex; +} + + +technique SketchMesh +{ + pass P0 + { + vertexShader = compile vs_3_0 SketchMeshVS(); + pixelShader = compile ps_3_0 SketchMeshPS(); + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Surface.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Surface.fx new file mode 100644 index 0000000000..fd8e58ee99 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Surface.fx @@ -0,0 +1,1340 @@ +// ============================================================================ +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// Copyright (C) 2014 - 2016 Jarmo Nikkanen +// ============================================================================ + + +// ============================================================================ +// Shader File for TileManager2 and 3D Terrain implementation +// Contains a light weight implementation +// ============================================================================ + +struct Light +{ + int type; /* Type of the light emitter 0=point, 1=spot */ + float dst2; /* Camera-Light Emitter distance squared */ + float4 diffuse; /* diffuse color of light */ + float3 position; /* position in world space */ + float3 direction; /* direction in world space */ + float3 attenuation; /* Attenuation */ + float4 param; /* range, falloff, theta, phi */ +}; + +#define Range 0 +#define Falloff 1 +#define Theta 2 +#define Phi 3 + +// ---------------------------------------------------------------------------- +// Vertex input layouts from Vertex buffers to vertex shader +// ---------------------------------------------------------------------------- + +struct TILEVERTEX // (VERTEX_2TEX) Vertex declaration used for surface tiles and cloud layer +{ + float3 posL : POSITION0; + float3 normalL : NORMAL0; + float2 tex0 : TEXCOORD0; +}; + + +// ---------------------------------------------------------------------------- +// Vertex Shader to Pixel Shader datafeeds +// ---------------------------------------------------------------------------- + +struct TileVS +{ + float4 posH : POSITION0; + float2 texUV : TEXCOORD0; // Texture coordinate + float4 aux : TEXCOORD1; // Night lights + float3 camW : TEXCOORD2; + float3 nrmW : TEXCOORD3; + float4 sunlight : COLOR0; // Color of the sunlight received by terrain + float3 insca : COLOR1; // "Inscatter" Added to incoming fragment color +#if defined(_SHDMAP) + float4 shdH : TEXCOORD4; +#endif +}; + +struct CloudVS +{ + float4 posH : POSITION0; + float2 texUV : TEXCOORD0; // Texture coordinate + float3 atten : COLOR0; // Attennuation + float3 insca : COLOR1; // "Inscatter" Added to incoming fragment color + float2 fade : TEXCOORD1; + float3 nrmW : TEXCOORD2; +}; + +struct HazeVS +{ + float4 posH : POSITION0; + float2 texUV : TEXCOORD0; + float3 insca : COLOR0; + float alpha : COLOR1; +}; + +struct CelSphereVS +{ + float4 posH : POSITION0; + float2 tex0 : TEXCOORD0; +}; + + + + +// ---------------------------------------------------------------------------- +// Global shader variables +// ---------------------------------------------------------------------------- + +uniform extern Light sLights[4]; // Local light sources + +uniform extern float4x4 mLVP; // Light View Projection +uniform extern float4x4 mWorld; // World matrix +uniform extern float4x4 mViewProj; // Combined View and Projection matrix +// ------------------------------------------------------------ +uniform extern float4 vMSc0; // Micro Texture A scale factors +uniform extern float4 vMSc1; // Micro Texture B scale factors +uniform extern float4 vMSc2; // Micro texture C scale factors +uniform extern float4 vTexOff; // Texture offsets used by surface manager (i.e. SubTexRange) +uniform extern float4 vCloudOff; // Texture offsets used by surface manager (i.e. SubTexRange) +uniform extern float4 vMicroOff; // Texture offsets used by surface manager (i.e. SubTexRange) +uniform extern float4 vOverlayOff; // Texture offsets used by surface manager (i.e. SubTexRange) +uniform extern float4 vWater; // Water material input structure (specular rgb, power) +uniform extern float3 vSunDir; // Unit Vector towards the Sun +uniform extern float3 vTangent; // Unit Vector +uniform extern float3 vBiTangent; // Unit Vector +uniform extern float3 vPolarAxis; // North Pole +uniform extern float4 vSHD; // ShadowMap Params +// ------------------------------------------------------------ +uniform extern float fDistScale; // UNUSED: Scale factor +uniform extern float fAlpha; // Cloud shodow alpha +uniform extern float fNight; // Nightlights intensity +// ------------------------------------------------------------ +uniform extern bool bCloudSh; // Enable cloud shadows +uniform extern bool bLights; // Enable night-lights +uniform extern bool bEnvEnable; // Enable environment maps +uniform extern bool bMicroNormals; // Enable micro texture normal maps +uniform extern int iTileLvl; // Surface tile level being rendered +uniform extern int iDebug; // Debug Mode identifier +uniform extern bool bDebug; // Debug Mode enabled +uniform extern bool bLocals; // Local light sources enabled for this tile +uniform extern bool bShadows; // Enable shadow projection +uniform extern bool bOverlay; // Enable shadow projection +uniform extern bool bSpherical; // Force Spherical planet (discard elevation) +uniform extern bool bCloudNorm; +uniform extern bool bEarth; +// Textures --------------------------------------------------- +uniform extern texture tDiff; // Diffuse texture +uniform extern texture tMask; // Nightlights / Specular mask texture +uniform extern texture tCloud; +uniform extern texture tCloud2; +uniform extern texture tCloudMicro; +uniform extern texture tCloudMicroNorm; +uniform extern texture tNoise; // +uniform extern texture tOcean; // Ocean Texture +uniform extern texture tEnvMap; +uniform extern texture tMicroA; +uniform extern texture tMicroB; +uniform extern texture tMicroC; +uniform extern texture tShadowMap; +uniform extern texture tOverlay; + + +// ---------------------------------------------------------------------------- +// Texture Sampler implementations +// ---------------------------------------------------------------------------- + +sampler OverlayS = sampler_state +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = ANISOTROPIC; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler ShadowS = sampler_state +{ + Texture = ; + MinFilter = POINT; + MagFilter = POINT; + MipFilter = NONE; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler DiffTexS = sampler_state +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = ANISOTROPIC; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0.0; + AddressU = CLAMP; + AddressV = CLAMP; +}; + + +sampler CloudTexS = sampler_state // Cloud shadow sampler +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = 2; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler Cloud2TexS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler MaskTexS = sampler_state +{ + Texture = ; + MinFilter = ANISOTROPIC; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = ANISOTROPY_MACRO; + MipMapLODBias = 0; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler NoiseTexS = sampler_state +{ + Texture = ; + MinFilter = POINT; + MagFilter = POINT; + MipFilter = POINT; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler OceaTexS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler EnvMapS = sampler_state +{ + Texture = ; + MinFilter = LINEAR; + MagFilter = LINEAR; + MipFilter = LINEAR; + AddressU = CLAMP; + AddressV = CLAMP; +}; + +sampler CloudMicroS = sampler_state +{ + Texture = ; + MinFilter = MICRO_FILTER; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = MICRO_ANISOTROPY; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler CloudMicroNormS = sampler_state +{ + Texture = ; + MinFilter = MICRO_FILTER; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = MICRO_ANISOTROPY; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler MicroAS = sampler_state +{ + Texture = ; + MinFilter = MICRO_FILTER; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = MICRO_ANISOTROPY; + MipMapLodBias = MICRO_BIAS; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler MicroBS = sampler_state +{ + Texture = ; + MinFilter = MICRO_FILTER; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = MICRO_ANISOTROPY; + MipMapLODBias = MICRO_BIAS; + AddressU = WRAP; + AddressV = WRAP; +}; + +sampler MicroCS = sampler_state +{ + Texture = ; + MinFilter = MICRO_FILTER; + MagFilter = LINEAR; + MipFilter = LINEAR; + MaxAnisotropy = MICRO_ANISOTROPY; + MipMapLODBias = MICRO_BIAS; + AddressU = WRAP; + AddressV = WRAP; +}; + +// ---------------------------------------------------------------------------- +// Atmospheric scattering model +// ---------------------------------------------------------------------------- + +uniform extern float4 vMPhase; // Pre-computed factors used in Mie phase function +uniform extern float4 vODCoEff; // Optical Depth Taylor co-efficients +uniform extern float4 vODCoEffEx; // Optical Depth Taylor co-efficients +uniform extern float3 vMieInSct; // Mie scattering factor = Mie/(lambda^m) (slider) +uniform extern float3 vRayInSct; // Rayleigh in-scattering = (ROut*RIn)/(lambda^r) (slider) +uniform extern float3 vTotOutSct; // Total out-scattering = ROut/(lambda^r) + Mie/(lambda^m) (slider) +uniform extern float3 vHazeMax; // Horizon haze limitter (slider) +uniform extern float3 vColorShift; // lerp([1,1,1], 1.0/lambda^r, Aux3) +uniform extern float3 vCameraPos; // Geo-centric camera position +uniform extern float3 vUnitCameraPos; // Geo-centric camera position (Unit vector) +uniform extern float fCloudInts; // Cloud layer intensity +uniform extern float fScaleHeight; // Atmosphere scaleheight +uniform extern float fInvScaleHeight; // Inverse Scale Height 1.0f/fScaleHeight +uniform extern float fSunAlt; // Altitude of sunlight in the horizon ring, [meters] +uniform extern float fRadius; // PlanetRad +uniform extern float fCameraAlt; // Camera Altitude +uniform extern float fHorizonAlt; // Horizon (i.e. Skydome, Atmosphere) Altitude/Height +uniform extern float fAtmRad2; // Atmosphere upper radius squared (fRadius+fHorizonAlt)^2 +uniform extern float fRPhase; // Rayleigh phase factor +uniform extern float fHorizonDst; // Camera to horizon distance sqrt(dot(vCameraPos,vCameraPos) - fRadius*fRadius) +uniform extern float fExposure; // Terrain brightness +uniform extern float fAux1; // Bound to Aux1 (slider) +uniform extern float fAux2; // Bound to Aux2 (slider) +uniform extern float fInvAux1; // Inverse of fAux1 (slider) +uniform extern float fTrGamma; // Terrain gamma control +uniform extern float fAtmGamma; // Atmosphere gamma control +uniform extern float fInvParameter; // Inverse of optical parameter 1.0/AngleCoEff(0) +uniform extern float fAmbient; // Planet specific ambient level pre-multiplied with camera altitude factor +uniform extern float fGlobalAmb; +uniform extern float fTime; // Loop from 0 to 3600 (sec) +uniform extern bool bInSpace; // Camera in the space (i.e. fCameraAlt>fHorizonAlt) +uniform extern bool bOnOff; + +// Numeric integration points and weights for Gauss-Lobatto integral +// +static const float4 vWeight4 = {0.167, 0.833, 0.833, 0.167}; +static const float4 vPoints4 = {0.0f, 0.27639f, 0.72360f, 1.0f}; +static const float3 vWeight3 = {0.33333f, 1.33333f, 0.33333f}; +static const float3 vPoints3 = {0.0f, 0.5f, 1.0f}; +static const float3 cSky = {0.7f, 0.9f, 1.2f}; +static const float3 cSun = { 1.0f, 1.0f, 1.0f }; +static const float srfoffset = -0.2; +static const float ATMNOISE = 0.02; + + + +// ------------------------------------------------------------------------------------------------------------- +// Project shadows on surface +// +/* +float ProjectShadows(float2 sp) +{ + if (sp.x < 0 || sp.y < 0) return 1.0f; + if (sp.x > 1 || sp.y > 1) return 1.0f; + + float2 dx = float2(vSHD[1], 0) * 1.5f; + float2 dy = float2(0, vSHD[1]) * 1.5f; + float va = 0; + float pd = 1e-4; + + sp -= dy; + if ((tex2D(ShadowS, sp - dx).r) < pd) va++; + if ((tex2D(ShadowS, sp).r) < pd) va++; + if ((tex2D(ShadowS, sp + dx).r) < pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) < pd) va++; + if ((tex2D(ShadowS, sp).r) < pd) va++; + if ((tex2D(ShadowS, sp + dx).r) < pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) < pd) va++; + if ((tex2D(ShadowS, sp).r) < pd) va++; + if ((tex2D(ShadowS, sp + dx).r) < pd) va++; + + return va / 9.0f; +}*/ + + + +// --------------------------------------------------------------------------------------------------- +// +float SampleShadows(float2 sp, float pd) +{ + if (sp.x < 0 || sp.y < 0) return 0.0f; // If a sample is outside border -> fully lit + if (sp.x > 1 || sp.y > 1) return 0.0f; + + if (pd < 0) pd = 0; + if (pd > 2) pd = 2; + + float2 dx = float2(vSHD[1], 0) * 1.5f; + float2 dy = float2(0, vSHD[1]) * 1.5f; + float va = 0; + + sp -= dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + sp += dy; + if ((tex2D(ShadowS, sp - dx).r) > pd) va++; + if ((tex2D(ShadowS, sp).r) > pd) va++; + if ((tex2D(ShadowS, sp + dx).r) > pd) va++; + + return va * 0.1111111f; +} + +// ------------------------------------------------------------------------------------------------------------- +// Local light sources +// +void LocalLights( + out float3 diff_out, + in float3 nrmW, + in float3 posW) +{ + + if (!bLocals) return; + + float3 posWN = normalize(-posW); + float3 p[4]; + int i; + + // Relative positions + [unroll] for (i = 0; i < 4; i++) p[i] = posW - sLights[i].position; + + // Square distances + float4 sd; + [unroll] for (i = 0; i < 4; i++) sd[i] = dot(p[i], p[i]); + + // Normalize + sd = rsqrt(sd); + [unroll] for (i = 0; i < 4; i++) p[i] *= sd[i]; + + // Distances + float4 dst = rcp(sd); + + // Attennuation factors + float4 att; + [unroll] for (i = 0; i < 4; i++) att[i] = dot(sLights[i].attenuation.xyz, float3(1.0, dst[i], dst[i] * dst[i])); + + att = rcp(att); + + // Spotlight factors + float4 spt; + [unroll] for (i = 0; i < 4; i++) { + spt[i] = (dot(p[i], sLights[i].direction) - sLights[i].param[Phi]) * sLights[i].param[Theta]; + if (sLights[i].type == 0) spt[i] = 1.0f; + } + + spt = saturate(spt); + + // Diffuse light factors + float4 dif; + [unroll] for (i = 0; i < 4; i++) dif[i] = dot(-p[i], nrmW); + + dif = saturate(dif); + dif *= (att*spt); + + diff_out = 0; + + [unroll] for (i = 0; i < 4; i++) diff_out += sLights[i].diffuse.rgb * dif[i]; +} + + +// ------------------------------------------------------------------------------------------------------------- +// "HDR" +// +float3 Light_fx2(float3 x) +{ + //return saturate(x); + //return x * rsqrt(1.0f + x*x) * 1.4f; + return 2.0*x / (1.0f + x); +} + + +// ------------------------------------------------------------------------------------------------------------- +// Henyey-Greenstein Phase function +// x = (1-g^2)/(4pi), y = 1+g^2, w = -2*g +// +float MPhase(float cw) +{ + return max(1, vMPhase.x * pow(abs(vMPhase.y-vMPhase.w*cw), -1.5f)); +} + +// ---------------------------------------------------------------------------- +// Rayleigh Phase function +// +float RPhase(float cw) +{ + + //return (1.0 + cw*fRPhase) * (0.75 + cw*cw*0.5f); + //return (1.0 + cw*cw*fRPhase); + return (1.0 + cw*fRPhase); +} + +// ---------------------------------------------------------------------------- +// Optical depth angle co-efficiency factor. (Accurate and valid for angles 0 to 96deg) +// c = cosine of the ray direction (1.0 is up) +// +float AngleCoEff(float c) +{ + float c1 = rcp(max(0.0954, c+0.2)); + float c2 = c1*c1; + float4 v1 = float4(1.0f, c1, c2, c2*c1); + return dot(v1, vODCoEff) + dot(v1*(c2*c2), vODCoEffEx); +} + +float Shadow(float c, float f) +{ + float fC = saturate((c+fAux1+f)*fInvAux1); + return (3.0 - 2.0 * fC) * (fC*fC); +} + +float4 DebugProg(in float3 nrmW, in float3 color, in float fRad) +{ + float a = (fRad - fRadius) / 7000.0f; + + if (iDebug==1) return float4((nrmW + 1.0) * 0.5, 1.0); + + if (iDebug==2) { + float x = dot(nrmW, vTangent) + 1; + float y = dot(nrmW, vBiTangent) + 1; + float z = dot(nrmW, vUnitCameraPos) + 1; + return float4(x, y, z, 2.0) * 0.5; + } + + if (iDebug==3) { + if (a<-1) return saturate(float4(0, 0, 2+a, 1.0)); + else if (a<0) return saturate(float4(0, 1+a, 1, 1.0)); + else if (a<1) return saturate(float4(a, 1, 1-a, 1.0)); + else if (a<2) return saturate(float4(1, 2-a, 0, 1.0)); + else return saturate(float4(1, a-2, a-2, 1.0)); + } + + if (iDebug==4) { + a = saturate(a*0.5 + 0.5); + return float4(a, a, a, 1.0); + } + + if (iDebug==5) { + return float4(color, 1); + } + + return float4(0,0,0,1); +} + + +// ============================================================================ +// Atmospheric scattering implementation. (Will render horizon and sky-color) +// ---------------------------------------------------------------------------- +// vIns = Light in scattering +// vUnitRay = Unit Vector pointing in ray direction. (away from the camera) +// ============================================================================ + +void SkyColor(out float3 vIns, in float3 vUnitRay) +{ + float fDRC = dot(vUnitRay, vUnitCameraPos); + float fCam = fCameraAlt + fRadius; + float fCm2 = fCam * fCam; + float fPrm = fCam * fDRC; + float fRd2 = fCm2 - fPrm*fPrm; + float fRay = sqrt(fAtmRad2 - fRd2); + + if (fRd2>fAtmRad2) { + vIns = 0; + return; + } + + float3 vRay; + + if (fCm2 < fAtmRad2) { + fRay -= fPrm; + vRay = vUnitRay * (fRay * 0.5f); + } + else { + fRay *= 2.0f; + vRay = vUnitRay * abs(fPrm); + } + + + float fDRS = -dot(vUnitRay, vSunDir); + float3 vPos = vCameraPos + vRay; + float3 vNr1 = normalize(vPos); + float fAlt = dot(vNr1, vPos)-fRadius; + float fDNS = dot(vNr1, vSunDir); + float fDNR = dot(vNr1, vUnitRay); + + // Setup altitudes for all sample points + float3 vAlt; + + if (fCm2 < fAtmRad2) vAlt = float3(fCameraAlt, fAlt, fHorizonAlt); + else vAlt = float3(fHorizonAlt, fAlt, fHorizonAlt); + + // Atmospheric densities for sample points + float3 vDns = exp2(-vAlt*fInvScaleHeight); + + // Mean atmospheric density for a viewing ray + float fMnD = dot(vDns, vWeight3); + + // Evaluate a Gauss-Lobatto integral (from camera to skydome). Will give optical depth for the ray + float fDep = fMnD * (fRay * fInvScaleHeight) * 0.3465735903f; + + fDep *= 0.5f; + + float fASn = AngleCoEff(fDNS); + + // Color of inscattered sunlight + float3 vSun = cSun * exp2(-vTotOutSct * fAux2*((vDns[0]+vDns[1]) * 0.5f * fASn)) * fDep * Shadow(fDNS, srfoffset); + //float3 vSun = cSun * exp2(-vTotOutSct * fAux2*(vDns[1] * fASn)) * fDep * Shadow(fDNS, srfoffset); + + // Compute in-scattering + vIns = (vRayInSct*RPhase(fDRS) + vMieInSct*MPhase(fDRS)) * vSun; + + float fNgt = saturate(fDNS*2.924f+0.657f); + + // Compute ambient light level for the sky + float3 vAmb = (vRayInSct + 0.5f) * (3.0*fAmbient * fNgt); + + vIns = 1.0f - exp2(-(vAmb + vIns) * vColorShift); + //vIns = 1.0f - exp2(-(vIns) * vColorShift); + + vIns = pow(abs(vIns*vHazeMax), fAtmGamma); +} + + + + + +// ============================================================================ +// Planet Surface Renderer +// ============================================================================ + +#define AUX_DIST 0 // Vertex distance +#define AUX_NIGHT 1 // Night lights intensity +#define AUX_SLOPE 2 // Terrain slope factor 0.0=flat, 1.0=sloped +#define AUX_RAYDEPTH 3 // Optical depth of a ray + + +TileVS SurfaceTechVS(TILEVERTEX vrt, + uniform bool sbRipples, + uniform bool sbNoAtmo) +{ + // Zero output. + TileVS outVS = (TileVS)0; + + // Apply a world transformation matrix + float3 vPosW = mul(float4(vrt.posL, 1.0f), mWorld).xyz; + + // Disrecard elevation and make the surface spherical + if (bSpherical) vPosW = (normalize(vCameraPos + vPosW) * fRadius) - vCameraPos; + + float3 vNrmW = mul(float4(vrt.normalL, 0.0f), mWorld).xyz; + outVS.posH = mul(float4(vPosW, 1.0f), mViewProj); + +#if defined(_SHDMAP) + outVS.shdH = mul(float4(vPosW, 1.0f), mLVP); +#endif + + outVS.texUV.xy = vrt.tex0.xy; // Note: vrt.tex0 is un-used (hardcoded in Tile::CreateMesh and varies per tile) + + float3 vVrt = vCameraPos + vPosW; // Geo-centric vertex position + float3 vPlN = normalize(vVrt); + float3 vRay = normalize(-vPosW); // Unit viewing ray + float fDPS = dot(vPlN, vSunDir); // Dot mean normal, sun direction + float fRay = abs(dot(vPosW, vRay)); // Vertex camera distance + float fNgt = fDPS * 4.0f - 0.05f; + float fTrA = saturate(fDPS*2.924f + 0.657f); + outVS.camW = -vPosW; + outVS.nrmW = vNrmW; + + outVS.aux[AUX_NIGHT] = -fNgt; + outVS.aux[AUX_DIST] = fRay; + + + + // If no atmosphere skip the rest + if (sbNoAtmo) return outVS; + + + // Camara altitude dependency multiplier for ambient color of atmosphere + //float fAmb = max(saturate(fNgt+0.9f)*fAmbient, fGlobalAmb) * 0.08f; + + float fAmb = max(saturate(fTrA*fAmbient), fGlobalAmb); + + float fDPR = dot(vPlN, vRay); // Dot mean normal, viewing ray + float fDNR = dot(vNrmW, vRay); + float fDNS = dot(vNrmW, vSunDir); // Dot vertex normal, sun direction + float fDRS = dot(vRay, vSunDir); // Dot viewing ray, sun direction + float fDst = dot(vVrt, vPlN); // Vertex geo-distance + float fAlt = fDst - fRadius; // Vertex altitude + + float fCamAlt = fCameraAlt; + + if (bInSpace) { + float fCm2 = fDst * fDst; + float fPrm = fDst * fDPR; + fCamAlt = fHorizonAlt; + fRay = sqrt(fAtmRad2 - (fCm2 - fPrm*fPrm)) - fPrm; // Length of the ray inside atmosphere + } + + + // Altitude vector for sample points + float3 vAlt = float3(fAlt, (fAlt + fCamAlt)*0.5, fCamAlt); + + // Compute atmospheric density for all sample points + float3 vDns = exp2(-vAlt*fInvScaleHeight); // Compute atmospheric density for all sample points + + // Evaluate a Gauss-Lobatto integral to give an optical depth for a viewing ray + float fDRay = dot(vDns, vWeight3) * (fRay * fInvScaleHeight) * 0.3465735903f; + + fDRay *= 0.5; + + float3 vSunLight = exp2(-vTotOutSct * (vDns[0] * 0.12f * AngleCoEff(fDPS))) * Shadow(fDPS, srfoffset); + + outVS.aux[AUX_RAYDEPTH] = clamp(fDRay, 0, 10); + + // Multiply in-coming light with phase and light scattering factors + outVS.insca = ((vRayInSct * RPhase(fDRS)) + (vMieInSct * MPhase(fDRS))) * vSunLight * fDRay; + outVS.insca = (1.0f - exp2(-outVS.insca)); + + outVS.sunlight = float4(vSunLight, fAmb); + + return outVS; +} + + + + + + +float4 SurfaceTechPS(TileVS frg, + uniform bool sbSpecular, + uniform bool sbRipples, + uniform bool sbMicro, + uniform bool sbNoAtmos, + uniform bool sbShadows) : COLOR +{ + + float2 vUVSrf = frg.texUV.xy * vTexOff.zw + vTexOff.xy; + float2 vUVWtr = frg.texUV.xy * vMicroOff.zw + vMicroOff.xy; + float2 vUVCld = frg.texUV.xy * vCloudOff.zw + vCloudOff.xy; + + vUVWtr.x += fTime/180.0f; + + float4 cMsk = tex2D(MaskTexS, vUVSrf); + float3 cNrm; + float fChA, fChB; + + if (sbRipples) cNrm = tex2D(OceaTexS, vUVWtr).xyz; + + float4 cTex = tex2D(DiffTexS, vUVSrf); + + if (bOverlay) { + float2 vUVOvl = frg.texUV.xy * vOverlayOff.zw + vOverlayOff.xy; + float4 cOvl = tex2D(OverlayS, vUVOvl); + cTex.rgb = lerp(cTex.rgb, cOvl.rgb, cOvl.a); + } + + if (sbShadows) { + if (bCloudSh) { + fChA = tex2D(CloudTexS, vUVCld).a; + fChB = tex2D(Cloud2TexS, vUVCld - float2(1, 0)).a; + } + } + + float fShadow = 1.0f; + +#if defined(_SHDMAP) + if (bShadows) { + frg.shdH.xyz /= frg.shdH.w; + frg.shdH.z = 1 - frg.shdH.z; + float2 sp = frg.shdH.xy * float2(0.5f, -0.5f) + float2(0.5f, 0.5f); + float pd = frg.shdH.z + 0.05f * vSHD[3]; + fShadow = 1.0f - SampleShadows(sp, pd); + } +#endif + + float3 cFar, cMed, cLow; + + if (sbMicro) { + float2 UV = frg.texUV.xy; + // Create normals + if (bMicroNormals) { + // Normal in .ag luminance in .b + cFar = tex2D(MicroCS, UV*vMSc2.zw + vMSc2.xy).agb; // High altitude micro texture C + cMed = tex2D(MicroBS, UV*vMSc1.zw + vMSc1.xy).agb; // Medimum altitude micro texture B + cLow = tex2D(MicroAS, UV*vMSc0.zw + vMSc0.xy).agb; // Low altitude micro texture A + } + else { + // Color in .rgb no normals + cFar = tex2D(MicroCS, UV*vMSc2.zw + vMSc2.xy).rgb; // High altitude micro texture C + cMed = tex2D(MicroBS, UV*vMSc1.zw + vMSc1.xy).rgb; // Medimum altitude micro texture B + cLow = tex2D(MicroAS, UV*vMSc0.zw + vMSc0.xy).rgb; // Low altitude micro texture A + } + } + + + float3 cSpe = 0; + float3 nrmW = normalize(frg.nrmW); // Per-pixel surface normal vector + float3 nvrW = nrmW; // Per-pixel surface normal vector + float3 camW = normalize(frg.camW); // Unit viewing ray + float3 vVrt = vCameraPos - frg.camW; // Geo-centric pixel position + //float3 vPlN = normalize(vVrt); // Planet mean normal + //float fRad = dot(vVrt, vPlN); // Pixel Geo-distance + float3 cNgt = saturate(frg.aux[AUX_NIGHT]) * fNight; + + + // Render with specular ripples and fresnel water ------------------------- + // + if (sbSpecular) { + + // Specular Mask + float m = (1.0 - cMsk.a) * saturate(0.2f - frg.aux[AUX_NIGHT] * 4.0f); + float f4 = 0; + + // Specular intensity + float fInts = saturate(1.0 - fCameraAlt * 0.2e-4); + + if (sbRipples) { + + float3 vPlN = normalize(vVrt); // Planet mean normal + + cNrm.xy = clamp((cNrm.xy - 0.5f) * fInts * 5.0f, -1, 1); + + cNrm.z = cos(cNrm.x * cNrm.y * 1.570796); + + // Compute world space normal + nrmW = (vTangent * cNrm.r) + (vBiTangent * cNrm.g) + (vPlN * cNrm.b); + nrmW = lerp(nvrW, nrmW, m); + } + + // Compute Fresnel term + float f = 1.0 - saturate(dot(camW, nrmW)); + float f2 = f*f; + f4 = f2*f2; + + // Compute specular reflection intensity + float s = dot(reflect(-vSunDir, nrmW), camW); + + cSpe = m * float3(1.2f, 1.1f, 1.0f) * pow(saturate(s), 35.0f) * max(0.7, fInts*1.5) * fShadow; + + // Apply fresnel reflection + cTex.rgb = lerp(cTex.rgb, cSky, m * f4); + } + + + // Render with surface microtextures -------------------------------------- + // + if (sbMicro) { + + float dist = frg.aux[AUX_DIST]; + float step1 = smoothstep(15000, 3000, dist); + step1 *= (step1*step1); + float3 cFnl = max(0, min(2, 1.333f*(cFar+cMed+cLow)-1)); + + // Create normals + if (bMicroNormals) { + + cFnl = cFnl.bbb; + + #if BLEND==0 + float2 cMix = (cFar.rg + cMed.rg + cLow.rg) * 0.6666f; // SOFT BLEND + #elif BLEND==1 + float2 cMix = (cFar.rg+0.5f) * (cMed.rg+0.5f) * (cLow.rg+0.5f); // MEDIUM BLEND + #else + float2 cMix = cFar.rg * cMed.rg * cLow.rg * 8.0f; // HARD BLEND + #endif + + float3 cNrm = float3((cMix - 1.0f) * 2.0f, 0) * step1; + cNrm.z = cos(cNrm.x * cNrm.y * 1.57); + // Approximate world space normal + nrmW = normalize((vTangent * cNrm.x) + (vBiTangent * cNrm.y) + (nvrW * cNrm.z)); + + // Bend the normal towards sun a bit + nrmW = normalize(nrmW + vSunDir * 0.06f); + } + // Apply luminance + cTex.rgb *= lerp(1.0f, cFnl, step1); + } + + + + // Is Debug mode enabled + /* + // ---------------------------------------------------------------------- + if (bDebug) { + float3 vPlN = normalize(vVrt); + float fRad = dot(vVrt, vPlN); + return DebugProg(nrmW, cTex.rgb, fRad); + } + // ---------------------------------------------------------------------- + */ + float3 cDiffLocal = 0; + + LocalLights(cDiffLocal, nrmW, -frg.camW); + + // Do we have an atmosphere or not ? + // + if (sbNoAtmos) { + + float3 vPlN = normalize(vVrt); // Planet mean normal + float fTrS = saturate(dot(nvrW, vSunDir)*10.0f); // Shadowing by terrain + float fPlS = saturate(dot(vPlN, vSunDir)*10.0f); // Shadowing by planet + + float fDNS = dot(nrmW, vSunDir); + float fDRS = dot(camW, vSunDir); + + float fX = pow(saturate(fDNS), 0.33f); // Lambertian + float fZ = pow(abs(fDRS), 5.0f) * 0.5f; // Shadow compensation + float fLvl = fX * (fZ + 1.0f) * fExposure; // Bake all together + + fLvl *= (fTrS * fPlS); // Apply shadows + + float3 color = cTex.rgb * Light_fx2(cSun*max(fLvl, 0) * fShadow + cDiffLocal); + + return float4(pow(saturate(color), fTrGamma), 1.0f); // Gamma corrention + } + else { + + float a = (tex2Dlod(NoiseTexS, float4(frg.texUV.xy, 0, 0)).r - 0.5f) * ATMNOISE; + float fShd = 1.0f; + + // Do we render cloud shadows ? + // + if (sbShadows) { + if (bCloudSh) { + fShd = (vUVCld.x < 1.0 ? fChA : fChB); + fShd *= fShd; + fShd = saturate(1.0 - fShd*fAlpha); + } + } + + // Night lights ? + if (bLights) { + cMsk.b = (cMsk.b > 0.15f ? cMsk.b : 0.0f); // Blue dirt filter + cNgt *= cMsk.rgb; + } + + float q = saturate(fCameraAlt * 1e-5); + + + // Terrain, Specular and Night lights + float3 sun = max(frg.sunlight.rgb * fShadow, float3(0.9, 0.9, 1.0) * frg.sunlight.w); + float3 color = cTex.rgb * Light_fx2(sun*fShd + cDiffLocal + cNgt*(1-q)) + (cNgt*q*3.0f); + float3 atten = exp2(-vTotOutSct * frg.aux[AUX_RAYDEPTH]); + + // Terrain with gamma correction and attennuation + color = pow(abs(color * fExposure), fTrGamma) * atten; + + // Add atmosphere with gamma correction + color += pow(abs(frg.insca.rgb * vHazeMax), fAtmGamma); + + // Add Specular component + color += cSpe * atten * fShd; + + return float4(color+a, 1.0f); + } +} + + + +// ============================================================================ +// Cloud Layer Renderer +// ============================================================================ + +CloudVS CloudTechVS(TILEVERTEX vrt) +{ + // Zero output. + CloudVS outVS = (CloudVS)0; + + // Apply a world transformation matrix + float3 vPosW = mul(float4(vrt.posL, 1.0f), mWorld).xyz; + float3 vNrmW = mul(float4(vrt.normalL, 0.0f), mWorld).xyz; + outVS.posH = mul(float4(vPosW, 1.0f), mViewProj); + outVS.nrmW = vNrmW; + outVS.texUV.xy = vrt.tex0.xy; // Note: vrt.tex0 is un-used (hardcoded in Tile::CreateMesh and varies per tile) + + float3 vVrt = vCameraPos + vPosW; // Geo-centric vertex position + float3 vPlN = normalize(vVrt); + float3 vRay = normalize(-vPosW); // Unit viewing ray + float fDPS = dot(vPlN, vSunDir); // Dot mean normal, sun direction + float fRay = abs(dot(vPosW, vRay)); // Vertex camera distance + float fTrA = saturate(fDPS*2.924f + 0.657f); + + // Camara altitude dependency multiplier for ambient color of atmosphere + + float fAmb = max(saturate(fTrA*8.0*fAmbient), fGlobalAmb) * 0.25f; + + float fDPR = dot(vPlN, vRay); // Dot mean normal, viewing ray + float fDNR = dot(vNrmW, vRay); + float fDNS = dot(vNrmW, vSunDir); // Dot vertex normal, sun direction + float fDRS = dot(vRay, vSunDir); // Dot viewing ray, sun direction + float fDst = dot(vVrt, vPlN); // Vertex geo-distance + float fAlt = fDst - fRadius; // Vertex altitude + + float fCamAlt = fCameraAlt; + + if (bInSpace) { + float fCm2 = fDst * fDst; + float fPrm = fDst * fDPR; + fCamAlt = fHorizonAlt; + fRay = sqrt(fAtmRad2 - (fCm2 - fPrm*fPrm)) - fPrm; // Length of the ray inside atmosphere + } + + + // Altitude vector for sample points + float3 vAlt = float3(fAlt, (fAlt + fCamAlt)*0.5, fCamAlt); + + // Compute atmospheric density for all sample points + float3 vDns = exp2(-vAlt*fInvScaleHeight); // Compute atmospheric density for all sample points + + // Evaluate a Gauss-Lobatto integral to give an optical depth for a viewing ray + float fDRay = dot(vDns, vWeight3) * (fRay * fInvScaleHeight) * 0.3465735903f; + + fDRay *= 0.5; + + float3 vSunLight = exp2(-vTotOutSct * (vDns[0] * 0.25f * AngleCoEff(fDPS))) * Shadow(fDPS, srfoffset); + + // Compute surface texture color attennuation (i.e. extinction term) + outVS.atten = exp2(-vTotOutSct * fDRay); + outVS.fade.x = exp2(-fDRay * 0.5f) * 2.0f; + outVS.fade.y = 1.0f - abs(dot(vPolarAxis, vPlN)); + + // Multiply in-coming light with phase and light scattering factors + outVS.insca = ((vRayInSct * RPhase(fDRS)) + (vMieInSct * MPhase(fDRS))) * vSunLight * fDRay; + + outVS.insca = (1.0f - exp2(-outVS.insca)); + outVS.atten *= max(vSunLight, (vRayInSct + 1.0f) * fAmb*0.75f) * 1.3f; + + return outVS; +} + + +float4 CloudTechPS(CloudVS frg) : COLOR +{ + float2 vUVMic = frg.texUV.xy * vMicroOff.zw + vMicroOff.xy; + float2 vUVTex = frg.texUV.xy; + + float a = (tex2Dlod(NoiseTexS, float4(vUVTex,0,0)).r - 0.5f) * ATMNOISE; + + float4 cTex = tex2D(DiffTexS, vUVTex); + + if (!bEarth) { + // This is not the Earth + float3 color = cTex.rgb*frg.atten.rgb*fCloudInts + frg.insca.rgb*vHazeMax; + return float4(saturate(color + a), cTex.a*saturate(frg.fade.x*fCloudInts*fCloudInts)); + } + + // ----------------------------------------------- + // Cloud layer rendering for Earth + // ----------------------------------------------- + + float4 cMic = tex2D(CloudMicroS, vUVMic); + +#if defined(_CLOUDNORMALS) + + if (bCloudNorm) { + +#if defined(_CLOUDMICRO) + float4 cMicNorm = tex2D(CloudMicroNormS, vUVMic); // Filename "cloud1_norm.dds" +#endif + + // Filter width + float d = 2.0 / 512.0; + float3 nrm = 0; + + float x1 = tex2D(DiffTexS, vUVTex + float2(-d, 0)).a; + float x2 = tex2D(DiffTexS, vUVTex + float2(+d, 0)).a; + nrm.x = (x1*x1 - x2*x2); + + float y1 = tex2D(DiffTexS, vUVTex + float2(0, -d)).a; + float y2 = tex2D(DiffTexS, vUVTex + float2(0, +d)).a; + nrm.y = (y1*y1 - y2*y2); + + float dMN = dot(frg.nrmW, vSunDir); // Planet mean normal sun angle + +#if defined(_CLOUDMICRO) + // Blend in cloud normals only on moderately thick clouds, allowing the highest cloud tops to be smooth. + nrm.xy = (nrm.xy + saturate((cTex.a * 10.0f) - 3.0f) * saturate(((1.0f - cTex.a) * 10.0f) - 1.0f) * (cMicNorm.rg - 0.5f)); // new +#endif + // Increase normals contrast based on sun-earth angle. + nrm.xyz = nrm.xyz * (1.0f + (0.5f * dMN)); + + nrm.z = sqrt(1.0f - saturate(nrm.x*nrm.x + nrm.y*nrm.y)); + + // Approximate world space normal from local tangent space + nrm = normalize((vTangent * nrm.x) + (vBiTangent * nrm.y) + (frg.nrmW * nrm.z)); + + float dCS = dot(nrm, vSunDir); // Cloud normal sun angle + + // Brighten the lighting model for clouds, based on sun-earth angle. Twice is better. + // Low sun angles = greater effect. No modulation leads to washed out normals at high sun angles. + dCS = saturate((1.0f - dMN) * (dCS * (1.0f - dCS)) + dCS); + dCS = saturate((1.0f - dMN) * (dCS * (1.0f - dCS)) + dCS); + + // With a high sun angle, don't let the dCS go below 0.2 to avoid unnaturally dark edges. + dCS = lerp(0.2f*dMN, 1.0f, dCS); + + // Effect of normal/sun angle to color + // Add some brightness (borrowing red channel from sunset attenuation) + // Adding it to the sun illumination factor, taking care to keep from saturating + cTex.rgb *= dCS + ((1.0f - dCS) * 0.2f); + } +#endif + +#if defined(_CLOUDMICRO) + float f = cTex.a; + float g = lerp(1.0f, cMic.a, frg.fade.y); + float h = (g + 4.0f)*0.2f; + cTex.a = saturate(lerp(g, h, f) * f); +#endif + + // Reduce attenuation near terminator (multiply by 3) + // Change attenuation to be grayscale, not colored (.r not .rgb) + // Ensure illumination goes as far as possible by borrowing red channel (.r) + //float3 color = cTex.rgb*saturate(frg.atten.r * 3)*fCloudInts; + float3 color = cTex.rgb*saturate(frg.atten.r * 3)*fCloudInts; + + // Blend haze without saturating + color = lerp(color, 1.0f, frg.insca.rgb*vHazeMax); + + return float4(saturate(color + a), cTex.a*saturate(fCloudInts*fCloudInts)); +} + + +technique CloudTech +{ + pass P0 + { + vertexShader = compile vs_3_0 CloudTechVS(); + pixelShader = compile ps_3_0 CloudTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZEnable = false; + ZWriteEnable = false; + } +} + + +#if defined(_CLOUDSHADOWS) +#define _CLDSHD true +#else +#define _CLDSHD false +#endif + + +// This is used for high resolution base tiles -------------------------------- +// +technique TileTech +{ + + pass P0 // Earth + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(true, true, false, false, _CLDSHD); + vertexShader = compile vs_3_0 SurfaceTechVS(true, false); + AlphaBlendEnable = false; //Rippl, NoAtm + } + + pass P1 // Earth, NoRipples + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(true, false, false, false, _CLDSHD); + vertexShader = compile vs_3_0 SurfaceTechVS(false, false); + AlphaBlendEnable = false; //Rippl, NoAtm + } + + pass P2 // Mars + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(false, false, true, false, false); + vertexShader = compile vs_3_0 SurfaceTechVS(false, false); + AlphaBlendEnable = false; //Rippl, NoAtm + } + + pass P3 // Mars, no micro + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(false, false, false, false, false); + vertexShader = compile vs_3_0 SurfaceTechVS(false, false); + AlphaBlendEnable = false; //Rippl, NoAtm + } + + pass P4 // Luna + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(false, false, true, true, false); + vertexShader = compile vs_3_0 SurfaceTechVS(false, true); + AlphaBlendEnable = false; //Rippl, NoAtm + } + + pass P5 // Luna, no micro + { + //Spec, Rippl, Mic, NoAtm, Shadows + pixelShader = compile ps_3_0 SurfaceTechPS(false, false, false, true, false); + vertexShader = compile vs_3_0 SurfaceTechVS(false, true); + AlphaBlendEnable = false; //Rippl, NoAtm + } +} + + + +// ============================================================================ +// Render Horizon "Ring" from the space +// ============================================================================ + +HazeVS RingTechVS(float3 posL : POSITION0) +{ + // Zero output. + HazeVS outVS = (HazeVS)0; + + posL.xz *= lerp(vTexOff[0], vTexOff[1], posL.y); + posL.y = lerp(vTexOff[2], vTexOff[3], posL.y); + + float3 posW = mul(float4(posL, 1.0f), mWorld).xyz; + outVS.posH = mul(float4(posW, 1.0f), mViewProj); + + if (bOnOff) SkyColor(outVS.insca, normalize(posW)); // HorizonColor(outVS.insca, normalize(posW)); + else outVS.insca = float3(0, 0, 0); + + return outVS; +} + +float4 RingTechPS(HazeVS frg) : COLOR +{ + float a = (tex2Dlod(NoiseTexS, float4(frg.texUV,0,0)).r - 0.5f) * ATMNOISE; + return float4(frg.insca.rgb+a, 1.0f); +} + +technique RingTech +{ + pass P0 + { + vertexShader = compile vs_3_0 RingTechVS(); + pixelShader = compile ps_3_0 RingTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = One; + DestBlend = One; + ZEnable = false; + ZWriteEnable = false; + } +} + + + + + + +// ============================================================================ +// Render SkyDome and Horizon +// ============================================================================ + +HazeVS HorizonTechVS(float3 posL : POSITION0) +{ + // Zero output. + HazeVS outVS = (HazeVS)0; + + outVS.texUV = posL.xy*10.0; + + posL.xz *= lerp(vTexOff[0], vTexOff[1], posL.y); + posL.y = lerp(vTexOff[2], vTexOff[3], posL.y); + + float3 posW = mul(float4(posL, 1.0f), mWorld).xyz; + outVS.posH = mul(float4(posW, 1.0f), mViewProj); + + if (bOnOff) SkyColor(outVS.insca, normalize(posW)); + else outVS.insca = float3(0, 0, 0); + + return outVS; +} + + +float4 HorizonTechPS(HazeVS frg) : COLOR +{ + float a = (tex2Dlod(NoiseTexS, float4(frg.texUV,0,0)).r - 0.5f) * 0.008; + return float4(frg.insca.rgb+a, 1.0f); +} + +technique HorizonTech +{ + pass P0 + { + vertexShader = compile vs_3_0 HorizonTechVS(); + pixelShader = compile ps_3_0 HorizonTechPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + SrcBlend = One; + DestBlend = One; + ZEnable = false; + ZWriteEnable = false; + } +} + + + +// ============================================================================ +// Render Skydome (i.e. Celestial Sphere Background Image Manager) from Space +// ============================================================================ + +CelSphereVS SpaceTechVS(TILEVERTEX vrt) +{ + // Zero output. + CelSphereVS outVS = (CelSphereVS)0; + float3 posW = mul(float4(vrt.posL, 1.0f), mWorld).xyz; + outVS.posH = mul(float4(posW, 1.0f), mViewProj); + outVS.tex0 = vrt.tex0; + return outVS; +} + +float4 SpaceTechPS(CelSphereVS frg) : COLOR +{ + float3 vColor = tex2D(DiffTexS, frg.tex0).rgb * fAlpha; + return float4(vColor, 1.0); +} + +technique SkyDomeTech +{ + pass P0 + { + vertexShader = compile vs_3_0 SpaceTechVS(); + pixelShader = compile ps_3_0 SpaceTechPS(); + + AlphaBlendEnable = false; + ZEnable = false; + ZWriteEnable = false; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Vessel.fx b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Vessel.fx new file mode 100644 index 0000000000..725b497b2e --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/D3D9Client/Vessel.fx @@ -0,0 +1,328 @@ +// ============================================================== +// Part of the ORBITER VISUALISATION PROJECT (OVP) +// Dual licensed under GPL v3 and LGPL v3 +// ============================================================== + + + +float3 cLuminosity = { 0.4, 0.7, 0.3 }; + + +inline float cmax(float3 color) +{ + return max(max(color.r, color.g), color.b); +} + +// Sun light brightness for diffuse and specular lighting +#include "LightBlur.hlsl" + +// Incluse Light and Shadow +#include "Common.hlsl" + +// Must be included here +#include "PBR.fx" + +// Must be included here +#include "Metalness.fx" + +// ============================================================================ +// Vertex shader for physics based rendering +// +PBRData AdvancedVS(MESH_VERTEX vrt) +{ + // Zero output. + PBRData outVS = (PBRData)0; + + float3 posW = mul(float4(vrt.posL, 1.0f), gW).xyz; + float3 nrmW = mul(float4(vrt.nrmL, 0.0f), gW).xyz; + +#if SHDMAP > 0 + outVS.shdH = mul(float4(posW, 1.0f), gLVP); +#endif + + outVS.nrmW = nrmW; + outVS.tanW = float4(mul(float4(vrt.tanL, 0.0f), gW).xyz, vrt.tex0.z); + outVS.posH = mul(float4(posW, 1.0f), gVP); + outVS.camW = -posW; + outVS.tex0 = vrt.tex0.xy; + + return outVS; +} + + + +// ============================================================================ +// +float4 AdvancedPS(float4 sc : VPOS, PBRData frg) : COLOR +{ + float3 bitW; + float3 nrmT; + float3 cRefl; + float3 cEmis; + float4 cSpec; + float4 cTex; + + float3 cDiffLocal; + float3 cSpecLocal; + + + if (gCfg.Norm) nrmT = tex2D(Nrm0S, frg.tex0.xy).rgb; + + if (gCfg.Spec) cSpec = tex2D(SpecS, frg.tex0.xy); + else cSpec = gMtrl.specular; + + + if (gTextured) cTex = tex2D(WrapS, frg.tex0.xy); + else cTex = 1; + + + if (gCfg.Refl) cRefl = tex2D(ReflS, frg.tex0.xy).rgb; + else cRefl = gMtrl.reflect.rgb; + + // Sample emission map. (Note: Emissive materials and textures need to go different stages, material is added to light) + if (gCfg.Emis) cEmis = tex2D(EmisS, frg.tex0.xy).rgb; + else cEmis = 0; + + + float3 nrmW = frg.nrmW; + float3 tanW = frg.tanW.xyz; + float3 cSun = saturate(gSun.Color); + float3 CamD = normalize(frg.camW); + float3 Base = (gMtrl.ambient.rgb*gSun.Ambient) + (gMtrl.emissive.rgb); + + + // Compute World space normal ------------------------------------------- + // + if (gCfg.Norm) { + nrmT = nrmT * 2.0 - 1.0; + bitW = cross(tanW, nrmW) * frg.tanW.w; + nrmW = nrmW*nrmT.z + tanW*nrmT.x + bitW*nrmT.y; + } + + nrmW = normalize(nrmW); + + float3 TnrmW = -nrmW; + float3 RflW = reflect(-CamD, nrmW); + float dLN = saturate(-dot(gSun.Dir, nrmW)); + + if (gCfg.Spec) cSpec.a *= 255.0f; + + // Approximate roughness + float fRghn = log2(cSpec.a) * 0.1f; + + // Sunlight calculation + float fSun = pow(saturate(-dot(RflW, gSun.Dir)), cSpec.a) * saturate(cSpec.a); + + if (dLN == 0) fSun = 0; + + // Special alpha only texture in use + if (gNoColor) cTex.rgb = 1; + + + // ---------------------------------------------------------------------- + // Add vessel self-shadows + // ---------------------------------------------------------------------- + +#if SHDMAP > 0 + cSun.rgb *= ComputeShadow(frg.shdH, dLN, sc); +#endif + + + + // ---------------------------------------------------------------------- + // Compute Local Light Sources + // ---------------------------------------------------------------------- + + LocalLightsEx(cDiffLocal, cSpecLocal, nrmW, -frg.camW, cSpec.a, false); + + + // Lit the diffuse texture + cTex.rgb *= saturate(Base + gMtrl.diffuse.rgb * Light_fx(cDiffLocal + cSun * dLN)); + + // Lit the specular surface + cSpec.rgb *= saturate(cSpecLocal + fSun * cSun); + + + // Compute Transluciency effect -------------------------------------------------------------- + // + + if (gCfg.Transm || gCfg.Transl) { + + float4 cTransm = float4(cTex.rgb, 1.0f); + + if (gCfg.Transm) { + cTransm = tex2D(TransmS, frg.tex0.xy); + cTransm.a *= 1024.0f; + } + + float3 cTransl = cTex.rgb; + + if (gCfg.Transl) { + cTransl = tex2D(TranslS, frg.tex0.xy).rgb; + } + + // Texture Tuning ------------------------------------------------------- + // + if (gTuneEnabled) { + cTransm *= gTune.Transm.rgba; + cTransl *= gTune.Transl.rgb; + } + + float sunLightFromBehind = saturate(dot(gSun.Dir, nrmW)); + float sunSpotFromBehind = pow(saturate(dot(gSun.Dir, CamD)), cTransm.a); + sunSpotFromBehind *= saturate(sunLightFromBehind * 3.0f);// Causes the transmittance (sun spot) effect to fall off at very shallow angles + + cTransl.rgb *= saturate(cSun * sunLightFromBehind); + + cTex.rgb += (1 - cTex.rgb) * cTransl.rgb; + cTex.rgb += cTransm.rgb * (sunSpotFromBehind * cSun); + } + + + float fFrsl = 1.0f; + float fInt = 0.0f; + + // Compute reflectivity + float fRefl = cmax(cRefl); + + +#if defined(_ENVMAP) + + + // Compute environment map/fresnel effects -------------------------------- + // + if (gEnvMapEnable) { + + // Do we need fresnel code for this render pass ? + + if (gFresnel) { + + fFrsl = gMtrl.fresnel.y; + + // Get mirror reflection for fresnel + float3 cEnvFres = texCUBElod(EnvMapAS, float4(RflW, 0)).rgb; + + float dCN = saturate(dot(CamD, nrmW)); + + // Compute a fresnel term with compensations included + fFrsl *= pow(1.0f - dCN, gMtrl.fresnel.x) * (1.0 - fRefl) * any(cRefl); + + // Sunlight reflection for fresnel material + cSpec.rgb = saturate(cSpec.rgb + fSun * fFrsl * cSun); + + // Compute total reflected light with fresnel reflection + // and accummulate in cSpec + cSpec.rgb = saturate(cSpec.rgb + fFrsl * cEnvFres); + + // Compute intensity + fInt = saturate(dot(cSpec.rgb, cLuminosity)); + + // Attennuate diffuse surface + cTex.rgb *= (1.0f - fInt); + } + + // Compute LOD level for blur effect + float fLOD = (1.0f - fRghn) * 10.0f; + + float3 cEnv = texCUBElod(EnvMapAS, float4(RflW, fLOD)).rgb; + + // Compute total reflected light, accummulate in cSpec + cSpec.rgb += cRefl.rgb * cEnv; + } + +#endif + + // Attennuate diffuse surface + cTex.rgb *= (1.0f - fRefl); + + // Re-compute output alpha for alpha blending stage + // NOTE: Without fresnel fInt remains zero + cTex.a = saturate(cTex.a + fInt); + + // Add reflections to output + cTex.rgb += cSpec.rgb; + + // Add emissive textures to output + cTex.rgb += cEmis; + +#if defined(_DEBUG) + //if (gDebugHL) cTex = cTex*0.5f + gColor; + cTex = cTex * (1 - gColor*0.5f) + gColor; +#endif + + return cTex; +} + + + + + +// ============================================================================ +// This is the default mesh rendering technique +// +technique VesselTech +{ + pass P0 + { + vertexShader = compile vs_3_0 PBR_VS(); + pixelShader = compile ps_3_0 PBR_PS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + } + + pass P1 + { + vertexShader = compile vs_3_0 AdvancedVS(); + pixelShader = compile ps_3_0 AdvancedPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + } + + pass P2 + { + vertexShader = compile vs_3_0 FAST_VS(); + pixelShader = compile ps_3_0 FAST_PS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + } + + pass P3 // XR2 HUD PASS + { + vertexShader = compile vs_3_0 FAST_VS(); + pixelShader = compile ps_3_0 XRHUD_PS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + } + pass P4 + { + vertexShader = compile vs_3_0 MetalnessVS(); + pixelShader = compile ps_3_0 MetalnessPS(); + + AlphaBlendEnable = true; + BlendOp = Add; + ZEnable = true; + SrcBlend = SrcAlpha; + DestBlend = InvSrcAlpha; + ZWriteEnable = true; + } +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/D3D9Client.dll b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/D3D9Client.dll new file mode 100644 index 0000000000..99a8d0ad2d Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/D3D9Client.dll differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/DX9ExtMFD.dll b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/DX9ExtMFD.dll new file mode 100644 index 0000000000..bd916c61ec Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/DX9ExtMFD.dll differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/GenericCamera.dll b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/GenericCamera.dll new file mode 100644 index 0000000000..c079dc47f2 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Modules/Plugin/GenericCamera.dll differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/D3D9GraphicsGuide.pdf b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/D3D9GraphicsGuide.pdf new file mode 100644 index 0000000000..d2da163a41 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/D3D9GraphicsGuide.pdf differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/gcAPI.chm b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/gcAPI.chm new file mode 100644 index 0000000000..0e42e4208a Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/doc/gcAPI.chm differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/DrawAPI_doc.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/DrawAPI_doc.h new file mode 100644 index 0000000000..f12b637aae --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/DrawAPI_doc.h @@ -0,0 +1,542 @@ +// ====================================================================== +// ORBITER SOFTWARE DEVELOPMENT KIT +// Copyright (C) 2008 Martin Schweiger +// All rights reserved +// DrawAPI.h +// 2-D surface drawing support interface. +// This API defines an abstraction layer for providing drawing support +// for surfaces (e.g. lines and text). It is closely modelled on the +// Windows GDI, but provides an overload mechanism to insert different +// drawing systems. +// ====================================================================== + + +// =================================================================================================================================== +// !! ATTENTION !! THIS FILE IS USED ONLY FOR DOCUMENTATION WITH DOXYGEN WITH SOME D3D9 SPECIFIC INFORMATION CHANGES. !! ATTENTION !! +// =================================================================================================================================== + + +/** + * \file DrawAPI.h + * \brief 2-D surface drawing support interface. + */ + +#ifndef __DRAWAPI_H +#define __DRAWAPI_H + +#include "OrbiterAPI.h" + +namespace oapi { + +/** + * \brief Integer-valued 2-D vector type. + * \note This structure is designed to be compatible with the Windows POINT type. + */ +union IVECTOR2 { + long data[2]; ///< vector data array + struct { + long x; ///< vector x coordinate + long y; ///< vector y coordinate + }; +}; + +// ====================================================================== +// class oapi::DrawingTool +// ====================================================================== +/** + * \brief Base class for various 2-D drawing resources (fonts, pens, + * brushes, etc.) + */ +class OAPIFUNC DrawingTool { +public: + /** + * \brief Drawing tool constructor. + */ + DrawingTool () {} + + /** + * \brief Drawing tool destructor. + */ + virtual ~DrawingTool () {} +}; + +// ====================================================================== +// class oapi::Font +// ====================================================================== +/** + * \brief A font resource for drawing text. A font has a defined size, + * typeface, slant, weight, etc. Fonts can be selected into a Sketchpad + * and then apply to all subsequent Text calls. + */ +class OAPIFUNC Font: public DrawingTool { +public: + /** + * \brief Font decoration style. + * \sa Font(int,bool,char*,Style) + */ + enum Style { + NORMAL=0, ///< no decoration + BOLD=1, ///< boldface + ITALIC=2, ///< italic + UNDERLINE=4 ///< underlined + }; + +protected: + /** + * \brief Font constructor. + * \param height cell or character height [pixel] + * \param prop proportional/fixed width flag + * \param face font face name + * \param style font decoration + * \param orientation text orientation [1/10 deg] + * \note If \e height > 0, it represents the font cell height. If height < 0, + * its absolute value represents the character height. + * \note The \e style parameter can be any combination of the \ref Style + * enumeration items. + * \note Overloaded font implementations should understand at least the + * following generic face names: "Fixed" (fixed pitch font), "Sans" + * (sans-serif font, and "Serif" (serif font) and translate them to + * appropriate specific fonts, e.g. "Courier" or "Courier New" for "Fixed", + * "Helvetica" or "Arial" for "Sans", and "Times" or "Times New Roman" for + * "Serif". + * \note If a font name is not recognised, the \e prop value should be + * checked. If prop==true, the default "Sans" font should be used. If + * false, the default "Fixed" font should be used. + */ + Font (int height, bool prop, const char *face, Style style=NORMAL, int orientation=0) {} + +public: + /** + * \brief Font destructor. + */ + virtual ~Font () {} + + /** + * \brief Return the GDI handle for the font, if available. + * \return GDI font handle + * \note Non-GDI clients should not overload this method. + */ + virtual HFONT GetGDIFont () const { return 0; } +}; + + +// ====================================================================== +// class oapi::Pen +// ====================================================================== +/** + * \brief A pen is a resource used for drawing lines and the outlines of + * closed figures such as retangles, ellipses and polygons. + */ +class OAPIFUNC Pen: public DrawingTool { +protected: + /** + * \brief Pen constructor. + * \param style line style (0=invisible, 1=solid, 2=dashed) + * \param width line width [pixel] + * \param col line colour (format: 0xAABBGGRR) + */ + Pen (int style, int width, DWORD col) {} + +public: + /** + * \brief Pen destructor. + */ + virtual ~Pen () {} +}; + + +// ====================================================================== +// class oapi::Brush +// ====================================================================== +/** + * \brief A brush is a drawing resource for filling closed figures + * (rectangles, ellipses, polygons). + */ +class OAPIFUNC Brush: public DrawingTool { +protected: + /** + * \brief Brush constructor. + * \param col brush colour (format: 0xAABBGGRR) + */ + Brush (DWORD col) {}; + +public: + /** + * \brief Brush destructor. + */ + virtual ~Brush () {} +}; + + +// ====================================================================== +// class oapi::Sketchpad +// ====================================================================== +/** + * \brief A %Sketchpad object defines an environment for drawing onto 2-D + * surfaces. + * + * It defines drawing primitives (lines, text, etc.) that can be used for + * preparing MFD surfaces, panel elements or vessel markings. + * + * The drawing object is an abstract class which must be implemented by + * derived graphics clients. An example for a DrawingObject implementation + * is via the Windows GDI (graphics device interface). + */ +class OAPIFUNC Sketchpad { +public: + /** + * \brief Constructs a drawing object for a given surface. + * \param s surface handle + */ + Sketchpad (SURFHANDLE s); + + /** + * \brief Destructor. Destroys a drawing object. + */ + virtual ~Sketchpad (); + + /** + * \brief Selects a new font to use. + * \param font pointer to font resource + * \return Previously selected font. + * \default None, returns NULL. + * \sa oapi::Font, oapi::GraphicsClient::clbkCreateFont + */ + virtual Font *SetFont (Font *font) const { return NULL; } + + /** + * \brief Selects a new pen to use. + * \param pen pointer to pen resource, or NULL to disable outlines + * \return Previously selected pen. + * \default None, returns NULL. + * \sa oapi::Pen, oapi::GraphicsClient::clbkCreatePen + */ + virtual Pen *SetPen (Pen *pen) const { return NULL; } + + /** + * \brief Selects a new brush to use. + * \param brush pointer to brush resource, or NULL to disable fill mode + * \return Previously selected brush. + * \default None, returns NULL. + * \sa oapi::Brush, oapi::GraphicsClient::clbkCreateBrush + */ + virtual Brush *SetBrush (Brush *brush) const { return NULL; } + + /** + * \brief Horizontal text alignment modes. + * \sa SetTextAlign + */ + enum TAlign_horizontal { + LEFT, ///< align left + CENTER, ///< align center + RIGHT ///< align right + }; + + /** + * \brief Vertical text alignment modes. + * \sa SetTextAlign + */ + enum TAlign_vertical { + TOP, ///< align top of text line + BASELINE, ///< align base line of text line + BOTTOM ///< align bottom of text line + }; + + /** + * \brief Set horizontal and vertical text alignment. + * \param tah horizontal alignment + * \param tav vertical alignment + * \default None. + */ + virtual void SetTextAlign (TAlign_horizontal tah=LEFT, TAlign_vertical tav=TOP) {} + + /** + * \brief Set the foreground colour for text output. + * \param col colour description (format: 0xAABBGGRR) + * \return Previous colour setting. + * \default None, returns 0. + */ + virtual DWORD SetTextColor (DWORD col) { return 0; } + + /** + * \brief Set the background colour for text output. + * \param col background colour description (format: 0xAABBGGRR) + * \return Previous colour setting + * \default None, returns 0. + * \note The background colour is only used if the background mode + * is set to BK_OPAQUE. + * \sa SetBackgroundMode + */ + virtual DWORD SetBackgroundColor (DWORD col) { return 0; } + + /** + * \brief Background modes for text output. + * \sa SetBackgroundMode + */ + enum BkgMode { + BK_TRANSPARENT, ///< transparent background + BK_OPAQUE ///< opaque background + }; + + /** + * \brief Set the background mode for text and drawing operations. + * \param mode background mode (see \ref BkgMode) + * \default None. + * \note This function affects text output and dashed line drawing. + * \note In opaque background mode, text background and the gaps + * between dashed lines are drawn in the current background colour + * (see SetBackgroundColor). In transparent mode, text background + * and line gaps are not modified. + * \note The default background mode (before the first call of + * SetBackgroundMode) should be transparent. + * \sa SetBackgroundColor, SetTextColor + */ + virtual void SetBackgroundMode (BkgMode mode) {} + + /** + * \brief Return height and (average) width of a character in the currently + * selected font. + * \return Height of character cell [pixel] in the lower 16 bit of the return value, + * and (average) width of character cell [pixel] in the upper 16 bit. + * \default None, returns 0. + * \note The height value should describe the height of the character cell (i.e. + * the smallest box circumscribing all characters in the font), but without any + * "internal leading", i.e. the gap between characters in two consecutive lines. + * \note For proportional fonts, the width value should be an approximate average + * character width. + */ + virtual DWORD GetCharSize () { return 0; } + + /** + * \brief Return the width of a text string in the currently selected font. + * \param str text string + * \param len string length, or 0 for auto (0-terminated string) + * \return width of the string, drawn in the currently selected font [pixel] + * \default None, returns 0. + * \sa SetFont + */ + virtual DWORD GetTextWidth (const char *str, int len = 0) { return 0; } + + /** + * \brief Set the position in the surface bitmap which is mapped to the + * origin of the coordinate system for all drawing functions. + * \param x horizontal position of the origin [pixel] + * \param y vertical position of the origin [pixel] + * \default None. + * \note By default, the reference point for drawing function coordinates is + * the top left corner of the bitmap, with positive x-axis to the right, + * and positive y-axis down. + * \note SetOrigin can be used to shift the logical reference point to a + * different position in the surface bitmap (but not to change the + * orientation of the axes). + * \note If the drawing system used by an implementation does not support + * this function directly, the derived class should itself account for the + * shift in origin, by subtracting the offset from all coordinate values. + * \sa GetOrigin + */ + virtual void SetOrigin (int x, int y) {} + + /** + * \brief Returns the position in the surface bitmap which is mapped to + * the origin of the coordinate system for all drawing functions. + * \param [out] x pointer to integer receiving horizontal position of the origin [pixel] + * \param [out] y pointer to integer receiving vertical position of the origin [pixel] + * \default Returns (0,0) + * \sa SetOrigin + */ + virtual void GetOrigin (int *x, int *y) const { *x = 0, *y = 0; } + + /** + * \brief Draw a text string. + * \param x reference x position [pixel] + * \param y reference y position [pixel] + * \param str text string + * \param len string length for output + * \return \e true on success, \e false on failure. + * \default None, returns false. + */ + virtual bool Text (int x, int y, const char *str, int len) { return false; } + + /** + * \brief Draw a text string into a rectangle. + * \param x1 left edge [pixel] + * \param y1 top edge [pixel] + * \param x2 right edge [pixel] + * \param y2 bottom edge [pixel] + * \param str text string + * \param len string length for output + * \return \e true on success, \e false on failure. + * \default Implementation via \ref Text calls. + * \note This method should write the text string into the specified + * rectangle, using the current font. Line breaks should automatically + * be applied as required to fit the text in the box. + * \note The bottom edge (y2) should probably be ignored, so text isn't + * truncated if it doesn't fit the box. + */ + virtual bool TextBox (int x1, int y1, int x2, int y2, const char *str, int len); + + /** + * \brief Draw a single pixel in a specified colour. + * \param x x-coordinate of point [pixel] + * \param y y-coordinate of point [pixel] + * \param col pixel colour (format: 0xBBGGRR) + */ + virtual void Pixel (int x, int y, DWORD col) {} + + /** + * \brief Move the drawing reference to a new point. + * \param x x-coordinate of new reference point [pixel] + * \param y y-coordinate of new reference point [pixel] + * \note Some methods use the drawing reference point for + * drawing operations, e.g. \ref LineTo. + * \default None. + * \sa LineTo + */ + virtual void MoveTo (int x, int y) {} + + /** + * \brief Draw a line to a specified point. + * \param x x-coordinate of line end point [pixel] + * \param y y-coordinate of line end point [pixel] + * \default None. + * \note The line starts at the current drawing reference + * point. + * \sa MoveTo + */ + virtual void LineTo (int x, int y) {} + + /** + * \brief Draw a line between two points. + * \param x0 x-coordinate of first point [pixel] + * \param y0 y-coordinate of first point [pixel] + * \param x1 x-coordinate of second point [pixel] + * \param y1 y-coordinate of second point [pixel] + * \default None. + * \note The line is drawn with the currently selected pen. + * \sa SetPen + */ + virtual void Line (int x0, int y0, int x1, int y1) {} + + /** + * \brief Draw a rectangle (filled or outline). + * \param x0 left edge of rectangle [pixel] + * \param y0 top edge of rectangle [pixel] + * \param x1 right edge of rectangle [pixel] + * \param y1 bottom edge of rectangle [pixel] + * \default Draws the rectangle from 4 line segments by + * calling \ref MoveTo and \ref LineTo. + * \note Derived classes should overload this method if possible, + * because the default method does not allow to draw filled + * rectangles, and may be less efficient than a dedicated + * implementation. + * \note Implementations should fill the rectangle with the + * currently selected brush resource. + * \sa MoveTo, LineTo, Ellipse, Polygon + */ + virtual void Rectangle (int x0, int y0, int x1, int y1); + + /** + * \brief Draw an ellipse from its bounding box. + * \param x0 left edge of bounding box [pixel] + * \param y0 top edge of bounding box [pixel] + * \param x1 right edge of bounding box [pixel] + * \param y1 bottom edge of bounding box [pixel] + * \default None. + * \note Implementations should fill the ellipse with the + * currently selected brush resource. + * \sa Rectangle, Polygon + */ + virtual void Ellipse (int x0, int y0, int x1, int y1) {} + + /** + * \brief Draw a closed polygon given by vertex points. + * \param pt list of vertex points + * \param npt number of points in the list + * \default None. + * \note Implementations should draw the outline of the + * polygon with the current pen, and fill it with the + * current brush. + * \note The polygon should be closed, i.e. the last point + * joined with the first one. + * \note Due to performance heavy triangularization maximum + * number of points is limited to 64 when filled with brush. + * \sa Polyline, PolyPolygon, Rectangle, Ellipse + */ + virtual void Polygon (const IVECTOR2 *pt, int npt) {} + + /** + * \brief Draw a line of piecewise straight segments. + * \param pt list of vertex points + * \param npt number of points in the list + * \default None + * \note Implementations should draw the line with the + * currently selected pen. + * \note Polylines are open figures: the end points are + * not connected, and no fill operation is performed. + * \sa Polygon, PolyPolyline, Rectangle, Ellipse + */ + virtual void Polyline (const IVECTOR2 *pt, int npt) {} + + /** + * \brief Draw a set of polygons. + * \param pt list of vertex points for all polygons + * \param npt list of number of points for each polygon + * \param nline number of polygons + * \default Calls Polygon for each line in the list. + * \note The number of entries in npt must be >= nline, and + * the number of points in pt must be at least the sum of + * the values in npt. + * \note Implementations should overload this function if + * they can provide efficient direct support for it. Otherwise, + * the base class implementation should be sufficient. + * \sa Polygon, Polyline, PolyPolyline + */ + virtual void PolyPolygon (const IVECTOR2 *pt, const int *npt, const int nline); + + /** + * \brief Draw a set of polylines. + * \param pt list of vertex points for all lines + * \param npt list of number of points for each line + * \param nline number of lines + * \default Calls Polyline for each line in the list. + * \note The number of entries in npt must be >= nline, and + * the number of points in pt must be at least the sum of + * the values in npt. + * \note Implementations should overload this function if + * they can provide efficient direct support for it. Otherwise, + * the base class implementation should be sufficient. + * \sa Polyline, Polygon, PolyPolygon + */ + virtual void PolyPolyline (const IVECTOR2 *pt, const int *npt, const int nline); + + /** + * \brief Returns the surface associated with the drawing object. + * \return Surface handle + * \note Surface is locked during existance of Sketchpad interface + * and cannot be accessed. + */ + inline SURFHANDLE GetSurface() const { return surf; } + + /** + * \brief Return the Windows device context handle, if applicable. + * \return NULL, or device context handle in some special cases. + * \default None, returns NULL. + * \note Sketchpad implementations based on the Windows GDI system + * should overload this function to return the device context handle + * here. All other implementations should not overload this function. + * \note The device context returned by this function should not be + * released (e.g. with ReleaseDC). The device context is released + * automatically when the Sketchpad instance is destroyed. + * \note This method should be regarded as temporary. Ultimately, the + * device-dependent drawing mechanism should be hidden outside the + * sketchpad implementation. + */ + virtual HDC GetDC() { return NULL; } + +private: + SURFHANDLE surf; +}; + +} // namespace oapi + +#endif // !__DRAWAPI_H \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/Sketchpad2.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/Sketchpad2.h new file mode 100644 index 0000000000..051b15f673 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/Sketchpad2.h @@ -0,0 +1,454 @@ + +#ifndef __SKETCHPAD2_H +#define __SKETCHPAD2_H + +#ifdef D3D9CLIENT_EXPORTS +#define SKP2FUNC +#else +#define SKP2FUNC __declspec(dllimport) +#endif + +#include "assert.h" +#include "DrawAPI.h" +#include "gcConst.h" + +using namespace oapi; + +/** +* \file Sketchpad2.h +* \brief 2-D surface drawing support interface extension 2. +*/ + + +/// \defgroup SkpMeshFlags SketchMesh render flags +///@{ +#define MF_SMOOTH_SHADE 0x1 ///< Perform smooth shading (i.e. shallow angles gets darkened) +#define MF_CULL_NONE 0x2 ///< Do not perform front/back face culling +#define MF_RENDER_ALL 0x4 ///< Render all meshgroups +///@} + +/// \defgroup FntCreation Font creation flags +///@{ +#define FNT_BOLD 0x1 +#define FNT_ITALIC 0x2 +#define FNT_UNDERLINE 0x4 +#define FNT_CRISP 0x8 ///< Create a crisp font without anti-aliasing +///@} + + +/// \defgroup SkpPipeline Sketchpad color pipeline settings +///@{ +#define SKPBS_ALPHABLEND 0x1 ///< AlphaBlend source.color to destination.color, will retain destination alpha unchanged if exists. +#define SKPBS_COPY 0x2 ///< Copy source color and alpha to destination +#define SKPBS_COPY_ALPHA 0x3 ///< Copy source.alpha to destination.alpha, will retain destination color unchanged +#define SKPBS_COPY_COLOR 0x4 ///< Copy source.color to destination.color, will retain destination alpha unchanged +#define SKPBS_FILTER_LINEAR 0x00 ///< Use "linear" filter in CopyRect and similar functions +#define SKPBS_FILTER_POINT 0x10 ///< Use "point" filter in CopyRect and similar functions + +#define SKP3_PRM_GAMMA 1 ///< Enable/Setup Gamma correction +#define SKP3_PRM_NOISE 2 ///< Enable/Setup Noise generation +///@} + +namespace oapi { + + // =========================================================================== + /** + * \class Sketchpad2 + * \brief Advanced drawing interface + * \details SketchPad2 interface adds following key features: + * - A Viewport transformation + * - Mesh rendering + * - Blitting support + */ + // =========================================================================== + + class SKP2FUNC Sketchpad2 : public Sketchpad + { + + public: + + enum SkpView { + ORTHO = 0, ///< Default orthographic projection + USER = 1 ///< User defined setup via ViewMatrix() and ProjectionMatrix() + }; + + /** + * \brief Sketchpad2 constructor. + */ + Sketchpad2(SURFHANDLE s) : Sketchpad(s) {} + + + /** + * \brief Sketchpad2 destructor. + */ + virtual ~Sketchpad2() {} + + + /** + * \brief [DX9] Get a render surface size in pixels + * \param size Pointer to SIZE structure receiving the size + */ + virtual void GetRenderSurfaceSize(LPSIZE size) { assert(false); } + + /** + * \brief [DX9] Setup a quick pen, removes any other pen from use. Set to zero to disable a pen from use. + * \param color Pen color in 0xAABBGGRR + * \param width Pen width in pixels + * \param style 0 = Disabled, 1 = Solid, 2 = Dashed + */ + virtual void QuickPen(DWORD color, float width = 1.0f, DWORD style = 1) { assert(false); } + + /** + * \brief [DX9] Setup a quick brush, removes any other brush from use. Set to zero to disable a brush from use. + * \param color Brush color in 0xAABBGGRR + */ + virtual void QuickBrush(DWORD color) { assert(false); } + + /** + * \brief [DX9] Set up a global line width scale factor + * \param width A line width scale factor. (Default 1.0f) + * \param pattern Line pattern scale factor. (Default 1.0f) + */ + virtual void SetGlobalLineScale(float width = 1.0f, float pattern = 1.0f) { assert(false); } + + /** + * \brief [DX9] Set up a global world transformation matrix. + * \param pWT A pointet to FMATRIX4, NULL to reset default settings. + * \note This function will conflict and resets any settings set by SetOrigin(). Setting to NULL does not restore SetOrigin(). + * \note Everything is transformed including CopyRect() and Text(). + * \warning Graphics results from a CopyRect() and Text() can be blurry when non-default SetViewProjectionMatrix or SetWorldTransform is in use + * due to source-target pixels miss aligments. + */ + virtual void SetWorldTransform(const FMATRIX4 *pWT = NULL) { assert(false); } + + /** + * \brief [DX9] Get a View matrix. [Read only] + */ + virtual const FMATRIX4 *ViewMatrix() const { assert(false); return NULL; } + + /** + * \brief [DX9] Get a Projection matrix. [Read only] + */ + virtual const FMATRIX4 *ProjectionMatrix() const { assert(false); return NULL; } + + /** + * \brief [DX9] Get combined view projection matrix. [Read only] + */ + virtual const FMATRIX4 *GetViewProjectionMatrix() const { assert(false); return NULL; } + + /** + * \brief [DX9] Set an active view mode. Switch between modes doesn't reset the view matrices and setups. + * \param mode, SkpView mode setting. + */ + virtual void SetViewMode(SkpView mode = ORTHO) { assert(false); } + + /** + * \brief [DX9] Set up a global world transformation matrix. + * \param scale Graphics scale factor. + * \param rot Rotation angle [rad] + * \param ctr Pointer to a IVECTOR containing a rotation center or NULL for origin. + * \param trl Pointer to a IVECTOR containing a translation or NULL. + * \note This function will conflict and resets any settings set by SetOrigin(). Setting to NULL does not restore SetOrigin(). + * \note Everything is transformed including CopyRect() and Text(). + * \warning Graphics results from a CopyRect() and Text() can be blurry when non-default SetViewProjectionMatrix or SetWorldTransform is in use + * due to source-target pixels miss aligments. + */ + virtual void SetWorldTransform2D(float scale = 1.0f, float rot = 0.0f, IVECTOR2 *ctr = NULL, IVECTOR2 *trl = NULL) { assert(false); } + + /** + * \brief [DX9] Set up a screen space clip rectangle. Usefull when need to draw in a smaller sub section of the render target. + * \param pClip A pointer to clipping rectangle, Set to NULL to disable clipping. + */ + virtual void ClipRect(const LPRECT pClip = NULL) { assert(false); } + + /** + * \brief [DX9] Set up a world space clip cone to clip pixels within it. Does not work with orthographic projection. + * \param idx Index of the clipper object. Valids are "0" and "1". + * \param pPos a pointer to a unit vector containing cone direction in camera centric frame, Set to NULL to disable clipping. + * \param angle cosine of the half-angle of the cone. + * \param dist clip-plane distance, clipping only occur beyond this distance. + * \note This function is provided due to reasons that z-buffering doesn't really work in all cases. Designed to be used when + * drawing into the planetarium view to prevent "see through" planets. + */ + virtual void Clipper(int idx, const VECTOR3 *pPos = NULL, double cos_angle = 0.0, double dist = 0.0) { assert(false); } + + /** + * \brief [DX9] Enable a use of depth buffer. + * \param bEnable Toggle depth buffer. + */ + virtual void DepthEnable(bool bEnable) { assert(false); } + + /** + * \brief Draws a Mesh group in the render target. Usefull in rendering of complex static shapes and polygons. + * \param hMesh Pointer to device specific mesh containing the geometry. + * \param grp Group index to draw. + * \param flags SkpMeshFlags + * \param hTex a texture override, render with this texture regardless what ever is specified in the mesh. + * \return Number of groups in the mesh or -1 if the group index is out of range. + * \note Use SetWorldTransform() to move, rotate and scale the object. + * \note Final color = Texture Color * Material Color * Pen Color + * \sa gcLoadSketchMesh, gcDeleteSketchMesh; + */ + virtual int DrawSketchMesh(SKETCHMESH hMesh, DWORD grp, DWORD flags = MF_SMOOTH_SHADE, SURFHANDLE hTex = NULL) { assert(false); return -2; } + + + /** + * \brief [DX9] Draws a mesh group or entire mesh in the render target. + * \param hMesh Pointer to mesh containing the geometry. + * \param grp Group index to draw. + * \param flags MeshFlags + * \param hTex a texture override, render with this texture regardless what ever is specified in the mesh. + * \return Number of groups in the mesh or -1 if the group index is out of range. + * \note Use SetWorldTransform() to move, rotate and scale the object. + * \note This function creates a local Vertex/Index buffers, so, vertex count isn't a major factor. + * \note Modifications to input meah has no effects due to local copy. + * \note Final color = Texture Color * Material Color, only diffure material is in use. + * \note To draw the entire mesh at once, use MeshFlags::RENDER_ALL flag. + */ + virtual int DrawMeshGroup(MESHHANDLE hMesh, DWORD grp, DWORD flags = MF_SMOOTH_SHADE, SURFHANDLE hTex = NULL) { assert(false); return -2; } + + + /** + * \brief [DX9] Copy 'Blit' a rectangle + * \param hSrc Source surface handle + * \param src Source rectangle, (or NULL for whole surface) + * \param tx Target x-coordinate + * \param ty Target y-coordinate + * \note Can alpha-blend and mirror by a use of negative width/height in source rectangle + */ + virtual void CopyRect(SURFHANDLE hSrc, const LPRECT src, int tx, int ty) { assert(false); } + + /** + * \brief [DX9] Copy 'Blit' a rectangle + * \param hSrc Source surface handle + * \param src Source rectangle, (or NULL for whole surface) + * \param tgt Target rectangle, (must be defined) + * \note Can alpha-blend and mirror by a use of negative width/height in source rectangle + */ + virtual void StretchRect(SURFHANDLE hSrc, const LPRECT src, const LPRECT tgt) { assert(false); } + + /** + * \brief [DX9] Copy 'Blit' a rectangle with rotation and scaling + * \param hSrc Source surface handle + * \param src Source rectangle, (or NULL for whole surface) + * \param cx Target center x-coordinate + * \param cy Target center y-coordinate + * \param angle Rotation angle in radians + * \param sw Width scale factor + * \param sh Height scale factor + * \note Does not change or effect in SetWorldTransform() + * \note Can alpha-blend, should be able to mirror via negative scale factor. + */ + virtual void RotateRect(SURFHANDLE hSrc, const LPRECT src, int cx, int cy, float angle = 0.0f, float sw = 1.0f, float sh = 1.0f) { assert(false); } + + /** + * \brief [DX9] Copy 'Blit' a rectangle using a color-key stored in a source surface. + * \param hSrc Source surface handle + * \param src Source rectangle, (or NULL for whole surface) + * \param tx Target x-coordinate + * \param ty Target y-coordinate + * \note ColorKey() does not work properly with SetWorldTransform() due to color interpolation + * \note Can mirror by a use of negative width/height in source rectangle + */ + virtual void ColorKey(SURFHANDLE hSrc, const LPRECT src, int tx, int ty) { assert(false); } + + /** + * \brief [DX9] Write a line of text using text scaling and rotation + * \param x x-coordinate of the text alignment point + * \param y y-coordinate of the text alignment point + * \param str pointer to NULL terminated string to write. + * \param scale Text scale factor (0.0f to 1.0f) + * \param angle Rotation angle in radians. + * \sa Text() + * \note Rotation and scaling can result a blurry text if used with a small fonts. Rotation of ±PI/2 or PI should work fine. + * \note Rotation spefified during font creation is ignored in this function. + */ + virtual void TextEx(float x, float y, const char *str, float scale = 1.0f, float angle = 0.0f) { assert(false); } + + /** + * \brief [DX9] Draw a pre-created polyline or polygon object + * \param hPoly Handle to a poly object + * \param flags (reserved for later use, set to zero for now) + * \sa gcCreatePoly, gcDeletePoly + */ + virtual void DrawPoly(HPOLY hPoly, DWORD flags = 0) { assert(false); } + + /** + * \brief [DX9] Draw a list of independent lines. 0-1, 2-3, 4-5,... + * \param pt list of vertex points. + * \param nlines number of lines to draw + */ + virtual void Lines(FVECTOR2 *pt1, int nlines) { assert(false); } + + /** + * \brief [DX9] Set up a view matrix. + * \param pV A pointet to FMATRIX4, NULL to reset default settings. + */ + virtual void SetViewMatrix(const FMATRIX4 *pV = NULL) { assert(false); } + + /** + * \brief [DX9] Set up a projection matrix. + * \param pP A pointet to FMATRIX4, NULL to reset default settings. + */ + virtual void SetProjectionMatrix(const FMATRIX4 *pP = NULL) { assert(false); } + }; + + + + + + + + /** + * \brief Sketchpad3 adds some additional features to an existing Sketchpad interface. + */ + class SKP2FUNC Sketchpad3 : public Sketchpad2 + { + + public: + + typedef struct { + FVECTOR2 tgt; + IVECTOR2 src; + } skpPin; + + typedef struct { + RECT intr; + RECT outr; + } skpRegion; + + /** + * \brief Sketchpad3 constructor. + */ + Sketchpad3(SURFHANDLE s) : Sketchpad2(s) {} + + + /** + * \brief Sketchpad2 destructor. + */ + virtual ~Sketchpad3() {} + + + /** + * \brief Get a read only pointer to current ColorMatrix. + * \sa SetColorMatrix, SetBrightness + */ + virtual const FMATRIX4 *GetColorMatrix() { assert(false); return NULL; } + + /** + * \brief [DX9] Set a ColorMatrix for color correrctions. Reset to default by passing NULL pointer + * \param pMatrix Pointer to a matrix or NULL. + * \sa GetColorMatrix, SetBrightness + */ + virtual void SetColorMatrix(const FMATRIX4 *pMatrix = NULL) { assert(false); } + + /** + * \brief [DX9] Automatically set a ColorMatrix for brightness control. NULL to restore default settings. + * \param pBrightness Pointer into a float values color vector, or NULL. + * \sa GetColorMatrix, SetColorMatrix + */ + virtual void SetBrightness(const FVECTOR4 *pBrightness = NULL) { assert(false); } + + /** + * \brief [DX9] Get a render configuration setting or "effect". + * \param param A setting ID to get. + * \note Valid ID Flags: + * \note SKP3_PRM_GAMMA, Get Gamma correction value (.rgb) + * \note SKP3_PRM_NOISE, Get Noise configuration. Noise color in (.rgb) and (.a) controls blending between input color (.rgb) and target color. + * \sa SetRenderParam + */ + virtual FVECTOR4 GetRenderParam(int param) { assert(false); return FVECTOR4(0, 0, 0, 0); } + + + /** + * \brief [DX9] Set a render configuration paramater or "effect". + * \param param A setting ID to set, or NULL to disable effect from use. + * \sa SetRenderParam + */ + virtual void SetRenderParam(int param, const FVECTOR4 *data = NULL) { assert(false); } + + + /** + * \brief [DX9] Setup a blending state + * \param dwState Desired configuration. + * \note SKPBS_ALPHABLEND, AlphaBlend source.color to destination.color, will retain destination alpha unchanged (if exists). + * \note SKPBS_COPY, Copy both source color and alpha to destination + * \note SKPBS_COPY_ALPHA, Copy source.alpha to destination.alpha, will retain destination color unchanged + * \note SKPBS_COPY_COLOR, Copy source.color to destination.color, will retain destination alpha unchanged (if exists) + */ + virtual void SetBlendState(DWORD dwState = SKPBS_ALPHABLEND | SKPBS_FILTER_LINEAR) { assert(false); } + + + /** + * \brief [DX9] Get world transformation matrix + */ + virtual FMATRIX4 GetWorldTransform() const { return FMATRIX4(); } + + /** + * \brief [DX9] Push current world transformation matrix onto a stack + */ + virtual void PushWorldTransform() { assert(false); } + + /** + * \brief [DX9] Pop a world transformation matrix from a stack and make it active + */ + virtual void PopWorldTransform() { assert(false); } + + /** + * \brief [DX9] Set up a global world transformation matrix. + * \param scl Pointer to a FVECTOR2 containing a scaling information or NULL for 1.0 + * \param trl Pointer to a IVECTOR2 containing a translation or NULL. + * \note This function will conflict and resets any settings set by SetOrigin(). Setting to NULL does not restore SetOrigin(). + * \note Everything is transformed including CopyRect() and Text(). + * \warning Graphics results from a CopyRect() and Text() can be blurry when non-default SetViewProjectionMatrix or SetWorldTransform is in use + * due to source-target pixels miss aligments. + */ + virtual void SetWorldScaleTransform2D(const FVECTOR2 *scl = NULL, const IVECTOR2 *trl = NULL) { assert(false); } + + /** + * \brief [DX9] Fill a rectangle with color gradient + * \param tgt a Rect specifying the bounds + * \param c1 Left or Top color + * \param c2 Right or Bottom color + * \param bVertical Direction of the gradient. + */ + virtual void GradientFillRect(const LPRECT tgt, DWORD c1, DWORD c2, bool bVertical = false) { assert(false); } + + /** + * \brief [EXPERIMENTAL] Fill a rectangle with pattern + * \param hPat Handle to a texture containing the pattern + * \param tgt a Rect specifying the bounds + */ + virtual void obsolete_PatternFill(SURFHANDLE hPat, const LPRECT tgt) { assert(false); } + + /** + * \brief [DX9] Fill a rectangle with color + * \param color Fill color + * \param tgt a Rect specifying the bounds, NULL for entire surface + */ + virtual void ColorFill(DWORD color, const LPRECT tgt) { assert(false); } + + /** + * \brief [DX9] Drawing function designed for drawing GUI elements. Buttons, Windows, Boxes, etc.. + */ + virtual void StretchRegion(const skpRegion *rgn, SURFHANDLE hSrc, const LPRECT out) { assert(false); } + + /** + * \brief [DX9] Copy 'Blit' a tetragon + * \param hSrc Source surface handle + * \param sr Source rectangle, (or NULL for whole surface) + * \param pt Pointer to an array of 4 FVECTOR2 target points forming shape of the tetragon. + */ + virtual void CopyTetragon(SURFHANDLE hSrc, const LPRECT sr, const FVECTOR2 pt[4]) { assert(false); } + + /** + * \brief [DX9] Enable and Disable color compatibility mode where Pen/Brush Alpha value 0x00 is translated to 0xFF + * \note Default: Enabled, Only effects to a colors assigned to pens and brushes after a mode change. + */ + virtual void ColorCompatibility(bool bEnable) { assert(false); } + + }; + +} // namespace oapi + +#endif \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcAPI.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcAPI.h new file mode 100644 index 0000000000..d602eb7021 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcAPI.h @@ -0,0 +1,364 @@ +// ================================================================================================================================= +// The MIT Lisence: +// +// Copyright (C) 2014 - 2018 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, +// modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + +/*! \mainpage Graphics Client Application Programming Interface (gcAPI) + + The gcAPI is create to allow a user application to interact directly with a graphics clients. + + - gcAPI Functions (\ref gcAPI) + - SketchPad2 extension (\ref oapi::Sketchpad2) +*/ + + +/** +* \file gcAPI.h +* \brief Graphics Client Application Programming Interface defination. +*/ + +#ifndef __OGCI_H +#define __OGCI_H + +#include "OrbiterAPI.h" +#include "DrawAPI.h" +#include "gcConst.h" +#include + +#define OGCIFN __cdecl + +#ifndef OAPISURFACE_TEXTURE +#define OAPISURFACE_TEXTURE 0x0001 ///< Surface can be used as a texture (e.g. by associating it with a mesh) +#define OAPISURFACE_RENDERTARGET 0x0002 ///< Surface can be rendered to by the graphics device +#define OAPISURFACE_GDI 0x0004 ///< A HDC context can be requested from the surface for GDI drawing +#define OAPISURFACE_SKETCHPAD 0x0008 ///< A Sketchpad context can be requested from the surface for Sketchpad drawing +#define OAPISURFACE_MIPMAPS 0x0010 ///< Create a full chain of mipmaps for the surface. If loaded from file, add any missing mipmap levels +#define OAPISURFACE_NOMIPMAPS 0x0020 ///< Don't create mipmaps. If loaded from file, ignore any mipmap levels present +#define OAPISURFACE_ALPHA 0x0040 ///< Create an alpha channel for the surface. If loaded from file, add an alpha channel if required +#define OAPISURFACE_NOALPHA 0x0080 ///< Don't create an alpha channel. If loaded from file, strip any existing alpha channel +#define OAPISURFACE_UNCOMPRESS 0x0100 ///< Create an uncompressed surface. If loaded from file, uncompress if required. +#define OAPISURFACE_SYSMEM 0x0200 ///< Create the surface in system (host) memory +#define OAPISURFACE_RENDER3D 0x0400 ///< Create a surface that can act as a target for rendering a 3D scene +#define OGCI_FOR_2010P1 +#endif + + + + + // =========================================================================== + /** + * \defgroup gcAPI List of API functions + * + * These functions provides a way for user applications to interface with + * a graphics clients. + */ + // =========================================================================== + //@{ + + // =========================================================================== + /// \name gcAPI Interface Initialization + // =========================================================================== + //@{ + + /** + * \brief Initialize Graphics Client interface (gc) + * \return true, if connection to a graphics client was established, false otherwise. + */ +bool gcInitialize(); + + /** + * \brief Check if GC is initialized and operational. + * \return true, if the interface is initialized and operational. + * \note Always returns flase if the gcInitialize() is never called or the gcInitialize() has failed. + */ +bool gcEnabled(); + + /** + * \brief Get a client id DWORD, if a client is present + * \return Client id DWORD (e.g. 'D3D9') or zero + */ +DWORD gcClientID(); + + /** + * \brief Get render window handle + * \return Render window handle + */ +HWND gcGetRenderWindow(); + + /** + * \brief Get a pointer to core interface + * \return Handle to a core interface + */ +gcCore * gcGetCoreAPI(); + //@} + + // =========================================================================== + /// \name 2D Surface related functions + // =========================================================================== + //@{ + /** + * \brief Get Surface Attributes (e.g. OAPISURFACE_TEXTURE) + * \param hSurf handle to a surface + * \param bCreation if true return creation time attributes, if false return current attributes + * \return Surface attributes + */ +DWORD gcGetSurfaceAttribs(SURFHANDLE hSurf, bool bCreation=false); + + /** + * \brief Convert an existing surface to an other type. + * \param hSurf handle to a surface + * \param attrib new attributes + */ +void gcConvertSurface(SURFHANDLE hSurf, DWORD attrib); + + /** + * \brief Auto-Generate a full chain of mipmaps from the main level. + * \param hSurface handle to a surface + * \return false if an error occured, true otherwise. + * \note Surface must be created atleast with (OAPISURFACE_TEXTURE | OAPISURFACE_MIPMAPS) + * \note Exact attribute requirements/conflicts are unknown. + */ +bool gcGenerateMipMaps(SURFHANDLE hSurface); + //@} + + + // =========================================================================== + /// \name HUD and Planetarium mode access functions + // =========================================================================== + //@{ + /** + * \brief This function will register a custom render callback function + * \param proc function to be called when render event occur + * \param id render event id + * \param pParam a pointer to user data (to a class for an example) + * \return false if an error occured, true otherwise. + */ +bool gcRegisterRenderProc(__gcRenderProc proc, DWORD id, void *pParam); + //@} + + + + // =========================================================================== + /// \name Mesh interface functions + // =========================================================================== + //@{ + /** + * \brief This function will register a custom render callback function + * \param hMesh Handle to a devmesh containing the material + * \param idx Material index + * \param prop material property identifier (\ref MeshMaterialFlags) + * \param value a pointer to COLOUR4 structure containing/receiving the data, or \e NULL to reset a default value or to unspecify a property. + * \param bSet \e true to set material value, \e false to get a meterial value + * \return -4 = Invalid handle \n -3 = Unknown property flag \n -2 = Property not specified cannot get it \n -1 = Index out of range \n 0 = Success + */ +int gcMeshMaterial(DEVMESHHANDLE hMesh, DWORD idx, int prop, COLOUR4 *value, bool bSet); + + /** + * \brief A Function to get a mesh transformation/animation matrix. + * \param matrix_id Id of the matrix to get. One of gcMatrix::xxx datatypes. + * \param hVessel Vessel object handle. + * \param mesh Mesh index + * \param group Group index + * \param pMat A pointer to FMATRIX4 struct for receiving the data. + * \return 0 = on Success, or error code. + */ +int gcGetMatrix(int matrix_id, OBJHANDLE hVessel, DWORD mesh, DWORD group, oapi::FMATRIX4 *pMat); + + + /** + * \brief A Function to set a mesh transformation/animation matrix. Do not use this function for animated parts/meshes. + * \param matrix_id Id of the matrix to set. One of gcMatrix::xxx datatypes. + * \param hVessel Vessel object handle. + * \param mesh Mesh index + * \param group Group index + * \param pMat A pointer to FMATRIX4 containing the data to set. + * \return 0 = on Success, or error code. + */ +int gcSetMatrix(int matrix_id, OBJHANDLE hVessel, DWORD mesh, DWORD group, const oapi::FMATRIX4 *pMat); + //@} + + + // =========================================================================== + /// \name Custom Camera Interface + // =========================================================================== + //@{ + /** + * \brief Delete/Release a custom camera. + * \param hCam camera handle to delete. + * \return zero or an error code if the camara didn't work properly. + * \note Always delete all cameras bound to a render surface before releasing the rendering surface it-self. + */ +int gcDeleteCustomCamera(CAMERAHANDLE hCam); + + /** + * \brief Toggle camera on and off + * \param hCam camera handle to toggle + * \param bOn true to turn on the camera. + * \note If multiple cameras are sharing the same rendering surface. Flickering will occur if more than one camera is turned on. + */ +void gcCustomCameraOnOff(CAMERAHANDLE hCam, bool bOn); + + /** + * \brief Create a new custom camera that can be used to render views into a surfaces and textures + * \param hCam camera handle to modify an existing camera or, NULL + * \param hVessel handle to a vessel where the camera is attached to. + * \param vPos camara position in vessel's local coordinate system + * \param vDir camara direction in vessel's local coordinate system. [Unit Vector] + * \param vUp camara up vector. Must be perpendicular to vDir. [Unit Vector] + * \param dFow camera field of view in radians + * \param hSurf rendering surface. Must be created atleast with OAPISURFACE_RENDER3D | OAPISURFACE_RENDERTARGET. Multiple cameras can share the same surface. + * \param dwFlags Flags to controls what is drawn and what is not. + * \return Camera handle, or NULL if an error occured or if the custom camera interface is disabled. + * \note Camera count is unlimited. + * \note Only a cameras attached to currently active vessel are operational and recodring. + * \note Having multiple cameras active at the same time doesn't impact in a frame rate, however, camera refresh rates are reduced. + */ +CAMERAHANDLE gcSetupCustomCamera(CAMERAHANDLE hCam, OBJHANDLE hVessel, VECTOR3 &vPos, VECTOR3 &vDir, VECTOR3 &vUp, double dFov, SURFHANDLE hSurf, DWORD dwFlags=0xFF); + //@} + + + + // =========================================================================== + /// \name Sketchpad related functions + // =========================================================================== + //@{ + /** + * \brief Get the sketchpad version + * \param pSkp handle to a sketchpad interface. + * \return Currently returns 1 or 2 + */ +int gcSketchpadVersion(oapi::Sketchpad *pSkp); + + /** + * \brief Load a mesh from a harddrive to be used with Sketchpad2::SketchMesh + * \param name Name of the mesh file without ".msh" identifier. + * \sa gcDeleteSketchMesh + * \note SKETCHMESH handle isn't compatible with MESHHANDLE nor DEVMESHHANDLE. + */ +SKETCHMESH gcLoadSketchMesh(const char *name); + + /** + * \brief Delete a mesh previously loaded with gcLoadSketchMesh + * \sa gcLoadSketchMesh + */ +void gcDeleteSketchMesh(SKETCHMESH hMesh); + + /** + * \brief Create or Update a polyline composed form piecewise straight segments. + * \param hPoly Handle to a polyline to be updated or NULL to create a new one. + * \param pt list of vertex points. + * \param npt number of points in the list. + * \param flags additional PolyFlags flags + * \sa gcDeletePoly, Sketchpad2::DrawPoly() + * \note Poly objects should be created during initialization not for every frame or update. Updating existing (pre created) poly object is pretty fast. + * \note During update number of points must be equal or smaller than during initial creation of poly object. + */ +HPOLY gcCreatePoly(HPOLY hPoly, const oapi::FVECTOR2 *pt, int npt, DWORD flags = 0); + + /** + * \brief Deletes a polyline created with gcCreatePolyPolyline() + * \param hPoly Handle to a polyline to be deleted + * \sa gcCreatePolyline + */ +void gcDeletePoly(HPOLY hPoly); + + /** + * \brief Compute a length of a text string + * \param hFont a Pointer into a font + * \param pText a Pointer into a text string + * \param len a Length of the text string to process. -1 will scan to a NULL terminator. + */ +DWORD gcGetTextLength(oapi::Font *hFont, const char *pText, int len = -1); + + /** + * \brief Find index of nearest "cap" between charters in specified location. (i.e. distance from start of the string in pixels) + * \param hFont a Pointer into a font + * \param pText a Pointer into a text line + * \param pos a Position in pixels from start of the string + * \param len a Length of the text line to process. -1 will process to a NULL terminator. + * \return index from 0 to number of charters. For just one char it can be either "0" or "1" depending which side is closer to "pos". + * \note This is used for finding a spot for a "cursor" when a text string is clicked with mouse. + */ +DWORD gcGetCharIndexByPosition(oapi::Font *hFont, const char *pText, int pos, int len = -1); + //@} + + + // =========================================================================== + /// \name Other Helper Function + // =========================================================================== + //@{ + /** + * \brief Alters objects position. Matrix must be initially valid. + * \param mat [in/out] Pointer to a matrix to change + * \param pos New position + */ +void gcSetTranslation(oapi::FMATRIX4 *mat, const VECTOR3 &pos); + + /** + * \brief Creates a world transformation matrix + * \param mat [out] Pointer to a matrix + * \param pos Objects position relative to a camera in ecliptic frame + * \param x X-axis, major axis [unit vector] + * \param z Z-axis, minor axis [unit vector] + * \param scale a sacle factor (default 1.0) + */ +void gcWorldMatrix(oapi::FMATRIX4 *mat, const VECTOR3 &pos, const VECTOR3 &x, const VECTOR3 &z, double scale = 1.0); + + /** + * \brief Compute a screen space location for a point in camera centric ecliptic frame. + * \param wpos a position in a world space + * \param spos [out] screen space position in pixels relative to upper-left corner. + * \param pVP a combined view and projection matrix + * \param clip Visibility check. Value 1.0 uses actual screen broders where as other values can increase or decrease clipping region size. + * \return true if the point is in the clipping rectanble, false otherwise. + * \note If false is returned and the point is behind the camera spos remain unchanged. If not behind the camera then spos contains more or less valid coordinates. + */ +bool gcWorldToScreenSpace(const VECTOR3 &wpos, oapi::IVECTOR2 *spos, const oapi::FMATRIX4 *pVP, float clip = 1.0f); + + /** + * \brief Convert a 4x4 float matrix to 4x4 double matrix + * \param wpos a position in a world space + */ +MATRIX4 gcMatrix4(const oapi::FMATRIX4 *M); + + /** + * \brief Conver a floating point color to DWORD color value + * \param c A pointer to a color + * \return DWORD color in 0xAABBGGRR + * \note Alpha will range from 1 to 255. Zero is never returned because of backwards compatibility issues 0-alpha is mapped to 255 + */ +DWORD gcColor(const COLOUR4 *c); + + /** + * \brief Conver a floating point color to DWORD color value + * \param c A pointer to a color + * \return DWORD color in 0xAABBGGRR + * \note Alpha will range from 1 to 255. Zero is never returned because of backwards compatibility issues 0-alpha is mapped to 255 + */ +DWORD gcColor(const oapi::FVECTOR4 *c); + + /** + * \brief Conver a DWORD color to floating point COLOUR4 value + * \param dwABGR A color in 0xAABBGGRR + * \return COLOUR4 + * \note Alpha will range from 1 to 255. Zero is never used because of backwards compatibility issues 0-alpha is mapped to 255 + */ +COLOUR4 gcColour4(DWORD dwABGR); + + //@} + //@} +#endif \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcConst.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcConst.h new file mode 100644 index 0000000000..3cd9ea3bb9 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/include/gcConst.h @@ -0,0 +1,1475 @@ +// ================================================================================================================================= +// +// Copyright (C) 2014 - 2020 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to use, copy, modify, merge, publish, distribute, interact with the Software and sublicense copies +// of the Software, subject to the following conditions: +// +// a) You do not sell, rent or auction the Software. +// b) You do not collect distribution fees. +// c) If the Software is distributed in an object code form, it must inform that the source code is available and how to obtain it. +// d) You do not remove or alter any copyright notices contained within the Software. +// e) This copyright notice must be included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + +#include "OrbiterAPI.h" +#include "DrawAPI.h" +#include + +#pragma once + +using namespace std; +using namespace oapi; + +class gcCore; + + +inline gcCore *gcGetCoreInterface() +{ + typedef gcCore * (__cdecl *__gcGetCoreAPI)(); + HMODULE hModule = GetModuleHandle("D3D9Client.dll"); + if (hModule) { + __gcGetCoreAPI pGetCoreAPI = (__gcGetCoreAPI)GetProcAddress(hModule, "gcGetCoreAPI"); + if (pGetCoreAPI) return pGetCoreAPI(); + } + return NULL; +} + + +/** +* \file gcConst.h +* \brief Structures and definations +*/ + + +/// \defgroup PixelFormats Common pixelformats for surfaces [ Orbiter 2021+ only ] +///@{ +#define OAPISURFACE_PF_MASK 0xFF0000 ///< PixelFormat Mask +#define OAPISURFACE_PF_XRGB 0x010000 ///< 32bit RGB no-alpha +#define OAPISURFACE_PF_ARGB 0x020000 ///< 32bit ARGB with-alpha 0xAARRGGBB +#define OAPISURFACE_PF_RGB565 0x030000 ///< 16bit RGB no-alpha +#define OAPISURFACE_PF_S16R 0x040000 ///< Signed integer 16-bit (1-channel) +#define OAPISURFACE_PF_F32R 0x050000 ///< Float 32-bit (1-channel) +#define OAPISURFACE_PF_F32RG 0x060000 ///< Float 64-bit (2-channel) +#define OAPISURFACE_PF_F32RGBA 0x070000 ///< Float 128-bit (4-channel) float4(r,g,b,a) +#define OAPISURFACE_PF_F16R 0x080000 ///< Float 16-bit (1-channel) +#define OAPISURFACE_PF_F16RG 0x090000 ///< Float 32-bit (2-channel) +#define OAPISURFACE_PF_F16RGBA 0x0A0000 ///< Float 64-bit (4-channel) float4(r,g,b,a) +#define OAPISURFACE_PF_DXT1 0x0B0000 ///< Compressed DXT1 format +#define OAPISURFACE_PF_DXT3 0x0C0000 ///< Compressed DXT3 format +#define OAPISURFACE_PF_DXT5 0x0D0000 ///< Compressed DXT5 format +#define OAPISURFACE_PF_ALPHA 0x0E0000 ///< Alpha only surface 8-bit +#define OAPISURFACE_PF_GRAY 0x0F0000 ///< Grayscale Image 8-bit +///@} + + +/// \defgroup RenderProc Specify a SketchPad render callback function +///@{ +#define RENDERPROC_DELETE 0x0000 ///< Unregister/Remove existing callback +#define RENDERPROC_HUD_1ST 0x0001 ///< Register a HUD callback to draw under Orbiter's main HUD +#define RENDERPROC_HUD_2ND 0x0002 ///< Register a HUD callback to draw over Orbiter's main HUD +#define RENDERPROC_PLANETARIUM 0x0003 ///< Register a HUD callback to draw into a planetarium view using perspective projection +#define RENDERPROC_EXTERIOR 0x0005 ///< Register a callback to draw into an exterior vessel view using perspective projection +///@} + + +/// \defgroup GenericProc Specify a generic callback function +///@{ +#define GENERICPROC_DELETE 0x0000 ///< Unregister/Remove existing callback +#define GENERICPROC_PICK_VESSEL 0x0001 ///< Called when user clicks a vessel with LMB, RMB +#define GENERICPROC_PICK_TERRAIN 0x0002 ///< Called when user clicks a terrain with LMB, RMB +#define GENERICPROC_HOVER_TERRAIN 0x0003 ///< Called when hovering over terrain with mouse (Performance heavy AVOID !!) +#define GENERICPROC_SHUTDOWN 0x0004 ///< Callback for resource/memory deallocation +#define GENERICPROC_RENDERTILE 0x0010 ///< Render Tile Callback +#define GENERICPROC_RENDER_EXTERIOR 0x0011 ///< Render Post Scene Exterior Only Callback +#define GENERICPROC_TILE_CREATED 0x0020 ///< +#define GENERICPROC_TILE_DELETED 0x0021 ///< +///@} + +/// \defgroup dwFlags for gcSetupCustomCamera() API function +///@{ +#define CUSTOMCAM_DEFAULTS 0x00FF +#define CUSTOMCAM_OVERLAY 0x0100 +///@} + +/// \defgroup Polyline Polyline object creation and update flags +///@{ +#define PF_CONNECT 0x01 ///< Connect line endpoints forming a loop +///@} + +/// \defgroup Triangle Triangle object creation and update flags +///@{ +#define PF_TRIANGLES 0 +#define PF_STRIP 1 +#define PF_FAN 2 +///@} + +/// \defgroup MeshMaterialFlags Mesh material flags for gcMeshMaterial function +///@{ +#define MESHM_DIFFUSE 0x01 ///< Stock material +#define MESHM_AMBIENT 0x02 ///< Stock material +#define MESHM_SPECULAR 0x04 ///< Stock material +#define MESHM_EMISSION 0x08 ///< Stock material +#define MESHM_EMISSION2 0x10 ///< D3D9 material +#define MESHM_REFLECT 0x20 ///< D3D9 material +#define MESHM_ROUGHNESS 0x40 ///< D3D9 material +#define MESHM_FRESNEL 0x80 ///< D3D9 material +#define MESHM_METALNESS 0x100 ///< D3D9 material +#define MESHM_SPECIALFX 0x200 ///< D3D9 material +///@} + +namespace gcGUI +{ + // ----------------------------- + // Dialog status identifiers + // + static const int INACTIVE = 0; + static const int DS_FLOAT = 1; + static const int DS_LEFT = 2; + static const int DS_RIGHT = 3; + + // ----------------------------- + // Bitmap Identifiers + // + static const int BM_TITLE = 0; + static const int BM_SUBTITLE = 1; + static const int BM_ICONS = 2; + + // ----------------------------- + // Messages passed to gcGUIApp::clbkMessge + // + static const int MSG_OPEN_NODE = 1; + static const int MSG_CLOSE_NODE = 2; + static const int MSG_CLOSE_APP = 3; +}; + + +namespace gcMatrix +{ + static const int offset = 1; ///< Set/Get Mesh offset matrix, Also used by VESSEL::ShiftMesh() + static const int mesh = 2; ///< Set/Get Mesh animation matrix, Transforms all the groups in the mesh + static const int group = 3; ///< Set/Get Group animation matrix, Transforms a single group + static const int combined = 4; ///< Get combined Mesh*Group*Offset matrix. (Can't 'set' this) +}; + +namespace gcTileFlags +{ + static const int TEXTURE = 0x1; ///< Texture data + static const int MASK = 0x2; ///< Nightlights/Water mask + static const int ELEVATION = 0x3; ///< Elevation + static const int CLOUD = 0x4; ///< Texture data + static const int ELEV_MOD = 0x5; ///< Elevation + // ------------------------------------------------------------------ + static const int TREE = 0x10; ///< Search/Use Tree Archive + static const int CACHE = 0x20; ///< Search/Use Cache + static const int MOD = 0x40; ///< Search/Use ElevMod Cache +}; + + +/** +* \brief Flags for +*/ +namespace gcFont +{ + static const int ITALIC = 0x1; + static const int UNDERLINE = 0x2; + static const int STRIKEOUT = 0x4; + static const int CRISP = 0x8; ///< Override app-default, No Antialiasing + static const int ANTIALIAS = 0x10; ///< Override app-default, Use Antialiashing +}; + + +/// \brief Handle to a surface manager's glogal overlay +typedef void * HOVERLAY; +/// \brief Handle to a native DirectX9 surface +typedef void * HSURFNATIVE; +/// \brief Handle to a planet/surface manager +typedef void * HPLANETMGR; +/// \brief Handle to an instance buffer +typedef void * HINSTBUF; +/// \brief Handle to a surface tile (SurfTile) +typedef void * HTILE; +/// \brief Hnadle to a dialog node in gcGUI +typedef void * HNODE; +/// \brief Custom swapchain handle +typedef void * HSWAP; +/// \brief Custom camera handle +typedef void * CAMERAHANDLE; +/// \brief Sketchmesh handle +typedef void * SKETCHMESH; +/// \brief Poly object handle +typedef void * HPOLY; + + +/// \brief Render HUD and Planetarium callback function +typedef void(__cdecl *__gcRenderProc)(oapi::Sketchpad *pSkp, void *pParam); +typedef void(__cdecl *__gcGenericProc)(int iUser, void *pUser, void *pParam); + + +namespace oapi { + + /** + * \brief 32-bit floating point 2D vector type. + * \note This structure is compatible with the D3DXVECTOR2 type. + */ + typedef struct FVECTOR2 { + + FVECTOR2() + { + x = y = 0.0f; + } + + FVECTOR2(float q) + { + x = y = q; + } + + FVECTOR2(float _x, float _y) + { + x = _x; + y = _y; + } + + FVECTOR2(const POINT &p) + { + x = float(p.x); + y = float(p.y); + } + + FVECTOR2(const POINT *p) + { + x = float(p->x); + y = float(p->y); + } + + FVECTOR2(const oapi::IVECTOR2 &p) + { + x = float(p.x); + y = float(p.y); + } + + inline FVECTOR2 operator* (float f) const + { + return FVECTOR2(x * f, y * f); + } + + inline FVECTOR2 operator/ (float f) const + { + f = 1.0f / f; + return FVECTOR2(x * f, y * f); + } + + inline FVECTOR2 operator+ (float f) const + { + return FVECTOR2(x + f, y + f); + } + + inline FVECTOR2 operator- (float f) const + { + return FVECTOR2(x - f, y - f); + } + + inline FVECTOR2 operator+ (const FVECTOR2 &f) const + { + return FVECTOR2(x + f.x, y + f.y); + } + + inline FVECTOR2 operator- (const FVECTOR2 &f) const + { + return FVECTOR2(x - f.x, y - f.y); + } + + float x, y; + } FVECTOR2; + + + + /** + * \brief 32-bit floating point 3D vector type. + * \note This structure is compatible with the D3DXVECTOR3 type. + */ + typedef struct FVECTOR3 { + + FVECTOR3() + { + x = y = z = 0.0f; + } + + FVECTOR3(float q) + { + x = y = z = q; + } + + FVECTOR3(float _x, float _y, float _z) + { + x = _x; + y = _y; + z = _z; + } + + FVECTOR3(VECTOR3 &v) + { + x = float(v.x); + y = float(v.y); + z = float(v.z); + } + + inline FVECTOR3& operator*= (float f) + { + x *= f; y *= f; z *= f; + return *this; + } + + inline FVECTOR3& operator/= (float f) + { + // return *this *= (1.0f / f); // nicer? + f = 1.0f / f; + x *= f; y *= f; z *= f; + return *this; + } + + inline FVECTOR3& operator+= (float f) + { + x += f; y += f; z += f; + return *this; + } + + inline FVECTOR3& operator-= (float f) + { + x -= f; y -= f; z -= f; + return *this; + } + + inline FVECTOR3 operator* (float f) const + { + return FVECTOR3(x * f, y * f, z * f); + } + + inline FVECTOR3 operator/ (float f) const + { + f = 1.0f / f; + return FVECTOR3(x * f, y * f, z * f); + } + + inline FVECTOR3 operator+ (float f) const + { + return FVECTOR3(x + f, y + f, z + f); + } + + inline FVECTOR3 operator- (float f) const + { + return FVECTOR3(x - f, y - f, z - f); + } + + inline FVECTOR3 operator+ (const FVECTOR3 &f) const + { + return FVECTOR3(x + f.x, y + f.y, z + f.z); + } + + inline FVECTOR3 operator- (const FVECTOR3 &f) const + { + return FVECTOR3(x - f.x, y - f.y, z - f.z); + } + + float x, y, z; + } FVECTOR3; + + + /** + * \brief 32-bit floating point 4D vector type. + * \note This structure is compatible with the D3DXVECTOR4 type. + */ +#pragma pack(push, 1) + typedef union FVECTOR4 + { + DWORD dword_abgr() const + { + DWORD dr = DWORD(max(0, r) * 255.0f + 0.5f); + DWORD dg = DWORD(max(0, g) * 255.0f + 0.5f); + DWORD db = DWORD(max(0, b) * 255.0f + 0.5f); + DWORD da = DWORD(max(0, a) * 255.0f + 0.5f); + if (dr > 0xFF) dr = 0xFF; + if (dg > 0xFF) dg = 0xFF; + if (db > 0xFF) db = 0xFF; + if (da > 0xFF) da = 0xFF; + return (da << 24) | (db << 16) | (dg << 8) | dr; + } + + DWORD dword_argb() const + { + DWORD dr = DWORD(max(0, r) * 255.0f + 0.5f); + DWORD dg = DWORD(max(0, g) * 255.0f + 0.5f); + DWORD db = DWORD(max(0, b) * 255.0f + 0.5f); + DWORD da = DWORD(max(0, a) * 255.0f + 0.5f); + if (dr > 0xFF) dr = 0xFF; + if (dg > 0xFF) dg = 0xFF; + if (db > 0xFF) db = 0xFF; + if (da > 0xFF) da = 0xFF; + return (da << 24) | (dr << 16) | (dg << 8) | db; + } + + FVECTOR4() + { + r = g = b = a = 0.0f; + } + + FVECTOR4(float q) + { + x = y = z = w = q; + } + + FVECTOR4(const COLOUR4 &c) + { + r = c.r; + g = c.g; + b = c.b; + a = c.a; + } + + FVECTOR4(DWORD abgr) + { + DWORD dr = (abgr & 0xFF); abgr >>= 8; + DWORD dg = (abgr & 0xFF); abgr >>= 8; + DWORD db = (abgr & 0xFF); abgr >>= 8; + DWORD da = (abgr & 0xFF); + //if (da == 0) da = 255; + float q = 3.92156862e-3f; + r = float(dr) * q; + g = float(dg) * q; + b = float(db) * q; + a = float(da) * q; + } + + FVECTOR4(const VECTOR4 &v) + { + x = float(v.x); + y = float(v.y); + z = float(v.z); + w = float(v.w); + } + + FVECTOR4(const VECTOR3 &v, float _w) + { + x = float(v.x); + y = float(v.y); + z = float(v.z); + w = _w; + } + + FVECTOR4(const FVECTOR3 &v, float _w) + { + rgb = v; + w = _w; + } + + FVECTOR4(float _x, float _y, float _z, float _w) + { + x = float(_x); + y = float(_y); + z = float(_z); + w = float(_w); + } + + FVECTOR4(int _x, int _y, int _z, int _w) + { + x = float(_x); + y = float(_y); + z = float(_z); + w = float(_w); + } + + FVECTOR4(double _x, double _y, double _z, double _w) + { + x = float(_x); + y = float(_y); + z = float(_z); + w = float(_w); + } + + + inline FVECTOR4 operator* (float f) const + { + return FVECTOR4( x * f, y * f, z * f, w * f); + } + + inline FVECTOR4& operator*= (float f) + { + x *= f; y *= f; z *= f; w *= f; + return *this; + } + + inline FVECTOR4& operator/= (float f) + { + // return *this *= (1.0f / f); // nicer? + f = 1.0f / f; + x *= f; y *= f; z *= f; w *= f; + return *this; + } + + inline FVECTOR4& operator+= (float f) + { + x += f; y += f; z += f; w += f; + return *this; + } + + inline FVECTOR4& operator-= (float f) + { + x -= f; y -= f; z -= f; w -= f; + return *this; + } + + inline FVECTOR4 operator/ (float f) const + { + f = 1.0f / f; + return FVECTOR4(x * f, y * f, z * f, w * f); + } + + inline FVECTOR4 operator+ (float f) const + { + return FVECTOR4(x + f, y + f, z + f, w + f); + } + + inline FVECTOR4 operator- (float f) const + { + return FVECTOR4(x - f, y - f, z - f, w - f); + } + + inline FVECTOR4 operator+ (const FVECTOR4 &f) const + { + return FVECTOR4(x + f.x, y + f.y, z + f.z, w + f.w); + } + + inline FVECTOR4 operator- (const FVECTOR4 &f) const + { + return FVECTOR4(x - f.x, y - f.y, z - f.z, w - f.w); + } + + float data[4]; + struct { float x, y, z, w; }; + struct { float r, g, b, a; }; + FVECTOR3 xyz; // , w; }; + FVECTOR3 rgb; // , a; }; + } FVECTOR4; +#pragma pack(pop) + + + typedef union DRECT + { + DRECT() + { + left = right = top = bottom = 0.0; + } + + DRECT(double l, double t, double r, double b) + { + left = l; top = t; right = r; bottom = b; + } + + DRECT(float l, float t, float r, float b) + { + left = double(l); top = double(t); right = double(r); bottom = double(b); + } + + DRECT(const DRECT &x) + { + left = x.left; + top = x.top; + right = x.right; + bottom = x.bottom; + } + + VECTOR4 vec; + + struct { + double left, top, right, bottom; + }; + + } DRECT; + + /** + * \brief Float-valued 4x4 matrix. + * \note This structure is compatible with the D3DXMATRIX. + */ + typedef union FMATRIX4 { + FMATRIX4() {} + + FMATRIX4(const float *pSrc) { + for (int i = 0; i < 16; i++) data[i] = pSrc[i]; + } + + void Zero() + { + for (int i = 0; i < 16; i++) data[i] = 0.0; + } + + void Ident() + { + for (int i = 0; i < 16; i++) data[i] = 0.0; + m11 = m22 = m33 = m44 = 1.0f; + } + + float data[16]; + struct { FVECTOR4 _x, _y, _z, _p; }; + struct { float m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44; }; + } FMATRIX4; + + + /** + * \brief Vector Matrix multiplication + */ + inline FVECTOR4 mul(const FVECTOR4 &V, const FMATRIX4 &M) + { + float x = V.x*M.m11 + V.y*M.m21 + V.z*M.m31 + V.w*M.m41; + float y = V.x*M.m12 + V.y*M.m22 + V.z*M.m32 + V.w*M.m42; + float z = V.x*M.m13 + V.y*M.m23 + V.z*M.m33 + V.w*M.m43; + float w = V.x*M.m14 + V.y*M.m24 + V.z*M.m34 + V.w*M.m44; + return FVECTOR4(x, y, z, w); + } + + + /** + * \brief Transform a position by matrix + */ + inline FVECTOR3 TransformCoord(const FVECTOR3 &V, const FMATRIX4 &M) + { + float x = V.x*M.m11 + V.y*M.m21 + V.z*M.m31 + M.m41; + float y = V.x*M.m12 + V.y*M.m22 + V.z*M.m32 + M.m42; + float z = V.x*M.m13 + V.y*M.m23 + V.z*M.m33 + M.m43; + float w = V.x*M.m14 + V.y*M.m24 + V.z*M.m34 + M.m44; + w = 1.0f / w; + return FVECTOR3(x*w, y*w, z*w); + } + + + /** + * \brief Transform a normal or direction by matrix + */ + inline FVECTOR3 TransformNormal(const FVECTOR3 &V, const FMATRIX4 &M) + { + float x = V.x*M.m11 + V.y*M.m21 + V.z*M.m31; + float y = V.x*M.m12 + V.y*M.m22 + V.z*M.m32; + float z = V.x*M.m13 + V.y*M.m23 + V.z*M.m33; + return FVECTOR3(x, y, z); + } + + + inline FVECTOR2 unit(const FVECTOR2 &v) + { + float f = 1.0f / sqrt(v.x*v.x + v.y*v.y); + return FVECTOR2(v.x*f, v.y*f); + } + + inline FVECTOR3 unit(const FVECTOR3 &v) + { + float f = 1.0f / sqrt(v.x*v.x + v.y*v.y + v.z*v.z); + return FVECTOR3(v.x*f, v.y*f, v.z*f); + } + + inline float dot(const FVECTOR2 &v, const FVECTOR2 &w) + { + return v.x*w.x + v.y*w.y; + } + + inline float dot(const FVECTOR3 &v, const FVECTOR3 &w) + { + return v.x*w.x + v.y*w.y + v.z*w.z; + } + + inline float dot(const FVECTOR4 &v, const FVECTOR4 &w) + { + return v.x*w.x + v.y*w.y + v.z*w.z + v.w*w.w; + } + + inline float length(const FVECTOR2 &v) + { + return sqrt(v.x*v.x + v.y*v.y); + } + + inline float length(const FVECTOR3 &v) + { + return sqrt(v.x*v.x + v.y*v.y + v.z*v.z); + } + + inline FVECTOR3 cross(const FVECTOR3 &a, const FVECTOR3 &b) + { + return FVECTOR3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); + } + + inline float saturate(float x) + { + return min(1, max(0, x)); + } + + inline FVECTOR3 saturate(FVECTOR3 &v) + { + return FVECTOR3(saturate(v.x), saturate(v.y), saturate(v.z)); + } + + inline FVECTOR4 saturate(FVECTOR4 &v) + { + return FVECTOR4(saturate(v.x), saturate(v.y), saturate(v.z), saturate(v.w)); + } +} + + + + +// =========================================================================== +/** +* \class gcGUI +* \brief gcGUI Access and management functions +*/ +// =========================================================================== + +class gcGUIBase +{ + friend class gcGUIApp; + +private: + + virtual HNODE RegisterApplication(gcGUIApp *pApp, const char *label, HWND hDlg, DWORD docked, DWORD color) = 0; + virtual HNODE RegisterSubsection(HNODE hNode, const char *label, HWND hDlg, DWORD color) = 0; + virtual void UpdateStatus(HNODE hNode, const char *label, HWND hDlg, DWORD color) = 0; + virtual bool IsOpen(HNODE hNode) = 0; + virtual void OpenNode(HNODE hNode, bool bOpen = true) = 0; + virtual void DisplayWindow(HNODE hNode, bool bShow = true) = 0; + virtual HFONT GetFont(int id) = 0; + virtual HNODE GetNode(HWND hDlg) = 0; + virtual HWND GetDialog(HNODE hNode) = 0; + virtual void UpdateSize(HWND hDlg) = 0; + virtual void UnregisterApp(gcGUIApp *pApp) = 0; + virtual bool UnRegister(HNODE hNode) = 0; +}; + + + +// =========================================================================== +/** +* \class gcGUI +* \brief gcGUI Access and management functions +*/ +// =========================================================================== + +class gcGUIApp +{ + +public: + + gcGUIApp() : pApp(NULL) + { + + } + + + ~gcGUIApp() + { + // Can do nothing here, too late + } + + // ----------------------------------------------------- + + virtual void clbkShutdown() + { + if (pApp) pApp->UnregisterApp(this); + } + + virtual bool clbkMessage(DWORD uMsg, HNODE hNode, int data) + { + return false; + } + + // ----------------------------------------------------- + + inline bool Initialize() + { + typedef gcGUIBase * (__cdecl *__gcGetGUICore)(); + HMODULE hModule = GetModuleHandle("D3D9Client.dll"); + if (hModule) { + __gcGetGUICore pGetGUICore = (__gcGetGUICore)GetProcAddress(hModule, "gcGetGUICore"); + if (pGetGUICore) return ((pApp = pGetGUICore()) != NULL); + } + return false; + } + + HNODE RegisterApplication(const char *label, HWND hDlg, DWORD docked, DWORD color = 0) + { + assert(pApp); + return pApp->RegisterApplication(this, label, hDlg, docked, color); + } + + HNODE RegisterSubsection(HNODE hNode, const char *label, HWND hDlg, DWORD color = 0) + { + assert(pApp); + return pApp->RegisterSubsection(hNode, label, hDlg, color); + } + + void UpdateStatus(HNODE hNode, const char *label, HWND hDlg, DWORD color = 0) + { + assert(pApp); + return pApp->UpdateStatus(hNode, label, hDlg, color); + } + + bool IsOpen(HNODE hNode) + { + assert(pApp); + return pApp->IsOpen(hNode); + } + + void OpenNode(HNODE hNode, bool bOpen = true) + { + assert(pApp); + pApp->OpenNode(hNode, bOpen); + } + + void DisplayWindow(HNODE hNode, bool bShow = true) + { + assert(pApp); + pApp->DisplayWindow(hNode, bShow); + } + + HFONT GetFont(int id) + { + assert(pApp); + return pApp->GetFont(id); + } + + HNODE GetNode(HWND hDlg) + { + assert(pApp); + return pApp->GetNode(hDlg); + } + + HWND GetDialog(HNODE hNode) + { + assert(pApp); + return pApp->GetDialog(hNode); + } + + void UpdateSize(HWND hDlg) + { + assert(pApp); + pApp->UpdateSize(hDlg); + } + + bool UnRegister(HNODE hNode) + { + assert(pApp); + return pApp->UnRegister(hNode); + } + +private: + + gcGUIBase *pApp; +}; + + + + + +// =========================================================================== +/** +* \class gcCore +* \brief Core class for graphics services +*/ +// =========================================================================== + +class gcCore +{ + +public: + + typedef struct { + int Width; + int Height; + int Mips; + DWORD Flags; + } SurfaceSpecs; + + typedef struct { + FVECTOR2 pos; + DWORD color; + } TriangleVtx; + + typedef struct { + WORD Size; ///< sizeof(ElevInfo) + WORD Format; + double Resolution; + } ElevInfo; + + typedef struct { + HTILE pTile; + int Lvl; + int iLng; + int iLat; + } TileCreated; + + typedef struct { + OBJHANDLE hVessel; ///< Handle to a vessel that was clicked + MESHHANDLE mesh; ///< Mesh index that was clicked + int group; ///< Mesh group index that was clicked + float dist; ///< Distance from a camera to a click point + FVECTOR3 normal; ///< Normal vector in local vessel coordinates + FVECTOR3 pos; ///< Position in local vessel coordinates + } PickData; + + typedef struct { + int iUser; ///< Unused variable for user's own purposes. + int grp_inst; ///< Mesh group index or instance number that was clicked + float dist; ///< Distance from a camera to a click point + FVECTOR3 normal; ///< Normal vector in local vessel coordinates + FVECTOR3 pos; ///< Position in local vessel coordinates + } PickMeshStruct; + + typedef struct { + double lng, lat; ///< Longitude and Latigude of the point being clicked + double elev; ///< Elevation of the point being clicked above mean radius + double dist; ///< Distance from a camera to a click point + DRECT Bounds; ///< Tile bounds (i.e. min/max * lng/lat) + FVECTOR3 normal; ///< Normal in ecliptic frame + FVECTOR3 pos; ///< Position from a camera in ecliptic frame + float emax; ///< Max elevation within the tile + float emin; ///< Min elevation within the tile + UINT msg; ///< Zero or (WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONUP) or (WM_MOUSEMOVE, WM_MOUSEWHEEL) + int level; ///< Tile level + int iLng, iLat; ///< Tile Index + HTILE hTile; ///< Tile handle being clicked. WARNING: Tile returned by this data entry can become invalid without notice. + } PickGround; + + typedef struct { + int MaxTexSize; ///< Maximum texture size in pixels + int DisplayMode; ///< 0 = True Fullscreen, 1 = Fullscreen Window, 2 = Windowed + int MaxTexRep; ///< Maximum texture repeat count + DWORD gcAPIVer; ///< gcAPI Build Date 0xYYYYMMDD + } SystemSpecs; + + typedef struct { + HTILE hTile; ///< WARNING: Tile returned by this data entry can become invalid without notice. + FMATRIX4 mWorld; + } RenderTileData; + + + // =========================================================================== + /// \name Custom swap-chain management functions + // =========================================================================== + //@{ + /** + * \brief Create a new custom swap-chain (i.e. Frontbufer/Backbuffer) for a user defined window. + * \param hWnd Handle to a window client rect + * \param hSwap Handle to an existing swap object to resize it. + * \param AA Level of requested anti-aliasing. Valid values are 0, 2, 4, 8 + * \return Handle to a Swap object or NULL in a case of an error + */ + virtual HSWAP RegisterSwap(HWND hWnd, HSWAP hSwap = NULL, int AA = 0); + + /** + * \brief Flip backbuffer to a front + * \param hSwap Handle to a swap object. + */ + virtual void FlipSwap(HSWAP hSwap); + + /** + * \brief Get a backbuffer surface + * \param hSwap Handle to a swap object. + * \return A Handle to a rendering surface (i.e. backbuffer) + */ + virtual SURFHANDLE GetRenderTarget(HSWAP hSwap); + virtual HSURFNATIVE GetRenderTargetNative(HSWAP hSwap); + + /** + * \brief Release a swap object after it's no longer needed. + * \param hSwap Handle to a swap object. + */ + virtual void ReleaseSwap(HSWAP hSwap); + //@} + + + + + // =========================================================================== + /// \name Custom Camera Interface + // =========================================================================== + //@{ + /** + * \brief Delete/Release a custom camera. + * \param hCam camera handle to delete. + * \return zero or an error code if the camara didn't work properly. + * \note Always delete all cameras bound to a render surface before releasing the rendering surface it-self. + */ + virtual int DeleteCustomCamera(CAMERAHANDLE hCam); + + /** + * \brief Toggle camera on and off + * \param hCam camera handle to toggle + * \param bOn true to turn on the camera. + * \note If multiple cameras are sharing the same rendering surface. Flickering will occur if more than one camera is turned on. + */ + virtual void CustomCameraOnOff(CAMERAHANDLE hCam, bool bOn); + + /** + * \brief Create a new custom camera that can be used to render views into a surfaces and textures + * \param hCam camera handle to modify an existing camera or, NULL + * \param hVessel handle to a vessel where the camera is attached to. + * \param vPos camara position in vessel's local coordinate system + * \param vDir camara direction in vessel's local coordinate system. [Unit Vector] + * \param vUp camara up vector. Must be perpendicular to vDir. [Unit Vector] + * \param dFow camera field of view in radians + * \param hSurf rendering surface. Must be created atleast with OAPISURFACE_RENDER3D | OAPISURFACE_RENDERTARGET. Multiple cameras can share the same surface. + * \param dwFlags Flags to controls what is drawn and what is not. + * \return Camera handle, or NULL if an error occured or if the custom camera interface is disabled. + * \note Camera count is unlimited. + * \note Only a cameras attached to currently active vessel are operational and recodring. + * \note Having multiple cameras active at the same time doesn't impact in a frame rate, however, camera refresh rates are reduced. + */ + virtual CAMERAHANDLE SetupCustomCamera(CAMERAHANDLE hCam, OBJHANDLE hVessel, VECTOR3 &vPos, VECTOR3 &vDir, VECTOR3 &vUp, double dFov, SURFHANDLE hSurf, DWORD dwFlags = 0xFF); + //@} + + + + + // =========================================================================== + /// \name Sketchpad related functions + // =========================================================================== + //@{ + /** + * \brief Get the sketchpad version + * \param pSkp handle to a sketchpad interface. + * \return Currently returns 2 or (1 in some very special cases). + */ + virtual int SketchpadVersion(Sketchpad *pSkp); + + /** + * \brief Get a Sketchpad for a native DirectX 9 surface + * \param hSrf handle to a surface + * \param hDep handle to optional depth stencil surface + * \return a pointer to a new sketchpad interface or NULL if an error occurs. + */ + virtual Sketchpad* GetSketchpadNative(HSURFNATIVE hSrf, HSURFNATIVE hDep = NULL); + + /** + * \brief Release a native sketchpad interface acquired by GetSketchpadNative() + * \param pSkp handle to a sketchpad interface to release. + */ + virtual void ReleaseSketchpadNative(Sketchpad *pSkp); + + /** + * \brief Load a mesh from a harddrive to be used with Sketchpad2::SketchMesh + * \param name Name of the mesh file without ".msh" identifier. + * \sa gcDeleteSketchMesh + * \note SKETCHMESH handle isn't compatible with MESHHANDLE nor DEVMESHHANDLE. + */ + virtual SKETCHMESH LoadSketchMesh(const char *name); + + /** + * \brief Delete a mesh previously loaded with gcLoadSketchMesh + * \sa gcLoadSketchMesh + */ + virtual void DeleteSketchMesh(SKETCHMESH hMesh); + + /** + * \brief Create or Update a polyline composed form piecewise straight segments. + * \param hPoly Handle to a polyline to be updated or NULL to create a new one. + * \param pt list of vertex points. + * \param npt number of points in the list. + * \param flags additional PolyFlags flags + * \sa gcDeletePoly, Sketchpad2::DrawPoly() + * \note Poly objects should be created during initialization not for every frame or update. Updating existing (pre created) poly object is pretty fast. + * \note During update number of points must be equal or smaller than during initial creation of poly object. + */ + virtual HPOLY CreatePoly(HPOLY hPoly, const oapi::FVECTOR2 *pt, int npt, DWORD flags = 0); + + + /** + * \brief Create or Update a triangle object. + * \param hPoly Handle to a triangle to be updated or NULL to create a new one. + * \param pt list of vertex points. + * \param npt number of points in the list. + * \param flags additional flags (see below) + * \sa gcDeletePoly, Sketchpad2::DrawPoly() + * \note Poly objects should be created during initialization not for every frame or update. Updating existing (pre created) poly object is pretty fast. + * \note During update number of points must be equal or smaller than during initial creation of poly object. + * \note Flags: + * \note PF_TRIANGLES Each independent triangle is composed from three vertex points. ("npt" must be multiple of 3) + * \note PF_FAN Triangle fan. The first vertex is in a centre of the fan/circle and other lie at the edge. ("npt" must be "number of triangles" + 2) + * \note PF_STRIP Is build from quads. Where each quad requires two vertics. ("npt" must be "number of quads" * 2 + 2) + */ + virtual HPOLY CreateTriangles(HPOLY hPoly, const gcCore::TriangleVtx *pt, int npt, DWORD flags); + + + /** + * \brief Deletes a polyline created with gcCreatePolyPolyline() + * \param hPoly Handle to a polyline to be deleted + * \sa gcCreatePolyline + */ + virtual void DeletePoly(HPOLY hPoly); + + /** + * \brief Compute a length of a text string + * \param hFont a Pointer into a font + * \param pText a Pointer into a text string + * \param len a Length of the text string to process. -1 will scan to a NULL terminator. + */ + virtual DWORD GetTextLength(oapi::Font *hFont, const char *pText, int len = -1); + + /** + * \brief Find index of nearest "cap" between charters in specified location. (i.e. distance from start of the string in pixels) + * \param hFont a Pointer into a font + * \param pText a Pointer into a text line + * \param pos a Position in pixels from start of the string + * \param len a Length of the text line to process. -1 will process to a NULL terminator. + * \return index from 0 to number of charters. For just one char it can be either "0" or "1" depending which side is closer to "pos". + * \note This is used for finding a spot for a "cursor" when a text string is clicked with mouse. + */ + virtual DWORD GetCharIndexByPosition(oapi::Font *hFont, const char *pText, int pos, int len = -1); + + /** + * \brief This function will register a custom render callback function + * \param proc function to be called when render event occur + * \param id render event id + * \param pParam a pointer to user data (to a class for an example) + * \return false if an error occured, true otherwise. + */ + virtual bool RegisterRenderProc(__gcRenderProc proc, DWORD id, void *pParam); + + /** + * \brief Create a Font + * \param height Font height + * \param face Name of the font + * \param width Width of the font (0 for default aspect ration) + * \param weight Font thikness (400 for default weight) + * \param style A combination of \see gcFont flags (0 for default) + * \param spacing A spacing between charters in a string (0.0f for default) + * \return A pointer to a created or pre-existing font or NULL in a case of an error. + */ + virtual oapi::Font *CreateSketchpadFont(int height, char *face, int width = 0, int weight = 400, int gcFontStyle = 0, float spacing = 0.0f); + //@} + + + + + + // =========================================================================== + /// \name Mesh interface functions + // =========================================================================== + //@{ + /** + * \brief This function will register a custom render callback function + * \param hMesh Handle to a devmesh containing the material + * \param idx Material index + * \param prop material property identifier (\ref MeshMaterialFlags) + * \param value a pointer to COLOUR4 structure containing/receiving the data, or \e NULL to reset a default value or to unspecify a property. + * \param bSet \e true to set material value, \e false to get a meterial value + * \return -4 = Invalid handle \n -3 = Unknown property flag \n -2 = Property not specified cannot get it \n -1 = Index out of range \n 0 = Success + */ + virtual int MeshMaterial(DEVMESHHANDLE hMesh, DWORD idx, int prop, FVECTOR4 *value, bool bSet); + + /** + * \brief A Function to get a mesh transformation/animation matrix. + * \param matrix_id Id of the matrix to get. One of gcMatrix::xxx datatypes. + * \param hVessel Vessel object handle. + * \param mesh Mesh index + * \param group Group index + * \param pMat A pointer to FMATRIX4 struct for receiving the data. + * \return 0 = on Success, or error code. + */ + virtual int GetMatrix(int matrix_id, OBJHANDLE hVessel, DWORD mesh, DWORD group, oapi::FMATRIX4 *pMat); + + + /** + * \brief A Function to set a mesh transformation/animation matrix. Do not use this function for animated parts/meshes. + * \param matrix_id Id of the matrix to set. One of gcMatrix::xxx datatypes. + * \param hVessel Vessel object handle. + * \param mesh Mesh index + * \param group Group index + * \param pMat A pointer to FMATRIX4 containing the data to set. + * \return 0 = on Success, or error code. + */ + virtual int SetMatrix(int matrix_id, OBJHANDLE hVessel, DWORD mesh, DWORD group, const oapi::FMATRIX4 *pMat); + //@} + + + + + // =========================================================================== + /// \name Some Helper Functions + // =========================================================================== + //@{ + /** + * \brief Get some system information + * \param sp A pointer to SystemSpecs struct + * \param size sizeof(SystemSpecs) + */ + virtual void GetSystemSpecs(SystemSpecs *sp, int size); + + /** + * \brief Conver a floating point color to DWORD color value + * \param c A pointer to a color + * \return DWORD color in 0xAABBGGRR + * \note Alpha will range from 1 to 255. Zero is never returned because of backwards compatibility issues 0-alpha is mapped to 255 + */ + virtual DWORD Color(const COLOUR4 *c); + + /** + * \brief Conver a floating point color to DWORD color value + * \param c A pointer to a color + * \return DWORD color in 0xAABBGGRR + * \note Alpha will range from 1 to 255. Zero is never returned because of backwards compatibility issues 0-alpha is mapped to 255 + */ + virtual DWORD Color(const oapi::FVECTOR4 *c); + + /** + * \brief Conver a DWORD color to floating point COLOUR4 value + * \param dwABGR A color in 0xAABBGGRR + * \return COLOUR4 + * \note Alpha will range from 1 to 255. Zero is never used because of backwards compatibility issues 0-alpha is mapped to 255 + */ + virtual COLOUR4 Colour4(DWORD dwABGR); + + + /** + * \brief Get Surface Attributes (e.g. OAPISURFACE_TEXTURE) + * \param hSurf handle to a surface + * \param bCreation if true return creation time attributes, if false return current attributes + * \return Surface attributes + */ + virtual DWORD GetSurfaceAttribs(SURFHANDLE hSurf, bool bCreation = false); + + /** + * \brief Convert an existing surface to an other type. + * \param hSurf handle to a surface + * \param attrib new attributes + */ + virtual void ConvertSurface(SURFHANDLE hSurf, DWORD attrib); + + /** + * \brief Load a texture into a specific type of a surface + * \param fname name of a texture to be loaded. + * \param flags surface attributes (see: OAPISURFACE_x flags) + * \return surface handle or NULL in a case of an error + */ + virtual SURFHANDLE LoadSurface(const char *fname, DWORD flags); + + /** + * \brief Load a bitmap from file (*.bmp *.png *.jpg *.gif) + * \param fname name of the file to be loaded. + * \return Bitmap handle of NULL in a case of an error + */ + virtual HBITMAP LoadBitmapFromFile(const char *fname); + + /** + * \brief Get render window handle + * \return Render window handle + */ + virtual HWND GetRenderWindow(); + + /** + * \brief Register generic callback function + * \param proc function to be called when event occur + * \param id requested callback event id + * \param pParam a pointer to user data (to a class for an example) + * \return false if an error occured, true otherwise. + */ + virtual bool RegisterGenericProc(__gcGenericProc proc, DWORD id, void *pParam); + //@} + + + + + + + // =========================================================================== + /// \name Planetary surface interface + /// Graphics client maintains a tile database for a tiles used in rendering + /// This API can't access tile data outside visual range + // =========================================================================== + //@{ + virtual HPLANETMGR GetPlanetManager(OBJHANDLE hPlanet); + virtual HSURFNATIVE SetTileOverlay(HTILE hTile, const HSURFNATIVE hOverlay); + virtual HOVERLAY AddGlobalOverlay(HPLANETMGR hMgr, VECTOR4 mmll, const HSURFNATIVE hOverlay = NULL, HOVERLAY hOld = NULL); + + /** + * \brief Find a tile from a specified coordinates. Limited to a highest allocated level found from memory. + * \param hMgr handle to a tile/planet manager + * \param lng longitude of the location. + * \param lng latitude of the location. + * \param maxlevel highest level to search, -1 = Current render level. + * \return NULL, or a tile handle at the current render resolution + * \note WARNING: Tile returned by this function can become invalid without notice. + */ + virtual PickGround GetTileData(HPLANETMGR hMgr, double lng, double lat, int maxlevel = -1); + virtual HTILE GetTile(HPLANETMGR hMgr, double lng, double lat, int maxlevel = -1); + + /** + * \brief Find a tile from a specified coordinates. Limited to a highest allocated level found from memory. + * \param hMgr handle to a tile/planet manager + * \param iLng longitude index + * \param iLng latitude index + * \param level level of the tile + * \param flags what to search (see gcTileFlags) + * \return NULL, or a tile handle at the current render resolution + * \note WARNING: Tile returned by this function can become invalid without notice. + */ + virtual bool HasTileData(HPLANETMGR hMgr, int iLng, int iLat, int level, int flags); + virtual HSURFNATIVE SeekTileTexture(HPLANETMGR hMgr, int iLng, int iLat, int level, int flags = 3, void *reserved = NULL); + virtual void * SeekTileElevation(HPLANETMGR hMgr, int iLng, int iLat, int level, int flags, ElevInfo *pEI); + + + /** + * \brief Find a tile from specified coordinates. + * \param scr_x screen space x-coordinate. + * \param scr_y screen space y-coordinate. + * \return PickGround data structure, all members are zero if ray doesn't intersect ground. + */ + virtual PickGround ScanScreen(int scr_x, int scr_y); + + /** + * \brief Seek surface elevation from within the tile + * \param hTile handle to a tile + * \param lng geocentric longitude + * \param lat geocentric latitude + * \param out_elev pointer to float receiving the elevation above mean radius. + * \return 1 = Nominal, 0 = Tile Invisible but valid, -1 = (lng,lat) out of bounds, -3 = Fail + */ + virtual int GetElevation(HTILE hTile, double lng, double lat, double *out_elev); + //@} + + + + + + + // =========================================================================== + /// \name Native Object Interface + // =========================================================================== + //@{ + + /** + * \brief Load a file into native DirectX. Valid formats are (*.dds, *.jpg, *.bmp, *.png) + * \param file filename. + * \param flags a combination of OAPISURFACE_ flags. + * \return NULL in a case of failure. + */ + virtual HSURFNATIVE LoadSurfaceNative(const char *file, DWORD flags); + + /** + * \brief Create a native DirectX 9 Surface + * \param width surface width in pixels + * \param height surface height in pixels + * \param flags a combination of OAPISURFACE_ flags. + * \return Surface handle or NULL in a case of a failure. + */ + virtual HSURFNATIVE CreateSurfaceNative(int width, int height, DWORD flags); + + /** + * \brief Get a handle to a specific mipmap sub-level + * \param hSrf Handle to a texture containing mipmaps + * \param level Level of the mipmap to acquire. (level >= 1) (0 = "hSrf" it self with surface interface) + * \return Surface handle or NULL in a case of a failure. Must be released with ReleaseSurface() after nolonger accessed. + */ + virtual HSURFNATIVE GetMipSublevel(HSURFNATIVE hSrf, int level); + virtual void ReleaseSurface(HSURFNATIVE hSrf); + virtual bool GetSurfaceSpecs(HSURFNATIVE hSrf, SurfaceSpecs *pOut); + + /** + * \brief Save a native DirectX surface to a file (*.dds, *.jpg, *.bmp, *.png) + * \param file filename. + * \param hSrf handle to a surface to same. + * \return false in a case of failure. + */ + virtual bool SaveSurfaceNative(const char *file, HSURFNATIVE hSrf); + + /** + * \brief Realtime Mipmap auto-generation from the top/main level. + * \param hSurface handle to a surface + * \return false if an error occured, true otherwise. + * \note Surface must be created with (OAPISURFACE_TEXTURE | OAPISURFACE_RENDERTARGET | OAPISURFACE_MIPMAPS) + * \note Exact attribute requirements/conflicts are unknown. + */ + virtual bool GenerateMipMaps(HSURFNATIVE hSurface); + + /** + * \brief On the fly texture compression into a DXT format. Input remains uncanged. + * \param hSurface handle to a surface to compress + * \param flags combination of OAPISURFACE_PF_DXT1, OAPISURFACE_PF_DXT3, OAPISURFACE_PF_DXT5, OAPISURFACE_MIPMAPS, OAPISURFACE_SYSMEM + * \return Handle to a compressed texture, user must release this. + * \note Compression is slow, separate thread recommended for realtime compression. + */ + virtual HSURFNATIVE CompressSurface(HSURFNATIVE hSurface, DWORD flags); + + /** + * \brief Get device specific mesh from Orbiter mesh template + * \param hMesh handle to a mesh acquired from oapiLoadMeshGlobal() + * \param pBox a pointer to an array of 8 FVECTOR3s + */ + virtual DEVMESHHANDLE GetDevMesh(MESHHANDLE hMesh); + virtual DEVMESHHANDLE LoadDevMeshGlobal(const char *file_name, bool bUseCache = true); + virtual void ReleaseDevMesh(DEVMESHHANDLE hMesh); + + /** + * \brief Recover tile bounding box data + * \param hTile handle to a tile + * \param pBox a pointer to an array of 8 FVECTOR3s + */ + virtual void RenderMesh(DEVMESHHANDLE hMesh, const FMATRIX4 *pWorld); + virtual bool PickMesh(gcCore::PickMeshStruct *pm, DEVMESHHANDLE hMesh, const FMATRIX4 *pWorld, short x, short y); + + /** + * \brief Render a list of independent lines 0-1, 2-3,... + * \param pVtx a pointer to a vertex array + * \param pIdx a pointer to index array + * \param nIdx number of lines to draw multiplied by 2, (ARRAYSIZE() of index array) + * \param pWorld pointer to World matrix relative to camera + * \param color color in 0xAABBGGRR + */ + virtual void RenderLines(const FVECTOR3 *pVtx, const WORD *pIdx, int nVtx, int nIdx, const FMATRIX4 *pWorld, DWORD color); + //@} + + + + /** + * \brief Alters objects position. Matrix must be initially valid. + * \param mat [in/out] Pointer to a matrix to change + * \param pos New position + */ + inline void SetTranslation(FMATRIX4 *mat, const VECTOR3 &pos) + { + mat->m41 = float(pos.x); mat->m42 = float(pos.y); mat->m43 = float(pos.z); + } + + inline void SetTranslation(FMATRIX4 *mat, const FVECTOR3 &pos) + { + mat->m41 = pos.x; mat->m42 = pos.y; mat->m43 = pos.z; + } + + /** + * \brief Creates a world transformation matrix + * \param mat [out] Pointer to a matrix + * \param pos Objects position relative to a camera in ecliptic frame + * \param x X-axis, major axis [unit vector] + * \param z Z-axis, minor axis [unit vector] + * \param scale a sacle factor (default 1.0) + */ + inline void WorldMatrix(FMATRIX4 *mat, const VECTOR3 &pos, const VECTOR3 &x, const VECTOR3 &z, double scale = 1.0) + { + VECTOR3 y = crossp(x, z); + mat->m11 = float(x.x * scale); mat->m12 = float(x.y * scale); mat->m13 = float(x.z * scale); mat->m14 = 0.0f; + mat->m21 = float(y.x * scale); mat->m22 = float(y.y * scale); mat->m23 = float(y.z * scale); mat->m24 = 0.0f; + mat->m31 = float(z.x * scale); mat->m32 = float(z.y * scale); mat->m33 = float(z.z * scale); mat->m34 = 0.0f; + mat->m41 = float(pos.x); mat->m42 = float(pos.y); mat->m43 = float(pos.z); mat->m44 = 1.0f; + } + + inline void WorldMatrix(FMATRIX4 *mat, const FVECTOR3 &pos, const FVECTOR3 &x, const FVECTOR3 &z, float scale = 1.0f) + { + FVECTOR3 y = cross(x, z); + mat->m11 = (x.x * scale); mat->m12 = (x.y * scale); mat->m13 = (x.z * scale); mat->m14 = 0.0f; + mat->m21 = (y.x * scale); mat->m22 = (y.y * scale); mat->m23 = (y.z * scale); mat->m24 = 0.0f; + mat->m31 = (z.x * scale); mat->m32 = (z.y * scale); mat->m33 = (z.z * scale); mat->m34 = 0.0f; + mat->m41 = (pos.x); mat->m42 = (pos.y); mat->m43 = (pos.z); mat->m44 = 1.0f; + } +}; diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/lib/gcAPI.lib b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/lib/gcAPI.lib new file mode 100644 index 0000000000..5a9d14aa04 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/lib/gcAPI.lib differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/Bitmaps/bt_stick.bmp b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/Bitmaps/bt_stick.bmp new file mode 100644 index 0000000000..a3d8849687 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/Bitmaps/bt_stick.bmp differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/DX9ExtMFD.sln b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/DX9ExtMFD.sln new file mode 100644 index 0000000000..d3bb175be9 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/DX9ExtMFD.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DX9ExtMFD", "ExtMFD.vcxproj", "{1E1B3EE7-1010-47C6-B032-58EF3825CCD0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E1B3EE7-1010-47C6-B032-58EF3825CCD0}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E1B3EE7-1010-47C6-B032-58EF3825CCD0}.Debug|Win32.Build.0 = Debug|Win32 + {1E1B3EE7-1010-47C6-B032-58EF3825CCD0}.Release|Win32.ActiveCfg = Release|Win32 + {1E1B3EE7-1010-47C6-B032-58EF3825CCD0}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.cpp b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.cpp new file mode 100644 index 0000000000..4683e44927 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.cpp @@ -0,0 +1,136 @@ +// ============================================================== +// ORBITER MODULE: ExtMFD +// Part of the ORBITER SDK +// Copyright (C) 2006 Martin Schweiger +// All rights reserved +// +// ExtMFD.cpp +// +// Open multifunctional displays (MFD) in external windows +// ============================================================== + +#define STRICT 1 +#define ORBITER_MODULE +#include +#include "MFDWindow.h" +#include "orbitersdk.h" +#include "resource.h" +#include + +// ============================================================== +// Global variables +// ============================================================== + +HINSTANCE g_hInst; // module instance handle +HBITMAP g_hPin; // "pin" button bitmap +DWORD g_dwCmd; // custom function identifier + +// ============================================================== +// Local prototypes +// ============================================================== + +void OpenDlgClbk (void *context); +BOOL CALLBACK MsgProc (HWND, UINT, WPARAM, LPARAM); +extern long FAR PASCAL MFD_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +extern long FAR PASCAL MFD_BtnProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +// ============================================================== +// API interface +// ============================================================== + +// ============================================================== +// This function is called when Orbiter starts or when the module +// is activated. + +DLLCLBK void InitModule (HINSTANCE hDLL) +{ + g_hInst = hDLL; // remember the instance handle + + // To allow the user to open our new dialog box, we create + // an entry in the "Custom Functions" list which is accessed + // in Orbiter via Ctrl-F4. + g_dwCmd = oapiRegisterCustomCmd ("DX9 External MFD", + "Opens a multifunctional display in an external window", + OpenDlgClbk, NULL); + + // Load the bitmap for the "pin" title button + g_hPin = (HBITMAP)LoadImage (g_hInst, MAKEINTRESOURCE(IDB_PIN), IMAGE_BITMAP, 15, 30, 0); + + // Register a window classes for the MFD display and buttons + WNDCLASS wndClass; + wndClass.style = CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = MFD_WndProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hInstance = hDLL; + wndClass.hIcon = NULL; +#pragma warning(disable:4302) + wndClass.hCursor = LoadCursor (NULL, MAKEINTRESOURCE(IDC_ARROW)); +#pragma warning(default:4302) + wndClass.hbrBackground = (HBRUSH)GetStockObject (BLACK_BRUSH); + wndClass.lpszMenuName = NULL; + wndClass.lpszClassName = "ExtMFD_Display"; + RegisterClass (&wndClass); + + wndClass.lpfnWndProc = MFD_BtnProc; + wndClass.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH); + wndClass.lpszClassName = "ExtMFD_Button"; + RegisterClass (&wndClass); +} + +// ============================================================== +// This function is called when Orbiter shuts down or when the +// module is deactivated + +DLLCLBK void ExitModule (HINSTANCE hDLL) +{ + // Unregister window classes + UnregisterClass ("ExtMFD_Display", g_hInst); + UnregisterClass ("ExtMFD_Button", g_hInst); + + // Free bitmap resources + DeleteObject (g_hPin); + + // Unregister the custom function in Orbiter + oapiUnregisterCustomCmd (g_dwCmd); +} + + +// ============================================================== +// Write some parameters to the scenario file + +//DLLCLBK void opcSaveState (FILEHANDLE scn) +//{ +// oapiWriteScenario_int (scn, "Param", myprm); +//} + +// ============================================================== +// Read custom parameters from scenario + +//DLLCLBK void opcLoadState (FILEHANDLE scn) +//{ +// char *line; +// while (oapiReadScenario_nextline (scn, line)) { +// if (!strnicmp (line, "Param", 5)) { +// sscanf (line+5, "%d", &myprm); +// } +// } +//} + +// ============================================================== +// Open the dialog window + +void OpenDlgClbk (void *context) +{ + MFDSPEC spec = {{0,0,100,100},6,6,10,10}; + oapiRegisterExternMFD (new MFDWindow (g_hInst, spec), spec); +} + +// ============================================================== +// Close the dialog + +//void CloseDlg (HWND hDlg) +//{ +// oapiCloseDialog (hDlg); +//} + diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.rc b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.rc new file mode 100644 index 0000000000..1dc8c329bd --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.rc @@ -0,0 +1,60 @@ +// Generated by ResEdit 1.6.2 +// Copyright (C) 2006-2014 +// http://www.resedit.net + +#include +#include +#include +#include "resource.h" + + + + +// +// Bitmap resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +IDB_PIN BITMAP "Bitmaps\\bt_stick.bmp" + + + +// +// Dialog resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +IDD_MFD DIALOGEX 0, 0, 238, 185 +STYLE DS_SETFONT | WS_CAPTION | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP | WS_THICKFRAME +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "MFD" +FONT 8, "MS Sans Serif", 0, 0, 1 +{ + CONTROL "", IDC_DISPLAY, "ExtMFD_Display", 0x50010000, 31, 2, 175, 157, 0x00000000 + CONTROL "", IDC_BUTTON1, "ExtMFD_Button", 0x50010000, 0, 17, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON2, "ExtMFD_Button", 0x50010000, 0, 41, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON3, "ExtMFD_Button", 0x50010000, 0, 65, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON4, "ExtMFD_Button", 0x50010000, 0, 89, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON5, "ExtMFD_Button", 0x50010000, 0, 113, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON6, "ExtMFD_Button", 0x50010000, 0, 137, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON7, "ExtMFD_Button", 0x50010000, 208, 17, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON8, "ExtMFD_Button", 0x50010000, 208, 41, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON9, "ExtMFD_Button", 0x50010000, 208, 65, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON10, "ExtMFD_Button", 0x50010000, 208, 89, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON11, "ExtMFD_Button", 0x50010000, 208, 113, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON12, "ExtMFD_Button", 0x50010000, 208, 137, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON_SEL, "ExtMFD_Button", 0x50010000, 80, 170, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON_PWR, "ExtMFD_Button", 0x50010000, 45, 170, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON_DRV, "ExtMFD_Button", 0x50010000, 150, 170, 30, 14, 0x00000000 + CONTROL "", IDC_BUTTON_MNU, "ExtMFD_Button", 0x50010000, 115, 170, 30, 14, 0x00000000 +} + + + +// +// String Table resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +STRINGTABLE +{ + IDS_INFO "EXTERNAL MFD:\r\n\r\nProvides support for displaying MFD (multi-functional display) instruments in separate windows.\r\n\r\nExternal MFD windows can be opened by selecting the ""External MFD"" entry in the Custom Functions dialog (Ctrl-F4)." + IDS_TYPE "Tools and dialogs" +} diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.vcxproj b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.vcxproj new file mode 100644 index 0000000000..9a1672bab9 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/ExtMFD.vcxproj @@ -0,0 +1,147 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + DX9ExtMFD + {1E1B3EE7-1010-47C6-B032-58EF3825CCD0} + DX9ExtMFD + + + + DynamicLibrary + v140_xp + v141_xp + v142 + true + + + + DynamicLibrary + v140_xp + v141_xp + v142 + + + + + + + + + + + + + + + + + <_ProjectFileVersion>14.0.25431.1 + $(ModuleDir)\Server\orbiter.exe + $(OrbiterDir) + WindowsLocalDebugger + -s "(Current state)" + + + $(ModuleDir)\Plugin\ + $(Configuration)\ + false + DX9ExtMFD + false + + + $(ModuleDir)\Plugin\ + $(Configuration)\ + false + DX9ExtMFD + false + + + + Disabled + ..\..\..\Orbitersdk\include;%(AdditionalIncludeDirectories) + EnableFastChecks + MultiThreadedDebug + Level3 + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + Guard + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0809 + + + OrbiterSDK.lib;Orbiter.lib;gcAPI.lib;%(AdditionalDependencies) + $(ModuleDir)\Plugin\$(ProjectName).dll + ..\..\..\Orbitersdk\lib;%(AdditionalLibraryDirectories) + MSVCRT;LIBCMT + true + false + $(Configuration)\$(TargetName).pdb + $(Configuration)\$(TargetName).lib + MachineX86 + Windows + + + + + MaxSpeed + true + MultiThreaded + true + Level3 + None + %(AdditionalIncludeDirectories) + NDEBUG;WIN32;_WINDOWS;%(PreprocessorDefinitions) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0809 + + + true + true + MachineX86 + OrbiterSDK.lib;Orbiter.lib;gcAPI.lib;%(AdditionalDependencies) + $(ModuleDir)\Plugin\$(ProjectName).dll + %(AdditionalLibraryDirectories) + MSVCRT + $(Configuration)\$(TargetName).lib + false + MachineX86 + No + Windows + $(Configuration)\$(TargetName).pdb + false + UseLinkTimeCodeGeneration + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.cpp b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.cpp new file mode 100644 index 0000000000..0a0d421ed4 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.cpp @@ -0,0 +1,376 @@ +// ============================================================== +// ORBITER MODULE: ExtMFD +// Part of the ORBITER SDK +// Copyright (C) 2006 Martin Schweiger +// All rights reserved +// +// MFDWindow.cpp +// +// Class implementation for MFDWindow. Defines the properties and +// state of an MFD display in a dialog box +// ============================================================== + +#include "MFDWindow.h" +#include "resource.h" +#include // temporary +#include "gcAPI.h" + +#define IDSTICK 999 + +// ============================================================== +// prototype definitions + +BOOL CALLBACK DlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + +// ============================================================== +// class MFDWindow + +MFDWindow::MFDWindow (HINSTANCE _hInst, const MFDSPEC &spec): ExternMFD (spec), hInst(_hInst) +{ + hSwap = NULL; + hBtnFnt = 0; + fnth = 0; + vstick = false; + bFailed = false; + bDrvMode = false; // D3D + + oapiOpenDialogEx (hInst, IDD_MFD, DlgProc, DLG_ALLOWMULTI|DLG_CAPTIONCLOSE|DLG_CAPTIONHELP, this); + + gcInitialize(); +} + +MFDWindow::~MFDWindow () +{ + gcCore *pCore = gcGetCoreAPI(); + if (pCore && hSwap) pCore->ReleaseSwap(hSwap); + oapiCloseDialog (hDlg); + if (hBtnFnt) DeleteObject (hBtnFnt); +} + +void MFDWindow::Initialise (HWND _hDlg) +{ + extern HBITMAP g_hPin; + + hDlg = _hDlg; + hDsp = GetDlgItem (hDlg, IDC_DISPLAY); + + for (int i = 0; i < 16; i++) + SetWindowLong (GetDlgItem (hDlg, IDC_BUTTON1+i), GWL_USERDATA, i); + + oapiAddTitleButton (IDSTICK, g_hPin, DLG_CB_TWOSTATE); + SetTitle (); + gap = 3; + + GetWindowRect(hDlg, &wr); + CheckAspect(&wr, 0); + Resize(); +} + +void MFDWindow::SetVessel (OBJHANDLE hV) +{ + ExternMFD::SetVessel (hV); + SetTitle (); +} + +void MFDWindow::SetTitle () +{ + char cbuf[256] = "DX9 MFD ["; + oapiGetObjectName (hVessel, cbuf+9, 250); + strcat (cbuf, "]"); + SetWindowText (hDlg, cbuf); +} + +void MFDWindow::CheckAspect(LPRECT r, DWORD q) +{ + RECT c,b; + + GetClientRect(hDlg, &c); + GetWindowRect(hDlg, &b); + + int ew = (b.right - b.left) - (c.right - c.left); + int eh = (b.bottom - b.top) - (c.bottom - c.top); + + int bw = (c.right * 35) / 300; + + BW = max(30, min(60, bw)); + BH = max(15, min(40, (bw * 2) / 3)); + + int dspw = (r->right - r->left) - (2 * (BW + gap) + 2 * gap + ew); + int dsph = (r->bottom - r->top) - ((BH + 2 * gap) + 2 * gap + ew); + + ds = (dspw + dsph) / 2; + + int w = (gap + BW) * 2 + ds + gap * 2 + ew; + int h = (gap + BH) + ds + gap * 2 + eh; + + switch (q) { + case WMSZ_BOTTOM: + case WMSZ_RIGHT: + case WMSZ_BOTTOMRIGHT: + r->right = r->left + w; + r->bottom = r->top + h; + break; + default: + r->left = r->right - w; + r->top = r->bottom - h; + break; + } + return; +} + +void MFDWindow::Resize() +{ + RECT r; + GetClientRect (hDlg, &r); + int bw = (r.right*35)/300; + BW = max (30, min (60, bw)); + BH = max (15, min (40, (bw*2)/3)); + ds = r.right - (2 * (BW + gap) + 2 * gap); + + int fh = BW/3; + + if (fh != fnth) { + if (hBtnFnt) DeleteObject (hBtnFnt); + hBtnFnt = CreateFont (fnth = fh, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH|FF_DONTCARE, "Arial"); + } + + DH = DW = ds; + + SetWindowPos(hDsp, NULL, BW + gap * 2, gap, ds, ds, SWP_SHOWWINDOW); + + int x1 = gap; + int x2 = r.right-gap-BW; + int dy = (DH*2)/13, y0 = DH/7, y1 = r.top+y0-BH/2; + for (int i = 0; i < 6; i++) { + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON1+i), NULL, x1, y1+i*dy, BW, BH, SWP_SHOWWINDOW); + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON7+i), NULL, x2, y1+i*dy, BW, BH, SWP_SHOWWINDOW); + } + y1 = r.top+DH+gap*2; + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON_DRV), NULL, r.left + DW/2 + (BW*12)/4, y1, BW, BH, SWP_SHOWWINDOW); + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON_PWR), NULL, r.left + DW/2 - (BW*7)/4, y1, BW, BH, SWP_SHOWWINDOW); + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON_SEL), NULL, r.left + DW/2 - BW/2, y1, BW, BH, SWP_SHOWWINDOW); + SetWindowPos (GetDlgItem (hDlg, IDC_BUTTON_MNU), NULL, r.left + DW/2 + (BW*3)/4, y1, BW, BH, SWP_SHOWWINDOW); + + if (!bFailed) { + gcCore *pCore = gcGetCoreAPI(); + if (pCore) hSwap = pCore->RegisterSwap(hDsp, hSwap, 0); + } + + MFDSPEC spec = {{0,0,DW,DH},6,6,y0,dy}; + ExternMFD::Resize (spec); + + InvalidateRect(hDlg, NULL, FALSE); +} + + +void MFDWindow::RepaintDisplay(HWND hWnd) +{ + PAINTSTRUCT ps; + HDC hDCtgt = BeginPaint(hWnd, &ps); + SURFHANDLE surf = GetDisplaySurface(); + if (surf) { + HDC hDCsrc = oapiGetDC(surf); + BitBlt(hDCtgt, 0, 0, DW, DH, hDCsrc, 0, 0, SRCCOPY); + oapiReleaseDC(surf, hDCsrc); + } + else { + SelectObject(hDCtgt, GetStockObject(BLACK_BRUSH)); + Rectangle(hDCtgt, 0, 0, DW, DH); + } + EndPaint(hWnd, &ps); +} + +void MFDWindow::RepaintButton (HWND hWnd) +{ + int id = GetWindowLong (hWnd, GWL_USERDATA); + PAINTSTRUCT ps; + HDC hDC = BeginPaint (hWnd, &ps); + SelectObject (hDC, GetStockObject (BLACK_PEN)); + Rectangle (hDC, 0, 0, BW, BH); + SetTextAlign (hDC, TA_CENTER); + const char *label; + if (id < 12) { + label = GetButtonLabel (id); + } else { + static const char *lbl[3] = {"PWR","SEL","MNU"}; + static const char *drv[2] = {"N/A","N/A"}; + if (id == 15) label = drv[bDrvMode]; + else { + label = lbl[id - 12]; + if (id == 12) SetTextColor(hDC, 0x0000FF); + } + } + if (label) { + SetBkMode (hDC, TRANSPARENT); + HFONT pFont = (HFONT)SelectObject (hDC, hBtnFnt); + TextOut (hDC, BW/2, (BH-fnth)/2, label, strlen(label)); + SelectObject (hDC, pFont); + } + EndPaint (hWnd, &ps); +} + +void MFDWindow::ProcessButton (int bt, int event) +{ + switch (bt) { + case 12: + if (event == PANEL_MOUSE_LBDOWN) + SendKey (OAPI_KEY_ESCAPE); + break; + case 13: + if (event == PANEL_MOUSE_LBDOWN) + SendKey (OAPI_KEY_F1); + break; + case 14: + if (event == PANEL_MOUSE_LBDOWN) + SendKey (OAPI_KEY_GRAVE); + break; + case 15: + if (event == PANEL_MOUSE_LBDOWN) { + //bDrvMode = !bDrvMode; + //InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_DRV), NULL, FALSE); + //ToggleDrvMode(); + } + break; + default: + ExternMFD::ProcessButton (bt, event); + break; + } +} + + +void MFDWindow::ToggleDrvMode() +{ + gcCore *pCore = gcGetCoreAPI(); + if (!pCore) return; + + SURFHANDLE surf = GetDisplaySurface(); + + if (bDrvMode) pCore->ConvertSurface(surf, OAPISURFACE_SYSMEM); // GDI + else pCore->ConvertSurface(surf, OAPISURFACE_RENDERTARGET); // D3D +} + + +void MFDWindow::clbkRefreshDisplay (SURFHANDLE) +{ + if (bFailed) return; + + if (bDrvMode) { + // GDI Mode + InvalidateRect(hDsp, NULL, false); + return; + } + + gcCore *pCore = gcGetCoreAPI(); + if (!pCore) return; + + if (!hSwap) hSwap = pCore->RegisterSwap(hDsp, hSwap, 0); + if (!hSwap) { + bFailed = true; + return; + } + + SURFHANDLE tgt = pCore->GetRenderTarget(hSwap); + SURFHANDLE surf = GetDisplaySurface(); + + if (surf) oapiBlt(tgt, surf, 0, 0, 0, 0, DW, DH); + else oapiClearSurface(tgt); + + pCore->FlipSwap(hSwap); +} + +void MFDWindow::clbkRefreshButtons () +{ + InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON_DRV), NULL, FALSE); + for (int i = 0; i < 12; i++) + InvalidateRect (GetDlgItem (hDlg, IDC_BUTTON1+i), NULL, FALSE); +} + +void MFDWindow::clbkFocusChanged (OBJHANDLE hFocus) +{ + if (!vstick) { + ExternMFD::clbkFocusChanged (hFocus); + //SetTitle (); + } +} + +void MFDWindow::StickToVessel (bool stick) +{ + vstick = stick; + if (!vstick) { + SetVessel (oapiGetFocusObject()); + //SetTitle (); + } +} + +// ============================================================== +// Windows message handler for the dialog box + +BOOL CALLBACK DlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_INITDIALOG: + ((MFDWindow*)lParam)->Initialise (hDlg); + return TRUE; + case WM_SIZING: + ((MFDWindow*)oapiGetDialogContext(hDlg))->CheckAspect(LPRECT(lParam), wParam); + return TRUE; + case WM_SIZE: + ((MFDWindow*)oapiGetDialogContext(hDlg))->Resize(); + return TRUE; + case WM_COMMAND: + switch (LOWORD (wParam)) { + case IDCANCEL: + oapiUnregisterExternMFD ((MFDWindow*)oapiGetDialogContext (hDlg)); + return TRUE; + case IDHELP: + ((MFDWindow*)oapiGetDialogContext(hDlg))->OpenModeHelp (); + return TRUE; + case IDSTICK: + ((MFDWindow*)oapiGetDialogContext(hDlg))->StickToVessel (HIWORD(wParam) != 0); + return TRUE; + } + break; + } + return oapiDefDialogProc (hDlg, uMsg, wParam, lParam); +} + + +LRESULT CALLBACK MFD_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_ERASEBKGND: + return 1; + case WM_PAINT: + { + MFDWindow *mfdw = (MFDWindow*)oapiGetDialogContext(GetParent(hWnd)); + mfdw->RepaintDisplay(hWnd); + return 0; + } + } + return DefWindowProc (hWnd, uMsg, wParam, lParam); +} + + +long FAR PASCAL MFD_BtnProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) { + case WM_PAINT: { + MFDWindow *mfdw = (MFDWindow*)oapiGetDialogContext (GetParent (hWnd)); + mfdw->RepaintButton (hWnd); + } return 0; + case WM_LBUTTONDOWN: { + MFDWindow *mfdw = (MFDWindow*)oapiGetDialogContext (GetParent (hWnd)); + mfdw->ProcessButton (GetWindowLong (hWnd, GWL_USERDATA), PANEL_MOUSE_LBDOWN); + SetCapture (hWnd); + } return 0; + case WM_LBUTTONUP: { + MFDWindow *mfdw = (MFDWindow*)oapiGetDialogContext (GetParent (hWnd)); + mfdw->ProcessButton (GetWindowLong (hWnd, GWL_USERDATA), PANEL_MOUSE_LBUP); + ReleaseCapture(); + } return 0; + } + + return DefWindowProc (hWnd, uMsg, wParam, lParam); +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.h new file mode 100644 index 0000000000..203d465f34 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/MFDWindow.h @@ -0,0 +1,54 @@ +// ============================================================== +// ORBITER MODULE: ExtMFD +// Part of the ORBITER SDK +// Copyright (C) 2006 Martin Schweiger +// All rights reserved +// +// MFDWindow.h +// +// Class interface for MFDWindow. Defines the properties and state +// of an MFD display in a dialog box +// ============================================================== + +#ifndef __MFDWINDOW_H +#define __MFDWINDOW_H + +#define STRICT 1 +#include +#include "orbitersdk.h" +#include "gcAPI.h" + +class MFDWindow: public ExternMFD { +public: + MFDWindow (HINSTANCE _hInst, const MFDSPEC &spec); + ~MFDWindow (); + void Initialise (HWND _hDlg); + void SetVessel (OBJHANDLE hV); + void SetTitle (); + void Resize(); + void CheckAspect (LPRECT, DWORD); + void RepaintButton (HWND hWnd); + void RepaintDisplay(HWND hWnd); + void ProcessButton (int bt, int event); + void StickToVessel (bool stick); + void ToggleDrvMode(); + + void clbkRefreshDisplay (SURFHANDLE); + void clbkRefreshButtons (); + void clbkFocusChanged (OBJHANDLE hFocus); + +private: + RECT wr; + HSWAP hSwap; + HINSTANCE hInst; // instance handle + HWND hDlg, hDsp; // dialog and MFD display handles + HFONT hBtnFnt; // button font + int BW, BH, ds; // button width and height, display size + int gap; // geometry parameters + int fnth; // button font height + bool vstick; // stick to vessel + bool bFailed; + bool bDrvMode; +}; + +#endif // !__MFDWINDOW_H \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/resource.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/resource.h new file mode 100644 index 0000000000..56cbd265d4 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/DX9ExtMFD/resource.h @@ -0,0 +1,25 @@ +#ifndef IDC_STATIC +#define IDC_STATIC (-1) +#endif + +#define IDD_MFD 101 +#define IDB_PIN 104 +#define IDC_DISPLAY 1003 +#define IDC_BUTTON1 1004 +#define IDC_BUTTON2 1005 +#define IDC_BUTTON3 1006 +#define IDC_BUTTON4 1007 +#define IDC_BUTTON5 1008 +#define IDC_BUTTON6 1009 +#define IDC_BUTTON7 1010 +#define IDC_BUTTON8 1011 +#define IDC_BUTTON9 1012 +#define IDC_BUTTON10 1013 +#define IDC_BUTTON11 1014 +#define IDC_BUTTON12 1015 +#define IDC_BUTTON_PWR 1016 +#define IDC_BUTTON_SEL 1017 +#define IDC_BUTTON_MNU 1018 +#define IDC_BUTTON_DRV 1019 +#define IDS_INFO 1000 +#define IDS_TYPE 1001 diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.rc b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.rc new file mode 100644 index 0000000000..2b06238f4d --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.rc @@ -0,0 +1,49 @@ +// Generated by ResEdit 1.6.2 +// Copyright (C) 2017 +// http://www.resedit.net + +#include + +// +// String Table resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +STRINGTABLE +{ + 1000 "Generic Camera MFD.\r\n\r\nNO WARRANTY:\r\nTHE SOFTWARE IS PROVIDED ""AS IS"", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE." + 1001 "MFD modes" +} + + + +// +// Version Information resources +// +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK +1 VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + FILEFLAGSMASK 0x0000003F + FILEFLAGS 0x00000000 +{ + BLOCK "StringFileInfo" + { + BLOCK "080904E4" + { + VALUE "FileDescription", "Generic Camera MFD for Orbiter Space Flight Simulator" + VALUE "FileVersion", "1.0.0.0" + VALUE "InternalName", "GenericCamera" + VALUE "LegalCopyright", "Copyright © 2018 - 2019" + VALUE "OriginalFilename", "GenericCamera.dll" + VALUE "ProductName", "GenericCamera" + VALUE "ProductVersion", "1.0.0.0" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0809, 0x04E4 + } +} diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.sln b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.sln new file mode 100644 index 0000000000..3d647bc8e3 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GenericCamera", "GenericCamera.vcxproj", "{4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E}.Debug|Win32.Build.0 = Debug|Win32 + {4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E}.Release|Win32.ActiveCfg = Release|Win32 + {4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj new file mode 100644 index 0000000000..a79333ab9b --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj @@ -0,0 +1,134 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + GenericCamera + {4A3C16E4-8FDC-42E8-BDA2-7847D0547A3E} + GenericCamera + + + + DynamicLibrary + v140_xp + v141_xp + v142 + true + + + + DynamicLibrary + v140_xp + v141_xp + v142 + + + + + + + + + + + + + + + + + <_ProjectFileVersion>14.0.25123.0 + $(ModuleDir)\Server\orbiter.exe + $(OrbiterDir) + WindowsLocalDebugger + -s "(Current state)" + + + $(ModuleDir)\Plugin\ + $(Configuration)\ + false + GenericCamera + false + + + $(ModuleDir)\Plugin\ + $(Configuration)\ + false + GenericCamera + false + + + + Disabled + ..\..\..\Orbitersdk\include;%(AdditionalIncludeDirectories) + EnableFastChecks + MultiThreadedDebug + Level3 + _DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Guard + true + + + OrbiterSDK.lib;Orbiter.lib;gcAPI.lib;%(AdditionalDependencies) + $(ModuleDir)\Plugin\$(ProjectName).dll + ..\..\..\Orbitersdk\lib;%(AdditionalLibraryDirectories) + MSVCRT;LIBCMT + true + $(Configuration)\$(TargetName).pdb + $(Configuration)\$(TargetName).lib + MachineX86 + Windows + + + + + MaxSpeed + true + MultiThreaded + true + Level3 + None + %(AdditionalIncludeDirectories) + NDEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + MachineX86 + OrbiterSDK.lib;Orbiter.lib;gcAPI.lib;%(AdditionalDependencies) + $(ModuleDir)\Plugin\$(ProjectName).dll + %(AdditionalLibraryDirectories) + MSVCRT + $(Configuration)\$(TargetName).lib + MachineX86 + No + Windows + $(Configuration)\$(TargetName).pdb + false + UseLinkTimeCodeGeneration + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj.filters b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj.filters new file mode 100644 index 0000000000..96164ccae1 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/GenericCamera.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.cpp b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.cpp new file mode 100644 index 0000000000..8035f4d327 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.cpp @@ -0,0 +1,651 @@ +// ================================================================================================================================= +// +// Copyright (C) 2018 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to use, copy, modify, merge, publish, distribute, interact with the Software and sublicense +// copies of the Software, subject to the following conditions: +// +// a) You do not sell, rent or auction the Software. +// b) You do not collect distribution fees. +// c) You do not remove or alter any copyright notices contained within the Software. +// d) This copyright notice must be included in all copies or substantial portions of the Software. +// +// If the Software is distributed in an object code form then in addition to conditions above: +// e) It must inform that the source code is available and how to obtain it. +// f) It must display "NO WARRANTY" and "DISCLAIMER OF LIABILITY" statements on behalf of all contributors like the one below. +// +// The accompanying materials such as artwork, if any, are provided under the terms of this license unless otherwise noted. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + +#define STRICT +#define ORBITER_MODULE + +#include "windows.h" +#include "orbitersdk.h" +#include "MFD.h" +#include "gcAPI.h" +#include "Sketchpad2.h" +#include "Shell.h" + + +// ============================================================================================================ +// Global variables + +int g_MFDmode; // identifier for new MFD mode + + +class GenericModule : public oapi::Module +{ + +public: + + GenericModule(HINSTANCE hInst) : Module(hInst) { } + + ~GenericModule() { } + + void clbkSimulationStart(RenderMode rm) { } + + void clbkSimulationEnd() { } + + void clbkFocusChanged(OBJHANDLE hNew, OBJHANDLE hOld) + { + + VESSEL *o = NULL; + if (hOld) o = oapiGetVesselInterface(hOld); + + for (int i = 0; i < mfdLast; i++) { + if (MFDList[i].hTrue) { + if (o) if (MFDList[i].hVessel == o) MFDList[i].hTrue->FocusChanged(false); + } + } + } +}; + + +// ============================================================================================================ +// API interface + +DLLCLBK void InitModule (HINSTANCE hDLL) +{ + GenericModule *pFly = new GenericModule(hDLL); + oapiRegisterModule(pFly); + + ShellMFD::InitModule(hDLL); + + static char *name = "Generic Camera"; // MFD mode name + MFDMODESPECEX spec; + spec.name = name; + spec.key = OAPI_KEY_C; // MFD mode selection key + spec.context = NULL; + spec.msgproc = ShellMFD::MsgProc; // MFD mode callback function + + // Register the new MFD mode with Orbiter + g_MFDmode = oapiRegisterMFDMode (spec); +} + +// ============================================================================================================ +// +DLLCLBK void ExitModule (HINSTANCE hDLL) +{ + // Unregister the custom MFD mode when the module is unloaded + oapiUnregisterMFDMode (g_MFDmode); + ShellMFD::ExitModule(hDLL); +} + + + + + + + + + + + +// ============================================================================================================ +// MFD class implementation + +CameraMFD::CameraMFD(DWORD w, DWORD h, VESSEL *vessel) + : MFD2 (w, h, vessel) + , hVessel(vessel) + , hFocus(vessel) + , hRenderSrf(NULL) + , hTexture(NULL) + , hCamera(NULL) + , hDock(NULL) + , hAttach(NULL) + , pMask(NULL) + , type(Type::Dock) + , index(0) + , bParent(false) + , bNightVis(false) + , bCross(true) + , fov(30.0) // fov (i.e. Aparture) which is 1/2 of the vertical fov see oapiCameraAperture() + , offset(-0.2) +{ + + font = oapiCreateFont (w/20, true, "Arial", (FontStyle)(FONT_BOLD | FONT_ITALIC), 450); + + if (gcInitialize()) { + + hTexture = oapiLoadTexture("samples/Crosshairs.dds"); + + // Create 3D render target + hRenderSrf = oapiCreateSurfaceEx(w, h, OAPISURFACE_RENDER3D | OAPISURFACE_TEXTURE | + OAPISURFACE_RENDERTARGET | OAPISURFACE_NOMIPMAPS); + + // Clear the surface + oapiClearSurface(hRenderSrf); + } + + SelectVessel(hVessel, Type::Dock); + + //oapiWriteLogV("CTR-Starting custom camera for vessel 0x%X", pV); +} + + +// ============================================================================================================ +// +CameraMFD::~CameraMFD() +{ + oapiReleaseFont(font); + + // Attention, Always delete the camera before the surface !!! + if (hCamera) gcDeleteCustomCamera(hCamera); + if (hRenderSrf) oapiDestroySurface(hRenderSrf); + if (hTexture) oapiReleaseTexture(hTexture); +} + + +// ============================================================================================================ +// +void CameraMFD::FocusChanged(bool bGained) +{ + //if (bGained) oapiWriteLogV("Starting custom camera for vessel 0x%X", pV); + //else oapiWriteLogV("Shutting down custom camera for vessel 0x%X", pV); + + if (gcEnabled()) { + + // Always delete the camera first + if (hCamera) gcDeleteCustomCamera(hCamera); + if (hRenderSrf) oapiDestroySurface(hRenderSrf); + + hCamera = NULL; + hRenderSrf = NULL; + + if (bGained) { + + // Create 3D render target + hRenderSrf = oapiCreateSurfaceEx(W, H, OAPISURFACE_RENDER3D | OAPISURFACE_TEXTURE | + OAPISURFACE_RENDERTARGET | OAPISURFACE_NOMIPMAPS); + + // Clear the surface + oapiClearSurface(hRenderSrf); + + SelectVessel(hVessel, Type::Dock); + } + } +} + + +// ============================================================================================================ +// +void CameraMFD::UpdateDimensions(DWORD w, DWORD h) +{ + W = w; H = h; + FocusChanged(true); +} + + +// ============================================================================================================ +// +void CameraMFD::SelectVessel(VESSEL *hVes, Type _type) +{ + VECTOR3 pos, dir, rot; + + pos = _V(0, 0, 0); + dir = _V(1, 0, 0); + rot = _V(0, 1, 0); + + type = _type; + + if (hVes != hVessel) { + // New Vessel Selected + offset = -0.2; + index = 0; + type = Type::Dock; + } + + hVessel = hVes; + + + + int nDock = hVessel->DockCount(); + int nAtch = hVessel->AttachmentCount(bParent); + + if (nDock == 0 && nAtch == 0) return; + + if (type == Type::Atch && nAtch == 0) type = Type::Dock; + if (type == Type::Dock && nDock == 0) type = Type::Atch; + + if (fov < 5.0) fov = 5.0; + if (fov > 70.0) fov = 70.0; + + // Attachemnts + if (type == Type::Atch) { + + if (index < 0) index = nAtch - 1; + if (index >= nAtch) index = 0; + + hAttach = hVessel->GetAttachmentHandle(bParent, index); + + if (hAttach) { + hVessel->GetAttachmentParams(hAttach, pos, dir, rot); + pos += dir * offset; + } + else return; + } + + // Docking ports + if (type == Type::Dock) { + + if (index < 0) index = nDock - 1; + if (index >= nDock) index = 0; + + hDock = hVessel->GetDockHandle(index); + + if (hDock) { + hVessel->GetDockParams(hDock, pos, dir, rot); + pos += dir * offset; + } + else return; + } + + // Actual rendering of the camera view into hRenderSrf will occur when the client is ready for it and + // a lagg of a few frames may occur depending about graphics/performance options. + // Update will continue untill the camera is turned off via ogciCustomCameraOnOff() or deleted via ogciDeleteCustomCamera() + // Camera orientation can be changed by calling this function again with an existing camera handle instead of NULL. + + DWORD dwFlags = 0xFF; + + hCamera = gcSetupCustomCamera(hCamera, hVessel->GetHandle(), pos, dir, rot, fov*PI / 180.0, hRenderSrf, dwFlags); +} + +// ============================================================================================================ +// +void CameraMFD::NextAttachment() +{ + if (pMask) { + int nAtch = hVessel->AttachmentCount(bParent); + for (int i = 1; i < nAtch; ++i) { + auto h = hVessel->GetAttachmentHandle(bParent, (index+i)%nAtch); + if (h) { + auto attachmentId = hVessel->GetAttachmentId(h); + if (!strcmp(attachmentId, pMask)) { + index = i; + return; + } + } + } + } + else index++; +} +// ============================================================================================================ +// +void CameraMFD::PreviousAttachment() +{ + if (pMask) { + int nAtch = hVessel->AttachmentCount(bParent); + for (int i = 1; i < nAtch; ++i) { + auto h = hVessel->GetAttachmentHandle(bParent, (index + nAtch - i) % nAtch); + if (h) { + auto attachmentId = hVessel->GetAttachmentId(h); + if (!strcmp(attachmentId, pMask)) { + index = i; + return; + } + } + } + } + else index--; +} + +// ============================================================================================================ +// +char *CameraMFD::ButtonLabel (int bt) +{ + // The labels for the two buttons used by our MFD mode + static char *label[] = {"NA", "PA", "ND", "PD", "FWD", "BWD", "VES", "NV", "ZM+", "ZM-", "PAR", "CRS"}; + return (bt < ARRAYSIZE(label) ? label[bt] : 0); +} + + +// ============================================================================================================ +// +int CameraMFD::ButtonMenu (const MFDBUTTONMENU **menu) const +{ + // The menu descriptions for the two buttons + static const MFDBUTTONMENU mnu[] = { + { "Next attachment", 0, '1' }, + { "Prev attachment", 0, '2' }, + { "Next dockport", 0, '3' }, + { "Prev dockport", 0, '4' }, + { "Move Forward", 0, '5' }, + { "Move Backwards", 0, '6' }, + { "Select Vessel", 0, '7' }, + { "Night Vision", 0, '8' }, + { "Zoom In", 0, '9' }, + { "Zoom Out", 0, '0' }, + { "Parent Mode", 0, 'B' }, + { "Crosshairs", 0, 'C' } + }; + + if (menu) *menu = mnu; + + return ARRAYSIZE(mnu); // return the number of buttons used +} + + +// ============================================================================================================ +// +bool CameraMFD::Update(oapi::Sketchpad *skp) +{ + + hShell->InvalidateDisplay(); + + // Call to update attachments + SelectVessel(hVessel, type); + + int nDock = hVessel->DockCount(); + int nAtch = hVessel->AttachmentCount(bParent); + + int tbgh = 27; // Text backgound height + int edge = tbgh + 2; // Minumum spacing between cross endpoints and MFD screen edge + + RECT sr = { 0, 0, long(W - 2), long(H - 3) }; + + skp->SetTextAlign(Sketchpad::TAlign_horizontal::CENTER); + + if (hRenderSrf && gcSketchpadVersion(skp) == 2) { + + oapi::Sketchpad3 *pSkp3 = (oapi::Sketchpad3 *)skp; + + if (nDock != 0 || nAtch != 0) { + + if (bNightVis) { + pSkp3->SetBrightness(&FVECTOR4(0.0f, 4.0f, 0.0f, 1.0f)); + pSkp3->SetRenderParam(SKP3_PRM_GAMMA, &FVECTOR4(0.5f, 0.5f, 0.5f, 1.0f)); + pSkp3->SetRenderParam(SKP3_PRM_NOISE, &FVECTOR4(0.0f, 0.3f, 0.0f, 0.0f)); + } + + + // Blit the camera view into the sketchpad. + pSkp3->CopyRect(hRenderSrf, &sr, 1, 1); + + + if (bNightVis) { + pSkp3->SetBrightness(NULL); + pSkp3->SetRenderParam(SKP3_PRM_GAMMA, NULL); + pSkp3->SetRenderParam(SKP3_PRM_NOISE, NULL); + } + } + + //pSkp3->TextW(50, H / 2, L"©®ΒΓΔαβγθΣΩ™Ӕ€", -1); + + + // Draw the cross-hairs + if (bCross) { + + IVECTOR2 rc = { long(W / 2), long(H / 2) }; + + int y = H / 2 - 2; + int x = W / 2 + 1; + + int nseg = ((H / 2) - edge) / 16; // Number of segments + int len = min(248, (nseg * 16) - 8); // Lenght (start and end to a white segment) + + RECT ch = { 0, 0, len, 4 }; + + pSkp3->CopyRect(hTexture, &ch, x - len, y); + pSkp3->CopyRect(hTexture, &ch, x, y); + + pSkp3->SetWorldTransform2D(1.0f, float(PI05), &rc, NULL); + + pSkp3->CopyRect(hTexture, &ch, x - len, y); + pSkp3->CopyRect(hTexture, &ch, x, y); + + // Back to defaults + pSkp3->SetWorldTransform(); + } + } + else { + static char *msg = { "No Graphics API" }; + skp->Text(W / 2, H / 2, msg, strlen(msg)); + return true; + } + + + if (!hCamera) { + static char *msg = { "Custom Cameras Disabled" }; + skp->Text(W / 2, H / 2, msg, strlen(msg)); + return true; + } + + if (nDock == 0 && nAtch == 0) { + static char *msg = { "No Dock/Attachment points" }; + skp->Text(W / 2, H / 2, msg, strlen(msg)); + return true; + } + + + skp->SetTextAlign(); + + char text[256]; + static const char* mode[] = { "Attach(", "Dock(" }; + static const char* paci[] = { "Child", "Parent" }; + + auto atchId = (type == Atch) + ? std::string(" [ID:") + hVessel->GetAttachmentId(hVessel->GetAttachmentHandle(bParent, index)) + "]" + : ""; + + sprintf_s(text, 256, "Viewing %s %s%d)%s", hVessel->GetName(), mode[type], index, atchId.c_str()); + + if (gcSketchpadVersion(skp) == 2) { + oapi::Sketchpad2 *pSkp2 = (oapi::Sketchpad2 *)skp; + pSkp2->QuickBrush(0xA0000000); + pSkp2->QuickPen(0); + pSkp2->Rectangle(1, 1, W - 1, tbgh); + pSkp2->Rectangle(1, H - tbgh, W - 1, H - 1); + } + + hShell->Title (skp, text); + + sprintf_s(text, 256, "[%s] FOV=%0.0f° Ofs=%2.2f[m]", paci[bParent], fov*2.0, offset); + + skp->Text(10, H - tbgh, text, strlen(text)); + + return true; +} + + +// ============================================================================================================ +// +void CameraMFD::DrawOverlay(oapi::Sketchpad *pSkp) +{ + Sketchpad3 *pSkp3 = dynamic_cast(pSkp); + + // Must identify the surface, no pre-filtering exists in a caller application + // This callback function may receive "render overlay" calls not intended for this CameraMFD + if (pSkp3->GetSurface() == hRenderSrf) { + pSkp3->QuickPen(0xFF0000FF, 3.0f); + pSkp3->Line(0, 0, W, H); + pSkp3->Line(0, H, W, 0); + } +} + + +// ============================================================================================================ +// +bool CameraMFD::ConsumeKeyBuffered(DWORD key) +{ + + switch (key) { + + + case OAPI_KEY_1: // Next Attachment + NextAttachment(); + SelectVessel(hVessel, Type::Atch); + return true; + + + case OAPI_KEY_2: // Prev Attachment + PreviousAttachment(); + SelectVessel(hVessel, Type::Atch); + return true; + + + case OAPI_KEY_3: // Next dock + index++; + SelectVessel(hVessel, Type::Dock); + return true; + + + case OAPI_KEY_4: // Prev dock + index--; + SelectVessel(hVessel, Type::Dock); + return true; + + + case OAPI_KEY_5: // Move forward + offset += 0.1; + SelectVessel(hVessel, type); + return true; + + + case OAPI_KEY_6: // Move backwards + offset -= 0.1; + SelectVessel(hVessel, type); + return true; + + + case OAPI_KEY_7: // Select Vessel + oapiOpenInputBox("Keyboard Input:", DataInput, 0, 32, (void*)this); + return true; + + + case OAPI_KEY_8: // Night vision toggle + bNightVis = !bNightVis; + return true; + + + case OAPI_KEY_9: // Zoom in + fov -= 5.0; + SelectVessel(hVessel, type); + return true; + + + case OAPI_KEY_0: // Zoom out + fov += 5.0; + SelectVessel(hVessel, type); + return true; + + case OAPI_KEY_B: // Parent/Child + bParent = !bParent; + SelectVessel(hVessel, type); + return true; + + case OAPI_KEY_C: // Crosshairs + bCross = !bCross; + return true; + + } + + return false; +} + + +// ============================================================================================================ +// +bool CameraMFD::ConsumeButton(int bt, int event) +{ + static const DWORD btkey[12] = { OAPI_KEY_1, OAPI_KEY_2, OAPI_KEY_3, OAPI_KEY_4, OAPI_KEY_5, OAPI_KEY_6, + OAPI_KEY_7, OAPI_KEY_8, OAPI_KEY_9, OAPI_KEY_0, OAPI_KEY_B, OAPI_KEY_C }; + + if (event&PANEL_MOUSE_LBDOWN) { + return ConsumeKeyBuffered(btkey[bt]); + } + + return false; +} + + +// ============================================================================================================ +// +bool CameraMFD::DataInput(void *id, char *str) +{ + OBJHANDLE hObj = oapiGetVesselByName(str); + + if (hObj) { + SelectVessel(oapiGetVesselInterface(hObj), type); + return true; + } + + return false; +} + + +// ============================================================================================================ +// +bool CameraMFD::DataInput(void *id, char *str, void *data) +{ + return ((CameraMFD*)data)->DataInput(id, str); +} + +// ============================================================================================================ +// +void CameraMFD::DrawOverlay(oapi::Sketchpad *pSkp, void *pParam) +{ + ((CameraMFD*)pParam)->DrawOverlay(pSkp); +} + +// ============================================================================================================ +// +void CameraMFD::WriteStatus(FILEHANDLE scn) const +{ + if (pMask) { + oapiWriteScenario_string(scn, "ATCH_MASK", pMask); + } +} + + +// ============================================================================================================ +// +void CameraMFD::ReadStatus(FILEHANDLE scn) +{ + char *line; + + char mask[256] = ""; + + while (oapiReadScenario_nextline(scn, line)) { + if (1 == sscanf_s(line, "ATCH_MASK %s", mask, _countof(mask))) { + + if (pMask) delete[] pMask; // <= can this really happen? + + pMask = new char[strlen(mask) + 1]; + strcpy_s(pMask, strlen(mask) + 1, mask); + + type = Type::Atch; + NextAttachment(); + PreviousAttachment(); + + return; // we've got what we've been looking for! + } + } +} + diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.h new file mode 100644 index 0000000000..3624864722 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/MFD.h @@ -0,0 +1,85 @@ +// ================================================================================================================================= +// +// Copyright (C) 2018 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to use, copy, modify, merge, publish, distribute, interact with the Software and sublicense +// copies of the Software, subject to the following conditions: +// +// a) You do not sell, rent or auction the Software. +// b) You do not collect distribution fees. +// c) You do not remove or alter any copyright notices contained within the Software. +// d) This copyright notice must be included in all copies or substantial portions of the Software. +// +// If the Software is distributed in an object code form then in addition to conditions above: +// e) It must inform that the source code is available and how to obtain it. +// f) It must display "NO WARRANTY" and "DISCLAIMER OF LIABILITY" statements on behalf of all contributors like the one below. +// +// The accompanying materials such as artwork, if any, are provided under the terms of this license unless otherwise noted. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + +#ifndef __CAMERA_H +#define __CAMERA_H + +#include "gcAPI.h" + +class CameraMFD : public MFD2 { + +public: + CameraMFD(DWORD w, DWORD h, VESSEL *vessel); + ~CameraMFD(); + + void FocusChanged(bool bGained); + +private: + enum Type { Atch = 0, Dock = 1 }; + + void UpdateDimensions(DWORD w, DWORD h); + char *ButtonLabel (int bt); + int ButtonMenu (const MFDBUTTONMENU **menu) const; + bool Update (oapi::Sketchpad *skp); + bool DataInput(void *id, char *str); + void SelectVessel(VESSEL *hVes, Type type); + void NextAttachment(); + void PreviousAttachment(); + void DrawOverlay(oapi::Sketchpad *pSkp); + + bool ConsumeKeyBuffered(DWORD key); + bool ConsumeButton(int bt, int event); + + void WriteStatus(FILEHANDLE scn) const; + void ReadStatus(FILEHANDLE scn); + + static bool DataInput(void *id, char *str, void *data); + static void DrawOverlay(oapi::Sketchpad *pSkp, void *pParam); + + oapi::Font * font; + SURFHANDLE hRenderSrf; + SURFHANDLE hTexture; + DOCKHANDLE hDock; + ATTACHMENTHANDLE hAttach; + CAMERAHANDLE hCamera; + SKETCHMESH hMesh; + bool bNightVis; + bool bParent; + bool bCross; + Type type; + int index; + VESSEL * hVessel; + VESSEL * hFocus; + double offset, fov; + + char * pMask; + + class ShellMFD *hShell; + + friend ShellMFD; +}; + +#endif \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.cpp b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.cpp new file mode 100644 index 0000000000..6f087e177d --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.cpp @@ -0,0 +1,211 @@ + +// ================================================================================================================================= +// +// Copyright (C) 2009 - 2018 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to use, copy, modify, merge, publish, distribute, interact with the Software and sublicense +// copies of the Software, subject to the following conditions: +// +// a) You do not sell, rent or auction the Software. +// b) You do not collect distribution fees. +// c) You do not remove or alter any copyright notices contained within the Software. +// d) This copyright notice must be included in all copies or substantial portions of the Software. +// +// If the Software is distributed in an object code form then in addition to conditions above: +// e) It must inform that the source code is available and how to obtain it. +// f) It must display "NO WARRANTY" and "DISCLAIMER OF LIABILITY" statements on behalf of all contributors like the one below. +// +// The accompanying materials such as artwork, if any, are provided under the terms of this license unless otherwise noted. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + + +// ================================================================================= +// ShellMFD class to provide 256 vessel specific instances of true MFD. +// Only the shell class is deleted when switching between panels and vessels +// the true MFD remains unchanged. +// ================================================================================= + + +#include "mfdapi.h" +#include "Shell.h" + +// Header of true MFD +// +#include "MFD.h" + +struct mfd_list *MFDList = NULL; +int mfdLast = 0; +bool bExiting = false; + +// ================================================================================= +// Constructors and Destructors +// + +ShellMFD::ShellMFD (DWORD w, DWORD h, VESSEL *vessel, TRUE_MFD *TrueMFD, UINT mfd) +: MFD2(w, h, vessel) +{ + id = mfd; + hTrue = TrueMFD; + hTrue->hShell = this; // Bind true MFD into this shell +} + +// ============================================================================================================ +// +ShellMFD::~ShellMFD () +{ + if (hTrue) hTrue->hShell = NULL; // Break binding into this shell + + if (bExiting) { + for (int i=0;i<256;i++) if (MFDList[i].hTrue) { + delete MFDList[i].hTrue; MFDList[i].hTrue = NULL; + } + } +} + +// ============================================================================================================ +// +void ShellMFD::InitModule(HINSTANCE hDLL) +{ + // Construct MFD List + MFDList = new mfd_list[256](); +} + +// ============================================================================================================ +// +void ShellMFD::ExitModule(HINSTANCE hDLL) +{ + if (MFDList) { + + // Delete all true MFDs when exiting the module + // + for (int i=0;i<256;i++) { + if (MFDList[i].hTrue) { + +#ifdef NDEBUG // Removed for DEBUG builds, as is causes access violation exceptions @ shutdown! No idea why :/ + delete MFDList[i].hTrue; + MFDList[i].hTrue=NULL; +#endif + } + } + + delete[] MFDList; MFDList=NULL; + } +} + + +// ============================================================================================================ +// +int ShellMFD::MsgProc(UINT msg, UINT mfd, WPARAM wparam, LPARAM lparam) +{ + + if (msg==OAPI_MSG_MFD_OPENED && MFDList) { + + // Search for existing true MFD ---------------------- + // + for (int i=0;iUpdateDimensions(LOWORD(wparam), HIWORD(wparam)); + + return (int) new ShellMFD(LOWORD(wparam), HIWORD(wparam), (VESSEL*)lparam, MFDList[i].hTrue, mfd); + } + } + } + + // Find empty slot and create new true MFD ----------- + // + if (MFDList[mfdLast].hTrue) return 0; + if (mfdLast>=254) return 0; + + + TRUE_MFD *TrMFD = new TRUE_MFD(LOWORD(wparam), HIWORD(wparam), (VESSEL*)lparam); + + MFDList[mfdLast].hVessel = (VESSEL *)lparam; + MFDList[mfdLast].idMFD = mfd; + MFDList[mfdLast].hTrue = TrMFD; + + mfdLast++; + + // Create new Shell MFD and bind true MFD into the shell + // + return (int) new ShellMFD(LOWORD(wparam), HIWORD(wparam), (VESSEL*)lparam, MFDList[mfdLast-1].hTrue, mfd); + } + + return 0; +} + + +// ================================================================================= +// Reroute calls to true MFD +// +bool ShellMFD::ConsumeKeyImmediate(char *key) +{ + if (hTrue) return hTrue->ConsumeKeyImmediate(key); + return false; +} + +bool ShellMFD::ConsumeKeyBuffered (DWORD key) +{ + if (hTrue) return hTrue->ConsumeKeyBuffered(key); + return false; +} + +bool ShellMFD::ConsumeButton (int bt, int event) +{ + if (hTrue) return hTrue->ConsumeButton(bt, event); + return false; +} + +char *ShellMFD::ButtonLabel (int bt) +{ + if (hTrue) return hTrue->ButtonLabel(bt); + return NULL; +} + +int ShellMFD::ButtonMenu (const MFDBUTTONMENU **menu) const +{ + if (hTrue) return hTrue->ButtonMenu(menu); + return 0; +} + +bool ShellMFD::Update(Sketchpad *pSkp) +{ + if (hTrue) return hTrue->Update(pSkp); + return true; +} + +void ShellMFD::Update (HDC hDC) +{ + +} + +void ShellMFD::WriteStatus (FILEHANDLE scn) const +{ + bExiting = true; + if (hTrue) hTrue->WriteStatus(scn); +} + +void ShellMFD::ReadStatus (FILEHANDLE scn) +{ + if (hTrue) hTrue->ReadStatus(scn); +} + +void ShellMFD::StoreStatus (void) const +{ +} + +void ShellMFD::RecallStatus (void) +{ +} \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.h b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.h new file mode 100644 index 0000000000..89b04bad62 --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/D3D9Client/Orbitersdk/samples/GenericCamera/Shell.h @@ -0,0 +1,99 @@ +// ================================================================================================================================= +// +// Copyright (C) 2009 - 2018 Jarmo Nikkanen +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +// files (the "Software"), to use, copy, modify, merge, publish, distribute, interact with the Software and sublicense +// copies of the Software, subject to the following conditions: +// +// a) You do not sell, rent or auction the Software. +// b) You do not collect distribution fees. +// c) You do not remove or alter any copyright notices contained within the Software. +// d) This copyright notice must be included in all copies or substantial portions of the Software. +// +// If the Software is distributed in an object code form then in addition to conditions above: +// e) It must inform that the source code is available and how to obtain it. +// f) It must display "NO WARRANTY" and "DISCLAIMER OF LIABILITY" statements on behalf of all contributors like the one below. +// +// The accompanying materials such as artwork, if any, are provided under the terms of this license unless otherwise noted. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// ================================================================================================================================= + + +// ================================================================================= +// ShellMFD class to provide 256 vessel specific instances of true MFD. +// Only the shell class is deleted when switching between panels and vessels +// the true MFD remains unchanged. +// ================================================================================= + +#ifndef __SHELLMFD_H +#define __SHELLMFD_H + +// ======================================================================== +// Define class name of the true MFD +// +#define TRUE_MFD CameraMFD +class TRUE_MFD; + +// ======================================================================== + +#include "OrbiterSDK.h" +#include "DrawAPI.h" + +using namespace oapi; + +struct mfd_list { + VESSEL * hVessel; + UINT idMFD; + TRUE_MFD * hTrue; +}; + +extern struct mfd_list *MFDList; +extern int mfdLast; +extern bool bExiting; + +class ShellMFD: public MFD2 +{ + +public: + + ShellMFD (DWORD w, DWORD h, VESSEL *vessel, TRUE_MFD *TrueMFD, UINT id); + ~ShellMFD (); + + bool ConsumeKeyImmediate(char *key); + bool ConsumeKeyBuffered (DWORD key); + bool ConsumeButton (int bt, int event); + char * ButtonLabel (int bt); + int ButtonMenu (const MFDBUTTONMENU **menu) const; + void Update (HDC hDC); + bool Update (Sketchpad *pSkp); + void WriteStatus (FILEHANDLE scn) const; + void ReadStatus (FILEHANDLE scn); + void StoreStatus (void) const; + void RecallStatus (void); + + UINT GetMFDId(void) const { return id; } + TRUE_MFD * GetTrueMFD(void) const { return hTrue; } + + // Call these functions from global InitModule and ExitModule callbacks for initialization and cleanup. + // Like: + // + // DLLCLBK void ExitModule(HINSTANCE hDLL) + // { + // ShellMFD::ExitModule(hDLL); + // } + // + static void InitModule(HINSTANCE hDLL); + static void ExitModule(HINSTANCE hDLL); + static int MsgProc(UINT msg, UINT mfd, WPARAM wparam, LPARAM lparam); + +private: + UINT id; // Logical MFD identifier MFD_LEFT, MFD_RIGHT... + TRUE_MFD *hTrue; // Pointer to true MFD +}; + +#endif \ No newline at end of file diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons18.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons18.png new file mode 100644 index 0000000000..6b9ba8577d Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons18.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons28.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons28.png new file mode 100644 index 0000000000..5a6177e392 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons28.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons36.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons36.png new file mode 100644 index 0000000000..8026e103c3 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/Icons36.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SketchpadTest.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SketchpadTest.dds new file mode 100644 index 0000000000..4016a93370 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SketchpadTest.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle18.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle18.png new file mode 100644 index 0000000000..c6a5b99d83 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle18.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle28.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle28.png new file mode 100644 index 0000000000..1d674f6afc Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle28.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle36.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle36.png new file mode 100644 index 0000000000..8af8e82bbf Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle36.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle56.png b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle56.png new file mode 100644 index 0000000000..6aa4067f52 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9/SubTitle56.png differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9CLUT.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9CLUT.dds new file mode 100644 index 0000000000..c0ef0a6e68 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9CLUT.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Noise.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Noise.dds new file mode 100644 index 0000000000..76665b9b20 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Noise.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Ocean.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Ocean.dds new file mode 100644 index 0000000000..cb9d133af1 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9Ocean.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9RwyLight.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9RwyLight.dds new file mode 100644 index 0000000000..bd519f73eb Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/D3D9RwyLight.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Null.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Null.dds new file mode 100644 index 0000000000..adac8c68ae Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Null.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_2048.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_2048.dds new file mode 100644 index 0000000000..a4dc424a0e Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_2048.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_4096.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_4096.dds new file mode 100644 index 0000000000..531cf822e6 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_4096.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_8192.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_8192.dds new file mode 100644 index 0000000000..4ea2a977a0 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/Saturn_ring_8192.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1.dds new file mode 100644 index 0000000000..481055dafa Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1_norm.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1_norm.dds new file mode 100644 index 0000000000..7b9dd56f4e Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/cloud1_norm.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transl.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transl.dds new file mode 100644 index 0000000000..7cba12058b Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transl.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transm.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transm.dds new file mode 100644 index 0000000000..7060779004 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso2_transm.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transl.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transl.dds new file mode 100644 index 0000000000..e81933b3a4 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transl.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transm.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transm.dds new file mode 100644 index 0000000000..dc77fea9d7 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/issbso_transm.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/samples/Crosshairs.dds b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/samples/Crosshairs.dds new file mode 100644 index 0000000000..45c0f57a09 Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/D3D9Client/Textures/samples/Crosshairs.dds differ diff --git a/Config/ProjectApollo/InstallerScripts/Installer README.md b/Config/ProjectApollo/InstallerScripts/Installer README.md new file mode 100644 index 0000000000..45729e074f --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/Installer README.md @@ -0,0 +1,14 @@ +# Installer +The installer for NASSP was developed by harveywalker500 on github. Any issues with the installer can be directed to me :) + +End users do not need to run the following instructions, as the pre-compiled installer should be released alongside the release itself. This guide is for those who want to compile the installer themselves. + +## Prerequisites +- NSIS +- Release version of Project Apollo - NASSP + +## Instructions for compiling +1. Ensure that the InstallerScripts folder is in `NASSP/Config/ProjectApollo` and that D3D9 client is inside it. *The installer will not compile successfully if it is anywhere else!* +2. Open NSIS and select "Compile NSIS scripts". +3. Open the script using the dialog box and select the `installer.nsi` script. It should start compiling immediately, and take a few minutes. +4. Once the script has finished compiling, the installer executable can be found in the same folder the script is. It can then be moved and run anywhere on your computer. diff --git a/Config/ProjectApollo/InstallerScripts/apolloLogo.bmp b/Config/ProjectApollo/InstallerScripts/apolloLogo.bmp new file mode 100644 index 0000000000..c3264f8d1c Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/apolloLogo.bmp differ diff --git a/Config/ProjectApollo/InstallerScripts/icon.ico b/Config/ProjectApollo/InstallerScripts/icon.ico new file mode 100644 index 0000000000..8b4bc0b09f Binary files /dev/null and b/Config/ProjectApollo/InstallerScripts/icon.ico differ diff --git a/Config/ProjectApollo/InstallerScripts/installer.nsi b/Config/ProjectApollo/InstallerScripts/installer.nsi new file mode 100644 index 0000000000..f58552a97b --- /dev/null +++ b/Config/ProjectApollo/InstallerScripts/installer.nsi @@ -0,0 +1,72 @@ +; NASSP Installer Script +; Author: harveywalker500 +; FOR ANY ISSUES OR BUGS, OPEN AN ISSUE ON GITHUB OR CONTACT ME + +; Includes MUI2 +!include "MUI2.nsh" +!include "LogicLib.nsh" + +; Custom Defines for information +!define NAME "Project Apollo - NASSP" +!define VERSION "8.0.0 Beta-Orbiter2016-2234" +!define SLUG "${NAME} v${VERSION}" + +; Define installer name and output +name "${NAME}" +OutFile "${SLUG}.exe" +InstallDir "C:\OrbiterBeta" + +; Define MUI2 settings +!define MUI_ABORTWARNING +!define MUI_ICON "icon.ico" +!define MUI_UNICON "icon.ico" + +; Installer pages +!define MUI_WELCOMEFINISHPAGE_BITMAP "apolloLogo.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "apolloLogo.bmp" +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_COMPONENTS +!define MUI_PAGE_CUSTOMFUNCTION_PRE excludeInstaller +!insertmacro MUI_PAGE_LICENSE "..\..\..\NASSP-LICENSE.txt" +!define MUI_PAGE_CUSTOMFUNCTION_PRE excludeD3D9 +!insertmacro MUI_PAGE_LICENSE "D3D9-LICENSE.txt" +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +; Finish page +!define MUI_FINISHPAGE_TEXT "Thank you for installing NASSP! Please note, in order to have sound in Orbiter, you will have to install OrbiterSound, which is a third party addon. You can find instructions on how to install it in the config." +!define MUI_FINISHPAGE_RUN "$INSTDIR\Orbiter_ng.exe" +!define MUI_FINISHPAGE_RUN_TEXT "Launch Orbiter" +!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\Doc\Project Apollo - NASSP\configureInstructions.txt" +!define MUI_FINISHPAGE_SHOWREADME_TEXT "Open Configuration Instructions" +!insertmacro MUI_PAGE_FINISH + +; Language files +!insertmacro MUI_LANGUAGE "English" + +Section "Project Apollo - NASSP" SecMain + SetOutPath $INSTDIR + SetOverwrite ifnewer + File /r "..\..\..\*.*" + ; Exclude the installer_scripts folder + RMDIR /r "$INSTDIR\Config\ProjectApollo\InstallerScripts" +SectionEnd + +Section "D3D9 Client" SecD3D9 + SetOutPath $INSTDIR + SetOverwrite ifnewer + File /r "D3D9Client\*.*" +SectionEnd + +; Exclude license pages if the section is not selected +Function excludeInstaller + ${Unless} ${SectionIsSelected} ${SecMain} + Abort + ${EndUnless} +FunctionEnd + +Function excludeD3D9 + ${Unless} ${SectionIsSelected} ${SecD3D9} + Abort + ${EndUnless} +FunctionEnd diff --git a/Doc/Project Apollo - NASSP/configureInstructions.txt b/Doc/Project Apollo - NASSP/configureInstructions.txt new file mode 100644 index 0000000000..c9edc85473 --- /dev/null +++ b/Doc/Project Apollo - NASSP/configureInstructions.txt @@ -0,0 +1,13 @@ +How to configure Project Apollo: + +1. You will still need to install OrbiterSound for there to be any audio from Project Apollo. to do this, go to http://orbiter.dansteph.com/forum/index.php?page=download and follow the installer. Then, go to "Modules" in Orbiter and activate the module. You can also run the SoundConfig application to adjust the settings to your liking. + +2. Go to the "Parameters" tab and make sure that at least Complex flight model, Limited fuel and Nonspherical gravity sources are enabled. Note: At this time, it is recommended to leave "Gravity-gradient torque" and "Atmospheric wind effects" disabled as in some occasions they can cause CTDs with NASSP. Go to "Visual effects" tab and configure to your liking. Make sure to have a check on surface elevation, using LINEAR interpolation in order to not have the landed LM seem sunken into/floating over the lunar terrain. You can also check "Particle streams" to see the various particle/dust effects in NASSP and "Local light sources" for the night-time launch pad lighting. + +3. Go to the "Modules" tab and activate the "ProjectApolloMFD" and "ApolloRTCCMFD" modules. + +4. Go to the Launchpad Configuration Options on the "Extra" tab. If you have a joystick, this is where you can configure your joystick for use in NASSP. Do not use the normal Orbiter controls page to configure your joystick, there it should be . In the "Miscellaneous" tab, make sure "Multi-Threading in time acceleration" is checked. It is also recommended to set a limit for time acceleration, NASSP runs best at 50x or less depending on the hardware you are using. + +OPTIONAL: Download "Apollo Landing Sites for Orbiter 2016" by ggalfi here: http://absimp.org/orbitersim/apollolandingsites.html. The scenery is breathtaking but be aware there can sometimes be a mismatch between the visible terrain and the physical terrain in the Orbiter engine, so the LM can sometimes be floating above or sunken into the surface after landing. If you try and land exactly at the historical landing site, the mismatch should be minimal. + +And that is it! Enjoy! \ No newline at end of file