From 67312b7991c945e66d4fa1d3a6f8e02dbabc9b5a Mon Sep 17 00:00:00 2001 From: iko Date: Thu, 20 Jun 2019 09:53:20 +0300 Subject: [PATCH] 0030700: Visualization, TKOpenGl - support PBR Metallic-Roughness shading model Metallic-Roughness shading model Graphic3d_TOSM_PBR has been implemented. New materials descriptors Graphic3d_PBRMaterial have been added to Graphic3d_MaterialAspect. PBR shading model requires OpenGL 3.0+ or OpenGL ES 3.0+ hardware. Environment cubemap is expected to be provided for realistic look of metallic materials. occLight_IsHeadlight() now returns bool instead of int. Avoid using lowp for enumerations to workaround occLight_IsHeadlight() ignorance on Adreno 308 caused by some GLSL optimizator bugs. OpenGl_Texture::EstimatedDataSize() - fixed estimation for Cubemap textures. OpenGl_Sampler::applySamplerParams() - fixed uninitialized GL_TEXTURE_WRAP_R in case of GL_TEXTURE_CUBE_MAP target. --- src/Graphic3d/FILES | 2 + src/Graphic3d/Graphic3d_BSDF.cxx | 22 +- src/Graphic3d/Graphic3d_BSDF.hxx | 5 + src/Graphic3d/Graphic3d_CView.hxx | 18 +- src/Graphic3d/Graphic3d_CubeMap.hxx | 19 +- src/Graphic3d/Graphic3d_MaterialAspect.cxx | 14 +- src/Graphic3d/Graphic3d_MaterialAspect.hxx | 9 + src/Graphic3d/Graphic3d_PBRMaterial.cxx | 351 ++ src/Graphic3d/Graphic3d_PBRMaterial.hxx | 198 + src/Graphic3d/Graphic3d_RenderingParams.hxx | 16 + src/Graphic3d/Graphic3d_ShaderProgram.cxx | 3 +- src/Graphic3d/Graphic3d_ShaderProgram.hxx | 8 + src/Graphic3d/Graphic3d_TextureParams.cxx | 2 + src/Graphic3d/Graphic3d_TextureParams.hxx | 17 + src/Graphic3d/Graphic3d_TypeOfLimit.hxx | 1 + .../Graphic3d_TypeOfShadingModel.hxx | 8 +- src/Image/Image_Color.hxx | 25 + src/Image/Image_Format.hxx | 1 + src/Image/Image_PixMap.cxx | 14 + src/Media/Media_Frame.cxx | 1 + src/OpenGl/FILES | 2 + src/OpenGl/OpenGl_Context.cxx | 32 +- src/OpenGl/OpenGl_Context.hxx | 28 +- src/OpenGl/OpenGl_FrameBuffer.cxx | 5 + src/OpenGl/OpenGl_GlFunctions.hxx | 3 + src/OpenGl/OpenGl_GraphicDriver.cxx | 2 + src/OpenGl/OpenGl_LayerList.cxx | 10 +- src/OpenGl/OpenGl_Material.hxx | 57 +- src/OpenGl/OpenGl_PBREnvironment.cxx | 487 +++ src/OpenGl/OpenGl_PBREnvironment.hxx | 206 + src/OpenGl/OpenGl_Sampler.cxx | 10 +- src/OpenGl/OpenGl_ShaderManager.cxx | 422 +- src/OpenGl/OpenGl_ShaderManager.hxx | 69 +- src/OpenGl/OpenGl_ShaderProgram.cxx | 85 +- src/OpenGl/OpenGl_ShaderProgram.hxx | 9 +- src/OpenGl/OpenGl_ShaderStates.hxx | 12 +- src/OpenGl/OpenGl_Texture.cxx | 13 +- src/OpenGl/OpenGl_Texture.hxx | 12 +- src/OpenGl/OpenGl_TextureFormat.cxx | 24 +- src/OpenGl/OpenGl_View.cxx | 54 +- src/OpenGl/OpenGl_View.hxx | 65 +- src/OpenGl/OpenGl_View_Redraw.cxx | 126 +- src/OpenGl/OpenGl_Workspace.cxx | 40 +- src/Shaders/Declarations.glsl | 81 +- src/Shaders/DeclarationsImpl.glsl | 52 +- src/Shaders/FILES | 14 + src/Shaders/PBRCookTorrance.glsl | 20 + src/Shaders/PBRDistribution.glsl | 9 + src/Shaders/PBREnvBaking.fs | 162 + src/Shaders/PBREnvBaking.vs | 35 + src/Shaders/PBRFresnel.glsl | 36 + src/Shaders/PBRGeometry.glsl | 13 + src/Shaders/PBRIllumination.glsl | 28 + src/Shaders/PhongShading.fs | 2 +- src/Shaders/Shaders_DeclarationsImpl_glsl.pxx | 52 +- src/Shaders/Shaders_Declarations_glsl.pxx | 81 +- src/Shaders/Shaders_PBRCookTorrance_glsl.pxx | 23 + src/Shaders/Shaders_PBRDistribution_glsl.pxx | 12 + src/Shaders/Shaders_PBREnvBaking_fs.pxx | 165 + src/Shaders/Shaders_PBREnvBaking_vs.pxx | 38 + src/Shaders/Shaders_PBRFresnel_glsl.pxx | 39 + src/Shaders/Shaders_PBRGeometry_glsl.pxx | 16 + src/Shaders/Shaders_PBRIllumination_glsl.pxx | 31 + src/Textures/FILES | 1 + src/Textures/Textures_EnvLUT.pxx | 3461 +++++++++++++++++ src/V3d/V3d_View.cxx | 28 +- src/V3d/V3d_View.hxx | 17 +- src/ViewerTest/ViewerTest.cxx | 10 +- src/ViewerTest/ViewerTest_OpenGlCommands.cxx | 198 +- src/ViewerTest/ViewerTest_ViewerCommands.cxx | 208 +- src/XCAFDoc/XCAFDoc_VisMaterial.cxx | 36 +- tests/de_mesh/gltf_read/end | 14 + tests/de_mesh/obj_read/end | 14 + tests/v3d/glsl/pbr_spheres | 74 + tests/v3d/materials/pbr1 | 11 + 75 files changed, 7210 insertions(+), 278 deletions(-) create mode 100644 src/Graphic3d/Graphic3d_PBRMaterial.cxx create mode 100644 src/Graphic3d/Graphic3d_PBRMaterial.hxx create mode 100644 src/OpenGl/OpenGl_PBREnvironment.cxx create mode 100644 src/OpenGl/OpenGl_PBREnvironment.hxx create mode 100644 src/Shaders/PBRCookTorrance.glsl create mode 100644 src/Shaders/PBRDistribution.glsl create mode 100644 src/Shaders/PBREnvBaking.fs create mode 100644 src/Shaders/PBREnvBaking.vs create mode 100644 src/Shaders/PBRFresnel.glsl create mode 100644 src/Shaders/PBRGeometry.glsl create mode 100644 src/Shaders/PBRIllumination.glsl create mode 100644 src/Shaders/Shaders_PBRCookTorrance_glsl.pxx create mode 100644 src/Shaders/Shaders_PBRDistribution_glsl.pxx create mode 100644 src/Shaders/Shaders_PBREnvBaking_fs.pxx create mode 100644 src/Shaders/Shaders_PBREnvBaking_vs.pxx create mode 100644 src/Shaders/Shaders_PBRFresnel_glsl.pxx create mode 100644 src/Shaders/Shaders_PBRGeometry_glsl.pxx create mode 100644 src/Shaders/Shaders_PBRIllumination_glsl.pxx create mode 100644 src/Textures/Textures_EnvLUT.pxx create mode 100644 tests/v3d/glsl/pbr_spheres create mode 100644 tests/v3d/materials/pbr1 diff --git a/src/Graphic3d/FILES b/src/Graphic3d/FILES index 4e1e2b8517..7fe5539a1b 100755 --- a/src/Graphic3d/FILES +++ b/src/Graphic3d/FILES @@ -110,6 +110,8 @@ Graphic3d_NameOfTexture2D.hxx Graphic3d_NameOfTextureEnv.hxx Graphic3d_NameOfTexturePlane.hxx Graphic3d_NMapOfTransient.hxx +Graphic3d_PBRMaterial.cxx +Graphic3d_PBRMaterial.hxx Graphic3d_PolygonOffset.cxx Graphic3d_PolygonOffset.hxx Graphic3d_PriorityDefinitionError.hxx diff --git a/src/Graphic3d/Graphic3d_BSDF.cxx b/src/Graphic3d/Graphic3d_BSDF.cxx index 4421e9c2d5..f3e67108dc 100644 --- a/src/Graphic3d/Graphic3d_BSDF.cxx +++ b/src/Graphic3d/Graphic3d_BSDF.cxx @@ -15,6 +15,8 @@ #include +#include + #include // ======================================================================= @@ -63,6 +65,7 @@ Graphic3d_Fresnel Graphic3d_Fresnel::CreateConductor (const Graphic3d_Vec3& theR // purpose : // ======================================================================= Graphic3d_BSDF::Graphic3d_BSDF() +: Ks (Graphic3d_Vec3 (0.f), 1.f) { FresnelCoat = Graphic3d_Fresnel::CreateConstant (0.f); FresnelBase = Graphic3d_Fresnel::CreateConstant (1.f); @@ -189,4 +192,21 @@ Graphic3d_BSDF Graphic3d_BSDF::CreateGlass (const Graphic3d_Vec3& theWeight, theAbsorptionCoeff); return aBSDF; -} \ No newline at end of file +} + +// ======================================================================= +// function : CreateMetallicRoughness +// purpose : +// ======================================================================= +Graphic3d_BSDF Graphic3d_BSDF::CreateMetallicRoughness (const Graphic3d_PBRMaterial& thePbr) +{ + const Graphic3d_Vec3 aDiff = (Graphic3d_Vec3 )thePbr.Color().GetRGB() * thePbr.Alpha(); + const Standard_ShortReal aRougness2 = thePbr.NormalizedRoughness() * thePbr.NormalizedRoughness(); + + Graphic3d_BSDF aBsdf; + aBsdf.FresnelBase = Graphic3d_Fresnel::CreateSchlick (aDiff * thePbr.Metallic()); + aBsdf.Ks.SetValues (Graphic3d_Vec3 (thePbr.Alpha()), aRougness2); + aBsdf.Kt = Graphic3d_Vec3 (1.0f - thePbr.Alpha()); + aBsdf.Kd = aDiff * (1.0f - thePbr.Metallic()); + return aBsdf; +} diff --git a/src/Graphic3d/Graphic3d_BSDF.hxx b/src/Graphic3d/Graphic3d_BSDF.hxx index 7919089dd9..37c1f47d26 100644 --- a/src/Graphic3d/Graphic3d_BSDF.hxx +++ b/src/Graphic3d/Graphic3d_BSDF.hxx @@ -19,6 +19,8 @@ #include #include +class Graphic3d_PBRMaterial; + //! Type of the Fresnel model. enum Graphic3d_FresnelModel { @@ -169,6 +171,9 @@ public: const Standard_ShortReal theAbsorptionCoeff, const Standard_ShortReal theRefractionIndex); + //! Creates BSDF from PBR metallic-roughness material. + static Standard_EXPORT Graphic3d_BSDF CreateMetallicRoughness (const Graphic3d_PBRMaterial& thePbr); + public: //! Creates uninitialized BSDF. diff --git a/src/Graphic3d/Graphic3d_CView.hxx b/src/Graphic3d/Graphic3d_CView.hxx index ac0df39b97..f3a2836997 100644 --- a/src/Graphic3d/Graphic3d_CView.hxx +++ b/src/Graphic3d/Graphic3d_CView.hxx @@ -378,7 +378,23 @@ public: virtual Handle(Graphic3d_CubeMap) BackgroundCubeMap() const = 0; //! Sets environment cubemap as background. - virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) = 0; + //! @param theCubeMap cubemap source to be set as background + //! @param theToUpdatePBREnv defines whether IBL maps will be generated or not (see 'GeneratePBREnvironment') + virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Boolean theToUpdatePBREnv = Standard_True) = 0; + + //! Generates PBR specular probe and irradiance map + //! in order to provide environment indirect illumination in PBR shading model (Image Based Lighting). + //! The source of environment data is background cubemap. + //! If PBR is unavailable it does nothing. + //! If PBR is available but there is no cubemap being set to background it clears all IBL maps (see 'ClearPBREnvironment'). + virtual void GeneratePBREnvironment() = 0; + + //! Fills PBR specular probe and irradiance map with white color. + //! So that environment indirect illumination will be constant + //! and will be fully controlled by ambient light sources. + //! If PBR is unavailable it does nothing. + virtual void ClearPBREnvironment() = 0; //! Returns environment texture set for the view. virtual Handle(Graphic3d_TextureEnv) TextureEnv() const = 0; diff --git a/src/Graphic3d/Graphic3d_CubeMap.hxx b/src/Graphic3d/Graphic3d_CubeMap.hxx index c9e859af61..494ce29b92 100644 --- a/src/Graphic3d/Graphic3d_CubeMap.hxx +++ b/src/Graphic3d/Graphic3d_CubeMap.hxx @@ -26,21 +26,25 @@ class Graphic3d_CubeMap : public Graphic3d_TextureMap public: //! Constructor defining loading cubemap from file. - Graphic3d_CubeMap (const TCollection_AsciiString& theFileName) : + Graphic3d_CubeMap (const TCollection_AsciiString& theFileName, + Standard_Boolean theToGenerateMipmaps = Standard_False) : Graphic3d_TextureMap (theFileName, Graphic3d_TOT_CUBEMAP), myCurrentSide (Graphic3d_CMS_POS_X), myEndIsReached (false), myIsTopDown (true), - myZIsInverted (false) + myZIsInverted (false), + myHasMipmaps (theToGenerateMipmaps) {} //! Constructor defining direct cubemap initialization from PixMap. - Graphic3d_CubeMap (const Handle(Image_PixMap)& thePixmap = Handle(Image_PixMap)()) : + Graphic3d_CubeMap (const Handle(Image_PixMap)& thePixmap = Handle(Image_PixMap)(), + Standard_Boolean theToGenerateMipmaps = Standard_False) : Graphic3d_TextureMap (thePixmap, Graphic3d_TOT_CUBEMAP), myCurrentSide (Graphic3d_CMS_POS_X), myEndIsReached (false), myIsTopDown (true), - myZIsInverted (false) + myZIsInverted (false), + myHasMipmaps (theToGenerateMipmaps) {} //! Returns whether the iterator has reached the end (true if it hasn't). @@ -81,6 +85,12 @@ public: return myZIsInverted; } + //! Returns whether mipmaps of cubemap will be generated or not. + Standard_Boolean HasMipmaps() const { return myHasMipmaps; } + + //! Sets whether to generate mipmaps of cubemap or not. + void SetMipmapsGeneration (Standard_Boolean theToGenerateMipmaps) { myHasMipmaps = theToGenerateMipmaps; } + //! Returns PixMap containing current side of cubemap. //! Returns null handle if current side is invalid. virtual Handle(Image_PixMap) Value() = 0; @@ -102,6 +112,7 @@ protected: Standard_Boolean myEndIsReached; //!< Indicates whether end of iteration has been reached or hasn't Standard_Boolean myIsTopDown; //!< Stores rows's memory layout Standard_Boolean myZIsInverted; //!< Indicates whether Z axis is inverted that allows to synchronize vertical flip of cubemap + Standard_Boolean myHasMipmaps; //!< Indicates whether mipmaps of cubemap will be generated or not }; diff --git a/src/Graphic3d/Graphic3d_MaterialAspect.cxx b/src/Graphic3d/Graphic3d_MaterialAspect.cxx index f90c9e6848..99cbf9b5c8 100644 --- a/src/Graphic3d/Graphic3d_MaterialAspect.cxx +++ b/src/Graphic3d/Graphic3d_MaterialAspect.cxx @@ -25,6 +25,7 @@ namespace { const char* StringName; Graphic3d_BSDF BSDF; + Graphic3d_PBRMaterial PBRMaterial; Quantity_Color Colors[Graphic3d_TypeOfReflection_NB]; Standard_ShortReal TransparencyCoef; Standard_ShortReal RefractionIndex; @@ -99,6 +100,7 @@ RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStrin BSDF.Kd = Graphic3d_Vec3 (0.2f); BSDF.Ks = Graphic3d_Vec4 (0.00784314f, 0.00784314f, 0.00784314f, 0.25f); BSDF.Normalize(); + break; case Graphic3d_NOM_SHINY_PLASTIC: MaterialType = Graphic3d_MATERIAL_ASPECT; @@ -124,6 +126,7 @@ RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStrin BSDF.Kd = Graphic3d_Vec3 (0.2f); BSDF.Ks = Graphic3d_Vec4 (0.6f); + break; case Graphic3d_NOM_NEON_GNC: MaterialType = Graphic3d_MATERIAL_ASPECT; @@ -221,6 +224,7 @@ RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStrin Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); BSDF.Kd = Graphic3d_Vec3 (0.482353f, 0.482353f, 0.482353f); + break; case Graphic3d_NOM_SILVER: MaterialType = Graphic3d_MATERIAL_PHYSIC; @@ -261,6 +265,7 @@ RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStrin BSDF.Kd = Graphic3d_Vec3 (0.243137f, 0.243137f, 0.243137f); BSDF.Ks = Graphic3d_Vec4 (0.00392157f, 0.00392157f, 0.00392157f, 0.5f); + break; case Graphic3d_NOM_CHROME: MaterialType = Graphic3d_MATERIAL_PHYSIC; @@ -418,6 +423,7 @@ RawMaterial::RawMaterial (Graphic3d_NameOfMaterial theName, const char* theStrin Colors[Graphic3d_TOR_EMISSION] = Quantity_Color (Graphic3d_Vec3 (0.0f)); break; } + PBRMaterial.SetBSDF (BSDF); } // ======================================================================= @@ -447,8 +453,9 @@ Graphic3d_MaterialAspect::Graphic3d_MaterialAspect (const Graphic3d_NameOfMateri void Graphic3d_MaterialAspect::init (const Graphic3d_NameOfMaterial theName) { const RawMaterial& aMat = THE_MATERIALS[theName]; - myBSDF = aMat.BSDF; - myStringName = aMat.StringName; + myBSDF = aMat.BSDF; + myPBRMaterial = aMat.PBRMaterial; + myStringName = aMat.StringName; myColors[Graphic3d_TOR_AMBIENT] = aMat.Colors[Graphic3d_TOR_AMBIENT]; myColors[Graphic3d_TOR_DIFFUSE] = aMat.Colors[Graphic3d_TOR_DIFFUSE]; myColors[Graphic3d_TOR_SPECULAR] = aMat.Colors[Graphic3d_TOR_SPECULAR]; @@ -499,6 +506,8 @@ void Graphic3d_MaterialAspect::SetColor (const Quantity_Color& theColor) return; } + myPBRMaterial.SetColor (theColor); + const RawMaterial& aSrcMat = THE_MATERIALS[myRequestedMaterialName]; const Quantity_Color anAmbient((Graphic3d_Vec3 )theColor * aSrcMat.AmbientCoef); const Quantity_Color aDiffuse ((Graphic3d_Vec3 )theColor * aSrcMat.DiffuseCoef); @@ -585,6 +594,7 @@ void Graphic3d_MaterialAspect::SetTransparency (const Standard_ShortReal theValu } myTransparencyCoef = theValue; + myPBRMaterial.SetAlpha (1.0f - theValue); } // ======================================================================= diff --git a/src/Graphic3d/Graphic3d_MaterialAspect.hxx b/src/Graphic3d/Graphic3d_MaterialAspect.hxx index 99d25eac7d..997b36e5f8 100644 --- a/src/Graphic3d/Graphic3d_MaterialAspect.hxx +++ b/src/Graphic3d/Graphic3d_MaterialAspect.hxx @@ -17,6 +17,7 @@ #define _Graphic3d_MaterialAspect_HeaderFile #include +#include #include #include #include @@ -170,6 +171,12 @@ public: //! Modifies the BSDF (bidirectional scattering distribution function). void SetBSDF (const Graphic3d_BSDF& theBSDF) { myBSDF = theBSDF; } + //! Returns physically based representation of material + const Graphic3d_PBRMaterial& PBRMaterial () const { return myPBRMaterial; } + + //! Modifies the physically based representation of material + void SetPBRMaterial (const Graphic3d_PBRMaterial& thePBRMaterial) { myPBRMaterial = thePBRMaterial; } + //! Returns TRUE if the reflection mode is active, FALSE otherwise. Standard_Boolean ReflectionMode (const Graphic3d_TypeOfReflection theType) const { @@ -197,6 +204,7 @@ public: return myTransparencyCoef == theOther.myTransparencyCoef && myRefractionIndex == theOther.myRefractionIndex && myBSDF == theOther.myBSDF + && myPBRMaterial == theOther.myPBRMaterial && myShininess == theOther.myShininess && myColors[Graphic3d_TOR_AMBIENT] == theOther.myColors[Graphic3d_TOR_AMBIENT] && myColors[Graphic3d_TOR_DIFFUSE] == theOther.myColors[Graphic3d_TOR_DIFFUSE] @@ -247,6 +255,7 @@ private: private: Graphic3d_BSDF myBSDF; + Graphic3d_PBRMaterial myPBRMaterial; TCollection_AsciiString myStringName; Quantity_Color myColors[Graphic3d_TypeOfReflection_NB]; Standard_ShortReal myTransparencyCoef; diff --git a/src/Graphic3d/Graphic3d_PBRMaterial.cxx b/src/Graphic3d/Graphic3d_PBRMaterial.cxx new file mode 100644 index 0000000000..b1c20c517f --- /dev/null +++ b/src/Graphic3d/Graphic3d_PBRMaterial.cxx @@ -0,0 +1,351 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include + +#include + +// ======================================================================= +// function : RoughnessFromSpecular +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::RoughnessFromSpecular (const Quantity_Color& theSpecular, + const Standard_Real theShiness) +{ + Standard_Real aRoughnessFactor = 1.0 - theShiness; + //Standard_Real aSpecIntens = theSpecular.Light() * theSpecular; + const Standard_Real aSpecIntens = theSpecular.Red() * 0.2125 + + theSpecular.Green() * 0.7154 + + theSpecular.Blue() * 0.0721; + if (aSpecIntens < 0.1) + { + // low specular intensity should produce a rough material even if shininess is high + aRoughnessFactor *= (1.0 - aSpecIntens); + } + return (Standard_ShortReal )aRoughnessFactor; +} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +Graphic3d_PBRMaterial::Graphic3d_PBRMaterial () +: myColor (0.f, 0.f, 0.f, 1.f), + myMetallic (0.f), + myRoughness (1.f), + myEmission (0.f), + myIOR (1.5f) +{} + +// ======================================================================= +// function : Constructor +// purpose : +// ======================================================================= +Graphic3d_PBRMaterial::Graphic3d_PBRMaterial (const Graphic3d_BSDF& theBSDF) +{ + SetBSDF (theBSDF); +} + +// ======================================================================= +// function : SetMetallic +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetMetallic (Standard_ShortReal theMetallic) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theMetallic < 0.f || theMetallic > 1.f, + "'metallic' parameter of PBR material must be in range [0, 1]") + myMetallic = theMetallic; +} + +// ======================================================================= +// function : Roughness +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::Roughness (Standard_ShortReal theNormalizedRoughness) +{ + return theNormalizedRoughness * (1.f - MinRoughness()) + MinRoughness(); +} + +// ======================================================================= +// function : SetRoughness +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetRoughness (Standard_ShortReal theRoughness) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theRoughness < 0.f || theRoughness > 1.f, + "'roughness' parameter of PBR material must be in range [0, 1]") + myRoughness = theRoughness; +} + +// ======================================================================= +// function : SetIOR +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetIOR (Standard_ShortReal theIOR) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theIOR < 1.f || theIOR > 3.f, + "'IOR' parameter of PBR material must be in range [1, 3]") + myIOR = theIOR; +} + +// ======================================================================= +// function : SetColor +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetColor (const Quantity_ColorRGBA& theColor) +{ + myColor.SetRGB (theColor.GetRGB()); + SetAlpha (theColor.Alpha()); +} + +// ======================================================================= +// function : SetColor +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetColor (const Quantity_Color& theColor) +{ + myColor.SetRGB (theColor); +} + +// ======================================================================= +// function : SetAlpha +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetAlpha (Standard_ShortReal theAlpha) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theAlpha < 0.f || theAlpha > 1.f, + "'alpha' parameter of PBR material must be in range [0, 1]") + myColor.SetAlpha (theAlpha); +} + +// ======================================================================= +// function : SetEmission +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetEmission (const Graphic3d_Vec3& theEmission) +{ + Graphic3d_MaterialDefinitionError_Raise_if (theEmission.r() < 0.f + || theEmission.g() < 0.f + || theEmission.b() < 0.f, + "all components of 'emission' parameter of PBR material must be greater than 0") + myEmission = theEmission; +} + +// ======================================================================= +// function : SetBSDF +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::SetBSDF (const Graphic3d_BSDF& theBSDF) +{ + SetEmission (theBSDF.Le); + + if (theBSDF.Absorption != Graphic3d_Vec4(0.f)) + { + SetMetallic (0.f); + SetColor (Quantity_Color (theBSDF.Absorption.rgb())); + if (theBSDF.FresnelCoat.FresnelType() == Graphic3d_FM_DIELECTRIC) + { + SetIOR (theBSDF.FresnelCoat.Serialize().y()); + SetRoughness (0.f); + SetAlpha (theBSDF.Absorption.a() * 4.f); + } + return; + } + + if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_CONSTANT + && theBSDF.Kt != Graphic3d_Vec3(0.f)) + { + SetIOR (1.f); + SetRoughness (1.f); + SetMetallic (0.f); + SetColor (Quantity_Color (theBSDF.Kt)); + SetAlpha (1.f - (theBSDF.Kt.r() + theBSDF.Kt.g() + theBSDF.Kt.b()) / 3.f); + return; + } + + SetRoughness(sqrtf (theBSDF.Ks.w())); + if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_DIELECTRIC + || theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_CONSTANT) + { + SetIOR (1.5f); + SetColor (Quantity_Color (theBSDF.Kd)); + SetMetallic (0.f); + } + else if (theBSDF.FresnelBase.FresnelType() == Graphic3d_FM_SCHLICK) + { + SetColor (Quantity_Color (theBSDF.FresnelBase.Serialize().rgb())); + SetMetallic (1.f); + } + else + { + SetColor (Quantity_Color (theBSDF.Ks.rgb())); + SetMetallic (1.f); + } +} + +// ======================================================================= +// function : GenerateEnvLUT +// purpose : +// ======================================================================= +void Graphic3d_PBRMaterial::GenerateEnvLUT (const Handle(Image_PixMap)& theLUT, + unsigned int theNbIntegralSamples) +{ + if (theLUT->Format() != Image_Format_RGF) + { + throw Standard_ProgramError("LUT pix map format for PBR LUT generation must be Image_Format_RGF"); + } + + for (unsigned int y = 0; y < theLUT->SizeY(); ++y) + { + Standard_ShortReal aRoughness = Roughness(y / Standard_ShortReal(theLUT->SizeY() - 1)); + + for (unsigned int x = 0; x < theLUT->SizeX(); ++x) + { + Standard_ShortReal aCosV = x / Standard_ShortReal(theLUT->SizeX() - 1); + Graphic3d_Vec3 aView = lutGenView (aCosV); + unsigned int aCount = 0; + Graphic3d_Vec2 aResult = Graphic3d_Vec2 (0.f); + for (unsigned int i = 0; i < theNbIntegralSamples; ++i) + { + Graphic3d_Vec2 aHammersleyPoint = lutGenHammersley (i, theNbIntegralSamples); + Graphic3d_Vec3 aHalf = lutGenImportanceSample (aHammersleyPoint, aRoughness); + Graphic3d_Vec3 aLight = lutGenReflect (aView, aHalf); + if (aLight.z() >= 0.f) + { + ++aCount; + Standard_ShortReal aCosVH = aView.Dot (aHalf); + Standard_ShortReal aGeometryFactor = lutGenGeometryFactor (aLight.z(), + aCosV, + aRoughness); + Standard_ShortReal anIntermediateResult = 1.f - aCosVH; + anIntermediateResult *= anIntermediateResult; + anIntermediateResult *= anIntermediateResult; + anIntermediateResult *= 1.f - aCosVH; + + aResult.x() += aGeometryFactor * (aCosVH / aHalf.z()) * (1.f - anIntermediateResult); + aResult.y() += aGeometryFactor * (aCosVH / aHalf.z()) * anIntermediateResult; + } + } + + aResult = aResult / Standard_ShortReal(theNbIntegralSamples); + theLUT->ChangeValue (theLUT->SizeY() - 1 - y, x) = aResult; + } + } +} + +// ======================================================================= +// function : SpecIBLMapSamplesFactor +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::SpecIBLMapSamplesFactor (Standard_ShortReal theProbability, + Standard_ShortReal theRoughness) +{ + return acosf (lutGenImportanceSampleCosTheta (theProbability, theRoughness)) * 2.f / Standard_ShortReal(M_PI); +} + +// ======================================================================= +// function : lutGenGeometryFactor +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::lutGenGeometryFactor (Standard_ShortReal theCosL, + Standard_ShortReal theCosV, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aK = theRoughness * theRoughness * 0.5f; + + Standard_ShortReal aGeometryFactor = theCosL; + aGeometryFactor /= theCosL * (1.f - aK) + aK; + aGeometryFactor /= theCosV * (1.f - aK) + aK; + + return aGeometryFactor; +} + +// ======================================================================= +// function : lutGenHammersley +// purpose : +// ======================================================================= +Graphic3d_Vec2 Graphic3d_PBRMaterial::lutGenHammersley (unsigned int theNumber, unsigned int theCount) +{ + Standard_ShortReal aPhi2 = 0.f; + for (unsigned int i = 0; i < sizeof(unsigned int) * 8; ++i) + { + if ((theNumber >> i) == 0) + { + break; + } + aPhi2 += ((theNumber >> i) & 1) / Standard_ShortReal(1 << (i + 1)); + } + + return Graphic3d_Vec2(theNumber / Standard_ShortReal(theCount), aPhi2); +} + +// ======================================================================= +// function : lutGenImportanceSampleCosTheta +// purpose : +// ======================================================================= +Standard_ShortReal Graphic3d_PBRMaterial::lutGenImportanceSampleCosTheta (Standard_ShortReal theHammersleyPointComponent, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aQuadRoughness = theRoughness * theRoughness; + aQuadRoughness *= aQuadRoughness; + + Standard_ShortReal aTmp = 1.f + (aQuadRoughness - 1.f) * theHammersleyPointComponent; + + if (aTmp != 0.f) + { + return sqrtf ((1.f - theHammersleyPointComponent) / aTmp); + } + else + { + return 0.f; + } +} + +// ======================================================================= +// function : lutGenImportanceSample +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenImportanceSample (const Graphic3d_Vec2 &theHammerslayPoint, + Standard_ShortReal theRoughness) +{ + Standard_ShortReal aPhi = 2.f * Standard_ShortReal(M_PI) * theHammerslayPoint.y(); + + Standard_ShortReal aCosTheta = lutGenImportanceSampleCosTheta (theHammerslayPoint.x(), theRoughness); + Standard_ShortReal aSinTheta = sqrtf (1.f - aCosTheta * aCosTheta); + + return Graphic3d_Vec3(aSinTheta * cosf (aPhi), + aSinTheta * sinf (aPhi), + aCosTheta); +} + +// ======================================================================= +// function : lutGenView +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenView (Standard_ShortReal theCosV) +{ + return Graphic3d_Vec3(0.f, sqrtf(1.f - theCosV * theCosV), theCosV); +} + +// ======================================================================= +// function : lutGenReflect +// purpose : +// ======================================================================= +Graphic3d_Vec3 Graphic3d_PBRMaterial::lutGenReflect (const Graphic3d_Vec3 &theVector, + const Graphic3d_Vec3 &theAxis) +{ + return theAxis * theAxis.Dot(theVector) * 2.f - theVector; +} diff --git a/src/Graphic3d/Graphic3d_PBRMaterial.hxx b/src/Graphic3d/Graphic3d_PBRMaterial.hxx new file mode 100644 index 0000000000..25eff910cb --- /dev/null +++ b/src/Graphic3d/Graphic3d_PBRMaterial.hxx @@ -0,0 +1,198 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _Graphic3d_PBRMaterial_HeaderFile +#define _Graphic3d_PBRMaterial_HeaderFile + +#include +#include +#include +#include +#include +#include + +//! Class implementing Metallic-Roughness physically based material definition +class Graphic3d_PBRMaterial +{ +public: + + //! Creates new physically based material in Metallic-Roughness system. + //! 'metallic' parameter is 0 by default. + //! 'roughness' parameter is 1 by default. + //! 'color' parameter is (0, 0, 0) by default. + //! 'alpha' parameter is 1 by default. + //! 'IOR' parameter is 1.5 by default. + //! 'emission' parameter is (0, 0, 0) by default. + Standard_EXPORT Graphic3d_PBRMaterial(); + + //! Creates new physically based material in Metallic-Roughness system from Graphic3d_BSDF. + Standard_EXPORT Graphic3d_PBRMaterial (const Graphic3d_BSDF& theBSDF); + + //! Returns material's metallic coefficient in [0, 1] range. + //! 1 for metals and 0 for dielectrics. + //! It is preferable to be exactly 0 or 1. Average values are needed for textures mixing in shader. + Standard_ShortReal Metallic() const { return myMetallic; } + + //! Modifies metallic coefficient of material in [0, 1] range. + Standard_EXPORT void SetMetallic (Standard_ShortReal theMetallic); + + //! Maps roughness from [0, 1] to [MinRoughness, 1] for calculations. + Standard_EXPORT static Standard_ShortReal Roughness(Standard_ShortReal theNormalizedRoughness); + + //! Returns real value of roughness in [MinRoughness, 1] range for calculations. + Standard_ShortReal Roughness() const { return Roughness(myRoughness); } + + //! Returns roughness mapping parameter in [0, 1] range. + //! Roughness is defined in [0, 1] for handful material settings + //! and is mapped to [MinRoughness, 1] for calculations. + Standard_ShortReal NormalizedRoughness() const { return myRoughness; } + + //! Modifies roughness coefficient of material in [0, 1] range. + Standard_EXPORT void SetRoughness (Standard_ShortReal theRoughness); + + //! Returns index of refraction in [1, 3] range. + Standard_ShortReal IOR() const { return myIOR; } + + //! Modifies index of refraction in [1, 3] range. + //! In practice affects only on non-metal materials reflection possibilities. + Standard_EXPORT void SetIOR (Standard_ShortReal theIOR); + + //! Returns albedo color with alpha component of material. + const Quantity_ColorRGBA& Color() const { return myColor; } + + //! Modifies albedo color with alpha component. + Standard_EXPORT void SetColor (const Quantity_ColorRGBA& theColor); + + //! Modifies only albedo color. + Standard_EXPORT void SetColor (const Quantity_Color& theColor); + + //! Returns alpha component in range [0, 1]. + Standard_ShortReal Alpha() const { return myColor.Alpha(); }; + + //! Modifies alpha component. + Standard_EXPORT void SetAlpha (Standard_ShortReal theAlpha); + + //! Returns light intensity emitted by material. + //! Values are greater or equal 0. + Graphic3d_Vec3 Emission() const { return myEmission; } + + //! Modifies light intensity emitted by material. + Standard_EXPORT void SetEmission (const Graphic3d_Vec3& theEmission); + + //! Generates material in Metallic-Roughness system from Graphic3d_BSDF. + Standard_EXPORT void SetBSDF (const Graphic3d_BSDF& theBSDF); + +public: + + //! PBR materials comparison operator. + Standard_Boolean operator== (const Graphic3d_PBRMaterial& theOther) const + { + return (myMetallic == theOther.myMetallic) + && (myRoughness == theOther.myRoughness) + && (myIOR == theOther.myIOR) + && (myColor == theOther.myColor) + && (myEmission == theOther.myEmission); + } + +public: + + //! Generates 2D look up table of scale and bias for fresnell zero coefficient. + //! It is needed for calculation reflectance part of environment lighting. + //! @param [out] theLUT table storage (must be Image_Format_RGF). + //! @param [in] theIntegralSamplesCount number of importance samples in hemisphere integral calculation for every table item. + Standard_EXPORT static void GenerateEnvLUT (const Handle(Image_PixMap)& theLUT, + unsigned int theNbIntegralSamples = 1024); + + //! Compute material roughness from common material (specular color + shininess). + //! @param theSpecular [in] specular color + //! @param theShiness [in] normalized shininess coefficient within [0..1] range + //! @return roughness within [0..1] range + Standard_EXPORT static Standard_ShortReal RoughnessFromSpecular (const Quantity_Color& theSpecular, + const Standard_Real theShiness); + + //! Compute material metallicity from common material (specular color). + //! @param theSpecular [in] specular color + //! @return metallicity within [0..1] range + static Standard_ShortReal MetallicFromSpecular (const Quantity_Color& theSpecular) + { + return ((Graphic3d_Vec3 )theSpecular).maxComp(); + } + +public: + + //! Roughness cannot be 0 in real calculations, so it returns minimal achievable level of roughness in practice + static Standard_ShortReal MinRoughness() { return 0.01f; } + +public: + + //! Shows how much times less samples can be used in certain roughness value specular IBL map generation + //! in compare with samples number for map with roughness of 1. + //! Specular IBL maps with less roughness values have higher resolution but require less samples for the same quality of baking. + //! So that reducing samples number is good strategy to improve performance of baking. + //! The samples number for specular IBL map with roughness of 1 (the maximum possible samples number) is expected to be defined as baking parameter. + //! Samples number for other roughness values can be calculated by multiplication origin samples number by this factor. + //! @param theProbability value from 0 to 1 controlling strength of samples reducing. + //! Bigger values result in slower reduction to provide better quality but worse performance. + //! Value of 1 doesn't affect at all so that 1 will be returned (it can be used to disable reduction strategy). + //! @param theRoughness roughness value of current generated specular IBL map (from 0 to 1). + //! @return factor to calculate number of samples for current specular IBL map baking. + //! Be aware! It has no obligation to return 1 in case of roughness of 1. + //! Be aware! It produces poor quality with small number of origin samples. In that case it is recommended to be disabled. + Standard_EXPORT static Standard_ShortReal SpecIBLMapSamplesFactor (Standard_ShortReal theProbability, + Standard_ShortReal theRoughness); + +private: + + //! Calculates geometry factor of Cook-Torrance BRDF using Smith formula. + static Standard_ShortReal lutGenGeometryFactor (Standard_ShortReal theCosL, + Standard_ShortReal theCosV, + Standard_ShortReal theRoughness); + + //! Generates quasi-random point from Hammersley set. + //! @param theNumber number of point + //! @param theCount size of Hammersley set + static Graphic3d_Vec2 lutGenHammersley (unsigned int theNumber, unsigned int theCount); + + //! Generates only cosine theta of direction in spherical coordinates system + //! according to micro facet distribution function from Cook-Torrance BRDF. + static Standard_ShortReal lutGenImportanceSampleCosTheta (Standard_ShortReal theHammerslayPointComponent, + Standard_ShortReal theRoughness); + + //! Generates direction using point from Hammersley set + //! according to micro facet distribution function from Cook-Torrance BRDF. + static Graphic3d_Vec3 lutGenImportanceSample (const Graphic3d_Vec2 &theHammerslayPoint, + Standard_ShortReal theRoughness); + + //! Generates vector using cosine of angle between up vector (normal in hemisphere) + //! and desired vector. + //! x component for resulting vector will be zero. + static Graphic3d_Vec3 lutGenView (Standard_ShortReal theCosV); + + //! Returns reflected vector according axis. + //! @param theVector vector is needed to be reflected. + //! @param theAxis axis of reflection. + static Graphic3d_Vec3 lutGenReflect (const Graphic3d_Vec3 &theVector, + const Graphic3d_Vec3 &theAxis); + +private: + + Quantity_ColorRGBA myColor; //!< albedo color with alpha component [0, 1] + Standard_ShortReal myMetallic; //!< metallic coefficient of material [0, 1] + Standard_ShortReal myRoughness; //!< roughness coefficient of material [0, 1] + Graphic3d_Vec3 myEmission; //!< light intensity emitted by material [>= 0] + Standard_ShortReal myIOR; //!< index of refraction [1, 3] + +}; + +#endif // _Graphic3d_PBRMaterial_HeaderFile diff --git a/src/Graphic3d/Graphic3d_RenderingParams.hxx b/src/Graphic3d/Graphic3d_RenderingParams.hxx index 17bd2597c7..a437d3a6ef 100644 --- a/src/Graphic3d/Graphic3d_RenderingParams.hxx +++ b/src/Graphic3d/Graphic3d_RenderingParams.hxx @@ -95,6 +95,13 @@ public: : Method (Graphic3d_RM_RASTERIZATION), TransparencyMethod (Graphic3d_RTM_BLEND_UNORDERED), LineFeather (1.0f), + // PBR parameters + PbrEnvPow2Size (9), + PbrEnvSpecMapNbLevels (6), + PbrEnvBakingDiffNbSamples (1024), + PbrEnvBakingSpecNbSamples (256), + PbrEnvBakingProbability (0.99f), + // OitDepthFactor (0.0f), NbMsaaSamples (0), RenderResolutionScale (1.0f), @@ -171,6 +178,15 @@ public: Graphic3d_RenderTransparentMethod TransparencyMethod; //!< specifies rendering method for transparent graphics Standard_ShortReal LineFeather; //!< line feater width in pixels (> 0.0), 1.0 by default; //! high values produce blurred results, small values produce sharp (aliased) edges + + Standard_Integer PbrEnvPow2Size; //!< size of IBL maps side can be calculated as 2^PbrEnvPow2Size (> 0), 9 by default + Standard_Integer PbrEnvSpecMapNbLevels; //!< number of levels used in specular IBL map (> 1), 6 by default + Standard_Integer PbrEnvBakingDiffNbSamples; //!< number of samples used in Monte-Carlo integration during diffuse IBL map's + //! spherical harmonics coefficients generation (> 0), 1024 by default + Standard_Integer PbrEnvBakingSpecNbSamples; //!< number of samples used in Monte-Carlo integration during specular IBL map's generation (> 0), 256 by default + Standard_ShortReal PbrEnvBakingProbability; //!< controls strength of samples reducing strategy during specular IBL map's generation + //! (see 'SpecIBLMapSamplesFactor' function for detail explanation) [0.0, 1.0], 0.99 by default + Standard_ShortReal OitDepthFactor; //!< scalar factor [0-1] controlling influence of depth of a fragment to its final coverage Standard_Integer NbMsaaSamples; //!< number of MSAA samples (should be within 0..GL_MAX_SAMPLES, power-of-two number), 0 by default Standard_ShortReal RenderResolutionScale; //!< rendering resolution scale factor, 1 by default; diff --git a/src/Graphic3d/Graphic3d_ShaderProgram.cxx b/src/Graphic3d/Graphic3d_ShaderProgram.cxx index 5e5d4c7a0a..e08774d954 100755 --- a/src/Graphic3d/Graphic3d_ShaderProgram.cxx +++ b/src/Graphic3d/Graphic3d_ShaderProgram.cxx @@ -82,7 +82,8 @@ Graphic3d_ShaderProgram::Graphic3d_ShaderProgram() myNbFragOutputs (THE_NB_FRAG_OUTPUTS), myHasDefSampler (true), myHasAlphaTest (false), - myHasWeightOitOutput (false) + myHasWeightOitOutput (false), + myIsPBR (false) { myID = TCollection_AsciiString ("Graphic3d_ShaderProgram_") + TCollection_AsciiString (Standard_Atomic_Increment (&THE_PROGRAM_OBJECT_COUNTER)); diff --git a/src/Graphic3d/Graphic3d_ShaderProgram.hxx b/src/Graphic3d/Graphic3d_ShaderProgram.hxx index c44ba1205f..2aa7f19bb7 100755 --- a/src/Graphic3d/Graphic3d_ShaderProgram.hxx +++ b/src/Graphic3d/Graphic3d_ShaderProgram.hxx @@ -151,6 +151,13 @@ public: //! Note that weighted OIT also requires at least 2 Fragment Outputs (color + coverage). void SetWeightOitOutput (Standard_Boolean theOutput) { myHasWeightOitOutput = theOutput; } + //! Return TRUE if standard program header should define functions and variables used in PBR pipeline. + //! FALSE by default + Standard_Boolean IsPBR() const { return myIsPBR; } + + //! Sets whether standard program header should define functions and variables used in PBR pipeline. + void SetPBR (Standard_Boolean theIsPBR) { myIsPBR = theIsPBR; } + //! Pushes custom uniform variable to the program. //! The list of pushed variables is automatically cleared after applying to GLSL program. //! Thus after program recreation even unchanged uniforms should be pushed anew. @@ -204,6 +211,7 @@ private: Standard_Boolean myHasDefSampler; //!< flag indicating that program defines default texture sampler occSampler0 Standard_Boolean myHasAlphaTest; //!< flag indicating that Fragment Shader performs alpha test Standard_Boolean myHasWeightOitOutput; //!< flag indicating that Fragment Shader includes weighted OIT coverage + Standard_Boolean myIsPBR; //!< flag indicating that program defines functions and variables used in PBR pipeline }; diff --git a/src/Graphic3d/Graphic3d_TextureParams.cxx b/src/Graphic3d/Graphic3d_TextureParams.cxx index 1eacf67bdc..3c537cc982 100644 --- a/src/Graphic3d/Graphic3d_TextureParams.cxx +++ b/src/Graphic3d/Graphic3d_TextureParams.cxx @@ -29,6 +29,8 @@ Graphic3d_TextureParams::Graphic3d_TextureParams() myFilter (Graphic3d_TOTF_NEAREST), myAnisoLevel (Graphic3d_LOTA_OFF), myGenMode (Graphic3d_TOTM_MANUAL), + myBaseLevel (0), + myMaxLevel (1000), myRotAngle (0.0f), myToModulate (Standard_False), myToRepeat (Standard_False) diff --git a/src/Graphic3d/Graphic3d_TextureParams.hxx b/src/Graphic3d/Graphic3d_TextureParams.hxx index 06fd0f1d2c..e2c44b27eb 100644 --- a/src/Graphic3d/Graphic3d_TextureParams.hxx +++ b/src/Graphic3d/Graphic3d_TextureParams.hxx @@ -106,6 +106,21 @@ public: //! Setup texture coordinates generation mode. Standard_EXPORT void SetGenMode (const Graphic3d_TypeOfTextureMode theMode, const Graphic3d_Vec4 thePlaneS, const Graphic3d_Vec4 thePlaneT); + //! @return base texture mipmap level; 0 by default. + Standard_Integer BaseLevel() const { return myBaseLevel; } + + //! @return maximum texture mipmap array level; 1000 by default. + Standard_Integer MaxLevel() const { return myMaxLevel; } + + //! Setups texture mipmap array levels range. + //! The lowest value will be the base level. + //! The remaining one will be the maximum level. + void SetLevelsRange (Standard_Integer theFirstLevel, Standard_Integer theSecondLevel = 0) + { + myMaxLevel = theFirstLevel > theSecondLevel ? theFirstLevel : theSecondLevel; + myBaseLevel = theFirstLevel > theSecondLevel ? theSecondLevel : theFirstLevel; + } + //! Return modification counter of parameters related to sampler state. unsigned int SamplerRevision() const { return mySamplerRevision; } @@ -125,6 +140,8 @@ private: Graphic3d_TypeOfTextureFilter myFilter; //!< texture filter, Graphic3d_TOTF_NEAREST by default Graphic3d_LevelOfTextureAnisotropy myAnisoLevel; //!< level of anisotropy filter, Graphic3d_LOTA_OFF by default Graphic3d_TypeOfTextureMode myGenMode; //!< texture coordinates generation mode, Graphic3d_TOTM_MANUAL by default + Standard_Integer myBaseLevel; //!< base texture mipmap level (0 by default) + Standard_Integer myMaxLevel; //!< maximum texture mipmap array level (1000 by default) Standard_ShortReal myRotAngle; //!< texture coordinates rotation angle in degrees, 0 by default Standard_Boolean myToModulate; //!< flag to modulate texture with material color, FALSE by default Standard_Boolean myToRepeat; //!< flag to repeat (true) or wrap (false) texture coordinates out of [0,1] range diff --git a/src/Graphic3d/Graphic3d_TypeOfLimit.hxx b/src/Graphic3d/Graphic3d_TypeOfLimit.hxx index 097c53816a..4cb85fcc0a 100644 --- a/src/Graphic3d/Graphic3d_TypeOfLimit.hxx +++ b/src/Graphic3d/Graphic3d_TypeOfLimit.hxx @@ -25,6 +25,7 @@ enum Graphic3d_TypeOfLimit Graphic3d_TypeOfLimit_MaxViewDumpSizeY, //!< maximum height for image dump Graphic3d_TypeOfLimit_MaxCombinedTextureUnits, //!< maximum number of combined texture units for multitexturing Graphic3d_TypeOfLimit_MaxMsaa, //!< maximum number of MSAA samples + Graphic3d_TypeOfLimit_HasPBR, //!< indicates whether PBR metallic-roughness shading model is supported Graphic3d_TypeOfLimit_HasRayTracing, //!< indicates whether ray tracing is supported Graphic3d_TypeOfLimit_HasRayTracingTextures, //!< indicates whether ray tracing textures are supported Graphic3d_TypeOfLimit_HasRayTracingAdaptiveSampling, //!< indicates whether adaptive screen sampling is supported diff --git a/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx b/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx index 77e322c90e..01b560565e 100644 --- a/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx +++ b/src/Graphic3d/Graphic3d_TypeOfShadingModel.hxx @@ -46,6 +46,12 @@ enum Graphic3d_TypeOfShadingModel //! Shading model requires normals to be defined within vertex attributes. Graphic3d_TOSM_FRAGMENT, + //! Metallic-roughness physically based (PBR) illumination system. + Graphic3d_TOSM_PBR, + + //! Same as Graphic3d_TOSM_PBR but using flat per-triangle normal. + Graphic3d_TOSM_PBR_FACET, + // obsolete aliases Graphic3d_TOSM_NONE = Graphic3d_TOSM_UNLIT, V3d_COLOR = Graphic3d_TOSM_NONE, @@ -57,7 +63,7 @@ enum Graphic3d_TypeOfShadingModel enum { //! Auxiliary value defining the overall number of values in enumeration Graphic3d_TypeOfShadingModel - Graphic3d_TypeOfShadingModel_NB = Graphic3d_TOSM_FRAGMENT + 1 + Graphic3d_TypeOfShadingModel_NB = Graphic3d_TOSM_PBR_FACET + 1 }; #endif // _Graphic3d_TypeOfShadingModel_HeaderFile diff --git a/src/Image/Image_Color.hxx b/src/Image/Image_Color.hxx index acdfced9c7..fa2184fedd 100644 --- a/src/Image/Image_Color.hxx +++ b/src/Image/Image_Color.hxx @@ -266,6 +266,31 @@ public: }; +//! POD structure for packed float RG color value (2 floats) +struct Image_ColorRGF +{ + //! Component type. + typedef Standard_ShortReal ComponentType_t; + + //! Returns the number of components. + static Standard_Integer Length() { return 2; } + + //! Alias to 1st component (red intensity). + Standard_ShortReal r() const { return v[0]; } + + //! Alias to 2nd component (green intensity). + Standard_ShortReal g() const { return v[1]; } + + //! Alias to 1st component (red intensity). + Standard_ShortReal& r() { return v[0]; } + + //! Alias to 2nd component (green intensity). + Standard_ShortReal& g() { return v[1]; } + +public: + Standard_ShortReal v[2]; +}; + //! POD structure for packed float RGB color value (3 floats) struct Image_ColorRGBF { diff --git a/src/Image/Image_Format.hxx b/src/Image/Image_Format.hxx index 6a72b057e0..58426258c6 100644 --- a/src/Image/Image_Format.hxx +++ b/src/Image/Image_Format.hxx @@ -28,6 +28,7 @@ enum Image_Format Image_Format_BGRA, //!< same as RGBA but with different components order Image_Format_GrayF, //!< 1 float (4-bytes) per pixel (1-component plane), intensity of the color Image_Format_AlphaF, //!< 1 float (4-bytes) per pixel (1-component plane), transparency + Image_Format_RGF, //!< 2 floats (8-bytes) RG image plane Image_Format_RGBF, //!< 3 floats (12-bytes) RGB image plane Image_Format_BGRF, //!< same as RGBF but with different components order Image_Format_RGBAF, //!< 4 floats (16-bytes) RGBA image plane diff --git a/src/Image/Image_PixMap.cxx b/src/Image/Image_PixMap.cxx index ffbac02a70..57f76f1e2c 100644 --- a/src/Image/Image_PixMap.cxx +++ b/src/Image/Image_PixMap.cxx @@ -47,6 +47,8 @@ Standard_Size Image_PixMap::SizePixelBytes (const Image_Format thePixelFormat) case Image_Format_GrayF: case Image_Format_AlphaF: return sizeof(float); + case Image_Format_RGF: + return sizeof(float) * 2; case Image_Format_RGBAF: case Image_Format_BGRAF: return sizeof(float) * 4; @@ -214,6 +216,11 @@ Quantity_ColorRGBA Image_PixMap::PixelColor (const Standard_Integer theX, const Standard_ShortReal& aPixel = Value (theY, theX); return Quantity_ColorRGBA (NCollection_Vec4 (1.0f, 1.0f, 1.0f, aPixel)); } + case Image_Format_RGF: + { + const Image_ColorRGF& aPixel = Value (theY, theX); + return Quantity_ColorRGBA (NCollection_Vec4 (aPixel.r(), aPixel.g(), 0.0f, 1.0f)); + } case Image_Format_RGBAF: { const Image_ColorRGBAF& aPixel = Value (theY, theX); @@ -339,6 +346,13 @@ void Image_PixMap::SetPixelColor (const Standard_Integer theX, ChangeValue (theY, theX) = aColor.a(); return; } + case Image_Format_RGF: + { + Image_ColorRGF& aPixel = ChangeValue (theY, theX); + aPixel.r() = aColor.r(); + aPixel.g() = aColor.g(); + return; + } case Image_Format_RGBAF: { Image_ColorRGBAF& aPixel = ChangeValue (theY, theX); diff --git a/src/Media/Media_Frame.cxx b/src/Media/Media_Frame.cxx index 3641fb40af..f0ad43e27c 100644 --- a/src/Media/Media_Frame.cxx +++ b/src/Media/Media_Frame.cxx @@ -92,6 +92,7 @@ int Media_Frame::FormatOcct2FFmpeg (Image_Format theFormat) return AV_PIX_FMT_GRAY8; case Image_Format_GrayF: case Image_Format_AlphaF: + case Image_Format_RGF: case Image_Format_RGBAF: case Image_Format_RGBF: case Image_Format_BGRAF: diff --git a/src/OpenGl/FILES b/src/OpenGl/FILES index 57b56c0a84..bc44d75e51 100755 --- a/src/OpenGl/FILES +++ b/src/OpenGl/FILES @@ -105,6 +105,8 @@ OpenGl_GraphicDriver.hxx OpenGl_IndexBuffer.cxx OpenGl_IndexBuffer.hxx OpenGl_Layer.hxx +OpenGl_PBREnvironment.cxx +OpenGl_PBREnvironment.hxx OpenGl_RenderFilter.hxx OpenGl_Sampler.cxx OpenGl_Sampler.hxx diff --git a/src/OpenGl/OpenGl_Context.cxx b/src/OpenGl/OpenGl_Context.cxx index 40ec4b535a..f71c55e72d 100644 --- a/src/OpenGl/OpenGl_Context.cxx +++ b/src/OpenGl/OpenGl_Context.cxx @@ -144,6 +144,7 @@ OpenGl_Context::OpenGl_Context (const Handle(OpenGl_Caps)& theCaps) hasUintIndex(Standard_True), hasTexRGBA8(Standard_True), #endif + hasTexFloatLinear (Standard_False), hasTexSRGB (Standard_False), hasFboSRGB (Standard_False), hasSRGBControl (Standard_False), @@ -208,6 +209,10 @@ OpenGl_Context::OpenGl_Context (const Handle(OpenGl_Caps)& theCaps) myHasRayTracingTextures (Standard_False), myHasRayTracingAdaptiveSampling (Standard_False), myHasRayTracingAdaptiveSamplingAtomic (Standard_False), + myHasPBR (Standard_False), + myPBREnvLUTTexUnit (Graphic3d_TextureUnit_0), + myPBRDiffIBLMapSHTexUnit (Graphic3d_TextureUnit_0), + myPBRSpecIBLMapTexUnit (Graphic3d_TextureUnit_0), myFrameStats (new OpenGl_FrameStats()), #if !defined(GL_ES_VERSION_2_0) myPointSpriteOrig (GL_UPPER_LEFT), @@ -1485,6 +1490,8 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile) arbTexFloat = IsGlGreaterEqual (3, 0) && FindProcShort (glTexImage3D); + hasTexFloatLinear = arbTexFloat + && CheckExtension ("GL_OES_texture_float_linear"); const Standard_Boolean hasTexBuffer32 = IsGlGreaterEqual (3, 2) && FindProcShort (glTexBuffer); const Standard_Boolean hasExtTexBuffer = CheckExtension ("GL_EXT_texture_buffer") && FindProc ("glTexBufferEXT", myFuncs->glTexBuffer); @@ -1581,6 +1588,7 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile) arbNPTW = CheckExtension ("GL_ARB_texture_non_power_of_two"); arbTexFloat = IsGlGreaterEqual (3, 0) || CheckExtension ("GL_ARB_texture_float"); + hasTexFloatLinear = arbTexFloat; arbSampleShading = CheckExtension ("GL_ARB_sample_shading"); extBgra = CheckExtension ("GL_EXT_bgra"); extAnis = CheckExtension ("GL_EXT_texture_filter_anisotropic"); @@ -2933,6 +2941,23 @@ void OpenGl_Context::init (const Standard_Boolean theIsCoreProfile) "Check OpenGL window creation parameters for optimal performance.", Message_Trace); } } + + // check whether PBR shading model is supported + myHasPBR = arbFBO != NULL + && myMaxTexCombined >= 4 + && arbTexRG + && arbTexFloat + && (IsGlGreaterEqual (3, 0) + #if !defined(GL_ES_VERSION_2_0) + || (IsGlGreaterEqual (2, 1) && CheckExtension ("GL_EXT_gpu_shader4")) + #endif + ); + if (myHasPBR) + { + myPBREnvLUTTexUnit = static_cast(myMaxTexCombined - 3); + myPBRDiffIBLMapSHTexUnit = static_cast(myMaxTexCombined - 2); + myPBRSpecIBLMapTexUnit = static_cast(myMaxTexCombined - 1); + } } // ======================================================================= @@ -3547,8 +3572,11 @@ void OpenGl_Context::SetShadingMaterial (const OpenGl_Aspects* theAspect, Standard_ShortReal anAlphaBack = 1.0f; if (CheckIsTransparent (theAspect, theHighlight, anAlphaFront, anAlphaBack)) { - myMatFront.Diffuse.a() = anAlphaFront; - myMatBack .Diffuse.a() = anAlphaBack; + myMatFront.Common.Diffuse.a() = anAlphaFront; + myMatBack .Common.Diffuse.a() = anAlphaBack; + + myMatFront.Pbr.BaseColor.a() = anAlphaFront; + myMatBack .Pbr.BaseColor.a() = anAlphaBack; } // do not update material properties in case of zero reflection mode, diff --git a/src/OpenGl/OpenGl_Context.hxx b/src/OpenGl/OpenGl_Context.hxx index 747c8721a8..127ecfe1c9 100644 --- a/src/OpenGl/OpenGl_Context.hxx +++ b/src/OpenGl/OpenGl_Context.hxx @@ -587,6 +587,25 @@ public: return Quantity_ColorRGBA::Convert_LinearRGB_To_sRGB (theColor); } + //! Returns TRUE if PBR shading model is supported. + //! Basically, feature requires OpenGL 3.0+ / OpenGL ES 3.0+ hardware; more precisely: + //! - Graphics hardware with moderate capabilities for compiling long enough GLSL program. + //! - FBO (e.g. for baking environment). + //! - Multi-texturing with >= 4 units (LUT and IBL textures). + //! - GL_RG32F texture format (arbTexRG + arbTexFloat) + //! - Cubemap texture lookup textureCubeLod()/textureLod() with LOD index within Fragment Shader, + //! which requires GLSL OpenGL 3.0+ / OpenGL ES 3.0+ or OpenGL 2.1 + GL_EXT_gpu_shader4 extension. + Standard_Boolean HasPBR() const { return myHasPBR; } + + //! Returns texture unit where Environment Lookup Table is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBREnvLUTTexUnit() const { return myPBREnvLUTTexUnit; } + + //! Returns texture unit where Diffuse (irradiance) IBL map's spherical harmonics coefficients is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBRDiffIBLMapSHTexUnit() const { return myPBRDiffIBLMapSHTexUnit; } + + //! Returns texture unit where Specular IBL map is expected to be bound, or 0 if PBR is unavailable. + Graphic3d_TextureUnit PBRSpecIBLMapTexUnit() const { return myPBRSpecIBLMapTexUnit; } + //! Returns true if VBO is supported and permitted. inline bool ToUseVbo() const { @@ -956,6 +975,7 @@ public: //! @name extensions Standard_Boolean hasHighp; //!< highp in GLSL ES fragment shader is supported Standard_Boolean hasUintIndex; //!< GLuint for index buffer is supported (always available on desktop; on OpenGL ES - since 3.0 or as extension GL_OES_element_index_uint) Standard_Boolean hasTexRGBA8; //!< always available on desktop; on OpenGL ES - since 3.0 or as extension GL_OES_rgb8_rgba8 + Standard_Boolean hasTexFloatLinear; //!< texture-filterable state for 32-bit floating texture formats (always on desktop, GL_OES_texture_float_linear within OpenGL ES) Standard_Boolean hasTexSRGB; //!< sRGB texture formats (desktop OpenGL 2.0, OpenGL ES 3.0 or GL_EXT_texture_sRGB) Standard_Boolean hasFboSRGB; //!< sRGB FBO render targets (desktop OpenGL 2.1, OpenGL ES 3.0) Standard_Boolean hasSRGBControl; //!< sRGB write control (any desktop OpenGL, OpenGL ES + GL_EXT_sRGB_write_control extension) @@ -969,7 +989,7 @@ public: //! @name extensions Standard_Boolean arbDrawBuffers; //!< GL_ARB_draw_buffers Standard_Boolean arbNPTW; //!< GL_ARB_texture_non_power_of_two Standard_Boolean arbTexRG; //!< GL_ARB_texture_rg - Standard_Boolean arbTexFloat; //!< GL_ARB_texture_float (on desktop OpenGL - since 3.0 or as extension GL_ARB_texture_float; on OpenGL ES - since 3.0) + Standard_Boolean arbTexFloat; //!< GL_ARB_texture_float (on desktop OpenGL - since 3.0 or as extension GL_ARB_texture_float; on OpenGL ES - since 3.0); @sa hasTexFloatLinear for linear filtering support OpenGl_ArbSamplerObject* arbSamplerObject; //!< GL_ARB_sampler_objects (on desktop OpenGL - since 3.3 or as extension GL_ARB_sampler_objects; on OpenGL ES - since 3.0) OpenGl_ArbTexBindless* arbTexBindless; //!< GL_ARB_bindless_texture OpenGl_ArbTBO* arbTBO; //!< GL_ARB_texture_buffer_object @@ -1056,6 +1076,12 @@ private: // context info Standard_Boolean myHasRayTracingAdaptiveSampling; //! indicates whether adaptive screen sampling in ray tracing mode is supported Standard_Boolean myHasRayTracingAdaptiveSamplingAtomic; //! indicates whether atomic adaptive screen sampling in ray tracing mode is supported + Standard_Boolean myHasPBR; //!< indicates whether PBR shading model is supported + Graphic3d_TextureUnit myPBREnvLUTTexUnit; //!< texture unit where environment lookup table is expected to be binded (0 if PBR is not supported) + Graphic3d_TextureUnit myPBRDiffIBLMapSHTexUnit; //!< texture unit where diffuse (irradiance) IBL map's spherical harmonics coefficients is expected to be binded + //! (0 if PBR is not supported) + Graphic3d_TextureUnit myPBRSpecIBLMapTexUnit; //!< texture unit where specular IBL map is expected to be binded (0 if PBR is not supported) + Handle(OpenGl_ShaderManager) myShaderManager; //! support object for managing shader programs private: //! @name fields tracking current state diff --git a/src/OpenGl/OpenGl_FrameBuffer.cxx b/src/OpenGl/OpenGl_FrameBuffer.cxx index e9344f9f0d..3380c17e1f 100644 --- a/src/OpenGl/OpenGl_FrameBuffer.cxx +++ b/src/OpenGl/OpenGl_FrameBuffer.cxx @@ -786,6 +786,10 @@ Standard_Boolean OpenGl_FrameBuffer::BufferDump (const Handle(OpenGl_Context)& t aFormat = GL_DEPTH_COMPONENT; aType = GL_FLOAT; break; + case Image_Format_RGF: + aFormat = GL_RG; + aType = GL_FLOAT; + break; case Image_Format_RGB: aFormat = GL_RGB; aType = GL_UNSIGNED_BYTE; @@ -812,6 +816,7 @@ Standard_Boolean OpenGl_FrameBuffer::BufferDump (const Handle(OpenGl_Context)& t case Image_Format_GrayF: case Image_Format_BGRF: case Image_Format_BGRAF: + case Image_Format_RGF: return Standard_False; case Image_Format_BGRA: case Image_Format_BGR32: diff --git a/src/OpenGl/OpenGl_GlFunctions.hxx b/src/OpenGl/OpenGl_GlFunctions.hxx index ec2f93d096..dee15c7133 100644 --- a/src/OpenGl/OpenGl_GlFunctions.hxx +++ b/src/OpenGl/OpenGl_GlFunctions.hxx @@ -80,6 +80,9 @@ // adds GL_FRAMEBUFFER_SRGB_EXT flag as on desktop OpenGL #define GL_FRAMEBUFFER_SRGB 0x8DB9 + #define GL_TEXTURE_BASE_LEVEL 0x813C + #define GL_TEXTURE_MAX_LEVEL 0x813D + // OpenGL ES 3.1+ #define GL_TEXTURE_2D_MULTISAMPLE 0x9100 #define GL_MAX_SAMPLES 0x8D57 diff --git a/src/OpenGl/OpenGl_GraphicDriver.cxx b/src/OpenGl/OpenGl_GraphicDriver.cxx index 1694e17664..15218a6940 100644 --- a/src/OpenGl/OpenGl_GraphicDriver.cxx +++ b/src/OpenGl/OpenGl_GraphicDriver.cxx @@ -400,6 +400,8 @@ Standard_Integer OpenGl_GraphicDriver::InquireLimit (const Graphic3d_TypeOfLimit return !aCtx.IsNull() ? aCtx->MaxDumpSizeX() : 1024; case Graphic3d_TypeOfLimit_MaxViewDumpSizeY: return !aCtx.IsNull() ? aCtx->MaxDumpSizeY() : 1024; + case Graphic3d_TypeOfLimit_HasPBR: + return (!aCtx.IsNull() && aCtx->HasPBR()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasRayTracing: return (!aCtx.IsNull() && aCtx->HasRayTracing()) ? 1 : 0; case Graphic3d_TypeOfLimit_HasRayTracingTextures: diff --git a/src/OpenGl/OpenGl_LayerList.cxx b/src/OpenGl/OpenGl_LayerList.cxx index 0e46b233e1..b3126445df 100644 --- a/src/OpenGl/OpenGl_LayerList.cxx +++ b/src/OpenGl/OpenGl_LayerList.cxx @@ -594,7 +594,7 @@ void OpenGl_LayerList::renderLayer (const Handle(OpenGl_Workspace)& theWorkspace if (hasOwnLights) { aLayerSettings.Lights()->UpdateRevision(); - aManager->UpdateLightSourceStateTo (aLayerSettings.Lights()); + aManager->UpdateLightSourceStateTo (aLayerSettings.Lights(), theWorkspace->View()->SpecIBLMapLevels()); } const Handle(Graphic3d_Camera)& aWorldCamera = theWorkspace->View()->Camera(); @@ -665,7 +665,7 @@ void OpenGl_LayerList::renderLayer (const Handle(OpenGl_Workspace)& theWorkspace if (hasOwnLights) { - aManager->UpdateLightSourceStateTo (aLightsBack); + aManager->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); } if (hasLocalCS) { @@ -732,7 +732,7 @@ void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace)& theWorkspace, if (aPassIter == 0) { aCtx->SetColorMask (false); - aCtx->ShaderManager()->UpdateLightSourceStateTo (Handle(Graphic3d_LightSet)()); + aCtx->ShaderManager()->UpdateLightSourceStateTo (Handle(Graphic3d_LightSet)(), theWorkspace->View()->SpecIBLMapLevels()); aDefaultSettings.DepthFunc = aPrevSettings.DepthFunc; aDefaultSettings.DepthMask = GL_TRUE; } @@ -743,13 +743,13 @@ void OpenGl_LayerList::Render (const Handle(OpenGl_Workspace)& theWorkspace, continue; } aCtx->SetColorMask (true); - aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack); + aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); aDefaultSettings = aPrevSettings; } else if (aPassIter == 2) { aCtx->SetColorMask (true); - aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack); + aCtx->ShaderManager()->UpdateLightSourceStateTo (aLightsBack, theWorkspace->View()->SpecIBLMapLevels()); if (toPerformDepthPrepass) { aDefaultSettings.DepthFunc = GL_EQUAL; diff --git a/src/OpenGl/OpenGl_Material.hxx b/src/OpenGl/OpenGl_Material.hxx index 79ef0668d2..f2bbec4c4a 100644 --- a/src/OpenGl/OpenGl_Material.hxx +++ b/src/OpenGl/OpenGl_Material.hxx @@ -22,7 +22,7 @@ class OpenGl_Context; //! OpenGL material definition -struct OpenGl_Material +struct OpenGl_MaterialCommon { OpenGl_Vec4 Ambient; //!< ambient reflection coefficient @@ -37,31 +37,58 @@ struct OpenGl_Material float Transparency() const { return Params.y(); } float& ChangeTransparency() { return Params.y(); } + //! Empty constructor. + OpenGl_MaterialCommon() : Ambient (1.0f), Diffuse (1.0f), Specular (1.0f), Emission (1.0f), Params (1.0f, 0.0f, 0.0f, 0.0f) {} + + //! Returns packed (serialized) representation of material properties + const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } + static Standard_Integer NbOfVec4() { return 5; } + +}; + +//! OpenGL material definition +struct OpenGl_MaterialPBR +{ + + OpenGl_Vec4 BaseColor; //!< base color of PBR material with alpha component + OpenGl_Vec4 EmissionIOR; //!< light intensity which is emitted by PBR material and index of refraction + OpenGl_Vec4 Params; //!< extra packed parameters + + float Metallic() const { return Params.b(); } + float& ChangeMetallic() { return Params.b(); } + + float Roughness() const { return Params.g(); } + float& ChangeRoughness() { return Params.g(); } + + //! Empty constructor. + OpenGl_MaterialPBR() : BaseColor (1.0f), EmissionIOR (1.0f), Params (1.0f, 1.0f, 1.0f, 1.0f) {} + + //! Returns packed (serialized) representation of material properties + const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } + static Standard_Integer NbOfVec4() { return 3; } + +}; + +//! OpenGL material definition +struct OpenGl_Material +{ + OpenGl_MaterialCommon Common; + OpenGl_MaterialPBR Pbr; + //! Set material color. void SetColor (const OpenGl_Vec4& theColor) { // apply the same formula as in Graphic3d_MaterialAspect::SetColor() - Ambient.SetValues (theColor.rgb() * 0.25f, Ambient.a()); - Diffuse.SetValues (theColor.rgb(), Diffuse.a()); + Common.Ambient.SetValues (theColor.rgb() * 0.25f, Common.Ambient.a()); + Common.Diffuse.SetValues (theColor.rgb(), Common.Diffuse.a()); + Pbr .BaseColor.SetValues (theColor.rgb(), Pbr.BaseColor.a()); } - //! Empty constructor. - OpenGl_Material() - : Ambient (1.0f), - Diffuse (1.0f), - Specular(1.0f), - Emission(1.0f), - Params (1.0f, 0.0f, 0.0f, 0.0f) {} - //! Initialize material void Init (const OpenGl_Context& theCtx, const Graphic3d_MaterialAspect& theProp, const Quantity_Color& theInteriorColor); - //! Returns packed (serialized) representation of material properties - const OpenGl_Vec4* Packed() const { return reinterpret_cast (this); } - static Standard_Integer NbOfVec4() { return 5; } - //! Check this material for equality with another material (without tolerance!). bool IsEqual (const OpenGl_Material& theOther) const { diff --git a/src/OpenGl/OpenGl_PBREnvironment.cxx b/src/OpenGl/OpenGl_PBREnvironment.cxx new file mode 100644 index 0000000000..ca6e1d3943 --- /dev/null +++ b/src/OpenGl/OpenGl_PBREnvironment.cxx @@ -0,0 +1,487 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +IMPLEMENT_STANDARD_RTTIEXT(OpenGl_PBREnvironment, OpenGl_NamedResource) + +//! Constructor of this class saves necessary OpenGL states components which can be changed by OpenGl_PBREnvironment. +//! Destructor restores state back. +class OpenGl_PBREnvironmentSentry +{ +public: + + OpenGl_PBREnvironmentSentry (const Handle(OpenGl_Context)& theCtx) + : myContext (theCtx) + { + backup(); + prepare(); + } + + ~OpenGl_PBREnvironmentSentry() + { + restore(); + } + +private: + + void backup() + { + myContext->core11fwd->glGetIntegerv (GL_FRAMEBUFFER_BINDING, &myFBO); + myShaderProgram = myContext->ActiveProgram(); + for (unsigned int i = 0; i < 4; ++i) + { + myViewport[i] = myContext->Viewport()[i]; + } + myContext->core11fwd->glGetFloatv (GL_COLOR_CLEAR_VALUE, myClearColor); + + GLboolean aStatus = GL_TRUE; + myContext->core11fwd->glGetBooleanv (GL_DEPTH_TEST, &aStatus); + myDepthTestWasEnabled = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetBooleanv (GL_DEPTH_WRITEMASK, &aStatus); + myDepthWrirtingWasEnablig = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetBooleanv (GL_SCISSOR_TEST, &aStatus); + myScissorTestWasEnabled = aStatus ? Standard_True : Standard_False; + myContext->core11fwd->glGetIntegerv (GL_SCISSOR_BOX, myScissorBox); + } + + void prepare() + { + myContext->BindDefaultVao(); + myContext->core11fwd->glDisable (GL_DEPTH_TEST); + myContext->core11fwd->glDepthMask (GL_FALSE); + myContext->core11fwd->glDisable (GL_BLEND); + myContext->core11fwd->glDisable (GL_SCISSOR_TEST); + } + + void restore() + { + myContext->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + myContext->BindProgram (myShaderProgram); + myContext->ResizeViewport (myViewport); + myContext->core11fwd->glClearColor (myClearColor.r(), myClearColor.g(), myClearColor.b(), myClearColor.a()); + if (myDepthTestWasEnabled) + { + myContext->core11fwd->glEnable (GL_DEPTH_TEST); + } + else + { + myContext->core11fwd->glDisable (GL_DEPTH_TEST); + } + myContext->core11fwd->glDepthMask (myDepthWrirtingWasEnablig ? GL_TRUE : GL_FALSE); + if (myScissorTestWasEnabled) + { + myContext->core11fwd->glEnable (GL_SCISSOR_TEST); + } + else + { + myContext->core11fwd->glDisable (GL_SCISSOR_TEST); + } + myContext->core11fwd->glScissor (myScissorBox[0], myScissorBox[1], myScissorBox[2], myScissorBox[3]); + } + +private: + + OpenGl_PBREnvironmentSentry (const OpenGl_PBREnvironmentSentry& ); + OpenGl_PBREnvironmentSentry& operator= (const OpenGl_PBREnvironmentSentry& ); + +private: + + const Handle(OpenGl_Context) myContext; + GLint myFBO; + Handle(OpenGl_ShaderProgram) myShaderProgram; + Standard_Boolean myDepthTestWasEnabled; + Standard_Boolean myDepthWrirtingWasEnablig; + Standard_Boolean myScissorTestWasEnabled; + Standard_Integer myScissorBox[4]; + Standard_Integer myViewport[4]; + Graphic3d_Vec4 myClearColor; + +}; + +// ======================================================================= +// function : Create +// purpose : +// ======================================================================= +Handle(OpenGl_PBREnvironment) OpenGl_PBREnvironment::Create (const Handle(OpenGl_Context)& theCtx, + unsigned int thePow2Size, + unsigned int theLevelsNumber, + const TCollection_AsciiString& theId) +{ + if (theCtx->arbFBO == NULL) + { + return Handle(OpenGl_PBREnvironment)(); + } + + Handle(OpenGl_PBREnvironment) anEnvironment = new OpenGl_PBREnvironment (theCtx, thePow2Size, theLevelsNumber, theId); + if (!anEnvironment->IsComplete()) + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PORTABILITY, 0, GL_DEBUG_SEVERITY_MEDIUM, + "Warning: PBR environment is not created. PBR material system will be ignored."); + anEnvironment->Release (theCtx.get()); + anEnvironment.Nullify(); + } + + return anEnvironment; +} + +// ======================================================================= +// function : OpenGl_PBREnvironment +// purpose : +// ======================================================================= +OpenGl_PBREnvironment::OpenGl_PBREnvironment (const Handle(OpenGl_Context)& theCtx, + unsigned int thePowOf2Size, + unsigned int theSpecMapLevelsNumber, + const TCollection_AsciiString& theId) +: OpenGl_NamedResource (theId), + myPow2Size (std::max (1u, thePowOf2Size)), + mySpecMapLevelsNumber (std::max (2u, std::min (theSpecMapLevelsNumber, std::max (1u, thePowOf2Size) + 1))), + myFBO (OpenGl_FrameBuffer::NO_FRAMEBUFFER), + myIsComplete (Standard_False), + myIsNeededToBeBound (Standard_True) +{ + OpenGl_PBREnvironmentSentry aSentry (theCtx); + + myIsComplete = initVAO (theCtx) + && initTextures (theCtx) + && initFBO (theCtx); + + if (myIsComplete) + { + clear (theCtx); + } +} + +// ======================================================================= +// function : Bind +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Bind (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Bind (theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Bind (theCtx); + myIsNeededToBeBound = Standard_False; +} + +// ======================================================================= +// function : Unbind +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Unbind (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Unbind (theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Unbind (theCtx); + myIsNeededToBeBound = Standard_True; +} + +// ======================================================================= +// function : Clear +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor) +{ + OpenGl_PBREnvironmentSentry aSentry (theCtx); + clear (theCtx, theColor); +} + +// ======================================================================= +// function : Bake +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted, + Standard_Boolean theIsTopDown, + Standard_Size theDiffMapNbSamples, + Standard_Size theSpecMapNbSamples, + Standard_ShortReal theProbability) +{ + Standard_ProgramError_Raise_if (theEnvMap.IsNull(), "'Bake' function of 'OpenGl_PBREnvironment' can't work without source environment map") + Standard_RangeError_Raise_if (theProbability > 1.f || theProbability < 0.f, "'probability' parameter in 'Bake' function of 'OpenGl_PBREnvironment' must be in range [0, 1]") + Unbind (theCtx); + OpenGl_PBREnvironmentSentry aSentry (theCtx); + bake (theCtx, theEnvMap, theZIsInverted, theIsTopDown, theDiffMapNbSamples, theSpecMapNbSamples, theProbability); +} + +// ======================================================================= +// function : SizesAreDifferent +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::SizesAreDifferent (unsigned int thePow2Size, + unsigned int theSpecMapLevelsNumber) const +{ + thePow2Size = std::max (1u, thePow2Size); + theSpecMapLevelsNumber = std::max (2u, std::min (theSpecMapLevelsNumber, std::max (1u, thePow2Size) + 1)); + return myPow2Size != thePow2Size + || mySpecMapLevelsNumber != theSpecMapLevelsNumber; +} + +// ======================================================================= +// function : Release +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::Release (OpenGl_Context* theCtx) +{ + if (myFBO != OpenGl_FrameBuffer::NO_FRAMEBUFFER) + { + if (theCtx != NULL + && theCtx->IsValid()) + { + theCtx->arbFBO->glDeleteFramebuffers (1, &myFBO); + } + myFBO = OpenGl_FrameBuffer::NO_FRAMEBUFFER; + } + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Release(theCtx); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Release (theCtx); + myVBO.Release (theCtx); +} + +// ======================================================================= +// function : ~OpenGl_PBREnvironment +// purpose : +// ======================================================================= +OpenGl_PBREnvironment::~OpenGl_PBREnvironment() +{ + Release (NULL); +} + +// ======================================================================= +// function : initTextures +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initTextures (const Handle(OpenGl_Context)& theCtx) +{ + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetTextureUnit (theCtx->PBRSpecIBLMapTexUnit()); + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Sampler()->Parameters()->SetTextureUnit (theCtx->PBRDiffIBLMapSHTexUnit()); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_TRILINEAR); + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Sampler()->Parameters()->SetFilter(Graphic3d_TOTF_NEAREST); + myIBLMaps[OpenGl_TypeOfIBLMap_Specular] .Sampler()->Parameters()->SetLevelsRange (mySpecMapLevelsNumber - 1); + + // NVIDIA's driver didn't work properly with 3 channel texture for diffuse SH coefficients so that alpha channel has been added + return myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].Init (theCtx, + OpenGl_TextureFormat::FindFormat (theCtx, Image_Format_RGBAF, false), + Graphic3d_Vec2i (9, 1), + Graphic3d_TOT_2D) + && myIBLMaps[OpenGl_TypeOfIBLMap_Specular].InitCubeMap (theCtx, Handle(Graphic3d_CubeMap)(), + Standard_Size(1) << myPow2Size, Image_Format_RGB, true, false); +} + +// ======================================================================= +// function : initVAO +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initVAO (const Handle(OpenGl_Context)& theCtx) +{ + const float aVertexPos[] = + { + -1.f, -1.f, 0.f, 0.f, + 1.f, -1.f, 0.f, 0.f, + -1.f, 1.f, 0.f, 0.f, + 1.f, 1.f, 0.f, 0.f + }; + return myVBO.Init (theCtx, 4, 4, aVertexPos); +} + +// ======================================================================= +// function : initFBO +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::initFBO (const Handle(OpenGl_Context)& theCtx) +{ + theCtx->arbFBO->glGenFramebuffers (1, &myFBO); + return checkFBOComplentess (theCtx); +} + +// ======================================================================= +// function : processDiffIBLMap +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::processDiffIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Size theNbSamples) +{ + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].TextureId(), 0); + const Standard_Integer aViewport[4] = { 0, 0, 9, 1 }; + theCtx->ResizeViewport(aViewport); + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform(theCtx, "occNbSpecIBLLevels", 0); + theCtx->ActiveProgram()->SetUniform(theCtx, "uSamplesNum", static_cast(theNbSamples)); + + theCtx->core11fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4); + } + else + { + theCtx->core11fwd->glClear (GL_COLOR_BUFFER_BIT); + + theCtx->core11fwd->glEnable (GL_SCISSOR_TEST); + theCtx->core11fwd->glClearColor (0.f, 0.f, 0.f, 1.f); + theCtx->core11fwd->glScissor (1, 0, 8, 1); + theCtx->core11fwd->glClear (GL_COLOR_BUFFER_BIT); + } + + return true; +} + +// ======================================================================= +// function : processSpecIBLMap +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::processSpecIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Integer theEnvMapSize, + Standard_Size theNbSamples, + Standard_ShortReal theProbability) +{ + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform (theCtx, "occNbSpecIBLLevels", Standard_Integer(mySpecMapLevelsNumber)); + theCtx->ActiveProgram()->SetUniform (theCtx, "uEnvMapSize", theEnvMapSize); + } + + for (int aLevelIter = mySpecMapLevelsNumber - 1;; --aLevelIter) + { + const Standard_Integer aSize = 1 << (myPow2Size - aLevelIter); + const Standard_Integer aViewport[4] = { 0, 0, aSize, aSize }; + theCtx->ResizeViewport (aViewport); + if (theIsDrawAction) + { + Standard_Integer aNbSamples = static_cast(Graphic3d_PBRMaterial::SpecIBLMapSamplesFactor (theProbability, aLevelIter / float (mySpecMapLevelsNumber - 1)) * theNbSamples); + theCtx->ActiveProgram()->SetUniform (theCtx, "uSamplesNum", static_cast(aNbSamples)); + theCtx->ActiveProgram()->SetUniform (theCtx, "uCurrentLevel", aLevelIter); + } + + for (Standard_Integer aSideIter = 0; aSideIter < 6; ++aSideIter) + { + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + aSideIter, + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].TextureId(), aLevelIter); + if (theIsDrawAction) + { + theCtx->ActiveProgram()->SetUniform(theCtx, "uCurrentSide", aSideIter); + theCtx->core11fwd->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + else + { + theCtx->core11fwd->glClear(GL_COLOR_BUFFER_BIT); + } + } + + if (aLevelIter == 0) + { + break; + } + } + + return true; +} + +// ======================================================================= +// function : checkFBOCompletness +// purpose : +// ======================================================================= +bool OpenGl_PBREnvironment::checkFBOComplentess (const Handle(OpenGl_Context)& theCtx) const +{ + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, + myIBLMaps[OpenGl_TypeOfIBLMap_DiffuseSH].TextureId(), 0); + if (theCtx->arbFBO->glCheckFramebufferStatus (GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + return false; + } + for (Standard_Integer aSideIter = 0; aSideIter < 6; ++aSideIter) + { + for (unsigned int aLevel = 0; aLevel < mySpecMapLevelsNumber; ++aLevel) + { + theCtx->arbFBO->glFramebufferTexture2D (GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + aSideIter, + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].TextureId(), aLevel); + if (theCtx->arbFBO->glCheckFramebufferStatus (GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + { + return false; + } + } + } + return true; +} + +// ======================================================================= +// function : bake +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted, + Standard_Boolean theIsTopDown, + Standard_Size theDiffNbSamples, + Standard_Size theSpecNbSamples, + Standard_ShortReal theProbability) +{ + myIsNeededToBeBound = Standard_True; + if (!theCtx->ShaderManager()->BindPBREnvBakingProgram()) + { + return; + } + theEnvMap->Bind (theCtx, theCtx->PBRSpecIBLMapTexUnit()); + theCtx->ActiveProgram()->SetSampler (theCtx, "uEnvMap", theCtx->PBRSpecIBLMapTexUnit()); + theCtx->ActiveProgram()->SetUniform (theCtx, "uZCoeff", theZIsInverted ? -1 : 1); + theCtx->ActiveProgram()->SetUniform (theCtx, "uYCoeff", theIsTopDown ? 1 : -1); + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + myVBO.BindAttribute (theCtx, Graphic3d_TOA_POS); + + OSD_Timer aTimer; + aTimer.Start(); + if (processSpecIBLMap (theCtx, true, theEnvMap->SizeX(), theSpecNbSamples, theProbability) + && processDiffIBLMap (theCtx, true, theDiffNbSamples)) + { + Message::DefaultMessenger()->Send(TCollection_AsciiString() + + "IBL " + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeX() + "x" + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeY() + + " is baked in " + aTimer.ElapsedTime() + " s", Message_Trace); + } + else + { + theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_PERFORMANCE, 0, GL_DEBUG_SEVERITY_HIGH, + TCollection_AsciiString("Error: baking PBR environment ") + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeX() + + "x" + myIBLMaps[OpenGl_TypeOfIBLMap_Specular].SizeY() + " takes too much time!."); + clear (theCtx, Graphic3d_Vec3(1.0f)); + } + + myVBO.UnbindAttribute (theCtx, Graphic3d_TOA_POS); + theEnvMap->Unbind (theCtx, theCtx->PBREnvLUTTexUnit()); +} + +// ======================================================================= +// function : clear +// purpose : +// ======================================================================= +void OpenGl_PBREnvironment::clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor) +{ + myIsNeededToBeBound = Standard_True; + theCtx->arbFBO->glBindFramebuffer (GL_DRAW_FRAMEBUFFER, myFBO); + theCtx->core11fwd->glClearColor (theColor.r(), theColor.g(), theColor.b(), 1.f); + + processSpecIBLMap (theCtx, false); + processDiffIBLMap (theCtx, false); +} diff --git a/src/OpenGl/OpenGl_PBREnvironment.hxx b/src/OpenGl/OpenGl_PBREnvironment.hxx new file mode 100644 index 0000000000..986883ba89 --- /dev/null +++ b/src/OpenGl/OpenGl_PBREnvironment.hxx @@ -0,0 +1,206 @@ +// Author: Ilya Khramov +// Copyright (c) 2019 OPEN CASCADE SAS +// +// This file is part of Open CASCADE Technology software library. +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License version 2.1 as published +// by the Free Software Foundation, with special exception defined in the file +// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT +// distribution for complete text of the license and disclaimer of any warranty. +// +// Alternatively, this file may be used under the terms of Open CASCADE +// commercial license or contractual agreement. + +#ifndef _OpenGl_PBREnvironment_HeaderFile +#define _OpenGl_PBREnvironment_HeaderFile + +#include +#include + +//! This class contains specular and diffuse maps required for Image Base Lighting (IBL) in PBR shading model with it's generation methods. +class OpenGl_PBREnvironment : public OpenGl_NamedResource +{ + DEFINE_STANDARD_RTTIEXT(OpenGl_PBREnvironment, OpenGl_NamedResource) +public: + + //! Creates and initializes new PBR environment. It is the only way to create OpenGl_PBREnvironment. + //! @param theCtx OpenGL context where environment will be created + //! @param thePow2Size final size of texture's sides can be calculated as 2^thePow2Size; + //! if thePow2Size less than 1 it will be set to 1 + //! @param theSpecMapLevelsNum number of mipmap levels used in specular IBL map; + //! if theSpecMapLevelsNum less than 2 or less than Pow2Size + 1 it will be set to the corresponding values. + //! @param theId OpenGl_Resource name + //! @return handle to created PBR environment or NULL handle in case of fail + Standard_EXPORT static Handle(OpenGl_PBREnvironment) Create (const Handle(OpenGl_Context)& theCtx, + unsigned int thePow2Size = 9, + unsigned int theSpecMapLevelsNum = 6, + const TCollection_AsciiString& theId = "PBREnvironment"); + +public: + + //! Binds diffuse and specular IBL maps to the corresponding texture units. + Standard_EXPORT void Bind (const Handle(OpenGl_Context)& theCtx); + + //! Unbinds diffuse and specular IBL maps. + Standard_EXPORT void Unbind (const Handle(OpenGl_Context)& theCtx); + + //! Fills all mipmaps of specular IBL map and diffuse IBL map with one color. + //! So that environment illumination will be constant. + Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor = Graphic3d_Vec3 (1.f)); + + //! Generates specular and diffuse (irradiance) IBL maps. + //! @param theCtx OpenGL context + //! @param theEnvMap source environment map + //! @param theZIsInverted flags indicates whether environment cubemap has inverted Z axis or not + //! @param theIsTopDown flags indicates whether environment cubemap has top-down memory layout or not + //! @param theDiffMapNbSamples number of samples in Monte-Carlo integration for diffuse IBL spherical harmonics calculation + //! @param theSpecMapNbSamples number of samples in Monte-Carlo integration for specular IBL map generation + //! @param theProbability controls strength of samples number reducing strategy during specular IBL map baking (see 'SpecIBLMapSamplesFactor' for details) + //! theZIsInverted and theIsTopDown can be taken from Graphic3d_CubeMap source of environment cubemap. + //! theDiffMapNbSamples and theSpecMapNbSamples is the main parameter directly affected to performance. + Standard_EXPORT void Bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted = Standard_False, + Standard_Boolean theIsTopDown = Standard_True, + Standard_Size theDiffMapNbSamples = 1024, + Standard_Size theSpecMapNbSamples = 256, + Standard_ShortReal theProbability = 0.99f); + + //! Returns number of mipmap levels used in specular IBL map. + //! It can be different from value passed to creation method. + unsigned int SpecMapLevelsNumber() const { return mySpecMapLevelsNumber; } + + //! Returns size of IBL maps sides as power of 2. + //! So that the real size can be calculated as 2^Pow2Size() + unsigned int Pow2Size() const { return myPow2Size; } + + //! Checks whether the given sizes affects to the current ones. + //! It can be imagined as creation of new PBR environment. + //! If creation method with this values returns the PBR environment having real sizes which are equals to current ones + //! then this method will return false. + //! It is handful when sizes are required to be changed. + //! If this method returns false there is no reason to recreate PBR environment in order to change sizes. + Standard_EXPORT bool SizesAreDifferent (unsigned int thePow2Size, + unsigned int theSpecMapLevelsNumber) const; + + //! Indicates whether IBL map's textures have to be bound or it is not obligate. + bool IsNeededToBeBound() const + { + return myIsNeededToBeBound; + } + + //! Releases all OpenGL resources. + //! It must be called before destruction. + Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE; + + //! Returns estimated GPU memory usage for holding data without considering overheads and allocation alignment rules. + virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE + { + unsigned int aDiffIBLMapSidePixelsCount = 1 << myPow2Size; + aDiffIBLMapSidePixelsCount *= aDiffIBLMapSidePixelsCount; + Standard_Size anEstimatedDataSize = aDiffIBLMapSidePixelsCount; + for (unsigned int i = 0; i < mySpecMapLevelsNumber; ++i) + { + anEstimatedDataSize += aDiffIBLMapSidePixelsCount >> (2 * i); + } + anEstimatedDataSize *= 6; // cubemap sides + anEstimatedDataSize *= 3; // channels + return anEstimatedDataSize; + } + + //! Checks completeness of PBR environment. + //! Creation method returns only completed objects or null handles otherwise. + Standard_Boolean IsComplete() const { return myIsComplete; } + + //! Destructor. + //! Warning! 'Release' method must be called before destruction. + //! Otherwise unhandled critical error will be generated. + Standard_EXPORT virtual ~OpenGl_PBREnvironment(); + +private: + + //! Creates new PBR environment. + //! Parameters and logic are described in 'Create' method documentation. + Standard_EXPORT OpenGl_PBREnvironment (const Handle(OpenGl_Context)& theCtx, + unsigned int thePowOf2Size = 9, + unsigned int theSpecMapLevelsNumber = 6, + const TCollection_AsciiString& theId = "PBREnvironment"); + +private: + + //! Enum classified the type of IBL map + enum OpenGl_TypeOfIBLMap + { + OpenGl_TypeOfIBLMap_DiffuseSH, + OpenGl_TypeOfIBLMap_Specular + }; + + //! Initializes all textures. + //! @return false in case of failed texture initialization + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initTextures (const Handle(OpenGl_Context)& theCtx); + + //! Creates frame buffer object for IBL maps generation. + //! @return false in case of failed FBO initialization + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initFBO (const Handle(OpenGl_Context)& theCtx); + + //! Initializes vertex buffer object of screen rectangle. + //! @return false in case of failed creation + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool initVAO (const Handle(OpenGl_Context)& theCtx); + + //! Responses for diffuse (irradiance) IBL map processing. + //! @return false in case of failed baking or clearing + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool processDiffIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Size theNbSamples = 0); + + //! Responses for specular IBL map processing. + //! @return false in case of failed baking or clearing + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool processSpecIBLMap (const Handle(OpenGl_Context)& theCtx, + Standard_Boolean theIsDrawAction, + Standard_Integer theEnvMapSize = 1024, + Standard_Size theNbSamples = 0, + Standard_ShortReal theProbability = 1.f); + + //! Checks completeness of frame buffer object for all targets + //! (all cube map sides and levels of IBL maps). + //! @return false in case of uncompleted frame buffer object. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + bool checkFBOComplentess (const Handle(OpenGl_Context)& theCtx) const; + + //! Version of 'Bake' without OpenGl_PBREnvironmentSetnry. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + void bake (const Handle(OpenGl_Context)& theCtx, + const Handle(OpenGl_Texture)& theEnvMap, + Standard_Boolean theZIsInverted = Standard_False, + Standard_Boolean theIsTopDown = Standard_True, + Standard_Size theDiffMapNbSamples = 1024, + Standard_Size theSpecMapNbSamples = 256, + Standard_ShortReal theProbability = 1.f); + + //! Version of 'Clear' without OpenGl_PBREnvironmentSetnry. + //! Warning! Requires using of OpenGl_PBREnvironmentSentry. + void clear (const Handle(OpenGl_Context)& theCtx, + const Graphic3d_Vec3& theColor = Graphic3d_Vec3 (1.f)); + +private: + + unsigned int myPow2Size; //!< size of IBL maps sides (real size can be calculated as 2^myPow2Size) + unsigned int mySpecMapLevelsNumber; //!< number of mipmap levels used in specular IBL map + + OpenGl_Texture myIBLMaps[2]; //!< IBL maps + OpenGl_VertexBuffer myVBO; //!< vertex buffer object of screen rectangular + GLuint myFBO; //!< frame buffer object to generate or clear IBL maps + + Standard_Boolean myIsComplete; //!< completeness of PBR environment + Standard_Boolean myIsNeededToBeBound; //!< indicates whether IBL map's textures have to be bound or it is not obligate + +}; + +#endif // _OpenGl_PBREnvironment_HeaderFile diff --git a/src/OpenGl/OpenGl_Sampler.cxx b/src/OpenGl/OpenGl_Sampler.cxx index 54c1e25f07..4fcfca4ed8 100644 --- a/src/OpenGl/OpenGl_Sampler.cxx +++ b/src/OpenGl/OpenGl_Sampler.cxx @@ -223,7 +223,8 @@ void OpenGl_Sampler::applySamplerParams (const Handle(OpenGl_Context)& theCtx, } #endif setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_WRAP_T, aWrapMode); - if (theTarget == GL_TEXTURE_3D) + if (theTarget == GL_TEXTURE_3D + || theTarget == GL_TEXTURE_CUBE_MAP) { setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_WRAP_R, aWrapMode); return; @@ -261,6 +262,13 @@ void OpenGl_Sampler::applySamplerParams (const Handle(OpenGl_Context)& theCtx, setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, aDegree); } + + if (theCtx->IsGlGreaterEqual(1, 2) && + (theSampler == NULL || !theSampler->isValidSampler())) + { + setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_BASE_LEVEL, theParams->BaseLevel()); + setParameter (theCtx, theSampler, theTarget, GL_TEXTURE_MAX_LEVEL, theParams->MaxLevel()); + } } // ======================================================================= diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index c7328cedd3..dcb20800ca 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -19,14 +19,22 @@ #include #include #include +#include #include #include #include #include #include - #include +#include "../Shaders/Shaders_PBRDistribution_glsl.pxx" +#include "../Shaders/Shaders_PBRGeometry_glsl.pxx" +#include "../Shaders/Shaders_PBRFresnel_glsl.pxx" +#include "../Shaders/Shaders_PBRCookTorrance_glsl.pxx" +#include "../Shaders/Shaders_PBRIllumination_glsl.pxx" +#include "../Shaders/Shaders_PBREnvBaking_fs.pxx" +#include "../Shaders/Shaders_PBREnvBaking_vs.pxx" + IMPLEMENT_STANDARD_RTTIEXT(OpenGl_ShaderManager,Standard_Transient) namespace @@ -57,8 +65,8 @@ const char THE_VARY_TexCoord_Trsf[] = //! Auxiliary function to flip gl_PointCoord vertically #define THE_VEC2_glPointCoord "vec2 (gl_PointCoord.x, 1.0 - gl_PointCoord.y)" -//! Auxiliary function to transform normal -const char THE_FUNC_transformNormal[] = +//! Auxiliary function to transform normal from model to view coordinate system. +const char THE_FUNC_transformNormal_view[] = EOL"vec3 transformNormal (in vec3 theNormal)" EOL"{" EOL" vec4 aResult = occWorldViewMatrixInverseTranspose" @@ -67,12 +75,31 @@ const char THE_FUNC_transformNormal[] = EOL" return normalize (aResult.xyz);" EOL"}"; +//! The same function as THE_FUNC_transformNormal but is used in PBR pipeline. +//! The normals are expected to be in world coordinate system in PBR pipeline. +const char THE_FUNC_transformNormal_world[] = + EOL"vec3 transformNormal (in vec3 theNormal)" + EOL"{" + EOL" vec4 aResult = occModelWorldMatrixInverseTranspose" + EOL" * vec4 (theNormal, 0.0);" + EOL" return normalize (aResult.xyz);" + EOL"}"; + //! Global shader variable for color definition with lighting enabled. const char THE_FUNC_lightDef[] = EOL"vec3 Ambient;" //!< Ambient contribution of light sources EOL"vec3 Diffuse;" //!< Diffuse contribution of light sources EOL"vec3 Specular;"; //!< Specular contribution of light sources +//! Global shader variable for color definition with lighting enabled. +const char THE_FUNC_PBR_lightDef[] = + EOL"vec3 DirectLighting;" //!< Accumulator of direct lighting from light sources + EOL"vec4 BaseColor;" //!< Base color (albedo) of material for PBR + EOL"float Metallic;" //!< Metallic coefficient of material + EOL"float Roughness;" //!< Roughness coefficient of material + EOL"vec3 Emission;" //!< Light intensity emitted by material + EOL"float IOR;"; //!< Material's index of refraction + //! Function computes contribution of isotropic point light source const char THE_FUNC_pointLight[] = EOL"void pointLight (in int theId," @@ -82,7 +109,7 @@ const char THE_FUNC_pointLight[] = EOL" in bool theIsFront)" EOL"{" EOL" vec3 aLight = occLight_Position (theId).xyz;" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));" EOL" }" @@ -110,6 +137,38 @@ const char THE_FUNC_pointLight[] = EOL" Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;" EOL"}"; +//! Function computes contribution of isotropic point light source +const char THE_FUNC_PBR_pointLight[] = + EOL"void pointLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec3 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = occLight_Position (theId).xyz;" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 1.0));" + EOL" }" + EOL" aLight -= thePoint;" + EOL + EOL" float aDist = length (aLight);" + EOL" aLight /= aDist;" + EOL + EOL" float anAtten = 1.0 / max (aDist * aDist, 0.01);" + EOL + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView," + EOL" aLight," + EOL" theNormal," + EOL" BaseColor," + EOL" Metallic," + EOL" Roughness," + EOL" IOR," + EOL" occLight_Specular(theId).rgb," + EOL" occLight_Intensity(theId) * anAtten);" + EOL"}"; + //! Function computes contribution of spotlight source const char THE_FUNC_spotLight[] = EOL"void spotLight (in int theId," @@ -120,7 +179,7 @@ const char THE_FUNC_spotLight[] = EOL"{" EOL" vec3 aLight = occLight_Position (theId).xyz;" EOL" vec3 aSpotDir = occLight_SpotDirection (theId).xyz;" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0));" EOL" aSpotDir = vec3 (occWorldViewMatrix * vec4 (aSpotDir, 0.0));" @@ -162,6 +221,53 @@ const char THE_FUNC_spotLight[] = EOL" Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;" EOL"}"; +//! Function computes contribution of spotlight source + const char THE_FUNC_PBR_spotLight[] = + EOL"void spotLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec3 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = occLight_Position (theId).xyz;" + EOL" vec3 aSpotDir = occLight_SpotDirection (theId).xyz;" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 1.0));" + EOL" aSpotDir = vec3 (occWorldViewMatrixInverse * vec4 (aSpotDir, 0.0));" + EOL" }" + EOL" aLight -= thePoint;" + EOL + EOL" float aDist = length (aLight);" + EOL" aLight /= aDist;" + EOL + EOL" aSpotDir = normalize (aSpotDir);" + // light cone + EOL" float aCosA = dot (aSpotDir, -aLight);" + EOL" if (aCosA >= 1.0 || aCosA < cos (occLight_SpotCutOff (theId)))" + EOL" {" + EOL" return;" + EOL" }" + EOL + EOL" float anExponent = occLight_SpotExponent (theId);" + EOL" float anAtten = 1.0 / max (aDist * aDist, 0.01);" + EOL" if (anExponent > 0.0)" + EOL" {" + EOL" anAtten *= pow (aCosA, anExponent * 128.0);" + EOL" }" + EOL + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView," + EOL" aLight," + EOL" theNormal," + EOL" BaseColor," + EOL" Metallic," + EOL" Roughness," + EOL" IOR," + EOL" occLight_Specular(theId).rgb," + EOL" occLight_Intensity(theId) * anAtten);" + EOL"}"; + //! Function computes contribution of directional light source const char THE_FUNC_directionalLight[] = EOL"void directionalLight (in int theId," @@ -170,7 +276,7 @@ const char THE_FUNC_directionalLight[] = EOL" in bool theIsFront)" EOL"{" EOL" vec3 aLight = normalize (occLight_Position (theId).xyz);" - EOL" if (occLight_IsHeadlight (theId) == 0)" + EOL" if (!occLight_IsHeadlight (theId))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 0.0));" EOL" }" @@ -191,6 +297,31 @@ const char THE_FUNC_directionalLight[] = EOL" Specular += occLight_Specular (theId).rgb * aSpecl;" EOL"}"; +//! Function computes contribution of directional light source +const char THE_FUNC_PBR_directionalLight[] = + EOL"void directionalLight (in int theId," + EOL" in vec3 theNormal," + EOL" in vec3 theView," + EOL" in bool theIsFront)" + EOL"{" + EOL" vec3 aLight = normalize (occLight_Position (theId).xyz);" + EOL" if (occLight_IsHeadlight (theId))" + EOL" {" + EOL" aLight = vec3 (occWorldViewMatrixInverse * vec4 (aLight, 0.0));" + EOL" }" + EOL + EOL" theNormal = theIsFront ? theNormal : -theNormal;" + EOL" DirectLighting += occPBRIllumination (theView," + EOL" aLight," + EOL" theNormal," + EOL" BaseColor," + EOL" Metallic," + EOL" Roughness," + EOL" IOR," + EOL" occLight_Specular(theId).rgb," + EOL" occLight_Intensity(theId));" + EOL"}"; + //! The same as THE_FUNC_directionalLight but for the light with zero index //! (avoids limitations on some mobile devices). const char THE_FUNC_directionalLightFirst[] = @@ -199,7 +330,7 @@ const char THE_FUNC_directionalLightFirst[] = EOL" in bool theIsFront)" EOL"{" EOL" vec3 aLight = normalize (occLightSources[1].xyz);" - EOL" if (occLight_IsHeadlight (0) == 0)" + EOL" if (!occLight_IsHeadlight (0))" EOL" {" EOL" aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 0.0));" EOL" }" @@ -220,6 +351,18 @@ const char THE_FUNC_directionalLightFirst[] = EOL" Specular += occLightSources[0].rgb * aSpecl;" EOL"}"; +//! Returns the real cubemap fetching direction considering sides orientation, memory layout and vertical flip. +const char THE_FUNC_cubemap_vector_transform[] = + EOL"vec3 cubemapVectorTransform (in vec3 theVector," + EOL" in int theYCoeff," + EOL" in int theZCoeff)" + EOL"{" + EOL" theVector = theVector.yzx;" + EOL" theVector.y *= float(theYCoeff);" + EOL" theVector.z *= float(theZCoeff);" + EOL" return theVector;" + EOL"}"; + //! Process clipping planes in Fragment Shader. //! Should be added at the beginning of the main() function. const char THE_FRAG_CLIP_PLANES_N[] = @@ -422,6 +565,10 @@ OpenGl_ShaderManager::OpenGl_ShaderManager (OpenGl_Context* theContext) OpenGl_ShaderManager::~OpenGl_ShaderManager() { myProgramList.Clear(); + if (!myPBREnvironment.IsNull()) + { + myPBREnvironment->Release (myContext); + } } // ======================================================================= @@ -585,9 +732,11 @@ void OpenGl_ShaderManager::UpdateSRgbState() // function : UpdateLightSourceStateTo // purpose : Updates state of OCCT light sources // ======================================================================= -void OpenGl_ShaderManager::UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights) +void OpenGl_ShaderManager::UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights, + Standard_Integer theSpecIBLMapLevels) { myLightSourceState.Set (theLights); + myLightSourceState.SetSpecIBLMapLevels (theSpecIBLMapLevels); myLightSourceState.Update(); switchLightPrograms(); } @@ -768,6 +917,7 @@ void OpenGl_ShaderManager::pushLightSourceState (const Handle(OpenGl_ShaderProgr aLightType.Type = aLight.Type(); aLightType.IsHeadlight = aLight.IsHeadlight(); aLightParams.Color = aLight.PackedColor(); + aLightParams.Color.a() = aLight.Intensity(); // used by PBR and ignored by old shading model if (aLight.Type() == Graphic3d_TOLS_DIRECTIONAL) { aLightParams.Position = -aLight.PackedDirection(); @@ -813,6 +963,11 @@ void OpenGl_ShaderManager::pushLightSourceState (const Handle(OpenGl_ShaderProgr aLightsNb * OpenGl_ShaderLightParameters::NbOfVec4(), myLightParamsArray.First().Packed()); } + + if (const OpenGl_ShaderUniformLocation aLocation = theProgram->GetStateLocation (OpenGl_OCCT_NB_SPEC_IBL_LEVELS)) + { + theProgram->SetUniform (myContext, aLocation, myLightSourceState.SpecIBLMapLevels()); + } } // ======================================================================= @@ -1164,18 +1319,18 @@ void OpenGl_ShaderManager::pushMaterialState (const Handle(OpenGl_ShaderProgram) } const GLenum aFrontFace = myMaterialState.ToDistinguish() ? GL_FRONT : GL_FRONT_AND_BACK; - myContext->core11->glMaterialfv(aFrontFace, GL_AMBIENT, aFrontMat.Ambient.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_DIFFUSE, aFrontMat.Diffuse.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_SPECULAR, aFrontMat.Specular.GetData()); - myContext->core11->glMaterialfv(aFrontFace, GL_EMISSION, aFrontMat.Emission.GetData()); - myContext->core11->glMaterialf (aFrontFace, GL_SHININESS, aFrontMat.Shine()); + myContext->core11->glMaterialfv(aFrontFace, GL_AMBIENT, aFrontMat.Common.Ambient.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_DIFFUSE, aFrontMat.Common.Diffuse.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_SPECULAR, aFrontMat.Common.Specular.GetData()); + myContext->core11->glMaterialfv(aFrontFace, GL_EMISSION, aFrontMat.Common.Emission.GetData()); + myContext->core11->glMaterialf (aFrontFace, GL_SHININESS, aFrontMat.Common.Shine()); if (myMaterialState.ToDistinguish()) { - myContext->core11->glMaterialfv(GL_BACK, GL_AMBIENT, aBackMat.Ambient.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_DIFFUSE, aBackMat.Diffuse.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_SPECULAR, aBackMat.Specular.GetData()); - myContext->core11->glMaterialfv(GL_BACK, GL_EMISSION, aBackMat.Emission.GetData()); - myContext->core11->glMaterialf (GL_BACK, GL_SHININESS, aBackMat.Shine()); + myContext->core11->glMaterialfv(GL_BACK, GL_AMBIENT, aBackMat.Common.Ambient.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_DIFFUSE, aBackMat.Common.Diffuse.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_SPECULAR, aBackMat.Common.Specular.GetData()); + myContext->core11->glMaterialfv(GL_BACK, GL_EMISSION, aBackMat.Common.Emission.GetData()); + myContext->core11->glMaterialf (GL_BACK, GL_SHININESS, aBackMat.Common.Shine()); } #endif return; @@ -1191,15 +1346,25 @@ void OpenGl_ShaderManager::pushMaterialState (const Handle(OpenGl_ShaderProgram) theProgram->GetStateLocation (OpenGl_OCCT_DISTINGUISH_MODE), myMaterialState.ToDistinguish() ? 1 : 0); - if (const OpenGl_ShaderUniformLocation aLocFront = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL)) + if (const OpenGl_ShaderUniformLocation& aLocPbrFront = theProgram->GetStateLocation (OpenGl_OCCT_PBR_FRONT_MATERIAL)) { - theProgram->SetUniform (myContext, aLocFront, OpenGl_Material::NbOfVec4(), - aFrontMat.Packed()); + theProgram->SetUniform (myContext, aLocPbrFront, OpenGl_MaterialPBR::NbOfVec4(), + aFrontMat.Pbr.Packed()); } - if (const OpenGl_ShaderUniformLocation aLocBack = theProgram->GetStateLocation (OpenGl_OCCT_BACK_MATERIAL)) + if (const OpenGl_ShaderUniformLocation aLocPbrBack = theProgram->GetStateLocation (OpenGl_OCCT_PBR_BACK_MATERIAL)) { - theProgram->SetUniform (myContext, aLocBack, OpenGl_Material::NbOfVec4(), - aBackMat.Packed()); + theProgram->SetUniform (myContext, aLocPbrBack, OpenGl_MaterialPBR::NbOfVec4(), + aBackMat.Pbr.Packed()); + } + if (const OpenGl_ShaderUniformLocation aLocFront = theProgram->GetStateLocation (OpenGl_OCCT_COMMON_FRONT_MATERIAL)) + { + theProgram->SetUniform (myContext, aLocFront, OpenGl_MaterialCommon::NbOfVec4(), + aFrontMat.Common.Packed()); + } + if (const OpenGl_ShaderUniformLocation aLocBack = theProgram->GetStateLocation (OpenGl_OCCT_COMMON_BACK_MATERIAL)) + { + theProgram->SetUniform (myContext, aLocBack, OpenGl_MaterialCommon::NbOfVec4(), + aBackMat.Common.Packed()); } } @@ -1614,7 +1779,8 @@ int OpenGl_ShaderManager::defaultGlslVersion (const Handle(Graphic3d_ShaderProgr } else { - if ((theBits & OpenGl_PO_StippleLine) != 0) + if ((theBits & OpenGl_PO_StippleLine) != 0 + || theProgram->IsPBR()) { if (myContext->IsGlGreaterEqual (3, 0)) { @@ -1654,6 +1820,11 @@ int OpenGl_ShaderManager::defaultGlslVersion (const Handle(Graphic3d_ShaderProgr } else { + if (theProgram->IsPBR() + && myContext->IsGlGreaterEqual (3, 0)) + { + theProgram->SetHeader ("#version 300 es"); + } if ((theBits & OpenGl_PO_WriteOit) != 0 || (theBits & OpenGl_PO_StippleLine) != 0) { @@ -1863,7 +2034,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramUnlit (Handle(OpenGl_Sha } else if ((theBits & OpenGl_PO_TextureEnv) != 0) { - aSrcVertExtraFunc = THE_FUNC_transformNormal; + aSrcVertExtraFunc = THE_FUNC_transformNormal_view; aSrcVertExtraMain += EOL" vec4 aPosition = occWorldViewMatrix * occModelWorldMatrix * occVertex;" @@ -2046,7 +2217,8 @@ TCollection_AsciiString OpenGl_ShaderManager::pointSpriteShadingSrc (const TColl // purpose : // ======================================================================= TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integer& theNbLights, - Standard_Boolean theHasVertColor) + Standard_Boolean theHasVertColor, + Standard_Boolean theIsPBR) { TCollection_AsciiString aLightsFunc, aLightsLoop; theNbLights = 0; @@ -2122,8 +2294,19 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integ } aLightsLoop += EOL" }"; } + + if (theIsPBR) + { + aLightsFunc += Shaders_PBRDistribution_glsl; + aLightsFunc += Shaders_PBRGeometry_glsl; + aLightsFunc += Shaders_PBRFresnel_glsl; + aLightsFunc += Shaders_PBRCookTorrance_glsl; + aLightsFunc += Shaders_PBRIllumination_glsl; + } + if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_DIRECTIONAL) == 1 - && theNbLights == 1) + && theNbLights == 1 + && !theIsPBR) { // use the version with hard-coded first index aLightsLoop = EOL" directionalLightFirst(theNormal, theView, theIsFront);"; @@ -2131,15 +2314,15 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integ } else if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_DIRECTIONAL) > 0) { - aLightsFunc += THE_FUNC_directionalLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_directionalLight : THE_FUNC_directionalLight; } if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_POSITIONAL) > 0) { - aLightsFunc += THE_FUNC_pointLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_pointLight : THE_FUNC_pointLight; } if (aLights->NbEnabledLightsOfType (Graphic3d_TOLS_SPOT) > 0) { - aLightsFunc += THE_FUNC_spotLight; + aLightsFunc += theIsPBR ? THE_FUNC_PBR_spotLight : THE_FUNC_spotLight; } } @@ -2151,7 +2334,9 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integ aGetMatDiffuse = "getVertColor();"; } - return TCollection_AsciiString() + if (!theIsPBR) + { + return TCollection_AsciiString() + THE_FUNC_lightDef + aLightsFunc + EOL @@ -2175,6 +2360,42 @@ TCollection_AsciiString OpenGl_ShaderManager::stdComputeLighting (Standard_Integ EOL" + aMatEmission.rgb;" EOL" return vec4 (aColor, aMatDiffuse.a);" EOL"}"; + } + else + { + return TCollection_AsciiString() + + THE_FUNC_PBR_lightDef + + aLightsFunc + + EOL + EOL"vec4 computeLighting (in vec3 theNormal," + EOL" in vec3 theView," + EOL" in vec4 thePoint," + EOL" in bool theIsFront)" + EOL"{" + EOL" DirectLighting = vec3(0.0);" + EOL" BaseColor = " + (theHasVertColor ? "getVertColor();" : "getBaseColor (theIsFront);") + + EOL" Metallic = theIsFront ? occPBRFrontMaterial_Metallic() : occPBRBackMaterial_Metallic();" + EOL" Roughness = theIsFront ? occPBRFrontMaterial_Roughness() : occPBRBackMaterial_Roughness();" + EOL" IOR = theIsFront ? occPBRFrontMaterial_IOR() : occPBRBackMaterial_IOR();" + EOL" Emission = theIsFront ? occPBRFrontMaterial_Emission() : occPBRBackMaterial_Emission();" + EOL" vec3 aPoint = thePoint.xyz / thePoint.w;" + + aLightsLoop + + EOL" vec3 aColor = DirectLighting;" + EOL" vec3 anIndirectLightingSpec = occPBRFresnel (BaseColor.rgb, Metallic, IOR);" + EOL" Roughness = theIsFront ? occPBRFrontMaterial_NormalizedRoughness() : occPBRBackMaterial_NormalizedRoughness();" + EOL" vec2 aCoeff = occTexture2D (occEnvLUT, vec2(abs(dot(theView, theNormal)), Roughness)).xy;" + EOL" anIndirectLightingSpec *= aCoeff.x;" + EOL" anIndirectLightingSpec += aCoeff.y;" + EOL" anIndirectLightingSpec *= occTextureCubeLod (occSpecIBLMap, -reflect (theView, theNormal), Roughness * float (occNbSpecIBLLevels - 1)).rgb;" + EOL" vec3 aRefractionCoeff = 1.0 - occPBRFresnel (BaseColor.rgb, Metallic, Roughness, IOR, abs(dot(theView, theNormal)));" + EOL" aRefractionCoeff *= (1.0 - Metallic);" + EOL" vec3 anIndirectLightingDiff = aRefractionCoeff * BaseColor.rgb * BaseColor.a;" + EOL" anIndirectLightingDiff *= occDiffIBLMap (theNormal).rgb;" + EOL" aColor += occLightAmbient.rgb * (anIndirectLightingDiff + anIndirectLightingSpec);" + EOL" aColor += Emission;" + EOL" return vec4 (aColor, mix(1.0, BaseColor.a, aRefractionCoeff.x));" + EOL"}"; + } } // ======================================================================= @@ -2278,9 +2499,9 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 BackColor", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); Standard_Integer aNbLights = 0; - const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcVertColor.IsEmpty()); + const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcVertColor.IsEmpty(), false); aSrcVert = TCollection_AsciiString() - + THE_FUNC_transformNormal + + THE_FUNC_transformNormal_view + EOL + aSrcVertColor + aLights @@ -2334,9 +2555,12 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramGouraud (Handle(OpenGl_S // ======================================================================= Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram, const Standard_Integer theBits, - const Standard_Boolean theIsFlatNormal) + const Standard_Boolean theIsFlatNormal, + const Standard_Boolean theIsPBR) { - #define thePhongCompLight "computeLighting (normalize (Normal), normalize (View), Position, gl_FrontFacing)" + TCollection_AsciiString aPosition = theIsPBR ? "PositionWorld" : "Position"; + TCollection_AsciiString aPhongCompLight = TCollection_AsciiString() + + "computeLighting (normalize (Normal), normalize (View), " + aPosition + ", gl_FrontFacing)"; const bool isFlatNormal = theIsFlatNormal && myContext->hasFlatShading != OpenGl_FeatureNotAvailable; const char* aDFdxSignReversion = ""; @@ -2357,9 +2581,16 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha } #endif Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); + aProgramSrc->SetPBR (theIsPBR); + TCollection_AsciiString aSrcVert, aSrcVertExtraFunc, aSrcVertExtraMain; TCollection_AsciiString aSrcFrag, aSrcFragExtraOut, aSrcFragGetVertColor, aSrcFragExtraMain; - TCollection_AsciiString aSrcFragGetColor = EOL"vec4 getColor(void) { return " thePhongCompLight "; }"; + TCollection_AsciiString aSrcFragGetColor = TCollection_AsciiString() + EOL"vec4 getColor(void) { return " + aPhongCompLight + "; }"; + TCollection_AsciiString aSrcFragPBRGetBaseColor = TCollection_AsciiString() + + EOL"vec4 getBaseColor(in bool theIsFront)" + EOL"{" + EOL" return theIsFront ? occPBRFrontMaterial_Color() : occPBRBackMaterial_Color();" + EOL"}"; OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; if ((theBits & OpenGl_PO_IsPoint) != 0) { @@ -2378,7 +2609,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha #endif aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("sampler2D occSamplerPointSprite", Graphic3d_TOS_FRAGMENT)); - aSrcFragGetColor = pointSpriteShadingSrc (thePhongCompLight, theBits); + aSrcFragGetColor = pointSpriteShadingSrc (aPhongCompLight, theBits); } if ((theBits & OpenGl_PO_HasTextures) == OpenGl_PO_TextureRGB @@ -2399,12 +2630,24 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec4 TexCoord", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); aSrcVertExtraMain += THE_VARY_TexCoord_Trsf; - aSrcFragGetColor = - EOL"vec4 getColor(void)" - EOL"{" - EOL" vec4 aColor = " thePhongCompLight ";" - EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) * aColor;" - EOL"}"; + if (!theIsPBR) + { + aSrcFragGetColor = TCollection_AsciiString() + + EOL"vec4 getColor(void)" + EOL"{" + EOL" vec4 aColor = " + aPhongCompLight + ";" + EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) * aColor;" + EOL"}"; + } + else + { + aSrcFragPBRGetBaseColor = TCollection_AsciiString() + + EOL"vec4 getBaseColor (in bool theIsFront)" + EOL"{" + EOL" return occTexture2D(occSamplerBaseColor, TexCoord.st / TexCoord.w) *" + EOL" (theIsFront ? occPBRFrontMaterial_Color() : occPBRBackMaterial_Color());" + EOL"}"; + } } } @@ -2448,13 +2691,13 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha { aSrcFragExtraOut += EOL"vec3 Normal;"; aSrcFragExtraMain += TCollection_AsciiString() - + EOL" Normal = " + aDFdxSignReversion + "normalize (cross (dFdx (Position.xyz / Position.w), dFdy (Position.xyz / Position.w)));" + + EOL" Normal = " + aDFdxSignReversion + "normalize (cross (dFdx (" + aPosition + ".xyz / " + aPosition + ".w), dFdy (" + aPosition + ".xyz / " + aPosition + ".w)));" EOL" if (!gl_FrontFacing) { Normal = -Normal; }"; } else { aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable ("vec3 Normal", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); - aSrcVertExtraFunc += THE_FUNC_transformNormal; + aSrcVertExtraFunc += theIsPBR ? THE_FUNC_transformNormal_world : THE_FUNC_transformNormal_view; aSrcVertExtraMain += EOL" Normal = transformNormal (occNormal);"; } @@ -2468,7 +2711,15 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha EOL"{" EOL" PositionWorld = occModelWorldMatrix * occVertex;" EOL" Position = occWorldViewMatrix * PositionWorld;" - + EOL" View = vec3 (0.0, 0.0, 1.0);" + EOL" if (occProjectionMatrix[3][3] == 1.0)" + EOL" {" + EOL" View = vec3(0.0, 0.0, 1.0);" + EOL" }" + EOL" else" + EOL" {" + EOL" View = -Position.xyz;" + EOL" }" + + (theIsPBR ? EOL" View = (occWorldViewMatrixInverse * vec4(View, 0.0)).xyz;" : "") + aSrcVertExtraMain + THE_VERT_gl_Position + EOL"}"; @@ -2479,11 +2730,12 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha : EOL"#define getFinalColor getColor"; Standard_Integer aNbLights = 0; - const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcFragGetVertColor.IsEmpty()); + const TCollection_AsciiString aLights = stdComputeLighting (aNbLights, !aSrcFragGetVertColor.IsEmpty(), theIsPBR); aSrcFrag = TCollection_AsciiString() + EOL + aSrcFragExtraOut + aSrcFragGetVertColor + + (theIsPBR ? aSrcFragPBRGetBaseColor : "") + aLights + aSrcFragGetColor + EOL @@ -2493,12 +2745,13 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha + EOL" occSetFragColor (getFinalColor());" + EOL"}"; - const TCollection_AsciiString aProgId = TCollection_AsciiString (theIsFlatNormal ? "flat-" : "phong-") + genLightKey (myLightSourceState.LightSources()) + "-"; + const TCollection_AsciiString aProgId = TCollection_AsciiString (theIsFlatNormal ? "flat-" : "phong-") + (theIsPBR ? "pbr-" : "") + genLightKey (myLightSourceState.LightSources()) + "-"; defaultGlslVersion (aProgramSrc, aProgId, theBits, isFlatNormal); aProgramSrc->SetDefaultSampler (false); aProgramSrc->SetNbLightsMax (aNbLights); aProgramSrc->SetNbClipPlanesMax (aNbClipPlanes); aProgramSrc->SetAlphaTest ((theBits & OpenGl_PO_AlphaTest) != 0); + const Standard_Integer aNbGeomInputVerts = !aSrcGeom.IsEmpty() ? 3 : 0; aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts, "", "", aNbGeomInputVerts)); aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcGeom, Graphic3d_TOS_GEOMETRY, aUniforms, aStageInOuts, "geomIn", "geomOut", aNbGeomInputVerts)); @@ -2787,6 +3040,48 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramBoundBox() return Standard_True; } +// ======================================================================= +// function : preparePBREnvBakingProgram +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_ShaderManager::preparePBREnvBakingProgram() +{ + Handle(Graphic3d_ShaderProgram) aProgramSrc = new Graphic3d_ShaderProgram(); + OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; + + TCollection_AsciiString aSrcVert = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + Shaders_PBREnvBaking_vs; + + TCollection_AsciiString aSrcFrag = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + Shaders_PBRDistribution_glsl + + Shaders_PBREnvBaking_fs; + + // constant array definition requires OpenGL 2.1+ or OpenGL ES 3.0+ +#if defined(GL_ES_VERSION_2_0) + aProgramSrc->SetHeader ("#version 300 es"); +#else + aProgramSrc->SetHeader ("#version 120"); +#endif + + defaultGlslVersion (aProgramSrc, "pbr_env_baking", 0); + aProgramSrc->SetDefaultSampler (false); + aProgramSrc->SetNbLightsMax (0); + aProgramSrc->SetNbClipPlanesMax (0); + aProgramSrc->SetPBR (true); + aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); + aProgramSrc->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); + TCollection_AsciiString aKey; + if (!Create (aProgramSrc, aKey, myPBREnvBakingProgram)) + { + myPBREnvBakingProgram = new OpenGl_ShaderProgram(); // just mark as invalid + return Standard_False; + } + + return Standard_True; +} + // ======================================================================= // function : GetBgCubeMapProgram // purpose : @@ -2795,24 +3090,23 @@ const Handle(Graphic3d_ShaderProgram)& OpenGl_ShaderManager::GetBgCubeMapProgram { if (myBgCubeMapProgram.IsNull()) { - myBgCubeMapProgram = new Graphic3d_ShaderProgram; + myBgCubeMapProgram = new Graphic3d_ShaderProgram(); OpenGl_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; aStageInOuts.Append (OpenGl_ShaderObject::ShaderVariable("vec3 ViewDirection", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uZCoeff", Graphic3d_TOS_VERTEX)); // defines orientation of Z axis to make horizontal flip - aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uYCoeff", Graphic3d_TOS_VERTEX)); // defines orientation of Y axis to make vertical flip aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("samplerCube occSampler0", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uYCoeff", Graphic3d_TOS_VERTEX)); + aUniforms.Append (OpenGl_ShaderObject::ShaderVariable ("int uZCoeff", Graphic3d_TOS_VERTEX)); - TCollection_AsciiString aSrcVert = - EOL"void main()" + TCollection_AsciiString aSrcVert = TCollection_AsciiString() + + THE_FUNC_cubemap_vector_transform + + EOL"void main()" EOL"{" EOL" vec4 aViewDirection = occProjectionMatrixInverse * vec4(occVertex.xy, 0.0, 1.0);" EOL" aViewDirection /= aViewDirection.w;" EOL" aViewDirection.w = 0.0;" EOL" ViewDirection = normalize((occWorldViewMatrixInverse * aViewDirection).xyz);" - EOL" ViewDirection = ViewDirection.yzx;" // is needed to sync horizon and frontal camera position - EOL" ViewDirection.y *= uYCoeff;" - EOL" ViewDirection.z *= uZCoeff;" + EOL" ViewDirection = cubemapVectorTransform (ViewDirection, uYCoeff, uZCoeff);" EOL" gl_Position = vec4(occVertex.xy, 0.0, 1.0);" EOL"}"; @@ -2820,15 +3114,15 @@ const Handle(Graphic3d_ShaderProgram)& OpenGl_ShaderManager::GetBgCubeMapProgram EOL"#define occEnvCubemap occSampler0" EOL"void main()" EOL"{" - EOL" occSetFragColor (vec4(texture(occEnvCubemap, ViewDirection).rgb, 1.0));" + EOL" occSetFragColor (vec4(occTextureCube (occEnvCubemap, ViewDirection).rgb, 1.0));" EOL"}"; - defaultGlslVersion(myBgCubeMapProgram, "background_cubemap", 0); - myBgCubeMapProgram->SetDefaultSampler(false); - myBgCubeMapProgram->SetNbLightsMax(0); - myBgCubeMapProgram->SetNbClipPlanesMax(0); - myBgCubeMapProgram->AttachShader(OpenGl_ShaderObject::CreateFromSource(aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); - myBgCubeMapProgram->AttachShader(OpenGl_ShaderObject::CreateFromSource(aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); + defaultGlslVersion (myBgCubeMapProgram, "background_cubemap", 0); + myBgCubeMapProgram->SetDefaultSampler (false); + myBgCubeMapProgram->SetNbLightsMax (0); + myBgCubeMapProgram->SetNbClipPlanesMax (0); + myBgCubeMapProgram->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); + myBgCubeMapProgram->AttachShader (OpenGl_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); } return myBgCubeMapProgram; diff --git a/src/OpenGl/OpenGl_ShaderManager.hxx b/src/OpenGl/OpenGl_ShaderManager.hxx index 46ddd18667..793ac51705 100644 --- a/src/OpenGl/OpenGl_ShaderManager.hxx +++ b/src/OpenGl/OpenGl_ShaderManager.hxx @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -249,16 +250,44 @@ public: //! Returns bounding box vertex buffer. const Handle(OpenGl_VertexBuffer)& BoundBoxVertBuffer() const { return myBoundBoxVertBuffer; } + //! Bind program for IBL maps generation in PBR pipeline. + Standard_Boolean BindPBREnvBakingProgram() + { + if (myPBREnvBakingProgram.IsNull()) + { + preparePBREnvBakingProgram(); + } + return myContext->BindProgram (myPBREnvBakingProgram); + } + //! Generates shader program to render environment cubemap as background. Standard_EXPORT const Handle(Graphic3d_ShaderProgram)& GetBgCubeMapProgram (); + //! Resets PBR shading models to corresponding non-PBR ones if PBR is not allowed. + static Graphic3d_TypeOfShadingModel PBRShadingModelFallback (Graphic3d_TypeOfShadingModel theShadingModel, + Standard_Boolean theIsPbrAllowed = Standard_False) + { + if (theIsPbrAllowed) + { + return theShadingModel; + } + + switch (theShadingModel) + { + case Graphic3d_TOSM_PBR: return Graphic3d_TOSM_FRAGMENT; + case Graphic3d_TOSM_PBR_FACET: return Graphic3d_TOSM_FACET; + default: return theShadingModel; + } + } + public: //! Returns current state of OCCT light sources. const OpenGl_LightSourceState& LightSourceState() const { return myLightSourceState; } //! Updates state of OCCT light sources. - Standard_EXPORT void UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights); + Standard_EXPORT void UpdateLightSourceStateTo (const Handle(Graphic3d_LightSet)& theLights, + Standard_Integer theSpecIBLMapLevels = 0); //! Invalidate state of OCCT light sources. Standard_EXPORT void UpdateLightSourceState(); @@ -443,6 +472,7 @@ public: //! Choose Shading Model for filled primitives. //! Fallbacks to FACET model if there are no normal attributes. + //! Fallbacks to corresponding non-PBR models if PBR is unavailable. Graphic3d_TypeOfShadingModel ChooseFaceShadingModel (Graphic3d_TypeOfShadingModel theCustomModel, bool theHasNodalNormals) const { @@ -460,12 +490,17 @@ public: case Graphic3d_TOSM_VERTEX: case Graphic3d_TOSM_FRAGMENT: return theHasNodalNormals ? aModel : Graphic3d_TOSM_FACET; + case Graphic3d_TOSM_PBR: + return PBRShadingModelFallback (theHasNodalNormals ? aModel : Graphic3d_TOSM_PBR_FACET, IsPbrAllowed()); + case Graphic3d_TOSM_PBR_FACET: + return PBRShadingModelFallback (aModel, IsPbrAllowed()); } return Graphic3d_TOSM_UNLIT; } //! Choose Shading Model for line primitives. //! Fallbacks to UNLIT model if there are no normal attributes. + //! Fallbacks to corresponding non-PBR models if PBR is unavailable. Graphic3d_TypeOfShadingModel ChooseLineShadingModel (Graphic3d_TypeOfShadingModel theCustomModel, bool theHasNodalNormals) const { @@ -483,6 +518,10 @@ public: case Graphic3d_TOSM_VERTEX: case Graphic3d_TOSM_FRAGMENT: return theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT; + case Graphic3d_TOSM_PBR: + return PBRShadingModelFallback (theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT, IsPbrAllowed()); + case Graphic3d_TOSM_PBR_FACET: + return Graphic3d_TOSM_UNLIT; } return Graphic3d_TOSM_UNLIT; } @@ -648,11 +687,13 @@ protected: { switch (theShadingModel) { - case Graphic3d_TOSM_UNLIT: return prepareStdProgramUnlit (theProgram, theBits, false); - case Graphic3d_TOSM_FACET: return prepareStdProgramPhong (theProgram, theBits, true); - case Graphic3d_TOSM_VERTEX: return prepareStdProgramGouraud(theProgram, theBits); + case Graphic3d_TOSM_UNLIT: return prepareStdProgramUnlit (theProgram, theBits, false); + case Graphic3d_TOSM_FACET: return prepareStdProgramPhong (theProgram, theBits, true); + case Graphic3d_TOSM_VERTEX: return prepareStdProgramGouraud(theProgram, theBits); case Graphic3d_TOSM_DEFAULT: - case Graphic3d_TOSM_FRAGMENT: return prepareStdProgramPhong (theProgram, theBits, false); + case Graphic3d_TOSM_FRAGMENT: return prepareStdProgramPhong (theProgram, theBits, false); + case Graphic3d_TOSM_PBR: return prepareStdProgramPhong (theProgram, theBits, false, true); + case Graphic3d_TOSM_PBR_FACET: return prepareStdProgramPhong (theProgram, theBits, true, true); } return false; } @@ -663,15 +704,19 @@ protected: //! Prepare standard GLSL program with per-pixel lighting. //! @param theIsFlatNormal when TRUE, the Vertex normals will be ignored and Face normal will be computed instead + //! @param theIsPBR when TRUE, the PBR pipeline will be activated Standard_EXPORT Standard_Boolean prepareStdProgramPhong (Handle(OpenGl_ShaderProgram)& theProgram, const Standard_Integer theBits, - const Standard_Boolean theIsFlatNormal = false); + const Standard_Boolean theIsFlatNormal = false, + const Standard_Boolean theIsPBR = false); //! Define computeLighting GLSL function depending on current lights configuration //! @param theNbLights [out] number of defined light sources //! @param theHasVertColor [in] flag to use getVertColor() instead of Ambient and Diffuse components of active material + //! @param theIsPBR [in] flag to activate PBR pipeline Standard_EXPORT TCollection_AsciiString stdComputeLighting (Standard_Integer& theNbLights, - Standard_Boolean theHasVertColor); + Standard_Boolean theHasVertColor, + Standard_Boolean theIsPBR); //! Bind specified program to current context and apply state. Standard_EXPORT Standard_Boolean bindProgramWithState (const Handle(OpenGl_ShaderProgram)& theProgram); @@ -697,6 +742,13 @@ protected: OpenGl_ShaderObject::ShaderVariableList& theStageInOuts, Standard_Integer theBits); + //! Prepare GLSL source for IBL generation used in PBR pipeline. + Standard_EXPORT Standard_Boolean preparePBREnvBakingProgram(); + + //! Checks whether one of PBR shading models is set as default model. + Standard_Boolean IsPbrAllowed() const { return myShadingModel == Graphic3d_TOSM_PBR + || myShadingModel == Graphic3d_TOSM_PBR_FACET; } + protected: //! Packed properties of light source @@ -769,12 +821,15 @@ protected: Handle(OpenGl_ShaderProgram) myOitCompositingProgram[2]; //!< standard program for OIT compositing (default and MSAA). OpenGl_MapOfShaderPrograms myMapOfLightPrograms; //!< map of lighting programs depending on lights configuration + Handle(OpenGl_ShaderProgram) myPBREnvBakingProgram;//!< program for IBL maps generation used in PBR pipeline Handle(Graphic3d_ShaderProgram) myBgCubeMapProgram; //!< program for background cubemap rendering Handle(OpenGl_ShaderProgram) myStereoPrograms[Graphic3d_StereoMode_NB]; //!< standard stereo programs Handle(OpenGl_VertexBuffer) myBoundBoxVertBuffer; //!< bounding box vertex buffer + mutable Handle(OpenGl_PBREnvironment) myPBREnvironment; //!< manager of IBL maps used in PBR pipeline + OpenGl_Context* myContext; //!< OpenGL context Standard_Boolean mySRgbState; //!< track sRGB state diff --git a/src/OpenGl/OpenGl_ShaderProgram.cxx b/src/OpenGl/OpenGl_ShaderProgram.cxx index b7cb81d16f..68b3af2f3f 100755 --- a/src/OpenGl/OpenGl_ShaderProgram.cxx +++ b/src/OpenGl/OpenGl_ShaderProgram.cxx @@ -56,38 +56,42 @@ Standard_CString OpenGl_ShaderProgram::PredefinedKeywords[] = "occWorldViewMatrixInverseTranspose", // OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE_TRANSPOSE "occProjectionMatrixInverseTranspose", // OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE - "occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS - "occClipPlaneChains", // OpenGl_OCC_CLIP_PLANE_CHAINS - "occClipPlaneCount", // OpenGl_OCC_CLIP_PLANE_COUNT - - "occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT - "occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES - "occLightSources", // OpenGl_OCC_LIGHT_SOURCE_PARAMS - "occLightAmbient", // OpenGl_OCC_LIGHT_AMBIENT - - "occTextureEnable", // OpenGl_OCCT_TEXTURE_ENABLE - "occDistinguishingMode", // OpenGl_OCCT_DISTINGUISH_MODE - "occFrontMaterial", // OpenGl_OCCT_FRONT_MATERIAL - "occBackMaterial", // OpenGl_OCCT_BACK_MATERIAL - "occAlphaCutoff", // OpenGl_OCCT_ALPHA_CUTOFF - "occColor", // OpenGl_OCCT_COLOR - - "occOitOutput", // OpenGl_OCCT_OIT_OUTPUT - "occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR - - "occTexTrsf2d", // OpenGl_OCCT_TEXTURE_TRSF2D - "occPointSize", // OpenGl_OCCT_POINT_SIZE - - "occViewport", // OpenGl_OCCT_VIEWPORT - "occLineWidth", // OpenGl_OCCT_LINE_WIDTH - "occLineFeather", // OpenGl_OCCT_LINE_FEATHER - "occStipplePattern", // OpenGl_OCCT_LINE_STIPPLE_PATTERN - "occStippleFactor", // OpenGl_OCCT_LINE_STIPPLE_FACTOR - "occWireframeColor", // OpenGl_OCCT_WIREFRAME_COLOR - "occIsQuadMode", // OpenGl_OCCT_QUAD_MODE_STATE - - "occOrthoScale", // OpenGl_OCCT_ORTHO_SCALE - "occSilhouetteThickness" // OpenGl_OCCT_SILHOUETTE_THICKNESS + "occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS + "occClipPlaneChains", // OpenGl_OCC_CLIP_PLANE_CHAINS + "occClipPlaneCount", // OpenGl_OCC_CLIP_PLANE_COUNT + + "occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT + "occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES + "occLightSources", // OpenGl_OCC_LIGHT_SOURCE_PARAMS + "occLightAmbient", // OpenGl_OCC_LIGHT_AMBIENT + + "occTextureEnable", // OpenGl_OCCT_TEXTURE_ENABLE + "occDistinguishingMode", // OpenGl_OCCT_DISTINGUISH_MODE + "occPbrFrontMaterial", // OpenGl_OCCT_PBR_FRONT_MATERIAL + "occPbrBackMaterial", // OpenGl_OCCT_PBR_BACK_MATERIAL + "occFrontMaterial", // OpenGl_OCCT_COMMON_FRONT_MATERIAL + "occBackMaterial", // OpenGl_OCCT_COMMON_BACK_MATERIAL + "occAlphaCutoff", // OpenGl_OCCT_ALPHA_CUTOFF + "occColor", // OpenGl_OCCT_COLOR + + "occOitOutput", // OpenGl_OCCT_OIT_OUTPUT + "occOitDepthFactor", // OpenGl_OCCT_OIT_DEPTH_FACTOR + + "occTexTrsf2d", // OpenGl_OCCT_TEXTURE_TRSF2D + "occPointSize", // OpenGl_OCCT_POINT_SIZE + + "occViewport", // OpenGl_OCCT_VIEWPORT + "occLineWidth", // OpenGl_OCCT_LINE_WIDTH + "occLineFeather", // OpenGl_OCCT_LINE_FEATHER + "occStipplePattern", // OpenGl_OCCT_LINE_STIPPLE_PATTERN + "occStippleFactor", // OpenGl_OCCT_LINE_STIPPLE_FACTOR + "occWireframeColor", // OpenGl_OCCT_WIREFRAME_COLOR + "occIsQuadMode", // OpenGl_OCCT_QUAD_MODE_STATE + + "occOrthoScale", // OpenGl_OCCT_ORTHO_SCALE + "occSilhouetteThickness", // OpenGl_OCCT_SILHOUETTE_THICKNESS + + "occNbSpecIBLLevels" // OpenGl_OCCT_NB_SPEC_IBL_LEVELS }; namespace @@ -409,6 +413,11 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)& { aHeaderConstants += "#define THE_HAS_DEFAULT_SAMPLER\n"; } + if (!myProxy.IsNull() + && myProxy->IsPBR()) + { + aHeaderConstants += "#define THE_IS_PBR\n"; + } const TCollection_AsciiString aSource = aHeaderVer // #version - header defining GLSL version, should be first + (!aHeaderVer.IsEmpty() ? "\n" : "") @@ -488,6 +497,18 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)& { SetUniform (theCtx, aLocSampler, GLint(theCtx->SpriteTextureUnit())); } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occDiffIBLMapSHCoeffs")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBRDiffIBLMapSHTexUnit())); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occSpecIBLMap")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBRSpecIBLMapTexUnit())); + } + if (const OpenGl_ShaderUniformLocation aLocSampler = GetUniformLocation (theCtx, "occEnvLUT")) + { + SetUniform (theCtx, aLocSampler, GLint(theCtx->PBREnvLUTTexUnit())); + } const TCollection_AsciiString aSamplerNamePrefix ("occSampler"); const Standard_Integer aNbUnitsMax = Max (theCtx->MaxCombinedTextureUnits(), Graphic3d_TextureUnit_NB); diff --git a/src/OpenGl/OpenGl_ShaderProgram.hxx b/src/OpenGl/OpenGl_ShaderProgram.hxx index 8016c6e82c..93252bbdb5 100755 --- a/src/OpenGl/OpenGl_ShaderProgram.hxx +++ b/src/OpenGl/OpenGl_ShaderProgram.hxx @@ -62,8 +62,10 @@ enum OpenGl_StateVariable // Material state OpenGl_OCCT_TEXTURE_ENABLE, OpenGl_OCCT_DISTINGUISH_MODE, - OpenGl_OCCT_FRONT_MATERIAL, - OpenGl_OCCT_BACK_MATERIAL, + OpenGl_OCCT_PBR_FRONT_MATERIAL, + OpenGl_OCCT_PBR_BACK_MATERIAL, + OpenGl_OCCT_COMMON_FRONT_MATERIAL, + OpenGl_OCCT_COMMON_BACK_MATERIAL, OpenGl_OCCT_ALPHA_CUTOFF, OpenGl_OCCT_COLOR, @@ -88,6 +90,9 @@ enum OpenGl_StateVariable OpenGl_OCCT_ORTHO_SCALE, OpenGl_OCCT_SILHOUETTE_THICKNESS, + // PBR state + OpenGl_OCCT_NB_SPEC_IBL_LEVELS, + // DON'T MODIFY THIS ITEM (insert new items before it) OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES }; diff --git a/src/OpenGl/OpenGl_ShaderStates.hxx b/src/OpenGl/OpenGl_ShaderStates.hxx index eaa5abe337..bebd349cbc 100755 --- a/src/OpenGl/OpenGl_ShaderStates.hxx +++ b/src/OpenGl/OpenGl_ShaderStates.hxx @@ -122,7 +122,7 @@ class OpenGl_LightSourceState : public OpenGl_StateInterface public: //! Creates uninitialized state of light sources. - OpenGl_LightSourceState() {} + OpenGl_LightSourceState() : mySpecIBLMapLevels (0) {} //! Sets new light sources. void Set (const Handle(Graphic3d_LightSet)& theLightSources) { myLightSources = theLightSources; } @@ -130,9 +130,17 @@ public: //! Returns current list of light sources. const Handle(Graphic3d_LightSet)& LightSources() const { return myLightSources; } + //! Returns number of mipmap levels used in specular IBL map. + //! 0 by default or in case of using non-PBR shading model. + Standard_Integer SpecIBLMapLevels() const { return mySpecIBLMapLevels; } + + //! Sets number of mipmap levels used in specular IBL map. + void SetSpecIBLMapLevels(Standard_Integer theSpecIBLMapLevels) { mySpecIBLMapLevels = theSpecIBLMapLevels; } + private: - Handle(Graphic3d_LightSet) myLightSources; //!< List of OCCT light sources + Handle(Graphic3d_LightSet) myLightSources; //!< List of OCCT light sources + Standard_Integer mySpecIBLMapLevels; //!< Number of mipmap levels used in specular IBL map (0 by default or in case of using non-PBR shading model) }; diff --git a/src/OpenGl/OpenGl_Texture.cxx b/src/OpenGl/OpenGl_Texture.cxx index a6553ac405..aa01fac17b 100644 --- a/src/OpenGl/OpenGl_Texture.cxx +++ b/src/OpenGl/OpenGl_Texture.cxx @@ -563,7 +563,7 @@ bool OpenGl_Texture::Init (const Handle(OpenGl_Context)& theCtx, { case Graphic3d_TOT_CUBEMAP: { - return initCubeMap (theCtx, Handle(Graphic3d_CubeMap)::DownCast(theTextureMap), + return InitCubeMap (theCtx, Handle(Graphic3d_CubeMap)::DownCast(theTextureMap), 0, Image_Format_RGB, false, theTextureMap->IsColorMap()); } default: @@ -793,10 +793,10 @@ bool OpenGl_Texture::Init3D (const Handle(OpenGl_Context)& theCtx, } // ======================================================================= -// function : initCubeMap +// function : InitCubeMap // purpose : // ======================================================================= -bool OpenGl_Texture::initCubeMap (const Handle(OpenGl_Context)& theCtx, +bool OpenGl_Texture::InitCubeMap (const Handle(OpenGl_Context)& theCtx, const Handle(Graphic3d_CubeMap)& theCubeMap, Standard_Size theSize, Image_Format theFormat, @@ -811,6 +811,7 @@ bool OpenGl_Texture::initCubeMap (const Handle(OpenGl_Context)& theCtx, if (!theCubeMap.IsNull()) { + theToGenMipmap = theCubeMap->HasMipmaps(); if (Handle(Image_PixMap) anImage = theCubeMap->Reset().Value()) { theSize = anImage->SizeX(); @@ -836,6 +837,8 @@ bool OpenGl_Texture::initCubeMap (const Handle(OpenGl_Context)& theCtx, myTarget = GL_TEXTURE_CUBE_MAP; myHasMipmaps = theToGenMipmap; myNbSamples = 1; + mySizeX = (GLsizei )theSize; + mySizeY = (GLsizei )theSize; Bind (theCtx); applyDefaultSamplerParams (theCtx); @@ -991,6 +994,10 @@ Standard_Size OpenGl_Texture::EstimatedDataSize() const { aSize *= Standard_Size(mySizeZ); } + if (myTarget == GL_TEXTURE_CUBE_MAP) + { + aSize *= 6; // cube sides + } if (myHasMipmaps) { aSize = aSize + aSize / 3; diff --git a/src/OpenGl/OpenGl_Texture.hxx b/src/OpenGl/OpenGl_Texture.hxx index a9520d370f..084128626d 100644 --- a/src/OpenGl/OpenGl_Texture.hxx +++ b/src/OpenGl/OpenGl_Texture.hxx @@ -245,11 +245,6 @@ public: return Init3D (theCtx, aFormat, Graphic3d_Vec3i (theSizeX, theSizeY, theSizeZ), thePixels); } -protected: - - //! Apply default sampler parameters after texture creation. - Standard_EXPORT void applyDefaultSamplerParams (const Handle(OpenGl_Context)& theCtx); - //! Initializes 6 sides of cubemap. //! If theCubeMap is not NULL then size and format will be taken from it and corresponding arguments will be ignored. //! Otherwise this parametres will be taken from arguments. @@ -259,13 +254,18 @@ protected: //! @param theFormat [in] image format //! @param theToGenMipmap [in] flag to generate mipmaped cubemap //! @param theIsColorMap [in] flag indicating cubemap storing color values - Standard_EXPORT bool initCubeMap (const Handle(OpenGl_Context)& theCtx, + Standard_EXPORT bool InitCubeMap (const Handle(OpenGl_Context)& theCtx, const Handle(Graphic3d_CubeMap)& theCubeMap, Standard_Size theSize, Image_Format theFormat, Standard_Boolean theToGenMipmap, Standard_Boolean theIsColorMap); +protected: + + //! Apply default sampler parameters after texture creation. + Standard_EXPORT void applyDefaultSamplerParams (const Handle(OpenGl_Context)& theCtx); + protected: Handle(OpenGl_Sampler) mySampler; //!< texture sampler diff --git a/src/OpenGl/OpenGl_TextureFormat.cxx b/src/OpenGl/OpenGl_TextureFormat.cxx index 851032b36a..30c70189a4 100644 --- a/src/OpenGl/OpenGl_TextureFormat.cxx +++ b/src/OpenGl/OpenGl_TextureFormat.cxx @@ -31,7 +31,7 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte aFormat.SetNbComponents (1); if (theCtx->core11 == NULL) { - aFormat.SetInternalFormat (GL_R8); // GL_R32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8); aFormat.SetPixelFormat (GL_RED); } else @@ -51,7 +51,7 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte aFormat.SetNbComponents (1); if (theCtx->core11 == NULL) { - aFormat.SetInternalFormat (GL_R8); // GL_R32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_R32F : GL_R8); aFormat.SetPixelFormat (GL_RED); } else @@ -66,10 +66,22 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte aFormat.SetDataType (GL_FLOAT); return aFormat; } + case Image_Format_RGF: + { + if (!theCtx->arbTexRG) + { + return OpenGl_TextureFormat(); + } + aFormat.SetNbComponents (2); + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RG32F : GL_RG8); + aFormat.SetPixelFormat (GL_RG); + aFormat.SetDataType (GL_FLOAT); + return aFormat; + } case Image_Format_RGBAF: { aFormat.SetNbComponents (4); - aFormat.SetInternalFormat (GL_RGBA8); // GL_RGBA32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8); aFormat.SetPixelFormat (GL_RGBA); aFormat.SetDataType (GL_FLOAT); return aFormat; @@ -81,7 +93,7 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte return OpenGl_TextureFormat(); } aFormat.SetNbComponents (4); - aFormat.SetInternalFormat (GL_RGBA8); // GL_RGBA32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGBA32F : GL_RGBA8); aFormat.SetPixelFormat (GL_BGRA_EXT); // equals to GL_BGRA aFormat.SetDataType (GL_FLOAT); return aFormat; @@ -89,7 +101,7 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte case Image_Format_RGBF: { aFormat.SetNbComponents (3); - aFormat.SetInternalFormat (GL_RGB8); // GL_RGB32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8); aFormat.SetPixelFormat (GL_RGB); aFormat.SetDataType (GL_FLOAT); return aFormat; @@ -98,7 +110,7 @@ OpenGl_TextureFormat OpenGl_TextureFormat::FindFormat (const Handle(OpenGl_Conte { #if !defined(GL_ES_VERSION_2_0) aFormat.SetNbComponents (3); - aFormat.SetInternalFormat (GL_RGB8); // GL_RGB32F + aFormat.SetInternalFormat (theCtx->arbTexFloat ? GL_RGB32F : GL_RGB8); aFormat.SetPixelFormat (GL_BGR); // equals to GL_BGR_EXT aFormat.SetDataType (GL_FLOAT); return aFormat; diff --git a/src/OpenGl/OpenGl_View.cxx b/src/OpenGl/OpenGl_View.cxx index 4179fa2bea..b5d5c23635 100644 --- a/src/OpenGl/OpenGl_View.cxx +++ b/src/OpenGl/OpenGl_View.cxx @@ -72,6 +72,8 @@ OpenGl_View::OpenGl_View (const Handle(Graphic3d_StructureManager)& theMgr, myTextureParams (new OpenGl_Aspects()), myCubeMapParams (new OpenGl_Aspects()), myBackgroundType (Graphic3d_TOB_NONE), + myPBREnvState (OpenGl_PBREnvState_NONEXISTENT), + myPBREnvRequest (OpenGl_PBREnvRequest_NONE), // ray-tracing fields initialization myRaytraceInitStatus (OpenGl_RT_NONE), myIsRaytraceDataValid (Standard_False), @@ -202,6 +204,11 @@ void OpenGl_View::ReleaseGlResources (const Handle(OpenGl_Context)& theCtx) releaseSrgbResources (theCtx); releaseRaytraceResources (theCtx); + + if (!myPBREnvironment.IsNull()) + { + myPBREnvironment->Release (theCtx.get()); + } } // ======================================================================= @@ -530,37 +537,56 @@ Handle(Graphic3d_CubeMap) OpenGl_View::BackgroundCubeMap() const { return myBackgroundCubeMap; } + +// ======================================================================= +// function : SpecIBLMapLevels +// purpose : +// ======================================================================= +unsigned int OpenGl_View::SpecIBLMapLevels() const +{ + return myPBREnvironment.IsNull() ? 0 : myPBREnvironment->SpecMapLevelsNumber(); +} // ======================================================================= // function : SetBackgroundCubeMap // purpose : // ======================================================================= -void OpenGl_View::SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) +void OpenGl_View::SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Boolean theToUpdatePBREnv) { myBackgroundCubeMap = theCubeMap; - Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d; - Handle(Graphic3d_TextureSet) aTextureSet = new Graphic3d_TextureSet (myBackgroundCubeMap); + if (theCubeMap.IsNull()) + { + if (theToUpdatePBREnv) + { + myPBREnvRequest = OpenGl_PBREnvRequest_CLEAR; + } + if (myBackgroundType == Graphic3d_TOB_CUBEMAP) + { + myBackgroundType = Graphic3d_TOB_NONE; + } + return; + } - anAspect->SetInteriorStyle(Aspect_IS_SOLID); - anAspect->SetSuppressBackFaces(false); - anAspect->SetTextureSet(aTextureSet); + theCubeMap ->SetMipmapsGeneration (Standard_True); + Handle(Graphic3d_AspectFillArea3d) anAspect = new Graphic3d_AspectFillArea3d(); + Handle(Graphic3d_TextureSet) aTextureSet = new Graphic3d_TextureSet (myBackgroundCubeMap); + anAspect->SetInteriorStyle (Aspect_IS_SOLID); + anAspect->SetSuppressBackFaces (false); + anAspect->SetTextureSet (aTextureSet); const Handle(OpenGl_Context)& aCtx = myWorkspace->GetGlContext(); if (!aCtx.IsNull()) { anAspect->SetShaderProgram (aCtx->ShaderManager()->GetBgCubeMapProgram()); } + anAspect->SetTextureMapOn (theCubeMap->IsDone()); + myCubeMapParams->SetAspect (anAspect); - if (theCubeMap->IsDone()) + if (theToUpdatePBREnv) { - anAspect->SetTextureMapOn(); - } - else - { - anAspect->SetTextureMapOff(); + myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; } - - myCubeMapParams->SetAspect(anAspect); const OpenGl_Aspects* anAspectsBackup = myWorkspace->SetAspects (myCubeMapParams); myWorkspace->ApplyAspects(); myWorkspace->SetAspects (anAspectsBackup); diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx index daf3f8a84d..ddf1b537c9 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -57,6 +57,7 @@ struct OpenGl_Matrix; class Graphic3d_StructureManager; class OpenGl_GraphicDriver; +class OpenGl_PBREnvironment; class OpenGl_StateCounter; class OpenGl_TriangleSet; class OpenGl_Workspace; @@ -226,7 +227,27 @@ public: Standard_EXPORT Handle(Graphic3d_CubeMap) BackgroundCubeMap() const Standard_OVERRIDE; //! Sets environment cubemap as background. - Standard_EXPORT virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap) Standard_OVERRIDE; + //! @param theCubeMap cubemap source to be set as background + //! @param theToUpdatePBREnv defines whether IBL maps will be generated or not (see 'GeneratePBREnvironment') + Standard_EXPORT virtual void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Boolean theToUpdatePBREnv = Standard_True) Standard_OVERRIDE; + + //! Generates PBR specular probe and irradiance map + //! in order to provide environment indirect illumination in PBR shading model (Image Based Lighting). + //! The source of environment data is background cubemap. + //! If PBR is unavailable it does nothing. + //! If PBR is available but there is no cubemap being set to background it clears all IBL maps (see 'ClearPBREnvironment'). + virtual void GeneratePBREnvironment() Standard_OVERRIDE { myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; } + + //! Fills PBR specular probe and irradiance map with white color. + //! So that environment indirect illumination will be constant + //! and will be fully controlled by ambient light sources. + //! If PBR is unavailable it does nothing. + virtual void ClearPBREnvironment() Standard_OVERRIDE { myPBREnvRequest = OpenGl_PBREnvRequest_CLEAR; } + + //! Returns number of mipmap levels used in specular IBL map. + //! 0 if PBR environment is not created. + Standard_EXPORT unsigned int SpecIBLMapLevels() const; //! Returns environment texture set for the view. virtual Handle(Graphic3d_TextureEnv) TextureEnv() const Standard_OVERRIDE { return myTextureEnvData; } @@ -518,10 +539,48 @@ protected: //! @name Background parameters OpenGl_Aspects* myTextureParams; //!< Stores texture and its parameters for textured background OpenGl_Aspects* myCubeMapParams; //!< Stores cubemap and its parameters for cubemap background - Handle(Graphic3d_CubeMap) myBackgroundCubeMap; //!< Cubemap has been setted as background - Graphic3d_TypeOfBackground myBackgroundType; //!< Current typy of background + Handle(Graphic3d_CubeMap) myBackgroundCubeMap; //!< Cubemap has been set as background + Graphic3d_TypeOfBackground myBackgroundType; //!< Current type of background OpenGl_BackgroundArray* myBackgrounds[Graphic3d_TypeOfBackground_NB]; //!< Array of primitive arrays of different background types +protected: //! @name methods related to PBR + + //! Checks whether PBR is available. + Standard_EXPORT Standard_Boolean checkPBRAvailability() const; + + //! Generates IBL maps used in PBR pipeline. + //! If background cubemap is not set clears all IBL maps. + Standard_EXPORT void bakePBREnvironment (const Handle(OpenGl_Context)& theCtx); + + //! Fills all IBL maps with white color. + //! So that environment lighting is considered to be constant and is completely controls by ambient light sources. + Standard_EXPORT void clearPBREnvironment (const Handle(OpenGl_Context)& theCtx); + + //! Process requests to generate or to clear PBR environment. + Standard_EXPORT void processPBREnvRequest (const Handle(OpenGl_Context)& theCtx); + +protected: //! @name fields and types related to PBR + + //! State of PBR environment. + enum PBREnvironmentState + { + OpenGl_PBREnvState_NONEXISTENT, + OpenGl_PBREnvState_UNAVAILABLE, // indicates failed try to create PBR environment + OpenGl_PBREnvState_CREATED + }; + + //! Type of action which can be done with PBR environment. + enum PBREnvironmentRequest + { + OpenGl_PBREnvRequest_NONE, + OpenGl_PBREnvRequest_BAKE, + OpenGl_PBREnvRequest_CLEAR + }; + + Handle(OpenGl_PBREnvironment) myPBREnvironment; //!< manager of IBL maps used in PBR pipeline + PBREnvironmentState myPBREnvState; //!< state of PBR environment + PBREnvironmentRequest myPBREnvRequest; //!< type of action is requested to be done with PBR environment + protected: //! @name data types related to ray-tracing //! Result of OpenGL shaders initialization. diff --git a/src/OpenGl/OpenGl_View_Redraw.cxx b/src/OpenGl/OpenGl_View_Redraw.cxx index 98354d4393..d46bc855e3 100644 --- a/src/OpenGl/OpenGl_View_Redraw.cxx +++ b/src/OpenGl/OpenGl_View_Redraw.cxx @@ -39,6 +39,8 @@ #include #include +#include "../Textures/Textures_EnvLUT.pxx" + namespace { //! Format Frame Buffer format for logging messages. @@ -344,6 +346,65 @@ void OpenGl_View::Redraw() } } + // process PBR environment + if (myShadingModel == Graphic3d_TOSM_PBR + || myShadingModel == Graphic3d_TOSM_PBR_FACET) + { + if (!myPBREnvironment.IsNull() + && myPBREnvironment->SizesAreDifferent (myRenderParams.PbrEnvPow2Size, + myRenderParams.PbrEnvSpecMapNbLevels)) + { + myPBREnvironment->Release (aCtx.get()); + myPBREnvironment.Nullify(); + myPBREnvState = OpenGl_PBREnvState_NONEXISTENT; + myPBREnvRequest = OpenGl_PBREnvRequest_BAKE; + ++myLightsRevision; + } + + if (myPBREnvState == OpenGl_PBREnvState_NONEXISTENT + && aCtx->HasPBR()) + { + myPBREnvironment = OpenGl_PBREnvironment::Create (aCtx, myRenderParams.PbrEnvPow2Size, myRenderParams.PbrEnvSpecMapNbLevels); + myPBREnvState = myPBREnvironment.IsNull() ? OpenGl_PBREnvState_UNAVAILABLE : OpenGl_PBREnvState_CREATED; + if (myPBREnvState == OpenGl_PBREnvState_CREATED) + { + Handle(OpenGl_Texture) anEnvLUT; + static const TCollection_AsciiString THE_SHARED_ENV_LUT_KEY("EnvLUT"); + if (!aCtx->GetResource (THE_SHARED_ENV_LUT_KEY, anEnvLUT)) + { + Handle(Graphic3d_TextureParams) aParams = new Graphic3d_TextureParams(); + aParams->SetFilter (Graphic3d_TOTF_BILINEAR); + aParams->SetRepeat (Standard_False); + aParams->SetTextureUnit (aCtx->PBREnvLUTTexUnit()); + anEnvLUT = new OpenGl_Texture(THE_SHARED_ENV_LUT_KEY, aParams); + Handle(Image_PixMap) aPixMap = new Image_PixMap(); + aPixMap->InitWrapper (Image_Format_RGF, (Standard_Byte*)Textures_EnvLUT, Textures_EnvLUTSize, Textures_EnvLUTSize); + OpenGl_TextureFormat aTexFormat = OpenGl_TextureFormat::FindFormat (aCtx, aPixMap->Format(), false); + #if defined(GL_ES_VERSION_2_0) + // GL_RG32F is not texture-filterable format on OpenGL ES without OES_texture_float_linear extension. + // GL_RG16F is texture-filterable since OpenGL ES 3.0 and can be initialized from 32-bit floats. + // Note that it is expected that GL_RG16F has enough precision for this table, so that it can be used also on desktop OpenGL. + //if (!aCtx->hasTexFloatLinear) + aTexFormat.SetInternalFormat (GL_RG16F); + #endif + if (!aTexFormat.IsValid() + || !anEnvLUT->Init (aCtx, aTexFormat, Graphic3d_Vec2i((Standard_Integer)Textures_EnvLUTSize), Graphic3d_TOT_2D, aPixMap.get())) + { + aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Failed allocation of LUT for PBR"); + anEnvLUT.Nullify(); + } + aCtx->ShareResource (THE_SHARED_ENV_LUT_KEY, anEnvLUT); + } + if (!anEnvLUT.IsNull()) + { + anEnvLUT->Bind (aCtx); + } + myWorkspace->ApplyAspects(); + } + } + processPBREnvRequest (aCtx); + } + // create color and coverage accumulation buffers required for OIT algorithm if (toUseOit) { @@ -938,7 +999,7 @@ void OpenGl_View::render (Graphic3d_Camera::Projection theProjection, || aLightsRevision != myLightsRevision) { myLightsRevision = aLightsRevision; - aManager->UpdateLightSourceStateTo (aLights); + aManager->UpdateLightSourceStateTo (aLights, SpecIBLMapLevels()); myLastLightSourceState = StateInfo (myCurrLightSourceState, aManager->LightSourceState().Index()); } @@ -1020,7 +1081,7 @@ void OpenGl_View::render (Graphic3d_Camera::Projection theProjection, } #endif - aManager->SetShadingModel (myShadingModel); + aManager->SetShadingModel (OpenGl_ShaderManager::PBRShadingModelFallback (myShadingModel, checkPBRAvailability())); // Redraw 3d scene if (theProjection == Graphic3d_Camera::Projection_MonoLeftEye) @@ -1848,3 +1909,64 @@ bool OpenGl_View::chooseOitColorConfiguration (const Handle(OpenGl_Context)& the } return false; // color combination does not exist } + +// ======================================================================= +// function : checkPBRAvailability +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_View::checkPBRAvailability() const +{ + return myWorkspace->GetGlContext()->HasPBR() + && !myPBREnvironment.IsNull(); +} + +// ======================================================================= +// function : bakePBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::bakePBREnvironment (const Handle(OpenGl_Context)& theCtx) +{ + const Handle(OpenGl_TextureSet)& aTextureSet = myCubeMapParams->TextureSet (theCtx); + if (!aTextureSet.IsNull() + && !aTextureSet->IsEmpty()) + { + myPBREnvironment->Bake (theCtx, + aTextureSet->First(), + myBackgroundCubeMap->ZIsInverted(), + myBackgroundCubeMap->IsTopDown(), + myRenderParams.PbrEnvBakingDiffNbSamples, + myRenderParams.PbrEnvBakingSpecNbSamples, + myRenderParams.PbrEnvBakingProbability); + } + else + { + myPBREnvironment->Clear (theCtx); + } +} + +// ======================================================================= +// function : clearPBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::clearPBREnvironment (const Handle(OpenGl_Context)& theCtx) +{ + myPBREnvironment->Clear (theCtx); +} + +// ======================================================================= +// function : clearPBREnvironment +// purpose : +// ======================================================================= +void OpenGl_View::processPBREnvRequest (const Handle(OpenGl_Context)& theCtx) +{ + if (myPBREnvState == OpenGl_PBREnvState_CREATED) + { + switch (myPBREnvRequest) + { + case OpenGl_PBREnvRequest_NONE: return; + case OpenGl_PBREnvRequest_BAKE: bakePBREnvironment (theCtx); break; + case OpenGl_PBREnvRequest_CLEAR: clearPBREnvironment (theCtx); break; + } + } + myPBREnvRequest = OpenGl_PBREnvRequest_NONE; +} diff --git a/src/OpenGl/OpenGl_Workspace.cxx b/src/OpenGl/OpenGl_Workspace.cxx index edfe12b7d3..22f1449efa 100644 --- a/src/OpenGl/OpenGl_Workspace.cxx +++ b/src/OpenGl/OpenGl_Workspace.cxx @@ -58,36 +58,42 @@ void OpenGl_Material::Init (const OpenGl_Context& theCtx, const Graphic3d_MaterialAspect& theMat, const Quantity_Color& theInteriorColor) { - ChangeShine() = 128.0f * theMat.Shininess(); - ChangeTransparency() = theMat.Alpha(); + Common.ChangeShine() = 128.0f * theMat.Shininess(); + Common.ChangeTransparency() = theMat.Alpha(); + + Pbr.ChangeMetallic() = theMat.PBRMaterial().Metallic(); + Pbr.ChangeRoughness() = theMat.PBRMaterial().NormalizedRoughness(); + Pbr.EmissionIOR = Graphic3d_Vec4 (theMat.PBRMaterial().Emission(), theMat.PBRMaterial().IOR()); const OpenGl_Vec3& aSrcAmb = theMat.AmbientColor(); const OpenGl_Vec3& aSrcDif = theMat.DiffuseColor(); const OpenGl_Vec3& aSrcSpe = theMat.SpecularColor(); const OpenGl_Vec3& aSrcEms = theMat.EmissiveColor(); - Specular.SetValues (aSrcSpe, 1.0f); // interior color is ignored for Specular + Common.Specular.SetValues (aSrcSpe, 1.0f); // interior color is ignored for Specular switch (theMat.MaterialType()) { case Graphic3d_MATERIAL_ASPECT: { - Ambient .SetValues (aSrcAmb * theInteriorColor, 1.0f); - Diffuse .SetValues (aSrcDif * theInteriorColor, 1.0f); - Emission.SetValues (aSrcEms * theInteriorColor, 1.0f); + Common.Ambient .SetValues (aSrcAmb * theInteriorColor, 1.0f); + Common.Diffuse .SetValues (aSrcDif * theInteriorColor, 1.0f); + Common.Emission.SetValues (aSrcEms * theInteriorColor, 1.0f); + Pbr .BaseColor.SetValues (theInteriorColor, theMat.Alpha()); break; } case Graphic3d_MATERIAL_PHYSIC: { - Ambient .SetValues (aSrcAmb, 1.0f); - Diffuse .SetValues (aSrcDif, 1.0f); - Emission.SetValues (aSrcEms, 1.0f); + Common.Ambient .SetValues (aSrcAmb, 1.0f); + Common.Diffuse .SetValues (aSrcDif, 1.0f); + Common.Emission.SetValues (aSrcEms, 1.0f); + Pbr.BaseColor = theMat.PBRMaterial().Color(); break; } } - Ambient = theCtx.Vec4FromQuantityColor (Ambient); - Diffuse = theCtx.Vec4FromQuantityColor (Diffuse); - Specular = theCtx.Vec4FromQuantityColor (Specular); - Emission = theCtx.Vec4FromQuantityColor (Emission); + Common.Ambient = theCtx.Vec4FromQuantityColor (Common.Ambient); + Common.Diffuse = theCtx.Vec4FromQuantityColor (Common.Diffuse); + Common.Specular = theCtx.Vec4FromQuantityColor (Common.Specular); + Common.Emission = theCtx.Vec4FromQuantityColor (Common.Emission); } // ======================================================================= @@ -310,6 +316,14 @@ const OpenGl_Aspects* OpenGl_Workspace::ApplyAspects() myGlContext->BindTextures (myEnvironmentTexture); } + if ((myView->myShadingModel == Graphic3d_TOSM_PBR + || myView->myShadingModel == Graphic3d_TOSM_PBR_FACET) + && !myView->myPBREnvironment.IsNull() + && myView->myPBREnvironment->IsNeededToBeBound()) + { + myView->myPBREnvironment->Bind (myGlContext); + } + myAspectsApplied = myAspectsSet->Aspect(); return myAspectsSet; } diff --git a/src/Shaders/Declarations.glsl b/src/Shaders/Declarations.glsl index d0c4f1ec97..53a45bcaaf 100644 --- a/src/Shaders/Declarations.glsl +++ b/src/Shaders/Declarations.glsl @@ -21,6 +21,8 @@ #define occTexture1D texture #define occTexture2D texture #define occTexture3D texture + #define occTextureCube texture + #define occTextureCubeLod textureLod #else #define THE_ATTRIBUTE attribute #define THE_SHADER_IN varying @@ -29,10 +31,16 @@ #define occTexture1D texture1D #define occTexture2D texture2D #define occTexture3D texture3D + #define occTextureCube textureCube + #define occTextureCubeLod textureCubeLod #endif #ifdef GL_ES - #define THE_PREC_ENUM lowp // enumerations should fit into lowp range +#if (__VERSION__ >= 300) + #define THE_PREC_ENUM highp // lowp should be enough for enums but triggers driver bugs +#else + #define THE_PREC_ENUM lowp +#endif #else #define THE_PREC_ENUM #endif @@ -85,6 +93,15 @@ void occSetFragColor (in vec4 theColor); #endif +// Pi number definitions +#define PI 3.141592654 +#define PI_2 6.283185307 +#define PI_DIV_2 1.570796327 +#define PI_DIV_3 1.047197551 +#define PI_DIV_4 0.785398163 +#define INV_PI 0.318309886 +#define INV_PI_2 0.159154943 + // Matrix state uniform mat4 occWorldViewMatrix; //!< World-view matrix uniform mat4 occProjectionMatrix; //!< Projection matrix @@ -102,6 +119,15 @@ uniform mat4 occWorldViewMatrixInverseTranspose; //!< Transpose of the inverse uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix +#if defined(THE_IS_PBR) +uniform sampler2D occEnvLUT; //!< Environment Lookup Table +uniform sampler2D occDiffIBLMapSHCoeffs; //!< Packed diffuse (irradiance) IBL map's spherical harmonics coefficients +uniform samplerCube occSpecIBLMap; //!< Specular IBL map +uniform int occNbSpecIBLLevels; //!< Number of mipmap levels used in occSpecIBLMap to store different roughness values maps + +vec3 occDiffIBLMap (in vec3 theNormal); //!< Unpacks spherical harmonics coefficients to diffuse IBL map's values +#endif + // light type enumeration (same as Graphic3d_TypeOfLightSource) const int OccLightType_Direct = 1; //!< directional light source const int OccLightType_Point = 2; //!< isotropic point light source @@ -116,7 +142,7 @@ uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sour #define occLight_Type(theId) occLightSourcesTypes[theId].x //! Is light a headlight, int? -#define occLight_IsHeadlight(theId) occLightSourcesTypes[theId].y +#define occLight_IsHeadlight(theId) (occLightSourcesTypes[theId].y != 0) //! Specular intensity (equals to diffuse), vec4. #define occLight_Specular(theId) occLightSources[theId * 4 + 0] @@ -133,6 +159,11 @@ uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sour //! Attenuation of the spot light intensity (from 0 to 1), float. #define occLight_SpotExponent(theId) occLightSources[theId * 4 + 3].w +#if defined(THE_IS_PBR) +//! Intensity of light source (>= 0), float. +#define occLight_Intensity(theId) occLightSources[theId * 4 + 0].a +#else + //! Diffuse intensity (equals to Specular), vec4. #define occLight_Diffuse(theId) occLightSources[theId * 4 + 0] @@ -142,22 +173,44 @@ uniform THE_PREC_ENUM int occLightSourcesCount; //!< Total number of light sour //! Linear attenuation factor of positional light source, float. #define occLight_LinearAttenuation(theId) occLightSources[theId * 4 + 3].y #endif +#endif + +// Converts roughness value from range [0, 1] to real value for calculations +float occRoughness (in float theNormalizedRoughness); // Front material properties accessors -vec4 occFrontMaterial_Emission(void); //!< Emission color -vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection -vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection -vec4 occFrontMaterial_Specular(void); //!< Specular reflection -float occFrontMaterial_Shininess(void); //!< Specular exponent -float occFrontMaterial_Transparency(void); //!< Transparency coefficient +#if !defined(THE_IS_PBR) +vec4 occFrontMaterial_Emission(void); //!< Emission color +vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection +vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection +vec4 occFrontMaterial_Specular(void); //!< Specular reflection +float occFrontMaterial_Shininess(void); //!< Specular exponent +float occFrontMaterial_Transparency(void); //!< Transparency coefficient +#else +vec4 occPBRFrontMaterial_Color(void); //!< Base color of PBR material +float occPBRFrontMaterial_Metallic(void); //!< Metallic coefficient +float occPBRFrontMaterial_Roughness(void); //!< Roughness coefficient +float occPBRFrontMaterial_NormalizedRoughness(void); //!< Normalized roughness coefficient +vec3 occPBRFrontMaterial_Emission(void); //!< Light intensity emitted by material +float occPBRFrontMaterial_IOR(void); //!< Index of refraction +#endif // Back material properties accessors -vec4 occBackMaterial_Emission(void); //!< Emission color -vec4 occBackMaterial_Ambient(void); //!< Ambient reflection -vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection -vec4 occBackMaterial_Specular(void); //!< Specular reflection -float occBackMaterial_Shininess(void); //!< Specular exponent -float occBackMaterial_Transparency(void); //!< Transparency coefficient +#if !defined(THE_IS_PBR) +vec4 occBackMaterial_Emission(void); //!< Emission color +vec4 occBackMaterial_Ambient(void); //!< Ambient reflection +vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection +vec4 occBackMaterial_Specular(void); //!< Specular reflection +float occBackMaterial_Shininess(void); //!< Specular exponent +float occBackMaterial_Transparency(void); //!< Transparency coefficient +#else +vec4 occPBRBackMaterial_Color(void); //!< Base color of PBR material +float occPBRBackMaterial_Metallic(void); //!< Metallic coefficient +float occPBRBackMaterial_Roughness(void); //!< Roughness coefficient +float occPBRBackMaterial_NormalizedRoughness(void); //!< Normalized roughness coefficient +vec3 occPBRBackMaterial_Emission(void); //!< Light intensity emitted by material +float occPBRBackMaterial_IOR(void); //!< Index of refraction +#endif #ifdef THE_HAS_DEFAULT_SAMPLER #define occActiveSampler occSampler0 //!< alias for backward compatibility diff --git a/src/Shaders/DeclarationsImpl.glsl b/src/Shaders/DeclarationsImpl.glsl index 37ac72b1d8..047c159443 100644 --- a/src/Shaders/DeclarationsImpl.glsl +++ b/src/Shaders/DeclarationsImpl.glsl @@ -19,15 +19,59 @@ void occSetFragColor (in vec4 theColor) #if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0) // arrays of light sources -uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters +uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types +#endif + +#if defined(THE_IS_PBR) +vec3 occDiffIBLMap (in vec3 theNormal) +{ + vec3 aSHCoeffs[9]; + for (int i = 0; i < 9; ++i) + { + aSHCoeffs[i] = occTexture2D (occDiffIBLMapSHCoeffs, vec2 ((float(i) + 0.5) / 9.0, 0.0)).rgb; + } + return aSHCoeffs[0] + + + aSHCoeffs[1] * theNormal.x + + aSHCoeffs[2] * theNormal.y + + aSHCoeffs[3] * theNormal.z + + + aSHCoeffs[4] * theNormal.x * theNormal.z + + aSHCoeffs[5] * theNormal.y * theNormal.z + + aSHCoeffs[6] * theNormal.x * theNormal.y + + + aSHCoeffs[7] * (3.0 * theNormal.z * theNormal.z - 1.0) + + aSHCoeffs[8] * (theNormal.x * theNormal.x - theNormal.y * theNormal.y); +} #endif -// material state +// front and back material properties accessors +#if defined(THE_IS_PBR) +uniform vec4 occPbrFrontMaterial[3]; +uniform vec4 occPbrBackMaterial[3]; + +#define MIN_ROUGHNESS 0.01 +// Converts roughness value from range [0, 1] to real value for calculations +float occRoughness (in float theNormalizedRoughness) { return theNormalizedRoughness * (1.0 - MIN_ROUGHNESS) + MIN_ROUGHNESS; } + +vec4 occPBRFrontMaterial_Color(void) { return occPbrFrontMaterial[0]; } +vec3 occPBRFrontMaterial_Emission(void) { return occPbrFrontMaterial[1].rgb; } +float occPBRFrontMaterial_IOR(void) { return occPbrFrontMaterial[1].w; } +float occPBRFrontMaterial_Metallic(void) { return occPbrFrontMaterial[2].b; } +float occPBRFrontMaterial_Roughness(void) { return occRoughness (occPbrFrontMaterial[2].g); } +float occPBRFrontMaterial_NormalizedRoughness(void) { return occPbrFrontMaterial[2].g; } + +vec4 occPBRBackMaterial_Color(void) { return occPbrBackMaterial[0]; } +vec3 occPBRBackMaterial_Emission(void) { return occPbrBackMaterial[1].rgb; } +float occPBRBackMaterial_IOR(void) { return occPbrBackMaterial[1].w; } +float occPBRBackMaterial_Metallic(void) { return occPbrBackMaterial[2].b; } +float occPBRBackMaterial_Roughness(void) { return occRoughness (occPbrBackMaterial[2].g); } +float occPBRBackMaterial_NormalizedRoughness(void) { return occPbrBackMaterial[2].g; } +#else uniform vec4 occFrontMaterial[5]; uniform vec4 occBackMaterial[5]; -// front material properties accessors vec4 occFrontMaterial_Ambient(void) { return occFrontMaterial[0]; } vec4 occFrontMaterial_Diffuse(void) { return occFrontMaterial[1]; } vec4 occFrontMaterial_Specular(void) { return occFrontMaterial[2]; } @@ -35,13 +79,13 @@ vec4 occFrontMaterial_Emission(void) { return occFrontMaterial[3]; } float occFrontMaterial_Shininess(void) { return occFrontMaterial[4].x; } float occFrontMaterial_Transparency(void) { return occFrontMaterial[4].y; } -// back material properties accessors vec4 occBackMaterial_Ambient(void) { return occBackMaterial[0]; } vec4 occBackMaterial_Diffuse(void) { return occBackMaterial[1]; } vec4 occBackMaterial_Specular(void) { return occBackMaterial[2]; } vec4 occBackMaterial_Emission(void) { return occBackMaterial[3]; } float occBackMaterial_Shininess(void) { return occBackMaterial[4].x; } float occBackMaterial_Transparency(void) { return occBackMaterial[4].y; } +#endif // 2D texture coordinates transformation vec2 occTextureTrsf_Translation(void) { return occTexTrsf2d[0].xy; } diff --git a/src/Shaders/FILES b/src/Shaders/FILES index ebccc1e40b..327206af37 100644 --- a/src/Shaders/FILES +++ b/src/Shaders/FILES @@ -1,5 +1,12 @@ srcinc:::Declarations.glsl srcinc:::DeclarationsImpl.glsl +srcinc:::PBRCookTorrance.glsl +srcinc:::PBRDistribution.glsl +srcinc:::PBREnvBaking.fs +srcinc:::PBREnvBaking.vs +srcinc:::PBRFresnel.glsl +srcinc:::PBRGeometry.glsl +srcinc:::PBRIllumination.glsl srcinc:::PhongShading.fs srcinc:::PhongShading.vs srcinc:::Display.fs @@ -11,6 +18,13 @@ srcinc:::RaytraceSmooth.fs Shaders_Declarations_glsl.pxx Shaders_DeclarationsImpl_glsl.pxx Shaders_Display_fs.pxx +Shaders_PBRCookTorrance_glsl.pxx +Shaders_PBRDistribution_glsl.pxx +Shaders_PBREnvBaking_fs.pxx +Shaders_PBREnvBaking_vs.pxx +Shaders_PBRFresnel_glsl.pxx +Shaders_PBRGeometry_glsl.pxx +Shaders_PBRIllumination_glsl.pxx Shaders_RaytraceBase_fs.pxx Shaders_RaytraceRender_fs.pxx Shaders_PathtraceBase_fs.pxx diff --git a/src/Shaders/PBRCookTorrance.glsl b/src/Shaders/PBRCookTorrance.glsl new file mode 100644 index 0000000000..3d863636a1 --- /dev/null +++ b/src/Shaders/PBRCookTorrance.glsl @@ -0,0 +1,20 @@ +//! Calculates Cook-Torrance BRDF. +vec3 occPBRCookTorrance (in vec3 theView, + in vec3 theLight, + in vec3 theNormal, + in vec3 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR) +{ + vec3 aHalf = normalize (theView + theLight); + float aCosV = max(dot(theView, theNormal), 0.0); + float aCosL = max(dot(theLight, theNormal), 0.0); + float aCosH = max(dot(aHalf, theNormal), 0.0); + float aCosVH = max(dot(aHalf, theView), 0.0); + vec3 aCookTorrance = occPBRDistribution (aCosH, theRoughness) + * occPBRGeometry (aCosV, aCosL, theRoughness) + * occPBRFresnel (theBaseColor, theMetallic, theIOR, aCosVH); + aCookTorrance /= 4.0; + return aCookTorrance; +} diff --git a/src/Shaders/PBRDistribution.glsl b/src/Shaders/PBRDistribution.glsl new file mode 100644 index 0000000000..dc5a64e1cd --- /dev/null +++ b/src/Shaders/PBRDistribution.glsl @@ -0,0 +1,9 @@ +//! Calculates micro facet normals distribution. +float occPBRDistribution (in float theCosH, + in float theRoughness) +{ + float aDistribution = theRoughness * theRoughness; + aDistribution = aDistribution / (theCosH * theCosH * (aDistribution * aDistribution - 1.0) + 1.0); + aDistribution = INV_PI * aDistribution * aDistribution; + return aDistribution; +} diff --git a/src/Shaders/PBREnvBaking.fs b/src/Shaders/PBREnvBaking.fs new file mode 100644 index 0000000000..e795c4607a --- /dev/null +++ b/src/Shaders/PBREnvBaking.fs @@ -0,0 +1,162 @@ +THE_SHADER_IN vec3 ViewDirection; //!< direction of fetching from environment cubemap + +uniform int uSamplesNum; //!< number of samples in Monte-Carlo integration +uniform int uCurrentLevel; //!< current level of specular IBL map (ignored in case of diffuse map's processing) +uniform int uEnvMapSize; //!< one edge's size of source environtment map's zero mipmap level +uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap +uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap +uniform samplerCube uEnvMap; //!< source of baking (environment cubemap) + +//! Returns coordinates of point theNumber from Hammersley point set having size theSize. +vec2 hammersley (in int theNumber, + in int theSize) +{ + int aDenominator = 2; + int aNumber = theNumber; + float aVanDerCorput = 0.0; + for (int i = 0; i < 32; ++i) + { + if (aNumber > 0) + { + aVanDerCorput += float(aNumber % 2) / float(aDenominator); + aNumber /= 2; + aDenominator *= 2; + } + } + return vec2(float(theNumber) / float(theSize), aVanDerCorput); +} + +//! This function does importance sampling on hemisphere surface using GGX normal distribution function +//! in tangent space (positive z axis is surface normal direction). +vec3 importanceSample (in vec2 theHammersleyPoint, + in float theRoughness) +{ + float aPhi = PI_2 * theHammersleyPoint.x; + theRoughness *= theRoughness; + theRoughness *= theRoughness; + float aCosTheta = sqrt((1.0 - theHammersleyPoint.y) / (1.0 + (theRoughness - 1.0) * theHammersleyPoint.y)); + float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta); + return vec3(aSinTheta * cos(aPhi), + aSinTheta * sin(aPhi), + aCosTheta); +} + +//! This function uniformly generates samples on whole sphere. +vec3 sphereUniformSample (in vec2 theHammersleyPoint) +{ + float aPhi = PI_2 * theHammersleyPoint.x; + float aCosTheta = 2.0 * theHammersleyPoint.y - 1.0; + float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta); + return vec3(aSinTheta * cos(aPhi), + aSinTheta * sin(aPhi), + aCosTheta); +} + +//! Transforms resulted sampled direction from tangent space to world space considering the surface normal. +vec3 fromTangentSpace (in vec3 theVector, + in vec3 theNormal) +{ + vec3 anUp = (abs(theNormal.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); + vec3 anX = normalize(cross(anUp, theNormal)); + vec3 anY = cross(theNormal, anX); + return anX * theVector.x + anY * theVector.y + theNormal * theVector.z; +} + +const float aSHBasisFuncCoeffs[9] = float[9] +( + 0.282095 * 0.282095, + 0.488603 * 0.488603, + 0.488603 * 0.488603, + 0.488603 * 0.488603, + 1.092548 * 1.092548, + 1.092548 * 1.092548, + 1.092548 * 1.092548, + 0.315392 * 0.315392, + 0.546274 * 0.546274 +); + +const float aSHCosCoeffs[9] = float[9] +( + 3.141593, + 2.094395, + 2.094395, + 2.094395, + 0.785398, + 0.785398, + 0.785398, + 0.785398, + 0.785398 +); + +//! Bakes diffuse IBL map's spherical harmonics coefficients. +vec3 bakeDiffuseSH() +{ + int anIndex = int(gl_FragCoord.x); + vec3 aResult = vec3 (0.0); + for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter) + { + vec2 aHammersleyPoint = hammersley (aSampleIter, uSamplesNum); + vec3 aDirection = sphereUniformSample (aHammersleyPoint); + + vec3 aValue = occTextureCube (uEnvMap, cubemapVectorTransform (aDirection, uYCoeff, uZCoeff)).rgb; + + float aBasisFunc[9]; + aBasisFunc[0] = 1.0; + + aBasisFunc[1] = aDirection.x; + aBasisFunc[2] = aDirection.y; + aBasisFunc[3] = aDirection.z; + + aBasisFunc[4] = aDirection.x * aDirection.z; + aBasisFunc[5] = aDirection.y * aDirection.z; + aBasisFunc[6] = aDirection.x * aDirection.y; + + aBasisFunc[7] = 3.0 * aDirection.z * aDirection.z - 1.0; + aBasisFunc[8] = aDirection.x * aDirection.x - aDirection.y * aDirection.y; + + aResult += aValue * aBasisFunc[anIndex]; + } + + aResult *= 4.0 * aSHCosCoeffs[anIndex] * aSHBasisFuncCoeffs[anIndex] / float(uSamplesNum); + return aResult; +} + +//! Bakes specular IBL map. +vec3 bakeSpecularMap (in vec3 theNormal, + in float theRoughness) +{ + vec3 aResult = vec3(0.0); + float aWeightSum = 0.0; + int aSamplesNum = (theRoughness == 0.0) ? 1 : uSamplesNum; + float aSolidAngleSource = 4.0 * PI / (6.0 * float(uEnvMapSize * uEnvMapSize)); + for (int aSampleIter = 0; aSampleIter < aSamplesNum; ++aSampleIter) + { + vec2 aHammersleyPoint = hammersley (aSampleIter, aSamplesNum); + vec3 aHalf = importanceSample (aHammersleyPoint, occRoughness (theRoughness)); + float aHdotV = aHalf.z; + aHalf = fromTangentSpace (aHalf, theNormal); + vec3 aLight = -reflect (theNormal, aHalf); + float aNdotL = dot (aLight, theNormal); + if (aNdotL > 0.0) + { + float aSolidAngleSample = 1.0 / (float(aSamplesNum) * (occPBRDistribution (aHdotV, theRoughness) * 0.25 + 0.0001) + 0.0001); + float aLod = (theRoughness == 0.0) ? 0.0 : 0.5 * log2 (aSolidAngleSample / aSolidAngleSource); + aResult += occTextureCubeLod (uEnvMap, aLight, aLod).rgb * aNdotL; + aWeightSum += aNdotL; + } + } + return aResult / aWeightSum; +} + +void main() +{ + vec3 aViewDirection = normalize (ViewDirection); + if (occNbSpecIBLLevels == 0) + { + occSetFragColor (vec4 (bakeDiffuseSH (), 1.0)); + } + else + { + occSetFragColor (vec4 (bakeSpecularMap (aViewDirection, float(uCurrentLevel) / float(occNbSpecIBLLevels - 1)), 1.0)); + } +} diff --git a/src/Shaders/PBREnvBaking.vs b/src/Shaders/PBREnvBaking.vs new file mode 100644 index 0000000000..d9339aee25 --- /dev/null +++ b/src/Shaders/PBREnvBaking.vs @@ -0,0 +1,35 @@ +THE_SHADER_OUT vec3 ViewDirection; //!< direction of fetching from environment cubemap + +uniform int uCurrentSide; //!< current side of cubemap +uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap +uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap + +const mat2 cubemapDirectionMatrices[6] = mat2[] +( + mat2 ( 0, -1, -1, 0), + mat2 ( 0, 1, -1, 0), + mat2 ( 0, 1, 1, 0), + mat2 ( 0, 1, -1, 0), + mat2 ( 1, 0, 0, -1), + mat2 (-1, 0, 0, -1) +); + +//! Generates environment map fetching direction considering current index of side. +vec3 cubemapBakingViewDirection (in int theSide, + in vec2 theScreenCoord) +{ + int anAxis = theSide / 2; + vec3 aDirection = vec3(0.0); + aDirection[anAxis] = float(-(int(theSide) % 2) * 2 + 1); + theScreenCoord = cubemapDirectionMatrices[theSide] * theScreenCoord; + aDirection[(anAxis + 1) % 3] = theScreenCoord.x; + aDirection[(anAxis + 2) % 3] = theScreenCoord.y; + return aDirection; +} + +void main() +{ + ViewDirection = cubemapBakingViewDirection (uCurrentSide, occVertex.xy); + ViewDirection = cubemapVectorTransform (ViewDirection, uYCoeff, uZCoeff); + gl_Position = vec4 (occVertex.xy, 0.0, 1.0); +} diff --git a/src/Shaders/PBRFresnel.glsl b/src/Shaders/PBRFresnel.glsl new file mode 100644 index 0000000000..53c3d705c8 --- /dev/null +++ b/src/Shaders/PBRFresnel.glsl @@ -0,0 +1,36 @@ +//! Functions to calculate fresnel coefficient and approximate zero fresnel value. +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theIOR) +{ + theIOR = (1.0 - theIOR) / (1.0 + theIOR); + theIOR *= theIOR; + vec3 f0 = vec3(theIOR); + f0 = mix (f0, theBaseColor.rgb, theMetallic); + return f0; +} + +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theIOR, + in float theCosVH) +{ + vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR); + theCosVH = 1.0 - theCosVH; + theCosVH *= theCosVH; + theCosVH *= theCosVH * theCosVH * theCosVH * theCosVH; + return f0 + (vec3 (1.0) - f0) * theCosVH; +} + +vec3 occPBRFresnel (in vec3 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR, + in float theCosV) +{ + vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR); + theCosV = 1.0 - theCosV; + theCosV *= theCosV; + theCosV *= theCosV * theCosV * theCosV * theCosV; + return f0 + (max(vec3(1.0 - theRoughness), f0) - f0) * theCosV; +} diff --git a/src/Shaders/PBRGeometry.glsl b/src/Shaders/PBRGeometry.glsl new file mode 100644 index 0000000000..18987e7d43 --- /dev/null +++ b/src/Shaders/PBRGeometry.glsl @@ -0,0 +1,13 @@ +//! Calculates geometry factor for Cook-Torrance BRDF. +float occPBRGeometry (in float theCosV, + in float theCosL, + in float theRoughness) +{ + float k = theRoughness + 1.0; + k *= 0.125 * k; + float g1 = 1.0; + g1 /= theCosV * (1.0 - k) + k; + float g2 = 1.0; + g2 /= theCosL * (1.0 - k) + k; + return g1 * g2; +} diff --git a/src/Shaders/PBRIllumination.glsl b/src/Shaders/PBRIllumination.glsl new file mode 100644 index 0000000000..9ccbfc9abe --- /dev/null +++ b/src/Shaders/PBRIllumination.glsl @@ -0,0 +1,28 @@ +//! Calculates direct illumination using Cook-Torrance BRDF. +vec3 occPBRIllumination (in vec3 theView, + in vec3 theLight, + in vec3 theNormal, + in vec4 theBaseColor, + in float theMetallic, + in float theRoughness, + in float theIOR, + in vec3 theLightColor, + in float theLightIntensity) +{ + vec3 aHalf = normalize (theView + theLight); + float aCosVH = max(dot(theView, aHalf), 0.0); + vec3 aFresnel = occPBRFresnel (theBaseColor.rgb, theMetallic, theIOR, aCosVH); + vec3 aSpecular = occPBRCookTorrance (theView, + theLight, + theNormal, + theBaseColor.rgb, + theMetallic, + theRoughness, + theIOR); + vec3 aDiffuse = vec3(1.0) - aFresnel; + aDiffuse *= 1.0 - theMetallic; + aDiffuse *= INV_PI; + aDiffuse *= theBaseColor.rgb; + aDiffuse = mix (vec3(0.0), aDiffuse, theBaseColor.a); + return (aDiffuse + aSpecular) * theLightColor * theLightIntensity * max(0.0, dot(theLight, theNormal)); +} diff --git a/src/Shaders/PhongShading.fs b/src/Shaders/PhongShading.fs index d102812347..1e52cbe9c4 100755 --- a/src/Shaders/PhongShading.fs +++ b/src/Shaders/PhongShading.fs @@ -29,7 +29,7 @@ void pointLight (in int theId, in vec3 thePoint) { vec3 aLight = occLight_Position (theId).xyz; - if (occLight_IsHeadlight (theId) == 0) + if (!occLight_IsHeadlight (theId)) { aLight = vec3 (occWorldViewMatrix * vec4 (aLight, 1.0)); } diff --git a/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx b/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx index 71a6b03674..3b31ea9693 100644 --- a/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx +++ b/src/Shaders/Shaders_DeclarationsImpl_glsl.pxx @@ -22,15 +22,59 @@ static const char Shaders_DeclarationsImpl_glsl[] = "\n" "#if defined(THE_MAX_LIGHTS) && (THE_MAX_LIGHTS > 0)\n" "// arrays of light sources\n" - "uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types\n" "uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters\n" + "uniform THE_PREC_ENUM ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types\n" + "#endif\n" + "\n" + "#if defined(THE_IS_PBR)\n" + "vec3 occDiffIBLMap (in vec3 theNormal)\n" + "{\n" + " vec3 aSHCoeffs[9];\n" + " for (int i = 0; i < 9; ++i)\n" + " {\n" + " aSHCoeffs[i] = occTexture2D (occDiffIBLMapSHCoeffs, vec2 ((float(i) + 0.5) / 9.0, 0.0)).rgb;\n" + " }\n" + " return aSHCoeffs[0]\n" + "\n" + " + aSHCoeffs[1] * theNormal.x\n" + " + aSHCoeffs[2] * theNormal.y\n" + " + aSHCoeffs[3] * theNormal.z\n" + "\n" + " + aSHCoeffs[4] * theNormal.x * theNormal.z\n" + " + aSHCoeffs[5] * theNormal.y * theNormal.z\n" + " + aSHCoeffs[6] * theNormal.x * theNormal.y\n" + "\n" + " + aSHCoeffs[7] * (3.0 * theNormal.z * theNormal.z - 1.0)\n" + " + aSHCoeffs[8] * (theNormal.x * theNormal.x - theNormal.y * theNormal.y);\n" + "}\n" "#endif\n" "\n" - "// material state\n" + "// front and back material properties accessors\n" + "#if defined(THE_IS_PBR)\n" + "uniform vec4 occPbrFrontMaterial[3];\n" + "uniform vec4 occPbrBackMaterial[3];\n" + "\n" + "#define MIN_ROUGHNESS 0.01\n" + "// Converts roughness value from range [0, 1] to real value for calculations\n" + "float occRoughness (in float theNormalizedRoughness) { return theNormalizedRoughness * (1.0 - MIN_ROUGHNESS) + MIN_ROUGHNESS; }\n" + "\n" + "vec4 occPBRFrontMaterial_Color(void) { return occPbrFrontMaterial[0]; }\n" + "vec3 occPBRFrontMaterial_Emission(void) { return occPbrFrontMaterial[1].rgb; }\n" + "float occPBRFrontMaterial_IOR(void) { return occPbrFrontMaterial[1].w; }\n" + "float occPBRFrontMaterial_Metallic(void) { return occPbrFrontMaterial[2].b; }\n" + "float occPBRFrontMaterial_Roughness(void) { return occRoughness (occPbrFrontMaterial[2].g); }\n" + "float occPBRFrontMaterial_NormalizedRoughness(void) { return occPbrFrontMaterial[2].g; }\n" + "\n" + "vec4 occPBRBackMaterial_Color(void) { return occPbrBackMaterial[0]; }\n" + "vec3 occPBRBackMaterial_Emission(void) { return occPbrBackMaterial[1].rgb; }\n" + "float occPBRBackMaterial_IOR(void) { return occPbrBackMaterial[1].w; }\n" + "float occPBRBackMaterial_Metallic(void) { return occPbrBackMaterial[2].b; }\n" + "float occPBRBackMaterial_Roughness(void) { return occRoughness (occPbrBackMaterial[2].g); }\n" + "float occPBRBackMaterial_NormalizedRoughness(void) { return occPbrBackMaterial[2].g; }\n" + "#else\n" "uniform vec4 occFrontMaterial[5];\n" "uniform vec4 occBackMaterial[5];\n" "\n" - "// front material properties accessors\n" "vec4 occFrontMaterial_Ambient(void) { return occFrontMaterial[0]; }\n" "vec4 occFrontMaterial_Diffuse(void) { return occFrontMaterial[1]; }\n" "vec4 occFrontMaterial_Specular(void) { return occFrontMaterial[2]; }\n" @@ -38,13 +82,13 @@ static const char Shaders_DeclarationsImpl_glsl[] = "float occFrontMaterial_Shininess(void) { return occFrontMaterial[4].x; }\n" "float occFrontMaterial_Transparency(void) { return occFrontMaterial[4].y; }\n" "\n" - "// back material properties accessors\n" "vec4 occBackMaterial_Ambient(void) { return occBackMaterial[0]; }\n" "vec4 occBackMaterial_Diffuse(void) { return occBackMaterial[1]; }\n" "vec4 occBackMaterial_Specular(void) { return occBackMaterial[2]; }\n" "vec4 occBackMaterial_Emission(void) { return occBackMaterial[3]; }\n" "float occBackMaterial_Shininess(void) { return occBackMaterial[4].x; }\n" "float occBackMaterial_Transparency(void) { return occBackMaterial[4].y; }\n" + "#endif\n" "\n" "// 2D texture coordinates transformation\n" "vec2 occTextureTrsf_Translation(void) { return occTexTrsf2d[0].xy; }\n" diff --git a/src/Shaders/Shaders_Declarations_glsl.pxx b/src/Shaders/Shaders_Declarations_glsl.pxx index 12af3c4dba..586183ad3a 100644 --- a/src/Shaders/Shaders_Declarations_glsl.pxx +++ b/src/Shaders/Shaders_Declarations_glsl.pxx @@ -24,6 +24,8 @@ static const char Shaders_Declarations_glsl[] = " #define occTexture1D texture\n" " #define occTexture2D texture\n" " #define occTexture3D texture\n" + " #define occTextureCube texture\n" + " #define occTextureCubeLod textureLod\n" "#else\n" " #define THE_ATTRIBUTE attribute\n" " #define THE_SHADER_IN varying\n" @@ -32,10 +34,16 @@ static const char Shaders_Declarations_glsl[] = " #define occTexture1D texture1D\n" " #define occTexture2D texture2D\n" " #define occTexture3D texture3D\n" + " #define occTextureCube textureCube\n" + " #define occTextureCubeLod textureCubeLod\n" "#endif\n" "\n" "#ifdef GL_ES\n" - " #define THE_PREC_ENUM lowp // enumerations should fit into lowp range\n" + "#if (__VERSION__ >= 300)\n" + " #define THE_PREC_ENUM highp // lowp should be enough for enums but triggers driver bugs\n" + "#else\n" + " #define THE_PREC_ENUM lowp\n" + "#endif\n" "#else\n" " #define THE_PREC_ENUM\n" "#endif\n" @@ -88,6 +96,15 @@ static const char Shaders_Declarations_glsl[] = " void occSetFragColor (in vec4 theColor);\n" "#endif\n" "\n" + "// Pi number definitions\n" + "#define PI 3.141592654\n" + "#define PI_2 6.283185307\n" + "#define PI_DIV_2 1.570796327\n" + "#define PI_DIV_3 1.047197551\n" + "#define PI_DIV_4 0.785398163\n" + "#define INV_PI 0.318309886\n" + "#define INV_PI_2 0.159154943\n" + "\n" "// Matrix state\n" "uniform mat4 occWorldViewMatrix; //!< World-view matrix\n" "uniform mat4 occProjectionMatrix; //!< Projection matrix\n" @@ -105,6 +122,15 @@ static const char Shaders_Declarations_glsl[] = "uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix\n" "uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix\n" "\n" + "#if defined(THE_IS_PBR)\n" + "uniform sampler2D occEnvLUT; //!< Environment Lookup Table\n" + "uniform sampler2D occDiffIBLMapSHCoeffs; //!< Packed diffuse (irradiance) IBL map's spherical harmonics coefficients\n" + "uniform samplerCube occSpecIBLMap; //!< Specular IBL map\n" + "uniform int occNbSpecIBLLevels; //!< Number of mipmap levels used in occSpecIBLMap to store different roughness values maps\n" + "\n" + "vec3 occDiffIBLMap (in vec3 theNormal); //!< Unpacks spherical harmonics coefficients to diffuse IBL map's values\n" + "#endif\n" + "\n" "// light type enumeration (same as Graphic3d_TypeOfLightSource)\n" "const int OccLightType_Direct = 1; //!< directional light source\n" "const int OccLightType_Point = 2; //!< isotropic point light source\n" @@ -119,7 +145,7 @@ static const char Shaders_Declarations_glsl[] = "#define occLight_Type(theId) occLightSourcesTypes[theId].x\n" "\n" "//! Is light a headlight, int?\n" - "#define occLight_IsHeadlight(theId) occLightSourcesTypes[theId].y\n" + "#define occLight_IsHeadlight(theId) (occLightSourcesTypes[theId].y != 0)\n" "\n" "//! Specular intensity (equals to diffuse), vec4.\n" "#define occLight_Specular(theId) occLightSources[theId * 4 + 0]\n" @@ -136,6 +162,11 @@ static const char Shaders_Declarations_glsl[] = "//! Attenuation of the spot light intensity (from 0 to 1), float.\n" "#define occLight_SpotExponent(theId) occLightSources[theId * 4 + 3].w\n" "\n" + "#if defined(THE_IS_PBR)\n" + "//! Intensity of light source (>= 0), float.\n" + "#define occLight_Intensity(theId) occLightSources[theId * 4 + 0].a\n" + "#else\n" + "\n" "//! Diffuse intensity (equals to Specular), vec4.\n" "#define occLight_Diffuse(theId) occLightSources[theId * 4 + 0]\n" "\n" @@ -145,22 +176,44 @@ static const char Shaders_Declarations_glsl[] = "//! Linear attenuation factor of positional light source, float.\n" "#define occLight_LinearAttenuation(theId) occLightSources[theId * 4 + 3].y\n" "#endif\n" + "#endif\n" + "\n" + "// Converts roughness value from range [0, 1] to real value for calculations\n" + "float occRoughness (in float theNormalizedRoughness);\n" "\n" "// Front material properties accessors\n" - "vec4 occFrontMaterial_Emission(void); //!< Emission color\n" - "vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection\n" - "vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection\n" - "vec4 occFrontMaterial_Specular(void); //!< Specular reflection\n" - "float occFrontMaterial_Shininess(void); //!< Specular exponent\n" - "float occFrontMaterial_Transparency(void); //!< Transparency coefficient\n" + "#if !defined(THE_IS_PBR)\n" + "vec4 occFrontMaterial_Emission(void); //!< Emission color\n" + "vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection\n" + "vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection\n" + "vec4 occFrontMaterial_Specular(void); //!< Specular reflection\n" + "float occFrontMaterial_Shininess(void); //!< Specular exponent\n" + "float occFrontMaterial_Transparency(void); //!< Transparency coefficient\n" + "#else\n" + "vec4 occPBRFrontMaterial_Color(void); //!< Base color of PBR material\n" + "float occPBRFrontMaterial_Metallic(void); //!< Metallic coefficient\n" + "float occPBRFrontMaterial_Roughness(void); //!< Roughness coefficient\n" + "float occPBRFrontMaterial_NormalizedRoughness(void); //!< Normalized roughness coefficient\n" + "vec3 occPBRFrontMaterial_Emission(void); //!< Light intensity emitted by material\n" + "float occPBRFrontMaterial_IOR(void); //!< Index of refraction\n" + "#endif\n" "\n" "// Back material properties accessors\n" - "vec4 occBackMaterial_Emission(void); //!< Emission color\n" - "vec4 occBackMaterial_Ambient(void); //!< Ambient reflection\n" - "vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection\n" - "vec4 occBackMaterial_Specular(void); //!< Specular reflection\n" - "float occBackMaterial_Shininess(void); //!< Specular exponent\n" - "float occBackMaterial_Transparency(void); //!< Transparency coefficient\n" + "#if !defined(THE_IS_PBR)\n" + "vec4 occBackMaterial_Emission(void); //!< Emission color\n" + "vec4 occBackMaterial_Ambient(void); //!< Ambient reflection\n" + "vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection\n" + "vec4 occBackMaterial_Specular(void); //!< Specular reflection\n" + "float occBackMaterial_Shininess(void); //!< Specular exponent\n" + "float occBackMaterial_Transparency(void); //!< Transparency coefficient\n" + "#else\n" + "vec4 occPBRBackMaterial_Color(void); //!< Base color of PBR material\n" + "float occPBRBackMaterial_Metallic(void); //!< Metallic coefficient\n" + "float occPBRBackMaterial_Roughness(void); //!< Roughness coefficient\n" + "float occPBRBackMaterial_NormalizedRoughness(void); //!< Normalized roughness coefficient\n" + "vec3 occPBRBackMaterial_Emission(void); //!< Light intensity emitted by material\n" + "float occPBRBackMaterial_IOR(void); //!< Index of refraction\n" + "#endif\n" "\n" "#ifdef THE_HAS_DEFAULT_SAMPLER\n" "#define occActiveSampler occSampler0 //!< alias for backward compatibility\n" diff --git a/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx b/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx new file mode 100644 index 0000000000..c2c8f88b21 --- /dev/null +++ b/src/Shaders/Shaders_PBRCookTorrance_glsl.pxx @@ -0,0 +1,23 @@ +// This file has been automatically generated from resource file src/Shaders/PBRCookTorrance.glsl + +static const char Shaders_PBRCookTorrance_glsl[] = + "//! Calculates Cook-Torrance BRDF.\n" + "vec3 occPBRCookTorrance (in vec3 theView,\n" + " in vec3 theLight,\n" + " in vec3 theNormal,\n" + " in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR)\n" + "{\n" + " vec3 aHalf = normalize (theView + theLight);\n" + " float aCosV = max(dot(theView, theNormal), 0.0);\n" + " float aCosL = max(dot(theLight, theNormal), 0.0);\n" + " float aCosH = max(dot(aHalf, theNormal), 0.0);\n" + " float aCosVH = max(dot(aHalf, theView), 0.0);\n" + " vec3 aCookTorrance = occPBRDistribution (aCosH, theRoughness)\n" + " * occPBRGeometry (aCosV, aCosL, theRoughness)\n" + " * occPBRFresnel (theBaseColor, theMetallic, theIOR, aCosVH);\n" + " aCookTorrance /= 4.0;\n" + " return aCookTorrance;\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBRDistribution_glsl.pxx b/src/Shaders/Shaders_PBRDistribution_glsl.pxx new file mode 100644 index 0000000000..66f1cf8023 --- /dev/null +++ b/src/Shaders/Shaders_PBRDistribution_glsl.pxx @@ -0,0 +1,12 @@ +// This file has been automatically generated from resource file src/Shaders/PBRDistribution.glsl + +static const char Shaders_PBRDistribution_glsl[] = + "//! Calculates micro facet normals distribution.\n" + "float occPBRDistribution (in float theCosH,\n" + " in float theRoughness)\n" + "{\n" + " float aDistribution = theRoughness * theRoughness;\n" + " aDistribution = aDistribution / (theCosH * theCosH * (aDistribution * aDistribution - 1.0) + 1.0);\n" + " aDistribution = INV_PI * aDistribution * aDistribution;\n" + " return aDistribution;\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBREnvBaking_fs.pxx b/src/Shaders/Shaders_PBREnvBaking_fs.pxx new file mode 100644 index 0000000000..bc995ac8e7 --- /dev/null +++ b/src/Shaders/Shaders_PBREnvBaking_fs.pxx @@ -0,0 +1,165 @@ +// This file has been automatically generated from resource file src/Shaders/PBREnvBaking.fs + +static const char Shaders_PBREnvBaking_fs[] = + "THE_SHADER_IN vec3 ViewDirection; //!< direction of fetching from environment cubemap\n" + "\n" + "uniform int uSamplesNum; //!< number of samples in Monte-Carlo integration\n" + "uniform int uCurrentLevel; //!< current level of specular IBL map (ignored in case of diffuse map's processing)\n" + "uniform int uEnvMapSize; //!< one edge's size of source environtment map's zero mipmap level\n" + "uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap\n" + "uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap\n" + "uniform samplerCube uEnvMap; //!< source of baking (environment cubemap)\n" + "\n" + "//! Returns coordinates of point theNumber from Hammersley point set having size theSize.\n" + "vec2 hammersley (in int theNumber,\n" + " in int theSize)\n" + "{\n" + " int aDenominator = 2;\n" + " int aNumber = theNumber;\n" + " float aVanDerCorput = 0.0;\n" + " for (int i = 0; i < 32; ++i)\n" + " {\n" + " if (aNumber > 0)\n" + " {\n" + " aVanDerCorput += float(aNumber % 2) / float(aDenominator);\n" + " aNumber /= 2;\n" + " aDenominator *= 2;\n" + " }\n" + " }\n" + " return vec2(float(theNumber) / float(theSize), aVanDerCorput);\n" + "}\n" + "\n" + "//! This function does importance sampling on hemisphere surface using GGX normal distribution function\n" + "//! in tangent space (positive z axis is surface normal direction).\n" + "vec3 importanceSample (in vec2 theHammersleyPoint,\n" + " in float theRoughness)\n" + "{\n" + " float aPhi = PI_2 * theHammersleyPoint.x;\n" + " theRoughness *= theRoughness;\n" + " theRoughness *= theRoughness;\n" + " float aCosTheta = sqrt((1.0 - theHammersleyPoint.y) / (1.0 + (theRoughness - 1.0) * theHammersleyPoint.y));\n" + " float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);\n" + " return vec3(aSinTheta * cos(aPhi),\n" + " aSinTheta * sin(aPhi),\n" + " aCosTheta);\n" + "}\n" + "\n" + "//! This function uniformly generates samples on whole sphere.\n" + "vec3 sphereUniformSample (in vec2 theHammersleyPoint)\n" + "{\n" + " float aPhi = PI_2 * theHammersleyPoint.x;\n" + " float aCosTheta = 2.0 * theHammersleyPoint.y - 1.0;\n" + " float aSinTheta = sqrt(1.0 - aCosTheta * aCosTheta);\n" + " return vec3(aSinTheta * cos(aPhi),\n" + " aSinTheta * sin(aPhi),\n" + " aCosTheta);\n" + "}\n" + "\n" + "//! Transforms resulted sampled direction from tangent space to world space considering the surface normal.\n" + "vec3 fromTangentSpace (in vec3 theVector,\n" + " in vec3 theNormal)\n" + "{\n" + " vec3 anUp = (abs(theNormal.z) < 0.999) ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n" + " vec3 anX = normalize(cross(anUp, theNormal));\n" + " vec3 anY = cross(theNormal, anX);\n" + " return anX * theVector.x + anY * theVector.y + theNormal * theVector.z;\n" + "}\n" + "\n" + "const float aSHBasisFuncCoeffs[9] = float[9]\n" + "(\n" + " 0.282095 * 0.282095,\n" + " 0.488603 * 0.488603,\n" + " 0.488603 * 0.488603,\n" + " 0.488603 * 0.488603,\n" + " 1.092548 * 1.092548,\n" + " 1.092548 * 1.092548,\n" + " 1.092548 * 1.092548,\n" + " 0.315392 * 0.315392,\n" + " 0.546274 * 0.546274\n" + ");\n" + "\n" + "const float aSHCosCoeffs[9] = float[9]\n" + "(\n" + " 3.141593,\n" + " 2.094395,\n" + " 2.094395,\n" + " 2.094395,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398,\n" + " 0.785398\n" + ");\n" + "\n" + "//! Bakes diffuse IBL map's spherical harmonics coefficients.\n" + "vec3 bakeDiffuseSH()\n" + "{\n" + " int anIndex = int(gl_FragCoord.x);\n" + " vec3 aResult = vec3 (0.0);\n" + " for (int aSampleIter = 0; aSampleIter < uSamplesNum; ++aSampleIter)\n" + " {\n" + " vec2 aHammersleyPoint = hammersley (aSampleIter, uSamplesNum);\n" + " vec3 aDirection = sphereUniformSample (aHammersleyPoint);\n" + "\n" + " vec3 aValue = occTextureCube (uEnvMap, cubemapVectorTransform (aDirection, uYCoeff, uZCoeff)).rgb;\n" + "\n" + " float aBasisFunc[9];\n" + " aBasisFunc[0] = 1.0;\n" + "\n" + " aBasisFunc[1] = aDirection.x;\n" + " aBasisFunc[2] = aDirection.y;\n" + " aBasisFunc[3] = aDirection.z;\n" + "\n" + " aBasisFunc[4] = aDirection.x * aDirection.z;\n" + " aBasisFunc[5] = aDirection.y * aDirection.z;\n" + " aBasisFunc[6] = aDirection.x * aDirection.y;\n" + "\n" + " aBasisFunc[7] = 3.0 * aDirection.z * aDirection.z - 1.0;\n" + " aBasisFunc[8] = aDirection.x * aDirection.x - aDirection.y * aDirection.y;\n" + "\n" + " aResult += aValue * aBasisFunc[anIndex];\n" + " }\n" + "\n" + " aResult *= 4.0 * aSHCosCoeffs[anIndex] * aSHBasisFuncCoeffs[anIndex] / float(uSamplesNum);\n" + " return aResult;\n" + "}\n" + "\n" + "//! Bakes specular IBL map.\n" + "vec3 bakeSpecularMap (in vec3 theNormal,\n" + " in float theRoughness)\n" + "{\n" + " vec3 aResult = vec3(0.0);\n" + " float aWeightSum = 0.0;\n" + " int aSamplesNum = (theRoughness == 0.0) ? 1 : uSamplesNum;\n" + " float aSolidAngleSource = 4.0 * PI / (6.0 * float(uEnvMapSize * uEnvMapSize));\n" + " for (int aSampleIter = 0; aSampleIter < aSamplesNum; ++aSampleIter)\n" + " {\n" + " vec2 aHammersleyPoint = hammersley (aSampleIter, aSamplesNum);\n" + " vec3 aHalf = importanceSample (aHammersleyPoint, occRoughness (theRoughness));\n" + " float aHdotV = aHalf.z;\n" + " aHalf = fromTangentSpace (aHalf, theNormal);\n" + " vec3 aLight = -reflect (theNormal, aHalf);\n" + " float aNdotL = dot (aLight, theNormal);\n" + " if (aNdotL > 0.0)\n" + " {\n" + " float aSolidAngleSample = 1.0 / (float(aSamplesNum) * (occPBRDistribution (aHdotV, theRoughness) * 0.25 + 0.0001) + 0.0001);\n" + " float aLod = (theRoughness == 0.0) ? 0.0 : 0.5 * log2 (aSolidAngleSample / aSolidAngleSource);\n" + " aResult += occTextureCubeLod (uEnvMap, aLight, aLod).rgb * aNdotL;\n" + " aWeightSum += aNdotL;\n" + " }\n" + " }\n" + " return aResult / aWeightSum;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " vec3 aViewDirection = normalize (ViewDirection);\n" + " if (occNbSpecIBLLevels == 0)\n" + " {\n" + " occSetFragColor (vec4 (bakeDiffuseSH (), 1.0));\n" + " }\n" + " else\n" + " {\n" + " occSetFragColor (vec4 (bakeSpecularMap (aViewDirection, float(uCurrentLevel) / float(occNbSpecIBLLevels - 1)), 1.0));\n" + " }\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBREnvBaking_vs.pxx b/src/Shaders/Shaders_PBREnvBaking_vs.pxx new file mode 100644 index 0000000000..89a37cb50d --- /dev/null +++ b/src/Shaders/Shaders_PBREnvBaking_vs.pxx @@ -0,0 +1,38 @@ +// This file has been automatically generated from resource file src/Shaders/PBREnvBaking.vs + +static const char Shaders_PBREnvBaking_vs[] = + "THE_SHADER_OUT vec3 ViewDirection; //!< direction of fetching from environment cubemap\n" + "\n" + "uniform int uCurrentSide; //!< current side of cubemap\n" + "uniform int uYCoeff; //!< coefficient of Y controlling horizontal flip of cubemap\n" + "uniform int uZCoeff; //!< coefficient of Z controlling vertical flip of cubemap\n" + "\n" + "const mat2 cubemapDirectionMatrices[6] = mat2[]\n" + "(\n" + " mat2 ( 0, -1, -1, 0),\n" + " mat2 ( 0, 1, -1, 0),\n" + " mat2 ( 0, 1, 1, 0),\n" + " mat2 ( 0, 1, -1, 0),\n" + " mat2 ( 1, 0, 0, -1),\n" + " mat2 (-1, 0, 0, -1)\n" + ");\n" + "\n" + "//! Generates environment map fetching direction considering current index of side.\n" + "vec3 cubemapBakingViewDirection (in int theSide,\n" + " in vec2 theScreenCoord)\n" + "{\n" + " int anAxis = theSide / 2;\n" + " vec3 aDirection = vec3(0.0);\n" + " aDirection[anAxis] = float(-(int(theSide) % 2) * 2 + 1);\n" + " theScreenCoord = cubemapDirectionMatrices[theSide] * theScreenCoord;\n" + " aDirection[(anAxis + 1) % 3] = theScreenCoord.x;\n" + " aDirection[(anAxis + 2) % 3] = theScreenCoord.y;\n" + " return aDirection;\n" + "}\n" + "\n" + "void main()\n" + "{\n" + " ViewDirection = cubemapBakingViewDirection (uCurrentSide, occVertex.xy);\n" + " ViewDirection = cubemapVectorTransform (ViewDirection, uYCoeff, uZCoeff);\n" + " gl_Position = vec4 (occVertex.xy, 0.0, 1.0);\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBRFresnel_glsl.pxx b/src/Shaders/Shaders_PBRFresnel_glsl.pxx new file mode 100644 index 0000000000..3612829607 --- /dev/null +++ b/src/Shaders/Shaders_PBRFresnel_glsl.pxx @@ -0,0 +1,39 @@ +// This file has been automatically generated from resource file src/Shaders/PBRFresnel.glsl + +static const char Shaders_PBRFresnel_glsl[] = + "//! Functions to calculate fresnel coefficient and approximate zero fresnel value.\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theIOR)\n" + "{\n" + " theIOR = (1.0 - theIOR) / (1.0 + theIOR);\n" + " theIOR *= theIOR;\n" + " vec3 f0 = vec3(theIOR);\n" + " f0 = mix (f0, theBaseColor.rgb, theMetallic);\n" + " return f0;\n" + "}\n" + "\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theIOR,\n" + " in float theCosVH)\n" + "{\n" + " vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR);\n" + " theCosVH = 1.0 - theCosVH;\n" + " theCosVH *= theCosVH;\n" + " theCosVH *= theCosVH * theCosVH * theCosVH * theCosVH;\n" + " return f0 + (vec3 (1.0) - f0) * theCosVH;\n" + "}\n" + "\n" + "vec3 occPBRFresnel (in vec3 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR,\n" + " in float theCosV)\n" + "{\n" + " vec3 f0 = occPBRFresnel (theBaseColor, theMetallic, theIOR);\n" + " theCosV = 1.0 - theCosV;\n" + " theCosV *= theCosV;\n" + " theCosV *= theCosV * theCosV * theCosV * theCosV;\n" + " return f0 + (max(vec3(1.0 - theRoughness), f0) - f0) * theCosV;\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBRGeometry_glsl.pxx b/src/Shaders/Shaders_PBRGeometry_glsl.pxx new file mode 100644 index 0000000000..7ade3af473 --- /dev/null +++ b/src/Shaders/Shaders_PBRGeometry_glsl.pxx @@ -0,0 +1,16 @@ +// This file has been automatically generated from resource file src/Shaders/PBRGeometry.glsl + +static const char Shaders_PBRGeometry_glsl[] = + "//! Calculates geometry factor for Cook-Torrance BRDF.\n" + "float occPBRGeometry (in float theCosV,\n" + " in float theCosL,\n" + " in float theRoughness)\n" + "{\n" + " float k = theRoughness + 1.0;\n" + " k *= 0.125 * k;\n" + " float g1 = 1.0;\n" + " g1 /= theCosV * (1.0 - k) + k;\n" + " float g2 = 1.0;\n" + " g2 /= theCosL * (1.0 - k) + k;\n" + " return g1 * g2;\n" + "}\n"; diff --git a/src/Shaders/Shaders_PBRIllumination_glsl.pxx b/src/Shaders/Shaders_PBRIllumination_glsl.pxx new file mode 100644 index 0000000000..d7a27605ce --- /dev/null +++ b/src/Shaders/Shaders_PBRIllumination_glsl.pxx @@ -0,0 +1,31 @@ +// This file has been automatically generated from resource file src/Shaders/PBRIllumination.glsl + +static const char Shaders_PBRIllumination_glsl[] = + "//! Calculates direct illumination using Cook-Torrance BRDF.\n" + "vec3 occPBRIllumination (in vec3 theView,\n" + " in vec3 theLight,\n" + " in vec3 theNormal,\n" + " in vec4 theBaseColor,\n" + " in float theMetallic,\n" + " in float theRoughness,\n" + " in float theIOR,\n" + " in vec3 theLightColor,\n" + " in float theLightIntensity)\n" + "{\n" + " vec3 aHalf = normalize (theView + theLight);\n" + " float aCosVH = max(dot(theView, aHalf), 0.0);\n" + " vec3 aFresnel = occPBRFresnel (theBaseColor.rgb, theMetallic, theIOR, aCosVH);\n" + " vec3 aSpecular = occPBRCookTorrance (theView,\n" + " theLight,\n" + " theNormal,\n" + " theBaseColor.rgb,\n" + " theMetallic,\n" + " theRoughness,\n" + " theIOR);\n" + " vec3 aDiffuse = vec3(1.0) - aFresnel;\n" + " aDiffuse *= 1.0 - theMetallic;\n" + " aDiffuse *= INV_PI;\n" + " aDiffuse *= theBaseColor.rgb;\n" + " aDiffuse = mix (vec3(0.0), aDiffuse, theBaseColor.a);\n" + " return (aDiffuse + aSpecular) * theLightColor * theLightIntensity * max(0.0, dot(theLight, theNormal));\n" + "}\n"; diff --git a/src/Textures/FILES b/src/Textures/FILES index 40b9c5579a..e1ffb54fe8 100755 --- a/src/Textures/FILES +++ b/src/Textures/FILES @@ -29,3 +29,4 @@ icon:::env_pearl.rgb icon:::env_road.rgb icon:::env_sky1.rgb icon:::env_sky2.rgb +Textures_EnvLUT.pxx diff --git a/src/Textures/Textures_EnvLUT.pxx b/src/Textures/Textures_EnvLUT.pxx new file mode 100644 index 0000000000..97aea55725 --- /dev/null +++ b/src/Textures/Textures_EnvLUT.pxx @@ -0,0 +1,3461 @@ +//this file has been generated by vgenenvlut draw command +static unsigned int Textures_EnvLUTSize = 128; + +static float Textures_EnvLUT[] = +{ +0.f,0.f, 0.0382714f,0.949235f, 0.0758239f,0.917965f, 0.112197f,0.88368f, 0.147415f,0.84953f, +0.181504f,0.816054f, 0.214496f,0.783493f, 0.246415f,0.751876f, 0.277286f,0.721232f, 0.307141f,0.691546f, +0.335999f,0.662837f, 0.363891f,0.635065f, 0.390836f,0.608214f, 0.416849f,0.582274f, 0.44198f,0.557216f, +0.466225f,0.533021f, 0.489626f,0.509675f, 0.512206f,0.487152f, 0.533968f,0.465424f, 0.554953f,0.444486f, +0.57517f,0.424293f, 0.594646f,0.404846f, 0.613403f,0.386116f, 0.631465f,0.368093f, 0.648841f,0.350738f, +0.665546f,0.334045f, 0.68162f,0.317993f, 0.697066f,0.302564f, 0.71191f,0.28774f, 0.726152f,0.273502f, +0.739848f,0.259838f, 0.752975f,0.246719f, 0.765564f,0.234135f, 0.777648f,0.222076f, 0.789204f,0.210511f, +0.800294f,0.199436f, 0.810913f,0.188832f, 0.821063f,0.178685f, 0.830796f,0.168977f, 0.840084f,0.159698f, +0.848952f,0.150828f, 0.857425f,0.142358f, 0.865535f,0.134272f, 0.873243f,0.126558f, 0.880614f,0.119203f, +0.887631f,0.112196f, 0.8943f,0.10552f, 0.900652f,0.0991651f, 0.906722f,0.0931193f, 0.912472f,0.087374f, +0.917921f,0.0819166f, 0.923109f,0.0767335f, 0.928039f,0.0718161f, 0.932694f,0.0671546f, 0.937131f,0.0627394f, +0.9413f,0.0585586f, 0.945264f,0.0546035f, 0.949021f,0.0508651f, 0.95256f,0.0473339f, 0.955875f,0.0440025f, +0.959033f,0.0408606f, 0.961987f,0.0379014f, 0.964782f,0.0351159f, 0.967406f,0.032497f, 0.96986f,0.0300355f, +0.972171f,0.027727f, 0.974353f,0.0255618f, 0.976379f,0.0235343f, 0.978272f,0.0216371f, 0.980045f,0.019865f, +0.981701f,0.0182105f, 0.983262f,0.0166683f, 0.984683f,0.0152321f, 0.986024f,0.0138969f, 0.987259f,0.0126571f, +0.988416f,0.0115071f, 0.989498f,0.0104425f, 0.990478f,0.00945815f, 0.991393f,0.00854934f, 0.992236f,0.00771189f, +0.992993f,0.00694133f, 0.993713f,0.00623369f, 0.99437f,0.00558503f, 0.994946f,0.00499139f, 0.995495f,0.00444938f, +0.995986f,0.00395558f, 0.996456f,0.0035066f, 0.996841f,0.00309926f, 0.997238f,0.00273078f, 0.997559f,0.00239817f, +0.997864f,0.0020988f, 0.99812f,0.0018301f, 0.998364f,0.00158966f, 0.998593f,0.00137519f, 0.998779f,0.0011845f, +0.998959f,0.00101559f, 0.999096f,0.000866519f, 0.999222f,0.00073548f, 0.999341f,0.000620806f, 0.999451f,0.000520908f, +0.999527f,0.000434302f, 0.999622f,0.000359617f, 0.999691f,0.000295579f, 0.999744f,0.000241008f, 0.999771f,0.000194807f, +0.999818f,0.000155985f, 0.999866f,0.000123613f, 0.999879f,9.68558e-05f, 0.999893f,7.49452e-05f, 0.999935f,5.71916e-05f, +0.999939f,4.2975e-05f, 0.999943f,3.17377e-05f, 0.999953f,2.29845e-05f, 0.999985f,1.62785e-05f, 0.999988f,1.12382e-05f, +0.999988f,7.53158e-06f, 0.999996f,4.87458e-06f, 0.999996f,3.02678e-06f, 0.999997f,1.78729e-06f, 0.999997f,9.91806e-07f, +0.999999f,5.08708e-07f, 0.999999f,2.35362e-07f, 0.999999f,9.4587e-08f, 1.f,3.09939e-08f, 1.f,7.35508e-09f, +1.f,9.6856e-10f, 1.f,3.02675e-11f, 1.f,0.f, + +0.00481949f,0.82372f, 0.0374275f,0.923088f, 0.0748831f,0.90541f, 0.111238f,0.875679f, 0.146459f,0.843787f, +0.180562f,0.811688f, 0.213569f,0.78002f, 0.245505f,0.749041f, 0.276395f,0.718868f, 0.306267f,0.689558f, +0.335143f,0.661128f, 0.36305f,0.633588f, 0.390011f,0.606933f, 0.416051f,0.581151f, 0.441195f,0.556231f, +0.465464f,0.532154f, 0.488881f,0.508903f, 0.511473f,0.486461f, 0.533256f,0.46481f, 0.554254f,0.44393f, +0.574492f,0.4238f, 0.593985f,0.404402f, 0.612758f,0.385718f, 0.63083f,0.367726f, 0.648221f,0.35041f, +0.664948f,0.333749f, 0.681032f,0.317726f, 0.696492f,0.302323f, 0.711348f,0.287522f, 0.725614f,0.273306f, +0.73931f,0.259655f, 0.752456f,0.246555f, 0.765063f,0.233988f, 0.777151f,0.221938f, 0.788735f,0.210389f, +0.799834f,0.199326f, 0.810459f,0.188731f, 0.820629f,0.178593f, 0.830356f,0.168894f, 0.839657f,0.159621f, +0.848544f,0.150759f, 0.857034f,0.142295f, 0.865135f,0.134216f, 0.872867f,0.126507f, 0.880239f,0.119157f, +0.887264f,0.112152f, 0.893956f,0.10548f, 0.900324f,0.0991298f, 0.906384f,0.0930889f, 0.912143f,0.087346f, +0.917617f,0.0818899f, 0.922813f,0.0767099f, 0.92774f,0.0717956f, 0.932417f,0.0671361f, 0.936845f,0.0627218f, +0.941037f,0.0585426f, 0.945003f,0.0545894f, 0.948754f,0.0508526f, 0.952295f,0.047323f, 0.955639f,0.0439924f, +0.95879f,0.0408519f, 0.961759f,0.0378933f, 0.964556f,0.0351086f, 0.967185f,0.0324902f, 0.969655f,0.0300303f, +0.971972f,0.0277217f, 0.974146f,0.0255573f, 0.976183f,0.0235303f, 0.978086f,0.0216339f, 0.979867f,0.0198618f, +0.981531f,0.0182078f, 0.983081f,0.0166658f, 0.984524f,0.0152301f, 0.985867f,0.0138951f, 0.987115f,0.0126554f, +0.988272f,0.0115058f, 0.989344f,0.0104413f, 0.990333f,0.00945706f, 0.991248f,0.00854854f, 0.992093f,0.00771118f, +0.992868f,0.00694076f, 0.993585f,0.00623319f, 0.994238f,0.00558451f, 0.994838f,0.00499103f, 0.995387f,0.00444909f, +0.995885f,0.0039553f, 0.996339f,0.00350634f, 0.996753f,0.00309912f, 0.997127f,0.00273063f, 0.997464f,0.00239807f, +0.997769f,0.00209872f, 0.998043f,0.00183004f, 0.998288f,0.00158962f, 0.998506f,0.00137515f, 0.998703f,0.00118448f, +0.998874f,0.00101557f, 0.999028f,0.000866506f, 0.999165f,0.000735482f, 0.999285f,0.000620809f, 0.999387f,0.000520908f, +0.999479f,0.000434303f, 0.999559f,0.00035962f, 0.999626f,0.000295584f, 0.999684f,0.000241013f, 0.999732f,0.000194816f, +0.999776f,0.000155992f, 0.999813f,0.00012362f, 0.999843f,9.686e-05f, 0.999868f,7.49491e-05f, 0.999889f,5.71958e-05f, +0.999906f,4.29784e-05f, 0.99992f,3.17402e-05f, 0.999934f,2.29864e-05f, 0.999942f,1.62802e-05f, 0.99995f,1.12393e-05f, +0.999959f,7.53244e-06f, 0.999965f,4.87528e-06f, 0.999969f,3.02721e-06f, 0.999972f,1.78758e-06f, 0.999977f,9.92001e-07f, +0.999979f,5.08818e-07f, 0.999981f,2.3542e-07f, 0.999987f,9.46147e-08f, 0.99999f,3.10055e-08f, 0.999992f,7.35861e-09f, +0.999996f,9.69246e-10f, 0.999998f,3.03082e-11f, 1.f,8.57764e-25f, + +0.00793899f,0.795161f, 0.0363458f,0.883401f, 0.0735482f,0.88601f, 0.109812f,0.862934f, 0.14504f,0.834928f, +0.179147f,0.80492f, 0.212168f,0.77464f, 0.244123f,0.744647f, 0.275037f,0.715208f, 0.304933f,0.686462f, +0.333835f,0.658481f, 0.361768f,0.631302f, 0.388757f,0.604942f, 0.414824f,0.579408f, 0.439994f,0.554694f, +0.46429f,0.530795f, 0.487735f,0.507696f, 0.510351f,0.485387f, 0.532161f,0.463849f, 0.553186f,0.443068f, +0.573447f,0.423026f, 0.592966f,0.403707f, 0.611762f,0.38509f, 0.629858f,0.36716f, 0.647271f,0.349898f, +0.664021f,0.333287f, 0.680129f,0.317307f, 0.695612f,0.301944f, 0.710488f,0.287178f, 0.724776f,0.272993f, +0.738494f,0.259371f, 0.751658f,0.246297f, 0.764286f,0.233753f, 0.776393f,0.221725f, 0.787997f,0.210195f, +0.799114f,0.199149f, 0.809758f,0.188571f, 0.819945f,0.178447f, 0.82969f,0.168761f, 0.839008f,0.1595f, +0.847912f,0.15065f, 0.856417f,0.142196f, 0.864535f,0.134125f, 0.872283f,0.126425f, 0.87967f,0.119082f, +0.88671f,0.112085f, 0.893416f,0.105419f, 0.899799f,0.0990744f, 0.905872f,0.0930387f, 0.911645f,0.0873007f, +0.917132f,0.081849f, 0.922341f,0.076673f, 0.927283f,0.071762f, 0.931969f,0.067106f, 0.93641f,0.0626946f, +0.940615f,0.0585183f, 0.944593f,0.0545674f, 0.948353f,0.0508327f, 0.951905f,0.0473054f, 0.95526f,0.0439765f, +0.958422f,0.0408377f, 0.961402f,0.0378807f, 0.964207f,0.0350974f, 0.966845f,0.0324801f, 0.969326f,0.0300214f, +0.971653f,0.0277138f, 0.973836f,0.0255503f, 0.975881f,0.023524f, 0.977795f,0.0216284f, 0.979585f,0.019857f, +0.981256f,0.0182035f, 0.982814f,0.0166621f, 0.984265f,0.0152269f, 0.985616f,0.0138923f, 0.986871f,0.012653f, +0.988036f,0.0115037f, 0.989114f,0.0104395f, 0.990114f,0.00945551f, 0.991035f,0.00854717f, 0.991886f,0.00771002f, +0.992669f,0.00693978f, 0.99339f,0.00623235f, 0.99405f,0.00558383f, 0.994656f,0.00499045f, 0.995211f,0.00444862f, +0.995716f,0.0039549f, 0.996176f,0.00350602f, 0.996595f,0.00309886f, 0.996974f,0.00273043f, 0.997318f,0.00239791f, +0.997628f,0.0020986f, 0.997907f,0.00182995f, 0.998157f,0.00158955f, 0.998381f,0.0013751f, 0.998581f,0.00118445f, +0.998759f,0.00101555f, 0.998918f,0.000866497f, 0.999058f,0.00073548f, 0.999181f,0.000620813f, 0.99929f,0.000520916f, +0.999385f,0.000434313f, 0.999469f,0.000359632f, 0.99954f,0.000295596f, 0.999603f,0.000241025f, 0.999657f,0.000194828f, +0.999704f,0.000156003f, 0.999743f,0.00012363f, 0.999777f,9.68692e-05f, 0.999807f,7.49571e-05f, 0.999832f,5.72027e-05f, +0.999853f,4.29842e-05f, 0.999872f,3.17449e-05f, 0.999887f,2.29902e-05f, 0.9999f,1.62832e-05f, 0.999912f,1.12417e-05f, +0.999922f,7.53418e-06f, 0.999931f,4.87653e-06f, 0.999939f,3.02809e-06f, 0.999946f,1.78816e-06f, 0.999953f,9.9237e-07f, +0.999961f,5.09037e-07f, 0.999966f,2.3554e-07f, 0.999973f,9.46727e-08f, 0.999977f,3.10294e-08f, 0.999982f,7.36613e-09f, +0.99999f,9.70726e-10f, 0.999994f,3.04003e-11f, 1.f,4.49891e-22f, + +0.0136761f,0.785272f, 0.0355416f,0.832397f, 0.0720802f,0.859307f, 0.108175f,0.846411f, 0.143282f,0.822624f, +0.177329f,0.795319f, 0.210375f,0.767286f, 0.242339f,0.738646f, 0.273269f,0.710208f, 0.303187f,0.682232f, +0.332115f,0.654859f, 0.360077f,0.628172f, 0.387095f,0.602217f, 0.413194f,0.57702f, 0.438397f,0.552591f, +0.462725f,0.528934f, 0.486203f,0.506044f, 0.508852f,0.483913f, 0.530694f,0.462532f, 0.551751f,0.441888f, +0.572045f,0.421967f, 0.591595f,0.402754f, 0.610424f,0.384231f, 0.62855f,0.366385f, 0.645993f,0.349198f, +0.662774f,0.332653f, 0.678912f,0.316734f, 0.694423f,0.301424f, 0.709328f,0.286707f, 0.723644f,0.272565f, +0.737389f,0.258983f, 0.75058f,0.245944f, 0.763235f,0.233434f, 0.775367f,0.221434f, 0.786998f,0.209931f, +0.798139f,0.198909f, 0.808807f,0.188353f, 0.819019f,0.178249f, 0.828787f,0.168582f, 0.838127f,0.159337f, +0.847054f,0.150501f, 0.855581f,0.142061f, 0.863722f,0.134003f, 0.871489f,0.126314f, 0.878897f,0.118982f, +0.885957f,0.111993f, 0.892682f,0.105337f, 0.899085f,0.099f, 0.905177f,0.0929714f, 0.910969f,0.0872398f, +0.916472f,0.0817942f, 0.921699f,0.0766235f, 0.926659f,0.0717175f, 0.931362f,0.0670659f, 0.935819f,0.0626585f, +0.940039f,0.0584859f, 0.944034f,0.0545383f, 0.94781f,0.0508068f, 0.951377f,0.0472821f, 0.954745f,0.0439558f, +0.957922f,0.0408192f, 0.960916f,0.0378642f, 0.963735f,0.0350828f, 0.966388f,0.0324672f, 0.96888f,0.0300099f, +0.97122f,0.0277037f, 0.973417f,0.0255414f, 0.975474f,0.0235162f, 0.977399f,0.0216215f, 0.9792f,0.019851f, +0.980883f,0.0181983f, 0.982451f,0.0166576f, 0.983913f,0.015223f, 0.985276f,0.0138889f, 0.986542f,0.0126501f, +0.987715f,0.0115012f, 0.988805f,0.0104374f, 0.989812f,0.00945375f, 0.990744f,0.00854569f, 0.991605f,0.00770878f, +0.992397f,0.00693876f, 0.993126f,0.00623153f, 0.993796f,0.00558316f, 0.99441f,0.00498991f, 0.994971f,0.0044482f, +0.995487f,0.00395458f, 0.995954f,0.00350579f, 0.996381f,0.00309869f, 0.996768f,0.00273032f, 0.997118f,0.00239784f, +0.997436f,0.00209857f, 0.997721f,0.00182995f, 0.997978f,0.00158957f, 0.998209f,0.00137514f, 0.998417f,0.0011845f, +0.998602f,0.00101561f, 0.998767f,0.000866557f, 0.998914f,0.000735544f, 0.999043f,0.000620878f, 0.999158f,0.000520978f, +0.999258f,0.000434373f, 0.999348f,0.000359687f, 0.999426f,0.000295647f, 0.999493f,0.000241071f, 0.999553f,0.000194869f, +0.999605f,0.00015604f, 0.999651f,0.000123662f, 0.999689f,9.68967e-05f, 0.999723f,7.49804e-05f, 0.999755f,5.72222e-05f, +0.99978f,4.30002e-05f, 0.999804f,3.17579e-05f, 0.999823f,2.30004e-05f, 0.999841f,1.62912e-05f, 0.999857f,1.12477e-05f, +0.999873f,7.53867e-06f, 0.999886f,4.87976e-06f, 0.999898f,3.03034e-06f, 0.999911f,1.78966e-06f, 0.999921f,9.93318e-07f, +0.999932f,5.096e-07f, 0.999942f,2.35847e-07f, 0.999951f,9.48222e-08f, 0.999962f,3.10912e-08f, 0.999971f,7.38587e-09f, +0.999981f,9.74677e-10f, 0.99999f,3.06548e-11f, 1.f,1.08921e-19f, + +0.0202734f,0.767652f, 0.0352934f,0.775016f, 0.0707147f,0.827819f, 0.106351f,0.824625f, 0.141292f,0.807202f, +0.17529f,0.783846f, 0.20824f,0.757732f, 0.240162f,0.730692f, 0.271095f,0.703627f, 0.301059f,0.676828f, +0.33001f,0.650243f, 0.357998f,0.624184f, 0.385047f,0.598745f, 0.411179f,0.573977f, 0.436416f,0.549911f, +0.460781f,0.526561f, 0.484295f,0.503936f, 0.506983f,0.482035f, 0.528862f,0.460854f, 0.549958f,0.440384f, +0.570289f,0.420617f, 0.589878f,0.401539f, 0.608744f,0.383137f, 0.626908f,0.365398f, 0.644389f,0.348306f, +0.661206f,0.331847f, 0.677379f,0.316004f, 0.692927f,0.300763f, 0.707866f,0.286107f, 0.722217f,0.272022f, +0.735996f,0.25849f, 0.749221f,0.245497f, 0.761908f,0.233028f, 0.774074f,0.221065f, 0.785735f,0.209597f, +0.796907f,0.198605f, 0.807606f,0.188078f, 0.817847f,0.177999f, 0.827645f,0.168354f, 0.837014f,0.159131f, +0.845969f,0.150314f, 0.854523f,0.141892f, 0.86269f,0.13385f, 0.870485f,0.126176f, 0.877918f,0.118856f, +0.885003f,0.11188f, 0.891753f,0.105234f, 0.898181f,0.0989071f, 0.904296f,0.0928876f, 0.910111f,0.0871642f, +0.915638f,0.0817261f, 0.920887f,0.0765623f, 0.925868f,0.0716626f, 0.930591f,0.0670166f, 0.93507f,0.0626144f, +0.939311f,0.0584464f, 0.943324f,0.0545031f, 0.94712f,0.0507752f, 0.950706f,0.0472541f, 0.954093f,0.0439309f, +0.957289f,0.0407971f, 0.9603f,0.0378446f, 0.963136f,0.0350655f, 0.965805f,0.032452f, 0.968314f,0.0299965f, +0.970671f,0.0276919f, 0.972882f,0.0255311f, 0.974956f,0.0235073f, 0.976897f,0.0216138f, 0.978712f,0.0198443f, +0.980409f,0.0181926f, 0.981992f,0.0166527f, 0.983468f,0.0152188f, 0.984843f,0.0138854f, 0.986122f,0.0126471f, +0.98731f,0.0114988f, 0.988411f,0.0104353f, 0.989432f,0.0094521f, 0.990375f,0.00854436f, 0.991247f,0.00770774f, +0.992051f,0.00693795f, 0.992792f,0.00623091f, 0.993473f,0.00558273f, 0.994097f,0.00498962f, 0.99467f,0.00444803f, +0.995194f,0.00395451f, 0.995672f,0.00350579f, 0.996109f,0.00309876f, 0.996505f,0.00273043f, 0.996864f,0.00239799f, +0.997192f,0.00209874f, 0.997487f,0.00183014f, 0.997754f,0.00158977f, 0.997992f,0.00137534f, 0.998208f,0.0011847f, +0.998403f,0.00101581f, 0.998575f,0.00086675f, 0.998729f,0.000735725f, 0.998867f,0.000621047f, 0.99899f,0.000521135f, +0.999098f,0.000434515f, 0.999194f,0.000359816f, 0.999278f,0.000295763f, 0.999354f,0.000241173f, 0.999422f,0.000194959f, +0.99948f,0.000156118f, 0.999532f,0.000123729f, 0.999578f,9.69535e-05f, 0.999619f,7.50279e-05f, 0.999656f,5.72615e-05f, +0.999688f,4.30322e-05f, 0.999717f,3.17836e-05f, 0.999743f,2.30207e-05f, 0.999767f,1.63069e-05f, 0.99979f,1.12596e-05f, +0.99981f,7.54744e-06f, 0.999828f,4.88606e-06f, 0.999846f,3.0347e-06f, 0.999864f,1.79256e-06f, 0.99988f,9.95152e-07f, +0.999896f,5.10689e-07f, 0.999911f,2.36442e-07f, 0.999926f,9.51128e-08f, 0.999941f,3.12119e-08f, 0.999956f,7.42476e-09f, +0.99997f,9.82586e-10f, 0.999984f,3.11885e-11f, 1.f,6.75637e-18f, + +0.028675f,0.762755f, 0.0361374f,0.717796f, 0.0697061f,0.790077f, 0.104705f,0.799813f, 0.139273f,0.788486f, +0.172992f,0.768671f, 0.205906f,0.746194f, 0.237821f,0.721553f, 0.268707f,0.695857f, 0.298607f,0.669986f, +0.327537f,0.644286f, 0.355514f,0.618955f, 0.382656f,0.594451f, 0.408824f,0.570238f, 0.434095f,0.546622f, +0.458496f,0.523654f, 0.482049f,0.501354f, 0.504774f,0.479735f, 0.526695f,0.458798f, 0.547831f,0.438543f, +0.568205f,0.418964f, 0.587835f,0.400053f, 0.606743f,0.381798f, 0.624949f,0.36419f, 0.642472f,0.347215f, +0.659331f,0.330861f, 0.675546f,0.315112f, 0.691135f,0.299956f, 0.706115f,0.285376f, 0.720506f,0.271359f, +0.734325f,0.257889f, 0.747588f,0.244952f, 0.760314f,0.232533f, 0.772518f,0.220617f, 0.784216f,0.20919f, +0.795425f,0.198237f, 0.80616f,0.187743f, 0.816436f,0.177695f, 0.826269f,0.168079f, 0.835672f,0.158882f, +0.84466f,0.150089f, 0.853247f,0.141688f, 0.861447f,0.133665f, 0.869273f,0.126009f, 0.876737f,0.118705f, +0.883852f,0.111744f, 0.890632f,0.105111f, 0.897088f,0.0987965f, 0.903232f,0.0927881f, 0.909074f,0.0870748f, +0.914628f,0.0816458f, 0.919904f,0.0764904f, 0.924912f,0.0715981f, 0.929661f,0.066959f, 0.934165f,0.0625629f, +0.938429f,0.0584005f, 0.942468f,0.0544623f, 0.946287f,0.0507391f, 0.949896f,0.0472221f, 0.953305f,0.0439026f, +0.956521f,0.0407722f, 0.959554f,0.0378228f, 0.962412f,0.0350464f, 0.965102f,0.0324353f, 0.967631f,0.029982f, +0.970007f,0.0276794f, 0.972238f,0.0255203f, 0.974329f,0.023498f, 0.976289f,0.0216059f, 0.978121f,0.0198376f, +0.979836f,0.018187f, 0.981436f,0.016648f, 0.982929f,0.0152149f, 0.98432f,0.0138823f, 0.985615f,0.0126446f, +0.986818f,0.0114968f, 0.987934f,0.0104339f, 0.98897f,0.00945101f, 0.989928f,0.00854362f, 0.990815f,0.00770728f, +0.991633f,0.00693773f, 0.992388f,0.0062309f, 0.993081f,0.00558286f, 0.99372f,0.00498989f, 0.994305f,0.00444839f, +0.994841f,0.00395494f, 0.995332f,0.00350629f, 0.99578f,0.00309929f, 0.996188f,0.00273098f, 0.996561f,0.00239855f, +0.996897f,0.0020993f, 0.997203f,0.00183069f, 0.997481f,0.0015903f, 0.997731f,0.00137585f, 0.997957f,0.00118518f, +0.99816f,0.00101626f, 0.998344f,0.000867167f, 0.998508f,0.000736109f, 0.998654f,0.000621397f, 0.998787f,0.000521452f, +0.998904f,0.000434801f, 0.999009f,0.000360071f, 0.999103f,0.000295988f, 0.999187f,0.000241371f, 0.999261f,0.000195131f, +0.99933f,0.000156265f, 0.999389f,0.000123854f, 0.999443f,9.70592e-05f, 0.999492f,7.5116e-05f, 0.999536f,5.7334e-05f, +0.999575f,4.3091e-05f, 0.999613f,3.18307e-05f, 0.999646f,2.30578e-05f, 0.999677f,1.63355e-05f, 0.999707f,1.12812e-05f, +0.999734f,7.56339e-06f, 0.999759f,4.8975e-06f, 0.999784f,3.04263e-06f, 0.999809f,1.79784e-06f, 0.999831f,9.985e-07f, +0.999854f,5.12682e-07f, 0.999875f,2.37536e-07f, 0.999896f,9.56505e-08f, 0.999918f,3.14374e-08f, 0.999938f,7.4985e-09f, +0.999958f,9.98022e-10f, 0.999978f,3.23201e-11f, 1.f,2.2521e-16f, + +0.0378261f,0.750319f, 0.0381689f,0.665902f, 0.0692973f,0.749911f, 0.103245f,0.77066f, 0.137335f,0.767205f, +0.170812f,0.752526f, 0.203425f,0.732312f, 0.235166f,0.70984f, 0.266048f,0.686441f, 0.295971f,0.662286f, +0.324899f,0.637724f, 0.352883f,0.613287f, 0.379944f,0.589183f, 0.406101f,0.565531f, 0.431372f,0.542411f, +0.455778f,0.519871f, 0.479466f,0.498247f, 0.502239f,0.476986f, 0.524203f,0.456348f, 0.545384f,0.436351f, +0.565801f,0.416998f, 0.585477f,0.398285f, 0.604431f,0.380207f, 0.622682f,0.362756f, 0.640251f,0.345921f, +0.657156f,0.329691f, 0.673416f,0.314054f, 0.689051f,0.298999f, 0.704078f,0.28451f, 0.718514f,0.270574f, +0.732377f,0.257178f, 0.745685f,0.244308f, 0.758454f,0.231949f, 0.770701f,0.220088f, 0.782442f,0.20871f, +0.793693f,0.197802f, 0.804469f,0.187349f, 0.814785f,0.177339f, 0.824658f,0.167757f, 0.834101f,0.15859f, +0.843128f,0.149825f, 0.851753f,0.141449f, 0.859989f,0.13345f, 0.867852f,0.125814f, 0.875352f,0.11853f, +0.882503f,0.111586f, 0.889317f,0.104969f, 0.895806f,0.0986689f, 0.901984f,0.0926736f, 0.90786f,0.0869722f, +0.913444f,0.0815539f, 0.918751f,0.0764083f, 0.923788f,0.0715249f, 0.928569f,0.0668938f, 0.933101f,0.062505f, +0.937395f,0.0583492f, 0.94146f,0.054417f, 0.945307f,0.0506991f, 0.948943f,0.0471869f, 0.952378f,0.0438718f, +0.955621f,0.0407453f, 0.958679f,0.0377994f, 0.961561f,0.0350261f, 0.964274f,0.0324178f, 0.966827f,0.0299671f, +0.969226f,0.0276666f, 0.971479f,0.0255096f, 0.973593f,0.023489f, 0.975573f,0.0215984f, 0.977428f,0.0198315f, +0.979163f,0.018182f, 0.980783f,0.0166441f, 0.982295f,0.0152119f, 0.983706f,0.01388f, 0.98502f,0.012643f, +0.986241f,0.0114958f, 0.987376f,0.0104333f, 0.988428f,0.00945086f, 0.989404f,0.00854381f, 0.990307f,0.00770774f, +0.991141f,0.0069384f, 0.991911f,0.00623174f, 0.992622f,0.00558383f, 0.993275f,0.00499096f, 0.993875f,0.00444952f, +0.994427f,0.00395611f, 0.994932f,0.00350746f, 0.995394f,0.00310046f, 0.995815f,0.00273214f, 0.996202f,0.00239967f, +0.996552f,0.00210037f, 0.996871f,0.00183171f, 0.997161f,0.00159127f, 0.997424f,0.00137675f, 0.997662f,0.00118602f, +0.997877f,0.00101704f, 0.998071f,0.000867883f, 0.998247f,0.000736761f, 0.998405f,0.000621987f, 0.998548f,0.000521983f, +0.998676f,0.000435274f, 0.998792f,0.00036049f, 0.998897f,0.000296356f, 0.998991f,0.000241692f, 0.999076f,0.000195408f, +0.999152f,0.000156503f, 0.999222f,0.000124056f, 0.999285f,9.7229e-05f, 0.999343f,7.52571e-05f, 0.999396f,5.74499e-05f, +0.999445f,4.31851e-05f, 0.999491f,3.19058e-05f, 0.999532f,2.31168e-05f, 0.999573f,1.6381e-05f, 0.999609f,1.13157e-05f, +0.999646f,7.58883e-06f, 0.999678f,4.91576e-06f, 0.999711f,3.05531e-06f, 0.999743f,1.80631e-06f, 0.999774f,1.00389e-06f, +0.999802f,5.15902e-07f, 0.999831f,2.39315e-07f, 0.999861f,9.65325e-08f, 0.999889f,3.18121e-08f, 0.999916f,7.62378e-09f, +0.999943f,1.02542e-09f, 0.999971f,3.46055e-11f, 1.f,4.11135e-15f, + +0.0484631f,0.740882f, 0.0417663f,0.623721f, 0.0698224f,0.708895f, 0.102352f,0.739251f, 0.135623f,0.742489f, +0.168703f,0.733549f, 0.201039f,0.716987f, 0.232607f,0.697193f, 0.263254f,0.675234f, 0.293018f,0.652443f, +0.321982f,0.629668f, 0.349984f,0.60649f, 0.377076f,0.583381f, 0.403248f,0.560464f, 0.428539f,0.53795f, +0.452973f,0.515923f, 0.476566f,0.494436f, 0.499341f,0.473523f, 0.521316f,0.453205f, 0.542512f,0.433494f, +0.563066f,0.41462f, 0.582812f,0.396193f, 0.601818f,0.378335f, 0.62012f,0.361073f, 0.637738f,0.344405f, +0.654693f,0.328323f, 0.671003f,0.312819f, 0.686687f,0.297882f, 0.701762f,0.2835f, 0.716248f,0.26966f, +0.73016f,0.256351f, 0.743517f,0.243559f, 0.756334f,0.231271f, 0.768629f,0.219475f, 0.780416f,0.208155f, +0.791714f,0.197299f, 0.802536f,0.186895f, 0.812899f,0.176928f, 0.822815f,0.167385f, 0.832302f,0.158254f, +0.841373f,0.149522f, 0.85004f,0.141176f, 0.858319f,0.133204f, 0.866223f,0.125593f, 0.873762f,0.118331f, +0.880953f,0.111407f, 0.887807f,0.104809f, 0.894335f,0.0985254f, 0.900549f,0.0925453f, 0.906461f,0.0868577f, +0.912083f,0.0814519f, 0.917425f,0.0763176f, 0.922498f,0.0714445f, 0.927311f,0.0668226f, 0.931878f,0.0624423f, +0.936204f,0.058294f, 0.940301f,0.0543685f, 0.944179f,0.0506568f, 0.947847f,0.0471501f, 0.951313f,0.0438399f, +0.954583f,0.0407179f, 0.95767f,0.0377759f, 0.96058f,0.0350062f, 0.963322f,0.032401f, 0.965901f,0.029953f, +0.968327f,0.027655f, 0.970606f,0.0255001f, 0.972745f,0.0234815f, 0.97475f,0.0215926f, 0.97663f,0.0198271f, +0.978387f,0.0181788f, 0.980031f,0.016642f, 0.981566f,0.0152107f, 0.982998f,0.0138796f, 0.984334f,0.0126433f, +0.985576f,0.0114966f, 0.986732f,0.0104345f, 0.987804f,0.00945244f, 0.9888f,0.00854566f, 0.989722f,0.0077098f, +0.990576f,0.00694062f, 0.991365f,0.00623405f, 0.992093f,0.0055862f, 0.992764f,0.00499334f, 0.993381f,0.0044519f, +0.99395f,0.00395845f, 0.994472f,0.00350974f, 0.99495f,0.00310266f, 0.995388f,0.00273424f, 0.995788f,0.00240167f, +0.996155f,0.00210227f, 0.996489f,0.00183349f, 0.996793f,0.00159292f, 0.99707f,0.00137829f, 0.997322f,0.00118744f, +0.99755f,0.00101833f, 0.997758f,0.00086906f, 0.997948f,0.000737827f, 0.998118f,0.000622946f, 0.998274f,0.000522839f, +0.998415f,0.000436035f, 0.998542f,0.000361161f, 0.998659f,0.000296943f, 0.998765f,0.000242202f, 0.998861f,0.000195848f, +0.998949f,0.000156879f, 0.99903f,0.000124375f, 0.999103f,9.74968e-05f, 0.999172f,7.54795e-05f, 0.999235f,5.76324e-05f, +0.999294f,4.3333e-05f, 0.999349f,3.20239e-05f, 0.999402f,2.32098e-05f, 0.999451f,1.64529e-05f, 0.999498f,1.137e-05f, +0.999542f,7.62904e-06f, 0.999586f,4.94469e-06f, 0.999627f,3.07547e-06f, 0.999668f,1.81982e-06f, 0.999707f,1.01253e-06f, +0.999745f,5.21106e-07f, 0.999783f,2.42216e-07f, 0.99982f,9.79909e-08f, 0.999857f,3.24446e-08f, 0.999892f,7.84256e-09f, +0.999927f,1.07658e-09f, 0.999963f,3.97831e-11f, 1.f,5.32808e-14f, + +0.0599245f,0.728967f, 0.0468215f,0.591592f, 0.0714001f,0.669159f, 0.102144f,0.706529f, 0.134372f,0.716113f, +0.16675f,0.711701f, 0.198778f,0.69991f, 0.230037f,0.682748f, 0.260559f,0.663376f, 0.290166f,0.642141f, +0.318912f,0.620252f, 0.346772f,0.59803f, 0.373894f,0.576256f, 0.400075f,0.554296f, 0.425431f,0.532705f, +0.449904f,0.511351f, 0.473528f,0.490392f, 0.496335f,0.469925f, 0.518345f,0.449991f, 0.53958f,0.430615f, +0.560058f,0.411811f, 0.579799f,0.393587f, 0.598821f,0.375945f, 0.617144f,0.358882f, 0.634788f,0.342396f, +0.651909f,0.32668f, 0.668299f,0.311373f, 0.684043f,0.296586f, 0.699174f,0.282332f, 0.713713f,0.268607f, +0.727679f,0.2554f, 0.741088f,0.2427f, 0.753958f,0.230495f, 0.766304f,0.218772f, 0.778144f,0.20752f, +0.789492f,0.196726f, 0.800364f,0.186377f, 0.810777f,0.17646f, 0.820743f,0.166964f, 0.830278f,0.157874f, +0.839396f,0.14918f, 0.848111f,0.140868f, 0.856436f,0.132927f, 0.864385f,0.125344f, 0.871971f,0.118108f, +0.879206f,0.111208f, 0.886103f,0.104631f, 0.892674f,0.0983663f, 0.898931f,0.0924037f, 0.904885f,0.0867318f, +0.910547f,0.0813405f, 0.915928f,0.076219f, 0.92104f,0.0713575f, 0.925892f,0.0667463f, 0.930494f,0.0623754f, +0.934858f,0.0582356f, 0.938991f,0.0543179f, 0.942905f,0.0506131f, 0.946607f,0.0471126f, 0.950106f,0.0438079f, +0.953412f,0.0406908f, 0.956531f,0.0377531f, 0.959472f,0.0349873f, 0.962245f,0.0323856f, 0.964855f,0.0299407f, +0.96731f,0.0276453f, 0.969619f,0.0254928f, 0.971785f,0.0234761f, 0.97382f,0.021589f, 0.975725f,0.019825f, +0.977511f,0.018178f, 0.979181f,0.0166423f, 0.980741f,0.015212f, 0.982199f,0.0138816f, 0.983558f,0.0126459f, +0.984824f,0.0114997f, 0.986004f,0.010438f, 0.9871f,0.0094562f, 0.988117f,0.00854963f, 0.989062f,0.0077139f, +0.989936f,0.00694478f, 0.990746f,0.00623822f, 0.991495f,0.00559033f, 0.992186f,0.0049974f, 0.992824f,0.00445585f, +0.993411f,0.00396226f, 0.993951f,0.00351339f, 0.994447f,0.00310614f, 0.994904f,0.00273754f, 0.995323f,0.00240478f, +0.995706f,0.00210518f, 0.996056f,0.0018362f, 0.996378f,0.00159543f, 0.996671f,0.0013806f, 0.996938f,0.00118956f, +0.997182f,0.00102026f, 0.997406f,0.000870812f, 0.997609f,0.000739407f, 0.997795f,0.000624363f, 0.997964f,0.000524102f, +0.99812f,0.000437154f, 0.998261f,0.000362146f, 0.99839f,0.000297804f, 0.998509f,0.00024295f, 0.998619f,0.000196493f, +0.998719f,0.00015743f, 0.998813f,0.000124842f, 0.998898f,9.78884e-05f, 0.998978f,7.58049e-05f, 0.999054f,5.78997e-05f, +0.999125f,4.35498e-05f, 0.999191f,3.21974e-05f, 0.999254f,2.33464e-05f, 0.999314f,1.65587e-05f, 0.999372f,1.14504e-05f, +0.999427f,7.68863e-06f, 0.999481f,4.98775e-06f, 0.999532f,3.10563e-06f, 0.999584f,1.84016e-06f, 0.999632f,1.02563e-06f, +0.999679f,5.29084e-07f, 0.999727f,2.46727e-07f, 0.999773f,1.00303e-07f, 0.999819f,3.34768e-08f, 0.999865f,8.2171e-09f, +0.999908f,1.17278e-09f, 0.999953f,5.23614e-11f, 1.f,4.9827e-13f, + +0.0724374f,0.716948f, 0.0533872f,0.567321f, 0.0742314f,0.632341f, 0.102793f,0.672933f, 0.133742f,0.688331f, +0.165264f,0.688544f, 0.19667f,0.680214f, 0.227621f,0.66678f, 0.257859f,0.649714f, 0.287294f,0.630543f, +0.315959f,0.610453f, 0.343706f,0.589405f, 0.370623f,0.568219f, 0.396674f,0.54697f, 0.421976f,0.526175f, +0.446517f,0.505784f, 0.470155f,0.485469f, 0.493039f,0.465688f, 0.515114f,0.446287f, 0.536391f,0.42732f, +0.556911f,0.408862f, 0.576695f,0.39094f, 0.595764f,0.373563f, 0.614134f,0.356737f, 0.631826f,0.340462f, +0.648857f,0.324733f, 0.665246f,0.309548f, 0.681013f,0.2949f, 0.69617f,0.280779f, 0.71074f,0.267177f, +0.724838f,0.254196f, 0.738373f,0.241685f, 0.751315f,0.229594f, 0.763724f,0.217966f, 0.775622f,0.206795f, +0.787026f,0.196074f, 0.797954f,0.18579f, 0.808421f,0.175932f, 0.818441f,0.166488f, 0.828029f,0.157447f, +0.8372f,0.148796f, 0.845967f,0.140524f, 0.854342f,0.132618f, 0.862341f,0.125068f, 0.869976f,0.117861f, +0.87726f,0.110987f, 0.884205f,0.104435f, 0.890823f,0.0981922f, 0.897126f,0.0922494f, 0.903124f,0.0865956f, +0.908832f,0.0812203f, 0.914257f,0.0761136f, 0.919412f,0.0712653f, 0.924306f,0.066666f, 0.928952f,0.0623058f, +0.933355f,0.0581757f, 0.93753f,0.0542665f, 0.941482f,0.0505694f, 0.945222f,0.0470758f, 0.948758f,0.0437772f, +0.9521f,0.0406655f, 0.955256f,0.0377327f, 0.958234f,0.0349711f, 0.961041f,0.0323731f, 0.963685f,0.0299315f, +0.966173f,0.027639f, 0.968514f,0.0254888f, 0.970713f,0.0234744f, 0.972778f,0.021589f, 0.974715f,0.0198266f, +0.97653f,0.0181809f, 0.97823f,0.0166462f, 0.979819f,0.0152167f, 0.981304f,0.0138871f, 0.982691f,0.0126519f, +0.983984f,0.0115061f, 0.985189f,0.0104447f, 0.986311f,0.00946304f, 0.987353f,0.00855655f, 0.988322f,0.0077208f, +0.989222f,0.00695162f, 0.990055f,0.00624493f, 0.990826f,0.00559688f, 0.991539f,0.00500373f, 0.9922f,0.00446192f, +0.992809f,0.00396807f, 0.99337f,0.00351892f, 0.993887f,0.00311136f, 0.994364f,0.00274245f, 0.994801f,0.00240937f, +0.995204f,0.00210946f, 0.995574f,0.00184017f, 0.995913f,0.00159909f, 0.996224f,0.00138396f, 0.996509f,0.00119263f, +0.996771f,0.00102306f, 0.997011f,0.00087334f, 0.997231f,0.000741682f, 0.997434f,0.000626399f, 0.997619f,0.000525915f, +0.997789f,0.000438759f, 0.997946f,0.000363557f, 0.998091f,0.000299038f, 0.998224f,0.000244021f, 0.998347f,0.000197416f, +0.998462f,0.000158219f, 0.998569f,0.000125511f, 0.99867f,9.84504e-05f, 0.998762f,7.62722e-05f, 0.998851f,5.8284e-05f, +0.998934f,4.38622e-05f, 0.999013f,3.24479e-05f, 0.99909f,2.35444e-05f, 0.999162f,1.67124e-05f, 0.999231f,1.15675e-05f, +0.999298f,7.77596e-06f, 0.999364f,5.05121e-06f, 0.999426f,3.15039e-06f, 0.999487f,1.87062e-06f, 0.999547f,1.04547e-06f, +0.999606f,5.41329e-07f, 0.999664f,2.53782e-07f, 0.999722f,1.04014e-07f, 0.999777f,3.51997e-08f, 0.999832f,8.88335e-09f, +0.999887f,1.36587e-09f, 0.999942f,8.64521e-11f, 0.999999f,3.651e-12f, + +0.0856947f,0.703782f, 0.0613258f,0.549424f, 0.0783571f,0.599864f, 0.104453f,0.640229f, 0.133867f,0.660127f, +0.16433f,0.664329f, 0.194981f,0.659417f, 0.225383f,0.648849f, 0.255235f,0.634349f, 0.284513f,0.617836f, +0.312914f,0.59911f, 0.340551f,0.579639f, 0.367436f,0.559884f, 0.39342f,0.539617f, 0.418562f,0.519327f, +0.442957f,0.499393f, 0.466494f,0.479583f, 0.489394f,0.460488f, 0.511545f,0.441789f, 0.532851f,0.42331f, +0.553402f,0.405276f, 0.573315f,0.387885f, 0.592444f,0.370848f, 0.610866f,0.354304f, 0.628609f,0.338273f, +0.645693f,0.322762f, 0.662135f,0.30777f, 0.677954f,0.293294f, 0.693167f,0.279328f, 0.707792f,0.265865f, +0.721843f,0.252897f, 0.735342f,0.240414f, 0.748302f,0.228407f, 0.760738f,0.216866f, 0.772669f,0.20578f, +0.784108f,0.195137f, 0.795208f,0.185041f, 0.805795f,0.175306f, 0.81589f,0.165938f, 0.825543f,0.156959f, +0.834775f,0.148362f, 0.843598f,0.140136f, 0.852031f,0.132273f, 0.860085f,0.124761f, 0.867775f,0.117588f, +0.875111f,0.110745f, 0.88211f,0.10422f, 0.888779f,0.0980024f, 0.895131f,0.0920822f, 0.901181f,0.0864488f, +0.906938f,0.0810919f, 0.912411f,0.0760017f, 0.917613f,0.0711683f, 0.922554f,0.0665824f, 0.927245f,0.0622342f, +0.931693f,0.0581148f, 0.935912f,0.0542153f, 0.939907f,0.0505267f, 0.943689f,0.0470407f, 0.947267f,0.0437489f, +0.950651f,0.0406431f, 0.953846f,0.0377156f, 0.956862f,0.0349586f, 0.959708f,0.0323646f, 0.96239f,0.0299265f, +0.964915f,0.027637f, 0.967291f,0.0254895f, 0.969526f,0.0234772f, 0.971625f,0.0215937f, 0.973596f,0.0198328f, +0.975445f,0.0181884f, 0.977176f,0.0166547f, 0.978798f,0.015226f, 0.980313f,0.0138969f, 0.981731f,0.0126621f, +0.983053f,0.0115166f, 0.984288f,0.0104554f, 0.985438f,0.00947372f, 0.986509f,0.00856713f, 0.987505f,0.00773123f, +0.98843f,0.0069618f, 0.98929f,0.00625481f, 0.990086f,0.00560641f, 0.990825f,0.00501288f, 0.991509f,0.00447066f, +0.992142f,0.00397637f, 0.992728f,0.00352676f, 0.993267f,0.00311874f, 0.993765f,0.00274937f, 0.994225f,0.00241582f, +0.994649f,0.00211545f, 0.995039f,0.0018457f, 0.9954f,0.00160419f, 0.995731f,0.00138864f, 0.996036f,0.00119689f, +0.996316f,0.00102693f, 0.996575f,0.000876839f, 0.996813f,0.000744829f, 0.997033f,0.000629215f, 0.997236f,0.000528422f, +0.997423f,0.000440977f, 0.997598f,0.00036551f, 0.997758f,0.000300745f, 0.997909f,0.000245504f, 0.998049f,0.000198695f, +0.998179f,0.000159314f, 0.9983f,0.000126441f, 0.998414f,9.92325e-05f, 0.998525f,7.69241e-05f, 0.998627f,5.88216e-05f, +0.998724f,4.43003e-05f, 0.998818f,3.28005e-05f, 0.998906f,2.3824e-05f, 0.998992f,1.69307e-05f, 0.999075f,1.17348e-05f, +0.999155f,7.90147e-06f, 0.999232f,5.14314e-06f, 0.999308f,3.21583e-06f, 0.999382f,1.91567e-06f, 0.999455f,1.07525e-06f, +0.999525f,5.60054e-07f, 0.999595f,2.64839e-07f, 0.999664f,1.10033e-07f, 0.99973f,3.81371e-08f, 0.999797f,1.01137e-08f, +0.999863f,1.77788e-09f, 0.999929f,1.85982e-10f, 0.999998f,2.18422e-11f, + +0.0996969f,0.69019f, 0.0705858f,0.536134f, 0.0838118f,0.571881f, 0.107243f,0.609282f, 0.134824f,0.63127f, +0.164113f,0.639737f, 0.193835f,0.637765f, 0.223557f,0.629928f, 0.252956f,0.618122f, 0.281751f,0.603164f, +0.309995f,0.586837f, 0.337486f,0.569065f, 0.364131f,0.55025f, 0.390031f,0.531196f, 0.415204f,0.512176f, +0.439523f,0.492956f, 0.463018f,0.473812f, 0.485791f,0.455074f, 0.507783f,0.436616f, 0.529017f,0.418529f, +0.549645f,0.401109f, 0.569598f,0.384176f, 0.588775f,0.367541f, 0.607227f,0.351315f, 0.625072f,0.335673f, +0.642261f,0.320498f, 0.658771f,0.305751f, 0.67465f,0.291481f, 0.689922f,0.277696f, 0.704604f,0.264394f, +0.718717f,0.25157f, 0.732273f,0.239217f, 0.74529f,0.227327f, 0.757787f,0.215891f, 0.769776f,0.2049f, +0.781275f,0.194343f, 0.792297f,0.18421f, 0.802858f,0.174491f, 0.812973f,0.165174f, 0.822656f,0.156249f, +0.831921f,0.147705f, 0.840781f,0.13953f, 0.849343f,0.131774f, 0.857564f,0.124381f, 0.86534f,0.117266f, +0.872746f,0.110466f, 0.879807f,0.103977f, 0.886535f,0.0977906f, 0.892947f,0.0918976f, 0.899051f,0.0862882f, +0.904861f,0.0809528f, 0.910388f,0.0758818f, 0.915642f,0.0710655f, 0.920634f,0.0664948f, 0.925374f,0.0621603f, +0.929873f,0.0580531f, 0.934139f,0.0541643f, 0.938181f,0.0504854f, 0.94201f,0.0470079f, 0.945633f,0.0437236f, +0.94906f,0.0406244f, 0.9523f,0.0377027f, 0.95536f,0.0349507f, 0.958247f,0.0323611f, 0.96097f,0.0299267f, +0.963535f,0.0276405f, 0.965951f,0.0254957f, 0.968225f,0.0234856f, 0.970362f,0.021604f, 0.97237f,0.0198447f, +0.974254f,0.0182015f, 0.976021f,0.0166687f, 0.977677f,0.0152407f, 0.979228f,0.0139121f, 0.980678f,0.0126776f, +0.982034f,0.0115321f, 0.9833f,0.0104709f, 0.984481f,0.00948905f, 0.985583f,0.00858219f, 0.986608f,0.00774593f, +0.987564f,0.00697606f, 0.988451f,0.00626857f, 0.989276f,0.00561961f, 0.990043f,0.00502549f, 0.990753f,0.00448265f, +0.991412f,0.00398772f, 0.992022f,0.00353746f, 0.992587f,0.00312879f, 0.993109f,0.00275876f, 0.993594f,0.00242457f, +0.994041f,0.00212355f, 0.994455f,0.00185319f, 0.994836f,0.00161108f, 0.995189f,0.00139494f, 0.995516f,0.00120264f, +0.995818f,0.00103215f, 0.996097f,0.000881562f, 0.996356f,0.000749078f, 0.996595f,0.000633019f, 0.996818f,0.00053181f, +0.997024f,0.000443979f, 0.997216f,0.000368154f, 0.997396f,0.000303061f, 0.997563f,0.000247518f, 0.997721f,0.000200435f, +0.997869f,0.000160807f, 0.998007f,0.000127711f, 0.998138f,0.000100305f, 0.998262f,7.78208e-05f, 0.99838f,5.95639e-05f, +0.998494f,4.49079e-05f, 0.998602f,3.32918e-05f, 0.998706f,2.42158e-05f, 0.998807f,1.72384e-05f, 0.998904f,1.19723e-05f, +0.998998f,8.08123e-06f, 0.99909f,5.27614e-06f, 0.999179f,3.31167e-06f, 0.999266f,1.98263e-06f, 0.999352f,1.12033e-06f, +0.999436f,5.89072e-07f, 0.999518f,2.82508e-07f, 0.999599f,1.20063e-07f, 0.999679f,4.33353e-08f, 0.999758f,1.25019e-08f, +0.999836f,2.71252e-09f, 0.999914f,4.87336e-10f, 0.999997f,1.09682e-10f, + +0.114294f,0.675955f, 0.0810286f,0.525802f, 0.0905226f,0.548002f, 0.11119f,0.580711f, 0.136756f,0.603272f, +0.16455f,0.613858f, 0.193328f,0.615713f, 0.222209f,0.610182f, 0.250991f,0.600673f, 0.279347f,0.587955f, +0.307153f,0.573066f, 0.334337f,0.556833f, 0.360922f,0.53996f, 0.386698f,0.522151f, 0.41166f,0.503848f, +0.435908f,0.485582f, 0.459429f,0.467445f, 0.48219f,0.449419f, 0.504143f,0.431499f, 0.525341f,0.413868f, +0.545893f,0.396768f, 0.565692f,0.379975f, 0.584776f,0.363578f, 0.603286f,0.347797f, 0.621208f,0.332564f, +0.638478f,0.317752f, 0.655031f,0.303271f, 0.670947f,0.289228f, 0.686331f,0.275738f, 0.701135f,0.262701f, +0.715326f,0.250066f, 0.728951f,0.23787f, 0.742034f,0.226118f, 0.754595f,0.214805f, 0.766648f,0.203923f, +0.778209f,0.193465f, 0.789294f,0.183421f, 0.799918f,0.173782f, 0.810095f,0.164538f, 0.819839f,0.155679f, +0.829165f,0.147194f, 0.838087f,0.139073f, 0.846617f,0.131306f, 0.854769f,0.123883f, 0.862556f,0.116791f, +0.869989f,0.110022f, 0.877081f,0.103566f, 0.883846f,0.097411f, 0.890293f,0.091548f, 0.896611f,0.0860532f, +0.902544f,0.0807763f, 0.908151f,0.0757391f, 0.913472f,0.0709481f, 0.918526f,0.0663978f, 0.923325f,0.0620806f, +0.927878f,0.0579883f, 0.932198f,0.0541125f, 0.936293f,0.0504449f, 0.940173f,0.0469772f, 0.943847f,0.0437015f, +0.947323f,0.0406099f, 0.950611f,0.0376947f, 0.953716f,0.0349484f, 0.95665f,0.0323636f, 0.959417f,0.0299333f, +0.962028f,0.0276505f, 0.964487f,0.0255086f, 0.966802f,0.023501f, 0.968981f,0.0216213f, 0.971029f,0.0198634f, +0.972952f,0.0182214f, 0.97476f,0.0166895f, 0.976454f,0.0152621f, 0.978041f,0.0139338f, 0.979528f,0.0126994f, +0.980919f,0.0115538f, 0.982221f,0.0104923f, 0.983435f,0.00951011f, 0.98457f,0.00860274f, 0.985629f,0.00776586f, +0.986616f,0.00699531f, 0.987535f,0.00628707f, 0.98839f,0.00563731f, 0.989186f,0.00504234f, 0.989926f,0.00449864f, +0.990614f,0.00400283f, 0.991251f,0.00355168f, 0.991844f,0.00314212f, 0.992394f,0.00277121f, 0.992904f,0.00243615f, +0.993377f,0.00213429f, 0.993815f,0.0018631f, 0.994222f,0.00162019f, 0.9946f,0.00140329f, 0.994949f,0.00121026f, +0.995274f,0.00103907f, 0.995577f,0.00088782f, 0.995856f,0.000754713f, 0.996119f,0.00063807f, 0.996361f,0.000536315f, +0.996588f,0.000447975f, 0.996801f,0.000371681f, 0.997f,0.000306155f, 0.997187f,0.000250217f, 0.997362f,0.000202773f, +0.997528f,0.000162818f, 0.997686f,0.000129429f, 0.997835f,0.000101759f, 0.997978f,7.90418e-05f, 0.998113f,6.05791e-05f, +0.998243f,4.57433e-05f, 0.998367f,3.39712e-05f, 0.998488f,2.47613e-05f, 0.998605f,1.76701e-05f, 0.998718f,1.23086e-05f, +0.998826f,8.33841e-06f, 0.998934f,5.46877e-06f, 0.999037f,3.45255e-06f, 0.999139f,2.08281e-06f, 0.99924f,1.18928e-06f, +0.999338f,6.34693e-07f, 0.999434f,3.11301e-07f, 0.999528f,1.37209e-07f, 0.999623f,5.2837e-08f, 0.999715f,1.73181e-08f, +0.999806f,4.90744e-09f, 0.999896f,1.38859e-09f, 0.999994f,4.70601e-10f, + +0.129435f,0.661419f, 0.0925656f,0.517375f, 0.0984476f,0.527661f, 0.116309f,0.55469f, 0.139714f,0.576341f, +0.165897f,0.588571f, 0.193405f,0.592402f, 0.221484f,0.590127f, 0.249475f,0.582414f, 0.277295f,0.57185f, +0.304619f,0.558604f, 0.331508f,0.544169f, 0.357684f,0.528224f, 0.383249f,0.511735f, 0.408202f,0.495004f, +0.432353f,0.47773f, 0.455702f,0.460203f, 0.478378f,0.442891f, 0.500284f,0.425635f, 0.521613f,0.408911f, +0.542122f,0.392234f, 0.5619f,0.375847f, 0.58098f,0.359825f, 0.599473f,0.344355f, 0.617267f,0.329226f, +0.634396f,0.3145f, 0.650973f,0.300324f, 0.666986f,0.286639f, 0.682471f,0.273464f, 0.697324f,0.260644f, +0.711559f,0.248198f, 0.725227f,0.23617f, 0.738368f,0.224584f, 0.751107f,0.213531f, 0.763257f,0.202806f, +0.774897f,0.192473f, 0.786054f,0.182537f, 0.796748f,0.172993f, 0.806992f,0.163833f, 0.816803f,0.15505f, +0.826196f,0.146633f, 0.835182f,0.138573f, 0.843777f,0.130862f, 0.851994f,0.123488f, 0.859843f,0.116442f, +0.867338f,0.109714f, 0.874494f,0.103294f, 0.881319f,0.097173f, 0.887826f,0.0913401f, 0.894029f,0.085786f, +0.899935f,0.0805013f, 0.905557f,0.0754768f, 0.910907f,0.070703f, 0.915992f,0.066171f, 0.920824f,0.0618718f, +0.925415f,0.0577967f, 0.929972f,0.0540121f, 0.934185f,0.0503824f, 0.938144f,0.0469357f, 0.941885f,0.0436746f, +0.945421f,0.0405943f, 0.948764f,0.037688f, 0.951925f,0.0349491f, 0.954911f,0.0323704f, 0.957727f,0.0299452f, +0.960387f,0.0276666f, 0.962893f,0.0255281f, 0.965255f,0.0235233f, 0.96748f,0.0216458f, 0.969572f,0.0198896f, +0.97154f,0.0182488f, 0.973387f,0.0167177f, 0.975123f,0.0152908f, 0.976752f,0.0139627f, 0.978278f,0.0127283f, +0.979708f,0.0115825f, 0.981048f,0.0105205f, 0.982301f,0.0095377f, 0.983471f,0.00862958f, 0.984566f,0.00779185f, +0.985587f,0.00702034f, 0.986541f,0.0063111f, 0.987429f,0.00566026f, 0.988258f,0.00506418f, 0.989029f,0.00451934f, +0.989749f,0.00402238f, 0.990417f,0.00357007f, 0.991039f,0.00315936f, 0.991617f,0.00278731f, 0.992157f,0.00245114f, +0.992657f,0.00214818f, 0.993123f,0.00187594f, 0.993556f,0.00163201f, 0.993959f,0.00141413f, 0.994335f,0.00122016f, +0.994685f,0.00104807f, 0.995011f,0.000895973f, 0.995315f,0.000762066f, 0.9956f,0.000644673f, 0.995866f,0.000542215f, +0.996116f,0.000453223f, 0.99635f,0.000376323f, 0.99657f,0.000310239f, 0.996778f,0.00025379f, 0.996975f,0.000205879f, +0.997162f,0.000165501f, 0.997338f,0.000131729f, 0.997507f,0.000103717f, 0.997668f,8.06936e-05f, 0.997822f,6.19606e-05f, +0.997971f,4.68873e-05f, 0.998113f,3.49085e-05f, 0.998251f,2.55201e-05f, 0.998384f,1.82764e-05f, 0.998515f,1.27859e-05f, +0.998641f,8.70802e-06f, 0.998763f,5.74968e-06f, 0.998884f,3.66156e-06f, 0.999003f,2.23457e-06f, 0.999117f,1.29639e-06f, +0.999231f,7.07838e-07f, 0.999342f,3.59345e-07f, 0.999452f,1.67349e-07f, 0.999561f,7.07501e-08f, 0.999667f,2.73224e-08f, +0.999772f,1.01393e-08f, 0.999877f,3.98817e-09f, 0.99999f,1.76554e-09f, + +0.144963f,0.646512f, 0.105045f,0.509972f, 0.107477f,0.510285f, 0.122585f,0.531821f, 0.143736f,0.551196f, +0.168165f,0.563979f, 0.194324f,0.569585f, 0.221279f,0.568989f, 0.248565f,0.564041f, 0.275638f,0.55492f, +0.302502f,0.543743f, 0.328865f,0.530459f, 0.354781f,0.516241f, 0.380031f,0.50084f, 0.404653f,0.484917f, +0.428624f,0.468682f, 0.452017f,0.452507f, 0.474626f,0.436026f, 0.496438f,0.419402f, 0.517605f,0.403071f, +0.538099f,0.387006f, 0.557934f,0.371267f, 0.57712f,0.355868f, 0.595574f,0.340696f, 0.613355f,0.325874f, +0.630491f,0.311442f, 0.647081f,0.297532f, 0.663045f,0.284003f, 0.678389f,0.270861f, 0.693146f,0.258135f, +0.707458f,0.245963f, 0.721241f,0.234217f, 0.734562f,0.222942f, 0.747305f,0.211999f, 0.759497f,0.201409f, +0.771184f,0.1912f, 0.782388f,0.181377f, 0.793221f,0.172009f, 0.803607f,0.163005f, 0.813513f,0.154329f, +0.822987f,0.146f, 0.83205f,0.138015f, 0.840717f,0.13037f, 0.849002f,0.123054f, 0.856923f,0.11606f, +0.864485f,0.109379f, 0.871707f,0.103001f, 0.878598f,0.0969176f, 0.885172f,0.0911186f, 0.891437f,0.0855949f, +0.897407f,0.0803375f, 0.903091f,0.0753375f, 0.908502f,0.0705857f, 0.913648f,0.0660732f, 0.91854f,0.0617914f, +0.923188f,0.0577318f, 0.927602f,0.053886f, 0.93179f,0.0502458f, 0.935763f,0.046803f, 0.939527f,0.0435498f, +0.943093f,0.0404785f, 0.946468f,0.0375816f, 0.949661f,0.0348517f, 0.952882f,0.0323392f, 0.955827f,0.0299423f, +0.958567f,0.0276775f, 0.961141f,0.0255473f, 0.963562f,0.0235481f, 0.965841f,0.0216746f, 0.967984f,0.0199213f, +0.970001f,0.0182825f, 0.971899f,0.0167528f, 0.97368f,0.0153267f, 0.975354f,0.013999f, 0.976924f,0.0127646f, +0.978397f,0.0116185f, 0.979778f,0.010556f, 0.981071f,0.0095724f, 0.982282f,0.00866337f, 0.983414f,0.00782457f, +0.984474f,0.00705189f, 0.985464f,0.00634137f, 0.986389f,0.0056892f, 0.987253f,0.00509173f, 0.988059f,0.00454547f, +0.988811f,0.00404706f, 0.989513f,0.00359332f, 0.990168f,0.00318117f, 0.990779f,0.0028077f, 0.991348f,0.00247013f, +0.991878f,0.00216583f, 0.992374f,0.00189226f, 0.992835f,0.00164705f, 0.993267f,0.00142794f, 0.993671f,0.0012328f, +0.994047f,0.00105959f, 0.9944f,0.000906434f, 0.99473f,0.000771525f, 0.99504f,0.000653187f, 0.995332f,0.000549846f, +0.995604f,0.000460029f, 0.995862f,0.000382365f, 0.996107f,0.000315574f, 0.996336f,0.000258475f, 0.996556f,0.00020997f, +0.996763f,0.00016905f, 0.996962f,0.000134787f, 0.997151f,0.000106334f, 0.997332f,8.2916e-05f, 0.997506f,6.3832e-05f, +0.997675f,4.8449e-05f, 0.997837f,3.61988e-05f, 0.997993f,2.65748e-05f, 0.998146f,1.91283e-05f, 0.998294f,1.34649e-05f, +0.998438f,9.24139e-06f, 0.998579f,6.16184e-06f, 0.998717f,3.97422e-06f, 0.998851f,2.46686e-06f, 0.998984f,1.46494e-06f, +0.999113f,8.2688e-07f, 0.999242f,4.40876e-07f, 0.999366f,2.21275e-07f, 0.999491f,1.05058e-07f, 0.999613f,4.82674e-08f, +0.999734f,2.24437e-08f, 0.999855f,1.10559e-08f, 0.999984f,5.865e-09f, + +0.160753f,0.631274f, 0.118321f,0.503019f, 0.117501f,0.49541f, 0.129884f,0.511008f, 0.148783f,0.527861f, +0.171357f,0.540262f, 0.196043f,0.546972f, 0.221822f,0.548032f, 0.248109f,0.544646f, 0.274564f,0.537992f, +0.300713f,0.527978f, 0.32663f,0.516469f, 0.352096f,0.503454f, 0.376962f,0.489176f, 0.401408f,0.474673f, +0.42509f,0.459241f, 0.448188f,0.443709f, 0.470644f,0.428076f, 0.492545f,0.412646f, 0.513694f,0.397083f, +0.534084f,0.381495f, 0.55382f,0.366169f, 0.572941f,0.351189f, 0.591376f,0.336449f, 0.609278f,0.322209f, +0.626519f,0.308249f, 0.643093f,0.294584f, 0.659045f,0.281282f, 0.674403f,0.268371f, 0.689221f,0.255905f, +0.703535f,0.243897f, 0.717256f,0.232234f, 0.730435f,0.220958f, 0.743104f,0.210088f, 0.755384f,0.199711f, +0.767175f,0.189707f, 0.778583f,0.180147f, 0.78949f,0.170909f, 0.799893f,0.161982f, 0.809843f,0.153393f, +0.819365f,0.145148f, 0.828478f,0.137241f, 0.837302f,0.129734f, 0.845731f,0.122533f, 0.85375f,0.115618f, +0.8614f,0.108998f, 0.868701f,0.102673f, 0.875668f,0.0966351f, 0.882312f,0.0908761f, 0.888649f,0.085388f, +0.894688f,0.0801623f, 0.90044f,0.0751901f, 0.905917f,0.0704631f, 0.911128f,0.0659728f, 0.916085f,0.0617107f, +0.920795f,0.0576685f, 0.925271f,0.053838f, 0.92952f,0.0502112f, 0.933552f,0.0467803f, 0.937376f,0.0435375f, +0.941f,0.0404752f, 0.944433f,0.037586f, 0.947682f,0.0348628f, 0.950756f,0.0322985f, 0.953661f,0.0298862f, +0.956408f,0.0276191f, 0.958999f,0.0254909f, 0.961446f,0.023495f, 0.963753f,0.0216255f, 0.965927f,0.0198763f, +0.968162f,0.0182825f, 0.9702f,0.016776f, 0.972068f,0.0153593f, 0.973808f,0.0140363f, 0.975437f,0.0128042f, +0.976963f,0.0116593f, 0.978393f,0.0105971f, 0.979733f,0.00961326f, 0.980989f,0.00870357f, 0.982166f,0.00786382f, +0.983267f,0.00708995f, 0.984298f,0.00637807f, 0.985264f,0.00572442f, 0.986167f,0.00512538f, 0.98701f,0.00457748f, +0.987799f,0.0040774f, 0.988536f,0.00362195f, 0.989227f,0.00320811f, 0.989872f,0.00283295f, 0.990474f,0.00249371f, +0.991038f,0.00218777f, 0.991565f,0.00191261f, 0.992059f,0.00166586f, 0.99252f,0.00144526f, 0.992953f,0.00124868f, +0.993359f,0.00107411f, 0.99374f,0.000919654f, 0.994098f,0.000783514f, 0.994435f,0.000664016f, 0.994753f,0.000559585f, +0.995053f,0.000468749f, 0.995336f,0.000390136f, 0.995605f,0.000322466f, 0.99586f,0.000264555f, 0.996102f,0.000215304f, +0.996334f,0.000173704f, 0.996556f,0.000138822f, 0.996767f,0.000109809f, 0.996971f,8.58877e-05f, 0.997167f,6.6354e-05f, +0.997356f,5.05718e-05f, 0.997539f,3.79698e-05f, 0.997716f,2.80379e-05f, 0.997888f,2.03243e-05f, 0.998056f,1.44313e-05f, +0.998219f,1.00124e-05f, 0.998379f,6.76829e-06f, 0.998535f,4.44386e-06f, 0.998688f,2.8243e-06f, 0.998839f,1.73179e-06f, +0.998985f,1.02188e-06f, 0.999131f,5.80049e-07f, 0.999273f,3.18081e-07f, 0.999414f,1.70595e-07f, 0.999553f,9.14716e-08f, +0.999691f,5.03136e-08f, 0.999827f,2.88861e-08f, 0.999975f,1.73769e-08f, + +0.17675f,0.615851f, 0.132284f,0.496092f, 0.128413f,0.482152f, 0.138174f,0.49244f, 0.154843f,0.506568f, +0.175518f,0.517999f, 0.198593f,0.524828f, 0.223093f,0.527114f, 0.248338f,0.525269f, 0.273879f,0.519986f, +0.299494f,0.512275f, 0.324735f,0.501769f, 0.349696f,0.490037f, 0.374265f,0.477313f, 0.398243f,0.463499f, +0.421714f,0.449298f, 0.444644f,0.434815f, 0.466841f,0.419826f, 0.488477f,0.404921f, 0.509491f,0.390053f, +0.529955f,0.375438f, 0.549729f,0.360848f, 0.56879f,0.346327f, 0.587161f,0.33198f, 0.60497f,0.318033f, +0.622195f,0.304449f, 0.63876f,0.291114f, 0.654863f,0.278307f, 0.670338f,0.265781f, 0.685197f,0.253563f, +0.699483f,0.241702f, 0.713219f,0.230216f, 0.726424f,0.219112f, 0.739211f,0.208481f, 0.751471f,0.198192f, +0.763221f,0.188251f, 0.77449f,0.178672f, 0.785306f,0.169459f, 0.795801f,0.160698f, 0.805794f,0.152222f, +0.81551f,0.144183f, 0.82485f,0.136481f, 0.833703f,0.129029f, 0.842144f,0.12187f, 0.850204f,0.115011f, +0.857902f,0.108448f, 0.865254f,0.102175f, 0.872348f,0.0962246f, 0.879162f,0.090564f, 0.885609f,0.0851365f, +0.891741f,0.0799564f, 0.897575f,0.0750216f, 0.903129f,0.0703261f, 0.908414f,0.0658629f, 0.913443f,0.0616243f, +0.918224f,0.0576026f, 0.922767f,0.05379f, 0.927083f,0.0501789f, 0.93118f,0.0467615f, 0.935068f,0.0435305f, +0.938754f,0.0404784f, 0.942247f,0.0375979f, 0.945558f,0.0348822f, 0.94869f,0.0323241f, 0.951655f,0.029917f, +0.954456f,0.0276543f, 0.957105f,0.0255295f, 0.959605f,0.0235364f, 0.961967f,0.0216689f, 0.964193f,0.0199212f, +0.966292f,0.0182874f, 0.96827f,0.016762f, 0.970132f,0.0153396f, 0.971885f,0.014015f, 0.973533f,0.0127831f, +0.975083f,0.0116391f, 0.976538f,0.0105781f, 0.978075f,0.00962403f, 0.97949f,0.0087337f, 0.980756f,0.00790057f, +0.981926f,0.00712918f, 0.983014f,0.00641792f, 0.984029f,0.0057639f, 0.984979f,0.0051639f, 0.985868f,0.00461468f, +0.9867f,0.00411305f, 0.987478f,0.00365591f, 0.988208f,0.00324028f, 0.988891f,0.00286328f, 0.98953f,0.00252219f, +0.99013f,0.00221441f, 0.990691f,0.00193742f, 0.991219f,0.00168889f, 0.991715f,0.00146655f, 0.99218f,0.0012683f, +0.992618f,0.00109212f, 0.993029f,0.000936111f, 0.993418f,0.000798502f, 0.993783f,0.00067761f, 0.99413f,0.000571866f, +0.994457f,0.000479797f, 0.994769f,0.000400029f, 0.995064f,0.000331285f, 0.995346f,0.000272378f, 0.995614f,0.000222209f, +0.995871f,0.000179764f, 0.996117f,0.000144112f, 0.996354f,0.000114398f, 0.996581f,8.98438e-05f, 0.9968f,6.97406e-05f, +0.997012f,5.34495e-05f, 0.997216f,4.03956e-05f, 0.997415f,3.00655e-05f, 0.997608f,2.20033e-05f, 0.997797f,1.58077e-05f, +0.997982f,1.11285e-05f, 0.998161f,7.66261e-06f, 0.998337f,5.1512e-06f, 0.99851f,3.3759e-06f, 0.998679f,2.15535e-06f, +0.998845f,1.34175e-06f, 0.99901f,8.17332e-07f, 0.99917f,4.90851e-07f, 0.999329f,2.94067e-07f, 0.999486f,1.78228e-07f, +0.999641f,1.1054e-07f, 0.999795f,7.06218e-08f, 0.999961f,4.64718e-08f, + +0.192897f,0.600379f, 0.146834f,0.489083f, 0.140129f,0.470325f, 0.147373f,0.47579f, 0.161853f,0.487154f, +0.180589f,0.496928f, 0.202039f,0.50372f, 0.225156f,0.506668f, 0.24924f,0.505873f, 0.273845f,0.502023f, +0.298594f,0.495432f, 0.323364f,0.487061f, 0.347715f,0.476328f, 0.371767f,0.46463f, 0.395441f,0.452192f, +0.418588f,0.438969f, 0.441092f,0.425027f, 0.463194f,0.411228f, 0.48467f,0.397132f, 0.505446f,0.382783f, +0.52569f,0.368642f, 0.545329f,0.35461f, 0.564399f,0.340801f, 0.582884f,0.327211f, 0.600717f,0.313777f, +0.617867f,0.300493f, 0.634415f,0.287507f, 0.650423f,0.274901f, 0.665904f,0.262682f, 0.680762f,0.250725f, +0.695197f,0.239261f, 0.709075f,0.22811f, 0.722376f,0.217255f, 0.735146f,0.206738f, 0.74741f,0.196575f, +0.759188f,0.186768f, 0.770493f,0.177317f, 0.781467f,0.168316f, 0.791935f,0.159602f, 0.801955f,0.151211f, +0.811552f,0.143148f, 0.82074f,0.13541f, 0.829661f,0.128069f, 0.838151f,0.120999f, 0.846317f,0.114252f, +0.854259f,0.107869f, 0.861791f,0.10172f, 0.868936f,0.0958129f, 0.875735f,0.0901616f, 0.882216f,0.0847659f, +0.888392f,0.0796209f, 0.894276f,0.0747203f, 0.899882f,0.0700568f, 0.905372f,0.0656842f, 0.910536f,0.0614994f, +0.915419f,0.0575136f, 0.920051f,0.0537283f, 0.924447f,0.0501389f, 0.92862f,0.0467396f, 0.93258f,0.0435236f, +0.936336f,0.0404842f, 0.939898f,0.0376144f, 0.943274f,0.0349076f, 0.946472f,0.032357f, 0.949498f,0.0299561f, +0.952362f,0.0276984f, 0.955071f,0.0255776f, 0.957631f,0.0235876f, 0.96005f,0.0217225f, 0.962332f,0.0199764f, +0.964488f,0.0183436f, 0.966519f,0.0168187f, 0.968435f,0.0153963f, 0.97024f,0.0140714f, 0.971939f,0.0128387f, +0.973538f,0.0116936f, 0.975043f,0.0106314f, 0.976457f,0.00964745f, 0.977787f,0.00873749f, 0.979037f,0.0078973f, +0.980211f,0.00712281f, 0.981314f,0.00641015f, 0.982348f,0.00575555f, 0.983318f,0.00515545f, 0.984407f,0.00462854f, +0.985399f,0.00414097f, 0.986268f,0.0036881f, 0.987062f,0.00327354f, 0.987801f,0.00289621f, 0.988489f,0.00255409f, +0.989134f,0.00224487f, 0.989738f,0.00196626f, 0.990305f,0.00171598f, 0.990837f,0.00149186f, 0.99134f,0.00129181f, +0.991813f,0.00111386f, 0.992258f,0.000956127f, 0.99268f,0.00081685f, 0.993079f,0.000694359f, 0.993457f,0.000587089f, +0.993815f,0.000493574f, 0.994155f,0.000412444f, 0.994481f,0.000342422f, 0.994791f,0.000282322f, 0.995087f,0.000231045f, +0.995371f,0.000187578f, 0.995642f,0.000150984f, 0.995905f,0.000120409f, 0.996158f,9.50698e-05f, 0.996401f,7.42567e-05f, +0.996638f,5.73263e-05f, 0.996866f,4.37003e-05f, 0.997088f,3.28613e-05f, 0.997306f,2.43497e-05f, 0.997516f,1.776e-05f, +0.997723f,1.27378e-05f, 0.997924f,8.97613e-06f, 0.998122f,6.21186e-06f, 0.998314f,4.2226e-06f, 0.998504f,2.82303e-06f, +0.998691f,1.8615e-06f, 0.998874f,1.21652e-06f, 0.999055f,7.93312e-07f, 0.999234f,5.20283e-07f, 0.999408f,3.45563e-07f, +0.999583f,2.33477e-07f, 0.999756f,1.61011e-07f, 0.999942f,1.13074e-07f, + +0.209082f,0.58486f, 0.161831f,0.48183f, 0.152529f,0.459609f, 0.157379f,0.460816f, 0.16969f,0.46891f, +0.186565f,0.477488f, 0.206348f,0.483734f, 0.228016f,0.486861f, 0.250902f,0.48703f, 0.27443f,0.484027f, +0.29833f,0.478759f, 0.322266f,0.471283f, 0.346186f,0.462491f, 0.369712f,0.451862f, 0.392847f,0.440202f, +0.415608f,0.427977f, 0.437929f,0.415307f, 0.459682f,0.40213f, 0.480805f,0.388557f, 0.501555f,0.375286f, +0.521652f,0.361795f, 0.541068f,0.34818f, 0.559991f,0.33486f, 0.578317f,0.321677f, 0.596094f,0.308747f, +0.613349f,0.296117f, 0.63001f,0.2837f, 0.646032f,0.271461f, 0.661441f,0.25946f, 0.676314f,0.247802f, +0.690679f,0.236506f, 0.704561f,0.225587f, 0.717868f,0.214939f, 0.730749f,0.20471f, 0.743192f,0.194858f, +0.755084f,0.18527f, 0.766483f,0.175996f, 0.777417f,0.167048f, 0.787903f,0.15843f, 0.797958f,0.150139f, +0.807619f,0.142186f, 0.816971f,0.134613f, 0.825877f,0.127306f, 0.834389f,0.120289f, 0.842526f,0.113564f, +0.850306f,0.107126f, 0.857822f,0.101013f, 0.865025f,0.0951773f, 0.871866f,0.0895815f, 0.878472f,0.0842771f, +0.884924f,0.0792832f, 0.890978f,0.0744688f, 0.896709f,0.0698637f, 0.90215f,0.0654742f, 0.907324f,0.0612982f, +0.912243f,0.0573305f, 0.91692f,0.0535651f, 0.921366f,0.0499953f, 0.925615f,0.0466232f, 0.929783f,0.0434727f, +0.933667f,0.0404667f, 0.937328f,0.0376188f, 0.94079f,0.0349277f, 0.944066f,0.0323891f, 0.947168f,0.0299974f, +0.950103f,0.027747f, 0.952879f,0.0256319f, 0.955504f,0.0236463f, 0.957987f,0.0217844f, 0.960332f,0.0200406f, +0.962548f,0.0184093f, 0.964639f,0.0168852f, 0.966611f,0.015463f, 0.968472f,0.0141377f, 0.970227f,0.0129043f, +0.97188f,0.0117581f, 0.973437f,0.0106944f, 0.974904f,0.00970873f, 0.976283f,0.00879686f, 0.977581f,0.00795455f, +0.978804f,0.00717783f, 0.979953f,0.00646282f, 0.981033f,0.00580581f, 0.98205f,0.00520322f, 0.983005f,0.00465164f, +0.983902f,0.00414778f, 0.984746f,0.00368849f, 0.98554f,0.00327078f, 0.986286f,0.00289177f, 0.986989f,0.00254872f, +0.98765f,0.00223902f, 0.988509f,0.00198136f, 0.98921f,0.00173857f, 0.989825f,0.00151646f, 0.990388f,0.00131647f, +0.990912f,0.00113772f, 0.991403f,0.000978763f, 0.991865f,0.000838053f, 0.992303f,0.000714041f, 0.992718f,0.000605226f, +0.993111f,0.000510183f, 0.993486f,0.00042757f, 0.993843f,0.000356124f, 0.994185f,0.000294672f, 0.994511f,0.00024212f, +0.994825f,0.000197459f, 0.995126f,0.000159755f, 0.995417f,0.000128153f, 0.995697f,0.00010187f, 0.995968f,8.01945e-05f, +0.99623f,6.248e-05f, 0.996485f,4.81452e-05f, 0.996733f,3.66697e-05f, 0.996973f,2.75899e-05f, 0.997209f,2.04964e-05f, +0.997438f,1.50306e-05f, 0.997664f,1.08812e-05f, 0.997883f,7.78088e-06f, 0.998099f,5.50284e-06f, 0.998311f,3.85748e-06f, +0.998519f,2.6889e-06f, 0.998724f,1.87154e-06f, 0.998925f,1.30662e-06f, 0.999123f,9.18801e-07f, 0.999319f,6.52627e-07f, +0.999513f,4.69084e-07f, 0.999705f,3.42033e-07f, 0.999913f,2.51928e-07f, + +0.225267f,0.569388f, 0.177185f,0.474263f, 0.165515f,0.449552f, 0.168112f,0.447274f, 0.178359f,0.452556f, +0.193376f,0.459501f, 0.211456f,0.464636f, 0.231675f,0.467885f, 0.253258f,0.468411f, 0.275739f,0.466536f, +0.298631f,0.461979f, 0.321796f,0.455748f, 0.344908f,0.447673f, 0.367978f,0.438631f, 0.390723f,0.428295f, +0.412961f,0.41674f, 0.43486f,0.404848f, 0.456342f,0.392636f, 0.477315f,0.380085f, 0.497703f,0.367226f, +0.517508f,0.35423f, 0.536944f,0.341577f, 0.555754f,0.328831f, 0.573892f,0.316025f, 0.591527f,0.303493f, +0.608644f,0.291217f, 0.625217f,0.279179f, 0.641283f,0.267438f, 0.656787f,0.255925f, 0.671787f,0.244725f, +0.686171f,0.233712f, 0.699992f,0.222964f, 0.713325f,0.212558f, 0.726184f,0.202495f, 0.738623f,0.192812f, +0.750524f,0.183388f, 0.761969f,0.174293f, 0.773113f,0.165635f, 0.783743f,0.15722f, 0.793908f,0.149086f, +0.803643f,0.141249f, 0.812967f,0.133712f, 0.821898f,0.126474f, 0.830449f,0.11953f, 0.838654f,0.112888f, +0.846606f,0.106583f, 0.854159f,0.100514f, 0.861362f,0.0947019f, 0.868236f,0.0891451f, 0.874799f,0.0838397f, +0.881063f,0.0787794f, 0.887171f,0.0740182f, 0.892945f,0.0694542f, 0.898422f,0.0651001f, 0.90372f,0.060991f, +0.908931f,0.0571466f, 0.91378f,0.0534463f, 0.918353f,0.0499194f, 0.922684f,0.0465698f, 0.926789f,0.043395f, +0.930684f,0.0403903f, 0.934379f,0.0375502f, 0.937885f,0.0348687f, 0.941207f,0.0323399f, 0.944388f,0.0299662f, +0.947529f,0.0277625f, 0.950433f,0.0256699f, 0.953158f,0.0236977f, 0.955727f,0.0218445f, 0.95815f,0.0201065f, +0.960437f,0.0184791f, 0.962598f,0.0169575f, 0.964636f,0.0155366f, 0.966561f,0.0142118f, 0.968375f,0.0129782f, +0.970088f,0.0118312f, 0.971702f,0.0107663f, 0.973225f,0.00977899f, 0.97466f,0.00886518f, 0.976012f,0.00802067f, +0.977286f,0.00724155f, 0.978486f,0.00652399f, 0.979616f,0.00586431f, 0.98068f,0.00525897f, 0.981682f,0.00470459f, +0.982626f,0.00419791f, 0.983515f,0.0037358f, 0.984353f,0.00331528f, 0.985143f,0.0029335f, 0.985888f,0.00258773f, +0.98659f,0.00227538f, 0.987253f,0.00199397f, 0.987877f,0.00174115f, 0.988469f,0.0015147f, 0.989028f,0.00131251f, +0.989559f,0.00113256f, 0.990059f,0.00097298f, 0.990694f,0.000842747f, 0.99132f,0.000728294f, 0.991832f,0.000621962f, +0.992291f,0.000527232f, 0.992719f,0.000444053f, 0.993121f,0.000371648f, 0.993504f,0.000309058f, 0.993868f,0.000255302f, +0.994216f,0.000209432f, 0.994552f,0.000170549f, 0.994875f,0.00013782f, 0.995185f,0.000110473f, 0.995486f,8.78044e-05f, +0.995777f,6.91709e-05f, 0.996061f,5.39926e-05f, 0.996337f,4.17482e-05f, 0.996604f,3.19725e-05f, 0.996866f,2.42534e-05f, +0.99712f,1.82291e-05f, 0.99737f,1.35846e-05f, 0.997614f,1.00487e-05f, 0.997855f,7.39045e-06f, 0.99809f,5.41594e-06f, +0.998321f,3.96502e-06f, 0.998548f,2.90783e-06f, 0.998772f,2.14144e-06f, 0.998992f,1.58643e-06f, 0.99921f,1.18347e-06f, +0.999425f,8.89821e-07f, 0.999639f,6.75782e-07f, 0.999868f,5.1523e-07f, + +0.241391f,0.554007f, 0.192796f,0.466327f, 0.178991f,0.439998f, 0.179466f,0.434671f, 0.187739f,0.437387f, +0.200909f,0.442336f, 0.217387f,0.44695f, 0.236096f,0.449732f, 0.256344f,0.45037f, 0.277641f,0.448964f, +0.299608f,0.445615f, 0.321824f,0.440003f, 0.344237f,0.43313f, 0.366548f,0.424752f, 0.388771f,0.41558f, +0.410711f,0.405468f, 0.432133f,0.394247f, 0.453184f,0.382691f, 0.473826f,0.370885f, 0.49404f,0.358948f, +0.513708f,0.346773f, 0.532797f,0.334433f, 0.551336f,0.3221f, 0.569501f,0.310112f, 0.587111f,0.298183f, +0.60404f,0.286203f, 0.620459f,0.274472f, 0.636449f,0.2631f, 0.651878f,0.251919f, 0.66681f,0.241018f, +0.681282f,0.230438f, 0.69521f,0.220087f, 0.70868f,0.210054f, 0.721578f,0.20023f, 0.733958f,0.190673f, +0.745877f,0.181431f, 0.757388f,0.172538f, 0.768499f,0.163984f, 0.779135f,0.155694f, 0.789318f,0.147682f, +0.799205f,0.14005f, 0.808722f,0.132721f, 0.817787f,0.125629f, 0.826447f,0.118802f, 0.834732f,0.112246f, +0.842656f,0.105959f, 0.850233f,0.0999379f, 0.857479f,0.094178f, 0.864405f,0.0886729f, 0.87115f,0.0834785f, +0.877538f,0.0784902f, 0.883616f,0.0737232f, 0.889407f,0.0691775f, 0.894925f,0.0648491f, 0.900182f,0.0607321f, +0.905238f,0.0568395f, 0.910127f,0.0531683f, 0.914728f,0.0496644f, 0.91909f,0.0463362f, 0.923269f,0.0431946f, +0.927487f,0.0402968f, 0.931368f,0.0375103f, 0.935008f,0.0348622f, 0.938442f,0.0323563f, 0.941688f,0.0299906f, +0.944761f,0.0277613f, 0.947669f,0.0256636f, 0.950422f,0.0236921f, 0.953027f,0.0218418f, 0.955492f,0.0201073f, +0.957825f,0.0184835f, 0.960203f,0.0169989f, 0.962379f,0.0155951f, 0.964407f,0.014279f, 0.966309f,0.0130501f, +0.968098f,0.0119054f, 0.969784f,0.0108412f, 0.971374f,0.00985371f, 0.972872f,0.00893887f, 0.974285f,0.0080928f, +0.975617f,0.00731168f, 0.976874f,0.0065918f, 0.978059f,0.00592956f, 0.979177f,0.00532149f, 0.980231f,0.00476425f, +0.981225f,0.00425462f, 0.982164f,0.00378952f, 0.983049f,0.003366f, 0.983886f,0.00298122f, 0.984676f,0.0026325f, +0.985423f,0.00231723f, 0.986128f,0.00203298f, 0.986796f,0.0017774f, 0.987428f,0.00154828f, 0.988028f,0.0013435f, +0.988597f,0.00116109f, 0.989137f,0.000999155f, 0.989651f,0.000855923f, 0.99014f,0.000729724f, 0.990606f,0.000618989f, +0.991051f,0.000522247f, 0.991478f,0.000438125f, 0.991884f,0.000365338f, 0.992459f,0.000311657f, 0.993008f,0.000264633f, +0.993451f,0.000220449f, 0.993851f,0.000181695f, 0.994225f,0.000148474f, 0.994579f,0.00012037f, 0.99492f,9.68374e-05f, +0.995247f,7.73129e-05f, 0.995563f,6.12593e-05f, 0.995871f,4.8179e-05f, 0.996169f,3.76198e-05f, 0.99646f,2.91768e-05f, +0.996743f,2.24909e-05f, 0.997022f,1.72476e-05f, 0.997293f,1.31746e-05f, 0.997559f,1.00387e-05f, 0.997821f,7.64307e-06f, +0.998076f,5.82406e-06f, 0.998329f,4.44816e-06f, 0.998577f,3.40858e-06f, 0.998821f,2.62199e-06f, 0.999062f,2.02521e-06f, +0.9993f,1.5717e-06f, 0.999537f,1.22792e-06f, 0.999788f,9.58068e-07f, + +0.257395f,0.538737f, 0.208569f,0.45801f, 0.192857f,0.430741f, 0.19136f,0.423018f, 0.197763f,0.423497f, +0.20919f,0.426809f, 0.224062f,0.430473f, 0.241274f,0.43259f, 0.260202f,0.433318f, 0.280271f,0.432078f, +0.301136f,0.429152f, 0.322514f,0.424706f, 0.344023f,0.418356f, 0.365669f,0.411048f, 0.387175f,0.402498f, +0.408535f,0.393228f, 0.429669f,0.383362f, 0.450368f,0.372701f, 0.470548f,0.361399f, 0.490378f,0.350031f, +0.509769f,0.338531f, 0.528731f,0.327019f, 0.547157f,0.315393f, 0.56501f,0.30369f, 0.582334f,0.292065f, +0.599273f,0.280765f, 0.615753f,0.269674f, 0.631575f,0.258568f, 0.646849f,0.24764f, 0.661715f,0.237071f, +0.676097f,0.226757f, 0.690005f,0.216715f, 0.703447f,0.206954f, 0.716423f,0.197467f, 0.728887f,0.188214f, +0.740976f,0.17931f, 0.75253f,0.170614f, 0.763606f,0.162174f, 0.774231f,0.154009f, 0.784522f,0.146197f, +0.794423f,0.138678f, 0.803923f,0.131433f, 0.813001f,0.124437f, 0.821711f,0.117721f, 0.830199f,0.111355f, +0.838296f,0.105219f, 0.846004f,0.0993102f, 0.85336f,0.0936406f, 0.860387f,0.0882115f, 0.867099f,0.0830207f, +0.873507f,0.0780633f, 0.879626f,0.0733341f, 0.885466f,0.0688267f, 0.891144f,0.0645792f, 0.89654f,0.0605252f, +0.901657f,0.0566588f, 0.906524f,0.0529816f, 0.911152f,0.0494899f, 0.915554f,0.0461785f, 0.919742f,0.0430418f, +0.923811f,0.0401015f, 0.927699f,0.0373243f, 0.931355f,0.0346875f, 0.934813f,0.032194f, 0.938107f,0.0298462f, +0.941458f,0.0276921f, 0.944585f,0.025645f, 0.947488f,0.0237026f, 0.950212f,0.021871f, 0.952779f,0.0201493f, +0.955203f,0.0185345f, 0.957492f,0.0170225f, 0.959656f,0.0156091f, 0.961701f,0.0142898f, 0.963633f,0.0130602f, +0.96546f,0.0119158f, 0.967185f,0.0108524f, 0.96895f,0.00988602f, 0.970605f,0.0089867f, 0.972131f,0.00814765f, +0.973552f,0.00736967f, 0.974888f,0.00665082f, 0.976144f,0.00598834f, 0.977328f,0.00537922f, 0.978445f,0.00482036f, +0.979498f,0.00430873f, 0.980494f,0.00384137f, 0.981434f,0.0034154f, 0.982323f,0.00302807f, 0.983165f,0.00267672f, +0.983961f,0.0023588f, 0.984715f,0.0020719f, 0.98543f,0.00181371f, 0.986109f,0.00158202f, 0.986753f,0.00137475f, +0.987366f,0.00118991f, 0.987948f,0.00102565f, 0.988504f,0.00088019f, 0.989033f,0.000751867f, 0.989539f,0.000639117f, +0.990023f,0.000540476f, 0.990486f,0.000454567f, 0.990931f,0.00038011f, 0.991357f,0.000315911f, 0.991769f,0.000260863f, +0.992163f,0.000213941f, 0.992546f,0.0001742f, 0.992915f,0.00014077f, 0.993308f,0.000114178f, 0.993946f,0.000100259f, +0.994394f,8.30396e-05f, 0.994785f,6.74749e-05f, 0.995149f,5.42282e-05f, 0.995493f,4.32345e-05f, 0.995825f,3.42496e-05f, +0.996146f,2.69914e-05f, 0.996458f,2.11845e-05f, 0.996762f,1.65771e-05f, 0.997059f,1.29469e-05f, 0.997351f,1.01024e-05f, +0.997637f,7.8818e-06f, 0.997918f,6.15151e-06f, 0.998193f,4.80329e-06f, 0.998464f,3.75168e-06f, 0.998732f,2.93084e-06f, +0.998998f,2.29136e-06f, 0.999262f,1.79649e-06f, 0.99954f,1.40021e-06f, + +0.273267f,0.523649f, 0.224448f,0.449371f, 0.207048f,0.421689f, 0.203725f,0.412115f, 0.20836f,0.410656f, +0.218099f,0.412278f, 0.231364f,0.414613f, 0.24719f,0.416623f, 0.264734f,0.416867f, 0.283642f,0.416046f, +0.303387f,0.413384f, 0.323755f,0.409394f, 0.344516f,0.404181f, 0.365318f,0.397351f, 0.386213f,0.38979f, +0.406939f,0.381192f, 0.427479f,0.371954f, 0.447831f,0.36235f, 0.467814f,0.352193f, 0.48725f,0.341357f, +0.506293f,0.330394f, 0.524925f,0.319365f, 0.543132f,0.308336f, 0.560906f,0.297358f, 0.578157f,0.286354f, +0.594847f,0.275335f, 0.611011f,0.264416f, 0.626782f,0.253801f, 0.642186f,0.243509f, 0.656982f,0.233257f, +0.671197f,0.223125f, 0.684957f,0.213268f, 0.698394f,0.203814f, 0.711317f,0.194558f, 0.7238f,0.185573f, +0.735879f,0.176889f, 0.747497f,0.168446f, 0.758649f,0.160242f, 0.769429f,0.152345f, 0.779776f,0.144696f, +0.789672f,0.137282f, 0.799151f,0.130122f, 0.808297f,0.123265f, 0.817083f,0.116676f, 0.825573f,0.110381f, +0.833657f,0.104304f, 0.841376f,0.0984619f, 0.84882f,0.0928939f, 0.856048f,0.0876139f, 0.862919f,0.0825335f, +0.86945f,0.0776583f, 0.875674f,0.0729947f, 0.881609f,0.0685423f, 0.88727f,0.0642974f, 0.892669f,0.0602553f, +0.897816f,0.0564105f, 0.90272f,0.0527571f, 0.907457f,0.0493125f, 0.912011f,0.0460563f, 0.916309f,0.0429557f, +0.920384f,0.0400142f, 0.924253f,0.0372294f, 0.927928f,0.0345969f, 0.931418f,0.0321114f, 0.934731f,0.0297676f, +0.937987f,0.0275887f, 0.941068f,0.0255329f, 0.943961f,0.0235906f, 0.946689f,0.0217628f, 0.949268f,0.0200466f, +0.951868f,0.0184718f, 0.954406f,0.0170081f, 0.956739f,0.0156223f, 0.958909f,0.0143189f, 0.960943f,0.013099f, +0.962856f,0.0119608f, 0.96466f,0.0109011f, 0.966363f,0.0099165f, 0.967971f,0.00900335f, 0.969488f,0.00815797f, +0.970924f,0.0073767f, 0.97228f,0.00665599f, 0.973562f,0.00599238f, 0.974835f,0.00538958f, 0.976137f,0.00484667f, +0.977309f,0.00434147f, 0.978394f,0.0038766f, 0.979407f,0.00345116f, 0.980361f,0.00306326f, 0.98126f,0.00271067f, +0.982111f,0.00239113f, 0.982915f,0.00210236f, 0.983678f,0.00184215f, 0.984402f,0.00160838f, 0.985091f,0.001399f, +0.985745f,0.00121209f, 0.986369f,0.00104578f, 0.986963f,0.000898339f, 0.987531f,0.000768115f, 0.988074f,0.000653556f, +0.988592f,0.000553201f, 0.989091f,0.000465683f, 0.989569f,0.000389725f, 0.990029f,0.000324134f, 0.990472f,0.000267804f, +0.9909f,0.000219709f, 0.991312f,0.000178902f, 0.99171f,0.00014451f, 0.992096f,0.000115735f, 0.992471f,9.18471e-05f, +0.992835f,7.21841e-05f, 0.993189f,5.61465e-05f, 0.993533f,4.31953e-05f, 0.994014f,3.653e-05f, 0.994585f,3.30116e-05f, +0.995009f,2.72111e-05f, 0.995385f,2.17837e-05f, 0.995736f,1.71621e-05f, 0.996072f,1.33606e-05f, 0.996397f,1.02873e-05f, +0.996713f,7.82752e-06f, 0.997021f,5.87125e-06f, 0.997323f,4.32222e-06f, 0.99762f,3.10074e-06f, 0.997912f,2.14327e-06f, +0.9982f,1.40063e-06f, 0.998486f,8.34573e-07f, 0.998784f,3.81846e-07f, + +0.288961f,0.508755f, 0.240356f,0.440463f, 0.221476f,0.41269f, 0.21647f,0.401713f, 0.219429f,0.398472f, +0.227571f,0.398693f, 0.239324f,0.400019f, 0.25372f,0.401384f, 0.269968f,0.401448f, 0.287622f,0.400462f, +0.306296f,0.398225f, 0.325639f,0.394591f, 0.345454f,0.389809f, 0.365572f,0.384062f, 0.385672f,0.376946f, +0.40582f,0.369252f, 0.425783f,0.360696f, 0.445544f,0.351607f, 0.465104f,0.342224f, 0.48435f,0.332472f, +0.503157f,0.322295f, 0.521415f,0.311685f, 0.539327f,0.301145f, 0.556821f,0.290611f, 0.573887f,0.280127f, +0.590531f,0.269748f, 0.606667f,0.259401f, 0.62228f,0.249111f, 0.63737f,0.238927f, 0.652044f,0.229002f, +0.666381f,0.219417f, 0.680248f,0.210016f, 0.693537f,0.200711f, 0.70632f,0.191601f, 0.718725f,0.182807f, +0.73081f,0.174365f, 0.742422f,0.16613f, 0.753621f,0.158154f, 0.764463f,0.150475f, 0.774871f,0.14302f, +0.784845f,0.135791f, 0.79445f,0.128828f, 0.803683f,0.122118f, 0.812541f,0.115651f, 0.821007f,0.109412f, +0.82911f,0.103411f, 0.83696f,0.0976995f, 0.844502f,0.0922314f, 0.85172f,0.0869859f, 0.858593f,0.081946f, +0.865148f,0.0771184f, 0.871496f,0.072543f, 0.877645f,0.0682077f, 0.883474f,0.0640475f, 0.889008f,0.0600675f, +0.894271f,0.0562715f, 0.899282f,0.0526579f, 0.904055f,0.049223f, 0.9086f,0.045962f, 0.912928f,0.0428697f, +0.917048f,0.0399407f, 0.920968f,0.0371693f, 0.924832f,0.0345891f, 0.928454f,0.0321336f, 0.931876f,0.0298096f, +0.935117f,0.0276161f, 0.938193f,0.0255495f, 0.941109f,0.0236053f, 0.943874f,0.0217787f, 0.946497f,0.0200648f, +0.949111f,0.0184857f, 0.951561f,0.0169992f, 0.953856f,0.0156021f, 0.956018f,0.0142944f, 0.958059f,0.0130735f, +0.960136f,0.0119617f, 0.962063f,0.0109179f, 0.964007f,0.00996425f, 0.965772f,0.00906585f, 0.96741f,0.00822793f, +0.968947f,0.00745019f, 0.970391f,0.00673066f, 0.971751f,0.0060667f, 0.973037f,0.00545544f, 0.974252f,0.00489394f, +0.975402f,0.00437928f, 0.97649f,0.00390861f, 0.977519f,0.00347911f, 0.978496f,0.0030881f, 0.979424f,0.002733f, +0.980475f,0.00242555f, 0.981423f,0.00214221f, 0.982288f,0.00188337f, 0.983093f,0.0016491f, 0.983852f,0.00143826f, +0.984569f,0.00124936f, 0.98525f,0.0010808f, 0.985897f,0.000930967f, 0.986516f,0.000798312f, 0.987106f,0.000681337f, +0.987671f,0.000578623f, 0.988214f,0.000488828f, 0.988734f,0.000410692f, 0.989235f,0.000343036f, 0.989717f,0.000284762f, +0.990182f,0.000234847f, 0.990633f,0.000192346f, 0.991067f,0.000156389f, 0.991488f,0.000126175f, 0.991898f,0.000100971f, +0.992296f,8.01104e-05f, 0.992682f,6.29904e-05f, 0.993057f,4.90666e-05f, 0.993425f,3.78515e-05f, 0.993782f,2.89116e-05f, +0.994132f,2.18637e-05f, 0.994474f,1.63721e-05f, 0.994912f,1.40014e-05f, 0.995544f,1.49489e-05f, 0.995985f,1.27963e-05f, +0.99637f,1.03665e-05f, 0.996729f,8.15043e-06f, 0.997074f,6.24587e-06f, 0.997407f,4.65062e-06f, 0.997733f,3.33596e-06f, +0.998051f,2.26885e-06f, 0.998368f,1.41722e-06f, 0.998698f,6.92188e-07f, + +0.304447f,0.494077f, 0.256232f,0.431304f, 0.236075f,0.403791f, 0.229523f,0.391719f, 0.230916f,0.387019f, +0.237541f,0.385978f, 0.247833f,0.386293f, 0.260797f,0.386678f, 0.275823f,0.386871f, 0.292245f,0.385635f, +0.309804f,0.383565f, 0.328128f,0.380248f, 0.347005f,0.375901f, 0.366236f,0.370563f, 0.385695f,0.364443f, +0.405111f,0.357222f, 0.424509f,0.349452f, 0.443737f,0.341034f, 0.462748f,0.332152f, 0.481506f,0.322944f, +0.500031f,0.313597f, 0.518177f,0.303962f, 0.535821f,0.29397f, 0.552984f,0.283808f, 0.569784f,0.273747f, +0.586189f,0.263774f, 0.602171f,0.253889f, 0.617749f,0.24415f, 0.632825f,0.234466f, 0.647433f,0.224912f, +0.661525f,0.215464f, 0.675187f,0.20624f, 0.688505f,0.197326f, 0.701438f,0.188667f, 0.713884f,0.180167f, +0.725813f,0.171821f, 0.737296f,0.163699f, 0.748476f,0.155914f, 0.75931f,0.148412f, 0.769732f,0.141136f, +0.77977f,0.134102f, 0.789486f,0.127345f, 0.79881f,0.120808f, 0.807714f,0.114469f, 0.816311f,0.108395f, +0.824509f,0.102521f, 0.832375f,0.0968777f, 0.839955f,0.0914809f, 0.847184f,0.0862894f, 0.854139f,0.0813346f, +0.860819f,0.0766016f, 0.867279f,0.0721064f, 0.873411f,0.0677872f, 0.879243f,0.063653f, 0.884802f,0.0597057f, +0.890205f,0.0559832f, 0.895425f,0.0524603f, 0.900371f,0.0490926f, 0.905054f,0.0458798f, 0.909503f,0.0428244f, +0.913731f,0.0399247f, 0.917753f,0.037177f, 0.921578f,0.0345768f, 0.925216f,0.0321195f, 0.928676f,0.0297997f, +0.931965f,0.0276124f, 0.935176f,0.0255743f, 0.938244f,0.0236581f, 0.941128f,0.0218479f, 0.943852f,0.0201445f, +0.946431f,0.0185454f, 0.948874f,0.0170468f, 0.951191f,0.0156447f, 0.953385f,0.0143347f, 0.955466f,0.0131127f, +0.957578f,0.0119988f, 0.959539f,0.0109529f, 0.961371f,0.00997561f, 0.963095f,0.0090665f, 0.964721f,0.00822318f, +0.966399f,0.00746265f, 0.967953f,0.00675333f, 0.969428f,0.00609824f, 0.970929f,0.00550582f, 0.97229f,0.00495269f, +0.973552f,0.00444153f, 0.974735f,0.00397171f, 0.975848f,0.00354151f, 0.9769f,0.00314883f, 0.977895f,0.00279142f, +0.978839f,0.00246703f, 0.979735f,0.00217341f, 0.980588f,0.0019084f, 0.981397f,0.00166991f, 0.98217f,0.00145592f, +0.982907f,0.00126453f, 0.983741f,0.00110182f, 0.984553f,0.000957295f, 0.985281f,0.000825999f, 0.985956f,0.000708679f, +0.986593f,0.000604792f, 0.987196f,0.000513408f, 0.987773f,0.000433485f, 0.988324f,0.000363966f, 0.988855f,0.000303826f, +0.989366f,0.000252091f, 0.989859f,0.000207844f, 0.990336f,0.000170231f, 0.990797f,0.000138464f, 0.991244f,0.000111818f, +0.991679f,8.96267e-05f, 0.992101f,7.12883e-05f, 0.992513f,5.62566e-05f, 0.992913f,4.40412e-05f, 0.993305f,3.4204e-05f, +0.993686f,2.63571e-05f, 0.994059f,2.01591e-05f, 0.994424f,1.53127e-05f, 0.994782f,1.15613e-05f, 0.995131f,8.68597e-06f, +0.995474f,6.50242e-06f, 0.996177f,8.78935e-06f, 0.996683f,8.04499e-06f, 0.997098f,6.48301e-06f, 0.997479f,4.9016e-06f, +0.997841f,3.48469e-06f, 0.998196f,2.27498e-06f, 0.998566f,1.17002e-06f, + +0.319718f,0.479644f, 0.272038f,0.42194f, 0.250789f,0.394937f, 0.242829f,0.382083f, 0.242763f,0.376187f, +0.247949f,0.374043f, 0.256834f,0.373314f, 0.268474f,0.373116f, 0.282208f,0.372815f, 0.297479f,0.371613f, +0.313868f,0.369317f, 0.331208f,0.366437f, 0.349115f,0.362345f, 0.367475f,0.357466f, 0.386105f,0.351755f, +0.404891f,0.345374f, 0.423637f,0.338157f, 0.442287f,0.330363f, 0.460805f,0.322149f, 0.479072f,0.313481f, +0.497093f,0.304564f, 0.514892f,0.29557f, 0.532347f,0.286372f, 0.549413f,0.277013f, 0.565938f,0.267363f, +0.582056f,0.257737f, 0.597795f,0.248216f, 0.613158f,0.238831f, 0.628111f,0.229568f, 0.642682f,0.22048f, +0.656766f,0.211468f, 0.67042f,0.202623f, 0.683572f,0.193887f, 0.696279f,0.185339f, 0.708644f,0.177078f, +0.72071f,0.169129f, 0.732311f,0.161339f, 0.743481f,0.153744f, 0.754183f,0.146324f, 0.764477f,0.139128f, +0.774522f,0.132265f, 0.78424f,0.125655f, 0.79359f,0.119267f, 0.802576f,0.113098f, 0.811265f,0.107182f, +0.819622f,0.101487f, 0.827579f,0.0959688f, 0.835257f,0.0906905f, 0.842583f,0.0856036f, 0.849573f,0.0807113f, +0.85625f,0.0760188f, 0.862695f,0.0715519f, 0.868867f,0.0672832f, 0.874828f,0.0632313f, 0.880545f,0.0593703f, +0.886041f,0.0557003f, 0.891247f,0.0521852f, 0.896195f,0.0488319f, 0.900903f,0.0456405f, 0.905497f,0.0426449f, +0.909919f,0.0398129f, 0.914122f,0.0371204f, 0.91809f,0.0345584f, 0.921851f,0.0321292f, 0.925421f,0.0298311f, +0.928813f,0.0276607f, 0.932035f,0.025614f, 0.935097f,0.0236867f, 0.938007f,0.021874f, 0.940772f,0.0201716f, +0.943411f,0.0185776f, 0.946036f,0.0171083f, 0.948483f,0.0157211f, 0.950784f,0.0144195f, 0.952959f,0.0132021f, +0.955019f,0.0120661f, 0.95697f,0.011008f, 0.958819f,0.0100243f, 0.960571f,0.00911116f, 0.962235f,0.00826504f, +0.963967f,0.00750434f, 0.965552f,0.0067914f, 0.967031f,0.00612976f, 0.968422f,0.00551872f, 0.969737f,0.00495624f, +0.97112f,0.00445587f, 0.972403f,0.00399271f, 0.973589f,0.00356502f, 0.974753f,0.00317795f, 0.975946f,0.00283231f, +0.977026f,0.00251264f, 0.97803f,0.00222044f, 0.97897f,0.00195506f, 0.979858f,0.00171519f, 0.980701f,0.00149921f, +0.981502f,0.00130547f, 0.982266f,0.0011323f, 0.982996f,0.000978077f, 0.983693f,0.00084124f, 0.984361f,0.000720295f, +0.985002f,0.000613829f, 0.985618f,0.000520504f, 0.986333f,0.00044434f, 0.98706f,0.000379081f, 0.987703f,0.000320057f, +0.988298f,0.000268116f, 0.988861f,0.000223046f, 0.989398f,0.000184318f, 0.989912f,0.000151311f, 0.990408f,0.00012339f, +0.990888f,9.99471e-05f, 0.991354f,8.04096e-05f, 0.991806f,6.4251e-05f, 0.992246f,5.09913e-05f, 0.992675f,4.01978e-05f, +0.993092f,3.14841e-05f, 0.993501f,2.45078e-05f, 0.993899f,1.89691e-05f, 0.994289f,1.46072e-05f, 0.99467f,1.11987e-05f, +0.995043f,8.55395e-06f, 0.995409f,6.5144e-06f, 0.995766f,4.94964e-06f, 0.996162f,4.15043e-06f, 0.996967f,5.96166e-06f, +0.997455f,4.77293e-06f, 0.997877f,3.28805e-06f, 0.998302f,1.7248e-06f, + +0.334739f,0.465466f, 0.287719f,0.412409f, 0.265555f,0.386121f, 0.256317f,0.372704f, 0.254897f,0.365875f, +0.258711f,0.362593f, 0.266273f,0.361083f, 0.276624f,0.360232f, 0.289076f,0.359229f, 0.303227f,0.358131f, +0.318535f,0.355871f, 0.334781f,0.352871f, 0.351791f,0.34929f, 0.369236f,0.344659f, 0.387046f,0.339391f, +0.405061f,0.333439f, 0.423164f,0.326879f, 0.441253f,0.319754f, 0.459173f,0.312009f, 0.477013f,0.304063f, +0.494546f,0.29562f, 0.511865f,0.287033f, 0.528902f,0.278294f, 0.545685f,0.269533f, 0.562116f,0.260669f, +0.578117f,0.251667f, 0.593586f,0.24248f, 0.608692f,0.233414f, 0.623414f,0.224461f, 0.637779f,0.215677f, +0.651749f,0.207034f, 0.665362f,0.19859f, 0.678498f,0.19023f, 0.691251f,0.18207f, 0.703519f,0.174021f, +0.715374f,0.166167f, 0.726856f,0.158547f, 0.738026f,0.151201f, 0.74888f,0.144115f, 0.759263f,0.137168f, +0.769269f,0.130434f, 0.77886f,0.123887f, 0.788063f,0.117548f, 0.797067f,0.111526f, 0.805778f,0.105743f, +0.814159f,0.100171f, 0.82219f,0.0947918f, 0.829939f,0.0896377f, 0.837436f,0.0847117f, 0.844555f,0.0799426f, +0.851391f,0.0753753f, 0.85794f,0.0709989f, 0.864175f,0.0667947f, 0.870123f,0.0627684f, 0.875798f,0.0589203f, +0.881216f,0.0552486f, 0.886449f,0.0517693f, 0.89156f,0.0484958f, 0.896461f,0.045387f, 0.901135f,0.0424271f, +0.905555f,0.0396025f, 0.90975f,0.0369165f, 0.913737f,0.0343684f, 0.917643f,0.0319878f, 0.921378f,0.0297382f, +0.924956f,0.0276157f, 0.928323f,0.025601f, 0.931508f,0.0236966f, 0.934527f,0.021901f, 0.937391f,0.0202113f, +0.94011f,0.0186241f, 0.942691f,0.0171353f, 0.945145f,0.0157409f, 0.947473f,0.0144368f, 0.949685f,0.013219f, +0.951882f,0.0121004f, 0.953975f,0.011058f, 0.955934f,0.0100823f, 0.957783f,0.00917339f, 0.959529f,0.0083291f, +0.961183f,0.00754675f, 0.962753f,0.00682329f, 0.964242f,0.00615563f, 0.965654f,0.00554067f, 0.967033f,0.00497978f, +0.968452f,0.00447702f, 0.969748f,0.00400945f, 0.970959f,0.0035791f, 0.972102f,0.00318514f, 0.973183f,0.00282589f, +0.974361f,0.00251333f, 0.97544f,0.00222484f, 0.976436f,0.00196069f, 0.977371f,0.00172097f, 0.978339f,0.00151041f, +0.979317f,0.0013242f, 0.980204f,0.001154f, 0.98103f,0.00100058f, 0.981807f,0.00086338f, 0.982545f,0.000741424f, +0.983248f,0.00063358f, 0.983922f,0.000538681f, 0.984568f,0.000455574f, 0.985189f,0.000383153f, 0.985788f,0.000320363f, +0.986365f,0.000266213f, 0.986923f,0.000219775f, 0.987463f,0.000180185f, 0.988177f,0.000152099f, 0.988824f,0.000126777f, +0.989405f,0.000104134f, 0.989946f,8.46218e-05f, 0.99046f,6.81293e-05f, 0.990953f,5.43721e-05f, 0.991431f,4.3019e-05f, +0.991892f,3.37389e-05f, 0.992341f,2.62211e-05f, 0.992778f,2.01829e-05f, 0.993204f,1.5373e-05f, 0.993619f,1.1572e-05f, +0.994025f,8.59091e-06f, 0.994423f,6.27002e-06f, 0.994811f,4.47612e-06f, 0.99519f,3.10028e-06f, 0.99556f,2.05521e-06f, +0.995997f,1.7266e-06f, 0.996891f,2.76144e-06f, 0.997446f,1.03993e-06f, + +0.349507f,0.45156f, 0.303246f,0.402757f, 0.280328f,0.377321f, 0.269939f,0.363544f, 0.267262f,0.355934f, +0.269797f,0.351775f, 0.276106f,0.349583f, 0.285205f,0.347992f, 0.296482f,0.34666f, 0.309435f,0.345052f, +0.323736f,0.343077f, 0.338958f,0.340085f, 0.354961f,0.336516f, 0.371576f,0.332388f, 0.38853f,0.327379f, +0.405779f,0.321852f, 0.423187f,0.315774f, 0.440619f,0.309126f, 0.458081f,0.302164f, 0.475313f,0.294557f, +0.492467f,0.286826f, 0.50935f,0.278723f, 0.525947f,0.270386f, 0.54232f,0.262016f, 0.558437f,0.253636f, +0.574222f,0.245185f, 0.589678f,0.236737f, 0.604679f,0.22818f, 0.619172f,0.219523f, 0.633329f,0.211031f, +0.6471f,0.202657f, 0.660536f,0.194475f, 0.673603f,0.186455f, 0.686321f,0.178627f, 0.698597f,0.170912f, +0.71051f,0.163396f, 0.722002f,0.156031f, 0.733062f,0.148822f, 0.743725f,0.141803f, 0.754092f,0.135047f, +0.76418f,0.128555f, 0.773934f,0.122275f, 0.783244f,0.116135f, 0.792176f,0.110183f, 0.800782f,0.104444f, +0.809016f,0.0988927f, 0.817089f,0.0936368f, 0.824879f,0.0885916f, 0.832405f,0.0837585f, 0.839583f,0.0790893f, +0.846523f,0.0746324f, 0.853236f,0.0703818f, 0.859623f,0.0662841f, 0.865705f,0.062347f, 0.871582f,0.0586047f, +0.877161f,0.0550115f, 0.882472f,0.0515749f, 0.887534f,0.048296f, 0.892361f,0.045173f, 0.896964f,0.0422032f, +0.901357f,0.0393832f, 0.90566f,0.0367422f, 0.9099f,0.0342727f, 0.9139f,0.0319176f, 0.917675f,0.0296761f, +0.921247f,0.0275509f, 0.924639f,0.0255413f, 0.927974f,0.0236725f, 0.931128f,0.0219045f, 0.9342f,0.0202548f, +0.93708f,0.018692f, 0.939795f,0.0172192f, 0.942365f,0.0158354f, 0.944801f,0.0145383f, 0.947111f,0.0133248f, +0.949306f,0.0121916f, 0.951391f,0.011135f, 0.95337f,0.0101515f, 0.955251f,0.00923751f, 0.957072f,0.00839463f, +0.958898f,0.00762701f, 0.960593f,0.00690942f, 0.962184f,0.00624348f, 0.963687f,0.00562797f, 0.965113f,0.00506078f, +0.966465f,0.00453945f, 0.96775f,0.00406142f, 0.968972f,0.00362411f, 0.970136f,0.00322499f, 0.97133f,0.00286992f, +0.972513f,0.00255027f, 0.973598f,0.002256f, 0.974617f,0.00198789f, 0.97558f,0.00174507f, 0.976512f,0.00152756f, +0.977553f,0.00134277f, 0.978482f,0.0011718f, 0.979344f,0.00101699f, 0.980157f,0.000878232f, 0.980927f,0.000754712f, +0.981805f,0.000652167f, 0.982635f,0.000560588f, 0.983393f,0.000478197f, 0.984104f,0.000405246f, 0.984777f,0.000341287f, +0.985422f,0.000285642f, 0.986039f,0.000237559f, 0.986634f,0.000196277f, 0.987208f,0.000161062f, 0.987765f,0.000131221f, +0.988304f,0.000106104f, 0.988827f,8.51148e-05f, 0.989336f,6.77048e-05f, 0.989996f,5.66068e-05f, 0.990649f,4.73829e-05f, +0.991221f,3.86029e-05f, 0.991752f,3.09403e-05f, 0.992253f,2.44827e-05f, 0.992734f,1.9144e-05f, 0.993198f,1.47863e-05f, +0.993648f,1.1263e-05f, 0.994087f,8.43655e-06f, 0.994513f,6.18518e-06f, 0.994927f,4.40499e-06f, 0.995332f,3.01025e-06f, +0.995723f,1.93328e-06f, 0.996099f,1.12865e-06f, 0.997229f,1.63787e-06f, + +0.364005f,0.437936f, 0.318584f,0.39302f, 0.295059f,0.368512f, 0.28364f,0.354515f, 0.279807f,0.346346f, +0.281147f,0.341474f, 0.286259f,0.338595f, 0.294192f,0.336482f, 0.304325f,0.334729f, 0.316155f,0.332749f, +0.329413f,0.330764f, 0.343686f,0.327997f, 0.358719f,0.324439f, 0.374405f,0.320419f, 0.390591f,0.31591f, +0.407036f,0.310642f, 0.423711f,0.304935f, 0.440519f,0.298817f, 0.457302f,0.292166f, 0.474133f,0.28536f, +0.490732f,0.277988f, 0.507174f,0.270399f, 0.523454f,0.262688f, 0.539407f,0.25469f, 0.555092f,0.246613f, +0.570525f,0.238538f, 0.585726f,0.230546f, 0.600554f,0.222488f, 0.615075f,0.214499f, 0.629135f,0.206437f, +0.642707f,0.19833f, 0.655963f,0.19041f, 0.668829f,0.182603f, 0.681383f,0.175003f, 0.6936f,0.167587f, +0.705469f,0.160349f, 0.716974f,0.153278f, 0.728075f,0.146353f, 0.738826f,0.139619f, 0.749145f,0.133018f, +0.759111f,0.126616f, 0.768729f,0.120414f, 0.778061f,0.114447f, 0.787166f,0.108743f, 0.795915f,0.103208f, +0.804263f,0.0978193f, 0.812247f,0.0925998f, 0.819924f,0.0875778f, 0.827311f,0.0827536f, 0.834515f,0.0781754f, +0.841477f,0.0737973f, 0.848241f,0.0696304f, 0.854675f,0.0656076f, 0.860874f,0.0617668f, 0.86689f,0.0581201f, +0.87264f,0.0546243f, 0.878088f,0.0512627f, 0.883337f,0.0480679f, 0.888344f,0.0450179f, 0.893101f,0.0421034f, +0.897626f,0.0393267f, 0.901938f,0.036687f, 0.906044f,0.0341816f, 0.90996f,0.0318074f, 0.913698f,0.0295625f, +0.917357f,0.0274653f, 0.920917f,0.0255012f, 0.924282f,0.0236377f, 0.927545f,0.0218888f, 0.930617f,0.0202337f, +0.933525f,0.0186726f, 0.936394f,0.0172278f, 0.939084f,0.0158618f, 0.941723f,0.0145955f, 0.944207f,0.0134033f, +0.946544f,0.0122828f, 0.948751f,0.011234f, 0.950841f,0.0102549f, 0.952824f,0.00934303f, 0.954707f,0.00849546f, +0.956495f,0.0077092f, 0.958196f,0.00698119f, 0.959814f,0.00630838f, 0.961351f,0.00568778f, 0.962939f,0.00513134f, +0.964429f,0.00461575f, 0.965823f,0.00413902f, 0.967138f,0.00370072f, 0.968385f,0.00329933f, 0.969571f,0.0029329f, +0.970699f,0.00259935f, 0.971775f,0.00229658f, 0.972803f,0.00202252f, 0.973785f,0.00177516f, 0.974872f,0.00156371f, +0.975877f,0.0013701f, 0.976809f,0.00119416f, 0.977689f,0.00103589f, 0.978524f,0.000894449f, 0.979428f,0.000774996f, +0.980328f,0.000670291f, 0.981147f,0.000574993f, 0.981911f,0.000489991f, 0.982637f,0.000415004f, 0.98333f,0.000349375f, +0.984063f,0.000294687f, 0.984871f,0.000250467f, 0.985591f,0.000210244f, 0.986262f,0.000174851f, 0.986896f,0.000144237f, +0.987502f,0.000118062f, 0.988084f,9.58925e-05f, 0.988647f,7.72729e-05f, 0.989192f,6.17606e-05f, 0.989721f,4.89399e-05f, +0.990237f,3.84283e-05f, 0.990737f,2.98799e-05f, 0.991224f,2.29856e-05f, 0.991983f,2.08553e-05f, 0.992594f,1.73559e-05f, +0.99314f,1.38968e-05f, 0.993649f,1.08267e-05f, 0.994133f,8.21465e-06f, 0.994598f,6.04278e-06f, 0.995045f,4.26789e-06f, +0.995476f,2.84503e-06f, 0.995887f,1.74547e-06f, 0.996818f,2.23186e-06f, + +0.378218f,0.424598f, 0.333703f,0.383233f, 0.309704f,0.359705f, 0.297374f,0.345656f, 0.292483f,0.337104f, +0.292717f,0.331693f, 0.296686f,0.328089f, 0.303522f,0.325613f, 0.312545f,0.323373f, 0.323334f,0.321255f, +0.335479f,0.318749f, 0.348827f,0.316244f, 0.36297f,0.312914f, 0.377744f,0.308955f, 0.39307f,0.304624f, +0.408799f,0.299844f, 0.424726f,0.294421f, 0.440815f,0.288594f, 0.45704f,0.282517f, 0.473208f,0.275964f, +0.489379f,0.269247f, 0.505373f,0.262149f, 0.521146f,0.254764f, 0.536809f,0.247383f, 0.55216f,0.239756f, +0.567218f,0.23202f, 0.582019f,0.224291f, 0.596562f,0.216611f, 0.610857f,0.209023f, 0.624794f,0.201427f, +0.638417f,0.193912f, 0.651589f,0.186362f, 0.664296f,0.178811f, 0.676702f,0.171453f, 0.688744f,0.164228f, +0.700436f,0.157163f, 0.711856f,0.150327f, 0.722943f,0.143665f, 0.733703f,0.137183f, 0.744048f,0.130819f, +0.754103f,0.124672f, 0.76378f,0.118675f, 0.773076f,0.112834f, 0.782023f,0.107168f, 0.790698f,0.101724f, +0.799109f,0.0964957f, 0.807301f,0.0914974f, 0.815155f,0.0866552f, 0.822644f,0.0819558f, 0.8298f,0.0774161f, +0.836644f,0.073044f, 0.843217f,0.0688525f, 0.849641f,0.0648855f, 0.855903f,0.0611243f, 0.861927f,0.0575274f, +0.867735f,0.0540959f, 0.873273f,0.0508041f, 0.878654f,0.0476871f, 0.883845f,0.044724f, 0.888757f,0.0418778f, +0.893431f,0.0391599f, 0.897948f,0.0365905f, 0.902225f,0.0341362f, 0.906287f,0.0318008f, 0.91015f,0.0295843f, +0.913827f,0.0274848f, 0.917331f,0.0254995f, 0.920667f,0.023625f, 0.923851f,0.0218591f, 0.926997f,0.020221f, +0.930059f,0.0186916f, 0.932929f,0.017242f, 0.93564f,0.0158755f, 0.938209f,0.0145917f, 0.940715f,0.0133981f, +0.943227f,0.012303f, 0.945572f,0.0112698f, 0.947839f,0.0103109f, 0.950017f,0.009419f, 0.952055f,0.00858278f, +0.953976f,0.00780281f, 0.955792f,0.00707784f, 0.957516f,0.00640586f, 0.959153f,0.00578452f, 0.960708f,0.00521133f, +0.96219f,0.0046837f, 0.963601f,0.00419909f, 0.964946f,0.00375497f, 0.966316f,0.00335793f, 0.967651f,0.00299719f, +0.968894f,0.00266475f, 0.970067f,0.00236086f, 0.971178f,0.00208448f, 0.972237f,0.0018341f, 0.973247f,0.0016081f, +0.974215f,0.00140479f, 0.97514f,0.00122249f, 0.976028f,0.00105961f, 0.976969f,0.00092007f, 0.977923f,0.000798437f, +0.978797f,0.000687769f, 0.979618f,0.000588826f, 0.980398f,0.000501235f, 0.981183f,0.000426119f, 0.982075f,0.000366079f, +0.982867f,0.000310517f, 0.983602f,0.000261039f, 0.984298f,0.000217756f, 0.984963f,0.00018032f, 0.985603f,0.000148229f, +0.986275f,0.000122341f, 0.987059f,0.000103271f, 0.987751f,8.54789e-05f, 0.988391f,6.9838e-05f, 0.988996f,5.64526e-05f, +0.989576f,4.51821e-05f, 0.990133f,3.5805e-05f, 0.990673f,2.808e-05f, 0.991196f,2.17726e-05f, 0.991704f,1.66657e-05f, +0.992197f,1.2565e-05f, 0.992769f,1.01286e-05f, 0.993518f,9.38787e-06f, 0.994117f,7.57201e-06f, 0.994653f,5.68456e-06f, +0.995148f,3.99229e-06f, 0.995607f,2.59302e-06f, 0.995951f,1.87723e-06f, + +0.392141f,0.411556f, 0.348583f,0.373435f, 0.324233f,0.350911f, 0.311102f,0.336951f, 0.305245f,0.328125f, +0.304443f,0.322243f, 0.307353f,0.318127f, 0.313129f,0.315218f, 0.321104f,0.312602f, 0.330863f,0.310194f, +0.342028f,0.307597f, 0.354353f,0.304815f, 0.367639f,0.301781f, 0.381557f,0.297983f, 0.396022f,0.29374f, +0.410957f,0.289206f, 0.426212f,0.284253f, 0.441619f,0.278759f, 0.457127f,0.272884f, 0.47277f,0.266875f, +0.48834f,0.260458f, 0.503848f,0.253827f, 0.519274f,0.247049f, 0.534442f,0.23995f, 0.549447f,0.232795f, +0.564254f,0.225591f, 0.578731f,0.218222f, 0.592924f,0.210825f, 0.606848f,0.203467f, 0.620525f,0.196206f, +0.633956f,0.189053f, 0.647046f,0.181938f, 0.659826f,0.174915f, 0.67217f,0.16789f, 0.684068f,0.160888f, +0.695671f,0.154073f, 0.706944f,0.147413f, 0.717831f,0.140869f, 0.728506f,0.134585f, 0.738856f,0.128463f, +0.748905f,0.122525f, 0.758605f,0.116734f, 0.767968f,0.111104f, 0.777032f,0.105658f, 0.785724f,0.100349f, +0.794099f,0.0952153f, 0.802151f,0.0902472f, 0.809953f,0.0854828f, 0.817536f,0.0809279f, 0.8249f,0.0765714f, +0.831959f,0.0723636f, 0.838683f,0.0682904f, 0.845102f,0.0643648f, 0.851236f,0.0605927f, 0.857101f,0.0569759f, +0.862774f,0.0535392f, 0.868348f,0.0503022f, 0.873766f,0.0472343f, 0.878968f,0.0443069f, 0.883951f,0.0415119f, +0.888781f,0.0388675f, 0.893453f,0.0363627f, 0.897909f,0.0339733f, 0.902118f,0.0316869f, 0.906171f,0.029526f, +0.910042f,0.0274755f, 0.913705f,0.0255259f, 0.917185f,0.0236782f, 0.920494f,0.0219314f, 0.923642f,0.0202832f, +0.92664f,0.0187307f, 0.929495f,0.0172707f, 0.932215f,0.0158998f, 0.934949f,0.0146412f, 0.937589f,0.0134664f, +0.940065f,0.0123575f, 0.942401f,0.0113166f, 0.944615f,0.0103428f, 0.946716f,0.00943434f, 0.948832f,0.00860641f, +0.950812f,0.0078303f, 0.952774f,0.00711739f, 0.954739f,0.00646737f, 0.95656f,0.00585815f, 0.958267f,0.00529144f, +0.959879f,0.00476681f, 0.961405f,0.00428289f, 0.962854f,0.00383788f, 0.964233f,0.0034298f, 0.965546f,0.0030566f, +0.9668f,0.00271616f, 0.967997f,0.00240645f, 0.969206f,0.00213096f, 0.970426f,0.00188593f, 0.971554f,0.00166089f, +0.972621f,0.00145647f, 0.973631f,0.00127199f, 0.974597f,0.00110634f, 0.975521f,0.000958238f, 0.976406f,0.000826371f, +0.977258f,0.000709433f, 0.978078f,0.000606163f, 0.978919f,0.000517882f, 0.979839f,0.000445233f, 0.980673f,0.000378803f, +0.981452f,0.000319745f, 0.982193f,0.000267988f, 0.982928f,0.000223972f, 0.983802f,0.000191491f, 0.984572f,0.000160727f, +0.985286f,0.000133323f, 0.98596f,0.000109533f, 0.986605f,8.91914e-05f, 0.987225f,7.19933e-05f, 0.987826f,5.75904e-05f, +0.988571f,4.83001e-05f, 0.989296f,4.03175e-05f, 0.989947f,3.27996e-05f, 0.990554f,2.62039e-05f, 0.99113f,2.0599e-05f, +0.991682f,1.59252e-05f, 0.992213f,1.20818e-05f, 0.992725f,8.96054e-06f, 0.993218f,6.46011e-06f, 0.993848f,5.38951e-06f, +0.99462f,4.91976e-06f, 0.995203f,3.59909e-06f, 0.995511f,2.61735e-06f, + +0.405768f,0.398816f, 0.363206f,0.36366f, 0.338613f,0.342147f, 0.324788f,0.328392f, 0.31805f,0.319383f, +0.316286f,0.313112f, 0.318208f,0.308616f, 0.322962f,0.30519f, 0.32996f,0.302372f, 0.338724f,0.299649f, +0.34894f,0.296951f, 0.360296f,0.293945f, 0.372683f,0.290971f, 0.385799f,0.287469f, 0.399445f,0.283361f, +0.413557f,0.278906f, 0.428073f,0.274227f, 0.442846f,0.26918f, 0.457733f,0.263677f, 0.472683f,0.257836f, +0.487728f,0.251879f, 0.502725f,0.245646f, 0.517614f,0.239171f, 0.532452f,0.232649f, 0.547055f,0.225871f, +0.561425f,0.218949f, 0.57566f,0.212087f, 0.589614f,0.205127f, 0.603254f,0.198096f, 0.616623f,0.191096f, +0.629707f,0.184141f, 0.642583f,0.177342f, 0.655151f,0.170601f, 0.667436f,0.163966f, 0.679428f,0.157443f, +0.691003f,0.15094f, 0.702144f,0.144473f, 0.712991f,0.138179f, 0.723549f,0.132059f, 0.733724f,0.126047f, +0.743647f,0.120244f, 0.753322f,0.114643f, 0.762715f,0.109219f, 0.771795f,0.103948f, 0.780527f,0.0988112f, +0.788997f,0.093861f, 0.79717f,0.0890719f, 0.804987f,0.0844121f, 0.812531f,0.0799247f, 0.819779f,0.075596f, +0.826799f,0.0714508f, 0.833633f,0.0675022f, 0.840249f,0.0637242f, 0.846605f,0.0600914f, 0.852651f,0.0565824f, +0.858417f,0.0532076f, 0.863922f,0.0499716f, 0.869183f,0.0468754f, 0.874261f,0.0439364f, 0.87919f,0.0411561f, +0.883924f,0.0385109f, 0.888643f,0.0360445f, 0.893111f,0.0336799f, 0.897426f,0.0314413f, 0.90166f,0.0293431f, +0.905724f,0.0273528f, 0.909559f,0.0254504f, 0.913188f,0.0236395f, 0.916718f,0.0219423f, 0.920048f,0.0203284f, +0.923203f,0.0188006f, 0.926198f,0.0173587f, 0.929046f,0.0160009f, 0.931757f,0.0147251f, 0.934338f,0.0135283f, +0.936796f,0.0124078f, 0.93914f,0.0113603f, 0.941533f,0.0104084f, 0.943831f,0.0095208f, 0.945984f,0.00868662f, +0.948017f,0.00790709f, 0.949942f,0.00718139f, 0.951779f,0.00650869f, 0.953638f,0.00589995f, 0.955376f,0.00533165f, +0.957015f,0.00480479f, 0.958677f,0.00432994f, 0.960245f,0.00389021f, 0.961756f,0.00348664f, 0.963243f,0.00311909f, +0.96464f,0.00278104f, 0.965962f,0.0024716f, 0.967217f,0.00218946f, 0.968412f,0.00193312f, 0.969553f,0.001701f, +0.970644f,0.0014915f, 0.97175f,0.00130739f, 0.972881f,0.00114629f, 0.973928f,0.000998964f, 0.974914f,0.000866089f, +0.975853f,0.000747233f, 0.97675f,0.000641568f, 0.977612f,0.000548127f, 0.97844f,0.000465904f, 0.979239f,0.000393908f, +0.98001f,0.000331178f, 0.980816f,0.000279187f, 0.9817f,0.000237696f, 0.982501f,0.00019962f, 0.983249f,0.000165993f, +0.98396f,0.000136848f, 0.984734f,0.000114409f, 0.985567f,9.70958e-05f, 0.986308f,8.05702e-05f, 0.986997f,6.58927e-05f, +0.987651f,5.32489e-05f, 0.988279f,4.25492e-05f, 0.988881f,3.36101e-05f, 0.989464f,2.62211e-05f, 0.990219f,2.22484e-05f, +0.990943f,1.85666e-05f, 0.991585f,1.48043e-05f, 0.992176f,1.14158e-05f, 0.992732f,8.52156e-06f, 0.993253f,6.13787e-06f, +0.993738f,4.25774e-06f, 0.994392f,3.74181e-06f, 0.994513f,2.40559e-06f, + +0.419091f,0.386381f, 0.377552f,0.353932f, 0.352818f,0.333441f, 0.338394f,0.31997f, 0.330856f,0.310822f, +0.328208f,0.3043f, 0.329204f,0.299481f, 0.333002f,0.295647f, 0.339057f,0.292582f, 0.346875f,0.289592f, +0.356161f,0.286716f, 0.366646f,0.283757f, 0.378066f,0.280441f, 0.390389f,0.277218f, 0.403289f,0.273424f, +0.416621f,0.269099f, 0.43035f,0.264497f, 0.44443f,0.259733f, 0.458717f,0.254652f, 0.473089f,0.249189f, +0.487504f,0.24345f, 0.501939f,0.23753f, 0.516377f,0.231494f, 0.530693f,0.225239f, 0.54492f,0.218913f, +0.558986f,0.21247f, 0.572802f,0.205868f, 0.586438f,0.19927f, 0.59988f,0.192696f, 0.612999f,0.186031f, +0.625839f,0.179382f, 0.638427f,0.172808f, 0.650726f,0.166291f, 0.662829f,0.159945f, 0.674597f,0.153639f, +0.686082f,0.147445f, 0.69734f,0.141417f, 0.708204f,0.135427f, 0.718646f,0.129479f, 0.728786f,0.123683f, +0.738669f,0.118071f, 0.748199f,0.112573f, 0.757398f,0.107214f, 0.766449f,0.102105f, 0.775226f,0.0971589f, +0.78374f,0.0923777f, 0.791923f,0.0877226f, 0.799811f,0.0832139f, 0.807468f,0.0788841f, 0.814823f,0.0746908f, +0.821875f,0.0706349f, 0.828658f,0.0667289f, 0.835191f,0.0629788f, 0.841512f,0.0593938f, 0.847674f,0.0559882f, +0.853617f,0.0527287f, 0.859347f,0.0496109f, 0.864796f,0.0466066f, 0.869987f,0.0437226f, 0.874938f,0.0409627f, +0.879665f,0.0383275f, 0.884215f,0.0358275f, 0.888629f,0.0334669f, 0.89288f,0.0312305f, 0.896996f,0.0291196f, +0.900986f,0.0271275f, 0.90482f,0.0252397f, 0.908646f,0.0234878f, 0.91235f,0.0218373f, 0.915887f,0.0202723f, +0.919211f,0.0187799f, 0.922401f,0.0173749f, 0.925458f,0.0160522f, 0.928344f,0.0148005f, 0.931079f,0.0136207f, +0.933675f,0.0125119f, 0.936145f,0.0114724f, 0.938496f,0.0104999f, 0.940736f,0.00959187f, 0.942872f,0.00874566f, +0.944908f,0.00795851f, 0.947032f,0.00725211f, 0.949051f,0.00659359f, 0.950945f,0.00597756f, 0.952732f,0.00540476f, +0.954428f,0.00487435f, 0.956067f,0.00438773f, 0.957717f,0.00394896f, 0.959261f,0.00354156f, 0.960721f,0.00316612f, +0.962187f,0.00282909f, 0.963608f,0.00252194f, 0.964941f,0.0022394f, 0.966201f,0.00198129f, 0.967402f,0.00174667f, +0.968547f,0.00153429f, 0.96972f,0.00134616f, 0.970858f,0.0011774f, 0.971939f,0.00102539f, 0.972967f,0.000889159f, +0.974037f,0.00077262f, 0.975104f,0.000670563f, 0.976094f,0.000577763f, 0.977027f,0.00049475f, 0.977915f,0.00042122f, +0.978767f,0.000356573f, 0.979584f,0.000300097f, 0.980373f,0.000251054f, 0.981135f,0.000208714f, 0.981873f,0.000172379f, +0.982716f,0.000145204f, 0.983552f,0.000122141f, 0.984317f,0.000101117f, 0.985038f,8.2735e-05f, 0.985724f,6.69989e-05f, +0.986606f,5.79827e-05f, 0.987377f,4.83712e-05f, 0.988079f,3.94119e-05f, 0.988738f,3.15476e-05f, 0.989367f,2.48416e-05f, +0.989967f,1.9229e-05f, 0.990542f,1.46021e-05f, 0.99123f,1.19043e-05f, 0.992f,1.01277e-05f, 0.992635f,7.85139e-06f, +0.993175f,5.75376e-06f, 0.993563f,4.05184e-06f, 0.993921f,3.19728e-06f, + +0.432102f,0.37425f, 0.391606f,0.344278f, 0.36682f,0.32481f, 0.351887f,0.311665f, 0.343628f,0.302429f, +0.340166f,0.295744f, 0.340293f,0.29064f, 0.343201f,0.286512f, 0.348344f,0.283127f, 0.355285f,0.280037f, +0.363677f,0.276979f, 0.373289f,0.273922f, 0.383874f,0.270634f, 0.395273f,0.267135f, 0.407448f,0.263686f, +0.420092f,0.259707f, 0.433083f,0.255245f, 0.446409f,0.250554f, 0.460042f,0.245754f, 0.473847f,0.240691f, +0.487711f,0.235306f, 0.501597f,0.229687f, 0.515467f,0.223885f, 0.529342f,0.218029f, 0.543108f,0.212008f, +0.556759f,0.205902f, 0.570268f,0.199734f, 0.583569f,0.193471f, 0.596627f,0.187134f, 0.609539f,0.180885f, +0.622198f,0.174626f, 0.634543f,0.168327f, 0.646618f,0.162075f, 0.658456f,0.155927f, 0.670012f,0.149852f, +0.681381f,0.143949f, 0.692415f,0.138093f, 0.703172f,0.132354f, 0.713684f,0.12676f, 0.723877f,0.121257f, +0.733679f,0.115812f, 0.743155f,0.110487f, 0.752406f,0.105351f, 0.761357f,0.10035f, 0.769966f,0.0954625f, +0.778343f,0.0907573f, 0.786544f,0.0862549f, 0.794515f,0.0819173f, 0.802203f,0.0777139f, 0.809585f,0.0736333f, +0.816729f,0.0697089f, 0.823645f,0.0659392f, 0.830271f,0.0622919f, 0.83664f,0.0587824f, 0.842747f,0.0554038f, +0.848641f,0.0521733f, 0.854335f,0.0490883f, 0.859901f,0.0461687f, 0.865268f,0.0433801f, 0.870418f,0.0407103f, +0.875343f,0.0381545f, 0.880027f,0.0357053f, 0.884492f,0.0333657f, 0.888753f,0.0311365f, 0.892836f,0.0290213f, +0.896798f,0.0270294f, 0.900645f,0.0251546f, 0.904344f,0.0233829f, 0.90789f,0.021707f, 0.911324f,0.0201304f, +0.91459f,0.0186372f, 0.917912f,0.0172684f, 0.921204f,0.0159944f, 0.924303f,0.0147818f, 0.927212f,0.0136299f, +0.930048f,0.0125572f, 0.932721f,0.0115431f, 0.935245f,0.0105877f, 0.937638f,0.00969123f, 0.939911f,0.00885247f, +0.942073f,0.00806976f, 0.944134f,0.00734102f, 0.946099f,0.00666401f, 0.947974f,0.00603637f, 0.949764f,0.00545569f, +0.95168f,0.00494305f, 0.953477f,0.00446414f, 0.955163f,0.00401842f, 0.956757f,0.00360626f, 0.958271f,0.00322688f, +0.959766f,0.00288421f, 0.961249f,0.00257493f, 0.96264f,0.00228966f, 0.963956f,0.00202858f, 0.965273f,0.00179556f, +0.96658f,0.00158693f, 0.967804f,0.00139592f, 0.968963f,0.00122258f, 0.970066f,0.00106625f, 0.971123f,0.000925956f, +0.972136f,0.000800626f, 0.97311f,0.000689143f, 0.974047f,0.000590399f, 0.974952f,0.000503318f, 0.976077f,0.000436145f, +0.97712f,0.000374881f, 0.978083f,0.000319394f, 0.978991f,0.000270097f, 0.979852f,0.000226826f, 0.980677f,0.000189194f, +0.981469f,0.00015672f, 0.982233f,0.000128902f, 0.982969f,0.00010524f, 0.983735f,8.65298e-05f, 0.984616f,7.3511e-05f, +0.985398f,6.07865e-05f, 0.986125f,4.94156e-05f, 0.986813f,3.96164e-05f, 0.987708f,3.47504e-05f, 0.988482f,2.89371e-05f, +0.98918f,2.32726e-05f, 0.989827f,1.82287e-05f, 0.990429f,1.39237e-05f, 0.990987f,1.03591e-05f, 0.991484f,7.49709e-06f, +0.992205f,6.75315e-06f, 0.992297f,4.76431e-06f, 0.992858f,3.20967e-06f, + +0.444801f,0.362428f, 0.40536f,0.334718f, 0.380599f,0.316246f, 0.365241f,0.303457f, 0.35634f,0.294233f, +0.352129f,0.287429f, 0.351447f,0.282093f, 0.353527f,0.277794f, 0.357801f,0.274071f, 0.3639f,0.270871f, +0.371434f,0.267622f, 0.380201f,0.264463f, 0.389994f,0.261253f, 0.400581f,0.257727f, 0.411909f,0.25417f, +0.423855f,0.250479f, 0.436203f,0.246366f, 0.448835f,0.241833f, 0.461748f,0.237106f, 0.474927f,0.232306f, +0.488254f,0.2273f, 0.501627f,0.222034f, 0.514981f,0.21653f, 0.528305f,0.210875f, 0.541649f,0.205229f, +0.554866f,0.199424f, 0.567959f,0.193541f, 0.580946f,0.187664f, 0.593717f,0.181689f, 0.606287f,0.175694f, +0.618634f,0.169695f, 0.630825f,0.163793f, 0.642738f,0.157879f, 0.654344f,0.151963f, 0.6657f,0.146125f, +0.676825f,0.140398f, 0.687679f,0.134758f, 0.698354f,0.129289f, 0.708703f,0.123875f, 0.718787f,0.118579f, +0.728639f,0.11343f, 0.738183f,0.108375f, 0.747349f,0.103382f, 0.75621f,0.0985049f, 0.764871f,0.0938148f, +0.773274f,0.0892696f, 0.781341f,0.0848269f, 0.789133f,0.080524f, 0.796763f,0.0764156f, 0.804214f,0.0724815f, +0.811457f,0.0687015f, 0.818389f,0.0650234f, 0.825063f,0.061475f, 0.831531f,0.0580739f, 0.837789f,0.054813f, +0.843768f,0.0516615f, 0.84953f,0.0486425f, 0.855039f,0.045738f, 0.860367f,0.0429711f, 0.865499f,0.0403297f, +0.870539f,0.0378419f, 0.875398f,0.0354704f, 0.880021f,0.0331946f, 0.884489f,0.0310347f, 0.888735f,0.0289682f, +0.892777f,0.0269977f, 0.89663f,0.0251239f, 0.900307f,0.0233459f, 0.903896f,0.0216808f, 0.90736f,0.0201121f, +0.9107f,0.0186355f, 0.913936f,0.0172496f, 0.916998f,0.0159355f, 0.919951f,0.0147023f, 0.922851f,0.0135562f, +0.92572f,0.0124947f, 0.928581f,0.0115143f, 0.931262f,0.0105828f, 0.933887f,0.00971685f, 0.936411f,0.00890759f, +0.93878f,0.00814425f, 0.941017f,0.0074282f, 0.943137f,0.00675925f, 0.945151f,0.00613633f, 0.947069f,0.00555789f, +0.948897f,0.00502215f, 0.950643f,0.00452716f, 0.95231f,0.00407091f, 0.953949f,0.00365596f, 0.955673f,0.00328913f, +0.957292f,0.00294843f, 0.958814f,0.00263315f, 0.960253f,0.00234344f, 0.961624f,0.00207854f, 0.963027f,0.00184479f, +0.964375f,0.00163207f, 0.965643f,0.00143741f, 0.966848f,0.00126067f, 0.968059f,0.00110472f, 0.969275f,0.000967179f, +0.970414f,0.00084194f, 0.971493f,0.000729137f, 0.972524f,0.000628294f, 0.973511f,0.000538684f, 0.974459f,0.000459486f, +0.975373f,0.000389849f, 0.976254f,0.000328927f, 0.977182f,0.000278776f, 0.978149f,0.000237289f, 0.979041f,0.000199574f, +0.979881f,0.000166274f, 0.980762f,0.000138602f, 0.981639f,0.000115157f, 0.982467f,9.47938e-05f, 0.983252f,7.7331e-05f, +0.984003f,6.25141e-05f, 0.984767f,5.09121e-05f, 0.985669f,4.37061e-05f, 0.986455f,3.60388e-05f, 0.987175f,2.90121e-05f, +0.987941f,2.41102e-05f, 0.9888f,2.09536e-05f, 0.989504f,1.69419e-05f, 0.990094f,1.3118e-05f, 0.990508f,9.74804e-06f, +0.990586f,6.70273e-06f, 0.991237f,4.81562e-06f, 0.991933f,3.79052e-06f, + +0.457187f,0.350913f, 0.418805f,0.325273f, 0.394139f,0.307765f, 0.378432f,0.29536f, 0.36896f,0.2862f, +0.364065f,0.279334f, 0.362637f,0.273848f, 0.363932f,0.269358f, 0.367399f,0.265418f, 0.372674f,0.262011f, +0.379425f,0.258758f, 0.387379f,0.255472f, 0.396367f,0.252185f, 0.406221f,0.248811f, 0.416731f,0.245109f, +0.427925f,0.241504f, 0.439605f,0.237645f, 0.45163f,0.233446f, 0.463889f,0.228892f, 0.476382f,0.22417f, +0.489106f,0.219401f, 0.501965f,0.214488f, 0.514852f,0.209356f, 0.527691f,0.20399f, 0.540516f,0.198544f, +0.553296f,0.193038f, 0.566011f,0.187492f, 0.578575f,0.18185f, 0.591039f,0.176228f, 0.603327f,0.170567f, +0.615379f,0.164847f, 0.627235f,0.159148f, 0.638919f,0.153527f, 0.650408f,0.147975f, 0.661602f,0.142417f, +0.672522f,0.136901f, 0.683194f,0.131471f, 0.693644f,0.126156f, 0.703837f,0.12094f, 0.713857f,0.115889f, +0.72358f,0.110911f, 0.733021f,0.106031f, 0.742263f,0.101308f, 0.751221f,0.096687f, 0.75984f,0.0921407f, +0.768122f,0.0876828f, 0.776178f,0.0833808f, 0.784022f,0.0792376f, 0.791623f,0.075227f, 0.798928f,0.0713272f, +0.806017f,0.0675783f, 0.812936f,0.0639938f, 0.819719f,0.0605801f, 0.82629f,0.0572976f, 0.832551f,0.0541034f, +0.838605f,0.0510405f, 0.844459f,0.0481064f, 0.850133f,0.0453033f, 0.855541f,0.0425976f, 0.860766f,0.040016f, +0.865751f,0.0375357f, 0.870576f,0.0351785f, 0.875205f,0.0329282f, 0.879784f,0.0308217f, 0.884196f,0.0288175f, +0.888396f,0.0268993f, 0.892414f,0.0250728f, 0.896281f,0.0233415f, 0.899957f,0.0216932f, 0.903458f,0.0201287f, +0.906798f,0.0186474f, 0.910048f,0.0172611f, 0.913171f,0.0159559f, 0.916212f,0.014736f, 0.919172f,0.013597f, +0.921979f,0.0125203f, 0.924642f,0.0115053f, 0.927192f,0.0105548f, 0.929801f,0.00969005f, 0.932366f,0.00888924f, +0.934844f,0.0081416f, 0.93722f,0.00744194f, 0.939538f,0.00679503f, 0.941725f,0.00618764f, 0.943844f,0.00562373f, +0.945863f,0.00509871f, 0.947774f,0.0046102f, 0.949589f,0.00415739f, 0.951317f,0.00373905f, 0.952965f,0.00335373f, +0.95454f,0.00299982f, 0.956048f,0.00267566f, 0.957585f,0.00238773f, 0.95916f,0.0021319f, 0.960639f,0.00189537f, +0.96203f,0.00167791f, 0.963352f,0.00147947f, 0.964632f,0.00130096f, 0.965958f,0.00114586f, 0.967199f,0.00100344f, +0.968371f,0.000874294f, 0.969487f,0.000758131f, 0.970635f,0.00065798f, 0.971776f,0.000570049f, 0.972845f,0.000490528f, +0.97386f,0.000419523f, 0.97483f,0.000356679f, 0.97576f,0.000301452f, 0.976657f,0.000253226f, 0.977519f,0.000211369f, +0.97839f,0.000176405f, 0.979364f,0.000149857f, 0.980249f,0.000125191f, 0.981079f,0.000103318f, 0.981866f,8.43585e-05f, +0.982617f,6.8165e-05f, 0.983335f,5.44938e-05f, 0.984024f,4.30717e-05f, 0.984828f,3.48858e-05f, 0.985702f,2.97053e-05f, +0.986564f,2.54344e-05f, 0.987277f,2.07332e-05f, 0.987862f,1.65251e-05f, 0.988469f,1.48678e-05f, 0.989057f,1.1734e-05f, +0.989773f,8.68213e-06f, 0.990342f,6.00878e-06f, 0.990852f,4.19136e-06f, + +0.469251f,0.339703f, 0.43193f,0.315956f, 0.40742f,0.299379f, 0.391435f,0.287371f, 0.381462f,0.27833f, +0.375942f,0.271425f, 0.373823f,0.265849f, 0.374384f,0.261197f, 0.377104f,0.25716f, 0.381589f,0.253499f, +0.38758f,0.250212f, 0.394759f,0.246821f, 0.402991f,0.24352f, 0.412092f,0.240147f, 0.421908f,0.236601f, +0.432299f,0.232826f, 0.4433f,0.229161f, 0.45469f,0.225206f, 0.466378f,0.220978f, 0.478257f,0.216441f, +0.490331f,0.211762f, 0.502599f,0.207043f, 0.514997f,0.202246f, 0.527407f,0.197258f, 0.539767f,0.19208f, +0.5521f,0.186835f, 0.56435f,0.181499f, 0.576569f,0.176193f, 0.588637f,0.170805f, 0.600546f,0.165374f, +0.612374f,0.160023f, 0.623973f,0.154618f, 0.635347f,0.149202f, 0.646536f,0.143843f, 0.657563f,0.138582f, +0.668384f,0.133387f, 0.678902f,0.128195f, 0.689176f,0.123078f, 0.699203f,0.118046f, 0.709017f,0.113133f, +0.71859f,0.108324f, 0.727996f,0.103672f, 0.737142f,0.0991143f, 0.745978f,0.0946282f, 0.754661f,0.0903145f, +0.763053f,0.0860885f, 0.771171f,0.0819638f, 0.778955f,0.0779158f, 0.786484f,0.0739921f, 0.793839f,0.0702321f, +0.800959f,0.0665974f, 0.807779f,0.0630596f, 0.814361f,0.0596464f, 0.820817f,0.0564005f, 0.827121f,0.0533016f, +0.833289f,0.0503506f, 0.839245f,0.0475119f, 0.844916f,0.0447578f, 0.850417f,0.0421293f, 0.855728f,0.0396139f, +0.860887f,0.0372198f, 0.865801f,0.0349138f, 0.870547f,0.0327181f, 0.875076f,0.0306138f, 0.879456f,0.0286174f, +0.883635f,0.02671f, 0.887811f,0.0249383f, 0.891834f,0.0232555f, 0.895667f,0.0216496f, 0.899304f,0.0201175f, +0.902816f,0.0186714f, 0.906179f,0.0173029f, 0.909379f,0.0160061f, 0.912429f,0.0147809f, 0.915384f,0.0136345f, +0.918236f,0.0125601f, 0.92101f,0.0115584f, 0.923718f,0.0106264f, 0.926311f,0.00975179f, 0.928765f,0.00892862f, +0.931099f,0.00815704f, 0.933392f,0.00744587f, 0.935677f,0.00679348f, 0.938003f,0.00620134f, 0.94018f,0.0056428f, +0.942322f,0.00512898f, 0.944426f,0.00465658f, 0.946394f,0.00421321f, 0.948251f,0.00380011f, 0.950011f,0.00341725f, +0.951685f,0.00306392f, 0.953362f,0.00274365f, 0.954953f,0.00244905f, 0.95647f,0.00217913f, 0.957917f,0.0019327f, +0.959347f,0.00171182f, 0.960787f,0.00151566f, 0.962255f,0.00134275f, 0.963624f,0.00118296f, 0.964913f,0.00103712f, +0.966139f,0.000905076f, 0.967415f,0.000791887f, 0.968637f,0.000689851f, 0.969787f,0.000597243f, 0.970882f,0.000514149f, +0.971926f,0.000440192f, 0.973051f,0.000379214f, 0.974121f,0.000324646f, 0.975128f,0.000275744f, 0.976084f,0.000232526f, +0.976997f,0.000194707f, 0.977874f,0.000161882f, 0.978716f,0.0001336f, 0.979574f,0.000110631f, 0.980525f,9.36131e-05f, +0.98138f,7.75301e-05f, 0.98217f,6.32317e-05f, 0.982907f,5.08804e-05f, 0.983589f,4.04046e-05f, 0.984206f,3.16456e-05f, +0.984728f,2.44107e-05f, 0.985114f,1.90605e-05f, 0.985681f,1.63063e-05f, 0.986587f,1.35528e-05f, 0.987513f,1.15777e-05f, +0.988456f,1.00404e-05f, 0.988902f,6.96987e-06f, 0.98957f,4.45112e-06f, + +0.480999f,0.328799f, 0.444733f,0.306785f, 0.420433f,0.291096f, 0.404235f,0.279497f, 0.393827f,0.270635f, +0.387738f,0.263703f, 0.384983f,0.258083f, 0.384858f,0.253308f, 0.386873f,0.249189f, 0.390625f,0.245373f, +0.395867f,0.241942f, 0.402341f,0.23861f, 0.409824f,0.235203f, 0.418192f,0.231797f, 0.427319f,0.228359f, +0.43704f,0.224707f, 0.447263f,0.220884f, 0.458036f,0.217192f, 0.469119f,0.213194f, 0.480461f,0.208977f, +0.491957f,0.20449f, 0.503613f,0.199881f, 0.515433f,0.195242f, 0.527371f,0.190561f, 0.539318f,0.185735f, +0.551208f,0.180745f, 0.563062f,0.175698f, 0.574821f,0.170567f, 0.586533f,0.165464f, 0.598137f,0.160339f, +0.609582f,0.155179f, 0.620902f,0.150055f, 0.632062f,0.14495f, 0.643002f,0.139833f, 0.653718f,0.134732f, +0.664274f,0.129723f, 0.674683f,0.124827f, 0.68486f,0.119982f, 0.694748f,0.11516f, 0.704413f,0.11043f, +0.713831f,0.105781f, 0.723049f,0.101255f, 0.732037f,0.0968322f, 0.740865f,0.0925604f, 0.74948f,0.0884027f, +0.757756f,0.0842912f, 0.76591f,0.0803557f, 0.773804f,0.0765152f, 0.781428f,0.072767f, 0.788766f,0.0691075f, +0.795831f,0.065548f, 0.80271f,0.0621309f, 0.809409f,0.0588512f, 0.815849f,0.0556719f, 0.822022f,0.0525898f, +0.828006f,0.0496367f, 0.833849f,0.0468249f, 0.83956f,0.0441491f, 0.845128f,0.0416004f, 0.85052f,0.0391572f, +0.855677f,0.0368002f, 0.860688f,0.0345582f, 0.865527f,0.0324178f, 0.870232f,0.0303854f, 0.874716f,0.0284343f, +0.879042f,0.0265782f, 0.883173f,0.0248046f, 0.887167f,0.023125f, 0.890967f,0.021522f, 0.894774f,0.0200372f, +0.898458f,0.0186341f, 0.901975f,0.0172993f, 0.90531f,0.0160281f, 0.908481f,0.0148224f, 0.911568f,0.0136931f, +0.914512f,0.0126269f, 0.917317f,0.0116214f, 0.920017f,0.0106803f, 0.92265f,0.00980484f, 0.925179f,0.00898607f, +0.927672f,0.00822985f, 0.930086f,0.00752599f, 0.932367f,0.00686443f, 0.934533f,0.00624568f, 0.936634f,0.00567353f, +0.938688f,0.00514719f, 0.940743f,0.00466804f, 0.942828f,0.00423397f, 0.944792f,0.0038274f, 0.946737f,0.00345751f, +0.948634f,0.00311709f, 0.950432f,0.0028009f, 0.952129f,0.00250776f, 0.953738f,0.00223757f, 0.95527f,0.00198971f, +0.956731f,0.00176328f, 0.95813f,0.0015572f, 0.959478f,0.00137067f, 0.960847f,0.00120493f, 0.962274f,0.00106231f, +0.96365f,0.000933395f, 0.965023f,0.000819327f, 0.966304f,0.000714706f, 0.967513f,0.000619965f, 0.968738f,0.000538313f, +0.969953f,0.000466837f, 0.971089f,0.000401735f, 0.972163f,0.000343384f, 0.973185f,0.000291634f, 0.974218f,0.000247803f, +0.975289f,0.00021142f, 0.976282f,0.000178462f, 0.977214f,0.000149275f, 0.978094f,0.000123794f, 0.978926f,0.000101786f, +0.979709f,8.29528e-05f, 0.980561f,6.92783e-05f, 0.981383f,5.79321e-05f, 0.982055f,4.7259e-05f, 0.982519f,3.77966e-05f, +0.982973f,2.96604e-05f, 0.983689f,2.2879e-05f, 0.984341f,1.7286e-05f, 0.984987f,1.34287e-05f, 0.98564f,1.11233e-05f, +0.986265f,8.13028e-06f, 0.987488f,7.42215e-06f, 0.988177f,4.75539e-06f, + +0.492429f,0.318197f, 0.457209f,0.297772f, 0.433166f,0.28293f, 0.416814f,0.271744f, 0.40603f,0.263096f, +0.39943f,0.25618f, 0.396089f,0.250538f, 0.39533f,0.245702f, 0.396675f,0.241471f, 0.39975f,0.237607f, +0.404273f,0.233993f, 0.410059f,0.230677f, 0.416846f,0.227247f, 0.424522f,0.223851f, 0.43295f,0.220403f, +0.442029f,0.216901f, 0.451602f,0.213172f, 0.461625f,0.209338f, 0.47214f,0.205633f, 0.482902f,0.20163f, +0.493893f,0.197456f, 0.505004f,0.193042f, 0.51625f,0.188528f, 0.527626f,0.183984f, 0.539112f,0.17943f, +0.550605f,0.174767f, 0.562055f,0.16999f, 0.573426f,0.165119f, 0.584742f,0.160234f, 0.595957f,0.155319f, +0.607108f,0.150447f, 0.61811f,0.145551f, 0.628943f,0.140646f, 0.639682f,0.13583f, 0.650189f,0.130987f, +0.660508f,0.126183f, 0.670593f,0.121402f, 0.680549f,0.116743f, 0.690359f,0.112197f, 0.699939f,0.107705f, +0.709234f,0.103245f, 0.718328f,0.098886f, 0.727171f,0.0946036f, 0.735831f,0.0904454f, 0.74428f,0.0863946f, +0.752567f,0.0824817f, 0.760683f,0.0786963f, 0.76847f,0.0749556f, 0.776095f,0.0713542f, 0.783542f,0.0678786f, +0.790718f,0.0644843f, 0.797621f,0.0611733f, 0.804267f,0.0579564f, 0.810718f,0.0548618f, 0.817008f,0.0518999f, +0.8231f,0.0490495f, 0.828929f,0.0462848f, 0.834535f,0.0436214f, 0.839995f,0.041084f, 0.845318f,0.0386687f, +0.850531f,0.0363781f, 0.855607f,0.0341979f, 0.860459f,0.0320965f, 0.865124f,0.0300839f, 0.869645f,0.028171f, +0.874026f,0.0263531f, 0.878303f,0.024635f, 0.882423f,0.0229969f, 0.886388f,0.0214398f, 0.890177f,0.0199558f, +0.893837f,0.0185531f, 0.897322f,0.0172172f, 0.900793f,0.0159789f, 0.904187f,0.0148181f, 0.907436f,0.0137173f, +0.910512f,0.0126705f, 0.913436f,0.0116797f, 0.916221f,0.010745f, 0.918953f,0.00987599f, 0.921551f,0.00905807f, +0.924038f,0.00829196f, 0.926486f,0.00758492f, 0.928808f,0.00692127f, 0.931114f,0.00631248f, 0.93338f,0.00575177f, +0.935518f,0.0052253f, 0.937546f,0.00473391f, 0.939478f,0.0042774f, 0.941417f,0.00386417f, 0.943251f,0.00347956f, +0.945175f,0.00313936f, 0.946998f,0.00282271f, 0.948857f,0.00253908f, 0.950632f,0.00227698f, 0.952299f,0.00203326f, +0.953958f,0.00181319f, 0.955531f,0.0016106f, 0.95702f,0.00142488f, 0.958437f,0.00125557f, 0.959789f,0.00110199f, +0.961085f,0.000963289f, 0.962325f,0.000838553f, 0.963622f,0.000732202f, 0.964864f,0.000636336f, 0.966151f,0.000554133f, +0.967454f,0.000481877f, 0.968666f,0.000416011f, 0.969874f,0.000359283f, 0.971082f,0.000310454f, 0.972198f,0.000265687f, +0.973242f,0.000225526f, 0.974225f,0.000189988f, 0.975165f,0.000159191f, 0.976192f,0.000135501f, 0.977104f,0.00011366f, +0.977912f,9.42178e-05f, 0.97859f,7.72471e-05f, 0.979059f,6.26181e-05f, 0.97972f,5.06471e-05f, 0.980703f,4.29161e-05f, +0.981539f,3.49108e-05f, 0.98224f,2.75714e-05f, 0.982748f,2.10756e-05f, 0.983431f,1.57197e-05f, 0.984156f,1.14248e-05f, +0.985088f,9.47717e-06f, 0.985813f,7.0254e-06f, 0.98677f,5.30481e-06f, + +0.503538f,0.307893f, 0.469354f,0.288925f, 0.445607f,0.27489f, 0.429157f,0.264121f, 0.418051f,0.255697f, +0.410994f,0.24883f, 0.407116f,0.243204f, 0.405767f,0.238322f, 0.406484f,0.234004f, 0.408921f,0.230115f, +0.412779f,0.226412f, 0.417877f,0.222977f, 0.424024f,0.219636f, 0.431016f,0.216174f, 0.438795f,0.21279f, +0.447218f,0.20933f, 0.456193f,0.205782f, 0.465583f,0.202015f, 0.475383f,0.198205f, 0.48562f,0.194508f, +0.49605f,0.190523f, 0.506688f,0.186419f, 0.517415f,0.182095f, 0.528262f,0.177702f, 0.539197f,0.173256f, +0.550247f,0.168846f, 0.561296f,0.164348f, 0.572321f,0.159787f, 0.583244f,0.155118f, 0.594118f,0.150455f, +0.604877f,0.145755f, 0.61556f,0.141091f, 0.626127f,0.136443f, 0.636546f,0.131805f, 0.646829f,0.127212f, +0.656961f,0.122665f, 0.666875f,0.118125f, 0.676587f,0.113627f, 0.686078f,0.109171f, 0.695448f,0.104844f, +0.704686f,0.100633f, 0.713711f,0.0964901f, 0.722459f,0.0923833f, 0.73101f,0.0883761f, 0.739317f,0.0844434f, +0.747462f,0.080638f, 0.755404f,0.0769355f, 0.763189f,0.073361f, 0.77083f,0.069918f, 0.778184f,0.0665323f, +0.785307f,0.0632392f, 0.792334f,0.0600997f, 0.799108f,0.0570375f, 0.805616f,0.0540506f, 0.811872f,0.051148f, +0.817931f,0.0483529f, 0.823838f,0.04568f, 0.829589f,0.0431231f, 0.83512f,0.0406542f, 0.840406f,0.0382662f, +0.845509f,0.0359782f, 0.850503f,0.0338103f, 0.855361f,0.0317474f, 0.860151f,0.0298034f, 0.864777f,0.0279453f, +0.869176f,0.0261541f, 0.873428f,0.0244493f, 0.877543f,0.0228304f, 0.881546f,0.021299f, 0.885465f,0.0198575f, +0.889216f,0.0184832f, 0.89282f,0.0171788f, 0.896269f,0.01594f, 0.899604f,0.014772f, 0.902777f,0.0136625f, +0.905951f,0.0126366f, 0.909103f,0.0116849f, 0.912126f,0.0107853f, 0.914988f,0.00993096f, 0.917704f,0.00912374f, +0.920291f,0.0083639f, 0.922764f,0.00765151f, 0.925196f,0.00699296f, 0.927511f,0.006376f, 0.929803f,0.00581013f, +0.93198f,0.00528045f, 0.934106f,0.00479255f, 0.936243f,0.00434988f, 0.938263f,0.0039354f, 0.940176f,0.00354928f, +0.941997f,0.00319145f, 0.943811f,0.00286788f, 0.945552f,0.00256985f, 0.947284f,0.00230094f, 0.949037f,0.00206022f, +0.950719f,0.00183924f, 0.952409f,0.00164133f, 0.954042f,0.00145991f, 0.955575f,0.00129235f, 0.957036f,0.00113937f, +0.958509f,0.0010036f, 0.9599f,0.000879724f, 0.961218f,0.0007675f, 0.962474f,0.000666444f, 0.963674f,0.000575934f, +0.964923f,0.00049971f, 0.966119f,0.000431492f, 0.96729f,0.000371623f, 0.968468f,0.000320227f, 0.969555f,0.000273516f, +0.970652f,0.000234436f, 0.971767f,0.000201488f, 0.972803f,0.000171712f, 0.973707f,0.000144832f, 0.974452f,0.000120998f, +0.974994f,0.000100514f, 0.976076f,8.51685e-05f, 0.977037f,7.07574e-05f, 0.977888f,5.78364e-05f, 0.978603f,4.65055e-05f, +0.979263f,3.67495e-05f, 0.980367f,3.11889e-05f, 0.981322f,2.50409e-05f, 0.982171f,1.93196e-05f, 0.98291f,1.43463e-05f, +0.983465f,1.01207e-05f, 0.984131f,7.62357e-06f, 0.98523f,5.8521e-06f, + +0.514328f,0.297885f, 0.481164f,0.280253f, 0.457749f,0.26698f, 0.44125f,0.256641f, 0.429875f,0.24844f, +0.422411f,0.241663f, 0.418039f,0.236042f, 0.416147f,0.231162f, 0.416282f,0.226806f, 0.418112f,0.222873f, +0.421353f,0.219151f, 0.425798f,0.2156f, 0.431316f,0.212294f, 0.437691f,0.208897f, 0.444814f,0.205467f, +0.452603f,0.202039f, 0.460965f,0.198581f, 0.469796f,0.195015f, 0.478985f,0.191261f, 0.488546f,0.187501f, +0.498486f,0.183823f, 0.508588f,0.179898f, 0.518862f,0.175862f, 0.529208f,0.171644f, 0.53967f,0.167393f, +0.550165f,0.163046f, 0.560784f,0.158779f, 0.57142f,0.154473f, 0.582018f,0.150105f, 0.592508f,0.145637f, +0.602949f,0.141184f, 0.613288f,0.136715f, 0.623526f,0.13226f, 0.633678f,0.127854f, 0.643691f,0.123465f, +0.653534f,0.119086f, 0.663297f,0.114813f, 0.672841f,0.110539f, 0.682199f,0.106311f, 0.691353f,0.102129f, +0.700276f,0.0979881f, 0.709091f,0.093982f, 0.717753f,0.0900744f, 0.726261f,0.0862678f, 0.734503f,0.0825029f, +0.742543f,0.0788275f, 0.75036f,0.0752323f, 0.758013f,0.0717522f, 0.765481f,0.0683755f, 0.77281f,0.0651255f, +0.779994f,0.0619929f, 0.786953f,0.0589394f, 0.793637f,0.0559472f, 0.800239f,0.0531012f, 0.806647f,0.050347f, +0.812817f,0.047669f, 0.818724f,0.045059f, 0.824406f,0.0425344f, 0.829958f,0.0401269f, 0.835378f,0.0378313f, +0.840634f,0.0356313f, 0.845662f,0.0335051f, 0.850468f,0.0314556f, 0.855133f,0.0295045f, 0.859707f,0.0276608f, +0.86415f,0.0259084f, 0.86857f,0.0242691f, 0.872798f,0.0226954f, 0.876819f,0.0211826f, 0.880686f,0.0197428f, +0.884446f,0.018382f, 0.888092f,0.0170951f, 0.891711f,0.0158956f, 0.895177f,0.0147556f, 0.898503f,0.0136744f, +0.90169f,0.0126507f, 0.904768f,0.0116872f, 0.907697f,0.0107741f, 0.910584f,0.00992686f, 0.913465f,0.00914536f, +0.91625f,0.00841195f, 0.918884f,0.00771685f, 0.921384f,0.00706169f, 0.923765f,0.00644674f, 0.926043f,0.00587197f, +0.928263f,0.005339f, 0.930453f,0.00484924f, 0.932616f,0.00440105f, 0.934676f,0.00398324f, 0.936662f,0.00359723f, +0.93869f,0.00325145f, 0.940613f,0.00292911f, 0.942432f,0.00262935f, 0.944162f,0.00235227f, 0.94587f,0.00210198f, +0.94753f,0.00187395f, 0.949119f,0.00166497f, 0.950787f,0.0014831f, 0.952398f,0.00131725f, 0.953996f,0.001169f, +0.955489f,0.00103151f, 0.956971f,0.000908524f, 0.958383f,0.000796595f, 0.959714f,0.000694822f, 0.961015f,0.000604362f, +0.962298f,0.000524549f, 0.963502f,0.00045265f, 0.964631f,0.000388385f, 0.96581f,0.000335606f, 0.966889f,0.000287819f, +0.967875f,0.000245341f, 0.968848f,0.000210419f, 0.969604f,0.000178435f, 0.970535f,0.00015314f, 0.971611f,0.00012987f, +0.972571f,0.000108594f, 0.973403f,8.96383e-05f, 0.974209f,7.36463e-05f, 0.975352f,6.1535e-05f, 0.976499f,5.15239e-05f, +0.977533f,4.2053e-05f, 0.978473f,3.35706e-05f, 0.979363f,2.66888e-05f, 0.980334f,2.21519e-05f, 0.980948f,1.6799e-05f, +0.981793f,1.20854e-05f, 0.982434f,7.94845e-06f, 0.983525f,6.35392e-06f, + +0.524801f,0.288169f, 0.492641f,0.271762f, 0.469587f,0.259211f, 0.453086f,0.249302f, 0.441487f,0.241329f, +0.433666f,0.234671f, 0.428846f,0.22908f, 0.42645f,0.224216f, 0.426044f,0.219854f, 0.427298f,0.215862f, +0.42996f,0.212152f, 0.433801f,0.208558f, 0.438683f,0.205143f, 0.444479f,0.201871f, 0.45099f,0.198445f, +0.458177f,0.195071f, 0.465926f,0.191637f, 0.474184f,0.188195f, 0.482837f,0.184626f, 0.491809f,0.180919f, +0.501114f,0.177218f, 0.51075f,0.173582f, 0.520525f,0.169738f, 0.530447f,0.165803f, 0.540404f,0.16168f, +0.550487f,0.157577f, 0.560571f,0.153365f, 0.570752f,0.14922f, 0.580985f,0.145103f, 0.59116f,0.140915f, +0.601267f,0.136686f, 0.611272f,0.132419f, 0.621218f,0.128186f, 0.631045f,0.12395f, 0.640762f,0.119744f, +0.650382f,0.115591f, 0.659859f,0.111469f, 0.669176f,0.10738f, 0.67842f,0.103404f, 0.687411f,0.0994102f, +0.696242f,0.0954875f, 0.704871f,0.0916155f, 0.713286f,0.0877973f, 0.721589f,0.0841051f, 0.729696f,0.0804842f, +0.737663f,0.0769689f, 0.745437f,0.07353f, 0.753012f,0.0701746f, 0.760372f,0.0668961f, 0.767551f,0.0637151f, +0.774594f,0.0606512f, 0.781496f,0.0576999f, 0.788238f,0.0548497f, 0.79484f,0.052106f, 0.801158f,0.0494099f, +0.807325f,0.0468191f, 0.813401f,0.0443504f, 0.819257f,0.041953f, 0.824867f,0.03962f, 0.830239f,0.0373559f, +0.835425f,0.0351796f, 0.840535f,0.0331201f, 0.845512f,0.0311569f, 0.850313f,0.0292712f, 0.854895f,0.0274521f, +0.859285f,0.0257064f, 0.863578f,0.0240559f, 0.867776f,0.0224964f, 0.871843f,0.0210141f, 0.875925f,0.019638f, +0.879805f,0.0183139f, 0.883496f,0.0170445f, 0.887059f,0.0158421f, 0.890474f,0.0146997f, 0.893789f,0.0136228f, +0.897134f,0.0126301f, 0.900361f,0.0116922f, 0.903446f,0.0108027f, 0.906408f,0.00996346f, 0.909265f,0.00917464f, +0.911983f,0.00842875f, 0.914662f,0.00773865f, 0.917326f,0.00710244f, 0.919938f,0.00651156f, 0.922403f,0.00595229f, +0.924743f,0.00542619f, 0.92697f,0.00493357f, 0.929094f,0.00447407f, 0.931125f,0.00404687f, 0.933078f,0.00365186f, +0.935089f,0.00329876f, 0.937006f,0.00297076f, 0.938828f,0.00266682f, 0.940726f,0.00239896f, 0.942527f,0.00215012f, +0.944241f,0.00191979f, 0.945896f,0.00170847f, 0.947519f,0.00151808f, 0.949108f,0.00134623f, 0.950607f,0.0011884f, +0.95214f,0.0010504f, 0.953688f,0.00092881f, 0.955221f,0.000820905f, 0.956634f,0.00072057f, 0.95795f,0.000628671f, +0.959204f,0.000546314f, 0.960433f,0.000473932f, 0.961549f,0.000408575f, 0.962544f,0.000350076f, 0.963481f,0.000300274f, +0.964268f,0.000256736f, 0.965487f,0.000221032f, 0.966575f,0.000188036f, 0.967552f,0.000158887f, 0.968599f,0.000135275f, +0.969828f,0.000115035f, 0.971061f,9.80843e-05f, 0.972182f,8.1946e-05f, 0.973212f,6.73143e-05f, 0.974155f,5.43994e-05f, +0.975019f,4.33743e-05f, 0.975955f,3.56746e-05f, 0.976714f,2.84534e-05f, 0.977713f,2.21661e-05f, 0.978828f,1.79467e-05f, +0.98003f,1.38767e-05f, 0.981045f,9.80539e-06f, 0.981658f,6.82874e-06f, + +0.534955f,0.278739f, 0.503782f,0.263458f, 0.481115f,0.251589f, 0.464649f,0.242098f, 0.452873f,0.234361f, +0.44474f,0.227854f, 0.439513f,0.2223f, 0.436656f,0.217482f, 0.435743f,0.213108f, 0.436461f,0.209092f, +0.438571f,0.205385f, 0.441851f,0.201806f, 0.446144f,0.19834f, 0.45135f,0.195062f, 0.457306f,0.191751f, +0.463889f,0.188345f, 0.471078f,0.185014f, 0.478753f,0.181614f, 0.486865f,0.178182f, 0.495318f,0.174637f, +0.504059f,0.170994f, 0.513095f,0.167363f, 0.522424f,0.163787f, 0.531872f,0.160038f, 0.541451f,0.156221f, +0.551042f,0.152226f, 0.560732f,0.148245f, 0.570425f,0.144186f, 0.580189f,0.140179f, 0.590007f,0.136219f, +0.599788f,0.132227f, 0.609512f,0.128215f, 0.619109f,0.124143f, 0.628664f,0.120126f, 0.638097f,0.116104f, +0.647431f,0.112119f, 0.656664f,0.108186f, 0.665761f,0.104284f, 0.674708f,0.100419f, 0.683554f,0.0966403f, +0.69228f,0.0929365f, 0.700753f,0.0892266f, 0.709091f,0.0856039f, 0.717225f,0.0820308f, 0.725166f,0.0785224f, +0.732998f,0.075133f, 0.740639f,0.0718142f, 0.74809f,0.0685709f, 0.755351f,0.0654047f, 0.762483f,0.0623475f, +0.769409f,0.0593618f, 0.776167f,0.0564703f, 0.782809f,0.0536937f, 0.789302f,0.0510158f, 0.79564f,0.0484308f, +0.801895f,0.0459651f, 0.8079f,0.0435506f, 0.813698f,0.0412091f, 0.819413f,0.0389824f, 0.824977f,0.0368405f, +0.830324f,0.0347628f, 0.835439f,0.0327453f, 0.840348f,0.0307981f, 0.845109f,0.0289377f, 0.849804f,0.0271814f, +0.854387f,0.0255111f, 0.858774f,0.023903f, 0.862964f,0.0223567f, 0.866992f,0.0208795f, 0.870952f,0.019491f, +0.874821f,0.0181804f, 0.878568f,0.0169374f, 0.88234f,0.0157866f, 0.885915f,0.0146798f, 0.889314f,0.0136216f, +0.892612f,0.0126244f, 0.895761f,0.0116769f, 0.898776f,0.0107802f, 0.90182f,0.00995614f, 0.904842f,0.00919139f, +0.907721f,0.00846578f, 0.910491f,0.00778366f, 0.913157f,0.00714302f, 0.91569f,0.00653861f, 0.918193f,0.00598149f, +0.920661f,0.00546746f, 0.92312f,0.0049957f, 0.925439f,0.00454968f, 0.927637f,0.00413091f, 0.929727f,0.00373977f, +0.931717f,0.00337598f, 0.933619f,0.00303888f, 0.935437f,0.00272753f, 0.937268f,0.00244833f, 0.939082f,0.0021947f, +0.940796f,0.00195985f, 0.942585f,0.00175475f, 0.944283f,0.00156513f, 0.945877f,0.00138949f, 0.947378f,0.00122814f, +0.948848f,0.00108388f, 0.950277f,0.000954532f, 0.951605f,0.000836204f, 0.952925f,0.0007327f, 0.954261f,0.000643643f, +0.955556f,0.000565625f, 0.956662f,0.000492942f, 0.957595f,0.000427228f, 0.958686f,0.000367778f, 0.959807f,0.000314482f, +0.960912f,0.000269266f, 0.962051f,0.0002288f, 0.963248f,0.000192957f, 0.964568f,0.000165319f, 0.965863f,0.000141261f, +0.967044f,0.000118977f, 0.968203f,0.000100206f, 0.969346f,8.46172e-05f, 0.970503f,7.24539e-05f, 0.971429f,6.00299e-05f, +0.972308f,4.84452e-05f, 0.973426f,3.84375e-05f, 0.974492f,2.98544e-05f, 0.975734f,2.41845e-05f, 0.976822f,1.84631e-05f, +0.977959f,1.43477e-05f, 0.97929f,1.14888e-05f, 0.97968f,7.40037e-06f, + +0.544796f,0.269593f, 0.514589f,0.255346f, 0.492329f,0.244121f, 0.475937f,0.23504f, 0.464023f,0.227538f, +0.455621f,0.221203f, 0.450027f,0.215697f, 0.446744f,0.210916f, 0.445363f,0.206569f, 0.445585f,0.202573f, +0.447168f,0.198837f, 0.44992f,0.195294f, 0.453663f,0.191822f, 0.458289f,0.188477f, 0.463712f,0.185278f, +0.469758f,0.181963f, 0.476366f,0.178617f, 0.483496f,0.175298f, 0.491065f,0.171952f, 0.499009f,0.168556f, +0.507246f,0.165051f, 0.515742f,0.161483f, 0.524503f,0.157934f, 0.533523f,0.154433f, 0.542648f,0.150794f, +0.551888f,0.147099f, 0.561131f,0.143251f, 0.570453f,0.139414f, 0.579775f,0.13552f, 0.589114f,0.131629f, +0.598504f,0.1278f, 0.607913f,0.124011f, 0.617258f,0.120199f, 0.626493f,0.116347f, 0.635638f,0.112507f, +0.644719f,0.108716f, 0.653678f,0.10494f, 0.662526f,0.101203f, 0.671273f,0.0975253f, 0.679893f,0.0938957f, +0.688329f,0.0902851f, 0.696727f,0.0868035f, 0.704956f,0.0833637f, 0.712949f,0.0799351f, 0.720826f,0.0766028f, +0.728493f,0.0733145f, 0.735987f,0.0700987f, 0.743378f,0.0669964f, 0.750585f,0.0639628f, 0.757601f,0.0609983f, +0.76443f,0.0581072f, 0.771091f,0.0553031f, 0.777608f,0.0525906f, 0.783936f,0.0499549f, 0.790151f,0.047426f, +0.796271f,0.045004f, 0.802268f,0.0426787f, 0.808161f,0.0404524f, 0.813885f,0.0382991f, 0.819374f,0.0361986f, +0.824754f,0.034193f, 0.830015f,0.0322745f, 0.835126f,0.0304305f, 0.840013f,0.0286394f, 0.844687f,0.0269068f, +0.849202f,0.0252473f, 0.853605f,0.023671f, 0.857905f,0.0221754f, 0.862122f,0.0207601f, 0.866147f,0.0193979f, +0.869992f,0.018092f, 0.873696f,0.0168499f, 0.877365f,0.0156893f, 0.880945f,0.0145953f, 0.884431f,0.0135632f, +0.887907f,0.0126035f, 0.891212f,0.0116848f, 0.894359f,0.0108093f, 0.897421f,0.00998748f, 0.900335f,0.00920716f, +0.903125f,0.00847073f, 0.905878f,0.00778792f, 0.908668f,0.00716391f, 0.911367f,0.00657742f, 0.913974f,0.0060284f, +0.91647f,0.00551263f, 0.918839f,0.00502706f, 0.921187f,0.00458182f, 0.923496f,0.00417176f, 0.925796f,0.00379682f, +0.927976f,0.00344442f, 0.930038f,0.00311417f, 0.931992f,0.00280647f, 0.933849f,0.00252114f, 0.935617f,0.00225764f, +0.937299f,0.00201519f, 0.93899f,0.00179911f, 0.940606f,0.00160116f, 0.942184f,0.00142221f, 0.943831f,0.00126781f, +0.945364f,0.00112498f, 0.946764f,0.000992896f, 0.948034f,0.00087192f, 0.949228f,0.000765113f, 0.950271f,0.000669205f, +0.951277f,0.000581768f, 0.952537f,0.000506132f, 0.953789f,0.00044205f, 0.955284f,0.000386209f, 0.956683f,0.000334084f, +0.957986f,0.000286458f, 0.959206f,0.000243568f, 0.960344f,0.00020536f, 0.9614f,0.000171622f, 0.96248f,0.000143759f, +0.963514f,0.000120253f, 0.964647f,0.000101241f, 0.965773f,8.49886e-05f, 0.967103f,7.05996e-05f, 0.968534f,5.98804e-05f, +0.970035f,5.16363e-05f, 0.971373f,4.26455e-05f, 0.972592f,3.40698e-05f, 0.973711f,2.63836e-05f, 0.974848f,2.05288e-05f, +0.975975f,1.58836e-05f, 0.976941f,1.22009e-05f, 0.977583f,8.07381e-06f, + +0.554321f,0.260723f, 0.525061f,0.247428f, 0.503226f,0.236811f, 0.486939f,0.228128f, 0.474926f,0.220863f, +0.466291f,0.214694f, 0.460372f,0.209274f, 0.456698f,0.204534f, 0.454888f,0.200242f, 0.454642f,0.19626f, +0.455731f,0.192514f, 0.45798f,0.188999f, 0.461213f,0.185568f, 0.465302f,0.182206f, 0.470174f,0.178988f, +0.475712f,0.175793f, 0.48179f,0.172497f, 0.488386f,0.169232f, 0.495421f,0.165943f, 0.502857f,0.162661f, +0.510616f,0.159319f, 0.518623f,0.15587f, 0.526868f,0.152387f, 0.535349f,0.148928f, 0.544064f,0.14552f, +0.552867f,0.141992f, 0.561772f,0.138425f, 0.570683f,0.134736f, 0.579645f,0.131043f, 0.58861f,0.127315f, +0.597556f,0.123561f, 0.606546f,0.119877f, 0.615556f,0.116247f, 0.624519f,0.112616f, 0.633408f,0.108982f, +0.642181f,0.105332f, 0.650901f,0.101744f, 0.659504f,0.0981714f, 0.668017f,0.0946516f, 0.676405f,0.0911682f, +0.684677f,0.0877375f, 0.692835f,0.0843697f, 0.700795f,0.081016f, 0.708758f,0.0778138f, 0.716522f,0.0746337f, +0.724063f,0.0714757f, 0.731509f,0.0684206f, 0.738742f,0.065405f, 0.745816f,0.0624651f, 0.752797f,0.0596337f, +0.759599f,0.0568679f, 0.766226f,0.0541718f, 0.772659f,0.0515407f, 0.77895f,0.0489979f, 0.785044f,0.0465216f, +0.79098f,0.0441262f, 0.796802f,0.0418273f, 0.802538f,0.0396316f, 0.808183f,0.0375345f, 0.813681f,0.0355126f, +0.819135f,0.0335957f, 0.824366f,0.0317245f, 0.829443f,0.0299241f, 0.834445f,0.028215f, 0.839291f,0.0265697f, +0.843977f,0.0249867f, 0.848454f,0.0234538f, 0.852748f,0.0219785f, 0.856915f,0.0205729f, 0.860995f,0.0192445f, +0.864983f,0.0179866f, 0.868825f,0.0167849f, 0.87253f,0.0156389f, 0.876068f,0.0145432f, 0.879496f,0.0135071f, +0.882917f,0.0125459f, 0.886223f,0.0116356f, 0.889481f,0.0107854f, 0.892687f,0.00998959f, 0.895753f,0.00923247f, +0.898685f,0.00851501f, 0.901525f,0.00784113f, 0.904226f,0.00720301f, 0.906813f,0.0066027f, 0.909352f,0.00604644f, +0.91193f,0.00554048f, 0.914396f,0.00506428f, 0.916834f,0.00462544f, 0.91917f,0.00421418f, 0.921383f,0.00382775f, +0.923585f,0.00347604f, 0.925745f,0.00315303f, 0.927865f,0.0028569f, 0.929893f,0.00258116f, 0.931793f,0.00232321f, +0.933579f,0.00208347f, 0.935256f,0.00186184f, 0.936829f,0.00165788f, 0.938308f,0.00147206f, 0.939744f,0.00130663f, +0.941031f,0.00115451f, 0.942202f,0.00101824f, 0.943399f,0.000903513f, 0.944841f,0.000797033f, 0.946216f,0.000698723f, +0.947682f,0.000609027f, 0.949162f,0.000531498f, 0.950557f,0.000461029f, 0.951856f,0.000397044f, 0.953172f,0.000342849f, +0.95462f,0.000298339f, 0.956075f,0.000258623f, 0.957396f,0.000221537f, 0.958591f,0.000187727f, 0.959663f,0.000157391f, +0.960914f,0.000130691f, 0.962111f,0.00010735f, 0.963336f,8.82994e-05f, 0.964717f,7.44528e-05f, 0.965976f,6.11631e-05f, +0.967213f,4.97536e-05f, 0.96866f,4.2383e-05f, 0.970119f,3.6058e-05f, 0.971364f,2.89475e-05f, 0.972422f,2.21625e-05f, +0.9733f,1.63749e-05f, 0.974248f,1.25605e-05f, 0.975294f,8.70447e-06f, + +0.563536f,0.252126f, 0.535201f,0.239707f, 0.513804f,0.229663f, 0.497652f,0.221364f, 0.485574f,0.214339f, +0.476743f,0.208341f, 0.470536f,0.203024f, 0.466506f,0.198337f, 0.464297f,0.194103f, 0.463616f,0.190141f, +0.464247f,0.186423f, 0.466013f,0.182907f, 0.468763f,0.179528f, 0.472352f,0.176187f, 0.476699f,0.172947f, +0.481738f,0.169835f, 0.487327f,0.166644f, 0.493394f,0.16339f, 0.499933f,0.160197f, 0.506849f,0.156958f, +0.514128f,0.15374f, 0.521688f,0.150467f, 0.529461f,0.147095f, 0.537447f,0.143703f, 0.545645f,0.140339f, +0.55406f,0.137035f, 0.562542f,0.13362f, 0.571119f,0.130182f, 0.579712f,0.126664f, 0.588316f,0.123106f, +0.596945f,0.119551f, 0.605531f,0.115959f, 0.614144f,0.112425f, 0.62277f,0.108944f, 0.631362f,0.105486f, +0.639912f,0.102057f, 0.648317f,0.0985876f, 0.656648f,0.0951605f, 0.664941f,0.0918091f, 0.673091f,0.0884666f, +0.681161f,0.0851888f, 0.689121f,0.0819629f, 0.696945f,0.0787799f, 0.704656f,0.0756595f, 0.712185f,0.0725695f, +0.71972f,0.0696219f, 0.727046f,0.0666919f, 0.734168f,0.0637955f, 0.741206f,0.0609994f, 0.748034f,0.058243f, +0.754716f,0.0555618f, 0.761312f,0.0529843f, 0.767739f,0.0504699f, 0.774002f,0.0480239f, 0.78007f,0.045635f, +0.786012f,0.0433328f, 0.79178f,0.0410977f, 0.797368f,0.0389305f, 0.802786f,0.0368331f, 0.808131f,0.0348352f, +0.813462f,0.03295f, 0.818651f,0.0311326f, 0.823792f,0.0294112f, 0.828775f,0.0277485f, 0.833569f,0.0261378f, +0.838263f,0.024603f, 0.842852f,0.0231386f, 0.847329f,0.0217381f, 0.851635f,0.0203884f, 0.85575f,0.0190858f, +0.859725f,0.0178418f, 0.863592f,0.0166617f, 0.867378f,0.0155472f, 0.87107f,0.014493f, 0.874595f,0.0134824f, +0.87798f,0.01252f, 0.881245f,0.0116073f, 0.884436f,0.0107509f, 0.88763f,0.00995957f, 0.89069f,0.00920763f, +0.893741f,0.00851256f, 0.896695f,0.00785691f, 0.899539f,0.00723759f, 0.902275f,0.00665443f, 0.904904f,0.00610596f, +0.907401f,0.00558802f, 0.909793f,0.00510262f, 0.912146f,0.00465547f, 0.914487f,0.00424605f, 0.916766f,0.0038664f, +0.918992f,0.00351645f, 0.921091f,0.00318783f, 0.923114f,0.00288352f, 0.925135f,0.00260946f, 0.927088f,0.002358f, +0.92895f,0.00212621f, 0.930706f,0.00191258f, 0.93229f,0.00171304f, 0.933689f,0.00152802f, 0.934867f,0.00135747f, +0.936195f,0.00120105f, 0.937756f,0.00106091f, 0.939355f,0.000935175f, 0.940856f,0.000820058f, 0.942347f,0.000718096f, +0.944054f,0.000633273f, 0.945673f,0.000555139f, 0.947187f,0.000483144f, 0.948627f,0.000418612f, 0.950056f,0.000362821f, +0.951357f,0.000311711f, 0.952593f,0.000266526f, 0.954115f,0.000229479f, 0.955689f,0.000198485f, 0.9572f,0.000170112f, +0.958608f,0.000143756f, 0.959932f,0.000119907f, 0.961182f,9.87236e-05f, 0.962363f,8.01882e-05f, 0.963531f,6.49443e-05f, +0.964775f,5.33459e-05f, 0.966016f,4.34223e-05f, 0.967108f,3.42665e-05f, 0.968564f,2.98369e-05f, 0.969773f,2.44932e-05f, +0.970623f,1.8393e-05f, 0.971356f,1.26209e-05f, 0.972792f,9.24928e-06f, + +0.572442f,0.243795f, 0.54501f,0.232183f, 0.524062f,0.22268f, 0.508071f,0.214752f, 0.49596f,0.207972f, +0.486966f,0.202141f, 0.480506f,0.196951f, 0.476151f,0.192308f, 0.473574f,0.188129f, 0.472493f,0.184224f, +0.472695f,0.180542f, 0.474006f,0.177026f, 0.476296f,0.173692f, 0.47942f,0.170413f, 0.483277f,0.167182f, +0.487801f,0.164037f, 0.492936f,0.160998f, 0.49853f,0.157838f, 0.504555f,0.154649f, 0.511003f,0.151522f, +0.517778f,0.148344f, 0.524881f,0.145197f, 0.532232f,0.142f, 0.539766f,0.138716f, 0.547491f,0.135423f, +0.555405f,0.132159f, 0.563522f,0.128964f, 0.571688f,0.125665f, 0.579944f,0.122361f, 0.588229f,0.119011f, +0.596482f,0.115584f, 0.604782f,0.112201f, 0.613043f,0.108788f, 0.621286f,0.105396f, 0.629539f,0.102061f, +0.637794f,0.0987845f, 0.64598f,0.0955177f, 0.654092f,0.0922697f, 0.662065f,0.0890074f, 0.669995f,0.0858201f, +0.677833f,0.082676f, 0.685568f,0.0795773f, 0.69319f,0.0765234f, 0.700728f,0.0735375f, 0.70814f,0.0706024f, +0.715418f,0.0677165f, 0.722557f,0.064886f, 0.729671f,0.0621728f, 0.736587f,0.0594832f, 0.743316f,0.0568341f, +0.749968f,0.054282f, 0.756421f,0.0517701f, 0.762734f,0.0493307f, 0.768973f,0.0469904f, 0.775058f,0.0447132f, +0.780981f,0.042498f, 0.786724f,0.0403402f, 0.792317f,0.0382516f, 0.797788f,0.0362419f, 0.803079f,0.0342904f, +0.808206f,0.0324043f, 0.813209f,0.0305949f, 0.81813f,0.0288721f, 0.822983f,0.0272335f, 0.827795f,0.0256796f, +0.832578f,0.0242125f, 0.837158f,0.0227853f, 0.841609f,0.0214181f, 0.845984f,0.0201209f, 0.850227f,0.0188775f, +0.854313f,0.017682f, 0.858246f,0.0165346f, 0.862015f,0.0154329f, 0.865669f,0.0143867f, 0.869256f,0.0134017f, +0.872786f,0.0124757f, 0.876192f,0.011595f, 0.879439f,0.0107527f, 0.882537f,0.00995054f, 0.88552f,0.00919187f, +0.888501f,0.00849117f, 0.891475f,0.0078439f, 0.894337f,0.00723278f, 0.897154f,0.00666442f, 0.899859f,0.0061281f, +0.902478f,0.00562525f, 0.905009f,0.00515544f, 0.907413f,0.00471253f, 0.909682f,0.00429544f, 0.911846f,0.00390635f, +0.913975f,0.00355092f, 0.916043f,0.00322396f, 0.918033f,0.00292272f, 0.919954f,0.00264692f, 0.921694f,0.00238794f, +0.923268f,0.00214804f, 0.924776f,0.00193466f, 0.926344f,0.0017413f, 0.928293f,0.00156158f, 0.930289f,0.00139809f, +0.932198f,0.00124575f, 0.934008f,0.0011049f, 0.935727f,0.000975527f, 0.93736f,0.000857392f, 0.938998f,0.000753967f, +0.940548f,0.000659728f, 0.941995f,0.000573947f, 0.943464f,0.000501138f, 0.944961f,0.000437279f, 0.946617f,0.000380432f, +0.948177f,0.000328171f, 0.949753f,0.000283403f, 0.95126f,0.000242954f, 0.952683f,0.000206195f, 0.954147f,0.000175684f, +0.955671f,0.000150769f, 0.957194f,0.000129027f, 0.958603f,0.000108578f, 0.959902f,8.98023e-05f, 0.961099f,7.30171e-05f, +0.962196f,5.83113e-05f, 0.963297f,4.69529e-05f, 0.964301f,3.7309e-05f, 0.965119f,2.8916e-05f, 0.966121f,2.31532e-05f, +0.96747f,1.89214e-05f, 0.968706f,1.37687e-05f, 0.970204f,1.00046e-05f, + +0.581039f,0.235725f, 0.554488f,0.224858f, 0.533999f,0.215863f, 0.51819f,0.208292f, 0.506077f,0.201759f, +0.49695f,0.19609f, 0.49027f,0.191039f, 0.485622f,0.186457f, 0.482704f,0.182327f, 0.481253f,0.17849f, +0.481055f,0.174849f, 0.481942f,0.171361f, 0.483788f,0.168043f, 0.486471f,0.164828f, 0.489871f,0.161633f, +0.493922f,0.158512f, 0.498574f,0.155492f, 0.503735f,0.152478f, 0.509304f,0.149377f, 0.515261f,0.146272f, +0.521589f,0.143204f, 0.528211f,0.140107f, 0.535123f,0.137031f, 0.542254f,0.133915f, 0.549546f,0.130727f, +0.557011f,0.12754f, 0.56464f,0.124377f, 0.572466f,0.121299f, 0.580328f,0.118126f, 0.588261f,0.114947f, +0.596244f,0.111758f, 0.604167f,0.108476f, 0.612151f,0.10526f, 0.620092f,0.102018f, 0.627988f,0.0987741f, +0.635887f,0.0955869f, 0.643797f,0.0924694f, 0.651652f,0.0893729f, 0.659456f,0.0863155f, 0.667124f,0.0832424f, +0.674706f,0.0802093f, 0.682243f,0.0772502f, 0.689662f,0.0743211f, 0.697003f,0.0714563f, 0.704211f,0.0686272f, +0.711336f,0.0658679f, 0.718339f,0.0631615f, 0.725193f,0.0604966f, 0.731951f,0.0579076f, 0.738678f,0.055421f, +0.745191f,0.052952f, 0.751549f,0.0505351f, 0.757841f,0.0482122f, 0.763947f,0.0459313f, 0.769912f,0.0437156f, +0.775823f,0.0415985f, 0.781583f,0.0395393f, 0.787187f,0.0375377f, 0.792631f,0.0355936f, 0.797907f,0.0337064f, +0.803088f,0.0318986f, 0.808106f,0.0301478f, 0.812966f,0.0284562f, 0.817682f,0.0268276f, 0.822325f,0.0252803f, +0.826879f,0.0238061f, 0.831306f,0.0223907f, 0.835746f,0.0210665f, 0.840116f,0.019806f, 0.844367f,0.018598f, +0.848507f,0.0174449f, 0.852569f,0.0163507f, 0.856492f,0.0153017f, 0.860245f,0.014291f, 0.863862f,0.013325f, +0.867353f,0.0124053f, 0.870734f,0.0115337f, 0.874053f,0.0107155f, 0.877297f,0.00994608f, 0.880393f,0.00921159f, +0.883339f,0.00851165f, 0.886144f,0.00784732f, 0.888815f,0.00721893f, 0.891567f,0.00665028f, 0.894283f,0.0061224f, +0.896928f,0.0056307f, 0.899476f,0.00516989f, 0.901904f,0.00473618f, 0.90422f,0.00433017f, 0.906456f,0.00395455f, +0.90852f,0.00359977f, 0.910408f,0.00326656f, 0.912138f,0.00295746f, 0.913785f,0.00267771f, 0.915443f,0.00241928f, +0.917638f,0.00218359f, 0.919807f,0.00196826f, 0.921871f,0.00176717f, 0.923877f,0.00158332f, 0.925884f,0.0014185f, +0.927871f,0.00126999f, 0.929794f,0.00113308f, 0.931676f,0.00100936f, 0.933425f,0.000894143f, 0.935044f,0.00078785f, +0.936656f,0.00069059f, 0.938357f,0.000603872f, 0.940045f,0.000527198f, 0.941647f,0.000457168f, 0.943242f,0.000396049f, +0.944869f,0.000343726f, 0.946438f,0.000296537f, 0.94799f,0.000254857f, 0.949531f,0.000218733f, 0.951036f,0.000186991f, +0.952434f,0.00015781f, 0.953804f,0.000132732f, 0.955282f,0.000113439f, 0.956676f,9.57453e-05f, 0.95798f,7.97814e-05f, +0.959101f,6.48257e-05f, 0.960008f,5.12766e-05f, 0.960742f,3.94441e-05f, 0.962034f,3.14101e-05f, 0.963066f,2.35558e-05f, +0.964224f,1.7791e-05f, 0.966064f,1.45826e-05f, 0.967373f,1.06387e-05f, + +0.589333f,0.227912f, 0.56364f,0.21773f, 0.543615f,0.209215f, 0.528008f,0.201984f, 0.515919f,0.195694f, +0.506688f,0.190186f, 0.499816f,0.18527f, 0.494909f,0.18077f, 0.49168f,0.176703f, 0.489884f,0.172929f, +0.489312f,0.169335f, 0.489809f,0.165911f, 0.491232f,0.162594f, 0.493493f,0.159434f, 0.496467f,0.156309f, +0.500072f,0.153217f, 0.504254f,0.150192f, 0.508979f,0.147278f, 0.514125f,0.144298f, 0.519632f,0.141251f, +0.525503f,0.138243f, 0.531689f,0.13524f, 0.538146f,0.13223f, 0.544858f,0.129234f, 0.551764f,0.126206f, +0.558812f,0.123119f, 0.566018f,0.120043f, 0.573364f,0.116984f, 0.580903f,0.114024f, 0.588468f,0.11098f, +0.596085f,0.107923f, 0.603772f,0.104892f, 0.611399f,0.101778f, 0.619056f,0.098703f, 0.626684f,0.0956236f, +0.634269f,0.0925464f, 0.641835f,0.089509f, 0.649383f,0.0865196f, 0.656932f,0.0835985f, 0.664417f,0.0807039f, +0.671815f,0.0778305f, 0.679064f,0.0749467f, 0.686283f,0.072145f, 0.693424f,0.0693965f, 0.700458f,0.0666874f, +0.707411f,0.0640412f, 0.714245f,0.0614382f, 0.720986f,0.0588984f, 0.727621f,0.0564177f, 0.734094f,0.0539701f, +0.7405f,0.0516087f, 0.746841f,0.0493285f, 0.752979f,0.0470706f, 0.758946f,0.0448561f, 0.764881f,0.042742f, +0.770648f,0.0406731f, 0.776274f,0.0386621f, 0.781879f,0.0367525f, 0.787335f,0.034895f, 0.792639f,0.0330906f, +0.797803f,0.0313437f, 0.8028f,0.0296473f, 0.807687f,0.0280191f, 0.812447f,0.0264515f, 0.817057f,0.0249381f, +0.821531f,0.0234833f, 0.82588f,0.0220884f, 0.83021f,0.0207774f, 0.834374f,0.0195106f, 0.838441f,0.018304f, +0.842571f,0.0171858f, 0.846558f,0.0161107f, 0.85044f,0.0150859f, 0.854261f,0.0141158f, 0.858025f,0.0131992f, +0.861623f,0.0123164f, 0.865055f,0.0114677f, 0.868374f,0.0106618f, 0.871583f,0.00989847f, 0.87471f,0.00918051f, +0.877762f,0.00850675f, 0.880712f,0.00787108f, 0.8835f,0.00726436f, 0.886133f,0.006688f, 0.888618f,0.00614262f, +0.890977f,0.00563078f, 0.893376f,0.00516964f, 0.895642f,0.00473688f, 0.897909f,0.0043423f, 0.900082f,0.00397077f, +0.902068f,0.00362199f, 0.904022f,0.00329788f, 0.906298f,0.00299886f, 0.908624f,0.00271825f, 0.910839f,0.00245552f, +0.913015f,0.0022155f, 0.915162f,0.00199709f, 0.917227f,0.00179496f, 0.919294f,0.00161375f, 0.921258f,0.00144544f, +0.923138f,0.00129066f, 0.924978f,0.00115223f, 0.92695f,0.00102852f, 0.928938f,0.000915061f, 0.930821f,0.000809282f, +0.932739f,0.000715996f, 0.934574f,0.00063005f, 0.936315f,0.000550976f, 0.93797f,0.000478858f, 0.93965f,0.000417003f, +0.941232f,0.000360214f, 0.942761f,0.000309769f, 0.944299f,0.000266581f, 0.945825f,0.000229102f, 0.94723f,0.000194462f, +0.948688f,0.000165156f, 0.950162f,0.000140566f, 0.951481f,0.000117575f, 0.952843f,9.78547e-05f, 0.95431f,8.31638e-05f, +0.955573f,6.90894e-05f, 0.956904f,5.67472e-05f, 0.958206f,4.51397e-05f, 0.959275f,3.46781e-05f, 0.960577f,2.69635e-05f, +0.961884f,1.99997e-05f, 0.96314f,1.49186e-05f, 0.964392f,1.13703e-05f, + +0.597325f,0.220347f, 0.572468f,0.210799f, 0.552911f,0.202736f, 0.537524f,0.195828f, 0.525482f,0.189779f, +0.516175f,0.184434f, 0.509138f,0.179652f, 0.504001f,0.175257f, 0.500486f,0.171235f, 0.498371f,0.167528f, +0.497453f,0.164f, 0.49758f,0.160628f, 0.498615f,0.157354f, 0.500465f,0.154212f, 0.503035f,0.151161f, +0.506224f,0.148126f, 0.509975f,0.145137f, 0.51424f,0.142215f, 0.518989f,0.139383f, 0.524092f,0.136456f, +0.529517f,0.133484f, 0.53528f,0.13057f, 0.541306f,0.127631f, 0.547589f,0.124714f, 0.554093f,0.121802f, +0.560769f,0.118865f, 0.567573f,0.115883f, 0.574524f,0.112923f, 0.581588f,0.109967f, 0.588843f,0.107124f, +0.596119f,0.104211f, 0.603445f,0.101294f, 0.610822f,0.0983947f, 0.618167f,0.0954491f, 0.625496f,0.0925026f, +0.632835f,0.0895929f, 0.640121f,0.0866785f, 0.647366f,0.0837859f, 0.654585f,0.0809375f, 0.661814f,0.078166f, +0.668985f,0.0754238f, 0.676124f,0.072738f, 0.683112f,0.070038f, 0.689986f,0.0673622f, 0.696837f,0.064771f, +0.703595f,0.0622239f, 0.710271f,0.0597327f, 0.716851f,0.0572931f, 0.723324f,0.0549038f, 0.729704f,0.0525743f, +0.735988f,0.0503046f, 0.742098f,0.0480628f, 0.748175f,0.0459149f, 0.754165f,0.0438333f, 0.759971f,0.0417799f, +0.765611f,0.0397684f, 0.771183f,0.0378378f, 0.776647f,0.0359686f, 0.781955f,0.0341475f, 0.787252f,0.0324235f, +0.792402f,0.0307477f, 0.797405f,0.0291209f, 0.802288f,0.0275517f, 0.807011f,0.0260296f, 0.81162f,0.0245678f, +0.816086f,0.023157f, 0.820446f,0.0218053f, 0.824689f,0.020509f, 0.828788f,0.0192623f, 0.832856f,0.0180893f, +0.836821f,0.01697f, 0.840632f,0.0158924f, 0.844361f,0.014871f, 0.848146f,0.0139256f, 0.851826f,0.0130248f, +0.855396f,0.0121668f, 0.858869f,0.0113521f, 0.862236f,0.0105783f, 0.865452f,0.00983611f, 0.868528f,0.0091279f, +0.871531f,0.0084633f, 0.874413f,0.0078353f, 0.877194f,0.00724574f, 0.879903f,0.00669611f, 0.882547f,0.00617398f, +0.885009f,0.0056773f, 0.887286f,0.005207f, 0.889364f,0.00476342f, 0.891482f,0.00435372f, 0.89377f,0.00398411f, +0.896331f,0.00364011f, 0.898831f,0.00332051f, 0.901283f,0.00302409f, 0.903637f,0.00274645f, 0.905929f,0.00249044f, +0.908161f,0.00225395f, 0.910259f,0.00203197f, 0.912229f,0.00182488f, 0.914186f,0.00163999f, 0.916243f,0.00146912f, +0.918309f,0.00131412f, 0.920352f,0.0011737f, 0.922288f,0.00104279f, 0.924274f,0.000927221f, 0.926247f,0.00082385f, +0.928248f,0.000732217f, 0.930163f,0.000646688f, 0.931985f,0.000567759f, 0.933785f,0.00049737f, 0.935506f,0.000433086f, +0.937176f,0.000375254f, 0.938833f,0.000325145f, 0.940399f,0.000279713f, 0.941959f,0.000239025f, 0.943552f,0.000204572f, +0.945134f,0.00017496f, 0.946595f,0.000147751f, 0.947961f,0.000123811f, 0.949343f,0.000104531f, 0.950624f,8.67038e-05f, +0.95212f,7.21018e-05f, 0.953631f,6.0295e-05f, 0.954936f,4.91102e-05f, 0.95651f,3.92454e-05f, 0.957899f,3.00341e-05f, +0.959273f,2.3055e-05f, 0.960299f,1.66701e-05f, 0.961229f,1.21345e-05f, + +0.605018f,0.213026f, 0.580974f,0.204064f, 0.561887f,0.196424f, 0.546734f,0.189826f, 0.534761f,0.184011f, +0.525402f,0.178829f, 0.518227f,0.174186f, 0.512888f,0.169905f, 0.509113f,0.165938f, 0.506701f,0.162286f, +0.505464f,0.158834f, 0.505244f,0.155512f, 0.505922f,0.152315f, 0.507382f,0.149186f, 0.50956f,0.146184f, +0.512358f,0.143221f, 0.5157f,0.140276f, 0.519547f,0.137392f, 0.52386f,0.134579f, 0.528588f,0.131808f, +0.533624f,0.128949f, 0.538953f,0.126065f, 0.544589f,0.123239f, 0.550449f,0.120381f, 0.556543f,0.11755f, +0.562834f,0.114725f, 0.56928f,0.111885f, 0.575838f,0.109008f, 0.582535f,0.106164f, 0.589324f,0.103317f, +0.596297f,0.100587f, 0.603299f,0.0978127f, 0.610334f,0.0950253f, 0.617411f,0.0922563f, 0.624477f,0.08947f, +0.631487f,0.086649f, 0.638549f,0.0839046f, 0.645545f,0.0811466f, 0.652497f,0.0784086f, 0.65942f,0.075712f, +0.666301f,0.0730543f, 0.673192f,0.0704745f, 0.680018f,0.0679268f, 0.686788f,0.0654227f, 0.693393f,0.0629046f, +0.699931f,0.0604436f, 0.706411f,0.0580452f, 0.712803f,0.0556937f, 0.719128f,0.0534046f, 0.725354f,0.0511641f, +0.731482f,0.0489753f, 0.737523f,0.0468462f, 0.74347f,0.0447744f, 0.749241f,0.0427283f, 0.754997f,0.0407768f, +0.760652f,0.0388805f, 0.766146f,0.0370186f, 0.771482f,0.0351983f, 0.776736f,0.0334473f, 0.781869f,0.0317498f, +0.786877f,0.0301052f, 0.791887f,0.0285534f, 0.79676f,0.0270475f, 0.801501f,0.0255894f, 0.806113f,0.0241816f, +0.810585f,0.0228207f, 0.814937f,0.0215123f, 0.819159f,0.0202533f, 0.823247f,0.0190423f, 0.827224f,0.0178837f, +0.831083f,0.0167756f, 0.834839f,0.0157198f, 0.838565f,0.0147289f, 0.842126f,0.0137734f, 0.845582f,0.0128653f, +0.848949f,0.0120059f, 0.85232f,0.011207f, 0.855633f,0.0104559f, 0.858806f,0.00973829f, 0.861955f,0.00906346f, +0.865006f,0.00841846f, 0.867872f,0.00779955f, 0.870564f,0.00721014f, 0.873161f,0.00665991f, 0.875652f,0.00614706f, +0.878214f,0.00567076f, 0.880734f,0.00522433f, 0.883384f,0.00479869f, 0.88603f,0.00439508f, 0.888553f,0.00401415f, +0.890957f,0.00365604f, 0.893396f,0.00333348f, 0.89581f,0.00303785f, 0.898189f,0.00276717f, 0.900431f,0.00251182f, +0.902571f,0.00227444f, 0.904923f,0.00205678f, 0.907236f,0.00185619f, 0.909494f,0.00167097f, 0.911655f,0.00149832f, +0.913748f,0.00133965f, 0.915868f,0.00119872f, 0.917883f,0.00106741f, 0.919909f,0.000950637f, 0.921866f,0.000843304f, +0.923719f,0.000743944f, 0.925612f,0.000657461f, 0.927543f,0.000582327f, 0.929477f,0.000513366f, 0.931307f,0.000448908f, +0.933076f,0.000390599f, 0.934796f,0.000338344f, 0.93641f,0.000290559f, 0.938059f,0.000250009f, 0.939682f,0.000214458f, +0.941185f,0.000182347f, 0.942637f,0.00015516f, 0.944037f,0.000131611f, 0.945574f,0.000110141f, 0.947038f,9.16486e-05f, +0.948406f,7.57186e-05f, 0.949864f,6.18775e-05f, 0.95162f,5.18319e-05f, 0.953241f,4.20587e-05f, 0.954792f,3.3539e-05f, +0.956044f,2.54324e-05f, 0.956903f,1.87798e-05f, 0.957859f,1.28946e-05f, + +0.612415f,0.205943f, 0.589161f,0.197523f, 0.570544f,0.190281f, 0.555639f,0.183978f, 0.543755f,0.178393f, +0.534367f,0.173374f, 0.527077f,0.168863f, 0.521559f,0.164699f, 0.517552f,0.1608f, 0.514868f,0.15721f, +0.513331f,0.153826f, 0.512788f,0.150563f, 0.513126f,0.147426f, 0.51423f,0.144351f, 0.516033f,0.141387f, +0.518455f,0.138489f, 0.521417f,0.135613f, 0.524866f,0.132769f, 0.528766f,0.129979f, 0.533091f,0.127272f, +0.537765f,0.124552f, 0.542717f,0.121772f, 0.547936f,0.118984f, 0.553431f,0.116248f, 0.559122f,0.11348f, +0.565018f,0.110734f, 0.571091f,0.108f, 0.577309f,0.105262f, 0.583618f,0.102486f, 0.59006f,0.0997533f, +0.596584f,0.0970212f, 0.60327f,0.0943944f, 0.610009f,0.0917599f, 0.61676f,0.0891013f, 0.623542f,0.0864562f, +0.630339f,0.0838256f, 0.637066f,0.0811513f, 0.643828f,0.0785397f, 0.65055f,0.0759371f, 0.657221f,0.0733497f, +0.66385f,0.0707927f, 0.670441f,0.0682777f, 0.677008f,0.0658181f, 0.683549f,0.0634138f, 0.690058f,0.0610651f, +0.69645f,0.0587264f, 0.702697f,0.0563942f, 0.708919f,0.0541401f, 0.715047f,0.0519284f, 0.721072f,0.0497576f, +0.727056f,0.0476582f, 0.732943f,0.045606f, 0.738743f,0.0436081f, 0.744464f,0.0416696f, 0.750083f,0.0397806f, +0.755538f,0.0379208f, 0.760975f,0.0361478f, 0.766309f,0.0344249f, 0.7715f,0.0327401f, 0.776543f,0.0310968f, +0.781489f,0.0295115f, 0.786328f,0.0279802f, 0.791028f,0.0264942f, 0.795729f,0.0250935f, 0.800335f,0.0237454f, +0.804805f,0.0224398f, 0.809145f,0.0211789f, 0.813363f,0.0199655f, 0.817445f,0.018796f, 0.821423f,0.0176775f, +0.825249f,0.016599f, 0.828927f,0.0155619f, 0.832524f,0.0145788f, 0.835971f,0.0136357f, 0.839389f,0.0127547f, +0.842748f,0.0119143f, 0.846006f,0.0111108f, 0.849163f,0.0103505f, 0.852231f,0.00963414f, 0.855272f,0.00896892f, +0.858207f,0.00834181f, 0.861014f,0.00774955f, 0.863822f,0.00719111f, 0.86655f,0.00665505f, 0.86913f,0.00614248f, +0.871984f,0.00565971f, 0.874774f,0.00520863f, 0.877554f,0.00478936f, 0.880314f,0.00440261f, 0.882956f,0.00403644f, +0.885476f,0.00369013f, 0.887881f,0.00336453f, 0.890153f,0.00305872f, 0.892581f,0.00277604f, 0.895068f,0.0025231f, +0.897556f,0.00229243f, 0.900001f,0.00207945f, 0.902321f,0.00187802f, 0.904591f,0.00169253f, 0.906819f,0.00152289f, +0.908962f,0.00136513f, 0.911074f,0.00122116f, 0.913098f,0.00108801f, 0.915226f,0.000970359f, 0.917292f,0.000862401f, +0.919319f,0.000764816f, 0.921304f,0.000676373f, 0.923216f,0.000595253f, 0.925097f,0.00052291f, 0.927009f,0.000460083f, +0.928948f,0.000405397f, 0.930742f,0.000353645f, 0.932404f,0.000305625f, 0.934016f,0.000263451f, 0.935487f,0.000225023f, +0.936904f,0.000191934f, 0.938478f,0.000162294f, 0.94002f,0.000136778f, 0.94152f,0.000115104f, 0.942999f,9.6511e-05f, +0.944594f,7.94029e-05f, 0.946211f,6.54416e-05f, 0.947713f,5.26781e-05f, 0.94933f,4.3257e-05f, 0.950909f,3.54124e-05f, +0.952073f,2.748e-05f, 0.952965f,1.96146e-05f, 0.95429f,1.36753e-05f, + +0.619519f,0.199091f, 0.597033f,0.191172f, 0.578886f,0.184306f, 0.564239f,0.178284f, 0.55246f,0.172922f, +0.543065f,0.168069f, 0.535681f,0.163683f, 0.530007f,0.15963f, 0.525794f,0.155821f, 0.522859f,0.152281f, +0.521044f,0.148964f, 0.520202f,0.145773f, 0.520218f,0.142692f, 0.520994f,0.139701f, 0.522438f,0.136756f, +0.524503f,0.133923f, 0.527101f,0.131112f, 0.530174f,0.128318f, 0.53369f,0.125577f, 0.537611f,0.122887f, +0.541916f,0.120274f, 0.546514f,0.117616f, 0.551363f,0.114917f, 0.556464f,0.112233f, 0.561806f,0.109586f, +0.567323f,0.106913f, 0.573028f,0.104268f, 0.578881f,0.101623f, 0.584861f,0.0989788f, 0.590916f,0.0962983f, +0.597106f,0.0936761f, 0.603374f,0.0910651f, 0.609776f,0.0885371f, 0.616253f,0.0860352f, 0.622729f,0.0835039f, +0.629222f,0.0809807f, 0.635761f,0.0785013f, 0.642224f,0.0759772f, 0.648666f,0.073473f, 0.655134f,0.0710305f, +0.661532f,0.0685864f, 0.667886f,0.0661718f, 0.674203f,0.0637972f, 0.680474f,0.0614632f, 0.686723f,0.0591872f, +0.692931f,0.0569589f, 0.699109f,0.0547882f, 0.705146f,0.0526191f, 0.711063f,0.0504734f, 0.716965f,0.0484074f, +0.722755f,0.0463741f, 0.728451f,0.0443857f, 0.734064f,0.0424492f, 0.739624f,0.0405747f, 0.745105f,0.0387555f, +0.750519f,0.0369953f, 0.755821f,0.0352779f, 0.760972f,0.0335925f, 0.766106f,0.031988f, 0.771118f,0.0304239f, +0.776f,0.0289f, 0.780756f,0.0274199f, 0.785401f,0.0259898f, 0.789943f,0.0246111f, 0.794341f,0.0232725f, +0.798732f,0.0220117f, 0.803032f,0.0208019f, 0.807203f,0.0196331f, 0.811249f,0.0185067f, 0.815182f,0.0174263f, +0.818964f,0.0163843f, 0.822685f,0.0153905f, 0.826326f,0.0144345f, 0.82981f,0.0135143f, 0.833181f,0.0126389f, +0.836433f,0.0118054f, 0.839611f,0.0110224f, 0.842682f,0.0102825f, 0.845572f,0.00957432f, 0.848425f,0.00890469f, +0.851336f,0.00827025f, 0.854173f,0.00767967f, 0.857197f,0.00713115f, 0.860344f,0.00661087f, 0.863437f,0.0061229f, +0.866461f,0.00566297f, 0.869329f,0.00522219f, 0.872068f,0.00480438f, 0.874705f,0.00441221f, 0.877257f,0.0040464f, +0.88003f,0.00371153f, 0.882747f,0.00339866f, 0.885334f,0.00310122f, 0.887803f,0.00282021f, 0.89016f,0.00255611f, +0.892428f,0.00230957f, 0.894733f,0.00208863f, 0.897099f,0.00189134f, 0.899559f,0.00171314f, 0.901911f,0.00154516f, +0.904163f,0.00138777f, 0.906403f,0.00124536f, 0.908566f,0.00111362f, 0.910624f,0.000990644f, 0.912634f,0.000878565f, +0.914673f,0.000779508f, 0.916712f,0.000691551f, 0.918678f,0.000611173f, 0.920566f,0.000537717f, 0.922401f,0.000471501f, +0.924178f,0.000412334f, 0.92589f,0.000359588f, 0.927646f,0.000315465f, 0.929309f,0.000274385f, 0.931056f,0.000235955f, +0.932716f,0.000201514f, 0.934281f,0.00017092f, 0.935776f,0.000144937f, 0.937436f,0.00012119f, 0.939069f,0.000100987f, +0.940655f,8.33742e-05f, 0.942288f,6.90709e-05f, 0.943776f,5.62264e-05f, 0.945098f,4.49364e-05f, 0.946091f,3.48071e-05f, +0.947441f,2.78992e-05f, 0.949056f,2.07419e-05f, 0.950519f,1.44766e-05f, + +0.626334f,0.192465f, 0.604594f,0.185011f, 0.586914f,0.178497f, 0.572533f,0.172743f, 0.560876f,0.167595f, +0.551492f,0.16291f, 0.544036f,0.158646f, 0.538227f,0.154707f, 0.533832f,0.150999f, 0.530668f,0.147512f, +0.528593f,0.144252f, 0.527473f,0.141138f, 0.527186f,0.13811f, 0.527649f,0.135187f, 0.528764f,0.132301f, +0.530484f,0.129512f, 0.53274f,0.126778f, 0.535463f,0.124053f, 0.538606f,0.121344f, 0.542155f,0.118705f, +0.546073f,0.116122f, 0.550326f,0.113584f, 0.554832f,0.110997f, 0.559562f,0.108378f, 0.564534f,0.1058f, +0.569716f,0.103245f, 0.575056f,0.10067f, 0.580567f,0.0981284f, 0.586205f,0.0955792f, 0.591961f,0.093042f, +0.597755f,0.0904479f, 0.603678f,0.0879199f, 0.609701f,0.0854344f, 0.615813f,0.082994f, 0.622037f,0.0806251f, +0.628242f,0.0782165f, 0.634462f,0.0758189f, 0.64073f,0.0734696f, 0.646951f,0.0711028f, 0.653097f,0.0687144f, +0.659286f,0.0664024f, 0.665427f,0.0641027f, 0.671519f,0.0618279f, 0.677562f,0.059584f, 0.683562f,0.0573804f, +0.689523f,0.0552236f, 0.695456f,0.0531215f, 0.701347f,0.0510678f, 0.707186f,0.0490594f, 0.712881f,0.0470561f, +0.718494f,0.045096f, 0.724075f,0.0432028f, 0.729544f,0.0413421f, 0.734925f,0.039528f, 0.740186f,0.0377483f, +0.745392f,0.03603f, 0.750549f,0.0343739f, 0.755658f,0.0327797f, 0.760646f,0.0312229f, 0.765494f,0.0296996f, +0.770327f,0.0282518f, 0.77501f,0.0268341f, 0.779568f,0.0254562f, 0.784021f,0.0241255f, 0.78836f,0.022841f, +0.792574f,0.0215993f, 0.796639f,0.0203952f, 0.800684f,0.0192616f, 0.804776f,0.0181852f, 0.808728f,0.0171415f, +0.812551f,0.0161364f, 0.816264f,0.0151741f, 0.819881f,0.0142529f, 0.823391f,0.013373f, 0.826746f,0.0125281f, +0.829929f,0.0117172f, 0.832938f,0.0109419f, 0.836063f,0.0102042f, 0.839095f,0.00950857f, 0.842043f,0.00885824f, +0.845235f,0.00823767f, 0.848406f,0.00764941f, 0.851487f,0.00709306f, 0.854497f,0.0065701f, 0.857498f,0.0060862f, +0.860428f,0.00563153f, 0.86328f,0.00520475f, 0.866252f,0.00480382f, 0.869152f,0.00442287f, 0.871961f,0.0040624f, +0.874701f,0.0037252f, 0.87736f,0.00340941f, 0.879951f,0.00311468f, 0.882684f,0.00284946f, 0.885295f,0.00259722f, +0.887788f,0.00235843f, 0.890173f,0.00213376f, 0.892456f,0.0019235f, 0.894708f,0.00173172f, 0.896972f,0.00155906f, +0.899306f,0.00140697f, 0.901574f,0.00126571f, 0.903753f,0.00113335f, 0.905873f,0.00101202f, 0.908008f,0.000903457f, +0.910025f,0.000801838f, 0.911929f,0.00070751f, 0.913799f,0.000623316f, 0.915682f,0.000549857f, 0.917543f,0.000484652f, +0.919291f,0.000425326f, 0.920959f,0.000370493f, 0.922816f,0.000322778f, 0.924602f,0.000280046f, 0.926409f,0.000244006f, +0.928082f,0.000210756f, 0.929868f,0.000179907f, 0.931584f,0.000151839f, 0.933281f,0.000127748f, 0.934945f,0.000107199f, +0.936438f,8.81669e-05f, 0.937877f,7.23684e-05f, 0.939127f,5.83319e-05f, 0.940201f,4.62816e-05f, 0.941505f,3.64043e-05f, +0.942947f,2.72922e-05f, 0.944959f,2.15902e-05f, 0.946532f,1.52834e-05f, + +0.632863f,0.186058f, 0.611846f,0.179035f, 0.594629f,0.172853f, 0.580523f,0.167354f, 0.569f,0.162412f, +0.559646f,0.15789f, 0.552136f,0.153748f, 0.546212f,0.149924f, 0.541655f,0.146319f, 0.538284f,0.142893f, +0.535971f,0.139692f, 0.534589f,0.136646f, 0.534022f,0.133683f, 0.534186f,0.130819f, 0.535f,0.128021f, +0.536385f,0.125252f, 0.538312f,0.122584f, 0.540704f,0.119938f, 0.543512f,0.117304f, 0.546697f,0.114695f, +0.550244f,0.112144f, 0.554132f,0.109659f, 0.55831f,0.107194f, 0.562712f,0.104687f, 0.567313f,0.102151f, +0.572147f,0.0996782f, 0.577164f,0.0972175f, 0.582321f,0.0947402f, 0.587638f,0.0923011f, 0.593063f,0.089854f, +0.598596f,0.0874211f, 0.604154f,0.0849349f, 0.60981f,0.0824942f, 0.615573f,0.0801152f, 0.621393f,0.0777593f, +0.627355f,0.075507f, 0.633304f,0.0732264f, 0.639273f,0.0709635f, 0.645241f,0.0687143f, 0.651228f,0.0664986f, +0.657127f,0.0642527f, 0.663024f,0.0620508f, 0.668907f,0.0598873f, 0.674731f,0.0577388f, 0.680518f,0.055627f, +0.686256f,0.0535502f, 0.691953f,0.0515174f, 0.697602f,0.0495268f, 0.703217f,0.0475884f, 0.708792f,0.0456996f, +0.714288f,0.0438427f, 0.719657f,0.0420021f, 0.724967f,0.0402161f, 0.730223f,0.0384831f, 0.735376f,0.0367857f, +0.740444f,0.0351343f, 0.745381f,0.0335126f, 0.750223f,0.0319366f, 0.755042f,0.0304299f, 0.759811f,0.0289823f, +0.764471f,0.0275731f, 0.768999f,0.026199f, 0.773508f,0.0248953f, 0.777851f,0.0236166f, 0.782068f,0.0223728f, +0.786284f,0.0211757f, 0.790436f,0.0200286f, 0.794473f,0.0189181f, 0.798378f,0.0178451f, 0.802221f,0.0168274f, +0.806055f,0.0158734f, 0.809724f,0.0149484f, 0.813236f,0.0140565f, 0.816586f,0.0131991f, 0.819939f,0.012381f, +0.823299f,0.0115998f, 0.826521f,0.0108541f, 0.829616f,0.0101406f, 0.832974f,0.00945495f, 0.836256f,0.00880649f, +0.839416f,0.0081878f, 0.842569f,0.00761357f, 0.845617f,0.00706824f, 0.848566f,0.00655257f, 0.851562f,0.00606584f, +0.854573f,0.00560751f, 0.857543f,0.00517944f, 0.86052f,0.00478436f, 0.863465f,0.00441067f, 0.866415f,0.00406311f, +0.869299f,0.00373565f, 0.872085f,0.00342524f, 0.874789f,0.00313365f, 0.877459f,0.00286313f, 0.880059f,0.00261035f, +0.882666f,0.00238f, 0.885232f,0.00216639f, 0.887688f,0.00196436f, 0.890028f,0.00177392f, 0.892261f,0.00159551f, +0.894416f,0.0014306f, 0.89658f,0.00128307f, 0.898789f,0.00115273f, 0.900995f,0.00103543f, 0.903065f,0.000924332f, +0.905003f,0.000820261f, 0.906964f,0.000729159f, 0.908778f,0.000643863f, 0.910478f,0.000565441f, 0.912171f,0.000494192f, +0.914061f,0.000432979f, 0.915952f,0.000379422f, 0.917764f,0.000331163f, 0.919446f,0.000286763f, 0.921333f,0.000248472f, +0.923224f,0.000214391f, 0.925168f,0.000185921f, 0.926945f,0.000158564f, 0.928641f,0.000133993f, 0.93017f,0.000111488f, +0.93168f,9.3114e-05f, 0.933024f,7.62423e-05f, 0.934243f,6.17604e-05f, 0.935575f,4.86103e-05f, 0.937207f,3.76547e-05f, +0.938881f,2.89618e-05f, 0.940367f,2.15602e-05f, 0.942338f,1.61178e-05f, + +0.639108f,0.179865f, 0.618793f,0.173241f, 0.602035f,0.167371f, 0.588209f,0.162116f, 0.576833f,0.157372f, +0.567523f,0.153012f, 0.559978f,0.148988f, 0.553958f,0.145277f, 0.549256f,0.14177f, 0.545701f,0.13842f, +0.543167f,0.135269f, 0.541541f,0.132285f, 0.540715f,0.129403f, 0.540595f,0.126588f, 0.541118f,0.12386f, +0.542202f,0.121158f, 0.543807f,0.11853f, 0.545884f,0.115962f, 0.548368f,0.113401f, 0.551221f,0.11085f, +0.554423f,0.108345f, 0.557946f,0.105884f, 0.561782f,0.103495f, 0.565865f,0.101099f, 0.570152f,0.0986758f, +0.574619f,0.0962332f, 0.579304f,0.0938576f, 0.584151f,0.091491f, 0.589122f,0.0891122f, 0.594243f,0.0867745f, +0.599457f,0.0844292f, 0.604773f,0.0821057f, 0.6101f,0.0797278f, 0.615504f,0.077386f, 0.620997f,0.0750966f, +0.626557f,0.0728465f, 0.632231f,0.0706815f, 0.637934f,0.0685308f, 0.64363f,0.0663787f, 0.64932f,0.0642391f, +0.655053f,0.062153f, 0.660718f,0.0600496f, 0.666325f,0.0579512f, 0.671961f,0.0559203f, 0.677525f,0.053896f, +0.683045f,0.0519036f, 0.688527f,0.0499503f, 0.693957f,0.0480323f, 0.699351f,0.0461622f, 0.704688f,0.04433f, +0.709994f,0.0425509f, 0.715235f,0.0408112f, 0.720395f,0.0391028f, 0.72543f,0.0374149f, 0.730437f,0.0357918f, +0.735361f,0.0342089f, 0.740191f,0.0326653f, 0.744929f,0.0311636f, 0.74953f,0.0296898f, 0.754015f,0.0282545f, +0.758442f,0.0268773f, 0.762908f,0.0255726f, 0.767368f,0.0243021f, 0.771708f,0.0230663f, 0.776051f,0.0218995f, +0.780238f,0.0207567f, 0.784279f,0.0196444f, 0.788186f,0.018568f, 0.792021f,0.0175419f, 0.795706f,0.0165496f, +0.79923f,0.0155903f, 0.802637f,0.0146764f, 0.806323f,0.0138287f, 0.809867f,0.0130101f, 0.813231f,0.0122179f, +0.816565f,0.0114584f, 0.820146f,0.0107346f, 0.823621f,0.0100419f, 0.827001f,0.00938246f, 0.830262f,0.00875175f, +0.833394f,0.00814779f, 0.83651f,0.0075781f, 0.839666f,0.00703396f, 0.842781f,0.00652453f, 0.845948f,0.00604818f, +0.849026f,0.00559545f, 0.852069f,0.00517212f, 0.855032f,0.00477192f, 0.85796f,0.00439869f, 0.860894f,0.00405462f, +0.863761f,0.00373047f, 0.866607f,0.00342954f, 0.86937f,0.00314525f, 0.872063f,0.00287825f, 0.874699f,0.00262869f, +0.877261f,0.00239546f, 0.879751f,0.00217792f, 0.882243f,0.00197959f, 0.884719f,0.00179787f, 0.887094f,0.00162675f, +0.88937f,0.00146628f, 0.891525f,0.00131571f, 0.893573f,0.00117574f, 0.895609f,0.00105081f, 0.897621f,0.000938777f, +0.899674f,0.000841178f, 0.901564f,0.000749085f, 0.903453f,0.000662512f, 0.905426f,0.000585666f, 0.907309f,0.000515173f, +0.909042f,0.000449586f, 0.910647f,0.000390109f, 0.912408f,0.000337441f, 0.914311f,0.000293552f, 0.916165f,0.000253985f, +0.917867f,0.000216968f, 0.919633f,0.000186155f, 0.921405f,0.000159933f, 0.923115f,0.000137118f, 0.924721f,0.000115038f, +0.926206f,9.53087e-05f, 0.927513f,7.81161e-05f, 0.929488f,6.42125e-05f, 0.931381f,5.16643e-05f, 0.933099f,4.02686e-05f, +0.934679f,3.08132e-05f, 0.936185f,2.26835e-05f, 0.937943f,1.69992e-05f, + +0.645074f,0.173879f, 0.625439f,0.167627f, 0.609135f,0.162049f, 0.595593f,0.157026f, 0.584374f,0.152471f, +0.575123f,0.148269f, 0.567559f,0.144365f, 0.56146f,0.14076f, 0.556631f,0.13735f, 0.552912f,0.134094f, +0.550175f,0.130995f, 0.548322f,0.128069f, 0.547253f,0.12526f, 0.54687f,0.122504f, 0.547116f,0.119837f, +0.54792f,0.117221f, 0.549215f,0.114622f, 0.550984f,0.112111f, 0.553168f,0.109639f, 0.555709f,0.107162f, +0.558579f,0.104696f, 0.561771f,0.102291f, 0.565254f,0.0999261f, 0.569019f,0.0976244f, 0.572997f,0.0953058f, +0.577151f,0.0929576f, 0.581475f,0.0906073f, 0.586002f,0.088327f, 0.590675f,0.086055f, 0.595459f,0.083774f, +0.600381f,0.0815365f, 0.605387f,0.079295f, 0.610484f,0.0770752f, 0.615594f,0.074814f, 0.620757f,0.0725745f, +0.625979f,0.0703714f, 0.631273f,0.0682168f, 0.636655f,0.0661308f, 0.642117f,0.064104f, 0.647551f,0.0620631f, +0.652988f,0.0600433f, 0.658439f,0.0580597f, 0.663861f,0.0560874f, 0.669204f,0.0541061f, 0.674562f,0.0521819f, +0.679893f,0.0502905f, 0.68515f,0.0484124f, 0.690359f,0.0465678f, 0.695525f,0.0447623f, 0.700642f,0.0429959f, +0.705724f,0.0412775f, 0.710741f,0.0395955f, 0.715733f,0.0379688f, 0.720631f,0.0363688f, 0.725429f,0.0347971f, +0.73013f,0.0332581f, 0.734804f,0.0317819f, 0.739423f,0.0303434f, 0.743957f,0.0289477f, 0.748503f,0.0275906f, +0.752932f,0.0262611f, 0.757249f,0.0249674f, 0.761479f,0.0237189f, 0.765723f,0.0225416f, 0.769857f,0.021398f, +0.773865f,0.0202889f, 0.777847f,0.0192404f, 0.781647f,0.0182127f, 0.785277f,0.0172132f, 0.788859f,0.0162521f, +0.792517f,0.0153289f, 0.796066f,0.0144451f, 0.799436f,0.0135887f, 0.802867f,0.0127722f, 0.806626f,0.0120157f, +0.81031f,0.0112931f, 0.813837f,0.0105908f, 0.817269f,0.00992095f, 0.820586f,0.00928031f, 0.824026f,0.00867083f, +0.827494f,0.00809152f, 0.830867f,0.00753783f, 0.834124f,0.00700677f, 0.837307f,0.00650394f, 0.840419f,0.00602759f, +0.843494f,0.00558136f, 0.846535f,0.0051641f, 0.849471f,0.0047664f, 0.852384f,0.00439569f, 0.855252f,0.00404879f, +0.858077f,0.00372521f, 0.860875f,0.00342478f, 0.863632f,0.00314447f, 0.866345f,0.00288314f, 0.869008f,0.00263909f, +0.871583f,0.00240895f, 0.874085f,0.00219366f, 0.876543f,0.00199451f, 0.878949f,0.00181031f, 0.881264f,0.00163826f, +0.883597f,0.00148416f, 0.885812f,0.00133849f, 0.887925f,0.00120266f, 0.889922f,0.00107634f, 0.891764f,0.000958422f, +0.893794f,0.000853284f, 0.895829f,0.000758456f, 0.897938f,0.00067717f, 0.899929f,0.000601312f, 0.901744f,0.000529682f, +0.903719f,0.000465373f, 0.90568f,0.000407374f, 0.907537f,0.000353427f, 0.90931f,0.000304832f, 0.911002f,0.000261454f, +0.912738f,0.000225406f, 0.914481f,0.000192943f, 0.916067f,0.000162655f, 0.917607f,0.000137247f, 0.919231f,0.000116995f, +0.921083f,9.86674e-05f, 0.923045f,8.12248e-05f, 0.924932f,6.58348e-05f, 0.926924f,5.41166e-05f, 0.928695f,4.32291e-05f, +0.930363f,3.31676e-05f, 0.932007f,2.50906e-05f, 0.93331f,1.78574e-05f, + +0.650764f,0.168095f, 0.631788f,0.162187f, 0.615931f,0.156885f, 0.602677f,0.152084f, 0.591623f,0.147709f, +0.582444f,0.14366f, 0.574876f,0.13988f, 0.568713f,0.136374f, 0.563776f,0.133066f, 0.559909f,0.1299f, +0.556991f,0.126863f, 0.554925f,0.123984f, 0.553625f,0.121237f, 0.553f,0.118558f, 0.55298f,0.115938f, +0.553514f,0.113392f, 0.554533f,0.110869f, 0.555998f,0.10839f, 0.557886f,0.105986f, 0.560136f,0.103597f, +0.562704f,0.101205f, 0.565567f,0.0988291f, 0.56873f,0.096523f, 0.572157f,0.0942579f, 0.575833f,0.0920354f, +0.579696f,0.0897967f, 0.583715f,0.0875323f, 0.587888f,0.0852725f, 0.592248f,0.0830813f, 0.596738f,0.0808985f, +0.60133f,0.0787135f, 0.606052f,0.076574f, 0.610852f,0.0744364f, 0.615729f,0.0723158f, 0.620623f,0.0701702f, +0.625548f,0.068031f, 0.630528f,0.0659304f, 0.635551f,0.0638637f, 0.64065f,0.0618604f, 0.645836f,0.0599265f, +0.651019f,0.0579999f, 0.656204f,0.0560945f, 0.661381f,0.0542114f, 0.666558f,0.0523612f, 0.671663f,0.0505051f, +0.676728f,0.048673f, 0.681798f,0.0468949f, 0.6868f,0.0451321f, 0.691743f,0.0433967f, 0.696627f,0.0416928f, +0.701456f,0.0400246f, 0.706258f,0.0384072f, 0.711f,0.0368269f, 0.715731f,0.0352929f, 0.720432f,0.0338104f, +0.72501f,0.0323449f, 0.729543f,0.0309097f, 0.734086f,0.0295208f, 0.738596f,0.0281862f, 0.743013f,0.0268853f, +0.747354f,0.0256258f, 0.751581f,0.0243971f, 0.755672f,0.0231954f, 0.759642f,0.0220276f, 0.763504f,0.0209005f, +0.767328f,0.0198322f, 0.771032f,0.0188f, 0.774767f,0.0178054f, 0.778615f,0.0168681f, 0.782279f,0.0159494f, +0.785761f,0.0150549f, 0.789311f,0.0141943f, 0.793036f,0.0133688f, 0.796663f,0.0125757f, 0.800172f,0.0118111f, +0.803598f,0.0110829f, 0.807227f,0.0104109f, 0.810973f,0.00977359f, 0.814605f,0.00915715f, 0.818158f,0.00856736f, +0.821622f,0.00800298f, 0.825037f,0.00746871f, 0.828378f,0.00696046f, 0.831631f,0.00647545f, 0.834779f,0.00601137f, +0.837831f,0.00556964f, 0.840818f,0.00515295f, 0.843739f,0.00476029f, 0.846615f,0.00439293f, 0.849463f,0.00404862f, +0.852213f,0.003722f, 0.854966f,0.00342083f, 0.857683f,0.0031407f, 0.860376f,0.00288157f, 0.863022f,0.00264018f, +0.865598f,0.00241387f, 0.868155f,0.00220553f, 0.870592f,0.00200765f, 0.872961f,0.00182353f, 0.875276f,0.00165394f, +0.877501f,0.00149641f, 0.87964f,0.00135052f, 0.881776f,0.00122054f, 0.884053f,0.0010979f, 0.886199f,0.000982134f, +0.888252f,0.000874989f, 0.89023f,0.000776908f, 0.89214f,0.000688947f, 0.89425f,0.000610301f, 0.896424f,0.000542185f, +0.898542f,0.000479967f, 0.900505f,0.000420933f, 0.902393f,0.000367763f, 0.904303f,0.000320052f, 0.906097f,0.000275653f, +0.907795f,0.000236163f, 0.90935f,0.000200582f, 0.911022f,0.00017132f, 0.912601f,0.00014482f, 0.9145f,0.000121052f, +0.916389f,0.000100694f, 0.918401f,8.47148e-05f, 0.92021f,6.91647e-05f, 0.921789f,5.48261e-05f, 0.923708f,4.43101e-05f, +0.925522f,3.5242e-05f, 0.927277f,2.66956e-05f, 0.928464f,1.87498e-05f, + +0.656181f,0.162506f, 0.637843f,0.15692f, 0.622427f,0.151876f, 0.609464f,0.147286f, 0.598583f,0.143082f, +0.589486f,0.139183f, 0.581929f,0.13553f, 0.575716f,0.132118f, 0.570685f,0.128907f, 0.566687f,0.125831f, +0.563602f,0.122859f, 0.561342f,0.120035f, 0.559826f,0.117342f, 0.558975f,0.114742f, 0.558708f,0.112179f, +0.558982f,0.109692f, 0.559741f,0.107249f, 0.560923f,0.104814f, 0.562518f,0.102455f, 0.564484f,0.100143f, +0.566768f,0.0978322f, 0.569334f,0.0955212f, 0.572173f,0.0932413f, 0.575287f,0.0910292f, 0.578644f,0.0888602f, +0.582217f,0.0867176f, 0.585956f,0.0845592f, 0.589832f,0.0823795f, 0.593852f,0.0802139f, 0.598045f,0.0781136f, +0.602355f,0.0760249f, 0.60675f,0.0739309f, 0.611264f,0.0718821f, 0.615853f,0.0698426f, 0.620503f,0.0678158f, +0.625181f,0.0657806f, 0.629873f,0.0637424f, 0.634614f,0.0617434f, 0.63939f,0.059777f, 0.644208f,0.0578535f, +0.649098f,0.0559947f, 0.654027f,0.0541763f, 0.658944f,0.0523722f, 0.663846f,0.0505869f, 0.668767f,0.0488464f, +0.673628f,0.0471089f, 0.678418f,0.0453771f, 0.683216f,0.0437012f, 0.68797f,0.0420543f, 0.692665f,0.0404261f, +0.69733f,0.0388312f, 0.701935f,0.0372689f, 0.706478f,0.0357423f, 0.710974f,0.0342603f, 0.715514f,0.0328158f, +0.720043f,0.0314199f, 0.72452f,0.0300651f, 0.728878f,0.0287282f, 0.73314f,0.0274211f, 0.737344f,0.02616f, +0.741506f,0.0249493f, 0.745572f,0.0237735f, 0.749547f,0.0226365f, 0.753383f,0.0215262f, 0.757062f,0.0204422f, +0.760799f,0.0193906f, 0.764519f,0.0183759f, 0.768184f,0.0174122f, 0.771721f,0.0164814f, 0.775352f,0.0155889f, +0.779266f,0.0147494f, 0.783047f,0.01393f, 0.786726f,0.0131339f, 0.790344f,0.0123671f, 0.794068f,0.0116351f, +0.797756f,0.0109302f, 0.801341f,0.0102487f, 0.804851f,0.00959708f, 0.808438f,0.00899755f, 0.812049f,0.0084371f, +0.815562f,0.00789667f, 0.818983f,0.0073781f, 0.822337f,0.00688432f, 0.825629f,0.00641561f, 0.828855f,0.00597076f, +0.832005f,0.00554776f, 0.835056f,0.00514389f, 0.837994f,0.00475728f, 0.840889f,0.0043954f, 0.843697f,0.00405287f, +0.846464f,0.00373333f, 0.849159f,0.00343256f, 0.851749f,0.00314732f, 0.854274f,0.0028809f, 0.856845f,0.00263821f, +0.859421f,0.00241543f, 0.861948f,0.002209f, 0.864379f,0.00201475f, 0.866774f,0.00183637f, 0.869056f,0.00166873f, +0.871233f,0.00150969f, 0.873621f,0.00136671f, 0.875925f,0.00123384f, 0.878107f,0.00110907f, 0.880329f,0.000999486f, +0.882447f,0.000897054f, 0.884648f,0.000800039f, 0.886722f,0.000709079f, 0.888693f,0.000625135f, 0.890681f,0.000551588f, +0.892758f,0.000486945f, 0.894873f,0.000430343f, 0.896945f,0.000379398f, 0.898834f,0.000330873f, 0.90072f,0.000287524f, +0.902527f,0.000248202f, 0.904144f,0.000211732f, 0.906017f,0.000180035f, 0.907951f,0.000152f, 0.909867f,0.000127877f, +0.911691f,0.000106203f, 0.913433f,8.75918e-05f, 0.915257f,7.28398e-05f, 0.91708f,5.89734e-05f, 0.918551f,4.5801e-05f, +0.920251f,3.5899e-05f, 0.921833f,2.7612e-05f, 0.9234f,1.96639e-05f, + +0.661329f,0.157107f, 0.64361f,0.15182f, 0.628627f,0.14702f, 0.615954f,0.142629f, 0.605253f,0.13859f, +0.596249f,0.134835f, 0.588715f,0.131307f, 0.582466f,0.127986f, 0.577355f,0.12487f, 0.57324f,0.121882f, +0.570008f,0.11899f, 0.56757f,0.116223f, 0.565852f,0.113579f, 0.564782f,0.111037f, 0.564287f,0.108546f, +0.564312f,0.106104f, 0.564818f,0.10373f, 0.565748f,0.101381f, 0.567057f,0.0990455f, 0.568744f,0.0967947f, +0.570755f,0.0945686f, 0.573048f,0.0923419f, 0.57559f,0.0901101f, 0.578384f,0.0879187f, 0.581431f,0.0857974f, +0.584706f,0.0837261f, 0.588164f,0.0816608f, 0.591771f,0.0795848f, 0.5955f,0.0774918f, 0.599359f,0.075416f, +0.603379f,0.0734039f, 0.607506f,0.0714076f, 0.611707f,0.0694071f, 0.616017f,0.0674499f, 0.620398f,0.06551f, +0.62483f,0.0635802f, 0.629285f,0.061646f, 0.633738f,0.0597039f, 0.638233f,0.057799f, 0.64276f,0.0559288f, +0.647306f,0.0540902f, 0.651914f,0.0523125f, 0.656559f,0.0505789f, 0.661213f,0.0488748f, 0.665833f,0.0471826f, +0.67047f,0.0455355f, 0.675087f,0.0439075f, 0.679665f,0.0422888f, 0.684208f,0.0407014f, 0.688746f,0.0391629f, +0.69322f,0.0376465f, 0.697628f,0.0361538f, 0.702095f,0.0346923f, 0.706504f,0.0332646f, 0.710858f,0.0318728f, +0.715167f,0.0305233f, 0.719395f,0.0292037f, 0.723584f,0.0279315f, 0.727696f,0.0266917f, 0.731689f,0.0254744f, +0.735561f,0.0242841f, 0.739361f,0.0231398f, 0.743082f,0.0220392f, 0.74692f,0.0209762f, 0.750758f,0.0199517f, +0.75445f,0.0189493f, 0.758f,0.0179735f, 0.761573f,0.017029f, 0.765385f,0.0161185f, 0.76923f,0.0152548f, +0.773007f,0.0144208f, 0.776729f,0.0136222f, 0.780718f,0.0128763f, 0.784579f,0.0121462f, 0.78835f,0.01144f, +0.792029f,0.0107584f, 0.795671f,0.0101108f, 0.799225f,0.00948804f, 0.802649f,0.00888314f, 0.805977f,0.00830252f, +0.809351f,0.00776592f, 0.812777f,0.00726951f, 0.816116f,0.00679258f, 0.819372f,0.00633583f, 0.822588f,0.00590375f, +0.825737f,0.00549331f, 0.828853f,0.00510616f, 0.831899f,0.00473782f, 0.834862f,0.00438774f, 0.837695f,0.00405131f, +0.840489f,0.0037375f, 0.843187f,0.00343989f, 0.845843f,0.00316335f, 0.848412f,0.00290253f, 0.850883f,0.00265652f, +0.85326f,0.00242587f, 0.85559f,0.00221329f, 0.857867f,0.00201764f, 0.860258f,0.00184147f, 0.862698f,0.00167478f, +0.865103f,0.00152178f, 0.867451f,0.00138023f, 0.869649f,0.00124575f, 0.871804f,0.00112232f, 0.874157f,0.00101091f, +0.876393f,0.000906078f, 0.878642f,0.000813169f, 0.880906f,0.000726869f, 0.88308f,0.000646056f, 0.885113f,0.000570158f, +0.887013f,0.000499869f, 0.888953f,0.00043802f, 0.890949f,0.000384442f, 0.89295f,0.00033791f, 0.894881f,0.000296313f, +0.896869f,0.000257199f, 0.898981f,0.000221562f, 0.901017f,0.000189368f, 0.902947f,0.000160331f, 0.904755f,0.000134247f, +0.906546f,0.000112566f, 0.908273f,9.24915e-05f, 0.910058f,7.57894e-05f, 0.91174f,6.17926e-05f, 0.913484f,4.95777e-05f, +0.914773f,3.73602e-05f, 0.916172f,2.80012e-05f, 0.918104f,2.05791e-05f, + +0.666212f,0.151892f, 0.649091f,0.146884f, 0.634533f,0.142314f, 0.622151f,0.138113f, 0.611635f,0.134232f, +0.602732f,0.130615f, 0.595233f,0.127208f, 0.588961f,0.123979f, 0.583782f,0.120951f, 0.579565f,0.118052f, +0.576202f,0.11525f, 0.573599f,0.112533f, 0.571693f,0.10994f, 0.570417f,0.107447f, 0.56971f,0.105036f, +0.569505f,0.102652f, 0.569766f,0.10033f, 0.570449f,0.0980511f, 0.571501f,0.095778f, 0.572908f,0.0935592f, +0.574649f,0.0913967f, 0.576678f,0.0892535f, 0.578958f,0.0871105f, 0.581459f,0.0849617f, 0.584193f,0.0828611f, +0.587158f,0.0808238f, 0.590337f,0.0788434f, 0.593669f,0.076855f, 0.597137f,0.0748622f, 0.600712f,0.0728552f, +0.604405f,0.0708682f, 0.608244f,0.0689403f, 0.612185f,0.0670347f, 0.616191f,0.0651268f, 0.62029f,0.0632578f, +0.624461f,0.0614128f, 0.628677f,0.0595804f, 0.632912f,0.0577472f, 0.637132f,0.0559012f, 0.641387f,0.0540922f, +0.645659f,0.0523104f, 0.649956f,0.0505676f, 0.654275f,0.0488653f, 0.658629f,0.0472088f, 0.663046f,0.0455973f, +0.667461f,0.0440152f, 0.671845f,0.0424524f, 0.67622f,0.0409258f, 0.680523f,0.0394058f, 0.68477f,0.0378987f, +0.689144f,0.0364504f, 0.693496f,0.0350386f, 0.697778f,0.0336463f, 0.701997f,0.0322819f, 0.706134f,0.0309411f, +0.710217f,0.0296376f, 0.714229f,0.0283676f, 0.718186f,0.0271367f, 0.722068f,0.0259399f, 0.72589f,0.0247862f, +0.729566f,0.0236507f, 0.733332f,0.0225442f, 0.737089f,0.0214675f, 0.74078f,0.0204352f, 0.744382f,0.0194403f, +0.74797f,0.0184814f, 0.751981f,0.0175634f, 0.755891f,0.0166637f, 0.759691f,0.0157888f, 0.763458f,0.0149433f, +0.767336f,0.014129f, 0.771189f,0.0133534f, 0.774969f,0.0126049f, 0.778714f,0.0118908f, 0.782496f,0.011223f, +0.786178f,0.0105737f, 0.789758f,0.00994432f, 0.793243f,0.00933664f, 0.796702f,0.00876109f, 0.800119f,0.00821176f, +0.803423f,0.00767907f, 0.806608f,0.00716463f, 0.809835f,0.00668998f, 0.813084f,0.00624861f, 0.816296f,0.00583105f, +0.819419f,0.00543015f, 0.822499f,0.00505168f, 0.825525f,0.00469409f, 0.828484f,0.0043555f, 0.831363f,0.00403387f, +0.834188f,0.00373098f, 0.836878f,0.00343981f, 0.839503f,0.00316734f, 0.842028f,0.00290992f, 0.844489f,0.00267053f, +0.846841f,0.00244518f, 0.84922f,0.00223306f, 0.851614f,0.00203419f, 0.853945f,0.00184991f, 0.856237f,0.00168083f, +0.858546f,0.00152945f, 0.860784f,0.00138591f, 0.863163f,0.00125452f, 0.865483f,0.00113294f, 0.867857f,0.00102017f, +0.870151f,0.000915673f, 0.872431f,0.000821359f, 0.874633f,0.000734f, 0.876905f,0.000656918f, 0.879123f,0.000584915f, +0.881178f,0.000516611f, 0.883122f,0.000453618f, 0.884915f,0.000395861f, 0.886792f,0.00034422f, 0.888941f,0.000300511f, +0.891143f,0.000262375f, 0.893297f,0.000227813f, 0.895383f,0.000196505f, 0.897294f,0.000167205f, 0.899124f,0.000140951f, +0.901029f,0.000118024f, 0.9028f,9.77619e-05f, 0.904407f,7.99285e-05f, 0.906005f,6.42262e-05f, 0.907548f,5.11325e-05f, +0.909094f,3.98896e-05f, 0.910834f,2.9372e-05f, 0.91258f,2.14998e-05f, + +0.670833f,0.146856f, 0.654292f,0.142108f, 0.640151f,0.137754f, 0.628058f,0.133733f, 0.617731f,0.130003f, +0.608938f,0.12652f, 0.601482f,0.123228f, 0.5952f,0.120098f, 0.589965f,0.117151f, 0.585659f,0.114339f, +0.582176f,0.111621f, 0.579424f,0.10896f, 0.577346f,0.106422f, 0.575878f,0.103982f, 0.574965f,0.101629f, +0.574544f,0.0993113f, 0.574571f,0.0970367f, 0.575017f,0.0948221f, 0.575835f,0.0926348f, 0.576978f,0.0904514f, +0.578449f,0.0883307f, 0.580217f,0.0862581f, 0.582238f,0.0841914f, 0.584484f,0.082129f, 0.586929f,0.0800648f, +0.589588f,0.0780515f, 0.592459f,0.0760996f, 0.595527f,0.0742023f, 0.598724f,0.0722909f, 0.602046f,0.0703811f, +0.605462f,0.0684597f, 0.608986f,0.0665615f, 0.612633f,0.0647115f, 0.616383f,0.0628938f, 0.620188f,0.0610757f, +0.624075f,0.0592926f, 0.628029f,0.0575383f, 0.632026f,0.0557998f, 0.636037f,0.0540647f, 0.64002f,0.052312f, +0.644031f,0.0505942f, 0.648073f,0.0489061f, 0.652164f,0.0472601f, 0.65627f,0.0456507f, 0.660387f,0.0440791f, +0.66451f,0.042542f, 0.66865f,0.041049f, 0.672754f,0.0395717f, 0.677001f,0.0381451f, 0.681185f,0.0367266f, +0.685302f,0.0353209f, 0.68938f,0.0339429f, 0.693443f,0.0326095f, 0.697462f,0.0313073f, 0.701407f,0.030029f, +0.705286f,0.0287811f, 0.709067f,0.0275552f, 0.712788f,0.0263691f, 0.716414f,0.0252142f, 0.720118f,0.0240932f, +0.723886f,0.0230079f, 0.727586f,0.0219601f, 0.731127f,0.0209252f, 0.734603f,0.0199205f, 0.738503f,0.0189451f, +0.742406f,0.0180162f, 0.746243f,0.0171182f, 0.750122f,0.0162571f, 0.754129f,0.0154316f, 0.758038f,0.0146243f, +0.761867f,0.0138412f, 0.765622f,0.0130843f, 0.769323f,0.0123573f, 0.773015f,0.0116644f, 0.776639f,0.0109968f, +0.780226f,0.0103605f, 0.783863f,0.00976776f, 0.787394f,0.00919086f, 0.790833f,0.00863289f, 0.794195f,0.00809663f, +0.797497f,0.0075853f, 0.80075f,0.00709919f, 0.803896f,0.00662942f, 0.806921f,0.00617575f, 0.809943f,0.00575344f, +0.812996f,0.00536282f, 0.816032f,0.00499645f, 0.818957f,0.0046438f, 0.821815f,0.00430947f, 0.824673f,0.00399936f, +0.827439f,0.00370439f, 0.83012f,0.00342529f, 0.832717f,0.00316219f, 0.835156f,0.00290938f, 0.837681f,0.00267226f, +0.840197f,0.00244943f, 0.842675f,0.0022429f, 0.84507f,0.00204952f, 0.847336f,0.00186656f, 0.849585f,0.00169573f, +0.851929f,0.00153759f, 0.854323f,0.00139213f, 0.856783f,0.00126335f, 0.85912f,0.00114087f, 0.861408f,0.00102827f, +0.86373f,0.000925491f, 0.866009f,0.000829555f, 0.868227f,0.000741726f, 0.870395f,0.000661975f, 0.872487f,0.000588565f, +0.874616f,0.000525452f, 0.876772f,0.000465754f, 0.878893f,0.000409019f, 0.880977f,0.000355895f, 0.883031f,0.000308806f, +0.885039f,0.000267216f, 0.88703f,0.000231091f, 0.889049f,0.000200366f, 0.891114f,0.000172009f, 0.893077f,0.000146122f, +0.894893f,0.000122458f, 0.896562f,0.000101837f, 0.898232f,8.31734e-05f, 0.89984f,6.71621e-05f, 0.901365f,5.26174e-05f, +0.9034f,4.1413e-05f, 0.905227f,3.12844e-05f, 0.906823f,2.24193e-05f, + +0.675196f,0.141992f, 0.659214f,0.137487f, 0.645482f,0.133338f, 0.633678f,0.129486f, 0.623544f,0.125901f, +0.614865f,0.122547f, 0.607462f,0.119366f, 0.601182f,0.116339f, 0.595903f,0.113471f, 0.591516f,0.110737f, +0.587926f,0.108098f, 0.585044f,0.105523f, 0.582805f,0.10303f, 0.581157f,0.100638f, 0.580046f,0.0983267f, +0.579425f,0.0960848f, 0.579236f,0.0938668f, 0.57945f,0.091701f, 0.580032f,0.0895744f, 0.58094f,0.0874619f, +0.58215f,0.0853771f, 0.583658f,0.0833545f, 0.585428f,0.0813624f, 0.58742f,0.0793739f, 0.589613f,0.0773875f, +0.591988f,0.0754092f, 0.59456f,0.0734823f, 0.597326f,0.0716149f, 0.600268f,0.0697936f, 0.603323f,0.0679589f, +0.606491f,0.0661309f, 0.609741f,0.0642938f, 0.613088f,0.0624808f, 0.616546f,0.0607126f, 0.620089f,0.0589727f, +0.62369f,0.0572423f, 0.627357f,0.0555418f, 0.631091f,0.0538762f, 0.634857f,0.0522244f, 0.638673f,0.050589f, +0.642481f,0.0489439f, 0.646285f,0.0473135f, 0.650113f,0.0457224f, 0.653937f,0.0441567f, 0.65778f,0.0426334f, +0.661628f,0.0411473f, 0.665582f,0.0396872f, 0.669588f,0.0382782f, 0.673589f,0.0369005f, 0.677563f,0.0355491f, +0.681518f,0.0342293f, 0.685392f,0.0329162f, 0.689196f,0.0316217f, 0.692974f,0.0303697f, 0.696683f,0.0291438f, +0.700318f,0.0279454f, 0.703865f,0.0267735f, 0.707413f,0.0256264f, 0.711064f,0.0245029f, 0.714676f,0.0234239f, +0.718214f,0.0223729f, 0.721739f,0.0213569f, 0.72556f,0.0203796f, 0.729471f,0.0194305f, 0.733259f,0.0184943f, +0.737045f,0.0175816f, 0.740935f,0.0167007f, 0.74485f,0.0158642f, 0.748706f,0.0150526f, 0.752555f,0.0142785f, +0.756393f,0.0135388f, 0.760119f,0.0128131f, 0.763796f,0.0121145f, 0.767396f,0.0114393f, 0.770949f,0.0107923f, +0.774453f,0.0101728f, 0.777894f,0.0095775f, 0.781309f,0.00901222f, 0.784749f,0.00848343f, 0.788113f,0.00797317f, +0.791368f,0.0074779f, 0.794545f,0.00700256f, 0.797684f,0.00655187f, 0.800764f,0.00612303f, 0.803725f,0.00570841f, +0.806557f,0.00530799f, 0.809392f,0.00493676f, 0.812191f,0.00458851f, 0.815025f,0.00426852f, 0.817743f,0.003961f, +0.820356f,0.00366831f, 0.822924f,0.00339578f, 0.825642f,0.00314028f, 0.828324f,0.0028985f, 0.830943f,0.00267179f, +0.833417f,0.00245387f, 0.83579f,0.00224899f, 0.838188f,0.00205703f, 0.840746f,0.00187855f, 0.843237f,0.00171184f, +0.845611f,0.00155343f, 0.847916f,0.00140636f, 0.850231f,0.00127098f, 0.852567f,0.00114716f, 0.854937f,0.00103695f, +0.857211f,0.00093347f, 0.859396f,0.000837541f, 0.861523f,0.000749839f, 0.863551f,0.000668713f, 0.865711f,0.000595611f, +0.867863f,0.000528888f, 0.870081f,0.000467096f, 0.872404f,0.000414727f, 0.87461f,0.000365135f, 0.87666f,0.000318221f, +0.878534f,0.000274377f, 0.880432f,0.000235521f, 0.882437f,0.000202696f, 0.884366f,0.000173628f, 0.886277f,0.000148572f, +0.888033f,0.000125772f, 0.889836f,0.000104048f, 0.891648f,8.55461e-05f, 0.893516f,6.92963e-05f, 0.895548f,5.53581e-05f, +0.897419f,4.28275e-05f, 0.899342f,3.3061e-05f, 0.900848f,2.33637e-05f, + +0.679306f,0.137296f, 0.663864f,0.133018f, 0.650531f,0.12906f, 0.639014f,0.125371f, 0.629074f,0.121926f, +0.620517f,0.118693f, 0.613174f,0.115622f, 0.606905f,0.112695f, 0.601592f,0.109902f, 0.597138f,0.107245f, +0.59345f,0.104681f, 0.59045f,0.102191f, 0.588064f,0.0997496f, 0.586248f,0.0974022f, 0.584954f,0.0951404f, +0.584137f,0.0929547f, 0.583743f,0.0908f, 0.583738f,0.0886815f, 0.584097f,0.0866153f, 0.58478f,0.084578f, +0.585748f,0.0825413f, 0.586999f,0.0805539f, 0.588513f,0.0786129f, 0.590262f,0.0767f, 0.592211f,0.074791f, +0.594334f,0.0728798f, 0.596624f,0.0709834f, 0.599096f,0.0691401f, 0.601746f,0.0673546f, 0.604551f,0.0656074f, +0.607457f,0.0638512f, 0.610461f,0.0621003f, 0.613539f,0.0603457f, 0.616701f,0.0586142f, 0.619962f,0.0569263f, +0.623298f,0.0552653f, 0.62668f,0.0536147f, 0.63015f,0.051998f, 0.633714f,0.050428f, 0.6373f,0.0488682f, +0.640909f,0.0473279f, 0.644494f,0.0457787f, 0.648066f,0.044238f, 0.651646f,0.0427296f, 0.655298f,0.0412519f, +0.659036f,0.0398198f, 0.662782f,0.038423f, 0.666515f,0.0370533f, 0.670208f,0.0357012f, 0.673925f,0.0343989f, +0.677617f,0.033125f, 0.681296f,0.0318898f, 0.684874f,0.0306565f, 0.688386f,0.0294458f, 0.691823f,0.0282609f, +0.69523f,0.0271163f, 0.698843f,0.0259942f, 0.702374f,0.0248956f, 0.7059f,0.0238299f, 0.709343f,0.0227839f, +0.712874f,0.0217647f, 0.7167f,0.0207843f, 0.720466f,0.0198283f, 0.724283f,0.0189068f, 0.728266f,0.0180244f, +0.732196f,0.0171649f, 0.736037f,0.0163207f, 0.739793f,0.0154963f, 0.74352f,0.0147044f, 0.747256f,0.0139529f, +0.750935f,0.0132261f, 0.754583f,0.0125294f, 0.758215f,0.0118641f, 0.761744f,0.0112133f, 0.76521f,0.0105857f, +0.768629f,0.00998339f, 0.772007f,0.0094077f, 0.775329f,0.00885601f, 0.778593f,0.00832734f, 0.781821f,0.00782487f, +0.785081f,0.00735694f, 0.788246f,0.0069038f, 0.791321f,0.00646671f, 0.79431f,0.00604752f, 0.797231f,0.00564844f, +0.800089f,0.00526922f, 0.802844f,0.00490526f, 0.805457f,0.00455379f, 0.808035f,0.00422693f, 0.810518f,0.00391756f, +0.813266f,0.00363578f, 0.815948f,0.0033665f, 0.818565f,0.00311273f, 0.821121f,0.002875f, 0.823626f,0.00265224f, +0.826243f,0.0024414f, 0.828973f,0.00224691f, 0.831574f,0.00205975f, 0.834094f,0.00188357f, 0.836602f,0.00171914f, +0.839105f,0.00156624f, 0.841542f,0.00142358f, 0.843846f,0.0012876f, 0.846081f,0.00116173f, 0.848252f,0.00104617f, +0.850367f,0.000940648f, 0.852463f,0.000845748f, 0.854655f,0.000758276f, 0.856772f,0.000677145f, 0.859034f,0.000602689f, +0.861232f,0.000534374f, 0.863431f,0.00047348f, 0.86555f,0.000417732f, 0.86761f,0.000367512f, 0.869735f,0.000323456f, +0.871828f,0.000281914f, 0.873722f,0.000242469f, 0.875504f,0.000206833f, 0.877252f,0.000175675f, 0.87909f,0.000149065f, +0.881033f,0.000125931f, 0.883156f,0.000106479f, 0.8852f,8.78767e-05f, 0.887233f,7.12753e-05f, 0.889213f,5.68846e-05f, +0.891085f,4.45103e-05f, 0.892822f,3.34649e-05f, 0.894639f,2.43043e-05f, + +0.683165f,0.132762f, 0.668247f,0.128696f, 0.655303f,0.124919f, 0.644069f,0.121385f, 0.634326f,0.118072f, +0.625895f,0.114955f, 0.61862f,0.111991f, 0.61237f,0.109161f, 0.607032f,0.106442f, 0.602521f,0.103861f, +0.598747f,0.101372f, 0.595637f,0.0989564f, 0.593119f,0.0965798f, 0.59115f,0.0942869f, 0.589683f,0.0920708f, +0.588675f,0.089922f, 0.588091f,0.0878361f, 0.587879f,0.0857717f, 0.58802f,0.0837541f, 0.588478f,0.0817679f, +0.589229f,0.0798108f, 0.590235f,0.0778599f, 0.591498f,0.0759583f, 0.593001f,0.0741029f, 0.594709f,0.0722645f, +0.596596f,0.0704319f, 0.598638f,0.0685981f, 0.600828f,0.0667794f, 0.603186f,0.065015f, 0.605712f,0.0633132f, +0.608367f,0.0616344f, 0.611117f,0.0599556f, 0.613945f,0.0582778f, 0.616843f,0.0566039f, 0.61981f,0.0549501f, +0.622892f,0.0533469f, 0.626067f,0.0517718f, 0.629288f,0.0502134f, 0.632565f,0.0486796f, 0.635913f,0.0471913f, +0.639281f,0.0457179f, 0.642675f,0.0442692f, 0.646052f,0.0428125f, 0.649524f,0.0413632f, 0.653f,0.0399435f, +0.656467f,0.0385477f, 0.659931f,0.0371835f, 0.663411f,0.0358632f, 0.666884f,0.0345763f, 0.670298f,0.0333006f, +0.673696f,0.0320616f, 0.677058f,0.0308515f, 0.680418f,0.0296885f, 0.683706f,0.0285455f, 0.687082f,0.0274027f, +0.690498f,0.0262886f, 0.693976f,0.0252158f, 0.697388f,0.0241709f, 0.700729f,0.0231499f, 0.704509f,0.0221524f, +0.708254f,0.0211826f, 0.71196f,0.0202306f, 0.715849f,0.0193118f, 0.719723f,0.0184264f, 0.72353f,0.01756f, +0.727321f,0.0167272f, 0.731109f,0.0159301f, 0.734828f,0.0151512f, 0.738451f,0.0143863f, 0.741994f,0.0136409f, +0.745489f,0.012923f, 0.749013f,0.0122456f, 0.752507f,0.0115956f, 0.755971f,0.0109732f, 0.759391f,0.0103748f, +0.762735f,0.00979446f, 0.766007f,0.00923431f, 0.769206f,0.00869467f, 0.772359f,0.00817939f, 0.775478f,0.00768881f, +0.778546f,0.00722027f, 0.781565f,0.00677451f, 0.784622f,0.00636159f, 0.787578f,0.00596229f, 0.790411f,0.00557498f, +0.793179f,0.005207f, 0.795864f,0.00485687f, 0.798439f,0.00452226f, 0.801127f,0.00420084f, 0.803728f,0.00389331f, +0.806301f,0.00360781f, 0.808796f,0.00333798f, 0.811379f,0.00308931f, 0.81399f,0.00285259f, 0.816664f,0.00263051f, +0.819337f,0.002425f, 0.822004f,0.00223247f, 0.82465f,0.00204976f, 0.8273f,0.00188192f, 0.829837f,0.00172109f, +0.832306f,0.00157047f, 0.834709f,0.00143019f, 0.837043f,0.00129981f, 0.839281f,0.00117794f, 0.841383f,0.00106171f, +0.84354f,0.000954008f, 0.845642f,0.000856056f, 0.847905f,0.000767075f, 0.850156f,0.000686338f, 0.852359f,0.000612356f, +0.85446f,0.000543588f, 0.856459f,0.000480128f, 0.858471f,0.000422843f, 0.860564f,0.000371307f, 0.862604f,0.000324589f, +0.864716f,0.000284751f, 0.866775f,0.000247998f, 0.868671f,0.000213323f, 0.870567f,0.000181145f, 0.872485f,0.000152483f, +0.874451f,0.000128189f, 0.876422f,0.000107055f, 0.878596f,8.9306e-05f, 0.880713f,7.32871e-05f, 0.882563f,5.84954e-05f, +0.884359f,4.55767e-05f, 0.886101f,3.43259e-05f, 0.888205f,2.52473e-05f, + +0.686778f,0.128386f, 0.672365f,0.124517f, 0.659802f,0.12091f, 0.648848f,0.117524f, 0.639302f,0.114338f, +0.631001f,0.111332f, 0.623799f,0.108471f, 0.617575f,0.105733f, 0.612224f,0.103093f, 0.607665f,0.100587f, +0.603814f,0.0981678f, 0.600603f,0.0958188f, 0.597967f,0.0935216f, 0.595854f,0.0912765f, 0.594225f,0.0891043f, +0.593041f,0.0870008f, 0.592268f,0.0849618f, 0.591863f,0.0829588f, 0.591794f,0.0809861f, 0.592044f,0.0790632f, +0.592574f,0.0771586f, 0.593356f,0.0752671f, 0.59438f,0.0734072f, 0.595633f,0.0715884f, 0.597104f,0.069812f, +0.598751f,0.0680441f, 0.600562f,0.066288f, 0.60251f,0.064531f, 0.604591f,0.0627912f, 0.60682f,0.0611007f, +0.609211f,0.059477f, 0.611708f,0.0578679f, 0.614286f,0.0562597f, 0.616931f,0.0546541f, 0.619695f,0.0530693f, +0.622534f,0.0515086f, 0.625465f,0.0499952f, 0.628442f,0.0484983f, 0.631467f,0.0470254f, 0.634519f,0.0455699f, +0.637616f,0.0441493f, 0.640832f,0.0427565f, 0.644135f,0.0413959f, 0.647411f,0.0400317f, 0.650648f,0.0386659f, +0.653879f,0.037326f, 0.657089f,0.0360079f, 0.660271f,0.0347127f, 0.663457f,0.0334594f, 0.666636f,0.0322443f, +0.669764f,0.0310498f, 0.672822f,0.0298721f, 0.675933f,0.0287329f, 0.679241f,0.0276199f, 0.682662f,0.0265606f, +0.685997f,0.0255068f, 0.689222f,0.0244622f, 0.692673f,0.0234503f, 0.696364f,0.0224767f, 0.699998f,0.021524f, +0.703835f,0.0205953f, 0.707642f,0.0196883f, 0.711407f,0.0188048f, 0.715106f,0.017938f, 0.71881f,0.0171086f, +0.722487f,0.0163069f, 0.726099f,0.015524f, 0.729704f,0.0147744f, 0.733291f,0.0140538f, 0.73681f,0.0133507f, +0.74024f,0.0126626f, 0.743589f,0.0119929f, 0.746879f,0.0113462f, 0.750175f,0.0107341f, 0.753463f,0.0101522f, +0.756711f,0.00959475f, 0.75989f,0.00905615f, 0.762996f,0.00853528f, 0.766046f,0.00803596f, 0.769024f,0.00755535f, +0.771959f,0.00709798f, 0.774824f,0.0066601f, 0.777625f,0.00624243f, 0.780385f,0.0058476f, 0.783162f,0.00548201f, +0.785852f,0.00513139f, 0.788636f,0.00479051f, 0.791362f,0.00446643f, 0.794034f,0.00416022f, 0.796698f,0.0038677f, +0.799237f,0.00358504f, 0.801796f,0.00331517f, 0.804457f,0.00306623f, 0.807094f,0.00283197f, 0.809785f,0.00261411f, +0.812429f,0.00240902f, 0.814994f,0.00221463f, 0.817568f,0.00203605f, 0.820105f,0.00186973f, 0.822539f,0.00171105f, +0.825f,0.00156742f, 0.827319f,0.00142942f, 0.829572f,0.00129997f, 0.831909f,0.00118058f, 0.834177f,0.00107007f, +0.836499f,0.000966251f, 0.838737f,0.000867217f, 0.840925f,0.000775681f, 0.843098f,0.00069335f, 0.845234f,0.000619055f, +0.847323f,0.000550716f, 0.849484f,0.000488468f, 0.851607f,0.000430719f, 0.85369f,0.000377786f, 0.855728f,0.000330669f, +0.857657f,0.000287906f, 0.859558f,0.000249225f, 0.861822f,0.00021743f, 0.863879f,0.000186427f, 0.86588f,0.000157342f, +0.867803f,0.000131935f, 0.869843f,0.000109922f, 0.871791f,9.05761e-05f, 0.873661f,7.39049e-05f, 0.875621f,5.96043e-05f, +0.877665f,4.69366e-05f, 0.879494f,3.55916e-05f, 0.88154f,2.61799e-05f, + +0.690148f,0.124161f, 0.676223f,0.120478f, 0.664031f,0.117032f, 0.653353f,0.113784f, 0.644006f,0.11072f, +0.635836f,0.10782f, 0.628713f,0.105059f, 0.622523f,0.10241f, 0.617167f,0.0998553f, 0.612567f,0.0974125f, +0.608649f,0.0950631f, 0.605346f,0.0927803f, 0.602601f,0.0905551f, 0.600355f,0.0883611f, 0.598578f,0.0862439f, +0.59723f,0.0841885f, 0.596274f,0.0821866f, 0.595683f,0.0802376f, 0.595419f,0.0783186f, 0.595459f,0.0764366f, +0.59578f,0.0745916f, 0.596352f,0.0727671f, 0.597147f,0.0709504f, 0.598165f,0.0691735f, 0.599387f,0.0674311f, +0.600804f,0.065728f, 0.60238f,0.0640358f, 0.604096f,0.0623474f, 0.605936f,0.0606667f, 0.607896f,0.059005f, +0.609987f,0.0573866f, 0.612227f,0.0558348f, 0.614593f,0.0543052f, 0.617067f,0.0527863f, 0.619602f,0.0512712f, +0.622189f,0.0497635f, 0.624835f,0.0482802f, 0.627554f,0.0468388f, 0.630309f,0.0454136f, 0.633108f,0.0440144f, +0.636078f,0.0426425f, 0.639083f,0.0412986f, 0.64212f,0.0399829f, 0.645174f,0.0386925f, 0.648215f,0.0374109f, +0.651206f,0.0361258f, 0.654169f,0.0348585f, 0.657105f,0.0336146f, 0.660002f,0.032394f, 0.66287f,0.0312048f, +0.665708f,0.030049f, 0.668815f,0.0289351f, 0.672017f,0.0278352f, 0.675184f,0.0267645f, 0.678303f,0.0257199f, +0.681411f,0.0247146f, 0.685014f,0.0237391f, 0.688514f,0.0227625f, 0.69214f,0.0218083f, 0.695867f,0.0208909f, +0.699587f,0.0200038f, 0.703265f,0.0191357f, 0.706905f,0.0182894f, 0.710516f,0.017467f, 0.714074f,0.0166637f, +0.717571f,0.0158781f, 0.721068f,0.0151265f, 0.724545f,0.0144023f, 0.727961f,0.0136967f, 0.731378f,0.013024f, +0.734755f,0.0123736f, 0.738066f,0.0117402f, 0.741295f,0.0111226f, 0.744443f,0.0105221f, 0.747528f,0.00994293f, +0.750583f,0.00939036f, 0.753656f,0.00887084f, 0.756688f,0.00837387f, 0.759644f,0.00789396f, 0.762498f,0.00742769f, +0.765298f,0.00698298f, 0.768015f,0.00655561f, 0.770657f,0.00614776f, 0.773218f,0.00575865f, 0.775906f,0.00538572f, +0.778589f,0.00503541f, 0.781343f,0.00470965f, 0.784091f,0.00440047f, 0.786721f,0.00410073f, 0.789403f,0.0038165f, +0.792148f,0.00354792f, 0.794935f,0.003293f, 0.797602f,0.00304622f, 0.800178f,0.00281086f, 0.802758f,0.00259419f, +0.805274f,0.00238994f, 0.807772f,0.00220032f, 0.810214f,0.00202226f, 0.812586f,0.00185486f, 0.814897f,0.00169914f, +0.817251f,0.0015565f, 0.819601f,0.00142023f, 0.821959f,0.0012955f, 0.824353f,0.00117805f, 0.826775f,0.0010683f, +0.829148f,0.000966931f, 0.831467f,0.000873214f, 0.833738f,0.000785556f, 0.835878f,0.000701932f, 0.838105f,0.000625157f, +0.840367f,0.000556575f, 0.842615f,0.000495332f, 0.844741f,0.000438026f, 0.8468f,0.000386225f, 0.848755f,0.000337786f, +0.850852f,0.000294606f, 0.852942f,0.000255932f, 0.855021f,0.000220148f, 0.85716f,0.000189976f, 0.85928f,0.000163244f, +0.861334f,0.000137233f, 0.863225f,0.000113933f, 0.865049f,9.37863e-05f, 0.866937f,7.63048e-05f, 0.868901f,6.14431e-05f, +0.870595f,4.79409e-05f, 0.872846f,3.71881e-05f, 0.874652f,2.71133e-05f, + +0.69328f,0.120082f, 0.679825f,0.116574f, 0.667995f,0.113279f, 0.657588f,0.110164f, 0.648439f,0.107216f, +0.640404f,0.104419f, 0.633365f,0.101753f, 0.627214f,0.0991889f, 0.62186f,0.0967182f, 0.617227f,0.0943357f, +0.61325f,0.092055f, 0.609866f,0.0898401f, 0.607019f,0.0876806f, 0.604653f,0.0855506f, 0.602736f,0.0834817f, +0.601232f,0.0814693f, 0.600108f,0.0795126f, 0.599339f,0.0776122f, 0.598885f,0.0757405f, 0.598725f,0.0739018f, +0.598843f,0.0721107f, 0.599204f,0.0703345f, 0.59979f,0.0685804f, 0.600578f,0.0668422f, 0.60157f,0.0651449f, +0.602743f,0.0634788f, 0.604089f,0.061845f, 0.605577f,0.060224f, 0.607184f,0.0586041f, 0.608904f,0.0569963f, +0.610742f,0.0554144f, 0.612752f,0.0538866f, 0.614908f,0.0524247f, 0.617145f,0.0509729f, 0.619444f,0.0495248f, +0.621792f,0.0480818f, 0.624169f,0.0466383f, 0.626605f,0.0452273f, 0.629154f,0.0438575f, 0.631835f,0.0425107f, +0.634552f,0.0411883f, 0.637299f,0.0398904f, 0.640064f,0.0386148f, 0.642852f,0.0373687f, 0.645652f,0.0361488f, +0.648434f,0.0349423f, 0.651152f,0.0337302f, 0.653828f,0.0325332f, 0.656499f,0.0313682f, 0.659192f,0.0302223f, +0.662204f,0.0291059f, 0.66519f,0.028018f, 0.668167f,0.0269677f, 0.671095f,0.02594f, 0.674211f,0.024931f, +0.677585f,0.023949f, 0.681018f,0.0229948f, 0.684659f,0.0220799f, 0.688256f,0.021176f, 0.691784f,0.0202787f, +0.695293f,0.0194079f, 0.69884f,0.0185784f, 0.702357f,0.0177709f, 0.705839f,0.0169835f, 0.709274f,0.0162146f, +0.712674f,0.0154678f, 0.716008f,0.0147361f, 0.719308f,0.0140282f, 0.722595f,0.0133492f, 0.725843f,0.0126922f, +0.729059f,0.0120588f, 0.732271f,0.0114552f, 0.735426f,0.0108694f, 0.738516f,0.0103005f, 0.741524f,0.00974688f, +0.744456f,0.00921037f, 0.747316f,0.00869268f, 0.750127f,0.00819771f, 0.752931f,0.0077316f, 0.755714f,0.0072898f, +0.758406f,0.00686311f, 0.760967f,0.00644761f, 0.763673f,0.00605263f, 0.766368f,0.00567331f, 0.769078f,0.00531213f, +0.771733f,0.00496877f, 0.774293f,0.00463954f, 0.776942f,0.00433173f, 0.779763f,0.00404292f, 0.782583f,0.00376963f, +0.785322f,0.00350603f, 0.788027f,0.00325755f, 0.790673f,0.00302207f, 0.793231f,0.00279677f, 0.795682f,0.00258036f, +0.798023f,0.00237364f, 0.800398f,0.00218586f, 0.802747f,0.00200979f, 0.805078f,0.00184441f, 0.807465f,0.00169012f, +0.809811f,0.0015468f, 0.812184f,0.00141395f, 0.814666f,0.00129004f, 0.817111f,0.0011746f, 0.819515f,0.00106787f, +0.82184f,0.000967784f, 0.824142f,0.000874349f, 0.826578f,0.000789032f, 0.82897f,0.000710131f, 0.831231f,0.000635154f, +0.833357f,0.00056428f, 0.835441f,0.000500702f, 0.837564f,0.000443936f, 0.839696f,0.000392784f, 0.841864f,0.000345274f, +0.844024f,0.000301633f, 0.846125f,0.000261464f, 0.848188f,0.000226287f, 0.85021f,0.000194433f, 0.852227f,0.000165439f, +0.854322f,0.000141442f, 0.856358f,0.000118553f, 0.858219f,9.74642e-05f, 0.860114f,7.94238e-05f, 0.86185f,6.36169e-05f, +0.863859f,5.01844e-05f, 0.865737f,3.80942e-05f, 0.867546f,2.80486e-05f, + +0.696178f,0.116146f, 0.683177f,0.112801f, 0.671698f,0.109649f, 0.661559f,0.106661f, 0.652606f,0.103823f, +0.644708f,0.101125f, 0.637756f,0.0985493f, 0.631649f,0.0960692f, 0.626305f,0.0936786f, 0.621646f,0.0913569f, +0.617619f,0.0891428f, 0.61416f,0.0869908f, 0.611218f,0.0848937f, 0.608744f,0.0828357f, 0.606695f,0.0808087f, +0.605046f,0.0788451f, 0.603764f,0.0769349f, 0.602819f,0.0750711f, 0.602191f,0.0732568f, 0.601842f,0.071464f, +0.601755f,0.0697035f, 0.601918f,0.0679891f, 0.602298f,0.0662892f, 0.60287f,0.0645952f, 0.603634f,0.0629369f, +0.604578f,0.0613132f, 0.605685f,0.0597196f, 0.606942f,0.0581515f, 0.608336f,0.0566033f, 0.609848f,0.0550608f, +0.611512f,0.0535465f, 0.613276f,0.0520552f, 0.615146f,0.0506007f, 0.617137f,0.0492046f, 0.619196f,0.0478176f, +0.621308f,0.0464387f, 0.623458f,0.0450652f, 0.625722f,0.0436989f, 0.628083f,0.0423559f, 0.630511f,0.0410566f, +0.632968f,0.0397772f, 0.635451f,0.0385214f, 0.637958f,0.0372922f, 0.64047f,0.0360836f, 0.642992f,0.0349024f, +0.645528f,0.033749f, 0.648074f,0.0326229f, 0.650542f,0.0314896f, 0.65322f,0.0303673f, 0.656037f,0.0292736f, +0.658814f,0.0281979f, 0.661551f,0.0271459f, 0.664258f,0.0261257f, 0.667384f,0.0251245f, 0.670589f,0.0241589f, +0.673997f,0.0232126f, 0.67743f,0.0222902f, 0.680843f,0.0213882f, 0.684296f,0.0205279f, 0.687727f,0.0196869f, +0.691095f,0.0188518f, 0.694425f,0.0180344f, 0.697745f,0.0172447f, 0.701081f,0.0164893f, 0.704402f,0.0157575f, +0.707686f,0.015045f, 0.710922f,0.0143498f, 0.714116f,0.0136741f, 0.717237f,0.013012f, 0.720335f,0.0123759f, +0.723398f,0.0117627f, 0.726411f,0.0111683f, 0.729394f,0.0105976f, 0.732386f,0.0100569f, 0.735305f,0.00953102f, +0.738154f,0.00902101f, 0.740917f,0.00852591f, 0.743602f,0.00804773f, 0.746201f,0.00758591f, 0.748736f,0.00714509f, +0.751408f,0.00672888f, 0.754208f,0.0063339f, 0.756975f,0.00595534f, 0.759633f,0.00558747f, 0.762235f,0.0052374f, +0.764871f,0.00490163f, 0.767654f,0.00458118f, 0.770419f,0.0042789f, 0.773108f,0.00398901f, 0.775804f,0.00371923f, +0.778474f,0.00346519f, 0.781105f,0.00322466f, 0.78367f,0.00299294f, 0.7862f,0.00277606f, 0.788674f,0.00257094f, +0.791035f,0.00237408f, 0.793326f,0.00218435f, 0.795655f,0.00200485f, 0.798011f,0.00184218f, 0.800326f,0.00168891f, +0.802724f,0.00154434f, 0.805088f,0.00141017f, 0.807411f,0.00128561f, 0.809778f,0.00117178f, 0.812091f,0.00106437f, +0.814503f,0.00096497f, 0.816916f,0.000874093f, 0.819258f,0.000789136f, 0.821552f,0.000710895f, 0.823795f,0.000639039f, +0.826033f,0.00057216f, 0.828094f,0.000508173f, 0.830161f,0.000447957f, 0.832354f,0.000395503f, 0.834644f,0.000349545f, +0.8368f,0.000306486f, 0.838868f,0.000267537f, 0.84089f,0.000230778f, 0.842988f,0.000198587f, 0.845023f,0.000170117f, +0.847015f,0.000143635f, 0.849044f,0.000121717f, 0.851008f,0.000101091f, 0.852804f,8.2227e-05f, 0.854708f,6.59263e-05f, +0.856736f,5.2035e-05f, 0.858481f,3.97219e-05f, 0.860222f,2.89799e-05f, + +0.698845f,0.112347f, 0.686282f,0.109155f, 0.675145f,0.106138f, 0.665268f,0.10327f, 0.65651f,0.100538f, +0.648751f,0.0979336f, 0.641889f,0.0954464f, 0.635832f,0.093047f, 0.630501f,0.0907318f, 0.625826f,0.0884783f, +0.621753f,0.0863229f, 0.618228f,0.0842322f, 0.615198f,0.0821935f, 0.612623f,0.0802026f, 0.610453f,0.0782279f, +0.608669f,0.0763146f, 0.607236f,0.0744475f, 0.606128f,0.0726226f, 0.605326f,0.0708495f, 0.604799f,0.0691098f, +0.604524f,0.0673958f, 0.604486f,0.0657173f, 0.604665f,0.0640676f, 0.605038f,0.0624364f, 0.60558f,0.0608104f, +0.606298f,0.0592242f, 0.607177f,0.0576695f, 0.60822f,0.0561545f, 0.609408f,0.0546636f, 0.610756f,0.0532025f, +0.612191f,0.0517391f, 0.613719f,0.0502933f, 0.615337f,0.0488739f, 0.617045f,0.0474872f, 0.618862f,0.0461566f, +0.620731f,0.0448328f, 0.622763f,0.043524f, 0.624867f,0.0422266f, 0.626992f,0.0409341f, 0.629137f,0.0396556f, +0.631335f,0.0384189f, 0.633541f,0.0371956f, 0.635777f,0.0360045f, 0.638049f,0.0348422f, 0.640333f,0.033707f, +0.642606f,0.0325931f, 0.644912f,0.0315056f, 0.647582f,0.0304513f, 0.650229f,0.0293978f, 0.652811f,0.0283446f, +0.655359f,0.0273139f, 0.657978f,0.0263039f, 0.660988f,0.0253119f, 0.664094f,0.0243498f, 0.667362f,0.0234118f, +0.670635f,0.0225013f, 0.673894f,0.0216107f, 0.677147f,0.0207439f, 0.680386f,0.0198986f, 0.683624f,0.0190799f, +0.686907f,0.0183018f, 0.690117f,0.0175271f, 0.693255f,0.016759f, 0.696378f,0.0160157f, 0.699503f,0.0153021f, +0.702626f,0.0146162f, 0.705722f,0.0139511f, 0.708794f,0.013306f, 0.711824f,0.0126793f, 0.714801f,0.0120691f, +0.717703f,0.011472f, 0.720588f,0.0109015f, 0.723427f,0.0103507f, 0.726195f,0.00981554f, 0.728936f,0.00930478f, +0.731628f,0.00881408f, 0.73427f,0.00834188f, 0.736838f,0.00788605f, 0.739467f,0.00744503f, 0.74221f,0.00701877f, +0.744878f,0.00660754f, 0.747502f,0.00621613f, 0.750107f,0.00584752f, 0.752777f,0.00549298f, 0.755603f,0.00515576f, +0.75836f,0.00483074f, 0.761067f,0.00452067f, 0.763751f,0.00422515f, 0.766364f,0.00394147f, 0.76896f,0.00367489f, +0.771483f,0.00341996f, 0.774012f,0.00318395f, 0.776515f,0.00296141f, 0.778982f,0.00275088f, 0.781415f,0.00254866f, +0.783922f,0.0023606f, 0.78634f,0.0021813f, 0.78864f,0.00200887f, 0.791029f,0.0018434f, 0.793335f,0.00168708f, +0.795737f,0.00154629f, 0.798089f,0.00141418f, 0.80036f,0.00128922f, 0.802737f,0.0011738f, 0.805067f,0.00106674f, +0.807373f,0.000968471f, 0.809564f,0.000875086f, 0.811778f,0.000789839f, 0.814011f,0.000711503f, 0.816194f,0.000639661f, +0.818369f,0.000573521f, 0.820667f,0.000513292f, 0.822933f,0.000456415f, 0.825022f,0.000401903f, 0.826981f,0.000351698f, +0.828995f,0.000308204f, 0.831238f,0.000270105f, 0.833375f,0.000234844f, 0.835409f,0.000202344f, 0.837424f,0.00017275f, +0.839359f,0.00014699f, 0.841297f,0.000123404f, 0.843269f,0.000103232f, 0.845266f,8.48738e-05f, 0.84723f,6.7889e-05f, +0.849029f,5.33612e-05f, 0.8508f,4.08902e-05f, 0.852681f,2.98966e-05f, + +0.701286f,0.10868f, 0.689145f,0.105632f, 0.678341f,0.102743f, 0.66872f,0.0999885f, 0.660155f,0.0973577f, +0.652535f,0.0948451f, 0.645765f,0.0924402f, 0.639762f,0.0901194f, 0.63445f,0.0878767f, 0.629766f,0.0856961f, +0.625653f,0.0835898f, 0.622068f,0.081561f, 0.61896f,0.0795806f, 0.616288f,0.0776478f, 0.61401f,0.0757405f, +0.612096f,0.0738675f, 0.610521f,0.072045f, 0.609261f,0.070267f, 0.60829f,0.0685274f, 0.60759f,0.0668313f, +0.607136f,0.0651667f, 0.606906f,0.0635249f, 0.60689f,0.0619229f, 0.607061f,0.0603361f, 0.607406f,0.0587704f, +0.607914f,0.0572218f, 0.608583f,0.0557101f, 0.609415f,0.0542336f, 0.610418f,0.0527992f, 0.61154f,0.051385f, +0.612764f,0.0499872f, 0.614063f,0.0485895f, 0.615441f,0.0472091f, 0.6169f,0.0458585f, 0.618433f,0.0445368f, +0.620206f,0.0432769f, 0.622038f,0.0420236f, 0.62391f,0.0407816f, 0.625805f,0.0395455f, 0.627718f,0.0383204f, +0.629638f,0.0371062f, 0.63163f,0.035937f, 0.633623f,0.0347809f, 0.635632f,0.0336562f, 0.637639f,0.0325545f, +0.639809f,0.0314843f, 0.642249f,0.0304379f, 0.644685f,0.0294141f, 0.647132f,0.028423f, 0.649532f,0.02744f, +0.652139f,0.0264535f, 0.654976f,0.0254805f, 0.658039f,0.0245363f, 0.661124f,0.0236043f, 0.664205f,0.0226948f, +0.667297f,0.0218148f, 0.670369f,0.0209517f, 0.673448f,0.0201164f, 0.676509f,0.0192995f, 0.679578f,0.0185091f, +0.682611f,0.0177335f, 0.685693f,0.016999f, 0.688773f,0.0162882f, 0.691764f,0.015578f, 0.694694f,0.0148789f, +0.697613f,0.014206f, 0.700524f,0.013559f, 0.703431f,0.0129381f, 0.706311f,0.0123375f, 0.709138f,0.0117523f, +0.711916f,0.0111845f, 0.714644f,0.0106338f, 0.717296f,0.0100972f, 0.719928f,0.00958603f, 0.722489f,0.00909036f, +0.724969f,0.00861013f, 0.727555f,0.00815463f, 0.730289f,0.00771392f, 0.732961f,0.00728762f, 0.735578f,0.00687821f, +0.738159f,0.00648423f, 0.740766f,0.00610494f, 0.743513f,0.00573966f, 0.746273f,0.00539393f, 0.749033f,0.00506865f, +0.751714f,0.00475373f, 0.754348f,0.00445262f, 0.756937f,0.00416544f, 0.75952f,0.00389349f, 0.762032f,0.00363283f, +0.764462f,0.00338302f, 0.766861f,0.00314873f, 0.769234f,0.00292448f, 0.771723f,0.00271815f, 0.77417f,0.00252365f, +0.776553f,0.00233933f, 0.779003f,0.00216259f, 0.781557f,0.00199987f, 0.784035f,0.00184425f, 0.786393f,0.00169414f, +0.788626f,0.00154943f, 0.790931f,0.00141418f, 0.793258f,0.00129136f, 0.795558f,0.00117753f, 0.797761f,0.00106984f, +0.800009f,0.000970828f, 0.802226f,0.000879702f, 0.80439f,0.000795675f, 0.806408f,0.000715586f, 0.80858f,0.000642172f, +0.810835f,0.000575262f, 0.813049f,0.00051394f, 0.815253f,0.000458683f, 0.81744f,0.00040809f, 0.819564f,0.000359822f, +0.821588f,0.000313735f, 0.82356f,0.000273211f, 0.82564f,0.0002382f, 0.827596f,0.000205378f, 0.82946f,0.000175867f, +0.831376f,0.000148495f, 0.833285f,0.00012537f, 0.835201f,0.000104173f, 0.837302f,8.59917e-05f, 0.839265f,6.94333e-05f, +0.840947f,5.42716e-05f, 0.843071f,4.1856e-05f, 0.844926f,3.07951e-05f, + +0.703505f,0.105142f, 0.691771f,0.102229f, 0.681288f,0.0994604f, 0.671919f,0.0968138f, 0.663544f,0.0942795f, +0.656064f,0.0918552f, 0.649389f,0.0895288f, 0.643442f,0.0872844f, 0.638155f,0.0851115f, 0.633466f,0.0830006f, +0.629321f,0.0809452f, 0.625682f,0.078974f, 0.6225f,0.0770504f, 0.619738f,0.0751707f, 0.617359f,0.0733275f, +0.615323f,0.0714987f, 0.613617f,0.0697256f, 0.612214f,0.0679954f, 0.611084f,0.0662937f, 0.610217f,0.0646375f, +0.609586f,0.0630103f, 0.609176f,0.0614159f, 0.608963f,0.0598438f, 0.608945f,0.0583102f, 0.609109f,0.0568011f, +0.609421f,0.0553024f, 0.609898f,0.0538348f, 0.610548f,0.0524074f, 0.611324f,0.0510046f, 0.612217f,0.0496294f, +0.613215f,0.0482762f, 0.614298f,0.0469361f, 0.615449f,0.045603f, 0.616663f,0.0442862f, 0.618104f,0.0430095f, +0.619615f,0.0417596f, 0.621224f,0.0405642f, 0.622868f,0.0393746f, 0.624539f,0.0381943f, 0.626254f,0.0370284f, +0.62798f,0.0358723f, 0.629705f,0.0347288f, 0.631454f,0.033621f, 0.633243f,0.0325313f, 0.63521f,0.031462f, +0.637393f,0.0304231f, 0.639585f,0.0294126f, 0.641761f,0.0284207f, 0.643923f,0.0274519f, 0.646521f,0.0265137f, +0.649303f,0.0255949f, 0.652255f,0.0246742f, 0.655186f,0.0237614f, 0.658135f,0.0228762f, 0.661062f,0.0220042f, +0.663976f,0.0211505f, 0.666897f,0.0203238f, 0.669802f,0.0195156f, 0.672707f,0.0187323f, 0.675583f,0.0179641f, +0.678446f,0.0172174f, 0.681296f,0.0164919f, 0.684121f,0.0157855f, 0.687013f,0.0151235f, 0.689856f,0.0144712f, +0.692607f,0.013821f, 0.695311f,0.0131874f, 0.697994f,0.0125769f, 0.700671f,0.0119928f, 0.703316f,0.0114285f, +0.705936f,0.0108856f, 0.708501f,0.0103583f, 0.710998f,0.00984559f, 0.713423f,0.00934782f, 0.715875f,0.00886752f, +0.718558f,0.00840892f, 0.72118f,0.00796463f, 0.723741f,0.00753552f, 0.726351f,0.00712912f, 0.728959f,0.00673526f, +0.731701f,0.00635446f, 0.734439f,0.00598986f, 0.737126f,0.00563915f, 0.739744f,0.00529966f, 0.742353f,0.00497566f, +0.744952f,0.00467061f, 0.747545f,0.00438322f, 0.750051f,0.00410493f, 0.752478f,0.00383714f, 0.754866f,0.00358383f, +0.757263f,0.00334376f, 0.759684f,0.00311372f, 0.762034f,0.00289429f, 0.764349f,0.00268871f, 0.766768f,0.00249366f, +0.769264f,0.00231179f, 0.771752f,0.00214197f, 0.774186f,0.00198107f, 0.776541f,0.00182786f, 0.779049f,0.00168693f, +0.78147f,0.00155207f, 0.783762f,0.00142148f, 0.785945f,0.00129611f, 0.788158f,0.00118035f, 0.790333f,0.00107369f, +0.792425f,0.000973648f, 0.794472f,0.000881286f, 0.796615f,0.000797121f, 0.798904f,0.000720208f, 0.801117f,0.000647848f, +0.803279f,0.000580064f, 0.805369f,0.000517656f, 0.807394f,0.000460733f, 0.809558f,0.000409228f, 0.811718f,0.000363156f, +0.813787f,0.000320173f, 0.815776f,0.000278868f, 0.817613f,0.000241089f, 0.81952f,0.000208378f, 0.821525f,0.000179189f, +0.823321f,0.000152165f, 0.825108f,0.000126886f, 0.827172f,0.000105743f, 0.829194f,8.69501e-05f, 0.831118f,7.0772e-05f, +0.833184f,5.60331e-05f, 0.835029f,4.2742e-05f, 0.836968f,3.16881e-05f, + +0.705506f,0.101727f, 0.694164f,0.0989417f, 0.683994f,0.0962867f, 0.67487f,0.0937428f, 0.666683f,0.0913008f, +0.659341f,0.0889606f, 0.652763f,0.0867102f, 0.646876f,0.0845391f, 0.641616f,0.082433f, 0.636927f,0.08039f, +0.632756f,0.0783887f, 0.629069f,0.0764705f, 0.625821f,0.0746021f, 0.622974f,0.0727731f, 0.620498f,0.0709874f, +0.618353f,0.0692165f, 0.61652f,0.0674845f, 0.614976f,0.0657925f, 0.613702f,0.0641398f, 0.612674f,0.0625189f, +0.611878f,0.0609379f, 0.61129f,0.05938f, 0.610899f,0.0578529f, 0.610705f,0.0563648f, 0.610676f,0.0548988f, +0.610811f,0.0534552f, 0.611117f,0.0520342f, 0.61156f,0.0506469f, 0.612119f,0.0492807f, 0.612789f,0.0479395f, +0.613561f,0.0466241f, 0.614425f,0.0453329f, 0.615361f,0.0440529f, 0.616511f,0.0427923f, 0.617722f,0.0415484f, +0.618999f,0.0403346f, 0.620331f,0.0391457f, 0.62177f,0.0380144f, 0.623243f,0.0368899f, 0.624733f,0.0357757f, +0.626229f,0.034671f, 0.627715f,0.0335737f, 0.629278f,0.0324913f, 0.63108f,0.0314505f, 0.633016f,0.0304224f, +0.634934f,0.0294059f, 0.636853f,0.0284164f, 0.638796f,0.0274654f, 0.641281f,0.026532f, 0.643927f,0.0256187f, +0.64672f,0.0247306f, 0.649543f,0.0238685f, 0.652345f,0.0230112f, 0.655112f,0.022157f, 0.657873f,0.0213204f, +0.66064f,0.0205075f, 0.663377f,0.0197062f, 0.666105f,0.0189259f, 0.668841f,0.0181722f, 0.67155f,0.0174336f, +0.674249f,0.0167163f, 0.676915f,0.0160145f, 0.679568f,0.0153349f, 0.68218f,0.014669f, 0.684799f,0.0140323f, +0.687441f,0.0134264f, 0.69002f,0.0128282f, 0.692516f,0.0122361f, 0.694975f,0.0116645f, 0.697391f,0.0111115f, +0.699799f,0.0105847f, 0.702156f,0.010075f, 0.704561f,0.00958318f, 0.707102f,0.00910781f, 0.709654f,0.00864593f, +0.712186f,0.00820026f, 0.714761f,0.00777211f, 0.717311f,0.00736066f, 0.719947f,0.00696328f, 0.722644f,0.00658261f, +0.725362f,0.00622053f, 0.728022f,0.0058694f, 0.730619f,0.00552939f, 0.733187f,0.00520527f, 0.735713f,0.00489517f, +0.738142f,0.00459322f, 0.740517f,0.00430509f, 0.742891f,0.00403602f, 0.745276f,0.00378139f, 0.747681f,0.00353465f, +0.750009f,0.00329766f, 0.752326f,0.00307265f, 0.754711f,0.00286149f, 0.75715f,0.00265919f, 0.759528f,0.00246628f, +0.761893f,0.00228668f, 0.764216f,0.00211786f, 0.766629f,0.00195886f, 0.769018f,0.00180957f, 0.771373f,0.00166914f, +0.773738f,0.00153762f, 0.776122f,0.00141539f, 0.778416f,0.00129863f, 0.780563f,0.0011853f, 0.782581f,0.00107731f, +0.78461f,0.000978618f, 0.786835f,0.00088686f, 0.788995f,0.000799745f, 0.791134f,0.00072019f, 0.793295f,0.000649336f, +0.795406f,0.000584206f, 0.797445f,0.000521984f, 0.799509f,0.000464779f, 0.80149f,0.000412317f, 0.803488f,0.000364266f, +0.805502f,0.00032151f, 0.807467f,0.000282467f, 0.809445f,0.000245608f, 0.811297f,0.000211179f, 0.813067f,0.000180981f, +0.81518f,0.000154908f, 0.817314f,0.000130541f, 0.819219f,0.000108042f, 0.820939f,8.84376e-05f, 0.822987f,7.15728e-05f, +0.825078f,5.73345e-05f, 0.8269f,4.40668e-05f, 0.828809f,3.25647e-05f, + +0.707293f,0.098432f, 0.696328f,0.0957662f, 0.68646f,0.0932191f, 0.677576f,0.090773f, 0.669575f,0.0884199f, +0.662371f,0.0861595f, 0.65589f,0.0839831f, 0.650065f,0.0818821f, 0.644836f,0.0798411f, 0.640152f,0.0778602f, +0.635962f,0.0759206f, 0.63223f,0.0740461f, 0.628921f,0.0722312f, 0.625997f,0.070455f, 0.623428f,0.0687179f, +0.621181f,0.0670068f, 0.619226f,0.0653122f, 0.617553f,0.0636659f, 0.616139f,0.06206f, 0.614957f,0.0604742f, +0.613999f,0.0589294f, 0.613249f,0.0574195f, 0.612698f,0.0559412f, 0.612319f,0.0544885f, 0.612115f,0.0530698f, +0.612098f,0.0516786f, 0.612214f,0.0503071f, 0.612445f,0.0489472f, 0.6128f,0.0476228f, 0.613258f,0.0463189f, +0.613813f,0.04504f, 0.614453f,0.0437834f, 0.615327f,0.0425639f, 0.616265f,0.04135f, 0.617258f,0.0401495f, +0.618311f,0.0389685f, 0.619441f,0.0378212f, 0.620617f,0.0366991f, 0.621862f,0.0356249f, 0.623116f,0.0345555f, +0.624399f,0.0334989f, 0.625759f,0.0324558f, 0.62735f,0.0314204f, 0.629043f,0.0303993f, 0.630761f,0.0294138f, +0.63247f,0.0284452f, 0.634236f,0.0274852f, 0.636471f,0.0265456f, 0.638977f,0.0256422f, 0.641561f,0.0247653f, +0.644149f,0.0239016f, 0.646757f,0.0230608f, 0.649403f,0.0222506f, 0.652041f,0.021451f, 0.65464f,0.0206524f, +0.657207f,0.0198619f, 0.659793f,0.0191005f, 0.662346f,0.0183493f, 0.664889f,0.0176174f, 0.667428f,0.0169082f, +0.669946f,0.0162161f, 0.672455f,0.0155461f, 0.674924f,0.014889f, 0.677365f,0.0142502f, 0.679774f,0.0136283f, +0.682149f,0.0130244f, 0.684546f,0.012453f, 0.68691f,0.0118979f, 0.689183f,0.0113482f, 0.691387f,0.0108106f, +0.693653f,0.010294f, 0.695976f,0.00979427f, 0.698486f,0.00932158f, 0.700945f,0.00886304f, 0.703471f,0.0084213f, +0.705942f,0.00799242f, 0.708463f,0.00757787f, 0.711123f,0.00717992f, 0.713766f,0.00679971f, 0.716364f,0.00643206f, +0.718922f,0.0060782f, 0.721458f,0.00574098f, 0.723936f,0.00541508f, 0.726374f,0.00510177f, 0.728744f,0.00479943f, +0.731076f,0.00451165f, 0.733379f,0.00423618f, 0.735718f,0.00396851f, 0.738047f,0.0037143f, 0.740409f,0.00347802f, +0.742728f,0.00325197f, 0.74515f,0.00303417f, 0.747512f,0.00282581f, 0.749815f,0.00262774f, 0.752073f,0.00244046f, +0.754395f,0.00226232f, 0.756653f,0.0020917f, 0.758936f,0.00193478f, 0.761292f,0.00178929f, 0.763587f,0.00165082f, +0.765844f,0.00152108f, 0.768037f,0.00139854f, 0.770221f,0.00128597f, 0.772355f,0.00118006f, 0.774707f,0.00107897f, +0.776942f,0.00098093f, 0.779096f,0.000889011f, 0.781223f,0.000805146f, 0.78325f,0.000726298f, 0.785124f,0.000651121f, +0.787147f,0.000583598f, 0.789214f,0.000524146f, 0.791188f,0.000467886f, 0.79314f,0.000414952f, 0.795084f,0.000366796f, +0.796986f,0.000322768f, 0.798997f,0.000283368f, 0.800965f,0.000248044f, 0.802852f,0.000214563f, 0.804963f,0.000183566f, +0.807072f,0.000156508f, 0.809134f,0.000133093f, 0.810974f,0.000111128f, 0.812944f,9.10149e-05f, 0.814767f,7.33264e-05f, +0.81653f,5.7967e-05f, 0.818433f,4.47581e-05f, 0.820453f,3.34206e-05f, + +0.70887f,0.0952519f, 0.698268f,0.092699f, 0.688694f,0.0902539f, 0.680043f,0.087901f, 0.672224f,0.0856334f, +0.665157f,0.0834494f, 0.658774f,0.0813434f, 0.653013f,0.0793097f, 0.647818f,0.0773317f, 0.643142f,0.0754103f, +0.638937f,0.0735318f, 0.635167f,0.0717009f, 0.631802f,0.0699354f, 0.628807f,0.0682102f, 0.626149f,0.0665188f, +0.623805f,0.0648634f, 0.621739f,0.0632174f, 0.619942f,0.0616132f, 0.618389f,0.0600407f, 0.617067f,0.0585057f, +0.615954f,0.0569937f, 0.615056f,0.0555312f, 0.614338f,0.054095f, 0.613786f,0.0526815f, 0.613442f,0.0513102f, +0.613242f,0.049964f, 0.613174f,0.0486364f, 0.61322f,0.0473249f, 0.613371f,0.0460317f, 0.613625f,0.0447685f, +0.613965f,0.0435228f, 0.614526f,0.0423117f, 0.615182f,0.0411196f, 0.615914f,0.0399551f, 0.616718f,0.0388022f, +0.617572f,0.0376643f, 0.618468f,0.0365466f, 0.619405f,0.0354555f, 0.620373f,0.0343884f, 0.621457f,0.033372f, +0.622605f,0.0323682f, 0.624024f,0.0313731f, 0.625522f,0.0303912f, 0.626998f,0.029411f, 0.628463f,0.0284447f, +0.630109f,0.027514f, 0.632171f,0.0265974f, 0.634481f,0.025688f, 0.636806f,0.0247973f, 0.639162f,0.0239334f, +0.641569f,0.0231062f, 0.643975f,0.0222914f, 0.646397f,0.0214975f, 0.648851f,0.0207319f, 0.651303f,0.0199806f, +0.653731f,0.0192365f, 0.656126f,0.0184992f, 0.65851f,0.01778f, 0.660883f,0.0170793f, 0.663229f,0.0163923f, +0.66555f,0.0157222f, 0.667867f,0.0150754f, 0.670149f,0.014443f, 0.672422f,0.013832f, 0.674644f,0.0132334f, +0.676833f,0.0126526f, 0.678967f,0.0120847f, 0.681089f,0.0115418f, 0.68333f,0.0110249f, 0.685526f,0.0105196f, +0.687878f,0.0100204f, 0.690203f,0.00953793f, 0.692579f,0.00907062f, 0.694963f,0.00862236f, 0.697356f,0.00819774f, +0.69992f,0.00778469f, 0.702461f,0.00738656f, 0.704973f,0.00700219f, 0.707429f,0.00662842f, 0.709875f,0.00627251f, +0.712312f,0.00593401f, 0.71469f,0.00560603f, 0.71703f,0.00529181f, 0.719342f,0.00499328f, 0.721566f,0.00470207f, +0.7239f,0.00442121f, 0.726235f,0.00415298f, 0.72853f,0.00389704f, 0.730781f,0.00365323f, 0.733104f,0.00341687f, +0.735436f,0.00319379f, 0.737783f,0.00298701f, 0.740055f,0.00278772f, 0.742343f,0.00259491f, 0.744607f,0.00241133f, +0.746851f,0.00223815f, 0.749105f,0.00207324f, 0.751292f,0.00191604f, 0.75342f,0.00176746f, 0.755525f,0.00162941f, +0.757655f,0.00150327f, 0.75973f,0.00138266f, 0.761969f,0.00127004f, 0.764255f,0.0011645f, 0.766551f,0.00106807f, +0.768775f,0.000976551f, 0.770896f,0.000888972f, 0.772876f,0.000804834f, 0.774861f,0.000727042f, 0.77691f,0.000655918f, +0.778806f,0.000587813f, 0.780684f,0.000523559f, 0.782662f,0.000467814f, 0.784656f,0.000417463f, 0.78658f,0.000369376f, +0.788541f,0.00032473f, 0.790464f,0.000285049f, 0.792419f,0.000248537f, 0.794677f,0.000216898f, 0.796781f,0.000187108f, +0.79864f,0.000158592f, 0.800543f,0.000134056f, 0.802691f,0.000113168f, 0.804645f,9.37254e-05f, 0.806448f,7.56165e-05f, +0.808226f,5.96623e-05f, 0.810157f,4.63345e-05f, 0.811907f,3.42564e-05f, + +0.710241f,0.0921832f, 0.699988f,0.0897366f, 0.690698f,0.0873881f, 0.682275f,0.0851239f, 0.674634f,0.0829379f, +0.667703f,0.0808266f, 0.661418f,0.078789f, 0.655723f,0.0768192f, 0.650565f,0.0749023f, 0.6459f,0.0730387f, +0.641685f,0.071219f, 0.637881f,0.0694335f, 0.634465f,0.067715f, 0.631402f,0.0660377f, 0.628663f,0.0643936f, +0.626224f,0.0627838f, 0.624057f,0.0611944f, 0.622138f,0.0596228f, 0.620457f,0.0580928f, 0.618999f,0.0566006f, +0.617752f,0.0551369f, 0.616695f,0.0537048f, 0.615815f,0.052308f, 0.61514f,0.0509503f, 0.614627f,0.0496196f, +0.614253f,0.048316f, 0.614003f,0.0470308f, 0.613859f,0.0457581f, 0.613815f,0.0445018f, 0.613866f,0.0432714f, +0.614121f,0.0420742f, 0.614489f,0.040891f, 0.614942f,0.039737f, 0.615487f,0.0386096f, 0.616095f,0.0375065f, +0.616734f,0.036408f, 0.617412f,0.0353261f, 0.618127f,0.034269f, 0.618941f,0.0332401f, 0.619815f,0.032236f, +0.621026f,0.0312728f, 0.62231f,0.030323f, 0.623591f,0.0293808f, 0.624867f,0.0284509f, 0.626334f,0.0275246f, +0.628212f,0.0266061f, 0.630349f,0.0257263f, 0.632502f,0.024862f, 0.634653f,0.0240064f, 0.636799f,0.0231615f, +0.638954f,0.0223349f, 0.641171f,0.0215499f, 0.643405f,0.0207856f, 0.645635f,0.0200357f, 0.647884f,0.0193094f, +0.650147f,0.0186045f, 0.652394f,0.0179096f, 0.654606f,0.0172218f, 0.656782f,0.0165433f, 0.658961f,0.0158888f, +0.661103f,0.0152453f, 0.663222f,0.0146195f, 0.665311f,0.01401f, 0.667368f,0.0134165f, 0.669404f,0.0128434f, +0.671415f,0.0122849f, 0.673491f,0.0117426f, 0.675517f,0.0112122f, 0.677638f,0.0106995f, 0.679907f,0.0102145f, +0.682261f,0.00974352f, 0.684575f,0.00928448f, 0.68682f,0.00883402f, 0.689188f,0.00840284f, 0.691586f,0.00798122f, +0.693981f,0.00757942f, 0.696371f,0.00719604f, 0.698723f,0.00682464f, 0.701037f,0.00646628f, 0.7033f,0.00611914f, +0.705517f,0.00578463f, 0.707707f,0.00546561f, 0.70987f,0.00516185f, 0.712176f,0.00487007f, 0.714498f,0.00459225f, +0.716798f,0.00432854f, 0.718991f,0.00406928f, 0.721218f,0.00381987f, 0.72351f,0.00358247f, 0.725755f,0.00335571f, +0.727942f,0.00313832f, 0.730142f,0.00292915f, 0.732411f,0.00273504f, 0.734714f,0.00255347f, 0.736993f,0.00237835f, +0.739178f,0.00220876f, 0.741315f,0.0020485f, 0.743403f,0.00189705f, 0.745446f,0.00175199f, 0.7474f,0.00161344f, +0.749449f,0.00148427f, 0.751637f,0.00136484f, 0.753828f,0.00125469f, 0.755971f,0.00115065f, 0.758078f,0.00105332f, +0.760156f,0.000963581f, 0.762208f,0.000880831f, 0.764307f,0.000801302f, 0.766286f,0.00072504f, 0.768252f,0.000653897f, +0.770299f,0.00058879f, 0.772315f,0.000528209f, 0.774194f,0.000469829f, 0.776145f,0.000416847f, 0.778194f,0.000371497f, +0.780079f,0.000328237f, 0.782131f,0.000287833f, 0.784216f,0.000251095f, 0.786226f,0.000218016f, 0.788186f,0.000188508f, +0.790212f,0.00016209f, 0.792115f,0.00013645f, 0.793921f,0.000113981f, 0.795905f,9.49505e-05f, 0.797807f,7.75176e-05f, +0.799655f,6.15887e-05f, 0.801478f,4.73818e-05f, 0.803178f,3.50677e-05f, + +0.711411f,0.0892218f, 0.701494f,0.0868757f, 0.692478f,0.0846186f, 0.684276f,0.0824387f, 0.67681f,0.0803306f, +0.670013f,0.078289f, 0.663826f,0.0763174f, 0.658198f,0.0744081f, 0.653079f,0.0725508f, 0.648427f,0.0707421f, +0.644206f,0.068979f, 0.640374f,0.0672436f, 0.636911f,0.065566f, 0.633786f,0.0639347f, 0.630971f,0.0623374f, +0.628441f,0.06077f, 0.626175f,0.0592309f, 0.624144f,0.0577009f, 0.62234f,0.0562119f, 0.62076f,0.0547605f, +0.619379f,0.053346f, 0.618169f,0.0519459f, 0.617162f,0.0505915f, 0.616342f,0.0492805f, 0.615665f,0.0479918f, +0.615114f,0.0467219f, 0.614686f,0.0454771f, 0.614361f,0.0442453f, 0.614128f,0.0430281f, 0.614066f,0.0418302f, +0.614166f,0.0406705f, 0.614358f,0.0395344f, 0.614629f,0.0384162f, 0.614967f,0.0373217f, 0.615365f,0.0362506f, +0.615811f,0.0352021f, 0.616277f,0.034159f, 0.616845f,0.0331333f, 0.617465f,0.0321343f, 0.618404f,0.0311608f, +0.619424f,0.0302086f, 0.620488f,0.0292933f, 0.621563f,0.0283954f, 0.62288f,0.0275057f, 0.624629f,0.0266244f, +0.626555f,0.0257514f, 0.62848f,0.0248848f, 0.630445f,0.0240484f, 0.632433f,0.0232326f, 0.634425f,0.0224295f, +0.636405f,0.0216344f, 0.638379f,0.0208524f, 0.640375f,0.0200971f, 0.642417f,0.0193763f, 0.644458f,0.0186702f, +0.646502f,0.0179832f, 0.648555f,0.0173172f, 0.650595f,0.0166643f, 0.652609f,0.0160213f, 0.654586f,0.0153878f, +0.656546f,0.0147722f, 0.658476f,0.014171f, 0.660387f,0.0135854f, 0.662283f,0.0130161f, 0.664217f,0.0124619f, +0.66615f,0.0119248f, 0.668074f,0.0114063f, 0.670213f,0.0108998f, 0.672424f,0.0104099f, 0.674576f,0.00992772f, +0.676734f,0.00946948f, 0.678935f,0.0090325f, 0.681261f,0.00860268f, 0.683542f,0.00818273f, 0.685789f,0.00777634f, +0.688029f,0.00738813f, 0.690205f,0.00700831f, 0.692387f,0.00664918f, 0.694541f,0.00630474f, 0.696626f,0.00596894f, +0.698706f,0.00564742f, 0.70085f,0.00533484f, 0.70303f,0.00503599f, 0.705201f,0.00475301f, 0.707323f,0.00448093f, +0.709439f,0.00422097f, 0.711703f,0.00397505f, 0.713936f,0.00373991f, 0.716064f,0.00350862f, 0.718204f,0.00328768f, +0.720396f,0.00307769f, 0.722598f,0.00287724f, 0.724762f,0.00268398f, 0.72689f,0.00250106f, 0.729025f,0.00233171f, +0.731179f,0.00217177f, 0.733251f,0.00201768f, 0.735246f,0.00186954f, 0.73731f,0.00173042f, 0.739476f,0.00159897f, +0.741589f,0.00147283f, 0.743601f,0.00135174f, 0.745577f,0.00123913f, 0.747556f,0.00113641f, 0.749511f,0.00104075f, +0.751483f,0.000950769f, 0.753524f,0.00086783f, 0.755584f,0.000792203f, 0.757751f,0.000721577f, 0.759849f,0.000652959f, +0.761825f,0.000587427f, 0.763785f,0.000527461f, 0.765823f,0.000473116f, 0.767679f,0.00042072f, 0.769457f,0.000370875f, +0.77158f,0.000328483f, 0.773705f,0.000290341f, 0.77563f,0.000253607f, 0.777472f,0.000219266f, 0.779436f,0.000189739f, +0.781396f,0.000162958f, 0.783308f,0.00013883f, 0.785101f,0.000115781f, 0.786831f,9.53734e-05f, 0.788822f,7.84553e-05f, +0.790683f,6.25518e-05f, 0.792428f,4.82875e-05f, 0.794274f,3.58575e-05f, + +0.712383f,0.0863641f, 0.70279f,0.0841127f, 0.694039f,0.0819423f, 0.686051f,0.0798424f, 0.678756f,0.0778088f, +0.672091f,0.0758352f, 0.666002f,0.0739262f, 0.660441f,0.0720753f, 0.655363f,0.0702752f, 0.650729f,0.06852f, +0.646503f,0.0668091f, 0.642649f,0.0651279f, 0.639141f,0.0634874f, 0.635958f,0.0619002f, 0.633071f,0.0603452f, +0.630458f,0.0588223f, 0.628095f,0.057327f, 0.625961f,0.0558479f, 0.624048f,0.054397f, 0.622343f,0.0529867f, +0.620829f,0.0516117f, 0.619496f,0.0502621f, 0.618363f,0.0489478f, 0.617381f,0.0476643f, 0.616542f,0.0464143f, +0.615825f,0.0451822f, 0.61522f,0.0439707f, 0.614718f,0.04278f, 0.614359f,0.0416044f, 0.614182f,0.04045f, +0.614105f,0.0393194f, 0.61413f,0.0382279f, 0.614217f,0.0371518f, 0.614356f,0.0360908f, 0.614544f,0.035051f, +0.614772f,0.0340311f, 0.615125f,0.0330355f, 0.615505f,0.032047f, 0.616182f,0.0310743f, 0.616957f,0.0301242f, +0.617757f,0.0291983f, 0.618574f,0.0282954f, 0.619686f,0.0274255f, 0.621279f,0.0265765f, 0.62303f,0.0257372f, +0.624793f,0.0249057f, 0.62656f,0.0240807f, 0.628328f,0.0232639f, 0.630117f,0.0224692f, 0.631937f,0.0217006f, +0.633754f,0.020943f, 0.635564f,0.020196f, 0.63736f,0.01946f, 0.639152f,0.0187407f, 0.640981f,0.0180545f, +0.642811f,0.0173861f, 0.64465f,0.0167389f, 0.646502f,0.0161157f, 0.64832f,0.0154998f, 0.650105f,0.0148936f, +0.651906f,0.0143041f, 0.653673f,0.0137268f, 0.655466f,0.0131674f, 0.657275f,0.01262f, 0.659094f,0.0120923f, +0.661001f,0.0115768f, 0.663067f,0.011073f, 0.665151f,0.0105888f, 0.66721f,0.0101195f, 0.669226f,0.00966196f, +0.671362f,0.00921521f, 0.67352f,0.00877991f, 0.675708f,0.00837017f, 0.677873f,0.00797357f, 0.679966f,0.00758218f, +0.682011f,0.00720162f, 0.684034f,0.00683708f, 0.686015f,0.00648461f, 0.688001f,0.00614478f, 0.690049f,0.00582439f, +0.692164f,0.00551471f, 0.694209f,0.00521275f, 0.696215f,0.00492296f, 0.69815f,0.00464156f, 0.700216f,0.00437363f, +0.702332f,0.00412198f, 0.704396f,0.00387935f, 0.706461f,0.00364818f, 0.708648f,0.00343236f, 0.710845f,0.00322253f, +0.712959f,0.0030167f, 0.715055f,0.00282229f, 0.717139f,0.00263632f, 0.719207f,0.00245956f, 0.721198f,0.00228888f, +0.723164f,0.00212888f, 0.725253f,0.00198294f, 0.72737f,0.00184255f, 0.729519f,0.00170809f, 0.731588f,0.00157908f, +0.733619f,0.00145819f, 0.735574f,0.00134308f, 0.737443f,0.00123275f, 0.739245f,0.00112818f, 0.741142f,0.00103095f, +0.743015f,0.00094176f, 0.745031f,0.000858379f, 0.747071f,0.000780849f, 0.749127f,0.000710687f, 0.751177f,0.000646824f, +0.753232f,0.000586224f, 0.755148f,0.00052681f, 0.756955f,0.000471506f, 0.758981f,0.000421356f, 0.761046f,0.000374716f, +0.762912f,0.000329515f, 0.76478f,0.000289169f, 0.766773f,0.000254609f, 0.76863f,0.000221624f, 0.770435f,0.000190294f, +0.772255f,0.000163111f, 0.774103f,0.000138963f, 0.77599f,0.000117344f, 0.77773f,9.65394e-05f, 0.779417f,7.81926e-05f, +0.781401f,6.30488e-05f, 0.783268f,4.89378e-05f, 0.785203f,3.66234e-05f, + +0.713162f,0.0836063f, 0.703879f,0.0814443f, 0.695385f,0.0793562f, 0.687605f,0.0773327f, 0.680477f,0.0753699f, +0.673942f,0.0734621f, 0.66795f,0.0716128f, 0.662457f,0.0698188f, 0.657421f,0.0680742f, 0.652806f,0.0663702f, +0.648578f,0.0647089f, 0.644705f,0.0630793f, 0.641158f,0.061478f, 0.637922f,0.0599317f, 0.634967f,0.0584192f, +0.632273f,0.0569372f, 0.62982f,0.0554838f, 0.627591f,0.0540542f, 0.625572f,0.0526454f, 0.623751f,0.0512778f, +0.622107f,0.0499355f, 0.620676f,0.0486408f, 0.619399f,0.0473622f, 0.618261f,0.0461066f, 0.617259f,0.044884f, +0.61638f,0.0436912f, 0.615606f,0.0425157f, 0.614946f,0.0413596f, 0.614515f,0.0402313f, 0.614193f,0.0391238f, +0.613953f,0.0380342f, 0.613783f,0.0369669f, 0.613683f,0.0359298f, 0.613627f,0.034905f, 0.61361f,0.0338958f, +0.613722f,0.0329101f, 0.613879f,0.0319443f, 0.61432f,0.0309985f, 0.614869f,0.0300593f, 0.61543f,0.0291337f, +0.61601f,0.0282316f, 0.616859f,0.0273507f, 0.618211f,0.0264901f, 0.619746f,0.0256636f, 0.621324f,0.0248599f, +0.622923f,0.0240683f, 0.62453f,0.0232841f, 0.626138f,0.0225072f, 0.627737f,0.0217352f, 0.629351f,0.020983f, +0.630995f,0.0202585f, 0.632634f,0.019545f, 0.634256f,0.01884f, 0.635865f,0.0181469f, 0.637464f,0.0174696f, +0.639072f,0.0168161f, 0.640686f,0.0161841f, 0.642314f,0.0155726f, 0.64398f,0.0149874f, 0.645614f,0.0144118f, +0.647226f,0.0138453f, 0.648914f,0.0132919f, 0.650586f,0.0127509f, 0.652246f,0.0122297f, 0.654163f,0.01172f, +0.656126f,0.0112268f, 0.658065f,0.0107477f, 0.659958f,0.0102778f, 0.661874f,0.00982179f, 0.663963f,0.00938404f, +0.666024f,0.00895836f, 0.668054f,0.00854481f, 0.670019f,0.00813726f, 0.67198f,0.00774854f, 0.673951f,0.00738022f, +0.675872f,0.00701998f, 0.677772f,0.00666503f, 0.679631f,0.00632284f, 0.681629f,0.00599611f, 0.683567f,0.00567745f, +0.685499f,0.00537536f, 0.687427f,0.00508936f, 0.689377f,0.00481198f, 0.691383f,0.00454281f, 0.693326f,0.00428179f, +0.695221f,0.00403081f, 0.69722f,0.00379143f, 0.699306f,0.00356645f, 0.701362f,0.00334984f, 0.703477f,0.00314737f, +0.705617f,0.00295683f, 0.707676f,0.00277065f, 0.709647f,0.00258947f, 0.711584f,0.0024181f, 0.713524f,0.00225423f, +0.715464f,0.00209784f, 0.717489f,0.00194774f, 0.719528f,0.00180926f, 0.721597f,0.0016821f, 0.723601f,0.00155922f, +0.725513f,0.00144092f, 0.727356f,0.00132902f, 0.729242f,0.00122406f, 0.731123f,0.00112373f, 0.733009f,0.00102672f, +0.734936f,0.000936485f, 0.736836f,0.000853588f, 0.738679f,0.000776015f, 0.740472f,0.000703541f, 0.742377f,0.000637728f, +0.744251f,0.000577796f, 0.746251f,0.000523417f, 0.748307f,0.000470804f, 0.750271f,0.00042023f, 0.752205f,0.000373946f, +0.754146f,0.000332036f, 0.755972f,0.000291338f, 0.757696f,0.000253909f, 0.759647f,0.000222258f, 0.761443f,0.000192665f, +0.763131f,0.000164462f, 0.764883f,0.000139288f, 0.766701f,0.000117417f, 0.768498f,9.78805e-05f, 0.77025f,7.91201e-05f, +0.77206f,6.31433e-05f, 0.774006f,4.94429e-05f, 0.775971f,3.73608e-05f, + +0.713752f,0.0809449f, 0.704768f,0.0788675f, 0.69652f,0.0768574f, 0.688943f,0.0749068f, 0.681977f,0.0730113f, +0.675569f,0.0711667f, 0.669674f,0.0693752f, 0.664249f,0.0676365f, 0.659257f,0.0659437f, 0.654662f,0.0642894f, +0.650435f,0.062676f, 0.646546f,0.0610958f, 0.642965f,0.0595373f, 0.639677f,0.0580278f, 0.63666f,0.0565571f, +0.633889f,0.0551127f, 0.631348f,0.0536985f, 0.629036f,0.0523225f, 0.626918f,0.0509619f, 0.624978f,0.0496239f, +0.623236f,0.0483274f, 0.621681f,0.0470696f, 0.620268f,0.0458309f, 0.618984f,0.0446084f, 0.61782f,0.0434075f, +0.616778f,0.0422444f, 0.61584f,0.0411046f, 0.615132f,0.039995f, 0.614568f,0.0389142f, 0.614088f,0.0378503f, +0.61367f,0.0367953f, 0.61331f,0.0357551f, 0.613012f,0.0347408f, 0.61277f,0.0337554f, 0.612648f,0.032784f, +0.612578f,0.0318326f, 0.612752f,0.0308964f, 0.613089f,0.0299782f, 0.613449f,0.0290775f, 0.613812f,0.0281844f, +0.614406f,0.0273026f, 0.61555f,0.026448f, 0.616847f,0.0256149f, 0.61817f,0.0247969f, 0.619535f,0.0240061f, +0.620947f,0.0232425f, 0.62238f,0.0224926f, 0.623826f,0.0217546f, 0.625269f,0.0210229f, 0.626694f,0.0202945f, +0.628123f,0.0195818f, 0.629586f,0.0188995f, 0.631035f,0.0182268f, 0.632472f,0.0175654f, 0.633884f,0.0169129f, +0.635297f,0.0162748f, 0.63672f,0.0156563f, 0.638154f,0.015063f, 0.639569f,0.0144844f, 0.641101f,0.01393f, +0.642675f,0.0133987f, 0.644194f,0.0128711f, 0.645774f,0.012351f, 0.647574f,0.0118436f, 0.649361f,0.0113512f, +0.651142f,0.0108766f, 0.652881f,0.0104113f, 0.654782f,0.00996593f, 0.656719f,0.00953017f, 0.658612f,0.00910212f, +0.660497f,0.00869108f, 0.662373f,0.00829588f, 0.66421f,0.00791111f, 0.666017f,0.00753589f, 0.667816f,0.00716899f, +0.669638f,0.00682445f, 0.671526f,0.00649128f, 0.673419f,0.00616555f, 0.675238f,0.00584578f, 0.677027f,0.00553948f, +0.678785f,0.00524597f, 0.680666f,0.00495936f, 0.682581f,0.00469197f, 0.68447f,0.00443617f, 0.686425f,0.00418852f, +0.688457f,0.00394912f, 0.690431f,0.00371675f, 0.692411f,0.00349391f, 0.694359f,0.00328128f, 0.696314f,0.00308174f, +0.698217f,0.00289022f, 0.700125f,0.00271183f, 0.70205f,0.00254197f, 0.703942f,0.00237553f, 0.70589f,0.00221684f, +0.707881f,0.00206583f, 0.709814f,0.00192147f, 0.711658f,0.00178184f, 0.713459f,0.00165036f, 0.71529f,0.00153061f, +0.717168f,0.00141955f, 0.719092f,0.00131235f, 0.721021f,0.00120967f, 0.723018f,0.00111317f, 0.724963f,0.00102236f, +0.726796f,0.000934932f, 0.728513f,0.000851481f, 0.730237f,0.00077337f, 0.731973f,0.000701986f, 0.73364f,0.000634334f, +0.735413f,0.000571387f, 0.737384f,0.000516036f, 0.739364f,0.000465339f, 0.741349f,0.000418268f, 0.743249f,0.000372752f, +0.745124f,0.000330463f, 0.747023f,0.000292823f, 0.748857f,0.000256534f, 0.750458f,0.000222017f, 0.752298f,0.000193234f, +0.754136f,0.000166559f, 0.75585f,0.000141354f, 0.757477f,0.000118502f, 0.759367f,9.86955e-05f, 0.761311f,8.11187e-05f, +0.763006f,6.46228e-05f, 0.764815f,5.05408e-05f, 0.766586f,3.80665e-05f, + +0.714157f,0.0783765f, 0.705459f,0.0763791f, 0.69745f,0.074443f, 0.690068f,0.0725617f, 0.683261f,0.0707306f, +0.676978f,0.0689467f, 0.671177f,0.0672116f, 0.66582f,0.0655248f, 0.660872f,0.0638818f, 0.656301f,0.0622757f, +0.652077f,0.0607078f, 0.648174f,0.0591748f, 0.644563f,0.0576632f, 0.641228f,0.0561864f, 0.638151f,0.0547536f, +0.635308f,0.0533478f, 0.632694f,0.0519791f, 0.630294f,0.050648f, 0.628077f,0.0493318f, 0.626029f,0.0480278f, +0.624196f,0.046776f, 0.622511f,0.0455467f, 0.620966f,0.0443462f, 0.619543f,0.0431602f, 0.618231f,0.0419917f, +0.617023f,0.0408458f, 0.616018f,0.0397488f, 0.615205f,0.0386844f, 0.614485f,0.0376419f, 0.613836f,0.0366131f, +0.61325f,0.0355979f, 0.612709f,0.0345879f, 0.612217f,0.0335963f, 0.611861f,0.0326394f, 0.611576f,0.0317091f, +0.611482f,0.0307865f, 0.611604f,0.0298827f, 0.611748f,0.0289929f, 0.611911f,0.0281209f, 0.612274f,0.0272649f, +0.613206f,0.0264177f, 0.614277f,0.0255791f, 0.615394f,0.0247683f, 0.616544f,0.0239791f, 0.617711f,0.0232032f, +0.618912f,0.022451f, 0.620152f,0.0217243f, 0.621411f,0.021013f, 0.622682f,0.0203158f, 0.623941f,0.0196234f, +0.625185f,0.0189365f, 0.626422f,0.0182621f, 0.627688f,0.0176177f, 0.628965f,0.0169848f, 0.630245f,0.0163666f, +0.631495f,0.0157569f, 0.632718f,0.0151575f, 0.633987f,0.0145755f, 0.635329f,0.0140145f, 0.636665f,0.0134716f, +0.63799f,0.0129469f, 0.639592f,0.0124469f, 0.641262f,0.0119555f, 0.642894f,0.0114705f, 0.644497f,0.0109967f, +0.646088f,0.0105328f, 0.647877f,0.0100855f, 0.649646f,0.00965033f, 0.651414f,0.00923174f, 0.653176f,0.00882747f, +0.654887f,0.00843003f, 0.656593f,0.00804399f, 0.65833f,0.00767478f, 0.660049f,0.00731946f, 0.66176f,0.00697348f, +0.663543f,0.00663423f, 0.665304f,0.00630835f, 0.667075f,0.00600103f, 0.668782f,0.00569979f, 0.670525f,0.00540493f, +0.672334f,0.00511964f, 0.674115f,0.00484645f, 0.675912f,0.00458256f, 0.677836f,0.00432878f, 0.679806f,0.0040909f, +0.681776f,0.00386269f, 0.683698f,0.00364184f, 0.685567f,0.0034283f, 0.687381f,0.00322239f, 0.689133f,0.00302404f, +0.690869f,0.0028351f, 0.692702f,0.00265752f, 0.694547f,0.00248894f, 0.696543f,0.00233331f, 0.698463f,0.0021818f, +0.700283f,0.00203323f, 0.702072f,0.0018934f, 0.703845f,0.00176068f, 0.705559f,0.00163366f, 0.70727f,0.00151034f, +0.709093f,0.0013965f, 0.711031f,0.00129279f, 0.712961f,0.00119464f, 0.714829f,0.00110115f, 0.71662f,0.00101234f, +0.718367f,0.000928962f, 0.720143f,0.000849818f, 0.721784f,0.000772992f, 0.723494f,0.000701307f, 0.725255f,0.000634954f, +0.727018f,0.000572485f, 0.728786f,0.000514116f, 0.730561f,0.000461112f, 0.732481f,0.000414275f, 0.734373f,0.0003715f, +0.736157f,0.000330227f, 0.737931f,0.000291956f, 0.739636f,0.000257055f, 0.741379f,0.00022441f, 0.743019f,0.000193192f, +0.744777f,0.000166819f, 0.746523f,0.000142649f, 0.748409f,0.000120192f, 0.750223f,9.99049e-05f, 0.752005f,8.22826e-05f, +0.753809f,6.61587e-05f, 0.755372f,5.14556e-05f, 0.757058f,3.87428e-05f, + +0.714381f,0.0758977f, 0.705958f,0.0739761f, 0.698178f,0.0721103f, 0.690986f,0.070295f, 0.684332f,0.0685254f, +0.678172f,0.0667998f, 0.672465f,0.0651193f, 0.667175f,0.0634817f, 0.662272f,0.0618871f, 0.657725f,0.0603277f, +0.653506f,0.0588037f, 0.649591f,0.0573146f, 0.645955f,0.0558492f, 0.642576f,0.0544068f, 0.639441f,0.0530091f, +0.636535f,0.0516458f, 0.633852f,0.0503224f, 0.631363f,0.0490257f, 0.629051f,0.0477521f, 0.626929f,0.0464977f, +0.624978f,0.0452726f, 0.623171f,0.0440767f, 0.621495f,0.0429083f, 0.619937f,0.041758f, 0.618486f,0.0406252f, +0.617169f,0.0395143f, 0.616096f,0.038447f, 0.615134f,0.0374174f, 0.614253f,0.0364071f, 0.613441f,0.0354134f, +0.612685f,0.034432f, 0.611977f,0.0334622f, 0.611373f,0.0325025f, 0.610846f,0.0315633f, 0.61048f,0.030658f, +0.610396f,0.0297737f, 0.610332f,0.0288978f, 0.610289f,0.0280384f, 0.610384f,0.0271929f, 0.61111f,0.0263654f, +0.612004f,0.0255525f, 0.61292f,0.024749f, 0.61385f,0.0239541f, 0.614814f,0.0231828f, 0.615814f,0.0224369f, +0.616827f,0.0217038f, 0.617862f,0.0209902f, 0.618925f,0.020299f, 0.620003f,0.0196244f, 0.621092f,0.018965f, +0.622169f,0.0183122f, 0.623249f,0.0176666f, 0.624323f,0.0170303f, 0.625421f,0.0164224f, 0.626511f,0.0158275f, +0.627613f,0.0152449f, 0.628778f,0.0146755f, 0.629939f,0.0141162f, 0.631074f,0.0135691f, 0.63224f,0.0130408f, +0.633709f,0.0125281f, 0.635174f,0.0120323f, 0.636665f,0.0115618f, 0.638142f,0.0111032f, 0.639698f,0.0106509f, +0.641346f,0.0102083f, 0.642974f,0.00977715f, 0.644578f,0.00935778f, 0.646166f,0.00895219f, 0.64775f,0.00855719f, +0.649389f,0.00818133f, 0.650987f,0.00781444f, 0.652528f,0.0074535f, 0.654171f,0.00710506f, 0.655847f,0.00677312f, +0.657506f,0.00645377f, 0.659124f,0.00614133f, 0.660697f,0.00583633f, 0.66246f,0.00554857f, 0.664197f,0.00527144f, +0.665879f,0.00499885f, 0.66771f,0.00473299f, 0.669582f,0.00447906f, 0.671418f,0.00423434f, 0.673207f,0.00399703f, +0.674989f,0.00377267f, 0.676767f,0.003561f, 0.67849f,0.00335565f, 0.680209f,0.00315912f, 0.681965f,0.00296819f, +0.683687f,0.0027867f, 0.685463f,0.00261112f, 0.687234f,0.00244376f, 0.688973f,0.00228496f, 0.690754f,0.00213804f, +0.692556f,0.0020011f, 0.694249f,0.00186642f, 0.695892f,0.00173593f, 0.697672f,0.00161272f, 0.699435f,0.00149502f, +0.701206f,0.00138219f, 0.702898f,0.00127452f, 0.704601f,0.00117606f, 0.706298f,0.00108561f, 0.708023f,0.000999828f, +0.709713f,0.000918259f, 0.711434f,0.00084131f, 0.713238f,0.000769549f, 0.715051f,0.000700514f, 0.716841f,0.000634623f, +0.718584f,0.000573347f, 0.720394f,0.000516807f, 0.72207f,0.000462855f, 0.723665f,0.000413149f, 0.725349f,0.000369386f, +0.727041f,0.000329109f, 0.728727f,0.000292007f, 0.730424f,0.000257077f, 0.73212f,0.000224981f, 0.733757f,0.000195199f, +0.735347f,0.000166943f, 0.737233f,0.000143014f, 0.739062f,0.000121168f, 0.740744f,0.000100885f, 0.742456f,8.28236e-05f, +0.744198f,6.71102e-05f, 0.74582f,5.23573e-05f, 0.747395f,3.93889e-05f, + +0.714428f,0.0735054f, 0.706269f,0.0716556f, 0.69871f,0.0698565f, 0.691702f,0.0681041f, 0.685197f,0.0663931f, +0.679156f,0.0647238f, 0.673541f,0.0630954f, 0.668319f,0.0615062f, 0.663461f,0.0599578f, 0.658939f,0.0584438f, +0.654726f,0.0569626f, 0.650802f,0.0555151f, 0.647142f,0.0540923f, 0.643724f,0.0526877f, 0.640536f,0.0513236f, +0.637576f,0.0500063f, 0.634819f,0.0487183f, 0.632246f,0.0474566f, 0.629848f,0.046222f, 0.627648f,0.045017f, +0.625586f,0.0438223f, 0.62366f,0.042657f, 0.621856f,0.0415141f, 0.620172f,0.0404023f, 0.61859f,0.0393063f, +0.617249f,0.0382419f, 0.616036f,0.0371986f, 0.614915f,0.0361918f, 0.613873f,0.035209f, 0.612898f,0.0342472f, +0.611978f,0.0332993f, 0.611156f,0.0323672f, 0.610428f,0.0314499f, 0.609761f,0.0305366f, 0.609444f,0.0296435f, +0.609175f,0.0287835f, 0.608937f,0.027942f, 0.608755f,0.0271112f, 0.609259f,0.0262946f, 0.609959f,0.0254945f, +0.610691f,0.0247098f, 0.611449f,0.0239383f, 0.612221f,0.0231755f, 0.613007f,0.0224238f, 0.613814f,0.0216905f, +0.614658f,0.0209854f, 0.615513f,0.0202942f, 0.616383f,0.0196196f, 0.617265f,0.0189621f, 0.618186f,0.0183279f, +0.619131f,0.0177084f, 0.620059f,0.0170954f, 0.62097f,0.0164891f, 0.62189f,0.0158924f, 0.62284f,0.0153198f, +0.623872f,0.0147639f, 0.624863f,0.0142123f, 0.62584f,0.0136758f, 0.626952f,0.0131497f, 0.628251f,0.0126374f, +0.629543f,0.0121408f, 0.630819f,0.0116586f, 0.63208f,0.0111904f, 0.633544f,0.0107424f, 0.635057f,0.0103133f, +0.636555f,0.00989207f, 0.63801f,0.00947612f, 0.639475f,0.00907334f, 0.640956f,0.00868195f, 0.642423f,0.00830432f, +0.64385f,0.00793562f, 0.645316f,0.00758202f, 0.646879f,0.00724081f, 0.648411f,0.00690673f, 0.649903f,0.00658207f, +0.651363f,0.00626835f, 0.652914f,0.00596927f, 0.654529f,0.00568049f, 0.656081f,0.00539626f, 0.657809f,0.00512481f, +0.659637f,0.00486863f, 0.661424f,0.00461896f, 0.663141f,0.00437293f, 0.664824f,0.00413586f, 0.666486f,0.00390875f, +0.668115f,0.00368879f, 0.669701f,0.00347741f, 0.671386f,0.00328027f, 0.673064f,0.00309191f, 0.674716f,0.00290794f, +0.676438f,0.00273187f, 0.678124f,0.00256248f, 0.679809f,0.00240165f, 0.681428f,0.00224674f, 0.682991f,0.00209875f, +0.684519f,0.00195829f, 0.686254f,0.00183003f, 0.688006f,0.00170879f, 0.689766f,0.00158919f, 0.691475f,0.00147574f, +0.693111f,0.0013672f, 0.694677f,0.00126315f, 0.696169f,0.00116303f, 0.697733f,0.00106997f, 0.699347f,0.000984791f, +0.701037f,0.000905461f, 0.702772f,0.00083084f, 0.704626f,0.000760994f, 0.706444f,0.000694739f, 0.708277f,0.000632563f, +0.709994f,0.000572189f, 0.711647f,0.000516185f, 0.713215f,0.000464319f, 0.714777f,0.000415145f, 0.716316f,0.000369063f, +0.717864f,0.000328211f, 0.719502f,0.000291241f, 0.721117f,0.000256926f, 0.722786f,0.000225459f, 0.724469f,0.00019634f, +0.726254f,0.000169316f, 0.727914f,0.000143686f, 0.729527f,0.000121875f, 0.73118f,0.000101937f, 0.732729f,8.33778e-05f, +0.734226f,6.71758e-05f, 0.735963f,5.28547e-05f, 0.737608f,4.00017e-05f, + +0.714303f,0.0711964f, 0.706397f,0.0694146f, 0.69905f,0.0676791f, 0.692219f,0.0659865f, 0.685859f,0.0643318f, +0.679934f,0.0627165f, 0.67441f,0.061138f, 0.669255f,0.0595963f, 0.664442f,0.0580919f, 0.659945f,0.0566212f, +0.655742f,0.0551807f, 0.651809f,0.053773f, 0.648127f,0.0523915f, 0.644674f,0.0510276f, 0.641441f,0.0496978f, +0.638426f,0.0484201f, 0.635599f,0.0471686f, 0.632943f,0.0459396f, 0.630482f,0.0447461f, 0.628187f,0.0435801f, +0.626021f,0.0424216f, 0.623979f,0.0412831f, 0.622058f,0.0401727f, 0.62025f,0.0390914f, 0.618619f,0.0380395f, +0.617184f,0.0370132f, 0.615831f,0.0360028f, 0.614549f,0.0350085f, 0.61335f,0.0340524f, 0.612212f,0.0331155f, +0.611162f,0.0322003f, 0.610234f,0.0313055f, 0.609343f,0.0304226f, 0.608794f,0.0295489f, 0.608307f,0.0286812f, +0.607849f,0.0278333f, 0.607431f,0.0270177f, 0.607656f,0.0262149f, 0.608166f,0.0254286f, 0.608703f,0.0246532f, +0.609276f,0.0238962f, 0.609873f,0.0231523f, 0.61049f,0.022421f, 0.611115f,0.0216976f, 0.61175f,0.0209859f, +0.612399f,0.0202912f, 0.613077f,0.0196228f, 0.613773f,0.0189715f, 0.614507f,0.0183364f, 0.615244f,0.0177159f, +0.615998f,0.0171163f, 0.616793f,0.0165359f, 0.617567f,0.0159605f, 0.618375f,0.0153914f, 0.619202f,0.014829f, +0.620045f,0.0142895f, 0.620927f,0.0137702f, 0.62197f,0.0132553f, 0.623117f,0.0127511f, 0.624239f,0.0122561f, +0.625352f,0.0117758f, 0.626481f,0.0113068f, 0.6278f,0.0108539f, 0.6291f,0.0104119f, 0.630398f,0.00998602f, +0.631745f,0.00958526f, 0.633105f,0.00919074f, 0.634424f,0.00880213f, 0.635711f,0.00842277f, 0.636981f,0.00805399f, +0.638373f,0.00769859f, 0.639788f,0.00735718f, 0.641164f,0.00702436f, 0.642533f,0.00670616f, 0.643858f,0.00639629f, +0.645321f,0.00609222f, 0.646758f,0.00579824f, 0.648317f,0.00551819f, 0.650019f,0.00525044f, 0.651681f,0.00498962f, +0.653284f,0.00473342f, 0.654922f,0.00449346f, 0.656543f,0.00426211f, 0.658111f,0.0040359f, 0.65962f,0.00381495f, +0.661162f,0.00360466f, 0.662703f,0.00340107f, 0.664183f,0.00320344f, 0.665786f,0.00301698f, 0.667463f,0.00284284f, +0.669097f,0.0026751f, 0.670659f,0.00251185f, 0.672154f,0.00235393f, 0.673633f,0.00220463f, 0.675153f,0.00206147f, +0.676728f,0.00192481f, 0.678347f,0.00179475f, 0.679988f,0.00167252f, 0.681649f,0.00156029f, 0.683246f,0.00145219f, +0.684746f,0.00134712f, 0.68629f,0.00124857f, 0.687812f,0.0011535f, 0.6893f,0.00106133f, 0.6908f,0.000973902f, +0.692452f,0.000893153f, 0.694196f,0.000819611f, 0.695934f,0.000750378f, 0.697688f,0.00068596f, 0.699388f,0.000625649f, +0.701019f,0.00056881f, 0.702575f,0.000514336f, 0.704193f,0.000462989f, 0.705725f,0.000415553f, 0.707181f,0.000370676f, +0.708637f,0.000328386f, 0.710114f,0.000290356f, 0.711686f,0.000256369f, 0.713355f,0.0002249f, 0.715154f,0.000196353f, +0.716894f,0.00017023f, 0.718459f,0.000145828f, 0.719883f,0.000122272f, 0.72145f,0.000102702f, 0.722894f,8.43221e-05f, +0.724437f,6.7617e-05f, 0.72613f,5.34941e-05f, 0.727702f,4.05765e-05f, + +0.714009f,0.0689677f, 0.706345f,0.0672504f, 0.699203f,0.0655754f, 0.692543f,0.0639398f, 0.686324f,0.0623392f, +0.680512f,0.0607754f, 0.675075f,0.0592453f, 0.669986f,0.0577495f, 0.665219f,0.0562886f, 0.660749f,0.0548585f, +0.656554f,0.0534567f, 0.652616f,0.0520865f, 0.648914f,0.0507447f, 0.64543f,0.0494225f, 0.642158f,0.0481333f, +0.639086f,0.046887f, 0.636191f,0.0456682f, 0.633465f,0.0444735f, 0.630937f,0.04332f, 0.628547f,0.0421867f, +0.626283f,0.0410657f, 0.624136f,0.0399605f, 0.622102f,0.0388819f, 0.620172f,0.0378233f, 0.618526f,0.0368166f, +0.616962f,0.0358245f, 0.615472f,0.0348449f, 0.614048f,0.0338796f, 0.612688f,0.0329361f, 0.611403f,0.0320272f, +0.610272f,0.0311454f, 0.609184f,0.0302794f, 0.608357f,0.0294271f, 0.607692f,0.0285864f, 0.607049f,0.0277539f, +0.606422f,0.0269299f, 0.606289f,0.0261262f, 0.606613f,0.0253551f, 0.606965f,0.0245928f, 0.607346f,0.0238443f, +0.607754f,0.0231089f, 0.608191f,0.0223918f, 0.608644f,0.0216862f, 0.609109f,0.0209914f, 0.60958f,0.0203065f, +0.610049f,0.0196299f, 0.610561f,0.0189745f, 0.611106f,0.0183443f, 0.611659f,0.0177305f, 0.612237f,0.0171322f, +0.612827f,0.0165483f, 0.613422f,0.0159804f, 0.614136f,0.015437f, 0.614843f,0.0148996f, 0.615516f,0.0143656f, +0.616237f,0.0138395f, 0.617161f,0.0133282f, 0.618184f,0.0128407f, 0.619187f,0.0123612f, 0.620156f,0.0118881f, +0.621197f,0.0114246f, 0.62235f,0.0109713f, 0.62349f,0.0105301f, 0.624628f,0.0101058f, 0.625802f,0.00969084f, +0.626957f,0.00928807f, 0.628151f,0.00890868f, 0.629342f,0.00854237f, 0.630523f,0.0081804f, 0.631778f,0.00782394f, +0.633009f,0.00747853f, 0.634205f,0.00714236f, 0.635389f,0.00681966f, 0.636627f,0.00650832f, 0.637968f,0.00620976f, +0.639362f,0.0059219f, 0.640891f,0.00563965f, 0.64241f,0.00536595f, 0.643912f,0.00510083f, 0.645438f,0.00484981f, +0.646951f,0.00460947f, 0.648402f,0.00437303f, 0.649821f,0.00414563f, 0.651272f,0.0039323f, 0.652753f,0.00372365f, +0.654159f,0.00351847f, 0.655596f,0.00332069f, 0.657136f,0.00313277f, 0.658611f,0.00294951f, 0.660037f,0.00277273f, +0.66149f,0.00260981f, 0.662941f,0.00245526f, 0.664397f,0.00230594f, 0.665899f,0.00216145f, 0.667381f,0.00202095f, +0.668951f,0.00188976f, 0.67046f,0.00176371f, 0.671898f,0.00164254f, 0.673293f,0.00152782f, 0.674706f,0.00142239f, +0.676214f,0.00132366f, 0.677705f,0.00122726f, 0.679218f,0.00113588f, 0.680832f,0.0010495f, 0.682481f,0.000966095f, +0.684027f,0.000885055f, 0.685616f,0.0008102f, 0.687181f,0.000740712f, 0.688724f,0.000676294f, 0.690221f,0.000615943f, +0.691835f,0.000561602f, 0.693413f,0.000509463f, 0.694905f,0.000460568f, 0.696317f,0.000413378f, 0.697847f,0.000370042f, +0.699277f,0.00032924f, 0.70077f,0.00029071f, 0.70232f,0.00025559f, 0.703983f,0.000224554f, 0.705577f,0.000195904f, +0.707085f,0.000169609f, 0.708655f,0.00014599f, 0.710143f,0.000123877f, 0.711479f,0.000102655f, 0.713089f,8.51147e-05f, +0.714654f,6.86469e-05f, 0.716113f,5.38547e-05f, 0.717692f,4.11191e-05f, + +0.71355f,0.0668164f, 0.706118f,0.0651603f, 0.699174f,0.0635429f, 0.692678f,0.0619618f, 0.686594f,0.0604129f, +0.680892f,0.0588984f, 0.675543f,0.0574146f, 0.670518f,0.0559633f, 0.665796f,0.0545442f, 0.661354f,0.0531544f, +0.657169f,0.0517893f, 0.653226f,0.0504554f, 0.649506f,0.049151f, 0.645995f,0.047871f, 0.642687f,0.046622f, +0.63956f,0.0454045f, 0.6366f,0.0442165f, 0.633823f,0.0430613f, 0.631212f,0.0419387f, 0.628732f,0.0408366f, +0.626376f,0.039754f, 0.624129f,0.0386829f, 0.621982f,0.0376322f, 0.620049f,0.0366189f, 0.618275f,0.0356348f, +0.616587f,0.0346745f, 0.614967f,0.0337275f, 0.613405f,0.032792f, 0.611895f,0.0318692f, 0.610533f,0.0309825f, +0.609246f,0.0301229f, 0.608132f,0.0292872f, 0.607282f,0.0284647f, 0.606462f,0.0276536f, 0.605665f,0.0268534f, +0.605174f,0.0260606f, 0.605285f,0.0252778f, 0.605439f,0.0245158f, 0.605645f,0.0237853f, 0.605869f,0.0230605f, +0.606118f,0.0223504f, 0.606381f,0.02165f, 0.606671f,0.0209689f, 0.606976f,0.0203009f, 0.607291f,0.019642f, +0.607639f,0.0189961f, 0.60798f,0.0183582f, 0.608336f,0.0177375f, 0.608745f,0.0171434f, 0.609172f,0.0165699f, +0.6096f,0.016006f, 0.610121f,0.0154563f, 0.610636f,0.0149192f, 0.611183f,0.0144073f, 0.611817f,0.0139058f, +0.61265f,0.0134073f, 0.61348f,0.0129129f, 0.614298f,0.0124311f, 0.615134f,0.0119733f, 0.616102f,0.011524f, +0.617111f,0.0110778f, 0.61811f,0.0106442f, 0.619124f,0.0102188f, 0.620147f,0.00980456f, 0.62117f,0.00940467f, +0.622181f,0.00901797f, 0.623164f,0.0086417f, 0.624235f,0.00827841f, 0.625387f,0.00793615f, 0.626502f,0.00760023f, +0.627563f,0.00726807f, 0.62858f,0.00694377f, 0.629718f,0.006629f, 0.630919f,0.00632373f, 0.632238f,0.00603022f, +0.633646f,0.00574896f, 0.635074f,0.00548014f, 0.636476f,0.00521904f, 0.637835f,0.00496353f, 0.639171f,0.00471777f, +0.640477f,0.00448102f, 0.641769f,0.00425529f, 0.64313f,0.00403818f, 0.644446f,0.00382535f, 0.645808f,0.00362604f, +0.647272f,0.00343431f, 0.648698f,0.00324624f, 0.650067f,0.00306184f, 0.651413f,0.00288686f, 0.652723f,0.00271883f, +0.654011f,0.00255431f, 0.655292f,0.00239758f, 0.656691f,0.00225209f, 0.658169f,0.00211428f, 0.659615f,0.00198131f, +0.660989f,0.00185232f, 0.6623f,0.00172872f, 0.663568f,0.00161182f, 0.66487f,0.00150082f, 0.66621f,0.00139416f, +0.667554f,0.0012937f, 0.669109f,0.00120243f, 0.670724f,0.00111543f, 0.672283f,0.00103077f, 0.673927f,0.000952115f, +0.675489f,0.000876206f, 0.676941f,0.000802459f, 0.67832f,0.000732894f, 0.679715f,0.000669001f, 0.681125f,0.000608991f, +0.682509f,0.000553071f, 0.683827f,0.000501138f, 0.685331f,0.000454095f, 0.686851f,0.000409903f, 0.68835f,0.000367459f, +0.689879f,0.000327972f, 0.691456f,0.000291227f, 0.692958f,0.000255967f, 0.694394f,0.000223959f, 0.695799f,0.000195362f, +0.69718f,0.000168952f, 0.698571f,0.000144951f, 0.700201f,0.000123963f, 0.701684f,0.000103862f, 0.703218f,8.54318e-05f, +0.704812f,6.96573e-05f, 0.706167f,5.47252e-05f, 0.707581f,4.16206e-05f, + +0.71293f,0.0647397f, 0.705721f,0.0631418f, 0.698965f,0.0615792f, 0.692628f,0.0600499f, 0.686677f,0.0585506f, +0.681081f,0.0570832f, 0.675816f,0.055644f, 0.670855f,0.0542358f, 0.666177f,0.0528565f, 0.661763f,0.0515063f, +0.65759f,0.0501784f, 0.653643f,0.0488787f, 0.649908f,0.0476111f, 0.646376f,0.0463743f, 0.643029f,0.0451606f, +0.639849f,0.04397f, 0.636829f,0.0428129f, 0.634003f,0.041697f, 0.631311f,0.0406018f, 0.628747f,0.0395321f, +0.626304f,0.0384863f, 0.623959f,0.0374512f, 0.621741f,0.0364341f, 0.619766f,0.0354562f, 0.617874f,0.0344988f, +0.616057f,0.0335614f, 0.614308f,0.0326438f, 0.612616f,0.0317403f, 0.611028f,0.0308517f, 0.609535f,0.0299807f, +0.608115f,0.0291439f, 0.607072f,0.0283259f, 0.606073f,0.0275316f, 0.605101f,0.026749f, 0.604297f,0.0259752f, +0.604182f,0.0252125f, 0.604154f,0.0244579f, 0.604151f,0.023714f, 0.604184f,0.0229915f, 0.604264f,0.0222993f, +0.604353f,0.0216106f, 0.604463f,0.0209378f, 0.604579f,0.0202727f, 0.604742f,0.0196286f, 0.604926f,0.0189983f, +0.605107f,0.0183754f, 0.605326f,0.0177664f, 0.605551f,0.0171691f, 0.605765f,0.0165826f, 0.606033f,0.0160206f, +0.606396f,0.015482f, 0.60675f,0.0149528f, 0.607129f,0.014435f, 0.607572f,0.0139292f, 0.60828f,0.013444f, +0.608995f,0.0129741f, 0.60968f,0.0125077f, 0.61032f,0.012042f, 0.611146f,0.0115868f, 0.612028f,0.0111556f, +0.612926f,0.0107364f, 0.613848f,0.0103213f, 0.614749f,0.0099159f, 0.615613f,0.0095167f, 0.61646f,0.0091298f, +0.61727f,0.00874972f, 0.618241f,0.00838737f, 0.619181f,0.00803323f, 0.6201f,0.00769066f, 0.621031f,0.00736694f, +0.621967f,0.00705298f, 0.623074f,0.0067461f, 0.624214f,0.00644441f, 0.62548f,0.00615032f, 0.626748f,0.00586562f, +0.628003f,0.00559194f, 0.62923f,0.00532681f, 0.630447f,0.00507342f, 0.631647f,0.00482993f, 0.63278f,0.00458933f, +0.633953f,0.00435948f, 0.63517f,0.00413778f, 0.636396f,0.00392636f, 0.637669f,0.00372525f, 0.63899f,0.0035281f, +0.640293f,0.00333948f, 0.641616f,0.00316393f, 0.642874f,0.00299173f, 0.644124f,0.00282233f, 0.645315f,0.0026585f, +0.646587f,0.00250339f, 0.647874f,0.00235219f, 0.649159f,0.00220523f, 0.650451f,0.00206934f, 0.651693f,0.00193915f, +0.652908f,0.00181596f, 0.654077f,0.0016977f, 0.655309f,0.00158267f, 0.656545f,0.0014733f, 0.657913f,0.0013702f, +0.659299f,0.00127175f, 0.660755f,0.00117843f, 0.662253f,0.00109197f, 0.663778f,0.00101173f, 0.66524f,0.000934556f, +0.666653f,0.000861767f, 0.668054f,0.00079278f, 0.66934f,0.000725829f, 0.67061f,0.000660944f, 0.671869f,0.000601802f, +0.673096f,0.000546462f, 0.67446f,0.000495111f, 0.675853f,0.000447243f, 0.677272f,0.000403268f, 0.678808f,0.000362631f, +0.680374f,0.00032477f, 0.681924f,0.000289111f, 0.68339f,0.000256128f, 0.6847f,0.000224049f, 0.686025f,0.000195052f, +0.687369f,0.000168953f, 0.68882f,0.000145048f, 0.690177f,0.000123201f, 0.691794f,0.000104352f, 0.693245f,8.60527e-05f, +0.694617f,6.98569e-05f, 0.696056f,5.53846e-05f, 0.697387f,4.20905e-05f, + +0.712153f,0.0627349f, 0.705157f,0.0611922f, 0.698583f,0.0596819f, 0.692399f,0.0582023f, 0.686574f,0.0567504f, +0.681082f,0.055328f, 0.675899f,0.0539315f, 0.671001f,0.0525649f, 0.666368f,0.051224f, 0.661981f,0.0499121f, +0.657821f,0.0486227f, 0.653871f,0.0473543f, 0.650123f,0.0461212f, 0.64657f,0.0449252f, 0.643186f,0.0437469f, +0.639957f,0.0425856f, 0.636899f,0.041463f, 0.634006f,0.0403772f, 0.631238f,0.0393089f, 0.628598f,0.0382741f, +0.626065f,0.0372588f, 0.623627f,0.0362585f, 0.621408f,0.0352843f, 0.619323f,0.0343326f, 0.617315f,0.0334f, +0.61538f,0.0324907f, 0.613505f,0.031598f, 0.611707f,0.0307245f, 0.61004f,0.02987f, 0.608408f,0.0290243f, +0.607072f,0.0281976f, 0.605882f,0.0274025f, 0.604726f,0.0266241f, 0.603603f,0.0258676f, 0.603248f,0.0251231f, +0.603053f,0.0243876f, 0.602882f,0.0236588f, 0.602736f,0.0229407f, 0.602609f,0.0222331f, 0.602515f,0.0215487f, +0.60246f,0.0208922f, 0.602407f,0.0202383f, 0.602411f,0.0196046f, 0.602422f,0.0189798f, 0.60246f,0.018373f, +0.602533f,0.017781f, 0.6026f,0.0171967f, 0.602654f,0.0166193f, 0.602764f,0.0160542f, 0.602924f,0.0155024f, +0.60309f,0.0149712f, 0.603335f,0.0144627f, 0.603643f,0.0139647f, 0.60417f,0.0134792f, 0.604676f,0.0129997f, +0.605186f,0.0125371f, 0.605722f,0.0120951f, 0.606462f,0.0116588f, 0.607174f,0.011224f, 0.607929f,0.0107965f, +0.608708f,0.0103905f, 0.609491f,0.0100002f, 0.610236f,0.00961353f, 0.610942f,0.00923206f, 0.61168f,0.00886031f, +0.612491f,0.00849708f, 0.613266f,0.00814141f, 0.614018f,0.00779727f, 0.614741f,0.00746309f, 0.615576f,0.00714119f, +0.616582f,0.00683507f, 0.61769f,0.00654206f, 0.618878f,0.00625698f, 0.620031f,0.00597741f, 0.621147f,0.00570421f, +0.622227f,0.0054381f, 0.623268f,0.00517875f, 0.624307f,0.00493247f, 0.625327f,0.00469571f, 0.626468f,0.00446767f, +0.627587f,0.00424698f, 0.628642f,0.00402996f, 0.629792f,0.00382226f, 0.630963f,0.00362365f, 0.632121f,0.00343445f, +0.633262f,0.00325388f, 0.634395f,0.00307663f, 0.635537f,0.00291067f, 0.636683f,0.00275255f, 0.637881f,0.00259764f, +0.639109f,0.00244535f, 0.640308f,0.00230023f, 0.64147f,0.00216171f, 0.642545f,0.0020261f, 0.643575f,0.00189723f, +0.644684f,0.00177733f, 0.645881f,0.00166191f, 0.647155f,0.00155267f, 0.648477f,0.00144755f, 0.649816f,0.00134707f, +0.651156f,0.00125041f, 0.652526f,0.00115961f, 0.653823f,0.00107265f, 0.655101f,0.000991507f, 0.656423f,0.000916648f, +0.657691f,0.000845711f, 0.658939f,0.00077825f, 0.660255f,0.000715181f, 0.661516f,0.000654744f, 0.662708f,0.000595861f, +0.664024f,0.000540892f, 0.665332f,0.000490558f, 0.666651f,0.000442955f, 0.668096f,0.000399462f, 0.669496f,0.000359102f, +0.670922f,0.000321374f, 0.672276f,0.000286392f, 0.673694f,0.000254155f, 0.675084f,0.000224504f, 0.67633f,0.000195365f, +0.677692f,0.000169223f, 0.678969f,0.000145511f, 0.680288f,0.000123502f, 0.681636f,0.000103497f, 0.683048f,8.63488e-05f, +0.684269f,6.97136e-05f, 0.68568f,5.54536e-05f, 0.687113f,4.25201e-05f, + +0.711224f,0.0607994f, 0.704431f,0.0593093f, 0.698032f,0.0578488f, 0.691994f,0.0564167f, 0.686292f,0.0550102f, +0.680901f,0.0536306f, 0.675797f,0.0522753f, 0.67096f,0.0509487f, 0.66637f,0.049645f, 0.66201f,0.04837f, +0.657864f,0.0471172f, 0.653915f,0.0458838f, 0.650156f,0.0446847f, 0.64658f,0.0435227f, 0.643162f,0.0423772f, +0.639888f,0.0412471f, 0.636792f,0.0401571f, 0.633837f,0.0391018f, 0.631004f,0.0380693f, 0.628281f,0.0370582f, +0.625661f,0.0360709f, 0.623178f,0.0351102f, 0.620915f,0.0341738f, 0.618727f,0.0332495f, 0.616609f,0.0323429f, +0.614554f,0.031455f, 0.612556f,0.030587f, 0.610703f,0.0297449f, 0.608908f,0.0289167f, 0.607278f,0.0280995f, +0.605898f,0.0272917f, 0.604557f,0.0265084f, 0.603253f,0.0257508f, 0.602476f,0.0250113f, 0.602113f,0.0242915f, +0.601783f,0.0235831f, 0.601476f,0.0228831f, 0.601186f,0.0221891f, 0.60091f,0.0215034f, 0.600651f,0.020831f, +0.600431f,0.0201828f, 0.600284f,0.0195666f, 0.600136f,0.0189528f, 0.600023f,0.0183569f, 0.599924f,0.01777f, +0.599841f,0.0171995f, 0.599762f,0.0166417f, 0.599737f,0.0160901f, 0.599744f,0.0155482f, 0.599729f,0.0150124f, +0.599787f,0.0144899f, 0.599925f,0.0139868f, 0.600275f,0.0135021f, 0.600634f,0.0130336f, 0.600985f,0.0125772f, +0.601347f,0.0121249f, 0.601918f,0.0116877f, 0.602534f,0.0112695f, 0.603189f,0.0108632f, 0.603808f,0.010459f, +0.604387f,0.0100576f, 0.604964f,0.00967207f, 0.605553f,0.00930551f, 0.606219f,0.00894603f, 0.606895f,0.00858896f, +0.607546f,0.00824138f, 0.60816f,0.00790073f, 0.608771f,0.00756982f, 0.609548f,0.00724735f, 0.610437f,0.00693513f, +0.611399f,0.00663249f, 0.612402f,0.00634255f, 0.613405f,0.00606575f, 0.614389f,0.00579685f, 0.61536f,0.00553721f, +0.616311f,0.00528487f, 0.617214f,0.00503722f, 0.618179f,0.00479648f, 0.619168f,0.00456506f, 0.620144f,0.00434407f, +0.621123f,0.00413226f, 0.622195f,0.00392714f, 0.62321f,0.00372557f, 0.624177f,0.00353f, 0.625168f,0.00334294f, +0.626168f,0.00316565f, 0.627142f,0.00299634f, 0.628162f,0.00283304f, 0.62924f,0.00267513f, 0.630403f,0.00252885f, +0.631511f,0.00238651f, 0.632536f,0.00224616f, 0.633508f,0.00211126f, 0.634441f,0.00198268f, 0.635575f,0.00185865f, +0.636665f,0.001738f, 0.637907f,0.00162739f, 0.639116f,0.00152098f, 0.640383f,0.0014188f, 0.64169f,0.0013217f, +0.642939f,0.00122836f, 0.64416f,0.00114025f, 0.64536f,0.00105556f, 0.64652f,0.000975882f, 0.647621f,0.000900418f, +0.648806f,0.000829933f, 0.650062f,0.000765413f, 0.651221f,0.000703273f, 0.652486f,0.000645563f, 0.653789f,0.000590343f, +0.654967f,0.000536441f, 0.656216f,0.000485906f, 0.657535f,0.000439398f, 0.658772f,0.000395334f, 0.660097f,0.00035503f, +0.66144f,0.000318635f, 0.662687f,0.00028384f, 0.663923f,0.000251801f, 0.665217f,0.000222455f, 0.666576f,0.000195403f, +0.667757f,0.000169016f, 0.669028f,0.000145503f, 0.670396f,0.000124049f, 0.671601f,0.000104097f, 0.672779f,8.61408e-05f, +0.674044f,7.0117e-05f, 0.675307f,5.54513e-05f, 0.676771f,4.29106e-05f, + +0.710145f,0.0589307f, 0.703548f,0.0574906f, 0.697315f,0.0560776f, 0.691419f,0.0546908f, 0.685835f,0.0533279f, +0.680541f,0.0519893f, 0.675514f,0.0506741f, 0.670736f,0.0493853f, 0.666189f,0.0481192f, 0.661857f,0.0468781f, +0.657724f,0.04566f, 0.653778f,0.0444636f, 0.650011f,0.0432987f, 0.646413f,0.042168f, 0.642961f,0.0410531f, +0.639655f,0.0399576f, 0.636515f,0.0388994f, 0.633499f,0.0378707f, 0.630601f,0.0368701f, 0.6278f,0.0358826f, +0.6251f,0.0349227f, 0.622616f,0.0340015f, 0.620263f,0.033098f, 0.617974f,0.032201f, 0.61575f,0.0313217f, +0.613579f,0.0304547f, 0.611516f,0.0296153f, 0.609551f,0.0287921f, 0.607634f,0.0279918f, 0.606098f,0.027202f, +0.60459f,0.0264213f, 0.603102f,0.0256497f, 0.601886f,0.0249068f, 0.601343f,0.0241858f, 0.600838f,0.0234833f, +0.600368f,0.0227969f, 0.599925f,0.0221231f, 0.599498f,0.0214569f, 0.59908f,0.0207962f, 0.598699f,0.0201484f, +0.59835f,0.0195143f, 0.598029f,0.0189044f, 0.597772f,0.0183246f, 0.597522f,0.0177485f, 0.597284f,0.017188f, +0.59704f,0.0166353f, 0.596877f,0.0160975f, 0.596743f,0.0155719f, 0.596589f,0.015051f, 0.596518f,0.0145388f, +0.596496f,0.0140335f, 0.596652f,0.0135367f, 0.596822f,0.0130616f, 0.59699f,0.0126023f, 0.597244f,0.0121585f, +0.59767f,0.0117297f, 0.598127f,0.0113058f, 0.598589f,0.0108941f, 0.59906f,0.0104992f, 0.599521f,0.0101149f, +0.599956f,0.00973684f, 0.600351f,0.00936171f, 0.60087f,0.00899663f, 0.601417f,0.0086507f, 0.601951f,0.00831566f, +0.602455f,0.00798319f, 0.602998f,0.00765862f, 0.603741f,0.00734174f, 0.604515f,0.00703456f, 0.605378f,0.0067322f, +0.606232f,0.00644161f, 0.607054f,0.00615724f, 0.607869f,0.00588296f, 0.608698f,0.00562472f, 0.609501f,0.00537306f, +0.610313f,0.00512811f, 0.611208f,0.0048922f, 0.612072f,0.00466313f, 0.612891f,0.00443947f, 0.613747f,0.00422122f, +0.614665f,0.0040141f, 0.615569f,0.00381678f, 0.616476f,0.0036265f, 0.617368f,0.00344082f, 0.618193f,0.00325853f, +0.61898f,0.00308328f, 0.619868f,0.00291516f, 0.620858f,0.00275591f, 0.621835f,0.00260487f, 0.62276f,0.002458f, +0.623675f,0.00232006f, 0.624595f,0.00218879f, 0.625593f,0.00206118f, 0.626621f,0.0019358f, 0.627716f,0.00181684f, +0.628824f,0.00170238f, 0.629927f,0.00159135f, 0.631143f,0.00148735f, 0.632379f,0.00139045f, 0.633548f,0.00129623f, +0.634722f,0.00120676f, 0.635825f,0.00112074f, 0.636874f,0.00103902f, 0.637938f,0.000961404f, 0.639046f,0.000887436f, +0.640092f,0.000817532f, 0.64113f,0.000752766f, 0.642312f,0.000691807f, 0.643478f,0.000634531f, 0.644646f,0.000581422f, +0.645934f,0.000531281f, 0.64716f,0.000482291f, 0.648327f,0.000435068f, 0.649536f,0.000392431f, 0.650697f,0.000352045f, +0.651799f,0.000314821f, 0.652931f,0.000281268f, 0.654115f,0.000249602f, 0.655293f,0.00021996f, 0.656481f,0.000193218f, +0.657731f,0.00016876f, 0.658995f,0.000144655f, 0.660281f,0.000123772f, 0.661467f,0.000104391f, 0.662636f,8.65841e-05f, +0.663937f,7.07626e-05f, 0.665158f,5.61517e-05f, 0.666372f,4.32615e-05f, + +0.708921f,0.0571264f, 0.70251f,0.0557338f, 0.696437f,0.0543661f, 0.690677f,0.0530226f, 0.685207f,0.0517015f, +0.680006f,0.0504022f, 0.675054f,0.0491256f, 0.670334f,0.0478732f, 0.665829f,0.0466433f, 0.661524f,0.0454347f, +0.657406f,0.0442503f, 0.653462f,0.0430898f, 0.649689f,0.0419589f, 0.646068f,0.0408565f, 0.642586f,0.0397747f, +0.639259f,0.0387187f, 0.636069f,0.0376867f, 0.632998f,0.0366836f, 0.630031f,0.0357083f, 0.627158f,0.0347503f, +0.624414f,0.0338209f, 0.621895f,0.0329289f, 0.61945f,0.0320536f, 0.617066f,0.0311865f, 0.614737f,0.0303299f, +0.61247f,0.0294917f, 0.610344f,0.028674f, 0.608264f,0.0278782f, 0.606431f,0.0270927f, 0.604773f,0.0263283f, +0.603141f,0.0255755f, 0.601559f,0.0248291f, 0.600756f,0.024097f, 0.600075f,0.0233909f, 0.599429f,0.0227027f, +0.598817f,0.0220341f, 0.598232f,0.0213808f, 0.597672f,0.0207401f, 0.597153f,0.0201118f, 0.596654f,0.0194905f, +0.596162f,0.0188783f, 0.595722f,0.0182826f, 0.595303f,0.0177084f, 0.594913f,0.0171611f, 0.594511f,0.0166168f, +0.594196f,0.0160868f, 0.593901f,0.0155657f, 0.593607f,0.0150574f, 0.593411f,0.0145624f, 0.593259f,0.0140713f, +0.593285f,0.0135885f, 0.593288f,0.013111f, 0.593287f,0.0126417f, 0.593379f,0.0121914f, 0.593647f,0.0117611f, +0.593954f,0.0113406f, 0.594271f,0.0109372f, 0.594562f,0.0105385f, 0.594839f,0.0101501f, 0.595106f,0.00977412f, +0.595394f,0.0094124f, 0.595794f,0.00905665f, 0.596157f,0.00870467f, 0.596498f,0.00836073f, 0.596923f,0.00803642f, +0.597399f,0.00772438f, 0.598059f,0.00741557f, 0.598745f,0.00711271f, 0.599495f,0.00681691f, 0.600235f,0.00653034f, +0.600945f,0.00625003f, 0.60163f,0.00597853f, 0.602282f,0.00571261f, 0.602947f,0.00545672f, 0.603662f,0.0052126f, +0.604412f,0.00497815f, 0.605123f,0.00474894f, 0.6058f,0.0045267f, 0.606593f,0.00431249f, 0.607365f,0.00410469f, +0.608095f,0.00390066f, 0.608859f,0.00370545f, 0.609623f,0.0035211f, 0.610359f,0.00334432f, 0.611108f,0.00317292f, +0.611926f,0.00300433f, 0.612755f,0.00284101f, 0.613554f,0.00268457f, 0.614333f,0.00253475f, 0.615098f,0.00239183f, +0.615897f,0.00225758f, 0.616841f,0.00212862f, 0.617858f,0.00200732f, 0.61892f,0.00188953f, 0.619931f,0.00177475f, +0.621035f,0.0016647f, 0.62215f,0.00155931f, 0.623194f,0.00145633f, 0.624229f,0.00135744f, 0.625311f,0.00126843f, +0.626357f,0.00118277f, 0.627371f,0.0010998f, 0.628376f,0.00102112f, 0.629374f,0.000945572f, 0.630333f,0.000873766f, +0.631288f,0.000805576f, 0.632345f,0.000740956f, 0.633364f,0.000681102f, 0.634429f,0.000624234f, 0.635675f,0.000572024f, +0.636864f,0.00052273f, 0.638094f,0.000477239f, 0.639249f,0.000433238f, 0.640311f,0.00039014f, 0.641281f,0.000350468f, +0.642252f,0.000313083f, 0.643282f,0.000278471f, 0.644396f,0.000247727f, 0.645418f,0.000218584f, 0.646502f,0.00019148f, +0.647831f,0.000166999f, 0.649105f,0.000145045f, 0.650173f,0.000123337f, 0.651267f,0.000104291f, 0.65242f,8.66259e-05f, +0.653676f,7.09142e-05f, 0.654881f,5.66907e-05f, 0.655924f,4.35718e-05f, + +0.707555f,0.055384f, 0.701323f,0.0540367f, 0.695403f,0.0527123f, 0.689773f,0.0514102f, 0.684412f,0.050129f, +0.679301f,0.0488675f, 0.674422f,0.0476285f, 0.669758f,0.0464109f, 0.665294f,0.0452154f, 0.661016f,0.044039f, +0.656912f,0.0428885f, 0.652973f,0.0417627f, 0.649193f,0.0406645f, 0.645551f,0.0395878f, 0.642041f,0.0385378f, +0.638692f,0.0375181f, 0.63546f,0.0365183f, 0.632333f,0.0355414f, 0.629303f,0.0345888f, 0.626369f,0.033662f, +0.623622f,0.0327634f, 0.621015f,0.0318899f, 0.61848f,0.0310384f, 0.616003f,0.0302003f, 0.613575f,0.0293688f, +0.611265f,0.0285599f, 0.609029f,0.0277648f, 0.606904f,0.0269895f, 0.605091f,0.0262291f, 0.603308f,0.0254824f, +0.60155f,0.0247515f, 0.600336f,0.0240315f, 0.599489f,0.0233195f, 0.598673f,0.0226259f, 0.597891f,0.0219538f, +0.597139f,0.0213005f, 0.59642f,0.0206653f, 0.595749f,0.020048f, 0.595105f,0.0194435f, 0.594484f,0.0188495f, +0.593901f,0.0182656f, 0.593318f,0.0176906f, 0.592736f,0.0171268f, 0.592165f,0.0165827f, 0.591701f,0.0160633f, +0.591249f,0.0155484f, 0.590809f,0.0150468f, 0.590455f,0.0145556f, 0.590157f,0.014076f, 0.590054f,0.0136091f, +0.589945f,0.013147f, 0.589827f,0.0126941f, 0.589781f,0.0122461f, 0.589885f,0.0118045f, 0.590014f,0.0113774f, +0.590151f,0.0109689f, 0.590285f,0.010573f, 0.590412f,0.0101901f, 0.590522f,0.00981626f, 0.590656f,0.0094487f, +0.590891f,0.00909404f, 0.591127f,0.00875262f, 0.591396f,0.00842017f, 0.591647f,0.00809137f, 0.592f,0.00776937f, +0.592503f,0.00746215f, 0.593125f,0.00716958f, 0.593767f,0.00688328f, 0.59437f,0.00660015f, 0.594951f,0.00632464f, +0.595511f,0.0060567f, 0.596082f,0.005797f, 0.596613f,0.00554278f, 0.597222f,0.00529662f, 0.597793f,0.00505611f, +0.598356f,0.00482677f, 0.598948f,0.00460803f, 0.599613f,0.00439409f, 0.600241f,0.00418582f, 0.600912f,0.00398642f, +0.601549f,0.00379228f, 0.602146f,0.00360414f, 0.602677f,0.0034194f, 0.603312f,0.00324532f, 0.604083f,0.00308174f, +0.604844f,0.00292282f, 0.605554f,0.00276782f, 0.606226f,0.00261622f, 0.606891f,0.00247099f, 0.607619f,0.00233185f, +0.608462f,0.00219897f, 0.609332f,0.00207222f, 0.610245f,0.00195196f, 0.611202f,0.00183993f, 0.612264f,0.00173144f, +0.613272f,0.00162599f, 0.614279f,0.00152414f, 0.615245f,0.00142683f, 0.616192f,0.00133263f, 0.61708f,0.00124084f, +0.617965f,0.00115656f, 0.618909f,0.00107797f, 0.619822f,0.00100127f, 0.620713f,0.000929006f, 0.621644f,0.00085972f, +0.622619f,0.000793677f, 0.623529f,0.000730598f, 0.624587f,0.000670911f, 0.625673f,0.000615193f, 0.626722f,0.000563625f, +0.627787f,0.000514911f, 0.628849f,0.000469494f, 0.629896f,0.000427343f, 0.630867f,0.000387664f, 0.631825f,0.000348539f, +0.632801f,0.000312155f, 0.633779f,0.000278065f, 0.634617f,0.00024566f, 0.635691f,0.000217599f, 0.636904f,0.000191067f, +0.638006f,0.000166394f, 0.639032f,0.000143918f, 0.640083f,0.000123684f, 0.641104f,0.000104141f, 0.642291f,8.70209e-05f, +0.643331f,7.10186e-05f, 0.644366f,5.68319e-05f, 0.64544f,4.38467e-05f, + +0.706052f,0.0537013f, 0.699989f,0.0523973f, 0.694216f,0.0511142f, 0.688711f,0.0498517f, 0.683456f,0.0486087f, +0.678431f,0.0473837f, 0.673622f,0.0461804f, 0.669012f,0.0449964f, 0.664588f,0.0438339f, 0.660336f,0.0426893f, +0.656248f,0.0415711f, 0.652315f,0.0404802f, 0.648527f,0.0394124f, 0.644867f,0.038363f, 0.641341f,0.037345f, +0.637961f,0.0363569f, 0.634687f,0.0353883f, 0.631508f,0.0344384f, 0.628416f,0.0335086f, 0.625431f,0.0326124f, +0.622675f,0.0317438f, 0.619987f,0.0308923f, 0.617361f,0.0300595f, 0.614792f,0.0292461f, 0.612293f,0.0284427f, +0.609914f,0.0276558f, 0.607574f,0.026887f, 0.605533f,0.0261266f, 0.603608f,0.0253913f, 0.601705f,0.0246636f, +0.600032f,0.0239528f, 0.599044f,0.023256f, 0.59808f,0.022568f, 0.597132f,0.0218876f, 0.596225f,0.0212334f, +0.595345f,0.0205968f, 0.594515f,0.0199822f, 0.593717f,0.0193824f, 0.592954f,0.0187992f, 0.59223f,0.0182304f, +0.591504f,0.0176673f, 0.590778f,0.017113f, 0.590047f,0.0165669f, 0.589397f,0.0160337f, 0.588783f,0.0155197f, +0.588198f,0.015027f, 0.587692f,0.0145415f, 0.587229f,0.0140661f, 0.586978f,0.0136022f, 0.586738f,0.0131519f, +0.586491f,0.0127131f, 0.586323f,0.0122778f, 0.586329f,0.011852f, 0.586324f,0.0114311f, 0.586293f,0.0110159f, +0.586249f,0.0106125f, 0.586204f,0.0102257f, 0.586146f,0.00985056f, 0.586154f,0.00948683f, 0.58624f,0.00913453f, +0.58633f,0.00878924f, 0.586459f,0.00845748f, 0.586567f,0.00813488f, 0.586889f,0.00782542f, 0.587251f,0.00751795f, +0.587721f,0.00721674f, 0.588195f,0.00692904f, 0.588659f,0.00665136f, 0.589117f,0.00638445f, 0.589577f,0.0061209f, +0.590007f,0.00586294f, 0.590453f,0.00561258f, 0.590948f,0.00537098f, 0.591401f,0.005134f, 0.591834f,0.00490607f, +0.592304f,0.00468218f, 0.592816f,0.00446656f, 0.59336f,0.00426237f, 0.593902f,0.00406392f, 0.594397f,0.00386984f, +0.594861f,0.00368202f, 0.595319f,0.00350209f, 0.595912f,0.0033272f, 0.596537f,0.0031566f, 0.597137f,0.00299298f, +0.597768f,0.00284007f, 0.598387f,0.00269373f, 0.598987f,0.00255177f, 0.599689f,0.00241177f, 0.600408f,0.00227676f, +0.601164f,0.00214644f, 0.601903f,0.00202197f, 0.602742f,0.00190294f, 0.603621f,0.00179037f, 0.604547f,0.00168494f, +0.605482f,0.00158531f, 0.606388f,0.00148803f, 0.607254f,0.00139395f, 0.608085f,0.00130498f, 0.608845f,0.00121873f, +0.609636f,0.00113404f, 0.610396f,0.00105343f, 0.611199f,0.000980988f, 0.612126f,0.00091162f, 0.613006f,0.000844022f, +0.613888f,0.000780756f, 0.614916f,0.00072004f, 0.615861f,0.000661946f, 0.616737f,0.000606669f, 0.617618f,0.000554185f, +0.61857f,0.000506772f, 0.61946f,0.000461858f, 0.620336f,0.000420152f, 0.621299f,0.000381547f, 0.622258f,0.000345131f, +0.623213f,0.000309802f, 0.62404f,0.000276517f, 0.625074f,0.000245717f, 0.62608f,0.000215767f, 0.627168f,0.000190339f, +0.628062f,0.000165939f, 0.628945f,0.000143476f, 0.629891f,0.000123009f, 0.630993f,0.000104268f, 0.632016f,8.70087e-05f, +0.632926f,7.11812e-05f, 0.633867f,5.67604e-05f, 0.634927f,4.40799e-05f, + +0.704415f,0.0520762f, 0.698514f,0.0508134f, 0.692881f,0.0495698f, 0.687496f,0.0483451f, 0.682341f,0.0471389f, +0.6774f,0.0459489f, 0.672658f,0.0447799f, 0.668101f,0.043628f, 0.663716f,0.0424973f, 0.659491f,0.0413843f, +0.655417f,0.040297f, 0.65149f,0.0392387f, 0.647695f,0.0382012f, 0.644018f,0.0371807f, 0.64048f,0.0361926f, +0.637068f,0.035236f, 0.633754f,0.0342968f, 0.630524f,0.0333723f, 0.62738f,0.0324685f, 0.624398f,0.0315993f, +0.621572f,0.0307575f, 0.618805f,0.0299281f, 0.616094f,0.0291149f, 0.613434f,0.0283209f, 0.610901f,0.0275491f, +0.608425f,0.0267858f, 0.606096f,0.0260383f, 0.604029f,0.0253027f, 0.601987f,0.0245793f, 0.599972f,0.0238768f, +0.598713f,0.0231821f, 0.597607f,0.0225031f, 0.596527f,0.0218387f, 0.595473f,0.0211839f, 0.594434f,0.0205408f, +0.593446f,0.0199231f, 0.592498f,0.0193235f, 0.591586f,0.0187453f, 0.590711f,0.0181819f, 0.589843f,0.0176291f, +0.58898f,0.0170875f, 0.588109f,0.0165514f, 0.587307f,0.0160237f, 0.586534f,0.0155058f, 0.585771f,0.0150006f, +0.585106f,0.014515f, 0.584486f,0.0140487f, 0.584102f,0.0135921f, 0.58371f,0.013145f, 0.583307f,0.0127074f, +0.583002f,0.0122814f, 0.582889f,0.0118674f, 0.582759f,0.0114586f, 0.582612f,0.0110574f, 0.582438f,0.0106613f, +0.582235f,0.0102705f, 0.582012f,0.00989051f, 0.581883f,0.00952482f, 0.581833f,0.0091731f, 0.581793f,0.00882931f, +0.581771f,0.00849797f, 0.581739f,0.00817294f, 0.581949f,0.00786269f, 0.582197f,0.00756002f, 0.582546f,0.00726674f, +0.582887f,0.00698161f, 0.583184f,0.0066985f, 0.583514f,0.00642859f, 0.583846f,0.00617052f, 0.584166f,0.00592193f, +0.584527f,0.00567706f, 0.584874f,0.00543605f, 0.585187f,0.00520074f, 0.585481f,0.00497459f, 0.585872f,0.00475424f, +0.586275f,0.00454136f, 0.586704f,0.00433421f, 0.587087f,0.00413182f, 0.587466f,0.00394087f, 0.58783f,0.00375702f, +0.588233f,0.00357732f, 0.588759f,0.0034032f, 0.589275f,0.00323512f, 0.589787f,0.00307321f, 0.590259f,0.00291486f, +0.590685f,0.00276169f, 0.591196f,0.00261723f, 0.59187f,0.00248173f, 0.592525f,0.00234991f, 0.593198f,0.00222116f, +0.593843f,0.00209549f, 0.594603f,0.00197495f, 0.595364f,0.00185836f, 0.596127f,0.00174738f, 0.596882f,0.00164124f, +0.597649f,0.00154246f, 0.598402f,0.00145002f, 0.599093f,0.00136045f, 0.599776f,0.00127298f, 0.600541f,0.00119028f, +0.601268f,0.00111193f, 0.601955f,0.00103469f, 0.602707f,0.000959222f, 0.603477f,0.000891451f, 0.604364f,0.000828008f, +0.605261f,0.000765681f, 0.606118f,0.000707282f, 0.606954f,0.000651796f, 0.607783f,0.000598417f, 0.608567f,0.000547225f, +0.609285f,0.000498983f, 0.610003f,0.000454405f, 0.610787f,0.000412656f, 0.611618f,0.000374134f, 0.612539f,0.000339084f, +0.613437f,0.000306027f, 0.614425f,0.000273774f, 0.615481f,0.000243742f, 0.616439f,0.000215871f, 0.617162f,0.000188562f, +0.617975f,0.000165094f, 0.618805f,0.000142784f, 0.61978f,0.000122371f, 0.620768f,0.000104086f, 0.621538f,8.64847e-05f, +0.622512f,7.13279e-05f, 0.623454f,5.69757e-05f, 0.624394f,4.42742e-05f, + +0.702647f,0.0505065f, 0.696901f,0.049283f, 0.691402f,0.0480771f, 0.686131f,0.0468888f, 0.681073f,0.0457176f, +0.676212f,0.0445615f, 0.671536f,0.0434252f, 0.667029f,0.0423044f, 0.662682f,0.0412044f, 0.658482f,0.0401237f, +0.654422f,0.0390646f, 0.650502f,0.0380387f, 0.646701f,0.0370297f, 0.643007f,0.0360363f, 0.639458f,0.0350779f, +0.636017f,0.0341526f, 0.632661f,0.0332386f, 0.629383f,0.0323388f, 0.626197f,0.031464f, 0.623212f,0.030621f, +0.620315f,0.0298007f, 0.617473f,0.0289933f, 0.614681f,0.0282029f, 0.611964f,0.0274291f, 0.609363f,0.0266808f, +0.606794f,0.0259425f, 0.60455f,0.0252136f, 0.602383f,0.0245027f, 0.600233f,0.0237983f, 0.598496f,0.0231132f, +0.597254f,0.0224407f, 0.596038f,0.0217816f, 0.59485f,0.0211373f, 0.593682f,0.0205067f, 0.592546f,0.0198847f, +0.591451f,0.019283f, 0.590389f,0.0187031f, 0.589362f,0.0181376f, 0.588349f,0.0175895f, 0.587341f,0.0170528f, +0.586332f,0.016526f, 0.585386f,0.0160087f, 0.584478f,0.0154997f, 0.583572f,0.0149994f, 0.582746f,0.0145072f, +0.581938f,0.0140294f, 0.581395f,0.0135706f, 0.580859f,0.0131296f, 0.580313f,0.0126972f, 0.579866f,0.0122749f, +0.579603f,0.0118627f, 0.579336f,0.0114621f, 0.579058f,0.0110711f, 0.578758f,0.0106852f, 0.578433f,0.010306f, +0.578083f,0.00993298f, 0.577843f,0.00956662f, 0.577641f,0.00921076f, 0.577492f,0.00886904f, 0.57734f,0.00854143f, +0.577199f,0.00822001f, 0.577283f,0.00790813f, 0.577404f,0.00760252f, 0.577605f,0.00730945f, 0.577796f,0.00702609f, +0.577988f,0.0067504f, 0.578181f,0.00648204f, 0.57834f,0.00621801f, 0.578484f,0.00596224f, 0.578742f,0.0057221f, +0.578976f,0.00548825f, 0.579192f,0.00526164f, 0.579383f,0.00503865f, 0.579665f,0.00481953f, 0.579964f,0.00460713f, +0.580258f,0.00440159f, 0.580538f,0.0042034f, 0.58081f,0.00401165f, 0.581031f,0.00382417f, 0.581352f,0.00364477f, +0.58179f,0.00347459f, 0.582198f,0.00330711f, 0.582585f,0.00314468f, 0.582934f,0.00298811f, 0.583269f,0.00283646f, +0.583719f,0.00268933f, 0.584181f,0.00254491f, 0.584703f,0.00240882f, 0.585262f,0.00228222f, 0.585902f,0.00216018f, +0.586629f,0.00204226f, 0.587315f,0.00192625f, 0.587994f,0.00181487f, 0.588617f,0.0017067f, 0.589201f,0.00160339f, +0.589734f,0.00150406f, 0.590261f,0.00140969f, 0.59093f,0.00132429f, 0.591597f,0.00124264f, 0.592196f,0.00116245f, +0.592841f,0.0010851f, 0.593539f,0.00101245f, 0.59416f,0.000941941f, 0.594933f,0.000872561f, 0.595693f,0.00080827f, +0.596458f,0.000749722f, 0.59721f,0.000693319f, 0.597962f,0.000639005f, 0.598686f,0.000588329f, 0.599349f,0.000539303f, +0.599955f,0.000492363f, 0.600615f,0.000447843f, 0.601313f,0.000406359f, 0.602033f,0.000367704f, 0.602777f,0.000332178f, +0.603749f,0.000300148f, 0.604773f,0.000270037f, 0.605632f,0.000240634f, 0.606387f,0.00021323f, 0.607117f,0.000187923f, +0.607808f,0.000163201f, 0.608746f,0.000141951f, 0.609578f,0.000121571f, 0.610414f,0.000103241f, 0.611273f,8.6645e-05f, +0.612094f,7.09286e-05f, 0.613081f,5.7335e-05f, 0.613853f,4.44276e-05f, + +0.700752f,0.0489902f, 0.695154f,0.0478042f, 0.689782f,0.0466345f, 0.684621f,0.0454809f, 0.679656f,0.0443434f, +0.674872f,0.0432199f, 0.670258f,0.0421148f, 0.6658f,0.0410241f, 0.661489f,0.0399536f, 0.657315f,0.0389041f, +0.653272f,0.0378764f, 0.649355f,0.0368784f, 0.645547f,0.0358956f, 0.641848f,0.0349325f, 0.638283f,0.0340056f, +0.634809f,0.0331035f, 0.631414f,0.0322155f, 0.628092f,0.0313401f, 0.624896f,0.0304951f, 0.621874f,0.0296754f, +0.618908f,0.0288735f, 0.615995f,0.0280892f, 0.613123f,0.0273187f, 0.610376f,0.0265707f, 0.607684f,0.0258387f, +0.605155f,0.0251226f, 0.602864f,0.024416f, 0.600595f,0.0237236f, 0.598407f,0.0230433f, 0.596994f,0.0223708f, +0.595653f,0.021723f, 0.594333f,0.0210841f, 0.593032f,0.0204585f, 0.591769f,0.0198487f, 0.590545f,0.0192549f, +0.589335f,0.0186676f, 0.588169f,0.0181035f, 0.587014f,0.017555f, 0.585864f,0.0170194f, 0.584717f,0.0164973f, +0.583626f,0.0159888f, 0.582589f,0.01549f, 0.581541f,0.0149966f, 0.580585f,0.0145109f, 0.579644f,0.0140397f, +0.57893f,0.0135763f, 0.578223f,0.0131224f, 0.577523f,0.0126876f, 0.576929f,0.0122696f, 0.576524f,0.0118608f, +0.576112f,0.0114623f, 0.575688f,0.0110725f, 0.575257f,0.0106946f, 0.574812f,0.0103263f, 0.574349f,0.00996318f, +0.574013f,0.00960749f, 0.573726f,0.00925954f, 0.573444f,0.00891762f, 0.573138f,0.00858464f, 0.572895f,0.00826366f, +0.572858f,0.00795691f, 0.572876f,0.00765564f, 0.57293f,0.00736198f, 0.572968f,0.00707443f, 0.573021f,0.0067962f, +0.573075f,0.00653084f, 0.573107f,0.0062723f, 0.573156f,0.00602027f, 0.573239f,0.00577252f, 0.573292f,0.00553159f, +0.573345f,0.00530362f, 0.573442f,0.00508515f, 0.573626f,0.00487321f, 0.573848f,0.00466669f, 0.574035f,0.00446375f, +0.574199f,0.00426634f, 0.574331f,0.00407553f, 0.574427f,0.00388924f, 0.57468f,0.00370985f, 0.574975f,0.00353615f, +0.575256f,0.00336775f, 0.575527f,0.00320868f, 0.575754f,0.00305404f, 0.576026f,0.00290219f, 0.576413f,0.00275676f, +0.576786f,0.00261599f, 0.577206f,0.00247948f, 0.577595f,0.0023455f, 0.578125f,0.00221565f, 0.57872f,0.00209604f, +0.579348f,0.00198366f, 0.579929f,0.00187406f, 0.58046f,0.00176766f, 0.580956f,0.00166483f, 0.581409f,0.00156569f, +0.581832f,0.00146934f, 0.582339f,0.0013775f, 0.58279f,0.00128945f, 0.58322f,0.00120722f, 0.58385f,0.00113177f, +0.584446f,0.00105899f, 0.585048f,0.000987785f, 0.585765f,0.000920387f, 0.586428f,0.000855987f, 0.586986f,0.000792662f, +0.587551f,0.000731734f, 0.588206f,0.000677075f, 0.588846f,0.000625557f, 0.589423f,0.000575617f, 0.590017f,0.000529045f, +0.590632f,0.000484392f, 0.5913f,0.000441721f, 0.591906f,0.000400859f, 0.5925f,0.000362389f, 0.59329f,0.000326832f, +0.594074f,0.000293573f, 0.594892f,0.000264121f, 0.595627f,0.000236834f, 0.596298f,0.000210326f, 0.597019f,0.000185511f, +0.59786f,0.00016238f, 0.598591f,0.000140153f, 0.59941f,0.000120977f, 0.600105f,0.000102531f, 0.600908f,8.61539e-05f, +0.601755f,7.0912e-05f, 0.602549f,5.72714e-05f, 0.603312f,4.45455e-05f, + +0.698734f,0.0475254f, 0.693276f,0.0463753f, 0.688026f,0.0452401f, 0.682969f,0.0441197f, 0.678093f,0.0430146f, +0.673383f,0.0419227f, 0.668829f,0.0408474f, 0.664419f,0.0397862f, 0.660142f,0.0387437f, 0.655993f,0.0377238f, +0.651966f,0.0367276f, 0.648053f,0.0357555f, 0.644238f,0.0347988f, 0.640538f,0.0338663f, 0.636954f,0.0329682f, +0.633448f,0.0320887f, 0.630015f,0.0312247f, 0.62666f,0.0303777f, 0.623467f,0.0295583f, 0.620387f,0.0287599f, +0.617356f,0.0279776f, 0.61437f,0.0272122f, 0.611453f,0.0264639f, 0.608647f,0.0257383f, 0.605869f,0.0250254f, +0.603422f,0.0243282f, 0.601036f,0.0236415f, 0.598668f,0.0229658f, 0.596829f,0.0223077f, 0.595358f,0.0216595f, +0.59391f,0.0210251f, 0.592485f,0.0204083f, 0.591092f,0.0198034f, 0.58974f,0.0192151f, 0.588406f,0.0186395f, +0.58711f,0.0180773f, 0.585812f,0.0175219f, 0.584529f,0.0169883f, 0.583248f,0.0164677f, 0.582002f,0.0159602f, +0.580831f,0.015465f, 0.579658f,0.0149828f, 0.578587f,0.0145116f, 0.57752f,0.0140473f, 0.57663f,0.0135851f, +0.575801f,0.0131381f, 0.574957f,0.0126996f, 0.574189f,0.0122708f, 0.573632f,0.0118583f, 0.573082f,0.0114626f, +0.572521f,0.0110768f, 0.571946f,0.0106996f, 0.571357f,0.0103317f, 0.570789f,0.00997753f, 0.57037f,0.00963477f, +0.569989f,0.00929634f, 0.569597f,0.00896487f, 0.569176f,0.00863836f, 0.568832f,0.00831736f, 0.568641f,0.00800533f, +0.568532f,0.00770184f, 0.56846f,0.00741226f, 0.568396f,0.00712948f, 0.568333f,0.00685599f, 0.568236f,0.00658625f, +0.56811f,0.00632327f, 0.568049f,0.00607306f, 0.568003f,0.00582939f, 0.567934f,0.00559296f, 0.567829f,0.00536056f, +0.567787f,0.00513441f, 0.567849f,0.00492009f, 0.56793f,0.0047134f, 0.568005f,0.00451512f, 0.568054f,0.00432274f, +0.568064f,0.00413491f, 0.56807f,0.00395066f, 0.568242f,0.00377259f, 0.568426f,0.00359925f, 0.568577f,0.00343198f, +0.568684f,0.00326924f, 0.568777f,0.00311075f, 0.568994f,0.0029621f, 0.569279f,0.00281867f, 0.569554f,0.00267717f, +0.569856f,0.00254068f, 0.570258f,0.00241087f, 0.570748f,0.00228468f, 0.57122f,0.00216137f, 0.571632f,0.00204029f, +0.572042f,0.00192603f, 0.572463f,0.00182051f, 0.572857f,0.00171935f, 0.573253f,0.00162141f, 0.57364f,0.00152621f, +0.574067f,0.00143554f, 0.57442f,0.00134701f, 0.574753f,0.00126149f, 0.575181f,0.00118004f, 0.575552f,0.00110234f, +0.576108f,0.00103078f, 0.576682f,0.000962768f, 0.577212f,0.000897436f, 0.577704f,0.000835433f, 0.57827f,0.000776213f, +0.57878f,0.000718098f, 0.57924f,0.000661785f, 0.579668f,0.000610361f, 0.580198f,0.000563353f, 0.58075f,0.000517362f, +0.581357f,0.000474539f, 0.581955f,0.00043413f, 0.582559f,0.000395258f, 0.58326f,0.000357912f, 0.583932f,0.000322633f, +0.584485f,0.000289441f, 0.584987f,0.000258837f, 0.585555f,0.000231286f, 0.586269f,0.000206436f, 0.58709f,0.000182768f, +0.587847f,0.00016054f, 0.588563f,0.000139428f, 0.589152f,0.000119597f, 0.589851f,0.000102045f, 0.590518f,8.5261e-05f, +0.591331f,7.07521e-05f, 0.591889f,5.66461e-05f, 0.592781f,4.46239e-05f, + +0.696596f,0.0461102f, 0.691271f,0.0449943f, 0.686138f,0.0438922f, 0.681181f,0.0428037f, 0.676389f,0.0417295f, +0.671751f,0.0406682f, 0.667254f,0.0396213f, 0.662888f,0.0385889f, 0.658646f,0.0375743f, 0.65452f,0.0365823f, +0.650509f,0.0356158f, 0.646598f,0.0346684f, 0.642779f,0.0337369f, 0.63908f,0.0328386f, 0.635474f,0.0319642f, +0.631939f,0.0311061f, 0.628469f,0.0302653f, 0.625082f,0.0294461f, 0.621892f,0.0286516f, 0.618754f,0.0278733f, +0.61566f,0.0271103f, 0.612606f,0.0263641f, 0.609664f,0.0256386f, 0.606778f,0.0249309f, 0.604046f,0.0242382f, +0.601549f,0.0235581f, 0.599073f,0.0228918f, 0.59673f,0.0222335f, 0.595143f,0.0215944f, 0.593579f,0.0209698f, +0.592027f,0.0203513f, 0.590507f,0.0197528f, 0.589036f,0.019172f, 0.587574f,0.0186012f, 0.586155f,0.0180447f, +0.584743f,0.0175005f, 0.583326f,0.0169633f, 0.581909f,0.016437f, 0.580514f,0.0159313f, 0.579213f,0.0154382f, +0.57791f,0.014958f, 0.576704f,0.0144913f, 0.575522f,0.0140385f, 0.574488f,0.0135943f, 0.573538f,0.0131545f, +0.572563f,0.0127167f, 0.571646f,0.0122909f, 0.570952f,0.0118762f, 0.570245f,0.0114711f, 0.569537f,0.0110809f, +0.568835f,0.0107069f, 0.568126f,0.0103424f, 0.567439f,0.00998971f, 0.566883f,0.00964689f, 0.566389f,0.0093151f, +0.565884f,0.00899333f, 0.565351f,0.00867445f, 0.564918f,0.00836337f, 0.564609f,0.00805638f, 0.564388f,0.00775424f, +0.564193f,0.00746181f, 0.564f,0.00717661f, 0.563805f,0.00690481f, 0.563587f,0.00664016f, 0.563345f,0.00638312f, +0.563158f,0.00612947f, 0.562958f,0.0058818f, 0.562751f,0.00564439f, 0.562526f,0.0054157f, 0.562392f,0.00519331f, +0.562346f,0.00497592f, 0.562267f,0.00476316f, 0.562183f,0.00456187f, 0.562084f,0.00436996f, 0.561944f,0.0041826f, +0.561869f,0.004001f, 0.561963f,0.00382528f, 0.562018f,0.00365363f, 0.562041f,0.0034879f, 0.562022f,0.00332634f, +0.562069f,0.00317041f, 0.56217f,0.00301909f, 0.562293f,0.00287206f, 0.56249f,0.00273159f, 0.562735f,0.00259867f, +0.563072f,0.00246781f, 0.563446f,0.00233955f, 0.563837f,0.00221916f, 0.564195f,0.00210242f, 0.564506f,0.00198928f, +0.56474f,0.00187729f, 0.564998f,0.00177012f, 0.565273f,0.00167104f, 0.565582f,0.00157669f, 0.565881f,0.00148551f, +0.56614f,0.00139804f, 0.566462f,0.00131441f, 0.566803f,0.0012334f, 0.567099f,0.00115431f, 0.567552f,0.0010789f, +0.567949f,0.00100683f, 0.568339f,0.000940096f, 0.568735f,0.000877051f, 0.569178f,0.000815947f, 0.569616f,0.000758201f, +0.570014f,0.000703631f, 0.570319f,0.000650612f, 0.570696f,0.000598258f, 0.571117f,0.000550498f, 0.571626f,0.000506496f, +0.572117f,0.00046449f, 0.572655f,0.000424837f, 0.573379f,0.000388068f, 0.574046f,0.000352872f, 0.574614f,0.000319015f, +0.575071f,0.000287048f, 0.575508f,0.000256722f, 0.575953f,0.000228523f, 0.576579f,0.00020321f, 0.577184f,0.000179875f, +0.577871f,0.000158159f, 0.578492f,0.000138165f, 0.579047f,0.000118747f, 0.579641f,0.000101181f, 0.580396f,8.51701e-05f, +0.580923f,7.02505e-05f, 0.581572f,5.67387e-05f, 0.582266f,4.4664e-05f, + +0.694341f,0.0447427f, 0.689144f,0.0436596f, 0.684121f,0.0425891f, 0.67926f,0.0415313f, 0.674549f,0.0404868f, +0.669977f,0.0394548f, 0.665535f,0.0384353f, 0.661214f,0.0374307f, 0.657004f,0.0364434f, 0.6529f,0.0354779f, +0.648905f,0.0345399f, 0.644997f,0.0336167f, 0.641174f,0.0327115f, 0.637475f,0.0318444f, 0.633848f,0.0309932f, +0.630283f,0.0301553f, 0.626786f,0.0293392f, 0.623408f,0.0285484f, 0.620172f,0.0277746f, 0.61698f,0.0270165f, +0.613825f,0.0262717f, 0.610725f,0.0255452f, 0.607737f,0.0248399f, 0.604774f,0.0241482f, 0.602122f,0.0234743f, +0.599541f,0.0228128f, 0.596976f,0.0221637f, 0.594998f,0.0215284f, 0.593315f,0.0209031f, 0.591654f,0.0202965f, +0.590015f,0.0197027f, 0.588418f,0.0191222f, 0.586839f,0.0185578f, 0.5853f,0.0180072f, 0.583769f,0.0174681f, +0.582238f,0.0169386f, 0.580706f,0.0164196f, 0.579164f,0.0159066f, 0.577729f,0.0154115f, 0.576303f,0.014934f, +0.574961f,0.0144702f, 0.573654f,0.0140202f, 0.572445f,0.013579f, 0.571381f,0.0131491f, 0.570304f,0.0127275f, +0.56925f,0.012312f, 0.568434f,0.0118992f, 0.56761f,0.0114974f, 0.566773f,0.0111054f, 0.565922f,0.0107232f, +0.565095f,0.0103573f, 0.564273f,0.0100043f, 0.563594f,0.00966339f, 0.562961f,0.0093304f, 0.562309f,0.00900598f, +0.561666f,0.00869314f, 0.561125f,0.00839046f, 0.56071f,0.00809171f, 0.560402f,0.0077991f, 0.560109f,0.00751156f, +0.559796f,0.00722898f, 0.559461f,0.00695435f, 0.559095f,0.00668556f, 0.558731f,0.00642994f, 0.558459f,0.00618232f, +0.558164f,0.00594229f, 0.557827f,0.0057052f, 0.557449f,0.00547245f, 0.557247f,0.00524937f, 0.557073f,0.00503378f, +0.55687f,0.00482446f, 0.55663f,0.00461956f, 0.556342f,0.00441807f, 0.556044f,0.00422686f, 0.555932f,0.00404781f, +0.555892f,0.00387352f, 0.555811f,0.00370292f, 0.555699f,0.00353799f, 0.555575f,0.00337801f, 0.555532f,0.00322257f, +0.55554f,0.00307252f, 0.555577f,0.00292653f, 0.555674f,0.00278616f, 0.555832f,0.00265006f, 0.556094f,0.0025181f, +0.556407f,0.00239475f, 0.556678f,0.00227442f, 0.556889f,0.00215549f, 0.557095f,0.00204242f, 0.557329f,0.00193495f, +0.557523f,0.00183028f, 0.557659f,0.00172817f, 0.557822f,0.00162826f, 0.55797f,0.00153474f, 0.558117f,0.00144776f, +0.558339f,0.00136255f, 0.55854f,0.0012803f, 0.558843f,0.00120263f, 0.559238f,0.00112869f, 0.559552f,0.00105633f, +0.559787f,0.000986064f, 0.560069f,0.000919461f, 0.560398f,0.000857049f, 0.560717f,0.000798319f, 0.560978f,0.000742433f, +0.561207f,0.00068841f, 0.561588f,0.00063792f, 0.561919f,0.00058899f, 0.562271f,0.00054108f, 0.562652f,0.00049638f, +0.563132f,0.000455257f, 0.563756f,0.000417121f, 0.564345f,0.000380923f, 0.564868f,0.000347207f, 0.565298f,0.000315027f, +0.565689f,0.00028407f, 0.566075f,0.000254909f, 0.566553f,0.000227069f, 0.566977f,0.000201003f, 0.567516f,0.000177965f, +0.567977f,0.000156394f, 0.568468f,0.000136485f, 0.569019f,0.000118126f, 0.569609f,0.000100354f, 0.570137f,8.47518e-05f, +0.570599f,7.00159e-05f, 0.571292f,5.69455e-05f, 0.57178f,4.46673e-05f, + +0.691973f,0.0434213f, 0.686897f,0.0423695f, 0.68198f,0.0413295f, 0.677209f,0.0403009f, 0.672575f,0.039285f, +0.668068f,0.0382811f, 0.663678f,0.037288f, 0.659398f,0.0363102f, 0.65522f,0.0353491f, 0.65114f,0.0344118f, +0.647156f,0.0334988f, 0.643252f,0.0325995f, 0.639436f,0.0317235f, 0.635726f,0.0308814f, 0.632078f,0.0300525f, +0.628485f,0.029236f, 0.624964f,0.0284442f, 0.621595f,0.0276787f, 0.618312f,0.0269263f, 0.615066f,0.0261855f, +0.611853f,0.0254607f, 0.608734f,0.0247546f, 0.605677f,0.0240669f, 0.602741f,0.0233916f, 0.600061f,0.022733f, +0.597399f,0.0220897f, 0.594911f,0.0214603f, 0.593123f,0.020845f, 0.59135f,0.0202387f, 0.589598f,0.0196471f, +0.587886f,0.0190746f, 0.586192f,0.0185119f, 0.584531f,0.0179647f, 0.582888f,0.0174305f, 0.581245f,0.0169066f, +0.579603f,0.016394f, 0.577957f,0.0158913f, 0.576381f,0.0153987f, 0.574824f,0.0149113f, 0.573343f,0.0144479f, +0.571915f,0.0139988f, 0.570533f,0.0135612f, 0.569351f,0.0131355f, 0.568158f,0.0127186f, 0.566992f,0.0123134f, +0.566052f,0.011917f, 0.565126f,0.0115254f, 0.564173f,0.0111363f, 0.563207f,0.0107565f, 0.562266f,0.0103888f, +0.561304f,0.0100293f, 0.560492f,0.00968564f, 0.559719f,0.00934963f, 0.558944f,0.00902851f, 0.558185f,0.00871512f, +0.55751f,0.00841028f, 0.556971f,0.0081154f, 0.556568f,0.00783044f, 0.556177f,0.00755105f, 0.555757f,0.00727619f, +0.55531f,0.00700634f, 0.554837f,0.00674115f, 0.554371f,0.00648397f, 0.553955f,0.00623245f, 0.553528f,0.00599217f, +0.553075f,0.00575908f, 0.552629f,0.00553401f, 0.552347f,0.00531305f, 0.552034f,0.00509483f, 0.551697f,0.00488463f, +0.551335f,0.00468192f, 0.550936f,0.0044846f, 0.550511f,0.00429175f, 0.55028f,0.00410303f, 0.550056f,0.00392075f, +0.549829f,0.0037497f, 0.549583f,0.00358602f, 0.549385f,0.00342701f, 0.549201f,0.00327134f, 0.549127f,0.00312141f, +0.549076f,0.00297633f, 0.549096f,0.00283743f, 0.549192f,0.00270111f, 0.549394f,0.00257079f, 0.54957f,0.00244504f, +0.549711f,0.00232271f, 0.549851f,0.00220743f, 0.54999f,0.00209671f, 0.550085f,0.00198666f, 0.550138f,0.00188028f, +0.550192f,0.00178014f, 0.550288f,0.00168381f, 0.550314f,0.00158932f, 0.550302f,0.00149645f, 0.550393f,0.00140835f, +0.550521f,0.00132694f, 0.550776f,0.00124876f, 0.550999f,0.00117196f, 0.551185f,0.00109899f, 0.551341f,0.00103054f, +0.551583f,0.00096412f, 0.551806f,0.000899119f, 0.551984f,0.000837958f, 0.552128f,0.000780032f, 0.552315f,0.000725471f, +0.552591f,0.000673887f, 0.552868f,0.000624258f, 0.553228f,0.000577707f, 0.553584f,0.00053292f, 0.553964f,0.000488965f, +0.554435f,0.000447725f, 0.554842f,0.000409282f, 0.555196f,0.000373618f, 0.555537f,0.00034059f, 0.55586f,0.000309476f, +0.556207f,0.000280172f, 0.556701f,0.000252003f, 0.557116f,0.000225411f, 0.557511f,0.000199965f, 0.557806f,0.000176143f, +0.558143f,0.000154963f, 0.558562f,0.000135073f, 0.559079f,0.000116934f, 0.55955f,0.000100112f, 0.559857f,8.39683e-05f, +0.560411f,6.97537e-05f, 0.560906f,5.6737e-05f, 0.561328f,4.46344e-05f, + +0.689496f,0.0421441f, 0.684534f,0.0411224f, 0.679717f,0.0401115f, 0.675033f,0.0391112f, 0.670472f,0.0381227f, +0.666026f,0.0371456f, 0.661687f,0.0361784f, 0.657446f,0.035226f, 0.653298f,0.0342911f, 0.649241f,0.0333804f, +0.645268f,0.0324913f, 0.641367f,0.0316161f, 0.63756f,0.0307693f, 0.633837f,0.0299489f, 0.630169f,0.0291409f, +0.62655f,0.0283465f, 0.623006f,0.0275781f, 0.619643f,0.026836f, 0.616314f,0.0261039f, 0.613017f,0.0253815f, +0.609754f,0.0246752f, 0.606609f,0.02399f, 0.603485f,0.0233202f, 0.600629f,0.0226617f, 0.597869f,0.0220156f, +0.595128f,0.0213895f, 0.592981f,0.0207795f, 0.591107f,0.020181f, 0.589252f,0.0195955f, 0.58742f,0.0190214f, +0.585623f,0.018466f, 0.583847f,0.0179227f, 0.582095f,0.0173906f, 0.58035f,0.0168743f, 0.578601f,0.0163665f, +0.576849f,0.0158699f, 0.575139f,0.0153823f, 0.573485f,0.0149064f, 0.571868f,0.014442f, 0.570315f,0.0139845f, +0.568766f,0.0135483f, 0.567461f,0.0131242f, 0.566155f,0.0127108f, 0.564874f,0.0123096f, 0.563778f,0.0119177f, +0.562744f,0.0115352f, 0.561694f,0.0111593f, 0.560645f,0.0107896f, 0.559591f,0.0104251f, 0.558515f,0.0100678f, +0.557573f,0.00972136f, 0.556672f,0.00938181f, 0.55577f,0.00905737f, 0.554881f,0.00874013f, 0.554075f,0.00843643f, +0.553409f,0.00814048f, 0.552881f,0.00785223f, 0.552362f,0.00757493f, 0.551829f,0.00730612f, 0.551285f,0.00704389f, +0.550709f,0.00678564f, 0.550146f,0.00653277f, 0.549615f,0.00628346f, 0.549059f,0.0060422f, 0.548488f,0.00580674f, +0.547939f,0.00558065f, 0.547555f,0.00536299f, 0.547144f,0.00515142f, 0.546701f,0.00494529f, 0.546206f,0.00474085f, +0.545681f,0.0045435f, 0.545187f,0.00435269f, 0.544877f,0.00416793f, 0.544536f,0.00398721f, 0.544148f,0.00380928f, +0.543725f,0.00363656f, 0.543431f,0.00347502f, 0.543174f,0.00332115f, 0.542975f,0.0031715f, 0.542824f,0.0030269f, +0.542793f,0.0028865f, 0.542818f,0.00275026f, 0.542911f,0.00262107f, 0.542961f,0.00249482f, 0.542995f,0.00237292f, +0.543012f,0.00225599f, 0.543023f,0.00214222f, 0.543007f,0.00203399f, 0.542971f,0.00193173f, 0.542915f,0.00183058f, +0.542837f,0.0017302f, 0.542732f,0.00163569f, 0.542704f,0.00154591f, 0.54272f,0.00145901f, 0.542734f,0.00137344f, +0.542857f,0.00129142f, 0.542973f,0.00121506f, 0.543051f,0.00114263f, 0.543102f,0.00107212f, 0.543227f,0.00100326f, +0.543353f,0.000939278f, 0.543452f,0.000878239f, 0.543484f,0.000818776f, 0.543604f,0.000761706f, 0.543751f,0.00070804f, +0.54399f,0.00065801f, 0.544309f,0.000610608f, 0.544583f,0.000565006f, 0.54498f,0.000522664f, 0.545379f,0.000481584f, +0.545649f,0.000441012f, 0.545864f,0.000402756f, 0.546031f,0.000367404f, 0.546184f,0.000334125f, 0.546434f,0.00030346f, +0.546859f,0.000274982f, 0.547225f,0.000248108f, 0.547611f,0.000222538f, 0.5479f,0.000198408f, 0.548094f,0.000174962f, +0.548363f,0.000153172f, 0.548712f,0.000133898f, 0.549118f,0.00011575f, 0.549434f,9.93642e-05f, 0.549775f,8.36051e-05f, +0.550235f,6.96024e-05f, 0.550445f,5.62063e-05f, 0.550921f,4.45659e-05f, + +0.686912f,0.0409098f, 0.682059f,0.0399168f, 0.677337f,0.0389338f, 0.672735f,0.0379606f, 0.668244f,0.0369985f, +0.663857f,0.0360473f, 0.659565f,0.035105f, 0.655362f,0.034177f, 0.651243f,0.0332673f, 0.647207f,0.0323824f, +0.643244f,0.0315159f, 0.639347f,0.0306644f, 0.635546f,0.0298456f, 0.631811f,0.0290459f, 0.628123f,0.0282589f, +0.624489f,0.0274892f, 0.620957f,0.0267435f, 0.617555f,0.0260205f, 0.614183f,0.0253083f, 0.610836f,0.0246052f, +0.607559f,0.0239178f, 0.604355f,0.0232498f, 0.601227f,0.0225949f, 0.598384f,0.021955f, 0.595551f,0.0213252f, +0.592882f,0.0207146f, 0.590911f,0.0201206f, 0.588961f,0.0195418f, 0.587022f,0.0189751f, 0.585125f,0.0184223f, +0.58324f,0.0178816f, 0.581394f,0.0173602f, 0.579543f,0.0168446f, 0.577691f,0.01634f, 0.575835f,0.0158468f, +0.573991f,0.0153627f, 0.572237f,0.0148932f, 0.570495f,0.0144342f, 0.568847f,0.0139866f, 0.567181f,0.0135458f, +0.565687f,0.0131128f, 0.564272f,0.0127009f, 0.562872f,0.0123011f, 0.561614f,0.0119118f, 0.560468f,0.0115325f, +0.559313f,0.0111619f, 0.55817f,0.0108026f, 0.557022f,0.01045f, 0.555844f,0.0101003f, 0.554789f,0.00975697f, +0.553785f,0.00942115f, 0.552764f,0.0090954f, 0.551753f,0.00877559f, 0.550809f,0.00846854f, 0.550002f,0.00816642f, +0.549365f,0.00787941f, 0.548717f,0.00760093f, 0.548059f,0.00732938f, 0.54739f,0.00706889f, 0.546695f,0.00681399f, +0.546039f,0.00656813f, 0.545403f,0.00632572f, 0.544744f,0.00608752f, 0.544058f,0.00585276f, 0.54342f,0.00562694f, +0.542901f,0.00540644f, 0.542356f,0.00519316f, 0.541795f,0.00498949f, 0.541199f,0.00479025f, 0.540604f,0.00459863f, +0.540024f,0.00440796f, 0.539608f,0.00422353f, 0.539158f,0.00404472f, 0.538672f,0.00387108f, 0.538198f,0.00370255f, +0.537789f,0.00353657f, 0.537385f,0.00337361f, 0.537048f,0.00322078f, 0.536856f,0.00307666f, 0.536763f,0.0029375f, +0.536697f,0.0028018f, 0.536646f,0.0026708f, 0.536585f,0.00254405f, 0.536484f,0.00242077f, 0.536412f,0.00230451f, +0.536294f,0.00219038f, 0.536144f,0.00208112f, 0.535949f,0.00197557f, 0.535782f,0.00187374f, 0.53564f,0.00177803f, +0.535459f,0.00168493f, 0.535329f,0.00159264f, 0.535218f,0.00150394f, 0.53519f,0.00141973f, 0.535226f,0.00133904f, +0.535195f,0.00125991f, 0.535102f,0.00118348f, 0.535079f,0.00111185f, 0.535136f,0.00104475f, 0.535155f,0.000979442f, +0.535108f,0.000915703f, 0.535035f,0.000855409f, 0.535101f,0.000798676f, 0.535191f,0.000744072f, 0.535344f,0.000691223f, +0.535546f,0.000641744f, 0.53572f,0.000595763f, 0.536015f,0.00055177f, 0.536315f,0.000510214f, 0.536575f,0.000471357f, +0.536772f,0.000434007f, 0.536815f,0.000396823f, 0.53685f,0.000361332f, 0.536974f,0.000328917f, 0.537226f,0.000298109f, +0.537422f,0.000269415f, 0.537714f,0.00024331f, 0.537927f,0.000218558f, 0.538127f,0.000195237f, 0.538415f,0.000173354f, +0.538597f,0.000151869f, 0.538902f,0.000132375f, 0.539079f,0.000114527f, 0.539347f,9.8074e-05f, 0.53978f,8.33878e-05f, +0.539943f,6.89351e-05f, 0.540276f,5.61882e-05f, 0.540564f,4.44626e-05f, + +0.684224f,0.0397165f, 0.679475f,0.0387511f, 0.674843f,0.0377949f, 0.670319f,0.0368478f, 0.665895f,0.0359111f, +0.661563f,0.0349846f, 0.657317f,0.0340667f, 0.65315f,0.033163f, 0.649058f,0.0322772f, 0.645041f,0.0314163f, +0.641089f,0.0305728f, 0.637195f,0.0297433f, 0.6334f,0.028951f, 0.629652f,0.0281716f, 0.625945f,0.0274044f, +0.622295f,0.0266583f, 0.618775f,0.0259347f, 0.615336f,0.0252301f, 0.611921f,0.0245373f, 0.608527f,0.0238529f, +0.605237f,0.0231859f, 0.601974f,0.0225348f, 0.598922f,0.0218956f, 0.596013f,0.0212732f, 0.593118f,0.0206641f, +0.590763f,0.0200679f, 0.588717f,0.0194896f, 0.586685f,0.0189268f, 0.584686f,0.0183799f, 0.582702f,0.0178438f, +0.58075f,0.017321f, 0.578807f,0.0168132f, 0.576862f,0.0163154f, 0.574906f,0.0158234f, 0.572948f,0.015345f, +0.571078f,0.0148765f, 0.569232f,0.0144206f, 0.56746f,0.0139776f, 0.565699f,0.013543f, 0.564043f,0.0131187f, +0.562511f,0.0127001f, 0.560982f,0.0122922f, 0.559562f,0.0119036f, 0.558301f,0.0115243f, 0.557042f,0.011157f, +0.555795f,0.0108015f, 0.55454f,0.010454f, 0.553273f,0.0101157f, 0.552113f,0.00978347f, 0.551011f,0.00945495f, +0.549879f,0.00913f, 0.548762f,0.0088125f, 0.54769f,0.0085048f, 0.546773f,0.00820324f, 0.546018f,0.00791444f, +0.545246f,0.007631f, 0.544459f,0.00735761f, 0.543661f,0.00709522f, 0.542838f,0.00683874f, 0.542063f,0.006593f, +0.541313f,0.00635308f, 0.540558f,0.00612073f, 0.539772f,0.00589339f, 0.539049f,0.00567028f, 0.538413f,0.00545011f, +0.537753f,0.00523764f, 0.537059f,0.00503064f, 0.536334f,0.00482946f, 0.535637f,0.00463905f, 0.534991f,0.00445274f, +0.534477f,0.00427355f, 0.533913f,0.00409585f, 0.533307f,0.00392228f, 0.532787f,0.00375581f, 0.532279f,0.00359248f, +0.531831f,0.00343533f, 0.531429f,0.00328176f, 0.531154f,0.00312979f, 0.530905f,0.0029856f, 0.530743f,0.00285046f, +0.530592f,0.00271987f, 0.530409f,0.00259327f, 0.530205f,0.00247034f, 0.529992f,0.00235143f, 0.529739f,0.00223641f, +0.529453f,0.00212595f, 0.529152f,0.00202027f, 0.52891f,0.00191802f, 0.528643f,0.00182086f, 0.528356f,0.00172648f, +0.528155f,0.00163688f, 0.527993f,0.00155148f, 0.527888f,0.00146628f, 0.527773f,0.00138314f, 0.527613f,0.00130379f, +0.527431f,0.00122818f, 0.527363f,0.00115517f, 0.52727f,0.0010836f, 0.527169f,0.00101705f, 0.527047f,0.00095481f, +0.526941f,0.000894887f, 0.526913f,0.000835972f, 0.52693f,0.000780008f, 0.527049f,0.000727271f, 0.527125f,0.000676609f, +0.527148f,0.000627303f, 0.527307f,0.000581432f, 0.527456f,0.000538692f, 0.527571f,0.000497782f, 0.527641f,0.000459564f, +0.527666f,0.000423698f, 0.527702f,0.000389777f, 0.527745f,0.000355856f, 0.527853f,0.000322909f, 0.527961f,0.000293242f, +0.52806f,0.000264601f, 0.528133f,0.000238244f, 0.528214f,0.000214069f, 0.528418f,0.000191353f, 0.528599f,0.000170188f, +0.528908f,0.00015041f, 0.529012f,0.000130715f, 0.529163f,0.000113285f, 0.529373f,9.69669e-05f, 0.529583f,8.21224e-05f, +0.529824f,6.85466e-05f, 0.530126f,5.60852e-05f, 0.530266f,4.43248e-05f, + +0.681437f,0.038563f, 0.676786f,0.0376239f, 0.672239f,0.0366934f, 0.667789f,0.0357715f, 0.663428f,0.0348592f, +0.659149f,0.0339565f, 0.654946f,0.0330621f, 0.650813f,0.0321824f, 0.646746f,0.0313191f, 0.642748f,0.0304812f, +0.638806f,0.0296597f, 0.634925f,0.0288573f, 0.631125f,0.0280854f, 0.627365f,0.0273257f, 0.623639f,0.0265767f, +0.619973f,0.025853f, 0.616464f,0.0251516f, 0.612987f,0.0244643f, 0.609533f,0.0237905f, 0.606119f,0.0231276f, +0.602791f,0.0224811f, 0.599477f,0.0218458f, 0.596495f,0.021224f, 0.593524f,0.0206163f, 0.590648f,0.0200246f, +0.588511f,0.0194431f, 0.586391f,0.0188796f, 0.58429f,0.0183339f, 0.582219f,0.0178039f, 0.580169f,0.0172869f, +0.578132f,0.0167796f, 0.576091f,0.0162817f, 0.574052f,0.0158003f, 0.572003f,0.015326f, 0.57f,0.0148595f, +0.568063f,0.0144096f, 0.566159f,0.0139655f, 0.564305f,0.013534f, 0.562477f,0.0131137f, 0.560852f,0.0127021f, +0.559217f,0.0122984f, 0.557624f,0.0119012f, 0.556249f,0.0115175f, 0.554885f,0.011151f, 0.553529f,0.0107951f, +0.55217f,0.0104502f, 0.5508f,0.0101157f, 0.54952f,0.00978974f, 0.548324f,0.00947095f, 0.547102f,0.00915654f, +0.545888f,0.00884536f, 0.544689f,0.00853861f, 0.543669f,0.00823764f, 0.54281f,0.00794905f, 0.541928f,0.00766683f, +0.541032f,0.00739508f, 0.540104f,0.00712793f, 0.539151f,0.00686856f, 0.53825f,0.00661894f, 0.537385f,0.00637679f, +0.536517f,0.00614633f, 0.535619f,0.00592152f, 0.534812f,0.00570272f, 0.534078f,0.00548927f, 0.533312f,0.00528056f, +0.532496f,0.00507296f, 0.531671f,0.00487206f, 0.530839f,0.00467826f, 0.530093f,0.00448999f, 0.529453f,0.00431044f, +0.528777f,0.0041354f, 0.528096f,0.00396663f, 0.527507f,0.00380153f, 0.526915f,0.0036398f, 0.5264f,0.00348538f, +0.52595f,0.00333353f, 0.525623f,0.00318637f, 0.525276f,0.00304349f, 0.525007f,0.00290263f, 0.5247f,0.00276609f, +0.524385f,0.00263845f, 0.524109f,0.00251764f, 0.523779f,0.00239864f, 0.523422f,0.00228424f, 0.523028f,0.00217305f, +0.52261f,0.00206583f, 0.522236f,0.00196257f, 0.521816f,0.00186277f, 0.521409f,0.00176641f, 0.521098f,0.00167552f, +0.520835f,0.00158773f, 0.520662f,0.00150453f, 0.520496f,0.00142559f, 0.520259f,0.00134764f, 0.519994f,0.00127041f, +0.519854f,0.00119723f, 0.519691f,0.00112663f, 0.519472f,0.0010586f, 0.519186f,0.000992091f, 0.518999f,0.000929661f, +0.518986f,0.000871941f, 0.518966f,0.000816905f, 0.518994f,0.000763317f, 0.518936f,0.000711119f, 0.5189f,0.000662245f, +0.518943f,0.00061513f, 0.518946f,0.000569362f, 0.518909f,0.000526488f, 0.518856f,0.00048699f, 0.518721f,0.000449205f, +0.518587f,0.000413238f, 0.518579f,0.000379913f, 0.518699f,0.000348864f, 0.518737f,0.00031798f, 0.518742f,0.000287792f, +0.518717f,0.000260398f, 0.518669f,0.000234073f, 0.518708f,0.000209886f, 0.51874f,0.000187545f, 0.518964f,0.000166784f, +0.519146f,0.000147539f, 0.519267f,0.000129625f, 0.519321f,0.000111842f, 0.519503f,9.61591e-05f, 0.519548f,8.12525e-05f, +0.519737f,6.80805e-05f, 0.519878f,5.55296e-05f, 0.520035f,4.41571e-05f, + +0.678552f,0.0374476f, 0.673994f,0.0365339f, 0.669528f,0.0356281f, 0.665149f,0.0347302f, 0.660847f,0.0338414f, +0.656618f,0.0329618f, 0.652455f,0.03209f, 0.648355f,0.0312333f, 0.644314f,0.0303935f, 0.640332f,0.0295765f, +0.636398f,0.0287757f, 0.63253f,0.0279996f, 0.628724f,0.0272474f, 0.624951f,0.026506f, 0.621216f,0.0257793f, +0.617558f,0.0250758f, 0.614027f,0.0243946f, 0.610516f,0.023725f, 0.607021f,0.0230686f, 0.603601f,0.022428f, +0.600224f,0.0217981f, 0.596984f,0.0211788f, 0.593944f,0.0205739f, 0.590914f,0.0199833f, 0.588335f,0.0194066f, +0.586135f,0.0188441f, 0.583938f,0.0182939f, 0.581777f,0.0177631f, 0.579628f,0.0172469f, 0.577509f,0.0167463f, +0.575387f,0.0162556f, 0.573257f,0.0157725f, 0.57112f,0.0153016f, 0.568997f,0.0148429f, 0.566966f,0.0143941f, +0.564947f,0.0139567f, 0.563003f,0.0135301f, 0.561038f,0.0131088f, 0.559274f,0.0126969f, 0.557537f,0.0122966f, +0.555844f,0.0119059f, 0.554321f,0.0115237f, 0.552841f,0.0111487f, 0.55138f,0.0107903f, 0.54992f,0.0104471f, +0.548442f,0.0101124f, 0.547023f,0.00978556f, 0.545724f,0.00947014f, 0.544405f,0.00916261f, 0.543098f,0.00886125f, +0.541811f,0.00856401f, 0.540695f,0.00827055f, 0.53972f,0.00798325f, 0.53873f,0.00770075f, 0.537719f,0.00742714f, +0.536683f,0.0071608f, 0.535633f,0.00690479f, 0.534633f,0.00665422f, 0.533653f,0.00641044f, 0.532654f,0.00617613f, +0.531625f,0.00594743f, 0.530709f,0.00572807f, 0.529856f,0.00551562f, 0.52898f,0.00530984f, 0.528067f,0.00510834f, +0.527163f,0.00491268f, 0.526213f,0.00471877f, 0.525369f,0.00452891f, 0.524601f,0.00434689f, 0.5238f,0.00417019f, +0.523043f,0.00400138f, 0.522383f,0.00383841f, 0.521702f,0.00368153f, 0.521092f,0.00352802f, 0.520603f,0.00337669f, +0.520186f,0.00323219f, 0.519776f,0.00309131f, 0.519422f,0.00295403f, 0.519028f,0.00281994f, 0.518618f,0.00268956f, +0.518179f,0.00256192f, 0.51774f,0.00244221f, 0.517277f,0.00232863f, 0.516771f,0.00221813f, 0.516257f,0.00211097f, +0.515764f,0.00200752f, 0.515211f,0.00190642f, 0.514719f,0.00180993f, 0.514294f,0.00171646f, 0.513914f,0.00162621f, +0.513608f,0.00153939f, 0.513289f,0.00145788f, 0.512935f,0.00138061f, 0.512696f,0.00130727f, 0.512521f,0.00123641f, +0.51226f,0.00116551f, 0.511951f,0.00109803f, 0.511626f,0.00103249f, 0.511439f,0.000969613f, 0.511288f,0.000908413f, +0.511136f,0.00084985f, 0.511044f,0.000795906f, 0.5109f,0.000744679f, 0.510793f,0.000695419f, 0.510744f,0.000647222f, +0.510679f,0.000601886f, 0.510561f,0.000558456f, 0.510339f,0.000516042f, 0.510047f,0.000475875f, 0.509803f,0.000439071f, +0.509688f,0.000404124f, 0.509618f,0.000370679f, 0.509628f,0.000340177f, 0.509643f,0.000311498f, 0.509557f,0.000283237f, +0.509443f,0.000255666f, 0.509386f,0.000230396f, 0.509294f,0.000206295f, 0.509417f,0.000184517f, 0.509499f,0.000163962f, +0.509494f,0.000145057f, 0.509535f,0.000127553f, 0.509672f,0.000110973f, 0.509691f,9.5222e-05f, 0.509714f,8.0782e-05f, +0.509708f,6.71892e-05f, 0.509722f,5.49734e-05f, 0.509876f,4.39572e-05f, + +0.675574f,0.0363691f, 0.671104f,0.0354797f, 0.666714f,0.0345976f, 0.6624f,0.033723f, 0.658155f,0.0328567f, +0.653974f,0.0319992f, 0.64985f,0.0311494f, 0.64578f,0.0303147f, 0.641763f,0.0294981f, 0.637796f,0.0287015f, +0.63387f,0.0279201f, 0.630013f,0.0271691f, 0.626201f,0.0264355f, 0.622416f,0.0257119f, 0.618672f,0.0250079f, +0.61503f,0.0243259f, 0.61147f,0.0236624f, 0.607923f,0.0230089f, 0.60439f,0.0223687f, 0.600961f,0.0217489f, +0.597536f,0.0211359f, 0.594368f,0.0205321f, 0.591276f,0.0199447f, 0.588195f,0.0193697f, 0.5859f,0.0188112f, +0.583631f,0.0182667f, 0.581375f,0.0177308f, 0.579137f,0.0172117f, 0.576929f,0.016711f, 0.574728f,0.0162247f, +0.572519f,0.0157478f, 0.570299f,0.0152784f, 0.568066f,0.0148172f, 0.565933f,0.0143745f, 0.563815f,0.0139439f, +0.561771f,0.0135195f, 0.559727f,0.0131068f, 0.557792f,0.0126996f, 0.55596f,0.0122984f, 0.554157f,0.0119063f, +0.552477f,0.0115263f, 0.550909f,0.0111573f, 0.549354f,0.0107981f, 0.547778f,0.0104451f, 0.546192f,0.0101074f, +0.544645f,0.00978355f, 0.54324f,0.0094682f, 0.541811f,0.00915878f, 0.540392f,0.00885898f, 0.53902f,0.00856972f, +0.537802f,0.00828716f, 0.536727f,0.00800851f, 0.535648f,0.00773212f, 0.53454f,0.00746101f, 0.533403f,0.00719495f, +0.532241f,0.00693749f, 0.531141f,0.0066861f, 0.530061f,0.00644525f, 0.528951f,0.0062099f, 0.527813f,0.0059794f, +0.526781f,0.00575852f, 0.525802f,0.00554287f, 0.524801f,0.00533595f, 0.523779f,0.00513433f, 0.522759f,0.00493909f, +0.521709f,0.00474948f, 0.520795f,0.0045659f, 0.519914f,0.00438395f, 0.519025f,0.00420608f, 0.518196f,0.004036f, +0.517423f,0.00387222f, 0.516627f,0.00371382f, 0.515947f,0.0035619f, 0.515412f,0.00341536f, 0.514913f,0.00327252f, +0.514416f,0.00313188f, 0.513958f,0.00299653f, 0.513473f,0.00286603f, 0.512988f,0.00273756f, 0.512468f,0.00261211f, +0.511903f,0.00248999f, 0.51129f,0.00237098f, 0.51065f,0.00225834f, 0.510043f,0.00215198f, 0.509432f,0.00204847f, +0.508797f,0.00194798f, 0.508226f,0.0018518f, 0.507718f,0.00175845f, 0.507256f,0.00166752f, 0.506829f,0.00157995f, +0.506384f,0.00149629f, 0.505928f,0.00141502f, 0.50558f,0.00133817f, 0.505262f,0.00126601f, 0.504913f,0.00119761f, +0.50453f,0.00113243f, 0.504216f,0.00106765f, 0.503995f,0.00100538f, 0.503765f,0.000945365f, 0.503552f,0.000887025f, +0.503309f,0.000830063f, 0.503008f,0.000775724f, 0.502811f,0.000725239f, 0.502721f,0.000678116f, 0.502578f,0.000632536f, +0.502339f,0.000587909f, 0.502036f,0.00054579f, 0.50168f,0.000505846f, 0.50131f,0.000466684f, 0.501065f,0.000429232f, +0.500938f,0.000395085f, 0.500846f,0.000362977f, 0.50071f,0.000332209f, 0.500568f,0.000304137f, 0.50048f,0.00027803f, +0.50037f,0.000252058f, 0.500197f,0.000226756f, 0.500198f,0.000203621f, 0.500142f,0.000181249f, 0.500021f,0.000161512f, +0.499909f,0.000142564f, 0.499919f,0.000125176f, 0.499953f,0.000109437f, 0.499818f,9.38286e-05f, 0.499753f,7.97764e-05f, +0.4998f,6.66918e-05f, 0.499777f,5.47132e-05f, 0.499798f,4.37253e-05f, + +0.672505f,0.0353261f, 0.668117f,0.0344601f, 0.6638f,0.0336008f, 0.659549f,0.0327484f, 0.655358f,0.031904f, +0.651221f,0.0310677f, 0.647132f,0.0302391f, 0.643092f,0.029426f, 0.639097f,0.0286312f, 0.635144f,0.0278544f, +0.631226f,0.0270923f, 0.627378f,0.0263647f, 0.62356f,0.0256491f, 0.619765f,0.0249445f, 0.616011f,0.0242624f, +0.612382f,0.0235999f, 0.608793f,0.0229523f, 0.605213f,0.0223152f, 0.601675f,0.0216939f, 0.598204f,0.0210897f, +0.594787f,0.0204939f, 0.591637f,0.0199083f, 0.588489f,0.0193356f, 0.585673f,0.0187788f, 0.583336f,0.0182357f, +0.580998f,0.0177049f, 0.578689f,0.0171882f, 0.57639f,0.0166832f, 0.574111f,0.0161963f, 0.571825f,0.0157204f, +0.56953f,0.0152563f, 0.567221f,0.0147997f, 0.564961f,0.0143549f, 0.562761f,0.013924f, 0.560602f,0.0135062f, +0.558476f,0.0130961f, 0.556371f,0.0126923f, 0.554462f,0.0122999f, 0.552562f,0.011912f, 0.550727f,0.0115335f, +0.549068f,0.0111641f, 0.547423f,0.0108075f, 0.545761f,0.0104593f, 0.544075f,0.0101181f, 0.542395f,0.00978416f, +0.540864f,0.00946454f, 0.539337f,0.00915712f, 0.53781f,0.00885864f, 0.536335f,0.00856717f, 0.534988f,0.0082858f, +0.533812f,0.00801472f, 0.532652f,0.00774905f, 0.531461f,0.00748645f, 0.530233f,0.00722553f, 0.528978f,0.00696931f, +0.527779f,0.00671902f, 0.526592f,0.00647732f, 0.52537f,0.00624028f, 0.524139f,0.00601152f, 0.522994f,0.00578981f, +0.521902f,0.00557283f, 0.520785f,0.00536386f, 0.519662f,0.00516118f, 0.518527f,0.00496593f, 0.517363f,0.00477713f, +0.516348f,0.00459246f, 0.515379f,0.00441282f, 0.514416f,0.00424083f, 0.513515f,0.00407162f, 0.51262f,0.00390504f, +0.511725f,0.00374555f, 0.510975f,0.00359272f, 0.510363f,0.00344537f, 0.509761f,0.0033038f, 0.509185f,0.00316693f, +0.508627f,0.00303413f, 0.508058f,0.00290302f, 0.50748f,0.00277647f, 0.506875f,0.00265531f, 0.506215f,0.00253567f, +0.505502f,0.00241817f, 0.504737f,0.00230334f, 0.504006f,0.00219196f, 0.503275f,0.00208639f, 0.502552f,0.00198624f, +0.501886f,0.00189025f, 0.501293f,0.00179604f, 0.500775f,0.00170616f, 0.500271f,0.0016197f, 0.499713f,0.00153555f, +0.499223f,0.00145458f, 0.498761f,0.00137606f, 0.498281f,0.00130026f, 0.497758f,0.00122769f, 0.497289f,0.00115965f, +0.496926f,0.00109564f, 0.49665f,0.00103584f, 0.496352f,0.000976721f, 0.496062f,0.000918912f, 0.495749f,0.000863737f, +0.495365f,0.000809825f, 0.495108f,0.000757191f, 0.494868f,0.000706605f, 0.494592f,0.000659639f, 0.494279f,0.000616068f, +0.493892f,0.00057409f, 0.493437f,0.000533147f, 0.493023f,0.000494197f, 0.492776f,0.000457288f, 0.492585f,0.000421346f, +0.492325f,0.000386623f, 0.492081f,0.000354946f, 0.491815f,0.000325262f, 0.491589f,0.000296949f, 0.491396f,0.000271036f, +0.491277f,0.000247292f, 0.491239f,0.000223522f, 0.491142f,0.00020061f, 0.49095f,0.000179449f, 0.490664f,0.00015873f, +0.490599f,0.000140957f, 0.490418f,0.000123388f, 0.490194f,0.000107277f, 0.490134f,9.28915e-05f, 0.490042f,7.8693e-05f, +0.489971f,6.61345e-05f, 0.489941f,5.44311e-05f, 0.489805f,4.34672e-05f, + +0.669348f,0.0343174f, 0.665038f,0.0334737f, 0.66079f,0.0326364f, 0.656598f,0.0318055f, 0.652456f,0.030982f, +0.648361f,0.0301661f, 0.644308f,0.0293585f, 0.640294f,0.0285662f, 0.63632f,0.0277919f, 0.63238f,0.0270343f, +0.628473f,0.0262936f, 0.624629f,0.0255855f, 0.620806f,0.0248887f, 0.617002f,0.0242043f, 0.613244f,0.0235406f, +0.609618f,0.0228974f, 0.606f,0.0222641f, 0.602389f,0.0216437f, 0.598845f,0.0210396f, 0.595332f,0.0204498f, +0.591985f,0.0198709f, 0.58879f,0.0193042f, 0.58559f,0.0187472f, 0.583048f,0.0182069f, 0.580645f,0.0176773f, +0.578258f,0.0171627f, 0.575882f,0.0166627f, 0.57353f,0.0161739f, 0.571171f,0.0156966f, 0.568803f,0.015233f, +0.566422f,0.0147794f, 0.564043f,0.0143385f, 0.561767f,0.013909f, 0.559489f,0.0134883f, 0.557286f,0.0130817f, +0.555064f,0.0126839f, 0.553024f,0.0122923f, 0.551031f,0.0119104f, 0.549077f,0.0115395f, 0.547314f,0.0111751f, +0.545579f,0.010819f, 0.543827f,0.0104702f, 0.542055f,0.0101313f, 0.540284f,0.00980023f, 0.538619f,0.00947631f, +0.536983f,0.00916107f, 0.53535f,0.00885934f, 0.533785f,0.00857057f, 0.532312f,0.00829124f, 0.531007f,0.00801675f, +0.529741f,0.0077504f, 0.528459f,0.00749387f, 0.527148f,0.00724182f, 0.525821f,0.00699418f, 0.524528f,0.00674869f, +0.523242f,0.0065074f, 0.521917f,0.00626991f, 0.520592f,0.00604194f, 0.519334f,0.00581897f, 0.518138f,0.0056025f, +0.516914f,0.00539298f, 0.515689f,0.00518847f, 0.514442f,0.00499147f, 0.513171f,0.0048011f, 0.512067f,0.00461786f, +0.511018f,0.0044413f, 0.509976f,0.00427f, 0.508984f,0.00410181f, 0.507996f,0.00393942f, 0.507025f,0.00378049f, +0.506182f,0.00362456f, 0.505471f,0.00347476f, 0.504743f,0.00333081f, 0.504063f,0.00319326f, 0.503408f,0.00306091f, +0.502768f,0.0029332f, 0.502099f,0.00281028f, 0.501374f,0.00268794f, 0.500612f,0.00256969f, 0.499823f,0.00245679f, +0.49899f,0.00234591f, 0.498188f,0.00223665f, 0.497346f,0.00212949f, 0.496514f,0.00202554f, 0.495758f,0.00192617f, +0.49509f,0.00183251f, 0.494489f,0.00174355f, 0.493861f,0.00165578f, 0.493242f,0.0015718f, 0.492668f,0.0014909f, +0.492121f,0.00141262f, 0.491541f,0.0013371f, 0.490962f,0.00126434f, 0.490415f,0.00119412f, 0.489926f,0.00112651f, +0.489476f,0.00106222f, 0.489066f,0.00100261f, 0.488684f,0.000945857f, 0.488272f,0.000891378f, 0.487842f,0.000838071f, +0.487569f,0.000787642f, 0.487257f,0.000738185f, 0.486861f,0.000689597f, 0.486381f,0.000642182f, 0.485873f,0.00059871f, +0.485352f,0.000558216f, 0.484953f,0.000519957f, 0.484677f,0.000482727f, 0.484442f,0.000447207f, 0.484143f,0.000413337f, +0.483809f,0.000380322f, 0.483405f,0.000348079f, 0.483069f,0.000318502f, 0.482732f,0.000290909f, 0.482465f,0.000264772f, +0.482353f,0.00024105f, 0.482314f,0.000219486f, 0.482085f,0.000197702f, 0.481782f,0.000176998f, 0.481546f,0.000157553f, +0.481225f,0.000138503f, 0.481004f,0.000122103f, 0.480726f,0.000105977f, 0.480562f,9.15894e-05f, 0.48047f,7.80996e-05f, +0.480246f,6.55548e-05f, 0.48008f,5.38402e-05f, 0.479904f,4.31796e-05f, + +0.666106f,0.0333416f, 0.66187f,0.0325194f, 0.657686f,0.0317032f, 0.653549f,0.0308931f, 0.649456f,0.0300897f, +0.6454f,0.0292936f, 0.641378f,0.0285069f, 0.63739f,0.0277337f, 0.633435f,0.02698f, 0.629507f,0.0262407f, +0.625614f,0.0255219f, 0.62177f,0.024832f, 0.61794f,0.0241527f, 0.614133f,0.0234884f, 0.61039f,0.0228432f, +0.606742f,0.0222163f, 0.603097f,0.0215983f, 0.599454f,0.0209925f, 0.595903f,0.0204051f, 0.59235f,0.0198301f, +0.589074f,0.0192689f, 0.585832f,0.0187192f, 0.58276f,0.01818f, 0.580299f,0.0176526f, 0.577836f,0.0171373f, +0.575399f,0.0166389f, 0.572971f,0.0161541f, 0.57055f,0.0156808f, 0.568112f,0.015214f, 0.565662f,0.0147599f, +0.563204f,0.0143195f, 0.560821f,0.0138942f, 0.558459f,0.0134783f, 0.556155f,0.013069f, 0.553855f,0.012669f, +0.551646f,0.012282f, 0.54956f,0.0119026f, 0.547529f,0.0115335f, 0.545618f,0.0111776f, 0.543807f,0.0108282f, +0.541978f,0.0104841f, 0.540122f,0.0101453f, 0.538258f,0.00981401f, 0.536474f,0.00949318f, 0.534756f,0.00917966f, +0.533026f,0.00887535f, 0.531355f,0.00858029f, 0.529741f,0.00829587f, 0.528321f,0.00802265f, 0.526962f,0.00775844f, +0.525573f,0.00749856f, 0.524159f,0.00724615f, 0.52275f,0.00700406f, 0.521368f,0.0067662f, 0.519997f,0.00653127f, +0.51859f,0.00629954f, 0.517171f,0.0060718f, 0.515803f,0.0058478f, 0.51451f,0.00563207f, 0.513187f,0.00542204f, +0.511867f,0.00521767f, 0.510525f,0.00502062f, 0.509147f,0.00482843f, 0.507951f,0.00464285f, 0.506812f,0.00446489f, +0.505677f,0.00429442f, 0.504597f,0.00412867f, 0.503511f,0.00396815f, 0.502473f,0.00381031f, 0.501571f,0.00365856f, +0.50076f,0.00350864f, 0.499916f,0.00336269f, 0.499134f,0.00322196f, 0.498361f,0.00308571f, 0.497598f,0.00295646f, +0.496808f,0.00283241f, 0.495988f,0.00271313f, 0.49515f,0.00259894f, 0.494258f,0.00248585f, 0.493328f,0.00237534f, +0.492469f,0.00227062f, 0.49156f,0.00216812f, 0.490683f,0.00206752f, 0.489873f,0.00196803f, 0.489097f,0.00187093f, +0.488377f,0.00177813f, 0.487657f,0.00169037f, 0.486982f,0.0016076f, 0.486303f,0.0015262f, 0.485655f,0.00144696f, +0.485024f,0.00137203f, 0.484372f,0.00129915f, 0.483762f,0.0012288f, 0.483184f,0.00116113f, 0.48265f,0.00109583f, +0.482091f,0.00103293f, 0.481553f,0.000972311f, 0.481019f,0.000916372f, 0.480562f,0.00086387f, 0.480203f,0.000813442f, +0.479795f,0.00076393f, 0.479352f,0.000717614f, 0.478835f,0.000672494f, 0.478229f,0.000627924f, 0.477578f,0.00058423f, +0.477071f,0.00054351f, 0.476715f,0.000505865f, 0.476405f,0.00047041f, 0.476033f,0.00043634f, 0.475677f,0.000403845f, +0.475263f,0.000372672f, 0.47486f,0.000342506f, 0.474405f,0.000312861f, 0.474036f,0.000285221f, 0.473799f,0.000259686f, +0.473554f,0.000235598f, 0.473243f,0.000213855f, 0.472919f,0.000193924f, 0.472607f,0.000173917f, 0.472318f,0.000155107f, +0.471994f,0.000137186f, 0.471615f,0.000120082f, 0.471343f,0.000104866f, 0.471159f,9.03469e-05f, 0.470876f,7.73896e-05f, +0.470608f,6.47768e-05f, 0.470298f,5.32741e-05f, 0.470101f,4.28663e-05f, + +0.662783f,0.0323975f, 0.658616f,0.0315961f, 0.654492f,0.0308003f, 0.650408f,0.03001f, 0.646358f,0.0292262f, +0.64234f,0.028449f, 0.638349f,0.0276825f, 0.634383f,0.0269277f, 0.630447f,0.0261939f, 0.626529f,0.0254723f, +0.622649f,0.0247759f, 0.618804f,0.0241023f, 0.614968f,0.0234398f, 0.611155f,0.0227945f, 0.607428f,0.0221678f, +0.603757f,0.0215563f, 0.600085f,0.0209534f, 0.596441f,0.0203638f, 0.592854f,0.0197904f, 0.589333f,0.0192294f, +0.586053f,0.0186862f, 0.582765f,0.0181523f, 0.57995f,0.01763f, 0.577431f,0.0171163f, 0.574924f,0.0166178f, +0.572422f,0.0161309f, 0.569943f,0.0156617f, 0.56745f,0.0152005f, 0.564938f,0.0147465f, 0.562412f,0.0143026f, +0.559912f,0.0138767f, 0.557485f,0.0134633f, 0.555076f,0.0130591f, 0.55271f,0.0126622f, 0.550327f,0.0122725f, +0.548165f,0.0118931f, 0.546045f,0.0115283f, 0.543976f,0.0111719f, 0.542083f,0.0108237f, 0.540185f,0.0104883f, +0.538259f,0.0101561f, 0.536313f,0.00982927f, 0.53441f,0.00950898f, 0.532615f,0.00919642f, 0.530804f,0.00889429f, +0.529034f,0.00859833f, 0.527288f,0.00831137f, 0.525747f,0.00803418f, 0.524286f,0.00776566f, 0.522804f,0.00750636f, +0.521304f,0.00725511f, 0.519793f,0.00701041f, 0.518305f,0.0067731f, 0.516852f,0.00654401f, 0.515365f,0.00631952f, +0.513865f,0.00609732f, 0.512401f,0.00587746f, 0.511012f,0.00566194f, 0.509596f,0.00545013f, 0.50819f,0.00524732f, +0.506758f,0.00505037f, 0.505291f,0.00485879f, 0.504021f,0.00467401f, 0.50278f,0.00449481f, 0.501542f,0.00432138f, +0.500355f,0.00415283f, 0.499169f,0.00399162f, 0.498075f,0.0038365f, 0.497096f,0.00368604f, 0.496194f,0.0035385f, +0.495278f,0.00339689f, 0.494402f,0.00325662f, 0.493528f,0.00311816f, 0.492644f,0.00298639f, 0.491728f,0.00285869f, +0.490792f,0.00273632f, 0.489836f,0.00261996f, 0.48885f,0.00250837f, 0.487852f,0.00240219f, 0.486896f,0.002298f, +0.4859f,0.00219535f, 0.484945f,0.00209773f, 0.484097f,0.00200275f, 0.48327f,0.0019097f, 0.482477f,0.0018172f, +0.48167f,0.00172654f, 0.480888f,0.00164016f, 0.48012f,0.00155839f, 0.479432f,0.00148117f, 0.478707f,0.00140595f, +0.477987f,0.00133253f, 0.477322f,0.00126249f, 0.476663f,0.00119531f, 0.476057f,0.00112989f, 0.475415f,0.00106647f, +0.474813f,0.00100572f, 0.474185f,0.000947809f, 0.473592f,0.000891388f, 0.473091f,0.000838637f, 0.472566f,0.000789098f, +0.472008f,0.000742535f, 0.471378f,0.000696635f, 0.470694f,0.000652974f, 0.470023f,0.000611358f, 0.469478f,0.000570501f, +0.469007f,0.000530202f, 0.468557f,0.000492368f, 0.468071f,0.000457464f, 0.467622f,0.000424469f, 0.467131f,0.000393102f, +0.46667f,0.000363272f, 0.466245f,0.000334693f, 0.465913f,0.000307337f, 0.465563f,0.00028035f, 0.465198f,0.000255095f, +0.464715f,0.000231193f, 0.464182f,0.000208781f, 0.463786f,0.000188828f, 0.46348f,0.000170531f, 0.463106f,0.000152083f, +0.46272f,0.000135002f, 0.462346f,0.000118401f, 0.462086f,0.000103408f, 0.461719f,8.92047e-05f, 0.461302f,7.60435e-05f, +0.461021f,6.40196e-05f, 0.460715f,5.29253e-05f, 0.460401f,4.25276e-05f, + +0.65938f,0.0314842f, 0.655278f,0.0307027f, 0.651212f,0.0299264f, 0.647176f,0.0291553f, 0.643168f,0.0283902f, +0.639184f,0.0276315f, 0.635221f,0.0268844f, 0.631278f,0.0261483f, 0.627358f,0.0254331f, 0.62345f,0.0247286f, +0.619582f,0.0240537f, 0.615734f,0.023396f, 0.611892f,0.0227491f, 0.608073f,0.022122f, 0.604361f,0.0215139f, +0.600667f,0.0209164f, 0.596968f,0.0203283f, 0.593322f,0.0197548f, 0.5897f,0.0191953f, 0.586249f,0.018651f, +0.582925f,0.018121f, 0.579599f,0.0176038f, 0.577023f,0.0170959f, 0.57445f,0.0165976f, 0.571896f,0.0161139f, +0.569348f,0.0156429f, 0.566799f,0.0151824f, 0.564235f,0.0147339f, 0.561655f,0.014294f, 0.559065f,0.0138642f, +0.556547f,0.0134479f, 0.554038f,0.013044f, 0.551605f,0.0126517f, 0.549153f,0.0122666f, 0.546829f,0.0118866f, +0.544615f,0.0115195f, 0.542433f,0.0111669f, 0.540427f,0.0108227f, 0.53845f,0.0104847f, 0.536451f,0.0101559f, +0.534432f,0.00983692f, 0.532433f,0.00952276f, 0.530553f,0.00921471f, 0.528662f,0.00891158f, 0.526795f,0.00861606f, +0.524962f,0.00833004f, 0.523268f,0.00805003f, 0.521716f,0.00777833f, 0.520143f,0.00751689f, 0.518554f,0.00726375f, +0.516953f,0.00701973f, 0.515359f,0.0067818f, 0.513806f,0.00655033f, 0.512223f,0.00632554f, 0.51064f,0.00610835f, +0.509089f,0.00589657f, 0.507623f,0.0056869f, 0.506141f,0.00548022f, 0.504656f,0.00527825f, 0.503128f,0.00507965f, +0.501578f,0.00488931f, 0.500223f,0.00470487f, 0.498881f,0.00452437f, 0.497553f,0.00435041f, 0.496275f,0.00418127f, +0.495f,0.00401882f, 0.493819f,0.00386051f, 0.492752f,0.00370935f, 0.49177f,0.00356417f, 0.490755f,0.00342307f, +0.489805f,0.00328531f, 0.488878f,0.00315302f, 0.487921f,0.00302317f, 0.486917f,0.00289451f, 0.485875f,0.00277021f, +0.484803f,0.00265117f, 0.483697f,0.0025371f, 0.482588f,0.00242715f, 0.48152f,0.00232167f, 0.480453f,0.00222241f, +0.47942f,0.00212575f, 0.478476f,0.00203012f, 0.477574f,0.00193829f, 0.476734f,0.0018501f, 0.475885f,0.001764f, +0.475029f,0.0016784f, 0.474189f,0.00159399f, 0.473374f,0.00151275f, 0.472563f,0.00143675f, 0.471794f,0.00136464f, +0.471073f,0.00129524f, 0.470331f,0.00122659f, 0.469645f,0.00116157f, 0.46895f,0.00109936f, 0.468264f,0.00103891f, +0.467545f,0.000979974f, 0.466878f,0.000922799f, 0.466272f,0.000868673f, 0.465617f,0.000816492f, 0.464917f,0.000767315f, +0.464161f,0.000720256f, 0.463401f,0.000677047f, 0.462649f,0.000634692f, 0.462041f,0.000594269f, 0.461541f,0.000555413f, +0.460996f,0.000517446f, 0.46038f,0.000480038f, 0.45978f,0.000444916f, 0.459174f,0.000412348f, 0.458657f,0.00038174f, +0.4582f,0.000353028f, 0.457806f,0.000326085f, 0.457421f,0.000299886f, 0.457031f,0.000274834f, 0.456487f,0.000250112f, +0.455874f,0.000227054f, 0.455309f,0.00020502f, 0.454774f,0.000184149f, 0.454333f,0.000165839f, 0.45393f,0.000148911f, +0.453511f,0.000132173f, 0.453169f,0.000116641f, 0.452762f,0.000101309f, 0.452282f,8.78921e-05f, 0.451885f,7.48146e-05f, +0.451554f,6.33349e-05f, 0.451206f,5.2336e-05f, 0.450807f,4.2165e-05f, + +0.655901f,0.0306004f, 0.65186f,0.029838f, 0.647847f,0.0290806f, 0.643857f,0.028328f, 0.639888f,0.027581f, +0.635936f,0.0268402f, 0.632f,0.0261116f, 0.628078f,0.0253942f, 0.624172f,0.0246963f, 0.620274f,0.0240101f, +0.616415f,0.023354f, 0.612565f,0.0227116f, 0.608719f,0.0220815f, 0.604898f,0.0214709f, 0.60119f,0.02088f, +0.597475f,0.0202962f, 0.593751f,0.0197222f, 0.590102f,0.019165f, 0.586447f,0.0186197f, 0.58306f,0.0180898f, +0.579695f,0.0175737f, 0.576598f,0.0170712f, 0.573983f,0.0165789f, 0.571369f,0.0160968f, 0.568757f,0.0156256f, +0.566161f,0.0151687f, 0.563545f,0.0147193f, 0.560913f,0.014282f, 0.558266f,0.0138547f, 0.555645f,0.0134396f, +0.553074f,0.0130325f, 0.550536f,0.012638f, 0.548025f,0.0122547f, 0.545539f,0.0118807f, 0.54324f,0.011516f, +0.540986f,0.0111599f, 0.538819f,0.0108152f, 0.536778f,0.0104826f, 0.534713f,0.0101572f, 0.532618f,0.00983644f, +0.530542f,0.00952697f, 0.528552f,0.0092255f, 0.526596f,0.0089289f, 0.52464f,0.00863665f, 0.522723f,0.00834889f, +0.520899f,0.00806893f, 0.519242f,0.00779731f, 0.517577f,0.00753059f, 0.515901f,0.00727385f, 0.514213f,0.00702866f, +0.512518f,0.00679021f, 0.510877f,0.00655944f, 0.509203f,0.00633399f, 0.507522f,0.00611462f, 0.50586f,0.00590253f, +0.504318f,0.0056981f, 0.502782f,0.00549921f, 0.501223f,0.00530297f, 0.499621f,0.00510917f, 0.498002f,0.00491945f, +0.496542f,0.00473341f, 0.495113f,0.00455425f, 0.493704f,0.00438106f, 0.492336f,0.00421134f, 0.490989f,0.00404721f, +0.489725f,0.00388895f, 0.488592f,0.00373773f, 0.487504f,0.00358952f, 0.486393f,0.00344799f, 0.485375f,0.00331235f, +0.484372f,0.00318096f, 0.483329f,0.00305249f, 0.482253f,0.00292842f, 0.481138f,0.00280769f, 0.479966f,0.00268774f, +0.478761f,0.00257127f, 0.477551f,0.00245883f, 0.476374f,0.00235189f, 0.475188f,0.00224879f, 0.47405f,0.00214904f, +0.473024f,0.00205499f, 0.472056f,0.00196499f, 0.471114f,0.00187597f, 0.470171f,0.00178995f, 0.469284f,0.00170763f, +0.468425f,0.00162808f, 0.467564f,0.00154936f, 0.466677f,0.00147126f, 0.465805f,0.00139535f, 0.464982f,0.00132477f, +0.464185f,0.00125731f, 0.463424f,0.00119305f, 0.462634f,0.00112927f, 0.461863f,0.00106815f, 0.461078f,0.00101056f, +0.460369f,0.000954505f, 0.459684f,0.00090006f, 0.458929f,0.000847095f, 0.458107f,0.000795702f, 0.45726f,0.000747348f, +0.456357f,0.000701563f, 0.455543f,0.0006579f, 0.454857f,0.000617135f, 0.454277f,0.000577823f, 0.453659f,0.000540537f, +0.453009f,0.000504866f, 0.452338f,0.000469748f, 0.451639f,0.00043477f, 0.451015f,0.000402071f, 0.450439f,0.000371872f, +0.449901f,0.000343292f, 0.449417f,0.000316655f, 0.448962f,0.00029201f, 0.448389f,0.000267977f, 0.447746f,0.000244964f, +0.44711f,0.000222321f, 0.446521f,0.000201173f, 0.445913f,0.000180807f, 0.445303f,0.000161485f, 0.444809f,0.000144836f, +0.444412f,0.000129177f, 0.444034f,0.000113982f, 0.44354f,9.98694e-05f, 0.443047f,8.62083e-05f, 0.442667f,7.40244e-05f, +0.442135f,6.22456e-05f, 0.441736f,5.16009e-05f, 0.441326f,4.17802e-05f, + +0.652349f,0.029745f, 0.648365f,0.0290011f, 0.644401f,0.0282618f, 0.640455f,0.0275271f, 0.636522f,0.0267976f, +0.6326f,0.0260741f, 0.628688f,0.0253633f, 0.624785f,0.0246644f, 0.620893f,0.0239836f, 0.617003f,0.0233146f, +0.613153f,0.0226761f, 0.6093f,0.0220489f, 0.605451f,0.0214355f, 0.601648f,0.020842f, 0.597922f,0.0202653f, +0.594185f,0.0196956f, 0.590457f,0.0191368f, 0.586784f,0.0185937f, 0.583164f,0.0180639f, 0.579771f,0.0175474f, +0.576367f,0.0170443f, 0.5735f,0.0165563f, 0.570831f,0.0160769f, 0.568177f,0.01561f, 0.565522f,0.0151533f, +0.562864f,0.0147075f, 0.560185f,0.0142717f, 0.557487f,0.0138448f, 0.554783f,0.0134312f, 0.552143f,0.0130271f, +0.549506f,0.0126316f, 0.546935f,0.0122444f, 0.544341f,0.0118694f, 0.541921f,0.0115076f, 0.539591f,0.0111571f, +0.537266f,0.0108121f, 0.535154f,0.0104758f, 0.533025f,0.0101525f, 0.530871f,0.00983796f, 0.528713f,0.00952868f, +0.526605f,0.00922736f, 0.524583f,0.00893566f, 0.522542f,0.00864791f, 0.520559f,0.00836721f, 0.518617f,0.00809065f, +0.51685f,0.00781749f, 0.51511f,0.00755158f, 0.513358f,0.00729437f, 0.511577f,0.00704232f, 0.509775f,0.00679962f, +0.508049f,0.00656758f, 0.50629f,0.00634178f, 0.504521f,0.0061232f, 0.502769f,0.00591049f, 0.501128f,0.00570447f, +0.499508f,0.00550599f, 0.497875f,0.00531516f, 0.496202f,0.00512757f, 0.494532f,0.00494404f, 0.492987f,0.0047631f, +0.491477f,0.00458477f, 0.489982f,0.00441002f, 0.488539f,0.00424165f, 0.487141f,0.00407983f, 0.4858f,0.00392175f, +0.484579f,0.00376817f, 0.4834f,0.0036195f, 0.482206f,0.00347772f, 0.481115f,0.00334003f, 0.480009f,0.00320717f, +0.478877f,0.00308033f, 0.477706f,0.00295651f, 0.476496f,0.00283629f, 0.475255f,0.00271936f, 0.473972f,0.00260569f, +0.472679f,0.00249362f, 0.471396f,0.00238467f, 0.470106f,0.00227863f, 0.468886f,0.00217795f, 0.467751f,0.00208106f, +0.466683f,0.00198716f, 0.465659f,0.00189826f, 0.464679f,0.00181511f, 0.463721f,0.00173287f, 0.462772f,0.00165318f, +0.461845f,0.00157668f, 0.460913f,0.00150235f, 0.460005f,0.00142948f, 0.459072f,0.00135697f, 0.458183f,0.00128585f, +0.457308f,0.00121927f, 0.456449f,0.00115652f, 0.45562f,0.00109716f, 0.454744f,0.00103823f, 0.453958f,0.000980887f, +0.45319f,0.000927281f, 0.452363f,0.00087538f, 0.451494f,0.000824968f, 0.450555f,0.000776123f, 0.449539f,0.000728059f, +0.448686f,0.000682992f, 0.447885f,0.000640272f, 0.447199f,0.000599845f, 0.446478f,0.000561496f, 0.445733f,0.000524978f, +0.445028f,0.00049046f, 0.444381f,0.000457948f, 0.443742f,0.000425999f, 0.443062f,0.000393938f, 0.442386f,0.000363313f, +0.441768f,0.0003353f, 0.441162f,0.000308673f, 0.44048f,0.000283753f, 0.439783f,0.000261042f, 0.439114f,0.000239068f, +0.438486f,0.000217854f, 0.437836f,0.000197125f, 0.437219f,0.000177743f, 0.436582f,0.000158989f, 0.43599f,0.000141347f, +0.435545f,0.000126199f, 0.435055f,0.000111844f, 0.434465f,9.81107e-05f, 0.43398f,8.48561e-05f, 0.433462f,7.2868e-05f, +0.43291f,6.13929e-05f, 0.432414f,5.09801e-05f, 0.431961f,4.13739e-05f, + +0.648725f,0.0289171f, 0.644795f,0.0281911f, 0.640878f,0.0274692f, 0.636972f,0.0267518f, 0.633073f,0.0260391f, +0.629179f,0.0253326f, 0.625289f,0.0246388f, 0.621405f,0.0239579f, 0.617523f,0.0232936f, 0.613647f,0.0226438f, +0.609798f,0.0220197f, 0.605942f,0.0214067f, 0.60209f,0.0208095f, 0.598302f,0.0202325f, 0.594559f,0.0196693f, +0.590801f,0.0191134f, 0.587073f,0.0185697f, 0.583371f,0.0180406f, 0.579815f,0.0175256f, 0.576384f,0.0170219f, +0.572996f,0.0165334f, 0.570293f,0.0160564f, 0.567586f,0.0155916f, 0.564877f,0.015137f, 0.562181f,0.0146948f, +0.559461f,0.0142606f, 0.556723f,0.0138376f, 0.553966f,0.0134231f, 0.55123f,0.013021f, 0.548538f,0.0126269f, +0.54588f,0.012241f, 0.543233f,0.0118643f, 0.54064f,0.0114982f, 0.538229f,0.0111468f, 0.535838f,0.0108065f, +0.533586f,0.0104757f, 0.531392f,0.0101501f, 0.529169f,0.00983204f, 0.526937f,0.00952556f, 0.524725f,0.00922961f, +0.52263f,0.00893747f, 0.52051f,0.00865268f, 0.51845f,0.00837605f, 0.51639f,0.00810325f, 0.514528f,0.00783619f, +0.512721f,0.00757315f, 0.510894f,0.00731455f, 0.509041f,0.00706347f, 0.507156f,0.00681945f, 0.505326f,0.00658049f, +0.50348f,0.00635063f, 0.501631f,0.0061324f, 0.499806f,0.00592075f, 0.498069f,0.00571644f, 0.496365f,0.00551715f, +0.494638f,0.00532327f, 0.492887f,0.00513603f, 0.491153f,0.00495761f, 0.489524f,0.00478279f, 0.487949f,0.00460983f, +0.486392f,0.00444017f, 0.484889f,0.00427331f, 0.483416f,0.00411036f, 0.481995f,0.00395314f, 0.480703f,0.00380178f, +0.479451f,0.0036537f, 0.478163f,0.00350885f, 0.476984f,0.00336923f, 0.475785f,0.00323585f, 0.474548f,0.00310603f, +0.473279f,0.00298086f, 0.471994f,0.00286216f, 0.470666f,0.00274618f, 0.469296f,0.0026336f, 0.467931f,0.0025242f, +0.466566f,0.00241726f, 0.465205f,0.00231227f, 0.463908f,0.00220997f, 0.462695f,0.00211044f, 0.461548f,0.00201616f, +0.460449f,0.00192602f, 0.459362f,0.00183772f, 0.458288f,0.00175371f, 0.457275f,0.00167582f, 0.456257f,0.00159958f, +0.455253f,0.00152497f, 0.454277f,0.0014542f, 0.453293f,0.00138453f, 0.452377f,0.00131718f, 0.451407f,0.00125f, +0.450443f,0.00118355f, 0.449492f,0.00112095f, 0.448547f,0.00106239f, 0.447711f,0.00100724f, 0.446838f,0.000952814f, +0.445916f,0.000899364f, 0.444953f,0.000848908f, 0.443961f,0.000801225f, 0.442898f,0.000754415f, 0.442018f,0.000709447f, +0.441135f,0.000665074f, 0.440334f,0.000622818f, 0.43953f,0.000583109f, 0.43871f,0.000545724f, 0.437939f,0.000510051f, +0.437221f,0.000476668f, 0.43651f,0.000444768f, 0.435826f,0.000414772f, 0.435159f,0.000385607f, 0.43446f,0.000356262f, +0.433736f,0.000328062f, 0.432937f,0.000301964f, 0.432082f,0.00027705f, 0.431281f,0.000253865f, 0.430571f,0.000232703f, +0.429927f,0.000212554f, 0.429307f,0.000193099f, 0.428694f,0.00017443f, 0.428107f,0.000156823f, 0.427485f,0.000139623f, +0.426838f,0.000123748f, 0.42612f,0.000109526f, 0.42559f,9.62761e-05f, 0.425045f,8.37643e-05f, 0.42435f,7.15072e-05f, +0.423894f,6.07699e-05f, 0.423268f,5.04576e-05f, 0.422717f,4.09481e-05f, + +0.645034f,0.0281157f, 0.641154f,0.0274068f, 0.63728f,0.0267019f, 0.633411f,0.026001f, 0.629544f,0.0253046f, +0.625675f,0.0246146f, 0.621807f,0.0239371f, 0.617938f,0.0232739f, 0.614068f,0.0226253f, 0.610203f,0.0219941f, +0.606355f,0.0213839f, 0.602494f,0.0207845f, 0.598639f,0.0202031f, 0.594864f,0.0196419f, 0.591103f,0.0190915f, +0.587325f,0.018549f, 0.583597f,0.018021f, 0.579869f,0.0175056f, 0.57637f,0.0170039f, 0.572907f,0.0165145f, +0.569734f,0.0160381f, 0.566983f,0.0155725f, 0.564237f,0.0151207f, 0.561489f,0.0146802f, 0.558735f,0.0142495f, +0.55596f,0.013828f, 0.553159f,0.013415f, 0.55035f,0.0130147f, 0.547596f,0.0126223f, 0.544848f,0.0122394f, +0.542156f,0.0118628f, 0.53944f,0.0114966f, 0.536912f,0.011141f, 0.534458f,0.0107981f, 0.53205f,0.0104684f, +0.529804f,0.0101475f, 0.527526f,0.00983295f, 0.525215f,0.00952212f, 0.522939f,0.00922499f, 0.520732f,0.00893661f, +0.518552f,0.00865455f, 0.516395f,0.00837713f, 0.514276f,0.00810955f, 0.512262f,0.00784711f, 0.510392f,0.00758809f, +0.508504f,0.00733445f, 0.506585f,0.0070851f, 0.504629f,0.00684015f, 0.50271f,0.00660212f, 0.500795f,0.00637158f, +0.498851f,0.00614626f, 0.496946f,0.00593054f, 0.495107f,0.00572646f, 0.493328f,0.00552809f, 0.49153f,0.00533616f, +0.489715f,0.0051495f, 0.487893f,0.00496869f, 0.486156f,0.00479398f, 0.484509f,0.00462525f, 0.482883f,0.00446029f, +0.481323f,0.0042974f, 0.479799f,0.00413933f, 0.478303f,0.00398385f, 0.476936f,0.00383163f, 0.475609f,0.00368428f, +0.474255f,0.0035428f, 0.473001f,0.003404f, 0.471703f,0.00326739f, 0.470372f,0.00313571f, 0.469021f,0.00301007f, +0.467625f,0.00288719f, 0.466193f,0.002769f, 0.464733f,0.00265672f, 0.46329f,0.00254816f, 0.461847f,0.0024425f, +0.460427f,0.00234062f, 0.459081f,0.00224103f, 0.457824f,0.0021433f, 0.456598f,0.00204777f, 0.455422f,0.00195544f, +0.454265f,0.00186668f, 0.453097f,0.00178224f, 0.451976f,0.00169974f, 0.450843f,0.0016203f, 0.449762f,0.00154648f, +0.448699f,0.00147507f, 0.447651f,0.00140602f, 0.446658f,0.00134008f, 0.445618f,0.00127492f, 0.444642f,0.0012123f, +0.443616f,0.00115035f, 0.44257f,0.00108887f, 0.441608f,0.00103f, 0.440649f,0.000975007f, 0.439666f,0.000923509f, +0.438638f,0.000873569f, 0.437529f,0.000824033f, 0.436406f,0.000776802f, 0.435469f,0.000732198f, 0.43457f,0.000689143f, +0.433753f,0.000647652f, 0.43289f,0.00060706f, 0.431983f,0.000568139f, 0.431143f,0.000531189f, 0.430344f,0.000496832f, +0.429534f,0.000463455f, 0.428751f,0.000432513f, 0.428f,0.000403173f, 0.42728f,0.000375489f, 0.426545f,0.000348585f, +0.42568f,0.000321593f, 0.424756f,0.000295691f, 0.42386f,0.000271593f, 0.423005f,0.000248293f, 0.422246f,0.000226882f, +0.421575f,0.000207256f, 0.420939f,0.000188886f, 0.420328f,0.000171071f, 0.419667f,0.000154002f, 0.419039f,0.00013788f, +0.418214f,0.000122074f, 0.417479f,0.000107699f, 0.41685f,9.45471e-05f, 0.41616f,8.23756e-05f, 0.415488f,7.05796e-05f, +0.414851f,5.98167e-05f, 0.414253f,4.981e-05f, 0.413595f,4.05035e-05f, + +0.641277f,0.0273399f, 0.637443f,0.0266475f, 0.63361f,0.0259588f, 0.629776f,0.025274f, 0.625938f,0.0245934f, +0.622093f,0.0239192f, 0.618243f,0.0232574f, 0.61439f,0.0226119f, 0.610528f,0.0219777f, 0.606675f,0.0213646f, +0.602825f,0.0207679f, 0.598961f,0.0201818f, 0.595102f,0.019616f, 0.591338f,0.0190692f, 0.58756f,0.0185311f, +0.583766f,0.0180023f, 0.580033f,0.0174897f, 0.576314f,0.0169881f, 0.572834f,0.0164978f, 0.56934f,0.0160232f, +0.566372f,0.015558f, 0.56358f,0.0151043f, 0.560789f,0.0146643f, 0.558001f,0.0142363f, 0.555193f,0.0138179f, +0.55236f,0.0134078f, 0.549508f,0.0130074f, 0.546665f,0.0126176f, 0.543866f,0.0122356f, 0.5411f,0.0118629f, +0.538342f,0.0114984f, 0.535648f,0.0111418f, 0.53312f,0.0107976f, 0.530599f,0.0104624f, 0.528249f,0.0101406f, +0.525921f,0.00982863f, 0.523559f,0.00952232f, 0.521211f,0.00922477f, 0.518884f,0.0089325f, 0.516646f,0.00865143f, +0.514403f,0.00837786f, 0.512217f,0.00811003f, 0.510074f,0.0078484f, 0.508118f,0.00759545f, 0.506175f,0.0073473f, +0.5042f,0.00710345f, 0.502185f,0.00686311f, 0.50018f,0.00662583f, 0.498198f,0.00639415f, 0.49618f,0.00616895f, +0.494208f,0.00595248f, 0.492254f,0.00574107f, 0.490396f,0.0055394f, 0.488521f,0.00534702f, 0.486641f,0.00516145f, +0.484744f,0.00498153f, 0.482897f,0.00480564f, 0.481163f,0.00463473f, 0.479456f,0.00447009f, 0.477846f,0.00431252f, +0.476265f,0.00415892f, 0.474699f,0.00400734f, 0.473272f,0.00385948f, 0.471875f,0.00371403f, 0.470444f,0.00357146f, +0.469107f,0.00343273f, 0.467746f,0.00330019f, 0.466354f,0.00317038f, 0.464913f,0.00304226f, 0.463435f,0.00291868f, +0.461929f,0.00280109f, 0.460373f,0.00268604f, 0.45883f,0.00257438f, 0.457297f,0.00246765f, 0.455801f,0.00236587f, +0.454388f,0.00226619f, 0.453066f,0.00217081f, 0.451803f,0.00207792f, 0.450562f,0.00198649f, 0.449329f,0.00189715f, +0.448074f,0.00181086f, 0.446874f,0.00172759f, 0.445675f,0.00164879f, 0.444487f,0.00157163f, 0.443327f,0.00149672f, +0.442183f,0.00142638f, 0.441104f,0.00136003f, 0.440007f,0.00129556f, 0.438959f,0.0012344f, 0.437859f,0.00117427f, +0.436771f,0.0011153f, 0.435768f,0.00105796f, 0.434723f,0.0010012f, 0.433631f,0.000946474f, 0.432499f,0.000895236f, +0.431326f,0.000846913f, 0.430183f,0.000800842f, 0.429177f,0.00075511f, 0.42822f,0.000711213f, 0.427343f,0.000669791f, +0.426405f,0.000629755f, 0.425468f,0.000591391f, 0.424582f,0.000553768f, 0.423702f,0.000517939f, 0.422813f,0.000483507f, +0.421939f,0.000451836f, 0.421069f,0.000420759f, 0.420245f,0.000392175f, 0.419408f,0.000364731f, 0.418519f,0.000339272f, +0.417594f,0.000314401f, 0.416632f,0.000289451f, 0.415732f,0.000265655f, 0.4149f,0.000243481f, 0.414132f,0.000222088f, +0.413392f,0.000202392f, 0.412672f,0.000184201f, 0.411951f,0.000167321f, 0.4113f,0.000150968f, 0.410529f,0.000135459f, +0.409673f,0.000120378f, 0.40895f,0.000106071f, 0.408162f,9.30437e-05f, 0.407402f,8.09048e-05f, 0.406808f,6.99531e-05f, +0.40598f,5.89581e-05f, 0.405295f,4.91171e-05f, 0.404601f,4.00421e-05f, + +0.637457f,0.0265887f, 0.633667f,0.0259122f, 0.629872f,0.0252393f, 0.626069f,0.0245699f, 0.622258f,0.0239046f, +0.618435f,0.0232462f, 0.614602f,0.0225991f, 0.610762f,0.0219705f, 0.606909f,0.0213508f, 0.603064f,0.0207545f, +0.599214f,0.0201714f, 0.595349f,0.0195997f, 0.5915f,0.0190486f, 0.587728f,0.0185139f, 0.583932f,0.0179881f, +0.580141f,0.0174746f, 0.576383f,0.0169742f, 0.572723f,0.0164865f, 0.569214f,0.0160099f, 0.565734f,0.015547f, +0.562912f,0.0150925f, 0.560085f,0.0146508f, 0.557253f,0.0142227f, 0.554418f,0.0138072f, 0.551556f,0.0133998f, +0.548665f,0.0129997f, 0.545763f,0.0126111f, 0.542905f,0.0122311f, 0.540055f,0.0118599f, 0.537259f,0.0114973f, +0.53444f,0.011145f, 0.531811f,0.010801f, 0.529243f,0.0104655f, 0.526736f,0.0101402f, 0.524352f,0.00982315f, +0.52194f,0.00951721f, 0.519526f,0.00922242f, 0.51711f,0.00893371f, 0.514795f,0.00865017f, 0.512466f,0.0083736f, +0.510218f,0.00810919f, 0.507961f,0.00785137f, 0.5059f,0.00759682f, 0.503893f,0.00734994f, 0.501864f,0.00711149f, +0.499797f,0.00687636f, 0.497724f,0.00664675f, 0.495687f,0.00641994f, 0.493614f,0.00619671f, 0.491565f,0.00597828f, +0.489514f,0.00576636f, 0.48758f,0.00556171f, 0.48562f,0.00536194f, 0.483665f,0.0051728f, 0.481694f,0.00499243f, +0.479743f,0.00481758f, 0.477936f,0.0046476f, 0.476153f,0.00448154f, 0.474475f,0.00432283f, 0.47282f,0.00417009f, +0.471188f,0.00402372f, 0.469689f,0.00387985f, 0.468221f,0.00373704f, 0.466729f,0.00359743f, 0.465316f,0.00346053f, +0.463884f,0.00332713f, 0.462417f,0.00319739f, 0.460922f,0.00307368f, 0.45938f,0.0029523f, 0.457787f,0.00283228f, +0.456156f,0.00271629f, 0.45455f,0.00260633f, 0.452936f,0.00249888f, 0.451356f,0.00239449f, 0.449866f,0.00229379f, +0.448466f,0.00219704f, 0.447139f,0.00210336f, 0.445832f,0.00201365f, 0.444547f,0.00192735f, 0.44323f,0.00184185f, +0.441953f,0.00175847f, 0.440681f,0.00167749f, 0.439417f,0.00159897f, 0.438192f,0.00152525f, 0.436969f,0.00145313f, +0.435777f,0.00138282f, 0.434584f,0.00131629f, 0.433441f,0.00125415f, 0.432244f,0.00119363f, 0.431106f,0.00113632f, +0.430053f,0.00108051f, 0.428957f,0.00102595f, 0.427798f,0.00097241f, 0.42657f,0.000919664f, 0.425313f,0.00086882f, +0.42412f,0.000821059f, 0.423051f,0.000776006f, 0.422088f,0.000733767f, 0.421129f,0.00069172f, 0.420127f,0.00065112f, +0.419161f,0.000612875f, 0.418227f,0.000575778f, 0.417278f,0.000540003f, 0.416324f,0.000505232f, 0.41534f,0.000471895f, +0.414375f,0.000439769f, 0.413453f,0.000410199f, 0.412501f,0.000381209f, 0.411501f,0.000354505f, 0.410488f,0.000329117f, +0.409507f,0.000305592f, 0.408601f,0.000282676f, 0.40775f,0.000259781f, 0.406931f,0.000237989f, 0.406147f,0.000217701f, +0.405305f,0.000198063f, 0.404463f,0.000180029f, 0.403723f,0.000163252f, 0.402911f,0.000147499f, 0.40201f,0.000132501f, +0.401285f,0.000118466f, 0.400442f,0.000104392f, 0.399556f,9.14023e-05f, 0.398777f,7.95045e-05f, 0.398014f,6.84813e-05f, +0.397292f,5.82211e-05f, 0.39649f,4.85339e-05f, 0.395737f,3.95643e-05f, + +0.633577f,0.0258612f, 0.629827f,0.0252001f, 0.626067f,0.0245423f, 0.622294f,0.023888f, 0.618507f,0.0232373f, +0.614705f,0.0225942f, 0.610887f,0.0219615f, 0.607059f,0.0213491f, 0.603212f,0.0207443f, 0.599376f,0.0201636f, +0.595523f,0.0195935f, 0.591657f,0.0190356f, 0.587823f,0.0184988f, 0.584036f,0.017976f, 0.580223f,0.0174618f, +0.576434f,0.0169629f, 0.572654f,0.0164763f, 0.569047f,0.0160005f, 0.56551f,0.0155375f, 0.562223f,0.015085f, +0.559359f,0.0146412f, 0.556495f,0.0142112f, 0.553627f,0.0137947f, 0.550743f,0.0133912f, 0.547828f,0.0129941f, +0.54489f,0.0126057f, 0.541948f,0.0122264f, 0.539054f,0.0118564f, 0.536188f,0.0114952f, 0.533332f,0.0111433f, +0.530545f,0.0108031f, 0.527916f,0.010471f, 0.525285f,0.0101448f, 0.522827f,0.00982747f, 0.520364f,0.0095177f, +0.517877f,0.00921729f, 0.515415f,0.00893056f, 0.512995f,0.00865091f, 0.510616f,0.0083764f, 0.508273f,0.00810707f, +0.505947f,0.00784818f, 0.50374f,0.00759774f, 0.501679f,0.00735432f, 0.49959f,0.00711484f, 0.497471f,0.00688316f, +0.495319f,0.00665778f, 0.493234f,0.00643659f, 0.491118f,0.00622038f, 0.489007f,0.00600714f, 0.486874f,0.00579644f, +0.48486f,0.00558948f, 0.482836f,0.00538833f, 0.48081f,0.00519586f, 0.478754f,0.00500819f, 0.476691f,0.00482901f, +0.474802f,0.00465816f, 0.472966f,0.00449402f, 0.471213f,0.00433617f, 0.469487f,0.00418182f, 0.467764f,0.00403369f, +0.46618f,0.00389013f, 0.464652f,0.00375258f, 0.463103f,0.0036174f, 0.461627f,0.00348374f, 0.460136f,0.00335326f, +0.458599f,0.00322457f, 0.457025f,0.00309988f, 0.455411f,0.00297831f, 0.453765f,0.00286233f, 0.452071f,0.00274879f, +0.450377f,0.00263624f, 0.448677f,0.0025267f, 0.447042f,0.00242348f, 0.445487f,0.00232298f, 0.444022f,0.00222556f, +0.442637f,0.00213155f, 0.441244f,0.00204037f, 0.439863f,0.00195186f, 0.438477f,0.00186649f, 0.437136f,0.00178574f, +0.435827f,0.00170578f, 0.434511f,0.00162816f, 0.43322f,0.00155304f, 0.431927f,0.00147986f, 0.43068f,0.00141066f, +0.429411f,0.00134391f, 0.428146f,0.00127776f, 0.426849f,0.00121517f, 0.425644f,0.0011565f, 0.42451f,0.00110035f, +0.423326f,0.00104624f, 0.422102f,0.000994156f, 0.420828f,0.000943424f, 0.41953f,0.000893453f, 0.4183f,0.000844771f, +0.417145f,0.000797554f, 0.416092f,0.000753023f, 0.415069f,0.000710992f, 0.414027f,0.000671815f, 0.413028f,0.000633236f, +0.412018f,0.000595636f, 0.411001f,0.000560261f, 0.409998f,0.000526095f, 0.408947f,0.000492633f, 0.407926f,0.000460388f, +0.406907f,0.000429306f, 0.405865f,0.000399455f, 0.40477f,0.000371712f, 0.403649f,0.000344971f, 0.402568f,0.000319887f, +0.401595f,0.000296601f, 0.400745f,0.000274821f, 0.399931f,0.000253843f, 0.399084f,0.000232724f, 0.398181f,0.000212772f, +0.397268f,0.000194082f, 0.396405f,0.000175878f, 0.395513f,0.000159464f, 0.394497f,0.000143935f, 0.393634f,0.000129149f, +0.392831f,0.000115519f, 0.391972f,0.000102673f, 0.391064f,8.977e-05f, 0.390272f,7.80742e-05f, 0.389378f,6.71263e-05f, +0.388644f,5.73559e-05f, 0.387815f,4.78508e-05f, 0.387004f,3.90728e-05f, + +0.629639f,0.0251567f, 0.625926f,0.0245104f, 0.622198f,0.0238673f, 0.618453f,0.0232274f, 0.614688f,0.0225911f, +0.610904f,0.0219627f, 0.607101f,0.0213451f, 0.603283f,0.0207469f, 0.599443f,0.0201565f, 0.595612f,0.0195912f, +0.591757f,0.0190335f, 0.587889f,0.0184895f, 0.584067f,0.0179658f, 0.580266f,0.0174547f, 0.576436f,0.0169523f, +0.572647f,0.0164666f, 0.568846f,0.0159933f, 0.56529f,0.0155306f, 0.561723f,0.0150796f, 0.558623f,0.0146367f, +0.555726f,0.0142053f, 0.55282f,0.0137853f, 0.549914f,0.0133807f, 0.546979f,0.0129868f, 0.544011f,0.0126003f, +0.541026f,0.0122231f, 0.538071f,0.0118541f, 0.535124f,0.0114921f, 0.532238f,0.0111414f, 0.529329f,0.0108022f, +0.526601f,0.0104713f, 0.523929f,0.0101491f, 0.52133f,0.00983443f, 0.518826f,0.00952424f, 0.516294f,0.00922249f, +0.513767f,0.00893168f, 0.511236f,0.00864934f, 0.508813f,0.00837792f, 0.506385f,0.00811121f, 0.50401f,0.0078517f, +0.501661f,0.00759719f, 0.499516f,0.00735382f, 0.497378f,0.00711858f, 0.495207f,0.00688868f, 0.493002f,0.0066637f, +0.490836f,0.00644587f, 0.48867f,0.00623322f, 0.486494f,0.00602419f, 0.484315f,0.00581945f, 0.482215f,0.00561752f, +0.48014f,0.00541865f, 0.47805f,0.00522414f, 0.47593f,0.00503499f, 0.47378f,0.00485234f, 0.471794f,0.00467568f, +0.469887f,0.00450867f, 0.468056f,0.00434987f, 0.466265f,0.00419651f, 0.464453f,0.00404733f, 0.462776f,0.00390135f, +0.461166f,0.00376178f, 0.45955f,0.00362669f, 0.458017f,0.00349847f, 0.456468f,0.00337242f, 0.45487f,0.00324728f, +0.453237f,0.00312514f, 0.451554f,0.00300414f, 0.449826f,0.00288639f, 0.448056f,0.0027723f, 0.446301f,0.00266309f, +0.444543f,0.00255656f, 0.44284f,0.00245105f, 0.441214f,0.002348f, 0.439681f,0.0022513f, 0.438243f,0.00215767f, +0.436787f,0.00206691f, 0.435348f,0.00197906f, 0.433891f,0.00189392f, 0.432461f,0.0018101f, 0.431097f,0.00173039f, +0.429725f,0.00165425f, 0.428379f,0.00157977f, 0.427017f,0.00150697f, 0.4257f,0.00143678f, 0.424343f,0.00136836f, +0.423012f,0.00130329f, 0.421666f,0.0012409f, 0.420381f,0.00117945f, 0.419149f,0.00112075f, 0.417887f,0.00106585f, +0.416597f,0.00101382f, 0.415268f,0.00096379f, 0.41392f,0.000915392f, 0.412661f,0.000868232f, 0.411464f,0.000821686f, +0.410347f,0.000776015f, 0.409229f,0.000731901f, 0.408096f,0.000690623f, 0.407016f,0.000651076f, 0.405945f,0.000614212f, +0.404872f,0.000578737f, 0.403798f,0.000544049f, 0.402696f,0.000511351f, 0.401629f,0.00047989f, 0.400553f,0.000448937f, +0.399444f,0.000418841f, 0.398277f,0.000389961f, 0.397093f,0.000362252f, 0.395959f,0.000336583f, 0.394902f,0.000311839f, +0.393964f,0.000288532f, 0.393065f,0.000267132f, 0.392201f,0.000247027f, 0.39127f,0.000227733f, 0.390299f,0.000208216f, +0.389355f,0.000189672f, 0.388391f,0.000172444f, 0.387252f,0.000155502f, 0.386291f,0.000140515f, 0.385427f,0.000126252f, +0.384451f,0.000112514f, 0.383544f,0.000100041f, 0.382737f,8.8099e-05f, 0.381863f,7.66911e-05f, 0.380959f,6.60016e-05f, +0.380073f,5.61619e-05f, 0.379275f,4.71087e-05f, 0.378406f,3.85665e-05f, + +0.625647f,0.0244743f, 0.621968f,0.0238423f, 0.618269f,0.0232134f, 0.614549f,0.0225874f, 0.610805f,0.021965f, +0.607037f,0.0213508f, 0.603246f,0.0207484f, 0.599437f,0.0201634f, 0.595604f,0.0195878f, 0.591776f,0.0190364f, +0.587919f,0.0184908f, 0.584048f,0.0179607f, 0.580237f,0.0174491f, 0.576421f,0.0169493f, 0.57258f,0.0164593f, +0.568784f,0.0159853f, 0.565025f,0.0155252f, 0.561457f,0.0150757f, 0.557858f,0.0146354f, 0.554934f,0.014202f, +0.552005f,0.0137822f, 0.549066f,0.0133743f, 0.546115f,0.0129795f, 0.543128f,0.012594f, 0.540117f,0.0122192f, +0.537085f,0.0118518f, 0.534109f,0.0114919f, 0.531151f,0.0111413f, 0.52821f,0.0108011f, 0.52532f,0.0104711f, +0.522594f,0.0101493f, 0.519871f,0.0098373f, 0.517316f,0.00953263f, 0.514748f,0.00923327f, 0.512161f,0.00894115f, +0.509574f,0.00865641f, 0.507052f,0.00837959f, 0.504546f,0.0081128f, 0.502122f,0.00785645f, 0.499664f,0.00760453f, +0.49741f,0.00735705f, 0.495215f,0.00711753f, 0.492997f,0.00688991f, 0.490745f,0.00666912f, 0.488496f,0.00645133f, +0.486279f,0.00624013f, 0.484042f,0.00603539f, 0.481812f,0.00583389f, 0.479621f,0.00563621f, 0.477501f,0.00544222f, +0.475364f,0.00525221f, 0.473192f,0.00506481f, 0.470977f,0.00488097f, 0.468895f,0.00470262f, 0.466915f,0.00453157f, +0.465003f,0.00436707f, 0.463136f,0.00421079f, 0.461255f,0.00406161f, 0.459484f,0.00391677f, 0.457806f,0.00377642f, +0.456119f,0.00363871f, 0.454493f,0.00350795f, 0.452865f,0.00338089f, 0.451215f,0.00326021f, 0.449525f,0.00314218f, +0.447784f,0.00302495f, 0.445998f,0.00291024f, 0.444158f,0.00279656f, 0.442319f,0.00268544f, 0.44048f,0.00257738f, +0.438733f,0.00247472f, 0.437068f,0.00237553f, 0.435477f,0.00227732f, 0.433956f,0.00218099f, 0.432432f,0.00209015f, +0.430934f,0.00200281f, 0.429409f,0.00191808f, 0.427942f,0.00183591f, 0.426515f,0.00175672f, 0.425066f,0.00167834f, +0.423644f,0.00160289f, 0.422224f,0.00153142f, 0.42084f,0.00146162f, 0.419413f,0.0013931f, 0.41802f,0.00132768f, +0.416629f,0.00126449f, 0.415298f,0.00120366f, 0.414001f,0.0011459f, 0.412651f,0.00108854f, 0.411251f,0.0010335f, +0.409851f,0.000981843f, 0.408436f,0.00093318f, 0.40714f,0.00088697f, 0.405914f,0.000842346f, 0.40477f,0.000798505f, +0.403587f,0.000755025f, 0.40241f,0.000712649f, 0.401249f,0.000671642f, 0.400088f,0.000633117f, 0.398912f,0.000596004f, +0.397758f,0.00056133f, 0.396575f,0.00052823f, 0.395425f,0.000496026f, 0.394299f,0.00046575f, 0.393167f,0.000436715f, +0.39197f,0.000408188f, 0.390754f,0.000380392f, 0.389561f,0.000353628f, 0.38845f,0.000328089f, 0.387447f,0.000304207f, +0.386453f,0.000281357f, 0.385475f,0.000259816f, 0.384471f,0.000240216f, 0.383474f,0.000221421f, 0.38251f,0.000203583f, +0.381481f,0.000185588f, 0.380323f,0.000168592f, 0.379228f,0.000152413f, 0.378273f,0.000136944f, 0.377286f,0.000123257f, +0.376302f,0.000110129f, 0.375389f,9.76349e-05f, 0.374594f,8.65325e-05f, 0.373586f,7.5283e-05f, 0.372725f,6.51057e-05f, +0.371752f,5.53419e-05f, 0.370821f,4.63184e-05f, 0.369945f,3.80502e-05f, + +0.621601f,0.0238132f, 0.617954f,0.023195f, 0.614282f,0.0225798f, 0.610584f,0.0219674f, 0.606859f,0.0213584f, +0.603106f,0.0207579f, 0.599327f,0.0201702f, 0.595525f,0.0195979f, 0.5917f,0.0190378f, 0.587872f,0.0184985f, +0.58401f,0.0179648f, 0.580136f,0.0174483f, 0.576335f,0.0169491f, 0.572504f,0.0164598f, 0.568666f,0.0159826f, +0.564851f,0.0155202f, 0.561142f,0.0150717f, 0.557548f,0.0146345f, 0.554122f,0.0142045f, 0.551165f,0.0137815f, +0.548201f,0.0133716f, 0.545232f,0.0129765f, 0.542232f,0.0125906f, 0.539196f,0.0122129f, 0.536142f,0.0118486f, +0.533098f,0.0114915f, 0.530067f,0.0111405f, 0.5271f,0.0108017f, 0.524109f,0.0104726f, 0.521275f,0.010151f, +0.518513f,0.00983917f, 0.515819f,0.00953624f, 0.513219f,0.00924013f, 0.51059f,0.0089514f, 0.507962f,0.00866811f, +0.505337f,0.0083911f, 0.502789f,0.00812038f, 0.500271f,0.00785841f, 0.497773f,0.00760781f, 0.495357f,0.00736378f, +0.493123f,0.00712756f, 0.490851f,0.00689535f, 0.488543f,0.00667106f, 0.486214f,0.00645443f, 0.48395f,0.00624604f, +0.481643f,0.00604027f, 0.479364f,0.005841f, 0.47708f,0.00564701f, 0.474913f,0.00545661f, 0.472729f,0.00527113f, +0.470513f,0.00508829f, 0.468256f,0.00490846f, 0.466077f,0.00473159f, 0.464035f,0.00455935f, 0.462053f,0.00439319f, +0.460113f,0.00423292f, 0.458159f,0.00407817f, 0.456286f,0.00393143f, 0.454542f,0.00379068f, 0.452798f,0.00365485f, +0.451091f,0.00352298f, 0.44939f,0.00339349f, 0.447658f,0.00327001f, 0.445889f,0.00315076f, 0.444086f,0.00303646f, +0.442242f,0.00292517f, 0.440346f,0.00281486f, 0.438449f,0.00270707f, 0.436555f,0.00260063f, 0.434752f,0.00249686f, +0.433004f,0.00239569f, 0.431366f,0.00229934f, 0.42979f,0.00220603f, 0.428196f,0.00211416f, 0.426618f,0.00202381f, +0.425022f,0.00193812f, 0.423515f,0.00185678f, 0.422029f,0.00177812f, 0.420525f,0.00170154f, 0.419052f,0.00162777f, +0.417566f,0.00155471f, 0.416101f,0.00148377f, 0.414622f,0.00141656f, 0.413191f,0.00135144f, 0.411736f,0.00128802f, +0.410341f,0.00122687f, 0.408975f,0.0011679f, 0.407557f,0.00111083f, 0.406116f,0.00105744f, 0.404652f,0.00100442f, +0.403151f,0.000952728f, 0.401756f,0.000903959f, 0.400459f,0.000858047f, 0.399266f,0.00081501f, 0.398071f,0.00077393f, +0.396872f,0.000733606f, 0.395656f,0.000693405f, 0.394414f,0.000653578f, 0.393165f,0.000615347f, 0.391923f,0.000579446f, +0.390646f,0.000545172f, 0.389426f,0.000512344f, 0.388234f,0.000481508f, 0.387011f,0.000451596f, 0.385776f,0.000423479f, +0.384544f,0.000396695f, 0.383343f,0.000370518f, 0.382204f,0.000345036f, 0.381125f,0.000320246f, 0.380068f,0.000296684f, +0.37902f,0.000274377f, 0.377902f,0.000253215f, 0.37681f,0.000233311f, 0.375755f,0.000215244f, 0.374714f,0.000197894f, +0.373576f,0.000181262f, 0.372451f,0.000164813f, 0.371484f,0.000149466f, 0.370391f,0.000134323f, 0.369302f,0.000120222f, +0.368342f,0.000107778f, 0.367438f,9.57244e-05f, 0.366406f,8.43298e-05f, 0.365502f,7.40503e-05f, 0.364487f,6.38331e-05f, +0.363479f,5.43371e-05f, 0.362553f,4.56687e-05f, 0.361621f,3.75216e-05f, + +0.617505f,0.0231727f, 0.613887f,0.0225679f, 0.61024f,0.0219659f, 0.606562f,0.0213666f, 0.602854f,0.0207706f, +0.599114f,0.0201834f, 0.595346f,0.0196099f, 0.591549f,0.0190499f, 0.587732f,0.0185048f, 0.583902f,0.0179771f, +0.580039f,0.0174564f, 0.576172f,0.0169526f, 0.572365f,0.0164645f, 0.56852f,0.015986f, 0.564683f,0.0155209f, +0.56085f,0.0150699f, 0.557188f,0.0146326f, 0.553567f,0.0142063f, 0.550309f,0.0137862f, 0.547323f,0.0133748f, +0.544325f,0.0129753f, 0.541317f,0.0125905f, 0.538271f,0.0122132f, 0.535193f,0.0118453f, 0.532088f,0.0114882f, +0.529032f,0.0111414f, 0.525994f,0.0108035f, 0.522978f,0.0104742f, 0.519985f,0.010154f, 0.517173f,0.00984222f, +0.514363f,0.00953997f, 0.511708f,0.00924456f, 0.509048f,0.0089577f, 0.506372f,0.0086775f, 0.503684f,0.00840347f, +0.501072f,0.00813477f, 0.498472f,0.00787117f, 0.495929f,0.00761521f, 0.493385f,0.00736793f, 0.491069f,0.00713368f, +0.488758f,0.00690467f, 0.486406f,0.00668038f, 0.484012f,0.00645989f, 0.481676f,0.00624918f, 0.479321f,0.00604484f, +0.476976f,0.00584603f, 0.474608f,0.00565071f, 0.472376f,0.00546325f, 0.470145f,0.00528112f, 0.467888f,0.00510248f, +0.465589f,0.00492772f, 0.463319f,0.00475547f, 0.461228f,0.0045869f, 0.45918f,0.00442136f, 0.457181f,0.00425944f, +0.455168f,0.00410314f, 0.4532f,0.00395221f, 0.451375f,0.00380663f, 0.449567f,0.00366949f, 0.447787f,0.00353814f, +0.446025f,0.00341025f, 0.44422f,0.00328478f, 0.442373f,0.00316252f, 0.440496f,0.00304629f, 0.438577f,0.00293338f, +0.436624f,0.00282553f, 0.434666f,0.00272127f, 0.432724f,0.00261798f, 0.430874f,0.00251718f, 0.429067f,0.00241753f, +0.427366f,0.00232026f, 0.42571f,0.00222532f, 0.424059f,0.0021342f, 0.422426f,0.00204638f, 0.42077f,0.00196013f, +0.419201f,0.00187578f, 0.417638f,0.0017955f, 0.416084f,0.00171995f, 0.41455f,0.00164676f, 0.413019f,0.00157552f, +0.411508f,0.00150695f, 0.409987f,0.00143925f, 0.408478f,0.00137292f, 0.406962f,0.00131019f, 0.405515f,0.00124898f, +0.404075f,0.00118943f, 0.402602f,0.0011324f, 0.401107f,0.00107785f, 0.399574f,0.00102477f, 0.398038f,0.000974736f, +0.3966f,0.000925525f, 0.395237f,0.000877455f, 0.393945f,0.000831794f, 0.392674f,0.000789003f, 0.3914f,0.000748402f, +0.390138f,0.000710115f, 0.388869f,0.00067273f, 0.387586f,0.000635628f, 0.386274f,0.00059862f, 0.384932f,0.000562993f, +0.383633f,0.000529333f, 0.382365f,0.000497783f, 0.381057f,0.000466916f, 0.379776f,0.000438472f, 0.378465f,0.000410606f, +0.377231f,0.000384629f, 0.376054f,0.00035976f, 0.374939f,0.000335467f, 0.373861f,0.000312032f, 0.372771f,0.000289309f, +0.371601f,0.000267642f, 0.370437f,0.000247f, 0.369264f,0.000227289f, 0.368154f,0.000209008f, 0.366991f,0.000192494f, +0.365854f,0.000176639f, 0.364834f,0.000161153f, 0.363751f,0.000146157f, 0.36266f,0.000132119f, 0.361552f,0.000117984f, +0.360561f,0.000105388f, 0.35955f,9.38115e-05f, 0.358445f,8.26418e-05f, 0.357458f,7.24601e-05f, 0.356411f,6.26001e-05f, +0.355455f,5.35369e-05f, 0.354432f,4.49573e-05f, 0.353436f,3.69833e-05f, + +0.613361f,0.0225521f, 0.609769f,0.0219602f, 0.606145f,0.021371f, 0.602486f,0.0207844f, 0.598792f,0.0202011f, +0.595064f,0.0196269f, 0.591304f,0.0190669f, 0.587512f,0.0185188f, 0.5837f,0.0179882f, 0.579869f,0.0174717f, +0.576005f,0.016964f, 0.572149f,0.0164726f, 0.56833f,0.0159947f, 0.56447f,0.0155271f, 0.560634f,0.0150731f, +0.556783f,0.0146345f, 0.553165f,0.0142077f, 0.549517f,0.0137911f, 0.546418f,0.0133803f, 0.543404f,0.0129804f, +0.540377f,0.0125923f, 0.537326f,0.0122162f, 0.534234f,0.0118469f, 0.531116f,0.0114894f, 0.52799f,0.0111402f, +0.524897f,0.0108036f, 0.521848f,0.0104763f, 0.518784f,0.010157f, 0.515845f,0.00984548f, 0.513002f,0.00954303f, +0.510211f,0.00924854f, 0.507523f,0.0089625f, 0.504802f,0.00868462f, 0.502089f,0.00841379f, 0.49938f,0.00814762f, +0.496728f,0.00788554f, 0.494129f,0.00763038f, 0.491515f,0.00738181f, 0.489057f,0.00714119f, 0.486701f,0.00690982f, +0.48431f,0.00668737f, 0.481879f,0.00646931f, 0.479464f,0.0062569f, 0.47706f,0.00604973f, 0.474648f,0.00584963f, +0.472232f,0.00565633f, 0.469901f,0.00546773f, 0.467616f,0.00528492f, 0.465316f,0.00510935f, 0.462973f,0.00493731f, +0.460622f,0.00476911f, 0.45847f,0.00460563f, 0.456367f,0.00444509f, 0.454323f,0.00428707f, 0.452261f,0.00413121f, +0.450205f,0.00397805f, 0.448311f,0.0038308f, 0.446435f,0.00368891f, 0.444567f,0.00355288f, 0.442741f,0.00342367f, +0.440884f,0.00330031f, 0.438985f,0.00318017f, 0.437037f,0.00306192f, 0.43504f,0.00294549f, 0.433012f,0.00283564f, +0.430968f,0.00272889f, 0.428972f,0.00262664f, 0.427067f,0.0025289f, 0.425209f,0.00243259f, 0.423461f,0.00233829f, +0.421747f,0.00224507f, 0.420041f,0.00215391f, 0.41834f,0.00206513f, 0.416643f,0.00198034f, 0.415031f,0.00189772f, +0.413402f,0.00181738f, 0.411764f,0.00173788f, 0.410147f,0.00166185f, 0.408566f,0.00159138f, 0.407006f,0.00152358f, +0.405443f,0.00145766f, 0.403888f,0.00139399f, 0.40232f,0.00133113f, 0.400805f,0.00126924f, 0.399319f,0.00121068f, +0.397787f,0.00115342f, 0.396223f,0.00109779f, 0.39462f,0.0010442f, 0.393034f,0.000993396f, 0.39157f,0.000944255f, +0.390166f,0.000897676f, 0.388828f,0.00085204f, 0.387473f,0.000807118f, 0.386112f,0.00076435f, 0.384765f,0.000724603f, +0.383427f,0.000686523f, 0.382099f,0.000650629f, 0.38077f,0.000616272f, 0.379395f,0.000582033f, 0.378028f,0.000547745f, +0.376666f,0.000514304f, 0.375308f,0.000482926f, 0.373962f,0.000453518f, 0.37261f,0.000424941f, 0.371325f,0.000398593f, +0.370087f,0.000372975f, 0.368946f,0.000349148f, 0.367844f,0.000326196f, 0.36671f,0.000303854f, 0.365504f,0.000282155f, +0.364288f,0.000261106f, 0.363073f,0.000241069f, 0.361894f,0.000222054f, 0.360627f,0.000203697f, 0.359377f,0.000186793f, +0.358312f,0.00017168f, 0.357239f,0.000157162f, 0.356108f,0.000142808f, 0.355043f,0.000129143f, 0.354023f,0.000116378f, +0.352923f,0.00010334f, 0.351769f,9.20673e-05f, 0.350668f,8.11333e-05f, 0.34955f,7.0869e-05f, 0.348501f,6.15434e-05f, +0.347507f,5.26592e-05f, 0.346453f,4.42331e-05f, 0.345393f,3.64375e-05f, + +0.609171f,0.0219506f, 0.605604f,0.0213713f, 0.601999f,0.0207945f, 0.598357f,0.0202201f, 0.594676f,0.0196491f, +0.590958f,0.0190875f, 0.587206f,0.0185406f, 0.583418f,0.0180043f, 0.579611f,0.0174874f, 0.575776f,0.0169818f, +0.57191f,0.0164869f, 0.568064f,0.0160073f, 0.564232f,0.0155398f, 0.560359f,0.0150821f, 0.556523f,0.0146401f, +0.552713f,0.0142121f, 0.549078f,0.0137958f, 0.545488f,0.0133884f, 0.542457f,0.0129875f, 0.539411f,0.0125981f, +0.536357f,0.0122218f, 0.533262f,0.0118537f, 0.53013f,0.0114942f, 0.526969f,0.0111445f, 0.523831f,0.010804f, +0.520716f,0.0104765f, 0.517636f,0.01016f, 0.514544f,0.00985014f, 0.51165f,0.00954633f, 0.508763f,0.00925324f, +0.506013f,0.0089678f, 0.503269f,0.00869066f, 0.500509f,0.0084205f, 0.497729f,0.0081571f, 0.495031f,0.00789782f, +0.492358f,0.00764486f, 0.489716f,0.00739803f, 0.487106f,0.00715745f, 0.484697f,0.00692345f, 0.48226f,0.00669495f, +0.479787f,0.00647569f, 0.477299f,0.0062645f, 0.474856f,0.00605804f, 0.47238f,0.00585559f, 0.469917f,0.00566024f, +0.467487f,0.00547145f, 0.465158f,0.00529043f, 0.462808f,0.00511336f, 0.460418f,0.00494195f, 0.458f,0.00477643f, +0.455763f,0.00461592f, 0.453613f,0.00445946f, 0.451511f,0.00430556f, 0.449408f,0.00415377f, 0.447286f,0.00400445f, +0.445332f,0.00385824f, 0.443398f,0.00371472f, 0.441457f,0.00357676f, 0.439564f,0.00344273f, 0.437634f,0.00331444f, +0.435669f,0.00319236f, 0.433669f,0.00307602f, 0.431625f,0.00296285f, 0.429532f,0.00285136f, 0.427402f,0.00274119f, +0.425345f,0.00263693f, 0.423355f,0.00253647f, 0.421428f,0.00244022f, 0.419623f,0.00234766f, 0.417857f,0.0022576f, +0.416113f,0.00216956f, 0.414378f,0.00208288f, 0.412621f,0.00199828f, 0.410956f,0.00191577f, 0.409266f,0.00183634f, +0.407589f,0.00175905f, 0.405926f,0.00168338f, 0.404264f,0.00160937f, 0.402629f,0.00153845f, 0.400993f,0.00147179f, +0.399384f,0.00140861f, 0.397762f,0.0013472f, 0.396221f,0.00128801f, 0.394682f,0.00122969f, 0.393082f,0.00117216f, +0.39148f,0.00111763f, 0.389822f,0.00106429f, 0.388173f,0.00101219f, 0.386671f,0.000962216f, 0.385193f,0.000914367f, +0.383824f,0.000869022f, 0.382442f,0.000825721f, 0.381033f,0.000783665f, 0.379606f,0.000742104f, 0.378204f,0.000702187f, +0.376788f,0.000664857f, 0.375374f,0.000629576f, 0.373946f,0.00059605f, 0.37255f,0.000563719f, 0.371185f,0.00053226f, +0.369809f,0.000500752f, 0.368399f,0.00046987f, 0.36701f,0.000440866f, 0.365639f,0.000413477f, 0.364329f,0.000386853f, +0.363115f,0.000361904f, 0.36195f,0.000338417f, 0.360776f,0.000316471f, 0.359562f,0.000295382f, 0.358324f,0.000274878f, +0.357068f,0.000254818f, 0.355839f,0.000235356f, 0.354548f,0.000216848f, 0.353219f,0.000199146f, 0.352018f,0.000182146f, +0.350839f,0.00016641f, 0.349712f,0.000152576f, 0.34863f,0.000139346f, 0.347553f,0.000126209f, 0.346506f,0.000113806f, +0.345331f,0.000101918f, 0.344109f,9.00755e-05f, 0.342991f,7.97084e-05f, 0.341832f,6.96473e-05f, 0.340794f,6.04653e-05f, +0.339642f,5.16328e-05f, 0.338584f,4.35149e-05f, 0.337491f,3.58836e-05f, + +0.604938f,0.0213677f, 0.601392f,0.0208004f, 0.597806f,0.0202356f, 0.594179f,0.0196731f, 0.59051f,0.019114f, +0.5868f,0.0185646f, 0.583054f,0.0180303f, 0.579269f,0.0175059f, 0.575465f,0.0170017f, 0.571627f,0.0165066f, +0.567758f,0.0160241f, 0.56392f,0.0155561f, 0.560076f,0.0150992f, 0.556203f,0.0146522f, 0.552353f,0.0142221f, +0.548586f,0.0138035f, 0.544926f,0.0133965f, 0.541489f,0.0129975f, 0.538432f,0.0126075f, 0.535359f,0.01223f, +0.532267f,0.0118635f, 0.52913f,0.0115026f, 0.525961f,0.011153f, 0.522759f,0.0108106f, 0.51961f,0.0104809f, +0.516482f,0.010161f, 0.513358f,0.00985371f, 0.510312f,0.00955253f, 0.507397f,0.00925844f, 0.504513f,0.00897313f, +0.501748f,0.00869654f, 0.498945f,0.00842615f, 0.496143f,0.00816325f, 0.493352f,0.00790632f, 0.490614f,0.00765572f, +0.48794f,0.00741102f, 0.485236f,0.00717238f, 0.482729f,0.00694044f, 0.480261f,0.00671226f, 0.477748f,0.00648882f, +0.475206f,0.0062736f, 0.4727f,0.00606589f, 0.470174f,0.00586381f, 0.467662f,0.00566706f, 0.46514f,0.0054755f, +0.462754f,0.00529363f, 0.460363f,0.0051176f, 0.457929f,0.00494672f, 0.455467f,0.00477984f, 0.453121f,0.00462111f, +0.450915f,0.00446693f, 0.448748f,0.00431581f, 0.446606f,0.00416825f, 0.444431f,0.00402352f, 0.442411f,0.00388152f, +0.440436f,0.00374142f, 0.438436f,0.00360326f, 0.43648f,0.00346749f, 0.434493f,0.0033372f, 0.432462f,0.00321067f, +0.430391f,0.00308938f, 0.428283f,0.00297414f, 0.426136f,0.00286361f, 0.423951f,0.00275676f, 0.421845f,0.00265213f, +0.419777f,0.00254888f, 0.417777f,0.00245095f, 0.415904f,0.00235623f, 0.414065f,0.0022656f, 0.412265f,0.00217835f, +0.41049f,0.00209388f, 0.408679f,0.00201161f, 0.406969f,0.00193079f, 0.405226f,0.00185181f, 0.403501f,0.00177497f, +0.401797f,0.00170093f, 0.400094f,0.00162916f, 0.39841f,0.00155847f, 0.396707f,0.00148929f, 0.395016f,0.00142306f, +0.393337f,0.00136072f, 0.391748f,0.00130216f, 0.390156f,0.00124509f, 0.388528f,0.00119007f, 0.386871f,0.001136f, +0.38515f,0.00108234f, 0.383477f,0.00103146f, 0.381935f,0.000981597f, 0.3804f,0.000932716f, 0.378971f,0.000886191f, +0.377516f,0.000841499f, 0.376046f,0.000798992f, 0.37459f,0.000758808f, 0.37316f,0.000720007f, 0.37168f,0.000681656f, +0.370187f,0.000644565f, 0.368685f,0.0006098f, 0.367218f,0.000576994f, 0.36581f,0.000545676f, 0.364415f,0.000515656f, +0.362984f,0.000486196f, 0.361568f,0.00045724f, 0.360136f,0.000428749f, 0.358794f,0.000401903f, 0.357541f,0.000376653f, +0.356296f,0.000351838f, 0.355055f,0.000328694f, 0.353769f,0.000306891f, 0.352467f,0.000286525f, 0.351172f,0.000266974f, +0.349932f,0.000248062f, 0.348623f,0.000229593f, 0.34727f,0.000211655f, 0.34601f,0.000194585f, 0.344787f,0.000178074f, +0.343534f,0.000162333f, 0.342331f,0.000148068f, 0.341226f,0.000135206f, 0.340161f,0.000123078f, 0.338985f,0.000111012f, +0.337759f,9.97196e-05f, 0.336555f,8.83925e-05f, 0.335373f,7.79603e-05f, 0.334228f,6.83205e-05f, 0.33312f,5.91931e-05f, +0.331966f,5.06927e-05f, 0.330851f,4.28218e-05f, 0.329731f,3.53231e-05f, + +0.600664f,0.0208026f, 0.597138f,0.0202471f, 0.593568f,0.0196939f, 0.589953f,0.0191428f, 0.586295f,0.0185953f, +0.582592f,0.0180577f, 0.578851f,0.0175356f, 0.575067f,0.0170227f, 0.571266f,0.0165308f, 0.567423f,0.0160459f, +0.563551f,0.0155752f, 0.559721f,0.0151186f, 0.555864f,0.0146719f, 0.551992f,0.0142356f, 0.548126f,0.0138168f, +0.544401f,0.0134088f, 0.540716f,0.0130098f, 0.537424f,0.0126191f, 0.53434f,0.0122397f, 0.531242f,0.0118737f, +0.52811f,0.0115158f, 0.524933f,0.0111629f, 0.521726f,0.0108216f, 0.518517f,0.010489f, 0.515329f,0.0101684f, +0.51219f,0.00985837f, 0.509016f,0.00955748f, 0.506037f,0.00926498f, 0.503081f,0.00898115f, 0.500238f,0.00870381f, +0.497414f,0.00843385f, 0.494575f,0.00817064f, 0.491709f,0.00791372f, 0.48893f,0.00766416f, 0.486186f,0.00742157f, +0.483459f,0.00718525f, 0.480786f,0.00695434f, 0.478292f,0.00672845f, 0.475753f,0.00650665f, 0.473178f,0.00629055f, +0.470596f,0.00607865f, 0.468034f,0.00587467f, 0.465464f,0.00567693f, 0.462891f,0.00548467f, 0.46041f,0.00529909f, +0.457975f,0.0051208f, 0.455499f,0.00494918f, 0.453003f,0.00478453f, 0.450546f,0.00462548f, 0.448276f,0.00447035f, +0.446043f,0.00432087f, 0.443859f,0.00417536f, 0.441652f,0.00403436f, 0.439538f,0.00389659f, 0.437522f,0.00376049f, +0.435485f,0.00362619f, 0.433471f,0.00349358f, 0.431436f,0.00336274f, 0.42935f,0.00323401f, 0.427224f,0.00311065f, +0.425053f,0.00299107f, 0.422838f,0.00287613f, 0.420586f,0.00276737f, 0.418433f,0.0026639f, 0.416316f,0.00256374f, +0.414252f,0.00246568f, 0.412314f,0.00236885f, 0.410405f,0.00227716f, 0.408549f,0.00218742f, 0.406712f,0.00210263f, +0.404837f,0.00202089f, 0.403084f,0.00194174f, 0.401293f,0.00186463f, 0.399515f,0.00178861f, 0.397769f,0.001715f, +0.396013f,0.0016435f, 0.394291f,0.0015748f, 0.392547f,0.00150794f, 0.390808f,0.00144201f, 0.38907f,0.00137767f, +0.387401f,0.00131559f, 0.385741f,0.00125721f, 0.384063f,0.00120287f, 0.382351f,0.00114986f, 0.380596f,0.00109853f, +0.378901f,0.00104816f, 0.377313f,0.000998397f, 0.37576f,0.000951298f, 0.374281f,0.000905005f, 0.372785f,0.00085972f, +0.371251f,0.000816099f, 0.36973f,0.000774798f, 0.368233f,0.000734796f, 0.366701f,0.000697098f, 0.365168f,0.000661016f, +0.363604f,0.000625385f, 0.362075f,0.000590828f, 0.360616f,0.0005586f, 0.359166f,0.000528334f, 0.357694f,0.000499295f, +0.356247f,0.000471573f, 0.354806f,0.000444002f, 0.353423f,0.000416837f, 0.352114f,0.000390686f, 0.350837f,0.00036589f, +0.349556f,0.000342689f, 0.348185f,0.000319627f, 0.346785f,0.000297877f, 0.345426f,0.000277681f, 0.344129f,0.0002589f, +0.342798f,0.00024064f, 0.341436f,0.000223227f, 0.340151f,0.000206256f, 0.33891f,0.000189783f, 0.337655f,0.00017419f, +0.336406f,0.000158918f, 0.335151f,0.000144362f, 0.33396f,0.000131411f, 0.332754f,0.000119325f, 0.331487f,0.000108011f, +0.330262f,9.69079e-05f, 0.329104f,8.659e-05f, 0.327854f,7.60223e-05f, 0.326755f,6.6858e-05f, 0.325532f,5.79169e-05f, +0.324433f,4.9845e-05f, 0.323235f,4.19689e-05f, 0.322114f,3.47571e-05f, + +0.596351f,0.0202548f, 0.592842f,0.0197106f, 0.589286f,0.0191686f, 0.585684f,0.0186287f, 0.582033f,0.0180925f, +0.578337f,0.0175665f, 0.5746f,0.0170558f, 0.570816f,0.0165541f, 0.567016f,0.016074f, 0.563168f,0.0155991f, +0.559292f,0.0151398f, 0.555468f,0.0146946f, 0.551599f,0.0142574f, 0.547726f,0.0138314f, 0.543846f,0.0134235f, +0.540159f,0.0130257f, 0.536449f,0.0126352f, 0.533295f,0.0122524f, 0.530186f,0.0118842f, 0.527061f,0.011528f, +0.52389f,0.0111782f, 0.520679f,0.0108352f, 0.517429f,0.0105003f, 0.514217f,0.0101802f, 0.511018f,0.00986765f, +0.507838f,0.00956593f, 0.504687f,0.00927105f, 0.501708f,0.00898813f, 0.498733f,0.00871218f, 0.495897f,0.0084428f, +0.493019f,0.00817902f, 0.490139f,0.00792272f, 0.487269f,0.00767336f, 0.484453f,0.00742979f, 0.481704f,0.00719524f, +0.478922f,0.00696673f, 0.47635f,0.00674249f, 0.473786f,0.00652233f, 0.471186f,0.00630821f, 0.468541f,0.00609797f, +0.465948f,0.00589218f, 0.46332f,0.00569084f, 0.460702f,0.00549701f, 0.458136f,0.00531184f, 0.455657f,0.00513184f, +0.453139f,0.00495619f, 0.450604f,0.00478957f, 0.448067f,0.00462994f, 0.445705f,0.00447569f, 0.443411f,0.00432536f, +0.441179f,0.0041804f, 0.438934f,0.0040413f, 0.436727f,0.00390508f, 0.434655f,0.00377147f, 0.432581f,0.00364085f, +0.43051f,0.00351197f, 0.428439f,0.00338468f, 0.426318f,0.00325906f, 0.424148f,0.00313531f, 0.421925f,0.00301348f, +0.419661f,0.00289712f, 0.41736f,0.00278506f, 0.415134f,0.00267771f, 0.412951f,0.002576f, 0.41083f,0.00247879f, +0.408839f,0.00238436f, 0.406867f,0.00229165f, 0.404964f,0.00220107f, 0.403066f,0.00211532f, 0.401124f,0.00203097f, +0.399304f,0.00195049f, 0.397451f,0.00187312f, 0.395629f,0.00179901f, 0.393842f,0.0017269f, 0.39204f,0.0016563f, +0.390265f,0.00158736f, 0.388467f,0.00152056f, 0.386694f,0.00145666f, 0.384923f,0.00139463f, 0.383205f,0.00133341f, +0.381475f,0.00127326f, 0.379723f,0.00121514f, 0.377945f,0.00116046f, 0.376148f,0.00110982f, 0.374433f,0.00106106f, +0.372819f,0.00101367f, 0.371243f,0.000967313f, 0.369723f,0.000921292f, 0.368193f,0.000877417f, 0.366614f,0.000834562f, +0.365031f,0.000792167f, 0.363478f,0.000751373f, 0.361879f,0.000712704f, 0.360271f,0.000675422f, 0.358653f,0.000639862f, +0.357112f,0.000606124f, 0.355598f,0.000573178f, 0.354083f,0.000541205f, 0.35256f,0.000511244f, 0.351067f,0.000483223f, +0.349592f,0.000456412f, 0.348195f,0.000430759f, 0.346861f,0.00040532f, 0.345521f,0.000379879f, 0.344166f,0.000355276f, +0.342751f,0.000332195f, 0.341319f,0.000310828f, 0.339884f,0.000289531f, 0.338496f,0.000269102f, 0.337119f,0.000250434f, +0.33573f,0.000233273f, 0.334399f,0.000216363f, 0.333152f,0.000200335f, 0.331888f,0.000184811f, 0.330647f,0.000169829f, +0.329391f,0.000155564f, 0.328089f,0.000141339f, 0.326775f,0.000127907f, 0.325421f,0.000115977f, 0.3241f,0.000104633f, +0.322926f,9.42347e-05f, 0.321722f,8.42169e-05f, 0.320534f,7.45556e-05f, 0.31936f,6.52532e-05f, 0.318146f,5.67629e-05f, +0.316964f,4.87208e-05f, 0.315802f,4.11821e-05f, 0.314639f,3.41869e-05f, + +0.592001f,0.0197237f, 0.588508f,0.0191904f, 0.584965f,0.0186594f, 0.581372f,0.0181303f, 0.577729f,0.017605f, +0.574037f,0.0170903f, 0.570302f,0.0165906f, 0.56652f,0.0161004f, 0.562719f,0.015631f, 0.558868f,0.0151669f, +0.554998f,0.0147187f, 0.551165f,0.0142838f, 0.547282f,0.0138552f, 0.543412f,0.0134415f, 0.539546f,0.0130419f, +0.535863f,0.0126539f, 0.532232f,0.0122727f, 0.529115f,0.0118992f, 0.525979f,0.0115404f, 0.522819f,0.0111924f, +0.519609f,0.0108502f, 0.516365f,0.0105167f, 0.513092f,0.0101927f, 0.509858f,0.00988066f, 0.506653f,0.00957681f, +0.503427f,0.00928248f, 0.500336f,0.00899557f, 0.497319f,0.00871951f, 0.494384f,0.00845168f, 0.491491f,0.00818919f, +0.48858f,0.00793267f, 0.485643f,0.0076833f, 0.482782f,0.0074396f, 0.47997f,0.00720421f, 0.47716f,0.00697545f, +0.47443f,0.00675409f, 0.471847f,0.00653651f, 0.469222f,0.0063229f, 0.466556f,0.00611476f, 0.4639f,0.00591082f, +0.461236f,0.00571058f, 0.458577f,0.00551443f, 0.455932f,0.00532648f, 0.453394f,0.00514546f, 0.450847f,0.00497062f, +0.448275f,0.00480175f, 0.445677f,0.00463826f, 0.443203f,0.00448258f, 0.440858f,0.00433257f, 0.438574f,0.00418851f, +0.436284f,0.00404777f, 0.433995f,0.00391236f, 0.431855f,0.00378044f, 0.429742f,0.00365166f, 0.427611f,0.00352546f, +0.425504f,0.00340123f, 0.42335f,0.00327898f, 0.421146f,0.00315855f, 0.418894f,0.00303992f, 0.416591f,0.00292318f, +0.414243f,0.00280842f, 0.411954f,0.00269935f, 0.409704f,0.00259441f, 0.407522f,0.0024937f, 0.405456f,0.00239764f, +0.403439f,0.00230615f, 0.401497f,0.00221802f, 0.399549f,0.00213119f, 0.397557f,0.00204626f, 0.395678f,0.00196583f, +0.393759f,0.00188644f, 0.391879f,0.00181023f, 0.390026f,0.0017369f, 0.388181f,0.00166689f, 0.386365f,0.00159945f, +0.384525f,0.00153408f, 0.382708f,0.00147019f, 0.380883f,0.00140816f, 0.379124f,0.00134864f, 0.377364f,0.0012906f, +0.37558f,0.00123369f, 0.373745f,0.00117761f, 0.371886f,0.00112341f, 0.370107f,0.00107261f, 0.368449f,0.00102503f, +0.366843f,0.000979997f, 0.365286f,0.000936114f, 0.363715f,0.000893051f, 0.362082f,0.000850208f, 0.360468f,0.0008092f, +0.358874f,0.000769197f, 0.35721f,0.000729506f, 0.355537f,0.000691112f, 0.353884f,0.000654699f, 0.352296f,0.000620289f, +0.350731f,0.00058724f, 0.349188f,0.000555651f, 0.347623f,0.000525052f, 0.346057f,0.000495386f, 0.344528f,0.000467614f, +0.343086f,0.000441609f, 0.341719f,0.000416929f, 0.340373f,0.000393141f, 0.338997f,0.000369645f, 0.337524f,0.000345968f, +0.336014f,0.000323015f, 0.334522f,0.000301326f, 0.333124f,0.000281392f, 0.331689f,0.000261732f, 0.330211f,0.000242837f, +0.328814f,0.000225489f, 0.327546f,0.000209753f, 0.326252f,0.000194153f, 0.324997f,0.000179556f, 0.323714f,0.000165256f, +0.322405f,0.000151522f, 0.321117f,0.000138398f, 0.319691f,0.000125155f, 0.318256f,0.000112806f, 0.316979f,0.000101876f, +0.315691f,9.13567e-05f, 0.314471f,8.16662e-05f, 0.313361f,7.27705e-05f, 0.312082f,6.36692e-05f, 0.310883f,5.55036e-05f, +0.309631f,4.75846e-05f, 0.308476f,4.03924e-05f, 0.307307f,3.36136e-05f +}; \ No newline at end of file diff --git a/src/V3d/V3d_View.cxx b/src/V3d/V3d_View.cxx index 599581d507..1b63f491f3 100644 --- a/src/V3d/V3d_View.cxx +++ b/src/V3d/V3d_View.cxx @@ -506,10 +506,36 @@ void V3d_View::SetBgImageStyle (const Aspect_FillMethod theFillStyle, const Stan //purpose : //============================================================================= void V3d_View::SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Boolean theToUpdatePBREnv, Standard_Boolean theToUpdate) { - myView->SetBackgroundCubeMap (theCubeMap); + myView->SetBackgroundCubeMap (theCubeMap, theToUpdatePBREnv); + if (myImmediateUpdate || theToUpdate) + { + Redraw(); + } +} +//============================================================================= +//function : GeneratePBREnvironment +//purpose : +//============================================================================= +void V3d_View::GeneratePBREnvironment (Standard_Boolean theToUpdate) +{ + myView->GeneratePBREnvironment(); + if (myImmediateUpdate || theToUpdate) + { + Redraw(); + } +} + +//============================================================================= +//function : ClearPBREnvironment +//purpose : +//============================================================================= +void V3d_View::ClearPBREnvironment (Standard_Boolean theToUpdate) +{ + myView->ClearPBREnvironment(); if (myImmediateUpdate || theToUpdate) { Redraw(); diff --git a/src/V3d/V3d_View.hxx b/src/V3d/V3d_View.hxx index 1c1cdcf2a7..9f162ac9de 100644 --- a/src/V3d/V3d_View.hxx +++ b/src/V3d/V3d_View.hxx @@ -228,10 +228,25 @@ public: Standard_EXPORT void SetBgImageStyle (const Aspect_FillMethod theFillStyle, const Standard_Boolean theToUpdate = Standard_False); - //! Sets environment cubemap as interactive background. + //! Sets environment cubemap as background. + //! @param theCubeMap cubemap source to be set as background + //! @param theToUpdatePBREnv defines whether IBL maps will be generated or not (see 'GeneratePBREnvironment') Standard_EXPORT void SetBackgroundCubeMap (const Handle(Graphic3d_CubeMap)& theCubeMap, + Standard_Boolean theToUpdatePBREnv = Standard_True, Standard_Boolean theToUpdate = Standard_False); + //! Generates PBR specular probe and irradiance map + //! in order to provide environment indirect illumination in PBR shading model (Image Based Lighting). + //! The source of environment data is background cubemap. + //! If PBR is unavailable it does nothing. + //! If PBR is available but there is no cubemap being set to background it clears all IBL maps (see 'ClearPBREnvironment'). + Standard_EXPORT void GeneratePBREnvironment (Standard_Boolean theToUpdate = Standard_False); + + //! Fills PBR specular probe and irradiance map with white color. + //! So that environment indirect illumination will be constant and will be fully controlled by ambient light sources. + //! If PBR is unavailable it does nothing. + Standard_EXPORT void ClearPBREnvironment (Standard_Boolean theToUpdate = Standard_False); + //! Definition of an axis from its origin and //! its orientation . //! This will be the current axis for rotations and movements. diff --git a/src/ViewerTest/ViewerTest.cxx b/src/ViewerTest/ViewerTest.cxx index ad91af8ad7..6e2a972446 100644 --- a/src/ViewerTest/ViewerTest.cxx +++ b/src/ViewerTest/ViewerTest.cxx @@ -517,6 +517,14 @@ Standard_Boolean ViewerTest::ParseShadingModel (Standard_CString th { theModel = Graphic3d_TOSM_FRAGMENT; } + else if (aTypeStr == "pbr") + { + theModel = Graphic3d_TOSM_PBR; + } + else if (aTypeStr == "pbr_facet") + { + theModel = Graphic3d_TOSM_PBR_FACET; + } else if (aTypeStr == "default" || aTypeStr == "def") { @@ -1982,7 +1990,7 @@ struct ViewerTest_AspectsChangeSet isOk = Standard_False; } if (ToSetShadingModel == 1 - && (ShadingModel < Graphic3d_TOSM_DEFAULT || ShadingModel > Graphic3d_TOSM_FRAGMENT)) + && (ShadingModel < Graphic3d_TOSM_DEFAULT || ShadingModel > Graphic3d_TOSM_PBR_FACET)) { std::cout << "Error: unknown shading model " << ShadingModelName << ".\n"; isOk = Standard_False; diff --git a/src/ViewerTest/ViewerTest_OpenGlCommands.cxx b/src/ViewerTest/ViewerTest_OpenGlCommands.cxx index 762cb61405..33e4f0cafa 100644 --- a/src/ViewerTest/ViewerTest_OpenGlCommands.cxx +++ b/src/ViewerTest/ViewerTest_OpenGlCommands.cxx @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -1037,17 +1038,24 @@ static Standard_Integer VListMaterials (Draw_Interpretor& theDI, "ASPECT material does not define final colors, it is taken from Internal Color instead.\n" "See also Graphic3d_TypeOfMaterial enumeration'>" "Type\n" - "
" - "Common
\n" "Transparency\n" - "Refraction Index\n" - "
" + "PBR Metallic-Roughness
\n" + "
" + "Common (Blinn-Phong)
\n" + "
" - "BSDF
\n" + "BSDF (Bidirectional Scattering Distribution Function)
\n" "\n" "\n" + "Color\n" + "Metallic\n" + "Roughness\n" + "Emission\n" + "
" + "IOR
\n" "Ambient\n" "Diffuse\n" "Specular\n" @@ -1069,6 +1077,7 @@ static Standard_Integer VListMaterials (Draw_Interpretor& theDI, "FresnelCoat\n" "
" "FresnelBase
\n" + "Refraction Index\n" "\n"; } else if (!aDumpFile.IsEmpty()) @@ -1105,13 +1114,17 @@ static Standard_Integer VListMaterials (Draw_Interpretor& theDI, anHtmlFile << "\n"; anHtmlFile << "" << aMat.StringName() << "\n"; anHtmlFile << "" << (aMat.MaterialType() == Graphic3d_MATERIAL_PHYSIC ? "PHYSIC" : "ASPECT") << "\n"; + anHtmlFile << "" << aMat.Transparency() << "\n"; + anHtmlFile << "" << formatSvgColoredRect (aMat.PBRMaterial().Color().GetRGB()) << (Graphic3d_Vec3 )aMat.PBRMaterial().Color().GetRGB() << "\n"; + anHtmlFile << "" << aMat.PBRMaterial().Metallic() << "\n"; + anHtmlFile << "" << aMat.PBRMaterial().NormalizedRoughness() << "\n"; + anHtmlFile << "" << formatSvgColoredRect (Quantity_Color (aMat.PBRMaterial().Emission())) << aMat.PBRMaterial().Emission() << "\n"; + anHtmlFile << "" << aMat.PBRMaterial().IOR() << "\n"; anHtmlFile << "" << formatSvgColoredRect (Quantity_Color (anAmbient)) << anAmbient << "\n"; anHtmlFile << "" << formatSvgColoredRect (Quantity_Color (aDiffuse)) << aDiffuse << "\n"; anHtmlFile << "" << formatSvgColoredRect (Quantity_Color (aSpecular)) << aSpecular << "\n"; anHtmlFile << "" << formatSvgColoredRect (Quantity_Color (anEmission)) << anEmission << "\n"; anHtmlFile << "" << aMat.Shininess() << "\n"; - anHtmlFile << "" << aMat.Transparency() << "\n"; - anHtmlFile << "" << aMat.RefractionIndex() << "\n"; anHtmlFile << "" << aMat.BSDF().Kc << "\n"; anHtmlFile << "" << aMat.BSDF().Kd << "\n"; anHtmlFile << "" << aMat.BSDF().Ks << "\n"; @@ -1120,18 +1133,23 @@ static Standard_Integer VListMaterials (Draw_Interpretor& theDI, anHtmlFile << "" << aMat.BSDF().Absorption << "\n"; anHtmlFile << "" << fresnelModelString (aMat.BSDF().FresnelCoat.FresnelType()) << "\n"; anHtmlFile << "" << fresnelModelString (aMat.BSDF().FresnelBase.FresnelType()) << "\n"; + anHtmlFile << "" << aMat.RefractionIndex() << "\n"; anHtmlFile << "\n"; } else { theDI << aMat.StringName() << "\n"; + theDI << " Transparency: " << aMat.Transparency() << "\n"; + theDI << " PBR.BaseColor: " << (Graphic3d_Vec3 )aMat.PBRMaterial().Color().GetRGB() << "\n"; + theDI << " PBR.Metallic: " << aMat.PBRMaterial().Metallic() << "\n"; + theDI << " PBR.Roughness: " << aMat.PBRMaterial().NormalizedRoughness() << "\n"; + theDI << " PBR.Emission: " << aMat.PBRMaterial().Emission() << "\n"; + theDI << " PBR.IOR: " << aMat.PBRMaterial().IOR() << "\n"; theDI << " Common.Ambient: " << anAmbient << "\n"; theDI << " Common.Diffuse: " << aDiffuse << "\n"; theDI << " Common.Specular: " << aSpecular << "\n"; theDI << " Common.Emissive: " << anEmission << "\n"; theDI << " Common.Shiness: " << aMat.Shininess() << "\n"; - theDI << " Common.Transparency: " << aMat.Transparency() << "\n"; - theDI << " RefractionIndex: " << aMat.RefractionIndex() << "\n"; theDI << " BSDF.Kc: " << aMat.BSDF().Kc << "\n"; theDI << " BSDF.Kd: " << aMat.BSDF().Kd << "\n"; theDI << " BSDF.Ks: " << aMat.BSDF().Ks << "\n"; @@ -1140,6 +1158,7 @@ static Standard_Integer VListMaterials (Draw_Interpretor& theDI, theDI << " BSDF.Absorption: " << aMat.BSDF().Absorption << "\n"; theDI << " BSDF.FresnelCoat: " << fresnelModelString (aMat.BSDF().FresnelCoat.FresnelType()) << "\n"; theDI << " BSDF.FresnelBase: " << fresnelModelString (aMat.BSDF().FresnelBase.FresnelType()) << "\n"; + theDI << " RefractionIndex: " << aMat.RefractionIndex() << "\n"; } if (anObjFile.is_open()) @@ -1335,6 +1354,159 @@ static Standard_Integer VListColors (Draw_Interpretor& theDI, return 0; } +//============================================================================== +//function : envlutWriteToFile +//purpose : +//============================================================================== +static std::string envLutWriteToFile (Standard_ShortReal theValue) +{ + std::stringstream aStream; + aStream << theValue; + if (aStream.str().length() == 1) + { + aStream << '.'; + } + aStream << 'f'; + return aStream.str(); +} + +//============================================================================== +//function : VGenEnvLUT +//purpose : +//============================================================================== +static Standard_Integer VGenEnvLUT (Draw_Interpretor&, + Standard_Integer theArgNb, + const char** theArgVec) +{ + Standard_Integer aTableSize = -1; + Standard_Integer aNbSamples = -1; + TCollection_AsciiString aFilePath = Graphic3d_TextureRoot::TexturesFolder() + "/Textures_EnvLUT.pxx"; + + for (Standard_Integer anArgIter = 1; anArgIter < theArgNb; ++anArgIter) + { + TCollection_AsciiString anArg(theArgVec[anArgIter]); + anArg.LowerCase(); + + if (anArg == "-size" + || anArg == "-s") + { + if (anArgIter + 1 >= theArgNb) + { + std::cerr << "Syntax error: size of PBR environment look up table is undefined" << "\n"; + return 1; + } + + aTableSize = Draw::Atoi(theArgVec[++anArgIter]); + + if (aTableSize < 16) + { + std::cerr << "Error: size of PBR environment look up table must be greater or equal 16\n"; + return 1; + } + } + else if (anArg == "-nbsamples" + || anArg == "-samples") + { + if (anArgIter + 1 >= theArgNb) + { + std::cerr << "Syntax error: number of samples to generate PBR environment look up table is undefined" << "\n"; + return 1; + } + + aNbSamples = Draw::Atoi(theArgVec[++anArgIter]); + + if (aNbSamples < 1) + { + std::cerr << "Syntax error: number of samples to generate PBR environment look up table must be greater than 1\n" << "\n"; + return 1; + } + } + else + { + std::cerr << "Syntax error: unknown argument " << anArg << ";\n"; + return 1; + } + } + + if (aTableSize < 0) + { + aTableSize = 128; + } + + if (aNbSamples < 0) + { + aNbSamples = 1024; + } + + std::ofstream aFile; + + OSD_OpenStream (aFile, aFilePath, std::ios::out | std::ios::binary); + + if (!aFile.good()) + { + std::cerr << "Error: unable to write to " << aFilePath << "\n"; + return 1; + } + + aFile << "//this file has been generated by vgenenvlut draw command\n"; + aFile << "static unsigned int Textures_EnvLUTSize = " << aTableSize << ";\n\n"; + aFile << "static float Textures_EnvLUT[] =\n"; + aFile << "{\n"; + + Handle(Image_PixMap) aPixMap = new Image_PixMap(); + aPixMap->InitZero (Image_Format_RGF, aTableSize, aTableSize); + Graphic3d_PBRMaterial::GenerateEnvLUT (aPixMap, aNbSamples); + + const Standard_Integer aNumbersInRow = 5; + Standard_Integer aCounter = 0; + + for (int y = 0; y < aTableSize - 1; ++y) + { + aCounter = 0; + for (int x = 0; x < aTableSize; ++x) + { + aFile << envLutWriteToFile (aPixMap->Value(aTableSize - 1 - y, x).x()) << ","; + aFile << envLutWriteToFile (aPixMap->Value(aTableSize - 1 - y, x).y()) << ","; + if (++aCounter % aNumbersInRow == 0) + { + aFile << "\n"; + } + else if (x != aTableSize - 1) + { + aFile << " "; + } + } + aFile << "\n"; + if (aTableSize % aNumbersInRow != 0) + { + aFile << "\n"; + } + } + + aCounter = 0; + for (int x = 0; x < aTableSize - 1; ++x) + { + aFile << envLutWriteToFile (aPixMap->Value(0, x).x()) << ","; + aFile << envLutWriteToFile (aPixMap->Value(0, x).y()) << ","; + if (++aCounter % aNumbersInRow == 0) + { + aFile << "\n"; + } + else + { + aFile << " "; + } + } + + aFile << envLutWriteToFile (aPixMap->Value(0, aTableSize - 1).x()) << ","; + aFile << envLutWriteToFile (aPixMap->Value(0, aTableSize - 1).y()) << "\n"; + + aFile << "};"; + aFile.close(); + + return 0; +} + //======================================================================= //function : OpenGlCommands //purpose : @@ -1386,4 +1558,12 @@ void ViewerTest::OpenGlCommands(Draw_Interpretor& theCommands) "\n\t\t: or dumped into specified file." "\n\t\t: * can be used to refer to complete list of standard colors.", __FILE__, VListColors, aGroup); + theCommands.Add("vgenenvlut", + "vgenenvlut [-size size = 128] [-nbsamples nbsamples = 1024]" + "\n\t\t: Generates PBR environment look up table." + "\n\t\t: Saves it as C++ source file which is expected to be included in code." + "\n\t\t: The path where result will be located is 'Graphic3d_TextureRoot::TexturesFolder()'." + "\n\t\t: -size size of one side of resulted square table" + "\n\t\t: -nbsamples number of samples used in Monte-Carlo integration", + __FILE__, VGenEnvLUT, aGroup); } diff --git a/src/ViewerTest/ViewerTest_ViewerCommands.cxx b/src/ViewerTest/ViewerTest_ViewerCommands.cxx index e1a2a10f52..dad8389bf2 100644 --- a/src/ViewerTest/ViewerTest_ViewerCommands.cxx +++ b/src/ViewerTest/ViewerTest_ViewerCommands.cxx @@ -416,6 +416,9 @@ namespace //! the option key for the command that sets inversion of Z axis for background cubemap ViewerTest_CommandOptionKey myCubeMapInvertedZOptionKey; + //! the option key for the command that allows skip IBL map generation + ViewerTest_CommandOptionKey myCubeMapDoNotGenPBREnvOptionKey; + //! the variable set of options that are allowed for the old scenario (without any option passed) CommandOptionKeyVariableSet myUnnamedOptionVariableSet; @@ -466,6 +469,7 @@ namespace myCubeMapOrderOptionKey = myCommandParser.AddOption ("order|o", "order of sides in one image packed cubemap"); myCubeMapInvertedZOptionKey = myCommandParser.AddOption ( "invertedz|invz|iz", "whether Z axis is inverted or not during background cubemap rendering"); + myCubeMapDoNotGenPBREnvOptionKey = myCommandParser.AddOption ("nopbrenv", "whether IBL map generation should be skipped"); } //! Creates option sets used to determine if a passed option set is valid or not @@ -479,6 +483,7 @@ namespace aCubeMapOptionSet.insert (myCubeMapOptionKey); ViewerTest_CommandOptionKeySet aCubeMapAdditionalOptionKeySet; aCubeMapAdditionalOptionKeySet.insert (myCubeMapInvertedZOptionKey); + aCubeMapAdditionalOptionKeySet.insert (myCubeMapDoNotGenPBREnvOptionKey); aCubeMapAdditionalOptionKeySet.insert (myCubeMapOrderOptionKey); myCubeMapOptionVariableSet = CommandOptionKeyVariableSet (aCubeMapOptionSet, aCubeMapAdditionalOptionKeySet); @@ -852,7 +857,17 @@ namespace aZIsInverted = true; } - setCubeMap (aFilePaths, anOrder.Validated(), aZIsInverted); + bool aToGenPBREnv = true; + if (myCommandParser.HasOption (myCubeMapDoNotGenPBREnvOptionKey)) + { + if (!processCubeMapDoNotGenPBREnvOptionSet()) + { + return false; + } + aToGenPBREnv = false; + } + + setCubeMap (aFilePaths, anOrder.Validated(), aZIsInverted, aToGenPBREnv); return true; } @@ -1017,8 +1032,7 @@ namespace return true; } - //! Processes the cubemap option - //! @param theIsNeededToRedraw defines need of redraw after option's processing + //! Processes the inverted z cubemap option //! @return true if processing was successful, or false otherwise bool processCubeMapInvertedZOptionSet () const { @@ -1033,6 +1047,21 @@ namespace return true; } + //! Processes the option allowing to skip IBM maps generation + //! @return true if processing was successful, or false otherwise + bool processCubeMapDoNotGenPBREnvOptionSet() const + { + const Standard_Integer aNumberOfCubeMapDoNotGenPBREnvOptionArguments = + myCommandParser.GetNumberOfOptionArguments(myCubeMapDoNotGenPBREnvOptionKey); + + if (aNumberOfCubeMapDoNotGenPBREnvOptionArguments != 0) + { + return false; + } + + return true; + } + //! Processes the tiles order option //! @param theOrder the array of indexes if cubemap sides in tile grid //! @return true if processing was successful, or false otherwise @@ -1221,7 +1250,8 @@ namespace //! @param theOrder array of cubemap sides indexes mapping them from tiles in packed cubemap static void setCubeMap (const NCollection_Array1& theFileNames, const Graphic3d_ValidatedCubeMapOrder theOrder = Graphic3d_CubeMapOrder::Default(), - bool theZIsInverted = false) + bool theZIsInverted = false, + bool theToGenPBREnv = true) { const Handle(V3d_View)& aCurrentView = ViewerTest::CurrentView(); Handle(Graphic3d_CubeMap) aCubeMap; @@ -1237,7 +1267,7 @@ namespace aCubeMap->GetParams()->SetRepeat(Standard_False); aCubeMap->GetParams()->SetTextureUnit(Graphic3d_TextureUnit_EnvMap); - aCurrentView->SetBackgroundCubeMap (aCubeMap, Standard_True); + aCurrentView->SetBackgroundCubeMap (aCubeMap, theToGenPBREnv, Standard_True); } //! Sets the image as a background @@ -11185,6 +11215,48 @@ static int VLight (Draw_Interpretor& theDi, return 0; } +//=============================================================================================== +//function : VPBREnvironment +//purpose : +//=============================================================================================== +static int VPBREnvironment (Draw_Interpretor&, + Standard_Integer theArgsNb, + const char** theArgVec) +{ + if (theArgsNb > 2) + { + std::cerr << "Error: 'vpbrenv' command has only one argument\n"; + return 1; + } + + Handle(V3d_View) aView = ViewerTest::CurrentView(); + if (aView.IsNull()) + { + std::cerr << "Error: no active viewer!\n"; + return 1; + } + + TCollection_AsciiString anArg = TCollection_AsciiString (theArgVec[1]); + anArg.LowerCase(); + + if (anArg == "-generate" + || anArg == "-gen") + { + aView->GeneratePBREnvironment (Standard_True); + } + else if (anArg == "-clear") + { + aView->ClearPBREnvironment (Standard_True); + } + else + { + std::cerr << "Error: unknown argument [" << theArgVec[1] << "] for 'vpbrenv' command\n"; + return 1; + } + + return 0; +} + //! Read Graphic3d_RenderingParams::PerfCounters flag. static Standard_Boolean parsePerfStatsFlag (const TCollection_AsciiString& theValue, Standard_Boolean& theToReset, @@ -11391,11 +11463,13 @@ static Standard_Integer VRenderParams (Draw_Interpretor& theDI, theDI << "shadingModel: "; switch (aView->ShadingModel()) { - case Graphic3d_TOSM_DEFAULT: theDI << "default"; break; - case Graphic3d_TOSM_UNLIT: theDI << "unlit"; break; - case Graphic3d_TOSM_FACET: theDI << "flat"; break; - case Graphic3d_TOSM_VERTEX: theDI << "gouraud"; break; - case Graphic3d_TOSM_FRAGMENT: theDI << "phong"; break; + case Graphic3d_TOSM_DEFAULT: theDI << "default"; break; + case Graphic3d_TOSM_UNLIT: theDI << "unlit"; break; + case Graphic3d_TOSM_FACET: theDI << "flat"; break; + case Graphic3d_TOSM_VERTEX: theDI << "gouraud"; break; + case Graphic3d_TOSM_FRAGMENT: theDI << "phong"; break; + case Graphic3d_TOSM_PBR: theDI << "pbr"; break; + case Graphic3d_TOSM_PBR_FACET: theDI << "pbr_facet"; break; } { theDI << "perfCounters:"; @@ -11957,11 +12031,13 @@ static Standard_Integer VRenderParams (Draw_Interpretor& theDI, { switch (aView->ShadingModel()) { - case Graphic3d_TOSM_DEFAULT: theDI << "default"; break; - case Graphic3d_TOSM_UNLIT: theDI << "unlit "; break; - case Graphic3d_TOSM_FACET: theDI << "flat "; break; - case Graphic3d_TOSM_VERTEX: theDI << "gouraud "; break; - case Graphic3d_TOSM_FRAGMENT: theDI << "phong "; break; + case Graphic3d_TOSM_DEFAULT: theDI << "default"; break; + case Graphic3d_TOSM_UNLIT: theDI << "unlit "; break; + case Graphic3d_TOSM_FACET: theDI << "flat "; break; + case Graphic3d_TOSM_VERTEX: theDI << "gouraud "; break; + case Graphic3d_TOSM_FRAGMENT: theDI << "phong "; break; + case Graphic3d_TOSM_PBR: theDI << "pbr"; break; + case Graphic3d_TOSM_PBR_FACET: theDI << "pbr_facet"; break; } continue; } @@ -11983,6 +12059,97 @@ static Standard_Integer VRenderParams (Draw_Interpretor& theDI, return 1; } } + else if (aFlag == "-pbrenvpow2size" + || aFlag == "-pbrenvp2s" + || aFlag == "-pep2s") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n"; + return 1; + } + + const Standard_Integer aPbrEnvPow2Size = Draw::Atoi (theArgVec[anArgIter]); + if (aPbrEnvPow2Size < 1) + { + std::cout << "Error: 'Pow2Size' of PBR Environment has to be greater or equal 1\n"; + return 1; + } + aParams.PbrEnvPow2Size = aPbrEnvPow2Size; + } + else if (aFlag == "-pbrenvspecmaplevelsnumber" + || aFlag == "-pbrenvspecmapnblevels" + || aFlag == "-pbrenvspecmaplevels" + || aFlag == "-pbrenvsmln" + || aFlag == "-pesmln") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n"; + return 1; + } + + const Standard_Integer aPbrEnvSpecMapNbLevels = Draw::Atoi (theArgVec[anArgIter]); + if (aPbrEnvSpecMapNbLevels < 2) + { + std::cout << "Error: 'SpecMapLevelsNumber' of PBR Environment has to be greater or equal 2\n"; + return 1; + } + aParams.PbrEnvSpecMapNbLevels = aPbrEnvSpecMapNbLevels; + } + else if (aFlag == "-pbrenvbakngdiffsamplesnumber" + || aFlag == "-pbrenvbakingdiffsamples" + || aFlag == "-pbrenvbdsn") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n"; + return 1; + } + + const Standard_Integer aPbrEnvBakingDiffNbSamples = Draw::Atoi (theArgVec[anArgIter]); + if (aPbrEnvBakingDiffNbSamples < 1) + { + std::cout << "Error: 'BakingDiffSamplesNumber' of PBR Environtment has to be greater or equal 1\n"; + return 1; + } + aParams.PbrEnvBakingDiffNbSamples = aPbrEnvBakingDiffNbSamples; + } + else if (aFlag == "-pbrenvbakngspecsamplesnumber" + || aFlag == "-pbrenvbakingspecsamples" + || aFlag == "-pbrenvbssn") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n"; + return 1; + } + + const Standard_Integer aPbrEnvBakingSpecNbSamples = Draw::Atoi(theArgVec[anArgIter]); + if (aPbrEnvBakingSpecNbSamples < 1) + { + std::cout << "Error: 'BakingSpecSamplesNumber' of PBR Environtment has to be greater or equal 1\n"; + return 1; + } + aParams.PbrEnvBakingSpecNbSamples = aPbrEnvBakingSpecNbSamples; + } + else if (aFlag == "-pbrenvbakingprobability" + || aFlag == "-pbrenvbp") + { + if (++anArgIter >= theArgNb) + { + std::cerr << "Error: wrong syntax at argument '" << anArg << "'\n"; + return 1; + } + const Standard_ShortReal aPbrEnvBakingProbability = static_cast(Draw::Atof (theArgVec[anArgIter])); + if (aPbrEnvBakingProbability < 0.f + || aPbrEnvBakingProbability > 1.f) + { + std::cout << "Error: 'BakingProbability' of PBR Environtment has to be in range of [0, 1]\n"; + return 1; + } + aParams.PbrEnvBakingProbability = aPbrEnvBakingProbability; + } else if (aFlag == "-resolution") { if (++anArgIter >= theArgNb) @@ -14205,6 +14372,12 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands) "\n\n example: vlight -add positional -head 1 -pos 0 1 1 -color red" "\n example: vlight -change 0 -direction 0 -1 0 -linearAttenuation 0.2", __FILE__, VLight, group); + theCommands.Add("vpbrenv", + "vpbrenv -clear|-generate" + "\n\t\t: Clears or generates PBR environment map of active view." + "\n\t\t: -clear clears PBR environment (fills by white color)" + "\n\t\t: -generate generates PBR environment from current background cubemap", + __FILE__, VPBREnvironment, group); theCommands.Add("vraytrace", "vraytrace [0|1]" "\n\t\t: Turns on/off ray-tracing renderer." @@ -14238,6 +14411,11 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands) "\n '-rebuildGlsl on|off' Rebuild Ray-Tracing GLSL programs (for debugging)" "\n '-shadingModel model' Controls shading model from enumeration" "\n unlit, flat, gouraud, phong" + "\n '-pbrEnvPow2size > 0' Controls size of IBL maps (real size can be calculates as 2^pbrenvpow2size)" + "\n '-pbrEnvSMLN > 1' Controls number of mipmap levels used in specular IBL map" + "\n '-pbrEnvBDSN > 0' Controls number of samples in Monte-Carlo integration during diffuse IBL map's sherical harmonics calculation" + "\n '-pbrEnvBSSN > 0' Controls maximum number of samples per mipmap level in Monte-Carlo integration during specular IBL maps generation" + "\n '-pbrEnvBP [0, 1]' Controls strength of samples number reducing during specular IBL maps generation (1 disables reducing)" "\n '-resolution value' Sets a new pixels density (PPI), defines scaling factor for parameters like text size" "\n '-aperture >= 0.0' Aperture size of perspective camera for depth-of-field effect (0 disables DOF)" "\n '-focal >= 0.0' Focal distance of perspective camera for depth-of-field effect" diff --git a/src/XCAFDoc/XCAFDoc_VisMaterial.cxx b/src/XCAFDoc/XCAFDoc_VisMaterial.cxx index d76c94a0d1..4f2cb5cb9c 100644 --- a/src/XCAFDoc/XCAFDoc_VisMaterial.cxx +++ b/src/XCAFDoc/XCAFDoc_VisMaterial.cxx @@ -166,22 +166,6 @@ XCAFDoc_VisMaterialCommon XCAFDoc_VisMaterial::ConvertToCommonMaterial() return aComMat; } -//! Compute material roughness from common material. -static Standard_ShortReal roughnessFromCommon (const XCAFDoc_VisMaterialCommon& theMat) -{ - Standard_Real aRoughnessFactor = 1.0 - theMat.Shininess; - //Standard_Real aSpecIntens = theMat.SpecularColor.Light() * theMat.SpecularColor; - const Standard_Real aSpecIntens = theMat.SpecularColor.Red() * 0.2125 - + theMat.SpecularColor.Green() * 0.7154 - + theMat.SpecularColor.Blue() * 0.0721; - if (aSpecIntens < 0.1) - { - // low specular intensity should produce a rough material even if shininess is high - aRoughnessFactor *= (1.0 - aSpecIntens); - } - return (Standard_ShortReal )aRoughnessFactor; -} - //======================================================================= //function : ConvertToPbrMaterial //purpose : @@ -201,9 +185,8 @@ XCAFDoc_VisMaterialPBR XCAFDoc_VisMaterial::ConvertToPbrMaterial() aPbrMat.IsDefined = true; aPbrMat.BaseColor.SetRGB (myCommonMat.DiffuseColor); aPbrMat.BaseColor.SetAlpha (1.0f - myCommonMat.Transparency); - // we allow to save any number in range [0, 1] but logically metallicity can be either 0 or 1 - aPbrMat.Metallic = ((Graphic3d_Vec3 )myCommonMat.SpecularColor).maxComp(); // > 0.1f ? 1.0 : 0.0; - aPbrMat.Roughness = roughnessFromCommon (myCommonMat); + aPbrMat.Metallic = Graphic3d_PBRMaterial::MetallicFromSpecular (myCommonMat.SpecularColor); + aPbrMat.Roughness = Graphic3d_PBRMaterial::RoughnessFromSpecular (myCommonMat.SpecularColor, myCommonMat.Shininess); return aPbrMat; } @@ -226,13 +209,12 @@ void XCAFDoc_VisMaterial::FillMaterialAspect (Graphic3d_MaterialAspect& theAspec // convert common into metal-roughness if (!myPbrMat.IsDefined) { - #ifdef _Graphic3d_PBRMaterial_HeaderFile Graphic3d_PBRMaterial aPbr; aPbr.SetColor (myCommonMat.DiffuseColor); - aPbr.SetMetallic (((Graphic3d_Vec3 )myCommonMat.SpecularColor).maxComp()); - aPbr.SetRoughness (roughnessFromCommon (myCommonMat)); + aPbr.SetMetallic (Graphic3d_PBRMaterial::MetallicFromSpecular (myCommonMat.SpecularColor)); + aPbr.SetRoughness (Graphic3d_PBRMaterial::RoughnessFromSpecular (myCommonMat.SpecularColor, myCommonMat.Shininess)); theAspect.SetPBRMaterial (aPbr); - #endif + theAspect.SetBSDF (Graphic3d_BSDF::CreateMetallicRoughness (aPbr)); } } @@ -248,14 +230,16 @@ void XCAFDoc_VisMaterial::FillMaterialAspect (Graphic3d_MaterialAspect& theAspec theAspect.SetShininess (1.0f - myPbrMat.Roughness); } - #ifdef _Graphic3d_PBRMaterial_HeaderFile Graphic3d_PBRMaterial aPbr; aPbr.SetColor (myPbrMat.BaseColor); aPbr.SetMetallic (myPbrMat.Metallic); aPbr.SetRoughness(myPbrMat.Roughness); - aPbr.SetEmission (myPbrMat.EmissiveFactor); + if (myPbrMat.EmissiveTexture.IsNull()) // TODO Temporal measure until emissive map will be implemented + { + aPbr.SetEmission(myPbrMat.EmissiveFactor); + } theAspect.SetPBRMaterial (aPbr); - #endif + theAspect.SetBSDF (Graphic3d_BSDF::CreateMetallicRoughness (aPbr)); } } diff --git a/tests/de_mesh/gltf_read/end b/tests/de_mesh/gltf_read/end index bdd2587596..71be8079aa 100644 --- a/tests/de_mesh/gltf_read/end +++ b/tests/de_mesh/gltf_read/end @@ -3,4 +3,18 @@ vinit View1 XDisplay -dispMode 1 D vaxo vfit + +vrenderparams -shadingModel PHONG +vlight -change 0 -intensity 2.5 +vlight -change 1 -intensity 0.3 +vcamera -orthographic vdump ${imagedir}/${casename}.png +vdump ${imagedir}/${casename}_ortho_phong.png +vcamera -persp +vdump ${imagedir}/${casename}_persp_phong.png + +vrenderparams -shadingModel PBR +vcamera -orthographic +vdump ${imagedir}/${casename}_ortho_pbr.png +vcamera -persp +vdump ${imagedir}/${casename}_persp_pbr.png diff --git a/tests/de_mesh/obj_read/end b/tests/de_mesh/obj_read/end index df717a06ce..1c730f2534 100644 --- a/tests/de_mesh/obj_read/end +++ b/tests/de_mesh/obj_read/end @@ -3,4 +3,18 @@ vinit View1 XDisplay -dispMode 1 D -explore vaxo vfit + +vrenderparams -shadingModel PHONG +vlight -change 0 -intensity 2.5 +vlight -change 1 -intensity 0.3 +vcamera -orthographic vdump ${imagedir}/${casename}.png +vdump ${imagedir}/${casename}_ortho_phong.png +vcamera -persp +vdump ${imagedir}/${casename}_persp_phong.png + +vrenderparams -shadingModel PBR +vcamera -orthographic +vdump ${imagedir}/${casename}_ortho_pbr.png +vcamera -persp +vdump ${imagedir}/${casename}_persp_pbr.png diff --git a/tests/v3d/glsl/pbr_spheres b/tests/v3d/glsl/pbr_spheres new file mode 100644 index 0000000000..5d96c80c4b --- /dev/null +++ b/tests/v3d/glsl/pbr_spheres @@ -0,0 +1,74 @@ +puts "========" +puts "0030700: Visualization, TKOpenGl - support PBR Metallic-Roughness shading model" +puts "Spheres grid with different roughness values" +puts "========" + +pload XDE OCAF MODELING VISUALIZATION +psphere s 0.35 + +catch { Close D } +XNewDoc D + +# grid of spheres +set THE_UPPER 6 +foreach i [list 0 3] { + set aPrefix "" + set aColor "GRAY80" + if { $i != 0 } { + set aPrefix "g_"; + set aColor "CCB11D" + } + for { set m 0 } { $m <= $THE_UPPER } { incr m } { + for { set r 0 } { $r <= $THE_UPPER } { incr r } { + set aName ${aPrefix}m${m}r${r} + copy s $aName + ttranslate $aName ${r} ${i} ${m} + set aLab [XAddShape D $aName] + SetName D $aLab $aName + XAddVisMaterial D $aName -baseColor $aColor -metallic ${m}/$THE_UPPER -roughness ${r}/$THE_UPPER + XSetVisMaterial D $aLab $aName + } + } +} +XGetAllVisMaterials D + +# labels +text2brep tm "Metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 6.5 -halign left -valign top -font monospace +text2brep tnm "Non-metal" -plane 0 -1 0 0 0 -1 -height 0.5 -pos -0.5 0 -0.5 -halign right -valign top -font monospace +text2brep ts "Smooth" -plane 0 -1 0 1 0 0 -height 0.5 -pos -0.5 0 -0.5 -halign left -valign top -font monospace +text2brep tr "Rough" -plane 0 -1 0 1 0 0 -height 0.5 -pos 6.5 0 -0.5 -halign right -valign top -font monospace +set aLab [XAddShape D tm] +SetName D $aLab "Metal" +set aLab [XAddShape D tnm] +SetName D $aLab "Non-metal" +set aLab [XAddShape D ts] +SetName D $aLab "Smooth" +set aLab [XAddShape D tr] +SetName D $aLab "Rough" + +vclear +vinit View1 -width 768 -height 768 +vfront +vrenderparams -shadingModel PBR +vlight -change 0 -intensity 2.5 +XDisplay -dispMode 1 D +vcamera -ortho +vfit +vlight -change 1 -intensity 0.0001 +vdump $::imagedir/${::casename}_ortho0.png +vlight -change 1 -intensity 0.3 +vdump $::imagedir/${::casename}_ortho30.png +vcamera -persp +vfit +vlight -change 1 -intensity 0.0001 +vdump $::imagedir/${::casename}_persp0.png +vlight -change 1 -intensity 0.3 +vdump $::imagedir/${::casename}_persp30.png + +set aCubeMap [locate_data_file Circus_CubeMap_V.png] +vlight -change 1 -intensity 1 +vbackground -cubemap $aCubeMap +vcamera -ortho +vdump $::imagedir/${::casename}_orthoenv.png +vcamera -persp +vdump $::imagedir/${::casename}_perspenv.png diff --git a/tests/v3d/materials/pbr1 b/tests/v3d/materials/pbr1 new file mode 100644 index 0000000000..33f1b04883 --- /dev/null +++ b/tests/v3d/materials/pbr1 @@ -0,0 +1,11 @@ +source $env(CSF_OCCTSamplesPath)/tcl/materials.tcl +vlight -change 0 -intensity 5 +vrenderparams -shadingModel PBR -msaa 0 +vdump $imagedir/${casename}_default.png + +set aCubeMap [locate_data_file Circus_CubeMap_V.png] +vbackground -cubemap $aCubeMap +vdump $imagedir/${casename}_env.png + +vbackground -cubemap $aCubeMap -invertedz +vdump $imagedir/${casename}_env_iz.png -- 2.20.1